diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dea711fef0..747643d5c5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,11 +7,9 @@ assignees: '' --- -**Note**: Do not report any new bugs directly relating to the v6 campaign. They will not be fixed or considered at this time. - **Platform**: *Android/iOS/Mac/Windows/Linux* -**Build**: *The build number under the title in the main menu. Required.* +**Build**: *The build number under the title in the main menu. Required. "LATEST" IS NOT A VERSION, I NEED THE EXACT BUILD NUMBER OF YOUR GAME.* **Issue**: *Explain your issue in detail.* @@ -19,11 +17,14 @@ assignees: '' **Link(s) to mod(s) used**: *The mod repositories or zip files that are related to the issue, if applicable.* -**Save file**: *The save file you were playing on when the bug happened. REQUIRED for any issue that happens in-game.* +**Save file**: *The (zipped) save file you were playing on when the bug happened. THIS IS REQUIRED FOR ANY ISSUE HAPPENING IN-GAME OR IN MULTIPLAYER, REGARDLESS OF WHETHER YOU THINK IT HAPPENS EVERYWHERE. DO NOT DELETE OR OMIT THIS LINE UNLESS YOU ARE SURE THAT THE ISSUE DOES NOT HAPPEN IN-GAME. IF YOU DO NOT HAVE A SAVE, DON'T WASTE TIME OPENING THIS ISSUE.* -**Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.* +If you remove the line above without reading it properly and understanding what it means, I will reap your soul. Even if you're playing on someone's server, you can still save the game to a slot. + +**(Crash) logs**: *Either crash reports from the crash folder, or the file you get when you go into Settings -> Game Data -> Export Crash logs. REQUIRED if you are reporting a crash.* --- *Place an X (no spaces) between the brackets to confirm that you have read the line below.* +- [ ] **I have updated to the latest release (https://github.com/Anuken/Mindustry/releases) to make sure my issue has not been fixed.** - [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.** diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml new file mode 100644 index 0000000000..f3e83da601 --- /dev/null +++ b/.github/workflows/deployment.yml @@ -0,0 +1,67 @@ +name: Deployment + +on: + push: + tags: + - 'v*' + +jobs: + buildJava14: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 14 + uses: actions/setup-java@v1 + with: + java-version: 14 + - name: Set env + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + - name: Add Arc release + run: | + git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc + cd ../Arc + git tag ${RELEASE_VERSION} + git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/Arc ${RELEASE_VERSION}; + cd ../Mindustry + - name: Create artifacts + run: | + ./gradlew desktop:dist server:dist core:mergedJavadoc -Pbuildversion=${RELEASE_VERSION:1} + - name: Update docs + run: | + cd ../ + git config --global user.email "cli@github.com" + git config --global user.name "Github Actions" + git clone --depth=1 https://github.com/MindustryGame/docs.git + cd docs + find . -maxdepth 1 ! -name ".git" ! -name . -exec rm -r {} \; + cd ../ + cp -a Mindustry/core/build/javadoc/. docs/ + cd docs + git add . + git commit -m "Update ${RELEASE_VERSION:1}" + git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/MindustryGame/docs + cd ../Mindustry + - name: Update F-Droid build string + run: | + git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds + cd ../MindustryBuilds + echo "Updating version to ${RELEASE_VERSION:1}" + echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt + git add . + git commit -m "Updating to build ${RELEASE_VERSION:1}" + git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds + cd ../Mindustry + - name: Upload client artifacts + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: desktop/build/libs/Mindustry.jar + tag: ${{ github.ref }} + - name: Upload server artifacts + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: server/build/libs/server-release.jar + tag: ${{ github.ref }} + diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 490c317f03..0000000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Java CI - -on: [push] - -jobs: - buildJava14: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up JDK 14 - uses: actions/setup-java@v1 - with: - java-version: 14 - - name: Run unit tests with gradle and Java 14 - run: ./gradlew compileJava - buildJava15: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up JDK 15 - uses: actions/setup-java@v1 - with: - java-version: 15 - - name: Run unit tests with gradle and Java 15 - run: ./gradlew compileJava diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000000..f769d87b6a --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,21 @@ +name: Pull Request Tests + +on: [pull_request, workflow_dispatch] + +jobs: + buildJava14: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 14 + uses: actions/setup-java@v1 + with: + java-version: 14 + - name: Run unit tests and build JAR + run: ./gradlew test desktop:dist + - name: Upload desktop JAR for testing + uses: actions/upload-artifact@v2 + with: + name: Desktop JAR (zipped) + path: desktop/build/libs/Mindustry.jar diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 0000000000..07ae6b09ab --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,25 @@ +name: Tests + +on: [push, workflow_dispatch] + +jobs: + buildJava14: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 14 + uses: actions/setup-java@v1 + with: + java-version: 14 + - name: Run unit tests + run: ./gradlew clean cleanTest test + - name: Trigger BE build + if: ${{ github.repository == 'Anuken/Mindustry' }} + run: | + git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds + cd ../MindustryBuilds + BNUM=$(($GITHUB_RUN_NUMBER + 20000)) + git tag ${BNUM} + git config --global user.name "Build Uploader" + git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${BNUM} diff --git a/.gitignore b/.gitignore index 543197c2f8..4748843132 100644 --- a/.gitignore +++ b/.gitignore @@ -19,12 +19,13 @@ logs/ /annotations/out/ /net/build/ /tools/build/ -/core/build/ /tests/build/ /server/build/ changelog saves/ /core/assets-raw/fontgen/out/ +/core/assets-raw/fontgen/icons/ +/core/assets-raw/fontgen/icon_parts/ core/assets/saves/ /core/assets/saves/ steam_appid.txt @@ -35,16 +36,24 @@ steam_appid.txt /annotations/src/main/resources/META-INF/services /core/assets/version.properties /core/assets/locales +/core/assets/cache/ /ios/src/mindustry/gen/ /core/src/mindustry/gen/ ios/robovm.properties packr-out/ config/ *.gif +/tests/out /core/assets/basepartnames version.properties +#sprites + +core/assets/sprites/sprites* +core/assets/sprites/fallback/ +core/assets/sprites/block_colors.png + .attach_* ## Java @@ -93,6 +102,10 @@ com_crashlytics_export_strings.xml .externalToolBuilders/ *.launch +## VSCode + +.vscode/ + ## NetBeans /nbproject/private/ @@ -143,13 +156,6 @@ nb-configuration.xml /local.properties .gradle/ gradle-app.setting -/build/ -/android/build/ -/core/build/ -/desktop/build/ -/html/build/ -/ios/build/ -/ios-moe/build/ ## OS Specific .DS_Store diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6b1dfd72ac..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,50 +0,0 @@ -jdk: -- openjdk14 -dist: xenial -android: - components: - - android-29 - - build-tools-29.0.3 - -script: -- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds -- cd ../MindustryBuilds -- echo ${TRAVIS_TAG} -- if [ -n "$TRAVIS_TAG" ]; then echo versionName=5-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi -- git tag ${TRAVIS_BUILD_NUMBER} -- git config --global user.name "Build Uploader" -- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi -- cd ../Mindustry -- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc -- if [ -n "$TRAVIS_TAG" ]; then cd ../Arc; git tag ${TRAVIS_TAG}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/Arc ${TRAVIS_TAG}; cd ../Mindustry; fi -- "./gradlew test" -- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" -- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" -- "./gradlew core:javadoc" -- cd ../ -- git clone --depth=1 https://github.com/MindustryGame/docs.git -- cp -a Mindustry/core/build/docs/javadoc/. docs/ -- cd docs -- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi -- cd ../Mindustry -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 -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: 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/CONTRIBUTING.md b/CONTRIBUTING.md index 143a73d6b8..ee066f3db8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,9 +15,6 @@ If you are submitting a new block, make sure it has a name and description, and If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*). For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it. -### Do not include packed sprites in your pull request. -When making a pull request that changes or adds new sprites, do not add the modified atlas & `spritesX.png` files to your final pull request. These are a frequent source of conflicts. - ## Style Guidelines @@ -29,8 +26,8 @@ This means: - `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more. Any reasonable IDE should highlight them for you anyway. - No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day) - Do not use braceless `if/else` statements. `if(x) statement else statement2` should **never** be done. In very specific situations, having braceless if-statements on one line is allowed: `if(cond) return;` would be valid. -- Prefer single-line javadoc `/** @return for example */` instead of multiline javadoc whenver possible -- Short method/variable names (multipleLongWords should be avoided if it's possible to so reasonably, especially for variables) +- Prefer single-line javadoc `/** @return for example */` instead of multiline javadoc whenever possible +- Short method/variable names (multipleLongWords should be avoided if it's possible to do so reasonably, especially for variables) - Use wildcard imports - `import some.package.*` - for everything. This makes incorrect class usage more obvious (*e.g. arc.util.Timer vs java.util.Timer*) and leads to cleaner-looking code. Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry. diff --git a/ISSUES.md b/ISSUES.md new file mode 100644 index 0000000000..b0211102f1 --- /dev/null +++ b/ISSUES.md @@ -0,0 +1,52 @@ +# Why was my issue closed? + +This document goes over some common causes for issue closures. + +## You did not fill in the template + +I can't debug the problem unless you provide the information the template asks for. +If you cannot put in the effort to fill out a template, then don't expect me to put in the effort to fix it. + +## Your issue was already reported + +If the problem in your issue has already been encountered before, it will be closed - especially if your report doesn't provide any new information. +Make sure you search the *closed* issues before making an issue. + +I do not link the specific issue(s) that report the same problem, because searching takes time - if you're interested in finding them, you should be able to do so without my help. + +To be clear: I do **not** expect users to look at *all* previous issues, or do a comprehensive stack trace analysis to see if their crash was already reported. + +## Your issue was already fixed + +The problem you reported has been addressed. Note that this does **not** mean that the latest stable version of Mindustry has the fix! +It simply means that I have committed (or am about to commit) a patch that fixes it *on the current development branch*. + +## Your issue is missing a crash report or log + +If the game crashes without a specific cause, and you don't send me a log, I can't fix it. There is no way for me to know what went wrong. + +During a normal crash, the game should tell you where the log is saved. If not, you should still be able to look in the game's crash folder on most operating systems, or export the logs in *Settings -> Game Data -> Export Crash Logs*. + +## Your issue is missing saves or screenshots + +Even if you think your problem happens everywhere and saves/screenshots are redundant, this is frequently not the case. +If I cannot reproduce the problem on my own saves and you have not linked any of your own, then the problem is likely to be save-specific. If you do not send me any, the problem cannot be investigated further. + +## Your issue is related to an external program + +If Mindustry causes something else to crash or misbehave, I am very unlikely to fix it. Unless the problem is serious, widespread and/or clearly a bug *in Mindustry*, it is not my responsibility. + +Similarly, if you use another (invasive) program to change how Mindustry works, and something goes wrong, that is not my problem. Don't do it. + +## Your issue is caused by mods + +Crashes and bugs related to installed mods should be reported in the relevant mod repository, not here. +*Note that problems with the Mindustry modding API are a separate problem, and do not apply.* + +## I cannot reproduce your issue + +If I follow your instructions and am repeatedly unable to reproduce the problem you've reported, then it is very unlikely to be fixed. +Either the problem is device-specific, or there is not enough information given for me to be able to reproduce it. + +I may attempt to change some code if I think it will make the issue less likely to occur, but without knowing for sure, the issue cannot be considered truly "fixed". +As I cannot make any further progress on the problem, there is no reason to keep it open. If it is a common bug/crash, other people will come along with information that may shed some light on the issue. diff --git a/README.md b/README.md index 5c9c797297..109bc42fdb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Logo](core/assets-raw/sprites/ui/logo.png) -[![Build Status](https://travis-ci.org/Anuken/Mindustry.svg?branch=master)](https://travis-ci.org/Anuken/Mindustry) -[![Discord](https://img.shields.io/discord/391020510269669376.svg)](https://discord.gg/mindustry) +[![Build Status](https://github.com/Anuken/Mindustry/workflows/Tests/badge.svg?event=push)](https://github.com/Anuken/Mindustry/actions) +[![Discord](https://img.shields.io/discord/391020510269669376.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord&color=17cf48)](https://discord.gg/mindustry) A sandbox tower defense game written in Java. @@ -9,34 +9,34 @@ _[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_ _[Wiki](https://mindustrygame.github.io/wiki)_ _[Javadoc](https://mindustrygame.github.io/docs/)_ -### Contributing +## Contributing See [CONTRIBUTING](CONTRIBUTING.md). -### Building +## Building Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). If you'd rather compile on your own, follow these instructions. First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: -#### Windows +### Windows _Running:_ `gradlew desktop:run` _Building:_ `gradlew desktop:dist` _Sprite Packing:_ `gradlew tools:pack` -#### Linux/Mac OS +### Linux/Mac OS _Running:_ `./gradlew desktop:run` _Building:_ `./gradlew desktop:dist` _Sprite Packing:_ `./gradlew tools:pack` -#### Server +### Server Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server', e.g. `gradlew server:dist`. -#### Android +### Android 1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required. 2. Set the `ANDROID_HOME` environment variable to point to your unzipped Android SDK directory. @@ -44,7 +44,9 @@ Server builds are bundled with each released build (in Releases). If you'd rathe To debug the application on a connected phone, run `gradlew android:installDebug android:run`. -##### Troubleshooting +### Troubleshooting + +#### Permission Denied If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, run `chmod +x ./gradlew` before running `./gradlew`. *This is a one-time procedure.* @@ -53,24 +55,11 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, Gradle may take up to several minutes to download files. Be patient.
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds. -### Feature Requests +## Feature Requests Post feature requests and feedback [here](https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose). -### Downloads +## 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/) - -[Download On Flathub](https://flathub.org/apps/details/com.github.Anuken.Mindustry) +| [![](https://static.itch.io/images/badge.svg)](https://anuke.itch.io/mindustry) | [![](https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png)](https://play.google.com/store/apps/details?id=io.anuke.mindustry) | [![](https://fdroid.gitlab.io/artwork/badge/get-it-on.png)](https://f-droid.org/packages/io.anuke.mindustry) | [![](https://flathub.org/assets/badges/flathub-badge-en.svg)](https://flathub.org/apps/details/com.github.Anuken.Mindustry) +|--- |--- |--- |--- | diff --git a/SERVERLIST.md b/SERVERLIST.md index e4d2b6a284..bef8443c8d 100644 --- a/SERVERLIST.md +++ b/SERVERLIST.md @@ -1,22 +1,23 @@ ### Adding a server to the list Mindustry now has a public list of servers that everyone can see and connect to. -This is done by letting clients `GET` a [JSON list of servers](https://github.com/Anuken/Mindustry/blob/master/servers.json) in this repository. +This is done by letting clients `GET` a [JSON list of servers](https://github.com/Anuken/Mindustry/blob/master/servers_v6.json) in this repository. You may want to add your server to this list. The steps for getting this done are as follows: 1. **Ensure your server is properly moderated.** For the most part, this applies to survival servers, but PvP servers can be affected as well. -You'll need to either hire some moderators, or make use of (currently non-existent) anti-grief and anti-curse plugins. +You'll need to either hire some moderators, or make use of (currently non-existent) anti-grief and anti-curse plugins. *Consider enabling a rate limit:* `config messageRateLimit 2` will make it so that players can only send messages every 2 seconds, for example. -2. **Set an appropriate MOTD, name and description.** This is set with `config `. "Appropriate" means that: +2. Make sure that your server is able to handle inappropriate content - this includes NSFW display/sorter art and abusive messages. **Servers that allow such content will be removed immediately.** Consider banning display blocks if it is a problem for your server: `rules add bannedBlocks ["logic-display", "large-logic-display"]`. +3. **Set an appropriate MOTD, name and description.** This is set with `config `. "Appropriate" means that: - Your name or description must reflect the type of server you're hosting. Since new players may be exposed to the server list early on, put in a phrase like "Co-op survival" or "PvP" so players know what they're getting into. Yes, this is also displayed in the server mode info text, but having extra info in the name doesn't hurt. - Make sure players know where to refer to for server support. It should be fairly clear that the server owner is not me, but you. - Try to be professional in your text; use common sense. -3. **Get some good maps.** *(optional, but highly recommended)*. Add some maps to your server and set the map rotation to custom-only. You can get maps from the Steam workshop by subscribing and exporting them; using the `#maps` channel on Discord is also an option. -4. **Check your server configuration.** *(optional)* I would recommend adding a message rate limit of 1 second (`config messageRateLimit 1`), and disabling connect/disconnect messages to reduce spam (`config showConnectMessages false`). -5. Finally, **submit a pull request** to add your server's IP to the list. -This should be fairly straightforward: Press the edit button on the [server file](https://github.com/Anuken/Mindustry/blob/master/servers.json), then add a JSON object with a single key, indicating your server address. +4. **Get some good maps.** *(optional, but highly recommended)*. Add some maps to your server and set the map rotation to custom-only. You can get maps from the Steam workshop by subscribing and exporting them; using the `#maps` channel on Discord is also an option. +5. **Check your server configuration.** *(optional)* I would recommend adding a message rate limit of 1 second (`config messageRateLimit 1`), and disabling connect/disconnect messages to reduce spam (`config showConnectMessages false`). +6. Finally, **submit a pull request** to add your server's IP to the list. +This should be fairly straightforward: Press the edit button on the [server file](https://github.com/Anuken/Mindustry/blob/master/servers_v6.json), then add a JSON object with a single key, indicating your server address. For example, if your server address is `google.com`, you would add a comma after the last entry and insert: ```json { diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 7d4d731df1..9af4f50c90 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -17,7 +17,8 @@ android:usesCleartextTraffic="true" android:appCategory="game" android:label="@string/app_name" - android:theme="@style/ArcTheme" android:fullBackupContent="@xml/backup_rules"> + android:theme="@style/ArcTheme" + android:fullBackupContent="@xml/backup_rules"> copy{ @@ -126,23 +155,13 @@ task copyAndroidNatives(){ } task run(type: Exec){ - def path - def localProperties = project.file("../local.properties") - if(localProperties.exists()){ - Properties properties = new Properties() - localProperties.withInputStream{ instr -> - properties.load(instr) - } - def sdkDir = properties.getProperty('sdk.dir') - if(sdkDir){ - path = sdkDir - }else{ - path = "$System.env.ANDROID_HOME" + commandLine "${findSdkDir()}/platform-tools/adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher' +} + +if(!project.ext.hasSprites()){ + tasks.whenTaskAdded{ task -> + if(task.name == 'assembleDebug' || task.name == 'assembleRelease'){ + task.dependsOn ":tools:pack" } - }else{ - path = "$System.env.ANDROID_HOME" } - - def adb = path + "/platform-tools/adb" - commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher' } diff --git a/android/proguard-rules.pro b/android/proguard-rules.pro new file mode 100644 index 0000000000..f25e5e79c5 --- /dev/null +++ b/android/proguard-rules.pro @@ -0,0 +1,8 @@ +-dontobfuscate + +#these are essential packages that should not be "optimized" in any way +#the main purpose of d8 here is to shrink the absurdly-large google play games libraries +-keep class mindustry.** { *; } +-keep class arc.** { *; } +-keep class net.jpountz.** { *; } +-keep class rhino.** { *; } diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index d40cf3accd..d42ffe6d4a 100644 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -1,6 +1,4 @@ - Mindustry - diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml index 3fe4d7f6a8..c37d2c6ed9 100644 --- a/android/res/values/styles.xml +++ b/android/res/values/styles.xml @@ -1,5 +1,4 @@ - - diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java index 7400bd37a8..69543be82e 100644 --- a/android/src/mindustry/android/AndroidLauncher.java +++ b/android/src/mindustry/android/AndroidLauncher.java @@ -15,9 +15,11 @@ import arc.func.*; import arc.scene.ui.layout.*; import arc.util.*; import dalvik.system.*; +import io.anuke.mindustry.*; import mindustry.*; import mindustry.game.Saves.*; import mindustry.io.*; +import mindustry.mod.*; import mindustry.net.*; import mindustry.ui.dialogs.*; @@ -27,13 +29,15 @@ import java.util.*; import static mindustry.Vars.*; - public class AndroidLauncher extends AndroidApplication{ public static final int PERMISSION_REQUEST_CODE = 1; boolean doubleScaleTablets = true; FileChooser chooser; Runnable permCallback; + Object gpService; + Class serviceClass; + @Override protected void onCreate(Bundle savedInstanceState){ UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler(); @@ -45,13 +49,13 @@ public class AndroidLauncher extends AndroidApplication{ if(handler != null){ handler.uncaughtException(thread, error); }else{ - error.printStackTrace(); + Log.err(error); System.exit(1); } }); super.onCreate(savedInstanceState); - if(doubleScaleTablets && isTablet(this.getContext())){ + if(doubleScaleTablets && isTablet(this)){ Scl.setAddition(0.5f); } @@ -64,7 +68,9 @@ public class AndroidLauncher extends AndroidApplication{ @Override public rhino.Context getScriptContext(){ - return AndroidRhinoContext.enter(getContext().getCacheDir()); + rhino.Context result = AndroidRhinoContext.enter(((Context)AndroidLauncher.this).getCacheDir()); + result.setClassShutter(Scripts::allowClass); + return result; } @Override @@ -72,17 +78,16 @@ public class AndroidLauncher extends AndroidApplication{ } @Override - public Class loadJar(Fi jar, String mainClass) throws Exception{ - DexClassLoader loader = new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader()); - return Class.forName(mainClass, true, loader); + public ClassLoader loadJar(Fi jar, ClassLoader parent) throws Exception{ + return new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, parent); } @Override - public void showFileChooser(boolean open, String extension, Cons cons){ - showFileChooser(open, cons, extension); + public void showFileChooser(boolean open, String title, String extension, Cons cons){ + showFileChooser(open, title, cons, extension); } - void showFileChooser(boolean open, Cons cons, String... extensions){ + void showFileChooser(boolean open, String title, Cons cons, String... extensions){ String extension = extensions[0]; if(VERSION.SDK_INT >= VERSION_CODES.Q){ @@ -119,7 +124,7 @@ public class AndroidLauncher extends AndroidApplication{ }); }else if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ - chooser = new FileChooser(open ? "@open" : "@save", file -> Structs.contains(extensions, file.extension().toLowerCase()), open, file -> { + chooser = new FileChooser(title, file -> Structs.contains(extensions, file.extension().toLowerCase()), open, file -> { if(!open){ cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); }else{ @@ -137,16 +142,16 @@ public class AndroidLauncher extends AndroidApplication{ requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE); }else{ if(open){ - new FileChooser("@open", file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show(); + new FileChooser(title, file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show(); }else{ - super.showFileChooser(open, extension, cons); + super.showFileChooser(open, "@open", extension, cons); } } } @Override public void showMultiFileChooser(Cons cons, String... extensions){ - showFileChooser(true, cons, extensions); + showFileChooser(true, "@open", cons, extensions); } @Override @@ -162,33 +167,47 @@ public class AndroidLauncher extends AndroidApplication{ }, new AndroidApplicationConfiguration(){{ useImmersiveMode = true; hideStatusBar = true; - stencil = 8; }}); checkFiles(getIntent()); + try{ + //new external folder + Fi data = Core.files.absolute(((Context)this).getExternalFilesDir(null).getAbsolutePath()); + Core.settings.setDataDirectory(data); - //new external folder - Fi data = Core.files.absolute(getContext().getExternalFilesDir(null).getAbsolutePath()); - Core.settings.setDataDirectory(data); - - //move to internal storage if there's no file indicating that it moved - if(!Core.files.local("files_moved").exists()){ - Log.info("Moving files to external storage..."); - + //delete unused cache folder to free up space try{ - //current local storage folder - Fi src = Core.files.absolute(Core.files.getLocalStoragePath()); - for(Fi fi : src.list()){ - fi.copyTo(data); + Fi cache = Core.settings.getDataDirectory().child("cache"); + if(cache.exists()){ + cache.deleteDirectory(); } - //create marker - Core.files.local("files_moved").writeString("files moved to " + data); - Core.files.local("files_moved_103").writeString("files moved again"); - Log.info("Files moved."); }catch(Throwable t){ - Log.err("Failed to move files!"); - t.printStackTrace(); + Log.err("Failed to delete cached folder", t); } + + + //move to internal storage if there's no file indicating that it moved + if(!Core.files.local("files_moved").exists()){ + Log.info("Moving files to external storage..."); + + try{ + //current local storage folder + Fi src = Core.files.absolute(Core.files.getLocalStoragePath()); + for(Fi fi : src.list()){ + fi.copyTo(data); + } + //create marker + Core.files.local("files_moved").writeString("files moved to " + data); + Core.files.local("files_moved_103").writeString("files moved again"); + Log.info("Files moved."); + }catch(Throwable t){ + Log.err("Failed to move files!"); + t.printStackTrace(); + } + } + }catch(Exception e){ + //print log but don't crash + Log.err(e); } } @@ -208,6 +227,24 @@ public class AndroidLauncher extends AndroidApplication{ } } + @Override + public void onResume(){ + super.onResume(); + + //TODO enable once GPGS is set up on the GP console + if(false && BuildConfig.FLAVOR.equals("gp")){ + try{ + if(gpService == null){ + serviceClass = Class.forName("mindustry.android.GPGameService"); + gpService = serviceClass.getConstructor().newInstance(); + } + serviceClass.getMethod("onResume", Context.class).invoke(gpService, this); + }catch(Exception e){ + Log.err("Failed to update Google Play Services", e); + } + } + } + private void checkFiles(Intent intent){ try{ Uri uri = intent.getData(); diff --git a/android/src/mindustry/android/AndroidRhinoContext.java b/android/src/mindustry/android/AndroidRhinoContext.java index d3e80c7427..0147f118b8 100644 --- a/android/src/mindustry/android/AndroidRhinoContext.java +++ b/android/src/mindustry/android/AndroidRhinoContext.java @@ -175,7 +175,7 @@ public class AndroidRhinoContext{ }catch(IOException e){ e.printStackTrace(); } - android.content.Context context = ((AndroidApplication) Core.app).getContext(); + android.content.Context context = (android.content.Context)((AndroidApplication)Core.app); return new DexClassLoader(dexFile.getPath(), VERSION.SDK_INT >= 21 ? context.getCodeCacheDir().getPath() : context.getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); } diff --git a/android/srcgp/mindustry/android/GPGameService.java b/android/srcgp/mindustry/android/GPGameService.java new file mode 100644 index 0000000000..9a64b6f3d4 --- /dev/null +++ b/android/srcgp/mindustry/android/GPGameService.java @@ -0,0 +1,40 @@ +package mindustry.android; + +import android.content.*; +import arc.util.*; +import com.google.android.gms.auth.api.signin.*; +import com.google.android.gms.games.*; +import mindustry.service.*; + +public class GPGameService extends GameService{ + private GoogleSignInAccount account; + + public void onResume(Context context){ + Log.info("[GooglePlayService] Resuming."); + + GoogleSignInAccount current = GoogleSignIn.getLastSignedInAccount(context); + + GoogleSignInOptions options = + new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) + .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) + .build(); + + if(GoogleSignIn.hasPermissions(current, options.getScopeArray())){ + this.account = current; + Log.info("Already signed in to Google Play Games."); + }else{ + GoogleSignIn.getClient(context, options).silentSignIn().addOnCompleteListener(complete -> { + if(!complete.isSuccessful()){ + if(complete.getException() != null){ + Log.err("Failed to sign in to Google Play Games.", complete.getException()); + }else{ + Log.warn("Failed to sign in to Google Play Games."); + } + }else{ + this.account = complete.getResult(); + Log.info("Signed in to Google Play Games."); + } + }); + } + } +} diff --git a/annotations/build.gradle b/annotations/build.gradle index 4ee43cfcb3..4532472197 100644 --- a/annotations/build.gradle +++ b/annotations/build.gradle @@ -1,2 +1,2 @@ sourceSets.main.java.srcDirs = ["src/main/java/"] -sourceSets.main.resources.srcDirs = ["src/main/resources/"] \ No newline at end of file +sourceSets.main.resources.srcDirs = ["src/main/resources/"] diff --git a/annotations/src/main/java/mindustry/annotations/Annotations.java b/annotations/src/main/java/mindustry/annotations/Annotations.java index 501c255d2e..9960f673eb 100644 --- a/annotations/src/main/java/mindustry/annotations/Annotations.java +++ b/annotations/src/main/java/mindustry/annotations/Annotations.java @@ -98,6 +98,8 @@ public class Annotations{ boolean serialize() default true; /** Whether to generate IO code. This is for advanced usage only. */ boolean genio() default true; + /** Whether I made a massive mistake by merging two different class branches */ + boolean legacy() default false; } /** Indicates an internal interface for entity components. */ @@ -116,7 +118,7 @@ public class Annotations{ /** * The region name to load. Variables can be used: * "@" -> block name - * "$size" -> block size + * "@size" -> block size * "#" "#1" "#2" -> index number, for arrays * */ String value(); @@ -175,12 +177,12 @@ public class Annotations{ //region remote public enum PacketPriority{ + /** Does not get handled unless client is connected. */ + low, /** Gets put in a queue and processed if not connected. */ normal, /** Gets handled immediately, regardless of connection status. */ high, - /** Does not get handled unless client is connected. */ - low } /** A set of two booleans, one specifying server and one specifying client. */ diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index 710bef22ca..310f8e2906 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -2,15 +2,10 @@ package mindustry.annotations; import arc.files.*; import arc.struct.*; -import arc.util.Log; -import arc.util.Log.*; import arc.util.*; +import arc.util.Log.*; import com.squareup.javapoet.*; import com.sun.source.util.*; -import com.sun.tools.javac.model.*; -import com.sun.tools.javac.processing.*; -import com.sun.tools.javac.tree.*; -import com.sun.tools.javac.util.*; import mindustry.annotations.util.*; import javax.annotation.processing.*; @@ -22,7 +17,6 @@ import javax.tools.Diagnostic.*; import javax.tools.*; import java.io.*; import java.lang.annotation.*; -import java.util.List; import java.util.*; @SupportedSourceVersion(SourceVersion.RELEASE_8) @@ -31,19 +25,16 @@ public abstract class BaseProcessor extends AbstractProcessor{ public static final String packageName = "mindustry.gen"; public static Types typeu; - public static JavacElements elementu; + public static Elements elementu; public static Filer filer; public static Messager messager; public static Trees trees; - public static TreeMaker maker; protected int round; protected int rounds = 1; protected RoundEnvironment env; protected Fi rootDirectory; - protected Context context; - public static String getMethodName(Element element){ return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName(); } @@ -115,12 +106,12 @@ public abstract class BaseProcessor extends AbstractProcessor{ return ClassName.get(c).box(); } - public static TypeVariableName getTVN(TypeParameterElement element) { + public static TypeVariableName getTVN(TypeParameterElement element){ String name = element.getSimpleName().toString(); List boundsMirrors = element.getBounds(); List boundsTypeNames = new ArrayList<>(); - for (TypeMirror typeMirror : boundsMirrors) { + for(TypeMirror typeMirror : boundsMirrors){ boundsTypeNames.add(TypeName.get(typeMirror)); } @@ -137,11 +128,11 @@ public abstract class BaseProcessor extends AbstractProcessor{ if(imports != null){ String rawSource = file.toString(); Seq result = new Seq<>(); - for (String s : rawSource.split("\n", -1)) { + for(String s : rawSource.split("\n", -1)){ result.add(s); - if (s.startsWith("package ")) { + if (s.startsWith("package ")){ result.add(""); - for (String i : imports) { + for (String i : imports){ result.add(i); } } @@ -186,7 +177,7 @@ public abstract class BaseProcessor extends AbstractProcessor{ Log.err("[CODEGEN ERROR] " + message + ": " + elem); } - public void err(String message, Selement elem){ + public static void err(String message, Selement elem){ err(message, elem.e); } @@ -194,20 +185,16 @@ public abstract class BaseProcessor extends AbstractProcessor{ public synchronized void init(ProcessingEnvironment env){ super.init(env); - JavacProcessingEnvironment javacProcessingEnv = (JavacProcessingEnvironment)env; - trees = Trees.instance(env); typeu = env.getTypeUtils(); - elementu = javacProcessingEnv.getElementUtils(); + elementu = env.getElementUtils(); filer = env.getFiler(); messager = env.getMessager(); - context = ((JavacProcessingEnvironment)env).getContext(); - maker = TreeMaker.instance(javacProcessingEnv.getContext()); - Log.setLogLevel(LogLevel.info); + Log.level = LogLevel.info; if(System.getProperty("debug") != null){ - Log.setLogLevel(LogLevel.debug); + Log.level = LogLevel.debug; } } @@ -219,7 +206,7 @@ public abstract class BaseProcessor extends AbstractProcessor{ String path = Fi.get(filer.getResource(StandardLocation.CLASS_OUTPUT, "no", "no") .toUri().toURL().toString().substring(OS.isWindows ? 6 : "file:".length())) .parent().parent().parent().parent().parent().parent().parent().toString().replace("%20", " "); - rootDirectory = Fi.get(path); + rootDirectory = Fi.get(path).parent(); }catch(IOException e){ throw new RuntimeException(e); } @@ -229,7 +216,7 @@ public abstract class BaseProcessor extends AbstractProcessor{ try{ process(roundEnv); }catch(Throwable e){ - e.printStackTrace(); + Log.err(e); throw new RuntimeException(e); } return true; diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index dd47acd2b9..9612018e7b 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -3,7 +3,6 @@ package mindustry.annotations.entity; import arc.files.*; import arc.func.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import arc.util.pooling.Pool.*; @@ -133,6 +132,7 @@ public class EntityProcess extends BaseProcessor{ .build())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build()); } + //generate interface getters and setters for all "standard" fields for(Svar field : component.fields().select(e -> !e.is(Modifier.STATIC) && !e.is(Modifier.PRIVATE) && !e.has(Import.class))){ String cname = field.name(); @@ -241,7 +241,6 @@ public class EntityProcess extends BaseProcessor{ //look at each definition for(Selement type : allDefs){ EntityDef ann = type.annotation(EntityDef.class); - boolean isFinal = ann.isFinal(); //all component classes (not interfaces) Seq components = allComponents(type); @@ -275,6 +274,13 @@ public class EntityProcess extends BaseProcessor{ name += "Entity"; } + boolean legacy = ann.legacy(); + + if(legacy){ + baseClass = tname(packageName + "." + name); + name += "Legacy" + Strings.capitalize(type.name()); + } + //skip double classes if(usedNames.containsKey(name)){ extraNames.get(usedNames.get(name), ObjectSet::new).add(type.name()); @@ -336,7 +342,8 @@ public class EntityProcess extends BaseProcessor{ boolean isVisible = !f.is(Modifier.STATIC) && !f.is(Modifier.PRIVATE) && !f.has(ReadOnly.class); //add the field only if it isn't visible or it wasn't implemented by the base class - if(!isShadowed || !isVisible){ + //legacy classes have no extra fields + if((!isShadowed || !isVisible) && !legacy){ builder.addField(spec); } @@ -346,7 +353,7 @@ public class EntityProcess extends BaseProcessor{ allFields.add(f); //add extra sync fields - if(f.has(SyncField.class) && isSync){ + if(f.has(SyncField.class) && isSync && !legacy){ if(!f.tname().toString().equals("float")) err("All SyncFields must be of type float", f); syncedFields.add(f); @@ -379,7 +386,7 @@ public class EntityProcess extends BaseProcessor{ .addModifiers(Modifier.PUBLIC) .addStatement("return $S + $L", name + "#", "id").build()); - EntityIO io = new EntityIO(type.name(), builder, allFieldSpecs, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(name)); + EntityIO io = new EntityIO(type.name(), builder, allFieldSpecs, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(type.name())); //entities with no sync comp and no serialization gen no code boolean hasIO = ann.genio() && (components.contains(s -> s.name().contains("Sync")) || ann.serialize()); @@ -440,11 +447,14 @@ public class EntityProcess extends BaseProcessor{ } } + boolean specialIO = false; + if(hasIO){ //SPECIAL CASE: I/O code //note that serialization is generated even for non-serializing entities for manual usage if((first.name().equals("read") || first.name().equals("write"))){ io.write(mbuilder, first.name().equals("write")); + specialIO = true; } //SPECIAL CASE: sync I/O code @@ -523,7 +533,9 @@ public class EntityProcess extends BaseProcessor{ mbuilder.addStatement("mindustry.gen.Groups.queueFree(($T)this)", Poolable.class); } - builder.addMethod(mbuilder.build()); + if(!legacy || specialIO){ + builder.addMethod(mbuilder.build()); + } } //add pool reset method and implement Poolable @@ -558,7 +570,7 @@ public class EntityProcess extends BaseProcessor{ .returns(tname(packageName + "." + name)) .addStatement(ann.pooled() ? "return Pools.obtain($L.class, " +name +"::new)" : "return new $L()", name).build()); - definitions.add(new EntityDefinition(packageName + "." + name, builder, type, typeIsBase ? null : baseClass, components, groups, allFieldSpecs)); + definitions.add(new EntityDefinition(packageName + "." + name, builder, type, typeIsBase ? null : baseClass, components, groups, allFieldSpecs, legacy)); } //generate groups @@ -663,11 +675,28 @@ public class EntityProcess extends BaseProcessor{ //build mapping class for sync IDs TypeSpec.Builder idBuilder = TypeSpec.classBuilder("EntityMapping").addModifiers(Modifier.PUBLIC) .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new Prov[256]").build()) + .addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(ObjectMap.class), tname(String.class), tname(Prov.class)), "nameMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new ObjectMap<>()").build()) + + .addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(IntMap.class), tname(String.class)), + "customIdMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new IntMap<>()").build()) + + .addMethod(MethodSpec.methodBuilder("register").addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .returns(TypeName.get(int.class)) + .addParameter(String.class, "name").addParameter(Prov.class, "constructor") + .addStatement("int next = arc.util.Structs.indexOf(idMap, v -> v == null)") + .addStatement("idMap[next] = constructor") + .addStatement("nameMap.put(name, constructor)") + .addStatement("customIdMap.put(next, name)") + .addStatement("return next") + .addJavadoc("Use this method for obtaining a classId for custom modded unit types. Only call this once for each type. Modded types should return this id in their overridden classId method.") + .build()) + .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(TypeName.get(Prov.class)).addParameter(int.class, "id").addStatement("return idMap[id]").build()) + .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(TypeName.get(Prov.class)).addParameter(String.class, "name").addStatement("return nameMap.get(name)").build()); @@ -696,11 +725,6 @@ public class EntityProcess extends BaseProcessor{ }else{ //round 3: generate actual classes and implement interfaces - //write base classes - for(TypeSpec.Builder b : baseClasses){ - write(b, imports.asArray()); - } - //implement each definition for(EntityDefinition def : definitions){ @@ -723,6 +747,14 @@ public class EntityProcess extends BaseProcessor{ def.builder.addSuperinterface(inter.tname()); + if(def.legacy) continue; + + @Nullable TypeSpec.Builder superclass = null; + + if(def.extend != null){ + superclass = baseClasses.find(b -> (packageName + "." + Reflect.get(b, "name")).equals(def.extend.toString())); + } + //generate getter/setter for each method for(Smethod method : inter.methods()){ String var = method.name(); @@ -730,14 +762,36 @@ public class EntityProcess extends BaseProcessor{ //make sure it's a real variable AND that the component doesn't already implement it somewhere with custom logic if(field == null || methodNames.contains(method.simpleString())) continue; + MethodSpec result = null; + //getter if(!method.isVoid()){ - def.builder.addMethod(MethodSpec.overriding(method.e).addStatement("return " + var).build()); + result = MethodSpec.overriding(method.e).addStatement("return " + var).build(); } //setter if(method.isVoid() && !Seq.with(field.annotations).contains(f -> f.type.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){ - def.builder.addMethod(MethodSpec.overriding(method.e).addStatement("this." + var + " = " + var).build()); + result = MethodSpec.overriding(method.e).addStatement("this." + var + " = " + var).build(); + } + + //add getter/setter to parent class, if possible. when this happens, skip adding getters setters *here* because they are defined in the superclass. + if(result != null && superclass != null){ + FieldSpec superField = Seq.with(superclass.fieldSpecs).find(f -> f.name.equals(var)); + + //found the right field, try to check for the method already existing now + if(superField != null){ + MethodSpec fr = result; + MethodSpec targetMethod = Seq.with(superclass.methodSpecs).find(m -> m.name.equals(var) && m.returnType.equals(fr.returnType)); + //if the method isn't added yet, add it. in any case, skip. + if(targetMethod == null){ + superclass.addMethod(result); + } + continue; + } + } + + if(result != null){ + def.builder.addMethod(result); } } } @@ -745,8 +799,16 @@ public class EntityProcess extends BaseProcessor{ write(def.builder, imports.asArray()); } + //write base classes last + for(TypeSpec.Builder b : baseClasses){ + write(b, imports.asArray()); + } + + //TODO nulls were an awful idea //store nulls TypeSpec.Builder nullsBuilder = TypeSpec.classBuilder("Nulls").addModifiers(Modifier.PUBLIC).addModifiers(Modifier.FINAL); + //TODO should be dynamic + ObjectSet nullList = ObjectSet.with("unit"); //create mock types of all components for(Stype interf : allInterfaces){ @@ -765,6 +827,12 @@ public class EntityProcess extends BaseProcessor{ //create null builder String baseName = interf.name().substring(0, interf.name().length() - 1); + + //prevent Nulls bloat + if(!nullList.contains(Strings.camelize(baseName))){ + continue; + } + String className = "Null" + baseName; TypeSpec.Builder nullBuilder = TypeSpec.classBuilder(className) .addModifiers(Modifier.FINAL); @@ -898,7 +966,7 @@ public class EntityProcess extends BaseProcessor{ } String createName(Selement elem){ - Seq comps = types(elem.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp);; + Seq comps = types(elem.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp); comps.sortComparing(Selement::name); return comps.toString("", s -> s.name().replace("Comp", "")); } @@ -942,9 +1010,10 @@ public class EntityProcess extends BaseProcessor{ final Selement naming; final String name; final @Nullable TypeName extend; + final boolean legacy; int classID; - public EntityDefinition(String name, Builder builder, Selement naming, TypeName extend, Seq components, Seq groups, Seq fieldSpec){ + public EntityDefinition(String name, Builder builder, Selement naming, TypeName extend, Seq components, Seq groups, Seq fieldSpec, boolean legacy){ this.builder = builder; this.name = name; this.naming = naming; @@ -952,6 +1021,7 @@ public class EntityProcess extends BaseProcessor{ this.components = components; this.extend = extend; this.fieldSpecs = fieldSpec; + this.legacy = legacy; } @Override diff --git a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java index 8e22e33db9..c144abc534 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java @@ -32,27 +32,40 @@ public class AssetsProcess extends BaseProcessor{ MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder loadStyles = MethodSpec.methodBuilder("loadStyles").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder icload = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); + CodeBlock.Builder ichinit = CodeBlock.builder(); String resources = rootDirectory + "/core/assets-raw/sprites/ui"; Jval icons = Jval.read(Fi.get(rootDirectory + "/core/assets-raw/fontgen/config.json").readString()); ObjectMap texIcons = new OrderedMap<>(); PropertiesUtils.load(texIcons, Fi.get(rootDirectory + "/core/assets/icons/icons.properties").reader()); + StringBuilder iconcAll = new StringBuilder(); + texIcons.each((key, val) -> { String[] split = val.split("\\|"); - String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", ""); - if(SourceVersion.isKeyword(name) || name.equals("char")) name = name + "i"; + String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", "").replace("Ui", ""); + if(SourceVersion.isKeyword(name) || name.equals("char")) name += "i"; - ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + key).build()); + ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).addJavadoc(String.format("\\u%04x", Integer.parseInt(key))).initializer("'" + ((char)Integer.parseInt(key)) + "'").build()); }); ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class), "icons", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("new ObjectMap<>()").build()); + ichtype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectIntMap.class, String.class), + "codes", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("new ObjectIntMap<>()").build()); + + ObjectSet used = new ObjectSet<>(); + for(Jval val : icons.get("glyphs").asArray()){ String name = capitalize(val.getString("css", "")); + + if(!val.getBool("selected", true) || !used.add(name)) continue; + int code = val.getInt("code", 0); - ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + code).build()); + iconcAll.append((char)code); + ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).addJavadoc(String.format("\\u%04x", code)).initializer("'" + ((char)code) + "'").build()); + ichinit.addStatement("codes.put($S, $L)", name, code); ictype.addField(TextureRegionDrawable.class, name + "Small", Modifier.PUBLIC, Modifier.STATIC); icload.addStatement(name + "Small = mindustry.ui.Fonts.getGlyph(mindustry.ui.Fonts.def, (char)" + code + ")"); @@ -64,6 +77,9 @@ public class AssetsProcess extends BaseProcessor{ icload.addStatement("icons.put($S, " + name + "Small)", name + "Small"); } + ichtype.addField(FieldSpec.builder(String.class, "all", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("$S", iconcAll.toString()).build()); + ichtype.addStaticBlock(ichinit.build()); + Fi.get(resources).walk(p -> { if(!p.extEquals("png")) return; @@ -78,7 +94,7 @@ public class AssetsProcess extends BaseProcessor{ if(SourceVersion.isKeyword(varname)) varname += "s"; type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC); - load.addStatement(varname + " = ("+dtype+")arc.Core.atlas.drawable($S)", sfilen); + load.addStatement(varname + " = (" + dtype + ")arc.Core.atlas.drawable($S)", sfilen); }); for(Element elem : elements){ @@ -101,12 +117,10 @@ public class AssetsProcess extends BaseProcessor{ void processSounds(String classname, String path, String rtype) throws Exception{ TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC); - 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<>(); Fi.get(path).walk(p -> { - String fname = p.name(); String name = p.nameWithoutExtension(); if(names.contains(name)){ @@ -115,27 +129,21 @@ public class AssetsProcess extends BaseProcessor{ names.add(name); } - if(SourceVersion.isKeyword(name)){ - name = name + "s"; - } + if(SourceVersion.isKeyword(name)) name += "s"; - String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname; + String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length()); - String filename = "arc.Core.app.getType() != arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\""; + String filename = "\"" + filepath + "\""; + loadBegin.addStatement("arc.Core.assets.load(" + filename + ", " + rtype + ".class).loaded = a -> " + name + " = (" + rtype + ")a", filepath, filepath.replace(".ogg", ".mp3")); - loadBegin.addStatement("arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3")); - - dispose.addStatement("arc.Core.assets.unload(" + filename + ")"); - dispose.addStatement(name + " = null"); - type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); + type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build()); }); if(classname.equals("Sounds")){ - type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); + type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build()); } type.addMethod(loadBegin.build()); - type.addMethod(dispose.build()); JavaFile.builder(packageName, type.build()).build().writeTo(BaseProcessor.filer); } diff --git a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java deleted file mode 100644 index e28ecf13a0..0000000000 --- a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java +++ /dev/null @@ -1,154 +0,0 @@ -package mindustry.annotations.impl; - -import com.sun.source.tree.*; -import com.sun.source.util.*; -import com.sun.tools.javac.code.Scope; -import com.sun.tools.javac.code.*; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.Type.*; -import com.sun.tools.javac.tree.*; -import com.sun.tools.javac.tree.JCTree.*; -import mindustry.annotations.Annotations.*; - -import javax.annotation.processing.*; -import javax.lang.model.*; -import javax.lang.model.element.*; -import javax.tools.Diagnostic.*; -import java.lang.annotation.*; -import java.util.*; - -@SupportedAnnotationTypes({"java.lang.Override"}) -public class CallSuperProcess extends AbstractProcessor{ - private Trees trees; - - @Override - public void init(ProcessingEnvironment pe){ - super.init(pe); - trees = Trees.instance(pe); - } - - @Override - public boolean process(Set annotations, RoundEnvironment roundEnv){ - for(Element e : roundEnv.getElementsAnnotatedWith(Override.class)){ - if(e.getAnnotation(OverrideCallSuper.class) != null) return false; - - CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner(); - codeScanner.methodName = e.getSimpleName().toString(); - - TreePath tp = trees.getPath(e.getEnclosingElement()); - codeScanner.scan(tp, trees); - - if(codeScanner.callSuperUsed){ - List list = codeScanner.method.getBody().getStatements(); - - if(!doesCallSuper(list, codeScanner.methodName)){ - processingEnv.getMessager().printMessage(Kind.ERROR, "Overriding method '" + codeScanner.methodName + "' must explicitly call super method from its parent class.", e); - } - } - } - - return false; - } - - private boolean doesCallSuper(List list, String methodName){ - for(Object object : list){ - if(object instanceof JCTree.JCExpressionStatement){ - JCTree.JCExpressionStatement expr = (JCExpressionStatement)object; - String exprString = expr.toString(); - if(exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true; - } - } - - return false; - } - - @Override - public SourceVersion getSupportedSourceVersion(){ - return SourceVersion.RELEASE_8; - } - - static class CodeAnalyzerTreeScanner extends TreePathScanner{ - String methodName; - MethodTree method; - boolean callSuperUsed; - - @Override - public Object visitClass(ClassTree classTree, Trees trees){ - Tree extendTree = classTree.getExtendsClause(); - - if(extendTree instanceof JCTypeApply){ //generic classes case - JCTypeApply generic = (JCTypeApply)extendTree; - extendTree = generic.clazz; - } - - if(extendTree instanceof JCIdent){ - JCIdent tree = (JCIdent)extendTree; - - if(tree == null || tree.sym == null) return super.visitClass(classTree, trees); - - com.sun.tools.javac.code.Scope members = tree.sym.members(); - - if(checkScope(members)) - return super.visitClass(classTree, trees); - - if(checkSuperTypes((ClassType)tree.type)) - return super.visitClass(classTree, trees); - - } - callSuperUsed = false; - - return super.visitClass(classTree, trees); - } - - public boolean checkSuperTypes(ClassType type){ - if(type.supertype_field != null && type.supertype_field.tsym != null){ - if(checkScope(type.supertype_field.tsym.members())) - return true; - else - return checkSuperTypes((ClassType)type.supertype_field); - } - - return false; - } - - @SuppressWarnings("unchecked") - public boolean checkScope(Scope members){ - Iterable it; - try{ - it = (Iterable)members.getClass().getMethod("getElements").invoke(members); - }catch(Throwable t){ - try{ - it = (Iterable)members.getClass().getMethod("getSymbols").invoke(members); - }catch(Exception e){ - throw new RuntimeException(e); - } - } - - for(Symbol s : it){ - - if(s instanceof MethodSymbol){ - MethodSymbol ms = (MethodSymbol)s; - - if(ms.getSimpleName().toString().equals(methodName)){ - Annotation annotation = ms.getAnnotation(CallSuper.class); - if(annotation != null){ - callSuperUsed = true; - return true; - } - } - } - } - - return false; - } - - @Override - public Object visitMethod(MethodTree methodTree, Trees trees){ - if(methodTree.getName().toString().equals(methodName)) - method = methodTree; - - return super.visitMethod(methodTree, trees); - } - - } -} diff --git a/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java index d2e3e99c17..7002972345 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java @@ -18,6 +18,7 @@ public class LoadRegionProcessor extends BaseProcessor{ @Override public void process(RoundEnvironment env) throws Exception{ TypeSpec.Builder regionClass = TypeSpec.classBuilder("ContentRegions") + .addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"deprecation\"").build()) .addModifiers(Modifier.PUBLIC); MethodSpec.Builder method = MethodSpec.methodBuilder("loadRegions") .addParameter(tname("mindustry.ctype.MappableContent"), "content") @@ -34,7 +35,7 @@ public class LoadRegionProcessor extends BaseProcessor{ } for(Entry> entry : fieldMap){ - method.beginControlFlow("if(content instanceof $T)", entry.key.tname()); + method.beginControlFlow("if(content instanceof $L)", entry.key.fullName()); for(Svar field : entry.value){ Load an = field.annotation(Load.class); @@ -45,7 +46,7 @@ public class LoadRegionProcessor extends BaseProcessor{ //not an array if(dims == 0){ - method.addStatement("(($T)content).$L = $T.atlas.find($L$L)", entry.key.tname(), field.name(), Core.class, parse(an.value()), fallbackString); + method.addStatement("(($L)content).$L = $T.atlas.find($L$L)", entry.key.fullName(), field.name(), Core.class, parse(an.value()), fallbackString); }else{ //is an array, create length string int[] lengths = an.lengths(); diff --git a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java index 64adc37c89..a6b2643c61 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java @@ -26,7 +26,8 @@ public class LogicStatementProcessor extends BaseProcessor{ MethodSpec.Builder reader = MethodSpec.methodBuilder("read") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(tname("mindustry.logic.LStatement")) - .addParameter(String[].class, "tokens"); + .addParameter(String[].class, "tokens") + .addParameter(int.class, "length"); Seq types = types(RegisterStatement.class); @@ -43,9 +44,9 @@ public class LogicStatementProcessor extends BaseProcessor{ String name = c.annotation(RegisterStatement.class).value(); if(beganWrite){ - writer.nextControlFlow("else if(obj instanceof $T)", c.mirror()); + writer.nextControlFlow("else if(obj.getClass() == $T.class)", c.mirror()); }else{ - writer.beginControlFlow("if(obj instanceof $T)", c.mirror()); + writer.beginControlFlow("if(obj.getClass() == $T.class)", c.mirror()); beganWrite = true; } @@ -53,6 +54,7 @@ public class LogicStatementProcessor extends BaseProcessor{ writer.addStatement("out.append($S)", name); Seq fields = c.fields(); + fields.addAll(c.superclass().fields()); String readSt = "if(tokens[0].equals($S))"; if(beganRead){ @@ -75,7 +77,7 @@ public class LogicStatementProcessor extends BaseProcessor{ ""); //reading primitives, strings and enums is supported; nothing else is - reader.addStatement("if(tokens.length > $L) result.$L = $L(tokens[$L])", + reader.addStatement("if(length > $L) result.$L = $L(tokens[$L])", index + 1, field.name(), field.mirror().toString().equals("java.lang.String") ? diff --git a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java new file mode 100644 index 0000000000..00ac5fabac --- /dev/null +++ b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java @@ -0,0 +1,363 @@ +package mindustry.annotations.remote; + +import arc.struct.*; +import arc.util.io.*; +import com.squareup.javapoet.*; +import mindustry.annotations.Annotations.*; +import mindustry.annotations.*; +import mindustry.annotations.util.*; +import mindustry.annotations.util.TypeIOResolver.*; + +import javax.lang.model.element.*; +import java.io.*; + +import static mindustry.annotations.BaseProcessor.*; + +/** Generates code for writing remote invoke packets on the client and server. */ +public class CallGenerator{ + + /** Generates all classes in this list. */ + public static void generate(ClassSerializer serializer, Seq methods) throws IOException{ + //create builder + TypeSpec.Builder callBuilder = TypeSpec.classBuilder(RemoteProcess.callLocation).addModifiers(Modifier.PUBLIC); + + MethodSpec.Builder register = MethodSpec.methodBuilder("registerPackets") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + + //go through each method entry in this class + for(MethodEntry ent : methods){ + //builder for the packet type + TypeSpec.Builder packet = TypeSpec.classBuilder(ent.packetClassName) + .addModifiers(Modifier.PUBLIC); + + packet.superclass(tname("mindustry.net.Packet")); + + //return the correct priority + if(ent.priority != PacketPriority.normal){ + packet.addMethod(MethodSpec.methodBuilder("getPriority") + .addModifiers(Modifier.PUBLIC) + .addAnnotation(Override.class).returns(int.class).addStatement("return $L", ent.priority.ordinal()) + .build()); + } + + //implement read & write methods + packet.addMethod(makeWriter(ent, serializer)); + packet.addMethod(makeReader(ent, serializer)); + + //generate handlers + if(ent.where.isClient){ + packet.addMethod(writeHandleMethod(ent, false)); + } + + if(ent.where.isServer){ + packet.addMethod(writeHandleMethod(ent, true)); + } + + //register packet + register.addStatement("mindustry.net.Net.registerPacket($L.$L::new)", packageName, ent.packetClassName); + + //add fields to the type + for(Svar param : ent.element.params()){ + packet.addField(param.tname(), param.name(), Modifier.PUBLIC); + } + + //write the 'send event to all players' variant: always happens for clients, but only happens if 'all' is enabled on the server method + if(ent.where.isClient || ent.target.isAll){ + writeCallMethod(callBuilder, ent, true, false); + } + + //write the 'send event to one player' variant, which is only applicable on the server + if(ent.where.isServer && ent.target.isOne){ + writeCallMethod(callBuilder, ent, false, false); + } + + //write the forwarded method version + if(ent.where.isServer && ent.forward){ + writeCallMethod(callBuilder, ent, true, true); + } + + //write the completed packet class + JavaFile.builder(packageName, packet.build()).build().writeTo(BaseProcessor.filer); + } + + callBuilder.addMethod(register.build()); + + //build and write resulting class + TypeSpec spec = callBuilder.build(); + JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer); + } + + private static MethodSpec makeWriter(MethodEntry ent, ClassSerializer serializer){ + MethodSpec.Builder builder = MethodSpec.methodBuilder("write") + .addParameter(Writes.class, "WRITE") + .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class); + Seq params = ent.element.params(); + + for(int i = 0; i < params.size; i++){ + //first argument is skipped as it is always the player caller + if(!ent.where.isServer && i == 0){ + continue; + } + + Svar var = params.get(i); + + //name of parameter + String varName = var.name(); + //name of parameter type + String typeName = var.mirror().toString(); + //special case: method can be called from anywhere to anywhere + //thus, only write the player when the SERVER is writing data, since the client is the only one who reads the player anyway + boolean writePlayerSkipCheck = ent.where == Loc.both && i == 0; + + if(writePlayerSkipCheck){ //write begin check + builder.beginControlFlow("if(mindustry.Vars.net.server())"); + } + + if(BaseProcessor.isPrimitive(typeName)){ //check if it's a primitive, and if so write it + builder.addStatement("WRITE.$L($L)", typeName.equals("boolean") ? "bool" : typeName.charAt(0) + "", varName); + }else{ + //else, try and find a serializer + String ser = serializer.writers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(ent.element.e, var.mirror(), true)); + + if(ser == null){ //make sure a serializer exists! + BaseProcessor.err("No method to write class type: '" + typeName + "'", var); + } + + //add statement for writing it + builder.addStatement(ser + "(WRITE, " + varName + ")"); + } + + if(writePlayerSkipCheck){ //write end check + builder.endControlFlow(); + } + } + + return builder.build(); + } + + private static MethodSpec makeReader(MethodEntry ent, ClassSerializer serializer){ + MethodSpec.Builder builder = MethodSpec.methodBuilder("read") + .addParameter(Reads.class, "READ") + .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class); + Seq params = ent.element.params(); + + //go through each parameter + for(int i = 0; i < params.size; i++){ + Svar var = params.get(i); + + //first argument is skipped as it is always the player caller + if(!ent.where.isServer && i == 0){ + continue; + } + + //special case: method can be called from anywhere to anywhere + //thus, only read the player when the CLIENT is receiving data, since the client is the only one who cares about the player anyway + boolean writePlayerSkipCheck = ent.where == Loc.both && i == 0; + + if(writePlayerSkipCheck){ //write begin check + builder.beginControlFlow("if(mindustry.Vars.net.client())"); + } + + //full type name of parameter + String typeName = var.mirror().toString(); + //name of parameter + String varName = var.name(); + //capitalized version of type name for reading primitives + String pname = typeName.equals("boolean") ? "bool" : typeName.charAt(0) + ""; + + //write primitives automatically + if(BaseProcessor.isPrimitive(typeName)){ + builder.addStatement("$L = READ.$L()", varName, pname); + }else{ + //else, try and find a serializer + String ser = serializer.readers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(ent.element.e, var.mirror(), false)); + + if(ser == null){ //make sure a serializer exists! + BaseProcessor.err("No read method to read class type '" + typeName + "' in method " + ent.targetMethod + "; " + serializer.readers, var); + } + + //add statement for reading it + builder.addStatement("$L = $L(READ)", varName, ser); + } + + if(writePlayerSkipCheck){ //write end check + builder.endControlFlow(); + } + } + + return builder.build(); + } + + /** Creates a specific variant for a method entry. */ + private static void writeCallMethod(TypeSpec.Builder classBuilder, MethodEntry ent, boolean toAll, boolean forwarded){ + Smethod elem = ent.element; + Seq params = elem.params(); + + //create builder + MethodSpec.Builder method = MethodSpec.methodBuilder(elem.name() + (forwarded ? "__forward" : "")) //add except suffix when forwarding + .addModifiers(Modifier.STATIC) + .returns(void.class); + + //forwarded methods aren't intended for use, and are not public + if(!forwarded){ + method.addModifiers(Modifier.PUBLIC); + } + + //validate client methods to make sure + if(ent.where.isClient){ + if(params.isEmpty()){ + BaseProcessor.err("Client invoke methods must have a first parameter of type Player", elem); + return; + } + + if(!params.get(0).mirror().toString().contains("Player")){ + BaseProcessor.err("Client invoke methods should have a first parameter of type Player", elem); + return; + } + } + + //if toAll is false, it's a 'send to one player' variant, so add the player as a parameter + if(!toAll){ + method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "playerConnection"); + } + + //add sender to ignore + if(forwarded){ + method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "exceptConnection"); + } + + //call local method if applicable, shouldn't happen when forwarding method as that already happens by default + if(!forwarded && ent.local != Loc.none){ + //add in local checks + if(ent.local != Loc.both){ + method.beginControlFlow("if(" + getCheckString(ent.local) + " || !mindustry.Vars.net.active())"); + } + + //concatenate parameters + int index = 0; + StringBuilder results = new StringBuilder(); + for(Svar var : params){ + //special case: calling local-only methods uses the local player + if(index == 0 && ent.where == Loc.client){ + results.append("mindustry.Vars.player"); + }else{ + results.append(var.name()); + } + if(index != params.size - 1) results.append(", "); + index++; + } + + //add the statement to call it + method.addStatement("$N." + elem.name() + "(" + results + ")", + ((TypeElement)elem.up()).getQualifiedName().toString()); + + if(ent.local != Loc.both){ + method.endControlFlow(); + } + } + + //start control flow to check if it's actually client/server so no netcode is called + method.beginControlFlow("if(" + getCheckString(ent.where) + ")"); + + //add statement to create packet from pool + method.addStatement("$1T packet = new $1T()", tname("mindustry.gen." + ent.packetClassName)); + + method.addTypeVariables(Seq.with(elem.e.getTypeParameters()).map(BaseProcessor::getTVN)); + + for(int i = 0; i < params.size; i++){ + //first argument is skipped as it is always the player caller + if((!ent.where.isServer) && i == 0){ + continue; + } + + Svar var = params.get(i); + + method.addParameter(var.tname(), var.name()); + + //name of parameter + String varName = var.name(); + //special case: method can be called from anywhere to anywhere + //thus, only write the player when the SERVER is writing data, since the client is the only one who reads it + boolean writePlayerSkipCheck = ent.where == Loc.both && i == 0; + + if(writePlayerSkipCheck){ //write begin check + method.beginControlFlow("if(mindustry.Vars.net.server())"); + } + + method.addStatement("packet.$L = $L", varName, varName); + + if(writePlayerSkipCheck){ //write end check + method.endControlFlow(); + } + } + + String sendString; + + if(forwarded){ //forward packet + if(!ent.local.isClient){ //if the client doesn't get it called locally, forward it back after validation + sendString = "mindustry.Vars.net.send("; + }else{ + sendString = "mindustry.Vars.net.sendExcept(exceptConnection, "; + } + }else if(toAll){ //send to all players / to server + sendString = "mindustry.Vars.net.send("; + }else{ //send to specific client from server + sendString = "playerConnection.send("; + } + + //send the actual packet + method.addStatement(sendString + "packet, " + (!ent.unreliable) + ")"); + + + //end check for server/client + method.endControlFlow(); + + //add method to class, finally + classBuilder.addMethod(method.build()); + } + + private static String getCheckString(Loc loc){ + return + loc.isClient && loc.isServer ? "mindustry.Vars.net.server() || mindustry.Vars.net.client()" : + loc.isClient ? "mindustry.Vars.net.client()" : + loc.isServer ? "mindustry.Vars.net.server()" : "false"; + } + + /** Generates handleServer / handleClient methods. */ + public static MethodSpec writeHandleMethod(MethodEntry ent, boolean isClient){ + + //create main method builder + MethodSpec.Builder builder = MethodSpec.methodBuilder(isClient ? "handleClient" : "handleServer") + .addModifiers(Modifier.PUBLIC) + .addAnnotation(Override.class) + .returns(void.class); + + Smethod elem = ent.element; + Seq params = elem.params(); + + if(!isClient){ + //add player parameter + builder.addParameter(ClassName.get("mindustry.net", "NetConnection"), "con"); + + //skip if player is invalid + builder.beginControlFlow("if(con.player == null || con.kicked)"); + builder.addStatement("return"); + builder.endControlFlow(); + + //make sure to use the actual player who sent the packet + builder.addStatement("mindustry.gen.Player player = con.player"); + } + + //execute the relevant method before the forward + //if it throws a ValidateException, the method won't be forwarded + builder.addStatement("$N." + elem.name() + "(" + params.toString(", ", s -> s.name()) + ")", ((TypeElement)elem.up()).getQualifiedName().toString()); + + //call forwarded method, don't forward on the client reader + if(ent.forward && ent.where.isServer && !isClient){ + //call forwarded method + builder.addStatement("$L.$L.$L__forward(con, $L)", packageName, ent.className, elem.name(), params.toString(", ", s -> s.name())); + } + + return builder.build(); + } +} diff --git a/annotations/src/main/java/mindustry/annotations/remote/ClassEntry.java b/annotations/src/main/java/mindustry/annotations/remote/ClassEntry.java deleted file mode 100644 index 3474eff468..0000000000 --- a/annotations/src/main/java/mindustry/annotations/remote/ClassEntry.java +++ /dev/null @@ -1,15 +0,0 @@ -package mindustry.annotations.remote; - -import java.util.ArrayList; - -/** Represents a class witha list method entries to include in it. */ -public class ClassEntry{ - /** All methods in this generated class. */ - public final ArrayList methods = new ArrayList<>(); - /** Simple class name. */ - public final String name; - - public ClassEntry(String name){ - this.name = name; - } -} diff --git a/annotations/src/main/java/mindustry/annotations/remote/MethodEntry.java b/annotations/src/main/java/mindustry/annotations/remote/MethodEntry.java index 68ea81dec0..768b373387 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/MethodEntry.java +++ b/annotations/src/main/java/mindustry/annotations/remote/MethodEntry.java @@ -1,8 +1,7 @@ package mindustry.annotations.remote; import mindustry.annotations.Annotations.*; - -import javax.lang.model.element.ExecutableElement; +import mindustry.annotations.util.*; /** Class that repesents a remote method to be constructed and put into a class. */ public class MethodEntry{ @@ -10,6 +9,8 @@ public class MethodEntry{ public final String className; /** Fully qualified target method to call. */ public final String targetMethod; + /** Simple name of the generated packet class. */ + public final String packetClassName; /** Whether this method can be called on a client/server. */ public final Loc where; /** @@ -26,12 +27,13 @@ public class MethodEntry{ /** Unique method ID. */ public final int id; /** The element method associated with this entry. */ - public final ExecutableElement element; + public final Smethod element; /** The assigned packet priority. Only used in clients. */ public final PacketPriority priority; - public MethodEntry(String className, String targetMethod, Loc where, Variant target, - Loc local, boolean unreliable, boolean forward, int id, ExecutableElement element, PacketPriority priority){ + public MethodEntry(String className, String targetMethod, String packetClassName, Loc where, Variant target, + Loc local, boolean unreliable, boolean forward, int id, Smethod element, PacketPriority priority){ + this.packetClassName = packetClassName; this.className = className; this.forward = forward; this.targetMethod = targetMethod; diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java index b3a473795a..ceceddb8a8 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java @@ -1,7 +1,7 @@ package mindustry.annotations.remote; import arc.struct.*; -import com.squareup.javapoet.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.annotations.*; import mindustry.annotations.util.*; @@ -9,7 +9,6 @@ import mindustry.annotations.util.TypeIOResolver.*; import javax.annotation.processing.*; import javax.lang.model.element.*; -import java.util.*; /** The annotation processor for generating remote method call code. */ @@ -18,106 +17,58 @@ import java.util.*; "mindustry.annotations.Annotations.TypeIOHandler" }) public class RemoteProcess extends BaseProcessor{ - /** Maximum size of each event packet. */ - public static final int maxPacketSize = 8192; - /** Warning on top of each autogenerated file. */ - public static final String autogenWarning = "Autogenerated file. Do not modify!\n"; - - /** Name of class that handles reading and invoking packets on the server. */ - private static final String readServerName = "RemoteReadServer"; - /** Name of class that handles reading and invoking packets on the client. */ - private static final String readClientName = "RemoteReadClient"; /** Simple class name of generated class name. */ - private static final String callLocation = "Call"; - - //class serializers - private ClassSerializer serializer; - //all elements with the Remote annotation - private Seq elements; - //map of all classes to generate by name - private HashMap classMap; - //list of all method entries - private Seq methods; - //list of all method entries - private Seq classes; - - { - rounds = 2; - } + public static final String callLocation = "Call"; @Override public void process(RoundEnvironment roundEnv) throws Exception{ - //round 1: find all annotations, generate *writers* - if(round == 1){ - //get serializers - serializer = TypeIOResolver.resolve(this); - //last method ID used - int lastMethodID = 0; - //find all elements with the Remote annotation - elements = methods(Remote.class); - //map of all classes to generate by name - classMap = new HashMap<>(); - //list of all method entries - methods = new Seq<>(); - //list of all method entries - classes = new Seq<>(); + //get serializers + //class serializers + ClassSerializer serializer = TypeIOResolver.resolve(this); + //last method ID used + int lastMethodID = 0; + //find all elements with the Remote annotation + //all elements with the Remote annotation + Seq elements = methods(Remote.class); + //list of all method entries + Seq methods = new Seq<>(); - Seq orderedElements = elements.copy(); - orderedElements.sortComparing(Object::toString); + Seq orderedElements = elements.copy(); + orderedElements.sortComparing(Selement::toString); - //create methods - for(Smethod element : orderedElements){ - Remote annotation = element.annotation(Remote.class); + //create methods + for(Smethod element : orderedElements){ + Remote annotation = element.annotation(Remote.class); - //check for static - if(!element.is(Modifier.STATIC) || !element.is(Modifier.PUBLIC)){ - err("All @Remote methods must be public and static: ", element); - } - - //can't generate none methods - if(annotation.targets() == Loc.none){ - err("A @Remote method's targets() cannot be equal to 'none':", element); - } - - //get and create class entry if needed - if(!classMap.containsKey(callLocation)){ - ClassEntry clas = new ClassEntry(callLocation); - classMap.put(callLocation, clas); - classes.add(clas); - } - - ClassEntry entry = classMap.get(callLocation); - - //create and add entry - MethodEntry method = new MethodEntry(entry.name, BaseProcessor.getMethodName(element.e), annotation.targets(), annotation.variants(), - annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, element.e, annotation.priority()); - - entry.methods.add(method); - methods.add(method); + //check for static + if(!element.is(Modifier.STATIC) || !element.is(Modifier.PUBLIC)){ + err("All @Remote methods must be public and static", element); } - //create read/write generators - RemoteWriteGenerator writegen = new RemoteWriteGenerator(serializer); + //can't generate none methods + if(annotation.targets() == Loc.none){ + err("A @Remote method's targets() cannot be equal to 'none'", element); + } - //generate the methods to invoke (write) - writegen.generateFor(classes, packageName); - }else if(round == 2){ //round 2: generate all *readers* - RemoteReadGenerator readgen = new RemoteReadGenerator(serializer); + String packetName = Strings.capitalize(element.name()) + "CallPacket"; + int[] index = {1}; - //generate server readers - readgen.generateFor(methods.select(method -> method.where.isClient), readServerName, packageName, true); - //generate client readers - readgen.generateFor(methods.select(method -> method.where.isServer), readClientName, packageName, false); + while(methods.contains(m -> m.packetClassName.equals(packetName + (index[0] == 1 ? "" : index[0])))){ + index[0] ++; + } - //create class for storing unique method hash - TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC); - hashBuilder.addJavadoc(autogenWarning); - hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL) - .initializer("$1L", Arrays.hashCode(methods.map(m -> m.element).toArray())).build()); + //create and add entry + MethodEntry method = new MethodEntry( + callLocation, BaseProcessor.getMethodName(element.e), packetName + (index[0] == 1 ? "" : index[0]), + annotation.targets(), annotation.variants(), + annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, + element, annotation.priority() + ); - //build and write resulting hash class - TypeSpec spec = hashBuilder.build(); - JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer); + methods.add(method); } + + //generate the methods to invoke, as well as the packet classes + CallGenerator.generate(serializer, methods); } } diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java deleted file mode 100644 index a8493d5643..0000000000 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java +++ /dev/null @@ -1,129 +0,0 @@ -package mindustry.annotations.remote; - -import arc.struct.*; -import arc.util.io.*; -import com.squareup.javapoet.*; -import mindustry.annotations.*; -import mindustry.annotations.util.TypeIOResolver.*; - -import javax.lang.model.element.*; - -/** Generates code for reading remote invoke packets on the client and server. */ -public class RemoteReadGenerator{ - private final ClassSerializer serializers; - - /** Creates a read generator that uses the supplied serializer setup. */ - public RemoteReadGenerator(ClassSerializer serializers){ - this.serializers = serializers; - } - - /** - * Generates a class for reading remote invoke packets. - * @param entries List of methods to use. - * @param className Simple target class name. - * @param packageName Full target package name. - * @param needsPlayer Whether this read method requires a reference to the player sender. - */ - public void generateFor(Seq entries, String className, String packageName, boolean needsPlayer) throws Exception{ - - TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); - classBuilder.addJavadoc(RemoteProcess.autogenWarning); - - //create main method builder - MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket") - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .addParameter(Reads.class, "read") //buffer to read form - .addParameter(int.class, "id") //ID of method type to read - .returns(void.class); - - if(needsPlayer){ - //add player parameter - readMethod.addParameter(ClassName.get(packageName, "Player"), "player"); - } - - CodeBlock.Builder readBlock = CodeBlock.builder(); //start building block of code inside read method - boolean started = false; //whether an if() statement has been written yet - - for(MethodEntry entry : entries){ - //write if check for this entry ID - if(!started){ - started = true; - readBlock.beginControlFlow("if(id == " + entry.id + ")"); - }else{ - readBlock.nextControlFlow("else if(id == " + entry.id + ")"); - } - - readBlock.beginControlFlow("try"); - - //concatenated list of variable names for method invocation - StringBuilder varResult = new StringBuilder(); - - //go through each parameter - for(int i = 0; i < entry.element.getParameters().size(); i++){ - VariableElement var = entry.element.getParameters().get(i); - - if(!needsPlayer || i != 0){ //if client, skip first parameter since it's always of type player and doesn't need to be read - //full type name of parameter - String typeName = var.asType().toString(); - //name of parameter - String varName = var.getSimpleName().toString(); - //captialized version of type name for reading primitives - String pname = typeName.equals("boolean") ? "bool" : typeName.charAt(0) + ""; - - //write primitives automatically - if(BaseProcessor.isPrimitive(typeName)){ - readBlock.addStatement("$L $L = read.$L()", typeName, varName, pname); - }else{ - //else, try and find a serializer - String ser = serializers.readers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(entry.element, var.asType(), false)); - - if(ser == null){ //make sure a serializer exists! - BaseProcessor.err("No read method to read class type '" + typeName + "' in method " + entry.targetMethod + "; " + serializers.readers, var); - return; - } - - //add statement for reading it - readBlock.addStatement(typeName + " " + varName + " = " + ser + "(read)"); - } - - //append variable name to string builder - varResult.append(var.getSimpleName()); - if(i != entry.element.getParameters().size() - 1) varResult.append(", "); - }else{ - varResult.append("player"); - if(i != entry.element.getParameters().size() - 1) varResult.append(", "); - } - } - - //execute the relevant method before the forward - //if it throws a ValidateException, the method won't be forwarded - readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement)entry.element.getEnclosingElement()).getQualifiedName().toString()); - - //call forwarded method, don't forward on the client reader - if(entry.forward && entry.where.isServer && needsPlayer){ - //call forwarded method - readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() + - "__forward(player.con" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")"); - } - - readBlock.nextControlFlow("catch (java.lang.Exception e)"); - readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to to read remote method '" + entry.element.getSimpleName() + "'!\", e)"); - readBlock.endControlFlow(); - } - - //end control flow if necessary - if(started){ - readBlock.nextControlFlow("else"); - readBlock.addStatement("throw new $1N(\"Invalid read method ID: \" + id + \"\")", RuntimeException.class.getName()); //handle invalid method IDs - readBlock.endControlFlow(); - } - - //add block and method to class - readMethod.addCode(readBlock.build()); - classBuilder.addMethod(readMethod.build()); - - //build and write resulting class - TypeSpec spec = classBuilder.build(); - JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer); - } -} diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java deleted file mode 100644 index 606fe513bd..0000000000 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java +++ /dev/null @@ -1,228 +0,0 @@ -package mindustry.annotations.remote; - -import arc.struct.*; -import arc.util.io.*; -import com.squareup.javapoet.*; -import mindustry.annotations.Annotations.*; -import mindustry.annotations.*; -import mindustry.annotations.util.TypeIOResolver.*; - -import javax.lang.model.element.*; -import java.io.*; - -/** Generates code for writing remote invoke packets on the client and server. */ -public class RemoteWriteGenerator{ - private final ClassSerializer serializers; - - /** Creates a write generator that uses the supplied serializer setup. */ - public RemoteWriteGenerator(ClassSerializer serializers){ - this.serializers = serializers; - } - - /** Generates all classes in this list. */ - public void generateFor(Seq entries, String packageName) throws IOException{ - - for(ClassEntry entry : entries){ - //create builder - TypeSpec.Builder classBuilder = TypeSpec.classBuilder(entry.name).addModifiers(Modifier.PUBLIC); - classBuilder.addJavadoc(RemoteProcess.autogenWarning); - - //add temporary write buffer - classBuilder.addField(FieldSpec.builder(ReusableByteOutStream.class, "OUT", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL) - .initializer("new ReusableByteOutStream($L)", RemoteProcess.maxPacketSize).build()); - - //add writer for that buffer - classBuilder.addField(FieldSpec.builder(Writes.class, "WRITE", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL) - .initializer("new Writes(new $T(OUT))", DataOutputStream.class).build()); - - //go through each method entry in this class - for(MethodEntry methodEntry : entry.methods){ - //write the 'send event to all players' variant: always happens for clients, but only happens if 'all' is enabled on the server method - if(methodEntry.where.isClient || methodEntry.target.isAll){ - writeMethodVariant(classBuilder, methodEntry, true, false); - } - - //write the 'send event to one player' variant, which is only applicable on the server - if(methodEntry.where.isServer && methodEntry.target.isOne){ - writeMethodVariant(classBuilder, methodEntry, false, false); - } - - //write the forwarded method version - if(methodEntry.where.isServer && methodEntry.forward){ - writeMethodVariant(classBuilder, methodEntry, true, true); - } - } - - //build and write resulting class - TypeSpec spec = classBuilder.build(); - JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer); - } - } - - /** Creates a specific variant for a method entry. */ - private void writeMethodVariant(TypeSpec.Builder classBuilder, MethodEntry methodEntry, boolean toAll, boolean forwarded){ - ExecutableElement elem = methodEntry.element; - - //create builder - MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding - .addModifiers(Modifier.STATIC) - .returns(void.class); - - //forwarded methods aren't intended for use, and are not public - if(!forwarded){ - method.addModifiers(Modifier.PUBLIC); - } - - //validate client methods to make sure - if(methodEntry.where.isClient){ - if(elem.getParameters().isEmpty()){ - BaseProcessor.err("Client invoke methods must have a first parameter of type Player", elem); - return; - } - - if(!elem.getParameters().get(0).asType().toString().contains("Player")){ - BaseProcessor.err("Client invoke methods should have a first parameter of type Player", elem); - return; - } - } - - //if toAll is false, it's a 'send to one player' variant, so add the player as a parameter - if(!toAll){ - method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "playerConnection"); - } - - //add sender to ignore - if(forwarded){ - method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "exceptConnection"); - } - - //call local method if applicable, shouldn't happen when forwarding method as that already happens by default - if(!forwarded && methodEntry.local != Loc.none){ - //add in local checks - if(methodEntry.local != Loc.both){ - method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !mindustry.Vars.net.active())"); - } - - //concatenate parameters - int index = 0; - StringBuilder results = new StringBuilder(); - for(VariableElement var : elem.getParameters()){ - //special case: calling local-only methods uses the local player - if(index == 0 && methodEntry.where == Loc.client){ - results.append("mindustry.Vars.player"); - }else{ - results.append(var.getSimpleName()); - } - if(index != elem.getParameters().size() - 1) results.append(", "); - index++; - } - - //add the statement to call it - method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")", - ((TypeElement)elem.getEnclosingElement()).getQualifiedName().toString()); - - if(methodEntry.local != Loc.both){ - method.endControlFlow(); - } - } - - //start control flow to check if it's actually client/server so no netcode is called - method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")"); - - //add statement to create packet from pool - method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "mindustry.net.Packets.InvokePacket", "arc.util.pooling.Pools"); - //assign priority - method.addStatement("packet.priority = (byte)" + methodEntry.priority.ordinal()); - //assign method ID - method.addStatement("packet.type = (byte)" + methodEntry.id); - //reset stream - method.addStatement("OUT.reset()"); - - method.addTypeVariables(Seq.with(elem.getTypeParameters()).map(BaseProcessor::getTVN)); - - for(int i = 0; i < elem.getParameters().size(); i++){ - //first argument is skipped as it is always the player caller - if((!methodEntry.where.isServer/* || methodEntry.mode == Loc.both*/) && i == 0){ - continue; - } - - VariableElement var = elem.getParameters().get(i); - - try{ - //add parameter to method - method.addParameter(TypeName.get(var.asType()), var.getSimpleName().toString()); - }catch(Throwable t){ - throw new RuntimeException("Error parsing method " + methodEntry.targetMethod); - } - - //name of parameter - String varName = var.getSimpleName().toString(); - //name of parameter type - String typeName = var.asType().toString(); - //captialized version of type name for writing primitives - String capName = typeName.equals("byte") ? "" : Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1); - //special case: method can be called from anywhere to anywhere - //thus, only write the player when the SERVER is writing data, since the client is the only one who reads it - boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0; - - if(writePlayerSkipCheck){ //write begin check - method.beginControlFlow("if(mindustry.Vars.net.server())"); - } - - if(BaseProcessor.isPrimitive(typeName)){ //check if it's a primitive, and if so write it - method.addStatement("WRITE.$L($L)", typeName.equals("boolean") ? "bool" : typeName.charAt(0) + "", varName); - }else{ - //else, try and find a serializer - String ser = serializers.writers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(elem, var.asType(), true)); - - if(ser == null){ //make sure a serializer exists! - BaseProcessor.err("No @WriteClass method to write class type: '" + typeName + "'", var); - return; - } - - //add statement for writing it - method.addStatement(ser + "(WRITE, " + varName + ")"); - } - - if(writePlayerSkipCheck){ //write end check - method.endControlFlow(); - } - } - - //assign packet bytes - method.addStatement("packet.bytes = OUT.getBytes()"); - //assign packet length - method.addStatement("packet.length = OUT.size()"); - - String sendString; - - if(forwarded){ //forward packet - if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation - sendString = "mindustry.Vars.net.send("; - }else{ - sendString = "mindustry.Vars.net.sendExcept(exceptConnection, "; - } - }else if(toAll){ //send to all players / to server - sendString = "mindustry.Vars.net.send("; - }else{ //send to specific client from server - sendString = "playerConnection.send("; - } - - //send the actual packet - method.addStatement(sendString + "packet, " + - (methodEntry.unreliable ? "mindustry.net.Net.SendMode.udp" : "mindustry.net.Net.SendMode.tcp") + ")"); - - - //end check for server/client - method.endControlFlow(); - - //add method to class, finally - classBuilder.addMethod(method.build()); - } - - private String getCheckString(Loc loc){ - return loc.isClient && loc.isServer ? "mindustry.Vars.net.server() || mindustry.Vars.net.client()" : - loc.isClient ? "mindustry.Vars.net.client()" : - loc.isServer ? "mindustry.Vars.net.server()" : "false"; - } -} diff --git a/annotations/src/main/java/mindustry/annotations/util/Selement.java b/annotations/src/main/java/mindustry/annotations/util/Selement.java index 1a4c6b784a..ca7a9ce5ad 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Selement.java +++ b/annotations/src/main/java/mindustry/annotations/util/Selement.java @@ -1,7 +1,7 @@ package mindustry.annotations.util; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import com.squareup.javapoet.*; import com.sun.tools.javac.code.Attribute.*; import mindustry.annotations.*; @@ -19,7 +19,8 @@ public class Selement{ this.e = e; } - public @Nullable String doc(){ + @Nullable + public String doc(){ return BaseProcessor.elementu.getDocComment(e); } diff --git a/annotations/src/main/java/mindustry/annotations/util/Svar.java b/annotations/src/main/java/mindustry/annotations/util/Svar.java index 2b74ced930..b160ec6ca0 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Svar.java +++ b/annotations/src/main/java/mindustry/annotations/util/Svar.java @@ -1,7 +1,6 @@ package mindustry.annotations.util; import com.sun.source.tree.*; -import com.sun.tools.javac.tree.JCTree.*; import mindustry.annotations.*; import javax.lang.model.element.*; @@ -16,10 +15,6 @@ public class Svar extends Selement{ return up().asType().toString() + "#" + super.toString().replace("mindustry.gen.", ""); } - public JCVariableDecl jtree(){ - return (JCVariableDecl)BaseProcessor.elementu.getTree(e); - } - public Stype enclosingType(){ return new Stype((TypeElement)up()); } diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 86ca440e1c..2dc5b73284 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -1,10 +1,13 @@ #Maps entity names to IDs. Autogenerated. alpha=0 +arkyid=29 atrax=1 +beta=30 block=2 corvus=24 flare=3 +gamma=31 mace=4 mega=5 mindustry.entities.comp.BuildingComp=6 @@ -14,9 +17,12 @@ mindustry.entities.comp.EffectStateComp=9 mindustry.entities.comp.FireComp=10 mindustry.entities.comp.LaunchCoreComp=11 mindustry.entities.comp.PlayerComp=12 +mindustry.entities.comp.PosTeam=27 +mindustry.entities.comp.PosTeamDef=28 mindustry.entities.comp.PuddleComp=13 mindustry.type.Weather.WeatherStateComp=14 mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=15 +mindustry.world.blocks.campaign.PayloadLaunchPad.LargeLaunchPayloadComp=34 mindustry.world.blocks.defense.ForceProjector.ForceDrawComp=22 mono=16 nova=17 @@ -24,6 +30,8 @@ oct=26 poly=18 pulsar=19 quad=23 +quasar=32 risso=20 spiroct=21 +toxopid=33 vela=25 \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/AmmoDistributeBuilderCommanderPayloadUnit/0.json b/annotations/src/main/resources/revisions/AmmoDistributeBuilderCommanderPayloadUnit/0.json deleted file mode 100644 index 826bd02faf..0000000000 --- a/annotations/src/main/resources/revisions/AmmoDistributeBuilderCommanderPayloadUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BlockUnitUnit/0.json b/annotations/src/main/resources/revisions/BlockUnitUnit/0.json deleted file mode 100644 index 5431957381..0000000000 --- a/annotations/src/main/resources/revisions/BlockUnitUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BlockUnitUnit/1.json b/annotations/src/main/resources/revisions/BlockUnitUnit/1.json deleted file mode 100644 index dd8fdb2784..0000000000 --- a/annotations/src/main/resources/revisions/BlockUnitUnit/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMechUnit/0.json b/annotations/src/main/resources/revisions/BuilderMechUnit/0.json deleted file mode 100644 index 0588266557..0000000000 --- a/annotations/src/main/resources/revisions/BuilderMechUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerTrailUnit/0.json b/annotations/src/main/resources/revisions/BuilderMinerTrailUnit/0.json deleted file mode 100644 index a4e818fd35..0000000000 --- a/annotations/src/main/resources/revisions/BuilderMinerTrailUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/Building/0.json b/annotations/src/main/resources/revisions/BuildingComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Building/0.json rename to annotations/src/main/resources/revisions/BuildingComp/0.json diff --git a/annotations/src/main/resources/revisions/Bullet/0.json b/annotations/src/main/resources/revisions/BulletComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Bullet/0.json rename to annotations/src/main/resources/revisions/BulletComp/0.json diff --git a/annotations/src/main/resources/revisions/CommanderMechUnit/0.json b/annotations/src/main/resources/revisions/CommanderMechUnit/0.json deleted file mode 100644 index 1779e118de..0000000000 --- a/annotations/src/main/resources/revisions/CommanderMechUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderMechUnit/1.json b/annotations/src/main/resources/revisions/CommanderMechUnit/1.json deleted file mode 100644 index 66897ee06f..0000000000 --- a/annotations/src/main/resources/revisions/CommanderMechUnit/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/Decal/0.json b/annotations/src/main/resources/revisions/DecalComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Decal/0.json rename to annotations/src/main/resources/revisions/DecalComp/0.json diff --git a/annotations/src/main/resources/revisions/EffectState/0.json b/annotations/src/main/resources/revisions/EffectStateComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/0.json rename to annotations/src/main/resources/revisions/EffectStateComp/0.json diff --git a/annotations/src/main/resources/revisions/EffectState/1.json b/annotations/src/main/resources/revisions/EffectStateComp/1.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/1.json rename to annotations/src/main/resources/revisions/EffectStateComp/1.json diff --git a/annotations/src/main/resources/revisions/EffectState/2.json b/annotations/src/main/resources/revisions/EffectStateComp/2.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/2.json rename to annotations/src/main/resources/revisions/EffectStateComp/2.json diff --git a/annotations/src/main/resources/revisions/EffectState/3.json b/annotations/src/main/resources/revisions/EffectStateComp/3.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/3.json rename to annotations/src/main/resources/revisions/EffectStateComp/3.json diff --git a/annotations/src/main/resources/revisions/EffectState/4.json b/annotations/src/main/resources/revisions/EffectStateComp/4.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/4.json rename to annotations/src/main/resources/revisions/EffectStateComp/4.json diff --git a/annotations/src/main/resources/revisions/EffectState/5.json b/annotations/src/main/resources/revisions/EffectStateComp/5.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/5.json rename to annotations/src/main/resources/revisions/EffectStateComp/5.json diff --git a/annotations/src/main/resources/revisions/Fire/0.json b/annotations/src/main/resources/revisions/FireComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Fire/0.json rename to annotations/src/main/resources/revisions/FireComp/0.json diff --git a/annotations/src/main/resources/revisions/Fire/1.json b/annotations/src/main/resources/revisions/FireComp/1.json similarity index 100% rename from annotations/src/main/resources/revisions/Fire/1.json rename to annotations/src/main/resources/revisions/FireComp/1.json diff --git a/annotations/src/main/resources/revisions/ForceDraw/0.json b/annotations/src/main/resources/revisions/ForceDrawComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/ForceDraw/0.json rename to annotations/src/main/resources/revisions/ForceDrawComp/0.json diff --git a/annotations/src/main/resources/revisions/LargeLaunchPayloadComp/0.json b/annotations/src/main/resources/revisions/LargeLaunchPayloadComp/0.json new file mode 100644 index 0000000000..677d3f93da --- /dev/null +++ b/annotations/src/main/resources/revisions/LargeLaunchPayloadComp/0.json @@ -0,0 +1 @@ +{fields:[{name:lifetime,type:float},{name:payload,type:mindustry.world.blocks.payloads.Payload},{name:team,type:mindustry.game.Team},{name:time,type:float},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LaunchCore/0.json b/annotations/src/main/resources/revisions/LaunchCoreComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LaunchCore/0.json rename to annotations/src/main/resources/revisions/LaunchCoreComp/0.json diff --git a/annotations/src/main/resources/revisions/LaunchPayload/0.json b/annotations/src/main/resources/revisions/LaunchPayloadComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LaunchPayload/0.json rename to annotations/src/main/resources/revisions/LaunchPayloadComp/0.json diff --git a/annotations/src/main/resources/revisions/Player/0.json b/annotations/src/main/resources/revisions/PlayerComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Player/0.json rename to annotations/src/main/resources/revisions/PlayerComp/0.json diff --git a/annotations/src/main/resources/revisions/PosTeamDef/0.json b/annotations/src/main/resources/revisions/PosTeamDef/0.json new file mode 100644 index 0000000000..1c1e6c36ec --- /dev/null +++ b/annotations/src/main/resources/revisions/PosTeamDef/0.json @@ -0,0 +1 @@ +{fields:[{name:team,type:mindustry.game.Team},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/Puddle/0.json b/annotations/src/main/resources/revisions/PuddleComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Puddle/0.json rename to annotations/src/main/resources/revisions/PuddleComp/0.json diff --git a/annotations/src/main/resources/revisions/WeatherState/0.json b/annotations/src/main/resources/revisions/WeatherStateComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/WeatherState/0.json rename to annotations/src/main/resources/revisions/WeatherStateComp/0.json diff --git a/annotations/src/main/resources/revisions/WeatherState/1.json b/annotations/src/main/resources/revisions/WeatherStateComp/1.json similarity index 100% rename from annotations/src/main/resources/revisions/WeatherState/1.json rename to annotations/src/main/resources/revisions/WeatherStateComp/1.json diff --git a/annotations/src/main/resources/revisions/WeatherState/2.json b/annotations/src/main/resources/revisions/WeatherStateComp/2.json similarity index 100% rename from annotations/src/main/resources/revisions/WeatherState/2.json rename to annotations/src/main/resources/revisions/WeatherStateComp/2.json diff --git a/annotations/src/main/resources/revisions/alpha/0.json b/annotations/src/main/resources/revisions/alpha/0.json new file mode 100644 index 0000000000..eff5fa651d --- /dev/null +++ b/annotations/src/main/resources/revisions/alpha/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/alpha/1.json b/annotations/src/main/resources/revisions/alpha/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/alpha/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/arkyid/0.json b/annotations/src/main/resources/revisions/arkyid/0.json new file mode 100644 index 0000000000..eff5fa651d --- /dev/null +++ b/annotations/src/main/resources/revisions/arkyid/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/arkyid/1.json b/annotations/src/main/resources/revisions/arkyid/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/arkyid/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/beta/0.json b/annotations/src/main/resources/revisions/beta/0.json new file mode 100644 index 0000000000..eff5fa651d --- /dev/null +++ b/annotations/src/main/resources/revisions/beta/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/beta/1.json b/annotations/src/main/resources/revisions/beta/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/beta/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitEntity/0.json b/annotations/src/main/resources/revisions/block/0.json similarity index 100% rename from annotations/src/main/resources/revisions/UnitEntity/0.json rename to annotations/src/main/resources/revisions/block/0.json diff --git a/annotations/src/main/resources/revisions/UnitEntity/1.json b/annotations/src/main/resources/revisions/block/1.json similarity index 100% rename from annotations/src/main/resources/revisions/UnitEntity/1.json rename to annotations/src/main/resources/revisions/block/1.json diff --git a/annotations/src/main/resources/revisions/block/2.json b/annotations/src/main/resources/revisions/block/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/block/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/block/3.json b/annotations/src/main/resources/revisions/block/3.json new file mode 100644 index 0000000000..75c7a4a245 --- /dev/null +++ b/annotations/src/main/resources/revisions/block/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/block/4.json b/annotations/src/main/resources/revisions/block/4.json new file mode 100644 index 0000000000..7503c106b6 --- /dev/null +++ b/annotations/src/main/resources/revisions/block/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/block/5.json b/annotations/src/main/resources/revisions/block/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/block/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LegsUnit/0.json b/annotations/src/main/resources/revisions/corvus/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LegsUnit/0.json rename to annotations/src/main/resources/revisions/corvus/0.json diff --git a/annotations/src/main/resources/revisions/LegsUnit/1.json b/annotations/src/main/resources/revisions/corvus/1.json similarity index 100% rename from annotations/src/main/resources/revisions/LegsUnit/1.json rename to annotations/src/main/resources/revisions/corvus/1.json diff --git a/annotations/src/main/resources/revisions/corvus/2.json b/annotations/src/main/resources/revisions/corvus/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/corvus/3.json b/annotations/src/main/resources/revisions/corvus/3.json new file mode 100644 index 0000000000..75c7a4a245 --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/corvus/4.json b/annotations/src/main/resources/revisions/corvus/4.json new file mode 100644 index 0000000000..7503c106b6 --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/corvus/5.json b/annotations/src/main/resources/revisions/corvus/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderUnitWaterMove/0.json b/annotations/src/main/resources/revisions/flare/0.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderUnitWaterMove/0.json rename to annotations/src/main/resources/revisions/flare/0.json diff --git a/annotations/src/main/resources/revisions/CommanderUnitWaterMove/1.json b/annotations/src/main/resources/revisions/flare/1.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderUnitWaterMove/1.json rename to annotations/src/main/resources/revisions/flare/1.json diff --git a/annotations/src/main/resources/revisions/flare/2.json b/annotations/src/main/resources/revisions/flare/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/flare/3.json b/annotations/src/main/resources/revisions/flare/3.json new file mode 100644 index 0000000000..75c7a4a245 --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/flare/4.json b/annotations/src/main/resources/revisions/flare/4.json new file mode 100644 index 0000000000..7503c106b6 --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/flare/5.json b/annotations/src/main/resources/revisions/flare/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/gamma/0.json b/annotations/src/main/resources/revisions/gamma/0.json new file mode 100644 index 0000000000..eff5fa651d --- /dev/null +++ b/annotations/src/main/resources/revisions/gamma/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/gamma/1.json b/annotations/src/main/resources/revisions/gamma/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/gamma/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MechUnit/0.json b/annotations/src/main/resources/revisions/mace/0.json similarity index 100% rename from annotations/src/main/resources/revisions/MechUnit/0.json rename to annotations/src/main/resources/revisions/mace/0.json diff --git a/annotations/src/main/resources/revisions/MechUnit/1.json b/annotations/src/main/resources/revisions/mace/1.json similarity index 100% rename from annotations/src/main/resources/revisions/MechUnit/1.json rename to annotations/src/main/resources/revisions/mace/1.json diff --git a/annotations/src/main/resources/revisions/mace/2.json b/annotations/src/main/resources/revisions/mace/2.json new file mode 100644 index 0000000000..7b348dd022 --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mace/3.json b/annotations/src/main/resources/revisions/mace/3.json new file mode 100644 index 0000000000..811f101bd5 --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mace/4.json b/annotations/src/main/resources/revisions/mace/4.json new file mode 100644 index 0000000000..786a64a7e2 --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mace/5.json b/annotations/src/main/resources/revisions/mace/5.json new file mode 100644 index 0000000000..cbd09b982e --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/0.json b/annotations/src/main/resources/revisions/mega/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/0.json rename to annotations/src/main/resources/revisions/mega/0.json diff --git a/annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/1.json b/annotations/src/main/resources/revisions/mega/1.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/1.json rename to annotations/src/main/resources/revisions/mega/1.json diff --git a/annotations/src/main/resources/revisions/mega/2.json b/annotations/src/main/resources/revisions/mega/2.json new file mode 100644 index 0000000000..87371c85dd --- /dev/null +++ b/annotations/src/main/resources/revisions/mega/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mega/3.json b/annotations/src/main/resources/revisions/mega/3.json new file mode 100644 index 0000000000..fc79341e16 --- /dev/null +++ b/annotations/src/main/resources/revisions/mega/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MinerUnit/0.json b/annotations/src/main/resources/revisions/mono/0.json similarity index 100% rename from annotations/src/main/resources/revisions/MinerUnit/0.json rename to annotations/src/main/resources/revisions/mono/0.json diff --git a/annotations/src/main/resources/revisions/MinerUnit/1.json b/annotations/src/main/resources/revisions/mono/1.json similarity index 100% rename from annotations/src/main/resources/revisions/MinerUnit/1.json rename to annotations/src/main/resources/revisions/mono/1.json diff --git a/annotations/src/main/resources/revisions/mono/2.json b/annotations/src/main/resources/revisions/mono/2.json new file mode 100644 index 0000000000..6a6cc37b39 --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mono/3.json b/annotations/src/main/resources/revisions/mono/3.json new file mode 100644 index 0000000000..364fdca813 --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mono/4.json b/annotations/src/main/resources/revisions/mono/4.json new file mode 100644 index 0000000000..e66b1e3078 --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/0.json b/annotations/src/main/resources/revisions/nova/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/0.json rename to annotations/src/main/resources/revisions/nova/0.json diff --git a/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/1.json b/annotations/src/main/resources/revisions/nova/1.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/1.json rename to annotations/src/main/resources/revisions/nova/1.json diff --git a/annotations/src/main/resources/revisions/nova/2.json b/annotations/src/main/resources/revisions/nova/2.json new file mode 100644 index 0000000000..541f5f8c57 --- /dev/null +++ b/annotations/src/main/resources/revisions/nova/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/nova/3.json b/annotations/src/main/resources/revisions/nova/3.json new file mode 100644 index 0000000000..0436c073b4 --- /dev/null +++ b/annotations/src/main/resources/revisions/nova/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderCommanderPayloadUnit/0.json b/annotations/src/main/resources/revisions/oct/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderCommanderPayloadUnit/0.json rename to annotations/src/main/resources/revisions/oct/0.json diff --git a/annotations/src/main/resources/revisions/oct/1.json b/annotations/src/main/resources/revisions/oct/1.json new file mode 100644 index 0000000000..1e9e8f02c7 --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/oct/2.json b/annotations/src/main/resources/revisions/oct/2.json new file mode 100644 index 0000000000..87371c85dd --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/oct/3.json b/annotations/src/main/resources/revisions/oct/3.json new file mode 100644 index 0000000000..fc79341e16 --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerUnit/0.json b/annotations/src/main/resources/revisions/poly/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerUnit/0.json rename to annotations/src/main/resources/revisions/poly/0.json diff --git a/annotations/src/main/resources/revisions/BuilderMinerUnit/1.json b/annotations/src/main/resources/revisions/poly/1.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerUnit/1.json rename to annotations/src/main/resources/revisions/poly/1.json diff --git a/annotations/src/main/resources/revisions/poly/2.json b/annotations/src/main/resources/revisions/poly/2.json new file mode 100644 index 0000000000..f210a1f05c --- /dev/null +++ b/annotations/src/main/resources/revisions/poly/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/poly/3.json b/annotations/src/main/resources/revisions/poly/3.json new file mode 100644 index 0000000000..d5d7a806b3 --- /dev/null +++ b/annotations/src/main/resources/revisions/poly/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/pulsar/0.json b/annotations/src/main/resources/revisions/pulsar/0.json new file mode 100644 index 0000000000..b2a9e3161a --- /dev/null +++ b/annotations/src/main/resources/revisions/pulsar/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/pulsar/1.json b/annotations/src/main/resources/revisions/pulsar/1.json new file mode 100644 index 0000000000..149ab0822e --- /dev/null +++ b/annotations/src/main/resources/revisions/pulsar/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderPayloadUnit/0.json b/annotations/src/main/resources/revisions/quad/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderPayloadUnit/0.json rename to annotations/src/main/resources/revisions/quad/0.json diff --git a/annotations/src/main/resources/revisions/BuilderPayloadUnit/1.json b/annotations/src/main/resources/revisions/quad/1.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderPayloadUnit/1.json rename to annotations/src/main/resources/revisions/quad/1.json diff --git a/annotations/src/main/resources/revisions/quad/2.json b/annotations/src/main/resources/revisions/quad/2.json new file mode 100644 index 0000000000..c0af7d53a9 --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/3.json b/annotations/src/main/resources/revisions/quad/3.json new file mode 100644 index 0000000000..d091179927 --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/4.json b/annotations/src/main/resources/revisions/quad/4.json new file mode 100644 index 0000000000..a5a5d90d5f --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quasar/0.json b/annotations/src/main/resources/revisions/quasar/0.json new file mode 100644 index 0000000000..b2a9e3161a --- /dev/null +++ b/annotations/src/main/resources/revisions/quasar/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quasar/1.json b/annotations/src/main/resources/revisions/quasar/1.json new file mode 100644 index 0000000000..149ab0822e --- /dev/null +++ b/annotations/src/main/resources/revisions/quasar/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderLegsUnit/0.json b/annotations/src/main/resources/revisions/risso/0.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderLegsUnit/0.json rename to annotations/src/main/resources/revisions/risso/0.json diff --git a/annotations/src/main/resources/revisions/CommanderLegsUnit/1.json b/annotations/src/main/resources/revisions/risso/1.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderLegsUnit/1.json rename to annotations/src/main/resources/revisions/risso/1.json diff --git a/annotations/src/main/resources/revisions/risso/2.json b/annotations/src/main/resources/revisions/risso/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/risso/3.json b/annotations/src/main/resources/revisions/risso/3.json new file mode 100644 index 0000000000..75c7a4a245 --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/risso/4.json b/annotations/src/main/resources/revisions/risso/4.json new file mode 100644 index 0000000000..7503c106b6 --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/risso/5.json b/annotations/src/main/resources/revisions/risso/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderLegsUnit/0.json b/annotations/src/main/resources/revisions/spiroct/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderLegsUnit/0.json rename to annotations/src/main/resources/revisions/spiroct/0.json diff --git a/annotations/src/main/resources/revisions/BuilderLegsUnit/1.json b/annotations/src/main/resources/revisions/spiroct/1.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderLegsUnit/1.json rename to annotations/src/main/resources/revisions/spiroct/1.json diff --git a/annotations/src/main/resources/revisions/spiroct/2.json b/annotations/src/main/resources/revisions/spiroct/2.json new file mode 100644 index 0000000000..fe5760e693 --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/spiroct/3.json b/annotations/src/main/resources/revisions/spiroct/3.json new file mode 100644 index 0000000000..364fdca813 --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/spiroct/4.json b/annotations/src/main/resources/revisions/spiroct/4.json new file mode 100644 index 0000000000..e66b1e3078 --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/toxopid/0.json b/annotations/src/main/resources/revisions/toxopid/0.json new file mode 100644 index 0000000000..eff5fa651d --- /dev/null +++ b/annotations/src/main/resources/revisions/toxopid/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/toxopid/1.json b/annotations/src/main/resources/revisions/toxopid/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/toxopid/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/build.gradle b/build.gradle index e2a00358b6..9c75d7a3c9 100644 --- a/build.gradle +++ b/build.gradle @@ -12,31 +12,35 @@ buildscript{ mavenCentral() google() maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } - jcenter() maven{ url 'https://jitpack.io' } } dependencies{ - classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8' + classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.11' classpath "com.github.anuken:packr:-SNAPSHOT" classpath "com.github.Anuken.Arc:packer:$arcHash" classpath "com.github.Anuken.Arc:arc-core:$arcHash" } } +plugins{ + id 'org.jetbrains.kotlin.jvm' version '1.4.32' + id "org.jetbrains.kotlin.kapt" version "1.4.32" +} + allprojects{ - apply plugin: 'maven' + apply plugin: 'maven-publish' version = 'release' group = 'com.github.Anuken' ext{ - versionNumber = '6' - if(!project.hasProperty("versionModifier")) versionModifier = 'alpha' + versionNumber = '7' + if(!project.hasProperty("versionModifier")) versionModifier = 'dev' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' - steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' - rhinoVersion = '8437435dab9993769d72739608580d40c5343285' + steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94' + rhinoVersion = '099aed6c82f8094b3ba39a273b8d2ba7bdcc6443' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } @@ -83,10 +87,12 @@ allprojects{ return "v$buildVersion" } + hasSprites = { + return new File(rootDir, "core/assets/sprites/sprites.aatls").exists() + } + getModifierString = { - if(versionModifier != "release"){ - return "[${versionModifier.toUpperCase()}]" - } + if(versionModifier != "release") return "[${versionModifier.toUpperCase()}]" return "" } @@ -99,6 +105,16 @@ allprojects{ return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1) } + findSdkDir = { + //null because IntelliJ doesn't get env variables + def v = System.getenv("ANDROID_HOME") + if(v != null) return v + //rootDir is null here, amazing. brilliant. + def file = new File(rootDir, "local.properties") + def props = new Properties().with{p -> p.load(file.newReader()); return p } + return props.get("sdk.dir") + } + generateLocales = { def output = 'en\n' def bundles = new File(project(':core').projectDir, 'assets/bundles/') @@ -169,14 +185,32 @@ allprojects{ maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } maven{ url "https://oss.sonatype.org/content/repositories/releases/" } maven{ url 'https://jitpack.io' } - jcenter() + } + + task clearCache{ + doFirst{ + delete{ + delete "$rootDir/core/assets/cache" + } + } } tasks.withType(JavaCompile){ targetCompatibility = 8 - sourceCompatibility = 14 + //TODO fix dynamically, this is a hack + if(System.getProperty("user.name") == "anuke"){ + sourceCompatibility = JavaVersion.VERSION_15 + }else{ + sourceCompatibility = JavaVersion.VERSION_14 + } options.encoding = "UTF-8" options.compilerArgs += ["-Xlint:deprecation"] + dependsOn clearCache + + options.forkOptions.jvmArgs.addAll([ + '--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', + '--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED' + ]) } } @@ -184,15 +218,14 @@ configure(project(":annotations")){ tasks.withType(JavaCompile){ targetCompatibility = 8 sourceCompatibility = 8 + options.fork = true } } //compile with java 8 compatibility for everything except the annotation project configure(subprojects - project(":annotations")){ tasks.withType(JavaCompile){ - if(JavaVersion.current() != JavaVersion.VERSION_1_8){ - options.compilerArgs.addAll(['--release', '8', '--enable-preview']) - } + options.compilerArgs.addAll(['--release', '8', '--enable-preview']) doFirst{ options.compilerArgs = options.compilerArgs.findAll{it != '--enable-preview' } @@ -215,9 +248,9 @@ project(":desktop"){ dependencies{ implementation project(":core") + implementation arcModule("extensions:discord") implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") - implementation 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' if(debugged()) implementation project(":debug") @@ -233,18 +266,22 @@ project(":ios"){ task incrementConfig{ def vfile = file('robovm.properties') + def bversion = getBuildVersion() def props = new Properties() if(vfile.exists()){ props.load(new FileInputStream(vfile)) }else{ props['app.id'] = 'io.anuke.mindustry' - props['app.version'] = '5.0' + props['app.version'] = '6.0' props['app.mainclass'] = 'mindustry.IOSLauncher' props['app.executable'] = 'IOSLauncher' props['app.name'] = 'Mindustry' } props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + "" + if(bversion != "custom build"){ + props['app.version'] = versionNumber + "." + bversion + (bversion.contains(".") ? "" : ".0") + } props.store(vfile.newWriter(), null) } @@ -261,6 +298,18 @@ project(":ios"){ project(":core"){ apply plugin: "java-library" + apply plugin: "kotlin" + apply plugin: "kotlin-kapt" + + kapt{ + javacOptions{ + option("-source", "14") + option("-target", "1.8") + option("--enable-preview") + } + } + + compileJava.options.fork = true task preGen{ outputs.upToDateWhen{ false } @@ -275,9 +324,10 @@ project(":core"){ def props = loadVersionProps() def androidVersion = props['androidBuildCode'].toInteger() - 2 def loglines = file("../changelog").text.split("\n") + def notice = "[This is a truncated changelog, see Github for full notes]" def maxLength = 460 - def androidLogList = loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")} + def androidLogList = [notice] + loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")} def result = "" androidLogList.forEach{line -> if(result.length() + line.length() + 1 < maxLength){ @@ -289,22 +339,74 @@ project(":core"){ } } + task sourcesJar(type: Jar, dependsOn: classes){ + archiveClassifier = 'sources' + from sourceSets.main.allSource + } + + task assetsJar(type: Jar, dependsOn: ":tools:pack"){ + archiveClassifier = 'assets' + from files("assets"){ + exclude "config", "cache", "music", "sounds" + } + } + + task musicJar(type: Jar){ + archiveClassifier = 'music' + from files("assets"){ + include "music/*", "sounds/*" + } + } + + artifacts{ + archives sourcesJar + archives assetsJar + } + dependencies{ compileJava.dependsOn(preGen) - api "org.lz4:lz4-java:1.4.1" + api "org.lz4:lz4-java:1.7.1" api arcModule("arc-core") + api arcModule("extensions:flabel") api arcModule("extensions:freetype") api arcModule("extensions:g3d") api arcModule("extensions:fx") api arcModule("extensions:arcnet") api "com.github.Anuken:rhino:$rhinoVersion" if(localArc() && debugged()) api arcModule("extensions:recorder") + if(localArc()) api arcModule(":extensions:packer") + annotationProcessor 'com.github.Anuken:jabel:34e4c172e65b3928cd9eabe1993654ea79c409cd' compileOnly project(":annotations") - annotationProcessor project(":annotations") - annotationProcessor 'com.github.Anuken:jabel:40eec868af' + kapt project(":annotations") + } + afterEvaluate{ + task mergedJavadoc(type: Javadoc){ + def blacklist = [project(":ios"), project(":desktop"), project(":server"), project(":annotations")] + if(findProject(":android") != null){ + blacklist += project(":android") + } + + source rootProject.subprojects.collect{ project -> + if(!blacklist.contains(project) && project.hasProperty("sourceSets")){ + return project.sourceSets.main.allJava + } + } + + classpath = files(rootProject.subprojects.collect { project -> + if(!blacklist.contains(project) && project.hasProperty("sourceSets")){ + return project.sourceSets.main.compileClasspath + } + }) + destinationDir = new File(buildDir, 'javadoc') + } + } + + //comp** classes are only used for code generation + jar{ + exclude("mindustry/entities/comp/**") } } @@ -322,16 +424,16 @@ project(":tests"){ dependencies{ testImplementation project(":core") - testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1" + testImplementation "org.junit.jupiter:junit-jupiter-params:5.7.1" + testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.1" testImplementation arcModule("backends:backend-headless") - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.7.1" } test{ useJUnitPlatform() workingDir = new File("../core/assets") - testLogging { + testLogging{ exceptionFormat = 'full' showStandardStreams = true } @@ -356,7 +458,21 @@ project(":annotations"){ dependencies{ implementation 'com.squareup:javapoet:1.12.1' implementation "com.github.Anuken.Arc:arc-core:$arcHash" - implementation files("${System.getProperty('java.home')}/../lib/tools.jar") + } +} + +configure([":core", ":desktop", ":server", ":tools"].collect{project(it)}){ + java{ + withJavadocJar() + withSourcesJar() + } + + publishing{ + publications{ + maven(MavenPublication){ + from components.java + } + } } } @@ -380,3 +496,12 @@ task deployAll{ dependsOn "server:deploy" dependsOn "android:deploy" } + +task resolveDependencies{ + doLast{ + rootProject.allprojects{ project -> + Set configurations = project.buildscript.configurations + project.configurations + configurations.findAll{c -> c.canBeResolved}.forEach{c -> c.resolve()} + } + } +} diff --git a/core/assets-raw/fontgen/config.json b/core/assets-raw/fontgen/config.json index 1c25eac26c..0a31462a8d 100644 --- a/core/assets-raw/fontgen/config.json +++ b/core/assets-raw/fontgen/config.json @@ -48,20 +48,6 @@ "code": 59397, "src": "fontawesome" }, - { - "uid": "6f880cbd94039674f0de065ffb57c250", - "css": "distribution", - "code": 59398, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M0 0L0 50 0 100 0 150 0 200 0 250 0 300 0 350 0 400 0 450 0 500 0 550 0 600 0 650 0 700 0 750 0 800 0 850 0 900 0 950 0 1000 50 1000 100 1000 100 950 100 850 100 750 100 650 100 550 100 450 100 350 100 250 100 150 100 50 100 0 50 0 0 0ZM900 0L900 50 900 150 900 250 900 350 900 450 900 550 900 650 900 750 900 850 900 950 900 1000 950 1000 1000 1000 1000 950 1000 900 1000 850 1000 800 1000 750 1000 700 1000 650 1000 600 1000 550 1000 500 1000 450 1000 400 1000 350 1000 300 1000 250 1000 200 1000 150 1000 100 1000 50 1000 0 950 0 900 0ZM500 106.3C487.5 106.3 475 108.3 462.5 112.5 437.5 120.8 416.7 133.3 400 150L350 200C333.3 216.7 325 233.3 325 250 325 266.7 337.5 279.2 362.5 287.5 387.5 295.8 416.7 300 450 300L550 300C597.6 293.9 649.1 300.5 675 250 675 233.3 666.7 216.7 650 200L600 150C583.3 133.3 562.5 120.8 537.5 112.5 525 108.3 512.5 106.3 500 106.3ZM500 406.3C487.5 406.3 475 408.3 462.5 412.5 437.5 420.8 416.7 433.3 400 450L350 500C333.3 516.7 325 533.3 325 550 325 566.7 337.5 579.2 362.5 587.5 387.5 595.8 416.7 600 450 600L550 600C583.3 600 612.5 595.8 637.5 587.5 662.5 579.2 675 566.7 675 550 675 533.3 666.7 516.7 650 500L600 450C583.3 433.3 562.5 420.8 537.5 412.5 525 408.3 512.5 406.3 500 406.3ZM500 706.3C487.5 706.3 475 708.3 462.5 712.5 437.5 720.8 416.7 733.3 400 750L350 800C333.3 816.7 325 833.3 325 850 325 866.7 337.5 879.2 362.5 887.5 387.5 895.8 416.7 900 450 900L550 900C583.3 900 612.5 895.8 637.5 887.5 662.5 879.2 675 866.7 675 850 675 833.3 666.7 816.7 650 800L600 750C583.3 733.3 562.5 720.8 537.5 712.5 525 708.3 512.5 706.3 500 706.3Z", - "width": 1000 - }, - "search": [ - "icon-distribution-transparent.png" - ] - }, { "uid": "w3nzesrlbezu6f30q7ytyq919p6gdlb6", "css": "home", @@ -86,54 +72,18 @@ "code": 59401, "src": "typicons" }, - { - "uid": "dd4b00255957a608953c409346e7d7fb", - "css": "warning", - "code": 59402, - "src": "typicons" - }, { "uid": "cdfalpadi7huwv9ah4fef2gpfpb4c6qm", "css": "resize", "code": 59403, "src": "typicons" }, - { - "uid": "j6xzwioffey3gxe90yx3ie56j5dlt902", - "css": "block_", - "code": 59404, - "src": "typicons" - }, - { - "uid": "jh3jpcb1t1bcm80gidkadilh080aq79h", - "css": "menu", - "code": 59405, - "src": "typicons" - }, - { - "uid": "dpxunrtmigvk6jm0ieo7axfsgzx4awll", - "css": "settings", - "code": 59406, - "src": "typicons" - }, { "uid": "i7r8vgyqewsy2rlx0xhawybpw5uyss3z", "css": "wrench", "code": 59407, "src": "typicons" }, - { - "uid": "971842913945f59c7f3cf11e75e1e4f1", - "css": "power_", - "code": 59408, - "src": "typicons" - }, - { - "uid": "2b8ea04aa0e500ae056f9c7934af18e6", - "css": "pine", - "code": 59409, - "src": "typicons" - }, { "uid": "0ece9a12de796b8411f868d582bee678", "css": "github-square", @@ -152,12 +102,6 @@ "code": 59411, "src": "typicons" }, - { - "uid": "k7sao112253txym1egnte7822irbyphe", - "css": "eye", - "code": 59412, - "src": "typicons" - }, { "uid": "jqzwo6i8oicjbn049sh2856d8anrqoli", "css": "edit", @@ -188,36 +132,12 @@ "code": 59421, "src": "fontawesome" }, - { - "uid": "ca1c07c0df52dbf2af6813c9e36c2611", - "css": "copy", - "code": 59424, - "src": "typicons" - }, { "uid": "785a9b232e86ae750516adc5228a5aa7", "css": "steam", "code": 59426, "src": "zocial" }, - { - "uid": "348b04ea17f646fbc6a46e20ebe4fe12", - "css": "download", - "code": 61486, - "src": "mfglabs" - }, - { - "uid": "4f3b31017c63ba04dc4f78ce7a8f02b1", - "css": "upload", - "code": 61487, - "src": "mfglabs" - }, - { - "uid": "6020aff067fc3c119cdd75daa5249220", - "css": "exchange", - "code": 61676, - "src": "fontawesome" - }, { "uid": "ccddff8e8670dcd130e3cb55fdfc2fd0", "css": "down-open", @@ -257,45 +177,27 @@ { "uid": "e44ef09cb81413287d702eefa65dd790", "css": "pause", - "code": 59434, + "code": 59398, "src": "typicons" }, { "uid": "lu2wqmd7v9zp21knhy4eifo41wjp4cnx", "css": "list", - "code": 59435, + "code": 59409, "src": "typicons" }, { "uid": "5211af474d3a9848f67f945e2ccaf143", "css": "cancel", - "code": 59436, + "code": 59413, "src": "fontawesome" }, { "uid": "fhkechw94uv9ydw6tukba3ka2hhoif4n", "css": "move", - "code": 59438, + "code": 59416, "src": "typicons" }, - { - "uid": "287ee2cac4ded1712253c7b03ff4a5db", - "css": "pipette", - "code": 59439, - "src": "typicons" - }, - { - "uid": "0e26e70b4aa537cc206f41b21dcf2fcc", - "css": "lock", - "code": 59442, - "src": "elusive" - }, - { - "uid": "8f562a6dca9c14c9c8268bdb64efa89f", - "css": "lock-open", - "code": 59443, - "src": "elusive" - }, { "uid": "fa10777b2d88cc64cd6e4f26ef0e5264", "css": "terminal", @@ -326,12 +228,6 @@ "code": 59447, "src": "fontawesome" }, - { - "uid": "8a1d446e5555e76f82ddb1c8b526f579", - "css": "tree", - "code": 59448, - "src": "entypo" - }, { "uid": "813cb2527308990d4870591d9d76f8cd", "css": "right-open-out", @@ -350,12 +246,6 @@ "code": 59451, "src": "typicons" }, - { - "uid": "5c49851100aa021825b346d16d7f3abf", - "css": "temperatire", - "code": 59452, - "src": "typicons" - }, { "uid": "e3699d145bd628d2a35d4a508b616f0c", "css": "filters", @@ -368,12 +258,6 @@ "code": 59455, "src": "iconic" }, - { - "uid": "b9be509237c9abea9c258d677777b713", - "css": "pick", - "code": 59456, - "src": "iconic" - }, { "uid": "ebc57fa8400e4ede049ac5dc665210e1", "css": "eraser", @@ -404,50 +288,16 @@ "code": 59458, "src": "elusive" }, - { - "uid": "9edf364d6c567aa474b0f9ec6c26c042", - "css": "hammer", - "code": 59459, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M470.3 0C458.1 0 446 6.1 433.8 18.3L397.3 54.8 360.7 91.3 324.2 127.9 287.7 164.4 251.1 200.9 214.6 237.4 178.1 274C165.9 286.1 159.8 298.3 159.8 310.5 159.8 322.7 165.9 334.9 178.1 347L214.6 383.6 251.1 420.1 287.7 456.6 324.2 493.2C336.4 505.3 342.5 517.5 342.5 529.7 342.5 541.9 336.4 554 324.2 566.2L287.7 602.7 251.1 639.3 214.6 675.8 178.1 712.3 141.6 748.9 105 785.4 68.5 821.9 32 858.4C19.8 870.6 10.7 885.8 4.6 904.1-1.5 922.4-1.5 940.6 4.6 958.9 10.7 977.2 22.8 989.3 41.1 995.4 59.4 1001.5 77.6 1001.5 95.9 995.4 114.2 989.3 129.4 980.2 141.6 968L178.1 931.5 214.6 895 251.1 858.4 287.7 821.9 324.2 785.4 360.7 748.9 397.3 712.3 433.8 675.8C446 663.6 458.1 657.5 470.3 657.5 482.5 657.5 494.7 663.6 506.8 675.8L543.4 712.3 579.9 748.9 616.4 785.4 653 821.9C665.1 834.1 677.3 840.2 689.5 840.2 701.7 840.2 713.9 834.1 726 821.9L762.6 785.4 799.1 748.9 835.6 712.3 872.1 675.8 908.7 639.3 945.2 602.7 981.7 566.2C993.9 554 1000 541.9 1000 529.7 1000 517.5 993.9 505.3 981.7 493.2L945.2 456.6 908.7 420.1 872.1 383.6 835.6 347 799.1 310.5 762.6 274 726 237.4 689.5 200.9 653 164.4 616.4 127.9 579.9 91.3 543.4 54.8 506.8 18.3C494.7 6.1 482.5 0 470.3 0Z", - "width": 1000 - }, - "search": [ - "hammer" - ] - }, { "uid": "e594fc6e5870b4ab7e49f52571d52577", "css": "diagonal", "code": 59460, "src": "fontawesome" }, - { - "uid": "wh8nbtrxjl2f67dpybsww6mri0xcaklm", - "css": "export", - "code": 59462, - "src": "typicons" - }, - { - "uid": "9e33d50c92e84bd26d83d1f37d6f0d57", - "css": "admin", - "code": 59432, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M427.1 385.4Q437.5 354.2 468.8 343.8 500 333.3 531.3 343.8 562.5 354.2 572.9 385.4 583.3 416.7 572.9 447.9 562.5 479.2 531.3 489.6 500 500 468.8 489.6 437.5 479.2 427.1 447.9 416.7 416.7 427.1 385.4M166.7 41.7Q187.5 20.8 218.8 10.4 250 0 291.7 0 333.3 0 375 0 416.7 0 458.3 0 500 0 541.7 0 583.3 0 625 0 666.7 0 708.3 0 750 0 781.3 10.4 812.5 20.8 833.3 41.7 854.2 62.5 875 83.3 895.8 104.2 916.7 125 937.5 145.8 958.3 166.7 979.2 187.5 989.6 218.8 1000 250 1000 291.7 1000 333.3 1000 375 1000 416.7 1000 458.3 1000 500 989.6 531.3 979.2 562.5 958.3 583.3 937.5 604.2 927.1 635.4 916.7 666.7 916.7 708.3 916.7 750 906.3 781.3 895.8 812.5 875 833.3 854.2 854.2 833.3 875 812.5 895.8 791.7 916.7 770.8 937.5 750 958.3 729.2 979.2 697.9 989.6 666.7 1000 625 1000 583.3 1000 541.7 1000 500 1000 458.3 1000 416.7 1000 375 1000 333.3 1000 302.1 989.6 270.8 979.2 250 958.3 229.2 937.5 208.3 916.7 187.5 895.8 166.7 875 145.8 854.2 125 833.3 104.2 812.5 93.8 781.3 83.3 750 83.3 708.3 83.3 666.7 72.9 635.4 62.5 604.2 41.7 583.3 20.8 562.5 10.4 531.3 0 500 0 458.3 0 416.7 0 375 0 333.3 0 291.7 0 250 10.4 218.8 20.8 187.5 41.7 166.7 62.5 145.8 83.3 125 104.2 104.2 125 83.3 145.8 62.5 166.7 41.7M541.7 750Q583.3 750 614.6 739.6 645.8 729.2 645.8 708.3 645.8 687.5 614.6 677.1 583.3 666.7 541.7 666.7 500 666.7 458.3 666.7 416.7 666.7 385.4 677.1 354.2 687.5 354.2 708.3 354.2 729.2 385.4 739.6 416.7 750 458.3 750 500 750 541.7 750M541.7 583.3Q583.3 583.3 614.6 572.9 645.8 562.5 666.7 541.7 687.5 520.8 708.3 500 729.2 479.2 739.6 447.9 750 416.7 739.6 385.4 729.2 354.2 708.3 333.3 687.5 312.5 666.7 291.7 645.8 270.8 614.6 260.4 583.3 250 541.7 250 500 250 458.3 250 416.7 250 385.4 260.4 354.2 270.8 333.3 291.7 312.5 312.5 291.7 333.3 270.8 354.2 260.4 385.4 250 416.7 260.4 447.9 270.8 479.2 291.7 500 312.5 520.8 333.3 541.7 354.2 562.5 385.4 572.9 416.7 583.3 458.3 583.3 500 583.3 541.7 583.3", - "width": 1000 - }, - "search": [ - "admin" - ] - }, { "uid": "4bad23bc52aaddaac37da019e46b6f6b", - "css": "discord", - "code": 59464, + "css": "discord_", + "code": 59405, "src": "custom_icons", "selected": true, "svg": { @@ -458,152 +308,12 @@ "discord-logo-white" ] }, - { - "uid": "777bee87001d4219672e09caa12e1c78", - "css": "crafting", - "code": 59425, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M909.1 62.9Q923.1 21 965 7 1007-7 1049 7 1090.9 21 1104.9 62.9 1118.9 104.9 1118.9 160.8 1118.9 216.8 1118.9 272.7 1118.9 328.7 1118.9 384.6 1118.9 440.6 1118.9 496.5 1118.9 552.4 1118.9 608.4 1118.9 664.3 1118.9 720.3 1118.9 776.2 1118.9 832.2 1118.9 888.1 1104.9 930.1 1090.9 972 1049 986 1007 1000 951 1000 895.1 1000 839.2 1000 783.2 1000 727.3 1000 671.3 1000 615.4 1000 559.4 1000 503.5 1000 447.6 1000 391.6 1000 335.7 1000 279.7 1000 223.8 1000 167.8 1000 111.9 1000 69.9 986 28 972 14 930.1 0 888.1 0 832.2 0 776.2 0 720.3 0 664.3 0 608.4 0 552.4 0 496.5 0 440.6 0 384.6 0 328.7 0 272.7 0 216.8 14 174.8 28 132.9 55.9 132.9 83.9 132.9 111.9 160.8 139.9 188.8 167.8 216.8 195.8 244.8 223.8 272.7 251.7 300.7 279.7 328.7 307.7 356.6 335.7 384.6 363.6 412.6 391.6 412.6 419.6 412.6 433.6 370.6 447.6 328.7 447.6 272.7 447.6 216.8 461.5 174.8 475.5 132.9 503.5 132.9 531.5 132.9 559.4 160.8 587.4 188.8 615.4 216.8 643.4 244.8 671.3 272.7 699.3 300.7 727.3 328.7 755.2 356.6 783.2 384.6 811.2 412.6 839.2 412.6 867.1 412.6 881.1 370.6 895.1 328.7 895.1 272.7 895.1 216.8 895.1 160.8 895.1 104.9 909.1 62.9M839.2 888.1Q895.1 888.1 937.1 874.1 979 860.1 993 818.2 1007 776.2 1007 720.3 1007 664.3 993 622.4 979 580.4 937.1 566.4 895.1 552.4 853.1 538.5 811.2 524.5 783.2 496.5 755.2 468.5 727.3 440.6 699.3 412.6 671.3 384.6 643.4 356.6 615.4 356.6 587.4 356.6 573.4 398.6 559.4 440.6 545.5 482.5 531.5 524.5 489.5 538.5 447.6 552.4 405.6 538.5 363.6 524.5 335.7 496.5 307.7 468.5 279.7 440.6 251.7 412.6 223.8 384.6 195.8 356.6 167.8 356.6 139.9 356.6 125.9 398.6 111.9 440.6 111.9 496.5 111.9 552.4 111.9 608.4 111.9 664.3 111.9 720.3 111.9 776.2 125.9 818.2 139.9 860.1 181.8 874.1 223.8 888.1 279.7 888.1 335.7 888.1 391.6 888.1 447.6 888.1 503.5 888.1 559.4 888.1 615.4 888.1 671.3 888.1 727.3 888.1 783.2 888.1 839.2 888.1M251.7 720.3Q251.7 692.3 279.7 692.3 307.7 692.3 307.7 720.3 307.7 748.3 279.7 748.3 251.7 748.3 251.7 720.3M475.5 720.3Q475.5 692.3 503.5 692.3 531.5 692.3 531.5 720.3 531.5 748.3 503.5 748.3 475.5 748.3 475.5 720.3M699.3 720.3Q699.3 692.3 727.3 692.3 755.2 692.3 755.2 720.3 755.2 748.3 727.3 748.3 699.3 748.3 699.3 720.3", - "width": 1119 - }, - "search": [ - "crafting" - ] - }, - { - "uid": "39651356f0f411effa9ab4a83abd2d0d", - "css": "defense", - "code": 59465, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M101.3 0C88.6 0 75.9 2.1 63.3 6.3 38 14.8 21.1 31.6 12.7 57 4.2 82.3 0 111.8 0 145.6V246.8 348.1 449.4C0 483.1 4.2 512.7 12.7 538 21.1 563.3 33.8 584.4 50.6 601.3L101.3 651.9 151.9 702.5 202.5 753.2 253.2 803.8 303.8 854.4 354.4 905.1 405.1 955.7C421.9 972.6 443 985.2 468.4 993.7 493.7 1002.1 519 1002.1 544.3 993.7 569.6 985.2 590.7 972.6 607.6 955.7L658.2 905.1 708.9 854.4 759.5 803.8 810.1 753.2 860.8 702.5 911.4 651.9 962 601.3C978.9 584.4 991.6 563.3 1000 538 1008.4 512.7 1012.7 483.1 1012.7 449.4V348.1 246.8 145.6C1012.7 111.8 1008.4 82.3 1000 57 991.6 31.6 974.7 14.8 949.4 6.3 924.1-2.1 898.7-2.1 873.4 6.3 848.1 14.8 827 27.4 810.1 44.3L759.5 94.9 708.9 145.6C692 162.4 670.9 175.1 645.6 183.5 620.3 192 590.7 196.2 557 196.2H455.7C421.9 196.2 392.4 192 367.1 183.5 341.8 175.1 320.7 162.4 303.8 145.6L253.2 94.9 202.5 44.3C185.7 27.4 164.6 14.8 139.2 6.3 126.6 2.1 113.9 0 101.3 0ZM151.9 120.3C168.8 120.3 185.7 128.7 202.5 145.6L253.2 196.2 303.8 246.8C320.7 263.7 341.8 276.4 367.1 284.8 392.4 293.2 421.9 297.5 455.7 297.5H557C590.7 297.5 620.3 293.2 645.6 284.8 670.9 276.4 692 263.7 708.9 246.8L759.5 196.2 810.1 145.6C827 128.7 843.9 120.3 860.8 120.3 877.6 120.3 890.3 132.9 898.7 158.2 907.2 183.5 911.4 213.1 911.4 246.8V348.1 449.4C911.4 483.1 907.2 512.7 898.7 538 890.3 563.3 877.6 584.4 860.8 601.3L810.1 651.9 759.5 702.5 708.9 753.2 658.2 803.8 607.6 854.4C590.7 871.3 569.6 884 544.3 892.4 519 900.8 493.7 900.8 468.4 892.4 443 884 421.9 871.3 405.1 854.4L354.4 803.8 303.8 753.2 253.2 702.5 202.5 651.9 151.9 601.3C135 584.4 122.4 563.3 113.9 538 105.5 512.7 101.3 483.1 101.3 449.4V348.1 246.8C101.3 213.1 105.5 183.5 113.9 158.2 122.4 132.9 135 120.3 151.9 120.3Z", - "width": 1013 - }, - "search": [ - "defense" - ] - }, - { - "uid": "10e2d46ee8b987f0a414451439b23036", - "css": "effect", - "code": 59466, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M250 0C216.7 0 187.5 4.2 162.5 12.5 137.5 20.8 116.7 33.3 100 50L50 100C33.3 116.7 20.8 137.5 12.5 162.5 4.2 187.5 0 216.7 0 250V350 450 550 650 750C0 783.3 4.2 812.5 12.5 837.5 20.8 862.5 33.3 883.3 50 900L100 950C116.7 966.7 137.5 979.2 162.5 987.5 187.5 995.8 216.7 1000 250 1000H350 450 550 650 750C783.3 1000 812.5 995.8 837.5 987.5 862.5 979.2 883.3 966.7 900 950L950 900C966.7 883.3 979.2 862.5 987.5 837.5 995.8 812.5 1000 783.3 1000 750V650 550 450 350 250C1000 216.7 995.8 187.5 987.5 162.5 979.2 137.5 966.7 116.7 950 100L900 50C883.3 33.3 862.5 20.8 837.5 12.5 812.5 4.2 783.3 0 750 0H650 550 450 350ZM350 100H450 550 650C683.3 100 712.5 104.2 737.5 112.5 762.5 120.8 783.3 133.3 800 150L850 200C866.7 216.7 879.2 237.5 887.5 262.5 895.8 287.5 900 316.7 900 350V450 550 650C900 683.3 895.8 712.5 887.5 737.5 879.2 762.5 866.7 783.3 850 800L800 850C783.3 866.7 762.5 879.2 737.5 887.5 712.5 895.8 683.3 900 650 900H550 450 350C316.7 900 287.5 895.8 262.5 887.5 237.5 879.2 216.7 866.7 200 850L150 800C133.3 783.3 120.8 762.5 112.5 737.5 104.2 712.5 100 683.3 100 650V550 450 350C100 316.7 104.2 287.5 112.5 262.5 120.8 237.5 133.3 216.7 150 200L200 150C216.7 133.3 237.5 120.8 262.5 112.5 287.5 104.2 316.7 100 350 100ZM500 306.3C487.5 306.3 475 308.3 462.5 312.5 437.5 320.8 416.7 333.3 400 350L350 400C333.3 416.7 320.8 437.5 312.5 462.5 304.2 487.5 304.2 512.5 312.5 537.5 320.8 562.5 333.3 583.3 350 600L400 650C416.7 666.7 437.5 679.2 462.5 687.5 487.5 695.8 512.5 695.8 537.5 687.5 562.5 679.2 583.3 666.7 600 650L650 600C666.7 583.3 679.2 562.5 687.5 537.5 695.8 512.5 695.8 487.5 687.5 462.5 679.2 437.5 666.7 416.7 650 400L600 350C583.3 333.3 562.5 320.8 537.5 312.5 525 308.3 512.5 306.3 500 306.3Z", - "width": 1000 - }, - "search": [ - "effect" - ] - }, - { - "uid": "a4d157485929f47f7a7872bac82ffbb7", - "css": "liquid", - "code": 59467, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M0 57.1Q0 28.6 42.9 14.3 85.7 0 142.9 0 200 0 257.1 0 314.3 0 371.4 0 428.6 0 485.7 0 542.9 0 600 0 657.1 0 700 14.3 742.9 28.6 742.9 57.1 742.9 85.7 714.3 114.3 685.7 142.9 671.4 185.7 657.1 228.6 671.4 271.4 685.7 314.3 728.6 328.6 771.4 342.9 814.3 328.6 857.1 314.3 885.7 285.7 914.3 257.1 942.9 257.1 971.4 257.1 985.7 300 1000 342.9 1000 400 1000 457.1 1000 514.3 1000 571.4 1000 628.6 1000 685.7 1000 742.9 1000 800 1000 857.1 1000 914.3 985.7 957.1 971.4 1000 942.9 1000 914.3 1000 885.7 971.4 857.1 942.9 814.3 928.6 771.4 914.3 714.3 914.3 657.1 914.3 600 914.3 542.9 914.3 485.7 914.3 428.6 914.3 385.7 900 342.9 885.7 314.3 857.1 285.7 828.6 257.1 800 228.6 771.4 200 742.9 171.4 714.3 142.9 685.7 114.3 657.1 100 614.3 85.7 571.4 85.7 514.3 85.7 457.1 85.7 400 85.7 342.9 85.7 285.7 85.7 228.6 71.4 185.7 57.1 142.9 28.6 114.3 0 85.7 0 57.1M714.3 800Q771.4 800 814.3 785.7 857.1 771.4 871.4 728.6 885.7 685.7 885.7 628.6 885.7 571.4 871.4 528.6 857.1 485.7 814.3 471.4 771.4 457.1 728.6 442.9 685.7 428.6 657.1 400 628.6 371.4 600 342.9 571.4 314.3 557.1 271.4 542.9 228.6 528.6 185.7 514.3 142.9 471.4 128.6 428.6 114.3 371.4 114.3 314.3 114.3 271.4 128.6 228.6 142.9 214.3 185.7 200 228.6 200 285.7 200 342.9 200 400 200 457.1 200 514.3 200 571.4 214.3 614.3 228.6 657.1 257.1 685.7 285.7 714.3 314.3 742.9 342.9 771.4 385.7 785.7 428.6 800 485.7 800 542.9 800 600 800 657.1 800 714.3 800", - "width": 1000 - }, - "search": [ - "liquid" - ] - }, - { - "uid": "757a660cd53e3349515bc329726c3dbd", - "css": "production", - "code": 59469, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M7 69.9Q21 28 62.9 14 104.9 0 160.8 0 216.8 0 272.7 0 328.7 0 384.6 0 440.6 0 496.5 0 552.4 0 608.4 0 664.3 0 720.3 0 776.2 0 818.2 14 860.1 28 874.1 69.9 888.1 111.9 874.1 153.8 860.1 195.8 832.2 223.8 804.2 251.7 776.2 279.7 748.3 307.7 720.3 335.7 692.3 363.6 678.3 405.6 664.3 447.6 664.3 503.5 664.3 559.4 664.3 615.4 664.3 671.3 664.3 727.3 664.3 783.2 650.3 825.2 636.4 867.1 608.4 895.1 580.4 923.1 552.4 951 524.5 979 482.5 993 440.6 1007 398.6 993 356.6 979 328.7 951 300.7 923.1 272.7 895.1 244.8 867.1 230.8 825.2 216.8 783.2 216.8 727.3 216.8 671.3 216.8 615.4 216.8 559.4 216.8 503.5 216.8 447.6 202.8 405.6 188.8 363.6 160.8 335.7 132.9 307.7 104.9 279.7 76.9 251.7 49 223.8 21 195.8 7 153.8-7 111.9 7 69.9M342.7 825.2Q356.6 867.1 384.6 867.1 412.6 867.1 440.6 839.2 468.5 811.2 496.5 783.2 524.5 755.2 524.5 727.3 524.5 699.3 496.5 671.3 468.5 643.4 468.5 615.4 468.5 587.4 496.5 559.4 524.5 531.5 524.5 503.5 524.5 475.5 496.5 447.6 468.5 419.6 440.6 391.6 412.6 363.6 384.6 363.6 356.6 363.6 342.7 405.6 328.7 447.6 328.7 503.5 328.7 559.4 328.7 615.4 328.7 671.3 328.7 727.3 328.7 783.2 342.7 825.2M608.4 223.8Q664.3 223.8 706.3 209.8 748.3 195.8 748.3 167.8 748.3 139.9 706.3 125.9 664.3 111.9 608.4 111.9 552.4 111.9 496.5 111.9 440.6 111.9 384.6 111.9 328.7 111.9 272.7 111.9 216.8 111.9 174.8 125.9 132.9 139.9 132.9 167.8 132.9 195.8 174.8 209.8 216.8 223.8 272.7 223.8 328.7 223.8 384.6 223.8 440.6 223.8 496.5 223.8 552.4 223.8 608.4 223.8", - "width": 881 - }, - "search": [ - "production" - ] - }, - { - "uid": "fffdfd2df00136ae95e542b0af62d8fa", - "css": "turret", - "code": 59470, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M125.9 62.9Q139.9 21 181.8 7 223.8-7 265.7 7 307.7 21 321.7 62.9 335.7 104.9 349.7 146.9 363.6 188.8 405.6 202.8 447.6 216.8 489.5 202.8 531.5 188.8 545.5 146.9 559.4 104.9 573.4 62.9 587.4 21 629.4 7 671.3-7 713.3 7 755.2 21 769.2 62.9 783.2 104.9 783.2 160.8 783.2 216.8 783.2 272.7 783.2 328.7 797.2 370.6 811.2 412.6 839.2 440.6 867.1 468.5 881.1 510.5 895.1 552.4 895.1 608.4 895.1 664.3 895.1 720.3 895.1 776.2 895.1 832.2 895.1 888.1 881.1 930.1 867.1 972 825.2 986 783.2 1000 727.3 1000 671.3 1000 629.4 986 587.4 972 559.4 944.1 531.5 916.1 489.5 902.1 447.6 888.1 405.6 902.1 363.6 916.1 335.7 944.1 307.7 972 265.7 986 223.8 1000 167.8 1000 111.9 1000 69.9 986 28 972 14 930.1 0 888.1 0 832.2 0 776.2 0 720.3 0 664.3 0 608.4 0 552.4 14 510.5 28 468.5 55.9 440.6 83.9 412.6 97.9 370.6 111.9 328.7 111.9 272.7 111.9 216.8 111.9 160.8 111.9 104.9 125.9 62.9M629.4 874.1Q671.3 888.1 713.3 874.1 755.2 860.1 769.2 818.2 783.2 776.2 783.2 720.3 783.2 664.3 783.2 608.4 783.2 552.4 769.2 510.5 755.2 468.5 727.3 440.6 699.3 412.6 671.3 384.6 643.4 356.6 601.4 342.7 559.4 328.7 503.5 328.7 447.6 328.7 391.6 328.7 335.7 328.7 293.7 342.7 251.7 356.6 223.8 384.6 195.8 412.6 167.8 440.6 139.9 468.5 125.9 510.5 111.9 552.4 111.9 608.4 111.9 664.3 111.9 720.3 111.9 776.2 125.9 818.2 139.9 860.1 181.8 874.1 223.8 888.1 265.7 874.1 307.7 860.1 335.7 832.2 363.6 804.2 405.6 790.2 447.6 776.2 489.5 790.2 531.5 804.2 559.4 832.2 587.4 860.1 629.4 874.1", - "width": 895 - }, - "search": [ - "turret" - ] - }, - { - "uid": "dbc386322a6eec797d94d5cf2af56dc3", - "css": "units", - "code": 59471, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M566.9 0C524.9 0 488.2 5.2 456.7 15.7 425.2 26.2 399 42 378 63L315 126 252 189 189 252 126 315 63 378C42 399 26.2 425.2 15.7 456.7 5.2 488.2 0 524.9 0 566.9 0 608.9 5.2 645.7 15.7 677.2 26.2 708.7 42 724.4 63 724.4 84 724.4 105 713.9 126 692.9 147 671.9 168 661.4 189 661.4 210 661.4 225.7 677.2 236.2 708.7 246.7 740.2 252 776.9 252 818.9 252 860.9 257.2 897.6 267.7 929.1 278.2 960.6 299.2 981.6 330.7 992.1 362.2 1002.6 393.7 1002.6 425.2 992.1 456.7 981.6 477.7 960.6 488.2 929.1L519.7 834.6C530.2 803.1 551.2 782.2 582.7 771.7 614.2 761.2 645.7 761.2 677.2 771.7 708.7 782.2 729.7 803.1 740.2 834.6L771.7 929.1C782.2 960.6 803.1 981.6 834.6 992.1 866.1 1002.6 897.6 1002.6 929.1 992.1 960.6 981.6 981.6 960.6 992.1 929.1 1002.6 897.6 1007.9 860.9 1007.9 818.9 1007.9 776.9 1013.1 740.2 1023.6 708.7 1034.1 677.2 1049.9 661.4 1070.9 661.4 1091.9 661.4 1112.9 671.9 1133.9 692.9 1154.9 713.9 1175.9 724.4 1196.9 724.4 1217.8 724.4 1233.6 708.7 1244.1 677.2 1254.6 645.7 1259.8 608.9 1259.8 566.9 1259.8 524.9 1254.6 488.2 1244.1 456.7 1233.6 425.2 1217.8 399 1196.9 378L1133.9 315 1070.9 252 1007.9 189 944.9 126 881.9 63C860.9 42 834.6 26.2 803.1 15.7 771.7 5.2 734.9 0 692.9 0ZM566.9 126H692.9C734.9 126 771.7 131.2 803.1 141.7 834.6 152.2 860.9 168 881.9 189L944.9 252 1007.9 315 1070.9 378C1091.9 399 1102.4 419.9 1102.4 440.9 1102.4 461.9 1086.6 477.7 1055.1 488.2L960.6 519.7C929.1 530.2 902.9 545.9 881.9 566.9 860.9 587.9 834.6 603.7 803.1 614.2 771.7 624.7 734.9 629.9 692.9 629.9H566.9C524.9 629.9 488.2 624.7 456.7 614.2 425.2 603.7 399 587.9 378 566.9 357 545.9 330.7 530.2 299.2 519.7L204.7 488.2C173.2 477.7 157.5 461.9 157.5 440.9 157.5 419.9 168 399 189 378L252 315 315 252 378 189C399 168 425.2 152.2 456.7 141.7 488.2 131.2 524.9 126 566.9 126ZM629.9 259.8C614.2 259.8 598.4 262.5 582.7 267.7 551.2 278.2 535.4 294 535.4 315 535.4 336 551.2 351.7 582.7 362.2 614.2 372.7 645.7 372.7 677.2 362.2 708.7 351.7 724.4 336 724.4 315 724.4 294 708.7 278.2 677.2 267.7 661.4 262.5 645.7 259.8 629.9 259.8Z", - "width": 1260 - }, - "search": [ - "units" - ] - }, - { - "uid": "4fe8d91bf30522a9a76bab94836b2dd7", - "css": "upgrade", - "code": 59472, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M396.2 44Q421.4 18.9 459.1 6.3 496.9-6.3 534.6 6.3 572.3 18.9 597.5 44 622.6 69.2 647.8 94.3 673 119.5 698.1 144.7 723.3 169.8 748.4 195 773.6 220.1 798.7 245.3 823.9 270.4 849.1 295.6 874.2 320.8 899.4 345.9 924.5 371.1 949.7 396.2 974.8 421.4 987.4 459.1 1000 496.9 987.4 534.6 974.8 572.3 937.1 584.9 899.4 597.5 849.1 597.5 798.7 597.5 761 610.1 723.3 622.6 710.7 660.4 698.1 698.1 698.1 748.4 698.1 798.7 698.1 849.1 698.1 899.4 685.5 937.1 673 974.8 635.2 987.4 597.5 1000 547.2 1000 496.9 1000 446.5 1000 396.2 1000 358.5 987.4 320.8 974.8 308.2 937.1 295.6 899.4 295.6 849.1 295.6 798.7 295.6 748.4 295.6 698.1 283 660.4 270.4 622.6 232.7 610.1 195 597.5 144.7 597.5 94.3 597.5 56.6 584.9 18.9 572.3 6.3 534.6-6.3 496.9 6.3 459.1 18.9 421.4 44 396.2 69.2 371.1 94.3 345.9 119.5 320.8 144.7 295.6 169.8 270.4 195 245.3 220.1 220.1 245.3 195 270.4 169.8 295.6 144.7 320.8 119.5 345.9 94.3 371.1 69.2 396.2 44M459.1 886.8Q496.9 899.4 534.6 886.8 572.3 874.2 584.9 836.5 597.5 798.7 597.5 748.4 597.5 698.1 597.5 647.8 597.5 597.5 610.1 559.7 622.6 522 660.4 509.4 698.1 496.9 735.8 484.3 773.6 471.7 773.6 446.5 773.6 421.4 748.4 396.2 723.3 371.1 698.1 345.9 673 320.8 647.8 295.6 622.6 270.4 597.5 245.3 572.3 220.1 534.6 207.5 496.9 195 459.1 207.5 421.4 220.1 396.2 245.3 371.1 270.4 345.9 295.6 320.8 320.8 295.6 345.9 270.4 371.1 245.3 396.2 220.1 421.4 220.1 446.5 220.1 471.7 257.9 484.3 295.6 496.9 333.3 509.4 371.1 522 383.6 559.7 396.2 597.5 396.2 647.8 396.2 698.1 396.2 748.4 396.2 798.7 408.8 836.5 421.4 874.2 459.1 886.8", - "width": 994 - }, - "search": [ - "upgrade" - ] - }, - { - "uid": "8cbea4558186fc7f4197ccba882dd534", - "css": "save", - "code": 59440, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M11.4 56.8Q22.7 22.7 56.8 11.4 90.9 0 136.4 0 181.8 0 227.3 0 272.7 0 318.2 0 363.6 0 409.1 0 454.5 0 500 0 545.5 0 590.9 0 636.4 0 681.8 0 727.3 0 761.4 11.4 795.5 22.7 818.2 45.5 840.9 68.2 863.6 90.9 886.4 113.6 897.7 147.7 909.1 181.8 909.1 227.3 909.1 272.7 909.1 318.2 909.1 363.6 909.1 409.1 909.1 454.5 909.1 500 909.1 545.5 909.1 590.9 909.1 636.4 909.1 681.8 909.1 727.3 909.1 772.7 909.1 818.2 909.1 863.6 909.1 909.1 897.7 943.2 886.4 977.3 852.3 988.6 818.2 1000 772.7 1000 727.3 1000 681.8 1000 636.4 1000 590.9 1000 545.5 1000 500 1000 454.5 1000 409.1 1000 363.6 1000 318.2 1000 272.7 1000 227.3 1000 181.8 1000 136.4 1000 90.9 1000 56.8 988.6 22.7 977.3 11.4 943.2 0 909.1 0 863.6 0 818.2 0 772.7 0 727.3 0 681.8 0 636.4 0 590.9 0 545.5 0 500 0 454.5 0 409.1 0 363.6 0 318.2 0 272.7 0 227.3 0 181.8 0 136.4 0 90.9 11.4 56.8M500 909.1Q545.5 909.1 579.5 897.7 613.6 886.4 625 852.3 636.4 818.2 636.4 772.7 636.4 727.3 625 693.2 613.6 659.1 579.5 647.7 545.5 636.4 500 636.4 454.5 636.4 409.1 636.4 363.6 636.4 329.5 647.7 295.5 659.1 284.1 693.2 272.7 727.3 272.7 772.7 272.7 818.2 284.1 852.3 295.5 886.4 329.5 897.7 363.6 909.1 409.1 909.1 454.5 909.1 500 909.1M738.6 852.3Q750 886.4 772.7 886.4 795.5 886.4 806.8 852.3 818.2 818.2 818.2 772.7 818.2 727.3 818.2 681.8 818.2 636.4 818.2 590.9 818.2 545.5 818.2 500 818.2 454.5 818.2 409.1 818.2 363.6 818.2 318.2 818.2 272.7 818.2 227.3 818.2 181.8 806.8 147.7 795.5 113.6 761.4 102.3 727.3 90.9 693.2 102.3 659.1 113.6 647.7 147.7 636.4 181.8 636.4 227.3 636.4 272.7 625 306.8 613.6 340.9 579.5 352.3 545.5 363.6 500 363.6 454.5 363.6 409.1 363.6 363.6 363.6 329.5 352.3 295.5 340.9 284.1 306.8 272.7 272.7 272.7 227.3 272.7 181.8 261.4 147.7 250 113.6 215.9 102.3 181.8 90.9 147.7 102.3 113.6 113.6 102.3 147.7 90.9 181.8 90.9 227.3 90.9 272.7 90.9 318.2 90.9 363.6 90.9 409.1 90.9 454.5 90.9 500 90.9 545.5 90.9 590.9 90.9 636.4 90.9 681.8 90.9 727.3 90.9 772.7 90.9 818.2 102.3 852.3 113.6 886.4 136.4 886.4 159.1 886.4 170.5 852.3 181.8 818.2 181.8 772.7 181.8 727.3 181.8 681.8 181.8 636.4 193.2 602.3 204.5 568.2 238.6 556.8 272.7 545.5 318.2 545.5 363.6 545.5 409.1 545.5 454.5 545.5 500 545.5 545.5 545.5 590.9 545.5 636.4 545.5 670.5 556.8 704.5 568.2 715.9 602.3 727.3 636.4 727.3 681.8 727.3 727.3 727.3 772.7 727.3 818.2 738.6 852.3M420.5 261.4Q454.5 272.7 488.6 261.4 522.7 250 534.1 215.9 545.5 181.8 534.1 147.7 522.7 113.6 488.6 102.3 454.5 90.9 420.5 102.3 386.4 113.6 375 147.7 363.6 181.8 375 215.9 386.4 250 420.5 261.4", - "width": 909 - }, - "search": [ - "save" - ] - }, { "uid": "dd6df3b754e8d0dbf09d9b24088f0442", "css": "box", "code": 59422, "src": "iconic" }, - { - "uid": "3b1a66b7efb81f4f8980f3edc369eeda", - "css": "link", - "code": 59444, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M208.3 0C180.6 0 156.2 3.5 135.4 10.4 114.6 17.4 97.2 27.8 83.3 41.7L41.7 83.3C27.8 97.2 17.4 114.6 10.4 135.4 3.5 156.3 0 180.6 0 208.3V291.7 375 458.3 541.7 625 708.3 791.7C0 819.4 3.5 843.8 10.4 864.6 17.4 885.4 27.8 902.8 41.7 916.7L83.3 958.3C97.2 972.2 114.6 982.6 135.4 989.6 156.2 996.5 180.6 1000 208.3 1000H291.7 375 458.3 541.7 625 708.3 791.7C819.4 1000 843.7 996.5 864.6 989.6 885.4 982.6 902.8 972.2 916.7 958.3L958.3 916.7C972.2 902.8 982.6 885.4 989.6 864.6 996.5 843.8 1000 819.4 1000 791.7 1000 763.9 996.5 739.6 989.6 718.8 982.6 697.9 972.2 680.6 958.3 666.7L916.7 625C902.8 611.1 888.9 604.2 875 604.2 861.1 604.2 850.7 614.6 843.7 635.4 836.8 656.3 833.3 680.6 833.3 708.3 833.3 736.1 829.9 760.4 822.9 781.3 816 802.1 802.1 816 781.2 822.9 760.4 829.9 736.1 833.3 708.3 833.3H625 541.7 458.3 375 291.7C263.9 833.3 239.6 829.9 218.7 822.9 197.9 816 184 802.1 177.1 781.3 170.1 760.4 166.7 736.1 166.7 708.3V625 541.7 458.3 375 291.7C166.7 263.9 170.1 239.6 177.1 218.8 184 197.9 197.9 184 218.7 177.1 239.6 170.1 263.9 166.7 291.7 166.7 319.4 166.7 343.7 163.2 364.6 156.3 385.4 149.3 395.8 138.9 395.8 125 395.8 111.1 388.9 97.2 375 83.3L333.3 41.7C319.4 27.8 302.1 17.4 281.2 10.4 260.4 3.5 236.1 0 208.3 0ZM625 0C597.2 0 572.9 3.5 552.1 10.4 531.2 17.4 520.8 27.8 520.8 41.7 520.8 55.6 527.8 69.4 541.7 83.3L583.3 125 625 166.7C638.9 180.6 645.8 194.4 645.8 208.3 645.8 222.2 638.9 236.1 625 250L583.3 291.7 541.7 333.3 500 375 458.3 416.7 416.7 458.3 375 500C361.1 513.9 350.7 531.3 343.7 552.1 336.8 572.9 336.8 593.8 343.7 614.6 350.7 635.4 364.6 649.3 385.4 656.3 406.2 663.2 427.1 663.2 447.9 656.3 468.7 649.3 486.1 638.9 500 625L541.7 583.3 583.3 541.7 625 500 666.7 458.3 708.3 416.7 750 375C763.9 361.1 777.8 354.2 791.7 354.2 805.6 354.2 819.4 361.1 833.3 375L875 416.7 916.7 458.3C930.6 472.2 944.4 479.2 958.3 479.2 972.2 479.2 982.6 468.8 989.6 447.9 996.5 427.1 1000 402.8 1000 375V291.7 208.3 125C1000 97.2 996.5 72.9 989.6 52.1 982.6 31.3 968.7 17.4 947.9 10.4 927.1 3.5 902.8 0 875 0H791.7 708.3Z", - "width": 1000 - }, - "search": [ - "link" - ] - }, { "uid": "f08ba9f0e8f9b426a92efcaa59c1e932", "css": "reddit-alien", @@ -634,296 +344,10 @@ "code": 61825, "src": "fontawesome" }, - { - "uid": "ffe24157e3c63b2ad9526b4e779caefb", - "css": "itchio", - "code": 59468, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M303.8 44.3Q329.1 19 367.1 6.3 405.1-6.3 443 6.3 481 19 506.3 44.3 531.6 69.6 569.6 82.3 607.6 94.9 658.2 94.9 708.9 94.9 759.5 94.9 810.1 94.9 848.1 82.3 886.1 69.6 911.4 44.3 936.7 19 974.7 6.3 1012.7-6.3 1050.6 6.3 1088.6 19 1113.9 44.3 1139.2 69.6 1164.6 94.9 1189.9 120.3 1202.5 158.2 1215.2 196.2 1215.2 246.8 1215.2 297.5 1227.8 335.4 1240.5 373.4 1265.8 398.7 1291.1 424.1 1316.5 449.4 1341.8 474.7 1367.1 500 1392.4 525.3 1405.1 563.3 1417.7 601.3 1417.7 651.9 1417.7 702.5 1417.7 753.2 1417.7 803.8 1405.1 841.8 1392.4 879.7 1367.1 905.1 1341.8 930.4 1316.5 955.7 1291.1 981 1253.2 993.7 1215.2 1006.3 1177.2 993.7 1139.2 981 1113.9 955.7 1088.6 930.4 1063.3 905.1 1038 879.7 1012.7 854.4 987.3 829.1 949.4 816.5 911.4 803.8 860.8 803.8 810.1 803.8 759.5 803.8 708.9 803.8 658.2 803.8 607.6 803.8 557 803.8 506.3 803.8 468.4 816.5 430.4 829.1 405.1 854.4 379.7 879.7 354.4 905.1 329.1 930.4 303.8 955.7 278.5 981 240.5 993.7 202.5 1006.3 164.6 993.7 126.6 981 101.3 955.7 75.9 930.4 50.6 905.1 25.3 879.7 12.7 841.8 0 803.8 0 753.2 0 702.5 0 651.9 0 601.3 12.7 563.3 25.3 525.3 50.6 500 75.9 474.7 101.3 449.4 126.6 424.1 151.9 398.7 177.2 373.4 189.9 335.4 202.5 297.5 202.5 246.8 202.5 196.2 215.2 158.2 227.8 120.3 253.2 94.9 278.5 69.6 303.8 44.3M670.9 689.9Q708.9 702.5 746.8 689.9 784.8 677.2 797.5 639.2 810.1 601.3 822.8 563.3 835.4 525.3 873.4 512.7 911.4 500 949.4 487.3 987.3 474.7 987.3 449.4 987.3 424.1 962 398.7 936.7 373.4 911.4 348.1 886.1 322.8 860.8 297.5 835.4 272.2 810.1 246.8 784.8 221.5 746.8 208.9 708.9 196.2 670.9 208.9 632.9 221.5 607.6 246.8 582.3 272.2 557 297.5 531.6 322.8 506.3 348.1 481 373.4 455.7 398.7 430.4 424.1 430.4 449.4 430.4 474.7 468.4 487.3 506.3 500 544.3 512.7 582.3 525.3 594.9 563.3 607.6 601.3 620.3 639.2 632.9 677.2 670.9 689.9", - "width": 1418 - }, - "search": [ - "itchio" - ] - }, - { - "uid": "4fa999c5ba68a4ec62d4abe5e8e51076", - "css": "line", - "code": 59473, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M836.8 36.8Q857.9 15.8 889.5 5.3 921.1-5.3 952.6 5.3 984.2 15.8 994.7 47.4 1005.3 78.9 994.7 110.5 984.2 142.1 963.2 163.2 942.1 184.2 921.1 205.3 900 226.3 878.9 247.4 857.9 268.4 836.8 289.5 815.8 310.5 794.7 331.6 773.7 352.6 752.6 373.7 731.6 394.7 710.5 415.8 689.5 436.8 668.4 457.9 647.4 478.9 626.3 500 605.3 521.1 584.2 542.1 563.2 563.2 542.1 584.2 521.1 605.3 500 626.3 478.9 647.4 457.9 668.4 436.8 689.5 415.8 710.5 394.7 731.6 373.7 752.6 352.6 773.7 331.6 794.7 310.5 815.8 289.5 836.8 268.4 857.9 247.4 878.9 226.3 900 205.3 921.1 184.2 942.1 163.2 963.2 142.1 984.2 110.5 994.7 78.9 1005.3 47.4 994.7 15.8 984.2 5.3 952.6-5.3 921.1 5.3 889.5 15.8 857.9 36.8 836.8 57.9 815.8 78.9 794.7 100 773.7 121.1 752.6 142.1 731.6 163.2 710.5 184.2 689.5 205.3 668.4 226.3 647.4 247.4 626.3 268.4 605.3 289.5 584.2 310.5 563.2 331.6 542.1 352.6 521.1 373.7 500 394.7 478.9 415.8 457.9 436.8 436.8 457.9 415.8 478.9 394.7 500 373.7 521.1 352.6 542.1 331.6 563.2 310.5 584.2 289.5 605.3 268.4 626.3 247.4 647.4 226.3 668.4 205.3 689.5 184.2 710.5 163.2 731.6 142.1 752.6 121.1 773.7 100 794.7 78.9 815.8 57.9 836.8 36.8", - "width": 1000 - }, - "search": [ - "line" - ] - }, - { - "uid": "d4d06d27c6e566237097413b3695b4aa", - "css": "spray", - "code": 59474, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M18.2 0C6.1 0 0 6.1 0 18.2 0 30.3 6.1 36.4 18.2 36.4 30.3 36.4 36.4 30.3 36.4 18.2 36.4 6.1 30.3 0 18.2 0ZM454.5 54.5C430.3 54.5 409.1 57.6 390.9 63.6 372.7 69.7 363.6 78.8 363.6 90.9 363.6 103 369.7 115.2 381.8 127.3 393.9 139.4 400 151.5 400 163.6 400 175.8 393.9 187.9 381.8 200L345.5 236.4 309.1 272.7 272.7 309.1 236.4 345.5C224.2 357.6 218.2 369.7 218.2 381.8 218.2 393.9 227.3 403 245.5 409.1 263.6 415.2 284.8 418.2 309.1 418.2H381.8 454.5 527.3 600 672.7C697 418.2 718.2 415.2 736.4 409.1 754.5 403 763.6 393.9 763.6 381.8 763.6 369.7 757.6 357.6 745.5 345.5L709.1 309.1 672.7 272.7C660.6 260.6 651.5 245.5 645.5 227.3 639.4 209.1 636.4 187.9 636.4 163.6 636.4 139.4 633.3 118.2 627.3 100 621.2 81.8 609.1 69.7 590.9 63.6 572.7 57.6 551.5 54.5 527.3 54.5ZM163.6 72.7C151.5 72.7 145.5 78.8 145.5 90.9 145.5 103 151.5 115.2 163.6 127.3 175.8 139.4 181.8 151.5 181.8 163.6 181.8 175.8 175.8 187.9 163.6 200 151.5 212.1 145.5 224.2 145.5 236.4 145.5 248.5 151.5 254.5 163.6 254.5 175.8 254.5 187.9 248.5 200 236.4L236.4 200C248.5 187.9 254.5 175.8 254.5 163.6 254.5 151.5 248.5 139.4 236.4 127.3L200 90.9C187.9 78.8 175.8 72.7 163.6 72.7ZM18.2 145.5C6.1 145.5 0 151.5 0 163.6 0 175.8 6.1 181.8 18.2 181.8 30.3 181.8 36.4 175.8 36.4 163.6 36.4 151.5 30.3 145.5 18.2 145.5ZM18.2 290.9C6.1 290.9 0 297 0 309.1 0 321.2 6.1 327.3 18.2 327.3 30.3 327.3 36.4 321.2 36.4 309.1 36.4 297 30.3 290.9 18.2 290.9ZM309.1 490.9C284.8 490.9 263.6 493.9 245.5 500 227.3 506.1 215.2 518.2 209.1 536.4 203 554.5 200 575.8 200 600V672.7 745.5C200 769.7 203 790.9 209.1 809.1 215.2 827.3 227.3 839.4 245.5 845.5 263.6 851.5 284.8 854.5 309.1 854.5H381.8 454.5 527.3 600 672.7C697 854.5 718.2 851.5 736.4 845.5 754.5 839.4 766.7 827.3 772.7 809.1 778.8 790.9 781.8 769.7 781.8 745.5V672.7 600C781.8 575.8 778.8 554.5 772.7 536.4 766.7 518.2 754.5 506.1 736.4 500 718.2 493.9 697 490.9 672.7 490.9H600 527.3 454.5 381.8ZM309.1 927.3C284.8 927.3 263.6 930.3 245.5 936.4 227.3 942.4 218.2 951.5 218.2 963.6 218.2 975.8 227.3 984.8 245.5 990.9 263.6 997 284.8 1000 309.1 1000H381.8 454.5 527.3 600 672.7C697 1000 718.2 997 736.4 990.9 754.5 984.8 763.6 975.8 763.6 963.6 763.6 951.5 754.5 942.4 736.4 936.4 718.2 930.3 697 927.3 672.7 927.3H600 527.3 454.5 381.8Z", - "width": 782 - }, - "search": [ - "spray" - ] - }, - { - "uid": "eab433e0de7fbc7ce341bca83f184abb", - "css": "fill", - "code": 59457, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M426 35.9Q443.9 17.9 470.9 9 497.8 0 533.6 0 569.5 0 596.4 9 623.3 17.9 641.3 35.9 659.2 53.8 677.1 71.7 695.1 89.7 704 116.6 713 143.5 713 179.4 713 215.2 704 242.2 695.1 269.1 677.1 287 659.2 304.9 659.2 322.9 659.2 340.8 686.1 349.8 713 358.7 748.9 358.7 784.8 358.7 811.7 367.7 838.6 376.7 856.5 394.6 874.4 412.6 892.4 430.5 910.3 448.4 928.3 466.4 946.2 484.3 964.1 502.2 982.1 520.2 991 547.1 1000 574 1000 609.9 1000 645.7 1000 681.6 1000 717.5 1000 753.4 1000 789.2 1000 825.1 1000 861 991 887.9 982.1 914.8 964.1 914.8 946.2 914.8 937.2 887.9 928.3 861 928.3 825.1 928.3 789.2 919.3 762.3 910.3 735.4 892.4 717.5 874.4 699.6 865.5 672.6 856.5 645.7 847.5 618.8 838.6 591.9 820.6 591.9 802.7 591.9 784.8 609.9 766.8 627.8 748.9 645.7 730.9 663.7 713 681.6 695.1 699.6 677.1 717.5 659.2 735.4 641.3 753.4 623.3 771.3 605.4 789.2 587.4 807.2 569.5 825.1 551.6 843 533.6 861 515.7 878.9 497.8 896.9 479.8 914.8 461.9 932.7 443.9 950.7 426 968.6 408.1 986.5 381.2 995.5 354.3 1004.5 327.4 995.5 300.4 986.5 282.5 968.6 264.6 950.7 246.6 932.7 228.7 914.8 210.8 896.9 192.8 878.9 174.9 861 157 843 139 825.1 121.1 807.2 103.1 789.2 85.2 771.3 67.3 753.4 49.3 735.4 31.4 717.5 13.5 699.6 4.5 672.6-4.5 645.7 4.5 618.8 13.5 591.9 31.4 574 49.3 556.1 67.3 538.1 85.2 520.2 103.1 502.2 121.1 484.3 139 466.4 157 448.4 174.9 430.5 192.8 412.6 210.8 394.6 228.7 376.7 246.6 376.7 264.6 376.7 273.5 403.6 282.5 430.5 273.5 457.4 264.6 484.3 246.6 502.2 228.7 520.2 210.8 538.1 192.8 556.1 174.9 574 157 591.9 148 618.8 139 645.7 148 672.6 157 699.6 174.9 717.5 192.8 735.4 210.8 753.4 228.7 771.3 246.6 789.2 264.6 807.2 282.5 825.1 300.4 843 327.4 852 354.3 861 381.2 852 408.1 843 426 825.1 443.9 807.2 461.9 789.2 479.8 771.3 497.8 753.4 515.7 735.4 533.6 717.5 551.6 699.6 569.5 681.6 587.4 663.7 605.4 645.7 623.3 627.8 641.3 609.9 659.2 591.9 677.1 574 695.1 556.1 695.1 538.1 695.1 520.2 677.1 502.2 659.2 484.3 641.3 466.4 623.3 448.4 605.4 430.5 587.4 412.6 569.5 394.6 551.6 376.7 533.6 358.7 515.7 340.8 506.7 313.9 497.8 287 506.7 260.1 515.7 233.2 533.6 233.2 551.6 233.2 569.5 251.1 587.4 269.1 605.4 269.1 623.3 269.1 632.3 242.2 641.3 215.2 641.3 179.4 641.3 143.5 632.3 116.6 623.3 89.7 596.4 80.7 569.5 71.7 533.6 71.7 497.8 71.7 470.9 80.7 443.9 89.7 435 116.6 426 143.5 426 179.4 426 215.2 426 251.1 426 287 426 322.9 426 358.7 426 394.6 426 430.5 417 457.4 408.1 484.3 390.1 484.3 372.2 484.3 363.2 457.4 354.3 430.5 354.3 394.6 354.3 358.7 354.3 322.9 354.3 287 354.3 251.1 354.3 215.2 354.3 179.4 354.3 143.5 363.2 116.6 372.2 89.7 390.1 71.7 408.1 53.8 426 35.9", - "width": 1000 - }, - "search": [ - "fill" - ] - }, - { - "uid": "d9d4c18716c0d8b23485258e35d9e3a9", - "css": "paste", - "code": 59419, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M392.9 0C369 0 348.2 3 330.4 8.9 312.5 14.9 297.6 23.8 285.7 35.7 273.8 47.6 258.9 56.5 241.1 62.5 223.2 68.5 202.4 71.4 178.6 71.4 154.8 71.4 133.9 74.4 116.1 80.4 98.2 86.3 83.3 95.2 71.4 107.1L35.7 142.9C23.8 154.8 14.9 169.6 8.9 187.5 3 205.4 0 226.2 0 250V321.4 392.9 464.3 535.7 607.1 678.6 750 821.4C0 845.2 3 866.1 8.9 883.9 14.9 901.8 23.8 916.7 35.7 928.6L71.4 964.3C83.3 976.2 98.2 985.1 116.1 991.1 133.9 997 154.8 1000 178.6 1000H250 321.4 392.9 464.3 535.7 607.1 678.6C702.4 1000 723.2 997 741.1 991.1 758.9 985.1 773.8 976.2 785.7 964.3L821.4 928.6C833.3 916.7 842.3 901.8 848.2 883.9 854.2 866.1 857.1 845.2 857.1 821.4V750 678.6 607.1 535.7 464.3 392.9 321.4 250C857.1 226.2 854.2 205.4 848.2 187.5 842.3 169.6 833.3 154.8 821.4 142.9L785.7 107.1C773.8 95.2 758.9 86.3 741.1 80.4 723.2 74.4 702.4 71.4 678.6 71.4 654.8 71.4 633.9 68.5 616.1 62.5 598.2 56.5 583.3 47.6 571.4 35.7 559.5 23.8 544.6 14.9 526.8 8.9 508.9 3 488.1 0 464.3 0ZM428.6 75.9C437.5 75.9 446.4 77.4 455.4 80.4 473.2 86.3 482.1 95.2 482.1 107.1 482.1 119 473.2 128 455.4 133.9 437.5 139.9 419.6 139.9 401.8 133.9 383.9 128 375 119 375 107.1 375 95.2 383.9 86.3 401.8 80.4 410.7 77.4 419.6 75.9 428.6 75.9ZM214.3 218.8C223.2 218.8 232.1 220.2 241.1 223.2 258.9 229.2 273.8 238.1 285.7 250 297.6 261.9 312.5 270.8 330.4 276.8 348.2 282.7 369 285.7 392.9 285.7H464.3C488.1 285.7 508.9 282.7 526.8 276.8 544.6 270.8 559.5 261.9 571.4 250 583.3 238.1 598.2 229.2 616.1 223.2 633.9 217.3 651.8 217.3 669.6 223.2 687.5 229.2 699.4 241.1 705.4 258.9 711.3 276.8 714.3 297.6 714.3 321.4V392.9 464.3 535.7 607.1 678.6 750C714.3 773.8 711.3 794.6 705.4 812.5 699.4 830.4 687.5 842.3 669.6 848.2 651.8 854.2 631 857.1 607.1 857.1H535.7 464.3 392.9 321.4 250C226.2 857.1 205.4 854.2 187.5 848.2 169.6 842.3 157.7 830.4 151.8 812.5 145.8 794.6 142.9 773.8 142.9 750V678.6 607.1 535.7 464.3 392.9 321.4C142.9 297.6 145.8 276.8 151.8 258.9 157.7 241.1 169.6 229.2 187.5 223.2 196.4 220.2 205.4 218.8 214.3 218.8ZM321.4 428.6C297.6 428.6 276.8 431.5 258.9 437.5 241.1 443.5 232.1 452.4 232.1 464.3 232.1 476.2 241.1 485.1 258.9 491.1 276.8 497 297.6 500 321.4 500H392.9 464.3 535.7C559.5 500 580.4 497 598.2 491.1 616.1 485.1 625 476.2 625 464.3 625 452.4 616.1 443.5 598.2 437.5 580.4 431.5 559.5 428.6 535.7 428.6H464.3 392.9ZM321.4 571.4C297.6 571.4 276.8 574.4 258.9 580.4 241.1 586.3 232.1 595.2 232.1 607.1 232.1 619 241.1 628 258.9 633.9 276.8 639.9 297.6 642.9 321.4 642.9H392.9 464.3 535.7C559.5 642.9 580.4 639.9 598.2 633.9 616.1 628 625 619 625 607.1 625 595.2 616.1 586.3 598.2 580.4 580.4 574.4 559.5 571.4 535.7 571.4H464.3 392.9ZM321.4 714.3C297.6 714.3 276.8 717.3 258.9 723.2 241.1 729.2 232.1 738.1 232.1 750 232.1 761.9 241.1 770.8 258.9 776.8 276.8 782.7 297.6 785.7 321.4 785.7H392.9 464.3 535.7C559.5 785.7 580.4 782.7 598.2 776.8 616.1 770.8 625 761.9 625 750 625 738.1 616.1 729.2 598.2 723.2 580.4 717.3 559.5 714.3 535.7 714.3H464.3 392.9Z", - "width": 857 - }, - "search": [ - "paste" - ] - }, - { - "uid": "a69daaa147a4c2bee4b985727c89e1ff", - "css": "book", - "code": 59423, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M227.3 0C197 0 170.5 3.8 147.7 11.4 125 18.9 106.1 30.3 90.9 45.5L45.5 90.9C30.3 106.1 18.9 125 11.4 147.7 3.8 170.5 0 197 0 227.3V318.2 409.1 500 590.9 681.8 772.7 863.6C0 893.9 3.8 920.5 11.4 943.2 18.9 965.9 34.1 981.1 56.8 988.6 79.5 996.2 106.1 1000 136.4 1000H227.3 318.2 409.1 500 590.9 681.8C712.1 1000 738.6 996.2 761.4 988.6 784.1 981.1 803 969.7 818.2 954.5L863.6 909.1C878.8 893.9 890.2 875 897.7 852.3 905.3 829.5 909.1 803 909.1 772.7V681.8 590.9 500 409.1 318.2 227.3 136.4C909.1 106.1 905.3 79.5 897.7 56.8 890.2 34.1 875 18.9 852.3 11.4 829.5 3.8 803 0 772.7 0H681.8 590.9 500 409.1 318.2ZM318.2 90.9H409.1 500 590.9 681.8C712.1 90.9 738.6 94.7 761.4 102.3 784.1 109.8 799.2 125 806.8 147.7 814.4 170.5 818.2 197 818.2 227.3V318.2 409.1 500 590.9 681.8C818.2 712.1 814.4 738.6 806.8 761.4 799.2 784.1 784.1 799.2 761.4 806.8 738.6 814.4 712.1 818.2 681.8 818.2H590.9 500 409.1 318.2C287.9 818.2 261.4 814.4 238.6 806.8 215.9 799.2 200.8 784.1 193.2 761.4 185.6 738.6 181.8 712.1 181.8 681.8V590.9 500 409.1 318.2 227.3C181.8 197 185.6 170.5 193.2 147.7 200.8 125 215.9 109.8 238.6 102.3 261.4 94.7 287.9 90.9 318.2 90.9ZM409.1 181.8C378.8 181.8 352.3 185.6 329.5 193.2 306.8 200.8 291.7 215.9 284.1 238.6 276.5 261.4 276.5 284.1 284.1 306.8 291.7 329.5 306.8 344.7 329.5 352.3 352.3 359.8 378.8 363.6 409.1 363.6H500 590.9C621.2 363.6 647.7 359.8 670.5 352.3 693.2 344.7 708.3 329.5 715.9 306.8 723.5 284.1 723.5 261.4 715.9 238.6 708.3 215.9 693.2 200.8 670.5 193.2 647.7 185.6 621.2 181.8 590.9 181.8H500ZM409.1 454.5C378.8 454.5 352.3 458.3 329.5 465.9 306.8 473.5 295.5 484.8 295.5 500 295.5 515.2 306.8 526.5 329.5 534.1 352.3 541.7 378.8 545.5 409.1 545.5H500 590.9C621.2 545.5 647.7 541.7 670.5 534.1 693.2 526.5 704.5 515.2 704.5 500 704.5 484.8 693.2 473.5 670.5 465.9 647.7 458.3 621.2 454.5 590.9 454.5H500ZM409.1 636.4C378.8 636.4 352.3 640.2 329.5 647.7 306.8 655.3 295.5 666.7 295.5 681.8 295.5 697 306.8 708.3 329.5 715.9 352.3 723.5 378.8 727.3 409.1 727.3H500 590.9C621.2 727.3 647.7 723.5 670.5 715.9 693.2 708.3 704.5 697 704.5 681.8 704.5 666.7 693.2 655.3 670.5 647.7 647.7 640.2 621.2 636.4 590.9 636.4H500Z", - "width": 909 - }, - "search": [ - "book" - ] - }, - { - "uid": "ceb9cde822ac23f35c3bd67a8d0c4fac", - "css": "host", - "code": 59437, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M11.4 56.8Q22.7 22.7 56.8 11.4 90.9 0 136.4 0 181.8 0 227.3 0 272.7 0 318.2 0 363.6 0 409.1 0 454.5 0 500 0 545.5 0 590.9 0 636.4 0 681.8 0 727.3 0 772.7 0 818.2 0 863.6 0 909.1 0 954.5 0 1000 0 1034.1 11.4 1068.2 22.7 1079.5 56.8 1090.9 90.9 1090.9 136.4 1090.9 181.8 1079.5 215.9 1068.2 250 1034.1 261.4 1000 272.7 954.5 272.7 909.1 272.7 863.6 272.7 818.2 272.7 772.7 272.7 727.3 272.7 681.8 272.7 636.4 272.7 590.9 272.7 545.5 272.7 500 272.7 454.5 272.7 409.1 272.7 363.6 272.7 318.2 272.7 272.7 272.7 227.3 272.7 181.8 272.7 136.4 272.7 90.9 272.7 56.8 261.4 22.7 250 11.4 215.9 0 181.8 0 136.4 0 90.9 11.4 56.8M409.1 181.8Q454.5 181.8 488.6 170.5 522.7 159.1 522.7 136.4 522.7 113.6 488.6 102.3 454.5 90.9 409.1 90.9 363.6 90.9 318.2 90.9 272.7 90.9 227.3 90.9 181.8 90.9 147.7 102.3 113.6 113.6 113.6 136.4 113.6 159.1 147.7 170.5 181.8 181.8 227.3 181.8 272.7 181.8 318.2 181.8 363.6 181.8 409.1 181.8M840.9 136.4Q840.9 159.1 863.6 159.1 886.4 159.1 886.4 136.4 886.4 113.6 863.6 113.6 840.9 113.6 840.9 136.4M11.4 420.5Q22.7 386.4 56.8 375 90.9 363.6 136.4 363.6 181.8 363.6 227.3 363.6 272.7 363.6 318.2 363.6 363.6 363.6 409.1 363.6 454.5 363.6 500 363.6 545.5 363.6 590.9 363.6 636.4 363.6 681.8 363.6 727.3 363.6 772.7 363.6 818.2 363.6 863.6 363.6 909.1 363.6 954.5 363.6 1000 363.6 1034.1 375 1068.2 386.4 1079.5 420.5 1090.9 454.5 1090.9 500 1090.9 545.5 1079.5 579.5 1068.2 613.6 1034.1 625 1000 636.4 954.5 636.4 909.1 636.4 863.6 636.4 818.2 636.4 772.7 636.4 727.3 636.4 681.8 636.4 636.4 636.4 590.9 636.4 545.5 636.4 500 636.4 454.5 636.4 409.1 636.4 363.6 636.4 318.2 636.4 272.7 636.4 227.3 636.4 181.8 636.4 136.4 636.4 90.9 636.4 56.8 625 22.7 613.6 11.4 579.5 0 545.5 0 500 0 454.5 11.4 420.5M409.1 545.5Q454.5 545.5 488.6 534.1 522.7 522.7 522.7 500 522.7 477.3 488.6 465.9 454.5 454.5 409.1 454.5 363.6 454.5 318.2 454.5 272.7 454.5 227.3 454.5 181.8 454.5 147.7 465.9 113.6 477.3 113.6 500 113.6 522.7 147.7 534.1 181.8 545.5 227.3 545.5 272.7 545.5 318.2 545.5 363.6 545.5 409.1 545.5M840.9 500Q840.9 522.7 863.6 522.7 886.4 522.7 886.4 500 886.4 477.3 863.6 477.3 840.9 477.3 840.9 500M11.4 784.1Q22.7 750 56.8 738.6 90.9 727.3 136.4 727.3 181.8 727.3 227.3 727.3 272.7 727.3 318.2 727.3 363.6 727.3 409.1 727.3 454.5 727.3 500 727.3 545.5 727.3 590.9 727.3 636.4 727.3 681.8 727.3 727.3 727.3 772.7 727.3 818.2 727.3 863.6 727.3 909.1 727.3 954.5 727.3 1000 727.3 1034.1 738.6 1068.2 750 1079.5 784.1 1090.9 818.2 1090.9 863.6 1090.9 909.1 1079.5 943.2 1068.2 977.3 1034.1 988.6 1000 1000 954.5 1000 909.1 1000 863.6 1000 818.2 1000 772.7 1000 727.3 1000 681.8 1000 636.4 1000 590.9 1000 545.5 1000 500 1000 454.5 1000 409.1 1000 363.6 1000 318.2 1000 272.7 1000 227.3 1000 181.8 1000 136.4 1000 90.9 1000 56.8 988.6 22.7 977.3 11.4 943.2 0 909.1 0 863.6 0 818.2 11.4 784.1M409.1 909.1Q454.5 909.1 488.6 897.7 522.7 886.4 522.7 863.6 522.7 840.9 488.6 829.5 454.5 818.2 409.1 818.2 363.6 818.2 318.2 818.2 272.7 818.2 227.3 818.2 181.8 818.2 147.7 829.5 113.6 840.9 113.6 863.6 113.6 886.4 147.7 897.7 181.8 909.1 227.3 909.1 272.7 909.1 318.2 909.1 363.6 909.1 409.1 909.1M840.9 863.6Q840.9 886.4 863.6 886.4 886.4 886.4 886.4 863.6 886.4 840.9 863.6 840.9 840.9 840.9 840.9 863.6", - "width": 1091 - }, - "search": [ - "host" - ] - }, - { - "uid": "496a07ca2bfa65f351c24b819fae0362", - "css": "exit", - "code": 59416, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M208.3 0C180.6 0 156.2 3.5 135.4 10.4 114.6 17.4 97.2 27.8 83.3 41.7L41.7 83.3C27.8 97.2 17.4 114.6 10.4 135.4 3.5 156.2 0 180.6 0 208.3V291.7 375 458.3 541.7 625 708.3 791.7C0 819.4 3.5 843.7 10.4 864.6 17.4 885.4 27.8 902.8 41.7 916.7L83.3 958.3C97.2 972.2 114.6 982.6 135.4 989.6 156.2 996.5 180.6 1000 208.3 1000H291.7 375 458.3 541.7 625 708.3C736.1 1000 760.4 996.5 781.3 989.6 802.1 982.6 819.4 972.2 833.3 958.3L875 916.7C888.9 902.8 895.8 888.9 895.8 875 895.8 861.1 885.4 850.7 864.6 843.7 843.8 836.8 819.4 833.3 791.7 833.3H708.3 625 541.7 458.3 375 291.7C263.9 833.3 239.6 829.9 218.7 822.9 197.9 816 184 802.1 177.1 781.2 170.1 760.4 166.7 736.1 166.7 708.3V625 541.7 458.3 375 291.7C166.7 263.9 170.1 239.6 177.1 218.7 184 197.9 197.9 184 218.7 177.1 239.6 170.1 263.9 166.7 291.7 166.7H375 458.3 541.7 625 708.3 791.7C819.4 166.7 843.8 163.2 864.6 156.2 885.4 149.3 895.8 138.9 895.8 125 895.8 111.1 888.9 97.2 875 83.3L833.3 41.7C819.4 27.8 802.1 17.4 781.3 10.4 760.4 3.5 736.1 0 708.3 0H625 541.7 458.3 375 291.7ZM791.7 270.8C777.8 270.8 767.4 281.2 760.4 302.1L739.6 364.6C732.6 385.4 718.8 399.3 697.9 406.2 677.1 413.2 652.8 416.7 625 416.7H541.7 458.3C430.6 416.7 406.2 420.1 385.4 427.1 364.6 434 350.7 447.9 343.7 468.7 336.8 489.6 336.8 510.4 343.7 531.2 350.7 552.1 364.6 566 385.4 572.9 406.2 579.9 430.6 583.3 458.3 583.3H541.7 625C652.8 583.3 677.1 586.8 697.9 593.7 718.8 600.7 732.6 614.6 739.6 635.4L760.4 697.9C767.4 718.7 777.8 729.2 791.7 729.2 805.6 729.2 819.4 722.2 833.3 708.3L875 666.7 916.7 625 958.3 583.3C972.2 569.4 982.6 552.1 989.6 531.2 996.5 510.4 996.5 489.6 989.6 468.7 982.6 447.9 972.2 430.6 958.3 416.7L916.7 375 875 333.3 833.3 291.7C819.4 277.8 805.6 270.8 791.7 270.8Z", - "width": 995 - }, - "search": [ - "exit" - ] - }, - { - "uid": "06a8fb7f89285292492baf4e4f3657be", - "css": "terrain", - "code": 59475, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M340.4 21.3Q361.7 0 383 0 404.3 0 425.5 21.3 446.8 42.6 468.1 63.8 489.4 85.1 510.6 106.4 531.9 127.7 553.2 148.9 574.5 170.2 595.7 191.5 617 212.8 638.3 212.8 659.6 212.8 680.9 191.5 702.1 170.2 723.4 170.2 744.7 170.2 766 191.5 787.2 212.8 808.5 234 829.8 255.3 851.1 276.6 872.3 297.9 893.6 319.1 914.9 340.4 936.2 361.7 957.4 383 978.7 404.3 1000 425.5 1010.6 457.4 1021.3 489.4 1021.3 531.9 1021.3 574.5 1021.3 617 1021.3 659.6 1021.3 702.1 1021.3 744.7 1021.3 787.2 1021.3 829.8 1021.3 872.3 1021.3 914.9 1010.6 946.8 1000 978.7 968.1 989.4 936.2 1000 893.6 1000 851.1 1000 808.5 1000 766 1000 723.4 1000 680.9 1000 638.3 1000 595.7 1000 553.2 1000 510.6 1000 468.1 1000 425.5 1000 383 1000 340.4 1000 297.9 1000 255.3 1000 212.8 1000 170.2 1000 127.7 1000 85.1 1000 53.2 989.4 21.3 978.7 10.6 946.8 0 914.9 0 872.3 0 829.8 0 787.2 0 744.7 0 702.1 0 659.6 0 617 0 574.5 0 531.9 0 489.4 0 446.8 0 404.3 10.6 372.3 21.3 340.4 42.6 319.1 63.8 297.9 85.1 276.6 106.4 255.3 127.7 234 148.9 212.8 170.2 191.5 191.5 170.2 212.8 148.9 234 127.7 255.3 106.4 276.6 85.1 297.9 63.8 319.1 42.6 340.4 21.3M808.5 914.9Q851.1 914.9 883 904.3 914.9 893.6 925.5 861.7 936.2 829.8 936.2 787.2 936.2 744.7 936.2 702.1 936.2 659.6 936.2 617 936.2 574.5 925.5 542.6 914.9 510.6 893.6 489.4 872.3 468.1 851.1 446.8 829.8 425.5 808.5 404.3 787.2 383 766 361.7 744.7 340.4 723.4 340.4 702.1 340.4 680.9 361.7 659.6 383 638.3 383 617 383 595.7 361.7 574.5 340.4 553.2 319.1 531.9 297.9 510.6 276.6 489.4 255.3 468.1 234 446.8 212.8 425.5 191.5 404.3 170.2 383 170.2 361.7 170.2 340.4 191.5 319.1 212.8 297.9 234 276.6 255.3 255.3 276.6 234 297.9 212.8 319.1 191.5 340.4 170.2 361.7 148.9 383 127.7 404.3 106.4 425.5 95.7 457.4 85.1 489.4 85.1 531.9 85.1 574.5 85.1 617 85.1 659.6 85.1 702.1 85.1 744.7 85.1 787.2 85.1 829.8 95.7 861.7 106.4 893.6 138.3 904.3 170.2 914.9 212.8 914.9 255.3 914.9 297.9 914.9 340.4 914.9 383 914.9 425.5 914.9 468.1 914.9 510.6 914.9 553.2 914.9 595.7 914.9 638.3 914.9 680.9 914.9 723.4 914.9 766 914.9 808.5 914.9", - "width": 1021 - }, - "search": [ - "terrain" - ] - }, - { - "uid": "c97c45befeea2eaee193c77fc6c6fd64", - "css": "trash", - "code": 59413, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M260.4 52.1Q270.8 20.8 302.1 10.4 333.3 0 375 0 416.7 0 458.3 0 500 0 531.3 10.4 562.5 20.8 572.9 52.1 583.3 83.3 593.8 114.6 604.2 145.8 635.4 156.3 666.7 166.7 708.3 166.7 750 166.7 781.3 177.1 812.5 187.5 822.9 218.8 833.3 250 833.3 291.7 833.3 333.3 833.3 375 833.3 416.7 822.9 447.9 812.5 479.2 791.7 500 770.8 520.8 760.4 552.1 750 583.3 750 625 750 666.7 750 708.3 750 750 750 791.7 750 833.3 750 875 750 916.7 739.6 947.9 729.2 979.2 697.9 989.6 666.7 1000 625 1000 583.3 1000 541.7 1000 500 1000 458.3 1000 416.7 1000 375 1000 333.3 1000 291.7 1000 250 1000 208.3 1000 166.7 1000 135.4 989.6 104.2 979.2 93.8 947.9 83.3 916.7 83.3 875 83.3 833.3 83.3 791.7 83.3 750 83.3 708.3 83.3 666.7 83.3 625 83.3 583.3 72.9 552.1 62.5 520.8 41.7 500 20.8 479.2 10.4 447.9 0 416.7 0 375 0 333.3 0 291.7 0 250 10.4 218.8 20.8 187.5 52.1 177.1 83.3 166.7 125 166.7 166.7 166.7 197.9 156.3 229.2 145.8 239.6 114.6 250 83.3 260.4 52.1M177.1 864.6Q187.5 895.8 208.3 895.8 229.2 895.8 239.6 864.6 250 833.3 250 791.7 250 750 250 708.3 250 666.7 250 625 250 583.3 239.6 552.1 229.2 520.8 208.3 520.8 187.5 520.8 177.1 552.1 166.7 583.3 166.7 625 166.7 666.7 166.7 708.3 166.7 750 166.7 791.7 166.7 833.3 177.1 864.6M385.4 906.3Q416.7 916.7 447.9 906.3 479.2 895.8 489.6 864.6 500 833.3 500 791.7 500 750 500 708.3 500 666.7 500 625 500 583.3 489.6 552.1 479.2 520.8 447.9 510.4 416.7 500 385.4 510.4 354.2 520.8 343.8 552.1 333.3 583.3 333.3 625 333.3 666.7 333.3 708.3 333.3 750 333.3 791.7 333.3 833.3 343.8 864.6 354.2 895.8 385.4 906.3M593.8 864.6Q604.2 895.8 625 895.8 645.8 895.8 656.3 864.6 666.7 833.3 666.7 791.7 666.7 750 666.7 708.3 666.7 666.7 666.7 625 666.7 583.3 656.3 552.1 645.8 520.8 625 520.8 604.2 520.8 593.8 552.1 583.3 583.3 583.3 625 583.3 666.7 583.3 708.3 583.3 750 583.3 791.7 583.3 833.3 593.8 864.6M625 416.7Q666.7 416.7 697.9 406.3 729.2 395.8 739.6 364.6 750 333.3 739.6 302.1 729.2 270.8 697.9 260.4 666.7 250 625 250 583.3 250 541.7 250 500 250 458.3 250 416.7 250 375 250 333.3 250 291.7 250 250 250 208.3 250 166.7 250 135.4 260.4 104.2 270.8 93.8 302.1 83.3 333.3 93.8 364.6 104.2 395.8 135.4 406.3 166.7 416.7 208.3 416.7 250 416.7 291.7 416.7 333.3 416.7 375 416.7 416.7 416.7 458.3 416.7 500 416.7 541.7 416.7 583.3 416.7 625 416.7M385.4 156.3Q416.7 166.7 447.9 156.3 479.2 145.8 479.2 125 479.2 104.2 447.9 93.8 416.7 83.3 385.4 93.8 354.2 104.2 354.2 125 354.2 145.8 385.4 156.3", - "width": 833 - }, - "search": [ - "trash" - ] - }, - { - "uid": "7e5b51e48fad210964d9b2ef40e120ca", - "css": "refresh", - "code": 59463, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M178.6 0C154.8 0 133.9 3 116.1 8.9 98.2 14.9 83.3 23.8 71.4 35.7L35.7 71.4C23.8 83.3 14.9 98.2 8.9 116.1 3 133.9 0 154.8 0 178.6V250 321.4 392.9 464.3C0 488.1 3 508.9 8.9 526.8 14.9 544.6 26.8 556.5 44.6 562.5 62.5 568.5 80.4 568.5 98.2 562.5 116.1 556.5 128 544.6 133.9 526.8 139.9 508.9 142.9 488.1 142.9 464.3V392.9 321.4 250C142.9 226.2 145.8 205.4 151.8 187.5 157.7 169.6 169.6 157.7 187.5 151.8 205.4 145.8 226.2 142.9 250 142.9H321.4 392.9 464.3 535.7 607.1C631 142.9 651.8 145.8 669.6 151.8 687.5 157.7 696.4 166.7 696.4 178.6 696.4 190.5 690.5 202.4 678.6 214.3 666.7 226.2 660.7 238.1 660.7 250 660.7 261.9 669.6 270.8 687.5 276.8 705.4 282.7 726.2 285.7 750 285.7H821.4C845.2 285.7 866.1 282.7 883.9 276.8 901.8 270.8 913.7 258.9 919.6 241.1 925.6 223.2 928.6 202.4 928.6 178.6V107.1C928.6 83.3 925.6 62.5 919.6 44.6 913.7 26.8 904.8 17.9 892.9 17.9 881 17.9 869 23.8 857.1 35.7 845.2 47.6 833.3 53.6 821.4 53.6 809.5 53.6 797.6 47.6 785.7 35.7 773.8 23.8 758.9 14.9 741.1 8.9 723.2 3 702.4 0 678.6 0H607.1 535.7 464.3 392.9 321.4 250ZM928.6 433C919.6 433 910.7 434.5 901.8 437.5 883.9 443.5 872 455.4 866.1 473.2 860.1 491.1 857.1 511.9 857.1 535.7V607.1 678.6 750C857.1 773.8 854.2 794.6 848.2 812.5 842.3 830.4 830.4 842.3 812.5 848.2 794.6 854.2 773.8 857.1 750 857.1H678.6 607.1 535.7 464.3 392.9C369 857.1 348.2 854.2 330.4 848.2 312.5 842.3 303.6 833.3 303.6 821.4 303.6 809.5 309.5 797.6 321.4 785.7 333.3 773.8 339.3 761.9 339.3 750 339.3 738.1 330.4 729.2 312.5 723.2 294.6 717.3 273.8 714.3 250 714.3H178.6C154.8 714.3 133.9 717.3 116.1 723.2 98.2 729.2 86.3 741.1 80.4 758.9 74.4 776.8 71.4 797.6 71.4 821.4V892.9C71.4 916.7 74.4 937.5 80.4 955.4 86.3 973.2 95.2 982.1 107.1 982.1 119 982.1 131 976.2 142.9 964.3 154.8 952.4 166.7 946.4 178.6 946.4 190.5 946.4 202.4 952.4 214.3 964.3 226.2 976.2 241.1 985.1 258.9 991.1 276.8 997 297.6 1000 321.4 1000H392.9 464.3 535.7 607.1 678.6 750 821.4C845.2 1000 866.1 997 883.9 991.1 901.8 985.1 916.7 976.2 928.6 964.3L964.3 928.6C976.2 916.7 985.1 901.8 991.1 883.9 997 866.1 1000 845.2 1000 821.4V750 678.6 607.1 535.7C1000 511.9 997 491.1 991.1 473.2 985.1 455.4 973.2 443.5 955.4 437.5 946.4 434.5 937.5 433 928.6 433Z", - "width": 1000 - }, - "search": [ - "refresh" - ] - }, - { - "uid": "59925475e7cc98ccd821771cff586bb6", - "css": "pencil_", - "code": 59476, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M836.4 0C824.2 0 812.1 6.1 800 18.2L763.6 54.5 727.3 90.9 690.9 127.3C678.8 139.4 672.7 151.5 672.7 163.6 672.7 175.8 678.8 187.9 690.9 200L727.3 236.4 763.6 272.7 800 309.1C812.1 321.2 824.2 327.3 836.4 327.3 848.5 327.3 860.6 321.2 872.7 309.1L909.1 272.7 945.5 236.4 981.8 200C993.9 187.9 1000 175.8 1000 163.6 1000 151.5 993.9 139.4 981.8 127.3L945.5 90.9 909.1 54.5 872.7 18.2C860.6 6.1 848.5 0 836.4 0ZM545.5 290.9C533.3 290.9 521.2 297 509.1 309.1L472.7 345.5 436.4 381.8 400 418.2 363.6 454.5 327.3 490.9 290.9 527.3 254.5 563.6 218.2 600 181.8 636.4 145.5 672.7 109.1 709.1 72.7 745.5 36.4 781.8C24.2 793.9 15.2 809.1 9.1 827.3 3 845.5 0 866.7 0 890.9 0 915.2 3 936.4 9.1 954.5 15.2 972.7 27.3 984.8 45.5 990.9 63.6 997 84.8 1000 109.1 1000 133.3 1000 154.5 997 172.7 990.9 190.9 984.8 206.1 975.8 218.2 963.6L254.5 927.3 290.9 890.9 327.3 854.5 363.6 818.2 400 781.8 436.4 745.5 472.7 709.1 509.1 672.7 545.5 636.4 581.8 600 618.2 563.6 654.5 527.3 690.9 490.9C703 478.8 709.1 466.7 709.1 454.5 709.1 442.4 703 430.3 690.9 418.2L654.5 381.8 618.2 345.5 581.8 309.1C569.7 297 557.6 290.9 545.5 290.9ZM254.5 654.5C266.7 654.5 278.8 660.6 290.9 672.7L327.3 709.1C339.4 721.2 345.5 733.3 345.5 745.5 345.5 757.6 339.4 769.7 327.3 781.8L290.9 818.2 254.5 854.5 218.2 890.9C206.1 903 190.9 912.1 172.7 918.2 154.5 924.2 136.4 924.2 118.2 918.2 100 912.1 87.9 900 81.8 881.8 75.8 863.6 75.8 845.5 81.8 827.3 87.9 809.1 97 793.9 109.1 781.8L145.5 745.5 181.8 709.1 218.2 672.7C230.3 660.6 242.4 654.5 254.5 654.5Z", - "width": 1000 - }, - "search": [ - "pencil" - ] - }, - { - "uid": "346f9aef245e0c2ded44e31ad7c66acb", - "css": "mode-pvp", - "code": 59477, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M305.8 0C296.1 0 286.4 1.6 276.7 4.9 257.3 11.3 244.3 24.3 237.9 43.7 231.4 63.1 231.4 82.5 237.9 101.9 244.3 121.4 254 137.5 267 150.5L305.8 189.3 344.7 228.2 383.5 267C396.4 279.9 409.4 286.4 422.3 286.4 435.3 286.4 448.2 279.9 461.2 267L500 228.2C512.9 215.2 519.4 202.3 519.4 189.3 519.4 176.4 512.9 163.4 500 150.5L461.2 111.7 422.3 72.8 383.5 34C370.6 21 354.4 11.3 335 4.9 325.2 1.6 315.5 0 305.8 0ZM927.2 0C917.5 0 907.8 1.6 898.1 4.9 878.6 11.3 862.5 21 849.5 34L810.7 72.8 771.8 111.7 733 150.5 694.2 189.3 655.3 228.2 616.5 267 577.7 305.8 538.8 344.7 500 383.5 461.2 422.3 422.3 461.2 383.5 500C370.6 512.9 354.4 522.7 335 529.1 315.5 535.6 296.1 535.6 276.7 529.1 257.3 522.7 241.1 512.9 228.2 500 215.2 487.1 199 477.3 179.6 470.9 160.2 464.4 140.8 464.4 121.4 470.9 101.9 477.3 89 490.3 82.5 509.7 76.1 529.1 76.1 548.5 82.5 568 89 587.4 98.7 603.6 111.7 616.5 124.6 629.5 134.3 645.6 140.8 665 147.2 684.5 147.2 703.9 140.8 723.3 134.3 742.7 124.6 758.9 111.7 771.8L72.8 810.7 34 849.5C21 862.5 11.3 878.6 4.9 898.1-1.6 917.5-1.6 936.9 4.9 956.3 11.3 975.7 24.3 988.7 43.7 995.1 63.1 1001.6 82.5 1001.6 101.9 995.1 121.4 988.7 137.5 979 150.5 966L189.3 927.2 228.2 888.3C241.1 875.4 257.3 865.7 276.7 859.2 296.1 852.8 315.5 852.8 335 859.2 354.4 865.7 370.6 875.4 383.5 888.3 396.4 901.3 412.6 911 432 917.5 451.5 923.9 470.9 923.9 490.3 917.5 509.7 911 522.7 898.1 529.1 878.6 535.6 859.2 535.6 839.8 529.1 820.4 522.7 801 512.9 784.8 500 771.8 487.1 758.9 477.3 742.7 470.9 723.3 464.4 703.9 464.4 684.5 470.9 665 477.3 645.6 487.1 629.5 500 616.5L538.8 577.7 577.7 538.8 616.5 500 655.3 461.2 694.2 422.3 733 383.5 771.8 344.7 810.7 305.8 849.5 267 888.3 228.2 927.2 189.3 966 150.5C979 137.5 988.7 121.4 995.1 101.9 1001.6 82.5 1001.6 63.1 995.1 43.7 988.7 24.3 975.7 11.3 956.3 4.9 946.6 1.6 936.9 0 927.2 0ZM1082.5 466C1072.8 466 1063.1 467.6 1053.4 470.9 1034 477.3 1017.8 487.1 1004.9 500 991.9 512.9 975.7 522.7 956.3 529.1 936.9 535.6 917.5 535.6 898.1 529.1 878.6 522.7 862.5 512.9 849.5 500 836.6 487.1 823.6 480.6 810.7 480.6 797.7 480.6 784.8 487.1 771.8 500L733 538.8C720.1 551.8 713.6 564.7 713.6 577.7 713.6 590.6 720.1 603.6 733 616.5 746 629.5 755.7 645.6 762.1 665 768.6 684.5 768.6 703.9 762.1 723.3 755.7 742.7 746 758.9 733 771.8 720.1 784.8 710.4 801 703.9 820.4 697.4 839.8 697.4 859.2 703.9 878.6 710.4 898.1 723.3 911 742.7 917.5 762.1 923.9 781.6 923.9 801 917.5 820.4 911 836.6 901.3 849.5 888.3 862.5 875.4 878.6 865.7 898.1 859.2 917.5 852.8 936.9 852.8 956.3 859.2 975.7 865.7 991.9 875.4 1004.9 888.3L1043.7 927.2 1082.5 966C1095.5 979 1111.7 988.7 1131.1 995.1 1150.5 1001.6 1169.9 1001.6 1189.3 995.1 1208.7 988.7 1221.7 975.7 1228.2 956.3 1234.6 936.9 1234.6 917.5 1228.2 898.1 1221.7 878.6 1212 862.5 1199 849.5L1160.2 810.7 1121.4 771.8C1108.4 758.9 1098.7 742.7 1092.2 723.3 1085.8 703.9 1085.8 684.5 1092.2 665 1098.7 645.6 1108.4 629.5 1121.4 616.5 1134.3 603.6 1144 587.4 1150.5 568 1157 548.5 1157 529.1 1150.5 509.7 1144 490.3 1131.1 477.3 1111.7 470.9 1101.9 467.6 1092.2 466 1082.5 466Z", - "width": 1233 - }, - "search": [ - "mode-pvp" - ] - }, - { - "uid": "8d74cd519427de451b48df6554aaf593", - "css": "mode-attack", - "code": 59478, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M849.5 34Q868.9 14.6 898.1 4.9 927.2-4.9 956.3 4.9 985.4 14.6 995.1 43.7 1004.9 72.8 995.1 101.9 985.4 131.1 966 150.5 946.6 169.9 927.2 189.3 907.8 208.7 888.3 228.2 868.9 247.6 849.5 267 830.1 286.4 810.7 305.8 791.3 325.2 771.8 344.7 752.4 364.1 733 383.5 713.6 402.9 694.2 422.3 674.8 441.7 655.3 461.2 635.9 480.6 616.5 500 597.1 519.4 577.7 538.8 558.3 558.3 538.8 577.7 519.4 597.1 500 616.5 480.6 635.9 470.9 665 461.2 694.2 470.9 723.3 480.6 752.4 500 771.8 519.4 791.3 529.1 820.4 538.8 849.5 529.1 878.6 519.4 907.8 490.3 917.5 461.2 927.2 432 917.5 402.9 907.8 383.5 888.3 364.1 868.9 335 859.2 305.8 849.5 276.7 859.2 247.6 868.9 228.2 888.3 208.7 907.8 189.3 927.2 169.9 946.6 150.5 966 131.1 985.4 101.9 995.1 72.8 1004.9 43.7 995.1 14.6 985.4 4.9 956.3-4.9 927.2 4.9 898.1 14.6 868.9 34 849.5 53.4 830.1 72.8 810.7 92.2 791.3 111.7 771.8 131.1 752.4 140.8 723.3 150.5 694.2 140.8 665 131.1 635.9 111.7 616.5 92.2 597.1 82.5 568 72.8 538.8 82.5 509.7 92.2 480.6 121.4 470.9 150.5 461.2 179.6 470.9 208.7 480.6 228.2 500 247.6 519.4 276.7 529.1 305.8 538.8 335 529.1 364.1 519.4 383.5 500 402.9 480.6 422.3 461.2 441.7 441.7 461.2 422.3 480.6 402.9 500 383.5 519.4 364.1 538.8 344.7 558.3 325.2 577.7 305.8 597.1 286.4 616.5 267 635.9 247.6 655.3 228.2 674.8 208.7 694.2 189.3 713.6 169.9 733 150.5 752.4 131.1 771.8 111.7 791.3 92.2 810.7 72.8 830.1 53.4 849.5 34", - "width": 1000 - }, - "search": [ - "mode-attack" - ] - }, - { - "uid": "09e5948ca30589e5baa8d27e1c509588", - "css": "mode-survival", - "code": 59479, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M9.7 43.5Q19.3 14.5 48.3 4.8 77.3-4.8 106.3 4.8 135.3 14.5 154.6 33.8 173.9 53.1 193.2 72.5 212.6 91.8 231.9 111.1 251.2 130.4 280.2 140.1 309.2 149.8 347.8 149.8 386.5 149.8 425.1 149.8 463.8 149.8 502.4 149.8 541.1 149.8 579.7 149.8 618.4 149.8 647.3 140.1 676.3 130.4 695.7 111.1 715 91.8 734.3 72.5 753.6 53.1 772.9 33.8 792.3 14.5 821.3 4.8 850.2-4.8 879.2 4.8 908.2 14.5 917.9 43.5 927.5 72.5 927.5 111.1 927.5 149.8 927.5 188.4 927.5 227.1 927.5 265.7 927.5 304.3 927.5 343 927.5 381.6 927.5 420.3 927.5 458.9 927.5 497.6 927.5 536.2 927.5 574.9 927.5 613.5 917.9 642.5 908.2 671.5 888.9 690.8 869.6 710.1 850.2 729.5 830.9 748.8 811.6 768.1 792.3 787.4 772.9 806.8 753.6 826.1 734.3 845.4 715 864.7 695.7 884.1 676.3 903.4 657 922.7 637.7 942 618.4 961.4 599 980.7 570 990.3 541.1 1000 502.4 1000 463.8 1000 425.1 1000 386.5 1000 357.5 990.3 328.5 980.7 309.2 961.4 289.9 942 270.5 922.7 251.2 903.4 231.9 884.1 212.6 864.7 193.2 845.4 173.9 826.1 154.6 806.8 135.3 787.4 115.9 768.1 96.6 748.8 77.3 729.5 58 710.1 38.6 690.8 19.3 671.5 9.7 642.5 0 613.5 0 574.9 0 536.2 0 497.6 0 458.9 0 420.3 0 381.6 0 343 0 304.3 0 265.7 0 227.1 0 188.4 0 149.8 0 111.1 0 72.5 9.7 43.5", - "width": 928 - }, - "search": [ - "mode-survival" - ] - }, - { - "uid": "3a617b3ed2fe766baec5b723b1d9502f", - "css": "command-rally", - "code": 59480, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M166.7 83.3Q208.3 41.7 270.8 20.8 333.3 0 416.7 0 500 0 583.3 0 666.7 0 729.2 20.8 791.7 41.7 833.3 83.3 875 125 916.7 166.7 958.3 208.3 979.2 270.8 1000 333.3 1000 416.7 1000 500 1000 583.3 1000 666.7 979.2 729.2 958.3 791.7 916.7 833.3 875 875 833.3 916.7 791.7 958.3 729.2 979.2 666.7 1000 583.3 1000 500 1000 416.7 1000 333.3 1000 270.8 979.2 208.3 958.3 166.7 916.7 125 875 83.3 833.3 41.7 791.7 20.8 729.2 0 666.7 0 583.3 0 500 0 416.7 0 333.3 20.8 270.8 41.7 208.3 83.3 166.7 125 125 166.7 83.3M437.5 812.5Q500 833.3 562.5 812.5 625 791.7 666.7 750 708.3 708.3 750 666.7 791.7 625 812.5 562.5 833.3 500 812.5 437.5 791.7 375 750 333.3 708.3 291.7 666.7 250 625 208.3 562.5 187.5 500 166.7 437.5 187.5 375 208.3 333.3 250 291.7 291.7 250 333.3 208.3 375 187.5 437.5 166.7 500 187.5 562.5 208.3 625 250 666.7 291.7 708.3 333.3 750 375 791.7 437.5 812.5", - "width": 1000 - }, - "search": [ - "command-rally" - ] - }, - { - "uid": "90fb5a431ca95c46a446c8f4a481d5ce", - "css": "command-attack", - "code": 59481, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M670.2 74.5Q712.8 31.9 776.6 10.6 840.4-10.6 904.3 10.6 968.1 31.9 989.4 95.7 1010.6 159.6 989.4 223.4 968.1 287.2 925.5 329.8 883 372.3 840.4 414.9 797.9 457.4 755.3 500 712.8 542.6 670.2 585.1 627.7 627.7 585.1 670.2 542.6 712.8 542.6 755.3 542.6 797.9 585.1 840.4 627.7 883 627.7 925.5 627.7 968.1 585.1 968.1 542.6 968.1 500 925.5 457.4 883 414.9 883 372.3 883 329.8 925.5 287.2 968.1 223.4 989.4 159.6 1010.6 95.7 989.4 31.9 968.1 10.6 904.3-10.6 840.4 10.6 776.6 31.9 712.8 74.5 670.2 117 627.7 117 585.1 117 542.6 74.5 500 31.9 457.4 31.9 414.9 31.9 372.3 74.5 372.3 117 372.3 159.6 414.9 202.1 457.4 244.7 457.4 287.2 457.4 329.8 414.9 372.3 372.3 414.9 329.8 457.4 287.2 500 244.7 542.6 202.1 585.1 159.6 627.7 117 670.2 74.5", - "width": 1000 - }, - "search": [ - "command-attack" - ] - }, - { - "uid": "17ef812a059c83b5ea3612f860f9569a", - "css": "command-retreat", - "code": 59482, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M352.3 45.5Q397.7 0 443.2 0 488.6 0 511.4 68.2 534.1 136.4 556.8 204.5 579.5 272.7 647.7 295.5 715.9 318.2 806.8 318.2 897.7 318.2 965.9 340.9 1034.1 363.6 1056.8 431.8 1079.5 500 1056.8 568.2 1034.1 636.4 965.9 659.1 897.7 681.8 806.8 681.8 715.9 681.8 647.7 704.5 579.5 727.3 556.8 795.5 534.1 863.6 511.4 931.8 488.6 1000 443.2 1000 397.7 1000 352.3 954.5 306.8 909.1 261.4 863.6 215.9 818.2 170.5 772.7 125 727.3 79.5 681.8 34.1 636.4 11.4 568.2-11.4 500 11.4 431.8 34.1 363.6 79.5 318.2 125 272.7 170.5 227.3 215.9 181.8 261.4 136.4 306.8 90.9 352.3 45.5", - "width": 1068 - }, - "search": [ - "command-retreat" - ] - }, - { - "uid": "2073dbd997e5d8e1ffc1322d13ba5585", - "css": "chat", - "code": 59484, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M129 64.5Q161.3 32.3 209.7 16.1 258.1 0 322.6 0 387.1 0 451.6 0 516.1 0 580.6 0 645.2 0 709.7 0 774.2 0 822.6 16.1 871 32.3 903.2 64.5 935.5 96.8 967.7 129 1000 161.3 1016.1 209.7 1032.3 258.1 1032.3 322.6 1032.3 387.1 1032.3 451.6 1032.3 516.1 1016.1 564.5 1000 612.9 967.7 645.2 935.5 677.4 903.2 709.7 871 741.9 822.6 758.1 774.2 774.2 709.7 774.2 645.2 774.2 580.6 774.2 516.1 774.2 451.6 774.2 387.1 774.2 338.7 790.3 290.3 806.5 274.2 854.8 258.1 903.2 241.9 951.6 225.8 1000 193.5 1000 161.3 1000 129 967.7 96.8 935.5 64.5 903.2 32.3 871 16.1 822.6 0 774.2 0 709.7 0 645.2 0 580.6 0 516.1 0 451.6 0 387.1 0 322.6 0 258.1 16.1 209.7 32.3 161.3 64.5 129 96.8 96.8 129 64.5", - "width": 1032 - }, - "search": [ - "chat" - ] - }, - { - "uid": "9dd9e835aebe1060ba7190ad2b2ed951", - "css": "zoom", - "code": 59415, - "src": "fontawesome" - }, - { - "uid": "1bc31b80669cb5edc2ee5d1370554bc9", - "css": "players", - "code": 59483, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M370.1 55.1Q401.6 23.6 448.8 7.9 496.1-7.9 543.3 7.9 590.6 23.6 622 55.1 653.5 86.6 685 118.1 716.5 149.6 732.3 196.9 748 244.1 732.3 291.3 716.5 338.6 685 370.1 653.5 401.6 653.5 433.1 653.5 464.6 685 496.1 716.5 527.6 748 559.1 779.5 590.6 811 622 842.5 653.5 874 685 905.5 716.5 937 748 968.5 779.5 984.3 826.8 1000 874 984.3 921.3 968.5 968.5 921.3 984.3 874 1000 811 1000 748 1000 685 1000 622 1000 559.1 1000 496.1 1000 433.1 1000 370.1 1000 307.1 1000 244.1 1000 181.1 1000 118.1 1000 70.9 984.3 23.6 968.5 7.9 921.3-7.9 874 7.9 826.8 23.6 779.5 55.1 748 86.6 716.5 118.1 685 149.6 653.5 181.1 622 212.6 590.6 244.1 559.1 275.6 527.6 307.1 496.1 338.6 464.6 338.6 433.1 338.6 401.6 307.1 370.1 275.6 338.6 259.8 291.3 244.1 244.1 259.8 196.9 275.6 149.6 307.1 118.1 338.6 86.6 370.1 55.1", - "width": 992 - }, - "search": [ - "players" - ] - }, { "uid": "dd1e5d774d1ced68cb7c439d8ed102f5", "css": "logic", - "code": 59420, + "code": 59406, "src": "custom_icons", "selected": true, "svg": { @@ -933,6 +357,704 @@ "search": [ "logic" ] + }, + { + "uid": "d0ff49daa25603348abe7e3f7c70be56", + "css": "distribution", + "code": 59412, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M50 0L0 50V150 250 350 450 550 650 750 850 950L50 1000 100 950V850 750 650 550 450 350 250 150 50ZM950 0L900 50V150 250 350 450 550 650 750 850 950L950 1000 1000 950V850 750 650 550 450 350 250 150 50ZM450 100L400 150 350 200 300 250 350 300H450 550 650L700 250 650 200 600 150 550 100ZM450 400L400 450 350 500 300 550 350 600H450 550 650L700 550 650 500 600 450 550 400ZM450 700L400 750 350 800 300 850 350 900H450 550 650L700 850 650 800 600 750 550 700Z", + "width": 1000 + }, + "search": [ + "distribution" + ] + }, + { + "uid": "47efe0c5ca937e0def7264347af501ed", + "css": "hammer", + "code": 59415, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M458.3 0L416.7 41.7 375 83.3 333.3 125 291.7 166.7 250 208.3 208.3 250 166.7 291.7 208.3 333.3 250 375 291.7 416.7 333.3 458.3V541.7L291.7 583.3 250 625 208.3 666.7 166.7 708.3 125 750 83.3 791.7 41.7 833.3 0 875V958.3L41.7 1000H125L166.7 958.3 208.3 916.7 250 875 291.7 833.3 333.3 791.7 375 750 416.7 708.3 458.3 666.7H541.7L583.3 708.3 625 750 666.7 791.7 708.3 833.3 750 791.7 791.7 750 833.3 708.3 875 666.7 916.7 625 958.3 583.3 1000 541.7 958.3 500 916.7 458.3 875 416.7 833.3 375 791.7 333.3 750 291.7 708.3 250 666.7 208.3 625 166.7 583.3 125 541.7 83.3 500 41.7Z", + "width": 1000 + }, + "search": [ + "hammer" + ] + }, + { + "uid": "b41aaf351112113e5f50cb8b977d6293", + "css": "save", + "code": 59419, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M45.5 0L0 45.5V136.4 227.3 318.2 409.1 500 590.9 681.8 772.7 863.6 954.5L45.5 1000H136.4 227.3 318.2 409.1 500 590.9 681.8 772.7 863.6L909.1 954.5V863.6 772.7 681.8 590.9 500 409.1 318.2 227.3 136.4L863.6 90.9 818.2 45.5 772.7 0H681.8 590.9 500 409.1 318.2 227.3 136.4ZM136.4 90.9H227.3L272.7 136.4V227.3 318.2L318.2 363.6H409.1 500 590.9L636.4 318.2V227.3 136.4L681.8 90.9H772.7L818.2 136.4V227.3 318.2 409.1 500 590.9 681.8 772.7 863.6L772.7 909.1 727.3 863.6V772.7 681.8 590.9L681.8 545.5H590.9 500 409.1 318.2 227.3L181.8 590.9V681.8 772.7 863.6L136.4 909.1 90.9 863.6V772.7 681.8 590.9 500 409.1 318.2 227.3 136.4ZM409.1 90.9H500L545.5 136.4V227.3L500 272.7H409.1L363.6 227.3V136.4ZM318.2 636.4H409.1 500 590.9L636.4 681.8V772.7 863.6L590.9 909.1H500 409.1 318.2L272.7 863.6V772.7 681.8Z", + "width": 909 + }, + "search": [ + "save" + ] + }, + { + "uid": "e67fcdbfc21c4f395a4f78e2a56c5060", + "css": "link", + "code": 59420, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M125 0L83.3 41.7 41.7 83.3 0 125V208.3 291.7 375 458.3 541.7 625 708.3 791.7 875L41.7 916.7 83.3 958.3 125 1000H208.3 291.7 375 458.3 541.7 625 708.3 791.7 875L916.7 958.3 958.3 916.7 1000 875V791.7 708.3L958.3 666.7 916.7 625 875 583.3 833.3 625V708.3 791.7L791.7 833.3H708.3 625 541.7 458.3 375 291.7 208.3L166.7 791.7V708.3 625 541.7 458.3 375 291.7 208.3L208.3 166.7H291.7 375L416.7 125 375 83.3 333.3 41.7 291.7 0H208.3ZM541.7 0L500 41.7 541.7 83.3 583.3 125 625 166.7 666.7 208.3 625 250 583.3 291.7 541.7 333.3 500 375 458.3 416.7 416.7 458.3 375 500 333.3 541.7V625L375 666.7H458.3L500 625 541.7 583.3 583.3 541.7 625 500 666.7 458.3 708.3 416.7 750 375 791.7 333.3 833.3 375 875 416.7 916.7 458.3 958.3 500 1000 458.3V375 291.7 208.3 125 41.7L958.3 0H875 791.7 708.3 625Z", + "width": 1000 + }, + "search": [ + "link" + ] + }, + { + "uid": "3679836be9338f58f8a74e4352dc0bdd", + "css": "itchio", + "code": 59434, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M350 0L300 50 250 100 200 150V250 350L150 400 100 450 50 500 0 550V650 750 850L50 900 100 950 150 1000H250L300 950 350 900 400 850 450 800H550 650 750 850 950L1000 850 1050 900 1100 950 1150 1000H1250L1300 950 1350 900 1400 850V750 650 550L1350 500 1300 450 1250 400 1200 350V250 150L1150 100 1100 50 1050 0H950L900 50 850 100H750 650 550L500 50 450 0ZM650 200H750L800 250 850 300 900 350 950 400 1000 450 950 500H850L800 550V650L750 700H650L600 650V550L550 500H450L400 450 450 400 500 350 550 300 600 250Z", + "width": 1400 + }, + "search": [ + "itchio" + ] + }, + { + "uid": "a3f0c795c6e6506c0bf33e4d344676d5", + "css": "line", + "code": 59435, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M875 0L833.3 41.7 791.7 83.3 750 125 708.3 166.7 666.7 208.3 625 250 583.3 291.7 541.7 333.3 500 375 458.3 416.7 416.7 458.3 375 500 333.3 541.7 291.7 583.3 250 625 208.3 666.7 166.7 708.3 125 750 83.3 791.7 41.7 833.3 0 875V958.3L41.7 1000H125L166.7 958.3 208.3 916.7 250 875 291.7 833.3 333.3 791.7 375 750 416.7 708.3 458.3 666.7 500 625 541.7 583.3 583.3 541.7 625 500 666.7 458.3 708.3 416.7 750 375 791.7 333.3 833.3 291.7 875 250 916.7 208.3 958.3 166.7 1000 125V41.7L958.3 0Z", + "width": 1000 + }, + "search": [ + "line" + ] + }, + { + "uid": "f54e291de7ca06c5101bdeb7e81d6b7f", + "css": "admin", + "code": 59436, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M208.3 0L166.7 41.7 125 83.3 83.3 125 41.7 166.7 0 208.3V291.7 375 458.3 541.7L41.7 583.3 83.3 625V708.3 791.7L125 833.3 166.7 875 208.3 916.7 250 958.3 291.7 1000H375 458.3 541.7 625 708.3L750 958.3 791.7 916.7 833.3 875 875 833.3 916.7 791.7V708.3 625L958.3 583.3 1000 541.7V458.3 375 291.7 208.3L958.3 166.7 916.7 125 875 83.3 833.3 41.7 791.7 0H708.3 625 541.7 458.3 375 291.7ZM375 250H458.3 541.7 625L666.7 291.7 708.3 333.3 750 375V458.3L708.3 500 666.7 541.7 625 583.3H541.7 458.3 375L333.3 541.7 291.7 500 250 458.3V375L291.7 333.3 333.3 291.7ZM458.3 333.3L416.7 375V458.3L458.3 500H541.7L583.3 458.3V375L541.7 333.3ZM375 666.7H458.3 541.7 625L666.7 708.3 625 750H541.7 458.3 375L333.3 708.3Z", + "width": 1000 + }, + "search": [ + "admin" + ] + }, + { + "uid": "53efee2384cbefdc94210fb1b4972ed6", + "css": "spray-1", + "code": 59437, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M35.7 0L0 35.7 35.7 71.4 71.4 35.7ZM178.6 71.4L142.9 107.1 178.6 142.9 214.3 178.6 178.6 214.3 142.9 250 178.6 285.7 214.3 250 250 214.3 285.7 178.6 250 142.9 214.3 107.1ZM392.9 71.4L357.1 107.1 392.9 142.9 428.6 178.6 392.9 214.3 357.1 250 321.4 285.7 285.7 321.4 250 357.1 214.3 392.9 250 428.6H321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 392.9 750 357.1 714.3 321.4 678.6 285.7 642.9 250V178.6 107.1L607.1 71.4H535.7 464.3ZM35.7 142.9L0 178.6 35.7 214.3 71.4 178.6ZM35.7 285.7L0 321.4 35.7 357.1 71.4 321.4ZM250 500L214.3 535.7V607.1 678.6 750 821.4L250 857.1H321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 821.4V750 678.6 607.1 535.7L750 500H678.6 607.1 535.7 464.3 392.9 321.4ZM250 928.6L214.3 964.3 250 1000H321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 964.3 750 928.6H678.6 607.1 535.7 464.3 392.9 321.4Z", + "width": 786 + }, + "search": [ + "spray" + ] + }, + { + "uid": "98cdb7c2e72493434efd910db1f62b29", + "css": "crafting", + "code": 59440, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M944.4 0L888.9 55.6V166.7 277.8 388.9L833.3 444.4 777.8 388.9 722.2 333.3 666.7 277.8 611.1 222.2 555.6 166.7 500 111.1 444.4 166.7V277.8 388.9L388.9 444.4 333.3 388.9 277.8 333.3 222.2 277.8 166.7 222.2 111.1 166.7 55.6 111.1 0 166.7V277.8 388.9 500 611.1 722.2 833.3 944.4L55.6 1000H166.7 277.8 388.9 500 611.1 722.2 833.3 944.4 1055.6L1111.1 944.4V833.3 722.2 611.1 500 388.9 277.8 166.7 55.6L1055.6 0ZM166.7 333.3L222.2 388.9 277.8 444.4 333.3 500 388.9 555.6H500L555.6 500V388.9L611.1 333.3 666.7 388.9 722.2 444.4 777.8 500 833.3 555.6H944.4L1000 611.1V722.2 833.3L944.4 888.9H833.3 722.2 611.1 500 388.9 277.8 166.7L111.1 833.3V722.2 611.1 500 388.9ZM277.8 666.7L222.2 722.2 277.8 777.8 333.3 722.2ZM500 666.7L444.4 722.2 500 777.8 555.6 722.2ZM722.2 666.7L666.7 722.2 722.2 777.8 777.8 722.2Z", + "width": 1111 + }, + "search": [ + "crafting" + ] + }, + { + "uid": "dc6530e8b375575b7df2040d108e5368", + "css": "fill", + "code": 59468, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M464.3 0L428.6 35.7 392.9 71.4 357.1 107.1V178.6 250 321.4 392.9 464.3L392.9 500 428.6 464.3V392.9 321.4 250 178.6 107.1L464.3 71.4H535.7 607.1L642.9 107.1V178.6 250L607.1 285.7 571.4 250 535.7 214.3 500 250V321.4L535.7 357.1 571.4 392.9 607.1 428.6 642.9 464.3 678.6 500 714.3 535.7 678.6 571.4 642.9 607.1 607.1 642.9 571.4 678.6 535.7 714.3 500 750 464.3 785.7 428.6 821.4 392.9 857.1H321.4L285.7 821.4 250 785.7 214.3 750 178.6 714.3 142.9 678.6V607.1L178.6 571.4 214.3 535.7 250 500 285.7 464.3V392.9L250 357.1 214.3 392.9 178.6 428.6 142.9 464.3 107.1 500 71.4 535.7 35.7 571.4 0 607.1V678.6L35.7 714.3 71.4 750 107.1 785.7 142.9 821.4 178.6 857.1 214.3 892.9 250 928.6 285.7 964.3 321.4 1000H392.9L428.6 964.3 464.3 928.6 500 892.9 535.7 857.1 571.4 821.4 607.1 785.7 642.9 750 678.6 714.3 714.3 678.6 750 642.9 785.7 607.1 821.4 571.4 857.1 607.1V678.6L892.9 714.3 928.6 750V821.4 892.9L964.3 928.6 1000 892.9V821.4 750 678.6 607.1 535.7L964.3 500 928.6 464.3 892.9 428.6 857.1 392.9 821.4 357.1H750 678.6L642.9 321.4 678.6 285.7 714.3 250V178.6 107.1L678.6 71.4 642.9 35.7 607.1 0H535.7Z", + "width": 1000 + }, + "search": [ + "fill" + ] + }, + { + "uid": "88103366af75e17d8a3921ee1fb8616c", + "css": "paste", + "code": 59474, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M321.4 0L285.7 35.7 250 71.4H178.6 107.1L71.4 107.1 35.7 142.9 0 178.6V250 321.4 392.9 464.3 535.7 607.1 678.6 750 821.4 892.9L35.7 928.6 71.4 964.3 107.1 1000H178.6 250 321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 964.3 821.4 928.6 857.1 892.9V821.4 750 678.6 607.1 535.7 464.3 392.9 321.4 250 178.6L821.4 142.9 785.7 107.1 750 71.4H678.6 607.1L571.4 35.7 535.7 0H464.3 392.9ZM392.9 71.4H464.3L500 107.1 464.3 142.9H392.9L357.1 107.1ZM178.6 214.3H250L285.7 250 321.4 285.7H392.9 464.3 535.7L571.4 250 607.1 214.3H678.6L714.3 250V321.4 392.9 464.3 535.7 607.1 678.6 750 821.4L678.6 857.1H607.1 535.7 464.3 392.9 321.4 250 178.6L142.9 821.4V750 678.6 607.1 535.7 464.3 392.9 321.4 250ZM250 428.6L214.3 464.3 250 500H321.4 392.9 464.3 535.7 607.1L642.9 464.3 607.1 428.6H535.7 464.3 392.9 321.4ZM250 571.4L214.3 607.1 250 642.9H321.4 392.9 464.3 535.7 607.1L642.9 607.1 607.1 571.4H535.7 464.3 392.9 321.4ZM250 714.3L214.3 750 250 785.7H321.4 392.9 464.3 535.7 607.1L642.9 750 607.1 714.3H535.7 464.3 392.9 321.4Z", + "width": 857 + }, + "search": [ + "paste" + ] + }, + { + "uid": "c0d81c71f616c8324a78c54d994af313", + "css": "effect", + "code": 59475, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M150 0L100 50 50 100 0 150V250 350 450 550 650 750 850L50 900 100 950 150 1000H250 350 450 550 650 750 850L900 950 950 900 1000 850V750 650 550 450 350 250 150L950 100 900 50 850 0H750 650 550 450 350 250ZM250 100H350 450 550 650 750L800 150 850 200 900 250V350 450 550 650 750L850 800 800 850 750 900H650 550 450 350 250L200 850 150 800 100 750V650 550 450 350 250L150 200 200 150ZM450 300L400 350 350 400 300 450V550L350 600 400 650 450 700H550L600 650 650 600 700 550V450L650 400 600 350 550 300Z", + "width": 1000 + }, + "search": [ + "effect" + ] + }, + { + "uid": "65c4e52c12c9bed7754878f76c4a0acd", + "css": "book", + "code": 59483, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M136.4 0L90.9 45.5 45.5 90.9 0 136.4V227.3 318.2 409.1 500 590.9 681.8 772.7 863.6 954.5L45.5 1000H136.4 227.3 318.2 409.1 500 590.9 681.8 772.7L818.2 954.5 863.6 909.1 909.1 863.6V772.7 681.8 590.9 500 409.1 318.2 227.3 136.4 45.5L863.6 0H772.7 681.8 590.9 500 409.1 318.2 227.3ZM227.3 90.9H318.2 409.1 500 590.9 681.8 772.7L818.2 136.4V227.3 318.2 409.1 500 590.9 681.8 772.7L772.7 818.2H681.8 590.9 500 409.1 318.2 227.3L181.8 772.7V681.8 590.9 500 409.1 318.2 227.3 136.4ZM318.2 181.8L272.7 227.3V318.2L318.2 363.6H409.1 500 590.9 681.8L727.3 318.2V227.3L681.8 181.8H590.9 500 409.1ZM318.2 454.5L272.7 500 318.2 545.5H409.1 500 590.9 681.8L727.3 500 681.8 454.5H590.9 500 409.1ZM318.2 636.4L272.7 681.8 318.2 727.3H409.1 500 590.9 681.8L727.3 681.8 681.8 636.4H590.9 500 409.1Z", + "width": 909 + }, + "search": [ + "book" + ] + }, + { + "uid": "cee021b830261625d59e49c48a86102c", + "css": "liquid", + "code": 59484, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M55.6 0L0 55.6 55.6 111.1 111.1 166.7V277.8 388.9 500 611.1L166.7 666.7 222.2 722.2 277.8 777.8 333.3 833.3 388.9 888.9H500 611.1 722.2 833.3L888.9 944.4 944.4 1000 1000 944.4V833.3 722.2 611.1 500 388.9 277.8L944.4 222.2 888.9 277.8 833.3 333.3H722.2L666.7 277.8V166.7L722.2 111.1 777.8 55.6 722.2 0H611.1 500 388.9 277.8 166.7ZM277.8 111.1H388.9 500L555.6 166.7V277.8L611.1 333.3 666.7 388.9 722.2 444.4H833.3L888.9 500V611.1 722.2L833.3 777.8H722.2 611.1 500 388.9L333.3 722.2 277.8 666.7 222.2 611.1V500 388.9 277.8 166.7Z", + "width": 1000 + }, + "search": [ + "liquid" + ] + }, + { + "uid": "afcfe6416bfdb70c40ede7bf666667d9", + "css": "host", + "code": 59485, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M45.5 0L0 45.5V136.4 227.3L45.5 272.7H136.4 227.3 318.2 409.1 500 590.9 681.8 772.7 863.6 954.5 1045.5L1090.9 227.3V136.4 45.5L1045.5 0H954.5 863.6 772.7 681.8 590.9 500 409.1 318.2 227.3 136.4ZM136.4 90.9H227.3 318.2 409.1 500L545.5 136.4 500 181.8H409.1 318.2 227.3 136.4L90.9 136.4ZM863.6 90.9L909.1 136.4 863.6 181.8 818.2 136.4ZM45.5 363.6L0 409.1V500 590.9L45.5 636.4H136.4 227.3 318.2 409.1 500 590.9 681.8 772.7 863.6 954.5 1045.5L1090.9 590.9V500 409.1L1045.5 363.6H954.5 863.6 772.7 681.8 590.9 500 409.1 318.2 227.3 136.4ZM136.4 454.5H227.3 318.2 409.1 500L545.5 500 500 545.5H409.1 318.2 227.3 136.4L90.9 500ZM863.6 454.5L909.1 500 863.6 545.5 818.2 500ZM45.5 727.3L0 772.7V863.6 954.5L45.5 1000H136.4 227.3 318.2 409.1 500 590.9 681.8 772.7 863.6 954.5 1045.5L1090.9 954.5V863.6 772.7L1045.5 727.3H954.5 863.6 772.7 681.8 590.9 500 409.1 318.2 227.3 136.4ZM136.4 818.2H227.3 318.2 409.1 500L545.5 863.6 500 909.1H409.1 318.2 227.3 136.4L90.9 863.6ZM863.6 818.2L909.1 863.6 863.6 909.1 818.2 863.6Z", + "width": 1091 + }, + "search": [ + "host" + ] + }, + { + "uid": "060ea30307b6e6ab4706682853ec9d21", + "css": "production", + "code": 59486, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M55.6 0L0 55.6V166.7L55.6 222.2 111.1 277.8 166.7 333.3 222.2 388.9V500 611.1 722.2 833.3L277.8 888.9 333.3 944.4 388.9 1000H500L555.6 944.4 611.1 888.9 666.7 833.3V722.2 611.1 500 388.9L722.2 333.3 777.8 277.8 833.3 222.2 888.9 166.7V55.6L833.3 0H722.2 611.1 500 388.9 277.8 166.7ZM166.7 111.1H277.8 388.9 500 611.1 722.2L777.8 166.7 722.2 222.2H611.1 500 388.9 277.8 166.7L111.1 166.7ZM388.9 333.3L444.4 388.9 500 444.4 555.6 500 500 555.6 444.4 611.1 500 666.7 555.6 722.2 500 777.8 444.4 833.3 388.9 888.9 333.3 833.3V722.2 611.1 500 388.9Z", + "width": 889 + }, + "search": [ + "production" + ] + }, + { + "uid": "32084a9ecd9e7693002b13e274a84240", + "css": "exit", + "code": 59487, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M125 0L83.3 41.7 41.7 83.3 0 125V208.3 291.7 375 458.3 541.7 625 708.3 791.7 875L41.7 916.7 83.3 958.3 125 1000H208.3 291.7 375 458.3 541.7 625 708.3 791.7L833.3 958.3 875 916.7 916.7 875 875 833.3H791.7 708.3 625 541.7 458.3 375 291.7 208.3L166.7 791.7V708.3 625 541.7 458.3 375 291.7 208.3L208.3 166.7H291.7 375 458.3 541.7 625 708.3 791.7 875L916.7 125 875 83.3 833.3 41.7 791.7 0H708.3 625 541.7 458.3 375 291.7 208.3ZM708.3 250L666.7 291.7 708.3 333.3 750 375 708.3 416.7H625 541.7 458.3 375L333.3 458.3V541.7L375 583.3H458.3 541.7 625 708.3L750 625 708.3 666.7 666.7 708.3 708.3 750H791.7L833.3 708.3 875 666.7 916.7 625 958.3 583.3 1000 541.7V458.3L958.3 416.7 916.7 375 875 333.3 833.3 291.7 791.7 250Z", + "width": 1000 + }, + "search": [ + "exit" + ] + }, + { + "uid": "7ee2f2d80faaf4bce9af14bbb6cf1f07", + "css": "mode-pvp", + "code": 59489, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M269.2 0L230.8 38.5V115.4L269.2 153.8 307.7 192.3 346.2 230.8 384.6 269.2 423.1 307.7 461.5 269.2 500 230.8 538.5 192.3 500 153.8 461.5 115.4 423.1 76.9 384.6 38.5 346.2 0ZM884.6 0L846.2 38.5 807.7 76.9 769.2 115.4 730.8 153.8 692.3 192.3 653.8 230.8 615.4 269.2 576.9 307.7 538.5 346.2 500 384.6 461.5 423.1 423.1 461.5 384.6 500 346.2 538.5H269.2L230.8 500 192.3 461.5H115.4L76.9 500V576.9L115.4 615.4 153.8 653.8V730.8L115.4 769.2 76.9 807.7 38.5 846.2 0 884.6V961.5L38.5 1000H115.4L153.8 961.5 192.3 923.1 230.8 884.6 269.2 846.2H346.2L384.6 884.6 423.1 923.1H500L538.5 884.6V807.7L500 769.2 461.5 730.8V653.8L500 615.4 538.5 576.9 576.9 538.5 615.4 500 653.8 461.5 692.3 423.1 730.8 384.6 769.2 346.2 807.7 307.7 846.2 269.2 884.6 230.8 923.1 192.3 961.5 153.8 1000 115.4V38.5L961.5 0ZM807.7 461.5L769.2 500 730.8 538.5 692.3 576.9 730.8 615.4 769.2 653.8V730.8L730.8 769.2 692.3 807.7V884.6L730.8 923.1H807.7L846.2 884.6 884.6 846.2H961.5L1000 884.6 1038.5 923.1 1076.9 961.5 1115.4 1000H1192.3L1230.8 961.5V884.6L1192.3 846.2 1153.8 807.7 1115.4 769.2 1076.9 730.8V653.8L1115.4 615.4 1153.8 576.9V500L1115.4 461.5H1038.5L1000 500 961.5 538.5H884.6L846.2 500Z", + "width": 1231 + }, + "search": [ + "mode-pvp" + ] + }, + { + "uid": "fca174e630aceac2289d86197d04ac6d", + "css": "mode-attack", + "code": 59493, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M884.6 0L846.2 38.5 807.7 76.9 769.2 115.4 730.8 153.8 692.3 192.3 653.8 230.8 615.4 269.2 576.9 307.7 538.5 346.2 500 384.6 461.5 423.1 423.1 461.5 384.6 500 346.2 538.5H269.2L230.8 500 192.3 461.5H115.4L76.9 500V576.9L115.4 615.4 153.8 653.8V730.8L115.4 769.2 76.9 807.7 38.5 846.2 0 884.6V961.5L38.5 1000H115.4L153.8 961.5 192.3 923.1 230.8 884.6 269.2 846.2H346.2L384.6 884.6 423.1 923.1H500L538.5 884.6V807.7L500 769.2 461.5 730.8V653.8L500 615.4 538.5 576.9 576.9 538.5 615.4 500 653.8 461.5 692.3 423.1 730.8 384.6 769.2 346.2 807.7 307.7 846.2 269.2 884.6 230.8 923.1 192.3 961.5 153.8 1000 115.4V38.5L961.5 0Z", + "width": 1000 + }, + "search": [ + "mode-attack" + ] + }, + { + "uid": "d2dae093c8eaeecb8b86b9b3137d5e59", + "css": "refresh-1", + "code": 59495, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M41.7 0L0 41.7V125 208.3 291.7 375 458.3 541.7L41.7 583.3H125L166.7 541.7V458.3 375 291.7 208.3L208.3 166.7H291.7 375 458.3 541.7 625 708.3L750 208.3 708.3 250 666.7 291.7 708.3 333.3H791.7 875 958.3L1000 291.7V208.3 125 41.7L958.3 0 916.7 41.7 875 83.3 833.3 41.7 791.7 0H708.3 625 541.7 458.3 375 291.7 208.3 125ZM875 416.7L833.3 458.3V541.7 625 708.3 791.7L791.7 833.3H708.3 625 541.7 458.3 375 291.7L250 791.7 291.7 750 333.3 708.3 291.7 666.7H208.3 125 41.7L0 708.3V791.7 875 958.3L41.7 1000 83.3 958.3 125 916.7 166.7 958.3 208.3 1000H291.7 375 458.3 541.7 625 708.3 791.7 875 958.3L1000 958.3V875 791.7 708.3 625 541.7 458.3L958.3 416.7Z", + "width": 1000 + }, + "search": [ + "refresh" + ] + }, + { + "uid": "279c989fcea20393a5b83eb9e598d59a", + "css": "none", + "code": 59496, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M187.5 0L125 62.5 62.5 125 0 187.5V312.5 437.5 562.5 687.5 812.5L62.5 875 125 937.5 187.5 1000H312.5 437.5 562.5 687.5 812.5L875 937.5 937.5 875 1000 812.5V687.5 562.5 437.5 312.5 187.5L937.5 125 875 62.5 812.5 0H687.5 562.5 437.5 312.5ZM437.5 125H562.5 687.5L750 187.5 812.5 250 875 312.5V437.5 562.5L812.5 625 750 562.5 687.5 500 625 437.5 562.5 375 500 312.5 437.5 250 375 187.5ZM187.5 375L250 437.5 312.5 500 375 562.5 437.5 625 500 687.5 562.5 750 625 812.5 562.5 875H437.5 312.5L250 812.5 187.5 750 125 687.5V562.5 437.5Z", + "width": 1000 + }, + "search": [ + "none" + ] + }, + { + "uid": "e3b561a775bcb150f6b8ea719a465345", + "css": "pencil_", + "code": 59497, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M821.4 0L785.7 35.7 750 71.4 714.3 107.1 678.6 142.9 642.9 178.6 678.6 214.3 714.3 250 750 285.7 785.7 321.4 821.4 357.1 857.1 321.4 892.9 285.7 928.6 250 964.3 214.3 1000 178.6 964.3 142.9 928.6 107.1 892.9 71.4 857.1 35.7ZM535.7 285.7L500 321.4 464.3 357.1 428.6 392.9 392.9 428.6 357.1 464.3 321.4 500 285.7 535.7 250 571.4 214.3 607.1 178.6 642.9 142.9 678.6 107.1 714.3 71.4 750 35.7 785.7 0 821.4V892.9 964.3L35.7 1000H107.1 178.6L214.3 964.3 250 928.6 285.7 892.9 321.4 857.1 357.1 821.4 392.9 785.7 428.6 750 464.3 714.3 500 678.6 535.7 642.9 571.4 607.1 607.1 571.4 642.9 535.7 678.6 500 714.3 464.3 678.6 428.6 642.9 392.9 607.1 357.1 571.4 321.4ZM250 642.9L285.7 678.6 321.4 714.3 357.1 750 321.4 785.7 285.7 821.4 250 857.1 214.3 892.9 178.6 928.6H107.1L71.4 892.9V821.4L107.1 785.7 142.9 750 178.6 714.3 214.3 678.6Z", + "width": 1000 + }, + "search": [ + "pencil" + ] + }, + { + "uid": "8b4d5e8da6aa68188b631aaf252a9e14", + "css": "refresh", + "code": 59498, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M41.7 0L0 41.7V125 208.3 291.7 375 458.3 541.7L41.7 583.3H125L166.7 541.7V458.3 375 291.7 208.3L208.3 166.7H291.7 375 458.3 541.7 625 708.3L750 208.3 708.3 250 666.7 291.7 708.3 333.3H791.7 875 958.3L1000 291.7V208.3 125 41.7L958.3 0 916.7 41.7 875 83.3 833.3 41.7 791.7 0H708.3 625 541.7 458.3 375 291.7 208.3 125ZM875 416.7L833.3 458.3V541.7 625 708.3 791.7L791.7 833.3H708.3 625 541.7 458.3 375 291.7L250 791.7 291.7 750 333.3 708.3 291.7 666.7H208.3 125 41.7L0 708.3V791.7 875 958.3L41.7 1000 83.3 958.3 125 916.7 166.7 958.3 208.3 1000H291.7 375 458.3 541.7 625 708.3 791.7 875 958.3L1000 958.3V875 791.7 708.3 625 541.7 458.3L958.3 416.7Z", + "width": 1000 + }, + "search": [ + "refresh" + ] + }, + { + "uid": "44e902e72564bc6d9a9eb1d174208d35", + "css": "mode-survival", + "code": 59499, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M38.5 0L0 38.5V115.4 192.3 269.2 346.2 423.1 500 576.9 653.8L38.5 692.3 76.9 730.8 115.4 769.2 153.8 807.7 192.3 846.2 230.8 884.6 269.2 923.1 307.7 961.5 346.2 1000H423.1 500 576.9L615.4 961.5 653.8 923.1 692.3 884.6 730.8 846.2 769.2 807.7 807.7 769.2 846.2 730.8 884.6 692.3 923.1 653.8V576.9 500 423.1 346.2 269.2 192.3 115.4 38.5L884.6 0H807.7L769.2 38.5 730.8 76.9 692.3 115.4 653.8 153.8H576.9 500 423.1 346.2 269.2L230.8 115.4 192.3 76.9 153.8 38.5 115.4 0Z", + "width": 923 + }, + "search": [ + "mode-survival" + ] + }, + { + "uid": "9e23184b166b551c5fb0bd5ee3a4dc2c", + "css": "command-rally", + "code": 59500, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M250 0L166.7 83.3 83.3 166.7 0 250V416.7 583.3 750L83.3 833.3 166.7 916.7 250 1000H416.7 583.3 750L833.3 916.7 916.7 833.3 1000 750V583.3 416.7 250L916.7 166.7 833.3 83.3 750 0H583.3 416.7ZM416.7 166.7H583.3L666.7 250 750 333.3 833.3 416.7V583.3L750 666.7 666.7 750 583.3 833.3H416.7L333.3 750 250 666.7 166.7 583.3V416.7L250 333.3 333.3 250Z", + "width": 1000 + }, + "search": [ + "command-rally" + ] + }, + { + "uid": "5b2609713ca347b272beb0bc5f49c42e", + "css": "units", + "code": 59501, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M437.5 0L375 62.5 312.5 125 250 187.5 187.5 250 125 312.5 62.5 375 0 437.5V562.5 687.5L62.5 750 125 687.5 187.5 625 250 687.5V812.5 937.5L312.5 1000H437.5L500 937.5V812.5L562.5 750H687.5L750 812.5V937.5L812.5 1000H937.5L1000 937.5V812.5 687.5L1062.5 625 1125 687.5 1187.5 750 1250 687.5V562.5 437.5L1187.5 375 1125 312.5 1062.5 250 1000 187.5 937.5 125 875 62.5 812.5 0H687.5 562.5ZM437.5 125H562.5 687.5 812.5L875 187.5 937.5 250 1000 312.5 1062.5 375 1125 437.5 1062.5 500H937.5L875 562.5 812.5 625H687.5 562.5 437.5L375 562.5 312.5 500H187.5L125 437.5 187.5 375 250 312.5 312.5 250 375 187.5ZM562.5 250L500 312.5 562.5 375H687.5L750 312.5 687.5 250Z", + "width": 1250 + }, + "search": [ + "units" + ] + }, + { + "uid": "de2b09bde33670e3502e3e07b936e098", + "css": "command-attack", + "code": 59502, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M750 0L666.7 83.3 583.3 166.7 500 250 416.7 333.3 333.3 416.7 250 500 166.7 416.7 83.3 333.3 0 416.7 83.3 500 166.7 583.3 83.3 666.7 0 750V916.7L83.3 1000H250L333.3 916.7 416.7 833.3 500 916.7 583.3 1000 666.7 916.7 583.3 833.3 500 750 583.3 666.7 666.7 583.3 750 500 833.3 416.7 916.7 333.3 1000 250V83.3L916.7 0Z", + "width": 1000 + }, + "search": [ + "command-attack" + ] + }, + { + "uid": "343b1d6c67d1c2bdc279b8df809fb3bf", + "css": "trash", + "code": 59503, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M291.7 0L250 41.7V125L208.3 166.7H125 41.7L0 208.3V291.7 375 458.3L41.7 500 83.3 541.7V625 708.3 791.7 875 958.3L125 1000H208.3 291.7 375 458.3 541.7 625 708.3L750 958.3V875 791.7 708.3 625 541.7L791.7 500 833.3 458.3V375 291.7 208.3L791.7 166.7H708.3 625L583.3 125V41.7L541.7 0H458.3 375ZM375 83.3H458.3L500 125 458.3 166.7H375L333.3 125ZM125 250H208.3 291.7 375 458.3 541.7 625 708.3L750 291.7V375L708.3 416.7H625 541.7 458.3 375 291.7 208.3 125L83.3 375V291.7ZM208.3 500L250 541.7V625 708.3 791.7 875L208.3 916.7 166.7 875V791.7 708.3 625 541.7ZM375 500H458.3L500 541.7V625 708.3 791.7 875L458.3 916.7H375L333.3 875V791.7 708.3 625 541.7ZM625 500L666.7 541.7V625 708.3 791.7 875L625 916.7 583.3 875V791.7 708.3 625 541.7Z", + "width": 833 + }, + "search": [ + "trash" + ] + }, + { + "uid": "f82a79ee879412f7ddf7c517c6958d45", + "css": "chat", + "code": 59504, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M187.5 0L125 62.5 62.5 125 0 187.5V312.5 437.5 562.5 687.5 812.5L62.5 875 125 937.5 187.5 1000 250 937.5V812.5L312.5 750H437.5 562.5 687.5 812.5L875 687.5 937.5 625 1000 562.5V437.5 312.5 187.5L937.5 125 875 62.5 812.5 0H687.5 562.5 437.5 312.5Z", + "width": 1000 + }, + "search": [ + "chat" + ] + }, + { + "uid": "1a406c75ee5adac112504cd1baf6d482", + "css": "turret", + "code": 59505, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M166.7 0L111.1 55.6V166.7 277.8 388.9L55.6 444.4 0 500V611.1 722.2 833.3 944.4L55.6 1000H166.7 277.8L333.3 944.4 388.9 888.9H500L555.6 944.4 611.1 1000H722.2 833.3L888.9 944.4V833.3 722.2 611.1 500L833.3 444.4 777.8 388.9V277.8 166.7 55.6L722.2 0H611.1L555.6 55.6V166.7L500 222.2H388.9L333.3 166.7V55.6L277.8 0ZM277.8 333.3H388.9 500 611.1L666.7 388.9 722.2 444.4 777.8 500V611.1 722.2 833.3L722.2 888.9H611.1L555.6 833.3 500 777.8H388.9L333.3 833.3 277.8 888.9H166.7L111.1 833.3V722.2 611.1 500L166.7 444.4 222.2 388.9Z", + "width": 889 + }, + "search": [ + "turret" + ] + }, + { + "uid": "559d541ead67649a9658f22b36bc48fc", + "css": "players", + "code": 59506, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M437.5 0L375 62.5 312.5 125 250 187.5V312.5L312.5 375 375 437.5 312.5 500 250 562.5 187.5 625 125 687.5 62.5 750 0 812.5V937.5L62.5 1000H187.5 312.5 437.5 562.5 687.5 812.5 937.5L1000 937.5V812.5L937.5 750 875 687.5 812.5 625 750 562.5 687.5 500 625 437.5 687.5 375 750 312.5V187.5L687.5 125 625 62.5 562.5 0Z", + "width": 1000 + }, + "search": [ + "players" + ] + }, + { + "uid": "2e574f2316b8b4f840d5680dcad8088b", + "css": "editor", + "code": 59507, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M375 0L333.3 41.7 291.7 83.3 250 125 208.3 166.7 166.7 208.3 125 250 83.3 291.7 41.7 333.3 0 375V458.3 541.7 625 708.3 791.7 875 958.3L41.7 1000H125 208.3 291.7 375 458.3 541.7 625 708.3 791.7 875 958.3L1000 958.3V875 791.7 708.3 625 541.7 458.3L958.3 416.7 916.7 375 875 333.3 833.3 291.7 791.7 250 750 208.3 708.3 166.7 666.7 208.3 625 250 583.3 208.3 541.7 166.7 500 125 458.3 83.3 416.7 41.7ZM375 166.7L416.7 208.3 458.3 250 500 291.7 541.7 333.3 583.3 375 625 416.7 666.7 375 708.3 333.3 750 375 791.7 416.7 833.3 458.3 875 500 916.7 541.7V625 708.3 791.7 875L875 916.7H791.7 708.3 625 541.7 458.3 375 291.7 208.3 125L83.3 875V791.7 708.3 625 541.7 458.3L125 416.7 166.7 375 208.3 333.3 250 291.7 291.7 250 333.3 208.3Z", + "width": 1000 + }, + "search": [ + "editor" + ] + }, + { + "uid": "6e16d3f823a60ce0e9db3a9768668132", + "css": "copy", + "code": 59508, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M107.1 0L71.4 35.7 35.7 71.4 0 107.1V178.6 250 321.4 392.9 464.3 535.7 607.1L35.7 642.9 71.4 678.6 107.1 714.3 142.9 678.6V607.1 535.7 464.3 392.9 321.4 250 178.6L178.6 142.9H250 321.4 392.9 464.3 535.7 607.1L642.9 107.1 607.1 71.4 571.4 35.7 535.7 0H464.3 392.9 321.4 250 178.6ZM321.4 214.3L285.7 250 250 285.7 214.3 321.4V392.9 464.3 535.7 607.1 678.6 750 821.4 892.9L250 928.6 285.7 964.3 321.4 1000H392.9 464.3 535.7 607.1 678.6 750 821.4L857.1 964.3 892.9 928.6 928.6 892.9V821.4 750 678.6 607.1 535.7 464.3 392.9 321.4L892.9 285.7 857.1 250 821.4 214.3H750 678.6 607.1 535.7 464.3 392.9ZM392.9 357.1H464.3 535.7 607.1 678.6 750L785.7 392.9V464.3 535.7 607.1 678.6 750 821.4L750 857.1H678.6 607.1 535.7 464.3 392.9L357.1 821.4V750 678.6 607.1 535.7 464.3 392.9Z", + "width": 929 + }, + "search": [ + "copy" + ] + }, + { + "uid": "295e9560f763400dae5f29abd75c4e39", + "css": "tree", + "code": 59509, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M38.5 0L0 38.5V115.4 192.3L38.5 230.8 76.9 269.2V346.2 423.1 500 576.9L115.4 615.4H192.3 269.2 346.2L384.6 653.8 423.1 692.3 461.5 730.8V807.7 884.6 961.5L500 1000 538.5 961.5V884.6 807.7 730.8L576.9 692.3 615.4 653.8 653.8 615.4H730.8 807.7 884.6L923.1 576.9V500 423.1 346.2 269.2L961.5 230.8 1000 192.3V115.4 38.5L961.5 0H884.6 807.7L769.2 38.5V115.4 192.3L807.7 230.8 846.2 269.2V346.2 423.1 500L807.7 538.5H730.8 653.8L615.4 500 576.9 461.5 538.5 423.1V346.2 269.2L576.9 230.8 615.4 192.3V115.4 38.5L576.9 0H500 423.1L384.6 38.5V115.4 192.3L423.1 230.8 461.5 269.2V346.2 423.1L423.1 461.5 384.6 500 346.2 538.5H269.2 192.3L153.8 500V423.1 346.2 269.2L192.3 230.8 230.8 192.3V115.4 38.5L192.3 0H115.4Z", + "width": 1000 + }, + "search": [ + "tree" + ] + }, + { + "uid": "0581bbd4c54547d8d6721cc122ffe0fa", + "css": "lock-open", + "code": 59510, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M291.7 0L250 41.7 208.3 83.3 166.7 125V208.3 291.7 375L125 416.7 83.3 458.3 41.7 500 0 541.7V625 708.3 791.7 875L41.7 916.7 83.3 958.3 125 1000H208.3 291.7 375 458.3 541.7 625 708.3L750 958.3 791.7 916.7 833.3 875V791.7 708.3 625 541.7L791.7 500 750 458.3 708.3 416.7H625 541.7 458.3 375L333.3 375V291.7 208.3L375 166.7H458.3L500 208.3V291.7L541.7 333.3H625L666.7 291.7V208.3 125L625 83.3 583.3 41.7 541.7 0H458.3 375ZM375 583.3H458.3L500 625V708.3 791.7L458.3 833.3H375L333.3 791.7V708.3 625Z", + "width": 833 + }, + "search": [ + "lock-open" + ] + }, + { + "uid": "d0203434b5e4cea53499b112743fd675", + "css": "pick", + "code": 59511, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M590.9 0L545.5 45.5 500 90.9 454.5 136.4 409.1 181.8 363.6 136.4 318.2 90.9 272.7 136.4 318.2 181.8 363.6 227.3 409.1 272.7 454.5 318.2 409.1 363.6 363.6 409.1 318.2 454.5 272.7 500 227.3 545.5 181.8 590.9 136.4 636.4 90.9 681.8V772.7L45.5 818.2 0 863.6V954.5L45.5 1000H136.4L181.8 954.5 227.3 909.1H318.2L363.6 863.6 409.1 818.2 454.5 772.7 500 727.3 545.5 681.8 590.9 636.4 636.4 590.9 681.8 545.5 727.3 590.9 772.7 636.4 818.2 681.8 863.6 727.3 909.1 681.8 863.6 636.4 818.2 590.9 863.6 545.5 909.1 500 954.5 454.5 1000 409.1V318.2 227.3 136.4L954.5 90.9 909.1 45.5 863.6 0H772.7 681.8ZM500 363.6L545.5 409.1 590.9 454.5 636.4 500 590.9 545.5 545.5 590.9 500 636.4 454.5 681.8 409.1 727.3 363.6 772.7 318.2 818.2H227.3L181.8 772.7V681.8L227.3 636.4 272.7 590.9 318.2 545.5 363.6 500 409.1 454.5 454.5 409.1Z", + "width": 1000 + }, + "search": [ + "pick" + ] + }, + { + "uid": "b04d1002bf24f642a026b8844f0ab4af", + "css": "export", + "code": 59512, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M50 0L0 50V150 250 350 450 550 650 750 850 950L50 1000H150 250 350 450 550 650 750 850 950L1000 950V850 750L950 700 900 750V850L850 900H750 650 550 450 350 250 150L100 850V750 650 550 450 350 250 150L150 100H250 350 450 550L600 50 550 0H450 350 250 150ZM850 0L800 50V150L750 200H650 550L500 250 450 300 400 350 350 400 300 450V550L350 600H450L500 550 550 500 600 450 650 400H750L800 450V550L850 600 900 550 950 500 1000 450 1050 400 1100 350V250L1050 200 1000 150 950 100 900 50Z", + "width": 1100 + }, + "search": [ + "export" + ] + }, + { + "uid": "6636e2512996fa2c2b37b8d9e111d4fe", + "css": "download", + "code": 59513, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M464.3 0L428.6 35.7V107.1 178.6 250 321.4 392.9L392.9 428.6 357.1 392.9 321.4 357.1H250L214.3 392.9V464.3L250 500 285.7 535.7 321.4 571.4 357.1 607.1 392.9 642.9 428.6 678.6 464.3 714.3H535.7L571.4 678.6 607.1 642.9 642.9 607.1 678.6 571.4 714.3 535.7 750 500 785.7 464.3V392.9L750 357.1H678.6L642.9 392.9 607.1 428.6 571.4 392.9V321.4 250 178.6 107.1 35.7L535.7 0ZM35.7 714.3L0 750V821.4 892.9 964.3L35.7 1000H107.1 178.6 250 321.4 392.9 464.3 535.7 607.1 678.6 750 821.4 892.9 964.3L1000 964.3V892.9 821.4 750L964.3 714.3H892.9L857.1 750V821.4L821.4 857.1H750 678.6 607.1 535.7 464.3 392.9 321.4 250 178.6L142.9 821.4V750L107.1 714.3Z", + "width": 1000 + }, + "search": [ + "download" + ] + }, + { + "uid": "f9895cd70db81922fbd2aa1882f04a03", + "css": "upload", + "code": 59515, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M464.3 0L428.6 35.7 392.9 71.4 357.1 107.1 321.4 142.9 285.7 178.6 250 214.3 214.3 250V321.4L250 357.1H321.4L357.1 321.4 392.9 285.7 428.6 321.4V392.9 464.3 535.7 607.1 678.6L464.3 714.3H535.7L571.4 678.6V607.1 535.7 464.3 392.9 321.4L607.1 285.7 642.9 321.4 678.6 357.1H750L785.7 321.4V250L750 214.3 714.3 178.6 678.6 142.9 642.9 107.1 607.1 71.4 571.4 35.7 535.7 0ZM35.7 714.3L0 750V821.4 892.9 964.3L35.7 1000H107.1 178.6 250 321.4 392.9 464.3 535.7 607.1 678.6 750 821.4 892.9 964.3L1000 964.3V892.9 821.4 750L964.3 714.3H892.9L857.1 750V821.4L821.4 857.1H750 678.6 607.1 535.7 464.3 392.9 321.4 250 178.6L142.9 821.4V750L107.1 714.3Z", + "width": 1000 + }, + "search": [ + "upload" + ] + }, + { + "uid": "e8191eedaa10260cef458a2385925cb0", + "css": "settings", + "code": 59516, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M450 0L400 50V150L350 200 300 150 250 100H150L100 150V250L150 300 200 350 150 400H50L0 450V550L50 600H150L200 650 150 700 100 750V850L150 900H250L300 850 350 800 400 850V950L450 1000H550L600 950V850L650 800 700 850 750 900H850L900 850V750L850 700 800 650 850 600H950L1000 550V450L950 400H850L800 350 850 300 900 250V150L850 100H750L700 150 650 200 600 150V50L550 0ZM450 400H550L600 450V550L550 600H450L400 550V450Z", + "width": 1000 + }, + "search": [ + "settings" + ] + }, + { + "uid": "ea0128855a25fc520b78658acfe68693", + "css": "spray", + "code": 59517, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M35.7 0L0 35.7 35.7 71.4 71.4 35.7ZM178.6 71.4L142.9 107.1 178.6 142.9 214.3 178.6 178.6 214.3 142.9 250 178.6 285.7 214.3 250 250 214.3 285.7 178.6 250 142.9 214.3 107.1ZM392.9 71.4L357.1 107.1 392.9 142.9 428.6 178.6 392.9 214.3 357.1 250 321.4 285.7 285.7 321.4 250 357.1 214.3 392.9 250 428.6H321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 392.9 750 357.1 714.3 321.4 678.6 285.7 642.9 250V178.6 107.1L607.1 71.4H535.7 464.3ZM35.7 142.9L0 178.6 35.7 214.3 71.4 178.6ZM35.7 285.7L0 321.4 35.7 357.1 71.4 321.4ZM250 500L214.3 535.7V607.1 678.6 750 821.4L250 857.1H321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 821.4V750 678.6 607.1 535.7L750 500H678.6 607.1 535.7 464.3 392.9 321.4ZM250 928.6L214.3 964.3 250 1000H321.4 392.9 464.3 535.7 607.1 678.6 750L785.7 964.3 750 928.6H678.6 607.1 535.7 464.3 392.9 321.4Z", + "width": 786 + }, + "search": [ + "spray" + ] + }, + { + "uid": "32b0960726db55c7f26620e15f83acd9", + "css": "zoom", + "code": 59530, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M423.1 0L384.6 38.5 346.2 76.9 307.7 115.4 269.2 153.8 230.8 192.3 192.3 230.8 153.8 269.2V346.2 423.1 500 576.9L192.3 615.4 230.8 653.8 192.3 692.3 153.8 730.8 115.4 769.2 76.9 807.7 38.5 846.2 0 884.6V961.5L38.5 1000H115.4L153.8 961.5 192.3 923.1 230.8 884.6 269.2 846.2 307.7 807.7 346.2 769.2 384.6 807.7 423.1 846.2H500 576.9 653.8 730.8L769.2 807.7 807.7 769.2 846.2 730.8 884.6 692.3 923.1 653.8 961.5 615.4 1000 576.9V500 423.1 346.2 269.2L961.5 230.8 923.1 192.3 884.6 153.8 846.2 115.4 807.7 76.9 769.2 38.5 730.8 0H653.8 576.9 500ZM500 153.8H576.9 653.8L692.3 192.3 730.8 230.8 769.2 269.2 807.7 307.7 846.2 346.2V423.1 500L807.7 538.5 769.2 576.9 730.8 615.4 692.3 653.8 653.8 692.3H576.9 500L461.5 653.8 423.1 615.4 384.6 576.9 346.2 538.5 307.7 500V423.1 346.2L346.2 307.7 384.6 269.2 423.1 230.8 461.5 192.3Z", + "width": 1000 + }, + "search": [ + "search" + ] + }, + { + "uid": "22856e2f42e364e7e363348542b46062", + "css": "power_old", + "code": 59531, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1250 0L1166.7 83.3 1083.3 166.7 1000 250 916.7 333.3 833.3 416.7 750 500 666.7 416.7 583.3 333.3 500 250 416.7 166.7 333.3 250 250 333.3 166.7 416.7V583.3L83.3 666.7 0 750V916.7L83.3 1000 166.7 916.7 250 833.3 333.3 750 416.7 666.7 500 750 583.3 833.3 666.7 916.7 750 1000 833.3 916.7 916.7 833.3 1000 750 1083.3 666.7 1166.7 583.3V416.7L1250 333.3 1333.3 250V83.3Z", + "width": 1333 + }, + "search": [ + "power" + ] + }, + { + "uid": "971842913945f59c7f3cf11e75e1e4f1", + "css": "power_", + "code": 59408, + "src": "typicons" + }, + { + "uid": "844ca62d81744d1ca4b59a4763aeca86", + "css": "menu", + "code": 59532, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M62.5 0L0 62.5V187.5L62.5 250H187.5L250 187.5V62.5L187.5 0ZM437.5 0L375 62.5V187.5L437.5 250H562.5 687.5 812.5 937.5L1000 187.5V62.5L937.5 0H812.5 687.5 562.5ZM62.5 375L0 437.5V562.5L62.5 625H187.5L250 562.5V437.5L187.5 375ZM437.5 375L375 437.5V562.5L437.5 625H562.5 687.5 812.5 937.5L1000 562.5V437.5L937.5 375H812.5 687.5 562.5ZM62.5 750L0 812.5V937.5L62.5 1000H187.5L250 937.5V812.5L187.5 750ZM437.5 750L375 812.5V937.5L437.5 1000H562.5 687.5 812.5 937.5L1000 937.5V812.5L937.5 750H812.5 687.5 562.5Z", + "width": 1000 + }, + "search": [ + "menu" + ] + }, + { + "uid": "4b4d5e5ee8884c2f545869496dcb525b", + "css": "lock", + "code": 59533, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M318.2 0L272.7 45.5 227.3 90.9 181.8 136.4V227.3 318.2L136.4 363.6 90.9 409.1 45.5 454.5 0 500V590.9 681.8 772.7 863.6L45.5 909.1 90.9 954.5 136.4 1000H227.3 318.2 409.1 500 590.9 681.8 772.7L818.2 954.5 863.6 909.1 909.1 863.6V772.7 681.8 590.9 500L863.6 454.5 818.2 409.1 772.7 363.6 727.3 318.2V227.3 136.4L681.8 90.9 636.4 45.5 590.9 0H500 409.1ZM409.1 181.8H500L545.5 227.3V318.2L500 363.6H409.1L363.6 318.2V227.3ZM409.1 545.5H500L545.5 590.9V681.8 772.7L500 818.2H409.1L363.6 772.7V681.8 590.9Z", + "width": 909 + }, + "search": [ + "lock" + ] + }, + { + "uid": "9515bb59fd462b77f0d088978c339778", + "css": "eye", + "code": 59534, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M450 0L400 50 350 100 300 150 250 200 200 250 150 300 100 350 50 400 0 450V550L50 600 100 650 150 700 200 750 250 800 300 850 350 900 400 950 450 1000H550 650 750 850 950 1050 1150L1200 950 1250 900 1300 850 1350 800 1400 750 1450 700 1500 650 1550 600 1600 550V450L1550 400 1500 350 1450 300 1400 250 1350 200 1300 150 1250 100 1200 50 1150 0H1050 950 850 750 650 550ZM650 200H750 850 950L1000 250 1050 300 1100 350 1150 400 1200 450V550L1150 600 1100 650 1050 700 1000 750 950 800H850 750 650L600 750 550 700 500 650 450 600 400 550V450L450 400 500 350 550 300 600 250ZM750 400L700 450V550L750 600H850L900 550V450L850 400Z", + "width": 1600 + }, + "search": [ + "eye" + ] + }, + { + "uid": "fdd7088d0019bb1033df645f01981429", + "css": "eye-off", + "code": 59535, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1041.7 0L1000 41.7 958.3 83.3 916.7 125 875 166.7 833.3 208.3 791.7 250 750 291.7 708.3 333.3 666.7 375 625 416.7 583.3 458.3 541.7 500 500 541.7 458.3 583.3 416.7 625 375 666.7 333.3 708.3 291.7 750 250 791.7 208.3 833.3 166.7 875V958.3L208.3 1000H291.7L333.3 958.3 375 916.7 416.7 875 458.3 833.3 500 791.7 541.7 750 583.3 708.3 625 666.7 666.7 625 708.3 583.3 750 541.7 791.7 500 833.3 458.3 875 416.7 916.7 375 958.3 333.3 1000 291.7 1041.7 250 1083.3 208.3 1125 166.7 1166.7 125V41.7L1125 0ZM375 83.3L333.3 125 291.7 166.7 250 208.3 208.3 250 166.7 291.7 125 333.3 83.3 375 41.7 416.7 0 458.3V541.7L41.7 583.3 83.3 625 125 666.7H208.3L250 625 291.7 583.3 333.3 541.7V458.3L375 416.7 416.7 375 458.3 333.3 500 291.7 541.7 250H625L666.7 208.3 708.3 166.7 750 125 708.3 83.3H625 541.7 458.3ZM1125 333.3L1083.3 375 1041.7 416.7 1000 458.3V541.7L958.3 583.3 916.7 625 875 666.7 833.3 708.3 791.7 750H708.3L666.7 791.7 625 833.3 583.3 875 625 916.7H708.3 791.7 875 958.3L1000 875 1041.7 833.3 1083.3 791.7 1125 750 1166.7 708.3 1208.3 666.7 1250 625 1291.7 583.3 1333.3 541.7V458.3L1291.7 416.7 1250 375 1208.3 333.3Z", + "width": 1333 + }, + "search": [ + "eye-off" + ] + }, + { + "uid": "f47srtt9pew19q6kg9jniwtzsb8q1rhy", + "css": "warning", + "code": 9888, + "src": "modernpics" + }, + { + "uid": "c17baed6f9afce2a8fafe730886b8e06", + "css": "terrain", + "code": 59492, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M350 0L300 50 250 100 200 150 150 200 100 250 50 300 0 350V450 550 650 750 850 950L50 1000H150 250 350 450 550 650 750 850 950L1000 950V850 750 650 550 450L950 400 900 350 850 300 800 250 750 200 700 250 650 300 600 250 550 200 500 150 450 100 400 50ZM350 200L400 250 450 300 500 350 550 400 600 450 650 500 700 450 750 400 800 450 850 500 900 550V650 750 850L850 900H750 650 550 450 350 250 150L100 850V750 650 550 450L150 400 200 350 250 300 300 250Z", + "width": 1000 + }, + "search": [ + "terrain" + ] + }, + { + "uid": "bdff09f8036a4b1757599b2510a02ffe", + "css": "defense", + "code": 59469, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M62.5 0L0 62.5V187.5 312.5 437.5 562.5L62.5 625 125 687.5 187.5 750 250 812.5 312.5 875 375 937.5 437.5 1000H562.5L625 937.5 687.5 875 750 812.5 812.5 750 875 687.5 937.5 625 1000 562.5V437.5 312.5 187.5 62.5L937.5 0H812.5L750 62.5 687.5 125H562.5 437.5 312.5L250 62.5 187.5 0ZM187.5 125L250 187.5 312.5 250H437.5 562.5 687.5L750 187.5 812.5 125 875 187.5V312.5 437.5 562.5L812.5 625 750 687.5 687.5 750 625 812.5 562.5 875H437.5L375 812.5 312.5 750 250 687.5 187.5 625 125 562.5V437.5 312.5 187.5Z", + "width": 1000 + }, + "search": [ + "defense" + ] } ] } \ No newline at end of file diff --git a/core/assets-raw/fontgen/extra/admin.svg b/core/assets-raw/fontgen/extra/admin.svg new file mode 100644 index 0000000000..03b33386b8 --- /dev/null +++ b/core/assets-raw/fontgen/extra/admin.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/core/assets-raw/fontgen/extra/distribution.svg b/core/assets-raw/fontgen/extra/distribution.svg new file mode 100644 index 0000000000..63d50541d0 --- /dev/null +++ b/core/assets-raw/fontgen/extra/distribution.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/core/assets-raw/fontgen/extra/effect.svg b/core/assets-raw/fontgen/extra/effect.svg new file mode 100644 index 0000000000..2194e8953e --- /dev/null +++ b/core/assets-raw/fontgen/extra/effect.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/core/assets-raw/fontgen/extra/file-image.svg b/core/assets-raw/fontgen/extra/file-image.svg new file mode 100644 index 0000000000..37d149a2e4 --- /dev/null +++ b/core/assets-raw/fontgen/extra/file-image.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/core/assets-raw/fontgen/extra/info.svg b/core/assets-raw/fontgen/extra/info.svg new file mode 100644 index 0000000000..d7ec5d243f --- /dev/null +++ b/core/assets-raw/fontgen/extra/info.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/core/assets-raw/fontgen/icons/logic.svg b/core/assets-raw/fontgen/extra/logic.svg similarity index 100% rename from core/assets-raw/fontgen/icons/logic.svg rename to core/assets-raw/fontgen/extra/logic.svg diff --git a/core/assets-raw/fontgen/extra/planet.svg b/core/assets-raw/fontgen/extra/planet.svg new file mode 100644 index 0000000000..17cd9fc3cd --- /dev/null +++ b/core/assets-raw/fontgen/extra/planet.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/core/assets-raw/fontgen/icons/admin.svg b/core/assets-raw/fontgen/icons/admin.svg deleted file mode 100644 index 8b6e5e5220..0000000000 --- a/core/assets-raw/fontgen/icons/admin.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/book.svg b/core/assets-raw/fontgen/icons/book.svg deleted file mode 100644 index 4ce30ae7ee..0000000000 --- a/core/assets-raw/fontgen/icons/book.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/chat.svg b/core/assets-raw/fontgen/icons/chat.svg deleted file mode 100644 index dab837b908..0000000000 --- a/core/assets-raw/fontgen/icons/chat.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/command-attack.svg b/core/assets-raw/fontgen/icons/command-attack.svg deleted file mode 100644 index ffd597b7a5..0000000000 --- a/core/assets-raw/fontgen/icons/command-attack.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/command-rally.svg b/core/assets-raw/fontgen/icons/command-rally.svg deleted file mode 100644 index b402671f69..0000000000 --- a/core/assets-raw/fontgen/icons/command-rally.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/command-retreat.svg b/core/assets-raw/fontgen/icons/command-retreat.svg deleted file mode 100644 index a608141b9b..0000000000 --- a/core/assets-raw/fontgen/icons/command-retreat.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/crafting.svg b/core/assets-raw/fontgen/icons/crafting.svg deleted file mode 100644 index 7f2e56d27c..0000000000 --- a/core/assets-raw/fontgen/icons/crafting.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/defense.svg b/core/assets-raw/fontgen/icons/defense.svg deleted file mode 100644 index 0891560c0a..0000000000 --- a/core/assets-raw/fontgen/icons/defense.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/distribution.svg b/core/assets-raw/fontgen/icons/distribution.svg deleted file mode 100644 index f60b2f7251..0000000000 --- a/core/assets-raw/fontgen/icons/distribution.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/effect.svg b/core/assets-raw/fontgen/icons/effect.svg deleted file mode 100644 index 004fecdb71..0000000000 --- a/core/assets-raw/fontgen/icons/effect.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/exit.svg b/core/assets-raw/fontgen/icons/exit.svg deleted file mode 100644 index 2a9a6ddc8f..0000000000 --- a/core/assets-raw/fontgen/icons/exit.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/fill.svg b/core/assets-raw/fontgen/icons/fill.svg deleted file mode 100644 index 4435469aac..0000000000 --- a/core/assets-raw/fontgen/icons/fill.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/hammer.svg b/core/assets-raw/fontgen/icons/hammer.svg deleted file mode 100644 index a9ec0312f5..0000000000 --- a/core/assets-raw/fontgen/icons/hammer.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/host.svg b/core/assets-raw/fontgen/icons/host.svg deleted file mode 100644 index e927c7af2f..0000000000 --- a/core/assets-raw/fontgen/icons/host.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/itchio.svg b/core/assets-raw/fontgen/icons/itchio.svg deleted file mode 100644 index d26eb1780a..0000000000 --- a/core/assets-raw/fontgen/icons/itchio.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/line.svg b/core/assets-raw/fontgen/icons/line.svg deleted file mode 100644 index 91e2e2fb29..0000000000 --- a/core/assets-raw/fontgen/icons/line.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/link.svg b/core/assets-raw/fontgen/icons/link.svg deleted file mode 100644 index 34b8a163d7..0000000000 --- a/core/assets-raw/fontgen/icons/link.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/liquid.svg b/core/assets-raw/fontgen/icons/liquid.svg deleted file mode 100644 index 6eb50596d8..0000000000 --- a/core/assets-raw/fontgen/icons/liquid.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/mode-attack.svg b/core/assets-raw/fontgen/icons/mode-attack.svg deleted file mode 100644 index cc78940688..0000000000 --- a/core/assets-raw/fontgen/icons/mode-attack.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/mode-pvp.svg b/core/assets-raw/fontgen/icons/mode-pvp.svg deleted file mode 100644 index 76c7f31f77..0000000000 --- a/core/assets-raw/fontgen/icons/mode-pvp.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/mode-survival.svg b/core/assets-raw/fontgen/icons/mode-survival.svg deleted file mode 100644 index aa5d0dcac8..0000000000 --- a/core/assets-raw/fontgen/icons/mode-survival.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/paste.svg b/core/assets-raw/fontgen/icons/paste.svg deleted file mode 100644 index 67a323b6ea..0000000000 --- a/core/assets-raw/fontgen/icons/paste.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/pencil.svg b/core/assets-raw/fontgen/icons/pencil.svg deleted file mode 100644 index f2bfa70403..0000000000 --- a/core/assets-raw/fontgen/icons/pencil.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/players.svg b/core/assets-raw/fontgen/icons/players.svg deleted file mode 100644 index 3cdfa46245..0000000000 --- a/core/assets-raw/fontgen/icons/players.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/power.svg b/core/assets-raw/fontgen/icons/power.svg deleted file mode 100644 index 6d6a5063f2..0000000000 --- a/core/assets-raw/fontgen/icons/power.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/production.svg b/core/assets-raw/fontgen/icons/production.svg deleted file mode 100644 index 74f0f882a9..0000000000 --- a/core/assets-raw/fontgen/icons/production.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/refresh.svg b/core/assets-raw/fontgen/icons/refresh.svg deleted file mode 100644 index 1cde3c7e11..0000000000 --- a/core/assets-raw/fontgen/icons/refresh.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/save.svg b/core/assets-raw/fontgen/icons/save.svg deleted file mode 100644 index d2b0776e95..0000000000 --- a/core/assets-raw/fontgen/icons/save.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/spray.svg b/core/assets-raw/fontgen/icons/spray.svg deleted file mode 100644 index a1b0cf95f7..0000000000 --- a/core/assets-raw/fontgen/icons/spray.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/terrain.svg b/core/assets-raw/fontgen/icons/terrain.svg deleted file mode 100644 index acb45bd0de..0000000000 --- a/core/assets-raw/fontgen/icons/terrain.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/trash.svg b/core/assets-raw/fontgen/icons/trash.svg deleted file mode 100644 index 22ed1dee35..0000000000 --- a/core/assets-raw/fontgen/icons/trash.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/turret.svg b/core/assets-raw/fontgen/icons/turret.svg deleted file mode 100644 index 12009fa1f3..0000000000 --- a/core/assets-raw/fontgen/icons/turret.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/units.svg b/core/assets-raw/fontgen/icons/units.svg deleted file mode 100644 index 969b63e096..0000000000 --- a/core/assets-raw/fontgen/icons/units.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/icons/upgrade.svg b/core/assets-raw/fontgen/icons/upgrade.svg deleted file mode 100644 index 9cee75f283..0000000000 --- a/core/assets-raw/fontgen/icons/upgrade.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/core/assets-raw/fontgen/merge.pe b/core/assets-raw/fontgen/merge.pe index 2dfaf77598..6e5bad0d13 100755 --- a/core/assets-raw/fontgen/merge.pe +++ b/core/assets-raw/fontgen/merge.pe @@ -1,3 +1,3 @@ -Open("core/assets/fonts/font.ttf") -MergeFonts("core/assets-raw/fontgen/out/font.ttf") -Generate("core/assets/fonts/font.ttf") +Open($2) +MergeFonts($1) +Generate($1) diff --git a/core/assets-raw/fonts/Arturito Slab_v2.ttf b/core/assets-raw/fonts/Arturito Slab_v2.ttf deleted file mode 100755 index 04096503fa..0000000000 Binary files a/core/assets-raw/fonts/Arturito Slab_v2.ttf and /dev/null differ diff --git a/core/assets-raw/fonts/EkkamaiNew-Regular.ttf b/core/assets-raw/fonts/EkkamaiNew-Regular.ttf deleted file mode 100644 index 8c3f521e80..0000000000 Binary files a/core/assets-raw/fonts/EkkamaiNew-Regular.ttf and /dev/null differ diff --git a/core/assets-raw/fonts/Exo2-Regular.ttf b/core/assets-raw/fonts/Exo2-Regular.ttf deleted file mode 100644 index 8e09f6fb43..0000000000 Binary files a/core/assets-raw/fonts/Exo2-Regular.ttf and /dev/null differ diff --git a/core/assets-raw/fonts/NanumBarunGothic.ttf b/core/assets-raw/fonts/NanumBarunGothic.ttf deleted file mode 100644 index 658cd3c239..0000000000 Binary files a/core/assets-raw/fonts/NanumBarunGothic.ttf and /dev/null differ diff --git a/core/assets-raw/fonts/OpenSansEmoji.ttf b/core/assets-raw/fonts/OpenSansEmoji.ttf deleted file mode 100644 index 57d86a62bb..0000000000 Binary files a/core/assets-raw/fonts/OpenSansEmoji.ttf and /dev/null differ diff --git a/core/assets-raw/fonts/font_latin.ttf b/core/assets-raw/fonts/font_latin.ttf deleted file mode 100644 index cebae09c33..0000000000 Binary files a/core/assets-raw/fonts/font_latin.ttf and /dev/null differ diff --git a/core/assets-raw/icons/about.png b/core/assets-raw/icons/about.png new file mode 100644 index 0000000000..3943975b97 Binary files /dev/null and b/core/assets-raw/icons/about.png differ diff --git a/core/assets-raw/icons/add.png b/core/assets-raw/icons/add.png new file mode 100644 index 0000000000..328c8ca469 Binary files /dev/null and b/core/assets-raw/icons/add.png differ diff --git a/core/assets-raw/icons/admin.png b/core/assets-raw/icons/admin.png new file mode 100644 index 0000000000..f4101c0423 Binary files /dev/null and b/core/assets-raw/icons/admin.png differ diff --git a/core/assets-raw/icons/book.png b/core/assets-raw/icons/book.png new file mode 100644 index 0000000000..a4395e4ed5 Binary files /dev/null and b/core/assets-raw/icons/book.png differ diff --git a/core/assets-raw/icons/break.png b/core/assets-raw/icons/break.png new file mode 100644 index 0000000000..c4b079735c Binary files /dev/null and b/core/assets-raw/icons/break.png differ diff --git a/core/assets-raw/icons/cancel.png b/core/assets-raw/icons/cancel.png new file mode 100644 index 0000000000..03ea12174f Binary files /dev/null and b/core/assets-raw/icons/cancel.png differ diff --git a/core/assets-raw/icons/changelog.png b/core/assets-raw/icons/changelog.png new file mode 100644 index 0000000000..e6fbf8d3c1 Binary files /dev/null and b/core/assets-raw/icons/changelog.png differ diff --git a/core/assets-raw/icons/chat.png b/core/assets-raw/icons/chat.png new file mode 100644 index 0000000000..85f52fa41c Binary files /dev/null and b/core/assets-raw/icons/chat.png differ diff --git a/core/assets-raw/icons/check.png b/core/assets-raw/icons/check.png new file mode 100644 index 0000000000..db96907362 Binary files /dev/null and b/core/assets-raw/icons/check.png differ diff --git a/core/assets-raw/icons/command-attack.png b/core/assets-raw/icons/command-attack.png new file mode 100644 index 0000000000..655f819338 Binary files /dev/null and b/core/assets-raw/icons/command-attack.png differ diff --git a/core/assets-raw/icons/command-rally.png b/core/assets-raw/icons/command-rally.png new file mode 100644 index 0000000000..4271a5a321 Binary files /dev/null and b/core/assets-raw/icons/command-rally.png differ diff --git a/core/assets-raw/icons/copy.png b/core/assets-raw/icons/copy.png new file mode 100644 index 0000000000..0f03ee5d04 Binary files /dev/null and b/core/assets-raw/icons/copy.png differ diff --git a/core/assets-raw/icons/crafting.png b/core/assets-raw/icons/crafting.png new file mode 100644 index 0000000000..3f7022e87b Binary files /dev/null and b/core/assets-raw/icons/crafting.png differ diff --git a/core/assets-raw/icons/cursor.png b/core/assets-raw/icons/cursor.png new file mode 100644 index 0000000000..1025a08a9e Binary files /dev/null and b/core/assets-raw/icons/cursor.png differ diff --git a/core/assets-raw/icons/defense.png b/core/assets-raw/icons/defense.png new file mode 100644 index 0000000000..694492a160 Binary files /dev/null and b/core/assets-raw/icons/defense.png differ diff --git a/core/assets-raw/icons/diagonal.png b/core/assets-raw/icons/diagonal.png new file mode 100644 index 0000000000..262be1cebc Binary files /dev/null and b/core/assets-raw/icons/diagonal.png differ diff --git a/core/assets-raw/icons/distribution.png b/core/assets-raw/icons/distribution.png new file mode 100644 index 0000000000..3a202b38e8 Binary files /dev/null and b/core/assets-raw/icons/distribution.png differ diff --git a/core/assets-raw/icons/donate.png b/core/assets-raw/icons/donate.png new file mode 100644 index 0000000000..cad39eb1ba Binary files /dev/null and b/core/assets-raw/icons/donate.png differ diff --git a/core/assets-raw/icons/dots.png b/core/assets-raw/icons/dots.png new file mode 100644 index 0000000000..a8d656d6cc Binary files /dev/null and b/core/assets-raw/icons/dots.png differ diff --git a/core/assets-raw/icons/download.png b/core/assets-raw/icons/download.png new file mode 100644 index 0000000000..d6f5700c7f Binary files /dev/null and b/core/assets-raw/icons/download.png differ diff --git a/core/assets-raw/icons/editor.png b/core/assets-raw/icons/editor.png new file mode 100644 index 0000000000..6cb0a64f9f Binary files /dev/null and b/core/assets-raw/icons/editor.png differ diff --git a/core/assets-raw/icons/effect.png b/core/assets-raw/icons/effect.png new file mode 100644 index 0000000000..212034645b Binary files /dev/null and b/core/assets-raw/icons/effect.png differ diff --git a/core/assets-raw/icons/elevation.png b/core/assets-raw/icons/elevation.png new file mode 100644 index 0000000000..cbc30c8cc1 Binary files /dev/null and b/core/assets-raw/icons/elevation.png differ diff --git a/core/assets-raw/icons/eraser.png b/core/assets-raw/icons/eraser.png new file mode 100644 index 0000000000..fc72acc9f2 Binary files /dev/null and b/core/assets-raw/icons/eraser.png differ diff --git a/core/assets-raw/icons/exit.png b/core/assets-raw/icons/exit.png new file mode 100644 index 0000000000..e5cc257e39 Binary files /dev/null and b/core/assets-raw/icons/exit.png differ diff --git a/core/assets-raw/icons/export.png b/core/assets-raw/icons/export.png new file mode 100644 index 0000000000..4607f74b75 Binary files /dev/null and b/core/assets-raw/icons/export.png differ diff --git a/core/assets-raw/icons/eye-off.png b/core/assets-raw/icons/eye-off.png new file mode 100644 index 0000000000..cf304c9f77 Binary files /dev/null and b/core/assets-raw/icons/eye-off.png differ diff --git a/core/assets-raw/icons/eye.png b/core/assets-raw/icons/eye.png new file mode 100644 index 0000000000..1a14383523 Binary files /dev/null and b/core/assets-raw/icons/eye.png differ diff --git a/core/assets-raw/icons/fdroid.png b/core/assets-raw/icons/fdroid.png new file mode 100644 index 0000000000..24c7cb884d Binary files /dev/null and b/core/assets-raw/icons/fdroid.png differ diff --git a/core/assets-raw/icons/file-image.png b/core/assets-raw/icons/file-image.png new file mode 100644 index 0000000000..254ea95f3d Binary files /dev/null and b/core/assets-raw/icons/file-image.png differ diff --git a/core/assets-raw/icons/file-text.png b/core/assets-raw/icons/file-text.png new file mode 100644 index 0000000000..41b4fbc342 Binary files /dev/null and b/core/assets-raw/icons/file-text.png differ diff --git a/core/assets-raw/icons/file.png b/core/assets-raw/icons/file.png new file mode 100644 index 0000000000..0f41e17cbf Binary files /dev/null and b/core/assets-raw/icons/file.png differ diff --git a/core/assets-raw/icons/fill.png b/core/assets-raw/icons/fill.png new file mode 100644 index 0000000000..79bc8b2c39 Binary files /dev/null and b/core/assets-raw/icons/fill.png differ diff --git a/core/assets-raw/icons/flip.png b/core/assets-raw/icons/flip.png new file mode 100644 index 0000000000..d81d741434 Binary files /dev/null and b/core/assets-raw/icons/flip.png differ diff --git a/core/assets-raw/icons/folder-parent.png b/core/assets-raw/icons/folder-parent.png new file mode 100644 index 0000000000..160f2be902 Binary files /dev/null and b/core/assets-raw/icons/folder-parent.png differ diff --git a/core/assets-raw/icons/folder.png b/core/assets-raw/icons/folder.png new file mode 100644 index 0000000000..c55313ef32 Binary files /dev/null and b/core/assets-raw/icons/folder.png differ diff --git a/core/assets-raw/icons/grid.png b/core/assets-raw/icons/grid.png new file mode 100644 index 0000000000..5427571a16 Binary files /dev/null and b/core/assets-raw/icons/grid.png differ diff --git a/core/assets-raw/icons/hammer.png b/core/assets-raw/icons/hammer.png new file mode 100644 index 0000000000..1ee4a5c3bf Binary files /dev/null and b/core/assets-raw/icons/hammer.png differ diff --git a/core/assets-raw/icons/home.png b/core/assets-raw/icons/home.png new file mode 100644 index 0000000000..b97dba2a11 Binary files /dev/null and b/core/assets-raw/icons/home.png differ diff --git a/core/assets-raw/icons/host.png b/core/assets-raw/icons/host.png new file mode 100644 index 0000000000..6253c986bd Binary files /dev/null and b/core/assets-raw/icons/host.png differ diff --git a/core/assets-raw/icons/info.png b/core/assets-raw/icons/info.png new file mode 100644 index 0000000000..7e2bb40037 Binary files /dev/null and b/core/assets-raw/icons/info.png differ diff --git a/core/assets-raw/icons/itchio.png b/core/assets-raw/icons/itchio.png new file mode 100644 index 0000000000..ec92eb3725 Binary files /dev/null and b/core/assets-raw/icons/itchio.png differ diff --git a/core/assets-raw/icons/item.png b/core/assets-raw/icons/item.png new file mode 100644 index 0000000000..9dd6da2249 Binary files /dev/null and b/core/assets-raw/icons/item.png differ diff --git a/core/assets-raw/icons/line.png b/core/assets-raw/icons/line.png new file mode 100644 index 0000000000..5ce2cfdc78 Binary files /dev/null and b/core/assets-raw/icons/line.png differ diff --git a/core/assets-raw/icons/link.png b/core/assets-raw/icons/link.png new file mode 100644 index 0000000000..71446afcc0 Binary files /dev/null and b/core/assets-raw/icons/link.png differ diff --git a/core/assets-raw/icons/liquid-consume.png b/core/assets-raw/icons/liquid-consume.png new file mode 100644 index 0000000000..48c93ed9d2 Binary files /dev/null and b/core/assets-raw/icons/liquid-consume.png differ diff --git a/core/assets-raw/icons/liquid.png b/core/assets-raw/icons/liquid.png new file mode 100644 index 0000000000..41fe7d5f92 Binary files /dev/null and b/core/assets-raw/icons/liquid.png differ diff --git a/core/assets-raw/icons/load-image.png b/core/assets-raw/icons/load-image.png new file mode 100644 index 0000000000..88a162b628 Binary files /dev/null and b/core/assets-raw/icons/load-image.png differ diff --git a/core/assets-raw/icons/load.png b/core/assets-raw/icons/load.png new file mode 100644 index 0000000000..ecbd0c08cf Binary files /dev/null and b/core/assets-raw/icons/load.png differ diff --git a/core/assets-raw/icons/loading.png b/core/assets-raw/icons/loading.png new file mode 100644 index 0000000000..0fd2d5265d Binary files /dev/null and b/core/assets-raw/icons/loading.png differ diff --git a/core/assets-raw/icons/lock-open.png b/core/assets-raw/icons/lock-open.png new file mode 100644 index 0000000000..36b637b0b9 Binary files /dev/null and b/core/assets-raw/icons/lock-open.png differ diff --git a/core/assets-raw/icons/lock.png b/core/assets-raw/icons/lock.png new file mode 100644 index 0000000000..cf438bcd9c Binary files /dev/null and b/core/assets-raw/icons/lock.png differ diff --git a/core/assets-raw/icons/map.png b/core/assets-raw/icons/map.png new file mode 100644 index 0000000000..92ff76d74f Binary files /dev/null and b/core/assets-raw/icons/map.png differ diff --git a/core/assets-raw/icons/menu.png b/core/assets-raw/icons/menu.png new file mode 100644 index 0000000000..0469f99721 Binary files /dev/null and b/core/assets-raw/icons/menu.png differ diff --git a/core/assets-raw/icons/missing.png b/core/assets-raw/icons/missing.png new file mode 100644 index 0000000000..6a9c5d9012 Binary files /dev/null and b/core/assets-raw/icons/missing.png differ diff --git a/core/assets-raw/icons/mode-attack.png b/core/assets-raw/icons/mode-attack.png new file mode 100644 index 0000000000..c6aac86259 Binary files /dev/null and b/core/assets-raw/icons/mode-attack.png differ diff --git a/core/assets-raw/icons/mode-pvp.png b/core/assets-raw/icons/mode-pvp.png new file mode 100644 index 0000000000..3a0c63ceb6 Binary files /dev/null and b/core/assets-raw/icons/mode-pvp.png differ diff --git a/core/assets-raw/icons/mode-survival.png b/core/assets-raw/icons/mode-survival.png new file mode 100644 index 0000000000..c88da7b3b6 Binary files /dev/null and b/core/assets-raw/icons/mode-survival.png differ diff --git a/core/assets-raw/icons/none.png b/core/assets-raw/icons/none.png new file mode 100644 index 0000000000..fcf22bc9da Binary files /dev/null and b/core/assets-raw/icons/none.png differ diff --git a/core/assets-raw/icons/paste.png b/core/assets-raw/icons/paste.png new file mode 100644 index 0000000000..606165ed34 Binary files /dev/null and b/core/assets-raw/icons/paste.png differ diff --git a/core/assets-raw/icons/pause.png b/core/assets-raw/icons/pause.png new file mode 100644 index 0000000000..7471836eaa Binary files /dev/null and b/core/assets-raw/icons/pause.png differ diff --git a/core/assets-raw/icons/pencil.png b/core/assets-raw/icons/pencil.png new file mode 100644 index 0000000000..053a283d08 Binary files /dev/null and b/core/assets-raw/icons/pencil.png differ diff --git a/core/assets-raw/icons/pick.png b/core/assets-raw/icons/pick.png new file mode 100644 index 0000000000..dfd7743030 Binary files /dev/null and b/core/assets-raw/icons/pick.png differ diff --git a/core/assets-raw/icons/planet.png b/core/assets-raw/icons/planet.png new file mode 100644 index 0000000000..6a5c136add Binary files /dev/null and b/core/assets-raw/icons/planet.png differ diff --git a/core/assets-raw/icons/play-2.png b/core/assets-raw/icons/play-2.png new file mode 100644 index 0000000000..c001e60b04 Binary files /dev/null and b/core/assets-raw/icons/play-2.png differ diff --git a/core/assets-raw/icons/play.png b/core/assets-raw/icons/play.png new file mode 100644 index 0000000000..8530e6b09d Binary files /dev/null and b/core/assets-raw/icons/play.png differ diff --git a/core/assets-raw/icons/players.png b/core/assets-raw/icons/players.png new file mode 100644 index 0000000000..be4746291f Binary files /dev/null and b/core/assets-raw/icons/players.png differ diff --git a/core/assets-raw/icons/power.png b/core/assets-raw/icons/power.png new file mode 100644 index 0000000000..149248be30 Binary files /dev/null and b/core/assets-raw/icons/power.png differ diff --git a/core/assets-raw/icons/production.png b/core/assets-raw/icons/production.png new file mode 100644 index 0000000000..fe6c3523c0 Binary files /dev/null and b/core/assets-raw/icons/production.png differ diff --git a/core/assets-raw/icons/quit.png b/core/assets-raw/icons/quit.png new file mode 100644 index 0000000000..26a9634945 Binary files /dev/null and b/core/assets-raw/icons/quit.png differ diff --git a/core/assets-raw/icons/redo.png b/core/assets-raw/icons/redo.png new file mode 100644 index 0000000000..4c53eb56ef Binary files /dev/null and b/core/assets-raw/icons/redo.png differ diff --git a/core/assets-raw/icons/refresh.png b/core/assets-raw/icons/refresh.png new file mode 100644 index 0000000000..cd1050f017 Binary files /dev/null and b/core/assets-raw/icons/refresh.png differ diff --git a/core/assets-raw/icons/rename.png b/core/assets-raw/icons/rename.png new file mode 100644 index 0000000000..4a6731a31b Binary files /dev/null and b/core/assets-raw/icons/rename.png differ diff --git a/core/assets-raw/icons/resize.png b/core/assets-raw/icons/resize.png new file mode 100644 index 0000000000..ee53c8470f Binary files /dev/null and b/core/assets-raw/icons/resize.png differ diff --git a/core/assets-raw/icons/rotate-arrow.png b/core/assets-raw/icons/rotate-arrow.png new file mode 100644 index 0000000000..22039f3020 Binary files /dev/null and b/core/assets-raw/icons/rotate-arrow.png differ diff --git a/core/assets-raw/icons/rotate-left.png b/core/assets-raw/icons/rotate-left.png new file mode 100644 index 0000000000..9b05efec5f Binary files /dev/null and b/core/assets-raw/icons/rotate-left.png differ diff --git a/core/assets-raw/icons/rotate-right.png b/core/assets-raw/icons/rotate-right.png new file mode 100644 index 0000000000..2009c9394d Binary files /dev/null and b/core/assets-raw/icons/rotate-right.png differ diff --git a/core/assets-raw/icons/rotate.png b/core/assets-raw/icons/rotate.png new file mode 100644 index 0000000000..3c989a555f Binary files /dev/null and b/core/assets-raw/icons/rotate.png differ diff --git a/core/assets-raw/icons/save-image.png b/core/assets-raw/icons/save-image.png new file mode 100644 index 0000000000..5234c4f2f4 Binary files /dev/null and b/core/assets-raw/icons/save-image.png differ diff --git a/core/assets-raw/icons/save.png b/core/assets-raw/icons/save.png new file mode 100644 index 0000000000..e8ba657ab7 Binary files /dev/null and b/core/assets-raw/icons/save.png differ diff --git a/core/assets-raw/icons/search.png b/core/assets-raw/icons/search.png new file mode 100644 index 0000000000..02736c1a4b Binary files /dev/null and b/core/assets-raw/icons/search.png differ diff --git a/core/assets-raw/icons/settings.png b/core/assets-raw/icons/settings.png new file mode 100644 index 0000000000..2653418e19 Binary files /dev/null and b/core/assets-raw/icons/settings.png differ diff --git a/core/assets-raw/icons/spray.png b/core/assets-raw/icons/spray.png new file mode 100644 index 0000000000..17198d657b Binary files /dev/null and b/core/assets-raw/icons/spray.png differ diff --git a/core/assets-raw/icons/terrain.png b/core/assets-raw/icons/terrain.png new file mode 100644 index 0000000000..a9bd73972e Binary files /dev/null and b/core/assets-raw/icons/terrain.png differ diff --git a/core/assets-raw/icons/tools.png b/core/assets-raw/icons/tools.png new file mode 100644 index 0000000000..2ece1ae8f4 Binary files /dev/null and b/core/assets-raw/icons/tools.png differ diff --git a/core/assets-raw/icons/trash-16.png b/core/assets-raw/icons/trash-16.png new file mode 100644 index 0000000000..a1de49233b Binary files /dev/null and b/core/assets-raw/icons/trash-16.png differ diff --git a/core/assets-raw/icons/trash.png b/core/assets-raw/icons/trash.png new file mode 100644 index 0000000000..e0f419f2f3 Binary files /dev/null and b/core/assets-raw/icons/trash.png differ diff --git a/core/assets-raw/icons/tree.png b/core/assets-raw/icons/tree.png new file mode 100644 index 0000000000..0901a7a721 Binary files /dev/null and b/core/assets-raw/icons/tree.png differ diff --git a/core/assets-raw/icons/turret.png b/core/assets-raw/icons/turret.png new file mode 100644 index 0000000000..32fd01b464 Binary files /dev/null and b/core/assets-raw/icons/turret.png differ diff --git a/core/assets-raw/icons/tutorial.png b/core/assets-raw/icons/tutorial.png new file mode 100644 index 0000000000..40ba90a5e4 Binary files /dev/null and b/core/assets-raw/icons/tutorial.png differ diff --git a/core/assets-raw/icons/undo.png b/core/assets-raw/icons/undo.png new file mode 100644 index 0000000000..cf5dd4c154 Binary files /dev/null and b/core/assets-raw/icons/undo.png differ diff --git a/core/assets-raw/icons/units.png b/core/assets-raw/icons/units.png new file mode 100644 index 0000000000..1ee9cd9f55 Binary files /dev/null and b/core/assets-raw/icons/units.png differ diff --git a/core/assets-raw/icons/upload.png b/core/assets-raw/icons/upload.png new file mode 100644 index 0000000000..b8e4c1d725 Binary files /dev/null and b/core/assets-raw/icons/upload.png differ diff --git a/core/assets-raw/sprites/blocks/campaign/interplanetary-accelerator-team.png b/core/assets-raw/sprites/blocks/campaign/interplanetary-accelerator-team.png new file mode 100644 index 0000000000..e141d97940 Binary files /dev/null and b/core/assets-raw/sprites/blocks/campaign/interplanetary-accelerator-team.png differ diff --git a/core/assets-raw/sprites/blocks/campaign/interplanetary-accelerator.png b/core/assets-raw/sprites/blocks/campaign/interplanetary-accelerator.png new file mode 100644 index 0000000000..41019a2c7d Binary files /dev/null and b/core/assets-raw/sprites/blocks/campaign/interplanetary-accelerator.png differ diff --git a/core/assets-raw/sprites/blocks/campaign/launch-pad-large.png b/core/assets-raw/sprites/blocks/campaign/launch-pad-large.png deleted file mode 100644 index ac04aef1c4..0000000000 Binary files a/core/assets-raw/sprites/blocks/campaign/launch-pad-large.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/campaign/payload-launch-pad-light.png b/core/assets-raw/sprites/blocks/campaign/payload-launch-pad-light.png new file mode 100644 index 0000000000..bf9ab10863 Binary files /dev/null and b/core/assets-raw/sprites/blocks/campaign/payload-launch-pad-light.png differ diff --git a/core/assets-raw/sprites/blocks/campaign/payload-launch-pad.png b/core/assets-raw/sprites/blocks/campaign/payload-launch-pad.png new file mode 100644 index 0000000000..ec96499d67 Binary files /dev/null and b/core/assets-raw/sprites/blocks/campaign/payload-launch-pad.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-0.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-0.png new file mode 100644 index 0000000000..329fc2f756 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-1.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-1.png new file mode 100644 index 0000000000..6e793c7cac Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-2.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-2.png new file mode 100644 index 0000000000..a2dd7b5e0c Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-3.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-3.png new file mode 100644 index 0000000000..a2dd7b5e0c Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-4.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-4.png new file mode 100644 index 0000000000..a2dd7b5e0c Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom-4.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom.png new file mode 100644 index 0000000000..04cecf2c96 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-arrow.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-arrow.png new file mode 100644 index 0000000000..f47060e98c Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-arrow.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-bridge-bottom.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-bridge-bottom.png new file mode 100644 index 0000000000..16256794a0 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-bridge-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-bridge.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-bridge.png new file mode 100644 index 0000000000..ff853cecf6 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-bridge.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-dir.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-dir.png new file mode 100644 index 0000000000..8349ac6837 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge-dir.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge.png new file mode 100644 index 0000000000..428785c66c Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-bridge.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-router-top.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-router-top.png new file mode 100644 index 0000000000..f93d8639c9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-router-top.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-router.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-router.png new file mode 100644 index 0000000000..428785c66c Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-router.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-0.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-0.png new file mode 100644 index 0000000000..04cd2abceb Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-1.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-1.png new file mode 100644 index 0000000000..2e1b8c091e Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-2.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-2.png new file mode 100644 index 0000000000..10fde0b35b Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-3.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-3.png new file mode 100644 index 0000000000..491efae7c9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-4.png b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-4.png new file mode 100644 index 0000000000..adad9a7fc6 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/duct-top-4.png differ diff --git a/core/assets-raw/sprites/blocks/drills/drill-top.png b/core/assets-raw/sprites/blocks/drills/drill-item-2.png similarity index 100% rename from core/assets-raw/sprites/blocks/drills/drill-top.png rename to core/assets-raw/sprites/blocks/drills/drill-item-2.png diff --git a/core/assets-raw/sprites/blocks/drills/drill-item-3.png b/core/assets-raw/sprites/blocks/drills/drill-item-3.png new file mode 100644 index 0000000000..ed716408b2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/drills/drill-item-3.png differ diff --git a/core/assets-raw/sprites/blocks/drills/drill-item-4.png b/core/assets-raw/sprites/blocks/drills/drill-item-4.png new file mode 100644 index 0000000000..a18efb5dd4 Binary files /dev/null and b/core/assets-raw/sprites/blocks/drills/drill-item-4.png differ diff --git a/core/assets-raw/sprites/blocks/drills/oil-extractor-liquid.png b/core/assets-raw/sprites/blocks/drills/oil-extractor-liquid.png index 9a058e3fc9..6639f0889b 100644 Binary files a/core/assets-raw/sprites/blocks/drills/oil-extractor-liquid.png and b/core/assets-raw/sprites/blocks/drills/oil-extractor-liquid.png differ diff --git a/core/assets-raw/sprites/blocks/environment/char1.png b/core/assets-raw/sprites/blocks/environment/char1.png index d8a1dae14f..e7e7f42580 100644 Binary files a/core/assets-raw/sprites/blocks/environment/char1.png and b/core/assets-raw/sprites/blocks/environment/char1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/char2.png b/core/assets-raw/sprites/blocks/environment/char2.png index c37787ba4f..c418289e48 100644 Binary files a/core/assets-raw/sprites/blocks/environment/char2.png and b/core/assets-raw/sprites/blocks/environment/char2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/char3.png b/core/assets-raw/sprites/blocks/environment/char3.png index c45e69823a..cfb54e0ea0 100644 Binary files a/core/assets-raw/sprites/blocks/environment/char3.png and b/core/assets-raw/sprites/blocks/environment/char3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff.png b/core/assets-raw/sprites/blocks/environment/cliff.png index 9d76c62084..0ea51ef09b 100644 Binary files a/core/assets-raw/sprites/blocks/environment/cliff.png and b/core/assets-raw/sprites/blocks/environment/cliff.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff0.png b/core/assets-raw/sprites/blocks/environment/cliff0.png new file mode 100644 index 0000000000..17b24f68e1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff0.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff1.png b/core/assets-raw/sprites/blocks/environment/cliff1.png new file mode 100644 index 0000000000..03ff8dbf3d Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff2.png b/core/assets-raw/sprites/blocks/environment/cliff2.png new file mode 100644 index 0000000000..dbf002cee5 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff3.png b/core/assets-raw/sprites/blocks/environment/cliff3.png new file mode 100644 index 0000000000..e78a6f27ce Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff4.png b/core/assets-raw/sprites/blocks/environment/cliff4.png new file mode 100644 index 0000000000..7800c59677 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff4.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff5.png b/core/assets-raw/sprites/blocks/environment/cliff5.png new file mode 100644 index 0000000000..2e71f802f2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff5.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff6.png b/core/assets-raw/sprites/blocks/environment/cliff6.png new file mode 100644 index 0000000000..fceb598e3e Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff6.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff7.png b/core/assets-raw/sprites/blocks/environment/cliff7.png new file mode 100644 index 0000000000..5978387bbe Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff7.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dune-wall-large.png b/core/assets-raw/sprites/blocks/environment/dune-wall-large.png index 23082592c7..9966c564e9 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dune-wall-large.png and b/core/assets-raw/sprites/blocks/environment/dune-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dune-wall1.png b/core/assets-raw/sprites/blocks/environment/dune-wall1.png index 923945dd74..fbd9cb8090 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dune-wall1.png and b/core/assets-raw/sprites/blocks/environment/dune-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dune-wall2.png b/core/assets-raw/sprites/blocks/environment/dune-wall2.png index 85783da449..5e3efcaae0 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dune-wall2.png and b/core/assets-raw/sprites/blocks/environment/dune-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/edgier.png b/core/assets-raw/sprites/blocks/environment/edgier.png deleted file mode 100644 index 0e4e66c84c..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/edgier.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/env-error.png b/core/assets-raw/sprites/blocks/environment/env-error.png new file mode 100644 index 0000000000..b72971ab8a Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/env-error.png differ diff --git a/core/assets-raw/sprites/blocks/environment/ice-snow1.png b/core/assets-raw/sprites/blocks/environment/ice-snow1.png index ee593e9f64..d2010a0106 100644 Binary files a/core/assets-raw/sprites/blocks/environment/ice-snow1.png and b/core/assets-raw/sprites/blocks/environment/ice-snow1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/ice-snow2.png b/core/assets-raw/sprites/blocks/environment/ice-snow2.png index a9ffcf1088..5a0d5458d4 100644 Binary files a/core/assets-raw/sprites/blocks/environment/ice-snow2.png and b/core/assets-raw/sprites/blocks/environment/ice-snow2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/ice-snow3.png b/core/assets-raw/sprites/blocks/environment/ice-snow3.png index f38d778b29..4375ee7139 100644 Binary files a/core/assets-raw/sprites/blocks/environment/ice-snow3.png and b/core/assets-raw/sprites/blocks/environment/ice-snow3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/metal-floor.png b/core/assets-raw/sprites/blocks/environment/metal-floor.png index f60eff075e..a4fe16e944 100644 Binary files a/core/assets-raw/sprites/blocks/environment/metal-floor.png and b/core/assets-raw/sprites/blocks/environment/metal-floor.png differ diff --git a/core/assets-raw/sprites/blocks/environment/space.png b/core/assets-raw/sprites/blocks/environment/space.png new file mode 100644 index 0000000000..bc38442fd1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/space.png differ diff --git a/core/assets-raw/sprites/blocks/environment/spawn.png b/core/assets-raw/sprites/blocks/environment/spawn.png index dc1a4c30a7..2267baba5e 100644 Binary files a/core/assets-raw/sprites/blocks/environment/spawn.png and b/core/assets-raw/sprites/blocks/environment/spawn.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire0.png b/core/assets-raw/sprites/blocks/fire/fire0.png new file mode 100644 index 0000000000..d9e1db18e6 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire0.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire1.png b/core/assets-raw/sprites/blocks/fire/fire1.png new file mode 100644 index 0000000000..d3026cedd2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire1.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire10.png b/core/assets-raw/sprites/blocks/fire/fire10.png new file mode 100644 index 0000000000..b55606ede5 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire10.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire11.png b/core/assets-raw/sprites/blocks/fire/fire11.png new file mode 100644 index 0000000000..4602c384ed Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire11.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire12.png b/core/assets-raw/sprites/blocks/fire/fire12.png new file mode 100644 index 0000000000..3860c2ce1d Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire12.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire13.png b/core/assets-raw/sprites/blocks/fire/fire13.png new file mode 100644 index 0000000000..27e48033ad Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire13.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire14.png b/core/assets-raw/sprites/blocks/fire/fire14.png new file mode 100644 index 0000000000..0cc1071961 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire14.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire15.png b/core/assets-raw/sprites/blocks/fire/fire15.png new file mode 100644 index 0000000000..717130d434 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire15.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire16.png b/core/assets-raw/sprites/blocks/fire/fire16.png new file mode 100644 index 0000000000..7e61b28a69 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire16.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire17.png b/core/assets-raw/sprites/blocks/fire/fire17.png new file mode 100644 index 0000000000..5de74405a2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire17.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire18.png b/core/assets-raw/sprites/blocks/fire/fire18.png new file mode 100644 index 0000000000..cdf83dfab6 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire18.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire19.png b/core/assets-raw/sprites/blocks/fire/fire19.png new file mode 100644 index 0000000000..e79a1538e9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire19.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire2.png b/core/assets-raw/sprites/blocks/fire/fire2.png new file mode 100644 index 0000000000..0b6ffb4c50 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire2.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire20.png b/core/assets-raw/sprites/blocks/fire/fire20.png new file mode 100644 index 0000000000..5d974a427b Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire20.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire21.png b/core/assets-raw/sprites/blocks/fire/fire21.png new file mode 100644 index 0000000000..409d597aa7 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire21.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire22.png b/core/assets-raw/sprites/blocks/fire/fire22.png new file mode 100644 index 0000000000..5bbd4b93d7 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire22.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire23.png b/core/assets-raw/sprites/blocks/fire/fire23.png new file mode 100644 index 0000000000..85ede17d2f Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire23.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire24.png b/core/assets-raw/sprites/blocks/fire/fire24.png new file mode 100644 index 0000000000..5544ee65e8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire24.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire25.png b/core/assets-raw/sprites/blocks/fire/fire25.png new file mode 100644 index 0000000000..989beef8e7 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire25.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire26.png b/core/assets-raw/sprites/blocks/fire/fire26.png new file mode 100644 index 0000000000..b0eb8eff34 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire26.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire27.png b/core/assets-raw/sprites/blocks/fire/fire27.png new file mode 100644 index 0000000000..e76de8c346 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire27.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire28.png b/core/assets-raw/sprites/blocks/fire/fire28.png new file mode 100644 index 0000000000..464e0c3797 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire28.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire29.png b/core/assets-raw/sprites/blocks/fire/fire29.png new file mode 100644 index 0000000000..2342d9a35a Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire29.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire3.png b/core/assets-raw/sprites/blocks/fire/fire3.png new file mode 100644 index 0000000000..0d99250e41 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire3.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire30.png b/core/assets-raw/sprites/blocks/fire/fire30.png new file mode 100644 index 0000000000..88cb4a0bc2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire30.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire31.png b/core/assets-raw/sprites/blocks/fire/fire31.png new file mode 100644 index 0000000000..ea83d1566b Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire31.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire32.png b/core/assets-raw/sprites/blocks/fire/fire32.png new file mode 100644 index 0000000000..e69ca2dd68 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire32.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire33.png b/core/assets-raw/sprites/blocks/fire/fire33.png new file mode 100644 index 0000000000..a76b48aed2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire33.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire34.png b/core/assets-raw/sprites/blocks/fire/fire34.png new file mode 100644 index 0000000000..57544d4292 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire34.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire35.png b/core/assets-raw/sprites/blocks/fire/fire35.png new file mode 100644 index 0000000000..4a9f15335d Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire35.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire36.png b/core/assets-raw/sprites/blocks/fire/fire36.png new file mode 100644 index 0000000000..bec029e19a Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire36.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire37.png b/core/assets-raw/sprites/blocks/fire/fire37.png new file mode 100644 index 0000000000..c94dd0d01e Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire37.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire38.png b/core/assets-raw/sprites/blocks/fire/fire38.png new file mode 100644 index 0000000000..c9f23580f9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire38.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire39.png b/core/assets-raw/sprites/blocks/fire/fire39.png new file mode 100644 index 0000000000..fe133c0794 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire39.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire4.png b/core/assets-raw/sprites/blocks/fire/fire4.png new file mode 100644 index 0000000000..f0b83d2d55 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire4.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire5.png b/core/assets-raw/sprites/blocks/fire/fire5.png new file mode 100644 index 0000000000..fe58e31e52 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire5.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire6.png b/core/assets-raw/sprites/blocks/fire/fire6.png new file mode 100644 index 0000000000..0e2a45ff80 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire6.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire7.png b/core/assets-raw/sprites/blocks/fire/fire7.png new file mode 100644 index 0000000000..b74acf05a5 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire7.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire8.png b/core/assets-raw/sprites/blocks/fire/fire8.png new file mode 100644 index 0000000000..461e0cbc76 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire8.png differ diff --git a/core/assets-raw/sprites/blocks/fire/fire9.png b/core/assets-raw/sprites/blocks/fire/fire9.png new file mode 100644 index 0000000000..f306ed27e7 Binary files /dev/null and b/core/assets-raw/sprites/blocks/fire/fire9.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/conduit-bottom.png b/core/assets-raw/sprites/blocks/liquid/conduit-bottom.png index f2f7dfdd99..04cecf2c96 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/conduit-bottom.png and b/core/assets-raw/sprites/blocks/liquid/conduit-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/phase-conduit.png b/core/assets-raw/sprites/blocks/liquid/phase-conduit.png index ec2633c5cc..402c082bc3 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/phase-conduit.png and b/core/assets-raw/sprites/blocks/liquid/phase-conduit.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png index 4d6438c432..d19202db4e 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png index 40189f33c0..c231c324b1 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png index bb72269c7c..233badb748 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png index f1c3d4fa22..25ade8b128 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png index be533536a7..a131889d9f 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-1.png b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-1.png index 4db953390c..dbbd8d9242 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-1.png and b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-1.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-2.png b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-2.png index 78a57e8f64..9fd3100e44 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-2.png and b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-2.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-3.png b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-3.png index b45e11ccf4..d15e254baf 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-3.png and b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-3.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-4.png b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-4.png index f4e6379a31..3cc7dbc525 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-4.png and b/core/assets-raw/sprites/blocks/liquid/pulse-conduit-top-4.png differ diff --git a/core/assets-raw/sprites/blocks/production/block-forge.png b/core/assets-raw/sprites/blocks/payload/block-forge.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/block-forge.png rename to core/assets-raw/sprites/blocks/payload/block-forge.png diff --git a/core/assets-raw/sprites/blocks/distribution/block-loader.png b/core/assets-raw/sprites/blocks/payload/block-loader.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/block-loader.png rename to core/assets-raw/sprites/blocks/payload/block-loader.png diff --git a/core/assets-raw/sprites/blocks/distribution/block-unloader.png b/core/assets-raw/sprites/blocks/payload/block-unloader.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/block-unloader.png rename to core/assets-raw/sprites/blocks/payload/block-unloader.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-conveyor-edge.png b/core/assets-raw/sprites/blocks/payload/payload-conveyor-edge.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-conveyor-edge.png rename to core/assets-raw/sprites/blocks/payload/payload-conveyor-edge.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-conveyor-icon.png b/core/assets-raw/sprites/blocks/payload/payload-conveyor-icon.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-conveyor-icon.png rename to core/assets-raw/sprites/blocks/payload/payload-conveyor-icon.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-conveyor-top.png b/core/assets-raw/sprites/blocks/payload/payload-conveyor-top.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-conveyor-top.png rename to core/assets-raw/sprites/blocks/payload/payload-conveyor-top.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-conveyor.png b/core/assets-raw/sprites/blocks/payload/payload-conveyor.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-conveyor.png rename to core/assets-raw/sprites/blocks/payload/payload-conveyor.png diff --git a/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-base.png b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-base.png new file mode 100644 index 0000000000..22f0f40623 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-base.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-cap.png b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-cap.png new file mode 100644 index 0000000000..ed5066a871 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-cap.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-left.png b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-left.png new file mode 100644 index 0000000000..ac79f7b59b Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-left.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-right.png b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-right.png new file mode 100644 index 0000000000..0bb4969d84 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-right.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-top.png b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-top.png new file mode 100644 index 0000000000..2e40b34e97 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower-top.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower.png b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower.png new file mode 100644 index 0000000000..d66a166412 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-propulsion-tower.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/payload-router-edge.png b/core/assets-raw/sprites/blocks/payload/payload-router-edge.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-router-edge.png rename to core/assets-raw/sprites/blocks/payload/payload-router-edge.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-router-icon.png b/core/assets-raw/sprites/blocks/payload/payload-router-icon.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-router-icon.png rename to core/assets-raw/sprites/blocks/payload/payload-router-icon.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-router-over.png b/core/assets-raw/sprites/blocks/payload/payload-router-over.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-router-over.png rename to core/assets-raw/sprites/blocks/payload/payload-router-over.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-router-top.png b/core/assets-raw/sprites/blocks/payload/payload-router-top.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-router-top.png rename to core/assets-raw/sprites/blocks/payload/payload-router-top.png diff --git a/core/assets-raw/sprites/blocks/distribution/payload-router.png b/core/assets-raw/sprites/blocks/payload/payload-router.png similarity index 100% rename from core/assets-raw/sprites/blocks/distribution/payload-router.png rename to core/assets-raw/sprites/blocks/payload/payload-router.png diff --git a/core/assets-raw/sprites/blocks/payload/payload-source-top.png b/core/assets-raw/sprites/blocks/payload/payload-source-top.png new file mode 100644 index 0000000000..2de4c170be Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-source-top.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-source.png b/core/assets-raw/sprites/blocks/payload/payload-source.png new file mode 100644 index 0000000000..4c6b7b2070 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-source.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-void-top.png b/core/assets-raw/sprites/blocks/payload/payload-void-top.png new file mode 100644 index 0000000000..f334d23032 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-void-top.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-void.png b/core/assets-raw/sprites/blocks/payload/payload-void.png new file mode 100644 index 0000000000..4c6b7b2070 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-void.png differ diff --git a/core/assets-raw/sprites/blocks/power/solar-panel-large.png b/core/assets-raw/sprites/blocks/power/solar-panel-large.png index d520d3cbf5..60526693a6 100644 Binary files a/core/assets-raw/sprites/blocks/power/solar-panel-large.png and b/core/assets-raw/sprites/blocks/power/solar-panel-large.png differ diff --git a/core/assets-raw/sprites/blocks/production/blast-mixer.png b/core/assets-raw/sprites/blocks/production/blast-mixer.png index 9effafb9c8..52e7a3020e 100644 Binary files a/core/assets-raw/sprites/blocks/production/blast-mixer.png and b/core/assets-raw/sprites/blocks/production/blast-mixer.png differ diff --git a/core/assets-raw/sprites/blocks/props/basalt-boulder1.png b/core/assets-raw/sprites/blocks/props/basalt-boulder1.png new file mode 100644 index 0000000000..f88209e5ee Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/basalt-boulder1.png differ diff --git a/core/assets-raw/sprites/blocks/props/basalt-boulder2.png b/core/assets-raw/sprites/blocks/props/basalt-boulder2.png new file mode 100644 index 0000000000..7c19c928ac Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/basalt-boulder2.png differ diff --git a/core/assets-raw/sprites/blocks/storage/container.png b/core/assets-raw/sprites/blocks/storage/container.png index 959e2b6edf..038adbcd82 100644 Binary files a/core/assets-raw/sprites/blocks/storage/container.png and b/core/assets-raw/sprites/blocks/storage/container.png differ diff --git a/core/assets-raw/sprites/blocks/storage/vault.png b/core/assets-raw/sprites/blocks/storage/vault.png index 36a4ee5ea5..150f9acf24 100644 Binary files a/core/assets-raw/sprites/blocks/storage/vault.png and b/core/assets-raw/sprites/blocks/storage/vault.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in-3.png b/core/assets-raw/sprites/blocks/units/factory-in-3.png index 625be61764..7944814739 100644 Binary files a/core/assets-raw/sprites/blocks/units/factory-in-3.png and b/core/assets-raw/sprites/blocks/units/factory-in-3.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in-5.png b/core/assets-raw/sprites/blocks/units/factory-in-5.png index f158423ff6..785faba9cf 100644 Binary files a/core/assets-raw/sprites/blocks/units/factory-in-5.png and b/core/assets-raw/sprites/blocks/units/factory-in-5.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in-7.png b/core/assets-raw/sprites/blocks/units/factory-in-7.png index 39477c61cd..1861a46c35 100644 Binary files a/core/assets-raw/sprites/blocks/units/factory-in-7.png and b/core/assets-raw/sprites/blocks/units/factory-in-7.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in-9.png b/core/assets-raw/sprites/blocks/units/factory-in-9.png index 6a3b324f1b..acf736c8dd 100644 Binary files a/core/assets-raw/sprites/blocks/units/factory-in-9.png and b/core/assets-raw/sprites/blocks/units/factory-in-9.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-out-5.png b/core/assets-raw/sprites/blocks/units/factory-out-5.png index 801f1ce6f9..b82842d043 100644 Binary files a/core/assets-raw/sprites/blocks/units/factory-out-5.png and b/core/assets-raw/sprites/blocks/units/factory-out-5.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-top-5.png b/core/assets-raw/sprites/blocks/units/factory-top-5.png new file mode 100644 index 0000000000..d48314ce89 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-top-5.png differ diff --git a/core/assets-raw/sprites/blocks/units/repair-point.png b/core/assets-raw/sprites/blocks/units/repair-point.png index 2cadeae5cb..f3c0a07472 100644 Binary files a/core/assets-raw/sprites/blocks/units/repair-point.png and b/core/assets-raw/sprites/blocks/units/repair-point.png differ diff --git a/core/assets-raw/sprites/blocks/units/repair-turret.png b/core/assets-raw/sprites/blocks/units/repair-turret.png new file mode 100644 index 0000000000..4cc4ffc5bd Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/repair-turret.png differ diff --git a/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png index deba4e9988..ed8121b6b9 100644 Binary files a/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png and b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-gigantic.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-gigantic.png index a5ed4a3117..18bc9504f9 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-gigantic.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-gigantic.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge1.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge1.png index 4a23912802..fff20289a7 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge1.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge1.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge2.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge2.png index aa87272b1c..b3a4c16814 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge2.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge2.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge3.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge3.png index 04f1382d4d..9c323a3b95 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge3.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge3.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large1.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large1.png index 6f5b66a672..289f3ad410 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-large1.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-large1.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large2.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large2.png index d271f8e16a..5785da4328 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-large2.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-large2.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large3.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large3.png index 89bdcffae7..ef8b6e12cc 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-large3.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-large3.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large4.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large4.png index ef76eb0c51..b437560aeb 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall-large4.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall-large4.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall1.png b/core/assets-raw/sprites/blocks/walls/scrap-wall1.png index b0be0f2747..9b12ddf8d9 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall1.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall2.png b/core/assets-raw/sprites/blocks/walls/scrap-wall2.png index 078bd13aa2..8869a48f20 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall2.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall3.png b/core/assets-raw/sprites/blocks/walls/scrap-wall3.png index de2e17d6f2..16dc56390a 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall3.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall3.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall4.png b/core/assets-raw/sprites/blocks/walls/scrap-wall4.png index 0cd3df9ca4..c67a5055b4 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall4.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall4.png differ diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall5.png b/core/assets-raw/sprites/blocks/walls/scrap-wall5.png index 0cd3df9ca4..ac533dc4d6 100644 Binary files a/core/assets-raw/sprites/blocks/walls/scrap-wall5.png and b/core/assets-raw/sprites/blocks/walls/scrap-wall5.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thruster-top.png b/core/assets-raw/sprites/blocks/walls/thruster-top.png new file mode 100644 index 0000000000..0a6bf7f616 Binary files /dev/null and b/core/assets-raw/sprites/blocks/walls/thruster-top.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thruster.png b/core/assets-raw/sprites/blocks/walls/thruster.png index 0725cc31b2..90be6bbc53 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thruster.png and b/core/assets-raw/sprites/blocks/walls/thruster.png differ diff --git a/core/assets-raw/sprites/effects/circle-bullet-back.png b/core/assets-raw/sprites/effects/circle-bullet-back.png new file mode 100644 index 0000000000..e08bfeae85 Binary files /dev/null and b/core/assets-raw/sprites/effects/circle-bullet-back.png differ diff --git a/core/assets-raw/sprites/effects/circle-bullet.png b/core/assets-raw/sprites/effects/circle-bullet.png new file mode 100644 index 0000000000..3039f67c85 Binary files /dev/null and b/core/assets-raw/sprites/effects/circle-bullet.png differ diff --git a/core/assets-raw/sprites/effects/laser-top-end.png b/core/assets-raw/sprites/effects/laser-top-end.png new file mode 100644 index 0000000000..5f4b05e6a9 Binary files /dev/null and b/core/assets-raw/sprites/effects/laser-top-end.png differ diff --git a/core/assets-raw/sprites/effects/laser-top.png b/core/assets-raw/sprites/effects/laser-top.png new file mode 100644 index 0000000000..c50f6d69a6 Binary files /dev/null and b/core/assets-raw/sprites/effects/laser-top.png differ diff --git a/core/assets-raw/sprites/effects/laser-white-end.png b/core/assets-raw/sprites/effects/laser-white-end.png new file mode 100644 index 0000000000..1e6aeffcc5 Binary files /dev/null and b/core/assets-raw/sprites/effects/laser-white-end.png differ diff --git a/core/assets-raw/sprites/effects/laser-white.png b/core/assets-raw/sprites/effects/laser-white.png new file mode 100644 index 0000000000..13ac448bbe Binary files /dev/null and b/core/assets-raw/sprites/effects/laser-white.png differ diff --git a/core/assets-raw/sprites/effects/launch-arrow.png b/core/assets-raw/sprites/effects/launch-arrow.png new file mode 100644 index 0000000000..5faa4ae6c7 Binary files /dev/null and b/core/assets-raw/sprites/effects/launch-arrow.png differ diff --git a/core/assets-raw/sprites/effects/mine-bullet-back.png b/core/assets-raw/sprites/effects/mine-bullet-back.png new file mode 100644 index 0000000000..33738a0c4d Binary files /dev/null and b/core/assets-raw/sprites/effects/mine-bullet-back.png differ diff --git a/core/assets-raw/sprites/effects/mine-bullet.png b/core/assets-raw/sprites/effects/mine-bullet.png new file mode 100644 index 0000000000..9525c22bfc Binary files /dev/null and b/core/assets-raw/sprites/effects/mine-bullet.png differ diff --git a/core/assets-raw/sprites/effects/missile-large-back.png b/core/assets-raw/sprites/effects/missile-large-back.png new file mode 100644 index 0000000000..bc3d3c2ef4 Binary files /dev/null and b/core/assets-raw/sprites/effects/missile-large-back.png differ diff --git a/core/assets-raw/sprites/effects/missile-large.png b/core/assets-raw/sprites/effects/missile-large.png new file mode 100644 index 0000000000..f1353b6b2e Binary files /dev/null and b/core/assets-raw/sprites/effects/missile-large.png differ diff --git a/core/assets-raw/sprites/effects/select-arrow.png b/core/assets-raw/sprites/effects/select-arrow.png new file mode 100644 index 0000000000..41c2608d8b Binary files /dev/null and b/core/assets-raw/sprites/effects/select-arrow.png differ diff --git a/core/assets-raw/sprites/items/item-blast-compound.png b/core/assets-raw/sprites/items/item-blast-compound.png index cc45da15db..1b103c7c9d 100644 Binary files a/core/assets-raw/sprites/items/item-blast-compound.png and b/core/assets-raw/sprites/items/item-blast-compound.png differ diff --git a/core/assets-raw/sprites/items/item-coal.png b/core/assets-raw/sprites/items/item-coal.png index 13df71b603..4f67e0a80e 100644 Binary files a/core/assets-raw/sprites/items/item-coal.png and b/core/assets-raw/sprites/items/item-coal.png differ diff --git a/core/assets-raw/sprites/items/item-copper.png b/core/assets-raw/sprites/items/item-copper.png index 74f6bd94ed..e35ef78511 100644 Binary files a/core/assets-raw/sprites/items/item-copper.png and b/core/assets-raw/sprites/items/item-copper.png differ diff --git a/core/assets-raw/sprites/items/item-graphite.png b/core/assets-raw/sprites/items/item-graphite.png index 47bbcb1506..a6cbb3454a 100644 Binary files a/core/assets-raw/sprites/items/item-graphite.png and b/core/assets-raw/sprites/items/item-graphite.png differ diff --git a/core/assets-raw/sprites/items/item-lead.png b/core/assets-raw/sprites/items/item-lead.png index 35595097ca..f42443997b 100644 Binary files a/core/assets-raw/sprites/items/item-lead.png and b/core/assets-raw/sprites/items/item-lead.png differ diff --git a/core/assets-raw/sprites/items/item-metaglass.png b/core/assets-raw/sprites/items/item-metaglass.png index 6b6d36240f..4707552a2c 100644 Binary files a/core/assets-raw/sprites/items/item-metaglass.png and b/core/assets-raw/sprites/items/item-metaglass.png differ diff --git a/core/assets-raw/sprites/items/item-phase-fabric.png b/core/assets-raw/sprites/items/item-phase-fabric.png index 174215dd86..8dd6efca38 100644 Binary files a/core/assets-raw/sprites/items/item-phase-fabric.png and b/core/assets-raw/sprites/items/item-phase-fabric.png differ diff --git a/core/assets-raw/sprites/items/item-plastanium.png b/core/assets-raw/sprites/items/item-plastanium.png index 3d51e7562e..eb5b69d374 100644 Binary files a/core/assets-raw/sprites/items/item-plastanium.png and b/core/assets-raw/sprites/items/item-plastanium.png differ diff --git a/core/assets-raw/sprites/items/item-pyratite.png b/core/assets-raw/sprites/items/item-pyratite.png index 77012a522d..987fdca8c0 100644 Binary files a/core/assets-raw/sprites/items/item-pyratite.png and b/core/assets-raw/sprites/items/item-pyratite.png differ diff --git a/core/assets-raw/sprites/items/item-sand.png b/core/assets-raw/sprites/items/item-sand.png index ed025f9931..79ddca5d30 100644 Binary files a/core/assets-raw/sprites/items/item-sand.png and b/core/assets-raw/sprites/items/item-sand.png differ diff --git a/core/assets-raw/sprites/items/item-scrap.png b/core/assets-raw/sprites/items/item-scrap.png index 45df8819fc..242b66db66 100644 Binary files a/core/assets-raw/sprites/items/item-scrap.png and b/core/assets-raw/sprites/items/item-scrap.png differ diff --git a/core/assets-raw/sprites/items/item-silicon.png b/core/assets-raw/sprites/items/item-silicon.png index 9014611f2c..1c498c2524 100644 Binary files a/core/assets-raw/sprites/items/item-silicon.png and b/core/assets-raw/sprites/items/item-silicon.png differ diff --git a/core/assets-raw/sprites/items/item-spore-pod.png b/core/assets-raw/sprites/items/item-spore-pod.png index 08fab9d2e8..b627c0da1b 100644 Binary files a/core/assets-raw/sprites/items/item-spore-pod.png and b/core/assets-raw/sprites/items/item-spore-pod.png differ diff --git a/core/assets-raw/sprites/items/item-surge-alloy.png b/core/assets-raw/sprites/items/item-surge-alloy.png index 789012ef13..4cac00c5e4 100644 Binary files a/core/assets-raw/sprites/items/item-surge-alloy.png and b/core/assets-raw/sprites/items/item-surge-alloy.png differ diff --git a/core/assets-raw/sprites/items/item-thorium.png b/core/assets-raw/sprites/items/item-thorium.png index b548c5acf7..6da37cfb1e 100644 Binary files a/core/assets-raw/sprites/items/item-thorium.png and b/core/assets-raw/sprites/items/item-thorium.png differ diff --git a/core/assets-raw/sprites/items/item-titanium.png b/core/assets-raw/sprites/items/item-titanium.png index b1dd24233a..69368ab751 100644 Binary files a/core/assets-raw/sprites/items/item-titanium.png and b/core/assets-raw/sprites/items/item-titanium.png differ diff --git a/core/assets-raw/sprites/items/liquid-cryofluid.png b/core/assets-raw/sprites/items/liquid-cryofluid.png index ada0f5b06d..b438a5ed37 100644 Binary files a/core/assets-raw/sprites/items/liquid-cryofluid.png and b/core/assets-raw/sprites/items/liquid-cryofluid.png differ diff --git a/core/assets-raw/sprites/items/liquid-oil.png b/core/assets-raw/sprites/items/liquid-oil.png index 16ea1670b4..51c7a8db47 100644 Binary files a/core/assets-raw/sprites/items/liquid-oil.png and b/core/assets-raw/sprites/items/liquid-oil.png differ diff --git a/core/assets-raw/sprites/items/liquid-slag.png b/core/assets-raw/sprites/items/liquid-slag.png index c482af93dd..2d51d55a8c 100644 Binary files a/core/assets-raw/sprites/items/liquid-slag.png and b/core/assets-raw/sprites/items/liquid-slag.png differ diff --git a/core/assets-raw/sprites/items/liquid-water.png b/core/assets-raw/sprites/items/liquid-water.png index a822b86412..602eee79a9 100644 Binary files a/core/assets-raw/sprites/items/liquid-water.png and b/core/assets-raw/sprites/items/liquid-water.png differ diff --git a/core/assets-raw/sprites/shapes/circle-small.png b/core/assets-raw/sprites/shapes/circle-small.png new file mode 100644 index 0000000000..f69791c29d Binary files /dev/null and b/core/assets-raw/sprites/shapes/circle-small.png differ diff --git a/core/assets-raw/sprites/shapes/hcircle.png b/core/assets-raw/sprites/shapes/hcircle.png new file mode 100644 index 0000000000..5eb12e968f Binary files /dev/null and b/core/assets-raw/sprites/shapes/hcircle.png differ diff --git a/core/assets-raw/sprites/statuses/status-blasted.png b/core/assets-raw/sprites/statuses/status-blasted.png new file mode 100644 index 0000000000..79f635ffb7 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-blasted.png differ diff --git a/core/assets-raw/sprites/statuses/status-burning.png b/core/assets-raw/sprites/statuses/status-burning.png new file mode 100644 index 0000000000..7e82dd4482 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-burning.png differ diff --git a/core/assets-raw/sprites/statuses/status-corroded.png b/core/assets-raw/sprites/statuses/status-corroded.png new file mode 100644 index 0000000000..908a522381 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-corroded.png differ diff --git a/core/assets-raw/sprites/statuses/status-disarmed.png b/core/assets-raw/sprites/statuses/status-disarmed.png new file mode 100644 index 0000000000..c1cfb764ba Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-disarmed.png differ diff --git a/core/assets-raw/sprites/statuses/status-electrified.png b/core/assets-raw/sprites/statuses/status-electrified.png new file mode 100644 index 0000000000..2a08b271b8 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-electrified.png differ diff --git a/core/assets-raw/sprites/statuses/status-freezing.png b/core/assets-raw/sprites/statuses/status-freezing.png new file mode 100644 index 0000000000..5be529ab12 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-freezing.png differ diff --git a/core/assets-raw/sprites/statuses/status-melting.png b/core/assets-raw/sprites/statuses/status-melting.png new file mode 100644 index 0000000000..e3b4e54b54 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-melting.png differ diff --git a/core/assets-raw/sprites/statuses/status-muddy.png b/core/assets-raw/sprites/statuses/status-muddy.png new file mode 100644 index 0000000000..41946e670d Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-muddy.png differ diff --git a/core/assets-raw/sprites/statuses/status-overclock.png b/core/assets-raw/sprites/statuses/status-overclock.png new file mode 100644 index 0000000000..ede85bb8e9 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-overclock.png differ diff --git a/core/assets-raw/sprites/statuses/status-overdrive.png b/core/assets-raw/sprites/statuses/status-overdrive.png new file mode 100644 index 0000000000..79a4d561c3 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-overdrive.png differ diff --git a/core/assets-raw/sprites/statuses/status-sapped.png b/core/assets-raw/sprites/statuses/status-sapped.png new file mode 100644 index 0000000000..123686d595 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-sapped.png differ diff --git a/core/assets-raw/sprites/statuses/status-shocked.png b/core/assets-raw/sprites/statuses/status-shocked.png new file mode 100644 index 0000000000..2a08b271b8 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-shocked.png differ diff --git a/core/assets-raw/sprites/statuses/status-slow.png b/core/assets-raw/sprites/statuses/status-slow.png new file mode 100644 index 0000000000..123686d595 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-slow.png differ diff --git a/core/assets-raw/sprites/statuses/status-spore-slowed.png b/core/assets-raw/sprites/statuses/status-spore-slowed.png new file mode 100644 index 0000000000..939584437d Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-spore-slowed.png differ diff --git a/core/assets-raw/sprites/statuses/status-tarred.png b/core/assets-raw/sprites/statuses/status-tarred.png new file mode 100644 index 0000000000..41946e670d Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-tarred.png differ diff --git a/core/assets-raw/sprites/statuses/status-unmoving.png b/core/assets-raw/sprites/statuses/status-unmoving.png new file mode 100644 index 0000000000..a8c8743382 Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-unmoving.png differ diff --git a/core/assets-raw/sprites/statuses/status-wet.png b/core/assets-raw/sprites/statuses/status-wet.png new file mode 100644 index 0000000000..3a26c4974a Binary files /dev/null and b/core/assets-raw/sprites/statuses/status-wet.png differ diff --git a/core/assets-raw/sprites/ui/pane-solid.9.png b/core/assets-raw/sprites/ui/pane-solid.9.png new file mode 100644 index 0000000000..f7a6a53b36 Binary files /dev/null and b/core/assets-raw/sprites/ui/pane-solid.9.png differ diff --git a/core/assets-raw/sprites/units/aegires-cell.png b/core/assets-raw/sprites/units/aegires-cell.png new file mode 100644 index 0000000000..f85cfc8e17 Binary files /dev/null and b/core/assets-raw/sprites/units/aegires-cell.png differ diff --git a/core/assets-raw/sprites/units/aegires.png b/core/assets-raw/sprites/units/aegires.png new file mode 100644 index 0000000000..21f7743fd5 Binary files /dev/null and b/core/assets-raw/sprites/units/aegires.png differ diff --git a/core/assets-raw/sprites/units/bryde.png b/core/assets-raw/sprites/units/bryde.png index 5191b39b4a..97990553b7 100644 Binary files a/core/assets-raw/sprites/units/bryde.png and b/core/assets-raw/sprites/units/bryde.png differ diff --git a/core/assets-raw/sprites/units/corvus.png b/core/assets-raw/sprites/units/corvus.png index 59c20e2566..87d309348f 100644 Binary files a/core/assets-raw/sprites/units/corvus.png and b/core/assets-raw/sprites/units/corvus.png differ diff --git a/core/assets-raw/sprites/units/cyerce-cell.png b/core/assets-raw/sprites/units/cyerce-cell.png new file mode 100644 index 0000000000..6dba8c9285 Binary files /dev/null and b/core/assets-raw/sprites/units/cyerce-cell.png differ diff --git a/core/assets-raw/sprites/units/cyerce.png b/core/assets-raw/sprites/units/cyerce.png new file mode 100644 index 0000000000..8d60ebd2e3 Binary files /dev/null and b/core/assets-raw/sprites/units/cyerce.png differ diff --git a/core/assets-raw/sprites/units/eclipse.aseprite b/core/assets-raw/sprites/units/eclipse.aseprite deleted file mode 100644 index 51eb8f345b..0000000000 Binary files a/core/assets-raw/sprites/units/eclipse.aseprite and /dev/null differ diff --git a/core/assets-raw/sprites/units/eclipse.png b/core/assets-raw/sprites/units/eclipse.png index d53b0da185..5d49e2132e 100644 Binary files a/core/assets-raw/sprites/units/eclipse.png and b/core/assets-raw/sprites/units/eclipse.png differ diff --git a/core/assets-raw/sprites/units/flare.png b/core/assets-raw/sprites/units/flare.png index 435c9d24cf..49e0540d0b 100644 Binary files a/core/assets-raw/sprites/units/flare.png and b/core/assets-raw/sprites/units/flare.png differ diff --git a/core/assets-raw/sprites/units/mega.png b/core/assets-raw/sprites/units/mega.png index 3cbd6cc822..878dba26d0 100644 Binary files a/core/assets-raw/sprites/units/mega.png and b/core/assets-raw/sprites/units/mega.png differ diff --git a/core/assets-raw/sprites/units/minke.png b/core/assets-raw/sprites/units/minke.png index 32ec1fadfe..597550df3a 100644 Binary files a/core/assets-raw/sprites/units/minke.png and b/core/assets-raw/sprites/units/minke.png differ diff --git a/core/assets-raw/sprites/units/navanax-cell.png b/core/assets-raw/sprites/units/navanax-cell.png new file mode 100644 index 0000000000..79e2b847b7 Binary files /dev/null and b/core/assets-raw/sprites/units/navanax-cell.png differ diff --git a/core/assets-raw/sprites/units/navanax.png b/core/assets-raw/sprites/units/navanax.png new file mode 100644 index 0000000000..051b01e908 Binary files /dev/null and b/core/assets-raw/sprites/units/navanax.png differ diff --git a/core/assets-raw/sprites/units/oct.png b/core/assets-raw/sprites/units/oct.png index 067ebb857b..d61cf5c2f5 100644 Binary files a/core/assets-raw/sprites/units/oct.png and b/core/assets-raw/sprites/units/oct.png differ diff --git a/core/assets-raw/sprites/units/omura-cannon-heat.png b/core/assets-raw/sprites/units/omura-cannon-heat.png deleted file mode 100644 index 5e2b0dc212..0000000000 Binary files a/core/assets-raw/sprites/units/omura-cannon-heat.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/omura.png b/core/assets-raw/sprites/units/omura.png index 02befddd78..f601a2045a 100644 Binary files a/core/assets-raw/sprites/units/omura.png and b/core/assets-raw/sprites/units/omura.png differ diff --git a/core/assets-raw/sprites/units/oxynoe-cell.png b/core/assets-raw/sprites/units/oxynoe-cell.png new file mode 100644 index 0000000000..92120a6bd4 Binary files /dev/null and b/core/assets-raw/sprites/units/oxynoe-cell.png differ diff --git a/core/assets-raw/sprites/units/oxynoe.png b/core/assets-raw/sprites/units/oxynoe.png new file mode 100644 index 0000000000..35a4d45cbc Binary files /dev/null and b/core/assets-raw/sprites/units/oxynoe.png differ diff --git a/core/assets-raw/sprites/units/poly.png b/core/assets-raw/sprites/units/poly.png index b6c57ac149..7ba17b2145 100644 Binary files a/core/assets-raw/sprites/units/poly.png and b/core/assets-raw/sprites/units/poly.png differ diff --git a/core/assets-raw/sprites/units/pulsar.png b/core/assets-raw/sprites/units/pulsar.png index af014df891..b16864d31c 100644 Binary files a/core/assets-raw/sprites/units/pulsar.png and b/core/assets-raw/sprites/units/pulsar.png differ diff --git a/core/assets-raw/sprites/units/quad.png b/core/assets-raw/sprites/units/quad.png index 95435c1f38..e238c06f37 100644 Binary files a/core/assets-raw/sprites/units/quad.png and b/core/assets-raw/sprites/units/quad.png differ diff --git a/core/assets-raw/sprites/units/quasar.png b/core/assets-raw/sprites/units/quasar.png index d68ed772a3..dfbf982581 100644 Binary files a/core/assets-raw/sprites/units/quasar.png and b/core/assets-raw/sprites/units/quasar.png differ diff --git a/core/assets-raw/sprites/units/reign.png b/core/assets-raw/sprites/units/reign.png index 6a3d838582..6e7b81c146 100644 Binary files a/core/assets-raw/sprites/units/reign.png and b/core/assets-raw/sprites/units/reign.png differ diff --git a/core/assets-raw/sprites/units/retusa-cell.png b/core/assets-raw/sprites/units/retusa-cell.png new file mode 100644 index 0000000000..bb044aa5a3 Binary files /dev/null and b/core/assets-raw/sprites/units/retusa-cell.png differ diff --git a/core/assets-raw/sprites/units/retusa.png b/core/assets-raw/sprites/units/retusa.png new file mode 100644 index 0000000000..367e0d5921 Binary files /dev/null and b/core/assets-raw/sprites/units/retusa.png differ diff --git a/core/assets-raw/sprites/units/risso.png b/core/assets-raw/sprites/units/risso.png index 6cee60313b..bcfa3c29ad 100644 Binary files a/core/assets-raw/sprites/units/risso.png and b/core/assets-raw/sprites/units/risso.png differ diff --git a/core/assets-raw/sprites/units/scepter.png b/core/assets-raw/sprites/units/scepter.png index 5d1ae6f59b..1cfaaa2a87 100644 Binary files a/core/assets-raw/sprites/units/scepter.png and b/core/assets-raw/sprites/units/scepter.png differ diff --git a/core/assets-raw/sprites/units/sei.png b/core/assets-raw/sprites/units/sei.png index 724fe9559b..1dbd0728e8 100644 Binary files a/core/assets-raw/sprites/units/sei.png and b/core/assets-raw/sprites/units/sei.png differ diff --git a/core/assets-raw/sprites/units/spiroct.png b/core/assets-raw/sprites/units/spiroct.png index a69a0b2657..36df70869a 100644 Binary files a/core/assets-raw/sprites/units/spiroct.png and b/core/assets-raw/sprites/units/spiroct.png differ diff --git a/core/assets-raw/sprites/units/toxopid.png b/core/assets-raw/sprites/units/toxopid.png index a84e453f40..3f4037e94b 100644 Binary files a/core/assets-raw/sprites/units/toxopid.png and b/core/assets-raw/sprites/units/toxopid.png differ diff --git a/core/assets-raw/sprites/units/vanguard-cell.png b/core/assets-raw/sprites/units/vanguard-cell.png deleted file mode 100644 index 4366b2167b..0000000000 Binary files a/core/assets-raw/sprites/units/vanguard-cell.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/vanguard.png b/core/assets-raw/sprites/units/vanguard.png deleted file mode 100644 index feacbacc6e..0000000000 Binary files a/core/assets-raw/sprites/units/vanguard.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/vela.png b/core/assets-raw/sprites/units/vela.png index db1fdbb9c7..b1c734abd4 100644 Binary files a/core/assets-raw/sprites/units/vela.png and b/core/assets-raw/sprites/units/vela.png differ diff --git a/core/assets-raw/sprites/units/weapons/emp-cannon-mount-heat.png b/core/assets-raw/sprites/units/weapons/emp-cannon-mount-heat.png new file mode 100644 index 0000000000..b23f9257be Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/emp-cannon-mount-heat.png differ diff --git a/core/assets-raw/sprites/units/weapons/emp-cannon-mount.png b/core/assets-raw/sprites/units/weapons/emp-cannon-mount.png new file mode 100644 index 0000000000..1fcaf470b1 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/emp-cannon-mount.png differ diff --git a/core/assets-raw/sprites/units/weapons/large-laser-mount.png b/core/assets-raw/sprites/units/weapons/large-laser-mount.png index 9cad74c69b..5e04ace067 100644 Binary files a/core/assets-raw/sprites/units/weapons/large-laser-mount.png and b/core/assets-raw/sprites/units/weapons/large-laser-mount.png differ diff --git a/core/assets-raw/sprites/units/weapons/plasma-laser-mount-heat.png b/core/assets-raw/sprites/units/weapons/plasma-laser-mount-heat.png new file mode 100644 index 0000000000..63e3eafc53 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/plasma-laser-mount-heat.png differ diff --git a/core/assets-raw/sprites/units/weapons/plasma-laser-mount.png b/core/assets-raw/sprites/units/weapons/plasma-laser-mount.png new file mode 100644 index 0000000000..8a7ac5a27b Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/plasma-laser-mount.png differ diff --git a/core/assets-raw/sprites/units/weapons/plasma-missile-mount.png b/core/assets-raw/sprites/units/weapons/plasma-missile-mount.png new file mode 100644 index 0000000000..f8c5476bdc Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/plasma-missile-mount.png differ diff --git a/core/assets-raw/sprites/units/weapons/plasma-mount-weapon.png b/core/assets-raw/sprites/units/weapons/plasma-mount-weapon.png new file mode 100644 index 0000000000..57dad881de Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/plasma-mount-weapon.png differ diff --git a/core/assets-raw/sprites/units/weapons/point-defense-mount.png b/core/assets-raw/sprites/units/weapons/point-defense-mount.png new file mode 100644 index 0000000000..b14acbc73b Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/point-defense-mount.png differ diff --git a/core/assets-raw/sprites/units/weapons/repair-beam-weapon-center.png b/core/assets-raw/sprites/units/weapons/repair-beam-weapon-center.png new file mode 100644 index 0000000000..4f38701c30 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/repair-beam-weapon-center.png differ diff --git a/core/assets-raw/sprites/units/weapons/repair-beam-weapon.png b/core/assets-raw/sprites/units/weapons/repair-beam-weapon.png new file mode 100644 index 0000000000..373cf433ba Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/repair-beam-weapon.png differ diff --git a/core/assets-raw/sprites/units/toxopid-cannon.png b/core/assets-raw/sprites/units/weapons/toxopid-cannon.png similarity index 100% rename from core/assets-raw/sprites/units/toxopid-cannon.png rename to core/assets-raw/sprites/units/weapons/toxopid-cannon.png diff --git a/core/assets-raw/sprites/units/zenith.png b/core/assets-raw/sprites/units/zenith.png index 469d949c41..a41ac04898 100644 Binary files a/core/assets-raw/sprites/units/zenith.png and b/core/assets-raw/sprites/units/zenith.png differ diff --git a/core/assets/baseparts/1591385293703.msch b/core/assets/baseparts/1591385293703.msch index d48006b7be..a4e028a60b 100644 Binary files a/core/assets/baseparts/1591385293703.msch and b/core/assets/baseparts/1591385293703.msch differ diff --git a/core/assets/baseparts/1591385372367.msch b/core/assets/baseparts/1591385372367.msch index a45bad9e2d..c49595751c 100644 Binary files a/core/assets/baseparts/1591385372367.msch and b/core/assets/baseparts/1591385372367.msch differ diff --git a/core/assets/baseparts/1599594352859.msch b/core/assets/baseparts/1599594352859.msch index 3b73103fa9..1649a971f7 100644 Binary files a/core/assets/baseparts/1599594352859.msch and b/core/assets/baseparts/1599594352859.msch differ diff --git a/core/assets/baseparts/1603214918168.msch b/core/assets/baseparts/1603214918168.msch new file mode 100644 index 0000000000..6d69a2c362 --- /dev/null +++ b/core/assets/baseparts/1603214918168.msch @@ -0,0 +1,2 @@ +mschxœ5Ë +! E¯Ïy-J·ý‡ù(q¤£Gú÷„ââä&'›„Î.Å}SÆm‹tWØÏKæuÅXGÅq¤ àY¬z\P?E½:ÅYŽ ªÍΤÅÔ¢h)(¦%UDK½”½(¶.©%Ð#èV0F¨­N#Ô \ No newline at end of file diff --git a/core/assets/baseparts/1603214967392.msch b/core/assets/baseparts/1603214967392.msch new file mode 100644 index 0000000000..0e30b20a82 --- /dev/null +++ b/core/assets/baseparts/1603214967392.msch @@ -0,0 +1 @@ +mschxœ%ÍAƒ …á§€ÖZc\ô.z$ƒÓdƒÐ¤·/täƒ?“3†ÚoŽ`Þù¢Æ.ùL< ±$N›çìVü‡¾!b>=e·%¶ëù80r"·^!GKÐu€g9耦Ð×{S_@+±•¨$jÁÐWê\oJSÀMú Ü…±¢0ý?ÂCâTŠªhÁÔqW \ No newline at end of file diff --git a/core/assets/baseparts/1603214996033.msch b/core/assets/baseparts/1603214996033.msch new file mode 100644 index 0000000000..83690987ae --- /dev/null +++ b/core/assets/baseparts/1603214996033.msch @@ -0,0 +1,3 @@ +mschxœ%Á +à ƒÓªmic×½C/{£bU‡ÕÁÞ~¦ÿA>“ˆ·:nÁÁ¼ëé^XvwÚì?ŧ<Š/[ô5¬6ůû¥Œû'º¶âíºgX|qa=SÍÖAsCNµ¸ àÙNÛA×0ðÞQ½˜=Mb‚¢9óMID‰Ò’ÔÑb‰Q§ÆÆAјٟZ¯}<ò™ê +sFŠ£†‘©U.Œ‚ÖüBIÙ \ No newline at end of file diff --git a/core/assets/baseparts/1603215024189.msch b/core/assets/baseparts/1603215024189.msch new file mode 100644 index 0000000000..75d8474c96 Binary files /dev/null and b/core/assets/baseparts/1603215024189.msch differ diff --git a/core/assets/baseparts/1603215113546.msch b/core/assets/baseparts/1603215113546.msch new file mode 100644 index 0000000000..bf1020f89f --- /dev/null +++ b/core/assets/baseparts/1603215113546.msch @@ -0,0 +1,2 @@ +mschxœ%Ð[nà Ð øA×}¨ê"òÙ t'‘C$¤ØŽˆ]©»ï ÷Ã Ì cð…ÑÀ.—9ÂÝögüF¸Æç”ÓcKë8XÝÆ¸¥í²¤}>OëòÿÖ Ÿ×}‹Ãc‰û|ÙÒt¾æt¿#¤-Îççºç)ø䃑Åd©qPÒ’Žr$½b¤@ê*bÙÅ2r¡ôtÒ³RZÒ‘@ޤW<»x©“Æ^oWʵ5Ïj=+SjÔ0³Ñq•@Ê€­¦XÁ:À—RÚ±´“?¨” +•,#G<©ICZÒ‘@ޤ''%H³òZ…žœÈ@^ôÅG<©ICZÍÉ+y#ïäC>órá#³ \ No newline at end of file diff --git a/core/assets/baseparts/1603215171294.msch b/core/assets/baseparts/1603215171294.msch new file mode 100644 index 0000000000..eaef917ff3 --- /dev/null +++ b/core/assets/baseparts/1603215171294.msch @@ -0,0 +1,2 @@ +mschxœ%ᎃ „A±ú£i߃‡âpïB¢`ÛøîM®» +!ß0;060É/û»oäKÀ8ÑJ\kÌ èa|­T k~Sq)O-Éûšh_|ÁM%Î35VŸâ¾¸Ó‹Ž\ðØòì‹[}¢Ù±ú#Œ±Òâ¶¼—@0ò-€'hhÅ0½†úÿ@Á —W Ý@†JÐCi4bjœÛp´…2gㄽÐ_¸]䡎EÓ±°-ÎK+¾–þ·.é \ No newline at end of file diff --git a/core/assets/baseparts/1603215272794.msch b/core/assets/baseparts/1603215272794.msch new file mode 100644 index 0000000000..1e953643c8 Binary files /dev/null and b/core/assets/baseparts/1603215272794.msch differ diff --git a/core/assets/baseparts/1603215345320.msch b/core/assets/baseparts/1603215345320.msch new file mode 100644 index 0000000000..8c97534bdf --- /dev/null +++ b/core/assets/baseparts/1603215345320.msch @@ -0,0 +1,4 @@ +mschxœEÏën‚@àÃÅ\EíÕôøÛ÷!ºdͲ´éÃ:ÃiÒøqvfÇاȇöæP^¦Ñ]|ˆ°g7žBw€ +¹Vpˆ]l‡nº5'?|¹`»ènÍè§pr°};ºÐœC×÷0ÁOÑìïþ[vM߆«Œ½¼4÷vpýß‘'¡‰Ú*á¿àHäY~2dJNVÄ(©¦BµL¦­r ­ +bH¡èw-cKM™¤52e«ó*þWÅ R!K²L–{XÝ# SAJR‘5±dC¶¤V6r]m`Ët~ÌóüŒ´ÔHÁ覵Rv™¾ÓX +2H©ÉNk{Þ8'òL^È+y#ï +p”U%%%JAJ$¿æ?M \ No newline at end of file diff --git a/core/assets/baseparts/1603215415778.msch b/core/assets/baseparts/1603215415778.msch new file mode 100644 index 0000000000..67141f4632 --- /dev/null +++ b/core/assets/baseparts/1603215415778.msch @@ -0,0 +1,3 @@ +mschxœ-‹ +Â0 Eo×ʺ¢Òª®È ¶¥«¨Ÿ.Cf²J‡]6!NÎÐüæ0,‚)܇&Ù²öbKqùó~È$œÿ+À‘­Vh¶•ò ¹} ¶U +êwZÐ'È;¤$´ ]ÑUô´…]P,(²»Š‘¡k¥¹úŶ,e \ No newline at end of file diff --git a/core/assets/baseparts/1603215454977.msch b/core/assets/baseparts/1603215454977.msch new file mode 100644 index 0000000000..c0a53057ed Binary files /dev/null and b/core/assets/baseparts/1603215454977.msch differ diff --git a/core/assets/baseparts/1603215491407.msch b/core/assets/baseparts/1603215491407.msch new file mode 100644 index 0000000000..ba578a4a55 --- /dev/null +++ b/core/assets/baseparts/1603215491407.msch @@ -0,0 +1,2 @@ +mschxœ5Ïኃ0à1µµmjï9äàÞ(h~ÔHŒÂ½ýeÁufCÄn +Õj‡Ç¶ÍÅÝÎgøA7¹}Œ~K>¬@ }ÚcNè“OvõÇ2Œa=ÝoˆÐ×Úcƒ\Dç“[†=qt0ÛêŽÅ&?Sôó à(Р(p=òR¤$Ñ‚’ôJ T&ge¦Öù âªJ¬IM¡Ê´Ò* ´ü~#÷”d÷|ÚEE4©I#t¹©„Fxpzpzʤ3% hù¹'³›/™4 ol¸`¸`¸`¸ðæÂ›SÏfÏfÏfÏìÃæG¦?J (, \ No newline at end of file diff --git a/core/assets/baseparts/1603215563717.msch b/core/assets/baseparts/1603215563717.msch new file mode 100644 index 0000000000..460c1d9f8b Binary files /dev/null and b/core/assets/baseparts/1603215563717.msch differ diff --git a/core/assets/baseparts/1603215697527.msch b/core/assets/baseparts/1603215697527.msch new file mode 100644 index 0000000000..427e52f671 Binary files /dev/null and b/core/assets/baseparts/1603215697527.msch differ diff --git a/core/assets/baseparts/1603215771822.msch b/core/assets/baseparts/1603215771822.msch new file mode 100644 index 0000000000..68ee586ea5 Binary files /dev/null and b/core/assets/baseparts/1603215771822.msch differ diff --git a/core/assets/baseparts/1603215801163.msch b/core/assets/baseparts/1603215801163.msch new file mode 100644 index 0000000000..09b9033d84 --- /dev/null +++ b/core/assets/baseparts/1603215801163.msch @@ -0,0 +1 @@ +mschxœ-Œ[ƒ DJ¬JŸ aQ¤’ÆÄMÓµ÷£½~¹g&—3—åíÓ1å°ÚdS²oôìò=-q[‚‡Ž[íL´Þ­FÒÃqáå’ñav£ó.0[ñÀ š”äŠSA/ÿ¤é‡†îû‘éciFÑ(ädPD­~Ã+ï \ No newline at end of file diff --git a/core/assets/baseparts/1603216038407.msch b/core/assets/baseparts/1603216038407.msch new file mode 100644 index 0000000000..85865ba123 Binary files /dev/null and b/core/assets/baseparts/1603216038407.msch differ diff --git a/core/assets/baseparts/1603216102310.msch b/core/assets/baseparts/1603216102310.msch new file mode 100644 index 0000000000..a05dbc61ed --- /dev/null +++ b/core/assets/baseparts/1603216102310.msch @@ -0,0 +1 @@ +mschxœ%Ž[jÄ0 EoœØ“©K¡]†e2¢58Ö ;SºûJI]¡">¶–OÂ}ü°ô\_Œø ~HyŽÂ ¸!öK¾) þ%QÁ5KzæF±æN’RªŠ2èL/9Ÿ£ŒÜÊu¦ƒÛ‹þX„¯¡ü¼|iÀíX˜9u+8¬–¬ØpózÝà­Áà&Ö‰mÂOh!¼>àt^m1ì÷‰·‰ˆ%(ÞMí6´A—ýÖe)“ \ No newline at end of file diff --git a/core/assets/baseparts/1603216240041.msch b/core/assets/baseparts/1603216240041.msch new file mode 100644 index 0000000000..c0960c09d5 --- /dev/null +++ b/core/assets/baseparts/1603216240041.msch @@ -0,0 +1,3 @@ +mschxœM‘IRÃ0E¿åÙJâk.àcp—£ +*ÒcZÉrëF¸_\ôçn—?é™2^xŠÝ(Rv…éì íöHg^}N'Ï‚ù¿Àþ–ª $6r4TËl„Ò"=ZÞ‚ÚëbAó4WØ'&wtà²æ„3-l`PÕÈçC?6ŒÍõs}+ñié«y¨fññ$15¦ª™ªa-~âˆYØ/gD>X \ No newline at end of file diff --git a/core/assets/baseparts/1603222833941.msch b/core/assets/baseparts/1603222833941.msch new file mode 100644 index 0000000000..60862cf01a Binary files /dev/null and b/core/assets/baseparts/1603222833941.msch differ diff --git a/core/assets/baseparts/1603222912251.msch b/core/assets/baseparts/1603222912251.msch new file mode 100644 index 0000000000..f9c5e5f55d --- /dev/null +++ b/core/assets/baseparts/1603222912251.msch @@ -0,0 +1,2 @@ +mschxœ-‘ínƒ †_Á¬mÓ]Å~yQÌcb±AÜÖ+o¶neïÑÅàÃ9<'œro/ÍÕ;Žö3ÄÍÙÍ]®q˜<°G5»þâ|D3/¡wmœ>\ÀjÛ;ï‚SÀé*ÙÖOg׎–Ê0-‘âK¢õÃri»É¿»emC‡r´¾“Bo6Ò»ýokF;³Ð9 ãˆfˆîÒÎÓ:®Ì•öj½¼r@#ˈÚ( }C¥{¦À9” €ÖDm W8îéIK§;7æ(Òƒ +V-g¼NsdеAoàD~Ŧ”[²Ú` ÕZˆQÁH•ÄYAÏH7•TÝH_j(MìM™é7=y¤J_ÿýˆ {ØâÕìøŒvÕò6È$•óôŠ¥÷8ÊòúŠÝ†fÃ^š8ðcâÈÞ2Aµa½ÃQ”?8[Ä \ No newline at end of file diff --git a/core/assets/baseparts/1605279968000.msch b/core/assets/baseparts/1605279968000.msch new file mode 100644 index 0000000000..0c00c2d356 Binary files /dev/null and b/core/assets/baseparts/1605279968000.msch differ diff --git a/core/assets/baseparts/1605280014089.msch b/core/assets/baseparts/1605280014089.msch new file mode 100644 index 0000000000..127bf95450 --- /dev/null +++ b/core/assets/baseparts/1605280014089.msch @@ -0,0 +1,2 @@ +mschxœ-ÑŠ! EouÔÙBÛÇ~„/ý#™†EptˆN¡_mÁã¹ ˆW…)‡0×ÖÆôÀò¤ºrÜ[,ppÿÜZl!ÇcókÉ/z†år4bÜjIý2%ß_„%…JìŸSÂm¾–ƒW‚©!½ +€;pêGk…VNf ¿Jjª›ÒÐ8PK¨G8&~m3bfØÔçŸqk¾¡•'æÄæa¦ãbú/(Û×[¨=[)» \ No newline at end of file diff --git a/core/assets/baseparts/1605280470180.msch b/core/assets/baseparts/1605280470180.msch new file mode 100644 index 0000000000..0936a4a315 --- /dev/null +++ b/core/assets/baseparts/1605280470180.msch @@ -0,0 +1 @@ +mschxœM‘Ûn„ E7^ÆëŒ1ý¾ö"JƒØi?¾µçÀKCdëÞ$â—•S›Æp(·¾³ï–’U ÅÑxŒ˜oU»rÚJŠ>hÄD½Éßaјž*ê õW j‰>àîý—N»Ó禢Y䌵äv’ˆŒþ©©»xeå¢] æý$í9š¨œ97¹x÷©¿IáüIèw^‘ίšjùµÓa¬¡IylÚòðT¾J”5¨RPDu¾ˆ*ÏÔÜh‹¸QÞA4©‘P3n,ÇEF Ñ‚WŠŽP·Õõ‹‚¾êú¹.žMSГåŒäŒ ²lè$¶’>g-JF—qÏÅGÆÄhé$t}Æ1ò«ZÚ+XãÎF}ÆÀèù¯r6fé1K,ý%†Tž \ No newline at end of file diff --git a/core/assets/baseparts/1605280548230.msch b/core/assets/baseparts/1605280548230.msch new file mode 100644 index 0000000000..a21848a1f2 --- /dev/null +++ b/core/assets/baseparts/1605280548230.msch @@ -0,0 +1,2 @@ +mschxœ-[nà E¯ñ;nÓ8ûà«+Bö(BÂ`i”½'qã¯3sï!pÁU ²j!ta¥)zúÅ0S˜¼^£vhÑ ƨ£²ú¾ÈÉÙ?z:18£¼\•%#yºët[ÈF\V÷ /­›é¨£'³×Æ`БÜÝO` +|C¨p†hxßQ¥°NaÁÛŽ6+}Vú¤”èpJ]—•>ã”1$TøBÓ•Û{ûl/¾a·¬ùÍ3Š?kþ­øƒ”4A \ No newline at end of file diff --git a/core/assets/baseparts/1605281022715.msch b/core/assets/baseparts/1605281022715.msch new file mode 100644 index 0000000000..5ea7a4b570 Binary files /dev/null and b/core/assets/baseparts/1605281022715.msch differ diff --git a/core/assets/baseparts/1605281081581.msch b/core/assets/baseparts/1605281081581.msch new file mode 100644 index 0000000000..ad93878cf2 Binary files /dev/null and b/core/assets/baseparts/1605281081581.msch differ diff --git a/core/assets/baseparts/1605281121912.msch b/core/assets/baseparts/1605281121912.msch new file mode 100644 index 0000000000..4c3235757c --- /dev/null +++ b/core/assets/baseparts/1605281121912.msch @@ -0,0 +1,2 @@ +mschxœMÍ „géÄj¢'Ÿ¢ß[bL*4c|{gCB`vg?á Úè_vñq +ù†aÛ”Ÿky¦8 [Z|W¾R8Ý})!GŽç5}BcšÃî4>O°;ÅŒ7ͱ(…Ë_àNW4Ü\m•®JF ¬ÅÀ°“†"®btk! Êho:v]5ùBëNɾæÒC¬=Nôw–6‡¶;í,tŒJ óÁ,; \ No newline at end of file diff --git a/core/assets/baseparts/1605281215706.msch b/core/assets/baseparts/1605281215706.msch new file mode 100644 index 0000000000..a53b8591fe --- /dev/null +++ b/core/assets/baseparts/1605281215706.msch @@ -0,0 +1,3 @@ +mschxœMR[nƒ00o’&‘z…~òÓ9ÄŠÀFÆ4ÍÕÛ(tŒQ[¬õxwfXÆ/1-…DÚöõEM­íF× ¼`ï:'u7ÍMö=EÈ¥/Êâ8š›²6ÕôÒ^ª¿7éxVŸÎÊÖ‹Ã䔚«ÒÊJÈÏÒQrÇé·Ikô‡º“{mÍpž'?Æ¿Œº—k^lÇYêΩ¡™Ìl[vµšéºvcO“áLÍ(µê·é€72ÄrÄü1·± dE,Ò)¢å›ö`4õ Ê削§„âdy®iu(²ƒˆÖªÂ“Q‘, RZ´­t¥ã ªƒjçUë÷µµZVzïU"Ì%|–‡,xy€µ«ð]SΖ( 2 +èå„,@‚ä +nY€QŽ’)ôJx>HeÉ¿\«T^R±«Ôôª”×"v ÞóqäÀIÂlÙ \ No newline at end of file diff --git a/core/assets/baseparts/1605281306347.msch b/core/assets/baseparts/1605281306347.msch new file mode 100644 index 0000000000..1ef95d9ea5 Binary files /dev/null and b/core/assets/baseparts/1605281306347.msch differ diff --git a/core/assets/baseparts/1605283900306.msch b/core/assets/baseparts/1605283900306.msch new file mode 100644 index 0000000000..687c52017e Binary files /dev/null and b/core/assets/baseparts/1605283900306.msch differ diff --git a/core/assets/baseparts/1605284013998.msch b/core/assets/baseparts/1605284013998.msch new file mode 100644 index 0000000000..f08053df87 Binary files /dev/null and b/core/assets/baseparts/1605284013998.msch differ diff --git a/core/assets/baseparts/1605284595866.msch b/core/assets/baseparts/1605284595866.msch new file mode 100644 index 0000000000..704fe6ed9c Binary files /dev/null and b/core/assets/baseparts/1605284595866.msch differ diff --git a/core/assets/baseparts/1605284660452.msch b/core/assets/baseparts/1605284660452.msch new file mode 100644 index 0000000000..be36f1bc5b Binary files /dev/null and b/core/assets/baseparts/1605284660452.msch differ diff --git a/core/assets/baseparts/1605285080497.msch b/core/assets/baseparts/1605285080497.msch new file mode 100644 index 0000000000..da0da93d56 Binary files /dev/null and b/core/assets/baseparts/1605285080497.msch differ diff --git a/core/assets/baseparts/752921320802746461.msch b/core/assets/baseparts/752921320802746461.msch index e0333bb511..4c27dc4fa2 100644 Binary files a/core/assets/baseparts/752921320802746461.msch and b/core/assets/baseparts/752921320802746461.msch differ diff --git a/core/assets/baseparts/752927009641857205.msch b/core/assets/baseparts/752927009641857205.msch deleted file mode 100644 index 7943fb1481..0000000000 Binary files a/core/assets/baseparts/752927009641857205.msch and /dev/null differ diff --git a/core/assets/baseparts/752944648628076745.msch b/core/assets/baseparts/752944648628076745.msch deleted file mode 100644 index 090ffe0155..0000000000 --- a/core/assets/baseparts/752944648628076745.msch +++ /dev/null @@ -1,2 +0,0 @@ -mschxœMŽan„ …Š®ºmMÿöŠètC‚`ºí‰{Š]:àŸ& ïñ˜=Þ¤Óázh·ª`öÝÒWiS‡Oa!Ìw)(úŽA/ѼzcÿÉyw”6Í¢Ö`¬å^)ÜHE'¾]¼¶j!ƒùL7Â{4Q;“6µx÷E?Ü¡>ñL{y¢œ_‰½ú̇±†“êØÈ–ðÁ…¶$ÊŽ†ˆ¶êj7CÃn‹6ÿŠŽõѳ!Ot-G+ĉæë oíÀè†.?ó£dò —Ìœkr/‰Ô8N4@Ϩƒd41úSq± c% -ÆÄÉM \ No newline at end of file diff --git a/core/assets/baseparts/752955880965799966.msch b/core/assets/baseparts/752955880965799966.msch index 4cda9322ea..d96fc42c38 100644 Binary files a/core/assets/baseparts/752955880965799966.msch and b/core/assets/baseparts/752955880965799966.msch differ diff --git a/core/assets/baseparts/752965444419453010.msch b/core/assets/baseparts/752965444419453010.msch deleted file mode 100644 index 008b1f015b..0000000000 Binary files a/core/assets/baseparts/752965444419453010.msch and /dev/null differ diff --git a/core/assets/baseparts/753005578997071974.msch b/core/assets/baseparts/753005578997071974.msch index 747c61f453..c7dd6dceaa 100644 Binary files a/core/assets/baseparts/753005578997071974.msch and b/core/assets/baseparts/753005578997071974.msch differ diff --git a/core/assets/baseparts/753035709576642631.msch b/core/assets/baseparts/753035709576642631.msch deleted file mode 100644 index c1955436b5..0000000000 Binary files a/core/assets/baseparts/753035709576642631.msch and /dev/null differ diff --git a/core/assets/baseparts/753232120369119314.msch b/core/assets/baseparts/753232120369119314.msch deleted file mode 100644 index f68d33fae5..0000000000 Binary files a/core/assets/baseparts/753232120369119314.msch and /dev/null differ diff --git a/core/assets/baseparts/753646105383927950.msch b/core/assets/baseparts/753646105383927950.msch index 500ab29da2..00b0121a42 100644 Binary files a/core/assets/baseparts/753646105383927950.msch and b/core/assets/baseparts/753646105383927950.msch differ diff --git a/core/assets/baseparts/753653426667257906.msch b/core/assets/baseparts/753653426667257906.msch deleted file mode 100644 index a5b60b4c99..0000000000 Binary files a/core/assets/baseparts/753653426667257906.msch and /dev/null differ diff --git a/core/assets/baseparts/753938078997151744.msch b/core/assets/baseparts/753938078997151744.msch index 6a666a246c..cba3746e5b 100644 Binary files a/core/assets/baseparts/753938078997151744.msch and b/core/assets/baseparts/753938078997151744.msch differ diff --git a/core/assets/baseparts/754024880747315332.msch b/core/assets/baseparts/754024880747315332.msch new file mode 100644 index 0000000000..4bb358263a --- /dev/null +++ b/core/assets/baseparts/754024880747315332.msch @@ -0,0 +1 @@ +mschxœMkNì0 …OÓ6íL‰°üa)ì ´Ö©MJšòX;‚Á®ï•Hä|Ž}l'8à¶@ú™põä—e¢‡üâÃù„vˆá>cÂi ´Í}öƒ“Ÿ&Ü­qê“[ú@“cïL°3…‘î‡8?okö1¸3J}æÍsŸ3¥O—øNÉ…8ºy›²wK¢u…MûpfÜX‰Ó{Ïpô‘S?ì-ø9ãæ3º?ÃÑùL³[ã–Âõä_7?º-€Gè*v+%o^5`8Ô¢tÿE;jQßhÑ:£¹R•¥Ü$nQVŒEÍh!ÚæraûBņËÛwÙ ’y-ãF:U:ºâc‡Q”ŠJQ+,Š£‘é•<^p@qd÷é¸b4ŠVƒ,¹æŒ©åã{»ÊªÊªÊ²Ê´êPÑh¿F•üMÀ#%ÈÊŽ}+7)ÙÁ¹>8÷ ÚßWI \ No newline at end of file diff --git a/core/assets/baseparts/755588030362026104.msch b/core/assets/baseparts/755588030362026104.msch new file mode 100644 index 0000000000..3603ec105e --- /dev/null +++ b/core/assets/baseparts/755588030362026104.msch @@ -0,0 +1 @@ +mschxœ%]! „öOã³gØC$‘DÀ°`âím)ý˜a†âŠMÁd—¶Ó¿Br-z‹åô®µPqo±¹{:|Éßð+·O}äŽgï7.±…tœ¥W0×Ò¹<0Žâa 4Ý5Ã@kL¤câ7#Q 2 VâJ†e_FØJز­0Kgµ°`(L#ß-TÑ´Bz›˜;%ÉÜIiVù \ No newline at end of file diff --git a/core/assets/baseparts/759634196280508416.msch b/core/assets/baseparts/759634196280508416.msch new file mode 100644 index 0000000000..cb0ff78983 --- /dev/null +++ b/core/assets/baseparts/759634196280508416.msch @@ -0,0 +1 @@ +mschxœ=ÑÍŽ›0†áƒãÃßÊt™à:ºêªWàÉX£¨ DàÌÏw×Ú¼RÅâáûà µ|ÏDOîÍËÓO·®×wþ¼{;ÿðÓù6º))Ÿ]~ùF·¼z9®s¼nnò£Ô.>ügXÜ%Ì‹”·û¸úá2O/÷k{¹áúîÒ£zM“‡W?ùe+šÛüOó‹ÿ?ûBêEä·H¯]BÃ,”ÐÀ zÙmgd;š‰¨ˆ"iØSæ$”–T@IY‘x¤lI|£ìyY 4ìÁÀPBÐÁ6zŸf¦WW°£Ô¤”†dáHY*¨)R 'ÊŽÔÓl«R°ƒ`áÔРzˆ3u: qo MÊI†dI©"5¤–ÔA/jŸ–*YB† X( ‚Zè —L¥Ïr0`ÓêŽif¢‚Zè ® ¿Û˜ìïŸxèïm’ºÞˆúµÏ?è \ No newline at end of file diff --git a/core/assets/baseparts/772638841168461854.msch b/core/assets/baseparts/772638841168461854.msch new file mode 100644 index 0000000000..b6af5101d8 Binary files /dev/null and b/core/assets/baseparts/772638841168461854.msch differ diff --git a/core/assets/baseparts/772642175838191616.msch b/core/assets/baseparts/772642175838191616.msch new file mode 100644 index 0000000000..a9d0084d20 Binary files /dev/null and b/core/assets/baseparts/772642175838191616.msch differ diff --git a/core/assets/baseparts/772642264635670528.msch b/core/assets/baseparts/772642264635670528.msch new file mode 100644 index 0000000000..a49b98f067 Binary files /dev/null and b/core/assets/baseparts/772642264635670528.msch differ diff --git a/core/assets/baseparts/772642357136719872.msch b/core/assets/baseparts/772642357136719872.msch new file mode 100644 index 0000000000..4b2bc355e2 Binary files /dev/null and b/core/assets/baseparts/772642357136719872.msch differ diff --git a/core/assets/baseparts/772642606227390504.msch b/core/assets/baseparts/772642606227390504.msch new file mode 100644 index 0000000000..c54d37f5ba Binary files /dev/null and b/core/assets/baseparts/772642606227390504.msch differ diff --git a/core/assets/baseparts/772642700713000960.msch b/core/assets/baseparts/772642700713000960.msch new file mode 100644 index 0000000000..2fe878bddf Binary files /dev/null and b/core/assets/baseparts/772642700713000960.msch differ diff --git a/core/assets/baseparts/772754117604409344.msch b/core/assets/baseparts/772754117604409344.msch new file mode 100644 index 0000000000..6b8699479c Binary files /dev/null and b/core/assets/baseparts/772754117604409344.msch differ diff --git a/core/assets/baseparts/772859800051908639.msch b/core/assets/baseparts/772859800051908639.msch new file mode 100644 index 0000000000..175d05b796 Binary files /dev/null and b/core/assets/baseparts/772859800051908639.msch differ diff --git a/core/assets/baseparts/772860007561166868.msch b/core/assets/baseparts/772860007561166868.msch new file mode 100644 index 0000000000..27267597ad --- /dev/null +++ b/core/assets/baseparts/772860007561166868.msch @@ -0,0 +1,2 @@ +mschxœMPÛnë |IâKëæáüÄ‘øŠJçú!›VH,Œ›æÛ›w­w–™ÝÅ8â±@åÔYãÏéÅ™xú§ÆèÃõôÔÅê€nÒËÌwÀ:«äŒµèLÔg¹ø5ŒÃEE*ú#†{ ‹±fôN.gm)áMTάgIö]_YÓŽ«æ]¥ún™}ÐrzY0Œ^Y9jƒy]ß4ÚÙ_ØÞùIãñ-øÕMò5/K§·*ÈY9mqüu‘Ìè}šÕÕz5ýÌþ{‚ùC T¢ !P– ï(СdAY˜V„ +"A ±#ìPì ‰ì’/âÀPšmÛ¾ ¶¯mCɬ`v#÷Iî“Ì\U&Ã}TGÕyTûÔØªíFïzÀô]nÒ&5Zˆ†{ôé%‚Ö}zEË•Ê \¬Cª@>­gèA_“%(3T ÚL¶™l³½O¿!Á¢»7=Ò!9dmÈÚµ!iߌTys \ No newline at end of file diff --git a/core/assets/baseparts/772860344174772254.msch b/core/assets/baseparts/772860344174772254.msch new file mode 100644 index 0000000000..781cd94d46 Binary files /dev/null and b/core/assets/baseparts/772860344174772254.msch differ diff --git a/core/assets/baseparts/772861253630165084.msch b/core/assets/baseparts/772861253630165084.msch new file mode 100644 index 0000000000..e73ded4e03 --- /dev/null +++ b/core/assets/baseparts/772861253630165084.msch @@ -0,0 +1,3 @@ +mschxœ%Žknà „ÇØIü¨äV9×È ú;¢xS!a@€“úîMÝ%F¬¾Ñ>fzÆ©™p¾~:“¯¥}ŽëõbU$ %MÈÆ;à ãCeŠ’~rT:ûˆ^/6›»*ú#y’A9²’Õ7ϧà#É)%ŒÚ++5¹Ímáꘌ5Ú;™f²ì‹18Zf•–S4Öb0™f™ü5áô¥2w­èƒðÎO„÷ VëÕ$ÙçN+Ÿ1(åíuÞ +àŒýU¢ü +‡mIŠR«uâ80ŽGF‹úÄ©2ш–U…º€›;FÝÖÛßöÜ~·'§ÇbØ3xb`´ÕË_ Û ݾ¼+Ëÿ©•UÊ \ No newline at end of file diff --git a/core/assets/baseparts/772861891516301334.msch b/core/assets/baseparts/772861891516301334.msch new file mode 100644 index 0000000000..6e69e6b51a Binary files /dev/null and b/core/assets/baseparts/772861891516301334.msch differ diff --git a/core/assets/baseparts/772862221297909760.msch b/core/assets/baseparts/772862221297909760.msch new file mode 100644 index 0000000000..83f138819d Binary files /dev/null and b/core/assets/baseparts/772862221297909760.msch differ diff --git a/core/assets/baseparts/772880624582787112.msch b/core/assets/baseparts/772880624582787112.msch new file mode 100644 index 0000000000..0c260e50d1 Binary files /dev/null and b/core/assets/baseparts/772880624582787112.msch differ diff --git a/core/assets/baseparts/772880838392152095.msch b/core/assets/baseparts/772880838392152095.msch new file mode 100644 index 0000000000..5923b9dfe9 Binary files /dev/null and b/core/assets/baseparts/772880838392152095.msch differ diff --git a/core/assets/baseparts/773972917637611530.msch b/core/assets/baseparts/773972917637611530.msch new file mode 100644 index 0000000000..9c9c4778d6 Binary files /dev/null and b/core/assets/baseparts/773972917637611530.msch differ diff --git a/core/assets/baseparts/773972978551226368.msch b/core/assets/baseparts/773972978551226368.msch new file mode 100644 index 0000000000..7b74ef5219 --- /dev/null +++ b/core/assets/baseparts/773972978551226368.msch @@ -0,0 +1 @@ +mschxœ%] „‡ŸÖ³øàm|3U‰i¢­ÁãíevJš& »1zÄezVŒó}9¿×ÇÔNØßêûÚæ×6¯ /Ó¶ÕöÃއ״ÔGŸv¯‡mýÖà}N?Qäì¨Ìv¶1x™Y(„%½"ž"ÈLBfÒ³´ë' }"Ï! vCd•Þ*b‘LðŽAªA*éM‰õˆ( BâIÕ²Ì|¤’™Ìz!''x™Y(L–Þµ³!Á&`Íï8šÝþ Ú \ No newline at end of file diff --git a/core/assets/baseparts/773973064429993996.msch b/core/assets/baseparts/773973064429993996.msch new file mode 100644 index 0000000000..c383e58c3f --- /dev/null +++ b/core/assets/baseparts/773973064429993996.msch @@ -0,0 +1 @@ +mschxœEÏmjÃ0 à×ùtÚ´ìù»Ó F–˜ÎØÅi»ÑnÙIcóX‘,ËxA¯aã¸zœÃ-¾oa½/~ÞÓ7ûmÊáþ)5 ýE=¥øå¿SF™ÓþðnK˘‡ûý‚þ#‡ùæ‡ÿªÕÇ™«ÂïÖöìÖ¸Ú‰ò˜\Ü\ð@ [~qžöuØÜØOÉ- êöš1ø7}CB7§!¾ÜF}L”3Z.×>‡=àΔ‚âBk¦ƒs…2\qg`¸W-Á +•P ¡ŽÂIh…3”e.e-k+Î0Pé’Öñ„ÓþwÔåp(ßøžx& \ No newline at end of file diff --git a/core/assets/baseparts/773974064850272309.msch b/core/assets/baseparts/773974064850272309.msch new file mode 100644 index 0000000000..8455943a23 Binary files /dev/null and b/core/assets/baseparts/773974064850272309.msch differ diff --git a/core/assets/baseparts/773974140545531924.msch b/core/assets/baseparts/773974140545531924.msch new file mode 100644 index 0000000000..5a1570cd07 Binary files /dev/null and b/core/assets/baseparts/773974140545531924.msch differ diff --git a/core/assets/baseparts/773976628883619840.msch b/core/assets/baseparts/773976628883619840.msch new file mode 100644 index 0000000000..3536999ddf Binary files /dev/null and b/core/assets/baseparts/773976628883619840.msch differ diff --git a/core/assets/baseparts/774001709088505867.msch b/core/assets/baseparts/774001709088505867.msch new file mode 100644 index 0000000000..432907e211 Binary files /dev/null and b/core/assets/baseparts/774001709088505867.msch differ diff --git a/core/assets/baseparts/774002215428816936.msch b/core/assets/baseparts/774002215428816936.msch new file mode 100644 index 0000000000..8c301a217d Binary files /dev/null and b/core/assets/baseparts/774002215428816936.msch differ diff --git a/core/assets/baseparts/774013552553754635.msch b/core/assets/baseparts/774013552553754635.msch new file mode 100644 index 0000000000..68969a7975 --- /dev/null +++ b/core/assets/baseparts/774013552553754635.msch @@ -0,0 +1 @@ +mschxœM‘}rÚ0ÅŸdó¦‡ð-zŽ‚ÕŒ±¨lBÓ›ôŸöž´ô­•4‘Ú}«Ý'|ÔH[s²Ø¸cû¹Ûs>ø`»/¦öWäµeÊ{ç[à“Ó÷6`±÷¦©ö¶íƒ;\޳w ç¦iüSÕlÃ>Xt®q{ßþO¬z×›Ö]N³öIú=Wí[¢|KÔ×ÓË¥y´Á}çù¼»J½¸ÃÂñDèm]u>H÷ñË”igÏ&˜ÁíÕ0óÎþÜóÌ¡ñ×êHã—£séÞfN]oOÕ£w5òaÛùKØ[Î÷ ÕÙ´¶AÞ˜Ž½ëàš«wJÅ_ ð‰ 3 ¿ZE6æ3åCc‚„‰F”5J$ Ã%©^g#¨Û3pûM-…¾ý•j©ÀR-TÊÝ$U¦d˜ úÆJ55-š8à 1Á1‚qÄ$"‹˜FÌ"r¨Œ(&ñZÐzÊp>¹Ýn=ׯA-_ßjÆp!CRñ’E¦åJü%º`\Ž€LϹ[@•ÄjA¬¡–ÄzEìXU mî 'ìÅn%¥ØI•`š·&xÇ)1˜û3¼™ŒáòÕz¢D] !+žÕšá‰mäÌW®jÅp;’ò w;$[â^LÓŽ åä,b1‹Èyu%H#˜Ü‰'(’dA£’¨¥Qã縓›~ñX1J)’z<±v \ No newline at end of file diff --git a/core/assets/bloomshaders/alpha_bloom.frag b/core/assets/bloomshaders/alpha_bloom.frag index a48233ded0..346dbfe232 100644 --- a/core/assets/bloomshaders/alpha_bloom.frag +++ b/core/assets/bloomshaders/alpha_bloom.frag @@ -7,7 +7,7 @@ varying vec2 v_texCoords; void main(){ vec4 original = texture2D(u_texture0, v_texCoords) * OriginalIntensity; - vec4 bloom = texture2D(u_texture1, v_texCoords) * BloomIntensity; - original = original * (vec4(1.0) - bloom); - gl_FragColor = original + bloom; -} \ No newline at end of file + vec4 bloom = texture2D(u_texture1, v_texCoords) * BloomIntensity; + original = original * (vec4(1.0) - bloom); + gl_FragColor = original + bloom; +} diff --git a/core/assets/bloomshaders/alpha_threshold.frag b/core/assets/bloomshaders/alpha_threshold.frag index b2ffe580a6..fc910bed6c 100644 --- a/core/assets/bloomshaders/alpha_threshold.frag +++ b/core/assets/bloomshaders/alpha_threshold.frag @@ -11,4 +11,4 @@ void main(){ gl_FragColor = vec4(0.0); } //gl_FragColor = (texture2D(u_texture0, v_texCoords) - vec4(threshold.r)) * threshold.g; -} \ No newline at end of file +} diff --git a/core/assets/bloomshaders/bloom.frag b/core/assets/bloomshaders/bloom.frag index 65abbe56d1..e6bac1f0bf 100644 --- a/core/assets/bloomshaders/bloom.frag +++ b/core/assets/bloomshaders/bloom.frag @@ -10,4 +10,4 @@ void main(){ vec4 bloom = texture2D(u_texture1, v_texCoords) * BloomIntensity; original = original * (vec4(1.0) - bloom); gl_FragColor = original + bloom; -} \ No newline at end of file +} diff --git a/core/assets/bloomshaders/blurspace.vert b/core/assets/bloomshaders/blurspace.vert index bc16d0b2a7..e766d21cee 100644 --- a/core/assets/bloomshaders/blurspace.vert +++ b/core/assets/bloomshaders/blurspace.vert @@ -23,4 +23,4 @@ void main(){ v_texCoords4 = a_texCoord0 + f; gl_Position = a_position; -} \ No newline at end of file +} diff --git a/core/assets/bloomshaders/maskedtreshold.frag b/core/assets/bloomshaders/maskedtreshold.frag deleted file mode 100644 index ec09b4435a..0000000000 --- a/core/assets/bloomshaders/maskedtreshold.frag +++ /dev/null @@ -1,9 +0,0 @@ -uniform lowp sampler2D u_texture0; -uniform lowp vec2 threshold; -varying vec2 v_texCoords; - -void main(){ - vec4 tex = texture2D(u_texture0, v_texCoords); - vec3 colors = (tex.rgb - threshold.r) * threshold.g * tex.a; - gl_FragColor = vec4(colors, tex.a); -} \ No newline at end of file diff --git a/core/assets/bloomshaders/screenspace.vert b/core/assets/bloomshaders/screenspace.vert index 1c57ff8852..af368efbb4 100644 --- a/core/assets/bloomshaders/screenspace.vert +++ b/core/assets/bloomshaders/screenspace.vert @@ -5,4 +5,4 @@ varying vec2 v_texCoords; void main(){ v_texCoords = a_texCoord0; gl_Position = a_position; -} \ No newline at end of file +} diff --git a/core/assets/bloomshaders/threshold.frag b/core/assets/bloomshaders/threshold.frag index 932bf77c5d..705d6987d5 100644 --- a/core/assets/bloomshaders/threshold.frag +++ b/core/assets/bloomshaders/threshold.frag @@ -4,4 +4,4 @@ varying mediump vec2 v_texCoords; void main(){ gl_FragColor.rgb = (texture2D(u_texture0, v_texCoords).rgb - vec3(threshold.x)) * threshold.y; -} \ No newline at end of file +} diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 647901a572..e918d798aa 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -10,18 +10,21 @@ link.dev-builds.description = Unstable development builds link.trello.description = Official Trello board for planned features link.itch.io.description = itch.io page with PC downloads link.google-play.description = Google Play store listing -link.f-droid.description = F-Droid catalogue listing +link.f-droid.description = F-Droid listing link.wiki.description = Official Mindustry wiki link.suggestions.description = Suggest new features +link.bug.description = Found one? Report it here 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 = Game Over +gameover.disconnect = Disconnect gameover.pvp = The[accent] {0}[] team is victorious! +gameover.waiting = [accent]Waiting for next map... highscore = [accent]New highscore! copied = Copied. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. indev.notready = This part of the game isn't ready yet +indev.campaign = [accent]Congratulations! You've reached the end of the campaign![]\n\nThis is as far as the content goes right now. Interplanetary travel will be added in future updates. load.sound = Sounds load.map = Maps @@ -38,6 +41,14 @@ be.ignore = Ignore be.noupdates = No updates found. be.check = Check for updates +mods.browser = Mod Browser +mods.browser.selected = Selected mod +mods.browser.add = Install +mods.browser.reinstall = Reinstall +mods.github.open = Repo +mods.browser.sortdate = Sort by recent +mods.browser.sortstars = Sort by stars + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -56,7 +67,16 @@ schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. +schematic.tags = Tags: +schematic.edittags = Edit Tags +schematic.addtag = Add Tag +schematic.texttag = Text Tag +schematic.icontag = Icon Tag +schematic.renametag = Rename Tag +schematic.tagdelconfirm = Delete this tag completely? +schematic.tagexists = That tag already exists. +stats = Stats stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -66,7 +86,7 @@ stat.delivered = Resources Launched: stat.playtime = Time Played:[accent] {0} stat.rank = Final Rank: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]Total Items map.delete = Are you sure you want to delete the map "[accent]{0}[]"? level.highscore = High Score: [accent]{0} level.select = Level Select @@ -80,6 +100,7 @@ joingame = Join Game customgame = Custom Game newgame = New Game none = +none.found = [lightgray] minimap = Minimap position = Position close = Close @@ -96,22 +117,24 @@ preparingconfig = Preparing Config preparingcontent = Preparing Content uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes +committingchanges = Committing Changes done = Done feature.unsupported = Your device does not support this feature. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) +mods.initfailed = [red]âš [] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[]\n\nTo disable this feature, turn it off in [accent]Settings->Game->Disable Mods On Startup Crash[]. mods = Mods mods.none = [lightgray]No mods found! mods.guide = Modding Guide mods.report = Report Bug mods.openfolder = Open Folder +mods.viewcontent = View Content mods.reload = Reload mods.reloadexit = The game will now exit, to reload mods. +mod.installed = [[Installed] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled +mod.multiplayer.compatible = [gray]Multiplayer Compatible mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. @@ -144,8 +167,12 @@ planetmap = Planet Map launchcore = Launch Core filename = File Name: unlocked = New content unlocked! +available = New research available! completed = [accent]Completed techtree = Tech Tree +research.legacy = [accent]5.0[] research data found.\nDo you want to [accent]load this data[], or [accent]discard it[] and restart research in the new campaign (recommended)? +research.load = Load +research.discard = Discard research.list = [lightgray]Research: research = Research researched = [lightgray]{0} researched. @@ -190,12 +217,19 @@ servers.local = Local Servers servers.remote = Remote Servers servers.global = Community Servers +servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages. +servers.showhidden = Show Hidden Servers +server.shown = Shown +server.hidden = Hidden + trace = Trace Player trace.playername = Player name: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Unique ID: [accent]{0} +trace.id = ID: [accent]{0} trace.mobile = Mobile Client: [accent]{0} trace.modclient = Custom Client: [accent]{0} +trace.times.joined = Times Joined: [accent]{0} +trace.times.kicked = Times Kicked: [accent]{0} invalidid = Invalid client ID! Submit a bug report. server.bans = Bans server.bans.none = No banned players found! @@ -223,6 +257,7 @@ disconnect.timeout = Timed out. disconnect.data = Failed to load world data! cantconnect = Unable to join game ([accent]{0}[]). connecting = [accent]Connecting... +reconnecting = [accent]Reconnecting... connecting.data = [accent]Loading world data... server.port = Port: server.addressinuse = Address already in use! @@ -268,6 +303,10 @@ cancel = Cancel openlink = Open Link copylink = Copy Link back = Back +max = Max +crash.export = Export Crash Logs +crash.none = No crash logs found. +crash.exported = Crash logs exported. data.export = Export Data data.import = Import Data data.openfolder = Open Data Folder @@ -275,7 +314,6 @@ data.exported = Data exported. data.invalid = This isn't valid game data. data.import.confirm = Importing external data will overwrite[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. quit.confirm = Are you sure you want to quit? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Loading... reloading = [accent]Reloading Mods... saving = [accent]Saving... @@ -284,13 +322,20 @@ cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building +enablebuilding = [scarlet][[{0}][] to enable building +showui = UI hidden.\nPress [accent][[{0}][] to show UI. wave = [accent]Wave {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Wave in {0} wave.waveInProgress = [lightgray]Wave in progress waiting = [lightgray]Waiting... waiting.players = Waiting for players... wave.enemies = [lightgray]{0} Enemies Remaining +wave.enemycores = [accent]{0}[lightgray] Enemy Cores +wave.enemycore = [accent]{0}[lightgray] Enemy Core wave.enemy = [lightgray]{0} Enemy Remaining +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Load Image saveimage = Save Image unknown = Unknown @@ -329,10 +374,10 @@ editor.generation = Generation: editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map +editor.center = Center workshop = Workshop waves.title = Waves waves.remove = Remove -waves.never = waves.every = every waves.waves = wave(s) waves.perspawn = per spawn @@ -361,7 +406,7 @@ editor.removeunit = Remove Unit editor.teams = Teams editor.errorload = Error loading file. editor.errorsave = Error saving file. -editor.errorimage = That's an image, not a map.\n\nIf you want to import a 3.5/build 40 map, use the 'Import Legacy Map' button in the editor. +editor.errorimage = That's an image, not a map. editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. editor.errornot = This is not a map file. editor.errorheader = This map file is either not valid or corrupt. @@ -418,6 +463,7 @@ filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Median filter.oremedian = Ore Median @@ -442,6 +488,7 @@ filter.option.amount = Amount filter.option.block = Block filter.option.floor = Floor filter.option.flooronto = Target Floor +filter.option.target = Target filter.option.wall = Wall filter.option.ore = Ore filter.option.floor2 = Secondary Floor @@ -458,7 +505,10 @@ load = Load save = Save fps = FPS: {0} ping = Ping: {0}ms -language.restart = Please restart your game for the language settings to take effect. +tps = TPS: {0} +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb +language.restart = Restart your game for the language settings to take effect. settings = Settings tutorial = Tutorial tutorial.retake = Re-Take Tutorial @@ -472,27 +522,23 @@ complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} +requirement.produce = Produce {0} requirement.capture = Capture {0} -bestwave = [lightgray]Best Wave: {0} launch.text = Launch -campaign.multiplayer = While playing multiplayer in campaign, you can only research using items from [accent]your[] sectors, [scarlet]not[] the host's sector that you are on right now.\n\nTo get items to [accent]your[] sectors in multiplayer, use a [accent]launch pad[]. +research.multiplayer = Only the host can research items. +map.multiplayer = Only the host can view sectors. uncover = Uncover configure = Configure Loadout -#TODO + loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.from = Launching From: [accent]{0} launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [lightgray]{0} unlocked. -zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} -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 +guardian = Guardian connectfail = [scarlet]Connection error:\n\n[accent]{0} error.unreachable = Server unreachable.\nIs the address spelled correctly? @@ -509,17 +555,47 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: sectors.production = Production: +sectors.export = Export: +sectors.time = Time: +sectors.threat = Threat: +sectors.wave = Wave: sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sectors.enemybase = [scarlet]Enemy Base +sectors.vulnerable = [scarlet]Vulnerable +sectors.underattack = [scarlet]Under attack! [accent]{0}% damaged +sectors.survives = [accent]Survives {0} waves +sectors.go = Go +sector.curcapture = Sector Captured +sector.curlost = Sector Lost +sector.missingresources = [scarlet]Insufficient Core Resources +sector.attacked = Sector [accent]{0}[white] under attack! +sector.lost = Sector [accent]{0}[white] lost! +#note: the missing space in the line below is intentional +sector.captured = Sector [accent]{0}[white]captured! +sector.changeicon = Change Icon -#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway +threat.low = Low +threat.medium = Medium +threat.high = High +threat.extreme = Extreme +threat.eradication = Eradication + +planets = Planets + +planet.serpulo.name = Serpulo +planet.sun.name = Sun + +sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -531,10 +607,10 @@ sector.overgrowth.name = Overgrowth sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass - -#unused -#sector.impact0078.name = Impact 0078 -#sector.crags.name = Crags +sector.biomassFacility.name = Biomass Synthesis Facility +sector.windsweptIslands.name = Windswept Islands +sector.extractionOutpost.name = Extraction Outpost +sector.planetaryTerminal.name = Planetary Launch Terminal sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.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. @@ -542,11 +618,30 @@ sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats sector.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. sector.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. sector.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. -sector.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. +sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Mace units. Destroy it. sector.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. sector.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. sector.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. sector.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. +sector.biomassFacility.description = The origin of spores. This is the facility in which they were researched and initially produced.\nResearch the technology contained within. Cultivate spores for the production of fuel and plastics.\n\n[lightgray]Upon this facility's demise, the spores were released. Nothing in the local ecosystem could compete with such an invasive organism. +sector.windsweptIslands.description = Further past the shoreline is this remote chain of islands. Records show they once had [accent]Plastanium[]-producing structures.\n\nFend off the enemy's naval units. Establish a base on the islands. Research these factories. +sector.extractionOutpost.description = A remote outpost, constructed by the enemy for the purpose of launching resources to other sectors.\n\nCross-sector transport technology is essential for further conquest. Destroy the base. Research their Launch Pads. +sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology. +sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure. + +status.burning.name = Burning +status.freezing.name = Freezing +status.wet.name = Wet +status.muddy.name = Muddy +status.melting.name = Melting +status.sapped.name = Sapped +status.electrified.name = Electrified +status.spore-slowed.name = Spore Slowed +status.tarred.name = Tarred +status.overclock.name = Overclock +status.shocked.name = Shocked +status.blasted.name = Blasted +status.unmoving.name = Unmoving settings.language = Language settings.data = Game Data @@ -562,60 +657,107 @@ settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done 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.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned -unplaceable.sectorcaptured = [scarlet]Requires captured sector +unsupported.environment = [scarlet]Unsupported Environment yes = Yes no = No info.title = Info error.title = [scarlet]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.memorycapacity = Memory Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = Purpose +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.opposites = Opposites +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.repairspeed = Repair Speed +stat.weapons = Weapons +stat.bullet = Bullet +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.armor = Armor +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.charge = Charge +stat.heatcapacity = Heat Capacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities +stat.canboost = Can Boost +stat.flying = Flying +stat.ammouse = Ammo Use +stat.damagemultiplier = Damage Multiplier +stat.healthmultiplier = Health Multiplier +stat.speedmultiplier = Speed Multiplier +stat.reloadmultiplier = Reload Multiplier +stat.buildspeedmultiplier = Build Speed Multiplier +stat.reactive = Reacts +stat.healing = Healing + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = {0} Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field +ability.movelightning = Movement Lightning +ability.energyfield = Energy Field: [accent]{0}[] damage ~ [accent]{1}[] blocks / [accent]{2}[] targets bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -623,34 +765,41 @@ bar.corereq = Core Base Required bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% +bar.boost = Boost: {0}% bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = Liquid bar.heat = Heat bar.power = Power bar.progress = Build Progress bar.input = Input bar.output = Output +bar.strength = [stat]{0}[lightgray]x strength + +units.processorcontrol = [lightgray]Processor Controlled bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing -bullet.shock = [stat]shock bullet.frag = [stat]frag +bullet.lightning = [stat]{0}[lightgray]x lightning ~ [stat]{1}[lightgray] damage +bullet.buildingdamage = [stat]{0}%[lightgray] building damage bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce +bullet.healpercent = [stat]{0}[lightgray]% healing bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x fire rate unit.blocks = blocks +unit.blockssquared = blocks² unit.powersecond = power units/second unit.liquidsecond = liquid units/second unit.itemssecond = items/second @@ -668,22 +817,27 @@ unit.items = items unit.thousands = k unit.millions = mil unit.billions = b +unit.pershot = /shot +category.purpose = Purpose category.general = General category.power = Power category.liquids = Liquids category.items = Items category.crafting = Input/Output -category.shooting = Shooting +category.function = Function category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints +setting.logichints.name = Logic Hints setting.flow.name = Display Resource Flow Rate +setting.backgroundpause.name = Pause In Background setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Animated Fluids +setting.doubletapmine.name = Double-Tap to Mine +setting.modcrashdisable.name = Disable Mods On Startup Crash +setting.animatedwater.name = Animated Surfaces setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.playerindicators.name = Player Indicators @@ -710,17 +864,15 @@ setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Save Interval setting.seconds = {0} seconds -setting.blockselecttimeout.name = Block Select Timeout setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) setting.fps.name = Show FPS & Ping setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate setting.minimap.name = Show Minimap -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Display Core Items setting.position.name = Show Player Position setting.musicvol.name = Music Volume setting.atmosphere.name = Show Planet Atmosphere @@ -736,7 +888,9 @@ setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat +setting.showweather.name = Show Weather Graphics public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]? public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Cancel & Exit @@ -800,6 +954,9 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap +keybind.planet_map.name = Planet Map +keybind.research.name = Research +keybind.block_info.name = Block Info keybind.chat.name = Chat keybind.player_list.name = Player List keybind.console.name = Console @@ -809,6 +966,7 @@ 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.chat_mode.name = Change Chat Mode keybind.drop_unit.name = Drop Unit keybind.zoom_minimap.name = Zoom Minimap mode.help.title = Description of modes @@ -825,17 +983,21 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.coreincinerates = Core Incinerates Overflow rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode rules.buildai = AI Building +rules.corecapture = Capture Core On Destruction rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier +rules.unitcapvariable = Cores Contribute To Unit Cap +rules.unitcap = Base Unit Cap rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) rules.wavespacing = Wave Spacing:[lightgray] (sec) rules.buildcostmultiplier = Build Cost Multiplier @@ -857,12 +1019,16 @@ rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light rules.weather = Weather rules.weather.frequency = Frequency: +rules.weather.always = Always rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids content.unit.name = Units content.block.name = Blocks +content.status.name = Status Effects +content.sector.name = Sectors + item.copper.name = Copper item.lead.name = Lead item.coal.name = Coal @@ -879,28 +1045,12 @@ item.blast-compound.name = Blast Compound item.pyratite.name = Pyratite item.metaglass.name = Metaglass item.scrap.name = Scrap + liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid -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} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viscosity: {0} -liquid.temperature = [lightgray]Temperature: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -939,8 +1089,10 @@ block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder +block.basalt-boulder.name = Basalt Boulder block.grass.name = Grass block.slag.name = Slag +block.space.name = Space block.salt.name = Salt block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -981,11 +1133,13 @@ block.darksand.name = Dark Sand block.ice.name = Ice block.snow.name = Snow block.craters.name = Craters -block.sand-water.name = Sand water +block.sand-water.name = Sand Water block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite +block.rhyolite.name = Rhyolite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1034,7 +1188,6 @@ block.conveyor.name = Conveyor block.titanium-conveyor.name = Titanium Conveyor block.plastanium-conveyor.name = Plastanium Conveyor block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts. block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor @@ -1042,7 +1195,6 @@ block.sorter.name = Sorter block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.illuminator.name = Illuminator -block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Overflow Gate block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter @@ -1076,7 +1228,7 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave @@ -1093,6 +1245,7 @@ block.solar-panel.name = Solar Panel block.solar-panel-large.name = Large Solar Panel block.oil-extractor.name = Oil Extractor block.repair-point.name = Repair Point +block.repair-turret.name = Repair Turret block.pulse-conduit.name = Pulse Conduit block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phase Conduit @@ -1138,6 +1291,11 @@ block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Overdrive Dome +#experimental, may be removed +block.block-forge.name = Block Forge +block.block-loader.name = Block Loader +block.block-unloader.name = Block Unloader +block.interplanetary-accelerator.name = Interplanetary Accelerator block.switch.name = Switch block.micro-processor.name = Micro Processor @@ -1149,166 +1307,399 @@ block.memory-cell.name = Memory Cell block.memory-bank.name = Memory Bank team.blue.name = blue -team.crux.name = red -team.sharded.name = orange -team.orange.name = orange +team.crux.name = crux +team.sharded.name = sharded team.derelict.name = derelict team.green.name = green team.purple.name = purple -tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse[accent] [[WASD][] to move.\n[accent]Scroll[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\n[accent]Right-click[] to stop building. -tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. -tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\nUse the scrollwheel to rotate blocks before placing them.\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. -tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. -tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo[] to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 -tutorial.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 obtained resources can then be used to research new technology.\n\n[accent]Press the launch button. +hint.skip = Skip +hint.desktopMove = Use [accent][[WASD][] to move. +hint.zoom = [accent]Scroll[] to zoom in or out. +hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually. +hint.desktopShoot = [accent][[Left-click][] to shoot. +hint.depositItems = To transfer items, drag from your ship to the core. +hint.respawn = To respawn as a ship, press [accent][[V][]. +hint.respawn.mobile = You have switched control to a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[] +hint.desktopPause = Press [accent][[Space][] to pause and unpause the game. +hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it. +hint.placeDrill.mobile = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm. +hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. +hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors. +hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them. +hint.breaking = [accent]Right-click[] and drag to break blocks. +hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection. +hint.blockInfo = View information of a block by selecting it in the [accent]build menu[], then selecting the [accent][[?][] button at the right. +hint.research = Use the \ue875 [accent]Research[] button to research new technology. +hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology. +hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. +hint.unitControl.mobile = [accent][[Double-tap][] to control friendly units or turrets. +hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right. +hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[]. +hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type. +hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path. +hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path. +hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters. +hint.command = Press [accent][[G][] to command nearby units of [accent]similar type[] into formation.\n\nTo command ground units, you must first control another ground unit. +hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation. +hint.payloadPickup = Press [accent][[[] to pick up small blocks or units. +hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up. +hint.payloadDrop = Press [accent]][] to drop a payload. +hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. +hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. +hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[]. +hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. +hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the ï¡© [accent]Shard[] core. Make sure it is free from nearby obstructions. +hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[]. +hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. +hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. -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 components. -item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. -item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. -item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. -item.silicon.description = An extremely useful semiconductor. Applications in solar panels, complex electronics and homing turret ammunition. -item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. -item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.spore-pod.description = A pod of synthetic spores, synthesized from atmospheric concentrations for industrial purposes. Used for conversion into oil, explosives and fuel. -item.blast-compound.description = An unstable compound used in bombs and explosives. Synthesized from spore pods and other volatile substances. Use as fuel is not advised. -item.pyratite.description = An extremely flammable substance used in incendiary weapons. -liquid.water.description = The most useful liquid. Commonly used for cooling machines and waste processing. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. -liquid.oil.description = A liquid used in advanced material production. Can be converted into coal as fuel, or sprayed and set on fire as a weapon. -liquid.cryofluid.description = An inert, non-corrosive liquid created from water and titanium. Has extremely high heat capacity. Extensively used as coolant. +item.copper.description = Used in all types of construction and ammunition. +item.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced. +item.lead.description = Used in liquid transportation and electrical structures. +item.lead.details = Dense. Inert. Extensively used in batteries.\nNote: Likely toxic to biological life forms. Not that there are many left here. +item.metaglass.description = Used in liquid distribution/storage structures. +item.graphite.description = Used in electrical components and turret ammunition. +item.sand.description = Used for production of other refined materials. +item.coal.description = Used for fuel and refined material production. +item.coal.details = Appears to be fossilized plant matter, formed long before the seeding event. +item.titanium.description = Used in liquid transportation structures, drills and factories. +item.thorium.description = Used in durable structures and as nuclear fuel. +item.scrap.description = Used in Melters and Pulverizers for refining into other materials. +item.scrap.details = Leftover remnants of old structures and units. +item.silicon.description = Used in solar panels, complex electronics and homing turret ammunition. +item.plastanium.description = Used in advanced units, insulation and fragmentation ammunition. +item.phase-fabric.description = Used in advanced electronics and self-repairing structures. +item.surge-alloy.description = Used in advanced weaponry and reactive defense structures. +item.spore-pod.description = Used for conversion into oil, explosives and fuel. +item.spore-pod.details = Spores. Likely a synthetic life form. Emit gases toxic to other biological life. Extremely invasive. Highly flammable in certain conditions. +item.blast-compound.description = Used in bombs and explosive ammunition. +item.pyratite.description = Used in incendiary weapons and combustion-fueled generators. -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = 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. +liquid.water.description = Used for cooling machines and waste processing. +liquid.slag.description = Refined in separators into constituent metals, or sprayed at enemies as a weapon. +liquid.oil.description = Used in advanced material production and as incendiary ammunition. +liquid.cryofluid.description = Used as coolant in reactors, turrets and factories. + +block.resupply-point.description = Resupplies nearby units with copper ammunition. Not compatible with units that require battery power. +block.armored-conveyor.description = Moves items forward. Does not accept inputs from the sides. +block.illuminator.description = Emits light. +block.message.description = Stores a message for communication between allies. +block.graphite-press.description = Compresses coal into graphite. +block.multi-press.description = Compresses coal into graphite. Requires water as coolant. +block.silicon-smelter.description = Refines silicon from sand and coal. +block.kiln.description = Smelts sand and lead into metaglass. block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. -block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. -block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. -block.separator.description = Separates slag into its mineral components. Outputs the cooled result. -block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. +block.phase-weaver.description = Synthesizes phase fabric from thorium and sand. +block.alloy-smelter.description = Fuses titanium, lead, silicon and copper into surge alloy. +block.cryofluid-mixer.description = Mixes water and fine titanium powder to produce cryofluid. +block.blast-mixer.description = Produces blast compound from pyratite and spore pods. +block.pyratite-mixer.description = Mixes coal, lead and sand into pyratite. +block.melter.description = Melts down scrap into slag. +block.separator.description = Separates slag into its mineral components. +block.spore-press.description = Compresses spore pods into oil. block.pulverizer.description = Crushes scrap into fine sand. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. -block.incinerator.description = Vaporizes any excess item or liquid it receives. -block.power-void.description = Voids all power inputted into it. Sandbox only. +block.coal-centrifuge.description = Transforms oil into coal. +block.incinerator.description = Vaporizes any item or liquid it receives. +block.power-void.description = Voids all power inputted. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.liquid-void.description = Removes any 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.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. -block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. -block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. -block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. -block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. -block.door.description = A small door. Can be opened or closed by tapping. -block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = An upgraded version of the Mender. Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. +block.copper-wall.description = Protects structures from enemy projectiles. +block.copper-wall-large.description = Protects structures from enemy projectiles. +block.titanium-wall.description = Protects structures from enemy projectiles. +block.titanium-wall-large.description = Protects structures from enemy projectiles. +block.plastanium-wall.description = Protects structures from enemy projectiles. Absorbs lasers and electric arcs. Blocks automatic power connections. +block.plastanium-wall-large.description = Protects structures from enemy projectiles. Absorbs lasers and electric arcs. Blocks automatic power connections. +block.thorium-wall.description = Protects structures from enemy projectiles. +block.thorium-wall-large.description = Protects structures from enemy projectiles. +block.phase-wall.description = Protects structures from enemy projectiles, reflecting most bullets upon impact. +block.phase-wall-large.description = Protects structures from enemy projectiles, reflecting most bullets upon impact. +block.surge-wall.description = Protects structures from enemy projectiles, periodically releasing electric arcs upon contact. +block.surge-wall-large.description = Protects structures from enemy projectiles, periodically releasing electric arcs upon contact. +block.door.description = A wall that can be opened and closed. +block.door-large.description = A wall that can be opened and closed. +block.mender.description = Periodically repairs blocks in its vicinity.\nOptionally uses silicon to boost range and efficiency. +block.mend-projector.description = Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric can be used to increase shield size. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into blocks. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front.\nRequires multiple loading and unloading points for peak throughput. -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.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. -block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] -block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. -block.overflow-gate.description = Only outputs to the left and right if the front path is blocked. -block.underflow-gate.description = The opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. -block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. -block.thermal-pump.description = The ultimate pump. -block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. -block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -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.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 increases shield size. +block.shock-mine.description = Releases electric arcs upon enemy unit contact. +block.conveyor.description = Transports items forward. +block.titanium-conveyor.description = Transports items forward. Faster than a standard conveyor. +block.plastanium-conveyor.description = Transports items forward in batches. Accepts items at the back, and unloads them in three directions at the front. Requires multiple loading and unloading points for peak throughput. +block.junction.description = Acts as a bridge for two crossing conveyor belts. +block.bridge-conveyor.description = Transports items over terrain or buildings. +block.phase-conveyor.description = Instantly transports items over terrain or buildings. Longer range than the item bridge, but requires power. +block.sorter.description = If an input item matches the selection, it passes forward. Otherwise, the item is outputted to the left and right. +block.inverted-sorter.description = Similar to a standard sorter, but outputs selected items to the sides instead. +block.router.description = Distributes input items to 3 output directions equally. +block.router.details = A necessary evil. Using next to production inputs is not advised, as they will get clogged by output. +block.distributor.description = Distributes input items to 7 output directions equally. +block.overflow-gate.description = Only outputs items to the left and right if the front path is blocked. +block.underflow-gate.description = Opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. +block.mass-driver.description = Long-range item transport structure. Collects batches of items and shoots them to other mass drivers. +block.mechanical-pump.description = Pumps and outputs liquids. Does not require power. +block.rotary-pump.description = Pumps and outputs liquids. Requires power. +block.thermal-pump.description = Pumps and outputs liquids. +block.conduit.description = Moves liquids forward. Used in conjunction with pumps and other conduits. +block.pulse-conduit.description = Moves liquids forward. Transports faster and stores more than standard conduits. +block.plated-conduit.description = Moves liquids forward. Does not accept input from the sides. Does not leak. +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. +block.liquid-tank.description = Stores a large amount of liquid. Outputs to all sides, similarly to a liquid router. +block.liquid-junction.description = Acts as a bridge for two crossing conduits. +block.bridge-conduit.description = Transports liquids over terrain or buildings. +block.phase-conduit.description = Transports liquids over terrain or buildings. Longer range than the bridge conduit, but requires power. block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = An advanced power node with greater range. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. -block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. -block.battery-large.description = Stores much more power than a regular battery. +block.surge-tower.description = A long-range power node with fewer available connections. +block.diode.description = Moves battery power in one direction, but only if the other side has less power stored. +block.battery.description = Stores power in times of surplus energy. Outputs power in times of deficit. +block.battery-large.description = Stores power in times of surplus energy. Outputs power in times of deficit. Higher capacity than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = Generates power by burning flammable materials and converting water to steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. +block.rtg-generator.description = Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. -block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. +block.solar-panel-large.description = Provides a small amount of power from the sun. More efficient than 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. +block.impact-reactor.description = Creates massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. +block.mechanical-drill.description = When placed on ore, outputs items at a slow pace indefinitely. Only capable of mining basic resources. block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. block.blast-drill.description = The ultimate drill. Requires large amounts of power. block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. -block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. +block.cultivator.description = Cultivates tiny concentrations of atmospheric spores into spore pods. +block.cultivator.details = Recovered technology. Used to produce massive amounts of biomass as efficiently as possible. Likely the initial incubator of the spores now covering Serpulo. block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. -block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. -block.core-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = Stores a large amount of items of each type. An unloader block can be used to retrieve items from the vault. -block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. -block.unloader.description = Unloads items from any nearby non-transportation block. The type of item to be unloaded can be changed by tapping. -block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. -block.duo.description = A small, cheap turret. Useful against ground units. -block.scatter.description = An essential anti-air turret. Sprays clumps of lead, scrap or metaglass flak at enemy units. +block.core-shard.description = Core of the base. Once destroyed, the sector is lost. +block.core-shard.details = The first iteration. Compact. Self-replicating. Equipped with single-use launch thrusters. Not designed for interplanetary travel. +block.core-foundation.description = Core of the base. Well armored. Stores more resources than a Shard. +block.core-foundation.details = The second iteration. +block.core-nucleus.description = Core of the base. Extremely well armored. Stores massive amounts of resources. +block.core-nucleus.details = The third and final iteration. +block.vault.description = Stores a large amount of items of each type. Contents can be retrieved with an unloader. +block.container.description = Stores a small amount of items of each type. Contents can be retrieved with an unloader. +block.unloader.description = Unloads the selected item from nearby blocks. +block.launch-pad.description = Launches batches of items to selected sectors. +block.duo.description = Fires alternating bullets at enemies. +block.scatter.description = Fires clumps of lead, scrap or metaglass flak at enemy aircraft. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. -block.hail.description = A small, long-range artillery turret. -block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. -block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. -block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. -block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. -block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. -block.fuse.description = A large, close-range shrapnel turret. Fires three piercing blasts 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.repair-point.description = Continuously heals the closest damaged unit in its vicinity. +block.hail.description = Fires small shells at ground enemies over long distances. +block.wave.description = Fires streams of liquid at enemies. Automatically extinguishes fires when supplied with water. +block.lancer.description = Charges and fires powerful beams of energy at ground targets. +block.arc.description = Fires arcs of electricity at ground targets. +block.swarmer.description = Fires homing missiles at enemies. +block.salvo.description = Fires quick salvos of bullets at enemies. +block.fuse.description = Fires three close-range piercing blasts at nearby enemies. +block.ripple.description = Shoots clusters of shells at ground enemies over long distances. +block.cyclone.description = Fires explosive clumps of flak at nearby enemies. +block.spectre.description = Fires large armor-piercing bullets at air and ground targets. +block.meltdown.description = Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. +block.foreshadow.description = Fires a large single-target bolt over long distances. Prioritizes enemies with higher max health. +block.repair-point.description = Continuously repairs the closest damaged unit in its vicinity. block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.parallax.description = Fires a tractor beam that pulls in air targets, damaging them in the process. +block.tsunami.description = Fires powerful streams of liquid at enemies. Automatically extinguishes fires when supplied with water. +block.silicon-crucible.description = Refines silicon from sand and coal, using pyratite as an additional heat source. More efficient in hot locations. +block.disassembler.description = Separates slag into trace amounts of exotic mineral components at low efficiency. Can produce thorium. +block.overdrive-dome.description = Increases the speed of nearby buildings. Requires phase fabric and silicon to operate. +block.payload-conveyor.description = Moves large payloads, such as units from factories. +block.payload-router.description = Splits input payloads into 3 output directions. +block.command-center.description = Controls unit behavior with several different commands. +block.ground-factory.description = Produces ground units. Output units can be used directly, or moved into reconstructors for upgrading. +block.air-factory.description = Produces air units. Output units can be used directly, or moved into reconstructors for upgrading. +block.naval-factory.description = Produces naval units. Output units can be used directly, or moved into reconstructors for upgrading. +block.additive-reconstructor.description = Upgrades inputted units to the second tier. +block.multiplicative-reconstructor.description = Upgrades inputted units to the third tier. +block.exponential-reconstructor.description = Upgrades inputted units to the fourth tier. +block.tetrative-reconstructor.description = Upgrades inputted units to the fifth and final tier. +block.switch.description = A toggleable switch. State can be read and controlled with logic processors. +block.micro-processor.description = Runs a sequence of logic instructions in a loop. Can be used to control units and buildings. +block.logic-processor.description = Runs a sequence of logic instructions in a loop. Can be used to control units and buildings. Faster than the micro processor. +block.hyper-processor.description = Runs a sequence of logic instructions in a loop. Can be used to control units and buildings. Faster than the logic processor. +block.memory-cell.description = Stores information for a logic processor. +block.memory-bank.description = Stores information for a logic processor. High capacity. +block.logic-display.description = Displays arbitrary graphics from a logic processor. +block.large-logic-display.description = Displays arbitrary graphics from a logic processor. +block.interplanetary-accelerator.description = A massive electromagnetic railgun tower. Accelerates cores to escape velocity for interplanetary deployment. +unit.dagger.description = Fires standard bullets at all nearby enemies. +unit.mace.description = Fires streams of flame at all nearby enemies. +unit.fortress.description = Fires long-range artillery at ground targets. +unit.scepter.description = Fires a barrage of charged bullets at all nearby enemies. +unit.reign.description = Fires a barrage of massive piercing bullets at all nearby enemies. +unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight. +unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight. +unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded. +unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight. +unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain. +unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion. +unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain. +unit.spiroct.description = Fires sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. +unit.arkyid.description = Fires large sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. +unit.toxopid.description = Fires large electric cluster-shells and piercing lasers at enemies. Can step over most terrain. +unit.flare.description = Fires standard bullets at nearby ground targets. +unit.horizon.description = Drops clusters of bombs on ground targets. +unit.zenith.description = Fires salvos of missiles at all nearby enemies. +unit.antumbra.description = Fires a barrage of bullets at all nearby enemies. +unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies. +unit.mono.description = Automatically mines copper and lead, depositing it into the core. +unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction. +unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units. +unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units. +unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units. +unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies. +unit.minke.description = Fires shells and standard bullets at nearby ground targets. +unit.bryde.description = Fires long-range artillery shells and missiles at enemies. +unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies. +unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units. +unit.alpha.description = Defends the Shard core from enemies. Builds structures. +unit.beta.description = Defends the Foundation core from enemies. Builds structures. +unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. + +lst.read = Read a number from a linked memory cell. +lst.write = Write a number to a linked memory cell. +lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. +lst.drawflush = Flush queued [accent]Draw[] operations to a display. +lst.printflush = Flush queued [accent]Print[] operations to a message block. +lst.getlink = Get a processor link by index. Starts at 0. +lst.control = Control a building. +lst.radar = Locate units around a building with range. +lst.sensor = Get data from a building or unit. +lst.set = Set a variable. +lst.operation = Perform an operation on 1-2 variables. +lst.end = Jump to the top of the instruction stack. +lst.jump = Conditionally jump to another statement. +lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. +lst.unitcontrol = Control the currently bound unit. +lst.unitradar = Locate units around the currently bound unit. +lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. + +logic.nounitbuild = [red]Unit building logic is not allowed here. + +lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. +lenum.shoot = Shoot at a position. +lenum.shootp = Shoot at a unit/building with velocity prediction. +lenum.config = Building configuration, e.g. sorter item. +lenum.enabled = Whether the block is enabled. + +laccess.color = Illuminator color. +laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself. +laccess.dead = Whether a unit/building is dead or no longer valid. +laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0. +laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. +laccess.progress = Action progress, 0 to 1.\nReturns production, turret reload or construction progress. + +graphicstype.clear = Fill the display with a color. +graphicstype.color = Set color for next drawing operations. +graphicstype.stroke = Set line width. +graphicstype.line = Draw line segment. +graphicstype.rect = Fill a rectangle. +graphicstype.linerect = Draw a rectangle outline. +graphicstype.poly = Fill a regular polygon. +graphicstype.linepoly = Draw a regular polygon outline. +graphicstype.triangle = Fill a triangle. +graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[]. + +lenum.always = Always true. +lenum.idiv = Integer division. +lenum.div = Division.\nReturns [accent]null[] on divide-by-zero. +lenum.mod = Modulo. +lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0. +lenum.notequal = Not equal. Coerces types. +lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[]. +lenum.shl = Bit-shift left. +lenum.shr = Bit-shift right. +lenum.or = Bitwise OR. +lenum.land = Logical AND. +lenum.and = Bitwise AND. +lenum.not = Bitwise flip. +lenum.xor = Bitwise XOR. + +lenum.min = Minimum of two numbers. +lenum.max = Maximum of two numbers. +lenum.angle = Angle of vector in degrees. +lenum.len = Length of vector. +lenum.sin = Sine, in degrees. +lenum.cos = Cosine, in degrees. +lenum.tan = Tangent, in degrees. +#not a typo, look up 'range notation' +lenum.rand = Random decimal in range [0, value). +lenum.log = Natural logarithm (ln). +lenum.log10 = Base 10 logarithm. +lenum.noise = 2D simplex noise. +lenum.abs = Absolute value. +lenum.sqrt = Square root. + +lenum.any = Any unit. +lenum.ally = Ally unit. +lenum.attacker = Unit with a weapon. +lenum.enemy = Enemy unit. +lenum.boss = Guardian unit. +lenum.flying = Flying unit. +lenum.ground = Ground unit. +lenum.player = Unit controlled by a player. + +lenum.ore = Ore deposit. +lenum.damaged = Damaged ally building. +lenum.spawn = Enemy spawn point.\nMay be a core or a position. +lenum.building = Building in a specific group. + +lenum.core = Any core. +lenum.storage = Storage building, e.g. Vault. +lenum.generator = Buildings that generate power. +lenum.factory = Buildings that transform resources. +lenum.repair = Repair points. +lenum.rally = Command center. +lenum.battery = Any battery. +lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled. +lenum.reactor = Impact/Thorium reactor. +lenum.turret = Any turret. + +sensor.in = The building/unit to sense. + +radar.from = Building to sense from.\nSensor range is limited by building range. +radar.target = Filter for units to sense. +radar.and = Additional filters. +radar.order = Sorting order. 0 to reverse. +radar.sort = Metric to sort results by. +radar.output = Variable to write output unit to. + +unitradar.target = Filter for units to sense. +unitradar.and = Additional filters. +unitradar.order = Sorting order. 0 to reverse. +unitradar.sort = Metric to sort results by. +unitradar.output = Variable to write output unit to. + +control.of = Building to control. +control.unit = Unit/building to aim at. +control.shoot = Whether to shoot. + +unitlocate.enemy = Whether to locate enemy buildings. +unitlocate.found = Whether the object was found. +unitlocate.building = Output variable for located building. +unitlocate.outx = Output X coordinate. +unitlocate.outy = Output Y coordinate. +unitlocate.group = Building group to look for. + +lenum.idle = Don't move, but keep building/mining.\nThe default state. +lenum.stop = Stop moving/mining/building. +lenum.move = Move to exact position. +lenum.approach = Approach a position with a radius. +lenum.pathfind = Pathfind to the enemy spawn. +lenum.target = Shoot a position. +lenum.targetp = Shoot a target with velocity prediction. +lenum.itemdrop = Drop an item. +lenum.itemtake = Take an item from a building. +lenum.paydrop = Drop current payload. +lenum.paytake = Pick up payload at current location. +lenum.flag = Numeric unit flag. +lenum.mine = Mine at a position. +lenum.build = Build a structure. +lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[]. +lenum.within = Check if unit is near a position. +lenum.boost = Start/stop boosting. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index f62aba4377..59d125147c 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1,4 +1,4 @@ -credits.text = Стваральнiк [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nÐÑць недапрацоўкі Ñž перакладзе або хочаце знайÑці Ñаюзнікаў Ð´Ð»Ñ ÑумеÑнай гульні?\nПішыце Ñž аф. [accent]discord-Ñервер Mindustry[] у канал [accent]#translations[].\n\nРÑдактар Ñ– перакладчык на беларуÑкую мову:\n[cyan]K[gray]evi[cyan]TV[gray]#9923 +credits.text = Стваральнiк [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nÐÑць недапрацоўкі Ñž перакладзе або хочаце знайÑці Ñаюзнікаў Ð´Ð»Ñ ÑумеÑнай гульні?\nПішыце Ñž аф. [accent]discord-Ñервер Mindustry[] у канал [accent]#translations[].\n\nРÑдактар Ñ– перакладчык на беларуÑкую мову:\n[cyan]K[gray]evi[cyan]TV[gray]#9923\nVit_log выправіў памылкі Ñ– дапоўніў пераклад. credits = Ðўтары contributors = Перакладчык discord = ДалучайцеÑÑ Ð´Ð° нашага Discord! @@ -20,8 +20,8 @@ gameover = Ð“ÑƒÐ»ÑŒÐ½Ñ Ñкончана gameover.pvp = [accent]{0}[] каманда перамагла! highscore = [accent]Ðовы Ñ€Ñкорд! copied = СкапіÑвана. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.popup = [accent]в6[] ÑÑˆÑ‡Ñ Ð² [accent]альфе[].\n[lightgray]ГÑта значыць:[]\n[scarlet]- ÐšÐ°Ð¼Ð¿Ð°Ð½Ñ–Ñ Ð½Ðµ завершана[]\n- ЧаÑткі гульні адÑутнічаюць\n - Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ‡Ð°Ñтка [scarlet]ШІ юнітав[] можа працаваць не правільна\n- МноÑтва юнітав не дароблена\n- ÐŽÑÑ‘ што тут Ñ‘Ñць можа быць ізменена.\n\nÐб багах Ñ– крашах піÑаць на [accent]Github[]. +indev.notready = ГÑта чаÑтка гульні ÑÑˆÑ‡Ñ Ð½Ðµ зроблена. load.sound = Звукі load.map = Карты @@ -41,8 +41,8 @@ be.check = Праверыць абнаўленні schematic = Схема schematic.add = Захаваць Ñхему... schematics = Схемы -schematic.replace = A schematic by that name already exists. Replace it? -schematic.exists = A schematic by that name already exists. +schematic.replace = Схема Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ імем ўжо Ñ–Ñнуе. ЗамÑніць Ñе? +schematic.exists = Схема Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ імем ўжо Ñ–Ñнуе. schematic.import = Імпартаваць Ñхему... schematic.exportfile = ЭкÑпартаваць файл schematic.importfile = Імпартаваць файл @@ -55,6 +55,7 @@ schematic.saved = Схема захавана. schematic.delete.confirm = ГÑÑ‚Ð°Ñ Ñхема будзе выдалена. schematic.rename = Перайменаваць Ñхему schematic.info = {0}x{1}, {2} блокаў +schematic.disabled = [scarlet]Схемы забаронены[]\nВам нельга выкарыÑтоўваць Ñхемы на гÑтай [accent]карце[] альбо [accent]Ñерверы. stat.wave = ХвалÑÑž адлюÑтравана:[accent] {0} stat.enemiesDestroyed = Ворагаў знішчана:[accent] {0} @@ -100,22 +101,21 @@ done = Гатова feature.unsupported = Ваша прылада не падтрымлівае гÑтую магчымаÑць. mods.alphainfo = Майце на ўвазе, што мадыфікацыі знаходзÑцца Ñž альфа-верÑÑ–Ñ– Ñ– [scarlet]могуць утрымліваць шмат памылак[]. Дакладвайце аб любых праблемах, ÑÐºÑ–Ñ Ð’Ñ‹ знойдзеце Ñž Mindustry Github або Discord. -mods.alpha = [accent](Ðльфа) mods = Мадыфікацыі mods.none = [lightgray]Мадыфікацыі не знойдзены! -mods.guide = Кіраўніцтва па модам +mods.guide = Кіраўніцтва па мадам mods.report = Паведаміць пра памылку mods.openfolder = Ðдкрыць Ñ‚Ñчку з мадыфікацыÑмі mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Ð“ÑƒÐ»ÑŒÐ½Ñ Ð·Ð°Ñ€Ð°Ð· закроецца, каб ÑžÑталÑваць мады. mod.display = [gray]МадыфікацыÑ:[orange] {0} mod.enabled = [lightgray]Уключана mod.disabled = [scarlet]Выключана mod.disable = Выкл. -mod.content = Content: +mod.content = ЗмеÑÑ‚: mod.delete.error = Ðемагчыма выдаліць мадыфікацыю. Магчыма, файл выкарыÑтоўваецца. mod.requiresversion = [scarlet]ÐœÑ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±Ð°Ð²Ð°Ð½Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ–: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]Ðе ÑумÑшчальна з в6 (нÑма minGameVersion: 105) mod.missingdependencies = [scarlet]Ðе знойдзены бацькоўÑÐºÑ–Ñ Ð¼Ð°Ð´Ñ‹Ñ„Ñ–ÐºÐ°Ñ†Ñ‹Ñ–: {0} mod.erroredcontent = [scarlet]Памылкі змеÑціва mod.errors = Памылкі былі Ð²Ñ‹ÐºÐ»Ñ–ÐºÐ°Ð½Ñ‹Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ñ‹Ð¼ змеÑцівам. @@ -127,20 +127,20 @@ mod.reloadrequired = [scarlet]Ðеабходны перазапуÑк mod.import = Імпартаваць мадыфікацыю mod.import.file = Import File mod.import.github = Імпартаваць мод з GitHub -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR-мады не бÑÑпечны па прынцыпу.[]\nПраверце, што імпартуеце гÑты мод Ñ Ð½Ð°Ð´Ð·ÐµÐ¹Ð½Ð°Ð¹ крыніцы! mod.item.remove = ГÑты прадмет з’ÑўлÑецца чаÑткай мадыфікацыі [accent]«{0}»[]. Каб выдаліць Ñго, выдаліце Ñаму мадыфікацыю. mod.remove.confirm = ГÑÑ‚Ð°Ñ Ð¼Ð°Ð´Ñ‹Ñ„Ñ–ÐºÐ°Ñ†Ñ‹Ñ Ð±ÑƒÐ´Ð·Ðµ выдалена. mod.author = [lightgray]Ðўтар:[] {0} mod.missing = ГÑта захаванне ўтрымлівае мадыфікацыю, Ñкое вы нÑдаўна абнавілі ці Ñна больш не ÑžÑталÑванаÑ. Можа здарыцца пашкоджанне захаваннÑ. Ð’Ñ‹ ўпÑўненыÑ, што хочаце загрузіць Ñго?\n[lightgray]Мадыфікацыі:\n{0} mod.preview.missing = Перад публікацыÑй гÑтай мадыфікацыі Ñž майÑÑ‚Ñрні, вы павінны дадаць малюнак прадпраглÑду.\nРазмеÑціце малюнак з імем[accent] preview.png[] у Ñ‚Ñчцы мадыфікацыі Ñ– паÑпрабуйце зноў. mod.folder.missing = Мадыфікацыі могуць быць Ð°Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ð²Ð°Ð½Ñ‹Ñ Ñž майÑÑ‚Ñрні толькі Ñž выглÑдзе Ñ‚Ñчкі.\nКаб канвертаваць любы мод у Ñ‚Ñчку, проÑта выміце Ñго з архіва Ñ– выдаліце Ñтары архіў .zip, затым перазапуÑціце гульню ці перазагрузіце мадыфікацыі. -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.scripts.disable = Ваша прылада не падтрымлівае мадыфікацыі з Ñкріптамі. Выключайце такіе мады, как гулÑць. about.button = Ðб гульні name = ІмÑ: noname = Ð”Ð»Ñ Ð¿Ð°Ñ‡Ð°Ñ‚ÐºÑƒ, прыдумайце[accent] Ñабе iмÑ[]. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Карта планеты +launchcore = ЗапуÑціць Ñдро filename = IÐ¼Ñ Ñ„Ð°Ð¹Ð»Ð°: unlocked = Ðовы кантÑнт адмыкнуты! completed = [accent]Завершаны @@ -148,12 +148,12 @@ techtree = ДрÑва\n Ñ‚Ñхналогій research.list = [lightgray]ДаÑьледуйце: research = ДаÑледаваць researched = [lightgray] {0} даÑледавана. -research.progress = {0}% complete +research.progress = {0}% завершана players = Гульцоў: {0} players.single = {0} гулец players.search = search -players.notfound = [gray]no players found -server.closing = [accent] Закрыццё Ñервера… +players.notfound = [gray]гульцоу не знойдзена +server.closing = [accent]Закрыццё Ñервера… server.kicked.kick = Ð’Ð°Ñ Ð²Ñ‹Ð³Ð½Ð°Ð»Ñ– з Ñервера! server.kicked.whitelist = Ð’Ñ‹ не Ñž белым ÑпіÑе Ñервера. server.kicked.serverClose = Сервер зачынены. @@ -278,18 +278,21 @@ quit.confirm.tutorial = Ð’Ñ‹ ўпÑўненыÑ, што ведаеце, што loading = [accent]Загрузка… reloading = [accent]Перазагрузка мадыфікацый... saving = [accent]Захаванне… -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][] да вазраджÑÐ½Ð½Ñ Ð· Ñдра cancelbuilding = [accent][[{0}][] Ð´Ð»Ñ Ð°Ñ‡Ñ‹Ñткі плана selectschematic = [accent][[{0}][] вылучыць Ñ– ÑкапіÑваць pausebuilding = [accent][[{0}][] Ð´Ð»Ñ Ð¿Ñ€Ñ‹Ð¿Ñ‹Ð½ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð° resumebuilding = [scarlet][[{0}][] Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñгу будаўніцтва wave = [accent]Ð¥Ð²Ð°Ð»Ñ {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Ð¥Ð²Ð°Ð»Ñ Ð¿Ñ€Ð°Ð· {0} wave.waveInProgress = [lightgray]Ð¥Ð²Ð°Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñгваецца waiting = [lightgray]Чаканне… waiting.players = Чаканне гульцоў… wave.enemies = Ворагаў: [lightgray]{0} wave.enemy = ЗаÑтаўÑÑ [lightgray]{0}[] ворагаў +wave.guardianwarn = Вартаўнік будзе паÑÐ»Ñ [accent]{0}[] хвалей. +wave.guardianwarn.one = Вартаўнік будзе паÑÐ»Ñ [accent]{0}[] хвалі. loadimage = Загрузіць малюнак saveimage = Захаваць малюнак unknown = ÐевÑдома @@ -328,6 +331,7 @@ editor.generation = ГенерацыÑ: editor.ingame = РÑдагаваць Ñž гульні editor.publish.workshop = Ðпублікаваць у майÑÑ‚Ñрні editor.newmap = ÐÐ¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° +editor.center = Center workshop = МайÑÑ‚ÑÑ€Ð½Ñ waves.title = Хвалі waves.remove = Выдаліць @@ -335,9 +339,9 @@ waves.never = <ніколі> waves.every = кожны waves.waves = Ñ…Ð²Ð°Ð»Ñ (Ñ‹) waves.perspawn = за з’Ñўленне -waves.shields = shields/wave +waves.shields = адзінак шчыта/хвалю waves.to = да -waves.guardian = Guardian +waves.guardian = Вартаўнік waves.preview = ПапÑÑ€Ñдні праглÑд waves.edit = РÑдагавацью... waves.copy = КапіÑваць у буфер абмену @@ -346,9 +350,9 @@ waves.invalid = ÐÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ñ…Ð²Ð°Ð»Ñ– Ñž буферы абмену. waves.copied = Хвалі ÑкапіÑваныÑ. waves.none = Ворагі не былі вызначаныÑ. \nЗвÑрнiце ўвагу, што пуÑÑ‚Ñ‹Ñ Ñ…Ð²Ð°Ð»Ñ– будуць аўтаматычна Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ‹Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð°Ð¹ хвалÑй. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +wavemode.counts = колькацÑÑŒ адзінак +wavemode.totals = уÑÑго Ð·Ð´Ð°Ñ€Ð¾ÑžÑ +wavemode.health = здароўе editor.default = [lightgray]<Па змаўчанні> details = ПадрабÑзнаÑці... @@ -416,6 +420,7 @@ filters.empty = [lightgray]ÐÑма фільтраў! Дадайце адзін filter.distort = СкажÑнне filter.noise = Шум filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = МедыÑна filter.oremedian = Ð ÑƒÐ´Ð½Ñ Ð¼ÐµÐ´Ñ‹Ñна @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Блок filter.option.floor = ÐŸÐ°Ð²ÐµÑ€Ñ…Ð½Ñ filter.option.flooronto = МÑÑ‚Ð°Ð²Ð°Ñ Ð¿Ð°Ð²ÐµÑ€Ñ…Ð½ÑŽ +filter.option.target = Target filter.option.wall = СцÑна filter.option.ore = Руда filter.option.floor2 = Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ð°Ð²ÐµÑ€Ñ…Ð½ÑŽ @@ -471,15 +477,9 @@ requirement.wave = даÑÑгнем {0} хвалі Ñž зоне {1} requirement.core = Знішчыце варожае Ñдро ​​ў зоне {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Ðднавіць зону: \n[lightgray] {0} bestwave = [lightgray]Ð›ÐµÐ¿ÑˆÐ°Ñ Ñ…Ð²Ð°Ð»Ñ: {0} -launch = <ЗапуÑк> launch.text = Launch -launch.title = ЗапуÑк паÑпÑховы -launch.next = [lightgray]наÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñць на {0} -той хвалі -launch.unable2 = [scarlet]ЗапуÑк немагчымы.[] -launch.confirm = ГÑта [accent]запуÑціць[] уÑе Ñ€ÑÑурÑÑ‹ Ñž Вашым Ñдры. \nÐ’Ñ‹ не зможаце вÑрнуцца на гÑтую базу. -launch.skip.confirm = Калі Ð’Ñ‹ прапуÑціце цÑпер, то Ð’Ñ‹ не зможаце вырабіць [accent] запуÑк[] да пазнейшых хваль. +research.multiplayer = Only the host can research items. uncover = РаÑкрыць configure = ÐšÐ°Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ‹Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÑ– loadout = Loadout @@ -508,10 +508,11 @@ error.io = Ð¡ÐµÑ‚ÐºÐ°Ð²Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° ўводу-выÑновы. error.any = ÐевÑÐ´Ð¾Ð¼Ð°Ñ ÑÐµÑ‚ÐºÐ°Ð²Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°. error.bloom = Ðе атрымалаÑÑ Ñ–Ð½Ñ–Ñ†Ñ‹Ñлізаваць ÑвÑчÑнне (Bloom). \nМагчыма, зараз Ð’Ð°ÑˆÐ°Ñ Ð¿Ñ€Ñ‹Ð»Ð°Ð´Ð° не падтрымлівае Ñго. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Дождж +weather.snow.name = Снег +weather.sandstorm.name = ПÑÑÐ¾Ñ‡Ð½Ñ‹Ñ Ð±ÑƒÑ€Ñ– +weather.sporestorm.name = Ð¡Ð¿Ð¾Ñ€Ð°Ð²Ñ‹Ñ Ð±ÑƒÑ€Ñ– +weather.fog.name = Туман sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Ð’Ñ‹ Ñапраўды хочаце ачыÑціць Ñ settings.clearall.confirm = [scarlet] ÐСЦЯРОЖÐÐ![] \nГÑта ÑÐ°Ñ‚Ñ€Ñ ÑžÑе дадзеныÑ, уключаючы захаваннÑ, карты, прагрÑÑ ÐºÐ°Ð¼Ð¿Ð°Ð½Ñ–Ñ– Ñ– налады кіраваннÑ. \nПоÑле таго Ñк Ð’Ñ‹ націÑнеце [accent] [ОК][], Ð³ÑƒÐ»ÑŒÐ½Ñ Ð·Ð½Ñ–ÑˆÑ‡Ñ‹Ñ†ÑŒ уÑе Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ñ– аўтаматычна зачыніцца. settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent] <Паўза> clear = ÐчыÑціць banned = [scarlet] Забаронена @@ -570,49 +580,74 @@ info.title = Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ error.title = [crimson]ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° error.crashtitle = ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° unit.nobuild = [scarlet]Unit can't build -blocks.input = Уваход -blocks.output = Выхад -blocks.booster = ПаÑкаральнік -blocks.tiles = ÐÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð»Ñ–Ñ‚ÐºÑ– -blocks.affinities = ПавелічÑнне ÑфектыўнаÑці +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = УмÑшчальнаÑць Ñнергіі -blocks.powershot = ЭнергіÑ/Ð’Ñ‹ÑтрÑл -blocks.damage = Страты -blocks.targetsair = ÐŸÐ°Ð²ÐµÑ‚Ñ€Ð°Ð½Ñ‹Ñ Ð¼Ñты -blocks.targetsground = ÐÐ°Ð·ÐµÐ¼Ð½Ñ‹Ñ Ð¼Ñты -blocks.itemsmoved = ХуткаÑць перамÑшчÑÐ½Ð½Ñ -blocks.launchtime = ІнтÑрвал запуÑкаў -blocks.shootrange = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ -blocks.size = Памер -blocks.displaysize = Display Size -blocks.liquidcapacity = УмÑшчальнаÑць вадкаÑці -blocks.powerrange = ДалёкаÑць перадачы Ñнергіі -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = КолькаÑць злучÑннÑÑž -blocks.poweruse = Спажывае Ñнергіі -blocks.powerdamage = ЭнергіÑ/Ñтраты -blocks.itemcapacity = УмÑшчальнаÑць прадметаў -blocks.basepowergeneration = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ Ñнергіі -blocks.productiontime = Ð§Ð°Ñ Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ‡Ð°Ñці -blocks.repairtime = Ð§Ð°Ñ Ð¿Ð¾ÑžÐ½Ð°Ð¹ Ñ€Ñгенерацыі -blocks.speedincrease = ПавелічÑнне хуткаÑці -blocks.range = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ -blocks.drilltier = Бурит -blocks.drillspeed = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць ÑÐ²Ñ–Ð´Ñ€Ð°Ð²Ð°Ð½Ð½Ñ -blocks.boosteffect = паÑкараўÑÑ Ñфект -blocks.maxunits = МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць актыўных адзінак -blocks.health = Здароўе -blocks.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð° -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Кошт будаўніцтва -blocks.inaccuracy = РоÑкід -blocks.shots = СтрÑлы -blocks.reload = СтрÑлы/Ñекунду -blocks.ammo = БоепрыпаÑÑ‹ -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Уваход +stat.output = Выхад +stat.booster = ПаÑкаральнік +stat.tiles = ÐÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð¿Ð»Ñ–Ñ‚ÐºÑ– +stat.affinities = ПавелічÑнне ÑфектыўнаÑці +stat.powercapacity = УмÑшчальнаÑць Ñнергіі +stat.powershot = ЭнергіÑ/Ð’Ñ‹ÑтрÑл +stat.damage = Страты +stat.targetsair = ÐŸÐ°Ð²ÐµÑ‚Ñ€Ð°Ð½Ñ‹Ñ Ð¼Ñты +stat.targetsground = ÐÐ°Ð·ÐµÐ¼Ð½Ñ‹Ñ Ð¼Ñты +stat.itemsmoved = ХуткаÑць перамÑшчÑÐ½Ð½Ñ +stat.launchtime = ІнтÑрвал запуÑкаў +stat.shootrange = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ +stat.size = Памер +stat.displaysize = Display Size +stat.liquidcapacity = УмÑшчальнаÑць вадкаÑці +stat.powerrange = ДалёкаÑць перадачы Ñнергіі +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = КолькаÑць злучÑннÑÑž +stat.poweruse = Спажывае Ñнергіі +stat.powerdamage = ЭнергіÑ/Ñтраты +stat.itemcapacity = УмÑшчальнаÑць прадметаў +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ Ñнергіі +stat.productiontime = Ð§Ð°Ñ Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ‡Ð°Ñці +stat.repairtime = Ð§Ð°Ñ Ð¿Ð¾ÑžÐ½Ð°Ð¹ Ñ€Ñгенерацыі +stat.speedincrease = ПавелічÑнне хуткаÑці +stat.range = Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ +stat.drilltier = Бурит +stat.drillspeed = Ð‘Ð°Ð·Ð°Ð²Ð°Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñць ÑÐ²Ñ–Ð´Ñ€Ð°Ð²Ð°Ð½Ð½Ñ +stat.boosteffect = паÑкараўÑÑ Ñфект +stat.maxunits = МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць актыўных адзінак +stat.health = Здароўе +stat.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð° +stat.maxconsecutive = Max Consecutive +stat.buildcost = Кошт будаўніцтва +stat.inaccuracy = РоÑкід +stat.shots = СтрÑлы +stat.reload = СтрÑлы/Ñекунду +stat.ammo = БоепрыпаÑÑ‹ +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Патрабуецца Ñвідар лепей bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = ЭнергіÑ: {0}/Ñ bar.powerstored = Ðазапашана: {0}/{1} bar.poweramount = ЭнергіÑ: {0} bar.poweroutput = Выхад Ñнергіі: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Прадметы: {0} bar.capacity = УмÑшчальнаÑць: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = ПрагрÑÑ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð° bar.input = Уваход bar.output = Выхад +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat] {0} [lightgray]Ñтраты bullet.splashdamage = [stat] {0} [lightgray]Ñтраты Ñž радыуÑе ~ [stat] {1} [lightgray] блокаў bullet.incendiary = [stat] запальны @@ -642,12 +680,15 @@ bullet.homing = [stat] Ñаманаводных bullet.shock = [stat] шокавы bullet.frag = [stat] аÑколачны bullet.knockback = [stat] {0} [lightgray]аддачы +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat] замарожваюцца bullet.tarred = [stat] запавольвае, гаручы bullet.multiplier = [stat]{0}[lightgray]x множнік боепрыпаÑаў bullet.reload = [stat]{0}[lightgray]x хуткаÑць ÑтрÑльбы unit.blocks = блокі +unit.blockssquared = blocks² unit.powersecond = адзінак Ñнергіі/Ñекунду unit.liquidsecond = вадкаÑных адзінак/Ñекунду unit.itemssecond = прадметаў/Ñекунду @@ -670,7 +711,7 @@ category.power = Ð­Ð½ÐµÑ€Ð³Ñ–Ñ category.liquids = ВадкаÑці category.items = Прадметы category.crafting = УвÑдзенне/Ð’Ñ‹Ñнова -category.shooting = Стральба +category.function = Function category.optional = Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð¿Ð°Ð»ÑпшÑÐ½Ð½Ñ setting.landscape.name = Толькі альбомны (гарызантальны) Ñ€Ñжым setting.shadows.name = Цені @@ -679,7 +720,6 @@ setting.linear.name = Ð›Ñ–Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ðµ setting.hints.name = Падказкі setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = ÐÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ñ‹Ð¿Ñ‹Ð½ÐµÐ½Ð½Ðµ будаўніцтва -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = ÐÐ½Ñ–Ð¼Ñ–Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ Ð²Ð°Ð´Ð° setting.animatedshields.name = ÐÐ½Ñ–Ð¼Ñ–Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ ÑˆÑ‡Ñ‹Ñ‚Ñ‹ setting.antialias.name = Згладжванне [lightgray] (патрабуе перазапуÑку)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = ПоўнаÑкранны Ñ€Ñжым setting.borderlesswindow.name = Безрамочное акно [lightgray] (можа ÑпатрÑбіцца перазапуÑк) setting.fps.name = Паказваць FPS Ñ– пінг setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Паказаць клавішы выбару блока setting.vsync.name = Ð’ÐµÑ€Ñ‚Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑÑ–Ð½Ñ…Ñ€Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ‹Ñ setting.pixelate.name = ПікÑÐµÐ»Ñ–Ð·Ð°Ñ†Ñ‹Ñ setting.minimap.name = ÐдлюÑтроўваць міні-карту @@ -822,6 +861,7 @@ mode.custom = КарыÑÑ‚Ð°Ð»ÑŒÐ½Ñ–Ñ†ÐºÑ–Ñ Ð¿Ñ€Ð°Ð²Ñ–Ð»Ñ‹ rules.infiniteresources = БÑÑÐºÐ¾Ð½Ñ†Ñ‹Ñ Ñ€ÑÑурÑÑ‹ (Гулец) rules.reactorexplosions = Выбухі Ñ€Ñактараў +rules.schematic = Schematics Allowed rules.wavetimer = ІнтÑрвал хвалÑÑž rules.waves = Хвалі rules.attack = РÑжым атакі @@ -847,17 +887,19 @@ rules.title.unit = Баёў. адз. rules.title.experimental = ÑкÑперыментальнай rules.title.environment = Environment rules.lighting = ÐÑвÑтленне +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ðавакольны Ñвет -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Ðадвор'е +rules.weather.frequency = ЧаÑтата: +rules.weather.duration = ПрацÑглаÑць: content.item.name = РÑчывы content.liquid.name = ВадкаÑці content.unit.name = БаÑÐ²Ñ‹Ñ Ð°Ð´Ð·Ñ–Ð½ÐºÑ– content.block.name = Блокі + item.copper.name = Медзь item.lead.name = Свінец item.coal.name = Вугаль @@ -879,79 +921,63 @@ liquid.slag.name = Шлак liquid.oil.name = Ðафта liquid.cryofluid.name = КрыÑÐ³ÐµÐ½Ð½Ð°Ñ Ð²Ð°Ð´ÐºÐ°Ñць -item.explosiveness = [lightgray]ВыбуханебÑÑпека: {0}% -item.flammability = [lightgray]УзгаральнаÑць: {0}% -item.radioactivity = [lightgray]РадыёактыўнаÑць: {0}% - -unit.health = [lightgray]Здароўе: {0} -unit.speed = [lightgray]ХуткаÑць: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]ЦеплаёміÑтаÑць: {0} -liquid.viscosity = [lightgray]ГлейкаÑць: {0} -liquid.temperature = [lightgray]ТÑмпература: {0} - unit.dagger.name = Кінжал -unit.mace.name = Mace +unit.mace.name = Булава unit.fortress.name = КрÑпаÑць -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = ÐšÐ°Ð¼Ñ–ÐºÐ°Ð´Ð·Ñ -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.nova.name = Ðова +unit.pulsar.name = ПульÑар +unit.quasar.name = Квазар +unit.crawler.name = Палзун +unit.atrax.name = ÐÑ‚Ñ€Ð°ÐºÑ +unit.spiroct.name = Спірокт +unit.arkyid.name = Ðркід +unit.toxopid.name = ТокÑопойд +unit.flare.name = УÑпышка +unit.horizon.name = Гарызонт +unit.zenith.name = Зеніт +unit.antumbra.name = Зацемь +unit.eclipse.name = Затменне +unit.mono.name = Моно +unit.poly.name = Полі +unit.mega.name = Мега +unit.quad.name = Квад +unit.oct.name = Окт +unit.risso.name = РіÑÑо +unit.minke.name = Мінкі +unit.bryde.name = Брайд +unit.sei.name = СÑй +unit.omura.name = Ðмура +unit.alpha.name = Ðльфа +unit.beta.name = БÑта +unit.gamma.name = Гамма +unit.scepter.name = Скіпетр +unit.reign.name = Улада +unit.vela.name = Ветразь +unit.corvus.name = ÐšÐ¾Ñ€Ð²ÑƒÑ -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax +block.resupply-point.name = ЦÑнтр аммуніцыі +block.parallax.name = ÐŸÐ°Ñ€Ñ€Ð°Ð»Ð°ÐºÑ block.cliff.name = Скала block.sand-boulder.name = ПÑшчаны валун block.grass.name = Трава block.slag.name = Шлак +block.space.name = Space block.salt.name = Соль -block.salt-wall.name = Salt Wall +block.salt-wall.name = СалÑÐ½Ð°Ñ ÑцÑна block.pebbles.name = Галька block.tendrils.name = Ð¡Ð¿Ð¾Ñ€Ð°Ð²Ñ‹Ñ Ð²ÑƒÑікі -block.sand-wall.name = Sand Wall +block.sand-wall.name = ПÑÑˆÑ‡Ð°Ð½Ð°Ñ ÑцÑна block.spore-pine.name = Спорава Ñ…Ð²Ð¾Ñ -block.spore-wall.name = Spore Wall +block.spore-wall.name = Ð¡Ð¿Ð¾Ñ€Ð°Ð²Ð°Ñ ÑцÑна block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.snow-boulder.name = Снежны валун block.snow-pine.name = ЗаÑÐ½ÐµÐ¶Ð°Ð½Ð°Ñ Ñ…Ð²Ð¾Ñ block.shale.name = Сланец block.shale-boulder.name = Сланцавы валун block.moss.name = Мох block.shrubs.name = КуÑты block.spore-moss.name = Спорава мох -block.shale-wall.name = Shale Wall +block.shale-wall.name = Ð¡Ð»Ð°Ð½Ñ†Ð°Ð²Ð°Ñ ÑцÑна block.scrap-wall.name = СцÑна з металалому block.scrap-wall-large.name = Ð’ÑÐ»Ñ–ÐºÐ°Ñ ÑцÑна з металалому block.scrap-wall-huge.name = Ð’ÐµÐ»Ñ–Ð·Ð°Ñ€Ð½Ð°Ñ ÑцÑна з металалому @@ -979,17 +1005,18 @@ block.craters.name = КратÑры block.sand-water.name = ПÑÑок з вадой block.darksand-water.name = Тёмный пÑÑок з вадой block.char.name = Ð’Ñ‹Ð¿Ð°Ð»ÐµÐ½Ð°Ñ Ð·ÑÐ¼Ð»Ñ -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = Дацыт +block.dacite-wall.name = Ð”Ð°Ñ†Ñ‹Ñ‚Ð°Ð²Ð°Ñ ÑцÑна +block.dacite-boulder.name = Дацытавы валун block.ice-snow.name = ЗаÑнежаны лёд -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ ÑцÑна +block.ice-wall.name = ЛÑÐ´Ð¾Ð²Ð°Ñ ÑцÑна +block.snow-wall.name = Ð¡Ð½ÐµÐ¶Ð½Ð°Ñ ÑцÑна +block.dune-wall.name = ТёмнапÑÑÑ‡Ð°Ð½Ð°Ñ ÑцÑна block.pine.name = СаÑна -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = ЗÑÐ¼Ð»Ñ +block.dirt-wall.name = Ð‘Ñ€ÑƒÐ´Ð½Ð°Ñ ÑцÑна +block.mud.name = Бруд block.white-tree-dead.name = Мёртвае белае дрÑва block.white-tree.name = Белае дрÑва block.spore-cluster.name = Ðавала ÑпрÑчка @@ -1075,6 +1102,7 @@ block.power-source.name = Крыніца Ñнергіі block.unloader.name = Разгрузчык block.vault.name = Сховішча block.wave.name = Ð¥Ð²Ð°Ð»Ñ +block.tsunami.name = Tsunami block.swarmer.name = РаÑвiк block.salvo.name = Залп block.ripple.name = Рабь @@ -1114,31 +1142,33 @@ block.arc.name = Дуга block.rtg-generator.name = Радыеізатопны Ñ‚ÑрмаÑлектрычны генератар block.spectre.name = Спектр block.meltdown.name = ІÑпепÑліцель +block.foreshadow.name = Foreshadow block.container.name = КантÑйнер block.launch-pad.name = ПуÑÐºÐ°Ð²Ð°Ñ Ð¿Ð»Ñцоўка block.launch-pad-large.name = Ð’ÑÐ»Ñ–ÐºÐ°Ñ Ð¿ÑƒÑÐºÐ°Ð²Ð°Ñ Ð¿Ð»Ñцоўка block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.command-center.name = Каммандны цÑнтр +block.ground-factory.name = Завод наземных адзінак +block.air-factory.name = Завод паветраных адзінак +block.naval-factory.name = Завод марÑкіх адзінак +block.additive-reconstructor.name = Злучальны Ñ€ÑканÑтруктар +block.multiplicative-reconstructor.name = Мультыплікацыйны Ñ€ÑканÑтруктар +block.exponential-reconstructor.name = ЭкÑпаненцыÑльны Ñ€ÑканÑтруктар +block.tetrative-reconstructor.name = ТÑтрацыйны Ñ€ÑканÑтруктар +block.payload-conveyor.name = Канвеер Ð´Ð»Ñ Ñ‚Ñжёлай зброі +block.payload-router.name = Роутар Ð´Ð»Ñ Ñ‚Ñжёлай зброі +block.disassembler.name = Разборшчык +block.silicon-crucible.name = КрÑмніевы тыгель +block.overdrive-dome.name = Сверхпрывадны купал -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Пераключальнік +block.micro-processor.name = МікропрацÑÑар +block.logic-processor.name = ПрацÑÑар логікі +block.hyper-processor.name = ГіперпрацÑÑар +block.logic-display.name = Экран +block.large-logic-display.name = Ð’Ñлікі Ñкран +block.memory-cell.name = ЯчÑйка памÑці +block.memory-bank.name = Банк памÑці team.blue.name = СінÑÑ team.crux.name = Ð§Ñ‹Ñ€Ð²Ð¾Ð½Ð°Ñ @@ -1166,14 +1196,14 @@ tutorial.breaking = ЧаÑта, блокі даводзіцца руйнавац tutorial.breaking.mobile = ЧаÑта, блокі даводзіцца руйнаваць. \n [accent] Вылучыце Ñ€Ñжым дÑканÑтрукцыі[], паÑÐ»Ñ Ñ‡Ð°Ð³Ð¾ націÑніце на патрÑбны блок, каб разбурыць Ñго. \nРазрушьте блокі Ñž абранай зоне, трымаючы палец на некалькі Ñекунд[], Ñ– правёўшы Ñго Ñž патрÑбным кірунку. \nÐажмите на галачку, каб пацвердзіць разбурÑнне. \n \n [accent] разбурце уÑе Ñцены з металалому злева ад Вашага Ñдра. tutorial.withdraw = У некаторых ÑітуацыÑÑ…, неабходна забраць прадметы з блокаў ўручную. \nКаб зрабіць гÑта, [accent] націÑніце на блок[], у Ñкім знаходзÑцца прадметы, затым [accent] націÑніце на прадмет[] Ñž інвентары. \nМожно забраць некалькі прадметаў [accent] націÑкам з заціÑкам[].\n [accent] ЗабÑрыце трохі медзі з Ñдра[] tutorial.deposit = Пакладзеце прадметы Ñž блок, перацÑгнуўшы Ñ–Ñ… ад Ñвайго ÐºÐ°Ñ€Ð°Ð±Ð»Ñ Ñž патрÑбны блок. \n \n [accent] ПеранÑÑіце медзь назад у Ñдро [] -tutorial.waves = [lightgray] Праціўнікі[] набліжаюцца. \nЗащитите Ñдро ​​ад двух хваль. ВыкарыÑтоўвайце [accent] левую кнопку мышы[] Ð´Ð»Ñ Ñтральбы. \nПоÑтройте больш турÑлÑÑž Ñ– бураў. Добудьте больш медзі. -tutorial.waves.mobile = [lightgray] Праціўнікі[] набліжаюцца. \n \nЗащитите Ñдро ​​ад двух хваль. Ваш карабель будзе аўтаматычна атакаваць праціўніка. \nПоÑтройте больш турÑлÑÑž Ñ– бураў. Добудьте больш медзі. +tutorial.waves = [lightgray] Праціўнікі[] набліжаюцца. \nЗащіціце Ñдро ​​ад двух хваль. ВыкарыÑтоўвайце [accent] левую кнопку мышы[] Ð´Ð»Ñ Ñтральбы. \nПоÑтройте больш турÑлÑÑž Ñ– бураў. Добудьте больш медзі. +tutorial.waves.mobile = [lightgray] Праціўнікі[] набліжаюцца. \n \nЗащіціце Ñдро ​​ад двух хваль. Ваш карабель будзе аўтаматычна атакаваць праціўніка. \nПоÑтройте больш турÑлÑÑž Ñ– бураў. Добудьте больш медзі. tutorial.launch = Калі Ð’Ñ‹ даÑÑгаеце пÑўнай хвалі, Ð’Ñ‹ можаце ажыццÑвіць [accent] запуÑк Ñдра[], пакінуўшы базу Ñ– [accent] перанеÑці Ñ€ÑÑурÑÑ‹ з Ñдра.[] \nЭти Ñ€ÑÑурÑÑ‹ могуць быць выкарыÑтаны Ð´Ð»Ñ Ð²Ñ‹Ð²ÑƒÑ‡ÑÐ½Ð½Ñ Ð½Ð¾Ð²Ñ‹Ñ… Ñ‚Ñхналогій.\n [accent] ÐаціÑніце кнопку запуÑку. item.copper.description = Самы аÑноўны будаўнічы матÑрыÑл. Шырока выкарыÑтоўваецца ва ÑžÑÑ–Ñ… тыпах блокаў. item.lead.description = ÐÑноўны Ñтартавы матÑрыÑл. Шырока выкарыÑтоўваецца Ñž Ñлектроніцы Ñ– блоках Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпарціроўкі вадкаÑцÑÑž. -item.metaglass.description = звышмоцнага Ñплаў шкла. Шырока выкарыÑтоўваецца Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ÐºÐ°Ð²Ð°Ð½Ð½Ñ Ñ– Ð·Ð°Ñ…Ð¾ÑžÐ²Ð°Ð½Ð½Ñ Ð²Ð°Ð´ÐºÐ°Ñці. -item.graphite.description = Ð¼Ñ–Ð½ÐµÑ€Ð°Ð»Ñ–Ð·Ð°Ð²Ð°Ð½Ñ‹Ñ Ð²ÑƒÐ³Ð»Ñрод, Ñкі выкарыÑтоўваецца Ð´Ð»Ñ Ð±Ð¾ÐµÐ¿Ñ€Ñ‹Ð¿Ð°Ñаў Ñ– Ñлектрычных кампанентаў. +item.metaglass.description = Звышмоцны Ñплаў шкла. Шырока выкарыÑтоўваецца Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ÐºÐ°Ð²Ð°Ð½Ð½Ñ Ñ– Ð·Ð°Ñ…Ð¾ÑžÐ²Ð°Ð½Ð½Ñ Ð²Ð°Ð´ÐºÐ°Ñці. +item.graphite.description = Мінералізаваны вуглÑрод, Ñкі выкарыÑтоўваецца Ð´Ð»Ñ Ð±Ð¾ÐµÐ¿Ñ€Ñ‹Ð¿Ð°Ñаў Ñ– Ñлектрычных кампанентаў. item.sand.description = Звычайны матÑрыÑл, Ñкі шырока выкарыÑтоўваецца пры выплаўленні, Ñк пры легіраваннÑ, так Ñ– Ñž ÑкаÑці флюÑу. item.coal.description = ЗакамÑнелаÑцевае мінеральнае Ñ€Ñчыва, Ñкое ўтварылаÑÑ Ð·Ð°Ð´Ð¾ÑžÐ³Ð° да паÑева. Шырока выкарыÑтоўваецца Ð´Ð»Ñ Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ‡Ð°Ñці паліва Ñ– Ñ€ÑÑурÑаў. item.titanium.description = РÑдкі звышлёгкі метал, шырока выкарыÑтоўваецца Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпарціроўкі вадкаÑцÑÑž, бураў Ñ– авіÑцыі. @@ -1302,4 +1332,4 @@ block.cyclone.description = Ð’ÑÐ»Ñ–ÐºÐ°Ñ Ñ‚ÑƒÑ€Ñль, ÑÐºÐ°Ñ Ð¼Ð¾Ð¶Ð° ве block.spectre.description = МаÑÑ–ÑžÐ½Ð°Ñ Ð´Ð²ÑƒÑтвольное гармата. СтралÑе буйнымі бранÑбойнымі кулÑмі па паветраных Ñ– наземных мÑтах. block.meltdown.description = МаÑÑ–ÑžÐ½Ð°Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ð°Ñ Ð³Ð°Ñ€Ð¼Ð°Ñ‚Ð°. Зараджае Ñ– ÑтралÑе паÑтаÑнным лазерным прамÑнём Ñž бліжÑйшых ворагаў. Патрабуецца аÑÑ‚ÑƒÐ´Ð¶Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð´ÐºÐ°Ñць Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹. block.repair-point.description = БеÑперапынна лечыць бліжÑйшую пашкоджаную баÑвую адзінку або мех у Ñваім радыуÑе. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Пашкоджвае Ñ– знішчае Ñнарады. Ð›Ð°Ð·ÐµÑ€Ð½Ñ‹Ñ Ñнарады не шкодзÑца. diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties new file mode 100644 index 0000000000..42489f046f --- /dev/null +++ b/core/assets/bundles/bundle_bg.properties @@ -0,0 +1,1685 @@ +credits.text = Създадена от [royal]Anuken[] - [sky]anukendev@gmail.com[] +credits = ЗаÑлуги +contributors = Преводачи и Сътрудници +discord = ПриÑъедини Ñе към Mindustry диÑкорд! +link.discord.description = Официален Mindustry диÑкорд Ñървър +link.reddit.description = Субредит на Mindustry +link.github.description = Ð¡Ð¾Ñ€Ñ ÐºÐ¾Ð´ на играта +link.changelog.description = СпиÑък Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ +link.dev-builds.description = ÐеÑтабилни теÑтови верÑии +link.trello.description = Официален Trello ÑпиÑък Ñ Ð¿Ñ€ÐµÐ´ÑтоÑщи промени +link.itch.io.description = itch.io Ñтраница. Можете да Ñвалите играта от тук. +link.google-play.description = Свалете за Android от Google Play +link.f-droid.description = Свалете за Android от F-Droid +link.wiki.description = Официално Mindustry ръководÑтво +link.suggestions.description = Предложете вашата Ð¸Ð´ÐµÑ +link.bug.description = Ðамерихте грешка? Съобщете тук +linkfail = ÐеуÑпех при отварÑне на връзка!\nURL адреÑÑŠÑ‚ е копиран в клипборда ви. +screenshot = ЗапиÑана екранна Ñнимка в {0} +screenshot.invalid = Картата е твърде голÑма, възможно е да не доÑтига памет за екранната Ñнимка. +gameover = Играта Ñвърши. +gameover.disconnect = ПрекъÑнете връзката +gameover.pvp = [accent]{0}[] отбор Ñпечели! +gameover.waiting = [accent]Изчакване за Ñледваща карта... +highscore = [accent]Ðов рекорд! +copied = Копирано. +indev.notready = Тази чаÑÑ‚ от играта вÑе още е в разработка +indev.campaign = [accent]ПоздравлениÑ! Вие завършихте режим кампаниÑ![]\n\nÐ’ момента това е цÑлото Ñъдържание на играта. Ð’ бъдеще ще можете да пътувате до други планети.\nЗа Ñега Ñе наÑладете на мрежовата игра. + +load.sound = Звук +load.map = Карти +load.image = Графики +load.content = Съдържание +load.system = СиÑтема +load.mod = Модифицакии +load.scripts = Скриптове + +be.update = Ðалична е актуализациÑ: +be.update.confirm = Изтегли Ñ Ð¸ реÑтартирай играта? +be.updating = Ðктуализиране... +be.ignore = Игнорирай +be.noupdates = ÐÑма намерени актуализации. +be.check = Провери за актуализации + +mods.browser = СпиÑък Ñ Ð¼Ð¾Ð´Ð¾Ð²Ðµ +mods.browser.selected = Избран мод +mods.browser.add = ИнÑталирай +mods.browser.reinstall = ПреинÑталирай +mods.github.open = Сайт +mods.browser.sortdate = Сортирай по дата +mods.browser.sortstars = Сортирай по рейтинг + +schematic = Схема +schematic.add = Запази Схема... +schematics = Схеми +schematic.replace = Вече ÑъщеÑтвува Ñхема Ñ Ñ‚Ð¾Ð²Ð° име. Да бъде ли замеÑтена? +schematic.exists = Вече ÑъщеÑтвува Ñхема Ñ Ñ‚Ð¾Ð²Ð° име. +schematic.import = ВнаÑÑне на Схема... +schematic.exportfile = ИзнаÑÑне във файл +schematic.importfile = ВнаÑÑне от файл +schematic.browseworkshop = Работилница +schematic.copy = Копирай в Клипборда +schematic.copy.import = ВнеÑи от Клипборда +schematic.shareworkshop = Сподели в Работилницата +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обърни Схемата +schematic.saved = Схемате беше запазена. +schematic.delete.confirm = Тази Ñхема ще бъде напълно унищожена. +schematic.rename = Преименуване на Ñхема +schematic.info = {0}x{1}, {2} елемента +schematic.disabled = [scarlet]Схемите не Ñа доÑтъпни[]\nÐе ви е позволено да използвате Схеми на тази [accent]карта[] или [accent]Ñървър[]. + +stats = СтатиÑтики +stat.wave = ОтблъÑнати Вълни:[accent] {0} +stat.enemiesDestroyed = Унищожени Врагове:[accent] {0} +stat.built = ПоÑтроени ПоÑтройки:[accent] {0} +stat.destroyed = Унищожени ПоÑтройки:[accent] {0} +stat.deconstructed = Разглобени ПоÑтройки:[accent] {0} +stat.delivered = ИзÑтрелÑни РеÑурÑи: +stat.playtime = Изиграно Време:[accent] {0} +stat.rank = Финален ранг:[accent] {0} + +globalitems = [accent]Ð’Ñички РеÑурÑи +map.delete = Сигурни ли Ñте че иÑкате да изтриете карта "[accent]{0}[]"? +level.highscore = Рекорд: [accent]{0} +level.select = Избор на ниво +level.mode = Режим на игра: +coreattack = < Ядрото е нападнато! > +nearpoint = [[ [scarlet]ÐÐПУСÐЕТЕ ОПÐСÐÐТРЗОÐРМОМЕÐТÐЛÐО[] ]\nпредÑтои унижощение +database = Ð•Ð½Ñ†Ð¸ÐºÐ»Ð¾Ð¿ÐµÐ´Ð¸Ñ +savegame = Запази Игра +loadgame = Зареди Игра +joingame = ПриÑъедини Ñе в Игра +customgame = ПерÑонализирана Игра +newgame = Ðова Игра +none = <нÑма> +none.found = [lightgray]<нÑма намерени> +minimap = Мини-карта +position = ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ +close = Затвори +website = УебÑайт +quit = Изход +save.quit = Запази и Излез +maps = Карти +maps.browse = СпиÑък Ñ ÐºÐ°Ñ€Ñ‚Ð¸ +continue = Продължи +maps.none = [lightgray]ÐÑма намерени карти! +invalid = Ðевалидно +pickcolor = Избери цвÑÑ‚ +preparingconfig = Подготовка на ÐаÑтройки +preparingcontent = Подготовка на Съдържание +uploadingcontent = Качване на Съдържание +uploadingpreviewfile = Качване на Изображение за Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ +committingchanges = Запазване на Промени +done = Готово +feature.unsupported = Вашето уÑтройÑтво не поддържа тази Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ + +mods.initfailed = [red]âš []Mindustry Ð¿Ñ€ÐµÑ‚ÑŠÑ€Ð¿Ñ Ñрив при поÑледното Ñтартиране. Това вероÑтно е причинено от лошо поведение на нÑкой мод.\n\nЗа да Ñе предотврати поÑтоÑнно Ñриване при Ñтартиране, [red]вÑички модове бÑха забранени.[]\n\nЗа да забраните тази опциÑ, изключете Ñ Ð¾Ñ‚ [accent]ÐаÑтройки->Игра->Забрани Модовете При Стартиране След Срив[]. +mods = Модове +mods.none = [lightgray]ÐÑма намерени модове! +mods.guide = Как да Ñъздам мод? +mods.report = Съобщи за грешка +mods.openfolder = Отвори Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ +mods.viewcontent = Виж Съдържание +mods.reload = Презареди +mods.reloadexit = Играта ще Ñе затвори, за да презареди модовете. +mod.installed = [[ИнÑталиран] +mod.display = [gray]Мод:[orange] {0} +mod.enabled = [lightgray]Ðктивиран +mod.disabled = [scarlet]Деактивиран +mod.multiplayer.compatible = [gray]Поддържа Мрежова Игра +mod.disable = Деактивирай +mod.content = Съдържание: +mod.delete.error = ÐеуÑпешно изтриване на мод. ВероÑтно файловете Ñе използват. +mod.requiresversion = [scarlet]ИзиÑква минимална верÑÐ¸Ñ Ð½Ð° играта: [accent]{0} +mod.outdated = [scarlet]ÐеÑъвмеÑтим Ñ Ð²ÐµÑ€ÑÐ¸Ñ 6 (no minGameVersion: 105) +mod.missingdependencies = [scarlet]ЛипÑваÑÑ‚ завиÑимоÑти: {0} +mod.erroredcontent = [scarlet]Грешки в Съдържанието +mod.errors = Възникнаха грешки при зареждане на Ñъдържанието. +mod.noerrorplay = [scarlet]Има грешки в нÑкои от модовете, които използвате.[] ТрÑбва да деактивирате тези модове или да поправите грешките преди да играете. +mod.nowdisabled = [scarlet]ЛипÑват завиÑимоÑти за мод '{0}':[accent] {1}\n[lightgray]Мод {0} ще бъде деактивиран докато не ги изтеглите. +mod.enable = Ðктивирай +mod.requiresrestart = Играта ще Ñе затвори за да приложи промените в модовете. +mod.reloadrequired = [scarlet]Ðеобходимо е реÑтартиране +mod.import = Вмъкни мод +mod.import.file = Вмъкни от файл +mod.import.github = Вмъкни от GitHub +mod.jarwarn = [scarlet]JAR модовете могат да Ñа опаÑни.[]\n Уверете Ñе, че този мод e от надежден източник! +mod.item.remove = Този предмет е чаÑÑ‚ от [accent] '{0}'[] мод. За да го премахнете, премахнете или забранете този мод. +mod.remove.confirm = Този мод ще бъде премахнат. +mod.author = [lightgray]Ðвтор:[] {0} +mod.missing = Този Ð·Ð°Ð¿Ð¸Ñ Ñъдържа модове, които Ñа били обновени или изтрити. Може да възникнат грешки при зареждането. Сигурни ли Ñте, че иÑкате да го заредите?\n[lightgray]Модове:\n{0} +mod.preview.missing = За да публикувате този мод в Работилницата, той трÑбва да Ñъдържа изображение за визуализациÑ.\n ПоÑтавете файл Ñ Ð¸Ð¼ÐµÑ‚Ð¾ [accent]preview.png[] в директориÑта на мода и опитайте отново. +mod.folder.missing = Ð’ Работилницата могат да Ñе публикуват Ñамо модове под формата на директории.\nЗа да превърнете мод в Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñамо трÑбва да го разархивирате в Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¸ да изтриите архива. След това реÑтартирайте играта, за да презареди вашите модове. +mod.scripts.disable = Вашето уÑтройÑтво не поддържа модове ÑÑŠÑ Ñкриптове. ТрÑбва да забраните тези модове за да играете. + +about.button = За играта +name = Име: +noname = ТрÑбва да изберете [accent] име на играча[]. +planetmap = Ð“Ð»Ð¾Ð±ÑƒÑ +launchcore = ИзÑтрелÑй Ядрото +filename = Име на файл: +unlocked = Отйлючихте нови неща! +available = Можете да проучите нови технологии! +completed = [accent]Завършено +techtree = Tech Tree +research.legacy = Ðалична е Ð¸Ð¼Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ð¿Ñ€Ð¾ÑƒÑ‡Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ верÑÐ¸Ñ [accent]5.0[].\nЖелаете ли [accent] да заредите тези проучваниÑ[] или [accent] да Ñе откажете от Ñ‚ÑÑ…[] и да започнете на чиÑто в новата ÐºÐ°Ð¼Ð¿Ð°Ð½Ð¸Ñ (препоръчано)? +research.load = Зареди +research.discard = Захвърли +research.list = [lightgray]Проучване: +research = Проучване +researched = [lightgray]{0} проучено. +research.progress = {0}% завършено +players = {0} играча +players.single = {0} играч +players.search = търÑи +players.notfound = [gray]нÑма намерени играчи +server.closing = [accent]Спиране на Ñървър... +server.kicked.kick = Вие бÑхте изгонен от Ñървъра! +server.kicked.whitelist = ÐÑмате позволение да влезете в този Ñървър. +server.kicked.serverClose = Сървърът беше ÑпрÑн. +server.kicked.vote = Ти беше изгонен чрез глаÑуване. До Ñкоро. +server.kicked.clientOutdated = ОÑтарÑл клиент!\nÐктуализирайте играта Ñи! +server.kicked.serverOutdated = ОÑтарÑл Ñървър!\nПоиÑкайте от ÑобÑтвеника да го актуализира! +server.kicked.banned = Вие Ñте баннат в този Ñървър. +server.kicked.typeMismatch = Този Ñървър не е ÑъвмеÑтим Ñ Ð²Ð°ÑˆÐ°Ñ‚Ð° компилациÑ. +server.kicked.playerLimit = Сървърът е пълен.\nИзчакайте нÑкой да излезе. +server.kicked.recentKick = Вие Ñте били изхвърлен наÑкоро.\nОпитайте отново по - къÑно. +server.kicked.nameInUse = Вече има играч Ñ\nтова име в Ñървъра. +server.kicked.nameEmpty = Избрали Ñте невалидно име. +server.kicked.idInUse = Вие вече Ñте в този Ñървър! Ðе е позволено да влизате многократно. +server.kicked.customClient = Този Ñървър не поддържа неофициални компилации. ÐœÐ¾Ð»Ñ Ð¸Ð·Ñ‚ÐµÐ³Ð»ÐµÑ‚Ðµ официална верÑиÑ. +server.kicked.gameover = Край на играта! +server.kicked.serverRestarting = Сървърът Ñе реÑтартира. +server.versions = Вашата верÑиÑ:[accent] {0}[]\nВерÑÐ¸Ñ Ð½Ð° Ñървъра:[accent] {1}[] +host.info = Бутонът [accent]Отвори за лоцалната мрежа[] Ñтартира Ñървър на порт [scarlet]6567[].\nÐ’Ñеки в Ñъщата [lightgray]локална мрежа или WiFi[] би трÑбвало да види Ñървъра в ÑпиÑъка ÑÑŠÑ Ñървъри.\n\nЗа да могат хора извън локалната мрежата да Ñе Ñвържат по IP е необходимо [accent]пренаÑочване на порто (port forwarding)[].\n\n[lightgray]Бележка: Ðко нÑкой има проблеми при Ñвързване към вашата локална (LAN) игра, проверете дали Ñте позволили доÑтъп на Mindustry до локалната мрежа в наÑтройките на защитната Ñтена (firewall). ÐÑкои публични мрежи не позволÑват Ñървърите в Ñ‚ÑÑ… да бъдат автоматично открити от оÑтаналите играчи. +join.info = Тук можете да въведете [accent]IP Ð°Ð´Ñ€ÐµÑ Ð½Ð° Ñървър[] за да Ñе Ñвържете или да Ñе приÑъедините към автоматично намерен Ñървър във вашата [accent]локална мрежа[] или [accent]публичен[] Ñървър.\nПоддържат Ñе LAN и WAN мрежови игри.\n\n[lightgray]Ðко иÑкате да Ñе Ñвържете по IP ще трÑбва първо да поиÑкате IP на ÑобÑтвеника на Ñървъра, което той може да намери като напише "my ip" в Google от ÑвоÑта мрежа. +hostserver = Стартирай Мрежова Игра +invitefriends = Покани ПриÑтели +hostserver.mobile = Host Game +host = Отвори за Локалната Мрежа +hosting = [accent]ОтварÑне на Ñървър... +hosts.refresh = Обнови +hosts.discovering = ТърÑене на LAN Ñървъри +hosts.discovering.any = ТръÑене на Ñървъри +server.refreshing = ОбновÑване на Ñървър +hosts.none = [lightgray]ÐÑма намерени локални Ñървъри! +host.invalid = [scarlet]Ðе може да Ñе уÑтанови връÑка ÑÑŠÑ Ñървъра. + +servers.local = Локални Сървъри +servers.remote = Отдалечени Сървъри +servers.global = Публични Сървъри + +servers.disclaimer = Публичните Ñървъри [accent]не[] Ñа притежавани от разработчика.\n\nТе може да имат потребителÑко Ñъдържание неподходÑщо за вÑички възраÑти. +servers.showhidden = Покажи Скритите Сървъри +server.shown = Показан +server.hidden = Скрит + +trace = ПроÑледи Играч +trace.playername = Име на играча: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = ID: [accent]{0} +trace.mobile = Мобилен Клиент: [accent]{0} +trace.modclient = Модифициран Клиент: [accent]{0} +trace.times.joined = Пъти учаÑтвал в игра: [accent]{0} +trace.times.kicked = Пъти изхвърлен от игра: [accent]{0} +invalidid = Ðевалидно ID на клиент. Съобщете за грешка. +server.bans = Банове +server.bans.none = ÐÑма намерени баннати играчи! +server.admins = ÐдминиÑтратори +server.admins.none = ÐÑма намерени админиÑтратори! +server.add = Добави Сървър +server.delete = Сигурни ли Ñте, че иÑкате да изтриете този Ñървър? +server.edit = Редактирай Сървър +server.outdated = [scarlet]ОÑтарÑл Сървър![] +server.outdated.client = [scarlet]ОÑтарÑл Клиент![] +server.version = [gray]в{0} {1} +server.custombuild = [accent]ПерÑонализирана ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð°Ñ†Ð¸Ñ +confirmban = Сигурни ли Ñте, че иÑкате да баннете "{0}[white]"? +confirmkick = Сигурни ли Ñте, че иÑкате да изгоните "{0}[white]"? +confirmvotekick = Сигурни ли Ñте, че иÑкате да изгоните "{0}[white]" чрез глаÑуване? +confirmunban = Сигурни ли Ñте че, иÑкате да анулирате банването на този играч? +confirmadmin = Сигурни ли Ñте че, иÑкате да направите "{0}[white]" админиÑтратор? +confirmunadmin = Сигурни ли Ñте че, иÑкате да премахнете админиÑтраторÑките права на "{0}[white]"? +joingame.title = ПриÑъединÑване в игра +joingame.ip = IP адреÑ: +disconnect = Връзката беше прекъÑната. +disconnect.error = Проблем ÑÑŠÑ Ð²Ñ€ÑŠÐ·ÐºÐ°Ñ‚Ð°. +disconnect.closed = Връзката приключи. +disconnect.timeout = Загубена връзка. +disconnect.data = Грешка при зареждане на Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñвета! +cantconnect = ÐеуÑпех при Ñвързване към игра ([accent]{0}[]). +connecting = [accent]Свързване... +reconnecting = [accent]Повторно Ñвързване... +connecting.data = [accent]Зареждане на Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñвета... +server.port = Порт: +server.addressinuse = ÐдреÑÑŠÑ‚ вече Ñе използва! +server.invalidport = Ðевалиден порт! +server.error = [scarlet]Грешка при Ñтартиране на Ñървър. +save.new = Ðов Ð—Ð°Ð¿Ð¸Ñ +save.overwrite = Сигурни ли Ñте, че иÑкате\nда презапишете тази Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð·Ð° запиз? +overwrite = Презапиши +save.none = Ðе Ñа намерени запиÑи! +savefail = Грешка при запиÑване на игра! +save.delete.confirm = Сигурни ли Ñте, че иÑкате да изтриете този запиÑ? +save.delete = Изтрий +save.export = ИзнеÑи Ð—Ð°Ð¿Ð¸Ñ +save.import.invalid = [accent]Този Ð·Ð°Ð¿Ð¸Ñ Ðµ невалиден! +save.import.fail = [scarlet]Грешка при внаÑÑне на запиÑ: [accent]{0} +save.export.fail = [scarlet]Грешка при изнаÑÑне на запиÑ: [accent]{0} +save.import = ВнеÑи Ð—Ð°Ð¿Ð¸Ñ +save.newslot = Име на запиÑ: +save.rename = Преименувай +save.rename.text = Ðово име: +selectslot = Избери запиÑ. +slot = [accent]ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ {0} +editmessage = Редактирай Съобщение +save.corrupted = Ðевалиден или увреден запиÑ! +empty = <празно> +on = Включено +off = Изключено +save.autosave = Ðвтоматично запиÑване: {0} +save.map = Карта: {0} +save.wave = Вълна {0} +save.mode = Решим на игра: {0} +save.date = ПоÑледно ЗапиÑан: {0} +save.playtime = Играно време: {0} +warning = Тревога. +confirm = Потвърди +delete = Изтрий +view.workshop = Отвори в Работилницата +workshop.listing = Редактирай в Работилницата +ok = OK +open = Отвори +customize = ПерÑонализирай правилата +cancel = Отказ +openlink = Отвори Линк +copylink = Копирай Линк +back = Ðазад +max = МакÑимално +crash.export = ИзнеÑи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñрив +crash.none = ÐÑма намерена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñрив. +crash.exported = ИнеÑена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñрив. +data.export = ИзнеÑи данните на играта +data.import = ВнеÑи данните на играта +data.openfolder = Отвори Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ð¸ +data.exported = Данните на играта беше изнеÑена. +data.invalid = Това не е валиден файл Ñ Ð´Ð°Ð½Ð½Ð¸. +data.import.confirm = ВнаÑÑнето на външен файл Ñ Ð´Ð°Ð½Ð½Ð¸ ще унищожи [scarlet]вÑички[] ваши данни.\n[accent]Това нÑма да може да Ñе възÑтанови![]\n\nСлед като информациÑта Ñе внеÑе играта ще Ñе затвори. +quit.confirm = Сигурни ли Ñте, че иÑкате да излезете? +quit.confirm.tutorial = ÐаиÑтина ли знаете какво правите?\nМожете да повторите обучението от [accent] ÐаÑтройки->Игра->Повтори Обучението.[] +loading = [accent]Зареждане... +reloading = [accent]Презареждане на модове... +saving = [accent]ЗапиÑване... +respawn = [accent][[{0}][] за да Ñе Върнете при Ядрото +cancelbuilding = [accent][[{0}][] за да ИзчиÑтите Скицата +selectschematic = [accent][[{0}][] за да Озберете+Копирате +pausebuilding = [accent][[{0}][] за да Отложите на Строежа +resumebuilding = [scarlet][[{0}][] за да Продължите Строежа +enablebuilding = [scarlet][[{0}][] за да Позволите Строенето +showui = ИнтерфейÑÑŠÑ‚ е Ñкрит.\nÐатиÑнете [accent][[{0}][] за да го покажете. +wave = [accent]Вълна {0} +wave.cap = [accent]Вълна {0}/{1} +wave.waiting = [lightgray]Вълна Ñлед {0} +wave.waveInProgress = [lightgray]Ðаближава вълна от врагове +waiting = [lightgray]Изчакване... +waiting.players = Изчакване на играчи... +wave.enemies = [lightgray]{0} ОÑтаващи врагове +wave.enemycores = [accent]{0}[lightgray] ВражеÑки Ядра +wave.enemycore = [accent]{0}[lightgray] ВражеÑко Ядро +wave.enemy = [lightgray]{0} ОÑтаващи Врагове +wave.guardianwarn = ПазителÑÑ‚ приÑтига Ñлед [accent]{0}[] вълни. +wave.guardianwarn.one = ПазителÑÑ‚ приÑтига Ñлед [accent]{0}[] вълна. +loadimage = Зареди Изображение +saveimage = Запази Изображение +unknown = ÐеизвеÑтно +custom = ПерÑонализирано +builtin = Вградено +map.delete.confirm = Сигурни ли Ñте, че иÑкате да изтриете тази карта? Това дейÑтвие нÑма да може да бъде отменено! +map.random = [accent]Случайна Карта +map.nospawn = Тази карта нÑма Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð·Ð° Ñдро на играча! Добавете поне едно [accent]оранжево[] Ñдро от редактора на карти. +map.nospawn.pvp = Тази карта нÑма доÑтатъчно позиции за Ñдра на други играчи! Добавете поне едно [scarlet]неоранжево[] Ñдро от редактора на карти. +map.nospawn.attack = Тази карта нÑма нито едно вражеÑко Ñдро! Добавете поне едно [scarlet]червено[] Ñдро от редактора на карти. +map.invalid = Грешка при зареждане на карта: увреден или невалиден файл. +workshop.update = ОбновÑване на елемент +workshop.error = Грешка при изтеглÑне на данни от Работилницата: {0} +map.publish.confirm = Сигурни ли Ñте, че иÑкате да публикувате тази карта?\n\n[lightgray]Уверете Ñе че Ñте приели EULA(УÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° използване) на Работилницата, иначе вашата карта нÑма да Ñе покаже там! +workshop.menu = Изберете какво иÑкате да Ñторите Ñ Ñ‚Ð¾Ð·Ð¸ елемент. +workshop.info = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° елемент +changelog = ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° промените (по избор): +eula = Steam EULA (УÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° използване на Steam) +missing = Този елемент е бил изтрит или премеÑтен.\n[lightgray]Препратката към Работилницата беше автоматично изтрита. +publishing = [accent]Публикуване... +publish.confirm = Сигурни ли Ñте, че иÑкате да публикувате това?\n\n[lightgray]Уверете Ñе че Ñте приели EULA(УÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° използване) на Работилницата, иначе вашиÑÑ‚ елемент нÑма да Ñе показва там! +publish.error = Грешка при публикуване на елемент: {0} +steam.error = Грешка при зареждане на Steam уÑлуги.\nГрешка: {0} + +editor.brush = Четка +editor.openin = Отвори в редактора +editor.oregen = Генериране на руди +editor.oregen.info = Генериране на руди: +editor.mapinfo = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° картата +editor.author = Ðвтор: +editor.description = ОпиÑание: +editor.nodescription = Картата трÑбва да има опиÑание от поне 4 Ñимвола преди да е публикувана. +editor.waves = Вълни: +editor.rules = Правила: +editor.generation = Генериране: +editor.ingame = Редактирай в игра +editor.publish.workshop = Публикувай в Работилницата +editor.newmap = Ðова Карта +editor.center = Център +workshop = Работилница +waves.title = Вълни от нападатели +waves.remove = Премахни +waves.every = повтарÑй през +waves.waves = вълна(и) +waves.perspawn = на вълна +waves.shields = Ð±Ñ€Ð¾Ð½Ñ Ð½Ð° вълна +waves.to = до +waves.guardian = Пазител +waves.preview = Преглед +waves.edit = Редактирай... +waves.copy = Кобирай в Клипборд +waves.load = Зареди от Клипборда +waves.invalid = Клипборда Ñъдържа невалидна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° вълни. +waves.copied = Вълните бÑха копирани. +waves.none = ÐÑма дефинирани врагове.\nÐко оÑтавите опиÑанието на вълните празно играта ще използва ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½. + +#these are intentionally in lower case / тези умишлено Ñа оÑтавени без главни букви +wavemode.counts = бройки +wavemode.totals = общи бройки +wavemode.health = точки живот + +editor.default = [lightgray]<Стандартно> +details = Детайли... +edit = Редактирай... +editor.name = Име: +editor.spawn = Създай Единица +editor.removeunit = Премахни Единица +editor.teams = Отбори +editor.errorload = Грешка при зареждане на файл. +editor.errorsave = Грешка при запиÑване на файл. +editor.errorimage = Това е изображение, не карта. +editor.errorlegacy = Тази карта е твърде Ñтара, играта вече не поддържа този формат. +editor.errornot = Този файл не е карта. +editor.errorheader = Този файл Ñ ÐºÐ°Ñ€Ñ‚Ð° е повреден или невалиден. +editor.errorname = Картата нÑма зададено име. Да не Ñе опитвате да заредите игра? +editor.update = Обнови +editor.randomize = Случайно +editor.apply = Приложи +editor.generate = Генерирай +editor.resize = Смени размера +editor.loadmap = Зареди Карта +editor.savemap = Запиши Карта +editor.saved = ЗапиÑано! +editor.save.noname = Картата нÑма име! Задайте такова в 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° картата' от менюто. +editor.save.overwrite = СъщеÑтвува Ñтандартна карта Ñ Ñ‚Ð°ÐºÐ¾Ð²Ð° име! Изберете различно име от 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° картата' от менюто. +editor.import.exists = [scarlet]ÐеуÑпешно внаÑÑне:[] СъщеÑтвува ÑиÑтемна карта ÑÑŠÑ Ñъщото име - '{0}'! +editor.import = ВнаÑÑне... +editor.importmap = Използване на друга карта +editor.importmap.description = Работи върху копие на карта +editor.importfile = ВнеÑи файл +editor.importfile.description = Използвай карта от файл +editor.importimage = ВнаÑÑне от изображение +editor.importimage.description = ВнеÑи отфайл Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ на терена +editor.export = ИзнеÑи... +editor.exportfile = ИзнеÑи Файл +editor.exportfile.description = ИзнеÑи като файл Ñ ÐºÐ°Ñ€Ñ‚Ð° +editor.exportimage = ИзнеÑи Изображение +editor.exportimage.description = ИзнаÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ, което Ñъдържа Ñамо оÑновната Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° терена +editor.loadimage = Зареди Терен +editor.saveimage = ИзнеÑи Терен +editor.unsaved = Сигурни ли Ñте, че иÑкате да излезете?\n[scarlet]Ð’Ñички незапиÑани промени ще бъдат загубени. +editor.resizemap = Преоразмери картата +editor.mapname = Име на картата: +editor.overwrite = [accent]Ð’ÐИМÐÐИЕ!\nТази карта презапиÑва друга карта. +editor.overwrite.confirm = [scarlet]Ð’ÐИМÐÐИЕ![] Вече ÑъщеÑтвува карта Ñ Ñ‚Ð¾Ð²Ð° име. Ðко продължите ще запишете тази на нейно мÑÑто. Желаете ли да продължите?\n"[accent]{0}[]" +editor.exists = Ð’ ече ÑъщеÑтвува карта Ñ Ñ‚Ð¾Ð²Ð° име. +editor.selectmap = Изберете карта, коÑто да заредите: + +toolmode.replace = ЗамеÑтване +toolmode.replace.description = РиÑува Ñамо върху твърди блокчета. +toolmode.replaceall = ЗамеÑти вÑички +toolmode.replaceall.description = ЗамеÑтва вÑички блокчета на картата +toolmode.orthogonal = Ортогоналнo +toolmode.orthogonal.description = РиÑува Ñамо хоризонтални или вертикални линии. +toolmode.square = Квадрат +toolmode.square.description = Квадратна четка. +toolmode.eraseores = Изтриване на руди +toolmode.eraseores.description = Изтрива Ñамо руди. +toolmode.fillteams = Запълване в отбори +toolmode.fillteams.description = ÐŸÑ€Ð¾Ð¼ÐµÐ½Ñ Ð¾Ñ‚Ð±Ð¾Ñ€Ð°, не типа на обектите, чрез запълване +toolmode.drawteams = РиÑуване в отбори +toolmode.drawteams.description = ÐŸÑ€Ð¾Ð¼ÐµÐ½Ñ Ð¾Ñ‚Ð±Ð¾Ñ€Ð°, не типа на обектите, чрез риÑуване + +filters.empty = [lightgray]ÐÑма избран филтър! Изберете чрез бутона отдоло. +filter.distort = ИзкривÑване +filter.noise = Шум +filter.enemyspawn = Избор на вражеÑка начална точка +filter.spawnpath = Път до начална точка +filter.corespawn = Избор на Ñдро +filter.median = Медиана +filter.oremedian = Рудна медиана +filter.blend = СмеÑване +filter.defaultores = Стандартни руди +filter.ore = Руда +filter.rivernoise = Реки +filter.mirror = Огледално +filter.clear = ИзчиÑти +filter.option.ignore = Игнорирай +filter.scatter = РазпръÑкване +filter.terrain = Терен +filter.option.scale = Мащаб +filter.option.chance = ВероÑтноÑÑ‚ +filter.option.mag = Магнитут +filter.option.threshold = Праг +filter.option.circle-scale = Кръгово мащабиране +filter.option.octaves = Октави +filter.option.falloff = Разпадане +filter.option.angle = Ъгъл +filter.option.amount = КоличеÑтво +filter.option.block = Блок +filter.option.floor = Под +filter.option.flooronto = Целеви под +filter.option.target = Цел +filter.option.wall = Стена +filter.option.ore = Руда +filter.option.floor2 = Втори под +filter.option.threshold2 = Втори праг +filter.option.radius = Ð Ð°Ð´Ð¸ÑƒÑ +filter.option.percentile = Перцентил + +width = Дължина: +height = ВиÑочина: +menu = Меню +play = Играй +campaign = ÐšÐ°Ð¼Ð¿Ð°Ð½Ð¸Ñ +load = Зареди +save = Запиши +fps = FPS: {0} +ping = Ping: {0}ms +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb +language.restart = РеÑтартирайте вашата игра за да зареди наÑтройките за език. +settings = ÐаÑтройки +tutorial = Обучение +tutorial.retake = Повтори Обучението +editor = Редактор +mapeditor = Редактор на Карта + +abandon = ИзоÑтавÑне +abandon.text = Тази зона и вÑичките Ñ Ñ€ÐµÑурÑи ще бъдат оÑтавени на врага. +locked = Заключено +complete = [lightgray]Завършено: +requirement.wave = Стигнете вълна {0} в {1} +requirement.core = Унищожете враженÑкото Ñдро в {0} +requirement.research = Проучете {0} +requirement.produce = Произведете {0} +requirement.capture = Превземете {0} +launch.text = ИзÑтрелÑй +research.multiplayer = Само хоÑтващиÑÑ‚ играч може да провежда изÑледваниÑ. +map.multiplayer = Само хоÑтващиÑÑ‚ играч може да преглежда Ñекторите. +uncover = Разкрий +configure = Избор на екипировка + +loadout = Екипировка +resources = РеÑурÑи +bannedblocks = Забранени блокове +addall = Добави Ð’Ñички +launch.from = ИзÑтрелÑй от: [accent]{0} +launch.destination = Цел: {0} +configure.invalid = КоличеÑтвото трÑбва да е между 0 и {0}. +add = Добави... +boss.health = Точки живот на ÐŸÐ°Ð·Ð¸Ñ‚ÐµÐ»Ñ + +connectfail = [scarlet]Грешка при Ñвързване:\n\n[accent]{0} +error.unreachable = Сървърът е недоÑтъпен.\nТова ли е правилниÑÑ‚ адреÑ? +error.invalidaddress = Ðевалиден адреÑ. +error.timedout = Времето за изчакване изтече!\nУверете Ñе че адреÑÑŠÑ‚ е правилен и ÑобÑтвеникът е пренаÑочил правилно порта на играта! +error.mismatch = Грешка в пакетите:\nвероÑтно е разминаване на верÑиите на клиента и Ñървъра.\nУверете Ñе че клиентът и Ñървърът използват поÑледната верÑÐ¸Ñ Ð½Ð° Mindustry! +error.alreadyconnected = Вече Ñте Ñвързани. +error.mapnotfound = Ðе е намерен файл Ñ ÐºÐ°Ñ€Ñ‚Ð°! +error.io = Мрежова I/O грешка. +error.any = ÐеизвеÑтна мрежова грешка. +error.bloom = ÐеуÑпешно инициализиране на СиÑниÑ.\nВашето уÑтройÑтво може да не поддържа този ефект. + +weather.rain.name = Дъжд +weather.snow.name = СнÑг +weather.sandstorm.name = ПÑÑъчна Ð±ÑƒÑ€Ñ +weather.sporestorm.name = Спорова Ð±ÑƒÑ€Ñ +weather.fog.name = Мъгла + +sectors.unexplored = [lightgray]ÐеизÑледвано +sectors.resources = РеÑурÑи: +sectors.production = ПроизводÑтво: +sectors.export = ИзнеÑи: +sectors.time = Време: +sectors.threat = Заплаха: +sectors.wave = Вълна: +sectors.stored = Съхранени: +sectors.resume = Продължи +sectors.launch = ИзÑтрелÑй +sectors.select = Избери +sectors.nonelaunch = [lightgray]нÑма (Слънцето) +sectors.rename = Преименувай Зоната +sectors.enemybase = [scarlet]ВражеÑка база +sectors.vulnerable = [scarlet]УÑзвима +sectors.underattack = [scarlet]Под атака! [accent]{0}% повредена +sectors.survives = [accent]ОцелÑва {0} вълни +sectors.go = ПоÑети +sector.curcapture = Зоната превзета +sector.curlost = Зоната загубена +sector.missingresources = [scarlet]ÐедоÑтатъчни реÑурÑи в Ñдрото +sector.attacked = Зона [accent]{0}[white] е под атака! +sector.lost = Зона [accent]{0}[white] беше загубена! +#note: the missing space in the line below is intentional +sector.captured = Зона [accent]{0}[white]беше превзета! + +threat.low = ÐиÑка +threat.medium = Средна +threat.high = ВиÑока +threat.extreme = ЕкÑтремна +threat.eradication = Унищожителна + +planets = Планети + +planet.serpulo.name = Серпуло +planet.sun.name = Слънце + +sector.impact0078.name = СблъÑък 0078 +sector.groundZero.name = Ðулева точка +sector.craters.name = Кратерите +sector.frozenForest.name = Замръзнала Гора +sector.ruinousShores.name = Брегови руини +sector.stainedMountains.name = Зацапаните планини +sector.desolateRift.name = ОпуÑÑ‚Ñл Разрив +sector.nuclearComplex.name = Ядрено-производÑтвен ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ +sector.overgrowth.name = СвръхраÑтеж +sector.tarFields.name = Катранените Полета +sector.saltFlats.name = Солените Равнини +sector.fungalPass.name = ГъбениÑÑ‚ Пролом +sector.biomassFacility.name = БиоÑинтезиращо Съоръжение +sector.windsweptIslands.name = Ветровитите ОÑтрови +sector.extractionOutpost.name = Добивен лагер +sector.planetaryTerminal.name = Терминал за коÑмичеÑки миÑии + +sector.groundZero.description = Перфектното мÑÑто за започване отначало. ÐиÑка заплаха. ÐиÑки реÑурÑи.\nСъбери колкото можеш мед и олово.\nПродължи напред. +sector.frozenForest.description = Дори тук, близо до планините, Ñпорите Ñа Ñе разпроÑтранили. Мразовитите температури не могат да ги задържат вечно.\n\nОвладейте електричеÑтвото. ПоÑтройте горивни генератори. Ðаучете Ñе да ползвате възÑтрановители. +sector.saltFlats.description = Ðа покрайнините на пуÑтинÑта лежат Солените Равнини. ÐÑма много реÑурÑи на това мÑÑто.\n\nВрагът е издигнал ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ Ð·Ð° Ñъхранение на реÑурÑи тук. Изкоренете неговото Ñдро. Сравнете вÑичко ÑÑŠÑ Ð·ÐµÐ¼Ñта. +sector.craters.description = Събрала Ñе е вода в този кратер, Ñпомен от забравени войни. ВъзÑтановете региона. Съберете пÑÑък. Помиришете метаÑтъклото. Използвайте вода за да охлаждате вашите Ð¾Ñ€ÑŠÐ´Ð¸Ñ Ð¸ Ñвредла. +sector.ruinousShores.description = Сред отпадъците е и бреговата линиÑ. ÐÑкога тук е ÑтоÑла бреговата защитна линиÑ. ÐÑма много Ñледи от неÑ. ОÑтанали Ñа Ñамо нÑкои елементарни защитни механизми, вÑичко оÑтанало е Ñведено до Ñкрап.\nПродължете разширÑването навън. Преоткрийте технологиÑта. +sector.stainedMountains.description = По - навътре в континента Ñе намират планините, вÑе още незамърÑени от Ñпорите.\nИзвлечете изоÑтавениÑÑ‚ тита в тази зона. Ðаучете Ñе да го използвате.\n\nПриÑÑŠÑтвието на врагове тук е по - виÑоко. Ðе им оÑтавÑйте време да изпратÑÑ‚ тежката артилериÑ. +sector.overgrowth.description = Обладана от виÑока раÑтителноÑÑ‚, тази зона Ñе намира изключително близо до източника на Ñпорите. Врагът е уÑтановил военен лагер тук. ПоÑтройте единици модел 'Боздуган' и унищожете вражеÑката база. +sector.tarFields.description = Покрайнините на нефтено находище, намиращо Ñе между планините и пуÑтинÑта. Една от малкото зони Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°ÐµÐ¼Ð¸ резерви на катран.\nМакар и изоÑтавена, близо до тази зона има опаÑни вражеÑки Ñили. Ðе ги подценÑвайте.\n\n[lightgray]Препоръчително е да проучите Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð·Ð° обработка на нефт преди да започнете. +sector.desolateRift.description = Много опаÑна зона. Изобилие на реÑурÑи, но малко проÑтранÑтво. ВиÑок риÑк от унищожение. ÐапуÑнете възможно най - Ñкоро. Ðе Ñе подлъгвайте от дългите интервали между атаките. +sector.nuclearComplex.description = Бивш ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ Ð·Ð° добив и обработка на торий, от който Ñа оÑтанали Ñамо руини.\n[lightgray]Проучете Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸ многобройните му приложениÑ.\n\nВражеÑкото приÑÑŠÑтвие тук е многобройно и непрекъÑнато внимава за нападатели. +sector.fungalPass.description = Преходна зона между виÑоки планини и по - ниÑки, оÑеÑни ÑÑŠÑ Ñпори земи. Тук врагът е разположил малка разузнавателна база.\nУнищожи Ñ.\nИзползвайте единици модел 'Кинжал' и 'Къртица'. Унищожете двете вражеÑки Ñдра. +sector.biomassFacility.description = Това Ñъоръжение е първоизточникът на Ñпорите. Тук те Ñа били проучвани и Ñъздавани за първи път.\nПроучете технологиите Ñкрити в него. Култивирайте Ñпори за да произвеждате гориво и плаÑтмаÑи.\n\n[lightgray]След Ñмъртта на Ñъоръжението Ñпорите били оÑвободени. Ðищо в меÑтната екоÑиÑтема не може да Ñе конкурира Ñ Ñ‚Ð°ÐºÑŠÐ² инвазивен организъм. +sector.windsweptIslands.description = По - нататък край бреговата Ð»Ð¸Ð½Ð¸Ñ Ñе намира тази отдалечена верига от оÑтрови. Според нÑкои запиÑи тук нÑкога е имало Ñтруктури за производÑтво на [accent]ПлаÑтаний[].\n\nОтблъÑнете вражеÑките морÑки войÑки. ПодÑигурете ÑÐ²Ð¾Ñ Ð±Ð°Ð·Ð° на тези оÑтрови. Проучете тези фабрики. +sector.extractionOutpost.description = Отдалечен аванпоÑÑ‚, където врагът е разÑледвал технологии за пренаÑÑне на реÑурÑи на далечни раÑтоÑниÑ.\n\nТехнологии за транÑпорт на материали между зони е ключова за бъдещи дейÑтвиÑ. Унищожете вражеÑката база и проучете вражеÑките ИзÑтрелващи площадки. +sector.impact0078.description = Тук лежат оÑтанките от Ð¿ÑŠÑ€Ð²Ð¸Ñ Ð¼ÐµÐ¶Ð´ÑƒÐ·Ð²ÐµÐ·Ð´ÐµÐ½ транÑпортер, влÑзъл в тази ÑиÑтема.\n\nСпаÑете колкото е възможно повече от оÑтанките. Проучете вÑÑка непокътната технологиÑ. +sector.planetaryTerminal.description = Крайна цел.\n\nТази крайбрежна база Ñъдържа Ñтруктура, Ñъздадена Ñ Ñ†ÐµÐ» междупланетарен транÑпорт на Ñдра, макар и Ñамо в рамките на локалната звездна ÑиÑтема. Тази Ð»Ð¾ÐºÐ°Ñ†Ð¸Ñ Ð¸Ð¼Ð° изключително виÑока защита.\n\nИзползвайте военноморÑки единици. Елиминирайте врага възможно най - бързо. Проучете изÑтрелващата Ñтруктура + +status.burning.name = ГорÑщ +status.freezing.name = ЗамръзÑващ +status.wet.name = Мокър +status.muddy.name = Кален +status.melting.name = РазтопÑван +status.sapped.name = Източван +status.spore-slowed.name = ОбраÑъл в Ñпори (забавен) +status.tarred.name = ОблÑÑ‚ в катран +status.overclock.name = УÑкорен +status.shocked.name = Зашеметен +status.blasted.name = ВзривоопаÑен +status.unmoving.name = Ðеподвижен + +settings.language = Език +settings.data = Данни на играта +settings.reset = ВъзÑтанови до Ñтандартните наÑтройки +settings.rebind = Смени +settings.resetKey = Ðулирай +settings.controls = Контроли +settings.game = Игра +settings.sound = Звук +settings.graphics = Графики +settings.cleardata = ИзчиÑти данните на играта... +settings.clear.confirm = Сигурни ли Ñте, че иÑкате да изтриете данните на играта?\nСтореното не може да бъде отменено! +settings.clearall.confirm = [scarlet]Внимание![]\nТова ще изчиÑти вÑички данни за играта, включително запазени игри, карти, отключени елементи и наÑтройки на клавишите.\nÐко натиÑнете 'ок' играта ще изчиÑти вÑичките Ñи данни и автоматично ще Ñе затвори. +settings.clearsaves.confirm = Сигурни ли Ñте, че иÑкате да изтриете вÑичките Ñи запазени игри? +settings.clearsaves = ИзчиÑти запазените игри +settings.clearresearch = ИзчиÑти ПроучваниÑта +settings.clearresearch.confirm = Сигурни ли Ñте, че иÑкате да изчиÑтите вÑичките Ñи Ð¿Ñ€Ð¾ÑƒÑ‡Ð²Ð°Ð½Ð¸Ñ Ð² режим КампаниÑ? +settings.clearcampaignsaves = ИзчиÑти запазените игри в КампаниÑта +settings.clearcampaignsaves.confirm = Сигурни ли Ñте, че иÑкате да изтриете вÑичките Ñи запиÑи от КампаниÑта? +paused = [accent]< Играта е в пауза > +clear = ИзчиÑти +banned = [scarlet]Баннат +yes = Да +no = Ðе +info.title = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +error.title = [scarlet]Възникна грешка +error.crashtitle = Възникна грешка +unit.nobuild = [scarlet]Единицата не може да Ñтрои +lastaccessed = [lightgray]ПоÑледно доÑтъпван: {0} +block.unknown = [lightgray]??? + +stat.description = Предназначение +stat.input = Вход +stat.output = Изход +stat.booster = Двигатели +stat.tiles = Ðеобходим терен +stat.affinities = Ðфинитети +stat.opposites = ПротивоположноÑти +stat.powercapacity = ЕлектричеÑки Капацитет +stat.powershot = ЕлектроенергиÑ/Изтрел +stat.damage = Щети +stat.targetsair = Ðапада по Въздух +stat.targetsground = Ðапада по Ð—ÐµÐ¼Ñ +stat.itemsmoved = СкороÑÑ‚ на Движение +stat.launchtime = Време между изÑтрелваниÑта +stat.shootrange = Обхват +stat.size = Размер +stat.displaysize = Размер на Екрана +stat.liquidcapacity = Капацитет на ТечноÑти +stat.powerrange = Обхват на ЕлектроенергиÑта +stat.linkrange = Обхват на връзката +stat.instructions = ИнÑтрукции +stat.powerconnections = МакÑимален брой връзки +stat.poweruse = КонÑÑƒÐ¼Ð°Ñ†Ð¸Ñ Ð½Ð° ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾ÐµÐ½ÐµÑ€Ð³Ð¸Ñ +stat.powerdamage = ЕлектроенергиÑ/Щета +stat.itemcapacity = РеÑурÑен капацитет +stat.memorycapacity = Капацитет на паметта +stat.basepowergeneration = ОÑновно производÑтво на ÐµÐ½ÐµÑ€Ð³Ð¸Ñ +stat.productiontime = Време за производÑтво +stat.repairtime = Време за пълна поправка на блок +stat.weapons = ÐžÑ€ÑŠÐ¶Ð¸Ñ +stat.bullet = Муниции +stat.speedincrease = УÑкорение +stat.range = Обхват +stat.drilltier = Изкопаеми реÑурÑи +stat.drillspeed = ОÑновна ÑкороÑÑ‚ на Ñвредлото +stat.boosteffect = Ефект на уÑилване +stat.maxunits = МакÑимални активни единици +stat.health = Точки живот +stat.armor = Ð‘Ñ€Ð¾Ð½Ñ +stat.buildtime = Време за поÑтроÑване +stat.maxconsecutive = МакÑимално поÑледователни +stat.buildcost = Разходи за изграждане +stat.inaccuracy = ÐеточноÑÑ‚ +stat.shots = ИзÑтрели +stat.reload = ИзÑтрели/Секунда +stat.ammo = БоеприпаÑи +stat.shieldhealth = Здравина на щита +stat.cooldowntime = Време за охлаждане +stat.explosiveness = ЕкÑплозивноÑÑ‚ +stat.basedeflectchance = Базов ÑˆÐ°Ð½Ñ Ð·Ð° отклонÑване на изÑтрел +stat.lightningchance = ВероÑтноÑÑ‚ за Ñветкавица +stat.lightningdamage = Щети от Ñветкавица +stat.flammability = ВъзпламенимоÑÑ‚ +stat.radioactivity = РадиоактивноÑÑ‚ +stat.charge = ЗарÑд +stat.heatcapacity = Топлинен Капацитет +stat.viscosity = ВиÑкозитет (гъÑтота) +stat.temperature = Температура +stat.speed = СкороÑÑ‚ +stat.buildspeed = СкороÑÑ‚ на изграждане +stat.minespeed = СкороÑÑ‚ на добив +stat.minetier = Ðиво на добив +stat.payloadcapacity = Товарен Капацитет +stat.commandlimit = Команден Лимит +stat.abilities = СпоÑобноÑти +stat.canboost = Може да уÑкорÑва +stat.flying = ЛетÑщ +stat.ammouse = Употребе на БоеприпаÑи +stat.damagemultiplier = Множител на Щети +stat.healthmultiplier = Множител на Точки живот +stat.speedmultiplier = Множител на СкороÑÑ‚ +stat.reloadmultiplier = Множител на Презареждане +stat.buildspeedmultiplier = Множител на ÑкороÑÑ‚ за изграждане +stat.reactive = Реагира + +ability.forcefield = Енергийно Поле +ability.repairfield = ВъзÑтановÑващо Поле +ability.statusfield = ПодÑилващо Поле +ability.unitspawn = {0} Factory +ability.shieldregenfield = ВъзÑтановÑващо Ð±Ñ€Ð¾Ð½Ñ ÐŸÐ¾Ð»Ðµ +ability.movelightning = Подвижна Ñветкавица + +bar.drilltierreq = Ðеобходимо е по-добро Свредло +bar.noresources = ÐедоÑтатъчни РеÑурÑи +bar.corereq = Ðеобходимо е Ядро за оÑнова +bar.drillspeed = СкороÑÑ‚ на Ñвредлото: {0}/Ñек +bar.pumpspeed = СкороÑÑ‚ на помпата: {0}/Ñек +bar.efficiency = ЕфективноÑÑ‚: {0}% +bar.boost = УÑилване: {0}% +bar.powerbalance = ЕлектроенергиÑ: {0}/Ñек +bar.powerstored = Съхранена енергиÑ: {0}/{1} +bar.poweramount = ЕлектроенергиÑ: {0} +bar.poweroutput = Произвеждано електричеÑтво: {0} +bar.powerlines = Връзки: {0}/{1} +bar.items = Предмети: {0} +bar.capacity = Капацитет: {0} +bar.unitcap = {0} {1}/{2} +bar.liquid = ТечноÑÑ‚ +bar.heat = Топлина +bar.power = Ð•Ð»ÐµÐºÑ‚Ñ€Ð¾ÐµÐ½ÐµÑ€Ð³Ð¸Ñ +bar.progress = Ðапредък в производÑтвото +bar.input = Вход +bar.output = Изход + +units.processorcontrol = [lightgray]Контролиран от процеÑор + +bullet.damage = [stat]{0}[lightgray] щети +bullet.splashdamage = [stat]{0}[lightgray] щети на площ ~[stat] {1}[lightgray] полета +bullet.incendiary = [stat]Подпалване +bullet.homing = [stat]СамонаÑочване +bullet.frag = [stat]Шрапнел +bullet.lightning = [stat]{0}[lightgray]x Ñветкавица ~ [stat]{1}[lightgray] щети +bullet.buildingdamage = [stat]{0}%[lightgray] щети на Ñгради +bullet.knockback = [stat]{0}[lightgray] отблъÑкване +bullet.pierce = [stat]{0}[lightgray]x пробождане +bullet.infinitepierce = [stat]пробождане +bullet.healpercent = [stat]{0}[lightgray]% възÑтановÑване +bullet.multiplier = [stat]{0}[lightgray]x множител на боеприпаÑи +bullet.reload = [stat]{0}[lightgray]x ÑкороÑÑ‚ на Ñтрелба + +unit.blocks = блока +unit.blockssquared = блока² +unit.powersecond = електричеÑтво/Ñекунда +unit.liquidsecond = течноÑÑ‚/Ñекунда +unit.itemssecond = предмети/Ñекунда +unit.liquidunits = течноÑÑ‚ +unit.powerunits = електричеÑтво +unit.degrees = градуÑи +unit.seconds = Ñекунди +unit.minutes = минути +unit.persecond = /Ñек +unit.perminute = /мин +unit.timesspeed = x ÑкороÑÑ‚ +unit.percent = % +unit.shieldhealth = здравина на щита +unit.items = предмети +unit.thousands = хил +unit.millions = млн +unit.billions = млр +unit.pershot = /изÑтрел +category.purpose = Предназначение +category.general = Обща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +category.power = ЕлектричеÑтво +category.liquids = ТечноÑти +category.items = Предмети +category.crafting = Вход/Изход +category.function = ФункционалноÑÑ‚ +category.optional = Допълнителни ÐŸÐ¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ +setting.landscape.name = Заключване на Пейзажа +setting.shadows.name = Сенки +setting.blockreplace.name = Ðвтоматични ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° Блокове +setting.linear.name = Линейно Филтриране +setting.hints.name = Съвети +setting.logichints.name = ЛогичеÑки Съвети +setting.flow.name = Показвай КоличеÑтвото ПренеÑени РеÑурÑи +setting.backgroundpause.name = Пауза при загуба на Ñ„Ð¾ÐºÑƒÑ +setting.buildautopause.name = Ðвтоматична Пауза на Изграждането +setting.doubletapmine.name = Двоен Клик за Добив на РеÑÑƒÑ€Ñ +setting.modcrashdisable.name = Забрани Модовете При Стартиране След Срив +setting.animatedwater.name = Ðнимирани ПовърхноÑти +setting.animatedshields.name = Ðнимирани Щитове +setting.antialias.name = Заглаждане на ръбове[lightgray] (изиÑква реÑтартиране)[] +setting.playerindicators.name = Индикатори на играчите +setting.indicators.name = Индикатори на враговете +setting.autotarget.name = Ðвтоматичен Прицел +setting.keyboard.name = Контроли: Мишка и Клавиатура +setting.touchscreen.name = Контроли: ТъчÑкрийн +setting.fpscap.name = МакÑимални FPS +setting.fpscap.none = ÐÑма +setting.fpscap.text = {0} FPS +setting.uiscale.name = Размер на ИнтерфейÑÑŠÑ‚[lightgray] (изиÑква реÑтарт)[] +setting.swapdiagonal.name = Винаги Диагонално ПоÑтавÑне +setting.difficulty.training = Тренировка +setting.difficulty.easy = ЛеÑно +setting.difficulty.normal = Ðормално +setting.difficulty.hard = Трудно +setting.difficulty.insane = Безумно +setting.difficulty.name = ТрудноÑÑ‚: +setting.screenshake.name = Клатене на Екрата +setting.effects.name = Показвай Ефекти +setting.destroyedblocks.name = Показвай Унищожени Блокове +setting.blockstatus.name = Показвай Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° Блоковете +setting.conveyorpathfinding.name = Ðамиране на Валидна Пътека при ПоÑтавÑне на ТранÑпортери +setting.sensitivity.name = ЧувÑтвителноÑÑ‚ на Контролера +setting.saveinterval.name = Време Между Ðвтоматичен Ð—Ð°Ð¿Ð¸Ñ +setting.seconds = {0} Ñекунди +setting.milliseconds = {0} милиÑекунди +setting.fullscreen.name = ЦÑл Екран +setting.borderlesswindow.name = Прозорец без Рамка[lightgray] (може да изиÑква реÑтарт) +setting.fps.name = Показвай FPS & Ping +setting.smoothcamera.name = Гладка Камера +setting.vsync.name = Вертикална ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ (VSync) +setting.pixelate.name = ПикÑелизирай +setting.minimap.name = Показвай Мини-Карта +setting.coreitems.name = Показвай РеÑурÑите в Ядрото +setting.position.name = Показвай ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° Играч +setting.musicvol.name = Сила на Звука +setting.atmosphere.name = Показвай ÐтмоÑферата на Планетата +setting.ambientvol.name = Сила на Звука на Околната Среда +setting.mutemusic.name = Заглуши Музиката +setting.sfxvol.name = Сила на Звуковите Ефекти +setting.mutesound.name = Заглуши Звука +setting.crashreport.name = ИЗпращай Ðнонимни Отчети за Сривове +setting.savecreate.name = Ðвтоматични ЗапиÑи +setting.publichost.name = ВидимоÑÑ‚ на Публичните Игри +setting.playerlimit.name = Лимит на Играчи +setting.chatopacity.name = ПлътноÑÑ‚ на Чата +setting.lasersopacity.name = ПлътноÑÑ‚ на Енергийните Лазери +setting.bridgeopacity.name = ПлътноÑÑ‚ на МоÑтовете +setting.playerchat.name = Показвай Мехурчета Ñ Ð§Ð°Ñ‚ +setting.showweather.name = Показвай Графики за Климата +public.confirm = ИÑкате ли да направите вашата игра публична?\n[accent]Ð’Ñеки ще може да Ñе приÑъедини към вашата игра.\n[lightgray]Това може да бъде променено по-къÑно в ÐаÑтройки->Игри->ВидимоÑÑ‚ на Публичните Игри. +public.confirm.really = Ðко иÑкате да играете Ñ Ð¿Ñ€Ð¸Ñтел, използвате [green]Покани ПриÑтел[] вмеÑто [scarlet]Публикувай Сървър[]!\nСигурни ли Ñте, че иÑкате да направите вашата игра [scarlet]публична[]? +public.beta = Имайте в предвид, че бета верÑии на играта не могат да Ñтартират публични игри. +uiscale.reset = Размерът на интерфейÑа беше променен.\nÐатиÑнете "ОК" за да потвърдите този размер.\n[scarlet]ВъзÑтановÑване и реÑтартиране Ñлед[accent] {0}[] Ñекунди... +uiscale.cancel = Отакз & Изход +setting.bloom.name = СиÑние +keybind.title = Промени Клавишите +keybinds.mobile = [scarlet]Повечето клавиши тук не Ñа използваеми за мобилната верÑиÑ. Само оÑновните Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñе поддържат. +category.general.name = ОÑновни наÑтройки +category.view.name = Изглед +category.multiplayer.name = Мрежова игра +category.blocks.name = Избор на блок +command.attack = Ðтака +command.rally = Събрание +command.retreat = ОтÑтъпление +command.idle = БездейÑтвие +placement.blockselectkeys = \n[lightgray]Клавиш: [{0}, +keybind.respawn.name = Връщане при Ядрото +keybind.control.name = УправлÑване на единица +keybind.clear_building.name = ИзчиÑтване на План За Строеж +keybind.press = ÐатиÑнете клавиш... +keybind.press.axis = ÐатиÑнете Ð¾Ñ Ð¸Ð»Ð¸ клавиш... +keybind.screenshot.name = Екранна Снимка +keybind.toggle_power_lines.name = Показвай/Скрий Енергийните лазери +keybind.toggle_block_status.name = Показвай/Скрий СтатуÑи на Блоковете +keybind.move_x.name = Движение по X +keybind.move_y.name = Движение по Y +keybind.mouse_move.name = Следвай Мишката +keybind.pan.name = Панорамен Изглед +keybind.boost.name = УÑкорение +keybind.schematic_select.name = Избери Регион +keybind.schematic_menu.name = Меню ÑÑŠÑ Ð¡Ñ…ÐµÐ¼Ð¸ +keybind.schematic_flip_x.name = Завърти Схема по X +keybind.schematic_flip_y.name = Завърти Схема по Y +keybind.category_prev.name = Предишна ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ +keybind.category_next.name = Следваща ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ +keybind.block_select_left.name = Избор на Блок: ÐалÑво +keybind.block_select_right.name = Избор на Блок: ÐадÑÑно +keybind.block_select_up.name = Избор на Блок: Ðагоре +keybind.block_select_down.name = Избор на Блок: Ðадолу +keybind.block_select_01.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 1 +keybind.block_select_02.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 2 +keybind.block_select_03.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 3 +keybind.block_select_04.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 4 +keybind.block_select_05.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 5 +keybind.block_select_06.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 6 +keybind.block_select_07.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 7 +keybind.block_select_08.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 8 +keybind.block_select_09.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 9 +keybind.block_select_10.name = Избор на Блок: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ 10 +keybind.fullscreen.name = Превключи на ЦÑл Екран +keybind.select.name = Избери/СтрелÑй +keybind.diagonal_placement.name = Диагонално ПоÑтавÑне +keybind.pick.name = Вземи Блок +keybind.break_block.name = Унищожи Блок +keybind.deselect.name = Премахни избора +keybind.pickupCargo.name = Вземи Товар +keybind.dropCargo.name = ОÑтави Товар +keybind.command.name = Командвай +keybind.shoot.name = СтрелÑй +keybind.zoom.name = Увеличи +keybind.menu.name = Меню +keybind.pause.name = Пауза +keybind.pause_building.name = Спри/Продължи Строеж +keybind.minimap.name = Мини-Карта +keybind.planet_map.name = ГлобуÑ/Карта на Ñвета +keybind.research.name = ÐŸÑ€Ð¾ÑƒÑ‡Ð²Ð°Ð½Ð¸Ñ +keybind.block_info.name = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Блок +keybind.chat.name = Чат +keybind.player_list.name = СпиÑък Ñ Ð˜Ð³Ñ€Ð°Ñ‡Ð¸ +keybind.console.name = Конзола +keybind.rotate.name = Завърти +keybind.rotateplaced.name = Завърти СъщеÑтвуващ Блок (задържане) +keybind.toggle_menus.name = Покажи/Скрий Менюта +keybind.chat_history_prev.name = Предишно Ñъобщение +keybind.chat_history_next.name = Следващо Ñъобщение +keybind.chat_scroll.name = Превъртане на чата +keybind.chat_mode.name = Смени режим на чат +keybind.drop_unit.name = ОÑтави Единица +keybind.zoom_minimap.name = Увеличи Мини-Карта +mode.help.title = ОпиÑание на режими +mode.survival.name = ОцелÑване +mode.survival.description = ÐормалниÑÑ‚ режим на играта. Ограничени реÑурÑи и автоматични вълни от нападатели.\n[gray]Картата трÑбва да Ñъдържа начална точка на враговете. +mode.sandbox.name = ПÑÑъчник +mode.sandbox.description = Безкрайни реÑурÑи и безкрайно време между вълните от нападатели. +mode.editor.name = Редактор +mode.pvp.name = Играч Срещу Играч +mode.pvp.description = Играйте Ñрещу други играчи в локалната мрежа.\n[gray]Картата трÑбва да Ñъдържа поне 2 Ñдра в различни цветове. +mode.attack.name = Ðападение +mode.attack.description = Унищожете вражеÑката база. \n[gray]Картата трÑбва да Ñъдържа червено Ñдро. +mode.custom = ПерÑонализирани Правила + +rules.infiniteresources = Безкрайни РеÑурÑи +rules.reactorexplosions = ЕкÑплозиращи Реактори +rules.coreincinerates = Унищожаване на РеÑурÑи при Преливане +rules.schematic = Позволена Употребата на Схеми +rules.wavetimer = Таймер за Вълни +rules.waves = Вълни +rules.attack = Режим Ðтака +rules.buildai = Ботът Може да Строи +rules.enemyCheat = Безкрайни РеÑурÑи за Ботът (ЧервениÑÑ‚ Отбор) +rules.blockhealthmultiplier = Множител на Точките Живот на Блокове +rules.blockdamagemultiplier = Множител на Щетите на Блокове +rules.unitbuildspeedmultiplier = Множител на СкороÑтта на ПроизводÑтво на Единици +rules.unithealthmultiplier = Множител на Точките Живот на Единици +rules.unitdamagemultiplier = Множител на Щетите на Единици +rules.unitcapvariable = Ядрата Увеличават МакÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ð‘Ñ€Ð¾Ð¹ Единици +rules.unitcap = МакÑимален Брой Единици +rules.enemycorebuildradius = Ð Ð°Ð´Ð¸ÑƒÑ Ð½Ð° Защитена от Строене Зона Около Ядрата:[lightgray] (полета) +rules.wavespacing = Време Между Вълните:[lightgray] (Ñекунди) +rules.buildcostmultiplier = Множител на Ðеобходимите РеÑурÑи за Строене +rules.buildspeedmultiplier = Множител на СкороÑтта за Строене +rules.deconstructrefundmultiplier = Множител на ВъзÑтановени РеÑурÑи при ДеконÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ +rules.waitForWaveToEnd = Вълните Изчакват за Врагове +rules.dropzoneradius = Ð Ð°Ð´Ð¸ÑƒÑ Ð½Ð° Ðачална Точка на Враговете:[lightgray] (полета) +rules.unitammo = Единиците Ñе ÐуждаÑÑ‚ от БоеприпаÑи +rules.title.waves = Вълни +rules.title.resourcesbuilding = РеÑурÑи & ПоÑтройки +rules.title.enemy = Врагове +rules.title.unit = Единици +rules.title.experimental = ЕкÑпериментално +rules.title.environment = Околна Среда +rules.lighting = Светкавици +rules.enemyLights = ВражеÑки Светлини +rules.fire = Огън +rules.explosions = Block/Unit Explosion Damage +rules.ambientlight = Светлина от Околната Среда +rules.weather = Климат +rules.weather.frequency = ЧеÑтота: +rules.weather.always = Винаги +rules.weather.duration = ПродължителноÑÑ‚: + +content.item.name = Предмети +content.liquid.name = ТечноÑти +content.unit.name = Единици +content.block.name = Блокчета +content.status.name = СтатуÑ-Ефекти +content.sector.name = Сектори + +item.copper.name = Мед +item.lead.name = Олово +item.coal.name = Въглища +item.graphite.name = Графит +item.titanium.name = Титан +item.thorium.name = Торий +item.silicon.name = Силикон +item.plastanium.name = ПлаÑтаний +item.phase-fabric.name = Фазова тъкан +item.surge-alloy.name = ИмпулÑна Сплав +item.spore-pod.name = СгъÑтени Спори +item.sand.name = ПÑÑък +item.blast-compound.name = Взривно Ñъединение +item.pyratite.name = Пиратит +item.metaglass.name = МетаÑтъкло +item.scrap.name = Скрап +liquid.water.name = Вода +liquid.slag.name = Шлака +liquid.oil.name = Ðефт +liquid.cryofluid.name = Криофлуид + +unit.dagger.name = Кинжал +unit.mace.name = Боздуган +unit.fortress.name = КрепоÑÑ‚ +unit.nova.name = Ðова +unit.pulsar.name = ПулÑар +unit.quasar.name = Квазар +unit.crawler.name = Къртица +unit.atrax.name = ÐÑ‚Ñ€Ð°ÐºÑ +unit.spiroct.name = Спирокт +unit.arkyid.name = Ðркиид +unit.toxopid.name = ТокÑопид +unit.flare.name = Факел +unit.horizon.name = Хоризонт +unit.zenith.name = Зенит +unit.antumbra.name = Ðнтумбра +unit.eclipse.name = Ð•ÐºÐ»Ð¸Ð¿Ñ +unit.mono.name = Моно +unit.poly.name = Поли +unit.mega.name = Мега +unit.quad.name = Куад +unit.oct.name = Окт +unit.risso.name = РиÑо +unit.minke.name = Минке +unit.bryde.name = Брайд +unit.sei.name = Сей +unit.omura.name = Омура +unit.alpha.name = Ðлфа +unit.beta.name = Бета +unit.gamma.name = Гана +unit.scepter.name = Скиптър +unit.reign.name = Реиг +unit.vela.name = Вела +unit.corvus.name = ÐšÐ¾Ñ€Ð²ÑƒÑ + +block.resupply-point.name = Точка за ÑнабдÑване +block.parallax.name = ÐŸÐ°Ñ€Ð°Ð»Ð°ÐºÑ +block.cliff.name = Скала +block.sand-boulder.name = ПÑÑъчен Камък +block.basalt-boulder.name = Базалтов Камък +block.grass.name = Трева +block.slag.name = Шлака +block.space.name = КоÑÐ¼Ð¾Ñ +block.salt.name = Сол +block.salt-wall.name = Стена от Сол +block.pebbles.name = Камъчета +block.tendrils.name = Пипала +block.sand-wall.name = Стена от ПÑÑък +block.spore-pine.name = Топка от Спори +block.spore-wall.name = Стена от Спори +block.boulder.name = Камък +block.snow-boulder.name = Снежна Скала +block.snow-pine.name = Снежна топка +block.shale.name = Глина +block.shale-boulder.name = Глинена Скала +block.moss.name = Мъх +block.shrubs.name = ХраÑти +block.spore-moss.name = СпореÑÑ‚ мъх +block.shale-wall.name = Стена от ХраÑти +block.scrap-wall.name = Стена от Скрап +block.scrap-wall-large.name = ГолÑма Стена от Скрап +block.scrap-wall-huge.name = ÐžÐ³Ñ€Ð¾Ð¼Ð½Ñ Ð¡Ñ‚ÐµÐ½Ð° от Скрап +block.scrap-wall-gigantic.name = ГигантÑка Стена от Скрап +block.thruster.name = Двигател +block.kiln.name = Пещ +block.graphite-press.name = Графитна ПреÑа +block.multi-press.name = Мулти-ПреÑа +block.constructing = {0} [lightgray](конÑтруиране) +block.spawn.name = ВражеÑка Ðачална Точка +block.core-shard.name = Ядро: Шард +block.core-foundation.name = Core: Ð¤Ð¾Ð½Ð´Ð°Ñ†Ð¸Ñ +block.core-nucleus.name = Core: Център +block.deepwater.name = Дълбока Вода +block.water.name = Вода +block.tainted-water.name = ЗамърÑена Вода +block.darksand-tainted-water.name = Тъмен ПÑÑък - ЗамърÑена Вода +block.tar.name = Катран +block.stone.name = Камък +block.sand.name = ПÑÑък +block.darksand.name = Тъмен ПÑÑък +block.ice.name = Лед +block.snow.name = СнÑг +block.craters.name = Кратери +block.sand-water.name = ПÑÑък - Вода +block.darksand-water.name = Тъмен ПÑÑък - Вода +block.char.name = Овъглен Камък +block.dacite.name = Дацит +block.dacite-wall.name = Стена от Дацит +block.dacite-boulder.name = Скала от Дацит +block.ice-snow.name = Лед - СнÑг +block.stone-wall.name = Стена от Камък +block.ice-wall.name = Стена от Лед +block.snow-wall.name = Стена от СнÑг +block.dune-wall.name = Стена от Дюна +block.pine.name = Бор +block.dirt.name = ПръÑÑ‚ +block.dirt-wall.name = Стена от ПръÑÑ‚ +block.mud.name = Кал +block.white-tree-dead.name = Мъртво БÑло Дърво +block.white-tree.name = БÑло Дърво +block.spore-cluster.name = КлъÑтер от Ñпори +block.metal-floor.name = Метален Под 1 +block.metal-floor-2.name = Метален Под 2 +block.metal-floor-3.name = Метален Под 3 +block.metal-floor-5.name = Метален Под 4 +block.metal-floor-damaged.name = Увреден Метален Под +block.dark-panel-1.name = Тъмен Панел 1 +block.dark-panel-2.name = Тъмен Панел 2 +block.dark-panel-3.name = Тъмен Панел 3 +block.dark-panel-4.name = Тъмен Панел 4 +block.dark-panel-5.name = Тъмен Панел 5 +block.dark-panel-6.name = Тъмен Панел 6 +block.dark-metal.name = Тъмен Метал +block.basalt.name = Базалт +block.hotrock.name = Топла Скала +block.magmarock.name = Магмена Скала +block.copper-wall.name = Стена от Мед +block.copper-wall-large.name = ГолÑма Стена от Мед +block.titanium-wall.name = Стена от Титан +block.titanium-wall-large.name = ГолÑма Стена от Титан +block.plastanium-wall.name = Стена от ПлаÑтаний +block.plastanium-wall-large.name = ГолÑма Стена от ПлаÑтаний +block.phase-wall.name = Фазова Стена +block.phase-wall-large.name = ГолÑма Фазова Стена +block.thorium-wall.name = Стена от Торий +block.thorium-wall-large.name = ГолÑма Стена от Торий +block.door.name = Врата +block.door-large.name = ГолÑма Врата +block.duo.name = Дуо +block.scorch.name = Горелка +block.scatter.name = ПръÑкач +block.hail.name = Градушка +block.lancer.name = Улан +block.conveyor.name = Конвейер +block.titanium-conveyor.name = Титаниев Конвейер +block.plastanium-conveyor.name = ПлаÑтаниев Конвейер +block.armored-conveyor.name = Брониран Конвейер +block.junction.name = КръÑтовище +block.router.name = Рутер +block.distributor.name = Разпределител +block.sorter.name = Сортирач +block.inverted-sorter.name = Обърнат Ñортирач +block.message.name = Съобщение +block.illuminator.name = ОÑветител +block.overflow-gate.name = Преливаща Порта +block.underflow-gate.name = Обратна Преливаща Порта +block.silicon-smelter.name = Силиконова Пещ +block.phase-weaver.name = Тъкач на Фазова тъкан +block.pulverizer.name = Пулверизатор +block.cryofluid-mixer.name = Криофлуид МикÑер +block.melter.name = Разтопител +block.incinerator.name = ИнÑинератор +block.spore-press.name = ПреÑа за Спори +block.separator.name = Разделител +block.coal-centrifuge.name = Центрифуга за Въглища +block.power-node.name = ЕлектричеÑки Възел +block.power-node-large.name = ГолÑм ЕлектричеÑки Възел +block.surge-tower.name = ТрафопоÑÑ‚ +block.diode.name = Диод +block.battery.name = Ð‘Ð°Ñ‚ÐµÑ€Ð¸Ñ +block.battery-large.name = ГолÑма Ð‘Ð°Ñ‚ÐµÑ€Ð¸Ñ +block.combustion-generator.name = Горивен Генератор +block.steam-generator.name = Парен Генератор +block.differential-generator.name = Диференциален Генератор +block.impact-reactor.name = Ударен реактор +block.mechanical-drill.name = Механично Свредло +block.pneumatic-drill.name = Пневматично Свредло +block.laser-drill.name = Лазерно Свредло +block.water-extractor.name = Водна Сонда +block.cultivator.name = Култиватор +block.conduit.name = Тръбопровод +block.mechanical-pump.name = Механична Помпа +block.item-source.name = Материализатор на Предмети +block.item-void.name = Дематериализатор на Предмети +block.liquid-source.name = Материализатор на ТечноÑти +block.liquid-void.name = Дематериализатор на ТечноÑти +block.power-void.name = Материализатор на Ð•Ð½ÐµÑ€Ð³Ð¸Ñ +block.power-source.name = Дематериализатор на Ð•Ð½ÐµÑ€Ð³Ð¸Ñ +block.unloader.name = Разтоварващо уÑтройÑтво +block.vault.name = Склад +block.wave.name = Вълна +block.tsunami.name = Цунами +block.swarmer.name = Ракетна УÑтановка +block.salvo.name = Салво +block.ripple.name = Рипъл +block.phase-conveyor.name = Фазов Конвейер +block.bridge-conveyor.name = МоÑтов Конвейер +block.plastanium-compressor.name = ПлаÑтаниев Конвейер +block.pyratite-mixer.name = СмеÑител на Пиратит +block.blast-mixer.name = СмеÑител на Взривно Ñъединение +block.solar-panel.name = Фотоволтаик +block.solar-panel-large.name = ГолÑм Фотоволтаик +block.oil-extractor.name = Ðефтена Сонда +block.repair-point.name = Точка за поправка +block.pulse-conduit.name = ИмпулÑен тръбопровод +block.plated-conduit.name = Тръбопровод Ñ Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ð¸Ðµ +block.phase-conduit.name = Фазов Тръбопровод +block.liquid-router.name = Рутер за ТечноÑти +block.liquid-tank.name = Резервоар за ТечноÑти +block.liquid-junction.name = Тръбопроводно КръÑтовище +block.bridge-conduit.name = МоÑÑ‚ за ТечноÑти +block.rotary-pump.name = Ротационна помпа +block.thorium-reactor.name = Ториев реактор +block.mass-driver.name = МаÑов ПреноÑител +block.blast-drill.name = Въздушно Ñвредло +block.thermal-pump.name = Термична Помпа +block.thermal-generator.name = Термичен Генератор +block.alloy-smelter.name = Претопител за ИмпулÑна Ñплав +block.mender.name = ВъзÑтановител +block.mend-projector.name = ВъзÑтановÑващ Проектор +block.surge-wall.name = ИмпулÑна Стена +block.surge-wall-large.name = ГолÑма ИмпулÑна Стена +block.cyclone.name = Циклон +block.fuse.name = Електрошок +block.shock-mine.name = Мина +block.overdrive-projector.name = УÑкорÑващ Проектор +block.force-projector.name = Силов Проектор +block.arc.name = Волтова Дъга +block.rtg-generator.name = RTG генератор +block.spectre.name = Спектър +block.meltdown.name = Разтопител +block.foreshadow.name = ПредвеÑтител +block.container.name = Контейнер +block.launch-pad.name = ИзÑтрелваща Площадка +block.launch-pad-large.name = ГолÑма ИзÑтрелваща Площадка +block.segment.name = Сегмент +block.command-center.name = Команден Център +block.ground-factory.name = Ðаземна Фабрика +block.air-factory.name = Въздушна Фабрика +block.naval-factory.name = МорÑка Фабрика +block.additive-reconstructor.name = ДобавÑщ РеконÑтруктор +block.multiplicative-reconstructor.name = Умножаващ РеконÑтруктор +block.exponential-reconstructor.name = ЕкÑпоненциален РеконÑтруктор +block.tetrative-reconstructor.name = Тетративен РеконÑтруктор +block.payload-conveyor.name = Товарен Конвейер +block.payload-router.name = Товарен Рутер +block.disassembler.name = Разглобител +block.silicon-crucible.name = Силиконов Тигел +block.overdrive-dome.name = УÑкорÑващ Купол +#experimental, may be removed - екÑпериментални, може да бъдат премахнати +block.block-forge.name = Ковачница за Блокове +block.block-loader.name = Товарач на Блокове +block.block-unloader.name = Разтоварач на Блокове +block.interplanetary-accelerator.name = Междупланетен УÑкорител + +block.switch.name = Превключвател +block.micro-processor.name = МикропроцеÑор +block.logic-processor.name = ЛогичеÑки процеÑор +block.hyper-processor.name = Хипер ПроцеÑор +block.logic-display.name = ЛогичеÑки ДиÑплей +block.large-logic-display.name = ГолÑм ЛогичеÑки ДиÑплей +block.memory-cell.name = Клетка Памет +block.memory-bank.name = Банка Бамет + +team.blue.name = Ñин +team.crux.name = червен +team.sharded.name = оранжев +team.orange.name = оранжев +team.derelict.name = изоÑтавен +team.green.name = зелен +team.purple.name = пурпурен + +hint.skip = ПреÑкочи +hint.desktopMove = Използвайте [accent][[WASD][] за да Ñе придвижвате. +hint.zoom = [accent]Скролирайте[] за увеличаване или намалÑване на мащаба. +hint.mine = Доближете Ñе до \uf8c4 медната руда и Ñ [accent]кликнете[] за ръчен добив. +hint.desktopShoot = Задръжте [accent][[лÑв клавиш][] за да ÑтрелÑте. +hint.depositItems = За да пренеÑете реÑурÑи, завлачете от Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ñ€Ð°Ð± то Ñдрото. +hint.respawn = За да Ñе поÑвите отново като кораб, натиÑнете [accent][[V][]. +hint.respawn.mobile = Вие активирахте режим на управление на единица/Ñтруктура. За да Ñе върнете във Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ñ€Ð°Ð±, [accent]докоÑнете аватара в Ð³Ð¾Ñ€Ð½Ð¸Ñ Ð»Ñв ъгъл[]. +hint.desktopPause = ÐатиÑнете [accent][[Интервал][] за да поÑтавите играта на пауза или да Ñ Ð¿Ñ€Ð¾Ð´ÑŠÐ»Ð¶Ð¸Ñ‚Ðµ. +hint.placeDrill = Изберете ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ \ue85e [accent]Свредла[] от менюто в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð´ÐµÑен ъгъл, Ñлед това изберете \uf870 [accent]Свредло[] и кликнете върху медната руда за да го поÑтавите. +hint.placeDrill.mobile = Изберете ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ \ue85e [accent]Свредла[] от менюто в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð´ÐµÑен ъгъл, Ñлед това изберете \uf870 [accent]Свредло[] и докоÑнете върху медната руда за да го поÑтавите.\n\ÐатиÑнете \ue800 [accent]отметката[] в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð´ÐµÑен ъгъл за да потвърдите. +hint.placeConveyor = Конвейерите пренаÑÑÑ‚ предмети от Ñвредлата до другите блокове. Изберете \uf896 [accent]Конвейер[] от категори \ue814 [accent]РазпределÑне[].\n\nÐатиÑнете и завлачете за да поÑтавите пътека от конвейери.\nИзползвайте [accent]Скрол[] за да завъртите конвейера. +hint.placeConveyor.mobile = Конвейерите пренаÑÑÑ‚ предмети от Ñвредлата до другите блокове. Изберете \uf896 [accent]Конвейер[] от категори \ue814 [accent]РазпределÑне[].\n\nЗадръжте върху екрана за Ñекунда и плъзнете за да позтавите пътека от конвейери. +hint.placeTurret = ПоÑтавете \uf861 [accent]Кули[] за да защитите базата Ñи от врагове.\n\nКулите Ñе нуждаÑÑ‚ от боеприпаÑи - в този Ñлучай, \uf838мед.\nИзползвайте конвейери и Ñвредла за да ги Ñнабдите. +hint.breaking = ÐатиÑнете Ñ [accent]ДеÑен клавиш[] и плъзнете за да унищожите блокове. +hint.breaking.mobile = Ðктивирайте \ue817 [accent]чука[] от Ð´Ð¾Ð»Ð½Ð¸Ñ Ð´ÐµÑен ъгъл и натиÑнете за да унищожите блокове.\n\nЗадръжте за Ñекунда и плъзнете за да унищожите вÑички блокове в избраната зона. +hint.research = Използвайте бутонът \ue875 [accent]Проучване[] за да изÑледвате нови технологии. +hint.research.mobile = Използвайте бутонът \ue875 [accent]Проучване[] в \ue88c [accent]Менюто[] за да изÑледвате нови технологии. +hint.unitControl = Задръжте [accent][[L-Ctrl][] и [accent]кликнете[] за да управлÑвате ваша единици или кули. +hint.unitControl.mobile = [accent][[ДокоÑнете два пъти][] за да контролирате ваша единица или кула. +hint.launch = След като Ñъберете доÑтатъчно реÑурÑи, можете да [accent]ИзÑтрелÑте[] Ñдро като изберете близък Ñектор от \ue827 [accent]ГлобуÑа[] в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð´ÐµÑен ъгъл. +hint.launch.mobile = След като Ñъберете доÑтатъчно реÑурÑи, можете да [accent]ИзÑтрелÑте[] Ñдро като изберете близък Ñектор от \ue827 [accent]ГлобуÑа[] в \ue88c [accent]Менюто[]. +hint.schematicSelect = Задръжте [accent][[F][] и плъзнете за да изберете/копирате група от блокчета.\n\n[accent][[Среден клик][] за да копирате едно блокче. +hint.conveyorPathfind = Задръжте [accent][[L-Ctrl][] докато поÑтавÑте пътека от конвейери за да генерирате пътека автоматично. +hint.conveyorPathfind.mobile = Позволете \ue844 [accent]Диагонално ПоÑтавÑне[] за автоматично намиране на пътека при поÑтавÑне на конвейери. +hint.boost = Задръжте [accent][[L-Shift][] за да прелетите над препÑÑ‚ÑÑ‚Ð²Ð¸Ñ Ñ Ñ‚Ð°Ð·Ð¸ единица.\n\nСамо нÑкои наземни единици имат двигатели за летене. +hint.command = ÐатиÑнете [accent][[G][] за да управлÑвате нÑколко близки единици от [accent]подобен тип[] във формациÑ.\n\nЗа да управлÑвате наземни единици трÑбва първо да използвате наземна единица. +hint.command.mobile = [accent][[ДокоÑнете два пъти][] вашата единица за да контролирате нÑколко близки единици във формациÑ. +hint.payloadPickup = ÐатиÑнете [accent][[[] за да вдигнете малки блокчета ил единици. +hint.payloadPickup.mobile = [accent]ДокоÑнете и задръжте[] върху малко блокче или единица за да го вдигнете. +hint.payloadDrop = ÐатиÑнете [accent]][] за да оÑтавите Ð²Ð°ÑˆÐ¸Ñ Ñ‚Ð¾Ð²Ð°Ñ€. +hint.payloadDrop.mobile = [accent]ДокоÑнете и задръжте[] върху празна Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð·Ð° да оÑтавите Ð²Ð°ÑˆÐ¸Ñ Ñ‚Ð¾Ð²Ð°Ñ€ там. +hint.waveFire = Кулите [accent]Вълна[] заредени ÑÑŠÑ Ð²Ð¾Ð´Ð° ще дейÑтват и като пожарогаÑители. +hint.generator = \uf879 [accent]Горивните генератори[] горÑÑ‚ въглища и зареждат Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾ÐµÐ½ÐµÑ€Ð³Ð¸Ñ ÑÑŠÑедни блокове.\n\nРазÑтоÑнието за предаване на ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да Ñе увеличи чрез \uf87f [accent]ЕлектричеÑки Възли[]. +hint.guardian = [accent]Пазителите[] Ñа единици Ñ Ð¿Ð¾Ð²ÐµÑ‡Ðµ бронÑ. Слаби боеприпаÑи като [accent]Мед[] и [accent]Олово[] Ñа [scarlet]неефективни[] Ñрещу Ñ‚ÑÑ….\n\nИзползвайте по - мощни кули или заредете ващите \uf861Дуо/\uf859Салво Ñ \uf835 [accent]Графит[] за да ги повалите. +hint.coreUpgrade = Ядрата могат да бъдат подобрÑвани като [accent]поÑтавите по - добро Ñдро върху Ñ‚ÑÑ…[].\n\nПоÑтавете  [accent]ФондациÑ[] върху ï¡© [accent]Шард[] Ñдрото. Уверете Ñе че нÑма други препÑÑ‚ÑÑ‚Ð²Ð¸Ñ Ñ‚Ð°Ð¼, където поÑтавÑте Ñдрото. +hint.presetLaunch = Към Ñивите [accent]Ñектори за кацане[], какъвто е [accent]Замръзнала Гора[] можете да изÑтрелÑте Ñдро от вÑÑкъде. Ðе е необходимо да превземането на ÑÑŠÑедна териториÑ.\n\n[accent]Ðомерираните Ñектори[], като този, Ñа [accent]пожелателни[]. +hint.coreIncinerate = След като Ñдрото Ñе препълни Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚ÐµÐ½ тип реÑурÑ, вÑички допълнителни доÑтавени количеÑтва от него ще бъдат [accent]унищожени[]. +hint.coopCampaign = Когато играете [accent]КампаниÑта в отбор[], реÑурÑите произведени на дадена карта ще бъдат автоматично изпратени [accent]до Ñекторите на вÑички играчи[].\n\nÐ’Ñички направени от ÑобÑтвеника на Ñектора Ð¿Ñ€Ð¾ÑƒÑ‡Ð²Ð°Ð½Ð¸Ñ Ñ‰Ðµ бъдат пренеÑени и на оÑтаналите играчи. + +item.copper.description = Използван във вÑÑкакви типове конÑтрукции и боеприпаÑи. +item.copper.details = Мед. Copper. Ðеобичайно изобилен метал на Serpulo. Структурно Ñлаб, оÑвен ако не е подÑилен. +item.lead.description = Използван в транÑпорт на течноÑти и електричеÑки Ñтруктури. +item.lead.details = Плътен. Инертен. Широко използван при изграждане на батерии.\nБележка: ВероÑтно токÑичен за биологични форми на живот. Ðе че има много такива оÑтанали наоколо. +item.metaglass.description = Използва Ñе в Ñтруктури за транÑпорт и Ñъхранение на течноÑти. +item.graphite.description = Използва Ñе в електричеÑки компоненти и като Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°Ñ Ð·Ð° нÑкои видове кули. +item.sand.description = Използва Ñе за производÑтво на други рафинирани материали. +item.coal.description = Използва Ñе като гориво и за производÑтво на радинирани материали. +item.coal.details = Изглежда като вкаменена раÑтителна материÑ, образувана много преди разпръÑването на Ñпорите. +item.titanium.description = Използван в Ñтруктури за транÑпорт, Ñвредла и летÑщи технологии. +item.thorium.description = Използван в здрави конÑтрукции или като Ñдрено гориво. +item.scrap.description = Използван в Разтопители и Пулверизатори за рафиниране в други материали. +item.scrap.details = ОÑтанки от Ñтари Ñтруктури и единици. +item.silicon.description = Използва Ñе в фотоволтаици, Ñложни електроники и ÑамонаÑочващи Ñе боеприпаÑи. +item.plastanium.description = Използва Ñе в уÑъвършенÑтвани единици, като Ð¸Ð·Ð¾Ð»Ð°Ñ†Ð¸Ñ Ð¸ за фрагментационни боеприпаÑи. +item.phase-fabric.description = Използва Ñе в уÑъвършенÑтвана електроника и възÑтановÑващи Ñтруктури. +item.surge-alloy.description = Използва Ñе в уÑъвършенÑтвани Ð¾Ñ€ÑŠÐ¶Ð¸Ñ Ð¸ импулÑни защитни Ñтруктури. +item.spore-pod.description = Използва Ñе за производÑтво на нефт, екÑплозиви и гориво. +item.spore-pod.details = Спори. ВероÑтно Ñинтетична форма на живот. ИзпуÑкат токÑични за оÑтаналите биологични организми газове. Изключително инвазивни. ЛеÑно запалими при определени уÑловиÑ. +item.blast-compound.description = Използва Ñе в бомби и екÑплозивни боеприпаÑи. +item.pyratite.description = Използва Ñе в подпалващи Ð¾Ñ€ÑŠÐ¶Ð¸Ñ Ð¸ горивни генератори. + +liquid.water.description = Използва Ñе за охлаждане на машини и преработка на отпадъци. +liquid.slag.description = Може да Ñе рафинира в Разделители до ÑÑŠÑтавните Ñ Ð¼ÐµÑ‚Ð°Ð»Ð¸ или да Ñе пръÑка върху врагове като оръжие. +liquid.oil.description = Използва Ñе в напредналото производÑтво на материали или като запалителен боеприпаÑ. +liquid.cryofluid.description = Използва Ñе като охладител в реактори, кули и фабрики. + +block.resupply-point.description = Презарежда близки единици Ñ Ð¼ÐµÐ´Ð½Ð¸ боеприпаÑи. ÐеÑъвмеÑтим Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð¸, които Ñе нуждаÑÑ‚ от електроенергиÑ. +block.armored-conveyor.description = Придвижва предмети напред. Ðе приема вход от Ñтрани. +block.illuminator.description = Излъчва Ñветлина. +block.message.description = СъхранÑва Ñъобщение за ÐºÐ¾Ð¼ÑƒÐ½Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñъюзници. +block.graphite-press.description = КомпреÑира въглища в графит. +block.multi-press.description = КомпреÑира въглища в графит. ИзиÑква вода като охладител. +block.silicon-smelter.description = Рафинира Ñиликон от пÑÑък и въглища. +block.kiln.description = ПретÑÐ¿Ñ Ð¿ÑÑък и олово в метаÑтъкло. +block.plastanium-compressor.description = Произвежда плаÑтаний от нефт и титан. +block.phase-weaver.description = Синтезира фазова тъкан от торий и пÑÑък. +block.alloy-smelter.description = РазтопÑва титан, олово, Ñилиций и мед в импулÑна Ñплав. +block.cryofluid-mixer.description = СмеÑва вода и фин титанов прах за производÑтво на криофлуид. +block.blast-mixer.description = Произвежда взривно Ñъединение от пиратит и ÑгъÑтени Ñпори. +block.pyratite-mixer.description = СмеÑва въглища, олово и пÑÑък в пиратит. +block.melter.description = ÐŸÑ€ÐµÑ‚Ð°Ð¿Ñ Ñкрап в шлака. +block.separator.description = Ð Ð°Ð·Ð´ÐµÐ»Ñ ÑˆÐ»Ð°ÐºÐ°Ñ‚Ð° на нейните минерални компоненти. +block.spore-press.description = КомпреÑира ÑгъÑтени Ñпори в нефт. +block.pulverizer.description = Ðатрошава Ñкрап до ÑÑŠÑтоÑние на фин пÑÑък. +block.coal-centrifuge.description = Преобразува нефт в въглища. +block.incinerator.description = ИзпарÑва вÑеки предмет или течноÑÑ‚, които получава. +block.power-void.description = Ðеутрализира цÑлата ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð² мрежата. ДоÑтъпно Ñамо в ПÑÑъчника. +block.power-source.description = Произвежда безкрайно енергиÑ. ДоÑтъпно Ñамо в ПÑÑъчника. +block.item-source.description = Извежда безкрайно количеÑтво предмети. ДоÑтъпно Ñамо в ПÑÑъчника. +block.item-void.description = Унищожава вÑÑкакви предмети. ДоÑтъпно Ñамо в ПÑÑъчника. +block.liquid-source.description = Извежда безкрайно количеÑтво течноÑти. ДоÑтъпно Ñамо в ПÑÑъчника. +block.liquid-void.description = Унищожава вÑÑкакви течноÑти. ДоÑтъпно Ñамо в ПÑÑъчника. +block.copper-wall.description = Защитава Ñтруктури от вражеÑки огън. +block.copper-wall-large.description = Защитава Ñтруктури от вражеÑки огън. +block.titanium-wall.description = Защитава Ñтруктури от вражеÑки огън. +block.titanium-wall-large.description = Защитава Ñтруктури от вражеÑки огън. +block.plastanium-wall.description = Защитава Ñтруктури от вражеÑки огън. ÐбÑорбира лазери и волтови дъги. Блокира автоматични електричеÑки връзки. +block.plastanium-wall-large.description = Защитава Ñтруктури от вражеÑки огън. ÐбÑорбира лазери и волтови дъги. Блокира автоматични електричеÑки връзки. +block.thorium-wall.description = Защитава Ñтруктури от вражеÑки огън. +block.thorium-wall-large.description = Защитава Ñтруктури от вражеÑки огън. +block.phase-wall.description = Защитава Ñтруктури от вражеÑки огън, отразÑвайки повечето куршуми при удар. +block.phase-wall-large.description = Защитава Ñтруктури от вражеÑки огън, отразÑвайки повечето куршуми при удар. +block.surge-wall.description = Защитава Ñтруктури от вражеÑки огън, периодично оÑвобождавайки волтови дъги при контакт. +block.surge-wall-large.description = Защитава Ñтруктури от вражеÑки огън, периодично оÑвобождавайки волтови дъги при контакт. +block.door.description = Стена, коÑто може да бъде отворена и затворена. +block.door-large.description = Стена, коÑто може да бъде отворена и затворена. +block.mender.description = Периодично Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ñ Ð±Ð»Ð¸Ð·ÐºÐ¸ блокове.\nОпционално използва Ñиликон за да увеличи обхвата и ефективноÑтта Ñи. +block.mend-projector.description = Периодично Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ñ Ð±Ð»Ð¸Ð·ÐºÐ¸ блокове.\nОпционално използва тъкан за да увеличи обхвата и ефективноÑтта Ñи. +block.overdrive-projector.description = УÑкорÑва близки поÑтройки.\nОпционално използва тъкан за да увеличи обхвата и ефективноÑтта Ñи. +block.force-projector.description = Създава шеÑтоъгълно Ñилово поле около Ñебе Ñи, предпазвайки Ñградите и единиците в него от повреда.\nПрегрÑва, ако претърпи твърде много щети. Можете да използвате охладителна течноÑÑ‚ за да предотвратите това. Можете да използвате фазова тъкан за да увеличите обхвата на Ñиловото поле. +block.shock-mine.description = ОÑвобождава електричеÑки дъги при контакт Ñ Ð²Ñ€Ð°Ð¶ÐµÑки единици. +block.conveyor.description = ПренаÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¸ напред. +block.titanium-conveyor.description = ПренаÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¸ напред. По - бърз от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑ€. +block.plastanium-conveyor.description = ПренаÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¸ напред на партиди. Приема предмети Ñамо в началото на веригата и ги разтоварва в ÐºÑ€Ð°Ñ Ð² 3 поÑоки. ИзиÑква товарене и разтоварване от нÑколко Ñтрани за макÑимална ефективноÑÑ‚. +block.junction.description = ДейÑтва като моÑÑ‚ за две кръÑтоÑани конвейерни линии. +block.bridge-conveyor.description = ПренаÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¸ над терен или поÑтройки. +block.phase-conveyor.description = Мигновенно пренаÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¸ над терен или поÑтройки. Има по - голÑм обхват от моÑÑ‚Ð¾Ð²Ð¸Ñ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑ€, но Ñе нуждае от електроенергиÑ. +block.sorter.description = Ðко предметът Ñъвпада на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð³Ð¾ пренаÑÑ Ð½Ð°Ð¿Ñ€ÐµÐ´, иначе го изкарва наÑтрани. +block.inverted-sorter.description = Подобно на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ñортирач, но извежда Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚ наÑтрани. +block.router.description = Ð Ð°Ð·Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð²Ð½ÐµÑените предмети в до 3 поÑоки равномерно. +block.router.details = Ðеобходимо зло. Употребата му като вход на фабрики не Ñе препоръчва, защото ще Ñе запуши от изходните материали. +block.distributor.description = Ð Ð°Ð·Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð²Ð½ÐµÑените предмети в до 7 поÑоки равномерно. +block.overflow-gate.description = ÐаÑочва предмети наÑтрани Ñамо ако лентат отпред е препълнена или блокирана. +block.underflow-gate.description = ÐаÑочва предмети напред Ñамо ако лентите отÑтрани Ñа препълнени или блокирани. +block.mass-driver.description = Структура за пренаÑÑне на предмети на далечни раÑтоÑниÑ. Събира партиди от предмети и ги изÑтрелва до други МаÑови ПреноÑители. +block.mechanical-pump.description = Изпомпва течноÑти. Ðе изиÑква електричеÑтво. +block.rotary-pump.description = Изпомпва течноÑти. ИзиÑква електричеÑтво. +block.thermal-pump.description = Изпомпва течноÑти. +block.conduit.description = ПренаÑÑ Ñ‚ÐµÑ‡Ð½Ð¾Ñти еднопоÑочно. Използва Ñе в ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¿Ð¸ и други тръбопроводи. +block.pulse-conduit.description = ПренаÑÑ Ñ‚ÐµÑ‡Ð½Ð¾Ñти еднопоÑочно. ПренаÑÑ Ð¿Ð¾ - бързо и ÑъхранÑва повече от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ñ‚Ñ€ÑŠÐ±Ð¾Ð¿Ñ€Ð¾Ð²Ð¾Ð´. +block.plated-conduit.description = ПренаÑÑ Ñ‚ÐµÑ‡Ð½Ð¾Ñти еднопоÑочно. Ðе приема вход от Ñтрани. Ðе позволÑва течове. +block.liquid-router.description = Ð Ð°Ð·Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð²Ð½ÐµÑените течноÑти в до 3 поÑоки равномерно. Също може да ÑъхранÑва нÑкакво количеÑтво течноÑÑ‚. +block.liquid-tank.description = СъхранÑва голÑмо количеÑтво течноÑÑ‚. Може да изкарва течноÑÑ‚ във вÑички поÑоки, подобно на рутер за течноÑти. +block.liquid-junction.description = ДейÑтва като моÑÑ‚ за два кръÑтоÑани тръбопровода. +block.bridge-conduit.description = ТранÑпортира течноÑти над терен или Ñгради. +block.phase-conduit.description = TТранÑпортира течноÑти над терен или Ñгради. Има по - голÑм обхват от моÑÑ‚ за течноÑти, но Ñе нуждае от електроенергиÑ. +block.power-node.description = ПренаÑÑ ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñвързани или ÑÑŠÑедни Ñтруктури. +block.power-node-large.description = Подобрена верÑÐ¸Ñ Ð½Ð° електричеÑÐºÐ¸Ñ Ð²ÑŠÐ·ÐµÐ» Ñ Ð¿Ð¾ - голÑм обхват. +block.surge-tower.description = Далекообхватен електричеÑки възел, но може да Ñе Ñвърже Ñамо до две Ñтруктури. +block.diode.description = ПренаÑÑ ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ батерии Ñамо в една поÑока, Ñамо ако източника има повече Ñъхранена ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¾Ñ‚ целта. +block.battery.description = СъхранÑва мощноÑÑ‚ във времена на енергиен излишък. Извежда мощноÑÑ‚ по времена на енергиен дефицит. +block.battery-large.description = СъхранÑва мощноÑÑ‚ във времена на енергиен излишък. Извежда мощноÑÑ‚ по времена на енергиен дефицит. Има по - голÑм капацитет от нормалната батериÑ. +block.combustion-generator.description = Произвежда ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾ÐµÐ½ÐµÑ€Ð³Ð¸Ñ ÐºÐ°Ñ‚Ð¾ гори запалими материали, като въглища. +block.thermal-generator.description = Генерира ÐµÐ½ÐµÑ€Ð³Ð¸Ñ ÐºÐ¾Ð³Ð°Ñ‚Ð¾ е поÑтавен върху нагорещена повърхноÑÑ‚. +block.steam-generator.description = Генерира ÐµÐ½ÐµÑ€Ð³Ð¸Ñ ÐºÐ°Ñ‚Ð¾ гори запалими материали и изпарÑва вода. +block.differential-generator.description = Генерира ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð² големи количеÑтва. Използва температурната разлика между криофлуида и изгарÑÑ‰Ð¸Ñ Ð¿Ð¸Ñ€Ð°Ñ‚Ð¸Ñ‚. +block.rtg-generator.description = Използва топлината на разлагащи Ñе радиоактивни ÑъединениÑ, за да произвежда ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ñ Ð±Ð°Ð²Ð½Ð° ÑкороÑÑ‚. +block.solar-panel.description = ОÑигурÑва малко количеÑтво ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¾Ñ‚ Ñлънцето. +block.solar-panel-large.description = ОÑигурÑва малко количеÑтво ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¾Ñ‚ Ñлънцето. По - ефективен от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾Ð²Ð¾Ð»Ñ‚Ð°Ð¸Ðº. +block.thorium-reactor.description = Генерира значителни количеÑтва енергиÑ, използвайки торий. ИзиÑква поÑтоÑнно охлаждане. Избухва агреÑивно ако Ñе доÑтавÑÑ‚ недоÑтатъчни количеÑтва охлаждаща течноÑÑ‚. +block.impact-reactor.description = Генерира огромни количеÑтва ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¿Ñ€Ð¸ пикова ефективноÑÑ‚. ИзиÑква значителна входна мощноÑÑ‚, за да Ñтартира процеÑа. +block.mechanical-drill.description = Когато Ñе поÑтави върху руда добива ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð» Ñ Ð±Ð°Ð²Ð½Ð¾ темпо за неопределено време. Може да добива Ñамо оÑновни реÑурÑи. +block.pneumatic-drill.description = Подобрено Ñвредло, което може да добива титан. Работи Ñ Ð¿Ð¾ - бързо темпо от механичното Ñвредло. +block.laser-drill.description = Използва лазерна Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð·Ð° да добива реÑурÑи Ñ Ð¾Ñ‰Ðµ по - виÑока ÑкороÑÑ‚, но конÑумира електроенергиÑ. Може да добива торий. +block.blast-drill.description = Използва изключително уÑъвършенÑтвана Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð·Ð° да поÑтигне невероÑтна ÑкороÑÑ‚ на добив. КонÑумира голÑмо количеÑтво електроенергиÑ. +block.water-extractor.description = Извлича подземни води. Използва Ñе на меÑта без налична повърхноÑтна вода. +block.cultivator.description = Култивира малки концентрации на атмоÑферни Ñпори под формата на плътно биологично вещеÑтво. +block.cultivator.details = ВъзÑтановена технологиÑ. Използва Ñе за да произвежда маÑивно количеÑтво биомаÑа Ñ Ð¼Ð°ÐºÑимална ефективноÑÑ‚. ВероÑтно първоначалниÑÑ‚ инкубатор на Ñпорите, който Ñега покрива Серпуло. +block.oil-extractor.description = Използва голÑмо количеÑтво електроенергиÑ, пÑÑък и вода за да добива нефт. +block.core-shard.description = Ядро на базата. Веднъж унищожено, Ñекторът Ñе губи. +block.core-shard.details = Първата итерациÑ. Компактно. Самовъзпроизвеждащо Ñе.Оборудвано Ñ ÐµÐ´Ð½Ð¾ÐºÑ‚Ð°Ñ€Ð½Ð¸ Ñтартови двигатели. Ðе е предназначено за междупланетарни полети. +block.core-foundation.description = Ядро на базата. Добре бронирано. Съдържа повече реÑурÑи от модел Шард. +block.core-foundation.details = Втората итерациÑ. +block.core-nucleus.description = Ядро на базата. Изключително добре бронирано. СъхранÑва огромни количеÑтва реÑурÑи. +block.core-nucleus.details = Третата и финална итерациÑ. +block.vault.description = СъхранÑва голÑмо количеÑтво материали от вÑеки тип. Съдържанието може да бъде доÑтъпено чрез разтоварач. +block.container.description = СъхранÑва малко количеÑтво материали от вÑеки тип. Съдържанието може да бъде доÑтъпено чрез разтоварач. +block.unloader.description = Разтоварва избран материал от близки блокове. +block.launch-pad.description = ИзÑтрелва патриди от елементи в избраните Ñектори. +block.duo.description = ИзÑтрелва редуващи Ñе куршуми по враговете. +block.scatter.description = ИзÑтрелва топки олово, Ñкрап или метаÑтъкло на Ñъчми Ñрещу вражеÑки въздушни единици. +block.scorch.description = Ð˜Ð·Ð³Ð°Ñ€Ñ Ð²Ñички наземни врагове в близоÑÑ‚. ВиÑока ефективноÑÑ‚ от близко разÑтоÑние. +block.hail.description = ИзÑтрелва малки ÑнарÑди по наземни врагове на големи разÑтоÑниÑ. +block.wave.description = ИзÑтрелва потоци течноÑÑ‚ по враговете. Ðвтоматично гаÑи пожари, когато е Ñе ÑнабдÑва Ñ Ð²Ð¾Ð´Ð°. +block.lancer.description = Зарежда и изÑтрелва мощни лъчи ÐµÐ½ÐµÑ€Ð³Ð¸Ñ Ð¿Ð¾ наземни цели. +block.arc.description = ИзÑтрелва волтови дъги по наземни цели. +block.swarmer.description = ИзÑтрелва ракети Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ наÑочване по врагове. +block.salvo.description = ИзÑтрелва бързи залпове от куршуми по врагове. +block.fuse.description = ИзÑтрелва три пробиващи взрива по врагове на близко разÑтоÑние. +block.ripple.description = ИзÑтрелва клъÑтери от ÑнарÑди по наземни врагове на големи разÑтоÑниÑ. +block.cyclone.description = ИзÑтрелва взривоопаÑни топки от Ñъчми по близки врагове. +block.spectre.description = ИзÑтрелва големи бронепробивни куршуми по въздушни и наземни мишени. +block.meltdown.description = Зарежда и изÑтрелва продължителен лазерен лъч по близки врагове. ИзиÑква охладител за да функционира. +block.foreshadow.description = Произвежда единични Ñилни изÑтрели на дълго раÑтоÑние. Приоритизира враговете Ñ Ð¿Ð¾ - виÑоки макÑимални точки живот. +block.repair-point.description = ÐепрекъÑнато ремонтира най - близката повредена единица в обхват. +block.segment.description = Поврежда и унищожава вражеÑки ÑнарÑди. Ðе дейÑтва на лазери. +block.parallax.description = Ðктивира прихващаш лъч, Ñ ÐºÐ¾Ð¹Ñ‚Ð¾ придърпва и уврежда въздушни единици. +block.tsunami.description = ИзÑтрелва мощни потоци течноÑÑ‚ по враговете. Ðвтоматично гаÑи пожари, когато Ñе ÑнабдÑва Ñ Ð²Ð¾Ð´Ð°. +block.silicon-crucible.description = Рафинира Ñиликон от пÑÑък и въглища, използвайки пиратит като допълнителен източник на топлина. ДейÑтва по - ефективно върху топли повърхноÑти. +block.disassembler.description = Бавно извлича редки минерални компоненти от шлаката. Има ÑˆÐ°Ð½Ñ Ð´Ð° извлече и торий. +block.overdrive-dome.description = Повишава ÑкороÑтта на близки Ñгради. Ðуждае Ñе от фазова тъкан и Ñиликон за да оперира. +block.payload-conveyor.description = ПренаÑÑ Ð³Ð¾Ð»ÐµÐ¼Ð¸ товари, като единици от фабрика. +block.payload-router.description = Ð Ð°Ð·Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð½Ð°Ñ‚Ð¾Ð²Ð°Ñ€ÐµÐ½Ð¸Ñ‚Ðµ единици в 3 различни поÑоки. +block.command-center.description = Контролира поведението на единиците Ñ Ð½Ñколко оÑновни команди. +block.ground-factory.description = Произвежда наземни единици. Произведените единици могат да бъдат използвани директно или пренеÑени във РеконÑтруктори за да бъдат подобрени. +block.air-factory.description = Произвежда въздушни единици. Произведените единици могат да бъдат използвани директно или пренеÑени във РеконÑтруктори за да бъдат подобрени. +block.naval-factory.description = Произвежда морÑки единици. Произведените единици могат да бъдат използвани директно или пренеÑени във РеконÑтруктори за да бъдат подобрени. +block.additive-reconstructor.description = ПодобрÑва доÑтавените единици до второ ниво. +block.multiplicative-reconstructor.description = ПодобрÑва доÑтавените единици до трето ниво. +block.exponential-reconstructor.description = ПодобрÑва доÑтавените единици до четвърто ниво. +block.tetrative-reconstructor.description = ПодобрÑва доÑтавените единици до петото и поÑледно ниво. +block.switch.description = Превключвател. Може да Ñе превключва ръчно и да Ñе Ñледи и управлÑва Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑор. +block.micro-processor.description = Многократно изпълнÑва поредица от логичеÑки инÑтрукции. Може да управлÑва единици и поÑтройки. +block.logic-processor.description = Многократно изпълнÑва поредица от логичеÑки инÑтрукции. Може да управлÑва единици и поÑтройки. По - бърз от микропроцеÑор. +block.hyper-processor.description = Многократно изпълнÑва поредица от логичеÑки инÑтрукции. Може да управлÑва единици и поÑтройки. По - бърз от логичеÑки процеÑор. +block.memory-cell.description = СъхранÑва информациÑ, коÑто може да Ñе доÑтъпва или Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ð¾Ñ‚ процеÑор. +block.memory-bank.description = СъхранÑва информациÑ, коÑто може да Ñе доÑтъпва или Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ð¾Ñ‚ процеÑор. Има голÑм капацитет. +block.logic-display.description = ПозволÑва изобразÑването на графика чрез процеÑор. +block.large-logic-display.description = ПозволÑва изобразÑването на графика чрез процеÑор. +block.interplanetary-accelerator.description = МаÑивна електромагнитна релÑова кула. УÑкорÑва Ñдрата до необходимата ÑкороÑÑ‚ за междупланетно изÑтрелване. + +unit.dagger.description = ИзÑтрелва Ñтандартни боеприпаÑи по вÑички близки врагове. +unit.mace.description = ИзÑтрелва поток от пламък по вÑички близки врагове. +unit.fortress.description = Далекообхватна атака Ñрещу наземни единици. +unit.scepter.description = ИзÑтрелва залп от заредени куршуми по вÑички близки врагове. +unit.reign.description = ИзÑтрелва залп от маÑивни пронизващи куршуми по вÑички близки врагове. +unit.nova.description = ИзÑтрелва лазерни лъчи, които повреждат врагове и поправÑÑ‚ приÑтелÑки Ñтруктури. Може да лети. +unit.pulsar.description = Ðктивира волтови дъги, които повреждат врагове и поправÑÑ‚ приÑтелÑки Ñтруктури. Може да лети. +unit.quasar.description = ИзÑтрелва пронизващи лазерни лъчи, които повреждат врагове и поправÑÑ‚ приÑтелÑки Ñтруктури. Може да лети. Има защитно поле. +unit.vela.description = ИзÑтрелва маÑивен продължителен лазерен лъч, който поврежда врагове, причинÑва пожари и Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ñ Ð¿Ñ€Ð¸ÑтелÑки Ñтруктури. Може да лети. +unit.corvus.description = ИзÑтрелва маÑивен лазерен взрив, който поврежда врагове и Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ñ Ð¿Ñ€Ð¸ÑтелÑки Ñтруктури. Може да преминава над повечето терени. +unit.crawler.description = БÑга към врагове и Ñе Ñамоунищожава, причинÑвайки голÑма екÑплозиÑ. +unit.atrax.description = ИзÑтрелва инвалидизиращи кълба от шлака по наземни цели. Може да прекрачи повечето терени. +unit.spiroct.description = ИзÑтрелва пронизващи лазерни лъчи по враговете, като Ñе ÑамовъзÑтановÑва в процеÑа. Може да преминава над повечето терени. +unit.arkyid.description = Ðтакува врагове ÑÑŠÑ Ð³Ð¾Ð»ÐµÐ¼Ð¸ източващи лазерни лъчи, ÑамопоправÑйки Ñе в процеÑа. Може да преминава над повечето терени. +unit.toxopid.description = ИзÑтрелва големи електричеÑки клъÑтерни ÑнарÑди и пронизващи лазери по врагове. Може да преминава над повечето терени. +unit.flare.description = ИзÑтрелва Ñтандартни ÑнарÑди по близки наземни врагове. +unit.horizon.description = ПуÑка Ñерии от бомби по наземни мишени. +unit.zenith.description = ИзÑтрелва залпове от ракети по вÑички близки врагове. +unit.antumbra.description = ИзÑтрелва залп от боеприпаÑи по вÑички врагове в обхват. +unit.eclipse.description = ИзÑтрелва два пробиващи лазера и залп от Ñачми по близки врагове. +unit.mono.description = Ðвтоматично добива мед и олово, Ñлед което ги пренаÑÑ Ð² Ñдрото. +unit.poly.description = Ðвтоматично Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ñ Ð¸Ð»Ð¸ поÑтроÑва увредени и унищожени Ñтруктури. Помага на други единици в Ñтроежи. +unit.mega.description = Ðвтоматично Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ñ Ð¿Ð¾Ð²Ñ€ÐµÐ´ÐµÐ½Ð¸ Ñтруктури. Може да пренаÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð²Ðµ и малки наземни единици. +unit.quad.description = ПуÑка големи бомби по земни мишени, поправÑйки приÑтелÑки Ñтруктури и повреждайки врагове. Може да пренаÑÑ Ñредни по размер наземни единици. +unit.oct.description = Защитава приÑтелÑки единици чрез регенериращо защитно поле. Може да пренаÑÑ Ð¿Ð¾Ð²ÐµÑ‡ÐµÑ‚Ð¾ наземни единици. +unit.risso.description = ИзÑтрелва залпове от ракети и боеприпаÑи по вÑички близки врагове. +unit.minke.description = ИзÑтрелва Ñачми и Ñтандартни муниции по наземни мишени. +unit.bryde.description = ИзÑтрелва далекообхватни боеприпаÑи и ракети по врагове. +unit.sei.description = ИзÑтрелва поредица от ракети и бронебойни куршуми по врагове. +unit.omura.description = ИзÑтрелва далечни пробивни релÑови лазери по врагове. Изгражда единици модел Факел. +unit.alpha.description = Защитава Ñдро Шард от врагове. Строи Ñтруктури. +unit.beta.description = Защитава Ñдро Ð¤Ð¾Ð½Ð´Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ врагове. Строи Ñтруктури. +unit.gamma.description = Защитава Ñдро Център от врагове. Строи Ñтруктури. + +lst.read = Прочети чиÑло от Ñвързано хранилище за памет. +lst.write = Запиши чиÑло в Ñвързано хранилище за памет. +lst.print = Добави текÑÑ‚ в буфера за изпиÑване.\nÐе визуализира нищо докато не използвате [accent]Print Flush[]. +lst.draw = Ð”Ð¾Ð±Ð°Ð²Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð² буфера за изображение.\nÐе показва нищо докато не използвате [accent]Draw Flush[]. +lst.drawflush = ИзпълнÑва операции, поиÑкани Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° [accent]Draw[] върху поÑочен диÑплей. +lst.printflush = Извежда текÑÑ‚ натрупан Ñ [accent]Print[] върху поÑочен блок за Ñъобщение. +lst.getlink = Взима връзка на процеÑора по номер. Започва от 0. +lst.control = Контролира Ñграда. +lst.radar = Ðамира единици около Ñграда в обхват. +lst.sensor = Взима Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ Ñграда или единица. +lst.set = Задава променлива. +lst.operation = ИзпълнÑва Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ 1 или 2 променливи. +lst.end = Започва ÑпиÑъка Ñ Ð¸Ð½Ñтрукции от начало. +lst.jump = ПреÑкача до друга Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² програмата ако дадено уÑловие е изпълнено. +lst.unitbind = Поема контрол над Ñледващата единица от избран тип и Ñ Ð·Ð°Ð¿Ð¸Ñва в променливата [accent]@unit[]. +lst.unitcontrol = УправлÑва контролираната в момента единица. +lst.unitradar = ЗаÑича единици около контролираната единица. +lst.unitlocate = Ðамира конкретен тип поÑтройка/Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° картата.\nÐеобходимо е да контролирате единица за да го използвате. + +logic.nounitbuild = [red]ДейÑÑ‚Ð²Ð¸Ñ Ð·Ð° Ñтроене на единици не Ñа позволени тук. + +lenum.type = Тип Ñграда/единица\nÐапример, за рутер това ще върне [accent]@router[].\nÐе е текÑÑ‚. +lenum.shoot = Ð¡Ñ‚Ñ€ÐµÐ»Ñ ÐºÑŠÐ¼ позициÑ. +lenum.shootp = Прицелва Ñе в единица/Ñграда, изчиÑлÑвайки нейната ÑкороÑÑ‚. +lenum.configure = Конфигурира поÑтройка, например Сортировач. +lenum.enabled = Дали блокът е активиран или забранен. + +laccess.color = ЦвÑÑ‚ на оÑветителÑ. +laccess.controller = Връща кой контролира единицата.\nÐко е управлÑване от процеÑор, връща процеÑора.\nÐко е във формациÑ, връща лидера.\nИначе, връща Ñамата единица. +laccess.dead = Дали дадена единица/Ñграда е била унищожена или вече е невалидна. +laccess.controlled = Връща:\n[accent]@ctrlProcessor[] ако единицата е контролирана от процеÑор\n[accent]@ctrlPlayer[] ако единицата/Ñградата е контролирана от играч\n[accent]@ctrlFormation[] ако единицата учаÑтва във формациÑ\nИначе, връща 0. +laccess.commanded = [red]Отхвърлена опциÑ. Скоро ще бъде премахната![]\nИзползвайте [accent]controlled[] вмеÑто това. + +graphicstype.clear = Запълва Ñ Ñ†Ð²ÑÑ‚r. +graphicstype.color = Задава цвÑÑ‚ за Ñледващи операции. +graphicstype.stroke = Задава дебелина на линиÑта. +graphicstype.line = РиÑува линиÑ. +graphicstype.rect = Запълва правоъгълник. +graphicstype.linerect = Очертава правоъгълник. +graphicstype.poly = Запълва правилен многоъгълник. +graphicstype.linepoly = Очертава правилен многоъгълник. +graphicstype.triangle = Запълва триъгълник. +graphicstype.image = РиÑува изображение.\nÐапример: [accent]@router[] или [accent]@dagger[]. + +lenum.always = Винаги вÑрно +lenum.idiv = Деление Ñ Ñ†ÐµÐ»Ð¸ чиÑла. +lenum.div = Деление.\nВръща [accent]null[] при делене на 0. +lenum.mod = Модул. +lenum.equal = РавенÑтво. Конвертира променливите в еднакъв тип.\nÐе-null обекти Ñтават 1, null обекти Ñтават 0. +lenum.notequal = ÐеравенÑтво. Конвертира променливите в еднакъв тип. +lenum.strictequal = Стриктно равенÑтво. Отрицателно при различни типове променливи.\nМоже да Ñе използва за проверка на [accent]null[]. +lenum.shl = Побитово измеÑтване налÑво. +lenum.shr = Побитово измеÑтване надÑÑно. +lenum.or = Побитово ИЛИ. +lenum.land = ЛогичеÑко И. +lenum.and = Побитово И. +lenum.not = Побитово ÐЕ. +lenum.xor = Побитово ИЗКЛЮЧВÐЩО ИЛИ. + +lenum.min = Минимална ÑтойноÑÑ‚ от 2 чиÑла. +lenum.max = МакÑимална ÑтойноÑÑ‚ от 2 чиÑла. +lenum.angle = Ъгъл на вектор в градуÑи. +lenum.len = Дължина на вектор. +lenum.sin = СинуÑ, в градуÑи. +lenum.cos = КоÑинуÑ, в градуÑи. +lenum.tan = ТангенÑ, в градуÑи. +#not a typo, look up 'range notation' +lenum.rand = Случайно чиÑло в регион [0, ÑтойноÑÑ‚). +lenum.log = ЕÑтеÑтвен логаритъм (ln). +lenum.log10 = Логаритъм Ñ Ð¾Ñнова 10. +lenum.noise = 2D simplex шум. +lenum.abs = ÐбÑолютна ÑтойноÑÑ‚. +lenum.sqrt = Квадратен корен. + +lenum.any = Ð’ÑÑкаква единица. +lenum.ally = ПриÑтелÑка единица. +lenum.attacker = Въоръжена единица. +lenum.enemy = ВражеÑка единица. +lenum.boss = Пазител. +lenum.flying = Въздушна единица. +lenum.ground = Ðаземна единица. +lenum.player = Единица контролирана от играч. + +lenum.ore = Рудно находище. +lenum.damaged = Повредена приÑтелÑка Ñтруктура. +lenum.spawn = ВражеÑка начална точка.\nМоже да е вражеÑко Ñдро или позициÑ. +lenum.building = ПоÑтройка в определена група. + +lenum.core = Ð’ÑÑкакво Ñдро +lenum.storage = Хранилище, например Ñклад. +lenum.generator = Електрогенератор. +lenum.factory = Сграда коÑто обработва реÑурÑи, фабрика. +lenum.repair = Точка за ремонт. +lenum.rally = Команден център. +lenum.battery = БатериÑ. +lenum.resupply = Точка за ÑнабдÑване.\nИма ÑмиÑъл Ñамо ако [accent]"Единиците Ñе ÐуждаÑÑ‚ от БоеприпаÑи"[] е активирано. +lenum.reactor = Ударен или Ториев реактор. +lenum.turret = Ð’ÑÑкаква кула. + +sensor.in = Сградата/единицата, от коÑто да вземе информациÑ. + +radar.from = ПоÑтройка от коÑто да вземе информациÑ.\nОбхватът е ограничен от обхвата за Ñтроене. +radar.target = Филтър за единици, които да уÑети. +radar.and = Допълнителни филтри. +radar.order = Ред на Ñортиране. 0 за обръщане. +radar.sort = Показател за Ñортиране. +radar.output = Променлива в коÑто да извете намерената единица. + +unitradar.target = Филтър за единици, които да уÑети. +unitradar.and = Допълнителни филтри. +unitradar.order = Ред на Ñортиране. 0 за обръщане. +unitradar.sort = Показател за Ñортиране. +unitradar.output = Променлива в коÑто да изведе намерената единица. + +control.of = Сграда, коÑто да контролира. +control.unit = Единица/Сграда, в коÑто да Ñе цели. +control.shoot = Дали да ÑтрелÑ. + +unitlocate.enemy = Дали да локализира вражеÑки Ñгради. +unitlocate.found = Дали обектът е намерен. +unitlocate.building = Променлива в коÑто да запише намерената Ñграда. +unitlocate.outx = Резултатна X координата. +unitlocate.outy = Резултатна Y координата. +unitlocate.group = Група поÑтройки за които да търÑи. + +lenum.idle = Ðе Ñе движи, но продължи да Ñтроиш/добиваш реÑурÑи.\nСтандартното поведение. +lenum.stop = Спри да Ñе движиш/добиваш реÑурÑи/Ñтроиш. +lenum.move = ПремеÑти Ñе на конкретна позициÑ. +lenum.approach = Доближи Ñе до Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° определено разÑтоÑние. +lenum.pathfind = Ðамери пътека до вражеÑката начална точка. +lenum.target = СтрелÑй към позициÑ. +lenum.targetp = СтрелÑй към цел, изчиÑлÑвайки нейната ÑкороÑÑ‚. +lenum.itemdrop = Разтовари предмет(и). +lenum.itemtake = Вземи предмет(и) от Ñграда. +lenum.paydrop = Разтовари товар. +lenum.paytake = Вземи товар от Ñегашната позициÑ. +lenum.flag = ЧиÑлов флаг на единица. +lenum.mine = Добивай реÑурÑи от позициÑ. +lenum.build = ПоÑтрой Ñтруктура. +lenum.getblock = Преверете типът на поÑтройката на дадени координати.\nПозициÑта трÑбва да е в обхвата на единицата.\nСолидни не-Ñгради ще имат типа [accent]@solid[]. +lenum.within = Проверете дали дадена Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ðµ в обхват на единицата. +lenum.boost = Започни/Спри уÑкорението. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index e0c66ff624..f727c74fc6 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -10,7 +10,7 @@ link.dev-builds.description = Nestabilní vývojová verze hry link.trello.description = Oficiální Trello nástÄ›nka s plánovanými novinkami link.itch.io.description = Stránka na itch.io s odkazy na stažení hry link.google-play.description = Obchod Google Play -link.f-droid.description = Katalog F-Droid +link.f-droid.description = F-Droid link.wiki.description = Oficiální Wiki Mindustry link.suggestions.description = Suggest new features linkfail = NepodaÅ™ilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky. @@ -20,8 +20,8 @@ gameover = Konec hry gameover.pvp = Vyhrál tým [accent]{0}[]! highscore = [accent]Nový rekord! copied = Zkopírováno. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. indev.notready = Tato Äást hry jeÅ¡tÄ› není pÅ™ipravena +indev.campaign = [accent]BlahopÅ™ejeme! ZavrÅ¡il jsi kampaň![]\n\nTohle je vÅ¡e, co Ti hra může po obsahové stránce nabídnout. Meziplanetární lety budou pÅ™idány až v budoucích aktualizacích. load.sound = Zvuky load.map = Mapy @@ -55,7 +55,9 @@ schematic.saved = Å ablona byla uložena. schematic.delete.confirm = Å ablona bude kompletnÄ› vyhlazena. schematic.rename = PÅ™ejmenovat Å¡ablonu schematic.info = {0}x{1}, {2} bloků +schematic.disabled = [scarlet]Å ablony jsou zakázány[]\nNa této [accent]mapÄ›[] nebo [accent]serveru[] nemůžeÅ¡ používat Å¡ablony. +stats = Statistiky stat.wave = Vln poraženo: [accent]{0} stat.enemiesDestroyed = Nepřátel zniÄeno: [accent]{0}[] stat.built = Budov postaveno: [accent]{0}[] @@ -99,8 +101,7 @@ committingchanges = Provádím zmÄ›ny done = Hotovo feature.unsupported = Tvoje zařízení nepodporuje tuto vlastnost hry. -mods.alphainfo = MÄ›j na pamÄ›ti, že modifikace jsou stále v alfa fázi vývoje a mohou být [scarlet]velmi chybové[].\nNahlaÅ¡, prosím, jakékoliv závady na GitHub nebo Discord serveru Mindustry. DÄ›kujeme! -mods.alpha = [accent](Alfa)[] +mods.alphainfo = MÄ›j na pamÄ›ti, že modifikace jsou stále v alfa fázi vývoje a mohou být [scarlet]velmi chybové[].\nNahlaÅ¡, prosím, jakékoliv závady na GitHub Mindustry. DÄ›kujeme! mods = Mody mods.none = [lightgray]Modifikace nebyly nalezeny.[] mods.guide = Průvodce modifikacemi @@ -143,8 +144,12 @@ planetmap = Planetární mapa launchcore = Vyslat jádro filename = Název souboru: unlocked = Byl odemmknut nový blok! +available = Je zpřístupnÄ›n nový výzkum! completed = [accent]DokonÄeno[] techtree = Technologie +research.legacy = Nalezena výzkumná data z verze [accent]5.0[].\nChceÅ¡ [accent]tato data naÄíst[], nebo [accent]je zahodit[] a zaÄít výzkum v nové kampani (což doporuÄujeme)? +research.load = NaÄíst +research.discard = Zahodit research.list = [lightgray]Výzkum:[] research = Výzkum researched = DokonÄen výzkum technologie: [lightgray]{0}[]. @@ -189,6 +194,11 @@ servers.local = Místní servery servers.remote = Vzdálené servery servers.global = Komunitní servery +servers.disclaimer = Komunitní servery [accent]nejsou[] vlastnÄ›ny ani kontrolovány vývojářem této hry.\n\nServery mohou obsahovat obsah vytvoÅ™ený uživateli, který může na nÄ›které uživatele působit nepatÅ™iÄnÄ› Äi nevhodnÄ›. +servers.showhidden = Zobraz skryté servery +server.shown = Zobrazené +server.hidden = Skryté + trace = Vystopovat hráÄe trace.playername = Jméno hráÄe: [accent]{0}[] trace.ip = Adresa IP: [accent]{0}[] @@ -222,6 +232,7 @@ disconnect.timeout = VyprÅ¡el Äas pro pÅ™ipojení. disconnect.data = Chyba naÄtení dat ze serveru! cantconnect = Není možno se pÅ™ipojit ke hÅ™e ([accent]{0}[]). connecting = [accent]PÅ™ipojuji se...[] +reconnecting = [accent]Znovu se pÅ™ipojuji... connecting.data = [accent]NaÄítám data ze serveru...[] server.port = Port: server.addressinuse = Adresu již nÄ›kdo používá! @@ -267,6 +278,9 @@ cancel = ZruÅ¡it openlink = Otevřít odkaz copylink = Zkopírovat odkaz back = ZpÄ›t +crash.export = Exportovat záznamy o zhroucení hry +crash.none = Záznamy o zhroucení hry nebyly nalezeny. +crash.exported = Záznamy o zhroucení hry byly exportovány. data.export = Exportovat data data.import = Importovat data data.openfolder = Otevřít složku s daty @@ -278,18 +292,24 @@ quit.confirm.tutorial = Jsi si jistý?Výuku je možné znovu spustit v [accent] loading = [accent]NaÄítám... reloading = [accent]NaÄítám modifikace... saving = [accent]Ukládám... -respawn = [accent][[{0}][] k znovyzrození v jádÅ™e +respawn = [accent][[{0}][] k znovuzrození v jádÅ™e cancelbuilding = [accent][[{0}][] vyÄistí plán Å¡ablony selectschematic = [accent][[{0}][] provede výbÄ›r a zkopírování pausebuilding = [accent][[{0}][] zastaví stavÄ›ní resumebuilding = [scarlet][[{0}][] bude pokraÄovat ve stavÄ›ní +showui = UI je skryto.\nZmáÄkni [accent][[{0}][] pro jeho zobrazení. wave = [accent]Vlna Äíslo {0}[] +wave.cap = [accent]Vlna {0} z {1}[] wave.waiting = [lightgray]Vlna za {0} vteÅ™in[] wave.waveInProgress = [lightgray]Vlna pÅ™ichází![] waiting = [lightgray]ÄŒekám...[] waiting.players = ÄŒekání na hráÄe... wave.enemies = [lightgray]{0} zbývajících nepřátel -wave.enemy = [lightgray]{0} zbývající nepřítel +wave.enemycores = [accent]{0}[lightgray] nepřátelská jádra +wave.enemycore = [accent]{0}[lightgray] nepřátelské jádro +wave.enemy = [lightgray]{0} zbývající nepřátel +wave.guardianwarn = PoÄet vln do příchodu strážce: [accent]{0}[]. +wave.guardianwarn.one = [accent]Strážce pÅ™ijde již příští vlnu![] loadimage = Nahrát obrázek saveimage = Uložit obrázek unknown = Neznámý @@ -328,6 +348,7 @@ editor.generation = Generace: editor.ingame = Upravit ve hÅ™e editor.publish.workshop = Vystavit ve Workshopu na Steamu editor.newmap = Nová mapa +editor.center = Vycentrovat workshop = Workshop na Steamu waves.title = Vlny waves.remove = Odebrat @@ -337,7 +358,7 @@ waves.waves = vln(y) waves.perspawn = za zrození waves.shields = Å¡títů/vlnu waves.to = do -waves.guardian = Guardian +waves.guardian = Strážce waves.preview = Náhled waves.edit = Upravit.... waves.copy = Uložit do schránky @@ -346,6 +367,7 @@ waves.invalid = Neplatné vlny ve schránce. waves.copied = Vlny byly zkopírovány. waves.none = Žádní nepřátelé nebyli definováni.\nVlny s prázdným rozložením budou automaticky upraveny na výchozí rozložení. +#toto je zámÄ›rnÄ› malými písmeny wavemode.counts = poÄty wavemode.totals = souÄty wavemode.health = zdraví @@ -415,8 +437,9 @@ toolmode.drawteams.description = Kreslí týmy místo bloků. filters.empty = [lightgray]Nejsou zadány žádné filtry, pÅ™idej filtr tlaÄítkem níže.[] filter.distort = Zkreslení filter.noise = ZaÅ¡umÄ›ní -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = VýbÄ›r nepřátelské líhnÄ› +filter.spawnpath = Cesta k líhni +filter.corespawn = VábÄ›r ládra filter.median = Medián filter.oremedian = Medián rud filter.blend = Prolnutí @@ -440,6 +463,7 @@ filter.option.amount = Amount filter.option.block = Blok filter.option.floor = Povrch filter.option.flooronto = Cílový povrch +filter.option.target = Cíl filter.option.wall = StÄ›na filter.option.ore = Ruda filter.option.floor2 = Druhotný povrch @@ -456,7 +480,9 @@ load = NaÄíst save = Uložit fps = FPS: {0} ping = Odezva: {0} ms -language.restart = Prosím restartuj hru, aby se provedla zmÄ›na jazyka! +memory = Paměť: {0} MB +memory2 = Paměť:\n {0} MB +\n {1} MB +language.restart = Hru je tÅ™eba restartovat, aby se provedla zmÄ›na jazyka. settings = Volby tutorial = Výuka tutorial.retake = Spustit znovu výuku. @@ -469,31 +495,22 @@ locked = ZamÄeno complete = [lightgray]DokonÄeno: requirement.wave = Dosáhni vlny {0} na mapÄ› {1} requirement.core = ZniÄ nepřátelské jádro na mapÄ› {0} -requirement.research = Vynalezeno {0} -requirement.capture = Polapeno {0} -resume = ZpÄ›t do mapy:\n[lightgray]{0}[] -bestwave = [lightgray]Nejvyšší vlna: {0} -launch = < VYSLAT > +requirement.research = Vynalezni {0} +requirement.produce = Vyrob {0} +requirement.capture = Polap {0} launch.text = Vyslat -launch.title = Vyslání bylo úspěšné -launch.next = [lightgray]další možnost bude až ve vlnÄ› {0}[] -launch.unable2 = [scarlet]Není možno se vyslat.[] -launch.confirm = Toto vyÅ¡le veÅ¡keré suroviny ve Tvém jádÅ™e zpÄ›t.\nJiž se na tuto základnu nebudeÅ¡ moci vrátit. -launch.skip.confirm = Jestli teÄ zůstaneÅ¡, budeÅ¡ moci odejít až po nÄ›kolika dalších vlnách. +research.multiplayer = Jen hostitel hry může vynalézat nové technologie. +map.multiplayer = Jen hostitel může prohlížet sektory. uncover = Odkrýt mapu configure = PÅ™izpůsobit vybavení + loadout = NaÄtení resources = Zdroje bannedblocks = Zakázané bloky addall = PÅ™idat vÅ¡e -launch.destination = Destination: {0} +launch.from = Vysláno z: [accent]{0} +launch.destination = Cíl: {0} configure.invalid = Hodnota musí být Äíslo mezi 0 a {0}. -zone.unlocked = [lightgray]Mapa {0} byla odemknuta.[] -zone.requirement.complete = Bylo dosaženo vlny {0},\nÄímž byla splnÄ›na podmínka pro mapu {1}. -zone.resources = [lightgray]Byly detekovány tyto suroviny:[] -zone.objective = [lightgray]Úkol: [][accent]{0}[] -zone.objective.survival = PÅ™ežij -zone.objective.attack = ZniÄ nepřátelské jádro add = PÅ™idat... boss.health = Životy Strážce @@ -505,23 +522,53 @@ error.mismatch = Chyba pÅ™i komunikaci se serverem:\nVerze klienta a serveru se error.alreadyconnected = PÅ™ipojeni k serveru. error.mapnotfound = Soubor s mapou nebyl nalezen! error.io = VstupnÄ›/výstupní (I/O) chyba sítÄ›. -error.any = Ueznámá chyba sítÄ›. +error.any = Neznámá chyba sítÄ›. error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje. weather.rain.name = Déšť weather.snow.name = Sníh weather.sandstorm.name = PíseÄná ouÅ™e weather.sporestorm.name = Spórová bouÅ™e +weather.fog.name = Mlha sectors.unexplored = [lightgray]Neprozkoumáno sectors.resources = Zdroje: sectors.production = Výroba: +sectors.export = Export: +sectors.time = ÄŒas: +sectors.threat = Ohrožení: +sectors.wave = Vlna: sectors.stored = UskladnÄ›no: sectors.resume = PokraÄovat sectors.launch = Vyslat -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.select = Vybrat +sectors.nonelaunch = [lightgray]bez (slunce)[] +sectors.rename = PÅ™ejmenovat sektor +sectors.enemybase = [scarlet]Nepřátelská základna +sectors.vulnerable = [scarlet]Zranitelný +sectors.underattack = [scarlet]Pod palbou! [accent]{0}% poÅ¡kozeno +sectors.survives = [accent]PÅ™ežívá již {0} vln +sectors.go = Jdi +sector.curcapture = Sektor polapen +sector.curlost = Sektor ztracen +sector.missingresources = [scarlet]NedostateÄné zdroje v jádÅ™e +sector.attacked = Sektor [accent]{0}[white] pod útokem! +sector.lost = Sektor [accent]{0}[white] ztracen! :( +#note: chybÄ›jící mezera v řádce níže je zámÄ›rná :) +sector.captured = Sektor [accent]{0}[white]polapen! :) +threat.low = Nízké +threat.medium = StÅ™ední +threat.high = Velké +threat.extreme = Extrémní +threat.eradication = Vyhlazující + +planets = Planets + +planet.serpulo.name = Serpulo +planet.sun.name = Sol + +sector.impact0078.name = Dopad 0078 sector.groundZero.name = Základní tábor sector.craters.name = Krátery sector.frozenForest.name = Zamrzlý les @@ -533,18 +580,27 @@ sector.overgrowth.name = Džungle sector.tarFields.name = Dehtová pole sector.saltFlats.name = Solné nížiny sector.fungalPass.name = Plísňový průsmyk +sector.biomassFacility.name = Zařízení pro syntézu biomasy +sector.windsweptIslands.name = VÄ›trné ostrovy +sector.extractionOutpost.name = ExtrakÄní základna +sector.planetaryTerminal.name = Planetární odpalovací terminál sector.groundZero.description = Optimální místo, kde znovu zaÄít. Nízký výskyt nepřátel. NÄ›kolik málo surovin.\nPosbírej co nejvíce olova a mÄ›di.\nBěž dál. sector.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je vÅ¡ak nemůže zadržet navÄ›ky.\n\nPusÅ¥ se do práce za pomocí energie. Stav spalovací generátory. NauÄ se, jak používat opravovací věže. sector.saltFlats.description = Na okraji pouÅ¡tÄ› leží Solné nížiny. V této lokaci se nachází jen nÄ›kolik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. ZniÄ jádro v jeho základnÄ›. Nenechej kámen na kameni. sector.craters.description = V tÄ›chto relikviích starých válek se nahromadilo velké množství vody. Znovu získej tuto oblast. Sbírej písek. Vyrob z nÄ›j metasklo. Použij vodu k chlazení svých vrtů a střílen. -sector.ruinousShores.description = Za pustinou se nachází pobÅ™eží. Kdysi zde stál obranný pobÅ™ežní systém. Moc z nÄ›j už dneska nezbylo. Jen základní stavby zůstaly uÅ¡etÅ™eny, zbytek se rozpadl na Å¡rot.\nPokraÄuj ve své expanzi hloubÄ›ji. Objev ztracenou technologii. +sector.ruinousShores.description = Za pustinou se nachází pobÅ™eží. Kdysi zde stál obranný pobÅ™ežní systém. Moc z nÄ›j už dneska nezbylo. Jen základní konstrukce zůstaly uÅ¡etÅ™eny, zbytek se rozpadl na Å¡rot.\nPokraÄuj ve své expanzi hloubÄ›ji. Objev ztracenou technologii. sector.stainedMountains.description = Dále ve vnitrozemí leží hory, dosud neposkvrnÄ›ny spórami.\nVytěž titan, kterým tato oblast oplývá. NauÄ se jej používat.\n\nPřítomnost nepřátelských jednotek je zde vÄ›tší. RadÅ¡i jim nedej moc Äasu na vyslání jejich nejsilnÄ›jších jednotech. -sector.overgrowth.description = Tato pÅ™erostlá džungle se nachází blíže ke zdroji spór.\nNepřítel zde zbudoval pÅ™edsunutou hlídku. Stav jednotky Dýka a zniÄ s jejich pomocí jádro základny. Získej znovu to, co bylo již dávno ztraceno. +sector.overgrowth.description = Tato pÅ™erostlá džungle se nachází blíže ke zdroji spór.\nNepřítel zde zbudoval pÅ™edsunutou hlídku. Stav jednotky Palcát a zniÄ s jejich pomocí jádro základny. sector.tarFields.description = Rozhraní produkÄní naftové oblasti mezi horami a pouÅ¡tí. Jedna z mála oblastí, kde se stále nachází dehet.\nAÄkoliv je oblast opuÅ¡tÄ›ná, stále se v jejím okolí nachází nebezpeÄné nepřátelské síly. Není radno je podcenit.\n\n[lightgray]Vyzkoumej technologii na zpracování nafty.[] sector.desolateRift.description = ExtrémnÄ› nebezpeÄná mapa. Na úkor prostoru se zde nachází pÅ™ehrÅ¡el surovin. Vysoká pravdÄ›podobnost zniÄení. OpusÅ¥ tuto oblast co nejdříve to půjde. Nenech se zmást dlouhými prodlevami mezi vlnami nepřátel. sector.nuclearComplex.description = Bývalá továrna na zpracování thoria, dnes v troskách.\n[lightgray]Objev thorium a jeho Å¡iroké využití.[]\n\nNepřátelské jednotky se zde nacházejí v hojném poÄtu, a neustále prohledávají oblast. sector.fungalPass.description = PÅ™echodová oblast mezi vysokými horami a spórami nasycenou zemí. Nachází se zde malá průzkumná základna Tvého nepřítele.\nZniÄ ji.\nPoužij mechy Dýka a Slídil. ZniÄ obÄ› nepřátelské jádra. +sector.biomassFacility.description = Prapůvod vÅ¡ech spór. Toto je zařízení, be kterém byly spóry vynalezeny a zpoÄátku u vyrábÄ›ny.\nVynalezni technologii, která se skrýbá uvnitÅ™. Kultivuj spóry k výrobÄ› paliva a plastů.\n\n[lightgray]Po vypnutí tohoto zařízení byly spóry vypuÅ¡tÄ›ny. V okolním ekosystému vÅ¡ak tomuto invazivnímu druhu nebylo nic schopné konkurovat. +sector.windsweptIslands.description = Vzdálen od pevniny je tento Å™etízek ostrovů. Záznamy ukazují, že zde kdysi byly zařízení na výrobu [accent]Plastany[].\n\nPoraž nepřátelské námoÅ™ní jednotky. Vybuduj základnu na ostrovÄ›. Vynalezni továrny. +sector.extractionOutpost.description = Vzdálená pevnost, postavená nepřítelem za úÄelem vysílání zdrojů do okolních sektorů.\n\nDoprava položek napÅ™Ã­Ä sektory je nezbytná pro lapení dalších sektorů. ZniÄ základnu. Vyzkoumej jejich Vysílací ploÅ¡iny. +sector.impact0078.description = Zde leží zbytky mezihvÄ›zdné lodi, která vstoupila d otohoto systému.\n\nZachraň z vraku vÅ¡e, co se dá. Vyzkoumej nepoÅ¡kozenou technologii. +sector.planetaryTerminal.description = KoneÄný cíl.\n\nTato pobÅ™ežní základna obsahuje konstrukce schopné vyslat jádra na okolní planety. Je mimořádnÄ› dobÅ™e opevnÄ›na.\n\nVyrob námoÅ™ní jednotky. Odstraň nepřítele tak rychle, jak umíš. Vyzkoumej vysílací konstrukci. settings.language = Jazyk settings.data = Data hry @@ -558,61 +614,95 @@ settings.graphics = Grafika settings.cleardata = Vymazat data hry... settings.clear.confirm = Jsi si jistý, že chceÅ¡ vymazat Tvá data ve hÅ™e?\nTento krok je nevratný! settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje vÅ¡echna Tvá data ve hÅ™e, vÄetnÄ› uložení hry, map, odemknutého postupu v kampani a nastavení ovládání.\nJakmile stiskneÅ¡ "OK", vÅ¡echna data se vymažou a hra se automaticky ukonÄí. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = Opravdu chceÅ¡ vymazat veÅ¡keré Tvé uložené hry? +settings.clearsaves = Vymazat uložené hry +settings.clearresearch = Vymazat výzkum +settings.clearresearch.confirm = Jsi si jist, že opravdu chceÅ¡ vymazat veÅ¡kerý dosažený výzkum v této kampani? +settings.clearcampaignsaves = Vymazat uložené hry kampanÄ› +settings.clearcampaignsaves.confirm = Jsi si jist, že opravdu chceÅ¡ vymazat vÅ¡echny uložené hry v této kampani? paused = [accent]< Pozastaveno >[] clear = VyÄistit banned = [scarlet]Zakázán[] -unplaceable.sectorcaptured = [scarlet]Vyžaduje polapený sektor[] yes = Ano no = Ne info.title = Informace error.title = [scarlet]Objevila se chyba[] error.crashtitle = Objevila se chyba unit.nobuild = [scarlet]Jednotka nemůže stavÄ›t -blocks.input = Vstup -blocks.output = Výstup -blocks.booster = PosilovaÄ -blocks.tiles = Vyžadované dlaždice -blocks.affinities = Synergie +lastaccessed = [lightgray]Naposledy použil: {0} block.unknown = [lightgray]???[] -blocks.powercapacity = Kapacita energie -blocks.powershot = Energie na 1 výstÅ™el -blocks.damage = PoÅ¡kození -blocks.targetsair = Zaměřuje vzduÅ¡né jednotky -blocks.targetsground = Zaměřuje pozemní jednotky -blocks.itemsmoved = Rychlost pohybu -blocks.launchtime = ÄŒas mezi vysláním -blocks.shootrange = DostÅ™el -blocks.size = Velikost -blocks.displaysize = Velikost zobrazovaÄe -blocks.liquidcapacity = Kapacita kapalin -blocks.powerrange = Rozsah energie -blocks.linkrange = Dosah napojení -blocks.instructions = Instrukce -blocks.powerconnections = Nejvyšší poÄet spojení -blocks.poweruse = SpotÅ™eba energie -blocks.powerdamage = Energie na jednotku poÅ¡kození -blocks.itemcapacity = Kapacita pÅ™edmÄ›tů -blocks.basepowergeneration = Základní generování energie -blocks.productiontime = ÄŒas produkce -blocks.repairtime = ÄŒas do úplné opravy -blocks.speedincrease = Zvýšení rychlosti -blocks.range = Dosah -blocks.drilltier = Lze těžit -blocks.drillspeed = Základní rychlost vrtu -blocks.boosteffect = ÚÄinek posílení -blocks.maxunits = Nejvýše aktivních jednotek -blocks.health = Životy -blocks.buildtime = ÄŒas stavby -blocks.maxconsecutive = Nejvýše po sobÄ› -blocks.buildcost = Cena stavby -blocks.inaccuracy = NepÅ™esnost -blocks.shots = StÅ™ely -blocks.reload = StÅ™el za 1s -blocks.ammo = StÅ™elivo -blocks.shieldhealth = Zdraví Å¡títu -blocks.cooldowntime = ÄŒas na zchladnutí + +stat.description = ÚÄel +stat.input = Vstup +stat.output = Výstup +stat.booster = PosilovaÄ +stat.tiles = Vyžadované dlaždice +stat.affinities = Synergie +stat.powercapacity = Kapacita energie +stat.powershot = Energie na 1 výstÅ™el +stat.damage = PoÅ¡kození +stat.targetsair = Zaměřuje vzduÅ¡né jednotky +stat.targetsground = Zaměřuje pozemní jednotky +stat.itemsmoved = Rychlost pohybu +stat.launchtime = ÄŒas mezi vysláním +stat.shootrange = DostÅ™el +stat.size = Velikost +stat.displaysize = Velikost zobrazovaÄe +stat.liquidcapacity = Kapacita kapalin +stat.powerrange = Rozsah energie +stat.linkrange = Dosah napojení +stat.instructions = Instrukce +stat.powerconnections = Nejvyšší poÄet spojení +stat.poweruse = SpotÅ™eba energie +stat.powerdamage = Energie na jednotku poÅ¡kození +stat.itemcapacity = Kapacita pÅ™edmÄ›tů +stat.memorycapacity = Kapacita pamÄ›ti +stat.basepowergeneration = Základní generování energie +stat.productiontime = ÄŒas produkce +stat.repairtime = ÄŒas do úplné opravy +stat.weapons = ZbranÄ› +stat.bullet = StÅ™ela +stat.speedincrease = Zvýšení rychlosti +stat.range = Dosah +stat.drilltier = Lze těžit +stat.drillspeed = Základní rychlost vrtu +stat.boosteffect = ÚÄinek posílení +stat.maxunits = Nejvýše aktivních jednotek +stat.health = Životy +stat.buildtime = ÄŒas konstrukce +stat.maxconsecutive = Nejvýše po sobÄ› +stat.buildcost = Cena konstrukce +stat.inaccuracy = NepÅ™esnost +stat.shots = StÅ™ely +stat.reload = StÅ™el za 1s +stat.ammo = StÅ™elivo +stat.shieldhealth = Zdraví Å¡títu +stat.cooldowntime = ÄŒas na zchladnutí +stat.explosiveness = VýbuÅ¡nost +stat.basedeflectchance = Základní pravdÄ›pobnost odražení +stat.lightningchance = PravdÄ›podobnost blesku +stat.lightningdamage = PoÅ¡kození bleskem +stat.flammability = HoÅ™lavost +stat.radioactivity = Radioaktivita +stat.heatcapacity = Tepelná kapacita +stat.viscosity = Vazkost +stat.temperature = Teplota +stat.speed = Rychlost +stat.buildspeed = Rychlost stavÄ›ní +stat.minespeed = Rychlost těžení +stat.minetier = Těžící úroveň +stat.payloadcapacity = Kapacita pro náklad +stat.commandlimit = Limit ovládání +stat.abilities = Schopnosti +stat.canboost = Umí posilovat +stat.flying = Létající + +ability.forcefield = Silové pole +ability.repairfield = Opravit pole +ability.statusfield = Stav pole +ability.unitspawn = {0} továrna +ability.shieldregenfield = SilovÄ› opravné pole +ability.movelightning = Pohybující se blesk bar.drilltierreq = Je vyžadován lepší vrt bar.noresources = ChybÄ›jí zdroje @@ -624,6 +714,7 @@ bar.powerbalance = Energie: {0} bar.powerstored = UskladnÄ›no: {0}/{1} bar.poweramount = Energie celkem: {0} bar.poweroutput = Výstup energie: {0} +bar.powerlines = Spojení: {0}/{1} bar.items = PÅ™edmÄ›ty: {0} bar.capacity = Kapacita: {0} bar.unitcap = {0} {1}/{2} @@ -631,23 +722,30 @@ bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[jednotka je v bar.liquid = Chlazení bar.heat = Teplo bar.power = Energie -bar.progress = Stavba v průbÄ›hu +bar.progress = Konstrukce v průbÄ›hu bar.input = Vstup bar.output = Výstup +units.processorcontrol = [lightgray]Procesor je ovládán[] + bullet.damage = [stat]{0}[lightgray] poÅ¡kození[] bullet.splashdamage = [stat]{0}[lightgray] ploÅ¡ného poÅ¡kození ~[stat] {1}[lightgray] dlaždic -bullet.incendiary = [stat]zápalné +bullet.incendiary = [stat]zápalný +bullet.sapping = [stat]oslabující bullet.homing = [stat]samonavádÄ›cí -bullet.shock = [stat]Å¡okové -bullet.frag = [stat]trhavé -bullet.knockback = [stat]{0}[lightgray] odhození -bullet.freezing = [stat]mrazivé -bullet.tarred = [stat]dehtové -bullet.multiplier = [stat]{0}[lightgray]x více stÅ™el -bullet.reload = [stat]{0}[lightgray]x rychlost stÅ™elby +bullet.shock = [stat]Å¡okový +bullet.frag = [stat]trhavý +bullet.knockback = [stat]{0}[lightgray] odhození[] +bullet.pierce = [stat]{0}[lightgray]x průrazné[] +bullet.infinitepierce = [stat]průrazné[] +bullet.healpercent = [stat]{0}[lightgray]% opravující +bullet.freezing = [stat]zmrazující[] +bullet.tarred = [stat]dehtující[] +bullet.multiplier = [stat]{0}[lightgray]x více stÅ™el[] +bullet.reload = [stat]{0}[lightgray]x rychlost stÅ™elby[] unit.blocks = bloky +unit.blockssquared = bloky² unit.powersecond = energie/sekunda unit.liquidsecond = kapalin/sekundu unit.itemssecond = pÅ™edmÄ›tů/sekundu @@ -665,12 +763,13 @@ unit.items = pÅ™edmÄ›ty unit.thousands = tis unit.millions = mio unit.billions = mld +category.purpose = ÚÄel category.general = VÅ¡eobecné category.power = Energie category.liquids = Kapaliny category.items = PÅ™edmÄ›ty category.crafting = Vstup/Výstup -category.shooting = Střílí +category.function = Funkce category.optional = Volitelné vylepÅ¡ení setting.landscape.name = Uzamknout krajinu setting.shadows.name = Stíny @@ -678,9 +777,9 @@ setting.blockreplace.name = Automatický návrh bloků setting.linear.name = Lineární filtrování setting.hints.name = Rady a tipy setting.flow.name = Zobrazit rychlost toku zdroje [scarlet](experimentální)[] +setting.backgroundpause.name = Pozastavit v pozadí setting.buildautopause.name = Automaticky pozastavit stavÄ›ní -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Animované tekutiny +setting.animatedwater.name = Animované povrchy setting.animatedshields.name = Animované Å¡títy setting.antialias.name = Použít antialias [lightgray](vyžaduje restart)[] setting.playerindicators.name = Indikátor pro hráÄe @@ -707,17 +806,15 @@ setting.conveyorpathfinding.name = Hledat cestu pÅ™i umisÅ¥ování pásu setting.sensitivity.name = Citlivost ovladaÄe setting.saveinterval.name = Interval automatického ukládání setting.seconds = {0} sekund -setting.blockselecttimeout.name = ÄŒasový limit pro výbÄ›r bloku setting.milliseconds = {0} milisekund setting.fullscreen.name = Celá obrazovka -setting.borderlesswindow.name = Bezokrajové okno[lightgray] (může výt vyžadován restart)[] +setting.borderlesswindow.name = Bezokrajové okno [lightgray](může výt vyžadován restart) setting.fps.name = Ukázat FPS a ping setting.smoothcamera.name = Plynulá kamera -setting.blockselectkeys.name = Ukázat klávesy pÅ™i práci s blokem setting.vsync.name = Vertikální synchronizace setting.pixelate.name = Rozpixlovat setting.minimap.name = Ukázat mapiÄku -setting.coreitems.name = Ukázat položky jádra (WIP) +setting.coreitems.name = Ukázat položky jádra setting.position.name = Ukázat pozici hráÄe setting.musicvol.name = Hlasitost hudby setting.atmosphere.name = Ukázat atmosféru planety @@ -756,7 +853,7 @@ keybind.press = Stiskni klávesu... keybind.press.axis = Stiskni osu ovladaÄe nebo klávesu... keybind.screenshot.name = Snímek mapy keybind.toggle_power_lines.name = PÅ™epnout zobrazení energetického vedení -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_block_status.name = PÅ™epnout stav bloku keybind.move_x.name = Pohyb vodorovnÄ› keybind.move_y.name = Pohyb svisle keybind.mouse_move.name = Následovat myÅ¡ @@ -797,6 +894,8 @@ keybind.menu.name = Hlavní nabídka keybind.pause.name = Pozastavení hry keybind.pause_building.name = Pozastavit nebo spustit stavÄ›ní keybind.minimap.name = MapiÄka +keybind.planet_map.name = Planetární mapa +keybind.research.name = Výzkum keybind.chat.name = Kanál zpráv keybind.player_list.name = Seznam hráÄů keybind.console.name = Terminál @@ -810,7 +909,7 @@ keybind.drop_unit.name = Zahodit jednotku keybind.zoom_minimap.name = PÅ™iblížit mapu mode.help.title = Popis režimů mode.survival.name = Hra o pÅ™ežití -mode.survival.description = Klasický režim. Zdroje jsou limitované a vlny nepřátel pÅ™icházejí automaticky.\n[gray]Vyžaduje, aby v mapÄ› bylo místo pro líhnutí nepřítel.[] +mode.survival.description = Klasický režim. Zdroje jsou limitované a vlny nepřátel pÅ™icházejí automaticky.\n[gray]Vyžaduje, aby v mapÄ› bylo místo pro líhnutí nepřátel.[] mode.sandbox.name = PískoviÅ¡tÄ› mode.sandbox.description = Zdroje jsou nekoneÄné, vlny nepřátel nemají automatické naÄasování. mode.editor.name = Editor @@ -822,6 +921,7 @@ mode.custom = Vlastní pravidla rules.infiniteresources = NeomezenÄ› surovin rules.reactorexplosions = Výbuch reaktoru +rules.schematic = Å ablony povoleny rules.wavetimer = ÄŒasovaÄ vln rules.waves = Vlny rules.attack = Režim útoku @@ -846,7 +946,8 @@ rules.title.enemy = Nepřátelé rules.title.unit = Jednotky rules.title.experimental = Experimentální rules.title.environment = Environmentální -rules.lighting = SvÄ›tlo +rules.lighting = OsvÄ›tlení +rules.enemyLights = SvÄ›tla nepřátel rules.fire = VýstÅ™el rules.explosions = VýbuÅ¡né poÅ¡kození bloku/jednotky rules.ambientlight = SvÄ›tlo prostÅ™edí @@ -858,6 +959,8 @@ content.item.name = PÅ™edmÄ›ty content.liquid.name = Kapaliny content.unit.name = Jednotky content.block.name = Bloky +content.sector.name = Sektory + item.copper.name = MÄ›Ä item.lead.name = Olovo item.coal.name = Uhlí @@ -875,27 +978,10 @@ item.pyratite.name = Pyratit item.metaglass.name = Metasklo item.scrap.name = Å rot liquid.water.name = Voda -liquid.slag.name = Roztavený kov +liquid.slag.name = Struska liquid.oil.name = Nafta liquid.cryofluid.name = Chladící kapalina -item.explosiveness = [lightgray]VýbuÅ¡nost: {0}%[] -item.flammability = [lightgray]Zápalnost: {0}%[] -item.radioactivity = [lightgray]Radioaktivita: {0}%[] - -unit.health = [lightgray]Životy: {0}[] -unit.speed = [lightgray]Rychlost: {0}[] -unit.weapon = [lightgray]Zbraň: {0} -unit.itemcapacity = [lightgray]Kapacita: {0} -unit.minespeed = [lightgray]Rychlost těžení: {0}% -unit.minepower = [lightgray]Těžební síla: {0} -unit.ability = [lightgray]Schopnost: {0} -unit.buildspeed = [lightgray]Rychlost stavÄ›ní: {0}% - -liquid.heatcapacity = [lightgray]Teplotní kapacita: {0}[] -liquid.viscosity = [lightgray]Viskozita: {0}[] -liquid.temperature = [lightgray]Teplota: {0}[] - unit.dagger.name = Dýka unit.mace.name = Palcát unit.fortress.name = Pevnost @@ -915,8 +1001,8 @@ unit.eclipse.name = ZatmÄ›ní unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct +unit.quad.name = Tetra +unit.oct.name = Hexo unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde @@ -928,14 +1014,16 @@ unit.gamma.name = Gama unit.scepter.name = Žezlo unit.reign.name = Panovník unit.vela.name = Vela -unit.corvus.name = Corvus +unit.corvus.name = Havran block.resupply-point.name = Zásobovací místo block.parallax.name = Paralaxa block.cliff.name = Útes block.sand-boulder.name = Pískovec +block.basalt-boulder.name = ÄŒediÄový balvan block.grass.name = Tráva -block.slag.name = Slag +block.slag.name = Struska +block.space.name = Vesmír block.salt.name = Sůl block.salt-wall.name = Solné skály block.pebbles.name = Oblázky @@ -981,8 +1069,9 @@ block.darksand-water.name = Voda s Äerným pískem block.char.name = DÅ™evÄ›né uhlí block.dacite.name = Dacit block.dacite-wall.name = StÄ›na dacitu +block.dacite-boulder.name = Dacitový kámen block.ice-snow.name = Zasněžený led -block.stone-wall.name = Stone Wall +block.stone-wall.name = Kamenné skály block.ice-wall.name = Ledové skály block.snow-wall.name = SnÄ›hové skály block.dune-wall.name = PíseÄné duny @@ -1027,9 +1116,8 @@ block.hail.name = Kroupomet block.lancer.name = Kopiník block.conveyor.name = Dopravník block.titanium-conveyor.name = Titanoový dopravník -block.plastanium-conveyor.name = Plastanium Conveyor +block.plastanium-conveyor.name = Plastanový pÅ™epravník block.armored-conveyor.name = ObrnÄ›ný dopravník -block.armored-conveyor.description = PÅ™epravuje pÅ™edmÄ›ty stejnÄ› rychle jako titanový pÅ™epravník, ale má navíc brnÄ›ní. PÅ™ijímá pÅ™edmÄ›ty ze srtan pouze z jiných pÅ™epravníků. block.junction.name = KÅ™ižovatka block.router.name = SmÄ›rovaÄ block.distributor.name = RozdÄ›lovaÄ @@ -1075,6 +1163,7 @@ block.power-source.name = NekoneÄný zdroj energie block.unloader.name = OdbavovaÄ block.vault.name = Trezor block.wave.name = Vlna +block.tsunami.name = Tsunami block.swarmer.name = RojiÅ¡tÄ› block.salvo.name = Salva block.ripple.name = VlnÄ›ní @@ -1110,10 +1199,11 @@ block.fuse.name = Fúze block.shock-mine.name = Å oková mina block.overdrive-projector.name = Urychlující projektor block.force-projector.name = Silový projektor -block.arc.name = Oblouk +block.arc.name = Výboj block.rtg-generator.name = RTG -block.spectre.name = Spectre -block.meltdown.name = Meltdown +block.spectre.name = Přízrak +block.meltdown.name = RozpékaÄ +block.foreshadow.name = Znamení osudu block.container.name = Kontejnér block.launch-pad.name = Vysílací ploÅ¡ina block.launch-pad-large.name = Velká vysílací ploÅ¡ina @@ -1131,6 +1221,11 @@ block.payload-router.name = SměřovaÄ nákladu block.disassembler.name = RozebíraÄ block.silicon-crucible.name = Tavicí tyglík pro kÅ™emík block.overdrive-dome.name = Velká urychlující kupole +#experimental, may be removed +block.block-forge.name = Výheň bloků +block.block-loader.name = NakladaÄ bloků +block.block-unloader.name = VykladaÄ bloků +block.interplanetary-accelerator.name = Meziplanetární urychlovaÄ block.switch.name = PÅ™epínaÄ block.micro-processor.name = Mikroprocesor @@ -1139,6 +1234,7 @@ block.hyper-processor.name = Hyperprocesor block.logic-display.name = ZobrazovaÄ logiky block.large-logic-display.name = Velký zobrazovaÄ logiky block.memory-cell.name = Paměťová buňka +block.memory-bank.name = Paměťová banka team.blue.name = modrý team.crux.name = Äervený @@ -1148,158 +1244,247 @@ team.derelict.name = opuÅ¡tÄ›ný team.green.name = zelený team.purple.name = fialový -tutorial.next = [lightgray] -tutorial.intro = Vítej ve [scarlet]výuce Mindustry[]. Zde se dozvíš základy hraní.\nPoznámka: výuka pÅ™edpokládá [accent]výchozí klávesy[] v nastavení, pokud jsi je zmÄ›nil, bude tÅ™eba to vzít v potaz.\nPoužij [accent][[WASD][] pro pohyb a [accent]koleÄko myÅ¡i[] pro pÅ™ibližování a oddalování.\nZaÄni [accent]těžením mÄ›di[]. PÅ™ibliž se k mÄ›dÄ›né žíle u Tvého jádra a klikni na ni pro zahájení těžby.\n\n[accent]{0}/{1} mÄ›di[] -tutorial.intro.mobile = Vítej ve [scarlet]výuce Mindustry[].\nPohybuj se táhnutím prstem do strany.\nPÅ™ibližuj a oddaluj mapu [accent]2 prsty[].\nZaÄni [accent] těžením mÄ›di[]. PÅ™ibliž se k mÄ›dÄ›né žíle u Tvého jádra a Å¥upni na ni pro zahájení těžby.\n\n[accent]{0}/{1} mÄ›di[] -tutorial.drill = Sám vidíš, že ruÄní těžba není moc efektivní.\n[accent]Vrty[] umožňují těžit automaticky.\nKlikni na vrt v nabídce v pravém dolním rohu.\nVyber [accent]mechanický vrt[]. Umisti jej kliknutím na mÄ›dÄ›nou žílu.\nTaké můžeÅ¡ vybrat mechanický vrt stiskem kláves [accent][[2][] a následnÄ› [accent][[1][] rychle po sobÄ›, nezávisle na tom, jaká záložka je v nabídce zrovna otevÅ™ena.\n[accent]Pravým klikem[] pÅ™erušíš stavÄ›ní. -tutorial.drill.mobile = Sám vidíš, že ruÄní těžba není moc efektivní.\n[accent]Vrty[] umožňují těžit automaticky.\nŤupni na vrt v nabídce v pravém dolním rohu.\nVyber [accent]mechanický vrt[]. Umisti jej klikutím na mÄ›dÄ›nou žílu Å¥upnutím a následnÄ› zaÅ¡krtni [accent]fajfku[] na spodku nabídky pro potvrzení volby.\nŤupnutím na [accent]X[] pÅ™erušíš stavÄ›ní. -tutorial.blockinfo = Každý blok má jiné vlastnosti. Každý vrt může těžit pouze nÄ›které suroviny.\nPro zobrazení informací a statistik o bloku [accent]zvol "?" pÅ™i vybraném bloku ve stavební nabídce[].\n\nNyní se podívej na [accent]vlastnosti mechanického vrtu[]. -tutorial.conveyor = Pro dopravu materiálu k jádru jsou zapotÅ™ebí [accent]dopravníky[].\nVytvoÅ™ Å™adu dopravníků od vrtu až k jádru.\nDrž zmáÄknuté [accent]levé tlaÄítko myÅ¡i[], abys umístil dopravníky v jedné Å™adÄ›.\nKdyž zmáÄkneÅ¡ [accent]Ctrl[], Å™ada dopravníků se bude umisÅ¥ovat navíc úhlopříÄnÄ›.\nPoužij [accent]koleÄko myÅ¡i[] pro otáÄení bloku pÅ™ed umístÄ›ním.\n[accent]Umísti dopravníky tak, abys dopravil mÄ›Ä do jádra[]. -tutorial.conveyor.mobile = Pro dopravu materiálu k jádru jsou zapotÅ™ebí [accent]dopravníky[].\nVytvoÅ™ Å™adu dopravníků od vrtu až k jádru.\n[accent]Pokládej dopravníky v Å™adÄ› Å¥upnutím a delším prstu[] a táhnutím v požadovaném smÄ›ru.\n[accent]Umísti dopravníky tak, abys dopravil mÄ›Ä do jádra[]. -tutorial.turret = Jakmile se materiál dostane do jádra, může být použit pro stavbu.\nPamatuj si, že ne vÅ¡echno lze použít pro stavbu.\nVÄ›ci, které melze použít jako stavební materiál, jako například [accent]uhlí[] nebo [accent]Å¡rot[], nelze do jádra uložit, a zasekne tak celý dopravník na vstupu.\nPro odehnání útoÄných jednotek [lightgray]nepřítele[] od jádra je tÅ™eba postavit obranné stavby.\nPostav [accent]střílnu Duo[] poblíž svého jádra. -tutorial.drillturret = Střílny Duo potÅ™ebují jako stÅ™elivo [accent]mÄ›Ä[].\nPolož mechanický vrt blízko střílny.\nPro zásobování mÄ›dí veÄ dopravníky od vrtu ke střílnÄ›.\n\n[accent]DoruÄeno stÅ™eliva: {0}/{1}[] -tutorial.pause = BÄ›hem hry, například v boji, můžeÅ¡ [accent]pozastavit hru[].\nPÅ™i pozastavení můžeÅ¡ naplánovat stavbu do fronty.\n\n[accent]Pozastav hru mezerníkem[]. -tutorial.pause.mobile = BÄ›hem hry, například v boji, můžeÅ¡ [accent]pozastavit hru[].\nPÅ™i pozastavení můžeÅ¡ naplánovat stavbu do fronty.\n\n[accent]Pozastavení hry probedeÅ¡ Å¥upnutím na dvÄ› Äárky vlevo nahoÅ™e. -tutorial.unpause = TeÄ zmáÄkni mezerník znova a pokraÄuj ve hÅ™e. -tutorial.unpause.mobile = TeÄ Å¥upni na ikonu na stejném místÄ› a pokraÄuj ve hÅ™e. -tutorial.breaking = Bloky je tÅ™eba nejen stavÄ›t, ale ÄŒasto rozbít.\n[accent]Drž pravé tlaÄítko myÅ¡u[] a táhni s ní pro výbÄ›r bloků, které potÅ™ebujeÅ¡ rozbít.\n\n[accent]ZniÄ vÅ¡echen Å¡rot vlevo od Tvého jádra použitím blokového výbÄ›ru[]. -tutorial.breaking.mobile = Bloky je tÅ™eba nejen stavÄ›t, ale ÄŒasto rozbít.\n[accent]Ťupnu na ikonku kladiva dole[] a pak Å¥upni na blok, který chceÅ¡ rozbít.\nRozbití více bloků se provádí delším podržením prstu a táhnutím.\nRozbití dokonÄíš Å¥upnutím na fajfku.\n\n[accent]ZniÄ vÅ¡echen Å¡rot vlevo od Tvého jádra použitím blokového výbÄ›ru[]. -tutorial.withdraw = NÄ›kdy je tÅ™eba odebírat pÅ™edmÄ›ty přímo z bloků.\n[accent]Klikni na blok[], ve kterém jsou pÅ™edmÄ›ty a pak [accent]klikni na pÅ™edmÄ›t[] z inventáře bloku.\nVícero pÅ™edmÄ›tů může být odebráno [accent]Å¥upnutím a držením[].\n\n[accent]Odeber trochu mÄ›di z jádra[]. -tutorial.deposit = Vložit pÅ™edmÄ›ty do bloku můžeÅ¡ pÅ™etažením z Tvé lodi na cílový blok.\n\n[accent]Vlož odebranou mÄ›Ä zprátky do Tvého jádra[]. -tutorial.waves = [lightgray]Nepřítel[] se pÅ™ibližuje.\n\nUbraň své jádro po dobu 2 vln. [accent]Klikni levým tlaÄítkem[] pro střílení.\nPostav více střílen a vrtů. Natěž více mÄ›di. -tutorial.waves.mobile = [lightgray]Nepřítel[] se pÅ™ibližuje.\n\nUbraň své jádro po dobu 2 vln. Tvá loÄ bude automaticky střílet po nepřátelských jednotkách.\nPostav více střílen a vrtů. Natěž více mÄ›di. -tutorial.launch = Jakmile dosáhneÅ¡ urÄité vlny, budeÅ¡ moci [accent]vyslat své jádro zpÄ›t[]. Opustíš tím svou základnu a [accent]získáš suroviny uložené v jádÅ™e[].\nZískané suroviny mohou být použity pro výzkum nových technologií.\n\n[accent]Stiskni tlaÄítko pro vyslání jádra zpÄ›t[]. +hint.skip = PÅ™eskoÄit +hint.desktopMove = Použij [accent][[WASD][] k pohybu. +hint.zoom = [accent]Roluj[] prp pÅ™iblížení a oddalování obrazvky. +hint.mine = PÅ™esuň se poblíž \uf8c4 mÄ›dÄ›né rudy a [accent]Å¥upni[] na ni pro zahájení těžby. +hint.desktopShoot = Klikni na [accent][[levé tlaÄítko][] myÅ¡i pro stÅ™elbu. +hint.depositItems = Pro pÅ™esun položek je pÅ™etáhni ze své lodi do jádra. +hint.respawn = Aby ses znovu pÅ™epnul na loÄ, zmáÄkni [accent][[V][]. +hint.respawn.mobile = PÅ™epnul ses na ovládání jednotky nebo konstrukce. Aby ses pÅ™epnul zpÄ›t na loÄ, klikni na avatara vlevo nahoÅ™e. +hint.desktopPause = ZmáÄkni [accent][[mezerník][] k pozastavení a zase spuÅ¡tÄ›ní hry. +hint.placeDrill = Vyber si záložku \ue85e [accent]Vrtů[] v nabídce vpravo dole, potom vyber \uf870 [accent]Vrt[] a klikni na oblast s mÄ›dí k umístÄ›ní. +hint.placeDrill.mobile = Vyber si záložku \ue85e [accent]Vrtů[] v nabídce vpravo dole, potom vyber \uf870 [accent]Vrt[] a Å¥upni na oblast s mÄ›dí k umístÄ›ní.\n\Ťupni na \ue800 [accent]zaÅ¡krtnutí[] vpravo dole pro potvrzení. +hint.placeConveyor = Dopravníky pÅ™esouvají materiál z vrtu do dalších bloků. Vyber \uf896 [accent]Dopravník[] ze záložky \ue814 [accent]Distribuce[].\n\nKlikni a táhni pro umístÄ›ní vícero dopravníků.\n[accent]Roluj[] pro otoÄení. +hint.placeConveyor.mobile = Dopravníky pÅ™esouvají materiál z vrtu do dalších bloků. Vyber \uf896 [accent]Dopravník[] ze záložky \ue814 [accent]Distribuce[].\n\nPodrž chvíli prst a táhni pro umístÄ›ní vícero dopravníků. +hint.placeTurret = Umisti \uf861 [accent]Věž[], abys ubránil Tvoji základnu pÅ™ed nepřáteli.\n\nVěže vyžaduj munici - v tomto případÄ› je jí \uf838mÄ›Ä.\nPoužij vrty a dopravníky, abys nÄ›jakou získal. +hint.breaking = Klikni [accent]pravým tlaÄítkem[] a potáhni pro rozbití bloků. +hint.breaking.mobile = Použij \ue817 [accent]kladivo[] v pravém spodním rohu a pak Å¥upni pro rozbití bloků.\n\nPodrž chvíli prst a táhni pro rozbití bloků ve výbÄ›ru. +hint.research = Použij tlaÄítko \ue875 [accent]Výzkum[] pro vyzkoumání nové technologie. +hint.research.mobile = Použij tlaÄítko \ue875 [accent]Výzkum[] v \ue88c [accent]nabídce[] pro vyzkoumání nové technologie. +hint.unitControl = Podrž [accent][[Levý Ctrl][] a [accent]klikni[] pro ovládání spřátelených jednotek nebo věží. +hint.unitControl.mobile = [accent][[DvojÅ¥upni][] pro ovládání spřátelených jednotek nebo věží. +hint.launch = Jakmile je nasbíráno dostatek zdrojových materiálů, můžeÅ¡ se [accent]vyslat[] do pÅ™ilehlých sektorů z \ue827 [accent]mapy[] v pravém dolním rohu. +hint.launch.mobile = Jakmile je nasbíráno dostatek zdrojových materiálů, můžeÅ¡ se [accent]vyslat[] do pÅ™ilehlých sektorů z \ue827 [accent]mapy[] v the \ue88c [accent]nabídce[]. +hint.schematicSelect = Podrž [accent][[F][] a potáhni pro výbÄ›r bloků, které chceÅ¡ zkopírovat.\n\nKlikni na [accent][[prostÅ™ední tlaÄítko][] myÅ¡i pro zkopírování jednoho typu bloku. +hint.conveyorPathfind = Podrž [accent][[levý Ctrl][], když táhneÅ¡ dopravníky, pro automatické vygenerování cesty. +hint.conveyorPathfind.mobile = Povol \ue844 [accent]úhlopříÄný režim[] a potáhni dopravníky pro automatické generování cesty. +hint.boost = Podrž [accent][[levý Shift][], abys pÅ™eletÄ›l pÅ™es pÅ™ekážky se svou souÄasnou jednotkou.\n\nPouze nÄ›které jednotky vÅ¡ak mají takový posilovaÄ. +hint.command = ZmáÄkni [accent][[G][] pro vytvoÅ™ení formace z blízkých jednotek [accent]podobného typu[].\n\nAbys mohl velet pozemní jednotce, musíš nejprve ovládat jinou pozemní jednotku. +hint.command.mobile = [accent][[DvojÅ¥upni][] na Tvoji jednotku pro vytvoÅ™ení formace z blízkých jednotek. +hint.payloadPickup = ZmáÄkni [accent][[[] pro sebrání malých bloků nebo jednotek. +hint.payloadPickup.mobile = [accent]Ťupni a podrž[] na malém bloku nebo jednotce pro sebrání. +hint.payloadDrop = ZmáÄkni [accent]][] pro položení nákladu. +hint.payloadDrop.mobile = [accent]Ťupni a drž[] na prázdném místÄ› pro položení nákladu. +hint.waveFire = [accent]Naplň[] věže vodou místo munice pro automatické haÅ¡ení okolních požárů. +hint.generator = \uf879 [accent]Spalovací generátory[] pálí uhlí a pÅ™enášení energii do sousedících bloků.\n\nPÅ™enos energie na delší vzdálenost se provádí pomocí \uf87f [accent]Energetických uzlů[]. +hint.guardian = Jednotky [accent]Strážce[] jsou obrnÄ›né. MÄ›kká munice, jako je například [accent]mÄ›Ä[] a [accent]olovo[] je [scarlet]neefektivní[].\n\nPoužij vylepÅ¡ené věže nebo \uf835 [accent]grafitovou[] munici pro \uf861 Střílnu Duo/\uf859 Salvu, abys Strážce sejmul. +hint.coreUpgrade = Jádro může být vylepÅ¡eno [accent]pÅ™ekrytím jádrem vyšší úrovnÄ›[].\n\nUmísti jádro typu [accent]Základ[] pÅ™es jádro typu [accent]OdÅ¡tÄ›pek[]. Ujisti se, že v okolí nejsou žádné pÅ™ekážky. +hint.presetLaunch = Na Å¡edé [accent]sektory v pÅ™istávací zónÄ›[], jako je například [accent]Zamrzlý les[], se lze vyslat kdykoli. Nevyžadují polapení okolního teritoria.\n\n[accent]Číslované sektory[], jako je tento, jsou [accent]volitelné[]. +hint.coreIncinerate = Poté, co je kapacita jádra urÄité položky naplnÄ›na, jakékoliv další stejné pÅ™ijaté položky budou [accent]zniÄeny[]. +hint.coopCampaign = Když hrajeÅ¡ [accent]kooperativní kampaň[], položky, které jsou vyrobeny v této mapÄ›, budou též zaslány [accent]do Tvých místních sektorů[].\n\nJakýkoliv vývoj dosažený hostitelem se též pÅ™enáší. -item.copper.description = NejběžnÄ›jší stavební materiál. Používá se ve vÅ¡ech typech bloků. -item.lead.description = Základní materiál. Používá se v energetických blocích a pÅ™i pÅ™epravÄ› kapalin. -item.metaglass.description = Velmi tvrdá sklenÄ›ná slouÄenina. HodnÄ› používaná pro ukládání a rozvod kapalin. -item.graphite.description = Mineralizovaný uhlík, používaný v energetických komponentách a též jako munice. -item.sand.description = Běžný materiál, který se hojnÄ› používá pÅ™i slévání a tavení. -item.coal.description = ZkamenÄ›lé rostliny, zformované dávno pÅ™ed vznikem mapy. Používané běžnÄ› jako palivo a pro vyrobu dalších materálů. -item.titanium.description = Vzácný, velice lehký kov, využívaný hojnÄ› pÅ™i pÅ™epravÄ› kapalin, ve vrtech a pÅ™i výrobÄ› letových strojů. -item.thorium.description = Hutný, radioaktivní materiál, využívaný jako strukturální podpora a nuklearní palivo. -item.scrap.description = Zbytky starých struktur a jednotek. Obsahuje stopové množství mnoha různých kovů. -item.silicon.description = ExtrémnÄ› užiteÄný polovodiÄ. Využívá se v solárních panelech, pokroÄilých energetických blocích a jako munice do samonavádÄ›cích stÅ™el ve střílnách. -item.plastanium.description = Lehký, kujný materiál, využívaný v pokroÄilém letectví a jako tříštivá munice. -item.phase-fabric.description = TakÅ™ka nehmotná substance používaná v pokroÄilých energetických blocích a v samoopravných technologiích. -item.surge-alloy.description = VyspÄ›lá slitina s jedineÄnými energetickými vlastnostmi. -item.spore-pod.description = UmÄ›lé spór, syntetizované pro průmyslové úÄely z atmosférických koncentrací. Jejich využití spoÄívá v pÅ™emÄ›nÄ› na naftu, výbuÅ¡niny a jako palivo. -item.blast-compound.description = Nestálá smÄ›s používaná v bombách a výbuÅ¡ninách. Syntetizuje se ze spórových tobolek a tÄ›kavých substancí. NedoporuÄuje se využívat jako palivo. -item.pyratite.description = ExtrémnÄ› vznÄ›tlivá substance, používaná ve zápalném stÅ™elivu. -liquid.water.description = NejužiteÄnÄ›jší kapalina. HojnÄ› využívaná jak chlazení do strojů a též pro výrobu spór. -liquid.slag.description = Různé různé druhy roztaveného kovu smíchané dohromady. Lze je rozdÄ›lit na jednotlivé minerály, nebo se tato slitina dá použít jako munice pÅ™i střílení na nepřátelské jednotky. -liquid.oil.description = Kapalina použitá pÅ™i pokroÄilé výrobÄ› materiálů. Může být pÅ™emÄ›nÄ›na na uhlí, nebo pÅ™i rozprášení a zapálení použita jako zbraň. -liquid.cryofluid.description = NeteÄná, nereznoucí kapalina, vytvoÅ™ená z vody a titanu. Má extrémnÄ› vysokou tepelnou kapacitu. HojnÄ› se používá jako chladicí kapalina. +item.copper.description = Používá se ve vÅ¡ech typech bloků a munice. +item.copper.details = MÄ›Ä. Nezvykle nadpoÄetný kov na Serpulu. KonstrukÄnÄ› slabý, pokud není rafinovaná. +item.lead.description = Používá se v pÅ™epravÄ› kapalin a energetických konstrukcích. +item.lead.details = Hutný, neteÄný materiál. HojnÄ› používán v bateriích.\nPoznámka: PravdÄ›podobnÄ› toxický pro biologické formy života. Ne že by jich tady moc zbývalo. +item.metaglass.description = Používá se v pÅ™epravÄ› kapalin a úložných konstrukcích. +item.graphite.description = Používá se v energerických komponentách a nábojích do věží. +item.sand.description = Používá se ve výrobÄ› ostatních rafinovaných materiálů. +item.coal.description = Používá se na palivo a výrobu rafinovaný materiálů. +item.coal.details = Jeví se být zkamenÄ›lou rostlinou hmotou, zformovaou dávno pÅ™ed událostí vytvoÅ™ení tohoto svÄ›ta náhodným Äíslem. +item.titanium.description = Používá se v konstrukcích pro pÅ™epravu kapalin, ve vrtácích a letectví. +item.thorium.description = Používá se v bytelných konstrukcích a též jako nukleární palivo. +item.scrap.description = Používá se v taviÄích a drtiÄích pro rafinaci na jiné materiály. +item.scrap.details = Zbytky zbytků starých konstrukcí a jednotek. +item.silicon.description = Používá se v solárních panelech, komplexní elektronice a samonavádÄ›cích stÅ™elách do obraných věží. +item.plastanium.description = Používá se v pokroÄilých jednotkách, izolaci a tříštivé munici. +item.phase-fabric.description = Používá se v pokroÄilé elektronice a samoopravných konstrukcích. +item.surge-alloy.description = Používá se v pokroÄilém zbrojnictví a reakÄních obranných konstrukcích. +item.spore-pod.description = Používá se pro pÅ™emÄ›nu na ropu, výbuÅ¡niny a palivo. +item.spore-pod.details = Spóry. PravdÄ›podobnÄ› syntetická forma života. Vydává plyn toxický pro jiné formy života. ExtrémnÄ› invazivní. Vysoce hoÅ™lavý za urÄitých podmínek. +item.blast-compound.description = Používá se v bombách a výbuÅ¡né munici. +item.pyratite.description = Používá se v zápalných zbraních a spalovacích generátorech. -block.message.description = Ukládá zprávu. Používá se pro komunikaci mezi spojenci. -block.graphite-press.description = PÅ™eměňuje neforemné kusy uhlí do uÅ¡lechtilých výlisků grafitu. -block.multi-press.description = VylepÅ¡ená verze lisu na grafit. Využívá vodu a energii k rychlejšímu a efektivnÄ›jšímu zpracování uhlí. -block.silicon-smelter.description = Redukuje písek vyÄiÅ¡tÄ›ným uhlím, Äímž vyrábí kÅ™emík. -block.kiln.description = Taví písek a olovo na smÄ›s známou jako metasklo. Vyžaduje k bÄ›hu malé množství energie. -block.plastanium-compressor.description = Produkuje plastanu z titanu a nafty. -block.phase-weaver.description = Produkuje fázovou tkaninu z radioaktivního thoria a písku. SpotÅ™ebuje k tomu výrazné množství energie. -block.alloy-smelter.description = Produkuje rázovou slitinu z titanu, olova, kÅ™emíku a mÄ›di. -block.cryofluid-mixer.description = Míchá vodu a jemný titanová prášek do chladící kapaliny, nezbytné například pro thoriový reaktor. -block.blast-mixer.description = Drtí a míchá shluky spór s pyratitem, Äímž vzniká výbuÅ¡nina. -block.pyratite-mixer.description = Míchá uhlí, olovo a písek do vysoce hoÅ™lavého pyratitu. -block.melter.description = Taví Å¡rot do roztaveného kovu pro další zpracování, nebo pro munici do střílny Vlna. -block.separator.description = OddÄ›luje z roztaveného kovu jednotlivé minerální souÄásti, které na výstupu zchlazuje do pevné formy. -block.spore-press.description = Lisuje ze spór pod enormním tlakem naftu. +liquid.water.description = Používá se pro chladící stroje a na zpracování odpadu. +liquid.slag.description = Používá se v oddÄ›lovaÄích pro rozdÄ›lení na jednotlivé kovy, nebo je chrlena na protivníky z věží. +liquid.oil.description = Používá se v pokroÄilé materiálové výrobÄ› a jako zápalná munice. +liquid.cryofluid.description = Používá se jako chladící kapalina v reaktorech, věžích a továrnách. + +block.resupply-point.description = Zásobuje okolní jednotky mÄ›dÄ›nou municí. Není kompatibilní s jednotkami, které vyžadují energii z baterie. +block.armored-conveyor.description = PÅ™epravuje pÅ™edmÄ›ty vpÅ™ed. NepÅ™ijímá pÅ™edmÄ›ty ze stran. +block.illuminator.description = Vydává svÄ›tlo. +block.message.description = Ukládá zprávu pro komunikaci mezi spojenci. +block.graphite-press.description = Lisuje uhlí na grafit. +block.multi-press.description = Lisuje uhlí na grafit. Vyžaduje vodu jako chladivo. +block.silicon-smelter.description = Rafinuje kÅ™emík z písku a uhlí. +block.kiln.description = Taví písek a olovo na metasklo. +block.plastanium-compressor.description = Produkuje plastan z titanu a nafty. +block.phase-weaver.description = Syntetizuje fázovou tkaninu z thoria a písku. +block.alloy-smelter.description = Taví titan, olovo, kÅ™emík a mÄ›Ä na rázovou slitinu. +block.cryofluid-mixer.description = Míchá vodu a jemný titanová prášek na chladící kapalinu. +block.blast-mixer.description = Vyrábí výbuÅ¡ninu z pyratitu a shluků spór. +block.pyratite-mixer.description = Míchá uhlí, olovo a písek na pyratit. +block.melter.description = Taví Å¡rot na strusku. +block.separator.description = OddÄ›luje ze strusky jednotlivé minerální souÄásti. +block.spore-press.description = Lisuje skluhy spór na naftu. block.pulverizer.description = Drtí Å¡rot na jemný písek. -block.coal-centrifuge.description = Tuhne naftu do kusů uhlí. -block.incinerator.description = Vypaří jakékoliv nadbyteÄné pÅ™edmÄ›ty nebo kapaliny, které mu poÅ¡leÅ¡. -block.power-void.description = ZniÄí jakoukoliv energii, kterou bloku poÅ¡leÅ¡. Jen pro režim PískoviÅ¡tÄ›. -block.power-source.description = NekoneÄný zdroj energie. Jen pro PískoviÅ¡tÄ›. -block.item-source.description = NekoneÄný zdroj pÅ™edmÄ›tů. Jen pro PískoviÅ¡tÄ›. -block.item-void.description = ZniÄí jakýkoliv vstupní pÅ™edmÄ›t, který bloku poÅ¡leÅ¡. Jen pro PískoviÅ¡tÄ›. -block.liquid-source.description = NekoneÄný zdroj kapalin. Jen pro PískoviÅ¡tÄ›. -block.liquid-void.description = ZniÄí jakoukoliv kapalinu, kterou bloku poÅ¡leÅ¡. Jen pro PískoviÅ¡tÄ›. -block.copper-wall.description = Levný obranný blok.\nUžiteÄný k obranÄ› Tvého jádra a střílen pro prvních nÄ›kolik vln nepřátel. -block.copper-wall-large.description = Levný obranný blok.\nUžiteÄný k obranÄ› Tvého jádra a střílen pro prvních nÄ›kolik vln nepřátel.\nZabírá více dlaždic. -block.titanium-wall.description = StÅ™ednÄ› silný obranný blok.\nPoskytuje stÅ™ednÄ› dobrou obranu proti nepřátelům. -block.titanium-wall-large.description = StÅ™ednÄ› silný obranný blok.\nPoskytuje stÅ™ednÄ› dobrou obranu proti nepřátelům.\nZabírá více dlaždic. -block.plastanium-wall.description = Speciální typ zdi, která je schopná absorbovat energetické výboje a blokuje automaticky energetické vedení, například mezi uzly. -block.plastanium-wall-large.description = Speciální typ zdi, která je schopná absorbovat energetické výboje a blokuje automaticky energetické vedení, například mezi uzly.\nZabírá více dlaždic. -block.thorium-wall.description = Silný obranný blok.\nSluÅ¡ná obrana pÅ™ed nepřáteli. -block.thorium-wall-large.description = Silný obranný blok.\nSluÅ¡ná obrana pÅ™ed nepřáteli.\nZabírá více dlaždic. -block.phase-wall.description = ZeÄ potažená speciální odrazivou slouÄeninou na fázové bázi. Odráží pÅ™i nárazu vÄ›tÅ¡inu stÅ™el. -block.phase-wall-large.description = ZeÄ potažená speciální odrazivou slouÄeninou na fázové bázi. Odráží pÅ™i nárazu vÄ›tÅ¡inu stÅ™el.\nZabírá více dlaždic. -block.surge-wall.description = ExtrémnÄ› odolný obranný blok.\nPÅ™i zásahu stÅ™elou akumuluje energii, kterou pak náhodnÄ› uvolňuje ve formÄ› výboje. -block.surge-wall-large.description = ExtrémnÄ› odolný obranný blok.\nPÅ™i zásahu stÅ™elou akumuluje energii, kterou pak náhodnÄ› uvolňuje ve formÄ› výboje.\nZabírá více dlaždic. -block.door.description = Malé dveÅ™e, které se dají otevřít nebo zavřít kliknutím/tupnutím na nÄ›. -block.door-large.description = Velké dveÅ™e, které se dají otevřít nebo zavřít kliknutím/Å¥upnutím na nÄ›.\nZabírají více dlaždic. -block.mender.description = PravidelnÄ› opravuje bloky ve svém poli působnosti. Dobré pro opravu obranného systému mezi vlnami.\nVolitelnÄ› lze využít kÅ™emíku pro posílení dosahu a efektivity. -block.mend-projector.description = VylepÅ¡ená verze Opraváře. Opravuje bloky ve svém poli působnosti.\nVolitelnÄ› lze využít fízové tkaniny pro posílení dosahu a efektivity. -block.overdrive-projector.description = Zrychluje funkce budov v okolí.\nVolitelnÄ› lze využít kÅ™emíku pro posílení dosahu a efektivity. -block.force-projector.description = Vytvoří okolo sebe Å¡estihrané silové pole, které chrání jednotky a budovy uvnitÅ™ pÅ™ed poÅ¡kozením.\nPokud dostane moc poÅ¡kození, tak se pÅ™ehÅ™eje. VolitelnÄ› lze použít chlazení pro snížení pÅ™ehřívání a fázové tkaniny pro zvÄ›tÅ¡ené dosahu Å¡títu. -block.shock-mine.description = Působí poÅ¡kození nepřátelským jednotkám pÅ™i seÅ¡lápnutí. TakÅ™ka neviditelné pro nepřátele (a i v nabídce bloků :) ). -block.conveyor.description = Základní blok pro pÅ™epravu pÅ™edmÄ›tů. Unáší pÅ™edmÄ›ty kupÅ™edu a automaticky plní vhodná úložiÅ¡tÄ› (budovy, kontejnery, jádro), které po cestÄ› potká. Lze jej otáÄet dle potÅ™eby. -block.titanium-conveyor.description = PokroÄilý blok pro pÅ™epravu pÅ™edmÄ›tů. PÅ™enáší pÅ™edmÄ›ty rychleji, než základní dopravník. -block.plastanium-conveyor.description = PÅ™esouvá položky v dávkích.\nPÅ™ijímá položky zezadu, a vykládá je do tří smÄ›rů vepÅ™edu.\nPro Å¡piÄkový průchod vyžaduje nÄ›kolik nakládacích a vykládacích míst. -block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. UžiteÄný pÅ™i situaci, kdy dva rozdílné dopravníky dopravují dva rozdílné materiály pÅ™es jedno pole. -block.bridge-conveyor.description = PokroÄilý blok pro pÅ™epravu pÅ™edmÄ›tů. Dovoluje transport pÅ™edmÄ›tů až pÅ™es tÅ™i pole, a to pÅ™es jakýkoliv terén nebo budovu. -block.phase-conveyor.description = PokroÄilý blok pro pÅ™epravu pÅ™edmÄ›tů. Využívá energii k teleportaci pÅ™edmÄ›tů na vzdálenost nÄ›kolika dlaždic mezi jiným propojeným fázovým dopravníkem. -block.sorter.description = Třídí pÅ™edmÄ›ty. Pokud je pÅ™edmÄ›t shodný s výbÄ›rem, je poslán rovnÄ› dál. Jinak je pÅ™edmÄ›t je odboÄen do strany. -block.inverted-sorter.description = Třídí pÅ™edmÄ›ty. Pokud je pÅ™edmÄ›t shodný s výbÄ›rem, je odboÄen do strany. Jinak je pÅ™edmÄ›t je poslán rovnÄ› dál. -block.router.description = PÅ™ijímá pÅ™edmÄ›ty z jednoho smÄ›ru a posílá je rovnomÄ›rnÄ› do zbylých tří smÄ›rů. UžiteÄný pro rozdÄ›lení pÅ™edmÄ›tů z jednoho zdroje do různých cílů, jako odboÄení z dopravníků a podobnÄ›.\n\n[scarlet]Pozor, nepoužívejte pro vstup do produkÄní budovy, jinak se bude ucpávat výstupními pÅ™edmÄ›ty[]. -block.distributor.description = PokroÄilý smÄ›rovaÄ. RozdÄ›luje pÅ™edmÄ›ty rovnomÄ›rnÄ› až do 7 dalších smÄ›rů. -block.overflow-gate.description = PÅ™edmÄ›ty jsou poslány do strany, pokud je smÄ›r vpÅ™ed zablokován. UžiteÄné například pro zpracování pÅ™ebyteÄného materiálu, pokud je primární příjemce saturován. -block.underflow-gate.description = PÅ™edmÄ›ty jsou poslány vpÅ™ed, pokud je smÄ›r do strany zablokován. UžiteÄné například pro zpracování pÅ™ebyteÄného materiálu, pokud je primární příjemce saturován. -block.mass-driver.description = Ultimátní blok pro pÅ™epravu pÅ™edmÄ›tů. Sebere nÄ›kolik pÅ™edmÄ›tů a vystÅ™elí je k dalšímu hromadnému směřovaÄi pÅ™es nÄ›kolik dlaždic. Vyžaduje ke své funkci energii. -block.mechanical-pump.description = Levné Äerpadlo s pomalým průtokem, nevyžaduje vÅ¡ak energii k provozu. -block.rotary-pump.description = PokroÄilé Äerpadlo, které za pomoci energie vyÄerpá vÄ›tší množství kapalin, než standardní. -block.thermal-pump.description = Ultimátní Äerpadlo. Nejrychlejší Äerpání kapalin. -block.conduit.description = Základní blok pro pÅ™epravu kapalin. Unáší kapaliny vpÅ™ed. Používá se s Äerpadly, v nÄ›kterých vrtech a nebo ve spojení s jiným potrubím. -block.pulse-conduit.description = PokroÄilý blok pÅ™epravy kapalin. PÅ™epravuje kapaliny rychleji a má vÄ›tší kapacitu, než základní potrubí. -block.plated-conduit.description = PÅ™enáší kapaliny stejnÄ› rychle jako pulzní potrubí, ale díky oplátování má vÄ›tší výdržnost. Ze stran pÅ™ijímá kapaliny pouze z dalších potrubí.\nV případÄ› poÅ¡kození má menší ztrátu kapaliny. -block.liquid-router.description = PÅ™ijímá kapaliny z jednoho smÄ›ru a vypouÅ¡tí je rovnomÄ›rnÄ› do zbylých tří smÄ›rů. Dokáže pojmout i urÄitý objem kapalin do vnitřího úložiÅ¡tÄ›. Používá se pÅ™i rozdÄ›lení kapaliny z jednoho zdroje směřující do různých cílů. -block.liquid-tank.description = Ukládá velké množství kapalin. Používá se pro vyrovnávání zásob vody, když je přítok nestabilní nebo jako záložní chlazení pro životnÄ› důležité stavby. -block.liquid-junction.description = Chová se jako most pro dvÄ› křížící se potrubí. Používá se v situacích, kdy dvÄ› rozdílná potrubí vedou rozdílný obsah pÅ™es jedno místo. -block.bridge-conduit.description = PokroÄilý blok pÅ™epravy kapalin. Dovoluje pÅ™enášet kapaliny pÅ™es tÅ™i dlaždice napÅ™Ã­Ä jakýmkoliv terénem nebo pÅ™es budovy. -block.phase-conduit.description = PokroÄilý blok pro pÅ™epravu kapalib. Využívá energii k teleportaci kapalin na vzdálenost nÄ›kolika dlaždic mezi jiným propojeným fázovým potrubím. +block.coal-centrifuge.description = PÅ™etváří naftu na uhlí. +block.incinerator.description = VypaÅ™uje jakékoliv pÅ™edmÄ›ty nebo kapaliny, které obdrží. +block.power-void.description = ZniÄí jakoukoliv energii na vstupu. Jen v režimu PískoviÅ¡tÄ›. +block.power-source.description = NekoneÄný zdroj energie. Jen v režimu PískoviÅ¡tÄ›. +block.item-source.description = NekoneÄný zdroj pÅ™edmÄ›tů. Jen v režimu PískoviÅ¡tÄ›. +block.item-void.description = ZniÄí jakýkoliv vstupní pÅ™edmÄ›t, který bloku poÅ¡leÅ¡. Jen v režimu PískoviÅ¡tÄ›. +block.liquid-source.description = NekoneÄný zdroj kapalin. Jen v režimu PískoviÅ¡tÄ›. +block.liquid-void.description = ZniÄí jakoukoliv kapalinu, kterou bloku poÅ¡leÅ¡. Jen v režimu PískoviÅ¡tÄ›. +block.copper-wall.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. +block.copper-wall-large.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. +block.titanium-wall.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. +block.titanium-wall-large.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. +block.plastanium-wall.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. Pohlcuje laserové a energetické výboje. Automaticky blokuje energetické spoje. +block.plastanium-wall-large.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. Absorbs lasers and electric arcs. Automaticky blokuje energetické spoje. +block.thorium-wall.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. +block.thorium-wall-large.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. +block.phase-wall.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami, reflecting most bullets upon impact. +block.phase-wall-large.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami, reflecting most bullets upon impact. +block.surge-wall.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. PÅ™i doteku opakovanÄ› vydává energetické výboje. +block.surge-wall-large.description = Chrání konstrukce pÅ™ed nepřátelskými stÅ™elami. PÅ™i doteku opakovanÄ› vydává energetické výboje. +block.door.description = ZeÄ, která může být otevÅ™ena a zavÅ™ena. +block.door-large.description = ZeÄ, která může být otevÅ™ena a zavÅ™ena. +block.mender.description = OpakovanÄ› opravuje bloky ve svém dosahu.\nVolitelnÄ› umí použít kÅ™emík pro posílení dosahu a efektivity. +block.mend-projector.description = OpakovanÄ› opravuje bloky ve svém dosahu.\nVolitelnÄ› umí použít fázovou tkaninu pro posílení dosahu a efektivity. +block.overdrive-projector.description = Zrychluje funkce budov v okolí.\nVolitelnÄ› umí využít fázovou tkaninu pro posílení dosahu a efektivity. +block.force-projector.description = Vytváří okolo sebe Å¡estiúhelníkové silové pole. Chrání konstrukce a jednotky uvnitÅ™ pole pÅ™ed poÅ¡kozením.\nPÅ™ehřívá se, pokud obdrží moc poÅ¡kození. PÅ™ehřátí lze eliminovat použitím chlazení. Fázová tkanina zvyÅ¡je velikost pole. +block.shock-mine.description = Vydává energetické výboje pÅ™i dotyku nepřátelskou jednotkou. +block.conveyor.description = PÅ™epravuje pÅ™edmÄ›ty vpÅ™ed. +block.titanium-conveyor.description = PÅ™epravuje pÅ™edmÄ›ty vpÅ™ed. Rychlejší, než standardní dopravník. +block.plastanium-conveyor.description = PÅ™epravuje pÅ™edmÄ›ty vpÅ™ed in batches. PÅ™ijímá pÅ™edmÄ›ty zezadu, a vykládá je do tří smÄ›rů vpÅ™edu. Vyžaduje více nakládacích a vykládacích bodů pro Å¡piÄkový průtok. +block.junction.description = Funguje jako most pro dva křížící se dopravníky. +block.bridge-conveyor.description = PÅ™epravuje pÅ™edmÄ›ty pÅ™es terén nebo budovy. +block.phase-conveyor.description = OkamžitÄ› pÅ™epravuje pÅ™edmÄ›ty pÅ™es terén nebo budovy. Má delší dosah než standardní pÅ™emostÄ›ní pÅ™epravníku, ale vyžaduje energii. +block.sorter.description = Pokud vstupní položka odpovídá výbÄ›ru, je pÅ™edána vpÅ™ed. Jinak je vyložena napravo a nalevo. +block.inverted-sorter.description = Podobné stanrdardní třídiÄce, ale vykládá vybrané položky do stran. +block.router.description = RozdÄ›luje vstupní položky rovnomÄ›rnÄ› do tří výstupů. +block.router.details = Nezbytné zlo. Použití hned u produkÄních vstupů se nedoporuÄuje, protože budou ucpány výstupnímk položkami. +block.distributor.description = RozdÄ›luje vstupní položky rovnomÄ›rnÄ› do sedmi výstupů. +block.overflow-gate.description = Pokud je smÄ›r vpÅ™ed ucpán, posílá vstupní položky do stran. Nelze použít vedle jiné brány. +block.underflow-gate.description = Pokud je smÄ›r do stran ucpán, posílá vstupní položky vpÅ™ed. Nelze použít vedle jiné brány. +block.mass-driver.description = Konstrukce pro pÅ™epravu položek na velkou vzdálenost. Sesere dávku položek a vystÅ™elí ji k dalšímu hromadnému pÅ™enaÅ¡eÄi. +block.mechanical-pump.description = Pumpuje kapalinu a pÅ™edává ji dál. Nevyžaduje energii. +block.rotary-pump.description = Pumpuje kapalinu a pÅ™edává ji dál. Vyžaduje energii. +block.thermal-pump.description = Pumpuje kapalinu a pÅ™edává ji dál. +block.conduit.description = PÅ™epravuje kapaliny vpÅ™ed. Používá se spolu s pumpami a dalším potrubím. +block.pulse-conduit.description = PÅ™epravuje kapaliny vpÅ™ed. PÅ™epravuje kapaliny rychleji a ukládá jich více, než standadní potrubí. +block.plated-conduit.description = PÅ™epravuje kapaliny vpÅ™ed. NepÅ™ijímá kapaliny ze stran. Nemá úniky. +block.liquid-router.description = PÅ™ijímá kapalinu z jednoho smÄ›ru a vydává ji rovnomernÄ› do tří ostatních stran. Umí též uchovat malé množství kapaliny. +block.liquid-tank.description = Ukládá velké množství kapaliny. PÅ™edává ji do stran, podobnÄ› jako směřovaÄ kapalin. +block.liquid-junction.description = Funguje jako most pro dvÄ› křížící se potrubí. +block.bridge-conduit.description = PÅ™epravuje kapalinu pÅ™es terén a budovy. +block.phase-conduit.description = PÅ™epravuje kapalinu pÅ™es terén a budovy. Má delší dosah než standardní pÅ™emostÄ›ní potrubí, ale vyžaduje energii. block.power-node.description = PÅ™enáší energii mezi propojenými uzly. Uzel získává energii z nebo dodává energii do bloků ve svém poli působnosti. block.power-node-large.description = PokroÄilý energerický uzel. Má vÄ›tší dosah než základní uzel. -block.surge-tower.description = Energetický uzel s extrémním dosahem, ale ménÄ› dostupnými přípojkami pro ostatní bloky, než ostatní uzly. -block.diode.description = Energie z baterie pÅ™es tento blok protéká jen jedním smÄ›rem, a to jen za podmínky, že a druhé stranÄ› je ménÄ› energie (například vybitá baterie). -block.battery.description = Ukládá energii v případÄ› nadbytku v síti a poskytuje energii kdykolik, když se energetické síti nedostává (záporný rozdíl). -block.battery-large.description = Ukládá více energie, než základní baterie. +block.surge-tower.description = Energetický uzel s dlouhým dosahem, ale ménÄ› dostupnými přípojkami pro ostatní bloky, než ostatní uzly. +block.diode.description = Energie z baterie pÅ™es tento blok protéká jen jedním smÄ›rem, a to jen za podmínky, že na druhé stranÄ› je ménÄ› energie (například vybitá baterie). +block.battery.description = Ukládá energii v případÄ› nadbytku v síti a poskytuje energii kdykolik, když se energetické síti nedostává. +block.battery-large.description = Ukládá energii v případÄ› nadbytku v síti a poskytuje energii kdykolik, když se energetické síti nedostává. Ukládá více energie než základní baterie. block.combustion-generator.description = Generuje energii spalováním hoÅ™laných materiálů, jako je například uhlí. block.thermal-generator.description = Pokud je umístÄ›n na teplotnÄ› aktivní místo (jako je magmatický kámen), dokáže z tepla generovat energii. -block.steam-generator.description = PokroÄilý spalovací generátor. EfektivnÄ›jší, ale vyžaduje dodateÄný přísun vody pro produkci páry. +block.steam-generator.description = Vytváří energii spalováním hoÅ™lavých materiálů a mÄ›nÄ›ním vody na páru. block.differential-generator.description = Generuje velké množství energie. Využívá teplotního rozdílu mezi chladící kapalinou a hořícím pyratitem. -block.rtg-generator.description = Radioizotopní termoenergetický generátor (RTG) je jednoduchý, spolehlivý generátor. Využívá tepla z rozpadu radioaktivních složek ke generování menších dávek energie. -block.solar-panel.description = Základní solární panel pro generování malého množství energie ze Slunce. -block.solar-panel-large.description = VýraznÄ› efektivnÄ›jší verze solárního panelu pro generování energie ze Slunce. -block.thorium-reactor.description = Generuje významné množství energie z thoria. Vyžaduje nepÅ™etržité chlazení. Je-li chlazen nedostateÄnÄ›, způsobí znaÄnou explozi. Výstup energie závisí na míře naplnÄ›ní generátoru, základní generování energie se aktivuje pÅ™i plné kapacitÄ›. -block.impact-reactor.description = VyspÄ›lý generátor, schopný vytvářet pÅ™i maximálním výkonu obrovská množství energie. Vyžaduje vÅ¡ak znaÄné množství energie pro nastartování celého procesu. -block.mechanical-drill.description = Levný vrt. PÅ™i položení na vhodné pole (ruda, písek) natrvalo a pomalu produkuje odpovídající materiál. Umí těžit jen základní rudy. +block.rtg-generator.description = Používá teplo z rozpadajících se radioaktivních materiálů k výrobÄ› energie v malých dávkách. +block.solar-panel.description = Vytváří malého množství energie ze Slunce. +block.solar-panel-large.description = Vytváří malého množství energie ze Slunce. EfektivnÄ›jší, než základní solárí panel. +block.thorium-reactor.description = Generuje významné množství energie z thoria. Vyžaduje nepÅ™etržité chlazení. Je-li chlazen nedostateÄnÄ›, způsobí znaÄnou explozi. +block.impact-reactor.description = Vytváří pÅ™i Å¡piÄkové úÄinnosti velké množství energi. VyspÄ›lý generátor, schopný vytvářet pÅ™i maximálním výkonu obrovská množství energie. Vyžaduje vÅ¡ak znaÄné množství energie pro nastartování celého procesu. +block.mechanical-drill.description = Když je umístÄ›n na rudu, generuje donekoneÄna odpovídající položky, pomalou rychlostí. Použitelný jen pro těžení základních surovin. block.pneumatic-drill.description = VylepÅ¡ený vrt, který je schopen těžit i titan. Těží vyšší rychlostí než mechanický vrt. block.laser-drill.description = Vrtá rychleji než penumatický vrt díky laserové technologii, ale vyžaduje ke svému fungování energii. Dokáže navrtat i rudné žíly thoria. block.blast-drill.description = Ultimátní vrt, vyžadující k provozu znaÄné množství energie. block.water-extractor.description = Extrahuje podzemní vodu. Vhodný pro místa, kde se nevyskytuje povrchová voda. -block.cultivator.description = Kultivuje drobounké koncentrace spór v atmosféře do formy vhodné pro průmyslové využití spór. +block.cultivator.description = Kultivuje drobounké koncentrace atmosférických spór do spórových polÅ¡tářků. +block.cultivator.details = ZachránÄ›ná technologie. Používá se k výrobÄ› obrovského množství biomasy tak efektivnÄ›, jak jen to jde. PravdÄ›podobnÄ› se původnÄ› jednalo o inkubátor spó, které nyní pokrývají Serpulo. block.oil-extractor.description = Vyžaduje znaÄné množství energie, písku a vody na těžení nafty. -block.core-shard.description = První verze jádra. Pokud je zniÄeno, veÅ¡kerý kontakt s mapou je ztracen. NedopusÅ¥, aby se to stalo. -block.core-foundation.description = Druhá cerze jádra. Je lépe obrnÄ›ná a pojme více surovin. -block.core-nucleus.description = TÅ™etí a koneÄná iterace vývoje jádra. Velmi dobÅ™e obrnÄ›ná. Dokáže skladovat významné množství zdrojů. +block.core-shard.description = Jádro základny. Pokud je zniÄena, sektor je ztracen. +block.core-shard.details = První iterace. Kompaktní. Sebereplikující. Vybavená vysílacím pohonem na jedno použití. Není navržena pro meziplanetární cestování. +block.core-foundation.description = Jádro základny. DobÅ™e opevnÄ›ná. Pojme více surovin, než základna OdstÄ›pek. +block.core-foundation.details = Druhá iterace. +block.core-nucleus.description = Jádro základny. Velmi dobÅ™e opevnÄ›ná. Dokáže skladovat enormní množství zdrojů. +block.core-nucleus.details = TÅ™etí a koneÄná iterace vývoje jádra. block.vault.description = Ukládá velké množství pÅ™edmÄ›tů od každého typu. K vyskladnÄ›ní vÄ›cí z trezoru je možné použít odbavovaÄ. block.container.description = Ukládá menší množství pÅ™edmÄ›tů od každého typu. K vyskladnÄ›ní vÄ›cí z kontejneru je možné použít odbavovaÄ. -block.unloader.description = Vyskladňuje pÅ™edmÄ›ty z kontejneru, trezoru nebo jádra na dopravník nebo přímo do produktivních bloků. Druh pÅ™edmÄ›tu pro vyskladnÄ›ní lze nastavit kliknutím nebo Å¥upnutím na odbavovaÄ. -block.launch-pad.description = Vysílá dávky pÅ™edmÄ›tů z mapy bez nutnosti vyslat zpÄ›t jádro. -block.launch-pad-large.description = VylepÅ¡ená verze vysílací ploÅ¡iny. Má vÄ›tší úložný prostor a vysílá pÅ™edmÄ›ty z mapy ÄastÄ›ji. -block.duo.description = Malá, levná střílna. UžiteÄná proti pozemním jednotkám. -block.scatter.description = Základní protivzduÅ¡ná střílna. Střílí kusy olova, pláty Å¡rotu nebo stÅ™epy metaskla na nepřátelské jednotky. +block.unloader.description = Vyskladňuje vybrané položky z okolních bloků. +block.launch-pad.description = Vysílá dávky pÅ™edmÄ›tů do pÅ™ilehlých sektorů. +block.duo.description = Střílí střídavé dávky kulek na nepřátele. +block.scatter.description = Střílí kusy olova, pláty Å¡rotu nebo stÅ™epy metaskla na nepřátelské letectvo. block.scorch.description = Sežehne pozemní jednotky blízkosti. Velmi efektivní na malé vzdálenosti. -block.hail.description = Malá dÄ›lostÅ™elecká střílna na delší vzdálenosti. -block.wave.description = StÅ™ednÄ› velká střílna. Pálí po nepřítelích proudy kapaliny (například roztaveného kovu). Umí automaticky uhasit oheň, pokud je zásobena vodou. -block.lancer.description = StÅ™ednÄ› velká střílna proti pozemním jednotkám. Po nabití se střílí mocné energetické paprsky. -block.arc.description = Malá energetická střílna. Pálí výboje po nepřátelských jednotkách. -block.swarmer.description = StÅ™ednÄ› velká střílna s raketami. ÚtoÄí na pozemní i vzduÅ¡né cíle. Pálí samonavádÄ›cí stÅ™ely. -block.salvo.description = VÄ›tší, pokroÄilejší verze střílny Duo. Pálí na nepřátele rychlé dávky stÅ™el. -block.fuse.description = Velká střílna s krátkým dosahem. Pálí trojici pronikavých výbuchů na blízké nepřátele. -block.ripple.description = ExtrémnÄ› silná dÄ›lostÅ™elecká střílna. Pálí na dálku shluky stÅ™el na nepřátelské jednotky. -block.cyclone.description = Velká protiletecká a protipozemní střílna. Pálí explodující dávky na nepřítele v okolí. -block.spectre.description = Velká střílna s kanónem s dvÄ›ma hlavnÄ›mi. Střílí velké náboje, které pronikají brnÄ›ním jak pozemních, tak vzduÅ¡ných nepřátelských cílů. -block.meltdown.description = Masivní laserový kanón. Nabije se a pak pálí nepÅ™etržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení. -block.repair-point.description = NepÅ™etržitÄ› léÄí nejbližší poÅ¡kozenou jednotku v poli své působnosti. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.hail.description = Střílí na dálku malé patrony na pozemní nepřátele. +block.wave.description = Střílí po nepřátelích proudy kapaliny (například strusky). Umí automaticky uhasit oheň, pokud je zásobena vodou. +block.lancer.description = Po nabití střílí mocné energetické paprsky na pozemní cíle. +block.arc.description = Střílí výboje po pozemních jednotkách. +block.swarmer.description = Střílí po nepřátelích samonavádÄ›cí stÅ™ely. +block.salvo.description = Střílí na nepřátele rychlé dávky stÅ™el. +block.fuse.description = Střílí trojici pronikavých výbuchů na blízké nepřátele. +block.ripple.description = Střílí na dálku shluky stÅ™el na pozemní jednotky. +block.cyclone.description = Střílí vybuchující dávky na blízké nepřátele. +block.spectre.description = Střílí velké náboje, které pronikají brnÄ›ním jak pozemních, tak vzduÅ¡ných cílů. +block.meltdown.description = Po nabití střílí nepÅ™etržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení. +block.repair-point.description = NepÅ™etržitÄ› opravuje nejbližší poÅ¡kozenou jednotku v poli své působnosti. +block.segment.description = PoÅ¡kozuje a niÄí příchozí stÅ™ely. Laserové stÅ™ely ale zacílit neumí. +block.parallax.description = Střílí tažný paprsek, který pÅ™itahuje vzduÅ¡né cíle, a poÅ¡kozuje je. +block.tsunami.description = Střílí mocné proudy kapalin na nepřátele. SamoÄinnÄ› hasí oheň, pokud je zásobován vodou. +block.silicon-crucible.description = Rafinuje kÅ™emík z písku a uhlí za použití pyratitu jako přídavného zdroje tepla. ÚÄinnÄ›jší na horkých místech. +block.disassembler.description = OddÄ›luje ze strusky stopové množství exotických minerálových souÄástí pÅ™i malé úÄinnosti. Umí vyrobit thorium. +block.overdrive-dome.description = ZvyÅ¡uje rychlost okolních konstrukcí. Vyžaduje ke svému fungování fázovou tkaninu a kÅ™emík. +block.payload-conveyor.description = PÅ™esouvá velké náklady, jako jednotky z továren. +block.payload-router.description = RozdÄ›luje vstuní náklad na 3 výstupní smÄ›ry. +block.command-center.description = Ovládá chování jednotky nÄ›kolika příkazy. +block.ground-factory.description = Vyrábí pozemní jednotky. Výstupní jednotky mohou být použity přímo, nebo pÅ™esunuty do pÅ™estavovaÄů na vylepÅ¡ení. +block.air-factory.description = Vyrábí letecké jednotky. Výstupní jednotky mohou být použity přímo, nebo pÅ™esunuty do pÅ™estavovaÄů na vylepÅ¡ení. +block.naval-factory.description = Vyrání námoÅ™ní jednotky. Výstupní jednotky mohou být použity přímo, nebo pÅ™esunuty do pÅ™estavovaÄů na vylepÅ¡ení. +block.additive-reconstructor.description = VylepÅ¡uje vstupní jednotky na druhou úroveň. +block.multiplicative-reconstructor.description = VylepÅ¡uje vstupní jednotky na tÅ™etí úroveň. +block.exponential-reconstructor.description = VylepÅ¡uje vstupní jednotky na Ätvrtou úroveň. +block.tetrative-reconstructor.description =VylepÅ¡uje vstupní jednotky na pátou, koneÄnou úroveň. +block.switch.description = PÅ™epínaÄ. Jeho stav je možné Äíst a ovládat logickými procesory. +block.micro-processor.description = SpouÅ¡tí posloupnost logických instrukcí ve smyÄce. Dá se použít k ovládání jednotek a konstrukcí. +block.logic-processor.description = SpouÅ¡tí posloupnost logických instrukcí ve smyÄce. Dá se použít k ovládání jednotek a konstrukcí. Rychlejší než mikroprocesor. +block.hyper-processor.description = SpouÅ¡tí posloupnost logických instrukcí ve smyÄce. Dá se použít k ovládání jednotek a konstrukcí. Rychlejší než logický procesor. +block.memory-cell.description = Ukládá informace z logického procesoru. +block.memory-bank.description = Ukládá informace z logického procesoru. VÄ›tší kapacita. +block.logic-display.description = Zobrazuje libovolnou grafiku z logického procesoru. +block.large-logic-display.description = Zobrazuje libovolnou grafiku z logického procesoru. +block.interplanetary-accelerator.description = Masivní elektromagnetická věž. Urychlí jádro na únikovou rychlost pro meziplanetární vyslání. + +unit.dagger.description = Střílí základní stÅ™ely na vÅ¡echny okolní nepřátele. +unit.mace.description = Střílí proudy ohnÄ› na vÅ¡echny okolní nepřátele. +unit.fortress.description = Střílí dÄ›lostÅ™elecké salvy na pozemní cíle. +unit.scepter.description = Střílí palbu nabitých stÅ™el na vÅ¡echny okolní nepřátele. +unit.reign.description = Střílí palbu masivních stÅ™el pronikajících brnÄ›ním na vÅ¡echny okolní nepřátele. +unit.nova.description = Střílí laserové výboje, které poÅ¡kozují nepřátele a opravují spojenecké konstrukce. Je schopný letu. +unit.pulsar.description = Střílí energetické oblouky, které poÅ¡kozují nepřátele a opravují spojenecké struktury. Schopný letu. +unit.quasar.description = Střílí pronikavé laserové paprsky, které poÅ¡kozují nepřátele a opravují spojenecké struktury. Schopný letu. OÅ¡títovaný. +unit.vela.description = Střílí masivní nepÅ™etržitý laserový paprsek, který poÅ¡kozuje nepřátele, způsobuje požáry a opravuje spojenecké struktury. Schopný letu. +unit.corvus.description = Střílí masivní laserový paprsek, který poÅ¡kozuje nepřátele a opravuje spojenecké struktury. Může pÅ™ekonat vÄ›tÅ¡inu z terénů. +unit.crawler.description = Běží smÄ›rem k nepřátelům, vybuchne a způsobí velkou explozi. +unit.atrax.description = Střílí oslabující koule strusky na pozemní cíle. Může pÅ™ekonat vÄ›tÅ¡inu z terénů. +unit.spiroct.description = Střílí mířené laserové paprsky na nepřátele, a zároveň se tím opravuje. Může pÅ™ekroÄit vÄ›tÅ¡inu terénu. +unit.arkyid.description = Střílí velké mířené laserové paprsky na nepřátele, a zároveň se tím opravuje. Může pÅ™ekroÄit vÄ›tÅ¡inu terénu. +unit.toxopid.description = Střílí na nepřátele velké energetické kazetové stÅ™ely a lasery pronikající brnÄ›ním. Může pÅ™ekroÄit vÄ›tÅ¡inu z terénů. +unit.flare.description = Střílí základní stÅ™ely na okolní nepřátele. +unit.horizon.description = PouÅ¡tí shluky bomb na pozemní cíle. +unit.zenith.description = Střílí salvy raket na vÅ¡echny blízké nepřátele. +unit.antumbra.description = Střílí palbu stÅ™el na vÅ¡echny blízké nepřátele. +unit.eclipse.description = VystÅ™elí dva pronikavé lasery a záplavu protivzduÅ¡ných stÅ™el na vÅ¡echny blízké nepřátele. +unit.mono.description = SamoÄinnÄ› těží mÄ›Ä a olovo a ukládá je do jádra. +unit.poly.description = SamoÄinnÄ› obnovuje zniÄené konstrukce a pomáhá ostatním jednotkám pÅ™i stavbÄ›. +unit.mega.description = SamoÄinnÄ› opravuje poÅ¡kozené konstrukce. Je schopný pÅ™enést bloky a malé pozemní jednotky. +unit.quad.description = PouÅ¡tí velké bomby na pozemní cíle, opravuje spojenecké konstrukce a poÅ¡kozuje nepřátele. Je schopen pÅ™enést stÅ™ednÄ› velké pozemní jednotky. +unit.oct.description = Chrání blízké spojence pomocí regeneraÄního Å¡títu. Je schopen pÅ™enést vÄ›tÅ¡inu pozemních jednotek. +unit.risso.description = Střílí palbu raket a stÅ™el na vÅ¡echny blízké nepřátele. +unit.minke.description = Střílí patrony a základní stÅ™ely na blízké pozemní cíle. +unit.bryde.description = Střílí na nepřátele dÄ›lostÅ™elecké granáty a rakety dlouhého doletu. +unit.sei.description = Střílí na nepřátele palbu raket a průbojných stÅ™el. +unit.omura.description = Střílí na nepřátele průrazné Å¡rouby s dlouhým doletem. Vytváří jednotky Záře. +unit.alpha.description = Brání jádro OdÅ¡tÄ›pek pÅ™ed nepřáteli. Staví konstrukce. +unit.beta.description = Brání jádro Základ pÅ™ed nepřáteli. Staví konstrukce. +unit.gamma.description = Brání jádro Atom pÅ™ed nepřáteli. Staví konstrukce. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 0e9d2ce889..d7937f0154 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1,27 +1,27 @@ credits.text = Lavet af [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Credits -contributors = Oversættere og Bidragsyder +contributors = Oversættere og bidragsyder discord = Tilmeld dig Mindustry Discord! link.discord.description = Det officielle Mindustry Discord chatrum link.reddit.description = Mindustry subreddit -link.github.description = Spillets source code +link.github.description = Spillets kildekode link.changelog.description = Liste over opdateringer link.dev-builds.description = Ustabile development builds -link.trello.description = Det officielle Trello board for planlagte udvidelser -link.itch.io.description = itch.io side med PC downloads -link.google-play.description = Google Play store -link.f-droid.description = F-Droid katalog -link.wiki.description = Det officielle Mindustry wiki +link.trello.description = Det officielle Trello-board for planlagte udvidelser +link.itch.io.description = Mindustry's Itch.io-side, med muligheder for download +link.google-play.description = Google Play Store +link.f-droid.description = F-Droid-katalog +link.wiki.description = Det officielle Mindustry-wiki link.suggestions.description = ForeslÃ¥ nye ændringer linkfail = Kunne ikke Ã¥bne link!\n Linkets URL er kopieret til din udklipsholder. screenshot = Screenshot gemt i {0} -screenshot.invalid = Banen er for stor, der er ikke nok hukommelse til screenshot. +screenshot.invalid = Banen er for stor; der er ikke nok hukommelse til et skærmbillede. gameover = Game Over gameover.pvp = [accent] {0}[] hold har vundet! highscore = [accent]Ny highscore! -copied = kopieret. +copied = Kopieret. indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Denne del af spillet er ikke klar endnu. load.sound = Lyd load.map = Bane @@ -31,9 +31,9 @@ load.system = System load.mod = Mods load.scripts = Scripts -be.update = En ny Bleeding Edge version er tilgængelig: -be.update.confirm = Download den og genstart nu? -be.updating = Opdatere... +be.update = En ny "bleeding edge"-version er tilgængelig: +be.update.confirm = Vil du downloade og genstarte nu? +be.updating = Opdaterer ... be.ignore = Ignorer be.noupdates = Ingen opdateringer fundet be.check = Søg efter opdateringer @@ -41,11 +41,11 @@ be.check = Søg efter opdateringer schematic = Skabelon schematic.add = Gem skabelon... schematics = Skabeloner -schematic.replace = En skabelon med det navn eksistere allerede. Vil du erstatte den? -schematic.exists = A schematic by that name already exists. -schematic.import = Importer skabelon... -schematic.exportfile = Exporter Fil -schematic.importfile = Importer Fil +schematic.replace = En skabelon med det navn eksisterer allerede - vil du erstatte denne? +schematic.exists = En skabelon med det navn eksisterer allerede. +schematic.import = Importer skabelon ... +schematic.exportfile = Exporter fil +schematic.importfile = Importer fil schematic.browseworkshop = Søg i Workshop schematic.copy = Kopier til udklipsholder schematic.copy.import = Importer fra udklipsholder @@ -55,36 +55,37 @@ schematic.saved = Skabelon gemt. schematic.delete.confirm = Denne skabelon vil være væk for altid. schematic.rename = Omdøb skabelon schematic.info = {0}x{1}, {2} blokke +schematic.disabled = [scarlet]Skabeloner er slÃ¥et fra.[]\nDu har ikke lov til at bruge skabeloner pÃ¥ denne [accent]bane[] eller [accent]server. -stat.wave = Invasionsbølger nedslÃ¥et:[accent] {0} +stat.wave = Invasionsbølger overvundet:[accent] {0} stat.enemiesDestroyed = Fjender nedlagt:[accent] {0} stat.built = Bygninger opført:[accent] {0} stat.destroyed = Bygninger ødelagt:[accent] {0} stat.deconstructed = Bygninger nedrevet:[accent] {0} stat.delivered = Ressourcer afsendt: stat.playtime = Spilletid:[accent] {0} -stat.rank = Endelig Rang: [accent]{0} +stat.rank = Endelig rang: [accent]{0} -globalitems = [accent]Global Items -map.delete = Er du sikker pÃ¥ at du vil slette banen"[accent]{0}[]"? -level.highscore = High Score: [accent]{0} +globalitems = [accent]Globale Genstande +map.delete = Er du sikker pÃ¥ at du vil slette banen, "[accent]{0}[]"? +level.highscore = High-score: [accent]{0} level.select = Vælg bane level.mode = Spiltilstand: -coreattack = < Kerne er under angreb!! > +coreattack = < Kerne er under angreb! > nearpoint = [[ [scarlet]FORLAD INVASIONSZONE OMGÃ…ENDE[] ]\n Fare for udslettelse -database = Kerne database +database = Kerne-database savegame = Gem spil loadgame = Hent spil joingame = Deltag i spil -customgame = Bregerdefineret spil +customgame = Brugerdefinerede spil newgame = Nyt spil none = minimap = Kort position = Position close = Luk -website = Webside +website = Hjemmeside quit = Afslut -save.quit = Gem & afslut +save.quit = Gem og afslut maps = Baner maps.browse = Søg i baner continue = Fortsæt @@ -94,41 +95,40 @@ pickcolor = Vælg farve preparingconfig = Klargører konfiguration preparingcontent = Klargører indhold uploadingcontent = Uploading indhold -uploadingpreviewfile = Uploading ForhÃ¥ndsvisnings File +uploadingpreviewfile = Uploader forhÃ¥ndsvisnings-fil committingchanges = Sender ændringer done = Færdig feature.unsupported = Din enhed understøtter ikke denne funktion -mods.alphainfo = Vær opmærksom pÃ¥ at mods ikke er færdigudviklet.[scarlet]De kan indeholde mange fejl[].\n Hvis du oplever fejl can du reportére dem pÃ¥ Mindustry GitHub eller Discord. -mods.alpha = [accent](Alpha) +mods.alphainfo = Vær opmærksom pÃ¥, at mods ikke er færdigudviklede. [scarlet]De kan indeholde mange fejl[].\n Hvis du oplever fejl, kan du rappertere dem pÃ¥ Mindustrys GitHub-side eller Discord. mods = Mods mods.none = [LIGHT_GRAY]Ingen mods fundet! -mods.guide = Modding guide -mods.report = Reportér fejl +mods.guide = Modding-guide +mods.report = Rapportér fejl mods.openfolder = Ã…ben mod mappe -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reload = Genindlæs +mods.reloadexit = Spillet vil nu genstarte, for at indlæse mods. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Aktiveret mod.disabled = [scarlet]Deaktiveret mod.disable = Deaktiver -mod.content = Content: -mod.delete.error = Kan ikke slette mod. Filer er muligvis i brug. -mod.requiresversion = [scarlet]Behøver minimal spil version: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.content = Indhold: +mod.delete.error = Kan ikke slette mod - tilhørende filer er muligvis i brug. +mod.requiresversion = [scarlet]Kræver mindst følgende version: [accent]{0} +mod.outdated = [scarlet]Ikke kompatibel med V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Mangler afhængigheder: {0} mod.erroredcontent = [scarlet]Indholds fejl mod.errors = Fejl ved afhentning af indhold. mod.noerrorplay = [scarlet]Du har mods med fejl.[] Deaktiver det eller løs fejl før du starter spillet. -mod.nowdisabled = [scarlet]Mod '{0}' mangler afhængigheder:[accent] {1}\n[lightgray]Disse mods skal hentes først.\nDette mod vil blive deaktiver automatisk. +mod.nowdisabled = [scarlet]Mod '{0}' mangler afhængigheder:[accent] {1}\n[lightgray]Disse mods skal hentes først.\nDenne mod vil blive deaktiveret automatisk. mod.enable = Aktiver mod.requiresrestart = Spillet vil nu lukke for at tilføje mod ændringerne mod.reloadrequired = [scarlet]Genindlæsning pÃ¥krævet -mod.import = Importer Mod -mod.import.file = Import File -mod.import.github = Importer GitHub Mod -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! -mod.item.remove = Denne genstand er tilføjet af [accent] '{0}'[] mod. Afinstaller mod for at fjerne den. +mod.import = Importer mod +mod.import.file = Importer fil +mod.import.github = Importer mod fra GitHub +mod.jarwarn = [scarlet]JAR er ekstraordinært usikre.[]\nVær sikker pÃ¥ at kilden er troværdig! +mod.item.remove = Denne genstand er tilføjet af [accent] '{0}'[]. Afinstallér denne mod for at fjerne den. mod.remove.confirm = Dette mod vil blive slettet. mod.author = [LIGHT_GRAY]Forfatter:[] {0} mod.missing = Dette spil benytter mods som ikke er tilgængelige. Er du sikker pÃ¥ at du vil hente det? Dette kan medfører fejl i spillet\n[lightgray]Mods:\n{0} @@ -139,8 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Om name = Navn: noname = Vælg et[accent] spiller navn[] først. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Planet-kort +launchcore = Affyr kerne filename = Fil navn: unlocked = Nyt indhold tilgængeligt! completed = [accent]Færdiggjort @@ -148,39 +148,39 @@ techtree = Teknologi træ research.list = [lightgray]Forskning: research = Udforsk researched = [lightgray]{0} Udforsket. -research.progress = {0}% complete +research.progress = {0}% færdiggjort players = {0} spillere players.single = {0} spiller players.search = search -players.notfound = [gray]no players found +players.notfound = [gray]Ingen spillere fundet. server.closing = [accent]Lukker server... -server.kicked.kick = Du er blevet kicked fra serveren! -server.kicked.whitelist = Du er ikke whitelisted her. +server.kicked.kick = Du er blevet sparket ud af serveren! +server.kicked.whitelist = Du er ikke pÃ¥ gæstelisten her. server.kicked.serverClose = Server lukket. -server.kicked.vote = Du er blevet vote-kicked. Farvel. -server.kicked.clientOutdated = Forældet client! Opdater dit spil! -server.kicked.serverOutdated = Forældet server! FÃ¥ værten til at opdatere! -server.kicked.banned = Du er banned pÃ¥ denne server. +server.kicked.vote = Du er blevet stemt ud af serveren. Hygge-hejsa. +server.kicked.clientOutdated = Forældet klient! Opdater dit spil! +server.kicked.serverOutdated = Forældet server! FÃ¥ værten til at opdatere serveren! +server.kicked.banned = Du er banlyst fra denne server. server.kicked.typeMismatch = Denne server er ikke kompatibel med din version. -server.kicked.playerLimit = Denne server are fuld. Vent pÃ¥ en ledig plads. -server.kicked.recentKick = Du er blevet kicked for nylig.\nVent før du forsøger at forbinde igen. +server.kicked.playerLimit = Denne server er fuld - vent pÃ¥ en ledig plads. +server.kicked.recentKick = Du er blevet sparket ud for nylig.\nVent før du forsøger at forbinde igen. server.kicked.nameInUse = Der er allerede nogen med dette navn\npÃ¥ denne server. server.kicked.nameEmpty = Det valgte navn er ugyldigt. -server.kicked.idInUse = Du er allered pÃ¥ denne server! Det er ikke tilladt er forbinde med flere konti. -server.kicked.customClient = Denne server understøtter ikke brugerdefineret versioner. Download en officiel version. +server.kicked.idInUse = Du er allerede pÃ¥ denne server! Det er ikke tilladt er forbinde fra flere klienter. +server.kicked.customClient = Denne server understøtter ikke brugerdefinerede versioner. Download en officiel version af spillet. server.kicked.gameover = Game over! -server.kicked.serverRestarting = Server genstarter. -server.versions = Din version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = [accent]Afhold[] knappen starter en server pÃ¥ port [scarlet]6567[]. Enhver pÃ¥ samme [lightgray]wifi elle lokalt netværk[] burde kunne se din server i deres server liste.\n\n[accent]Port forwarding[]er pÃ¥krævet. Hvis du ønsker at spillere fra hele verden skal kunne forbinde med IP\n\n[lightgray]Note: Hvis nogen har problemer med at forbinde til din LAN server, sørg for at you har tilladt Mindustry adgang til dit lokale netværk i dine firewall indstillinger. -join.info = Her kan du forbinde til en [accent]server IP[], eller finde [accent]lokal netværk[] servers.\nBÃ¥de LAN og WAN multiplayer understøttes.\n\n[lightgray]Note: Der er ingen automatisk global server liste; Hvis du ønsker at forbinde til nogen med IP, skal du spørge værten om serverens IP. -hostserver = Afhold Multiplayer Spil +server.kicked.serverRestarting = Serveren genstarter. +server.versions = Din version:[accent] {0}[]\nServerens version:[accent] {1}[] +host.info = [accent]Afhold[]-knappen starter en server pÃ¥ port [scarlet]6567[]. Enhver pÃ¥ samme [lightgray]internet eller lokale netværk[] burde kunne se din server i deres server-liste.\n\n[accent]Port forwarding[]er pÃ¥krævet, hvis du ønsker, at spillere fra hele verden skal kunne forbinde via IP\n\n[lightgray]Note: Hvis nogen har problemer med at forbinde til din LAN-server, sÃ¥ sørg for, at du har tilladt Mindustry adgang til dit lokale netværk i dine firewall-indstillinger. +join.info = Her kan du forbinde til en [accent]server-IP[], eller finde servere pÃ¥ dit [accent]lokale netværk[].\nBÃ¥de LAN- og WAN-flerspilleri understøttes.\n\n[lightgray]Note: Der er ingen automatisk, global server-liste; Hvis du ønsker at forbinde til en server via IP, skal du spørge værten om serverens IP. +hostserver = Ã…ben multiplayer-spil invitefriends = Inviter venner hostserver.mobile = Afhold\nspil host = Afhold hosting = [accent]Starter server... hosts.refresh = Genindlæs -hosts.discovering = Finder LAN spil -hosts.discovering.any = Discovering games +hosts.discovering = Finder LAN-spil +hosts.discovering.any = Udforsker spil server.refreshing = Genindlæser server hosts.none = [lightgray]Ingen lokale spil fundet! host.invalid = [scarlet]Kan ikke forbinde til vært. @@ -190,341 +190,347 @@ servers.remote = Afsides Servere servers.global = Globale Servere trace = Følg spiller -trace.playername = Spiller navn: [accent]{0} +trace.playername = Spiller-navn: [accent]{0} trace.ip = IP: [accent]{0} trace.id = Unik ID: [accent]{0} trace.mobile = Mobil client: [accent]{0} -trace.modclient = Brugerdefineret client: [accent]{0} -invalidid = Ugyldig client ID! Indsend en fejlrapport. -server.bans = Bans +trace.modclient = Brugerdefineret klient: [accent]{0} +invalidid = Ugyldig klient-ID! Indsend en fejlrapport. +server.bans = Banlysninger server.bans.none = Ingen banned Spillere fundet! -server.admins = Admins -server.admins.none = Ingen admins fundet! +server.admins = Administratorer +server.admins.none = Ingen administratorer fundet! server.add = Tilføj server -server.delete = Er du sikker pÃ¥ at du ønsker at slette denne server? +server.delete = Er du sikker pÃ¥, at du ønsker at slette denne server? server.edit = Rediger server server.outdated = [crimson]Forældet server![] server.outdated.client = [crimson]Forældet client![] server.version = [gray]v{0} {1} server.custombuild = [accent]Brugerdefineret version -confirmban = Er du sikker pÃ¥ at du ønsker at banne denne spiller? -confirmkick = Er du sikker pÃ¥ at du ønsker at kicke denne spiller? -confirmvotekick = Er du sikker pÃ¥ at du ønsker at vote-kicke denne spiller? -confirmunban = Er du sikker pÃ¥ at du ønsker at unbanne denne spiller? -confirmadmin = Er du sikker pÃ¥ at du ønsker at gøre denne spiller til admin? -confirmunadmin = Er du sikker pÃ¥ at du ønsker at fjerne admin status fra denne spiller? +confirmban = Er du sikker pÃ¥, at du ønsker at banne denne spiller? +confirmkick = Er du sikker pÃ¥, at du ønsker at kicke denne spiller? +confirmvotekick = Er du sikker pÃ¥, at du ønsker at vote-kicke denne spiller? +confirmunban = Er du sikker pÃ¥, at du ønsker at fjerne banlysning af denne spiller? +confirmadmin = Er du sikker pÃ¥, at du ønsker at gøre denne spiller til administrator? +confirmunadmin = Er du sikker pÃ¥ at du ønsker at fjerne administrator-rolle fra denne spiller? joingame.title = Deltag i spil joingame.ip = Addresse: disconnect = Afbryd forbindelse -disconnect.error = Forbindelses fejl. +disconnect.error = Forbindelsesfejl. disconnect.closed = Forbindelse afbrudt. disconnect.timeout = Maksimal ventetid overskredet. -disconnect.data = Failed to load world data! -cantconnect = Unable to join game ([accent]{0}[]). -connecting = [accent]Connecting... -connecting.data = [accent]Loading world data... +disconnect.data = Kunne ikke indlæse bane-data! +cantconnect = Kunne ikke deltage i spil ([accent]{0}[]). +connecting = [accent]Forbinder... +connecting.data = [accent]Indlæser bane-data... server.port = Port: -server.addressinuse = Address already in use! -server.invalidport = Invalid port number! -server.error = [crimson]Error hosting server. -save.new = New Save -save.overwrite = Are you sure you want to overwrite\nthis save slot? -overwrite = Overwrite -save.none = No saves found! -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} -editmessage = Edit Message -save.corrupted = Save file corrupted or invalid! +server.addressinuse = IP-adressen er allerede i brug! +server.invalidport = Ugyldigt port-nummer! +server.error = [crimson]Der skete en fejl. +save.new = Nyt gem +save.overwrite = Er du sikker pÃ¥, at du vil overskrive\ndette gem? +overwrite = Overskriv +save.none = Ingen gem fundet! +savefail = Kunne ikke gemme spil! +save.delete.confirm = Er du sikker pÃ¥ at du vil slette dette gem? +save.delete = Slet +save.export = Eksporter gem +save.import.invalid = [accent]Dette gem er i stykker! +save.import.fail = [crimson]Kunne ikke importere gem: [accent]{0} +save.export.fail = [crimson]Kunne ikke eksportere gem: [accent]{0} +save.import = Import Gem +save.newslot = Gem-navn: +save.rename = Omdøb +save.rename.text = Nyt navn: +selectslot = Vælg et gem. +slot = [accent]Gem {0} +editmessage = Ændr besked +save.corrupted = Gem-filen er ugyldig eller i stykker! empty = -on = On -off = Off -save.autosave = Autosave: {0} -save.map = Map: {0} -save.wave = Wave {0} -save.mode = Gamemode: {0} -save.date = Last Saved: {0} -save.playtime = Playtime: {0} -warning = Warning. -confirm = Confirm -delete = Delete -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing -ok = OK -open = Open +on = Til +off = Fra +save.autosave = Auto-gem: {0} +save.map = Bane: {0} +save.wave = Bølge {0} +save.mode = Spil-tilstand: {0} +save.date = Sidste gem: {0} +save.playtime = Spiltid: {0} +warning = Advarsel. +confirm = Bekræft +delete = Slet +view.workshop = Se pÃ¥ Workshop +workshop.listing = Ændr Workshop-indlæg +ok = Okay +open = Ã…ben customize = Customize Rules -cancel = Cancel -openlink = Open Link -copylink = Copy Link -back = Back -data.export = Export Data -data.import = Import Data -data.openfolder = Open Data Folder -data.exported = Data exported. -data.invalid = This isn't valid game data. -data.import.confirm = Importing external data will overwrite[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. -quit.confirm = Are you sure you want to quit? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] -loading = [accent]Loading... -reloading = [accent]Reloading Mods... -saving = [accent]Saving... -respawn = [accent][[{0}][] to respawn in core -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building -wave = [accent]Wave {0} -wave.waiting = [lightgray]Wave in {0} -wave.waveInProgress = [lightgray]Wave in progress -waiting = [lightgray]Waiting... -waiting.players = Waiting for players... -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[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. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): -eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +cancel = Afblæs +openlink = Ã…ben Link +copylink = Kopier Link +back = Tilbage +data.export = Eksporter data +data.import = Importer data +data.openfolder = Ã…ben datamappe. +data.exported = Data eksporteret. +data.invalid = Dette er ikke acceptabel spildata. +data.import.confirm = Import af ekstern spildata vil slette[scarlet] alt[] dit nuværende fremskridt.\n[accent]Dette kan ikke gøres om![]\n\nSÃ¥ snart din data er importeret, vil spillet lukke. +quit.confirm = Er du sikker pÃ¥ at du vil afslutte? +quit.confirm.tutorial = Er du sikker pÃ¥, at du ved, hvad du har gang i?\nDette kursus kan blive gentaget i[accent] Indstillinger->Spil->Gentag Kursus.[] +loading = [accent]Indlæser... +reloading = [accent]Genindlæser mods... +saving = [accent]Gemmer... +respawn = [accent][[{0}][] for at genopstÃ¥ ved kernen +cancelbuilding = [accent][[{0}][] for at rydde plan +selectschematic = [accent][[{0}][] for at etablere skabelon +pausebuilding = [accent][[{0}][] for at pause byggeproces +resumebuilding = [scarlet][[{0}][] for at genoptage byggeproces +wave = [accent]Bølge {0} +wave.cap = [accent]Bølge {0}/{1} +wave.waiting = [lightgray]Bølge om {0} +wave.waveInProgress = [lightgray]Bølge i gang +waiting = [lightgray]Venter... +waiting.players = Venter pÃ¥ spillere... +wave.enemies = [lightgray]{0} Fjender tilbage +wave.enemy = [lightgray]{0} Fjende tilbage +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. +loadimage = Indlæs billede +saveimage = Gem billede +unknown = Ukendt +custom = Brugerdefineret +builtin = Indbygget +map.delete.confirm = Er du sikker pÃ¥, at du vil slette dette spil? Dette kan ikke blive genskabt! +map.random = [accent]Tilfældig bane +map.nospawn = Denne bane har ikke nogen kerne, spillere kan opstÃ¥ fra! Tilføj en [accent]orange[] kerne til denne bane via bane-editoren. +map.nospawn.pvp = Denne bane har ikke nogen kerne, modstandere kan opstÃ¥ fra! Tilføj en [SCARLET]ikke-orange[] kerne til banen via bane-editoren. +map.nospawn.attack = Denne bane har ikke nogen kerne, spillerne kan angribe! Tilføj en [SCARLET]rød[] kerne til banen via bane-editoren. +map.invalid = Kunne ikke indlæse bane: bane-filen er i stykker. +workshop.update = Opdater genstand +workshop.error = Der skete en fejl ved indlæsning af Workshop-detaljer: {0} +map.publish.confirm = Er du sikker pÃ¥, at du vil offentliggøre denne bane?\n\n[lightgray]Vær sikker pÃ¥, at du overholder Workshop-EULA'en først, for at din bane kan blive godkendt! +workshop.menu = Vælg hvad du vil gøre med denne genstand. +workshop.info = Genstands-Info +changelog = Changelog (ikke pÃ¥krævet): +eula = Steam-EULA +missing = Denne genstand er blevet slettet eller rykket.\n[lightgray]Workshop-indlægget er blevet automatisk frakoblet. +publishing = [accent]Offentliggør... +publish.confirm = Er du sikker pÃ¥, at du vil offentliggøre dette?\n\n[lightgray]Vær sikker pÃ¥, at du overholder Workshop-EULA'en først, for at dit indlæg kan blive godkendt! +publish.error = Der skete en fejl ved offentliggørelsen: {0} +steam.error = Kunne ikke etablere Steam-forbindelse.\nFejl: {0} -editor.brush = Brush -editor.openin = Open In Editor -editor.oregen = Ore Generation -editor.oregen.info = Ore Generation: -editor.mapinfo = Map Info -editor.author = Author: -editor.description = Description: -editor.nodescription = A map must have a description of at least 4 characters before being published. -editor.waves = Waves: -editor.rules = Rules: -editor.generation = Generation: -editor.ingame = Edit In-Game -editor.publish.workshop = Publish On Workshop -editor.newmap = New Map +editor.brush = Pensel +editor.openin = Ã…ben i editor +editor.oregen = Malm-generering +editor.oregen.info = Malm-generering: +editor.mapinfo = Bane-info +editor.author = Skaber: +editor.description = Beskrivelse: +editor.nodescription = En banes beskrivelse skal være længere end 4 tegn, for at kunne blive offentliggjort. +editor.waves = Bølge: +editor.rules = Regler: +editor.generation = Generering: +editor.ingame = Ændr i spil +editor.publish.workshop = Publicer pÃ¥ Workshop +editor.newmap = Ny bane +editor.center = Center workshop = Workshop -waves.title = Waves -waves.remove = Remove -waves.never = -waves.every = every -waves.waves = wave(s) -waves.perspawn = per spawn -waves.shields = shields/wave -waves.to = to -waves.guardian = Guardian -waves.preview = Preview -waves.edit = Edit... -waves.copy = Copy to Clipboard -waves.load = Load from Clipboard -waves.invalid = Invalid waves in clipboard. -waves.copied = Waves copied. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.title = Bølger +waves.remove = Fjern +waves.never = +waves.every = hver +waves.waves = bølge(r) +waves.perspawn = per opstandelsessted +waves.shields = skjold/bølge +waves.to = til +waves.guardian = Vogter +waves.preview = ForhÃ¥ndsvisning +waves.edit = Rediger... +waves.copy = Kopier til udklipsholder +waves.load = Indlæs fra udklipsholder +waves.invalid = Ugyldige bølger i udklipsholder. +waves.copied = Bølger kopieret. +waves.none = Ingen fjender defineret.\nBemærk at bølger uden fjender automatisk erstattes af standard-layoutet. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +wavemode.counts = tal +wavemode.totals = i alt +wavemode.health = liv -editor.default = [lightgray] -details = Details... -edit = Edit... -editor.name = Name: -editor.spawn = Spawn Unit -editor.removeunit = Remove Unit -editor.teams = Teams -editor.errorload = Error loading file. -editor.errorsave = Error saving file. -editor.errorimage = That's an image, not a map.\n\nIf you want to import a 3.5/build 40 map, use the 'Import Legacy Map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. -editor.errornot = This is not a map file. -editor.errorheader = This map file is either not valid or corrupt. -editor.errorname = Map has no name defined. Are you trying to load a save file? -editor.update = Update -editor.randomize = Randomize -editor.apply = Apply -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. -editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! -editor.import = Import... -editor.importmap = Import Map +editor.default = [lightgray] +details = Detaljer... +edit = Rediger... +editor.name = Navn: +editor.spawn = PÃ¥kald enhed +editor.removeunit = Fjern enhed +editor.teams = Hold +editor.errorload = Fejl ved indlæsning af fil. +editor.errorsave = Fejl ved eksportering af fil. +editor.errorimage = Det er et billede, ikke en bane.\n\nHvis du vil importere en bane fra 3.5/en build-40-bane, sÃ¥ brug knappen 'Importer eftermægle-bane' i editoren. +editor.errorlegacy = Denne bane er forældet, og bruger et eftermægle-format, der ikke længere understøttes. +editor.errornot = Dette er ikke en bane-fil. +editor.errorheader = Denne bane er enten ugyldig eller i stykker. +editor.errorname = Banen har ikke noget navn. Forsøger du at gemme filen? +editor.update = Opdater +editor.randomize = Tilfældiggør +editor.apply = Anvend +editor.generate = Generer +editor.resize = Omskaler +editor.loadmap = Indlæs bane +editor.savemap = Gem bane +editor.saved = Gemt! +editor.save.noname = Din bane har intet navn! Giv den et navn under 'bane-information'-menuen. +editor.save.overwrite = Din bane overskriver en indbygget bane! Vælge et andet navn under 'bane-information'-menuen. +editor.import.exists = [scarlet]Kunne ikke importere:[] en indbygget bane ved navn '{0}' eksisterer allerede! +editor.import = Importer... +editor.importmap = Importer bane editor.importmap.description = Import an already existing map -editor.importfile = Import File -editor.importfile.description = Import an external map file -editor.importimage = Import Legacy Map -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 = 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.importfile = Importer fil +editor.importfile.description = Importer en ekstern bane-fil +editor.importimage = Importer eftermægle-bane +editor.importimage.description = Importer en ekstern bane-billed-fil +editor.export = Exporter... +editor.exportfile = Exporter fil +editor.exportfile.description = Eksporter bane-fil +editor.exportimage = Eksporter terræn-billede +editor.exportimage.description = Eksporter en bane-billed-fil +editor.loadimage = Importer terræn +editor.saveimage = Eksporter terræn +editor.unsaved = [scarlet]Du har ændringer, der ikke er gemt![]\nEr du sikker pÃ¥, at du vil afbryde? +editor.resizemap = Omskaler bane editor.mapname = Map Name: -editor.overwrite = [accent]Warning!\nThis overwrites an existing map. -editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? -editor.exists = A map with this name already exists. -editor.selectmap = Select a map to load: +editor.overwrite = [accent]Advarsel!\nDenne fil overskrider en eksisterende bane. +editor.overwrite.confirm = [scarlet]Advarsel![] En bane med dette navn eksisterer allerede. Er du sikker pÃ¥, at du vil overskrive det? +editor.exists = En bane med dette navn eksisterer allerede. +editor.selectmap = Vælg en bane, du vil indlæse: -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 = Erstat +toolmode.replace.description = Tegner udelukkende pÃ¥ solide blokke. +toolmode.replaceall = Erstat alt +toolmode.replaceall.description = Erstatter alle blokke i banen. +toolmode.orthogonal = Retvinklet +toolmode.orthogonal.description = Tegner kun retvinklede linjer. +toolmode.square = Kvadrat +toolmode.square.description = Kvadrat-pensel. +toolmode.eraseores = Udvisk malm +toolmode.eraseores.description = Udvisker udelukkende malm. +toolmode.fillteams = Udfyld hold +toolmode.fillteams.description = Udfylder hold i stedet for blokke. +toolmode.drawteams = Tegn hold +toolmode.drawteams.description = Tegner hold i stedet for blokke. -filters.empty = [lightgray]No filters! Add one with the button below. -filter.distort = Distort -filter.noise = Noise -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filters.empty = [lightgray]Ingen filtre! Tilføj filter nedenfor. +filter.distort = Forvræng +filter.noise = Støj +filter.enemyspawn = Fjendtligt opstandelsessted-vælger +filter.spawnpath = Sti til opstandelse +filter.corespawn = Kerne-valg filter.median = Median -filter.oremedian = Ore Median -filter.blend = Blend -filter.defaultores = Default Ores -filter.ore = Ore -filter.rivernoise = River Noise -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore -filter.scatter = Scatter -filter.terrain = Terrain -filter.option.scale = Scale +filter.oremedian = Malm-median +filter.blend = Blanding +filter.defaultores = Standard-malm +filter.ore = Malm +filter.rivernoise = Flod-støj +filter.mirror = Spejl +filter.clear = Ryd +filter.option.ignore = Ignorer +filter.scatter = Spreder +filter.terrain = Terræn +filter.option.scale = Skaler filter.option.chance = Chance -filter.option.mag = Magnitude -filter.option.threshold = Threshold -filter.option.circle-scale = Circle Scale -filter.option.octaves = Octaves -filter.option.falloff = Falloff -filter.option.angle = Angle -filter.option.amount = Amount -filter.option.block = Block -filter.option.floor = Floor -filter.option.flooronto = Target Floor -filter.option.wall = Wall -filter.option.ore = Ore -filter.option.floor2 = Secondary Floor -filter.option.threshold2 = Secondary Threshold +filter.option.mag = Størrelse +filter.option.threshold = Tærskel +filter.option.circle-scale = Cirkel-skaler +filter.option.octaves = Oktaver +filter.option.falloff = Frafald +filter.option.angle = Vinkel +filter.option.amount = Mængde +filter.option.block = Blok +filter.option.floor = Gulv +filter.option.flooronto = Udvalgt gulv +filter.option.target = MÃ¥l +filter.option.wall = Mur +filter.option.ore = Malm +filter.option.floor2 = Sekundært gulv +filter.option.threshold2 = Sekundær terskel filter.option.radius = Radius -filter.option.percentile = Percentile +filter.option.percentile = Percentil -width = Width: -height = Height: +width = Bredde: +height = Højde: menu = Menu -play = Play -campaign = Campaign -load = Load -save = Save +play = Spil +campaign = Kampagne +load = Indlæs +save = Gem fps = FPS: {0} 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 +language.restart = Genstart spillet, sÃ¥ sprog-ændring kan træde i kraft. +settings = Indstillinger +tutorial = Kursus +tutorial.retake = Gentag Kursus editor = Editor -mapeditor = Map Editor +mapeditor = Bane-editor -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [lightgray]Complete: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} +abandon = Forlad +abandon.text = Denne zone og alle tilhørende resurser tilfalder fjenden. +locked = LÃ¥st +complete = [lightgray]Færdiggjort: +requirement.wave = NÃ¥ bølge {0} i {1} +requirement.core = Destruer fjendens kerne i {0} requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} -bestwave = [lightgray]Best Wave: {0} -launch = < LAUNCH > -launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. -uncover = Uncover -configure = Configure Loadout -loadout = Loadout -resources = Resources -bannedblocks = Banned Blocks -addall = Add All +requirement.capture = Overtag {0} +bestwave = [lightgray]Bedste bølge: {0} +launch.text = Affyr +research.multiplayer = Kun værten kan researche genstande. +uncover = Afdæk +configure = Konfigurer udrustning +loadout = Udrustning +resources = Resurser +bannedblocks = Banlyste blokke +addall = Tilføj alle launch.destination = Destination: {0} -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [lightgray]{0} unlocked. -zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} -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 +configure.invalid = Mængde skal være mellem 0 og {0}. +zone.unlocked = [lightgray]{0} oplÃ¥st. +zone.requirement.complete = Forudsætning for {0} opfyldt:[lightgray]\n{1} +zone.resources = [lightgray]Resurser observeret: +zone.objective = [lightgray]MÃ¥l: [accent]{0} +zone.objective.survival = Overlev +zone.objective.attack = Destruer fjendens kerne +add = Tilføj... +boss.health = Vogters helbred -connectfail = [crimson]Connection error:\n\n[accent]{0} -error.unreachable = Server unreachable.\nIs the address spelled correctly? -error.invalidaddress = Invalid address. -error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -error.alreadyconnected = Already connected. -error.mapnotfound = Map file not found! -error.io = Network I/O error. -error.any = Unknown network error. -error.bloom = Failed to initialize bloom.\nYour device may not support it. +connectfail = [crimson]Forbindelsesfejl:\n\n[accent]{0} +error.unreachable = Kunne ikke forbinde til serveren.\nEr adressen mon korrekt indtastet? +error.invalidaddress = Ugyldig adresse. +error.timedout = Tiden udløb!\nTjek om værten har port forwarded ordentligt, og hvorvidt adressen er korrekt indtastet! +error.mismatch = Pakkefejl:\nDette kan skyldes, at klientens version ikke matcher serverens.\nDobbeltjek, at du og værten har samme Mindustry-version! +error.alreadyconnected = Allerede forbundet. +error.mapnotfound = Bane-filen er blevet væk! +error.io = Network I/O-fejl. +error.any = Ukendt netværksfejl. +error.bloom = Kunne ikke etablere bloom-effekt.\nMÃ¥ske understøtter din enhed den ikke. -weather.rain.name = Rain -weather.snow.name = Snow +weather.rain.name = Regn +weather.snow.name = Sne weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = TÃ¥ge sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: +sectors.resources = Resurser: +sectors.production = Produktion: sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.resume = Genoptag +sectors.launch = Affyr +sectors.select = Vælg +sectors.nonelaunch = [lightgray]ingen (solen) +sectors.rename = Omdøb sektor +sector.missingresources = [scarlet]Ikke nok resurser i kernen. + +planet.serpulo.name = Serpulo +planet.sun.name = Solen sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest +sector.craters.name = Kraterne +sector.frozenForest.name = Den Frosne Skov sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains sector.desolateRift.name = Desolate Rift @@ -546,362 +552,381 @@ sector.desolateRift.description = An extremely dangerous zone. Plentiful resourc sector.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. sector.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. -settings.language = Language -settings.data = Game Data -settings.reset = Reset to Defaults +settings.language = Sprog +settings.data = Spildata +settings.reset = Nulstil til standard settings.rebind = Rebind -settings.resetKey = Reset -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.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves -paused = [accent]< Paused > -clear = Clear -banned = [scarlet]Banned -unplaceable.sectorcaptured = [scarlet]Requires captured sector -yes = Yes -no = No +settings.resetKey = Nulstil +settings.controls = Styring +settings.game = Spil +settings.sound = Lyd +settings.graphics = Grafik +settings.cleardata = Ryd spildata... +settings.clear.confirm = Er du helt sikker pÃ¥ at du vil rydde alt data?\nDet, der gøres, kan ikke gøres om! +settings.clearall.confirm = [scarlet]KÆMPE ADVARSEL![]\nDette vil rydde alt data, ogsÃ¥ gem, baner, oplÃ¥ste ting og keybindings.\nSÃ¥ snart du trykker 'ok', vil spillet tilintetgøre alt! +settings.clearsaves.confirm = Er du sikker pÃ¥ at du vil rydde dine gem? +settings.clearsaves = Ryd gem +settings.clearresearch = Ryd research +settings.clearresearch.confirm = Er du sikker pÃ¥, at du vil rydde alt din research? +settings.clearcampaignsaves = Ryd kampagne-gem +settings.clearcampaignsaves.confirm = Er du sikker pÃ¥ at du vil slette alt kampagne-fremskridt? +paused = [accent]< Pauset > +clear = Ryd +banned = [scarlet]Banlyst +unplaceable.sectorcaptured = [scarlet]PÃ¥krævet overtaget sektor +yes = Ja +no = Nej info.title = Info -error.title = [crimson]An error has occured -error.crashtitle = An error has occured -unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +error.title = [crimson]Der er opstÃ¥et en fejl. +error.crashtitle = Der er opstÃ¥et en fejl. +unit.nobuild = [scarlet]Denne enhed kan ikke bygge +lastaccessed = [lightgray]Sidst tilgÃ¥et: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -bar.drilltierreq = Better Drill Required -bar.noresources = Missing Resources -bar.corereq = Core Base Required -bar.drillspeed = Drill Speed: {0}/s -bar.pumpspeed = Pump Speed: {0}/s -bar.efficiency = Efficiency: {0}% -bar.powerbalance = Power: {0}/s -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} -bar.items = Items: {0} -bar.capacity = Capacity: {0} +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = PÃ¥krævet felt +stat.affinities = Affinities +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Skade +stat.targetsair = Skyder flyvere +stat.targetsground = Skyder fodgængere +stat.itemsmoved = Bevægelseshastighed +stat.launchtime = Tid mellem affyringer +stat.shootrange = Rækkevidde +stat.size = Størrelse +stat.displaysize = Visnings-størrelse +stat.liquidcapacity = Væske-kapacitet +stat.powerrange = Kraft-rækkevidde +stat.linkrange = Forbindelsesrækkevidde +stat.instructions = Instruktioner +stat.powerconnections = Max forbindelser +stat.poweruse = Strømforbrug +stat.powerdamage = Strøm/Skade +stat.itemcapacity = Beholdningskapacitet +stat.memorycapacity = Hukommelseskapacitet +stat.basepowergeneration = Grundlæggende strøm-output +stat.productiontime = Produktionstid +stat.repairtime = Block Full Repair Time +stat.speedincrease = Hastigheds-forøgelse +stat.range = Rækkevidde +stat.drilltier = Kan bores +stat.drillspeed = Grundlæggende bore-hastighed +stat.boosteffect = Boost-effekt +stat.maxunits = Max aktive enheder +stat.health = Helbred +stat.buildtime = Bygge-tid +stat.maxconsecutive = Max fortløbende +stat.buildcost = Bygge-pris +stat.inaccuracy = Unøjagtighed +stat.shots = Skud +stat.reload = Skud pr. sekund +stat.ammo = Ammunition +stat.shieldhealth = Skjold-helbred +stat.cooldowntime = Nedkølingstid +stat.explosiveness = Eksplosivitet +stat.basedeflectchance = Grundlæggende reflektions-chance +stat.lightningchance = Lyn-chance +stat.lightningdamage = Lyn-skade +stat.flammability = Brændbarhed +stat.radioactivity = Radioaktivitet +stat.heatcapacity = Varmekapacitet +stat.viscosity = Viskositet +stat.temperature = Temperatur +stat.speed = Hastighed +stat.buildspeed = Bygge-hastighed +stat.minespeed = Mine-hastighed +stat.minetier = Mine-niveau +stat.payloadcapacity = Last-kapacitet +stat.commandlimit = Kommando-grænse +stat.abilities = Evner + +ability.forcefield = Kraftfelt +ability.repairfield = Reparationsfelt +ability.statusfield = Statusfelt +ability.unitspawn = {0} Fabrik +ability.shieldregenfield = Skjold-regenereringsfelt + +bar.drilltierreq = Kræver bedre bor +bar.noresources = Mangler resurser +bar.corereq = Kerne pÃ¥krævet +bar.drillspeed = Borehastighed: {0}/s +bar.pumpspeed = Pumpehastighed: {0}/s +bar.efficiency = Effektivitet: {0}% +bar.powerbalance = Strøm: {0}/s +bar.powerstored = Gemt: {0}/{1} +bar.poweramount = Strøm: {0} +bar.poweroutput = Strøm-output: {0} +bar.powerlines = Forbindelser: {0}/{1} +bar.items = Genstande: {0} +bar.capacity = Kapacitet: {0} bar.unitcap = {0} {1}/{2} bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] -bar.liquid = Liquid -bar.heat = Heat -bar.power = Power -bar.progress = Build Progress +bar.liquid = Væske +bar.heat = Varme +bar.power = Strøm +bar.progress = Byggeproces bar.input = Input bar.output = Output -bullet.damage = [stat]{0}[lightgray] damage -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles -bullet.incendiary = [stat]incendiary -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x fire rate +units.processorcontrol = [lightgray]Processor kontrolleret -unit.blocks = blocks -unit.powersecond = power units/second -unit.liquidsecond = liquid units/second -unit.itemssecond = items/second -unit.liquidunits = liquid units -unit.powerunits = power units -unit.degrees = degrees -unit.seconds = seconds -unit.minutes = mins -unit.persecond = /sec +bullet.damage = [stat]{0}[lightgray] skade +bullet.splashdamage = [stat]{0}[lightgray] omrÃ¥deskade ~[stat] {1}[lightgray] felter +bullet.incendiary = [stat]brændfarlig +bullet.homing = [stat]mÃ¥lsøgende +bullet.shock = [stat]stød +bullet.frag = [stat]splintrende +bullet.knockback = [stat]{0}[lightgray] tilbageslag +bullet.pierce = [stat]{0}[lightgray]x gennemboring +bullet.infinitepierce = [stat]gennemboring +bullet.freezing = [stat]frysende +bullet.tarred = [stat]tjæret +bullet.multiplier = [stat]{0}[lightgray]x ammunitionsfaktor +bullet.reload = [stat]{0}[lightgray]x skydehastighed + +unit.blocks = blokke +unit.blockssquared = blokke² +unit.powersecond = strømenheder/sekund +unit.liquidsecond = væskeenheder/sekund +unit.itemssecond = genstande/sekund +unit.liquidunits = væskeenheder +unit.powerunits = strømenheder +unit.degrees = grader +unit.seconds = sekunder +unit.minutes = minutter +unit.persecond = /sek unit.perminute = /min -unit.timesspeed = x speed +unit.timesspeed = x hastighed unit.percent = % -unit.shieldhealth = shield health -unit.items = items -unit.thousands = k -unit.millions = mil -unit.billions = b -category.general = General -category.power = Power -category.liquids = Liquids -category.items = Items +unit.shieldhealth = skjoldhelbred +unit.items = genstande +unit.thousands = t +unit.millions = mio +unit.billions = mia +category.general = Generel +category.power = Strøm +category.liquids = Væsker +category.items = Genstande category.crafting = Input/Output -category.shooting = Shooting -category.optional = Optional Enhancements -setting.landscape.name = Lock Landscape -setting.shadows.name = Shadows -setting.blockreplace.name = Automatic Block Suggestions -setting.linear.name = Linear Filtering +category.function = Funktion +category.optional = Valgfri Opgraderinger +setting.landscape.name = LÃ¥s Landskab +setting.shadows.name = Skygger +setting.blockreplace.name = Automatiske Blok-forslag +setting.linear.name = Lineær Filtrering setting.hints.name = Hints -setting.flow.name = Display Resource Flow Rate -setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Animated Water -setting.animatedshields.name = Animated Shields -setting.antialias.name = Antialias[lightgray] (requires restart)[] -setting.playerindicators.name = Player Indicators -setting.indicators.name = Enemy/Ally Indicators -setting.autotarget.name = Auto-Target -setting.keyboard.name = Mouse+Keyboard Controls -setting.touchscreen.name = Touchscreen Controls +setting.flow.name = Vis resurse-bevægelses-rate +setting.buildautopause.name = Auto-pause af bygning +setting.animatedwater.name = Animeret vand +setting.animatedshields.name = Animeret skjold +setting.antialias.name = Antialias[lightgray] (kræver genstart)[] +setting.playerindicators.name = Player-indikatorer +setting.indicators.name = Fjende-/venne-indikatorer +setting.autotarget.name = Auto-mÃ¥l +setting.keyboard.name = Mus- og Tasatur-styring +setting.touchscreen.name = Touchscreen-styring setting.fpscap.name = Max FPS setting.fpscap.none = None setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement -setting.difficulty.training = Training -setting.difficulty.easy = Easy +setting.uiscale.name = UI-skalering[lightgray] (genstart kræves)[] +setting.swapdiagonal.name = Altid diagonal placering +setting.difficulty.training = Træning +setting.difficulty.easy = Let 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.destroyedblocks.name = Display Destroyed Blocks -setting.blockstatus.name = Display Block Status -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding -setting.sensitivity.name = Controller Sensitivity -setting.saveinterval.name = Save Interval -setting.seconds = {0} seconds -setting.blockselecttimeout.name = Block Select Timeout -setting.milliseconds = {0} milliseconds -setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.fps.name = Show FPS & Ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys +setting.difficulty.hard = Svær +setting.difficulty.insane = Sindssyg +setting.difficulty.name = Sværhedsgrad: +setting.screenshake.name = Skærm-ryst +setting.effects.name = Vis effekter +setting.destroyedblocks.name = Vis destruerede blokke +setting.blockstatus.name = Vis blokstatus +setting.conveyorpathfinding.name = TransportbÃ¥nd-stifinding +setting.sensitivity.name = Styrepind-sensitivitet +setting.saveinterval.name = Gemme-interval +setting.seconds = {0} sekunder +setting.blockselecttimeout.name = Blokke-valgs-ventetid +setting.milliseconds = {0} millesekunder +setting.fullscreen.name = Fuldskærm +setting.borderlesswindow.name = Kantløst vindue[lightgray] (kræver nok genstart) +setting.fps.name = Vis FPS & Ping +setting.smoothcamera.name = Blødt kamera setting.vsync.name = VSync -setting.pixelate.name = Pixelate -setting.minimap.name = Show Minimap -setting.coreitems.name = Display Core Items (WIP) -setting.position.name = Show Player Position -setting.musicvol.name = Music Volume -setting.atmosphere.name = Show Planet Atmosphere -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.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility -setting.playerlimit.name = Player Limit -setting.chatopacity.name = Chat Opacity -setting.lasersopacity.name = Power Laser Opacity -setting.bridgeopacity.name = Bridge Opacity -setting.playerchat.name = Display Player Bubble Chat -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... -uiscale.cancel = Cancel & Exit +setting.pixelate.name = Pixeler +setting.minimap.name = Vis minikort +setting.coreitems.name = Vis kerne-genstande +setting.position.name = Vis spillerposition +setting.musicvol.name = Musik-volumen +setting.atmosphere.name = Vis planet-atmosfære +setting.ambientvol.name = Stemningslyde-volumen +setting.mutemusic.name = Forstum musik +setting.sfxvol.name = SFX-volumen +setting.mutesound.name = Forstum lyde +setting.crashreport.name = Send anonyme fejlrapporter +setting.savecreate.name = Gem automatisk +setting.publichost.name = Synlighed af offentlige spil +setting.playerlimit.name = Spiller-grænse +setting.chatopacity.name = Chat-gennemsigtighed +setting.lasersopacity.name = Strøm-laser-gennemsigtighed +setting.bridgeopacity.name = Bro-gennemsigtighed +setting.playerchat.name = Vis spillers bobbel-chat +public.confirm = Vil du gøre dit spil offentligt?\n[accent]Alle og enhver vil kunne tilslutte.\n[lightgray]Dette kan ændres senere i Indstillinger->Spil->Synlighed af offentlige spil. +public.beta = Bemærk at beta-versioner af spillet ikke kan tilslutte sig offentlige spil. +uiscale.reset = UI-størrelsen har ændret sig.\nTryk "OK" for at bekræfte størrelsen.\n[scarlet]Omgør og afslutter om[accent] {0}[] sekunder... +uiscale.cancel = Afblæs & Afslut 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 -category.blocks.name = Block Select -command.attack = Attack -command.rally = Rally -command.retreat = Retreat -command.idle = Idle -placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit -keybind.clear_building.name = Clear Building -keybind.press = Press a key... -keybind.press.axis = Press an axis or key... -keybind.screenshot.name = Map Screenshot -keybind.toggle_power_lines.name = Toggle Power Lasers -keybind.toggle_block_status.name = Toggle Block Statuses -keybind.move_x.name = Move X -keybind.move_y.name = Move Y -keybind.mouse_move.name = Follow Mouse -keybind.pan.name = Pan View -keybind.boost.name = Boost -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y -keybind.category_prev.name = Previous Category -keybind.category_next.name = Next Category -keybind.block_select_left.name = Block Select Left -keybind.block_select_right.name = Block Select Right -keybind.block_select_up.name = Block Select Up -keybind.block_select_down.name = Block Select Down -keybind.block_select_01.name = Category/Block Select 1 -keybind.block_select_02.name = Category/Block Select 2 -keybind.block_select_03.name = Category/Block Select 3 -keybind.block_select_04.name = Category/Block Select 4 -keybind.block_select_05.name = Category/Block Select 5 -keybind.block_select_06.name = Category/Block Select 6 -keybind.block_select_07.name = Category/Block Select 7 -keybind.block_select_08.name = Category/Block Select 8 -keybind.block_select_09.name = Category/Block Select 9 -keybind.block_select_10.name = Category/Block Select 10 -keybind.fullscreen.name = Toggle Fullscreen -keybind.select.name = Select/Shoot -keybind.diagonal_placement.name = Diagonal Placement -keybind.pick.name = Pick Block -keybind.break_block.name = Break Block -keybind.deselect.name = Deselect -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command -keybind.shoot.name = Shoot +keybind.title = Rekonfigurer taster +keybinds.mobile = [scarlet]De fleste taster er ikke relevante for mobil. Kun basal bevægelse er understøttet. +category.general.name = Generel +category.view.name = Billede +category.multiplayer.name = Spil med andre +category.blocks.name = Blokvalg +command.attack = Angrib +command.rally = Følg +command.retreat = Retrete +command.idle = Lediggang +placement.blockselectkeys = \n[lightgray]Tast: [{0}, +keybind.respawn.name = GenopstÃ¥ +keybind.control.name = Kontroller enhed +keybind.clear_building.name = Ryd bygning +keybind.press = Tryk pÃ¥ en tast... +keybind.press.axis = Tryk pÃ¥ en styrepind eller tast... +keybind.screenshot.name = Bane-skærmbillede +keybind.toggle_power_lines.name = Visning af strøm-lasere +keybind.toggle_block_status.name = Visning af blokstatus +keybind.move_x.name = Bevæg X +keybind.move_y.name = Bevæg Y +keybind.mouse_move.name = Følg musen +keybind.pan.name = Panorer billede +keybind.boost.name = Forstærk +keybind.schematic_select.name = Vælg region +keybind.schematic_menu.name = Skabelon-visning +keybind.schematic_flip_x.name = Flip skabelon X +keybind.schematic_flip_y.name = Flip skabelon Y +keybind.category_prev.name = Sidste kategori +keybind.category_next.name = Næste kategori +keybind.block_select_left.name = Vælg venstre blok +keybind.block_select_right.name = Vælg højre blok +keybind.block_select_up.name = Vælg øvre blok +keybind.block_select_down.name = Vælg nedre blok +keybind.block_select_01.name = Vælg 1. kategori/blok +keybind.block_select_02.name = Vælg 2. kategori/blok +keybind.block_select_03.name = Vælg 3. kategori/blok +keybind.block_select_04.name = Vælg 4. kategori/blok +keybind.block_select_05.name = Vælg 5. kategori/blok +keybind.block_select_06.name = Vælg 6. kategori/blok +keybind.block_select_07.name = Vælg 7. kategori/blok +keybind.block_select_08.name = Vælg 8. kategori/blok +keybind.block_select_09.name = Vælg 9. kategori/blok +keybind.block_select_10.name = Vælg 10. kategori/blok +keybind.fullscreen.name = Fuldskærmstilstand +keybind.select.name = Vælg/Skyd +keybind.diagonal_placement.name = Diagonal placering +keybind.pick.name = Tag blok +keybind.break_block.name = Ødelæg blok +keybind.deselect.name = Fravælg +keybind.pickupCargo.name = Saml last op +keybind.dropCargo.name = Smid last +keybind.command.name = Kommando +keybind.shoot.name = Skyd keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause -keybind.pause_building.name = Pause/Resume Building -keybind.minimap.name = Minimap +keybind.pause_building.name = Pause/Genoptag bygning +keybind.minimap.name = Minikort keybind.chat.name = Chat -keybind.player_list.name = Player List -keybind.console.name = Console -keybind.rotate.name = Rotate -keybind.rotateplaced.name = Rotate Existing (Hold) -keybind.toggle_menus.name = Toggle Menus -keybind.chat_history_prev.name = Chat History Prev -keybind.chat_history_next.name = Chat History Next -keybind.chat_scroll.name = Chat Scroll -keybind.drop_unit.name = Drop Unit -keybind.zoom_minimap.name = Zoom Minimap -mode.help.title = Description of modes -mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. -mode.sandbox.name = Sandbox -mode.sandbox.description = Infinite resources and no timer for waves. +keybind.player_list.name = Spiller-liste +keybind.console.name = Konsol +keybind.rotate.name = Roter +keybind.rotateplaced.name = Roter eksisterende (hold) +keybind.toggle_menus.name = SlÃ¥ menu til/fra +keybind.chat_history_prev.name = Chat-historie Sidste +keybind.chat_history_next.name = Chat-historie Næste +keybind.chat_scroll.name = Chat-scroll +keybind.drop_unit.name = Smid enhed +keybind.zoom_minimap.name = Zoom Minikort +mode.help.title = Beskrivelse af tilstande +mode.survival.name = Overlevelse +mode.survival.description = Den normale tilstand. Begrænsede resurser og automatisk igangsættelse af bølger.\n[gray]Kræver fjendtlig base for at spille. +mode.sandbox.name = Sandkasse +mode.sandbox.description = Uendelige resurser og ingen tidsbegrænsning for bølger. mode.editor.name = Editor mode.pvp.name = PvP -mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. -mode.attack.name = Attack -mode.attack.description = Destroy the enemy's base. \n[gray]Requires a red core in the map to play. -mode.custom = Custom Rules +mode.pvp.description = Spil mod andre spillere lokalt.\n[gray]Kræver mindst to forskelligt farvede kerner i banen. +mode.attack.name = Angrib +mode.attack.description = Destruer fjendens base. \n[gray]Kræver en rød kerne i banen, for at spille. +mode.custom = Brugerdefinerede regler -rules.infiniteresources = Infinite Resources -rules.reactorexplosions = Reactor Explosions -rules.wavetimer = Wave Timer -rules.waves = Waves -rules.attack = Attack Mode -rules.buildai = AI Building -rules.enemyCheat = Infinite AI (Red Team) Resources -rules.blockhealthmultiplier = Block Health Multiplier -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier -rules.unithealthmultiplier = Unit Health Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier -rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) -rules.wavespacing = Wave Spacing:[lightgray] (sec) -rules.buildcostmultiplier = Build Cost Multiplier -rules.buildspeedmultiplier = Build Speed Multiplier -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier -rules.waitForWaveToEnd = Waves Wait for Enemies -rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) -rules.unitammo = Units Require Ammo -rules.title.waves = Waves -rules.title.resourcesbuilding = Resources & Building -rules.title.enemy = Enemies -rules.title.unit = Units -rules.title.experimental = Experimental -rules.title.environment = Environment -rules.lighting = Lighting -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Ambient Light -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.infiniteresources = Uendelig resurser +rules.reactorexplosions = Reaktor-eksplosioner +rules.schematic = Skabeloner tilladt +rules.wavetimer = Bølge-æggeur +rules.waves = Bølger +rules.attack = Angrebsmode +rules.buildai = AI-bygning +rules.enemyCheat = Uendelig AI (rødt hold) resurser. +rules.blockhealthmultiplier = Blok-helbreds-forstærker. +rules.blockdamagemultiplier = Blok-skade-forstærker. +rules.unitbuildspeedmultiplier = Enheds-produktionshastigheds-forstærker +rules.unithealthmultiplier = Enheds-helbreds-forstærker +rules.unitdamagemultiplier = Enheds-skade-forstærker +rules.enemycorebuildradius = Radius af fjendtlig kernes ubebyggelig zone:[lightgray] (felter) +rules.wavespacing = Bølge spredning:[lightgray] (sek) +rules.buildcostmultiplier = Byggepris-forstærker +rules.buildspeedmultiplier = Byggehastigheds-forstærker +rules.deconstructrefundmultiplier = Dekonstruerings-tilbagebetalings-forstærker +rules.waitForWaveToEnd = Bølge-ventetid for fjender +rules.dropzoneradius = Drop-zone-radius:[lightgray] (felter) +rules.unitammo = Enheder kræver ammunition +rules.title.waves = Bølger +rules.title.resourcesbuilding = Resurser & bygning +rules.title.enemy = Fjender +rules.title.unit = Enheder +rules.title.experimental = Eksperimentel +rules.title.environment = Miljø +rules.lighting = Lys +rules.enemyLights = Fjende-lys +rules.fire = Ild +rules.explosions = Blok/Enheds-eksplosionsskade +rules.ambientlight = Stemningslys +rules.weather = Vejr +rules.weather.frequency = Frekvens: +rules.weather.duration = Varighed: -content.item.name = Items -content.liquid.name = Liquids -content.unit.name = Units -content.block.name = Blocks -item.copper.name = Copper -item.lead.name = Lead -item.coal.name = Coal -item.graphite.name = Graphite +content.item.name = Genstande +content.liquid.name = Væsker +content.unit.name = Enheder +content.block.name = Blokke + +item.copper.name = Kobber +item.lead.name = Bly +item.coal.name = Kul +item.graphite.name = Grafit item.titanium.name = Titanium item.thorium.name = Thorium -item.silicon.name = Silicon +item.silicon.name = Silicium item.plastanium.name = Plastanium -item.phase-fabric.name = Phase Fabric -item.surge-alloy.name = Surge Alloy -item.spore-pod.name = Spore Pod +item.phase-fabric.name = Fasestof +item.surge-alloy.name = Lyn-bronze +item.spore-pod.name = Svampespore 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 = Water -liquid.slag.name = Slag -liquid.oil.name = Oil -liquid.cryofluid.name = Cryofluid +item.blast-compound.name = Sprængstof +item.pyratite.name = Pyratit +item.metaglass.name = Blyglas +item.scrap.name = Skrot +liquid.water.name = Vand +liquid.slag.name = Ildgrød +liquid.oil.name = Olie +liquid.cryofluid.name = Frysesaft -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} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viscosity: {0} -liquid.temperature = [lightgray]Temperature: {0} - -unit.dagger.name = Dagger -unit.mace.name = Mace -unit.fortress.name = Fortress +unit.dagger.name = Daggert +unit.mace.name = Kølle +unit.fortress.name = Fort unit.nova.name = Nova unit.pulsar.name = Pulsar -unit.quasar.name = Quasar +unit.quasar.name = Kvasar unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct @@ -914,7 +939,7 @@ unit.antumbra.name = Antumbra unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly -unit.mega.name = Mega +unit.mega.name = Kæmpe unit.quad.name = Quad unit.oct.name = Oct unit.risso.name = Risso @@ -922,7 +947,7 @@ unit.minke.name = Minke unit.bryde.name = Bryde unit.sei.name = Sei unit.omura.name = Omura -unit.alpha.name = Alpha +unit.alpha.name = Alfa unit.beta.name = Beta unit.gamma.name = Gamma unit.scepter.name = Scepter @@ -930,376 +955,379 @@ unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Resupply Point +block.resupply-point.name = Forsyningsplads block.parallax.name = Parallax -block.cliff.name = Cliff -block.sand-boulder.name = Sand Boulder -block.grass.name = Grass -block.slag.name = Slag +block.cliff.name = Klippe +block.sand-boulder.name = Sandkampesten +block.grass.name = Græs +block.slag.name = Ildgrød +block.space.name = Rum block.salt.name = Salt -block.salt-wall.name = Salt Wall -block.pebbles.name = Pebbles -block.tendrils.name = Tendrils -block.sand-wall.name = Sand Wall -block.spore-pine.name = Spore Pine -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder -block.snow-pine.name = Snow Pine -block.shale.name = Shale -block.shale-boulder.name = Shale Boulder -block.moss.name = Moss -block.shrubs.name = Shrubs -block.spore-moss.name = Spore Moss -block.shale-wall.name = Shale Wall -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall -block.thruster.name = Thruster -block.kiln.name = Kiln -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press -block.constructing = {0} [lightgray](Constructing) -block.spawn.name = Enemy Spawn -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Foundation -block.core-nucleus.name = Core: Nucleus -block.deepwater.name = Deep Water -block.water.name = Water -block.tainted-water.name = Tainted Water -block.darksand-tainted-water.name = Dark Sand Tainted Water -block.tar.name = Tar -block.stone.name = Stone +block.salt-wall.name = Saltvæg +block.pebbles.name = Grus +block.tendrils.name = Rødder +block.sand-wall.name = Sandvæg +block.spore-pine.name = Svampespore-træ +block.spore-wall.name = Svampesporevæg +block.boulder.name = Kampesten +block.snow-boulder.name = Snebold +block.snow-pine.name = Snegran +block.shale.name = Skifer +block.shale-boulder.name = Skifersten +block.moss.name = Mos +block.shrubs.name = Buskads +block.spore-moss.name = Svampesporemos +block.shale-wall.name = Skifervæg +block.scrap-wall.name = Skrotvæg +block.scrap-wall-large.name = Stor Skrotvæg +block.scrap-wall-huge.name = Kæmpe Skrotvæg +block.scrap-wall-gigantic.name = Enorm Skrotvæg +block.thruster.name = Trykmotor +block.kiln.name = Glasdigel +block.graphite-press.name = Grafitvalse +block.multi-press.name = Multi-valse +block.constructing = {0} [lightgray](Konstruerer) +block.spawn.name = Fjendtligt Ankomstpunkt +block.core-shard.name = Kerne: SkÃ¥r +block.core-foundation.name = Kerne: Fundament +block.core-nucleus.name = Kerne: Nukleus +block.deepwater.name = Dybt Vand +block.water.name = Vand +block.tainted-water.name = Moget Vand +block.darksand-tainted-water.name = Mørkt Sand Moget Vand +block.tar.name = Tjærre +block.stone.name = Sten block.sand.name = Sand -block.darksand.name = Dark Sand -block.ice.name = Ice -block.snow.name = Snow -block.craters.name = Craters -block.sand-water.name = Sand water -block.darksand-water.name = Dark Sand Water -block.char.name = Char -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall -block.ice-snow.name = Ice Snow -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall -block.pine.name = Pine -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud -block.white-tree-dead.name = White Tree Dead -block.white-tree.name = White Tree -block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor 1 -block.metal-floor-2.name = Metal Floor 2 -block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 4 -block.metal-floor-damaged.name = Metal Floor Damaged -block.dark-panel-1.name = Dark Panel 1 -block.dark-panel-2.name = Dark Panel 2 -block.dark-panel-3.name = Dark Panel 3 -block.dark-panel-4.name = Dark Panel 4 -block.dark-panel-5.name = Dark Panel 5 -block.dark-panel-6.name = Dark Panel 6 -block.dark-metal.name = Dark Metal +block.darksand.name = Mørkt Sand +block.ice.name = Is +block.snow.name = Sne +block.craters.name = Kratere +block.sand-water.name = Sandet Lavvande +block.darksand-water.name = Mørkt Sandet Lavvande +block.char.name = Trækul +block.dacite.name = Dacit +block.dacite-wall.name = Dacit-væg +block.dacite-boulder.name = Dacit-klippe +block.ice-snow.name = Tiliset Sne +block.stone-wall.name = Stenvæg +block.ice-wall.name = Isvæg +block.snow-wall.name = Snevæg +block.dune-wall.name = Klitvæg +block.pine.name = Gran +block.dirt.name = Jord +block.dirt-wall.name = Jordvæg +block.mud.name = Mudder +block.white-tree-dead.name = Dødt Hvidt Træ +block.white-tree.name = Hvidt Træ +block.spore-cluster.name = Svampespore-klynge +block.metal-floor.name = Metalgulv 1 +block.metal-floor-2.name = Metalgulv 2 +block.metal-floor-3.name = Metalgulv 3 +block.metal-floor-5.name = Metalgulv 4 +block.metal-floor-damaged.name = Metalgulv Damaged +block.dark-panel-1.name = Mørkt Panel 1 +block.dark-panel-2.name = Mørkt Panel 2 +block.dark-panel-3.name = Mørkt Panel 3 +block.dark-panel-4.name = Mørkt Panel 4 +block.dark-panel-5.name = Mørkt Panel 5 +block.dark-panel-6.name = Mørkt Panel 6 +block.dark-metal.name = Mørkt Metal block.basalt.name = Basalt -block.hotrock.name = Hot Rock -block.magmarock.name = Magma Rock -block.copper-wall.name = Copper Wall -block.copper-wall-large.name = Large Copper Wall -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall -block.thorium-wall.name = Thorium Wall -block.thorium-wall-large.name = Large Thorium Wall -block.door.name = Door -block.door-large.name = Large Door +block.hotrock.name = Varm Sten +block.magmarock.name = Magma-sten +block.copper-wall.name = Kobbervæg +block.copper-wall-large.name = Stor Kobber-væg +block.titanium-wall.name = Titanium-væg +block.titanium-wall-large.name = Stor Titanium-væg +block.plastanium-wall.name = Plastanium-væg +block.plastanium-wall-large.name = Stor Plastanium-væg +block.phase-wall.name = Fase-væg +block.phase-wall-large.name = Stor Fase-væg +block.thorium-wall.name = Thorium-væg +block.thorium-wall-large.name = Stor Thorium-væg +block.door.name = Dør +block.door-large.name = Stor Dør block.duo.name = Duo block.scorch.name = Scorch block.scatter.name = Scatter block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Conveyor -block.titanium-conveyor.name = Titanium Conveyor -block.plastanium-conveyor.name = Plastanium Conveyor -block.armored-conveyor.name = Armored Conveyor +block.titanium-conveyor.name = Titanium-bÃ¥nd +block.plastanium-conveyor.name = Plastanium-bÃ¥nd +block.armored-conveyor.name = Pansret BÃ¥nd block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts. -block.junction.name = Junction -block.router.name = Router -block.distributor.name = Distributor -block.sorter.name = Sorter -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message -block.illuminator.name = Illuminator +block.junction.name = Knudepunkt +block.router.name = Fordeler +block.distributor.name = Distributør +block.sorter.name = Filter +block.inverted-sorter.name = Omvendt Filter +block.message.name = Besked +block.illuminator.name = Lyskilde block.illuminator.description = A small, compact, configurable light source. Requires power to function. -block.overflow-gate.name = Overflow Gate -block.underflow-gate.name = Underflow Gate -block.silicon-smelter.name = Silicon Smelter -block.phase-weaver.name = Phase Weaver -block.pulverizer.name = Pulverizer -block.cryofluid-mixer.name = Cryofluid Mixer -block.melter.name = Melter -block.incinerator.name = Incinerator -block.spore-press.name = Spore Press +block.overflow-gate.name = Overflods-lÃ¥ge +block.underflow-gate.name = Underflods-lÃ¥ge +block.silicon-smelter.name = Silicium-smelter +block.phase-weaver.name = Fase-væv +block.pulverizer.name = Pulverkværn +block.cryofluid-mixer.name = Frysesaft-blander +block.melter.name = Smelter +block.incinerator.name = Forbrændingsovn +block.spore-press.name = Svampespore-presse block.separator.name = Separator -block.coal-centrifuge.name = Coal Centrifuge -block.power-node.name = Power Node -block.power-node-large.name = Large Power Node -block.surge-tower.name = Surge Tower -block.diode.name = Battery Diode -block.battery.name = Battery -block.battery-large.name = Large Battery -block.combustion-generator.name = Combustion Generator -block.steam-generator.name = Steam Generator -block.differential-generator.name = Differential Generator -block.impact-reactor.name = Impact Reactor -block.mechanical-drill.name = Mechanical Drill -block.pneumatic-drill.name = Pneumatic Drill -block.laser-drill.name = Laser Drill -block.water-extractor.name = Water Extractor -block.cultivator.name = Cultivator -block.conduit.name = Conduit -block.mechanical-pump.name = Mechanical Pump -block.item-source.name = Item Source -block.item-void.name = Item Void -block.liquid-source.name = Liquid Source -block.liquid-void.name = Liquid Void -block.power-void.name = Power Void -block.power-source.name = Power Infinite -block.unloader.name = Unloader -block.vault.name = Vault -block.wave.name = Wave -block.swarmer.name = Swarmer -block.salvo.name = Salvo -block.ripple.name = Ripple -block.phase-conveyor.name = Phase Conveyor -block.bridge-conveyor.name = Bridge Conveyor -block.plastanium-compressor.name = Plastanium Compressor -block.pyratite-mixer.name = Pyratite Mixer -block.blast-mixer.name = Blast Mixer -block.solar-panel.name = Solar Panel -block.solar-panel-large.name = Large Solar Panel -block.oil-extractor.name = Oil Extractor -block.repair-point.name = Repair Point -block.pulse-conduit.name = Pulse Conduit -block.plated-conduit.name = Plated Conduit -block.phase-conduit.name = Phase Conduit -block.liquid-router.name = Liquid Router -block.liquid-tank.name = Liquid Tank -block.liquid-junction.name = Liquid Junction -block.bridge-conduit.name = Bridge Conduit -block.rotary-pump.name = Rotary Pump -block.thorium-reactor.name = Thorium Reactor -block.mass-driver.name = Mass Driver -block.blast-drill.name = Airblast Drill -block.thermal-pump.name = Thermal Pump -block.thermal-generator.name = Thermal Generator -block.alloy-smelter.name = Alloy Smelter -block.mender.name = Mender -block.mend-projector.name = Mend Projector -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Large Surge Wall -block.cyclone.name = Cyclone -block.fuse.name = Fuse -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector -block.arc.name = Arc -block.rtg-generator.name = RTG Generator +block.coal-centrifuge.name = Kul-centrifuge +block.power-node.name = Strøm-node +block.power-node-large.name = Stor Strøm-node +block.surge-tower.name = LyntÃ¥rn +block.diode.name = Batteri-diode +block.battery.name = Batteri +block.battery-large.name = Stort Batteri +block.combustion-generator.name = Forbrændings-generator +block.steam-generator.name = Damp-generator +block.differential-generator.name = Differential-generater +block.impact-reactor.name = Bang-reaktor +block.mechanical-drill.name = Mekanisk Bor +block.pneumatic-drill.name = Pneumatisk Bor +block.laser-drill.name = Laser-bor +block.water-extractor.name = Grundvandsboring +block.cultivator.name = Kultivator +block.conduit.name = Rør +block.mechanical-pump.name = Mekanisk Pumpe +block.item-source.name = Genstandskilde +block.item-void.name = Genstands-intethed +block.liquid-source.name = Væskekilde +block.liquid-void.name = Væske-intethed +block.power-void.name = Strøm-intethed +block.power-source.name = Strømkilde +block.unloader.name = Aflæsser +block.vault.name = Depot +block.wave.name = Sprøjte +block.tsunami.name = Tsunami +block.swarmer.name = Sværmer +block.salvo.name = Skudsalve +block.ripple.name = Krusning +block.phase-conveyor.name = Fase-bro +block.bridge-conveyor.name = Transport-bro +block.plastanium-compressor.name = Plastanium-kompressor +block.pyratite-mixer.name = Pyratit-blander +block.blast-mixer.name = Sprængstof-blander +block.solar-panel.name = Solpanel +block.solar-panel-large.name = Stort Solpanel +block.oil-extractor.name = Olieboring +block.repair-point.name = Reparationsplads +block.pulse-conduit.name = Højhastigheds-rør +block.plated-conduit.name = Pansret Rør +block.phase-conduit.name = Fase-rør +block.liquid-router.name = Væske-fordeler +block.liquid-tank.name = Væske-silo +block.liquid-junction.name = Væske-knudepunkt +block.bridge-conduit.name = Rørbro +block.rotary-pump.name = Drejepumpe +block.thorium-reactor.name = Atomreaktor +block.mass-driver.name = Kvante-katapult +block.blast-drill.name = Trykluftbor +block.thermal-pump.name = Termisk Pumpe +block.thermal-generator.name = Termisk Generator +block.alloy-smelter.name = Bronze-digel +block.mender.name = Reparatør +block.mend-projector.name = Reparationsfelt +block.surge-wall.name = Lyn-væg +block.surge-wall-large.name = Stor Lyn-væg +block.cyclone.name = Cyklon +block.fuse.name = Lunte +block.shock-mine.name = Chok-mine +block.overdrive-projector.name = Overanstrengelsesfelt +block.force-projector.name = Kraftfelt +block.arc.name = Ark +block.rtg-generator.name = RTG-generator block.spectre.name = Spectre block.meltdown.name = Meltdown -block.container.name = Container -block.launch-pad.name = Launch Pad -block.launch-pad-large.name = Large Launch Pad +block.foreshadow.name = Foreshadow +block.container.name = Beholder +block.launch-pad.name = Affyringsrampe +block.launch-pad-large.name = Større Affyringsrampe block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.command-center.name = Kommandocenter +block.ground-factory.name = Fodgænger-fabrik +block.air-factory.name = Flyver-fabrik +block.naval-factory.name = Værft +block.additive-reconstructor.name = Opgraderingsfacilitet +block.multiplicative-reconstructor.name = Overbygningsfacilitet +block.exponential-reconstructor.name = Maksimeringsfacilitet +block.tetrative-reconstructor.name = Udmaksningsfacilitet +block.payload-conveyor.name = TroppebÃ¥nd +block.payload-router.name = Troppe-fordeler +block.disassembler.name = Omspalter +block.silicon-crucible.name = Siliciums-digel +block.overdrive-dome.name = Overanstrengelskuppel -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Kontakt +block.micro-processor.name = Datamat +block.logic-processor.name = Topdatamat +block.hyper-processor.name = Hyperdatamat +block.logic-display.name = Dataskærm +block.large-logic-display.name = Større Dataskærm +block.memory-cell.name = Hukommelsescelle +block.memory-bank.name = Hukommelsesbank -team.blue.name = blue -team.crux.name = red +team.blue.name = blÃ¥ +team.crux.name = rød team.sharded.name = orange team.orange.name = orange -team.derelict.name = derelict -team.green.name = green -team.purple.name = purple +team.derelict.name = forladt +team.green.name = grøn +team.purple.name = lilla -tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse[accent] [[WASD][] to move.\n[accent]Scroll[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\n[accent]Right-click[] to stop building. -tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. -tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\nUse the scrollwheel to rotate blocks before placing them.\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. -tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. -tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo[] to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 -tutorial.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 obtained resources can then be used to research new technology.\n\n[accent]Press the launch button. - -item.copper.description = The most basic structural material. Used extensively in all types of blocks. -item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. -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 components. -item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. -item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. -item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. -item.silicon.description = An extremely useful semiconductor. Applications in solar panels, complex electronics and homing turret ammunition. -item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. -item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.spore-pod.description = A pod of synthetic spores, synthesized from atmospheric concentrations for industrial purposes. Used for conversion into oil, explosives and fuel. -item.blast-compound.description = An unstable compound used in bombs and explosives. Synthesized from spore pods and other volatile substances. Use as fuel is not advised. -item.pyratite.description = An extremely flammable substance used in incendiary weapons. -liquid.water.description = The most useful liquid. Commonly used for cooling machines and waste processing. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. -liquid.oil.description = A liquid used in advanced material production. Can be converted into coal as fuel, or sprayed and set on fire as a weapon. -liquid.cryofluid.description = An inert, non-corrosive liquid created from water and titanium. Has extremely high heat capacity. Extensively used as coolant. - -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon. -block.kiln.description = Smelts sand and lead into the compound known as metaglass. Requires small amounts of power to run. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. -block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. -block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. -block.separator.description = Separates slag into its mineral components. Outputs the cooled result. -block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. -block.pulverizer.description = Crushes scrap into fine sand. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. -block.incinerator.description = Vaporizes any excess item or liquid it receives. -block.power-void.description = Voids all power inputted into it. Sandbox only. -block.power-source.description = Infinitely outputs power. Sandbox only. -block.item-source.description = Infinitely outputs items. Sandbox only. -block.item-void.description = Destroys any items. Sandbox only. -block.liquid-source.description = Infinitely outputs liquids. Sandbox only. -block.liquid-void.description = Removes any 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.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. -block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. -block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. -block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. -block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. -block.door.description = A small door. Can be opened or closed by tapping. -block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = An upgraded version of the Mender. Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. -block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric can be used to increase shield size. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into blocks. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. -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.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. -block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] -block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. -block.overflow-gate.description = Only outputs to the left and right if the front path is blocked. -block.underflow-gate.description = The opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. -block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. -block.thermal-pump.description = The ultimate pump. -block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. -block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = An advanced power node with greater range. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. -block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning flammable materials, such as coal. -block.thermal-generator.description = Generates power when placed in hot locations. -block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. -block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. -block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. -block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. -block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. -block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. -block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. -block.core-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = Stores a large amount of items of each type. An unloader block can be used to retrieve items from the vault. -block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. -block.unloader.description = Unloads items from any nearby non-transportation block. The type of item to be unloaded can be changed by tapping. -block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. -block.duo.description = A small, cheap turret. Useful against ground units. -block.scatter.description = An essential anti-air turret. Sprays clumps of lead or scrap flak at enemy units. -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. -block.hail.description = A small, long-range artillery turret. -block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. -block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. -block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. -block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. -block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. -block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. -block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances. -block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. -block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. -block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +tutorial.next = [lightgray] +tutorial.intro = Dette er [scarlet] Vejledningen til Mindustry.[]\nBrug[accent] [[WASD][] pÃ¥ tastaturet til at bevæge dig.\n[accent]Muse-hjulet[] til at zoome ind og ud.\nFor at begynde skal du[accent] udvinde kobber[]. Start med at finde en kobber-forekomst i nærheden af din kerne. Bevæg dig op ved siden af den, og tryk pÃ¥ den med musen.\n\n[accent]{0}/{1} kobber +tutorial.intro.mobile = Dette er [scarlet] Vejledningen til Mindustry.[]\nStryg over skærmen for at bevæge dig.\n[accent]Brug to fingre[] til at zoome ind og ud.\nFor at begynde skal du[accent] udvinde kobber[]. Start med at finde en kobber-forekomst i nærheden af din kerne. Bevæg dig op ved siden af den, og tryk pÃ¥ den med musen.\n\n[accent]{0}/{1} copper +tutorial.drill = Manuel udvinding af kobber gÃ¥r for langsomt.\n[accent]Bor[] kan udvinde det automatisk.\nTryk pÃ¥ fanen for bor nederst i højre hjørne.\nVælg det [accent] mekaniske bor[]. Placer det ovenpÃ¥ en kobberforekomst ved at trykke med musen.\nDu kan ogsÃ¥ vælge den fra tastaturet ved at trykke [accent][[2][] og sÃ¥ [accent][[1][] hurtigt efter hinanden.\n[accent]Højreklik[] for at stoppe byggeriet. +tutorial.drill.mobile = Manuel udvinding af kobber gÃ¥r for langsomt.\n[accent]Bor[] kan udvinde det automatisk.\nTryk pÃ¥ fanen for bor nederst i højre hjørne.\nVælg det [accent] mekaniske bor[].\nPlacer det ovenpÃ¥ en kobberforekomst ved at trykke pÃ¥ det, og sÃ¥ pÃ¥[accent] fluebenet[] nedenunder for at bekræfte.\nTryk pÃ¥[accent] krydset[] for at rydde byggeplanen. +tutorial.blockinfo = Hver blok har sine egne egenskaber. Større bor er kræves, for at udvinde visse typer af mineraler.\nLæs information om en blok [accent] ved at vælge det i bygge-menuen og trykke pÃ¥ "?".[]\n\n[accent]Læs informationen om det mekaniske bor.[] +tutorial.conveyor = [accent]TransportbÃ¥nd[] kan bruges til at flytte genstande ind i kernen.\nLav en stribe af transportbÃ¥nd fra boret ind i kernen.\n[accent]Hold musen nede for at trække en ret linje.[]\nHold[accent] CTRL[] nede for at trække diagonalt.\nBrug muse-hjulet til at rotere blokke inden du bygger dem.\n[accent]Byg 2 transportbÃ¥nd ved at trække en ret linje, og byg herefter et bÃ¥nd mellem boret og kernen. +tutorial.conveyor.mobile = [accent]TransportbÃ¥nd[] kan bruges til at flytte genstande ind i kernen.\nLav en stribe af transportbÃ¥nd fra boret ind i kernen.\n[accent] Træk en ret linje ved at holde din finger nede et øjeblik,[] og træk herefter i en given retning.\n\n[accent]Byg 2 transportbÃ¥nd ved at trække en ret linje, og byg herefter et bÃ¥nd mellem boret og kernen. +tutorial.turret = NÃ¥r en genstand er nÃ¥et ind i kernen, er den tilgængelig som byggemateriale.\nBemærk at ikke alle genstande kan bruges til at bygge med.\nDet gælder for eksempel [accent] kul[] og[accent] skrot[].\nDet er nødvendigt med fefensive strukturer for at holde [lightgray] fjenden[] tilbage.\nByg en[accent] duo[] i nærheden af din base. +tutorial.drillturret = Duo'er har brug for [accent] kobber[] som ammunition for at skyde.\nByg et bor i nærheden.\nTræk et transportbÃ¥nd hen til duo'en, for at forsyne den med kobber.\n\n[accent]Leveret ammunition: 0/1 +tutorial.pause = NÃ¥r det kommer til kamp, kan du[accent] Sætte spillet pÃ¥ pause.[]\nImens kan blokke sættes i kø til at blive bygget.\n\n[accent]Tryk pÃ¥ mellemrumstasten for pause. +tutorial.pause.mobile = NÃ¥r det kommer til kamp, kan du[accent] Sætte spillet pÃ¥ pause.[]\nImens kan blokke sættes i kø til at blive bygget.\n\n[accent]Tryk pÃ¥ pauseknappen i det øverste venstre højrne. +tutorial.unpause = Tryk pÃ¥ mellemrum igen for at fortsætte spillet. +tutorial.unpause.mobile = Tryk pÃ¥ knappen igen for at fortsætte spillet. +tutorial.breaking = Det er ofte nødvendigt at rive dine bygninger ned.\n[accent]Hold højre musetast nede[] for at lave en markering af blokke der skal væk.[]\n\n[accent]Fjern al skrottet til venstre for kernen ved at markere det pÃ¥ en gang. +tutorial.breaking.mobile = Det er ofte nødvendigt at rive dine bygninger ned.\n[accent]Vælg nedrivnings-tilstand[], og tryk sÃ¥ pÃ¥ en blok for at begynde nedrivningen.\nDu kan rive alt ned i et omrÃ¥de ved at holde fingeren nede en kort stund[] herefter trække i en given retning.\nTryk pÃ¥ fluebenet for at bekræfte dit valg.\n\n[accent]Fjern al skrottet til venstre for kernen ved at markere det pÃ¥ en gang. +tutorial.withdraw = Nogengange er det nødvendigt at hente genstande ud af blokke manuelt.\nDette gøres ved at [accent]trykke pÃ¥ en blok[] der indeholder nogen genstande,og sÃ¥ [accent]trykke pÃ¥ genstanden[] i menuen der dukker frem.\nFlere genstande kan hives op pÃ¥ een gang ved at [accent]trykke og holde nede[].\n\n[accent]Hent noget kobber op af kernen.[] +tutorial.deposit = Put genstande ned i blokke ved at trække dem fra dit skib og hen i blokken.\n\n[accent]Put kobberen tilbage i din kerne.[] +tutorial.waves = [lightgray]Fjenden [] nærmer sig.\n\nForsvar dig gennem 2 bølger.[accent] Klik med musen[] for at skyde.\nByg flere bor og kanoner. Udvind kobber. +tutorial.waves.mobile = [lightgray]Fjenden [] nærmer sig.\n\nForsvar dig gennem 2 bølger. Dit skib skyder automatisk pÃ¥ fjender i nærheden.\nByg flere bor og kanoner. Udvind kobber. +tutorial.launch = NÃ¥r du har gennemført et vist antal bølger, kan du[accent] affyre kernen[], og efterlade dine forsvarsværker[accent] mens du beholder alle ressurcerne der gemt i kernen.[]\nDisse ressurcer kan du bruge til at udvikle ny teknologi.\n\n[accent]Tryk pÃ¥ affyrings-knappen. +item.copper.description = Det simpleste byggemateriale. Bruges i store mængder til næsten alle typer af blokke. +item.lead.description = Et grundlæggende materiale. Har bred anvendelse inden for elektronik og rørlægning. +item.metaglass.description = Et super-stærkt gennemsigtigt materiale. Bruges meget til transport og lagring af væsker. +item.graphite.description = Mineraliseret kul, som bruges til elektronik og ammunition. +item.sand.description = Et almindeligt materiale, der anvendes i enorme mængder til smelteprocesser. +item.coal.description = Fossilt plantestof, fra arter der groede lang tid før svampesporerne opstod. Har bred anvendelse som brændstof, og til at producere avancerede materialer. +item.titanium.description = Et sjældent metal med meget lav vægt, som har bred anvendelse inden for væsketransport og luftfart. +item.thorium.description = Et radioaktivt materiale med høj massefylde som bruges til hærdede bygninger og som kernebrændstof. +item.scrap.description = Forglemte rester af gamle strukturer. Indeholder spor af mange forskellige materialer. +item.silicon.description = Ekstremt nyttig som halvleder. Anvendelse inden for solpaneler, avanceret elektronik og mÃ¥lsøgende ammunition. +item.plastanium.description = Et let, smidigt metal som anvendes til avancerede strukturer og som fragmenterende ammunition. +item.phase-fabric.description = En næsten vægtløs substans der anvendes til avanceret elektronik og selvreparerende teknologi. +item.surge-alloy.description = En avanceret legering med unikke elektriske egenskaber. +item.spore-pod.description = En bælg af økologiske svampesporer, kultiveret til industribrug fra atmosfæriske partikler. Kan omdannes til olie eller sprængstoffer, og bruges til brændstof. +item.blast-compound.description = En ustabil kemisk forbindelse der bruges til bomber og andre eksplosiver. Dannes fra svampesporer og andre brændfarlige substanser. Bør ikke anvendes som brændstof. +item.pyratite.description = En ekstremt brændfarlig substans der primært er til vÃ¥benbrug. +liquid.water.description = En meget nyttig væske. Bruges ofte til køling, og til at skylle affaldsstoffer væk. +liquid.slag.description = Smeltede metaller af forskellig art. Stofferne det bestÃ¥r af kan udvindes, eller det kan sprøjtes over fjenden som et vÃ¥ben. +liquid.oil.description = Væsken bruges til at producere avancerede materialer. Kan ogsÃ¥ omdannes til kul, og kan desuden sprøjtes over fjenden og antendes som et vÃ¥ben. +liquid.cryofluid.description = En kemisk inaktiv væske der ikke forÃ¥rsager rust, som er dannet fra vand og titanium. Dens høje varmekapacitet gør den egnet som køling. +block.message.description = Indeholder en note, der kan læses af dig selv og dine allierede. +block.graphite-press.description = Presser kulstykker sammen til ark af ren grafit. +block.multi-press.description = En opgraderet version af kul-valsen. Bruger vand og strøm til hurtigere at prodcere en større mængde grafit per kulstykke. +block.silicon-smelter.description = Smelter sand om til ren silicium ved brug af kul. +block.kiln.description = Smelter sand og bly om til blyglas ved hjælp af en lille smule strøm. +block.plastanium-compressor.description = Producerer plastanium ud fra olie og titanium. +block.phase-weaver.description = Syntetiserer fasestof fra det radioaktive torium og store mængder af sand. Dette sker pÃ¥ bekostning af enorme mængder strøm. +block.alloy-smelter.description = Kombinerer titanium, bly, silicium og kobber og laver det til lyn-bronze. +block.cryofluid-mixer.description = Blander vand med fint titanium-pulver og laver det til frysesaft. Helt essentiel for nedkøling thorium-reaktorer. +block.blast-mixer.description = Kvaser og blader klynger af svampesporer med pyratit for at producere sprængstof. +block.pyratite-mixer.description = Blander kul, bly og sand til sygt brændbar pyratit. +block.melter.description = Smelter skrot til ildgrød, sÃ¥ det kan raffineres eller sprøjtes ud over fjenden med Sprøjter eller Tsunamier. +block.separator.description = Separerer indholdet i ildgrød til underliggende mineraler. Udleder det kølede resultat. +block.spore-press.description = Komprimerer svampesporer til olie under ekstremt pres. +block.pulverizer.description = Kværner skrot til fint sand. +block.coal-centrifuge.description = Omdanner olie til klumper af kul. +block.incinerator.description = Tilintetgører alle genstande eller væsker, der transporteres ind i den. +block.power-void.description = Opsluger alt strøm, der forbindes til den. Kun i sandkassen. +block.power-source.description = Uendelige mængder af strøm. Kun i sandkassen. +block.item-source.description = Udsteder uendelige mængder af genstande. Kun i sandkassen. +block.item-void.description = Destruerer enhver genstand. Kun i sandkassen. +block.liquid-source.description = Udsteder uendelige mængder af væske. Kun i sandkassen. +block.liquid-void.description = Fjerner enhver væske. Kun i sandkassen. +block.copper-wall.description = En billig, defensiv blok.\nKan bruges til at beskytte kernen og vÃ¥ben i de første par bølger. +block.copper-wall-large.description = En billig, defensiv blok.\nKan bruges til at beskytte kernen og vÃ¥ben i de første par bølger.\nFylder flere felter. +block.titanium-wall.description = En overvejende stærk, defensiv blok.\nGiver nogenlunde beskyttelse fra fjender. +block.titanium-wall-large.description = En overvejende stærk, defensiv blok.\nGiver nogenlunde beskyttelse fra fjender.\nFylder flere felter. +block.plastanium-wall.description = En unik type væg, der absorberer strøm-kiler og blokerer automatiske strøm-forbindelser. +block.plastanium-wall-large.description = En unik type væg, der absorberer strøm-kiler og blokerer automatiske strøm-forbindelser.\nFylder flere felter. +block.thorium-wall.description = En stærk defensiv blok.\nRimelig fin beskyttelse mod fjender. +block.thorium-wall-large.description = En stærk defensiv blok.\nRimelig fin beskyttelse mod fjender.\nFylder flere felter. +block.phase-wall.description = En væg legeret med specielt, reflekterende fase-stof. Reflekterer de fleste slags skud. +block.phase-wall-large.description = En væg legeret med specielt, reflekterende fase-stof. Reflekterer de fleste slags skud.\nFylder flere felter. +block.surge-wall.description = En ekstremt hÃ¥rd væg.\nOpbygger en ladning ved at absorbere skud. Ladningen affyres tilfældigt +block.surge-wall-large.description = En ekstremt hÃ¥rd væg.\nOpbygger en ladning ved at absorbere skud. Ladningen affyres tilfældigt.\nFylder flere felter. +block.door.description = En bette dør. Kan Ã¥bnes og lukkes ved at trykke pÃ¥ den. +block.door-large.description = En stor dør. Kan Ã¥bnes og lukkes ved at trykke pÃ¥ den.\nFylder flere felter. +block.mender.description = Reparerer løbende blokke i nærheden. Hjælper til at holde forsvaret oppe mellem bølger.\nSilicium kan bruges til at øge rækkevidde og effektivitet. +block.mend-projector.description = En bedre version af den normale reparatør. Reparerer alle blokke inden for dens rækkevidde.\nFase-stof kan bruges til at øge dens rækkevidde og effektivitet. +block.overdrive-projector.description = Øger hastigheden af bygninger i nærheden.\nFase-stof kan bruges til at øge denne hastighed og rækkevidden af feltet. +block.force-projector.description = Skaber et stort, sekskantet kraftfelt, der beskytter bygninger og tropper.\nOveropheder, hvis den tager for meget skade. Kan nedkøles med væske. Fase-stof kan bruges til at gøre feltet større. +block.shock-mine.description = Skader fodgængere, der træder pÃ¥ den. Næsten usynlig for fjender. +block.conveyor.description = Simpel genstands-transport-blok. Transporterer genstande fremad og ind i andre blokke. Kan roteres. +block.titanium-conveyor.description = En avanceret genstands-transport-blok. Transporterer blokke hurtigere end normale transportbÃ¥nd. +block.plastanium-conveyor.description = Transporterer genstande i klynger.\nTager imod genstande i bagenden og fordeler dem i op til tre retninger i forreste ende. +block.junction.description = Fungerer som en bro for krydsende transportbÃ¥nd. Kan bruges, nÃ¥r to krydsende bÃ¥nd med forskellige genstande ikke mÃ¥ blandes. +block.bridge-conveyor.description = En avanceret genstands-transport-blok. Kan transportere over op til 3 felter, uanset om det er terræn eller blokke. +block.phase-conveyor.description = En avanceret genstands-transport-blok. Bruger strøm til at teleportere genstande til næste fase-bÃ¥nd, hen over op til flere felter. +block.sorter.description = Sorterer genstande. Hvis en genstand matcher et valg, kan de passere. Hvis ikke, outputtes de til siderne. +block.inverted-sorter.description = HÃ¥ndterer genstande som et normalt filter, men outputter til siderne. +block.router.description = Tager genstande og fordeler denne ligeligt mellem op til tre andre retninger. Kan bruges til at splitte et bÃ¥nd.\n\n[scarlet]Aldrig stil dem op ad fabrikker, da de ellers vil blive stoppet til.[] +block.distributor.description = En avanceret omfordeler. Fordeler genstande ligeligt mellem op til 7 andre retninger. +block.overflow-gate.description = Outputter kun til venstre og højre, hvis blokken foran er blokeret. +block.underflow-gate.description = Det modsatte af en overflods-lÃ¥ge. Outputter fremad hvis venstre og højre side af lÃ¥gen er blokeret. +block.mass-driver.description = Den ultimative transport-blok. Samler en masse genstande og slynger dem hovedkulds gennem luften til den kvante-katapult. +block.mechanical-pump.description = En hverdags-pumpe, der ikke engang kræver strøm. +block.rotary-pump.description = En drønhurtig pumpe. Pumper mere væske, kræver mere strøm. +block.thermal-pump.description = Den allerbedste pumpe. +block.conduit.description = Simpel væske-transport-blok. Transporterer væske fremad. Bruges sammen med pumper, eller i forlængelse af andre rør. +block.pulse-conduit.description = En avanceret væske-transport-blok. Transporterer væske hurtigere og opbevarer mere end normale rør. +block.plated-conduit.description = Transporterer væske lige sÃ¥ hurtigt som højhastigheds-rør. Kan ikke tage væske ind fra siderne.\nLækker mindre. +block.liquid-router.description = Tager væske fra en retning, og fordeler denne ligeligt mellem op til tre andre retninger. Brugbar, nÃ¥r der er behov for at splitte en rørledning op. +block.liquid-tank.description = Opbevarer store mængder af væske. Kan bruges som sikkerhedslager i tilfælde af underskud eller til at forsyne nedkøling i nødsituationer. +block.liquid-junction.description = Fungerer som en bro over krydsende rør. Brugbar i situationer, hvor der er tale om transport af forskellige væsker. +block.bridge-conduit.description = Avanceret væske-transport. Kan transportere væske over 3 felter uanset om det er terræn eller bygninger. +block.phase-conduit.description = Avanceret væske-transport. Bruger strøm til at transportere væske hen over flere blokke. +block.power-node.description = Leder strøm til forbundne strøm-noder. Noden enten modtager eller giver strøm til sidestÃ¥ende blokke. +block.power-node-large.description = En evanceret strøm-node, der har længere rækkevidde. +block.surge-tower.description = En strømforbindelse med ekstremt lang rækkevidde. Kan kun klare fÃ¥ forbindelser. +block.diode.description = Batteri-strøm kan ledes gennem denne ensrettede blok, men kun hvis den ene side har mere strøm end destinationen. +block.battery.description = Opbevarer overskydende strøm. Giver strøm ved underskud i strømnetværket. +block.battery-large.description = Opbevarer mere strøm end et normalt batteri. +block.combustion-generator.description = Genererer strøm ved at brænde brændbare materialer, sÃ¥som kul. +block.thermal-generator.description = Genererer strøm, nÃ¥r den placeres pÃ¥ naturlig varme. +block.steam-generator.description = En avanceret forbrændingsgenerator. Mere effektiv, men kræver vand til at lave damp. +block.differential-generator.description = Genererer store mængder strøm. Bruger temperaturforskellen mellem frysesaft og brændende pyratit til at lave strøm. +block.rtg-generator.description = En simpel, bæredygtig generator. Bruger varmen fra radioaktivt henfald til langsomt at generere strøm. +block.solar-panel.description = Giver en smule strøm fra solen. +block.solar-panel-large.description = En betydeligt bedre version af de normale solpaneler. +block.thorium-reactor.description = Genererer bemærkelsesværdige mængder strøm. Kræver konstant nedkøling. Vil eksplodere voldeligt uden den rette nedkøling. Strøm-output afhænger af hvor fuld den her. +block.impact-reactor.description = En avanceret reaktor, der producerer rigtig meget strøm. Det kræver meget strøm at sparke processen i gang. +block.mechanical-drill.description = Et billigt bor. NÃ¥r placeret oven pÃ¥ resurser, udvinder det dem langsomt. Kan kun udvinde basale resurser. +block.pneumatic-drill.description = Et bedre bor, der kan udvinde titanium. Borer hurtigere end det mekaniske bor. +block.laser-drill.description = Kan bore meget hÃ¥rdere og hurtigere, men kræver mere strøm. Kan udvide thorium. +block.blast-drill.description = Det ybberste bor. Kræver meget strøm. +block.water-extractor.description = Udvinder grundvand. Bruges i omrÃ¥der uden vand pÃ¥ overfladen. +block.cultivator.description = Kultiverer smÃ¥ mængder af økologiske svampesporer fra atmosfæren. +block.oil-extractor.description = Bruger meget strøm, sand og vand for at udvinde olie. +block.core-shard.description = Den første kerne. Hvis den bliver ødelagt, taber du regionen. Ikke lad den blive ødelagt. +block.core-foundation.description = Den anden overbygning til kernen. Mere pansret. Opbevarer flere ting. +block.core-nucleus.description = Den tredje og største overbygning af kernen. Helt vildt pansret. Opbevarer kollosale mængder af ting. +block.vault.description = Opbevarer en masse genstande. En aflæsser-blok kan bruges til at hive ting ud af en container. +block.container.description = Opbevarer en lille mængde genstande. En aflæsser-blok kan bruges til at hive ting ud af en container. +block.unloader.description = Aflæsser genstande fra sidestÃ¥ende blokke. Typen af blok, der skal aflæsses kan justeres. +block.launch-pad.description = Affyrer samlinger af genstande løbende. Kræver ikke affyring af kernen. +block.launch-pad-large.description = En forbedret affyringsrampe. Gemmer flere ting. Affyrer oftere. +block.duo.description = En bette, billig kanon. Effektiv mod fodgængere. +block.scatter.description = Et vigtigt luftangreb. Skyder klumper af skud mod flyvere. +block.scorch.description = Brænder alle forbipasserende fodgængere. Meget god til hvad den gør. +block.hail.description = En lille kanon med lang rækkevidde. +block.wave.description = En medium-stor væskekanon. Skyder væskestrÃ¥ler. Kan automatisk slukke ildebrand med vand. +block.lancer.description = En medium-stor strøm-kanon. Lader og affyrer strømstrÃ¥ler mod uvidende fodgængere. +block.arc.description = En lille nær-distance strøm-kanon. Skyder lyn mod fjenden. +block.swarmer.description = En medium-stor missil-affyrer. Angriber bÃ¥de flyvere og fodgængere. Affyrer efterfølgende missiler. +block.salvo.description = En større, mere avanceret version af Duo'en. Skyder hurtige salver af skud mod fjenden. +block.fuse.description = En stor, nær-distance energi-kanon. Affyrer tre penetrerende skud mod nærmeste fjender. +block.ripple.description = En ekstremt kraftfuld skyder. Skyder klynger af skud mod fjender over længere distancer. +block.cyclone.description = En stor anti-fodgænger og -flyver, der skyder eksplosive skÃ¥r pÃ¥ nærmeste fjender. +block.spectre.description = En massiv dobbelt-løber-kanon. Skyder store panser-penertrerende skud mod flyvere og fodgængere. +block.meltdown.description = En massiv laser-kanon. Lader og affyrer storer laser-strÃ¥ler mod svenskere. Kræver nedkøling for at virke. +block.repair-point.description = Helbreder konstant den nærmeste enhed. +block.segment.description = Skader og ødelægger projektiler. Laser-projektiler gælder ikke her. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 67311e3451..c0d3d37cf4 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -2,8 +2,8 @@ credits.text = Entwickelt von [royal]Anuken[] - [sky]anukendev@gmail.com[]\n\n[g credits = Danksagungen contributors = Übersetzer und Mitwirkende discord = Tritt dem Mindustry-Discord bei! -link.discord.description = Der offizielle Mindustry Discord Server -link.reddit.description = Der Mindustry Subreddit +link.discord.description = Der offizielle Mindustry Discord-Server +link.reddit.description = Mindustry-Subreddit link.github.description = Quellcode des Spiels link.changelog.description = Liste der Änderungen link.dev-builds.description = Entwicklungs-Builds (instabil) @@ -11,17 +11,20 @@ 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 link.google-play.description = Google Play Store-Seite link.f-droid.description = F-Droid-Seite -link.wiki.description = Offizelles Mindustry-Wiki +link.wiki.description = Offizielles Mindustry-Wiki link.suggestions.description = Neue Ideen einbringen +link.bug.description = Hast du einen Bug gefunden? Melde ihn hier linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert. screenshot = Screenshot gespeichert unter {0} screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher für Screenshot. gameover = Der Kern wurde zerstört. +gameover.disconnect = Verbindung trennen gameover.pvp = Das[accent] {0}[] Team ist siegreich! +gameover.waiting = [accent]Warte auf neue Karte... highscore = [accent]Neuer Highscore! copied = Kopiert. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Dieser Teil vom Spiel ist noch unfertig. +indev.campaign = [accent]Glückwunsch! Du hast das Ende der Kampagne erreicht![]\n\nMehr gibt es noch nicht. In einem zukünftigen Update wird interplanetarisches Reisen möglich werden. load.sound = Audio load.map = Karten @@ -38,6 +41,14 @@ be.ignore = Ignorieren be.noupdates = Keine Aktualisierungen gefunden. be.check = Auf Aktualisierungen prüfen +mod.featured.dialog.title = Mod Browser +mods.browser.selected = Ausgewählter Mod +mods.browser.add = Installieren +mods.browser.reinstall = Neu Installieren +mods.github.open = Github +mods.browser.sortdate = Nach neusten sortieren +mods.browser.sortstars = Nach Sternen sortieren + schematic = Entwurf schematic.add = Entwurf speichern... schematics = Entwürfe @@ -55,22 +66,24 @@ schematic.saved = Entwurf gespeichert. schematic.delete.confirm = Dieser Entwurf wird vollständig vernichtet. schematic.rename = Entwurf umbenennen schematic.info = {0}x{1}, {2} Blöcke +schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[] oder [accent]Server[] dürfen keine Entwürfe verwendet werden. +stats = Statistiken stat.wave = Wellen besiegt:[accent] {0} 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.built = Blöcke gebaut:[accent] {0} +stat.destroyed = Blöcke zerstört:[accent] {0} +stat.deconstructed = Blöcke abgebaut:[accent] {0} stat.delivered = Übertragene Ressourcen: -stat.playtime = Time Played:[accent] {0} +stat.playtime = Spielzeit:[accent] {0} stat.rank = Finaler Rang:[accent] {0} -globalitems = [accent]Global Items +globalitems = [accent]Gesamtitems map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = Highscore: [accent]{0} level.select = Level-Auswahl level.mode = Spielmodus: -coreattack = < Die Basis wird angegriffen! > +coreattack = < Der Kern wird angegriffen! > nearpoint = [[ [scarlet]SOFORT DEN SPAWNPUNKT VERLASSEN[] ]\nVernichtung droht database = Kern-Datenbank savegame = Spiel speichern @@ -79,6 +92,7 @@ joingame = Spiel beitreten customgame = Benutzerdefiniertes Spiel newgame = Neues Spiel none = +none.found = [lightgray] minimap = Minimap position = Position close = Schließen @@ -95,64 +109,70 @@ preparingconfig = Konfiguration vorbereiten preparingcontent = Inhalt vorbereiten uploadingcontent = Inhalt hochladen uploadingpreviewfile = Vorschaudatei hochladen -committingchanges = Veränderungen übernehmen +committingchanges = Veränderungen werden übernommen done = Fertig -feature.unsupported = Dein System unsterstützt dieses Feature nicht. +feature.unsupported = Dein System unterstützt dieses Feature nicht. -mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind, und[scarlet] sehr fehlerhaft sein können[].\nMelde alle Probleme an den Mindustry GitHub oder Discord. -mods.alpha = [accent](Alpha) +mods.initfailed = [red]âš [] Die vorherige Mindustry-Instanz konnte nicht starten. Dies lag wahrscheinlich an fehlerhaften Mods.\n\nDamit das Spiel starten kann, [red]wurden alle Mods deaktiviert.[]\n\nWenn du nicht willst, dass das passiert, kannst du es unter [accent]Einstellungen->Spiel->Mods bei Absturz deaktivieren[] ändern. mods = Mods mods.none = [lightgray]Keine Mods gefunden! mods.guide = Modding-Anleitung mods.report = Problem melden mods.openfolder = Mod-Verzeichnis öffnen +mods.viewcontent = Inhalt ansehen mods.reload = Neu laden -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden. +mod.installed = [[Installiert] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Aktiviert mod.disabled = [scarlet]Deaktiviert +mod.multiplayer.compatible = [gray]Mehrspieler-kompatibel mod.disable = Deaktivieren -mod.content = Content: +mod.content = Inhalt: mod.delete.error = Unfähig Mod zu löschen. Datei könnte in Benutzung sein. mod.requiresversion = [scarlet]Benötigt mindestens Version:[accent] {0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]Nicht mit V6 kompatibel (no minGameVersion: 105) mod.missingdependencies = [scarlet]Fehlende Abhängigkeiten: {0} mod.erroredcontent = [scarlet]Inhalt-Fehler mod.errors = Beim Laden von Inhalt sind Fehler aufgetreten. -mod.noerrorplay = [scarlet]Du hast Mods mit Fehlern.[] Deaktiviere die Mods oder fixe die Fehler, bevor du spielst. +mod.noerrorplay = [scarlet]Du hast Mods mit Fehlern.[] Deaktiviere die Mods oder behebe die Fehler, bevor du spielst. mod.nowdisabled = [scarlet]Mod '{0}' fehlen Abhängigkeiten:[accent] {1}\n[lightgray]Diese Mods müssen erst installiert werden.\nDieser Mod wird automatisch deaktiviert. mod.enable = Aktivieren mod.requiresrestart = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden. mod.reloadrequired = [scarlet]Neuladen benötigt mod.import = Mod importieren -mod.import.file = Import File +mod.import.file = Datei importieren mod.import.github = GitHub-Mod importieren -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! -mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. +mod.jarwarn = [scarlet]JAR Mods sind nicht sicher.[]\nInstalliere nur Mods von vertrauenswürdigen Quellen! +mod.item.remove = Dies ist Teil vom [accent] '{0}'[] Mod. Deaktiviere diesen Mod, um dies zu entfernen. mod.remove.confirm = Dieser Mod wird gelöscht. mod.author = [lightgray]Autor:[] {0} -mod.missing = Dieser Spielstand enthält Mods, welche nicht mehr vorhanden oder aktualisiert wurden. Spielstandfehler könnten passieren. Bist du dir sicher, das du ihn laden möchtest?\n[lightgray]Mods:\n{0} +mod.missing = Dieser Spielstand enthält Mods, welche nicht mehr vorhanden sind oder aktualisiert wurden. Spielstandfehler könnten passieren. Bist du dir sicher, dass du ihn laden möchtest?\n[lightgray]Mods:\n{0} mod.preview.missing = Bevor du diesen Mod hochladen kannst, musst du eine Bildvorschau einbinden.\nLade ein Bild namens[accent] preview.png[] in den Modordner und versuche es nochmal. mod.folder.missing = Nur Mods in Ordnerform können in den Workshop hochgeladen werden.\nUm einen Mod in einen Ordner zu konvertieren, extrahiere das Archiv und lösche das alte Archiv danach. Starte dann das Spiel neu oder lade die Mods neu. -mod.scripts.disable = Ihr Gerät unterstüzt keine Mods mit Scripts. Du musst diese Mods deaktivieren, um spielen zu können. +mod.scripts.disable = Ihr Gerät unterstützt keine Mods mit Scripts. Du musst diese Mods deaktivieren, um spielen zu können. about.button = Info name = Name: noname = Wähle zunächst einen[accent] Spielernamen[]. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Planetenkarte +launchcore = Kern starten filename = Dateiname: unlocked = Neuer Inhalt freigeschaltet! +available = Neue Forschung möglich completed = [accent]Abgeschlossen techtree = Forschung +research.legacy = [accent]5.0[] Forschungsdaten gefunden.\nMöchtest du [accent]diese Daten behalten[] oder [accent]sie löschen[] und neu anfangen (empfohlen)? +research.load = Behalten +research.discard = Löschen research.list = [lightgray]Forschung: -research = Erforschen +research = Forschen researched = [lightgray]{0} erforscht. -research.progress = {0}% complete +research.progress = Fortschritt: {0}% players = {0} Spieler online players.single = {0} Spieler online -players.search = search -players.notfound = [gray]no players found +players.search = Suche +players.notfound = [gray]Keine Spieler gefunden server.closing = [accent]Schließe den Server ... server.kicked.kick = Du wurdest vom Server geworfen! server.kicked.whitelist = Du befindest dich nicht auf der Whitelist des Servers. @@ -163,7 +183,7 @@ server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update! server.kicked.banned = Du wurdest vom Server verbannt. server.kicked.typeMismatch = Dieser Server ist nicht mit deinem Buildtyp kompatibel. server.kicked.playerLimit = Dieser Server ist voll. Warte auf einen freien Platz. -server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest. +server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte, bevor du dich wieder verbindest. server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server. 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. @@ -171,7 +191,7 @@ server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindu server.kicked.gameover = Game Over! server.kicked.serverRestarting = Der Server startet neu. server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[] -host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [lightgray]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Serverliste sehen können.\n\nWenn du anderen die Verbindung über deine IP-Adresse ermöglichen willst, musst du [accent]Port-Forwarding[] durchführen.\n\n[lightgray]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall-Einstellungen Zugriff auf das lokale Netzwerk hat. +host.info = Der [accent]'Server hosten'[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [lightgray]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Serverliste sehen können.\n\nWenn du anderen die Verbindung über deine IP-Adresse ermöglichen willst, musst du [accent]Port-Forwarding[] durchführen.\n\n[lightgray]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall-Einstellungen Zugriff auf das lokale Netzwerk hat. join.info = Hier kannst du eine [accent]Server-IP[] eingeben, um dich zu verbinden, oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[lightgray]Hinweis: Es gibt keine globale Serverliste; wenn du dich mit jemandem per IP-Adresse verbinden willst, musst du den Host nach seiner IP-Adresse fragen. hostserver = Mehrspieler hosten invitefriends = Freunde einladen @@ -185,16 +205,23 @@ server.refreshing = Server wird aktualisiert hosts.none = [lightgray]Keine LAN-Spiele gefunden! host.invalid = [scarlet]Kann keine Verbindung zum Host herstellen. -servers.local = Local Servers -servers.remote = Remote Servers -servers.global = Community Servers +servers.local = Lokale Server +servers.remote = Andere Server +servers.global = Community-Server + +servers.disclaimer = Community-Server werden vom Entwickler [accent]nicht[] geprüft.\n\Sie können Inhalte, die nicht für jedes Alter geeignet sind, enthalten. +servers.showhidden = Versteckte Server anzeigen +server.shown = Angezeigt +server.hidden = Versteckt trace = Spieler verfolgen trace.playername = Spielername: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Eindeutige ID: [accent]{0} +trace.id = ID: [accent]{0} trace.mobile = Mobiler Client: [accent]{0} trace.modclient = Gemoddeter Client: [accent]{0} +trace.times.joined = Beigetreten: [accent]{0}[] Mal +trace.times.kicked = Rausgeworfen: [accent]{0}[] Mal invalidid = Ungültige Client-ID! Berichte den Fehler. server.bans = Verbannungen server.bans.none = Keine verbannten Spieler gefunden! @@ -212,7 +239,7 @@ confirmkick = Bist du sicher, dass du diesen Spieler rauswerfen willst? confirmvotekick = Bist du sicher, dass du darüber abstimmen willst, diesen Spieler rauszuwerfen? confirmunban = Bist du sicher, dass du die Verbannung des Spielers rückgängig machen willst? confirmadmin = Bist du sicher, dass du diesen Spieler zu einem Administrator machen möchtest? -confirmunadmin = Bis du sicher, dass dieser Spieler kein Administrator mehr sein soll? +confirmunadmin = Bist du sicher, dass dieser Spieler kein Administrator mehr sein soll? joingame.title = Spiel beitreten joingame.ip = IP: disconnect = Verbindung unterbrochen. @@ -222,6 +249,7 @@ disconnect.timeout = Zeitüberschreitung. disconnect.data = Fehler beim Laden der Welt! cantconnect = Nicht möglich beizutreten ([accent]{0}[]). connecting = [accent] Verbinde... +reconnecting = [accent]Verbindung wird wiederhergestellt... connecting.data = [accent] Welt wird geladen... server.port = Port: server.addressinuse = Adresse bereits in Verwendung! @@ -267,52 +295,63 @@ cancel = Abbruch openlink = Link öffnen copylink = Link kopieren back = Zurück +max = Max +crash.export = Crash-Logs exportieren +crash.none = Keine Crash-Logs gefunden. +crash.exported = Crash-Logs wurden erfolgreich exportiert. data.export = Daten exportieren data.import = Daten importieren -data.openfolder = Open Data Folder +data.openfolder = Datenordner öffnen data.exported = Daten exportiert. data.invalid = Dies sind keine gültigen Spieldaten. -data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Das kann nicht rückgängig gemacht werden![]Sobald der Import abeschlossen ist, wird dein Spiel sofort beendet. +data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Das kann nicht rückgängig gemacht werden![]\n\nSobald der Import abgeschlossen ist, wird dein Spiel sofort beendet. quit.confirm = Willst du wirklich aufhören? quit.confirm.tutorial = Weißt du, was du tust?\nDu kannst das Tutorial unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen. loading = [accent]Wird geladen... reloading = [accent]Lade Mods neu... saving = [accent]Speichere... -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][] um im Kern zu spawnen cancelbuilding = [accent][[{0}][] um den Plan zu leeren selectschematic = [accent][[{0}][] zum Auswählen+Kopieren pausebuilding = [accent][[{0}][] um das Bauen zu pausieren resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen +enablebuilding = [scarlet][[{0}][] um zu bauen +showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen. wave = [accent]Welle {0} +wave.cap = [accent]Welle {0}/{1} wave.waiting = Welle in {0} wave.waveInProgress = [lightgray]Welle im Gange waiting = Warten... waiting.players = Warte auf Spieler... wave.enemies = [lightgray]{0} Gegner verbleiben +wave.enemycores = [accent]{0}[lightgray] Gegnerische Kerne +wave.enemycore = [accent]{0}[lightgray] Gegnerischer Kern wave.enemy = [lightgray]{0} Gegner verbleiben +wave.guardianwarn = Boss erscheint in [accent]{0}[] Wellen. +wave.guardianwarn.one = Boss erscheint in [accent]{0}[] Welle. loadimage = Bild laden saveimage = Bild speichern unknown = Unbekannt custom = Benutzerdefiniert builtin = Enthalten -map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgänig gemacht werden! +map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgängig gemacht werden! map.random = [accent]Zufällige Karte -map.nospawn = Diese Karte hat keine Kerne in denen die Spieler beginnen können! Füge einen [royal]blue[] Kern zu dieser Karte im Editor hinzu. -map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne in denen Gegner starten können! Füge über den Editor [scarlet] rote[] Kerne zu dieser Karte hinzu. -map.nospawn.attack = Diese Karte hat keine gengnerischen Kerne, die Spieler angreifen können! Füge über den Editor [scarlet] rote[] Kerne zu dieser Karte hinzu. +map.nospawn = Diese Karte hat keine Kerne, in denen die Spieler beginnen können! Füge einen [royal]orangen[] Kern zu dieser Karte im Editor hinzu. +map.nospawn.pvp = Diese Karte hat keine Kerne für die gegnerischen Spieler! Füge über den Editor [scarlet] nicht-orange[] Kerne zu dieser Karte hinzu. +map.nospawn.attack = Diese Karte hat keine gegnerischen Kerne, die Spieler angreifen können! Füge über den Editor [scarlet] rote[] Kerne zu dieser Karte hinzu. map.invalid = Fehler beim Laden der Karte: Beschädigte oder ungültige Kartendatei. workshop.update = Objekt aktualisieren workshop.error = Fehler beim Laden von Workshop-Details: {0} map.publish.confirm = Willst du diese Karte wirklich veröffentlichen?\n\n[lightgray]Vergewissere dich, dass du der Workshop-EULA zugestimmt hast, sonst tauchen deine Karten nicht auf! workshop.menu = Wähle aus, was du mit diesem Objekt tun willst. workshop.info = Objekt-Info -changelog = Changelog (optional): +changelog = Änderungen (optional): eula = Steam EULA missing = Dieses Objekt wurde gelöscht oder verschoben.\n[lightgray]Die Workshop-Auflistung ist nun automatisch getrennt worden. publishing = [accent]Veröffentlichen... publish.confirm = Willst du das wirklich veröffentlichen?\n\n[lightgray]Vergewissere dich, dass du der Workshop-EULA zugestimmt hast, sonst tauchen deine Objekte nicht auf! publish.error = Fehler beim Veröffentlichen des Objekts: {0} -steam.error = Fehler beim laden der Steam-Dienste.\nError: {0} +steam.error = Fehler beim Laden der Steam-Dienste.\nError: {0} editor.brush = Pinsel editor.openin = Öffne im Editor @@ -321,23 +360,23 @@ editor.oregen.info = Erze generiert: editor.mapinfo = Karten-Info editor.author = Autor: editor.description = Beschreibung: -editor.nodescription = Eine Karte benötigt eine Beschreibung mit mindestens 4 Buchstaben, bevor sie veröffentlich werden kann. +editor.nodescription = Eine Karte benötigt eine Beschreibung mit mindestens 4 Buchstaben, bevor sie veröffentlicht werden kann. editor.waves = Wellen: editor.rules = Regeln: editor.generation = Generator: -editor.ingame = Im Spiel Bearbeiten +editor.ingame = Im Spiel bearbeiten editor.publish.workshop = Im Workshop veröffentlichen editor.newmap = Neue Karte +editor.center = Zur Mitte workshop = Workshop waves.title = Wellen waves.remove = Entfernen -waves.never = waves.every = alle waves.waves = Welle(n) -waves.perspawn = per Spawn -waves.shields = shields/wave +waves.perspawn = pro Spawn +waves.shields = Schilder pro Welle waves.to = bis -waves.guardian = Guardian +waves.guardian = Boss waves.preview = Vorschau waves.edit = Bearbeiten... waves.copy = Aus der Zwischenablage kopieren @@ -346,9 +385,10 @@ waves.invalid = Ungültige Wellen in der Zwischenablage. waves.copied = Wellen kopiert. waves.none = Keine Gegner definiert.\nInfo: Leere Wellenentwürfe werden automatisch mit dem Standard-Entwurf ersetzt. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health + +wavemode.counts = Menge +wavemode.totals = Gesamtmenge +wavemode.health = Lebenspunkte editor.default = [lightgray] details = Details @@ -359,7 +399,7 @@ editor.removeunit = Bereich entfernen editor.teams = Teams 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. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 3.5/build 40-Karte importieren möchtest, benutze den 'Importiere Terrainbild' Knopf im Editor. +editor.errorimage = Das ist ein Bild, keine Karte. editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird. editor.errornot = Dies ist keine Kartendatei. editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt. @@ -372,9 +412,9 @@ editor.resize = Größe\nanpassen editor.loadmap = Karte\nladen editor.savemap = Karte\nspeichern editor.saved = Gespeichert! -editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten Info[] Menu. -editor.save.overwrite = Deine Karte überschreibt eine built-in Karte! Wähle einen anderen Karten Namen im [accent]'Karten info'[] Menu. -editor.import.exists = [scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits! +editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten-Info[]-Menü. +editor.save.overwrite = Deine Karte überschreibt eine Standardkarte! Wähle einen anderen Karten Namen im [accent]Karten-Info[]-Menü. +editor.import.exists = [scarlet]Fehler beim Import:[] Ein Standardkarte namens '{0}' existiert bereits! editor.import = Importieren... editor.importmap = Importiere Karte editor.importmap.description = Importiere von einer bestehenden Karte @@ -389,7 +429,7 @@ editor.exportimage = Export in Terrainbild-Datei editor.exportimage.description = Exportiere in ein Kartenbild editor.loadimage = Bild\nladen editor.saveimage = Bild\nspeichern -editor.unsaved = [crimson] Einige Änderungen wurden noch nicht gespeichert! [] Möchtest du den Editor wirklich verlassen? +editor.unsaved = Möchtest du den Editor wirklich verlassen? [crimson] Alle ungespeicherten Änderungen werden dann verworfen! editor.resizemap = Größe der Karte ändern editor.mapname = Kartenname editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte. @@ -409,14 +449,15 @@ toolmode.eraseores = Erze löschen toolmode.eraseores.description = Löscht nur Erze. toolmode.fillteams = Teams ausfüllen toolmode.fillteams.description = Füllt Teams aus statt Blöcke. -toolmode.drawteams = Teams Zeichnen +toolmode.drawteams = Teams zeichnen toolmode.drawteams.description = Zeichnet Teams statt Blöcke. filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu. filter.distort = Verzerren filter.noise = Rauschen -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = Gegnerischer Spawn Auswahl +filter.spawnpath = Weg zum Spawn +filter.corespawn = Kernauswahl filter.median = Median filter.oremedian = Erzmedian filter.blend = Mischen @@ -427,7 +468,7 @@ filter.mirror = Spiegel filter.clear = Löschen filter.option.ignore = Ignorieren filter.scatter = Streuen -filter.terrain = Terrain +filter.terrain = Landschaft filter.option.scale = Skalierung filter.option.chance = Wahrscheinlichkeit filter.option.mag = Größe @@ -436,10 +477,11 @@ filter.option.circle-scale = Kreisskalierung filter.option.octaves = Oktaven filter.option.falloff = Rückgang filter.option.angle = Winkel -filter.option.amount = Amount +filter.option.amount = Menge filter.option.block = Block filter.option.floor = Boden -filter.option.flooronto = Ziel Boden +filter.option.flooronto = Zielboden +filter.option.target = Ziel filter.option.wall = Wand filter.option.ore = Erz filter.option.floor2 = Sekundärer Boden @@ -456,7 +498,9 @@ load = Laden save = Speichern fps = FPS: {0} ping = Ping: {0}ms -language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv wird. +memory = Arbeitsspeicher: {0}mb +memory2 = Arbeitsspeicher:\n {0}mb +\n {1}mb +language.restart = Starte dein Spiel neu, um die Spracheinstellungen zu übernehmen. settings = Einstellungen tutorial = Tutorial tutorial.retake = Tutorial wiederholen @@ -464,38 +508,29 @@ editor = Editor mapeditor = Karteneditor abandon = Aufgeben -abandon.text = Diese Zone sowie alle Ressourcen werden dem Gegner überlassen. +abandon.text = Dieser Sektor sowie alle Ressourcen werden dem Gegner überlassen. locked = Gesperrt complete = [lightgray]Abschließen: requirement.wave = Erreiche Welle {0} in {1} requirement.core = Zerstöre den feindlichen Kern in {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Zu Zone zurückkehren:\n[lightgray]{0} -bestwave = [lightgray]Beste Welle: {0} -launch = Starten -launch.text = Launch -launch.title = Start erfolgreich -launch.next = [lightgray]Nächste Möglichkeit bei Welle {0} -launch.unable2 = [scarlet]START nicht möglich.[] -launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kannst nicht wieder zu dieser Karte zurückkehren. -launch.skip.confirm = Wenn du die Wartezeit überspringst, kannst du den Kern bis zu einer späteren Welle nicht mehr starten. +requirement.research = Erforsche {0} +requirement.produce = Produziere {0} +requirement.capture = Erobere {0} +launch.text = Start +research.multiplayer = Nur der Host kann forschen. +map.multiplayer = Nur der Host kann Sektoren ansehen. uncover = Freischalten -configure = Startitems festlegen -loadout = Loadout -resources = Resources +configure = Anfangsressourcen festlegen + +loadout = Anfangsressourcen +resources = Ressourcen bannedblocks = Gesperrte Blöcke addall = Alle hinzufügen -launch.destination = Destination: {0} +launch.from = Items werden von [accent]{0} []gestartet +launch.destination = Ziel: {0} configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein. -zone.unlocked = [lightgray]{0} freigeschaltet. -zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt. -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-Lebenskraft +boss.health = Boss-Lebenspunkte connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0} error.unreachable = Server nicht erreichbar. @@ -508,20 +543,50 @@ error.io = Netzwerk-I/O-Fehler. error.any = Unbekannter Netzwerkfehler. error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Regen +weather.snow.name = Schnee +weather.sandstorm.name = Sandsturm +weather.sporestorm.name = Sporensturm +weather.fog.name = Nebel -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select +sectors.unexplored = [lightgray]Unentdeckt +sectors.resources = Ressourcen: +sectors.production = Produktion: +sectors.export = Export: +sectors.time = Zeit: +sectors.threat = Gefahr: +sectors.wave = Welle: +sectors.stored = Gelagert: +sectors.resume = Weiterspielen +sectors.launch = Start +sectors.select = Auswählen sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Sektor umbenennen +sectors.enemybase = [scarlet]Gegnerische Basis +sectors.vulnerable = [scarlet]Angriffsgefährdet +sectors.underattack = [scarlet]Wird angegriffen! [accent]{0}% geschädigt +sectors.survives = [accent]Kann {0} Wellen überleben +sectors.go = Hingehen +sector.curcapture = Sektor erfolgreich erobert +sector.curlost = Sektor verloren +sector.missingresources = [scarlet]Fehlende Kernressourcen +sector.attacked = Sektor [accent]{0}[white] wird angegriffen! +sector.lost = Sektor [accent]{0}[white] verloren! +#note: the missing space in the line below is intentional +sector.captured = Sektor [accent]{0}[white]erobert! +threat.low = Niedrig +threat.medium = Mittel +threat.high = Hoch +threat.extreme = Extrem +threat.eradication = Zerstörung + +planets = Planeten + +planet.serpulo.name = Serpulo +planet.sun.name = Sonne + +sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -533,24 +598,46 @@ sector.overgrowth.name = Overgrowth sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass +sector.biomassFacility.name = Biomass Synthesis Facility +sector.windsweptIslands.name = Windswept Islands +sector.extractionOutpost.name = Extraction Outpost +sector.planetaryTerminal.name = Planetary Launch Terminal -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +sector.groundZero.description = Der optimale Ort, um anzufangen. Schwache Gegner und weniger Ressourcen.\nSammele so viel Kupfer und Blei wie möglich.\nGeh weiter. +sector.frozenForest.description = Auch hier, näher an den Bergen, sind die Sporen. Sogar die niedrigen Temperaturen können sie nicht zurückhalten.\n\nLerne, Strom zu verwenden. Baue Verbrennungsgeneratoren und Reparateure. +sector.saltFlats.description = Du befindest dich in der Nähe der Wüste. Hier gibt es nur wenige Ressourcen.\n\nDer Gegner hat hier ein Lager aufgestellt. Zerstöre es. Lasse nichts stehen. +sector.craters.description = Wasser hat sich hier, in diesem Überbleibsel aus dem alten Krieg, versammelt. Sammele Sand. Stelle Metaglas her. Benutze Wasser, um Bohrer und Geschütze zu kühlen. +sector.ruinousShores.description = Hinter der Wüste ist das Ufer. Es gab hier vor langer Zeit ein Uferabwehrsystem. Heute sind nur noch die einfachsten Abwehrgeschütze vorhanden, der Rest wurde verschrottet.\nBreite dich weiter aus. Finde die verlorenen Technologien wieder. +sector.stainedMountains.description = Im Landesinneren sind die Berge, noch unversehrt von den Sporen.\nNutze das reichliche vorhandene Titan und lerne, es zu benutzen.\n\nDie Gegner hier sind stärker. Gib ihnen keine Zeit, um ihre stärksten Einheiten zu schicken. +sector.overgrowth.description = Dieser Bereich ist überwuchert, näher an die Quelle der Sporen.\nDer Gegner hat hier einen Außenposten errichtet. Baue Mace-Einheiten. Zerstöre ihn. +sector.tarFields.description = Der Rand einer Ölproduktionszone, zwischen den Bergen und der Wüste. Einer der wenigen Orte mit brauchbaren Ölquellen.\nObwohl er vergessen wurde, hat dieser Ort mächtige gegnerische Lager in der Nähe. Unterschätze sie nicht.\n\n[lightgray]Erforsche, falls möglich, die Ölverarbeitung. +sector.desolateRift.description = Eine besonders gefährliche Zone. Viele Ressourcen aber wenig Platz. Hohe Wahrscheinlichkeit, vernichtet zu werden. Verlasse diesen Ort so bald wie möglich. Lass dich nicht durch die langen Abstände zwischen gegnerischen Angriffen täuschen. +sector.nuclearComplex.description = Diese Ruine war vor langer Zeit eine Anlage zur Verarbeitung von Thorium.\n[lightgray]Erforsche Thorium und dessen Anwendungen.\n\nDer Gegner ist hier stark vertreten und hält nach Angreifern Ausschau. +sector.fungalPass.description = Eine Übergangszone zwischen den Bergen und den niedrigeren, von Sporen befallenen Gebieten. Hier ist eine kleine gegnerische Basis.\nZerstöre sie.\nBenutze Dagger- und Crawler-Einheiten. Vernichte die beiden Kerne. +sector.biomassFacility.description = Die Sporenquelle. Dies ist der Ort, wo sie erforscht und hergestellt wurden.\nErforsche die Technologie, die sich hier versteckt. Stellen Sporen her, um Plastanium und Öl herzustellen.\n\n[lightgray]Als diese Anlage zerstört wurde, wurden die Sporen freigesetzt. Nichts im lokalen Ökosystem konnte so ein eindringliches Lebewesen bekämpfen. +sector.windsweptIslands.description = Diese Inseln befinden sich in der Nähe vom Ufer. Manche Aufzeichnungen behaupten, hier seien Fabriken, die [accent]Plastanium[] herstellen können.\n\nWehre dich gegen die gegnerischen Wassereinheiten. Stelle eine Basis auf den Inseln auf. Erforsche diese Fabriken. +sector.extractionOutpost.description = Ein Außenposten, der vom Gegner erstellt wurde, um Ressourcen in andere Sektoren zu transportieren.\n\nTrans-Sektorischer Transport ist nötig, um weiter voranzuschreiten. Zerstöre den Posten. Erforsche deren Launchpads. +sector.impact0078.description = Hier liegen Reste der interplanetarischen Transporteinheit, die dieses Sonnensystem zuerst betreten hat.\n\nRette so viel wie möglich von den Ruinen. Erforsche jede intakte Technologie. +sector.planetaryTerminal.description = Das Endziel.\n\nDiese Uferbasis besitzt ein Gerät, mit dem es möglich ist, Kerne auf andere Planeten zu schicken. Es ist [accent]sehr[] gut beschützt.\n\nStelle Wassereinheiten her. Eliminiere den Gegner so schnell wie möglich. Erforsche das Launchgerät. + +status.burning.name = Brennend +status.freezing.name = Frierend +status.wet.name = Nass +status.muddy.name = Schlammig +status.melting.name = Schmelzend +status.sapped.name = Schwächend +status.spore-slowed.name = Sporen-verlangsamt +status.tarred.name = Teerend +status.overclock.name = Übertaktend +status.shocked.name = Schockend +status.blasted.name = Sprengend +status.unmoving.name = Unbeweglich settings.language = Sprache settings.data = Spieldaten settings.reset = Auf Standard zurücksetzen settings.rebind = Zuweisen -settings.resetKey = Reset +settings.resetKey = Zurücksetzen settings.controls = Steuerung settings.game = Spiel settings.sound = Audio @@ -558,76 +645,121 @@ settings.graphics = Grafik settings.cleardata = Spieldaten zurücksetzen... settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden! settings.clearall.confirm = [scarlet]WARNUNG![]\nDas wird jegliche Spieldaten zurücksetzen, inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Sobald du 'OK' drückst, wird alles zurückgesetzt und das Spiel schließt sich automatisch. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = Möchtest du wirklich alle Speicherstände löschen? +settings.clearsaves = Speicherstände löschen +settings.clearresearch = Erforschungen löschen +settings.clearresearch.confirm = Möchtest du wirklich alle Erforschungen löschen? +settings.clearcampaignsaves = Kampagne-Speicherstände löschen +settings.clearcampaignsaves.confirm = Möchtest du wirklich alle Kampagne-Speicherstände löschen? paused = [accent]< Pausiert > clear = Leeren banned = [scarlet]Verbannt -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = Ja no = Nein info.title = Info error.title = [crimson]Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! unit.nobuild = [scarlet]Einheit kann nicht bauen! -blocks.input = Eingang -blocks.output = Ausgang -blocks.booster = Verstärkung -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Zuletzt konfiguriert: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Kapazität -blocks.powershot = Stromverbrauch/Schuss -blocks.damage = Schaden -blocks.targetsair = Visiert Lufteinheiten an -blocks.targetsground = Visiert Bodeneinheiten an -blocks.itemsmoved = Bewegungsgeschwindigkeit -blocks.launchtime = Zeit zwischen Starts -blocks.shootrange = Reichweite -blocks.size = Größe -blocks.displaysize = Display Size -blocks.liquidcapacity = Flüssigkeitskapazität -blocks.powerrange = Stromreichweite -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maximale Stromverbindungen -blocks.poweruse = Stromverbrauch -blocks.powerdamage = Stromverbrauch/Schadenspunkt -blocks.itemcapacity = Materialkapazität -blocks.basepowergeneration = Basis-Stromerzeugung -blocks.productiontime = Produktionszeit -blocks.repairtime = Zeit zur vollständigen Reparatur -blocks.speedincrease = Geschwindigkeitserhöhung -blocks.range = Reichweite -blocks.drilltier = Abbaubare Erze -blocks.drillspeed = Bohrgeschwindigkeit -blocks.boosteffect = Verstärkungseffekt -blocks.maxunits = Max. aktive Einheiten -blocks.health = Lebenspunkte -blocks.buildtime = Baudauer -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Baukosten -blocks.inaccuracy = Ungenauigkeit -blocks.shots = Schüsse -blocks.reload = Schüsse/Sekunde -blocks.ammo = Munition -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -bar.drilltierreq = Besserer Bohrer Benötigt -bar.noresources = Missing Resources -bar.corereq = Core Base Required +stat.description = Beschreibung +stat.input = Eingang +stat.output = Ausgang +stat.booster = Verstärkung +stat.tiles = Erforderte Untergründe +stat.affinities = Affinitäten +stat.opposites = Gegenteile +stat.powercapacity = Kapazität +stat.powershot = Stromverbrauch/Schuss +stat.damage = Schaden +stat.targetsair = Visiert Lufteinheiten an +stat.targetsground = Visiert Bodeneinheiten an +stat.itemsmoved = Bewegungsgeschwindigkeit +stat.launchtime = Zeit zwischen Starts +stat.shootrange = Reichweite +stat.size = Größe +stat.displaysize = Bildschirmgröße +stat.liquidcapacity = Flüssigkeitskapazität +stat.powerrange = Stromreichweite +stat.weapons = Waffen +stat.bullet = Geschoss +stat.linkrange = Verbindungsradius +stat.instructions = Befehle +stat.powerconnections = Maximale Stromverbindungen +stat.poweruse = Stromverbrauch +stat.powerdamage = Stromverbrauch/Schadenspunkt +stat.itemcapacity = Materialkapazität +stat.memorycapacity = Speicherkapazität +stat.basepowergeneration = Basis-Stromerzeugung +stat.productiontime = Produktionszeit +stat.repairtime = Zeit zur vollständigen Reparatur +stat.speedincrease = Geschwindigkeitserhöhung +stat.range = Reichweite +stat.drilltier = Abbaubare Erze +stat.drillspeed = Bohrgeschwindigkeit +stat.boosteffect = Verstärkungseffekt +stat.maxunits = Max. aktive Einheiten +stat.health = Lebenspunkte +stat.armour = Panzer +stat.buildtime = Baudauer +stat.maxconsecutive = Max. Konsekutive +stat.buildcost = Baukosten +stat.inaccuracy = Ungenauigkeit +stat.shots = Schüsse +stat.reload = Schüsse/Sekunde +stat.ammo = Munition +stat.shieldhealth = Schildlebenspunkte +stat.cooldowntime = Cooldown-Zeit +stat.explosiveness = Sprengkraft +stat.basedeflectchance = Grundreflektionschance +stat.lightningchance = Blitzwahr­schein­lich­keit +stat.lightningdamage = Blitzschaden +stat.flammability = Brennbarkeit +stat.radioactivity = Radioaktivität +stat.charge = Ladung +stat.heatcapacity = Hitzekapazität +stat.viscosity = Viskosität +stat.temperature = Temperatur +stat.speed = Geschwindigkeit +stat.buildspeed = Baugeschwindigkeit +stat.minespeed = Abbaugeschwindigkeit +stat.minetier = Abbau-Kraft +stat.payloadcapacity = Einheitenkapazität +stat.commandlimit = Kommandier-Limit +stat.abilities = Fähigkeiten +stat.canboost = Kann boosten +stat.flying = Flug +stat.ammouse = Muntionsverbrauch +stat.damagemultiplier = Schaden-Multiplikator +stat.healthmultiplier = Lebenspunkte-Multiplikator +stat.speedmultiplier = Geschwindigkeit-Multiplikator +stat.reloadmultiplier = Nachlade-Multiplikator +stat.buildspeedmultiplier = Baugeschwindigkeit-Multiplikator +stat.reactive = Reagiert mit + +ability.forcefield = Kraftfeld +ability.repairfield = Heilungsfeld +ability.statusfield = Statusfeld +ability.unitspawn = {0} Fabrik +ability.shieldregenfield = Schild-regenerations-Feld +ability.movelightning = Bewegungsblitze + +bar.drilltierreq = Besserer Bohrer benötigt +bar.noresources = Fehlende Ressourcen +bar.corereq = Kern-Basis erforderlich bar.drillspeed = Bohrgeschwindigkeit: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = Pumpengeschwindigkeit: {0}/s bar.efficiency = Effizienz: {0}% +bar.boost = Beschleunigung: {0}% bar.powerbalance = Strom: {0}/s bar.powerstored = Gespeichert: {0}/{1} bar.poweramount = Strom: {0} bar.poweroutput = Stromgenerierung: {0} +bar.powerlines = Verbindungen: {0}/{1} bar.items = Items: {0} bar.capacity = Kapazität: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = Flüssigkeit bar.heat = Hitze bar.power = Strom @@ -635,19 +767,24 @@ bar.progress = Baufortschritt bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Prozessorgesteuert + bullet.damage = [stat]{0}[lightgray] Schaden bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray] Kacheln bullet.incendiary = [stat]entzündend bullet.homing = [stat]zielsuchend -bullet.shock = [stat]schockend bullet.frag = [stat]explosiv +bullet.lightning = [stat]{0}[lightgray]x Blitz ~ [stat]{1}[lightgray] Schaden +bullet.buildingdamage = [stat]{0}%[lightgray]Blockschaden bullet.knockback = [stat]{0}[lightgray] zurückstoßend -bullet.freezing = [stat]frierend -bullet.tarred = [stat]teerend +bullet.pierce = [stat]{0}[lightgray]x Durchstechkraft +bullet.infinitepierce = [stat]Durchstechkraft +bullet.healpercent = [stat]{0}[lightgray]% Heilung bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator bullet.reload = [stat]{0}[lightgray]x Feuerrate unit.blocks = Blöcke +unit.blockssquared = Blöcke² unit.powersecond = Stromeinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde unit.itemssecond = Materialeinheiten/Sekunde @@ -660,33 +797,38 @@ unit.persecond = /sek unit.perminute = /min unit.timesspeed = x Geschwindigkeit unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = Schildlebenspunkte unit.items = Materialeinheiten unit.thousands = k -unit.millions = mil -unit.billions = b +unit.millions = Mio +unit.billions = Mrd +unit.pershot = /Schuss +category.purpose = Beschreibung category.general = Allgemeines category.power = Strom category.liquids = Flüssigkeiten category.items = Materialien category.crafting = Erzeugung -category.shooting = Schießen +category.function = Funktion category.optional = Optionale Zusätze setting.landscape.name = Landschaft sperren setting.shadows.name = Schatten setting.blockreplace.name = Automatische Blockvorschläge setting.linear.name = Lineare Filterung setting.hints.name = Tipps -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) +setting.logichints.name = Logiktipps +setting.flow.name = Ressourcen-Fluss anzeigen +setting.backgroundpause.name = Im Hintergrund pausieren setting.buildautopause.name = Bauen automatisch pausieren -setting.mapcenter.name = Auto Center Map To Player +setting.doubletapmine.name = Doppeltippen zum Abbauen +setting.modcrashdisable.name = Mods bei Absturz deaktivieren setting.animatedwater.name = Animiertes Wasser setting.animatedshields.name = Animierte Schilde setting.antialias.name = Antialias[lightgray] (Neustart erforderlich)[] -setting.playerindicators.name = Player Indicators +setting.playerindicators.name = Spieler-Indikatoren setting.indicators.name = Verbündeten-Indikatoren setting.autotarget.name = Auto-Zielauswahl -setting.keyboard.name = Maus+Tastatur Steuerung +setting.keyboard.name = Maus+Tastatur-Steuerung setting.touchscreen.name = Touchscreen-Steuerung setting.fpscap.name = Max. FPS setting.fpscap.none = Kein(e) @@ -702,25 +844,23 @@ setting.difficulty.name = Schwierigkeit: setting.screenshake.name = Wackeleffekt setting.effects.name = Effekte anzeigen setting.destroyedblocks.name = Zerstörte Blöcke anzeigen -setting.blockstatus.name = Display Block Status +setting.blockstatus.name = Block-Status anzeigen setting.conveyorpathfinding.name = Automatische Wegfindung beim Bau von Förderbändern setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave-Häufigkeit setting.seconds = {0} Sekunden -setting.blockselecttimeout.name = Block-Auswahl Timeout setting.milliseconds = {0} Millisekunden setting.fullscreen.name = Vollbild setting.borderlesswindow.name = Randloses Fenster [lightgray](Neustart vielleicht erforderlich) -setting.fps.name = FPS zeigen -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Block Shortcuts anzeigen +setting.fps.name = FPS anzeigen +setting.smoothcamera.name = Sanfte Kamerabewegungen setting.vsync.name = VSync setting.pixelate.name = Verpixeln [lightgray](Könnte die Leistung beeinträchtigen) setting.minimap.name = Zeige die Minimap -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Kern-Items anzeigen setting.position.name = Spieler-Position anzeigen setting.musicvol.name = Musiklautstärke -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = Planetatmosphäre zeigen setting.ambientvol.name = Ambient-Lautstärke setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke @@ -728,39 +868,41 @@ setting.mutesound.name = Audioeffekte stummschalten setting.crashreport.name = Anonyme Absturzberichte senden setting.savecreate.name = Automatisch speichern setting.publichost.name = Öffentliche Sichtbarkeit des Spiels -setting.playerlimit.name = Player Limit +setting.playerlimit.name = Spielerbegrenzung setting.chatopacity.name = Chat-Deckkraft setting.lasersopacity.name = Power-Laser-Deckkraft -setting.bridgeopacity.name = Bridge Opacity +setting.bridgeopacity.name = Brücken-Deckkraft setting.playerchat.name = Chat im Spiel anzeigen -public.confirm = Willst du dein Spiel öffentlich zugänglich machen?\n[accent]Jeder kann deinem Spiel beitreten.\n[lightgray]Dies kann später in den Einstellung->Spielt->Öffentliches Spiel geändert werden. +setting.showweather.name = Wetter anzeigen +public.confirm = Willst du dein Spiel öffentlich zugänglich machen?\n[accent]Jeder kann deinem Spiel beitreten.\n[lightgray]Dies kann später in den Einstellungen->Spiel->Öffentliches Spiel geändert werden. +public.confirm.really = Wenn du mit Freunden spielen willst, drücke [green]Freunde einladen[] statt einen [scarlet]öffentlichen Server[] zu erstellen!\nBist du dir sicher, dass du dein Spiel [scarlet]öffentlich[] machen möchtest? public.beta = Bemerke: Beta-Versionen des Spiels können keine öffentlichen Spiele machen. 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]Die meisten Tastenzuweisungen hier funktionieren auf z.B. mobilen Geräten nicht. Nur grundlegende Bewegung wird unterstützt. +keybinds.mobile = [scarlet]Die meisten Tastenzuweisungen hier funktionieren auf mobilen Geräten nicht. Nur grundlegende Bewegung wird unterstützt. category.general.name = Allgemein category.view.name = Ansicht category.multiplayer.name = Mehrspieler -category.blocks.name = Block Select +category.blocks.name = Blockauswahl command.attack = Angreifen command.rally = Patrouillieren command.retreat = Rückzug -command.idle = Idle +command.idle = Stehen bleiben placement.blockselectkeys = \n[lightgray]Taste: [{0}, keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.control.name = Einheit steuern keybind.clear_building.name = Bauplan löschen keybind.press = Drücke eine Taste... keybind.press.axis = Drücke eine Taste oder bewege eine Achse... keybind.screenshot.name = Karten-Screenshot keybind.toggle_power_lines.name = Power Lasers umschalten -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_block_status.name = Blockstatus umschalten keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse keybind.mouse_move.name = Der Maus folgen -keybind.pan.name = Pan View +keybind.pan.name = Kamera alleine bewegen keybind.boost.name = Boost keybind.schematic_select.name = Bereich auswählen keybind.schematic_menu.name = Entwurfsmenü @@ -788,24 +930,28 @@ keybind.diagonal_placement.name = Diagonal platzieren keybind.pick.name = Block auswählen keybind.break_block.name = Block zerstören keybind.deselect.name = Auswahl aufheben -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Block aufheben +keybind.dropCargo.name = Block fallen lassen +keybind.command.name = Einheiten kommandieren keybind.shoot.name = Schießen keybind.zoom.name = Zoomen keybind.menu.name = Menü keybind.pause.name = Pause keybind.pause_building.name = Pausieren/Fortsetzen des Bauens keybind.minimap.name = Minimap +keybind.planet_map.name = Planetenkarte +keybind.research.name = Forschen +keybind.block_info.name = Blockinformationen anzeigen keybind.chat.name = Chat keybind.player_list.name = Spielerliste keybind.console.name = Konsole keybind.rotate.name = Drehen -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotateplaced.name = Gebauten Block drehen (gedrückt halten) keybind.toggle_menus.name = Menüs umschalten keybind.chat_history_prev.name = Chat Historie zurück keybind.chat_history_next.name = Chat Historie vor keybind.chat_scroll.name = Chat scrollen +keybind.chat_mode.name = Chatmodus ändern keybind.drop_unit.name = Einheit absetzen keybind.zoom_minimap.name = Minimap-Zoom mode.help.title = Beschreibung der Modi @@ -822,42 +968,51 @@ mode.custom = Angepasste Regeln rules.infiniteresources = Unbegrenzte Ressourcen rules.reactorexplosions = Reaktor-Explosionen +rules.coreincinerates = Kern verbrennt überflüssige Materialien +rules.schematic = Entwürfe erlaubt rules.wavetimer = Wellen-Timer rules.waves = Wellen rules.attack = Angriff-Modus -rules.buildai = AI Building +rules.buildai = KI kann bauen rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team) -rules.blockhealthmultiplier = Block Health Multiplier -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator +rules.blockhealthmultiplier = Block-Lebenspunkte-Multiplikator +rules.blockdamagemultiplier = Block-Schaden-Multiplikator +rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator rules.unitdamagemultiplier = Schaden-Einheit Multiplikator -rules.enemycorebuildradius = Bauverbot Radius druch feindlichen Kern:[lightgray] (Kacheln) +rules.unitcapvariable = Kerne zählen zum Einheiten-Limit dazu +rules.unitcap = Einheiten-Limit +rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln) rules.wavespacing = Wellen-Abstand:[lightgray] (Sek) rules.buildcostmultiplier = Bau-Kosten Multiplikator rules.buildspeedmultiplier = Bau-Schnelligkeit Multiplikator -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier +rules.deconstructrefundmultiplier = Abbau Ressourcen-Rückerstattung rules.waitForWaveToEnd = Warten bis Welle endet rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln) -rules.unitammo = Units Require Ammo +rules.unitammo = Einheiten benötigen Munition rules.title.waves = Wellen -rules.title.resourcesbuilding = Ressourcen & Gebäude +rules.title.resourcesbuilding = Ressourcen & Blöcke rules.title.enemy = Gegner rules.title.unit = Einheiten rules.title.experimental = Experimentell -rules.title.environment = Environment -rules.lighting = Lighting -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Ambient Light -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.title.environment = Umgebung +rules.lighting = Blitze +rules.enemyLights = Gegnerisches Licht +rules.fire = Feuer +rules.explosions = Explosionsschaden +rules.ambientlight = Umgebungslicht +rules.weather = Wetter +rules.weather.frequency = Häufigkeit: +rules.weather.always = Immer +rules.weather.duration = Dauer: content.item.name = Materialien content.liquid.name = Flüssigkeiten content.unit.name = Einheiten content.block.name = Blöcke +content.status.name = Effekte +content.sector.name = Sektoren + item.copper.name = Kupfer item.lead.name = Blei item.coal.name = Kohle @@ -879,23 +1034,6 @@ liquid.slag.name = Schlacke liquid.oil.name = Öl liquid.cryofluid.name = Kryoflüssigkeit -item.explosiveness = [lightgray]Explosivität: {0} -item.flammability = [lightgray]Entflammbarkeit: {0} -item.radioactivity = [lightgray]Radioaktivität: {0} - -unit.health = [lightgray]Lebenskraft: {0} -unit.speed = [lightgray]Geschwindigkeit: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Wärmekapazität: {0} -liquid.viscosity = [lightgray]Viskosität: {0} -liquid.temperature = [lightgray]Temperatur: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -904,11 +1042,11 @@ unit.pulsar.name = Pulsar unit.quasar.name = Quasar unit.crawler.name = Crawler unit.atrax.name = Atrax -unit.spiroct.name = Spiroct +unit.spiroct.name = Spirokt unit.arkyid.name = Arkyid unit.toxopid.name = Toxopid unit.flare.name = Flare -unit.horizon.name = Horizon +unit.horizon.name = Horizont unit.zenith.name = Zenith unit.antumbra.name = Antumbra unit.eclipse.name = Eclipse @@ -916,7 +1054,7 @@ unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega unit.quad.name = Quad -unit.oct.name = Oct +unit.oct.name = Okt unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde @@ -928,30 +1066,32 @@ unit.gamma.name = Gamma unit.scepter.name = Scepter unit.reign.name = Reign unit.vela.name = Vela -unit.corvus.name = Corvus +unit.corvus.name = Korvus -block.resupply-point.name = Resupply Point +block.resupply-point.name = Munitionsvorrat block.parallax.name = Parallax -block.cliff.name = Cliff +block.cliff.name = Klippe block.sand-boulder.name = Sandbrocken +block.basalt-boulder.name = Basaltbrocken block.grass.name = Gras -block.slag.name = Slag +block.slag.name = Schlacke +block.space.name = Weltall block.salt.name = Salz -block.salt-wall.name = Salt Wall +block.salt-wall.name = Salzwand block.pebbles.name = Geröll block.tendrils.name = Ranken -block.sand-wall.name = Sand Wall +block.sand-wall.name = Sandwand block.spore-pine.name = Sporenkiefer -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Sporenwand +block.boulder.name = Felsbrocken +block.snow-boulder.name = Schneebrocken block.snow-pine.name = Schnee-Kiefer block.shale.name = Schiefer block.shale-boulder.name = Schiefergeröll block.moss.name = Moos block.shrubs.name = Gestrüpp block.spore-moss.name = Moossporen -block.shale-wall.name = Shale Wall +block.shale-wall.name = Schieferwand block.scrap-wall.name = Schrottmauer block.scrap-wall-large.name = Große Schrottmauer block.scrap-wall-huge.name = Riesige Schrottmauer @@ -967,8 +1107,8 @@ 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 = Unreines Wasser -block.darksand-tainted-water.name = Unreines Wasser (Dunkler Sand) +block.tainted-water.name = Dreckiges Wasser +block.darksand-tainted-water.name = Dreckiges Wasser (Dunkler Sand) block.tar.name = Teer block.stone.name = Stein block.sand.name = Sand @@ -979,17 +1119,18 @@ block.craters.name = Krater block.sand-water.name = Sandiges Wasser block.darksand-water.name = Dunkles sandiges Wasser block.char.name = Holzkohle -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = Dazit +block.dacite-wall.name = Dazitwand +block.dacite-boulder.name = Dazitgeröll block.ice-snow.name = Eisschnee -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = Steinwand +block.ice-wall.name = Eiswand +block.snow-wall.name = Schneewand +block.dune-wall.name = Dünenwand block.pine.name = Kiefer -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Erde +block.dirt-wall.name = Erdwand +block.mud.name = Schlamm block.white-tree-dead.name = Weißer Baum (tot) block.white-tree.name = Weißer Baum block.spore-cluster.name = Sporen-Cluster @@ -1027,9 +1168,8 @@ block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Förderband block.titanium-conveyor.name = Titan-Förderband -block.plastanium-conveyor.name = Plastanium Förderband +block.plastanium-conveyor.name = Plastanium-Förderband block.armored-conveyor.name = Gepanzertes Förderband -block.armored-conveyor.description = Bewegt Gegenstände genauso schnell wie das Titan-Förderband, ist aber besser gepanzert. Akzeptiert nur Verbindungen mit anderen Förderbändern. block.junction.name = Kreuzung block.router.name = Verteiler block.distributor.name = Großer Verteiler @@ -1037,7 +1177,6 @@ block.sorter.name = Sortierer block.inverted-sorter.name = Invertierter Sortierer block.message.name = Nachricht block.illuminator.name = Illuminierer -block.illuminator.description = Eine kleine, kompakte, konfigurierbare Lichtquelle. Benötigt Strom. block.overflow-gate.name = Überlauftor block.underflow-gate.name = Unterlauftor block.silicon-smelter.name = Silizium-Schmelzer @@ -1071,10 +1210,11 @@ block.item-void.name = Materialschlucker block.liquid-source.name = Flüssigkeitsquelle block.liquid-void.name = Flüssigkeitsschlucker block.power-void.name = Stromsenke -block.power-source.name = Unendliche Stromquelle +block.power-source.name = Stromquelle block.unloader.name = Entlader block.vault.name = Tresor block.wave.name = Welle +block.tsunami.name = Tsunami block.swarmer.name = Schwärmer block.salvo.name = Salve block.ripple.name = Zerstörer @@ -1114,98 +1254,132 @@ block.arc.name = Arcus block.rtg-generator.name = RTG-Generator block.spectre.name = Phantom block.meltdown.name = Meltdown -block.container.name = Container +block.foreshadow.name = Foreshadow +block.container.name = Behälter block.launch-pad.name = Launchpad block.launch-pad-large.name = Großes Launchpad block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.command-center.name = Kommandozentrale +block.ground-factory.name = Bodenfabrik +block.air-factory.name = Luftfabrik +block.naval-factory.name = Wasserfabrik +block.additive-reconstructor.name = Hinzufügender Rekonstrukteur +block.multiplicative-reconstructor.name = Multiplikativer Rekonstrukteur +block.exponential-reconstructor.name = Exponentieller Rekonstrukteur +block.tetrative-reconstructor.name = Tetrativer Rekonstrukteur +block.payload-conveyor.name = Einheitenförderband +block.payload-router.name = Einheitenverteiler +block.disassembler.name = Großer Trenner +block.silicon-crucible.name = Silizium Schmelztiegel +block.overdrive-dome.name = Beschleunigungs-Maschine +#experimental, may be removed +block.block-forge.name = Block-Fabrik +block.block-loader.name = Block-Lader +block.block-unloader.name = Block-Entlader +block.interplanetary-accelerator.name = Interplanetarischer Beschleuniger -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Schalter +block.micro-processor.name = Mikroprozessor +block.logic-processor.name = Logikprozessor +block.hyper-processor.name = Hyperprozessor +block.logic-display.name = Logik-Bildschirm +block.large-logic-display.name = Großer Logik-Bildschirm +block.memory-cell.name = Speicherzelle +block.memory-bank.name = Große Speicherzelle team.blue.name = Blau team.crux.name = Rot team.sharded.name = Orange team.orange.name = Orange -team.derelict.name = Derelict +team.derelict.name = Derelikt team.green.name = Grün team.purple.name = Lila -tutorial.next = [lightgray] -tutorial.intro = Du befindest dich im[scarlet] Mindustry-Tutorial.[]\nBeginne, indem du[accent] Kupfer abbaust[]. Tippe dazu auf ein Kupfervorkommen in der Nähe deiner Basis.\n\n[accent]{0}/{1} Kupfer -tutorial.intro.mobile = Du befindest dich im [scarlet]Mindustry Tutorial.[]\nWische über den Bildschirm, um dich zu bewegen.\n[accent]Benutze zwei Finger[] um heran- und hinauszuzoomen.\nBeginne, indem du [accent]Kupfer abbaust[]. Bewege dich zu einem Kupfervorkommen und tippe anschließend darauf.\n\n[accent]{0}/{1} Kupfer -tutorial.drill = Manuelles Abbauen ist ineffizient.\n[accent]Bohrer []können automatisch abbauen.\nTippe auf den Bohrer-Tab unten rechts.\nWähle den[accent] Mechanischen Bohrer[].\nPlatziere ihn durch Klicken auf ein Kupfervorkommen.\nMit einem [accent]Rechtsklick[] brichst du den Bau ab. -tutorial.drill.mobile = Manuelles Abbauen ist ineffizient.\n[accent]Bohrer []können automatisch abbauen.\nTippe auf den Bohrer Tab unten rechts.\nWähle den[accent] Mechanischen Bohrer[].\nPlatziere ihn durch Tippen auf ein Kupfervorkommen, dann klicke auf das[accent] Häkchen[] unten um deine Auswahl zu bestätigen.\nKlicke auf den[accent] X-Button[], um den Bau abzubrechen. -tutorial.blockinfo = Jeder Block hat unterschiedliche Eigenschaften. Jeder Bohrer kann immer nur ein bestimmtes Material abbauen.\nFür Infos und Stats eines Blocks wähle einen Block im Baumenü aus und [accent] klicke auf den "?"-Button.[]\n\n[accent]Schaue dir jetzt die Stats des Mechanischen Bohrers an.[] -tutorial.conveyor = Mit [accent]Förderbändern[] werden Materialien zum Kern transportiert.\nReihe mehrere Förderbänder aneinander bis zum Kern. -tutorial.conveyor.mobile = Mit [accent]Förderbändern[] werden Materialien zum Kern transportiert.\nReihe mehrere Förderbänder aneinander bis zum Kern.\n[accent] Zum Bau in einer Reihe lasse deinen Finger für einige Sekunden gedrückt[] und ziehe ihn in eine beliebige Richtung.\n\n[accent]Platziere 2 Förderbänder, dann transportiere ein Erz zum Kern. -tutorial.turret = Verteidigungsgebäude müssen gebaut werden um[lightgray] Gegner[] abzuwehren.\nBaue ein Doppelgeschütz in die Nähe deiner Basis. -tutorial.drillturret = Doppelgeschütz 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 = Du kannst das Spiel jederzeit [accent]pausieren.[]\nIn einer Pause kannst du den Bau weiterer Gebäude in Auftrag geben.\n\n[accent]Drücke die Leertaste um zu pausieren. -tutorial.pause.mobile = Du kannst das Spiel jederzeit [accent]pausieren.[]\nIn einer Pause kannst du den Bau weiterer Gebäude in Auftrag geben.\n\n[accent]Drücke diesen Button oben links um zu pausieren. -tutorial.unpause = Drücke die Leertaste erneut, um das Spiel fortzusetzen. -tutorial.unpause.mobile = Drücke ihn erneut, um das Spiel fortzusetzen. -tutorial.breaking = Oft kommt es vor, dass Blöcke zerstört werden müssen.\n[accent]Halte die rechte Maustaste gedrückt[] und wähle eine Fläche aus. Dadurch werden alle Blöcke darin zerstört.[]\n\n[accent]Zerstöre alle Schrott-Blöcke links neben deinem Kern mithilfe der Flächenauswahl. -tutorial.breaking.mobile = Oft kommt es vor, dass Blöcke zerstört werden müssen.\n[accent]Wähle den Abbau-Modus[], dann wähle einen Block um ihn zu zerstören.\nZerstöre eine Fläche, indem du deinen Finger einige Sekunden gedrückt hältst[] und in eine beliebige Richtung ziehst.\nTippe auf das Häkchen um den Rückbau zu bestätigen.\n\n[accent]Zerstöre all Schrott-Blöcke links des Kerns mithilfe der Flächenauswahl. -tutorial.withdraw = Einige Situationen erfordern, dass Materialien direkt aus den Blöcken aufgenommen werden.\nUm dies zu tun, [accent]tippe auf einen Block[] mit Materialien dann [accent]tippe auf das Material[] in diesem Block.\nUm mehrere Materialien zu entnehmen [accent]tippe darauf und halte die Maustaste gedrückt[].\n\n[accent]Entnimm etwas Kupfer vom Kern.[] -tutorial.deposit = Materialien können in Blöcke abgelegt werden, indem du die linke Maustaste drückst und von deinem Schiff dorthin ziehst.\n\n[accent]Lege das Kupfer zurück in den Kern.[] -tutorial.waves = Der [lightgray]Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Baue mehr Geschütze. -tutorial.waves.mobile = Der[lightgray] Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Dein Schiff feuert automatisch auf Gegner.\nBaue mehr Geschütze und Bohrer. Baue mehr Kupfer ab. -tutorial.launch = Sobald du eine bestimmte Welle erreicht hast, kannst du die [accent]Mission abschließen[]. Dadurch lässt du deine Basis zurück[accent] und überträgst alle Ressourcen in deinen Kern.[]\nDiese Ressourcen können zur Erforschung neuer Technologien eingesetzt werden.\n\n[accent]Drücke nun den Abschluss-Button. +hint.skip = Überspringen +hint.desktopMove = Drücke [accent][[WASD][], um dich zu bewegen. +hint.zoom = [accent]Scrolle[], um rein oder raus zu zoomen. +hint.mine = Bewege dich zum \uf8c4 Kupfererz und [accent]tippe darauf[], um es manuell abzubauen. +hint.desktopShoot = Benutze [accent][[Linksklick][], um zu schießen. +hint.depositItems = Um Materialien in den Kern zu tun, ziehe sie von dir zum Kern. +hint.respawn = Um im Kern zu respawnen, drücke [accent][[V][]. +hint.respawn.mobile = Du steuerst nun eine Einheit oder einen Block. Um wieder zur normalen Einheit zu werden, [accent]drücke die Abbildung von dir oben links.[] +hint.desktopPause = Benutze [accent][[Leertaste][], um das Spiel zu pausieren oder entpausieren. +hint.placeDrill = Wähle die \ue85e [accent]Bohrer[]-Kategorie im Menü unten rechts aus, drücke dann auf den \uf870 [accent]Bohrer[] und klicke auf ein Feld mit Kupfererz, um ihn zu platzieren. +hint.placeDrill.mobile = Wähle die \ue85e[accent]Bohrer[]-Kategorie im Menü unten rechts aus, drücke dann auf den \uf870 [accent]Bohrer[] und klicke auf ein Feld mit Kupfererz, um ihn zu platzieren.\n\nGehe zuletzt auf das \ue800 [accent]Häkchen[] unten rechts, um dies zu bestätigen. +hint.placeConveyor = Förderbänder bewegen Materialien zwischen verschiedenen Blöcken. Wähle ein \uf896 [accent]Förderband[] aus der \ue814 [accent]Verteilung[]-Kategorie aus.\n\nKlicke und bewege deine Maus, um mehrere Förderbänder zu setzen.\n[accent]Scrolle[] um sie zu drehen. +hint.placeConveyor.mobile = Förderbänder bewegen Materialien zwischen verschiedenen Blöcken. Wähle ein \uf896 [accent]Förderband[] aus der \ue814 [accent]Verteilung[]-Kategorie aus.\n\nHalte deinen Finger eine Sekunde auf dem Bildschirm und bewege ihn dann, um mehrere Förderbänder zu setzen. +hint.placeTurret = Platziere \uf861 [accent]Geschütze[], um deine Basis vor Gegnern zu beschützen.\n\nGeschütze benötigen Munition - in diesem Fall \uf838Kupfer.\nBenutze Bohrer und Förderbänder, um dies zu besorgen. +hint.breaking = Benutze [accent]Rechtsklick[] und bewege deine Maus, um zu zerstören. +hint.breaking.mobile = Aktiviere den \ue817 [accent]Hammer[] unten rechts und tippe, um Blöcke zu zerstören.\n\nHalte deinen Finger auf dem Bildschirm, um eine Fläche auszuwählen. +hint.research = Nehme den \ue875 [accent]Forschen[]-Knopf um neue Technologien zu erforschen. +hint.research.mobile = Nehme den \ue875 [accent]Forschen[]-Knopf im \ue88c [accent]Menü[], um neue Technologien zu erforschen. +hint.unitControl = Halte [accent][[L-STRG][] und [accent]klicke[], um alliierte Einheiten oder Geschütze zu steuern. +hint.unitControl.mobile = [accent][[Doppelklicke][], um alliierte Einheiten oder Geschütze zu steuern. +hint.launch = Sobald du genug Ressourcen gesammelt hast, kannst du [accent]Starten[], indem du andere Sektoren auf der \ue827 [accent]Karte[] unten rechts auswählst. +hint.launch.mobile = Sobald du genug Ressourcen gesammelt hast, kannst du [accent]Starten[], indem du andere Sektoren auf der \ue827 [accent]Karte[] im \ue88c [accent]Menü[] auswählst. +hint.schematicSelect = Halte [accent][[F][] gedrückt und bewege deine Maus, um Blöcke zu kopieren.\n\nMit [accent][[Mittelklick][] kannst du einen einzelnen Block kopieren. +hint.conveyorPathfind = Halte [accent][[L-STRG][] während du Förderbänder baust, um automatisch einen Weg zu finden. +hint.conveyorPathfind.mobile = Aktiviere den \ue844 [accent]Diagonal-Modus[] unten rechts und platziere Förderbänder, um automatisch einen Weg zu generieren. +hint.boost = Halte [accent][[L-Shift][] gedrückt, um über Hindernisse zu boosten.\n\nNur manche Bodeneinheiten können das. +hint.command = Drücke [accent][[G][], um [accent]ähnliche[] Einheiten in Formation zu steuern.\n\nUm Bodeneinheiten zu steuern, musst du zuerst eine Bodeneinheit werden. +hint.command.mobile = [accent][[Doppelklicke][] deine Einheit, um [accent]ähnliche[] Einheiten in Formation zu steuern. +hint.payloadPickup = Du kannst [accent][[[] drücken, um kleine Einheiten oder Blöcke hochzuheben. +hint.payloadPickup.mobile = [accent]Halte deinen Finger[] auf eine kleine Einheit oder einen kleinen Block, um ihn aufzuheben. +hint.payloadDrop = Drücke [accent]][], um etwas fallen zu lassen. +hint.payloadDrop.mobile = [accent]Halte deinen Finger[] auf einen freien Ort, um eine Einheit oder einen Block da fallen zu lassen. +hint.waveFire = [accent]Wellen[]-Geschütze mit Wassermunition löschen automatisch Feuer. +hint.generator = \uf879 [accent]Verbrennungsgeneratoren[] verbrennen Kohle und übertragen diesen Strom in angrenzende Blöcke.\n\nDie Reichweite der Stromübertragung kann mit \uf87f [accent]Stromknoten[] erweitert werden. +hint.guardian = [accent]Boss[]-Einheiten sind gepanzert. Schwache Munition wie [accent]Kupfer[] und [accent]Blei[] sind [scarlet]nicht effektiv[].\n\nBenutze bessere Geschütze oder \uf835 [accent]Graphit[] als \uf861Duo-/\uf859Salvenmunition um einen Boss zu besiegen. +hint.coreUpgrade = Kerne können aufgerüstet werden, indem man [accent]bessere Kerne über sie platziert[].\n\nPlatziere einen  [accent]Fundament[]-Kern über einen ï¡© [accent]Scherben[]-Kern. Stelle sicher, dass ausreichend Platz verfügbar ist. +hint.presetLaunch = Zu grauen [accent]Sektoren[] wie dem [accent]Frozen Forest[] kann man von überall aus hin starten. Es ist nicht nötig, benachbarte Sektoren zu erobern.\n\n[accent]Nummerierte Sektoren[] wie dieser hier sind [accent]optional[]. +hint.coreIncinerate = Wenn dem Kern Materialien zugeführt werden, für die er keinen Platz mehr hat, werden diese [accent]verbrannt[]. +hint.coopCampaign = Wenn du die [accent]Mehrspielerkampagne[] spielst, werden produzierte Items [accent]zu deinen lokalen Sektoren[] geschickt.\n\nNeuen Erforschungen vom Host werden auch übertragen. -item.copper.description = Ein nützliches Material. Wird in allen Arten von Blöcken verwendet. -item.lead.description = Ein grundlegendes Material. Häufig in Elektronik und Flüssigkeits-Transport-Blöcken verwendet. -item.metaglass.description = Eine extrem harte Glasmischung. Wird zur Verteilung und Lagerung von Flüssigkeiten benutzt. -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äufig vorkommender Kraftstoff. Fossilierte Pflanzenmasse, geformt lange bevor dem Sporen-Ereignis. -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. Enthält Spuren verschiedener Metalle. -item.silicon.description = Ein sehr nützlicher Halbleiter. Findet Anwendung in Solaranlagen, komplexer Elektronik und zielsuchender Munition. -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.copper.description = Wird als Baumaterial oder Munition verwendet. +item.copper.details = Kupfer. Auf Serpulo reichlich vorhanden. Strukturell schwach, solange es nicht verstärkt wird. +item.lead.description = Wird in elektrischen Blöcken oder beim Flüssigkeitstransport verwendet. +item.lead.details = Dicht. Träge. Wird sehr oft in Batterien verwendet.\nInfo: Wahrscheinlich giftig für biologische Lebewesen, obwohl es sowieso nicht mehr viele von denen gibt. +item.metaglass.description = Wird beim Flüssigkeitstransport und -lagerung verwendet. +item.graphite.description = Wird als Munition oder elektrischer Leiter eingesetzt. +item.sand.description = Nützlich für die Herstellung vieler anderer Materialien. +item.coal.description = Kann als Brennstoff oder zur Herstellung anderer Materialien verwendet werden. +item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon lange vor dem Seeding gebildet hat. +item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt. +item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet. +item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet. +item.scrap.details = Übriggebliebene Reste alter Blöcke oder Einheiten. +item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet. +item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt. +item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden. +item.surge-alloy.description = Wird in sehr fortgeschrittenen Waffen und Abwehrsystemen benutzt. 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 zur Kühlung verwendet werden. -liquid.cryofluid.description = Die Flüssigkeit, die Dinge am effizientesten herunterkühlen kann. +item.spore-pod.details = Sporen. Wahrscheinlich ein künstlich erschaffenes Lebewesen. Geben giftige Gase für andere Lebewesen ab. Sehr invasiv. Unter bestimmten Bedingungen sehr brennbar. +item.blast-compound.description = Wird in Bomben oder als explosive Munition verwendet. +item.pyratite.description = Kann in Verbrennungsgeneratoren oder als brennende Munition verbrannt werden. -block.message.description = Speichert eine Nachricht. Wird genutzt, um mit Verbündeten zu kommunizieren. -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. +liquid.water.description = Wird üblicherweise zum Kühlen von Maschinen und zur Müllverarbeitung verwendet. +liquid.slag.description = Kann in Trennern verfeinert oder als Waffe gegen Gegner verwendet werden. +liquid.oil.description = Wird in fortgeschrittener Materialgewinnung und als brennende Munition verwendet. +liquid.cryofluid.description = Wird als Kühlung in Geschützen, Fabriken oder Reaktoren verwendet. + +block.resupply-point.description = Füllt Einheiten in der Nähe mit Kupfermunition wieder auf. Nicht mit Einheiten kompatibel, die Strom benötigen. +block.armored-conveyor.description = Bewegt Materialien voran. Materialien können von der Seite nicht auf das Förderband. +block.illuminator.description = Eine Lichtquelle. +block.message.description = Speichert eine Nachricht, die genutzt wird, um mit Verbündeten zu kommunizieren. +block.graphite-press.description = Komprimiert Kohle zu Graphit. +block.multi-press.description = Komprimiert Kohle zu Graphit. Braucht für die Kühlung Wasser. +block.silicon-smelter.description = Stellt aus Sand und Kohle Silizium her. +block.kiln.description = Schmelzt Sand und Blei zu Metaglas. 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.phase-weaver.description = Produziert Phasengewebe aus Thorium und Sand. +block.alloy-smelter.description = Verschmilzt Titan, Blei, Silizium und Kupfer zu einer Stromstoßlegierung. block.cryofluid-mixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt. -block.blast-mixer.description = Verwendet Sporen, um Pyratit in eine weniger enzündliche aber explosive Mischung umzuwandeln. +block.blast-mixer.description = Stellt aus Sporen und Pyratit eine explosive Mischung her. block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit. -block.melter.description = Erhitzt Schrott auf extrem hohe Temperaturen, um Lava zu erhalten. -block.separator.description = Setzt Lava Wasserdruck aus, um verschiedene Mineralien freizulegen. -block.spore-press.description = Komprimiert Sporenhülsen zu Öl. -block.pulverizer.description = Zertrümmert Schrott zu Sand. Nützlich, wenn kein natürlicher Sand verfügbar ist. +block.melter.description = Erhitzt Schrott, um Schlacke zu erhalten. +block.separator.description = Trennt Schlacke in seine Bestandteile. +block.spore-press.description = Komprimiert Sporen-Pods zu Öl. +block.pulverizer.description = Zertrümmert Schrott zu Sand. 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-Modus verfügbar. @@ -1214,92 +1388,298 @@ block.item-source.description = Produziert unendlich viele Gegenstände. Nur im 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.liquid-void.description = Entfernt jegliche 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 = Ein mittelstarker Verteidigungsblock.\nBietet mäßigen Schutz vor Feinden. -block.titanium-wall-large.description = Ein mittelstarker Verteidigungsblock.\nBietet mäßigen Schutz vor Feinden.\nBenötigt mehrere Kacheln. -block.plastanium-wall.description = Eine spezielle Wand, die elektrische Funken absorbiert und automatische Stromknoten-Verbindung blockiert. -block.plastanium-wall-large.description = Eine spezielle Wand, die elektrische Funken absorbiert und automatische Stromknoten-Verbindung blockiert.\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 seiner Umgebung. Hält die Abwehrkräfte zwischen den Wellen instand.\nVerwendet optional Silizium, um Reichweite und Effizienz zu steigern. -block.mend-projector.description = Eine verbesserte Version des Reparateurs. Repariert regelmäßig Blöcke in seiner Umgebung.\nVerwendet optional Phasengewebe, um Reichweite und Effizienz zu steigern. -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. -block.plastanium-conveyor.description = Bewegt Materialen in Gruppen.\nNimmt hinten Materialien an und gibt sie vorne in drei Richtungen aus. -block.junction.description = Fungiert als Brücke zwischen zwei kreuzenden Förderbändern. Nützlich, wenn zwei verschiedene Förderbänder sich kreuzen, aber unterschiedliche Materialien verwenden. -block.bridge-conveyor.description = Verbesserter Transportblock. Erlaubt es, Materialien über bis zu 3 Kacheln beliebigen Terrains oder Inhalts zu transportieren. -block.phase-conveyor.description = Verbesserter Transportblock. Verwendet Strom, um Materialien zu einem verbundenen Phasen-Förderband über mehrere Kacheln zu teleportieren. -block.sorter.description = Sortiert Materialien. Wenn ein Gegenstand der Auswahl entspricht, darf er vorbei. Andernfalls wird er links oder rechts ausgegeben. -block.inverted-sorter.description = Funktioniert wie ein normaler Sortierer, aber gibt das ausgewählte Material seitwärts aus. -block.router.description = Akzeptiert Materialien aus einer Richtung und leitet sie gleichmäßig in bis zu drei andere Richtungen weiter. Nützlich, wenn die Materialien aus einer Richtung an mehrere Empfänger verteilt werden sollen. -block.distributor.description = Ein weiterentwickelter Verteiler, der Materialien in bis zu sieben Richtungen gleichmäßig verteilt. -block.overflow-gate.description = Ein Verteiler, der nur Materialien nach links oder rechts ausgibt, falls der Weg gerade aus blockiert ist. -block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialen nur nach vorne aus, wenn der Weg rechts und links blockiert ist. -block.mass-driver.description = Ultimativer Transportblock. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger über eine große Reichweite. -block.mechanical-pump.description = Eine günstige, langsame Pumpe, die keinen Strom benötigt. -block.rotary-pump.description = Eine fortgeschrittene Pumpe, die mithilfe von Strom doppelt so schnell pumpt. -block.thermal-pump.description = Die ultimative Pumpe, dreimal so schnell wie eine mechanische Pumpe und die einzige Pumpe, die Lava fördern kann. -block.conduit.description = Standard Flüssigkeits-Transportblock. Funktioniert wie ein Förderband, nur für Flüssigkeiten. Wird am Besten mit Extraktoren, Pumpen oder anderen Kanälen benutzt. -block.pulse-conduit.description = Verbesserter Flüssigkeits-Transportblock. Transportiert Flüssigkeiten schneller und speichert mehr als Standard Kanäle. -block.plated-conduit.description = Bewegt Flüssigkeiten genauso schnell wie ein Impulskanal, ist aber besser gepanzert. Akzeptiert nur Verbindungen mit anderen Kanälen.\nVerliert weniger Flüssigkeit. -block.liquid-router.description = Akzeptiert Flüssigkeiten aus einer Richtung und verteilt sie an bis zu drei andere Richtungen weiter. Nützlich, um Flüssigkeiten aus einer Quelle an mehrere Empfänger zu verteilen. -block.liquid-tank.description = Speichert eine große Menge an Flüssigkeiten. Verwende es als Puffer, wenn Angebot und Nachfrage an einer Flüssigkeit schwanken. -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 zwanzig 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 dreißig Stromquellen, -verbraucher oder -knoten. +block.copper-wall.description = Beschützt Blöcke vor Gegnern. +block.copper-wall-large.description = Beschützt Blöcke vor Gegnern. +block.titanium-wall.description = Beschützt Blöcke vor Gegnern. +block.titanium-wall-large.description = Beschützt Blöcke vor Gegnern. +block.plastanium-wall.description = Beschützt Blöcke vor Gegnern. Absorbiert Laser und Lichtbogen. Blockiert außerdem automatische Stromverbindungen. +block.plastanium-wall-large.description = Beschützt Blöcke vor Gegnern. Absorbiert Laser und Lichtbogen. Blockiert außerdem automatische Stromverbindungen. +block.thorium-wall.description = Beschützt Blöcke vor Gegnern. +block.thorium-wall-large.description = Beschützt Blöcke vor Gegnern. +block.phase-wall.description = Beschützt Blöcke vor Gegnern, indem sie die meisten Schüsse reflektiert. +block.phase-wall-large.description = Beschützt Blöcke vor Gegnern, indem sie die meisten Schüsse reflektiert. +block.surge-wall.description = Beschützt Blöcke vor Gegnern und greift Gegner mit Lichtbögen an. +block.surge-wall-large.description = Beschützt Blöcke vor Gegnern und greift Gegner mit Lichtbögen an. +block.door.description = Eine Wand, die geöffnet und geschlossen werden kann. +block.door-large.description = Eine Wand, die geöffnet und geschlossen werden kann. +block.mender.description = Repariert regelmäßig Blöcke in seiner Umgebung.\nVerwendet optional Silizium, um Reichweite und Effizienz zu steigern. +block.mend-projector.description = Repariert regelmäßig Blöcke in seiner Umgebung.\nVerwendet optional Phasengewebe, um Reichweite und Effizienz zu steigern. +block.overdrive-projector.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken. \nVerwendet optional Phasengewebe, um Reichweite und Effizienz zu steigern. +block.force-projector.description = Erzeugt ein sechseckiges Kraftfeld um sich herum, das Blöcke und Einheiten vor Schaden schützt.\nKann überhitzen, wenn es zu viele Schaden aufnimmt. Dies kann durch Kühlung verhindert werden. Phasengewebe vergrößert das Schild. +block.shock-mine.description = Greift Gegner mit Lichtbögen an, wenn sie über sie laufen. +block.conveyor.description = Bewegt Materialien vorwärts. +block.titanium-conveyor.description = Bewegt Materialien vorwärts, aber schneller als ein normales Förderband. +block.plastanium-conveyor.description = Bewegt Materialien in Gruppen.\nNimmt hinten Materialien an und gibt sie vorne in drei Richtungen aus. Erfordert für maximale Effizienz mehrere Ein- und Ausgänge. +block.junction.description = Fungiert als Brücke zwischen zwei kreuzenden Förderbändern. +block.bridge-conveyor.description = Transportiert Materialien über Terrain oder über Blöcke. +block.phase-conveyor.description = Transportiert Materialien sofort über Terrain oder über Blöcke. Höhere Reichweite als Brückenförderbänder, braucht aber Strom. +block.sorter.description = Sortiert Materialien. Wenn ein Gegenstand der Auswahl entspricht, wird er vorne herausgegeben. Andernfalls wird er links oder rechts ausgegeben. +block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das ausgewählte Material seitwärts aus. +block.router.description = Verteilt Materialien auf bis zu drei Richtungen. +block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann. +block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen. +block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. +block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. +block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger. +block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt. +block.rotary-pump.description = Eine Pumpe, die Strom verbraucht. +block.thermal-pump.description = Eine Pumpe. +block.conduit.description = Transportiert Flüssigkeiten. Wird mit Extraktoren, Pumpen oder anderen Kanälen benutzt. +block.pulse-conduit.description = Transportiert Flüssigkeiten. Transportiert Flüssigkeiten schneller und speichert mehr als ein Leitungsrohr. +block.plated-conduit.description = Transportiert Flüssigkeiten. Nimmt keine Flüssigkeiten von der Seite an.\nHat keine Lecks. +block.liquid-router.description = Verteilt Flüssigkeiten auf bis zu drei Richtungen. Speicher außerdem eine kleine Menge an Flüssigkeit. +block.liquid-tank.description = Speichert eine große Menge an Flüssigkeiten. Ähnlich wie ein Flüssigkeitsverteiler. +block.liquid-junction.description = Fungiert als Brücke über zwei kreuzende Kanäle. +block.bridge-conduit.description = Transportiert Flüssigkeiten über Terrain oder über Blöcke. +block.phase-conduit.description = Transportiert Flüssigkeiten sofort über Terrain oder über Blöcke. Höhere Reichweite als Brückenförderbänder, braucht aber Strom. +block.power-node.description = Überträgt Strom zu verbundenen Knoten. Der Knoten erhält Strom von benachbarten Blöcken und gibt ihn auch an diese weiter. +block.power-node-large.description = Ein verbesserter Stromknoten mit einer höheren Reichweite. block.surge-tower.description = Ein extrem weitreichender Netzknoten mit weniger verfügbaren Verbindungen. -block.diode.description = Batteriestrom kann nur in eine Richtung durch diesen Block fließen, aber nur wenn die andere Seite weniger Strom in Batterien hat. +block.diode.description = Batteriestrom bewegt sich in eine Richtung durch diesen Block, aber nur wenn die andere Seite weniger Strom in Batterien hat. 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 Strom, indem Öl oder entzündliche Materialien verbrannt werden. -block.thermal-generator.description = Erzeugt große Mengen Strom aus Lava. -block.steam-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. -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.battery-large.description = Speichert Strom, solange ein Überschuss besteht, und gibt ihn bei Knappheit ab, solange Kapazität vorhanden ist. Speichert mehr Strom als eine normale Batterie. +block.combustion-generator.description = Generiert Strom, indem Kohle oder andere entzündliche Materialien verbrannt werden. +block.thermal-generator.description = Erzeugt an heißen Orten große Mengen Strom. +block.steam-generator.description = Wandelt mit entzündlichen Materialien Wasser zu Wasserdampf um und benutzt diesen dann, um Strom zu generieren. +block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryoflüssigkeit und brennendem Pyratit. +block.rtg-generator.description = Ein Radioisotopengenerator, der aus radioaktivem Zerfall Energie herstellt. 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 = 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.solar-panel-large.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. Effizienter als eine normale Solarzelle. +block.thorium-reactor.description = Erzeugt riesige Mengen Strom aus Thorium. Benötigt konstante Kühlung. Explodiert gewaltsam, wenn unzureichende Kühlung vorhanden ist. +block.impact-reactor.description = Ein Generator, der bei höchster Effizienz enorme Mengen an Leistung erzeugen kann. Erfordert eine erhebliche Leistungsaufnahme, um den Prozess zu starten. +block.mechanical-drill.description = Ein günstiger Bohrer. Wenn er auf Erz gesetzt wird, baut er unbegrenzt das Erz mit geringer Geschwindigkeit ab. Kann nur einfach Ressourcen abbauen. +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. block.blast-drill.description = Der ultimative Bohrer. Benötigt große Mengen an Strom. 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 = 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. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen. +block.cultivator.description = Kultiviert winzige Mengen atmosphärischer Mikrosporen in Sporen-Pods. +block.cultivator.details = Zurückgewonnene Technologie. Wird benutzt, um große Mengen Biomasse so effizient wie möglich herzustellen. Wahrscheinlich der ehemaliger Inkubator der Sporen, die Serpulo heute bedecken. +block.oil-extractor.description = Verwendet große Mengen an Strom, Sand und Wasser, um Öl zu extrahieren. +block.core-shard.description = Kern der Basis. Einmal zerstört, ist jeglicher Kontakt zum Sektor verloren. +block.core-shard.details = Die erste Version. Kompakt. Selbstduplizierend. Mit Einmalraketen ausgestattet. Nicht für Interplanetarische Reisen geeignet. +block.core-foundation.description = Kern der Basis. Besser gepanzert. Speichert mehr Ressourcen. +block.core-foundation.details = Die zweite Version. +block.core-nucleus.description = Kern der Basis. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen. +block.core-nucleus.details = Die dritte und letzte Version. +block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen. block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[lightgray] 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 = 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 = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Einheiten. +block.unloader.description = Entlädt Materialien aus einem Block. +block.launch-pad.description = Startet Materialien in andere Sektoren. +block.duo.description = Schießt auf Gegner. +block.scatter.description = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Lufteinheiten. 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. -block.arc.description = Ein kleiner Geschützturm, der Lichtbögen in Richtung des Gegners schießt. -block.swarmer.description = Ein mittelgroßer Geschützturm, der Raketenschwärme abfeuert. -block.salvo.description = Ein mittelgroßer Geschützturm, der Schüsse in Salven abfeuert. -block.fuse.description = Ein großer Geschützturm, der starke Strahlen mit kurzer Reichweite abfeuert. -block.ripple.description = Ein großer Artillerie-Geschützturm, der mehrere Schüsse gleichzeitig abfeuert. -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.hail.description = Schießt kleine Geschosse auf weit entfernte Gegner. +block.wave.description = Schießt Flüssigkeiten auf Gegner. Löscht Feuer automatisch, wenn Wasser als Munition verwendet wird. +block.lancer.description = Lädt sich auf und schießt kräftige Laserstrahlen auf Feinde. +block.arc.description = Schießt Lichtbögen in Richtung des Gegners. +block.swarmer.description = Schießt zielsuchende Raketenschwärme ab. +block.salvo.description = Schießt Schüsse in Salven ab. +block.fuse.description = Schießt drei starke Strahlen mit kurzer Reichweite ab. +block.ripple.description = Schießt mehrere Schüsse gleichzeitig auf weit entfernte Gegner. +block.cyclone.description = Schießt explodierende Geschosse auf Gegner. +block.spectre.description = Schießt große, panzerbrechende Kugeln auf Luft- und Bodenziele. +block.meltdown.description = Lädt sich auf und schießt einen starken, durchgängigen Laser auf Gegner. Braucht Kühlung. +block.foreshadow.description = Schießt einen starken Schuss auf ein einziges Ziel über hohe Distanzen. Zielt auf Gegner mit den meisten Lebenspunkten. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Beschädigt und zerstört gegnerische Projektile. Laser werden nicht anvisiert. +block.parallax.description = Benutzt einen Traktorstrahl, um Gegner heranzuziehen und sie dabei anzugreifen. +block.tsunami.description = Schießt mit einem kräftigen Strahl aus Flüssigkeit auf Gegner. Löscht Feuer automatisch, wenn Wasser als Munition verwendet wird. +block.silicon-crucible.description = Benutzt Pyratit als Hitzequelle, um aus Sand und Kohle Silizium herzustellen. Die Effizienz wird an heißen Orten erhöht. +block.disassembler.description = Trennt Schlacke in winzige Mengen exotischer Mineralien, verliert dafür aber an Effizienz. Kann Thorium herstellen. +block.overdrive-dome.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken. \nBenötigt Phasengewebe und Silizium. +block.payload-conveyor.description = Bewegt größere Objekte, zum Beispiel Einheiten. +block.payload-router.description = Verteilt Einheiten auf bis zu drei Richtungen. +block.command-center.description = Steuert Einheiten mit verschiedenen Befehlen. +block.ground-factory.description = Stellt Bodeneinheiten her. Einheiten können einfach so verwendet oder in einem Rekonstrukteur verbessert werden. +block.air-factory.description = Stellt Lufteinheiten her. Einheiten können einfach so verwendet oder in einem Rekonstrukteur verbessert werden. +block.naval-factory.description = Stellt Wassereinheiten her. Einheiten können einfach so verwendet oder in einem Rekonstrukteur verbessert werden. +block.additive-reconstructor.description = Verbessert Einheiten auf die zweite Stufe. +block.multiplicative-reconstructor.description = Verbessert Einheiten auf die dritte Stufe. +block.exponential-reconstructor.description = Verbessert Einheiten auf die vierte Stufe. +block.tetrative-reconstructor.description = Verbessert Einheiten auf die fünfte und letzte Stufe. +block.switch.description = Ein einfacher Schalter. Sein Status kann mit einem Prozessor abgelesen und verändert werden. +block.micro-processor.description = Führt eine Reihe von Logikbefehlen in einer Schleife aus. Kann Einheiten und Blöcke steuern. +block.logic-processor.description = Führt eine Reihe von Logikbefehlen in einer Schleife aus. Kann Einheiten und Blöcke steuern. Schneller als der Mikroprozessor. +block.hyper-processor.description = Führt eine Reihe von Logikbefehlen in einer Schleife aus. Kann Einheiten und Blöcke steuern. Schneller als der Logikprozessor. +block.memory-cell.description = Speichert Informationen für einen Prozessor. +block.memory-bank.description = Speichert Informationen für einen Prozessor. Hohe Kapazität. +block.logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an. +block.large-logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an. +block.interplanetary-accelerator.description = Ein Riesen-Railgun-Turm, der mithilfe des Elektromagnetismus Kerne auf die nötige Geschwindigkeit bringt, um interplanetarisches Reisen zu ermöglichen. + +unit.dagger.description = Schießt normale Kugeln auf alle Feinde in der Nähe. +unit.mace.description = Schießt Feuer auf alle Gegner in der Nähe. +unit.fortress.description = Schießt Langstreckengeschosse auf Ziele am Boden. +unit.scepter.description = Feuert ein Sperrfeuer geladener Kugeln auf Feinde in der Nähe ab. +unit.reign.description = Feuert ein Sperrfeuer riesiger Geschosse mit sehr hoher Durchstechkraft auf alle Feinde in der Nähe. +unit.nova.description = Schießt kleine Laser, die Gegnern schaden und eigene Blöcke heilen. Kann boosten. +unit.pulsar.description = Schießt Lichtbögen, die Gegnern schaden und eigene Blöcke heilen. Kann boosten. +unit.quasar.description = Schießt durchdringende Laserstrahlen, die Gegnern schaden und eigene Blöcke heilen. Kann boosten. Hat ein Schutzschild. +unit.vela.description = Schießt einen riesigen, konstanten Laserstrahl, der Gegnern schadet, Feuer verursacht und eigene Blöcke heilt. Kann boosten. +unit.corvus.description = Schießt einen riesigen, konstanten Laserstrahl, der Gegnern schadet und eigene Blöcke heilt. Kann über Vieles drüberlaufen. +unit.crawler.description = Rennt auf Gegner zu und zerstört sich dann selbst, um eine Explosion zu verursachen. +unit.atrax.description = Schießt lähmende Schlackekugeln auf Gegner auf dem Boden. Kann über Vieles drüberlaufen. +unit.spiroct.description = Schießt die Gegner mit Lasern ab, die dem Gegner schaden und den Spirokt heilen. Kann über Vieles drüberlaufen. +unit.arkyid.description = Schießt die Gegner mit Lasern ab, die dem Gegner schaden und den Arkyid heilen. Kann über Vieles drüberlaufen. +unit.toxopid.description = Schießt große energiegeladene Cluster-Geschosse und durchdringende Laser auf Feinde. Kann über Vieles drüberlaufen. +unit.flare.description = Schießt normale Kugeln auf Ziele am Boden. +unit.horizon.description = Wirft Bomben auf Ziele am Boden. +unit.zenith.description = Schießt alle Gegner in der Nähe mit Salven von Raketen ab. +unit.antumbra.description = Schießt ein Sperrfeuer auf Gegner in der Nähe. +unit.eclipse.description = Feuert zwei durchdringende Laser und einen Flaksperrfeuer auf alle Feinde in der Nähe. +unit.mono.description = Baut Automatisch Blei und Kupfer ab. Dieses wird in den Kern gebracht. +unit.poly.description = Baut zerstörte Blöcke wieder auf und hilft anderen Einheiten beim Bauen. +unit.mega.description = Heilt automatisch beschädigte Blöcke. Kann kleine Blöcke oder Bodeneinheiten tragen. +unit.quad.description = Wirft große Bomben auf Bodenziele ab, welche Gegnern schaden und einige Blöcke heilen. Kann Bodeneinheiten tragen. +unit.oct.description = Schützt mithilfe eines regenerierenden Schildes andere Einheiten. Kann die meisten Bodeneinheiten tragen. +unit.risso.description = Schießt ein Sperrfeuer aus Raketen und Kugeln auf alle Gegner in der Nähe. +unit.minke.description = Schießt Geschosse und Kugeln auf Feinde. +unit.bryde.description = Schießt Artilleriegeschosse und Raketen mit großer Reichweite auf alle Gegner in der Nähe. +unit.sei.description = Schießt ein Sperrfeuer aus Raketen und durchdringende Geschosse auf Gegner. +unit.omura.description = Schießt eine Railgun mit hoher Reichweite, um Gegner zu zerstören. Stellt Flare-Einheiten her. +unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke. +unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke. +unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke. + +lst.read = Liest einen Wert aus einer verbundenen Spiecherzelle. +lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle. +lst.print = Fügt Text zum Textspeicher hinzu.\nZeigt nichts an, bis [accent]Print Flush[] verwendet wird. +lst.draw = Fügt eine [accent]Draw[]-Aufgabe zum Bildspeicher hinzu.\nZeigt nichts an, bis [accent]Draw Flush[] verwendet wird. +lst.drawflush = Druckt [accent]Draw[]-Aufgaben aus dem Bildspeicher auf einen Bildschirm. +lst.printflush = Druckt [accent]Print[]-Aufgaben aus dem Textspeicher auf einen Nachrichtenblock. +lst.getlink = Gibt ein verbundenen Block wieder. Fängt bei 0 an. +lst.control = Steuert einen Block. +lst.radar = Findet Einheiten. +lst.sensor = Gibt Daten über einen Block oder eine Einheit wieder. +lst.set = Setzt eine Variable fest. +lst.operation = Verändert eine Variable. +lst.end = Springt wieder nach oben. +lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht. +lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[]. +lst.unitcontrol = Steuert [accent]@unit[]. +lst.unitradar = Findet Einheiten in der Nähe von [accent]@unit[]. +lst.unitlocate = Findet mit [accent]@unit[] bestimmte Positionen / Blöcke auf der ganzen Karte. + +logic.nounitbuild = [red]Logik, die Blöcke baut, ist hier nicht erlaubt. + +lenum.type = Englischer Name eines Blocks / einer Einheit. Ein Verteiler gibt [accent]@router[] wieder.\nKein string. +lenum.shoot = Schießt auf eine Position. +lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus. +lenum.configure = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer. +lenum.enabled = Ob der Block an oder aus ist. + +laccess.color = Illuminiererfarbe. +laccess.controller = Einheitensteurer. Gibt "processor" zurück, wenn die Einheit prozessorgesteuert ist,.\nGibt den Steuerer zurück, wenn die Einheit Teil einer Formation ist.\nSonst wird einfach die Einheit zurückgegeben. +laccess.dead = Ob ein Block / eine Einheit tot oder nicht mehr gültig ist. +laccess.controlled = Gibt zurück:\n[accent]@ctrlProcessor[] wenn die Einheit prozessorgesteuert ist\n[accent]@ctrlPlayer[] wenn die Einheit / der Block von einem Spieler gesteuert wird\n[accent]@ctrlFormation[] wenn die Einheit Teil einer Formation ist\nSonst 0. +laccess.commanded = [red]Veraltet. Wird bald entfernt![]\nBenutze stattdessen [accent]controlled[]. + +graphicstype.stroke = Setzt die Linienbreite fest. +graphicstype.line = Zeichnet eine Linie. +graphicstype.clear = Füllt den Bildschirm mit einer Farbe. +graphicstype.color = Wählt eine Farbe aus. +graphicstype.rect = Zeichnet ein Rechteck. +graphicstype.linerect = Zeichnet den Umriss eines Rechtecks. +graphicstype.poly = Füllt ein gleichmäßiges Polygon. +graphicstype.linepoly = Zeichnet den Umriss eines gleichmäßigen Polygons. +graphicstype.triangle = Zeichnet ein Dreieck. +graphicstype.image = Zeichnet ein Bild von einem englischen Namen.\nz.B. [accent]@router[] oder [accent]@dagger[]. + +lenum.always = Immer. +lenum.idiv = Division mit ganzen Zahlen. +lenum.div = Division.\nGibt bei Teilung durch null [accent]null[] zurück. +lenum.mod = Modulo. +lenum.equal = Prüft Gleichheit.\nNicht-"null" Objekte, die mit Zahlen verglichen werden, werden 1. +lenum.notequal = Prüft Ungleichheit. +lenum.strictequal = Prüft strenge Gleichheit.\nKann verwendet werden, um "null" zu finden. +lenum.shl = Bit-shift nacht links. +lenum.shr = Bit-shift nach rechts. +lenum.or = Bitwise ODER. +lenum.land = Logisches AND. +lenum.and = Bitwise UND. +lenum.not = Bitwise NOT. +lenum.xor = Bitwise XOR. + +lenum.min = Die Größte von zwei Zahlen. +lenum.max = Die Kleinste von zwei Zahlen. +lenum.angle = Angle of vector in degrees. +lenum.len = Length of vector. +lenum.sin = Sinus in Grad. +lenum.cos = Cosinus in Grad. +lenum.tan = Tangens in Grad. +#not a typo, look up 'range notation' +lenum.rand = Zufällige Zahl zwischen [0, ). +lenum.log = Logarithmus (ln). +lenum.log10 = Logarithmus zur Basis 10. +lenum.noise = 2D rauschen. +lenum.abs = Betrag. +lenum.sqrt = Quadratwurzel. + +lenum.any = Irgendeine Einheit. +lenum.ally = Freundliche Einheit. +lenum.attacker = Einheit mit Waffe. +lenum.enemy = Gegnerische Einheit. +lenum.boss = Bosseinheit. +lenum.flying = Lufteinheit. +lenum.ground = Bodeneinheit. +lenum.player = Spielergesteuerte Einheit. + +lenum.ore = Erz. +lenum.damaged = Beschädigter, alliierter Block. +lenum.spawn = Gegnerischer Spawnpunkt.\nKann ein Kern oder eine Position sein. +lenum.building = Ein Block einer bestimmten Sorte. + +lenum.core = Irgendein Kern. +lenum.storage = Speicherblock, z.B. ein Tresor. +lenum.generator = Blöcke, die Strom generieren. +lenum.factory = Blöcke, die Ressourcen verarbeiten. +lenum.repair = Reperaturpunkt. +lenum.rally = Kommandozentrale +lenum.battery = Irgendeine Batterie. +lenum.resupply = Munitionsvorrat.\nNur wichtig, wenn [accent]"Einheiten benötigen Munition"[] an ist. +lenum.reactor = Schlag- / Thoriumreaktor. +lenum.turret = Irgendein Geschütz. + +sensor.in = Der Block / die Einheit. + +radar.from = Block zu benutzen. [accent]Sensor[]-Reichweite hängt von der Blockreichweite ab. +radar.target = Einheitenfilter. +radar.and = Weitere Filter. +radar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts. +radar.sort = Sortiermethode der Ergebnisse. +radar.output = Variable für das Ergebnis. + +unitradar.target = Einheitenfilter. +unitradar.and = Weitere Filter. +unitradar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts. +unitradar.sort = Sortiermethode der Ergebnisse. +unitradar.output = Variable für das Ergebnis. + +control.of = Block, der gesteuert werden soll. +control.unit = Zieleinheit / Zielblock. +control.shoot = Ob geschossen werden soll. + +unitlocate.enemy = Ob gegnerische Blöcke gesucht werden sollen. +unitlocate.found = Ob der Block gefunden wurde. +unitlocate.building = Variable für das Ergebnis. +unitlocate.outx = Variable für die X-Koordinate. +unitlocate.outy = Variable für die Y-Koordinate. +unitlocate.group = Gesuchter Blocktyp. + +lenum.idle = Bewegt sich nicht, baut aber weiter ab.\nDer normale Zustand. +lenum.stop = Bewegung / Abbau / Bau abbrechen. +lenum.move = Geht zu diese Position. +lenum.approach = Geht auf einen Punkt mit einem bestimmten Radius zu. +lenum.pathfind = Geht zum gegnerischen Spawnpunkt. +lenum.target = Schießt auf eine Position. +lenum.targetp = Schießt auf eine Einheit und sagt deren Position voraus. +lenum.itemdrop = Items abwerfen. +lenum.itemtake = Items aus einem Block nehmen. +lenum.paydrop = Lässt einen Block / eine Einheit wieder fallen. +lenum.paytake = Hebt einen Block / eine kleine Einheit auf. +lenum.flag = Zahl, mit der eine Einheit identifiziert werden kann. +lenum.mine = Erz von einer Position abbauen. +lenum.build = Einen Block bauen. +lenum.getblock = Gibt den Blocktyp an den Koordinaten zurück.\nEinheiten müssen nah genug dran sein.\nFeste nicht-Blöcke sind [accent]@solid[]. +lenum.within = Prüft, ob eine Einheit in einem Radius um einen Punkt ist. +lenum.boost = Aktiviert / deaktiviert den Boost. \ No newline at end of file diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 8c538a6974..e9d0f796e3 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -2,26 +2,29 @@ credits.text = Creado por [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Créditos contributors = Traductores y Contribuidores discord = ¡Únete al Discord de Mindustry! -link.discord.description = La sala oficial del Discord de Mindustry +link.discord.description = El servidor official de Discord de Mindustry link.reddit.description = El subreddit de Mindustry link.github.description = Código fuente del juego link.changelog.description = Lista de actualizaciones -link.dev-builds.description = Versiones de desarrollo inestables -link.trello.description = Tablero de Trello oficial para las características planificadas -link.itch.io.description = itch.io es la página donde podes descargar las versiones para PC y web -link.google-play.description = Ficha en la Google Play Store +link.dev-builds.description = Versiones en desarrollo inestables +link.trello.description = Tablón de Trello oficial para las características planificadas +link.itch.io.description = Página de itch.io, donde puedes descargar las versiones para PC +link.google-play.description = Ver en Google Play Store link.f-droid.description = Página de F-Droid del juego link.wiki.description = Wiki oficial de Mindustry link.suggestions.description = Sugerir nuevas funciones +link.bug.description = ¿Encontraste un error? Puedes reportarlo aquí linkfail = ¡Error al abrir el enlace!\nLa URL ha sido copiada a su portapapeles. screenshot = Captura de pantalla guardada en {0} screenshot.invalid = Mapa demasiado grande, no hay suficiente memoria para la captura de pantalla. gameover = Tu núcleo ha sido destruido. +gameover.disconnect = Desconectado gameover.pvp = ¡El equipo[accent] {0}[] ha ganado! -highscore = [accent]¡Nueva mejor puntuación! -copied = Copiado. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +gameover.waiting = [accent]Esperando el próximo mapa... +highscore = [accent]¡Nuevo récord de puntuación! +copied = Copiado +indev.notready = Esta parte del juego no esta lista aún. +indev.campaign = [accent]Has llegado al final de la campaña![]\n\nEsto es lo más lejos que puedes llegar por ahora.\nLos viajes interplanetarios se añadirán en futuras actualizaciones. load.sound = Sonidos load.map = Mapas @@ -31,31 +34,39 @@ load.system = Sistema load.mod = Mods load.scripts = Scripts -be.update = Una nueva e innovadora versión disponible: -be.update.confirm = Descargar y reiniciar ahora? +be.update = Hay una nueva versión disponible: +be.update.confirm = ¿Descargar y reiniciar ahora? be.updating = Actualizando... be.ignore = Ignorar be.noupdates = No se encontraron actualizaciones. -be.check = Revisando actualizaciones +be.check = Buscar actualizaciones -schematic = Esquemático -schematic.add = Guardar esquemático... -schematics = Esquemáticos -schematic.replace = Un esquemático con ese nombre ya existe. ¿Deseas remplazarlo? -schematic.exists = Un esquemático con ese nombre ya existe. -schematic.import = Importar esquemático... +mod.featured.title = Explorador de mods +mod.featured.dialog.title = Explorador de Mods +mods.browser.selected = Mod seleccionado +mods.browser.add = Installar Mod +mods.github.open = Abrir en Github + +schematic = Plantilla +schematic.add = Guardar plantilla... +schematics = Plantillas +schematic.replace = Ya existe una plantilla con ese nombre. ¿Deseas remplazarla? +schematic.exists = Ya existe una plantilla con ese nombre. +schematic.import = Importar plantilla... schematic.exportfile = Exportar archivo schematic.importfile = Importar archivo schematic.browseworkshop = Buscar en el Steam Workshop schematic.copy = Copiar al portapapeles. schematic.copy.import = Importar desde el portapapeles. schematic.shareworkshop = Compartir en el Steam Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar esquemático -schematic.saved = Esquemático guardado. -schematic.delete.confirm = Esto esquemático será completamente borrado. -schematic.rename = Renombrar esquemático +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla +schematic.saved = Plantilla guardada. +schematic.delete.confirm = Se borrará ésta plantilla. +schematic.rename = Renombrar plantilla schematic.info = {0}x{1}, {2} bloques +schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor. +stats = Estadísticas stat.wave = Oleadas Derrotadas:[accent] {0} stat.enemiesDestroyed = Enemigos Destruidos:[accent] {0} stat.built = Estructuras Construidas:[accent] {0} @@ -65,18 +76,18 @@ stat.delivered = Recursos Lanzados: stat.playtime = Tiempo jugado:[accent] {0} stat.rank = Rango final: [accent]{0} -globalitems = [accent]Global Items -map.delete = ¿Estás seguro que quieres borrar el mapa "[accent]{0}[]"? +globalitems = [accent]Recursos Totales +map.delete = ¿Estás seguro de que quieres borrar el mapa "[accent]{0}[]"? level.highscore = Puntuación más alta: [accent]{0} level.select = Selección de nivel level.mode = Modo de juego: coreattack = < ¡El núcleo está bajo ataque! > -nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE APARICIÓN INMEDIATAMENTE[] ]\nAniquilación inminente -database = Base de datos del núcleo +nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE APARICIÓN INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente +database = Base de datos savegame = Guardar Partida loadgame = Cargar Partida -joingame = Unirse a la Partida -customgame = Partida personalizada +joingame = Unirse a Partida +customgame = Crear Partida newgame = Nueva Partida none = minimap = Minimapa @@ -84,12 +95,12 @@ position = Posición close = Cerrar website = Sitio web quit = Salir -save.quit = Guardar & Salir +save.quit = Guardar y Salir maps = Mapas maps.browse = Navegar por los Mapas continue = Continuar maps.none = [lightgray]¡No se han encontrado mapas! -invalid = Invalido +invalid = No es válido pickcolor = Escoge Color preparingconfig = Preparando Configuración preparingcontent = Preparando Contenido @@ -97,109 +108,117 @@ uploadingcontent = Subiendo Contenido uploadingpreviewfile = Subiendo Archivo de Vista Previa committingchanges = Confirmando Cambios done = Hecho -feature.unsupported = Tu dispositivo no soporta esta función. +feature.unsupported = Tu dispositivo no es compatible con esta función. -mods.alphainfo = Ten en cuenta que los mods estan en versión Alpha, y[scarlet] pueden tener varios problemas[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry o Discord. -mods.alpha = [accent](Alpha) +mods.alphainfo = Ten en cuenta que los mods estan en fase Alpha, y[scarlet] pueden tener varios errores[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry. mods = Mods -mods.none = [lightgray]No se encontraron Mods! -mods.guide = Guia de Modding +mods.none = [lightgray]¡No se encontraron Mods! +mods.guide = Guía de Modding mods.report = Reportar Error mods.openfolder = Abrir carpeta de mods -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reload = Recargar +mods.reloadexit = A continuación se cerrará el juego para recargar los mods. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Activado mod.disabled = [scarlet]Desactivado mod.disable = Desactivar -mod.content = Content: -mod.delete.error = Fallo al elminar el mod. Quizás el archivo esta en uso. -mod.requiresversion = [scarlet]Requiere mínima versión del juego: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.content = Contenido: +mod.delete.error = No se pudo elminar el mod. Tal vez esté en uso por el juego. +mod.requiresversion = [scarlet]Requiere como mínimo la versión del juego: [accent]{0} +mod.outdated = [scarlet]No es compatible con la V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependencias faltantes: {0} -mod.erroredcontent = [scarlet]Errores de contenido -mod.errors = Ocurrieron fallos al cargar el contenido. -mod.noerrorplay = [scarlet]Tienes mods con fallos.[]Deshabilita las modificaciones afectadas o arregla los errores antes de jugar. +mod.erroredcontent = [scarlet]Contenido erróneo +mod.errors = Ha ocurrido un fallo al cargar el contenido. +mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Deshabilítalos o arregla los errores antes de jugar. mod.nowdisabled = [scarlet]Al/Los Mod/s '{0}'le esta/n faltando dependencias:[accent] {1}\n[lightgray]Estos mods necesitan descargarse primero.\nEste mod será automaticamente desactivado. mod.enable = Activar mod.requiresrestart = El juego se cerrará para aplicar los mods. -mod.reloadrequired = [scarlet]Se requiere actualizar +mod.reloadrequired = [scarlet]Se requiere volver a cargar mod.import = Importar mod -mod.import.file = Import File +mod.import.file = Importar archivo mod.import.github = Importar Mod de Github -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]Los mods JAR pueden no ser seguros.[]\n¡Asegúrate de haberlos descargado de una fuente en la que confíes! mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para eliminarlo, desinstala ese mod. mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar? mod.author = [lightgray]Autor:[] {0} -mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que ya no has instalado. Se puede corromper la partida guardada. ¿Estás seguro de que quieres cargarla?\n[lightgray]Mods:\n{0} +mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que no tienes instalados. Se puede corromper la partida guardada. ¿Quieres cargarla a pesar de ello?\n[lightgray]Mods:\n{0} mod.preview.missing = Antes de publicar este mod en el Steam Workshop, debe añadir una imagen de vista previa.\nAñada una imagen con nombre[accent] preview.png[] en la carpeta del mod e intente nuevamente. mod.folder.missing = Solo los mods en forma de carpeta se pueden publicar en el Steam Workshop.\nPara convertir cualquier mod en una carpeta, simplemente descomprima su archivo a una carpeta y elimine el zip anterior, luego reinicie su juego o vuelva a cargar sus mods. -mod.scripts.disable = Tu dispositivo no soporta los mods con scripts. Debes deshabilitar esos mods para jugar. +mod.scripts.disable = Tu dispositivo no es compatible con mods con scripts. Debes deshabilitar esos mods para jugar. -about.button = Acerca de +about.button = Acerca de... name = Nombre: noname = Elige un[accent] nombre de jugador[] primero. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Mapa del planeta +launchcore = Lanzar núcleo filename = Nombre del archivo: -unlocked = ¡Nuevo Bloque Desbloqueado! +unlocked = ¡Nuevo contenido en la Base de Datos! +available = ¡Nueva investigación disponible! completed = [accent]Completado -techtree = Ãrbol de Tecnologías -research.list = [lightgray]investigación: -research = Investigación +techtree = Tecnologías +research.legacy = Se han encontrado datos guardados de investigaciones tecnológicas realizadas en la versión [accent]5.0[].\n¿Quieres [accent]cargar estos datos[], o [accent]descartarlos[] para reiniciar los descubrimientos tecnológicos del nuevo modo Campaña? (Recomendado) +research.load = Cargar +research.discard = Descartar +research.list = [lightgray]Investigaciones: +research = Investigaciones researched = [lightgray]{0} investigado. -research.progress = {0}% complete -players = {0} jugadores online -players.single = {0} jugador online -players.search = buscar +research.progress = {0}% completado +players = {0} jugadores +players.single = {0} jugador +players.search = Buscar players.notfound = [gray]No se encontraron jugadores server.closing = [accent]Cerrando servidor... -server.kicked.kick = ¡Has sido expulsado del servidor! -server.kicked.whitelist = No estas en la lista blanca de aqui. -server.kicked.serverClose = El servidor ha cerrado. -server.kicked.vote = Te han expulsado por votación. Adiós! -server.kicked.clientOutdated = ¡Cliente desactualizado! ¡Actualiza tu juego! +server.kicked.kick = ¡Te han echado del servidor! +server.kicked.whitelist = No estás en la lista blanca de este servidor. +server.kicked.serverClose = El servidor se ha cerrado. +server.kicked.vote = Has sido expulsado por votación. ¡Hasta luego! +server.kicked.clientOutdated = ¡Cliente desactualizado! ¡Actualiza el juego! server.kicked.serverOutdated = ¡Servidor desactualizado! ¡Pídele al anfitrión que lo actualice! -server.kicked.banned = Has sido expulsado del servidor. +server.kicked.banned = Has sido baneado en este servidor. server.kicked.typeMismatch = Este servidor no es compatible con su tipo de compilación. -server.kicked.playerLimit = Este servidor está lleno. Espera un espacio vacío. +server.kicked.playerLimit = Este servidor está lleno. Aunque siempre puedes esperar a que alguien deje un hueco... server.kicked.recentKick = Has sido expulsado recientemente.\nEspera para poder conectarte de nuevo. server.kicked.nameInUse = Ya hay alguien con ese\nnombre en el servidor. -server.kicked.nameEmpty = Tu nombre debe por lo menos contener un carácter o número. -server.kicked.idInUse = ¡Ya estás en el servidor! Conectarse con dos cuentas no está permitido. +server.kicked.nameEmpty = Tu nombre debe contener al menos un carácter o número. +server.kicked.idInUse = ¡Ya estás en el servidor! No está permitido conectarse con dos cuentas. server.kicked.customClient = Este servidor no soporta versiones personalizadas. Descarga una versión oficial. server.kicked.gameover = ¡Fin del juego! server.kicked.serverRestarting = Se esta reiniciando el servidor. server.versions = Tu versión:[accent] {0}[]\nVersión del servidor:[accent] {1}[] -host.info = El botón [accent]host[] crea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [lightgray]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[lightgray]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[lightgray]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 = Crear Servidor +host.info = El botón [accent]host[] crea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [lightgray]wifi []o [lightgray]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 mediante IP, se requiere [accent]asignación de puertos[].\n\n[lightgray]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 servidor[] para conectarte, o descubrir servidores en tu [accent]red local[] para conectarte.\nTambién se puede jugar multijugador en redes LAN y WAN.\n\n[lightgray]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 = Abrir Partida invitefriends = Invitar Amigos -hostserver.mobile = Crear\nJuego +hostserver.mobile = Abrir\nPartida host = Servidor hosting = [accent]Abriendo servidor... hosts.refresh = Actualizar -hosts.discovering = Descubrir partidas LAN -hosts.discovering.any = Descubrir juegos +hosts.discovering = Buscando partidas en LAN... +hosts.discovering.any = Buscando partidas server.refreshing = Actualizando servidor... -hosts.none = [lightgray]¡No se han encontrado partidas LAN! -host.invalid = [scarlet]No se ha podido conectar al anfitrión. +hosts.none = [lightgray]No se han encontrado partidas en LAN +host.invalid = [scarlet]No se pudo conectar con el anfitrión servers.local = Servidores Locales servers.remote = Servidores Remotos -servers.global = Servidores Globales +servers.global = Servidores de la Comunidad + +servers.disclaimer = Los servidores de la comunidad [accent]no[] son propiedad del desarrollador, ni administrados por el mismo.\n\nLos servidores podrían tener contenido generado por los usuarios no apropiado para todas las edades. +servers.showhidden = Mostrar servidores ocultos +server.shown = Visibles +server.hidden = Ocultos trace = Rastrear Jugador trace.playername = Nombre de jugador: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID Única: [accent]{0} -trace.mobile = Cliente de movíl: [accent]{0} +trace.mobile = Cliente de móvil: [accent]{0} trace.modclient = Cliente Personalizado: [accent]{0} -invalidid = ¡ID de cliente inválida! Envía un informe del error. +invalidid = ¡ID de cliente inválida! Por favor, envía un informe del error. server.bans = Expulsiones -server.bans.none = ¡Ningún usuario ha sido expulsado! +server.bans.none = No se ha baneado a ningún usuario aún server.admins = Administradores -server.admins.none = ¡Ningún administrador ha sido encontrado! +server.admins.none = ¡No hay ningún administrador! server.add = Agregar Servidor server.delete = ¿Estás seguro de querer borrar este servidor? server.edit = Editar Servidor @@ -207,26 +226,27 @@ server.outdated = [crimson]¡Servidor desactualizado![] server.outdated.client = [crimson]¡Cliente desactualizado![] server.version = [lightgray]Versión: {0} server.custombuild = [accent]Versión personalizada -confirmban = ¿Estás seguro de querer banear este jugador? +confirmban = ¿Quieres banear a este jugador? confirmkick = ¿Estás seguro de querer expulsar este jugador? -confirmvotekick = ¿Estás seguro de querer hechar por votación a este jugador? -confirmunban = ¿Estás seguro de querer desbanear este jugador? -confirmadmin = ¿Estás seguro de querer hacer administrador a este jugador? -confirmunadmin = ¿Estás seguro de querer quitar los permisos de administrador a este jugador? -joingame.title = Unirse a la partida +confirmvotekick = ¿Estás de acuerdo en expulsar este jugador? +confirmunban = ¿Quieres desbanear a este jugador? +confirmadmin = ¿Quieres hacer administrador a este jugador? +confirmunadmin = ¿Quieres quitar los permisos de administrador a este jugador? +joingame.title = Unirse a Partida joingame.ip = IP: disconnect = Desconectado. disconnect.error = Error en la conexión. disconnect.closed = Conexión cerrada. -disconnect.timeout = Desconectado. -disconnect.data = ¡Se ha fallado la carga de datos del mundo! +disconnect.timeout = Tiempo de espera agotado. +disconnect.data = ¡Hubo un fallo con la carga de datos! cantconnect = No es posible unirse a la partida ([accent]{0}[]). connecting = [accent]Conectando... +reconnecting = [accent]Reconectado... connecting.data = [accent]Cargando datos del mundo... server.port = Puerto: server.addressinuse = ¡La dirección ya está en uso! -server.invalidport = ¡El número de puerto es invalido! -server.error = [crimson]Error creando el servidor: error [accent]{0} +server.invalidport = ¡El número de puerto no es valido! +server.error = [crimson]Error al crear el servidor: error [accent]{0} save.new = Nuevo Punto de Guardado save.overwrite = ¿Estás seguro de querer sobrescribir\neste punto de guardado? overwrite = Sobrescribir @@ -243,19 +263,19 @@ save.newslot = Nombre del Punto de Guardado: save.rename = Renombrar save.rename.text = Nuevo nombre: selectslot = Selecciona un Punto de Guardado. -slot = [accent]Casilla {0} +slot = [accent]Hueco {0} editmessage = Editar mensaje -save.corrupted = [accent]¡El punto de guardado está corrupto o es inválido!\nSi acabas de actualizar el juego, esto debe ser probablemente un cambio en el formato de guardado y[scarlet] no[] un error. +save.corrupted = [accent]¡El punto de guardado está corrupto o es inválido!\nSi acabas de actualizar el juego, probablemente se deba a un cambio en el formato de guardado y[scarlet] no[] un a error. empty = -on = Encendido -off = Apagado +on = ON +off = OFF save.autosave = Autoguardado: {0} save.map = Mapa: {0} save.wave = Oleada {0} -save.mode = ModoJuego: {0} +save.mode = Modo de Juego: {0} save.date = Última vez guardado: {0} save.playtime = Tiempo de juego: {0} -warning = Aviso. +warning = Aviso confirm = Confirmar delete = Borrar view.workshop = Ver en el Steam Workshop @@ -267,50 +287,59 @@ cancel = Cancelar openlink = Abrir Enlace copylink = Copiar Enlace back = Atrás +crash.export = Exportar Registros de errores +crash.none = No se encontraron Registros de errores. +crash.exported = Registros de errores exportados. data.export = Exportar Datos data.import = Importar Datos data.openfolder = Abrir Carpeta de Datos data.exported = Datos exportados. data.invalid = Esta data del juego no es valida. data.import.confirm = Importando los datos externos borrará[scarlet] todo[] tu progreso.\n[accent]Esto no se puede rehacer![]\n\nUna vez que los datos hayan sido importados, el juego saldrá automaticamente. -quit.confirm = ¿Estás seguro de querer salir de la partida? +quit.confirm = ¿Quieres salir de la partida? quit.confirm.tutorial = ¿Estás seguro de que sabes qué estas haciendo?\nSe puede hacer el tutorial de nuevo en[accent] Ajustes->Juego->Volver a hacer tutorial.[] loading = [accent]Cargando... reloading = [accent]Recargando mods... saving = [accent]Guardando... -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][] para reaparecer en el núcleo cancelbuilding = [accent][[{0}][] para limpiar el plan selectschematic = [accent][[{0}][] para seleccionar+copiar pausebuilding = [accent][[{0}][] para pausar la construcción -resumebuilding = [scarlet][[{0}][] para resumir la construcción +resumebuilding = [scarlet][[{0}][] para reanudar la construcción +showui = Interfaz oculta.\nPulsa [accent][[{0}][] para volver a mostrar la Interfaz. wave = [accent]Oleada {0} +wave.cap = [accent]Oleada {0}/{1} wave.waiting = Oleada en {0} wave.waveInProgress = [lightgray]Oleada en progreso waiting = Esperando... waiting.players = Esperando jugadores... wave.enemies = [lightgray]{0} Enemigos Restantes +wave.enemycores = [accent]{0}[lightgray] Núcleos enemigos +wave.enemycore = [accent]{0}[lightgray] Núcleo enemigo wave.enemy = [lightgray]{0} Enemigo Restante +wave.guardianwarn = El Guardián llegará en [accent]{0}[] oleadas. +wave.guardianwarn.one = El Guardián se aproxima... [accent]{0}[] oleada restante. loadimage = Cargar Imagen saveimage = Guardar Imagen unknown = Desconocido custom = Personalizado builtin = Incorporado -map.delete.confirm = ¿Estás seguro de querer borrar este mapa? ¡Recuerda que está acción no se puede deshacer! +map.delete.confirm = ¿Quieres borrar este mapa? ¡Recuerda que esta acción no se puede deshacer! map.random = [accent]Mapa Aleatorio -map.nospawn = ¡Este mapa no tiene ningún núcleo en el cual pueda aparecer el jugador! Agrega un núcleo[accent] orange[] [white]al mapa con el editor. -map.nospawn.pvp = ¡Este mapa no tiene ningún núcleo enemigo para que aparezca el jugador! Añade un núcleo[scarlet] red[] a este mapa en el editor. -map.nospawn.attack = ¡Este mapa no tiene núcleos para que el jugador ataque! Añade núcleos[scarlet] red[] a este mapa en el editor. +map.nospawn = ¡Este mapa no tiene ningún núcleo en que pueda aparecer el jugador! Agrega un núcleo[accent] naranja[] al mapa con el editor. +map.nospawn.pvp = ¡Este mapa no tiene ningún núcleo enemigo para que aparezcan otros jugadores! Añade un núcleo[scarlet] "de otro color"[] a este mapa en el editor. +map.nospawn.attack = ¡Este mapa no tiene núcleos a los que los jugadores deban atacar! Añade núcleos[scarlet] rojos[] a este mapa en el editor. map.invalid = Error cargando el mapa: archivo corrupto o inválido. workshop.update = Actualizar artículo workshop.error = Error al obtener detalles del Steam Workshop: {0} -map.publish.confirm = ¿Estás seguro de que deseas publicar este mapa?\n\n[lightgray]¡Asegúrese de aceptar primero el EULA del Steam Workshop, o sus mapas no aparecerán! -workshop.menu = Seleccione lo que le gustaría hacer con este artículo. +map.publish.confirm = ¿Deseas publicar este mapa?\n\n[lightgray]¡Asegúrate de aceptar primero el EULA del Steam Workshop, o tus mapas no aparecerán! +workshop.menu = Selecciona lo que quieres hacer con este artículo. workshop.info = Información del artículo changelog = Lista de cambios (optional): eula = EULA de Steam -missing = Este artículo ha sido movido o eliminado.\n[lightgray]La lista del taller ahora se ha desvinculado automáticamente. +missing = Este artículo ha sido movido o eliminado.\n[lightgray]La lista del Workshop se ha desvinculado automáticamente. publishing = [accent]Publicando... -publish.confirm = ¿Estás seguro de que quieres publicar esto?\n\n[lightgray]¡Asegúrese de aceptar primero el EULA del taller, o sus artículos no aparecerán! +publish.confirm = ¿Estás seguro de que quieres publicar esto?\n\n[lightgray]¡Asegúrate de aceptar primero el EULA del Steam Workshop, o tus artículos no aparecerán! publish.error = Error publicando el artículo: {0} steam.error = Error al inicializar los servicios de Steam.\nError: {0} @@ -328,6 +357,7 @@ editor.generation = Generación: editor.ingame = Editar dentro del juego editor.publish.workshop = Publicar en el Steam Workshop editor.newmap = Nuevo Mapa +editor.center = Centrar workshop = Steam Workshop waves.title = Oleadas waves.remove = Borrar @@ -346,9 +376,10 @@ waves.invalid = Oleadas inválidaas en el portapapeles. waves.copied = Oleadas copiadas. waves.none = No hay enemigos definidos.\nNótese que las listas de oleadas vacías se sustituirán por la lista por defecto. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#Estos están en minúscula intencionadamente. +wavemode.counts = limitadas +wavemode.totals = totales +wavemode.health = por salud editor.default = [lightgray] details = Detalles... @@ -374,7 +405,7 @@ editor.savemap = Guardar Mapa editor.saved = ¡Guardado! editor.save.noname = ¡Tu mapa no tiene un nombre! Pon uno en el menú 'Info del Mapa'. editor.save.overwrite = ¡Tu mapa sobrescribe uno ya incorporado! Elige un nombre diferente en el menú 'Info del Mapa'. -editor.import.exists = [scarlet]¡No se ha podido importar:[] un mapa incorporado con el nombre '{0}' ya existe! +editor.import.exists = [scarlet]¡No se ha podido importar:[] ya existe un mapa incorporado con el nombre '{0}'! editor.import = Importar... editor.importmap = Importar Mapa editor.importmap.description = Importar un mapa ya existente @@ -401,48 +432,50 @@ toolmode.replace = Sustituir toolmode.replace.description = Solo dibuja en bloques sólidos. toolmode.replaceall = Sustituir Todo toolmode.replaceall.description = Sustituye todos los bloques del mapa. -toolmode.orthogonal = Ortogonal +toolmode.orthogonal = Perpendicular toolmode.orthogonal.description = Solo dibuja líneas ortogonales. toolmode.square = Cuadrado toolmode.square.description = Pincel cuadrado. toolmode.eraseores = Borrar Vetas toolmode.eraseores.description = Solo borra vetas. -toolmode.fillteams = Llenar Equipos -toolmode.fillteams.description = Llena equipos en vez de bloques. +toolmode.fillteams = Rellenar Equipos +toolmode.fillteams.description = Rellena equipos en lugar de bloques. toolmode.drawteams = Dibujar Equipos -toolmode.drawteams.description = Dibuja equipos en vez de bloques. +toolmode.drawteams.description = Dibuja equipos en lugar de bloques. filters.empty = [lightgray]¡No hay filtros! Añade uno con el botón de abajo. filter.distort = Distorsionar filter.noise = Ruido -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select -filter.median = Median -filter.oremedian = Veta Median -filter.blend = Mezcla +filter.enemyspawn = Punto de aparición enemigo +filter.spawnpath = Ruta hasta el punto de aterrizaje +filter.corespawn = Elegir Núcleo +filter.median = Calcular probabilidades de generación +filter.oremedian = Probabilidad de vetas +filter.blend = Mezclar filter.defaultores = Vetas por defecto -filter.ore = Vetas -filter.rivernoise = Ruido de rio +filter.ore = Vetas de Minerales +filter.rivernoise = Añadir Río filter.mirror = Espejo filter.clear = Despejar filter.option.ignore = Ignorar filter.scatter = Dispersar filter.terrain = Terreno filter.option.scale = Escala -filter.option.chance = Chance +filter.option.chance = Probabilidad filter.option.mag = Magnitud filter.option.threshold = Umbral filter.option.circle-scale = Escala del círculo -filter.option.octaves = Octaves -filter.option.falloff = Caída +filter.option.octaves = Continuidad +filter.option.falloff = Aterrizaje filter.option.angle = Ãngulo -filter.option.amount = Amount +filter.option.amount = Cantidad filter.option.block = Bloque filter.option.floor = Suelo filter.option.flooronto = Suelo objetivo +filter.option.target = Target filter.option.wall = Muro filter.option.ore = Veta -filter.option.floor2 = Piso secundario +filter.option.floor2 = Terreno secundario filter.option.threshold2 = Umbral secundario filter.option.radius = Radio filter.option.percentile = Porcentaje @@ -451,17 +484,19 @@ width = Ancho: height = Alto: menu = Menú play = Jugar -campaign = Campaña +campaign = Continuar Campaña load = Cargar save = Guardar fps = FPS: {0} ping = Ping: {0} ms -language.restart = Por favor reinicia el juego para que los cambios del idioma tengan efecto. +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb +language.restart = Reinicia el juego para que los cambios en el idioma tengan efecto. settings = Ajustes tutorial = Tutorial -tutorial.retake = Volver a hacer tutorial +tutorial.retake = Volver a jugar el tutorial editor = Editor -mapeditor = Editor de Mapa +mapeditor = Editor de Mapas abandon = Abandonar abandon.text = Esta zona y sus recursos se perderán ante el enemigo. @@ -469,33 +504,24 @@ locked = Bloqueado complete = [lightgray]Completado: requirement.wave = Alcanzar la oleada {0} en {1} requirement.core = Destruir el núcleo enemigo en {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Continuar Zona:\n[lightgray]{0} +requirement.research = Investigar {0} +requirement.capture = Capturar {0} bestwave = [lightgray]Récord: {0} -launch = Lanzar -launch.text = Launch -launch.title = Lanzamiento Exitoso -launch.next = [lightgray]próxima oportunidad en la oleada {0} -launch.unable2 = [scarlet]No se puede LANZAR.[] -launch.confirm = Esto lanzará todos los recursos al núcleo.\nNo podrás volver a esta base. -launch.skip.confirm = Si saltas la oleada ahora, no podrás lanzar recursos hasta unas oleadas después. +launch.text = Lanzar +research.multiplayer = Solo el anfitrión de la partida puede \nrealizar investigaciones tecnologías. +map.multiplayer = Solo el anfitrión de la partida puede ver los sectores del mapa. uncover = Descubrir configure = Configurar carga inicial -loadout = Loadout -resources = Resources + +loadout = Carga Inicial +resources = Recursos bannedblocks = Bloques prohibidos addall = Añadir todo -launch.destination = Destination: {0} +launch.from = Lanzando desde: [accent]{0} +launch.destination = Destino: {0} configure.invalid = La cantidad debe estar entre 0 y {0}. -zone.unlocked = [lightgray]{0} desbloqueado. -zone.requirement.complete = Oleada {0} alcanzada:\nrequerimientos de la zona {1} cumplidos. -zone.resources = Recursos Detectados: -zone.objective = [lightgray]Objetivo: [accent]{0} -zone.objective.survival = Sobrevivir -zone.objective.attack = Destruir Núcleo Enemigo add = Añadir... -boss.health = Salud del Jefe +boss.health = Guardián connectfail = [crimson]Ha fallado la conexión con el servidor: [accent]{0} error.unreachable = Servidor inaccesible. @@ -506,45 +532,84 @@ error.alreadyconnected = Ya estás conectado. error.mapnotfound = ¡Archivo de mapa no encontrado! error.io = Error I/O de conexión. error.any = Error de red desconocido. -error.bloom = Error al cargar el bloom.\nPuede que tu dispositivo no soporte esta característica. +error.bloom = Error al cargar el efecto de bloom.\nPuede que tu dispositivo no sea compatible con esta característica. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Lluvia +weather.snow.name = Nieve +weather.sandstorm.name = Tormenta de arena +weather.sporestorm.name = Tormenta de esporas +weather.fog.name = Niebla -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]No explorado +sectors.resources = Recursos: +sectors.production = Producción: +sectors.export = Exportado: +sectors.time = Tiempo: +sectors.threat = Amenaza: +sectors.wave = Oleada: +sectors.stored = Almacenado: +sectors.resume = Reanudar +sectors.launch = Lanzar +sectors.select = Elegir +sectors.nonelaunch = [lightgray]Ninguno (Sol) +sectors.rename = Renombrar sector +sectors.enemybase = [scarlet]Base enemiga +sectors.vulnerable = [scarlet]Vulnerable +sectors.underattack = [scarlet]¡Bajo ataque! [accent]{0}% dañado +sectors.survives = [accent]Sobrevive {0} oleadas +sectors.go = Ir +sector.curcapture = Sector Capturado +sector.curlost = Sector Perdido +sector.missingresources = [scarlet]Recursos Insuficientes +sector.attacked = Sector [accent]{0}[white] bajo ataque[]! +sector.lost = ¡Sector [accent]{0}[white] perdido[]! +#nota: el espacio en blanco en la línea siguiente es intencionado +sector.captured = ¡Sector [accent]{0}[white] capturado[]! -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = Baja +threat.medium = Media +threat.high = Alta +threat.extreme = Extrema +threat.eradication = Erradicación -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +planets = Planetas + +planet.serpulo.name = Serpulo +planet.sun.name = Sol + +sector.impact0078.name = Impacto 0078 +sector.groundZero.name = Zona de impacto +sector.craters.name = Los Cráteres +sector.frozenForest.name = Bosque Congelado +sector.ruinousShores.name = Costas Ruinosas +sector.stainedMountains.name = Montañas manchadas +sector.desolateRift.name = Grieta desolada +sector.nuclearComplex.name = Complejo de producción nuclear +sector.overgrowth.name = Sobrecrecimiento +sector.tarFields.name = Campos de alquitrán +sector.saltFlats.name = Llanuras de sal +sector.fungalPass.name = Paso de hongos +sector.biomassFacility.name = Centro de Sintetización de Biomasa +sector.windsweptIslands.name = Islas Windswept +sector.extractionOutpost.name = Puesto de avanzada de Extracción +sector.planetaryTerminal.name = Terminal de Lanzamiento Interplanetario + +sector.groundZero.description = La ubicación adecuada para empezar una vez más. Amenaza enemiga baja. Pocos recursos.\nReúna la mayor cantidad de plomo y cobre posible y sigue adelante. +sector.frozenForest.description = Incluso aquí, más cerca de las montañas, las esporas se han extendido. Las gélidas temperaturas no las contendrán para siempre.\n\nAprende a usar la energía. Construye generadores de combustión. Aprende a usar reparadores. +sector.saltFlats.description = En las afueras del desierto se encuentran las Salinas. No hay muchos recursos en esta ubicación.\n\nEl enemigo ha creado un complejo de almacenamiento de recursos aquí. Erradica su núcleo. No dejes nada en pie. +sector.craters.description = El agua se ha acumulado en este cráter, reliquia de las viejas guerras. Recupera la zona. Recoge arena. Funde Metacristal. Bombea agua para enfriar torretas y taladros. +sector.ruinousShores.description = Más allá de los páramos, se encuentra la costa. Una vez, esta ubicación albergó una serie de defensa costera. No queda mucho. Solo las estructuras de defensa más básicas han quedado ilesas, todo lo demás está reducido a chatarra.\nContinúa la expansión. Redescubre la tecnología. +sector.stainedMountains.description = Más adentro se encuentran las montañas, aún intactas por las esporas.\nExtrae el abundante titanio de esta zona. Aprende a usarlo.\n\nLa presencia enemiga es mayor aquí. No les des tiempo para enviar sus unidades más fuertes. +sector.overgrowth.description = El área está cubierta de maleza, más cerca de la fuente de las esporas.\nEl enemigo ha establecido un puesto de avanzada aquí. Construye unidades Mace. Destruyelo. Recupera lo que se perdió. +sector.tarFields.description = Las afueras de una zona de producción de petróleo, entre la montaña y el desierto. Una de las pocas áreas con reservas de alquitrán utilizables.\nAunque está abandonada, esta zona tiene algunas fuerzas enemigas peligrosas cerca. No los subestimes.\n\n[lightgray]Investiga la tecnología de procesamiento de petróleo si es posible. +sector.desolateRift.description = Una zona extremadamente peligrosa. Recursos abundantes, pero poco espacio. Alto riesgo de destrucción. Abandona el lugar lo antes posible. No te dejes engañar por el intervalo entre los ataques enemigos. +sector.nuclearComplex.description = Antigua instalación de producción y procesamiento de torio, reducida a ruinas.\n[lightgray] Investiga el torio y sus múltiples usos.\n\nEl enemigo está presente aquí,superando en número a sus atacantes. +sector.fungalPass.description = Un área de transición entre montañas y las tierras bajas, plagadas de esporas. Aquí se encuentra una pequeña base de reconocimiento enemiga.\nDestrúyela.\nUsa unidades Dagger y Crawler. Acaba con los dos núcleos. +sector.biomassFacility.description = El origen de las esporas. Este es el centro en el que se investigaron, y donde fueron incialmente producidas.\nDescubre la tecnología restante que contiene. Cultiva esporas para producir combustible y plásticos.\n\n[lightgray]Nada en el ecosistema local pudo combatir semejante organismo tan invasivo, originado en este lugar. +sector.windsweptIslands.description = Tras la costa, se encuentra esta remota cadena de islas. Las grabaciones muestran que aquí existieron estructuras relacionadas con la producción de [accent]Plastanio[].\n\nDefiéndete de las unidades navales enemigas. Establece una base en las islas. Investiga estas fábricas. +sector.extractionOutpost.description = Una base remota, construida por el enemigo con el objetivo de lanzar recursos a otros sectores.\n\nLa tecnología de transporte de recursos entre sectores es esencial para conquistar a gran escala. Destruye la base. Investiga sus Plataformas de Lanzamiento. +sector.impact0078.description = Aquí yacen las ruinas de la primera estación de transporte interestelar en estar operativa del sistema.\n\nRecupera todo lo posible de los escombros. Investiga cualquier tecnología intacta. +sector.planetaryTerminal.description = El objetivo final.\n\nÉsta base costera alberga una estructura capaz de lanzar Núcleos a planeteas locales. Está extremadamente bien protegida.\n\nProduce unidades navales. Acaba con el enemigo lo antes posible. Analiza la estructura de lanzamiento. settings.language = Idioma settings.data = Datos del Juego @@ -555,68 +620,104 @@ settings.controls = Controles settings.game = Juego settings.sound = Sonido settings.graphics = Gráficos -settings.cleardata = Limpiar Datos del Juego... -settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse! -settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y atajos de teclado.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.cleardata = Eliminando Datos del Juego... +settings.clear.confirm = ¿Quieres eliminar estos datos?\n¡Esta acción no se puede deshacer! +settings.clearall.confirm = [scarlet]¡ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y atajos de teclado.\nUna vez presiones 'ok', el juego borrrará todos tus datos y se cerrará automáticamente. +settings.clearsaves.confirm = ¿Quieres borrar tus partidas guardadas? +settings.clearsaves = Limpiar partidas guardadas +settings.clearresearch = Borrar Investigaciones Tecnológicas +settings.clearresearch.confirm = ¿Quieres eliminar todo el progreso de las Investigaciones Tecnológicas del modo Campaña? +settings.clearcampaignsaves = Borrar datos de campaña +settings.clearcampaignsaves.confirm = ¿Quieres borrar tus partidas guardadas en el modo campaña? paused = [accent] < Pausado > -clear = Limpiar +clear = Vaciar banned = [scarlet]Baneado -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = Sí no = No -info.title = [accent]Información -error.title = [crimson]Un error ha ocurrido. -error.crashtitle = Un error ha ocurrido. -unit.nobuild = [scarlet]Unit can't build -blocks.input = Entrada -blocks.output = Salida -blocks.booster = Potenciador -blocks.tiles = Tiles requeridos -blocks.affinities = Afinidades +info.title = Información +error.title = [crimson]Ha ocurrido un error. +error.crashtitle = Ha ocurrido un error. +unit.nobuild = [scarlet]Esta unidad no puede construir +lastaccessed = [lightgray]Último usado: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Capacidad de Energía -blocks.powershot = Energía/Disparo -blocks.damage = Daño -blocks.targetsair = Apunta al Aire -blocks.targetsground = Apunta a Tierra -blocks.itemsmoved = Velocidad de movimiento -blocks.launchtime = Tiempo entre lanzamientos -blocks.shootrange = Rango de Disparo -blocks.size = Tamaño -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacidad de Líquidos -blocks.powerrange = Rango de Energía -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Conexiones maximas -blocks.poweruse = Consumo de Energía -blocks.powerdamage = Energía/Daño -blocks.itemcapacity = Capacidad de Objetos -blocks.basepowergeneration = Generación de energía base -blocks.productiontime = Tiempo de producción -blocks.repairtime = Tiempo para Reparar Bloque Completamente -blocks.speedincrease = Aumento de Velocidad -blocks.range = Rango -blocks.drilltier = Taladrables -blocks.drillspeed = Velocidad Base del Taladro -blocks.boosteffect = Efecto del Potenciador -blocks.maxunits = Máximo de Unidades Activas -blocks.health = Vida -blocks.buildtime = Tiempo de construcción -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Coste de construcción -blocks.inaccuracy = Imprecisión -blocks.shots = Disparos -blocks.reload = Recarga -blocks.ammo = Munición -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -bar.drilltierreq = Se requiere un mejor taladro. -bar.noresources = Missing Resources -bar.corereq = Core Base Required +stat.description = Objetivo +stat.input = Entrada +stat.output = Salida +stat.booster = Potenciador +stat.tiles = Terreno requerido +stat.affinities = Afinidades +stat.powercapacity = Capacidad de Energía +stat.powershot = Energía/Disparo +stat.damage = Daño +stat.targetsair = Apunta al Aire +stat.targetsground = Apunta a Tierra +stat.itemsmoved = Velocidad de movimiento +stat.launchtime = Tiempo entre lanzamientos +stat.shootrange = Alcance +stat.size = Tamaño +stat.displaysize = Tamaño de Pantalla +stat.liquidcapacity = Capacidad de Líquidos +stat.powerrange = Rango de Energía +stat.linkrange = Alcance de conexión +stat.instructions = Instrucciones +stat.powerconnections = Conexiones máximas +stat.poweruse = Consumo de Energía +stat.powerdamage = Energía/Daño +stat.itemcapacity = Capacidad de Objetos +stat.memorycapacity = Capacidad de memoria +stat.basepowergeneration = Generación de energía +stat.productiontime = Tiempo de producción +stat.repairtime = Tiempo para Reparar Bloque Completamente +stat.weapons = Armas +stat.bullet = Proyectil +stat.speedincrease = Aumento de Velocidad +stat.range = Alcance +stat.drilltier = Taladrables +stat.drillspeed = Velocidad del Taladro +stat.boosteffect = Efecto de Potenciador +stat.maxunits = Máximo de Unidades Activas +stat.health = Vida +stat.armor = Armadura +stat.buildtime = Tiempo de construcción +stat.maxconsecutive = Máximo consecutivo +stat.buildcost = Coste de construcción +stat.inaccuracy = Imprecisión +stat.shots = Disparos +stat.reload = Disparos/segundo +stat.ammo = Munición +stat.shieldhealth = Escudo +stat.cooldowntime = Enfriamiento +stat.explosiveness = Explosividad +stat.basedeflectchance = Probabilidad de desvío +stat.lightningchance = Probabilidad de descarga +stat.lightningdamage = Daño por rayo +stat.flammability = Inflamabilidad +stat.radioactivity = Radioactividad +stat.charge = Carga eléctrica +stat.heatcapacity = Resistencia a la temperatura +stat.viscosity = Viscosidad +stat.temperature = Temperatura +stat.speed = Velocidad +stat.buildspeed = Velocidad de construcción +stat.minespeed = Velocidad de extracción +stat.minetier = Nivel de taladro +stat.payloadcapacity = Capacidad de carga +stat.commandlimit = Límite de comando +stat.abilities = Habilidades +stat.canboost = Tiene Propulsores +stat.flying = Aéreo + +ability.forcefield = Campo de Fuerza +ability.repairfield = Campo de Reparación +ability.statusfield = Campo de Estado +ability.unitspawn = {0} Fábrica de Drones +ability.shieldregenfield = Campo de Regeneración de Escudos +ability.movelightning = Movimiento Relámpago + +bar.drilltierreq = Requiere un taladro mejor +bar.noresources = Recursos insuficientes +bar.corereq = Necesitas un núcleo base bar.drillspeed = Velocidad del Taladro: {0}/s bar.pumpspeed = Velocidad de bombeado: {0}/s bar.efficiency = Eficiencia: {0}% @@ -624,6 +725,7 @@ bar.powerbalance = Energía: {0} bar.powerstored = Almacenados: {0}/{1} bar.poweramount = Energía: {0} bar.poweroutput = Salida de Energía: {0} +bar.powerlines = Conexiones: {0}/{1} bar.items = Objetos: {0} bar.capacity = Capacidad: {0} bar.unitcap = {0} {1}/{2} @@ -635,19 +737,27 @@ bar.progress = Progreso de construcción bar.input = Entrada bar.output = Salida -bullet.damage = [stat]{0}[lightgray] daño +units.processorcontrol = [lightgray]Controlado por Procesador + +bullet.damage = [stat]{0}[lightgray] Daño bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas bullet.incendiary = [stat]Incendiaria +bullet.sapping = [stat]Oxidante bullet.homing = [stat]Rastreadora bullet.shock = [stat]Electrizante -bullet.frag = [stat]Explosiva -bullet.knockback = [stat]{0}[lightgray]Retroceso +bullet.frag = [stat]De fragmentación +bullet.buildingdamage = [stat]{0}%[lightgray]daño a estructuras +bullet.knockback = [stat]{0}[lightgray] Empuje +bullet.pierce = [stat]{0}[lightgray]x penetración +bullet.infinitepierce = [stat]Penetrante +bullet.healpercent = [stat]{0}[lightgray]% reparación bullet.freezing = [stat]Congelación -bullet.tarred = [stat]Relantizado +bullet.tarred = [stat]Ralentizado bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición -bullet.reload = [stat]{0}[lightgray]x recarga +bullet.reload = [stat]{0}[lightgray]x cadencia de fuego unit.blocks = bloques +unit.blockssquared = bloques² unit.powersecond = unidades de energía/segundo unit.liquidsecond = unidades de líquido/segundo unit.itemssecond = objetos/segundo @@ -660,175 +770,179 @@ unit.persecond = /seg unit.perminute = /min unit.timesspeed = x velocidad unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = Escudo unit.items = objetos unit.thousands = k unit.millions = M unit.billions = b +category.purpose = Objetivo category.general = General category.power = Energía category.liquids = Líquidos category.items = Objetos category.crafting = Fabricación -category.shooting = Disparo +category.function = Función category.optional = Mejoras Opcionales -setting.landscape.name = Bloquear modo paisaje +setting.landscape.name = Bloquear modo horizontal setting.shadows.name = Sombras setting.blockreplace.name = Sugerir bloques al construir setting.linear.name = Filtrado Lineal -setting.hints.name = Pistas -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) +setting.hints.name = Consejos +setting.flow.name = Mostrar tasa de flujo de recursos +setting.backgroundpause.name = Pausar en segundo plano setting.buildautopause.name = Auto-pausar construcción -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Agua Animada -setting.animatedshields.name = Escudos Animados -setting.antialias.name = Antialias[lightgray] (necesita reiniciar)[] -setting.playerindicators.name = Player Indicators -setting.indicators.name = Indicadores de Aliados -setting.autotarget.name = Auto apuntado +setting.animatedwater.name = Animaciones de Terreno +setting.animatedshields.name = Animación de Escudos +setting.antialias.name = Antialias[lightgray] (necesita un reinicio)[] +setting.playerindicators.name = Indicadores de Jugadores +setting.indicators.name = Indicadores de Enemigos +setting.autotarget.name = Auto-Apuntado setting.keyboard.name = Controles de Ratón+Teclado -setting.touchscreen.name = Controles táctiles -setting.fpscap.name = Máx FPS +setting.touchscreen.name = Controles Táctiles +setting.fpscap.name = FPS Maxímos setting.fpscap.none = Nada setting.fpscap.text = {0} FPS -setting.uiscale.name = Escala de UI[lightgray] (necesita reiniciar)[] -setting.swapdiagonal.name = Siempre Colocar Diagonalmente -setting.difficulty.training = entrenamiento -setting.difficulty.easy = fácil -setting.difficulty.normal = normal -setting.difficulty.hard = difícil -setting.difficulty.insane = locura +setting.uiscale.name = Escala de Interfaz[lightgray] (necesita reiniciar)[] +setting.swapdiagonal.name = Siempre Construir Diagonalmente +setting.difficulty.training = Entrenamiento +setting.difficulty.easy = Fácil +setting.difficulty.normal = Normal +setting.difficulty.hard = Difícil +setting.difficulty.insane = Demencial setting.difficulty.name = Dificultad: -setting.screenshake.name = Movimiento de la Pantalla -setting.effects.name = Mostrar Efectos +setting.screenshake.name = Vibración de pantalla +setting.effects.name = Mostrar efectos setting.destroyedblocks.name = Mostrar bloques destruidos -setting.blockstatus.name = Display Block Status -setting.conveyorpathfinding.name = Colocación del transportador en búsqueda de caminos -setting.sensitivity.name = Sensibilidad del Control +setting.blockstatus.name = Mostrar estado de los bloques +setting.conveyorpathfinding.name = Construcción de transportadores Inteligente +setting.sensitivity.name = Sensibilidad del Mando setting.saveinterval.name = Intervalo del Autoguardado -setting.seconds = {0} Segundos -setting.blockselecttimeout.name = Tiempo de espera de selección de bloque +setting.seconds = {0} segundos setting.milliseconds = {0} milisegundos setting.fullscreen.name = Pantalla Completa setting.borderlesswindow.name = Ventana sin Bordes[lightgray] (podría requerir un reinicio) -setting.fps.name = Mostrar FPS -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Mostrar teclas de selección de bloque -setting.vsync.name = Vsync (Limita los fps a los Hz de tu pantalla) -setting.pixelate.name = Pixelar [lightgray](podría reducir el rendimiento) +setting.fps.name = Mostrar FPS y Ping +setting.smoothcamera.name = Movimiento de cámara suave +setting.vsync.name = VSync (Limita los fps a los Hz de tu pantalla) +setting.pixelate.name = Pixelar setting.minimap.name = Mostrar Minimapa -setting.coreitems.name = Display Core Items (WIP) -setting.position.name = Mostrar posición del jugador. +setting.coreitems.name = Mostrar Objetos en el nucleo (WIP) +setting.position.name = Mostrar indicadores de posición de jugadores. setting.musicvol.name = Volumen de la Música -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = Mostrar Atmósfera del planeta setting.ambientvol.name = Volumen del Ambiente setting.mutemusic.name = Silenciar Musica setting.sfxvol.name = Volumen de los efectos de sonido setting.mutesound.name = Silenciar Sonido setting.crashreport.name = Enviar informes de fallos anónimos -setting.savecreate.name = Crear puntos de guardado automáticamente -setting.publichost.name = Visibilidad del juego público +setting.savecreate.name = Autoguardar la Partida +setting.publichost.name = Visibilidad de la Partida setting.playerlimit.name = Limite de Jugadores setting.chatopacity.name = Opacidad del Chat -setting.lasersopacity.name = Opacidad de los rayos láser -setting.bridgeopacity.name = Opacidad de Puentes +setting.lasersopacity.name = Opacidad del Laser de Nodos de Energía +setting.bridgeopacity.name = Opacidad de Puentes Transportadores setting.playerchat.name = Mostrar el chat de burbuja -public.confirm = ¿Quieres hacer público tu juego?\n[lightgray]Esto se puede cambiar más tarde en Configuración->Juego->Visibilidad pública del juego. -public.beta = Recuerda que en las versiones beta del juego no puedes crear partidas públicas. -uiscale.reset = La escala de la interfaz ha sido modificada con éxito.\nPulsa "OK" para conservar esta escala.\n[scarlet]Deshaciendo los cambios y saliendo al menu en [accent] {0}[]segundos... -uiscale.cancel = Cancelar & Salir -setting.bloom.name = Brillo +setting.showweather.name = Efectos visuales climáticos +public.confirm = ¿Quieres hacer pública tu partida?\n[lightgray]Esto se puede cambiar más tarde en "Configuración->Juego->Visibilidad pública de la partida". +public.beta = Recuerda que no puedes crear partidas públicas en las versiones beta del juego. +uiscale.reset = La escala de la interfaz ha sido modificada.\nPulsa "OK" para conservar esta escala.\n[scarlet]Se desharán los cambios automáticamente en [accent] {0}[] segundos... +uiscale.cancel = Cancelar y Salir +setting.bloom.name = Desenfoque de iluminación keybind.title = Cambiar accesos de teclado keybinds.mobile = [scarlet]Los accesos del teclado aquí mostrados no estan disponible en Móviles o Tablets. Solo aceptan movimiento básico. category.general.name = General category.view.name = Visión category.multiplayer.name = Multijugador -category.blocks.name = Block Select +category.blocks.name = Seleccionar bloques command.attack = Atacar -command.rally = Patrullar +command.rally = Reunirse command.retreat = Retirarse -command.idle = Idle -placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +command.idle = Esperar +placement.blockselectkeys = \n[lightgray]Códigos: [{0}, +keybind.respawn.name = Reaparecer +keybind.control.name = Controlar unidad keybind.clear_building.name = Eliminar construcción -keybind.press = Presiona una tecla... +keybind.press = Pulsa una tecla... keybind.press.axis = Pulsa un eje o botón... keybind.screenshot.name = Captura de pantalla de Mapa -keybind.toggle_power_lines.name = Activar láser de potencia -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_power_lines.name = Ocultar Láser de Red Eléctrica +keybind.toggle_block_status.name = Alternar estado de los bloques keybind.move_x.name = Mover x keybind.move_y.name = Mover y -keybind.mouse_move.name = Seguír al ratón -keybind.pan.name = Pan View -keybind.boost.name = Boost +keybind.mouse_move.name = Seguir al Cursor del Ratón +keybind.pan.name = Desplazar la cámara +keybind.boost.name = Acelerar keybind.schematic_select.name = Seleccionar región -keybind.schematic_menu.name = Menu de esquématicos -keybind.schematic_flip_x.name = Girar esquemático desde X -keybind.schematic_flip_y.name = Girar esquemático desde Y +keybind.schematic_menu.name = Menu de Plantillas +keybind.schematic_flip_x.name = Invertir Plantilla desde X +keybind.schematic_flip_y.name = Invertir Plantilla desde Y keybind.category_prev.name = Categoría anterior keybind.category_next.name = Siguiente categoría -keybind.block_select_left.name = Seleccionar bloque a la izquierda -keybind.block_select_right.name = Seleccionar bloque a la derecha -keybind.block_select_up.name = Seleccionar bloque hacia arriba -keybind.block_select_down.name = Seleccionar bloque hacia abajo -keybind.block_select_01.name = Seleccionar categoría / bloque 1 -keybind.block_select_02.name = Seleccionar categoría / bloque 2 -keybind.block_select_03.name = Seleccionar categoría / bloque 3 -keybind.block_select_04.name = Seleccionar categoría / bloque 4 -keybind.block_select_05.name = Seleccionar categoría / bloque 5 -keybind.block_select_06.name = Seleccionar categoría / bloque 6 -keybind.block_select_07.name = Seleccionar categoría / bloque 7 -keybind.block_select_08.name = Seleccionar categoría / bloque 8 -keybind.block_select_09.name = Seleccionar categoría / bloque 9 -keybind.block_select_10.name = Seleccionar categoría / bloque 10 -keybind.fullscreen.name = Intercambiar con Pantalla Completa +keybind.block_select_left.name = Seleccionar bloque - Izquierda +keybind.block_select_right.name = Seleccionar bloque - Derecha +keybind.block_select_up.name = Seleccionar bloque - Arriba +keybind.block_select_down.name = Seleccionar bloque - Abajo +keybind.block_select_01.name = Seleccionar Categoría/Bloque 1 +keybind.block_select_02.name = Seleccionar Categoría/Bloque 2 +keybind.block_select_03.name = Seleccionar Categoría/Bloque 3 +keybind.block_select_04.name = Seleccionar Categoría/Bloque 4 +keybind.block_select_05.name = Seleccionar Categoría/Bloque 5 +keybind.block_select_06.name = Seleccionar Categoría/Bloque 6 +keybind.block_select_07.name = Seleccionar Categoría/Bloque 7 +keybind.block_select_08.name = Seleccionar Categoría/Bloque 8 +keybind.block_select_09.name = Seleccionar Categoría/Bloque 9 +keybind.block_select_10.name = Seleccionar Categoría/Bloque 10 +keybind.fullscreen.name = Cambiar a Pantalla Completa keybind.select.name = Seleccionar keybind.diagonal_placement.name = Construcción Diagonal keybind.pick.name = Elegir bloque keybind.break_block.name = Destruir Bloque keybind.deselect.name = Deseleccionar -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Recoger carga +keybind.dropCargo.name = Soltar carga +keybind.command.name = Ordenar keybind.shoot.name = Disparar keybind.zoom.name = Zoom keybind.menu.name = Menú keybind.pause.name = Pausa -keybind.pause_building.name = Pausar/Resumir construcción +keybind.pause_building.name = Pausar/Reanudar construcción keybind.minimap.name = Minimapa +keybind.planet_map.name = Mapa del Planeta +keybind.research.name = Investigaciones keybind.chat.name = Chat keybind.player_list.name = Lista de jugadores keybind.console.name = Consola keybind.rotate.name = Rotar keybind.rotateplaced.name = Rotar existente (mantener) -keybind.toggle_menus.name = Alternar menús -keybind.chat_history_prev.name = Historial de chat anterior -keybind.chat_history_next.name = Historial de chat siguiente -keybind.chat_scroll.name = Desplazamiento de chat -keybind.drop_unit.name = Caida de la unidad +keybind.toggle_menus.name = Ocultar menús +keybind.chat_history_prev.name = Historial de chat - Anterior +keybind.chat_history_next.name = Historial de chat - Siguiente +keybind.chat_scroll.name = Desplazar el chat +keybind.chat_mode.name = Cambiar modo de chat +keybind.drop_unit.name = Soltar unidad keybind.zoom_minimap.name = Zoom del minimapa mode.help.title = Descripción de modos mode.survival.name = Supervivencia mode.survival.description = El modo normal. Recursos limitados y oleadas automáticas. -mode.sandbox.name = Caja de arena +mode.sandbox.name = Modo libre mode.sandbox.description = Recursos ilimitados y sin temporizador para las oleadas. mode.editor.name = Editor mode.pvp.name = JcJ mode.pvp.description = Pelea contra otros jugadores localmente. -mode.attack.name = Ataque +mode.attack.name = Batalla mode.attack.description = No hay oleadas, el objetivo es destruir la base enemiga. mode.custom = Normas personalizadas -rules.infiniteresources = Recursos Infinitos -rules.reactorexplosions = Reactor Explosions -rules.wavetimer = Temportzador de Oleadas +rules.infiniteresources = Recursos infinitos +rules.reactorexplosions = Los reactores pueden explotar +rules.schematic = Permitir Plantillas +rules.wavetimer = Temporizador de Oleadas rules.waves = Oleadas -rules.attack = Modo de Ataque -rules.buildai = AI Building -rules.enemyCheat = Recursos infinitos de la IA +rules.attack = Ataque +rules.buildai = La IA enemiga puede construir +rules.enemyCheat = La IA enemiga tiene recursos infinitos rules.blockhealthmultiplier = Multiplicador de salud de bloque -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = Multiplicador de daño de bloque rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades rules.unithealthmultiplier = Multiplicador de la vida de las unidades rules.unitdamagemultiplier = Multiplicador del daño de unidades @@ -836,28 +950,31 @@ rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[ligh rules.wavespacing = Tiempo entre oleadas:[lightgray] (seg) rules.buildcostmultiplier = Multiplicador de coste de construcción rules.buildspeedmultiplier = Multiplicador de velocidad de construcción -rules.deconstructrefundmultiplier = Multiplicador de Devolución de Desconstrucción +rules.deconstructrefundmultiplier = Multiplicador de devolución de desconstrucción rules.waitForWaveToEnd = Las oleadas esperan a los enemigos rules.dropzoneradius = Radio de zona de caída:[lightgray] (casillas) -rules.unitammo = Units Require Ammo +rules.unitammo = Las unidades necesitan munición rules.title.waves = Oleadas rules.title.resourcesbuilding = Recursos y Construcción rules.title.enemy = Enemigos rules.title.unit = Unidades rules.title.experimental = Experimental -rules.title.environment = Environment +rules.title.environment = Entorno rules.lighting = Iluminación -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Luces enemigas +rules.fire = Fuego +rules.explosions = Daño de explosiones de Bloques/Unidades rules.ambientlight = Iluminación ambiental -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Clima +rules.weather.frequency = Frequencia: +rules.weather.duration = Duracion: content.item.name = Objetos content.liquid.name = Líquidos content.unit.name = Unidades content.block.name = Bloques +content.sector.name = Sectores + item.copper.name = Cobre item.lead.name = Plomo item.coal.name = Carbón @@ -868,41 +985,24 @@ item.silicon.name = Silicio item.plastanium.name = Plastanio item.phase-fabric.name = Tejido de fase item.surge-alloy.name = Aleación Eléctrica -item.spore-pod.name = Vaina de esporas +item.spore-pod.name = Vaina de Esporas item.sand.name = Arena item.blast-compound.name = Compuesto Explosivo item.pyratite.name = Pirotita item.metaglass.name = Metacristal item.scrap.name = Chatarra liquid.water.name = Agua -liquid.slag.name = Fundido +liquid.slag.name = Magma liquid.oil.name = Petróleo -liquid.cryofluid.name = Criogénico - -item.explosiveness = [lightgray]Explosividad: {0} -item.flammability = [lightgray]Inflamabilidad: {0} -item.radioactivity = [lightgray]Radioactividad: {0} - -unit.health = [lightgray]Vida: {0} -unit.speed = [lightgray]Velocidad: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Capacidad Térmica: {0} -liquid.viscosity = [lightgray]Viscosidad: {0} -liquid.temperature = [lightgray]Temperatura: {0} - -unit.dagger.name = Daga +liquid.cryofluid.name = Líquido criogénico +#Names of Units and Turrets look better untranslated, since they are propper/own names +unit.dagger.name = Dagger unit.mace.name = Mace -unit.fortress.name = Fortaleza +unit.fortress.name = Fortress unit.nova.name = Nova unit.pulsar.name = Pulsar unit.quasar.name = Quasar -unit.crawler.name = Oruga +unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid @@ -930,66 +1030,69 @@ unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Resupply Point +block.resupply-point.name = Punto de reabastecimiento block.parallax.name = Parallax -block.cliff.name = Cliff -block.sand-boulder.name = Piedra de Arena +block.cliff.name = Pared +block.sand-boulder.name = Roca de arena +block.basalt-boulder.name = Roca de basalto block.grass.name = Hierba -block.slag.name = Slag +block.slag.name = Magma +block.space.name = Espacio block.salt.name = Sal -block.salt-wall.name = Salt Wall +block.salt-wall.name = Muro de sal block.pebbles.name = Guijarros block.tendrils.name = Zarcillos -block.sand-wall.name = Sand Wall +block.sand-wall.name = Muro de arena block.spore-pine.name = Pino de esporas -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Muro de esporas +block.boulder.name = Roca +block.snow-boulder.name = Roca de nieve block.snow-pine.name = Pino de nieve block.shale.name = Pizarra -block.shale-boulder.name = Piedra de Pizarra +block.shale-boulder.name = Piedra de pizarra block.moss.name = Musgo block.shrubs.name = Arbustos block.spore-moss.name = Musgo de esporas -block.shale-wall.name = Shale Wall -block.scrap-wall.name = Muro de Chatarra -block.scrap-wall-large.name = Muro de Chatarra grande -block.scrap-wall-huge.name = Muro de Chatarra muy grande -block.scrap-wall-gigantic.name = Muro de Chatarra gigante +block.shale-wall.name = Muro de pizarra +block.scrap-wall.name = Muro de chatarra +block.scrap-wall-large.name = Muro de chatarra grande +block.scrap-wall-huge.name = Muro de chatarra muy grande +block.scrap-wall-gigantic.name = Muro de chatarra gigante block.thruster.name = Propulsor -block.kiln.name = Horno +block.kiln.name = Horno para Cristal block.graphite-press.name = Prensa de grafito block.multi-press.name = Multi-Prensa block.constructing = {0}\n[lightgray](Construyendo) block.spawn.name = Punto de generación -block.core-shard.name = Núcleo: Fragmento -block.core-foundation.name = Núcleo: Fundación -block.core-nucleus.name = Núcleo: Núcleo +block.core-shard.name = Núcleo: Shard +block.core-foundation.name = Núcleo: Foundation +block.core-nucleus.name = Núcleo: Nucleus block.deepwater.name = Aguas profundas block.water.name = Agua -block.tainted-water.name = Agua Contaminada -block.darksand-tainted-water.name = Agua Contaminada con Arena Oscura +block.tainted-water.name = Agua contaminada +block.darksand-tainted-water.name = Agua contaminada con arena oscura block.tar.name = Alquitrán block.stone.name = Piedra block.sand.name = Arena -block.darksand.name = Arena Oscura +block.darksand.name = Arena oscura block.ice.name = Hielo block.snow.name = Nieve -block.craters.name = Cráteres -block.sand-water.name = Agua con Arena -block.darksand-water.name = Agua con Arena Oscura -block.char.name = Carbonizado -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall -block.ice-snow.name = Hielo Nieve -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.craters.name = Cráter +block.sand-water.name = Agua con arena +block.darksand-water.name = Agua con arena oscura +block.char.name = Cenizas +block.dacite.name = Dacita +block.dacite-wall.name = Bloque de dacita +block.dacite-boulder.name = Roca de dacita +block.ice-snow.name = Hielo-Nieve +block.stone-wall.name = Bloque de piedra +block.ice-wall.name = Bloque de hielo +block.snow-wall.name = Bloque de nieve +block.dune-wall.name = Bloque de arena block.pine.name = Pino -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Tierra +block.dirt-wall.name = Bloque de tierra +block.mud.name = Lodo block.white-tree-dead.name = Ãrbol Blanco Muerto block.white-tree.name = Ãrbol Blanco block.spore-cluster.name = Concentración de Esporas @@ -1005,8 +1108,8 @@ block.dark-panel-4.name = Panel Oscuro 4 block.dark-panel-5.name = Panel Oscuro 5 block.dark-panel-6.name = Panel Oscuro 6 block.dark-metal.name = Metal Oscuro -block.basalt.name = Basalt -block.hotrock.name = Roca Caliente +block.basalt.name = Basalto +block.hotrock.name = Roca volcánica block.magmarock.name = Roca de Magma block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muro de Cobre grande @@ -1016,20 +1119,19 @@ block.plastanium-wall.name = Muro de Plastanio block.plastanium-wall-large.name = Muro de Plastanio grande block.phase-wall.name = Muro de Fase grande block.phase-wall-large.name = Muro de Fase grande -block.thorium-wall.name = Pared de Torio +block.thorium-wall.name = Muro de Torio block.thorium-wall-large.name = Muro de Torio grande block.door.name = Puerta block.door-large.name = Puerta Grande -block.duo.name = Dúo -block.scorch.name = Quemador -block.scatter.name = Dispersor -block.hail.name = Granizo -block.lancer.name = Lancero +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer block.conveyor.name = Cinta Transportadora block.titanium-conveyor.name = Cinta Transportadora de Titanio -block.plastanium-conveyor.name = Cinta Transportadora de Titanio +block.plastanium-conveyor.name = Cinta Transportadora de Plastanio block.armored-conveyor.name = Cinta Transportadora Acorazada -block.armored-conveyor.description = Mueve items a la misma veolcidad que una cinta de titanio, pero tiene mas defensa. No acepta entradas por los lados a menos que sean lineas transportadoras. block.junction.name = Cruce block.router.name = Enrutador block.distributor.name = Distribuidor @@ -1037,7 +1139,6 @@ block.sorter.name = Clasificador block.inverted-sorter.name = Clasificador Invertido block.message.name = Mensaje block.illuminator.name = Iluminador -block.illuminator.description = Una fuente de luz pequeña, compacta y configurable. Requiere poder para funcionar. block.overflow-gate.name = Compuerta de Desborde block.underflow-gate.name = Compuerta de Subdesbordamiento block.silicon-smelter.name = Horno para Silicio @@ -1073,11 +1174,12 @@ block.liquid-void.name = Vacío de líquidos block.power-void.name = Vacío de energía block.power-source.name = Energía Infinita block.unloader.name = Descargador -block.vault.name = Bóveda -block.wave.name = Ola -block.swarmer.name = Enjambre -block.salvo.name = Salva -block.ripple.name = Onda +block.vault.name = Almacén +block.wave.name = Wave +block.tsunami.name = Tsunami +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple block.phase-conveyor.name = Cinta Transportadora de Fase block.bridge-conveyor.name = Puente de Cinta Transportadora block.plastanium-compressor.name = Compresor de Plastanio @@ -1086,9 +1188,9 @@ block.blast-mixer.name = Mezclador de Explosivos block.solar-panel.name = Panel Solar block.solar-panel-large.name = Panel Solar Grande block.oil-extractor.name = Extractor de Petróleo -block.repair-point.name = Punto de Reparación +block.repair-point.name = Punto de Reparación de Unidades block.pulse-conduit.name = Conducto de Pulso -block.plated-conduit.name = Conducto Chapado +block.plated-conduit.name = Conducto Acorazado block.phase-conduit.name = Conducto de Fase block.liquid-router.name = Enrutador de Líquidos block.liquid-tank.name = Tanque de Líquidos @@ -1096,129 +1198,163 @@ block.liquid-junction.name = Cruce de Líquidos block.bridge-conduit.name = Conducto Puente block.rotary-pump.name = Bomba Rotatoria block.thorium-reactor.name = Reactor de Torio -block.mass-driver.name = Teletransportador Masivo +block.mass-driver.name = Teletransportador de Masa block.blast-drill.name = Taladro de explosión block.thermal-pump.name = Bomba Térmica block.thermal-generator.name = Generador Térmico block.alloy-smelter.name = Fundidor de Materia block.mender.name = Reparador -block.mend-projector.name = Proyector de reparación +block.mend-projector.name = Proyector de Reparación block.surge-wall.name = Muro de Sobretensión block.surge-wall-large.name = Muro de Sobretensión grande -block.cyclone.name = Ciclón -block.fuse.name = Fusible -block.shock-mine.name = Mina electrizante -block.overdrive-projector.name = Proyector de sobremarcha -block.force-projector.name = Proyector de fuerza -block.arc.name = Arco +block.cyclone.name = Cyclone +block.fuse.name = Fuse +block.shock-mine.name = Mina eléctrica +block.overdrive-projector.name = Proyector de Aceleración +block.force-projector.name = Proyector de Escudo +block.arc.name = Arc block.rtg-generator.name = Generador RTG -block.spectre.name = Espectro -block.meltdown.name = Fusión de Reactor +block.spectre.name = Spectre +block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Contenedor -block.launch-pad.name = Pad de Lanzamiento -block.launch-pad-large.name = Pad de Lanzamiento Grande +block.launch-pad.name = Plataforma de Lanzamiento +block.launch-pad-large.name = Plataforma de Lanzamiento Grande block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.command-center.name = Centro de comando +block.ground-factory.name = Fábrica terrestre +block.air-factory.name = Fábrica aérea +block.naval-factory.name = Fábrica naval +block.additive-reconstructor.name = Reconstructor aditivo +block.multiplicative-reconstructor.name = Reconstructor multiplicativo +block.exponential-reconstructor.name = Reconstructor exponencial +block.tetrative-reconstructor.name = Reconstructor tetrativo +block.payload-conveyor.name = Transportador de carga +block.payload-router.name = Enrutador de carga +block.disassembler.name = Desensamblador +block.silicon-crucible.name = Crisol de silicio +block.overdrive-dome.name = Campo de Aceleración +#experimental, puede ser eliminado +block.block-forge.name = Forja de Bloques +block.block-loader.name = Cargador de Bloques +block.block-unloader.name = Descargador de Bloques +block.interplanetary-accelerator.name = Acelerador Interplanetario -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Interruptor +block.micro-processor.name = Micro Processador +block.logic-processor.name = Procesador lógico +block.hyper-processor.name = Hiperprocesador +block.logic-display.name = Pantalla lógica +block.large-logic-display.name = Pantalla lógica grande +block.memory-cell.name = Unidad de memoria +block.memory-bank.name = Servidor de memoria -team.blue.name = Azul -team.crux.name = rojo -team.sharded.name = naranja -team.orange.name = Naranja -team.derelict.name = derelict -team.green.name = Verde -team.purple.name = Púrpura +team.blue.name = azul +team.crux.name = crux +team.sharded.name = sharded +team.orange.name = naranja +team.derelict.name = delerict +team.green.name = verde +team.purple.name = morado -tutorial.next = [lightgray] -tutorial.intro = Has entrado en el[scarlet]Tutorial de Mindustry.[]\nComienza[accent]minando cobre[]. Toca en una veta de cobre cercana al núcleo para hacer esto.\n\n[accent]{0}/{1} cobre -tutorial.intro.mobile = Has entrado en el[scarlet] Tutorial de Mindustry.[]\nArrastra la pantalla para moverte.\n[accent]Pellizca con 2 dedos [] para alejar y acercar la vista.\nComienza por[accent] minar cobre[]. Muevete cerca de el, luego toca una veta de mineral de cobre cerca de su núcleo para hacer esto.\n\n[accent]{0}/{1} cobre -tutorial.drill = Minar manualmente es ineficiente.\nLos [accent]taladros pueden minar automáticamente.\nColoca uno en una veta de cobre. -tutorial.drill.mobile = Minar manualmente no es muy eficiente.\nLos [accent]Taladros[] pueden minar automáticamente.\nToca la sección de taladros el la esquina de abajo a la derecha.\nSelecciona el[accent]taladro mecánico[].\nColócalo en una veta de cobre tocándola, después pulsa el [accent]botón de confirmación de debajo para confirmar tu selección.\nPulsa el[accent]botón "X" para cancelar la construcción. -tutorial.blockinfo = Cada bloque tiene diferentes estadísticas. Cada taladro solo puede minar ciertos minerales.\nPara comprobar la información y estadísticas de un bloque,[accent] toca el botón "?" mientras lo tienes seleccionado en el menú de construcción.[]\n\n[accent]Accede a las estadísticas del Taladro Mecánico ahora.[] -tutorial.conveyor = Las [accent]Cintas Transportadoras[] se usan para transportar recursos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo. -tutorial.conveyor.mobile = Las [accent]Cintas Transportadoras[] se usan para transportar recursos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo.\n[accent] Construye una línea manteniendo el dedo unos segundos[] y arrastrando hacia una dirección.\n\n[accet]{0}/{1} cintas colocadas en línea\n[ccent]]0/1 recursos transportados. -tutorial.turret = Debes construir estructuras defensivas para repeler al [lightgray]enemigo[].\nConstruye una torreta dúo cerca de tu base. -tutorial.drillturret = Los dúos requieren[accent] munición de cobre[]para disparar.\nColoca un taladro junto a la torre para darle cobre. \nTambien puedes hacer una línea de transportadores desde el taladro hasta el dúo. -tutorial.pause = Durante la batalla, puedes[accent]pausar el juego.[]\nPuedes dejar estructuras en cola mientras pausas.\n\n[accent]Pulsa Espacio para pausar. -tutorial.pause.mobile = Durante la batalla, puedes[accent] pausar el juego.[]\nPuedes dejar estructuras en cola mientras pausas.\n\n[accent]Pulsa este boton de arriba a la izquierda para pausar. -tutorial.unpause = Ahora toca Espacio otra vez para dejar de pausar. -tutorial.unpause.mobile = Ahora tócalo otra vez para dejar de pausar. -tutorial.breaking = Muchas veces hace falta destruir bloques.\n[accent]Mantén el botón derecho[] para destruir todos los bloques en una selección.[]\n\n[accent]Destruye todos los bloques de chatarra de la izquierda de tu núcleo usando selección de área. -tutorial.breaking.mobile = Muchas veces hace falta destruir bloques.\n[accent]Selecciona el modo de desonstrucción[], después toca un bloque para comenzar a romperlo.\nDestruye un área manteniendo tu dedo algunos segundos[] y arrastrando hacia una dirección.\nUsa el botón de confirmación para confirmar la destrucción.\n\n[accent]Destruye todos los bloques de chatarra de la izquierda de tu núcleo usando la selección de área.[] -tutorial.withdraw = En algunas situaciones, es necesario coger recursos directamente de bloques.\nPara hacer esto, [accent]toca un bloque[] con recursos en él, después [accent]toca el recurso[] en el inventario.\nSe pueden sacar múltiples recursos [accent]tocando y manteniendo[].\n\n[accent]Saca algo de cobre del núcleo.[] -tutorial.deposit = Deposita recursos en bloques arrastrándolos de tu nave al bloque de destino.\n\n[accent]Deposita tu cobre otra vez al núcleo.[] -tutorial.waves = El[lightgray] enemigo[] se acerca.\n\nDefiende tu núcleo por 2 oleadas. Construye más torretas y taladros. Mina más cobre. -tutorial.waves.mobile = El[lightgray] enemigo[] se acerca.\n\nDefiende tu núcleo por 2 oleadas. Tu nave disparará automáticamente a los enemigos.\nConstruye más torretas y taladros. Mina más cobre. -tutorial.launch = Una vez llegues a cierta oleada, podrás[accent]lanzar el núcleo[], dejando atrás tus defensas y los recursos en tu núcleo.[]\nEstos recursos pueden ser usados para investigar nueva tecnología.\n\n[accent]Pulsa el botón de lanzamiento. +hint.skip = Omitir +hint.desktopMove = Usa [accent][[WASD][] para moverte. +hint.zoom = Puedes usar la [accent]Rueda del ratón[] para controlar el zoom. +hint.mine = Acércate a \uf8c4 una veta de cobre [accent]tócala[]\n para extraer cobre manualmente. +hint.desktopShoot = [accent][[Left-click][] para disparar. +hint.depositItems = Deposita objetos arrastrándolos desde tu nave hasta el núcleo. +hint.respawn = Para sacar otra nave, pulsa [accent][[V][]. +hint.respawn.mobile = Has pasado a controlar una unidad/estructura. Para volver a manejar la nave, [accent]toca el icono arriba a la izquierda.[] +hint.desktopPause = Pulsa [accent][[Space][] para pausar y reanudar la partida. +hint.placeDrill = Selecciona la pestaña de \ue85e [accent]Taladros[] en el menú abajo a la derecha, luego escoge un \uf870 [accent]Taladro[] y haz clic sobre una veta de cobre para colocarlo. +hint.placeDrill.mobile = Selecciona la pestaña de \ue85e [accent]Taladros[] en el menú abajo a la derecha, luego escoge un \uf870 [accent]Taladro[] y toca sobre una veta de cobre para colocarlo.\n\nPulsa el botón con la \ue800 [accent]"V"[] abajo a la derecha para confirmar. +hint.placeConveyor = Las cintas transportadoras pueden sacar objetos de los taladros, y moverlos hasta otros bloques. Selecciona un \uf896 [accent]Transportador[] de la pestaña \ue814 [accent]Distribución[].\n\nHaz clic y arrastra para crear una cadena con múltiples transportadores.\nUsa la [accent]Rueda del ratón[] para rotarlo. +hint.placeConveyor.mobile = Las cintas transportadoras pueden mover objetos de los taladros hasta otros bloques. Selecciona un \uf896 [accent]Transportador[] de la pestaña \ue814 [accent]Distribución[].\n\nMantén el dedo un segundo y arrastra para crear múltiples cintas transportadoras. +hint.placeTurret = Construye \uf861 [accent]Torretas[] para defender tu base de los enemigos.\n\nLas torretas necesitan munición - en este caso, \uf838cobre.\nUsa cintas transportadoras y taladros para abastecerlas con cobre. +hint.breaking = Pulsa [accent]Clic-derecho[] y arrastra para destruir bloques. +hint.breaking.mobile = Activa el botón con el \ue817 [accent]martillo[] situado abajo a la derecha y selecciona bloques para eliminarlos.\n\nMantén el dedo un segundo y arrastra para eliminar bloques directamente en esa selección. +hint.research = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos. +hint.research.mobile = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos. +hint.unitControl = Mantén [accent][[L-ctrl][] y [accent]haz clic[] sobre unidades o torretas aliadas para controlarlas manualmente. +hint.unitControl.mobile = [accent][Toca dos veces rápidamente[] una unidad o torreta aliada para controlarla manualmente. +hint.launch = Cuando tengas sufientes recursos, puedes [accent]Lanzar el Núcleo[] escogiendo como objetivo sectores cercanos en el \ue827 [accent]Mapa[] abajo a la derecha. +hint.launch.mobile = Cuando tengas sufientes recursos, puedes [accent]Lanzar el Núcleo[] escogiendo como objetivo sectores cercanos en el \ue827 [accent]Mapa[], disponible desde el \ue88c [accent]Menú de pausa[]. +hint.schematicSelect = Mantén [accent][[F][] y arrastra para crear una selección de bloques que puedes copiar y pegar.\n\nUsa [accent][[Clic central][] para seleccionar un tipo de bloque. +hint.conveyorPathfind = Mantener [accent][[L-Ctrl][] mientras arrastras cintas transportadoras generará automáticamente una ruta. +hint.conveyorPathfind.mobile = Activa el\ue844 [accent]modo diagonal[] y arrastra cintas transportadoras para generar una ruta inteligente. +hint.boost = Mantén [accent][[L-Shift][] para sobrevolar obstáculos con tu unidad actual.\n\nSólo algunas unidades terrestres disponen de estos propulsores. +hint.command = Pulsa [accent][[G][] para comandar unidades aliadas cercanas. +hint.command.mobile = [accent][[Toca dos veces][] tu unidad para comandar unidades aliadas cercanas. +hint.payloadPickup = Pulsa [accent][[[] para recoger bloques pequeños o unidades. +hint.payloadPickup.mobile = [accent]Mantén[] sobre un bloque pequeño o unidad para recogerlo. +hint.payloadDrop = Pulsa [accent]][] para soltar la carga. +hint.payloadDrop.mobile = [accent]Mantén[] sobre un lugar vacío para soltar la carga. +hint.waveFire = Cuando las torretas [accent]Wave[] usen agua como munición, apagarán fuego e incendios cercanos automáticamente. +hint.generator = Los \uf879[accent]Generadores de combustión[] querman carbón para transmitir energía a bloques adyacentes.\n\nEl alcance de transmisión de energía se puede extender usando \uf87f[accent]Nodos de energía[]. +hint.guardian = Los [accent]Guardianes[] poseen una robusta armadura. Municiones débiles como el [accent]Cobre[] o el [accent]Plomo[] no son [scarlet]effectivas[] contra él.\n\nUsa torretas de mayor categoría o por ejemplo, munición de \uf835[accent]Grafito[] \uf861Duo/\uf859 en torretas Salvo para derribar a los Guardianes. +hint.coreUpgrade = Los núcleos se pueden mejorar [accent]construyendo núcleos de mayor calidad encima[].\n\nColoca un  núcleo [accent]Foundation[] sobre el ï¡© núcleo [accent]Shard[]. Asegúrate de que no hay obstáculos cerca. +hint.presetLaunch = Las zonas de aterrizaje de los [accent]sectores grises[], como el [accent]Bosque Congelado[], son accesibles desde cualquier lugar. No requieren capturar sectores adyacentes.\n\nLos [accent]sectores numerados[], como este, son [accent]opcionales[]. +hint.coreIncinerate = Tras completar la capacidad máxima de almacenamiento en el núcleo para un tipo de objeto, cualquier recurso adicional de ese tipo que reciba el núcleo será [accent]incinerado[]. +hint.coopCampaign = Sí estás jugando el modo [accent]campaña en multijugador[], los objetos producidos en el mapa actual también se enviarán [accent]a los sectores locales de cada jugador[].\n\nCualquier nueva investigación tecnológica realizada por el anfitrión también se desbloqueará para los demás jugadores. + +item.copper.description = Un práctico material para construcción. Usado en todo tipo de bloques y munición. +item.copper.details = Cobre. Metal anormalmente abundante en Serpulo. Estructuralmente débil a menos que sea reforzado. +item.lead.description = Un material básico. Usado en electrónicos y transferencia de líquidos. +item.lead.details = Denso. Inerte. Extensamente usado en baterías.\nNota: Suele ser tóxico para la mayoría de formas de vida biológicas. Aunque ya no quedan muchas de esas por aquí. +item.metaglass.description = Usado en almacenamiento y distribución de líquidos. +item.graphite.description = Carbón mineralizado, usado como munición y en componentes eléctricos. +item.sand.description = Es usada sobre todo para producir otros minerales refinados. +item.coal.description = Se usa como combustible y también en la producción de materiales refinados. +item.coal.details = Parece ser materia vegetal fosilizada, formada hace mucho tiempo. +item.titanium.description = Usado en transporte de liquidos, taladros y aeronaves. +item.thorium.description = Usado en estructuras robustas y como combustible nuclear. +item.scrap.description = Usado en fundidores y pulverizadores para refinarlo en otros materiales. +item.scrap.details = Restos de antiguas estructuras y unidades caídas. +item.silicon.description = Usado en paneles solares, electrónicos complejos y munición inteligente. +item.plastanium.description = Usado en unidades avanzadas, aislamiento y munición de fragmentación. +item.phase-fabric.description = Usado en electrónicos avanzados y estructuras autoreparadoras. +item.surge-alloy.description = Usado en armamento avanzado y estructuras de defensa reactiva. +item.spore-pod.description = Se puede usar como combustible, o para obtener petróleo y explosivos. +item.spore-pod.details = Esporas. Es algo parecido a una forma de vida sintética. Emiten gases tóxicos para el resto de vida biológica. Extremadamente invasivo. Altamente inflamable bajo determinadas condiciones. +item.blast-compound.description = Usado en bombas y munición explosiva. +item.pyratite.description = Usado en armas incendiarias y generadores de combustión. -item.copper.description = Un útil material de estructura. Usado extensivamente en todo tipo de bloques. -item.lead.description = Un material básico. Usado extensivamente en electrónicos y bloques de transferencia de líquidos. -item.metaglass.description = Un compuesto muy duro de cristal. Usado extensivamente para almacenamiento y distribución de líquidos. -item.graphite.description = Carbón mineralizado, usasdo para munición y aislamiento eléctrico. -item.sand.description = Un material común que es usado extensivamente en la fundición, para aleaciones y como fundente. -item.coal.description = Un combustible común y preparado para ser quemado. -item.titanium.description = Un metal raro muy ligero usado extensivamente en transportación de liquidos, taladros y aeronaves. -item.thorium.description = Un metal radiactivo, muy denso y usado en soporte de estructuras y combustible nuclear. -item.scrap.description = Restos de estructuras y unidades antiguas. Contiene pequeñas cantidades de muchos metales diferentes. -item.silicon.description = Un semiconductor muy útil, se usa para paneles solares y muchos electrónicos complejos. -item.plastanium.description = Un material dúctil y ligero usado en aeronaves y proyectiles de fragmentación. -item.phase-fabric.description = Una sustancia casi sin peso usada en electrónica avanzada y en tecnología autoreparadora. -item.surge-alloy.description = Una aleación avanzada con propiedades eléctricas únicas. -item.spore-pod.description = Utilizado para ser convertido en petróleo, explosivos y combustible. -item.blast-compound.description = Un compuesto volátil usado en bombas y explosivos. Aunque se puede quemar como combustible, esto no es recomendable. -item.pyratite.description = Una sustancia extremadamente inflamable usada en armas incendiarias. liquid.water.description = Usada comúnmente para enfriar máquinas y para procesar residuos. -liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o expulsado a unidades enemigas como arma. -liquid.oil.description = Puede ser quemado, explotado o como un enfriador. -liquid.cryofluid.description = El líquido más eficiente pra enfriar las cosas. +liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o disparado a unidades enemigas como arma. +liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria. +liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas. +block.resupply-point.description = Reabastece unidades cercanas con munición de cobre. No es compatible con unidades que requieren energía. +block.armored-conveyor.description = Mueve objetos. No acepta objetos si entran por los lados. +block.illuminator.description = Emite luz. block.message.description = Almacena un mensaje. Puedes usarlo para comunicarte con aliados o dejar recordatorios. block.graphite-press.description = Comprime carbón en piezas de grafito puro. block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente. block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio. block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar. -block.plastanium-compressor.description = Produce plastanio con aceite y titanio. +block.plastanium-compressor.description = Produce plastanio con petróleo y titanio. block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena. block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre. block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. -block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo. +block.blast-mixer.description = Usa esporas para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo. block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. -block.melter.description = Calienta piedra a temperaturas muy altas para obtener lava. -block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra. +block.melter.description = Calienta chatarra a temperaturas muy altas para obtener magma. +block.separator.description = Separa el magma en sus componentes minerales. block.spore-press.description = Comprime esporas en petróleo. -block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay arena natural. +block.pulverizer.description = Despedaza la chatarra en arena. Útil cuando no hay arena natural. block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón. block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso. -block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Sandbox. -block.power-source.description = Da energía infinita. Solo disponible en el modo Sandbox. -block.item-source.description = Hace aparecer minerales de forma infinita. Solo disponible en el modo Sandbox. -block.item-void.description = Destruye cuanquier objeto que entra en él. Solo disponible en el modo Sandbox. -block.liquid-source.description = Da líquido infinito. Solo disponible en el modo Sandbox. -block.liquid-void.description = Elimina cualquier liquido que entra en él. Solo disponible en el modo Sandbox. +block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre. +block.power-source.description = Da energía infinita. Solo disponible en el modo Libre. +block.item-source.description = Hace aparecer minerales de forma infinita. Solo disponible en el modo Libre. +block.item-void.description = Destruye cuanquier objeto que entra en él. Solo disponible en el modo Libre. +block.liquid-source.description = Da líquido infinito. Solo disponible en el modo Libre. +block.liquid-void.description = Elimina cualquier liquido que entra en él. Solo disponible en el modo Libre. block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas. block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas. block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos. block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas. -block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.. +block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia. block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas. block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos. block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas. @@ -1226,8 +1362,8 @@ block.phase-wall.description = No es tan fuerte como un muro de torio pero hace block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas. block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante. block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas. -block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella. -block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas. +block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella. +block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas. block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia. block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas. block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores. @@ -1235,71 +1371,134 @@ block.force-projector.description = Crea un área de fuerza hexagonal alrededor block.shock-mine.description = Daña enemigos que pisan a mina. Casi invisible al enemigo. block.conveyor.description = Bloque de transporte básico. Mueve objetos hacia adelante y los deposita automáticamente en torres o fábricas. Rotable. block.titanium-conveyor.description = Bloque de transporte avanzado. Mueve objetos más rápido que los transportadores estándar. -block.plastanium-conveyor.description = Mueve ítems por lotes.\nAcepta ítems por detrás, y los descarga en tres direcciones hacia el frente, como un enrutador. +block.plastanium-conveyor.description = Mueve objetos por lotes.\nAcepta objetos por detrás, y los descarga en tres direcciones hacia el frente, como un enrutador. block.junction.description = Actúa como puente para dos transportadores que se cruzan. Útil en situaciones con dos diferentes transportadores transportando diferentes materiales a diferentes lugares. block.bridge-conveyor.description = Bloque avanzado de transporte. Puede transportar objetos por encima hasta 3 casillas de cualquier terreno o construcción. block.phase-conveyor.description = Bloque de transporte avanzado. Usa energía para transportar objetos a otro transportador de fase conectado a través de varias casillas. block.sorter.description = Clasifica objetos. Si un objeto es igual al seleccionado, pasará al frente. Si no, el objeto saldrá por la izquierda y la derecha. block.inverted-sorter.description = Procesa elementos como un clasificador estándar, pero en su lugar pasa elementos seleccionados a los lados. block.router.description = Acepta objetos de una dirección luego los deja equitativamente en hasta 3 direcciones diferentes. Útil para dividir los materiales de una fuente de recursos a múltiples objetivos. \n\n[scarlet]Nunca usar como entrada de producción porque puede tapar con los objetos de salida.[] +block.router.details = Un mal necesario... No se recomienda usarlo junto a estructuras de producción ya que puede atascar una cadena de transporte. block.distributor.description = Un enrutador avanzado que distribuye objetos equitativamente en hasta otras 7 direcciones. block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena. block.underflow-gate.description = El opuesto de la compuerda de desborde. Solo dispensa hacia el frente si los lados están bloqueados. block.mass-driver.description = El mejor bloque de transorte. Recoge varios objetos y los dispara a otro conductor de masa en un largo rango. Requiere energía para operar. block.mechanical-pump.description = Una bomba de agua barata algo lenta, pero funciona sin energía. -block.rotary-pump.description = Una bomba de agua algo mas avanzada. Bombea más líquido, pero requiere energía. -block.thermal-pump.description = La mejor bomba. Utiliza energía. +block.rotary-pump.description = Una bomba algo mas avanzada. Bombea más líquido, pero requiere energía. +block.thermal-pump.description = La mejor bomba de líquidos. Utiliza energía. block.conduit.description = Bloque de transporte de líquidos básico. Funciona como un transportador, pero con líquidos. Usado con bombas, extractores u otros conductos. block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Transporta líquidos más rápidamente y almacena más que los conductos estándar. block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos. block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos. block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales. -block.liquid-junction.description = Actúa como un puente para dos condusctos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares. -block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima hasta 3 casillas de cualquier terreno o construcción. -block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado por varias casillas. -block.power-node.description = Transmite energía a nodos conectados, conecta hasta cuatro fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente. -block.power-node-large.description = Tiene un radio más amplio que el nodo de energía y conecta hasta seis fuentes de energía, edificios que usan energía o nodos. -block.surge-tower.description = Un nodo con un gran alcance con menos conexiones disponibles. +block.liquid-junction.description = Actúa como un puente para dos conductos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares. +block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción. +block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas. +block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente. +block.power-node-large.description = Tiene un radio más amplio que el nodo de energía y conecta hasta diez fuentes de energía, edificios que usan energía o nodos. +block.surge-tower.description = Un nodo con un gran alcance, pero sólo dos conexiones disponibles. block.diode.description = La energía de la batería puede fluir a través de este bloque en una sola dirección, pero solo si el otro lado tiene menos energía almacenada. block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía. block.battery-large.description = Almacena mucha más energía que una batería normal. -block.combustion-generator.description = Genera energía quemando aceite o materiales inflamables. -block.thermal-generator.description = Genera una gran cantidad de energía con la lava. +block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo. +block.thermal-generator.description = Genera una gran cantidad de energía con el magma. block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. -block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de piratita. +block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita. block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio. -block.solar-panel.description = Proporciona una pequeña cantidad de energía procedente del sol. -block.solar-panel-large.description = Genera un mucho mejor suministro de energía que un panel solar estándar, pero también es mucho más caro de construir. +block.solar-panel.description = Proporciona una pequeña cantidad de energía. +block.solar-panel-large.description = Genera un mayor suministro de energía que un panel solar estándar, pero también es mucho más caro de construir. block.thorium-reactor.description = Genera grandes cantidades de energía del torio altamente radioactivo. Necesita enfriamiento constante. Explotará violentamente si no se le aporta suficiente enfriamiento. block.impact-reactor.description = Un generador avanzado, capaz de crear cantidades masivas de energía a máxima eficiencia. Requiere una cantidad significante de energía para impulsar el comienzo del proceso. block.mechanical-drill.description = Un taladro barato. Cuando es colocado en casillas apropiadas, extrae objetos lentamente de forma indefinida. Solo es capaz de minar recursos básicos. block.pneumatic-drill.description = Un taladro mejorado, es capaz de minar titanio. Más rápido que un taladro mécanico. -block.laser-drill.description = Permite obtener minerales incluso más rápido con la tecnología láser, pero requiere energía. Además, se puede obtener torio radioactivo con este taladro. +block.laser-drill.description = Su tecnología láser le permite obtener minerales incluso más rápido, pero requiere energía. Además, se puede obtener torio radioactivo con este taladro. block.blast-drill.description = El mejor taladro. Requiere grandes cantidades de energía y refrigeración. block.water-extractor.description = Extrae agua de la tierra. Úsalo cuando no haya lagos cercanos. block.cultivator.description = Cultiva concentraciones de esporas en la atmosfera a vainas. +block.cultivator.details = Tecnología recuperada. Usada para producir cantidades masivas de biomasa. Parecido al primer incubador de esporas, que ahora cubren Serpulo. block.oil-extractor.description = Usa grandes cantidades de energía, arena y agua para obtener petróleo. Úsalo cuando no hay fuentes directas de petróleo cerca. -block.core-shard.description = La primera iteración de la cápsula del núcleo. Una vez destruido, todo el contacto con la región es perdido. No permitas que esto ocurra. -block.core-foundation.description = La segunda versión del núcleo. Mejor blindado. Almacena más recursos. -block.core-nucleus.description = La tercera y última iteración de la cápsula del núcleo. Muy bien blindado. Almacena cantidades masivas dde recursos. -block.vault.description = Almacena una gran cantidad de objetos. Úsalo para crear almacenes cuando no hay una demanda constante de materales. Un [lightgray] unloader[] puede usarse para obtener objetos del almacén. -block.container.description = Almacena una pequeña cantidad de objetos. Úsalo para crear almacenes cuando no hay una demanda constante de materales. Un [lightgray] unloader[] puede usarse para obtener objetos del contenedor. +block.core-shard.description = El núcleo de la base. Compacto. Puede auto-replicarse. Equipado con propulsores de uso único. +block.core-shard.details = La primera iteración. Si es destruido, todo contacto con el sector está perdido. No designado para viajes interplanetarios. +block.core-foundation.description = El núcleo de la base. Mejor blindado. Almacena más recursos que el modelo Shard. +block.core-foundation.details = La segunda iteración. +block.core-nucleus.description = El núcleo de la base. Extremadamente bien armado. Almacena cantidades masivas de recursos. +block.core-nucleus.details = La tercera y última iteración. +block.vault.description = Almacena una gran cantidad de objetos. Úsalo para crear almacenes cuando no hay una demanda constante de materales. Un [lightgray] descargador[] puede usarse para obtener los objetos almacenados. +block.container.description = Almacena una pequeña cantidad de objetos. Úsalo para crear almacenes cuando no hay una demanda constante de materales. Un [lightgray] descargador[] puede usarse para obtener objetos del contenedor. block.unloader.description = Descarga objetos de un contenedor, almacén o el núcleo a un transportador o directamente a un bloque adyacente. El tipo de objeto descargado puede ser cambiado tocando el descagador. -block.launch-pad.description = Lanza paquetes de recursos sin necesitar lanzar con el núcleo. -block.launch-pad-large.description = Una versión mejorada del pad de lanzamiento. Almacena más recursos y los lanza más frecuentemente. +block.launch-pad.description = Lanza paquetes de recursos a los sectores seleccionados. block.duo.description = Una torre pequeña y barata. Útil contra enemigos terrestres no demasiado fuertes. -block.scatter.description = Una torreta antiaérea de tamaño medio. Dispara fuego anti-aéreo de plomo o chatarra a las unidades enemigas. +block.scatter.description = Una torreta antiaérea de tamaño medio. Dispara proyectiles de plomo o chatarra a las unidades enemigas. block.scorch.description = Quema a cualquier enemigo terrestre cercano a él. Altamente efectivo a corto alcance. block.hail.description = Una torre de artillería pequeña de largo alcance. block.wave.description = Una torre de tamaño mediano. Dispara chorros de líquido a enemigos. Apaga el fuego en su rango de acción si recibe agua. block.lancer.description = Una torre láser anti-terrestre de tamaño mediano. Dispara y carga poderosos rayos de energía. block.arc.description = Una pequeña torre eléctrica de rango corto. Dispara arcos de electricidad a los enemigos. block.swarmer.description = Una torre de tamaño mediano que dispara misiles. Ataca a aire y tierra. Dispara misiles teledirigidos. -block.salvo.description = Una versión más grande y avanzada dela torre dúo. Dispara salvas rápidas al enemigo +block.salvo.description = Una versión más grande y avanzada de la torre dúo. Dispara ráfagas a enemigos terrestres y aéreos. block.fuse.description = Una torre grande de energía de corto alcance. Dispara tres rayos perforantes a enemigos cercanos. -block.ripple.description = Una extramadamente poderosa torre. Dispara conjuntos de balas a los enemigos en grandes distancias. -block.cyclone.description = Una torre grande anti-aérea y anti-terrestre. Dispara conjuntos explosivos de Flak a enemigos cercanos. +block.ripple.description = Una torre extramadamente poderosa. Dispara conjuntos de balas a los enemigos desde grandes distancias. +block.cyclone.description = Una torre grande anti-aérea y anti-terrestre. Dispara conjuntos fragmentados explosivos a enemigos cercanos. block.spectre.description = Un cañon masivo de dos barriles. Dispara balas perforantes a objetivos de aire y tierra. -block.meltdown.description = Un cañon láser masivo. Carga y dispara un rayo láser constante a enemigos cercanos. Requiere enfriamiento para operar. -block.repair-point.description = Repara la unidad dañada más cercana a su alrededor. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.meltdown.description = Un cañon láser masivo. Carga y dispara un rayo láser continuo a enemigos cercanos. Requiere enfriamiento para operar. +block.foreshadow.description = Dispara un rayo de un solo objetivo a grandes distancias. +block.repair-point.description = Repara constantemente la unidad dañada más cercana dentro de su área. +block.segment.description = Daña y destruye proyectiles que se acerquen. No afecta a los láseres. +block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso. +block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua. +block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos. +block.disassembler.description = Separa magma en cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio. +block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar. +block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas. +block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida. +block.command-center.description = Controla el comportamiento de las unidades con diferentes órdenes. +block.ground-factory.description = Produce unidades terrestres. Las unidades resultantes se pueden usar directamente, o se pueden llevar a reconstructores para mejorarlas. +block.air-factory.description = Produce unidades aéreas. Las unidades resultantes se pueden usar directamente, o se pueden llevar a reconstructores para mejorarlas. +block.naval-factory.description = Produce unidades navales. Las unidades resultantes se pueden usar directamente, o se pueden llevar a reconstructores para mejorarlas. +block.additive-reconstructor.description = Mejora unidades a segunda categoría. +block.multiplicative-reconstructor.description = Mejora unidades a tercera categoría. +block.exponential-reconstructor.description = Mejora unidades a cuarta categoría. +block.tetrative-reconstructor.description = Mejora unidades a la quinta y última categoría. +block.switch.description = Un interruptor alternable. Su estado puede ser detectado y controlado por procesadores lógicos. +block.micro-processor.description = Ejecuta una secuencia de instrucciones lógicas en bucle. Se puede usar para controlar unidades y estructuras. +block.logic-processor.description = Ejecuta una secuencia de instrucciones lógicas en bucle. Se puede usar para controlar unidades y estructuras. Es más rápido que el microprocesador. +block.hyper-processor.description = Ejecuta una secuencia de instrucciones lógicas en bucle. Se puede usar para controlar unidades y estructuras. Es más rápido que el procesador lógico. +block.memory-cell.description = Almacena información para los procesadores lógicos. +block.memory-bank.description = Almacena información para los procesadores lógicos. Alta capacidad. +block.logic-display.description = Muestra gráficos arbitrarios desde un procesador lógico. +block.large-logic-display.description = También muestra gráficos arbitrarios desde un procesador lógico. +block.interplanetary-accelerator.description = Una torre de proyección electromagnética masiva. Acelera núcleos hasta la velocidad necesaria para escapar del campo gravitatorio del planeta, habilitando el despliegue interplanetario. + +unit.dagger.description = Dispara proyectiles básicos a enemigos cercanos. +unit.mace.description = Lanza torrentes de llamas a enemigos cercanos. +unit.fortress.description = Utiliza artillería de largo alcance contra enemigos terrestres. +unit.scepter.description = Bombardea enemigos cercanos con proyectiles cargados. +unit.reign.description = Bombardea enemigos con proyectiles penetrantes. +unit.nova.description = Dispara rayos láser que dañan enemigos y reparan estructuras aliadas. Puede volar. +unit.pulsar.description = Dispara arcos eléctricos que dañan enemigos y reparan estructuras aliadas. Puede volar. +unit.quasar.description = Dispara rayos láser perforantes que dañan enemigos, pueden provocar incendios y reparan estructuras aliadas. Puede volar. Posee escudo. +unit.vela.description = Dispara un rayo láser continuo que daña enemigos, provoca incendios y reparan estructuras aliadas. Puede volar. +unit.corvus.description = Dispara poderosos láseres que dañan enemigos, y reparan estructuras aliadas. Puede pisar sobre la mayoría de terreno. +unit.crawler.description = Corre hacia enemigos y se autodestruye, provocando una gran explosión. +unit.atrax.description = Dispara orbes de magma debilitantes a enemigos terrestres. Puede pisar sobre la mayoría de terreno. +unit.spiroct.description = Dispara láseres que debilitan al enemigo, reparándose en el proceso. Puede pisar sobre la mayoría de terreno. +unit.arkyid.description = Dispara grandes rayos láser que debilitan al enemigo, reparándose en el proceso. Puede pisar sobre la mayoría de terreno. +unit.toxopid.description = Dispara grandes fragmentos electrizados y láseres perforantes. Puede pisar sobre la mayoría de terreno. +unit.flare.description = Dispara proyectiles básicos a enemigos cercanos. +unit.horizon.description = Suelta fragmentos explosivos sobre objetivos terrestres. +unit.zenith.description = Dispara ráfagas de misiles a enemigos cercanos. +unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano. +unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación. +unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo. +unit.poly.description = Reconstruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción. +unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas. +unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio. +unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres. +unit.risso.description = Dispara un enjambre de misiles y proyectiles a enemigos cercanos. +unit.minke.description = Dispara proyectiles variados a enemigos terrestres. +unit.bryde.description = Dispara misiles de largo alcance a enemigos. +unit.sei.description = Dispara un enjambre de misiles y proyectiles perforantes a enemigos. +unit.omura.description = Dispara rayos contínuos perforantes. Construye unidades Flare. +unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras. +unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras. +unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index d5ac8cfb74..46cf235d26 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -55,6 +55,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Lahingulaineid läbitud:[accent] {0} stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} @@ -100,7 +101,6 @@ done = Valmis feature.unsupported = Your device does not support this feature. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) mods = Mods mods.none = [lightgray]No mods found! mods.guide = Modding Guide @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Lahingulaine {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Järgmine laine\nalgab: {0} wave.waveInProgress = [lightgray]Toimub lahingulaine waiting = [lightgray]Ootan... waiting.players = Ootan mängijaid... wave.enemies = [lightgray]{0} vaenlast alles wave.enemy = [lightgray]{0} vaenlane alles +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Lae pilt saveimage = Salvesta pilt unknown = @@ -328,6 +331,7 @@ editor.generation = Genereerimine: editor.ingame = Redigeeri mängus editor.publish.workshop = Avalda Workshop'is editor.newmap = Uus maailm +editor.center = Center workshop = Workshop waves.title = Lahingulained waves.remove = Eemalda @@ -416,6 +420,7 @@ filters.empty = [lightgray]Filtrid puuduvad! Lisa filtreid alloleva nupuga. filter.distort = Moonutamine filter.noise = Müra filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Mediaan filter.oremedian = Maakide mediaan @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Blokk filter.option.floor = Põrand filter.option.flooronto = Asendatav põrand +filter.option.target = Target filter.option.wall = Sein filter.option.ore = Maak filter.option.floor2 = Teine põrand @@ -471,15 +477,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Jätka piirkonnas:\n[lightgray]{0} bestwave = [lightgray]Parim lahingulaine: {0} -launch = < LENDUTÕUS > launch.text = Launch -launch.title = Lendutõus -launch.next = [lightgray]Järgmine võimalus on {0}. laine järel -launch.unable2 = [scarlet]Ei saa LENDU TÕUSTA.[] -launch.confirm = Lendu tõusmisel võetakse kaasa\nkõik tuumikus olevad ressursid.\n[accent]Sellesse baasi ei ole võimalik tagasi tulla. -launch.skip.confirm = Kui jätad praegu lendu tõusmata, siis saad seda teha alles hilisemate lahingulainete järel. +research.multiplayer = Only the host can research items. uncover = Ava configure = Muuda varustust loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Oled kindel, et soovid olemasolevad\nsätted kustutada? settings.clearall.confirm = [scarlet]HOIATUS![]\nKustutatakse kõik andmed, sealhulgas salvestised, maailmad, kampaania saavutused\nja juhtnuppude sätted.\n[accent]Vajutades nupule "OK", kustutatakse\nkõik andmed ja seejärel mäng sulgub.[] settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Paus > clear = Clear banned = [scarlet]Banned @@ -570,49 +580,74 @@ info.title = Info error.title = [crimson]Viga error.crashtitle = Viga unit.nobuild = [scarlet]Unit can't build -blocks.input = Sisend -blocks.output = Väljund -blocks.booster = Kiirendaja -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Energiamahtuvus -blocks.powershot = Energia ühikut/lasu kohta -blocks.damage = Hävituspunkte -blocks.targetsair = Sihib õhku -blocks.targetsground = Sihib maapinnale -blocks.itemsmoved = Transportimise kiirus -blocks.launchtime = Aeg lendutõusude vahel -blocks.shootrange = Ulatus -blocks.size = Suurus -blocks.displaysize = Display Size -blocks.liquidcapacity = Vedelike mahutavus -blocks.powerrange = Energia ulatus -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Energiatarve -blocks.powerdamage = Energiatarve hävituspunkti kohta -blocks.itemcapacity = Ressursside mahutavus -blocks.basepowergeneration = Energiatootlus -blocks.productiontime = Tootmisaeg -blocks.repairtime = Täieliku parandamise aeg -blocks.speedincrease = Kiiruse suurenemine -blocks.range = Ulatus -blocks.drilltier = Kaevandatav -blocks.drillspeed = Puurimise kiirus -blocks.boosteffect = Kiirendaja mõju -blocks.maxunits = Maks. aktiivseid väeüksuseid -blocks.health = Elud -blocks.buildtime = Ehitamise aeg -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Ehitamise maksumus -blocks.inaccuracy = Ebatäpsus -blocks.shots = Laske -blocks.reload = Lasku/s -blocks.ammo = Laskemoon -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Sisend +stat.output = Väljund +stat.booster = Kiirendaja +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Energiamahtuvus +stat.powershot = Energia ühikut/lasu kohta +stat.damage = Hävituspunkte +stat.targetsair = Sihib õhku +stat.targetsground = Sihib maapinnale +stat.itemsmoved = Transportimise kiirus +stat.launchtime = Aeg lendutõusude vahel +stat.shootrange = Ulatus +stat.size = Suurus +stat.displaysize = Display Size +stat.liquidcapacity = Vedelike mahutavus +stat.powerrange = Energia ulatus +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Energiatarve +stat.powerdamage = Energiatarve hävituspunkti kohta +stat.itemcapacity = Ressursside mahutavus +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Energiatootlus +stat.productiontime = Tootmisaeg +stat.repairtime = Täieliku parandamise aeg +stat.speedincrease = Kiiruse suurenemine +stat.range = Ulatus +stat.drilltier = Kaevandatav +stat.drillspeed = Puurimise kiirus +stat.boosteffect = Kiirendaja mõju +stat.maxunits = Maks. aktiivseid väeüksuseid +stat.health = Elud +stat.buildtime = Ehitamise aeg +stat.maxconsecutive = Max Consecutive +stat.buildcost = Ehitamise maksumus +stat.inaccuracy = Ebatäpsus +stat.shots = Laske +stat.reload = Lasku/s +stat.ammo = Laskemoon +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Nõuab paremat puuri bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Bilanss: {0}/s bar.powerstored = Puhver: {0}/{1} bar.poweramount = Laeng: {0} bar.poweroutput = Tootlus: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Ressursse: {0} bar.capacity = Mahutavus: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Edenemine bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] hävituspunkti bullet.splashdamage = [stat]{0}[lightgray] hävituspunkti ~[stat] {1}[lightgray] blokki bullet.incendiary = [stat]süttiv @@ -642,12 +680,15 @@ bullet.homing = [stat]isesihtiv bullet.shock = [stat]elektriseeriv bullet.frag = [stat]kildpomm bullet.knockback = [stat]{0}[lightgray]x tagasilöögi kordaja +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]jäätav bullet.tarred = [stat]leekisüütav bullet.multiplier = [stat]{0}[lightgray]x laskemoona kordaja bullet.reload = [stat]{0}[lightgray]x tulistamise kiirus unit.blocks = blokki +unit.blockssquared = blocks² unit.powersecond = energiaühikut/s unit.liquidsecond = vedelikuühikut/s unit.itemssecond = ressursiühikut/s @@ -670,7 +711,7 @@ category.power = Energia category.liquids = Vedelikud category.items = Ressursid category.crafting = Sisend/Väljund -category.shooting = Tulistamine +category.function = Function category.optional = Valikulised täiustused setting.landscape.name = Lukusta horisontaalpaigutus setting.shadows.name = Varjud @@ -679,7 +720,6 @@ setting.linear.name = Lineaarne tekstuurivastendus setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animeeritud vesi setting.animatedshields.name = Animeeritud kilbid setting.antialias.name = Sakitõrje[lightgray] (vajab mängu taaskäivitamist)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Täisekraan setting.borderlesswindow.name = Äärteta ekraan[lightgray] (võib vajada mängu taaskäivitamist) setting.fps.name = Näita kaadrite arvu sekundis setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = Vertikaalne sünkroonimine setting.pixelate.name = Piksel-efekt[lightgray] (lülitab animatsioonid välja) setting.minimap.name = Näita kaarti @@ -822,6 +861,7 @@ mode.custom = Reeglid rules.infiniteresources = Lõputult ressursse rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Kasuta taimerit rules.waves = Kasuta lahingulaineid rules.attack = Mänguviis "Rünnak" @@ -847,6 +887,7 @@ rules.title.unit = Väeüksused rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Ressursid content.liquid.name = Vedelikud content.unit.name = Väeüksused content.block.name = Konstruktsioonid + item.copper.name = Vask item.lead.name = Plii item.coal.name = Süsi @@ -879,23 +921,6 @@ liquid.slag.name = Räbu liquid.oil.name = Nafta liquid.cryofluid.name = Krüovedelik -item.explosiveness = [lightgray]Plahvatusohtlikkus: {0}% -item.flammability = [lightgray]Tuleohtlikkus: {0}% -item.radioactivity = [lightgray]Radioaktiivsus: {0}% - -unit.health = [lightgray]Elud: {0} -unit.speed = [lightgray]Kiirus: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Soojusmahtuvus: {0} -liquid.viscosity = [lightgray]Viskoossus: {0} -liquid.temperature = [lightgray]Temperatuur: {0} - unit.dagger.name = Soldat unit.mace.name = Mace unit.fortress.name = Koljat @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Liivakamakas block.grass.name = Rohi block.slag.name = Slag +block.space.name = Space block.salt.name = Sool block.salt-wall.name = Salt Wall block.pebbles.name = Kruus @@ -981,6 +1007,7 @@ block.darksand-water.name = Vesi tumedal liival block.char.name = Puusüsi block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Jäine lumi block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1075,6 +1102,7 @@ block.power-source.name = Energiaallikas block.unloader.name = Mahalaadija block.vault.name = Suur hoidla block.wave.name = Prits +block.tsunami.name = Tsunami block.swarmer.name = Parvpildur block.salvo.name = Krempelpaugutaja block.ripple.name = Tähesadu @@ -1114,6 +1142,7 @@ block.arc.name = Elektrikahur block.rtg-generator.name = RT-generaator block.spectre.name = Kõmmutaja block.meltdown.name = Valguskiir +block.foreshadow.name = Foreshadow block.container.name = Hoidla block.launch-pad.name = Stardiplatvorm block.launch-pad-large.name = Suur stardiplatvorm @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = sinine team.crux.name = punane diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 5ef1a41b71..537d0b3133 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -55,6 +55,7 @@ schematic.saved = Eskema gordeta. schematic.delete.confirm = Eskema hau behin betiko suntsituko da. schematic.rename = Aldatu izena eskemari schematic.info = {0}x{1}, {2} bloke +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Garaitutako boladak:[accent] {0} stat.enemiesDestroyed = Suntsitutako etsaiak:[accent] {0} @@ -100,7 +101,6 @@ done = Egina feature.unsupported = Zure gailuak ez du ezaugarri hau onartzen. mods.alphainfo = Kontuan izan mod-ak alfa egoeran daudela, eta [scarlet] akats ugari izan ditzakete[].\nEman arazoen berri Mindustry-ren GitHub or Discord zerbitzuetan. -mods.alpha = [accent](Alfa) mods = Mod-ak mods.none = [lightgray]Ez da mod-ik aurkitu! mods.guide = Mod-ak sortzeko gida @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] hautatu+kopiatzeko pausebuilding = [accent][[{0}][] eraikiketa eteteko resumebuilding = [scarlet][[{0}][] eraikiketa berrekiteko wave = [accent]{0}. bolada +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Boladarako {0} wave.waveInProgress = [lightgray]Bolada abian waiting = [lightgray]Itxaroten... waiting.players = Jokalariei itxaroten... wave.enemies = [lightgray]{0} etsai daude wave.enemy = [lightgray]Etsai {0} dago +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Kargatu irudia saveimage = Gorde irudia unknown = Ezezaguna @@ -328,6 +331,7 @@ editor.generation = Sorrarazi: editor.ingame = Editatu jolasean editor.publish.workshop = Argitaratu lantegian editor.newmap = Mapa berria +editor.center = Center workshop = Lantegia waves.title = Boladak waves.remove = Kendu @@ -416,6 +420,7 @@ filters.empty = [lightgray]Iragazkirik ez! Gehitu bat beheko botoiarekin. filter.distort = Distortsioa filter.noise = Orbana filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Mediana filter.oremedian = Mea mediana @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Blokea filter.option.floor = Zorua filter.option.flooronto = Zoru xedea +filter.option.target = Target filter.option.wall = Horma filter.option.ore = Mea filter.option.floor2 = Bigarren zorua @@ -471,15 +477,9 @@ requirement.wave = Iritsi {0} boladara {1} requirement.core = Suntsitu etsaiaren muina {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Berrekin:\n[lightgray]{0} bestwave = [lightgray]Bolada onena: {0} -launch = < EGOTZI > launch.text = Launch -launch.title = Ongi egotzi da -launch.next = [lightgray]hurrengo aukera\n {0}. boladan -launch.unable2 = [scarlet]Ezin da EGOTZI.[] -launch.confirm = Honek zure muinean dauden baliabide guztiak egotziko ditu.\nEzin izango zara base honetara itzuli. -launch.skip.confirm = Orain ez eginez gero, geroagoko beste bolada batera itxaron beharko duzu. +research.multiplayer = Only the host can research items. uncover = Estalgabetu configure = Konfiguratu zuzkidura loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Ziur datu hauek garbitu nahi dituzula?\nEgindakoa ezin settings.clearall.confirm = [scarlet]ABISUA![]\nHonek datu guztiak garbituko ditu, gordetako partidak, mapak, desblokeatutakoak, eta teklen konfigurazioak barne.\nBehin 'Ados' sakatzen duzula jolasak datuk guztiak ezabatuko ditu eta automatikoki irten. settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Pausatuta > clear = Garbitu banned = [scarlet]Debekatuta @@ -570,49 +580,74 @@ info.title = Informazioa error.title = [crimson]Errore bat gertatu da error.crashtitle = Errore bat gertatu da unit.nobuild = [scarlet]Unit can't build -blocks.input = Sarrera -blocks.output = Irteera -blocks.booster = Indargarria -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Energia-edukiera -blocks.powershot = Energia/tiroko -blocks.damage = Kaltea -blocks.targetsair = Airera tirokatzen du -blocks.targetsground = Lurrera tirokatzen du -blocks.itemsmoved = Garraio-abiadura -blocks.launchtime = Egozketen arteko denbora -blocks.shootrange = Irismena -blocks.size = Neurria -blocks.displaysize = Display Size -blocks.liquidcapacity = Likido-edukiera -blocks.powerrange = Energia irismena -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Gehieneko konexioak -blocks.poweruse = Energia-erabilera -blocks.powerdamage = Energia/Kaltea -blocks.itemcapacity = Elementu-edukiera -blocks.basepowergeneration = Oinarrizko energia sorrera -blocks.productiontime = Eraikitze denbora -blocks.repairtime = Blokearen konpontze denbora osoa -blocks.speedincrease = Abiadura areagotzea -blocks.range = Irismena -blocks.drilltier = Ustiagarriak -blocks.drillspeed = Oinarrizko ustiatze-abiadura -blocks.boosteffect = Indartze-efektua -blocks.maxunits = Gehieneko unitate aktiboak -blocks.health = Osasuna -blocks.buildtime = Eraikitze-denbora -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Eraikitze-kostua -blocks.inaccuracy = Zehazgabetasuna -blocks.shots = Tiroak -blocks.reload = Tiroak/segundoko -blocks.ammo = Munizioa -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Sarrera +stat.output = Irteera +stat.booster = Indargarria +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Energia-edukiera +stat.powershot = Energia/tiroko +stat.damage = Kaltea +stat.targetsair = Airera tirokatzen du +stat.targetsground = Lurrera tirokatzen du +stat.itemsmoved = Garraio-abiadura +stat.launchtime = Egozketen arteko denbora +stat.shootrange = Irismena +stat.size = Neurria +stat.displaysize = Display Size +stat.liquidcapacity = Likido-edukiera +stat.powerrange = Energia irismena +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Gehieneko konexioak +stat.poweruse = Energia-erabilera +stat.powerdamage = Energia/Kaltea +stat.itemcapacity = Elementu-edukiera +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Oinarrizko energia sorrera +stat.productiontime = Eraikitze denbora +stat.repairtime = Blokearen konpontze denbora osoa +stat.speedincrease = Abiadura areagotzea +stat.range = Irismena +stat.drilltier = Ustiagarriak +stat.drillspeed = Oinarrizko ustiatze-abiadura +stat.boosteffect = Indartze-efektua +stat.maxunits = Gehieneko unitate aktiboak +stat.health = Osasuna +stat.buildtime = Eraikitze-denbora +stat.maxconsecutive = Max Consecutive +stat.buildcost = Eraikitze-kostua +stat.inaccuracy = Zehazgabetasuna +stat.shots = Tiroak +stat.reload = Tiroak/segundoko +stat.ammo = Munizioa +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Zulagailu hobea behar da bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Energia: {0}/s bar.powerstored = Bilduta: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Energia irteera: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Elementuak: {0} bar.capacity = Edukiera: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Eraikitze egoera bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] kalte bullet.splashdamage = [stat]{0}[lightgray] ingurune-kaltea ~[stat] {1}[lightgray] lauza bullet.incendiary = [stat]su-eragilea @@ -642,12 +680,15 @@ bullet.homing = [stat]gidatua bullet.shock = [stat]danbatekoa bullet.frag = [stat]fragmentazioa bullet.knockback = [stat]{0}[lightgray] kontusioa +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]hozkirri bullet.tarred = [stat]mundrunduta bullet.multiplier = [stat]{0}[lightgray]x munizio-biderkatzailea bullet.reload = [stat]{0}[lightgray]x tiro tasa unit.blocks = bloke +unit.blockssquared = blocks² unit.powersecond = energia unitate/segundoko unit.liquidsecond = likido unitate/segundoko unit.itemssecond = elementu/segundoko @@ -670,7 +711,7 @@ category.power = Energia category.liquids = Likidoak category.items = Baliabideak category.crafting = Sarrera/Irteera -category.shooting = Tirokatzea +category.function = Function category.optional = Aukerako hobekuntzak setting.landscape.name = Blokeatu horizontalean setting.shadows.name = Itzalak @@ -679,7 +720,6 @@ setting.linear.name = Iragazte lineala setting.hints.name = Pistak setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animatutako ura setting.animatedshields.name = Animatutako ezkutuak setting.antialias.name = Antialias[lightgray] (berrabiarazi behar da)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Pantaila osoa setting.borderlesswindow.name = Ertzik gabeko leihoa[lightgray] (berrabiaraztea behar lezake) setting.fps.name = Erakutsi FPS setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu) setting.minimap.name = Erakutsi mapatxoa @@ -822,6 +861,7 @@ mode.custom = Arau pertsonalizatuak rules.infiniteresources = Baliabide amaigabeak rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Boladen denboragailua rules.waves = Boladak rules.attack = Eraso modua @@ -847,6 +887,7 @@ rules.title.unit = Unitateak rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Solidoak content.liquid.name = Likidoak content.unit.name = Unitateak content.block.name = Blokeak + item.copper.name = Kobrea item.lead.name = Beruna item.coal.name = Ikatza @@ -879,23 +921,6 @@ liquid.slag.name = Zepa liquid.oil.name = Olioa liquid.cryofluid.name = Krio-isurkaria -item.explosiveness = [lightgray]Lehergarritasuna: {0}% -item.flammability = [lightgray]Sukoitasuna: {0}% -item.radioactivity = [lightgray]Erradioaktibitatea: {0}% - -unit.health = [lightgray]Osasuna: {0} -unit.speed = [lightgray]Abiadura: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Bero edukiera: {0} -liquid.viscosity = [lightgray]Likatasuna: {0} -liquid.temperature = [lightgray]Tenperatura: {0} - unit.dagger.name = Daga unit.mace.name = Mace unit.fortress.name = Gotorleku @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Hondar harkaitza block.grass.name = Belarra block.slag.name = Slag +block.space.name = Space block.salt.name = Gatza block.salt-wall.name = Salt Wall block.pebbles.name = Harribilak @@ -981,6 +1007,7 @@ block.darksand-water.name = Hondar ilun ura block.char.name = Kokea block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Izotz elurra block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1075,6 +1102,7 @@ block.power-source.name = Energia amaigabea block.unloader.name = Deskargagailua block.vault.name = Kripta block.wave.name = Olatu +block.tsunami.name = Tsunami block.swarmer.name = Erlauntz block.salvo.name = Buhunba block.ripple.name = Marmarra @@ -1114,6 +1142,7 @@ block.arc.name = Arku block.rtg-generator.name = RTG sorgailua block.spectre.name = Espektro block.meltdown.name = Nukleofusio +block.foreshadow.name = Foreshadow block.container.name = Edukiontzia block.launch-pad.name = Egozketa-plataforma block.launch-pad-large.name = Egozketa-plataforma handia @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = urdina team.crux.name = gorria diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index ae351b8764..d2a998db77 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1,9 +1,9 @@ -credits.text = Pelin tehnyt [royal]Anuken[] - [sky]anukendev@gmail.com[] +credits.text = Pelin on luonut [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Tekijät contributors = Kääntäjät ja avustajat discord = Liity Mindustryn Discordiin! link.discord.description = Mindustryn virallinen Discord-keskusteluhuone -link.reddit.description = Mindustryn alireddit +link.reddit.description = Mindustryn reddit sivu link.github.description = Pelin lähdekoodi link.changelog.description = Lista päivityksien muutoksista link.dev-builds.description = Epävakaat kehitysversiot @@ -15,13 +15,13 @@ link.wiki.description = Virallinen Mindustry wiki link.suggestions.description = Ehdota uusia ominaisuuksia linkfail = Linkin avaaminen epäonnistui!\nOsoite on kopioitu leikepöydällesi. screenshot = Kuvankaappaus tallennettu sijaintiin {0} -screenshot.invalid = Kartta liian laaja, kuvankaappaukselle ei mahdollisesti ole tarpeeksi tilaa. +screenshot.invalid = Kartta liian laaja, levytila voi olla liian vähissä kuvankaappausta varten. gameover = Peli ohi gameover.pvp = [accent] {0}[] joukkue voittaa! highscore = [accent]Uusi ennätys! copied = Kopioitu. indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Tämä osa peliä ei ole vielä valmis load.sound = Ääniä load.map = Karttoja @@ -42,11 +42,11 @@ schematic = Kaavio schematic.add = Tallenna kaavio... schematics = Kaaviot schematic.replace = Kaavio tällä nimellä on jo olemassa. Haluatko korvata sen? -schematic.exists = A schematic by that name already exists. +schematic.exists = Kaavio tällä nimellä on jo olemassa. schematic.import = Tuo kaavio... schematic.exportfile = Vie tiedosto schematic.importfile = Tuo tiedosto -schematic.browseworkshop = Selaa Workshoppia +schematic.browseworkshop = Selaa Steam Workshoppia schematic.copy = Kopioi leikepöydälle schematic.copy.import = Tuo leikepöydältä schematic.shareworkshop = Jaa Workshoppiin @@ -55,6 +55,7 @@ schematic.saved = Kaavio tallennettu. schematic.delete.confirm = Tämä kaavio poistetaan. schematic.rename = Nimeä kaavio uudelleen schematic.info = {0}x{1}, {2} palikkaa +schematic.disabled = [scarlet]Kaaviot poistettu käytöstä[]\nEt pysty käyttämään kaavioita tällä [accent]kartalla[] tai [accent]palvelimella. stat.wave = Tasoja voitettu:[accent] {0} stat.enemiesDestroyed = Vihollisia tuhottu:[accent] {0} @@ -62,16 +63,16 @@ stat.built = Rakennuksia rakennettu:[accent] {0} stat.destroyed = Rakennuksia tuhottu:[accent] {0} stat.deconstructed = Rakennuksia purettu:[accent] {0} stat.delivered = Resursseja laukaistu: -stat.playtime = Time Played:[accent] {0} -stat.rank = Lopullinen arvosana: [accent]{0} +stat.playtime = Pelattu aika:[accent] {0} +stat.rank = Arvosana: [accent]{0} -globalitems = [accent]Global Items -map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"? +globalitems = [accent]Yhteiset tavarat +map.delete = Oletko varma että haluat poistaa kartan: "[accent]{0}[]"? level.highscore = Ennätys: [accent]{0} level.select = Tason valinta level.mode = Pelimuoto: coreattack = < Ytimeen hyökätään! > -nearpoint = [[ [scarlet]POISTU PUDOTUSPISTEELTÄ VÄLITTÖMÄSTI[]\nvälitön tuhoutuminen +nearpoint = [[ [scarlet]POISTU VIHOLLISEN PUDOTUSPISTEELTÄ VÄLITTÖMÄSTI[]\nvälitön tuhoutuminen database = Ytimen tietokanta savegame = Tallenna peli loadgame = Lataa peli @@ -91,16 +92,15 @@ continue = Jatka maps.none = [lightgray]Karttoja ei löytynyt! invalid = Virheellinen pickcolor = Valitse väri -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes +preparingconfig = Valmistellaan asetuksia +preparingcontent = Valmistellaan sisältöä +uploadingcontent = Julkaistaan sisältöä +uploadingpreviewfile = Julkaistaan esikatseltavaa tiedostoa +committingchanges = Varmistetaan muutokset done = Valmis feature.unsupported = Laitteesi ei tue tätä toimintoa. mods.alphainfo = Pidä mielessä että modit ovat alpha-tilassa, ja[scarlet] ne voivat olla virheellisiä[].\nRaportoi kaikki virheet Mindustry GitHub-sivuille tai Discordiin. -mods.alpha = [accent](Alpha) mods = Modit mods.none = [lightgray]Modeja ei löytynyt! mods.guide = Modaamisopas @@ -139,16 +139,16 @@ mod.scripts.disable = Laitteesi ei tue modeja skripteillä. Sinun on sammutettav about.button = Tietoa name = Nimi: noname = Valitse ensin[accent] pelaajanimi[]. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Avaruuskartta +launchcore = Laukaise tukikohta filename = Tiedostonimi: unlocked = Uutta sisältöä avattu! completed = [accent]Suoritettu -techtree = Tekniikkapuu +techtree = Edistyspuu research.list = [lightgray]Tutki: research = Tutki researched = [lightgray]{0} tutkittu. -research.progress = {0}% complete +research.progress = {0}% valmis players = {0} pelaajaa paikalla players.single = {0} pelaaja paikalla players.search = etsiä @@ -180,7 +180,7 @@ host = Isäntä hosting = [accent]Avataan palvelinta... hosts.refresh = Päivitä hosts.discovering = Etsitään LAN pelejä -hosts.discovering.any = Etsitään Pelejä +hosts.discovering.any = Etsitään pelejä server.refreshing = Päivitetään palvelimen tietoja hosts.none = [lightgray]Paikallisia pelejä ei löytynyt! host.invalid = [scarlet]Isäntään ei voitu yhdistää. @@ -192,8 +192,8 @@ servers.global = Yhteisön palvelimet trace = Seuraa pelaajaa trace.playername = Pelaajanimi: [accent]{0} trace.ip = IP-osoite: [accent]{0} -trace.id = Uniikki tunniste: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} +trace.id = Pelaajakohtainen tunniste: [accent]{0} +trace.mobile = Mobiililaite: [accent]{0} trace.modclient = Custom Client: [accent]{0} invalidid = Invalid client ID! Submit a bug report. server.bans = Porttikiellot @@ -225,7 +225,7 @@ connecting = [accent]Yhdistetään... connecting.data = [accent]Ladataan maailman tietoja... server.port = Portti: server.addressinuse = Osoite on jo käytössä! -server.invalidport = Invalid port number! +server.invalidport = Tällä portilla ei löytynyt peliä! server.error = [crimson]Error hosting server: [accent]{0} save.new = Uusi tallennus save.overwrite = Haluatko varmasti korvata \ntämän tallennuspaikan?? @@ -236,8 +236,8 @@ save.delete.confirm = Oletko varma että haluat poistaa tämän tallennuksen? save.delete = Poista save.export = Vie tallennus 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.fail = [crimson]Tallennuksen tuominen epäonnistui: [accent]{0} +save.export.fail = [crimson]Tallennuksen vieminen epäonnistui: [accent]{0} save.import = Tuo tallennus save.newslot = Tallennuksen nimi: save.rename = Nimeä uudelleen @@ -260,36 +260,39 @@ confirm = Vahvista delete = Poista view.workshop = View In Workshop workshop.listing = Edit Workshop Listing -ok = OK +ok = Juu open = Avaa customize = Muokkaa sääntöjä cancel = Peruuta openlink = Avaa linkki copylink = Kopioi linkki back = Takaisin -data.export = Vie data -data.import = Tuo data +data.export = Vie dataa +data.import = Tuo dataa data.openfolder = Avaa datakansio -data.exported = Data viety. +data.exported = Dataa on viety. data.invalid = This isn't valid game data. data.import.confirm = Importing external data will overwrite[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. quit.confirm = Oletko varma että haluat poistua? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] +quit.confirm.tutorial = Oletko varma että tiedät mitä teet?\nVoit tehdä tutoriaalin milloin vain[accent] Asetukset->Peli->Tee Tutoriaali Uudelleen[] loading = [accent]Ladataan... reloading = [accent]Ladataan Modeja... saving = [accent]Tallennetaan... -respawn = [accent][[{0}][] to respawn in core -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +respawn = [accent][[{0}][] uudelleensyntymiseen ytimessä +cancelbuilding = [accent][[{0}][] tyhjentääksesi suunnitelman +selectschematic = [accent][[{0}][] jotta voisit kopioida ja liittää +pausebuilding = [accent][[{0}][] pysäyttääksesi rakentamisen +resumebuilding = [scarlet][[{0}][] jatkaaksesi rakentamista wave = [accent]Taso {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Seuraava taso {0} -wave.waveInProgress = [lightgray]Wave in progress +wave.waveInProgress = [lightgray]Taso käynnissä waiting = [lightgray]Odotetaan... waiting.players = Odotetaan pelaajia... wave.enemies = [lightgray]{0} vihollista jäljellä wave.enemy = [lightgray]{0} vihollinen jäljellä +wave.guardianwarn = Suojelija tulossa [accent]{0}[] tason päästä. +wave.guardianwarn.one = Suojelija tulee rökittämään sinut [accent]{0}[] tasolla. loadimage = Lataa kuva saveimage = Tallenna kuva unknown = Tuntematon @@ -303,10 +306,10 @@ map.nospawn.attack = This map does not have any enemy cores for player to attack map.invalid = Virhe ladatessa karttaa: korruptoitunut tai väärä karttatiedosto. workshop.update = Update Item workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -workshop.menu = Select what you would like to do with this item. +map.publish.confirm = Oletko varma että haluat julkaista tämän kartan?\n\n[lightgray]Hyväksy Workshopin EULA ehdot, muuten karttasi ei tule näkyviin! +workshop.menu = Mitä haluat tehdä tälle asialle? workshop.info = Kohteen Tiedot -changelog = Muutosloki (valinnainen): +changelog = Loki (valinnainen): eula = Steam EULA missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. publishing = [accent]Publishing... @@ -328,6 +331,7 @@ editor.generation = Generaatio: editor.ingame = Muokka pelin sisällä editor.publish.workshop = Julkaise Workshoppiin editor.newmap = Uusi kartta +editor.center = Center workshop = Työpaja waves.title = Tasot waves.remove = Poista @@ -398,9 +402,9 @@ editor.exists = Kartta tällä nimellä on jo olemassa. editor.selectmap = Valitse kartta ladattavaksi: toolmode.replace = Korvaa -toolmode.replace.description = Draws only on solid blocks. +toolmode.replace.description = Piirtää vain kiinteille objekteille. toolmode.replaceall = Korvaa kaikki -toolmode.replaceall.description = Replace all blocks in map. +toolmode.replaceall.description = Korvaa kaikki palikat kartassa. toolmode.orthogonal = Orthogonal toolmode.orthogonal.description = Draws only orthogonal lines. toolmode.square = Square @@ -416,17 +420,18 @@ filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Vääristää filter.noise = Melu filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Valitse Ydin filter.median = Mediaani -filter.oremedian = Malmin mediaani +filter.oremedian = Malmin keskiarvo filter.blend = Sekoitus -filter.defaultores = Oletuksena malmit +filter.defaultores = Oletus malmit filter.ore = Malmi filter.rivernoise = Jokien melu filter.mirror = Peili filter.clear = Selkeä -filter.option.ignore = Ohittaa -filter.scatter = Scatter +filter.option.ignore = Ohitta +filter.scatter = Hajauta filter.terrain = Maasto filter.option.scale = Mittakaava filter.option.chance = Mahdollisuus @@ -440,12 +445,13 @@ filter.option.amount = Määrä filter.option.block = Estää filter.option.floor = Lattia filter.option.flooronto = Target Floor +filter.option.target = Target filter.option.wall = Seinä filter.option.ore = Malmi -filter.option.floor2 = Secondary Floor +filter.option.floor2 = Toinen lattia filter.option.threshold2 = Secondary Threshold -filter.option.radius = Radius -filter.option.percentile = Percentile +filter.option.radius = Säde +filter.option.percentile = Prosentti width = Leveys: height = Korkeus: @@ -471,19 +477,13 @@ requirement.wave = Pääse Tasolle {0} kartassa {1} requirement.core = Tuhoa vihollisen ydin kartassa {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Paras taso: {0} -launch = < LAUKAISE > launch.text = Launch -launch.title = Onnistunut laukaisu -launch.next = [lightgray]seuraava mahdollisuus tasolla {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = Tämä laukaisee kaikki resurssit ytimestäsi.\nEt voi enää palata takaisin. -launch.skip.confirm = Jos ohitat nyt, voit laukaista vasta myöhemmillä tasoilla. +research.multiplayer = Only the host can research items. uncover = Paljasta configure = Configure Loadout loadout = Loadout -resources = Resources +resources = Resurssit bannedblocks = Kielletyt Palikat addall = Lisää kaikki launch.destination = Destination: {0} @@ -508,31 +508,37 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Sade +weather.snow.name = Lumi +weather.sandstorm.name = Hiekkamyrsky +weather.sporestorm.name = Sienimyräkkä +weather.fog.name = Sumu sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.resources = Resurssit: +sectors.production = Produktio: +sectors.stored = Säilötty: +sectors.resume = Jatka +sectors.launch = Laukaise +sectors.select = Valitse +sectors.nonelaunch = [lightgray]ei mitään (sun) +sectors.rename = Nimeä sektori +sector.missingresources = [scarlet]Sinulla ei ole tarpeeksi resursseja. -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +planet.serpulo.name = Serpulo +planet.sun.name = Aurinko + +sector.groundZero.name = Tapahtumahorisontti +sector.craters.name = Kraatterit +sector.frozenForest.name = Jäätyneet Metsät +sector.ruinousShores.name = Taistelujen Ranta +sector.stainedMountains.name = Kalliovuoret +sector.desolateRift.name = Musta Kanjoni +sector.nuclearComplex.name = Hylätty Ydinvoimalaitos +sector.overgrowth.name = Jätti Viidakko +sector.tarFields.name = Tervakentät +sector.saltFlats.name = Suola Autio +sector.fungalPass.name = Sienirihmasto sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.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. @@ -560,6 +566,10 @@ settings.clear.confirm = Oletko varma että haluat tyhjentää pelin datan?\nMit settings.clearall.confirm = [scarlet]WARNING![]\nTämä poistaa kaiken datan, mukaanlukien kesken olevat pelit, kartat, avatut asiat ja kontrolliasetukset.\nKun painat 'ok' kaikki datasi poistetaan ja peli suljetaan. settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Pysäytetty > clear = Tyhjä banned = [scarlet]Kielletty @@ -570,49 +580,74 @@ info.title = Informaatio error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Sisääntulo -blocks.output = Ulostulo -blocks.booster = Tehostaja -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Energiakapasiteetti -blocks.powershot = Energiaa/Ammus -blocks.damage = Vahinko -blocks.targetsair = Hyökkää ilmaan -blocks.targetsground = Hyökkää maahan -blocks.itemsmoved = Liikkumisnopeus -blocks.launchtime = Aika laukaisujen välillä -blocks.shootrange = Kantama -blocks.size = Koko -blocks.displaysize = Display Size -blocks.liquidcapacity = Nestekapasiteetti -blocks.powerrange = Energiakantama -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maksimimäärä yhdistyksiä -blocks.poweruse = Energian käyttö -blocks.powerdamage = Energia/Vahinko -blocks.itemcapacity = Tavarakapasiteetti -blocks.basepowergeneration = Perus energiantuotto -blocks.productiontime = Tuotantoaika -blocks.repairtime = Kokonaisen palikan korjausaika -blocks.speedincrease = Nopeuden kasvu -blocks.range = Etäisyys -blocks.drilltier = Porattavat -blocks.drillspeed = Kanta Poran Nopeus -blocks.boosteffect = Tehostamisem vaikutus -blocks.maxunits = Maksimimäärä yksikköjä -blocks.health = Elämäpisteet -blocks.buildtime = Rakentamisaika -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Rakentamishinta -blocks.inaccuracy = Epätarkkuus -blocks.shots = Ammusta -blocks.reload = Ammusta/sekunnissa -blocks.ammo = Ammus -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Sisääntulo +stat.output = Ulostulo +stat.booster = Tehostaja +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Energiakapasiteetti +stat.powershot = Energiaa/Ammus +stat.damage = Vahinko +stat.targetsair = Hyökkää ilmaan +stat.targetsground = Hyökkää maahan +stat.itemsmoved = Liikkumisnopeus +stat.launchtime = Aika laukaisujen välillä +stat.shootrange = Kantama +stat.size = Koko +stat.displaysize = Display Size +stat.liquidcapacity = Nestekapasiteetti +stat.powerrange = Energiakantama +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maksimimäärä yhdistyksiä +stat.poweruse = Energian käyttö +stat.powerdamage = Energia/Vahinko +stat.itemcapacity = Tavarakapasiteetti +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Perus energiantuotto +stat.productiontime = Tuotantoaika +stat.repairtime = Kokonaisen palikan korjausaika +stat.speedincrease = Nopeuden kasvu +stat.range = Etäisyys +stat.drilltier = Porattavat +stat.drillspeed = Kanta Poran Nopeus +stat.boosteffect = Tehostamisem vaikutus +stat.maxunits = Maksimimäärä yksikköjä +stat.health = Elämäpisteet +stat.buildtime = Rakentamisaika +stat.maxconsecutive = Max Consecutive +stat.buildcost = Rakentamishinta +stat.inaccuracy = Epätarkkuus +stat.shots = Ammusta +stat.reload = Ammusta/sekunnissa +stat.ammo = Ammus +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Tahmeus +stat.temperature = Lämpötila +stat.speed = Nopeus +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Erikoisvoimat + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Parempi pora vaadittu bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Energia: {0}/s bar.powerstored = Säilöttynä: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Energiantuotto: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Tavaroita: {0} bar.capacity = Kapasiteetti: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Rakennuksen edistys bar.input = Sisääntulo bar.output = Ulostulo +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] Vahinko bullet.splashdamage = [stat]{0}[lightgray] Aluevahinko ~[stat] {1}[lightgray] palikkaa bullet.incendiary = [stat]sytyttävä @@ -642,12 +680,15 @@ bullet.homing = [stat]itseohjautuva bullet.shock = [stat]shokki bullet.frag = [stat]sirpaloituva bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]jäädyttävä bullet.tarred = [stat]tervattu -bullet.multiplier = [stat]{0}[lightgray]x ammusten kerroin +bullet.multiplier = [stat]{0}[lightgray]x ammusmäärän kerroin bullet.reload = [stat]{0}[lightgray]x ampumisnopeus unit.blocks = palikat +unit.blockssquared = palikat² unit.powersecond = energiayksikköä/sekunti unit.liquidsecond = nesteyksikköä/sekunti unit.itemssecond = esinettä/sekunti @@ -655,12 +696,12 @@ unit.liquidunits = nesteyksikköä unit.powerunits = energiayksikköä unit.degrees = astetta unit.seconds = sekunttia -unit.minutes = mins +unit.minutes = minuuttia unit.persecond = /s unit.perminute = /min unit.timesspeed = x nopeus unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = suojan elinpisteet unit.items = esinettä unit.thousands = t unit.millions = mil @@ -670,7 +711,7 @@ category.power = Energia category.liquids = Neste category.items = Tavarat category.crafting = Ulos/Sisääntulo -category.shooting = Ammunta +category.function = Function category.optional = Mahdolliset parannukset setting.landscape.name = Lukitse tasavaakaan setting.shadows.name = Varjot @@ -679,7 +720,6 @@ setting.linear.name = Lineaarinen suodatus setting.hints.name = Vihjeet setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Automaattisest Pysäytä Rakentaessa -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animoitu vesi setting.animatedshields.name = Animoidut kilvet setting.antialias.name = Antialiaasi[lightgray] (vaatii uudelleenkäynnistyksen)[] @@ -693,27 +733,26 @@ setting.fpscap.none = Ei Mitään setting.fpscap.text = {0} FPS setting.uiscale.name = UI Koko[lightgray] (vaatii uudelleenkäynnistyksen)[] setting.swapdiagonal.name = Aina vino korvaus -setting.difficulty.training = Treeni -setting.difficulty.easy = Helppo -setting.difficulty.normal = Keskivaikea -setting.difficulty.hard = Haastava -setting.difficulty.insane = Järjetön +setting.difficulty.training = Treenaus +setting.difficulty.easy = Huoleton +setting.difficulty.normal = Haasteeton +setting.difficulty.hard = Taidonnäyte +setting.difficulty.insane = Hullun Vaikea setting.difficulty.name = Vaikeustaso: setting.screenshake.name = Näytön keikkuminen setting.effects.name = Naytön Efektit setting.destroyedblocks.name = Näytä tuhoutuneet palikat -setting.blockstatus.name = Display Block Status +setting.blockstatus.name = Näytä Palikan Toimintakunto setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Ohjauksen herkkyys setting.saveinterval.name = Tallennuksen Aikaväli -setting.seconds = {0} Sekunttia +setting.seconds = {0} Sekuntia setting.blockselecttimeout.name = Block Select Timeout -setting.milliseconds = {0} millisekunttia -setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[lightgray] (vaatii uudelleenkäynnistyksen) +setting.milliseconds = {0} millisekuntia +setting.fullscreen.name = Täysnäyttö +setting.borderlesswindow.name = Reunaton Ikkuna[lightgray] (vaatii uudelleenkäynnistyksen) setting.fps.name = Näytä FPS setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Näytä palikan valintaohjaimet setting.vsync.name = VSync setting.pixelate.name = Pixeloi[lightgray] (poistaa animaation käytöstä) setting.minimap.name = Näytä pienoiskartta @@ -737,8 +776,8 @@ public.confirm = Do you want to make your game public?\n[accent]Anyone will be a public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Peruuta ja poistu -setting.bloom.name = Bloom -keybind.title = Rebind Keys +setting.bloom.name = Hehkeys +keybind.title = Kontrollit keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. category.general.name = General category.view.name = View @@ -747,10 +786,10 @@ category.blocks.name = Block Select command.attack = Hyökkäys command.rally = Kokoontuminen command.retreat = Perääntyminen -command.idle = Idle +command.idle = AFK placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.respawn.name = Synny Uudelleen +keybind.control.name = Käytä Yksikköä keybind.clear_building.name = Clear Building keybind.press = Press a key... keybind.press.axis = Press an axis or key... @@ -822,6 +861,7 @@ mode.custom = Custom Rules rules.infiniteresources = Ikuiset resurssit rules.reactorexplosions = Reaktorien räjähtäminen +rules.schematic = Schematics Allowed rules.wavetimer = Tasojen aikaraja rules.waves = Tasot rules.attack = Hyökkäystila @@ -847,6 +887,7 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Tavarat content.liquid.name = Nesteet content.unit.name = Yksiköt content.block.name = Palikat + item.copper.name = Kupari item.lead.name = Lyijy item.coal.name = Hiili @@ -865,36 +907,19 @@ item.graphite.name = Grafiitti item.titanium.name = Titaani item.thorium.name = Torium item.silicon.name = Pii -item.plastanium.name = Plastaniumi -item.phase-fabric.name = Kiihdekuitu -item.surge-alloy.name = Taiteseos +item.plastanium.name = Plastiikkaseos +item.phase-fabric.name = Kiihtokuitu +item.surge-alloy.name = Venttikovete item.spore-pod.name = Itiöpalko item.sand.name = Hiekka -item.blast-compound.name = Räjähdeyhdiste -item.pyratite.name = Pyratiitti -item.metaglass.name = Metallilasi +item.blast-compound.name = Erikoisruuti +item.pyratite.name = Rikkikiisu +item.metaglass.name = Teräslasi item.scrap.name = Romu liquid.water.name = Vesi liquid.slag.name = Kuona liquid.oil.name = Öljy -liquid.cryofluid.name = Kryoneste - -item.explosiveness = [lightgray]Räjädysmäisyys: {0}% -item.flammability = [lightgray]Syttyvyys: {0}% -item.radioactivity = [lightgray]Radioaktiivisuus: {0}% - -unit.health = [lightgray]Elämäpisteet: {0} -unit.speed = [lightgray]Nopeus: {0} -unit.weapon = [lightgray]Ammuksia: {0} -unit.itemcapacity = [lightgray]Esine kapasiteetti: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Lämpökapasiteetti: {0} -liquid.viscosity = [lightgray]Tahmeus: {0} -liquid.temperature = [lightgray]Lämpö: {0} +liquid.cryofluid.name = Kryölitku unit.dagger.name = Tikari unit.mace.name = Mace @@ -936,6 +961,7 @@ block.cliff.name = Vuoren block.sand-boulder.name = Hiekkalohkare block.grass.name = Ruoho block.slag.name = Kuono +block.space.name = Space block.salt.name = Suolapitoisuus block.salt-wall.name = Salt Wall block.pebbles.name = Pikkukivi @@ -965,9 +991,9 @@ block.spawn.name = Vihollisten syntymispiste block.core-shard.name = Ydin: Siru block.core-foundation.name = Ydin: Pohjaus block.core-nucleus.name = Ydin: Tuma -block.deepwater.name = Syvä vesi -block.water.name = Vesi -block.tainted-water.name = Pilaantunut vesi +block.deepwater.name = Syvää vettä +block.water.name = Vettä +block.tainted-water.name = Saastevettä block.darksand-tainted-water.name = Dark Sand Tainted Water block.tar.name = Terva block.stone.name = Kivi @@ -981,6 +1007,7 @@ block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1030,7 +1057,7 @@ block.titanium-conveyor.name = Titanium Conveyor block.plastanium-conveyor.name = Plastanium Conveyor block.armored-conveyor.name = Armored Conveyor block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts. -block.junction.name = Junction +block.junction.name = Junktio block.router.name = Reititin block.distributor.name = Distributor block.sorter.name = Lajittelija @@ -1071,10 +1098,11 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = Kaari block.rtg-generator.name = RTG Generator block.spectre.name = Haamu block.meltdown.name = Sulamispiste +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = sininen team.crux.name = punainen diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 86c3c0737a..c5663baa1d 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -55,6 +55,7 @@ schematic.saved = Na-i-adya na ang schematic. schematic.delete.confirm = Ang schematic na'to ay tuluyang mawawala. schematic.rename = Palitan Ang Pangalan ng Schematic schematic.info = {0}x{1}, {2} blocks +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Wave na Nalagpasan:[accent] {0} stat.enemiesDestroyed = Tinalong Kalaban:[accent] {0} @@ -100,7 +101,6 @@ done = Tapos Na feature.unsupported = Hindi suportado ng 'yong device ang feature na'to. mods.alphainfo = Tandaan mo na ang mga mod ay nasa 'alpha', at[scarlet] maaaring may depekto pa ang mga 'to[].\nI-ulat ang kahit anong depektong matutuklasan mo sa Mindustry GitHub o Discord. -mods.alpha = [accent](Alpha) mods = Mga Mod mods.none = [lightgray]Walang mga mod na nahanap! mods.guide = Gabay para sa Paggawa ng Mod @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Wave {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Wave in {0} wave.waveInProgress = [lightgray]Wave in progress waiting = [lightgray]Waiting... waiting.players = Waiting for players... wave.enemies = [lightgray]{0} Enemies Remaining wave.enemy = [lightgray]{0} Enemy Remaining +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Load Image saveimage = Save Image unknown = Unknown @@ -328,6 +331,7 @@ editor.generation = Generation: editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map +editor.center = Center workshop = Workshop waves.title = Waves waves.remove = Remove @@ -416,6 +420,7 @@ filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Median filter.oremedian = Ore Median @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Block filter.option.floor = Floor filter.option.flooronto = Target Floor +filter.option.target = Target filter.option.wall = Wall filter.option.ore = Ore filter.option.floor2 = Secondary Floor @@ -471,15 +477,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -launch = < LAUNCH > launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +research.multiplayer = Only the host can research items. uncover = Uncover configure = Configure Loadout loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done 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.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -570,49 +580,74 @@ info.title = Info error.title = [scarlet]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Build Progress bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -642,12 +680,15 @@ bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce 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.blockssquared = blocks² unit.powersecond = power units/second unit.liquidsecond = liquid units/second unit.itemssecond = items/second @@ -670,7 +711,7 @@ category.power = Power category.liquids = Liquids category.items = Items category.crafting = Input/Output -category.shooting = Shooting +category.function = Function category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows @@ -679,7 +720,6 @@ setting.linear.name = Linear Filtering setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animated Fluids setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) setting.fps.name = Show FPS & Ping setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate setting.minimap.name = Show Minimap @@ -822,6 +861,7 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -847,6 +887,7 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Items content.liquid.name = Liquids content.unit.name = Units content.block.name = Blocks + item.copper.name = Copper item.lead.name = Lead item.coal.name = Coal @@ -879,23 +921,6 @@ liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid -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} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viscosity: {0} -liquid.temperature = [lightgray]Temperature: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag +block.space.name = Space block.salt.name = Salt block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -981,6 +1007,7 @@ block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1071,10 +1098,11 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blue team.crux.name = red diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index e7749d7347..8989d9148c 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1,29 +1,32 @@ -credits.text = Créé par [royal]Anuken[] - [sky]anukendev@gmail.com[]\n\n[gray] +credits.text = Créé par [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Crédits contributors = Traducteurs et contributeurs -discord = Rejoignez le Discord de Mindustry -link.discord.description = Le discord officiel de Mindustry! -link.reddit.description = Le subreddit de Mindustry +discord = Rejoignez le Discord de Mindustry ! +link.discord.description = Discord officiel de Mindustry +link.reddit.description = Subreddit de Mindustry link.github.description = Code source du jeu link.changelog.description = Liste des mises à jour -link.dev-builds.description = Versions instables du jeu -link.trello.description = Trello officiel pour les ajouts futurs -link.itch.io.description = Page itch.io avec lien de téléchargement pour PC -link.google-play.description = Google Play Store -link.f-droid.description = Catalogue F-Droid -link.wiki.description = Le wiki officiel de Mindustry -link.suggestions.description = Suggérer de nouvelles fonctionnalités -linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copiée dans votre presse-papier. -screenshot = Capture d'écran sauvegardée à {0} -screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran. -gameover = Game over -gameover.pvp = L'équipe [accent] {0}[] a gagné ! -highscore = [accent]Nouveau meilleur score! +link.dev-builds.description = Versions expérimentales du jeu +link.trello.description = Trello officiel pour les nouvelles fonctionnalités planifiées +link.itch.io.description = Page itch.io avec les différentes versions du jeu. +link.google-play.description = Page Google Play du jeu +link.f-droid.description = Page F-Droid du jeu +link.wiki.description = Wiki officiel de Mindustry +link.suggestions.description = Suggérez de nouvelles fonctionnalités +link.bug.description = Vous avez trouvé un bug ? Reportez-le ici +linkfail = L'ouverture du lien a échouée ! \nL'URL a été copiée dans votre presse-papier. +screenshot = Capture d'écran sauvegardée dans {0} +screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire pour la capture d'écran. +gameover = Partie terminée +gameover.disconnect = Déconnecter +gameover.pvp = L'équipe[accent] {0}[] a gagné ! +gameover.waiting = [accent]Attente de la nouvelle carte... +highscore = [accent]Nouveau meilleur score ! copied = Copié. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Cette partie du jeu n'est pas encore prête. +indev.campaign = [accent]Félicitations! Vous avez atteint la fin de la campagne ![]\n\nC'est ici que le contenu actuel s'arrête. Le voyage interplanétaire sera ajouté dans de futures mises à jour. -load.sound = Sons +load.sound = Son load.map = Cartes load.image = Images load.content = Contenu @@ -31,64 +34,75 @@ load.system = Système load.mod = Mods load.scripts = Scripts -be.update = Une nouvelle version en développement est disponible: -be.update.confirm = Télécharger et Redémarrer le jeu maintenenant ? +be.update = Une nouvelle version expérimentale est disponible: +be.update.confirm = Télécharger et Redémarrer le jeu maintenant ? be.updating = Mise à jour en cours... be.ignore = Ignorer be.noupdates = Aucune mise à jour trouvée. -be.check = Vérifiez les mises à jour +be.check = Chercher des mises à jour. + +mods.browser = Navigateur de Mods +mods.browser.selected = Mod sélectionné +mods.browser.add = Installer +mods.browser.reinstall = Réinstaller +mods.github.open = Voir sur Github +mods.browser.sortdate = Classer par date +mods.browser.sortstars = Classer par étoiles schematic = Schéma -schematic.add = Sauvegarder le schéma... +schematic.add = Enregistrer le Schéma schematics = Schémas -schematic.replace = Un schéma avec ce nom existe déjà. Le remplacer? +schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer ? schematic.exists = Un schéma avec ce nom existe déjà. -schematic.import = Importer un schéma... +schematic.import = Importer un schéma schematic.exportfile = Exporter le fichier schematic.importfile = Importer un fichier schematic.browseworkshop = Consulter le Steam Workshop -schematic.copy = Copier au presse-papier -schematic.copy.import = Importer du presse-papier +schematic.copy = Copier dans le presse-papier +schematic.copy.import = Importer depuis presse-papier schematic.shareworkshop = Partager sur le Steam Workshop schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner le schéma -schematic.saved = Schéma sauvegardé. -schematic.delete.confirm = Ce schéma sera supprimé définitivement. -schematic.rename = Renommer le schéma +schematic.saved = Schéma enregistré. +schematic.delete.confirm = Ce schéma sera supprimé définitivement ! +schematic.rename = Renommer le Schéma schematic.info = {0}x{1}, {2} blocs +schematic.disabled = [scarlet]Schémas désactivés ![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]carte[] ou dans ce [accent]serveur. -stat.wave = Vagues vaincues:[accent] {0} -stat.enemiesDestroyed = Ennemis détruits:[accent] {0} -stat.built = Bâtiments construits:[accent] {0} -stat.destroyed = Bâtiments détruits:[accent] {0} -stat.deconstructed = Bâtiments déconstruits:[accent] {0} -stat.delivered = Ressources transférées: -stat.playtime = Temps de jeu:[accent] {0} -stat.rank = Rang Final: [accent]{0} +stats = Statistiques +stat.wave = Vagues vaincues : [accent] {0} +stat.enemiesDestroyed = Ennemis détruits : [accent] {0} +stat.built = Bâtiments construits : [accent] {0} +stat.destroyed = Bâtiments détruits : [accent] {0} +stat.deconstructed = Bâtiments déconstruits : [accent] {0} +stat.delivered = Ressources transférées : +stat.playtime = Temps de jeu : [accent] {0} +stat.rank = Rang Final : [accent]{0} -globalitems = [accent]Global Items -map.delete = Êtes-vous certain(e) de vouloir supprimer la carte "[accent]{0}[]"? -level.highscore = Meilleur score: [accent]{0} +globalitems = [accent]Ressources globales +map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]" ? +level.highscore = Meilleur score : [accent]{0} level.select = Sélection du niveau -level.mode = Mode de jeu: -coreattack = [scarlet]< Le noyau est attaquée! > +level.mode = Mode de jeu : +coreattack = [scarlet]< Le Noyau est attaqué ! > nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente database = Base de données savegame = Sauvegarder la partie -loadgame = Charger la partie +loadgame = Charger une partie joingame = Rejoindre une partie -customgame = Partie customisée +customgame = Partie personnalisée newgame = Nouvelle partie -none = -minimap = Minimap +none = +none.found = [lightgray] +minimap = Mini-carte position = Position close = Fermer website = Site Web quit = Quitter -save.quit = Sauvegarder\net Quitter +save.quit = Sauvegarder & Quitter maps = Cartes maps.browse = Parcourir les cartes continue = Continuer -maps.none = [lightgray]Aucune carte trouvée! +maps.none = [lightgray]Aucune carte trouvée ! invalid = Invalide pickcolor = Choisir la Couleur preparingconfig = Préparation de la configuration @@ -97,241 +111,266 @@ uploadingcontent = Publication du contenu uploadingpreviewfile = Publication du fichier d'aperçu committingchanges = Validation des modifications done = Fait -feature.unsupported = Votre appareil ne supporte pas cette fonctionnalité. +feature.unsupported = Votre appareil ne prend pas en charge cette fonctionnalité. -mods.alphainfo = Gardez à l'esprit que les mods sont en alpha et[scarlet] peuvent être très buggés[].\nMerci de signaler les problèmes que vous rencontrez via le GitHub ou le Discord Mindustry. -mods.alpha = [accent](Alpha) +mods.initfailed = [red]âš [] L'instance précédente de Mindustry n’a pas pu s’initialiser. Cela a probablement été causé par des mods..\n\nPour éviter une boucle de crash, [red]tous les mods ont été désactivés.[]\n\nPour désactiver cette fonctionnalité, désactivez-la dans [accent]Paramètres->Jeu->Désactiver les mods lors d'un crash au démarrage[]. mods = Mods -mods.none = [lightgray]Aucun mod trouvé! +mods.none = [lightgray]Aucun Mod trouvé ! mods.guide = Guide de Modding mods.report = Signaler un Bug -mods.openfolder = Ouvrir le dossier des mods -mods.reload = Rafraichir -mods.reloadexit = The game will now exit, to reload mods. +mods.openfolder = Ouvrir le Dossier +mods.viewcontent = Voir le Contenu +mods.reload = Relancer +mods.reloadexit = Le jeu va se fermer pour relancer les mods. +mod.installed = [[Installé] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Activé mod.disabled = [scarlet]Désactivé +mod.multiplayer.compatible = [gray]Compatible en Multijoueur mod.disable = Désactiver -mod.content = Contenu: +mod.content = Contenu : mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation. -mod.requiresversion = [scarlet]Version du jeu requise : [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) -mod.missingdependencies = [scarlet]Dépendances manquantes: {0} -mod.erroredcontent = [scarlet]Erreurs de contenu +mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0} +mod.outdated = [scarlet]Non compatible avec la V6 (no minGameVersion: 105) +mod.missingdependencies = [scarlet]Dépendances manquantes : {0} +mod.erroredcontent = [scarlet]Erreurs de contenu ! mod.errors = Des erreurs se sont produites lors du chargement du contenu. mod.noerrorplay = [scarlet]Vous avez des mods avec des erreurs.[] Désactivez les mods concernés ou corrigez les erreurs avant de jouer. -mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes:[accent] {1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. +mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes: [accent]{1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. mod.enable = Activer mod.requiresrestart = Le jeu va maintenant se fermer pour appliquer les modifications du mod. -mod.reloadrequired = [scarlet]Rechargement requis +mod.reloadrequired = [scarlet]Redémarrage requis mod.import = Importer un mod mod.import.file = Importer un fichier -mod.import.github = Importer un mod GitHub -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! -mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question. +mod.import.github = Importer un mod depuis GitHub +mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'importer ce mod depuis une source digne de confiance. +mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstaller le mod en question. mod.remove.confirm = Ce mod sera supprimé. -mod.author = [lightgray]Auteur:[] {0} -mod.missing = Cette sauvegarde contient des mods que vous avez récemment mis à jour ou que vous avez désinstallés. Votre sauvegarde risque d'être corrompue. Êtes-vous sûr(e) de vouloir l'importer?\n[lightgray]Mods:\n{0} -mod.preview.missing = Avant de publier ce mod dans le Steam Workshop, vous devez ajouter une image servant d'aperçu.\nPlacez une image nommée[accent] preview.png[] dans le dossier du mod et réessayez. -mod.folder.missing = Seuls les mods sous forme de dossiers peuvent être publiés sur le Steam Workshop.\nPour convertir n'importe quel mod en un dossier, dézippez-le tout simplement dans un dossier et supprimez l'ancien zip, puis redémarrez votre jeu ou rechargez vos mods. -mod.scripts.disable = Votre appareil ne supporte pas les mods avec des scripts. Vous devez désactiver ces mods pour jouer. +mod.author = [lightgray]Auteur : [] {0} +mod.missing = Cette sauvegarde contient des mods que vous avez récemment mis à jour ou que vous avez désinstallés. Votre sauvegarde risque d'être corrompue. Êtes-vous sûr de vouloir l'importer ?\n[lightgray]Mods:\n{0} +mod.preview.missing = Avant de publier ce mod dans le Steam Workshop, vous devez ajouter une image servant d'aperçu.\nPlacez une image nommée [accent]preview.png[] dans le dossier du mod et réessayez. +mod.folder.missing = Seuls les mods sous forme de dossiers peuvent être publiés sur le Steam Workshop.\nPour convertir n'importe quel mod en un dossier, décompressez-le tout simplement dans un dossier et supprimez l'ancien zip, puis redémarrez votre jeu ou rechargez vos mods. +mod.scripts.disable = Votre appareil ne prend pas en charge les mods avec des scripts. Vous devez désactiver ces mods pour pouvoir jouer. about.button = À propos -name = Nom: -noname = Commencez par choisir un[accent] nom de joueur[]. -planetmap = Planet Map -launchcore = Launch Core -filename = Nom du fichier: -unlocked = Nouveau bloc débloqué! +name = Nom : +noname = Commencez par choisir un[accent] nom[]. +planetmap = Carte de la planète +launchcore = Lancer le Noyau +filename = Nom du fichier : +unlocked = Nouveau contenu débloqué ! +available = Nouvelle recherche disponible ! completed = [accent]Complété techtree = Arbre technologique -research.list = [lightgray]Recherche: +research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne ? (recommandé) +research.load = Charger +research.discard = Ignorer +research.list = [lightgray]Recherche : research = Rechercher -researched = [lightgray]{0} recherché(e). -research.progress = {0}% complete -players = {0} joueurs en ligne -players.single = {0} joueur en ligne +researched = [lightgray]{0} recherché. +research.progress = {0}% complété +players = {0} joueurs +players.single = {0} joueur players.search = Recherche players.notfound = [gray]Aucun joueur trouvé server.closing = [accent]Fermeture du serveur... -server.kicked.kick = Vous avez été expulsé du serveur! -server.kicked.whitelist = Vous n'êtes pas sur liste blanche ici. -server.kicked.serverClose = Serveur fermé. -server.kicked.vote = Vous avez été expulsé suite à un vote. Au revoir. -server.kicked.clientOutdated = Client obsolète! Mettez votre jeu à jour! -server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour! -server.kicked.banned = Vous avez été banni de ce serveur. +server.kicked.kick = Vous avez été expulsé du serveur ! +server.kicked.whitelist = Vous n'êtes pas sur liste blanche de ce serveur. +server.kicked.serverClose = Serveur fermé ! +server.kicked.vote = Vous avez été expulsé à la suite d'un vote. Au revoir ! +server.kicked.clientOutdated = Client obsolète !\nMettez votre jeu à jour ! +server.kicked.serverOutdated = Serveur obsolète !\nDemandez à l'hôte de le mettre à jour ! +server.kicked.banned = Vous avez été banni de ce serveur ! server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu. -server.kicked.playerLimit = Ce serveur est plein. Veuillez attendre qu'une place se libère. -server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau. +server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libère. +server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter... server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur. server.kicked.nameEmpty = Votre nom est invalide. -server.kicked.idInUse = Vous êtes déjà sur ce serveur! Se connecter avec deux comptes n'est pas permis. +server.kicked.idInUse = Vous êtes déjà sur ce serveur !\nSe 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.kicked.serverRestarting = Le serveur est en train de redémarrer. +server.kicked.gameover = Partie terminée ! +server.kicked.serverRestarting = Le serveur est en train de redémarrer... server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[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 [lightgray]wifi ou réseau local []devrait voir votre serveur sur sa liste de 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 requis.\n\n[lightgray]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 entrer [accent]l'adresse 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[lightgray]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connecter à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP. -hostserver = Héberger une partie +host.info = Le bouton [accent]héberger[] héberge un serveur sur le port [scarlet]6567[].\nN'importe qui sur le même [lightgray]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]une ouverture des ports[] est requise.\n\n[lightgray]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 vous y connecter, ou découvrir les serveurs sur votre [accent]réseau local[] ou les serveurs [accent]globaux[].\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[lightgray]Note: Si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur. Celle-ci peut-être trouvée en cherchant "Mon IP" sur un moteur de recherche depuis son appareil. +hostserver = Héberger une partie multijoueur invitefriends = Inviter des Amis hostserver.mobile = Héberger\nune partie host = Héberger -hosting = [accent]Préparation du serveur... +hosting = [accent]Ouverture du serveur... hosts.refresh = Actualiser hosts.discovering = Recherche de jeux en LAN hosts.discovering.any = Recherche de parties server.refreshing = Actualisation du serveur -hosts.none = [lightgray]Aucun jeu en LAN trouvé! +hosts.none = [lightgray]Aucune partie en LAN trouvée ! host.invalid = [scarlet]Impossible de se connecter à l'hôte. servers.local = Serveurs locaux servers.remote = Serveurs distants -servers.global = Serveurs officiels +servers.global = Serveurs communautaires + +servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés, ni contrôlés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tous les âges. +servers.showhidden = Montrer les serveurs cachés +server.shown = Visible +server.hidden = Caché trace = Suivre le joueur trace.playername = Nom du joueur : [accent]{0} -trace.ip = IP: [accent]{0} +trace.ip = IP : [accent]{0} trace.id = ID Unique : [accent]{0} -trace.mobile = Client mobile: [accent]{0} -trace.modclient = Client personnalisé: [accent]{0} -invalidid = ID du client invalide! Veuillez soumettre un rapport d'erreur. -server.bans = Joueurs Bannis -server.bans.none = Aucun joueur banni trouvé! -server.admins = Administrateurs -server.admins.none = Aucun administrateur trouvé! +trace.mobile = Client Mobile : [accent]{0} +trace.modclient = Client personnalisé : [accent]{0} +trace.times.joined = Nombre de fois rejoint: [accent]{0} +trace.times.kicked = Nombre de kicks: [accent]{0} +invalidid = ID du client invalide ! Veuillez soumettre un rapport d'erreur. +server.bans = Bans +server.bans.none = Aucun joueur banni trouvé ! +server.admins = Admins +server.admins.none = Aucun administrateur trouvé ! server.add = Ajouter un serveur server.delete = Êtes-vous sûr de vouloir supprimer ce serveur ? server.edit = Modifier le serveur -server.outdated = [crimson]Serveur obsolète![] -server.outdated.client = [crimson]Client obsolète![] -server.version = [lightgray]Version: {0} {1} +server.outdated = [scarlet]Serveur obsolète ![] +server.outdated.client = [scarlet]Client obsolète ![] +server.version = [gray]Version : {0} {1} server.custombuild = [accent]Version personnalisée -confirmban = Souhaitez-vous vraiment bannir ce joueur? -confirmkick = Souhaitez-vous vraiment expulser ce joueur? -confirmvotekick = Voulez-vous vraiment voter l'expulsion de ce joueur? -confirmunban = Souhaitez-vous vraiment réintégrer ce joueur ? -confirmadmin = Souhaitez-vous vraiment rendre ce joueur administrateur? -confirmunadmin = Souhaitez-vous vraiment enlever le statut d'administrateur à ce joueur? +confirmban = Êtes-vous sûr de vouloir bannir "{0}[white]" ? +confirmkick = Êtes-vous sûr de vouloir expulser "{0}[white]" ? +confirmvotekick = Êtes-vous sûr de vouloir voter "{0}[white]" ? +confirmunban = Êtes-vous sûr de vouloir annuler le ban de ce joueur ? +confirmadmin = Êtes-vous sûr de vouloir faire de "{0}[white]" un administrateur ? +confirmunadmin = Êtes-vous sûr de vouloir supprimer le statut d'administrateur de "{0}[white]" ? joingame.title = Rejoindre une partie -joingame.ip = IP: +joingame.ip = IP : disconnect = Déconnecté. -disconnect.error = Erreur de connexion. -disconnect.closed = Connexion fermée. +disconnect.error = Un problème est survenu lors de la connexion. +disconnect.closed = Connection fermée. disconnect.timeout = Délai de connexion expiré. -disconnect.data = Les données du monde n'ont pas pu être chargées! +disconnect.data = Les données du monde n'ont pas pu être chargées ! cantconnect = Impossible de rejoindre ([accent]{0}[]). connecting = [accent]Connexion... -connecting.data = [accent]Chargement de la partie... -server.port = Port: -server.addressinuse = Adresse déjà utilisée! -server.invalidport = Numéro de port invalide! -server.error = [crimson]Erreur d'hébergement: [accent]{0} +reconnecting = [accent]Reconnexion... +connecting.data = [accent]Chargement des données du monde... +server.port = Port : +server.addressinuse = Adresse déjà utilisée ! +server.invalidport = Numéro de port invalide ! +server.error = [scarlet]Erreur lors de l'hébergement du serveur. save.new = Nouvelle sauvegarde -save.overwrite = Êtes-vous sûr de vouloir\n écraser cette sauvegarde ? +save.overwrite = Êtes-vous sûr de vouloir\nécraser cette sauvegarde ? overwrite = Écraser save.none = Aucune sauvegarde trouvée ! -savefail = Échec de la sauvegarde! -save.delete.confirm = Êtes-vous sûr(e) de vouloir supprimer cette sauvegarde? +savefail = Échec de la sauvegarde ! +save.delete.confirm = Êtes-vous sûr de vouloir supprimer cette sauvegarde ? save.delete = Supprimer -save.export = Exporter une\nsauvegarde -save.import.invalid = [accent]Cette sauvegarde est invalide! -save.import.fail = [crimson]Échec d'importation: [accent]{0} -save.export.fail = [crimson]Échec d'exportation: [accent]{0} +save.export = Exporter une sauvegarde +save.import.invalid = [accent]Cette sauvegarde est invalide ! +save.import.fail = [crimson]L'importation de la sauvegarde\na échouée: [accent]{0} +save.export.fail = [crimson]L'exportation de la sauvegarde\na échouée: [accent]{0} save.import = Importer une sauvegarde -save.newslot = Nom de la sauvegarde: +save.newslot = Nom de la sauvegarde : save.rename = Renommer -save.rename.text = Nouveau nom: -selectslot = Choisissez une sauvegarde. +save.rename.text = Nouveau nom : +selectslot = Sélectionnez une sauvegarde. slot = [accent]Emplacement {0} -editmessage = Modifier le Message -save.corrupted = [accent]Sauvegarde corrompue ou invalide!\nSi vous venez de mettre à jour votre jeu, c'est probablement dû à un changement du format de sauvegarde et [scarlet]pas[] à un bug. +editmessage = Modifier le message +save.corrupted = Fichier de sauvegarde corrompu ou invalide ! empty = on = Activé off = Désactivé -save.autosave = Sauvegarde automatique: {0} -save.map = Carte: {0} +save.autosave = Sauvegarde automatique : {0} +save.map = Carte : {0} save.wave = Vague {0} -save.mode = Mode de jeu: {0} -save.date = Dernière sauvegarde: {0} -save.playtime = Temps de jeu: {0} +save.mode = Mode de jeu : {0} +save.date = Dernière sauvegarde : {0} +save.playtime = Temps de jeu : {0} warning = Avertissement. confirm = Confirmer delete = Supprimer view.workshop = Voir dans le Steam Workshop -workshop.listing = Éditer le listing du Steam Workshop +workshop.listing = Éditer la liste du Steam Workshop ok = OK open = Ouvrir -customize = Personnaliser les règles +customize = Personnaliser cancel = Annuler openlink = Ouvrir le lien copylink = Copier le lien back = Retour +max = Max +crash.export = Exporter les rapports de bugs +crash.none = Aucun rapport de bug trouvé. +crash.exported = Rapports de bugs exportés. data.export = Exporter les données -data.import = Importer les données +data.import = Importer des données data.openfolder = Ouvrir le dossier de données data.exported = Données exportées. data.invalid = Ce ne sont pas des données de jeu valides. -data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé![]\n\nUne fois les données importées, le jeu se fermera immédiatement. -quit.confirm = Êtes-vous sûr de vouloir quitter? -quit.confirm.tutorial = Êtes-vous sur de ce que vous faites?\nLe tutoriel peut être repris dans [accent]Paramètres->Jeu->Refaire le Tutoriel.[] +data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé ![]\n\nUne fois les données importées, le jeu se fermera immédiatement. +quit.confirm = Êtes-vous sûr de vouloir quitter ? +quit.confirm.tutorial = Êtes-vous sur de ce que vous faites ?\nLe tutoriel peut être repris dans [accent]Paramètres->Jeu->Refaire le Tutoriel.[] loading = [accent]Chargement... reloading = [accent]Rechargement des Mods... saving = [accent]Sauvegarde... -respawn = [accent][[{0}][] pour réapparaitre dans le noyau +respawn = [accent][[{0}][] pour réapparaître dans le Noyau cancelbuilding = [accent][[{0}][] pour effacer le plan -selectschematic = [accent][[{0}][] pour sélectionner et copier +selectschematic = [accent][[{0}][] pour sélectionner+copier pausebuilding = [accent][[{0}][] pour mettre la construction en pause resumebuilding = [scarlet][[{0}][] pour reprendre la construction +enablebuilding = [scarlet][[{0}][] pour activer la construction +showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface. wave = [accent]Vague {0} +wave.cap = [accent]Vague {0}/{1} wave.waiting = [lightgray]Vague dans {0} wave.waveInProgress = [lightgray]Vague en cours waiting = [lightgray]En attente... waiting.players = En attente de joueurs... wave.enemies = [lightgray]{0} Ennemis restants +wave.enemycores = [accent]{0}[lightgray] Noyaux ennemis +wave.enemycore = [accent]{0}[lightgray] Noyau ennemi wave.enemy = [lightgray]{0} Ennemi restant +wave.guardianwarn = Arrivée du Gardien dans [accent]{0}[] vagues. +wave.guardianwarn.one = Arrivée du Gardien dans [accent]{0}[] vague. loadimage = Charger l'image saveimage = Sauvegarder l'image unknown = Inconnu custom = Personnalisé -builtin = Intégré -map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura plus de retour en arrière! +builtin = Pré-fait +map.delete.confirm = Voulez-vous vraiment supprimer cette carte ?\nIl n'y aura pas de retour en arrière ! map.random = [accent]Carte aléatoire -map.nospawn = Cette carte n'a pas de base pour qu'un joueur puisse y apparaître! Ajoutez une base[accent] orange[] sur cette carte dans l'éditeur. -map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins une base [scarlet] non-orange[] dans l'éditeur. -map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[scarlet] rouge[] sur cette carte dans l'éditeur. +map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître !\nAjoutez un [accent]Noyau orange[] sur cette carte dans l'éditeur. +map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître !\nAjoutez au moins un Noyau[scarlet] non-orange[] dans l'éditeur. +map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer !\nVeuillez ajouter [scarlet]un Noyau rouge[] sur cette carte dans l'éditeur. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. workshop.update = Mettre à jour workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0} -map.publish.confirm = Êtes-vous sûr(e) de vouloir publier cette carte?\n\n[lightgray]Assurez-vous d’accepter d’abord les CGU du Steam Workshop, sinon vos cartes ne seront pas affichées! +map.publish.confirm = Êtes-vous sûr de vouloir publier cette carte ?\n\n[lightgray]Assurez-vous d’accepter d’abord les CGU du Steam Workshop, sinon vos cartes ne seront pas affichées ! workshop.menu = Sélectionnez ce que vous souhaitez faire avec cet élément. workshop.info = Infos sur l'élément changelog = Journal des changements (optionnel): eula = CGU de Steam -missing = Cet élément a été supprimé ou déplacé.\n[lightgray]Le listing du Steam Workshop a maintenant été automatiquement dissocié. +missing = Cet élément a été supprimé ou déplacé.\n[lightgray]La liste du Steam Workshop a maintenant été automatiquement dissociée. publishing = [accent]Publication... -publish.confirm = Êtes-vous sûr de vouloir publier ceci ?\n\n[lightgray]Assurez-vous d'être d'abord d'accord avec les CGU du workshop, sinon vos éléments n'apparaîtront pas ! -publish.error = Erreur de publication de l'élément: {0} -steam.error = Échec d'initialisation des services Steam.\nError: {0} +publish.confirm = Êtes-vous sûr de vouloir publier ceci ?\n\n[lightgray]Assurez-vous d'avoir accepté les CGU du workshop, sinon vos éléments n'apparaîtront pas ! +publish.error = Erreur de publication de l'élément : {0} +steam.error = Échec d'initialisation des services Steam.\nErreur : {0} editor.brush = Pinceau editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération de minerais -editor.oregen.info = Génération de minerais: -editor.mapinfo = Infos Carte -editor.author = Auteur: -editor.description = Description: +editor.oregen.info = Génération de minerais : +editor.mapinfo = Infos de la Carte +editor.author = Auteur : +editor.description = Description : editor.nodescription = Une carte doit avoir une description d'au moins 4 caractères pour pouvoir être publiée. -editor.waves = Vagues: -editor.rules = Règles: -editor.generation = Génération: +editor.waves = Vagues : +editor.rules = Règles : +editor.generation = Génération : editor.ingame = Éditer dans le jeu editor.publish.workshop = Publier sur le Workshop editor.newmap = Nouvelle carte +editor.center = Centrer workshop = Steam Workshop waves.title = Vagues waves.remove = Supprimer -waves.never = waves.every = tous les waves.waves = vague(s) waves.perspawn = par apparition @@ -346,109 +385,112 @@ waves.invalid = Vagues invalides dans le presse-papiers. waves.copied = Vagues copiées waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#these are intentionally in lower case +wavemode.counts = compte +wavemode.totals = totaux +wavemode.health = vie editor.default = [lightgray] details = Détails... edit = Modifier... -editor.name = Nom: -editor.spawn = Créer l'unité +editor.name = Nom : +editor.spawn = Ajouter une unité editor.removeunit = Retirer l'unité -editor.teams = Équipe -editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0} -editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0} +editor.teams = Équipes +editor.errorload = Erreur lors du chargement du fichier : \n[accent]{0} +editor.errorsave = Erreur lors de la sauvegarde du fichier : \n[accent]{0} editor.errorimage = Ceci est une image, et non une carte.\n\nSi vous voulez importer une carte provenant de la version 3.5 (build 40), utilisez le bouton 'importer une carte obsolète (image)' dans l'éditeur. -editor.errorlegacy = Cette carte est trop ancienne, et utilise un format de carte qui n'est plus supporté. +editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte qui n'est plus pris en charge. editor.errornot = Ceci n'est pas un fichier de carte. -editor.errorheader = Le fichier de carte est invalide ou corrompu. -editor.errorname = La carte n'a pas de nom. Essayez-vous de charger une sauvegarde? +editor.errorheader = Ce fichier de carte est invalide ou corrompu. +editor.errorname = La carte n'a pas de nom. Essayez-vous de charger une sauvegarde ? editor.update = Mettre à jour -editor.randomize = Rendre aléatoire +editor.randomize = Randomiser editor.apply = Appliquer editor.generate = Générer editor.resize = Redimensionner editor.loadmap = Charger la carte editor.savemap = Sauvegarder la carte -editor.saved = Sauvegardé! -editor.save.noname = Votre carte n'a pas de nom! Ajoutez un nom dans le menu 'info de la carte'. -editor.save.overwrite = Votre carte écrase une carte du jeu de base! Choisissez un nom différent dans le menu 'info de la carte' . -editor.import.exists = [scarlet]Importation impossible :[] '{0}' est le nom d'une carte du jeu de base! -editor.import = Importation... +editor.saved = Sauvegardé ! +editor.save.noname = Votre carte n'a pas de nom !\nAjoutez un nom dans le menu 'Infos de la Carte'. +editor.save.overwrite = Votre carte écrase une carte de base du jeu !\nChoisissez un nom différent dans le menu 'Infos de la Carte'. +editor.import.exists = [scarlet]Importation impossible :[] '{0}' est le nom d'une carte par défaut du jeu ! +editor.import = Importer editor.importmap = Importer une carte -editor.importmap.description = Importer une carte existante +editor.importmap.description = Importer une carte déjà existante editor.importfile = Importer un fichier editor.importfile.description = Importer une carte externe -editor.importimage = Importer une carte obsolète +editor.importimage = Importer une carte (image) editor.importimage.description = Importer une carte externe (image) -editor.export = Exporter... +editor.export = Exporter editor.exportfile = Exporter un fichier editor.exportfile.description = Exporter un fichier de carte editor.exportimage = Exporter l'image du terrain -editor.exportimage.description = Exporter une image de la carte -editor.loadimage = Importer le terrain +editor.exportimage.description = Exporter une image de la carte avec du terrain seulement +editor.loadimage = Importer un terrain editor.saveimage = Exporter le terrain editor.unsaved = [scarlet]Vous n'avez pas sauvegardé vos modifications![] Voulez-vous vraiment quitter ? editor.resizemap = Redimensionner\nla carte -editor.mapname = Nom de la carte: -editor.overwrite = [accent]Attention!\nCeci écrase une carte existante. -editor.overwrite.confirm = [scarlet]Attention![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir l'écraser? +editor.mapname = Nom de la carte : +editor.overwrite = [accent]Attention !\nCeci écrase une carte existante. +editor.overwrite.confirm = [scarlet]Attention ![]\nUne carte avec ce nom existe déjà. Êtes-vous sûr de vouloir l'écraser ? editor.exists = Une carte avec ce nom existe déjà. -editor.selectmap = Sélectionnez une carte: +editor.selectmap = Sélectionnez une carte : toolmode.replace = Remplacer -toolmode.replace.description = Dessiner seulement sur les blocs solides. +toolmode.replace.description = Dessine seulement\nsur les blocs solides. toolmode.replaceall = Tout Remplacer -toolmode.replaceall.description = Remplace tous les blocs de la carte. +toolmode.replaceall.description = Remplace tous les blocs\nde la carte. toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Dessine seulement des lignes orthogonales. +toolmode.orthogonal.description = Dessine seulement\ndes lignes orthogonales. toolmode.square = Carré toolmode.square.description = Pinceau carré. -toolmode.eraseores = Effacer les minéraux -toolmode.eraseores.description = Efface seulement les minéraux. +toolmode.eraseores = Effacer les minerais +toolmode.eraseores.description = Efface seulement\nles minerais. toolmode.fillteams = Remplir les équipes -toolmode.fillteams.description = Remplit les équipes au lieu des blocs. +toolmode.fillteams.description = Remplit les équipes\nau lieu des blocs. toolmode.drawteams = Dessiner les équipes -toolmode.drawteams.description = Dessine les équipes au lieu de blocs. +toolmode.drawteams.description = Change les équipes\nau lieu de blocs. -filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous. +filters.empty = [lightgray]Aucun filtre !\nAjoutez-en un avec les boutons ci-dessous. filter.distort = Déformation filter.noise = Bruit -filter.enemyspawn = Zone d'apparition enemi -filter.corespawn = Zone d'apparition du noyau +filter.enemyspawn = Zone d'apparition ennemie +filter.spawnpath = Chemin vers la zone d'apparition +filter.corespawn = Zone d'apparition du Noyau filter.median = Médian filter.oremedian = Minerai Médian filter.blend = Fusion -filter.defaultores = Minerai par défaut +filter.defaultores = Minerais par défaut filter.ore = Minerai -filter.rivernoise = Bruit des rivières +filter.rivernoise = Bruit de rivière filter.mirror = Miroir filter.clear = Effacer filter.option.ignore = Ignorer filter.scatter = Disperser filter.terrain = Terrain -filter.option.scale = Gamme +filter.option.scale = Échelle filter.option.chance = Chance filter.option.mag = Magnitude filter.option.threshold = Seuil -filter.option.circle-scale = Gamme du cercle +filter.option.circle-scale = Échelle circulaire filter.option.octaves = Octaves -filter.option.falloff = Diminution +filter.option.falloff = Détachement filter.option.angle = Angle filter.option.amount = Quantité filter.option.block = Bloc filter.option.floor = Sol -filter.option.flooronto = Sol en question +filter.option.flooronto = Sol ciblé +filter.option.target = Cible filter.option.wall = Mur filter.option.ore = Minerai filter.option.floor2 = Sol secondaire filter.option.threshold2 = Seuil secondaire filter.option.radius = Rayon -filter.option.percentile = Centile +filter.option.percentile = Pourcentage -width = Largeur: -height = Hauteur: +width = Largeur : +height = Hauteur : menu = Menu play = Jouer campaign = Campagne @@ -456,7 +498,9 @@ load = Charger save = Sauvegarder fps = FPS: {0} ping = Ping: {0}ms -language.restart = Veuillez redémarrer votre jeu pour que le changement de langue prenne effet. +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb +language.restart = Veuillez redémarrer votre jeu pour que le changement de langue prenne effet. settings = Paramètres tutorial = Tutoriel tutorial.retake = Refaire le Tutoriel @@ -466,62 +510,83 @@ mapeditor = Éditeur de carte abandon = Abandonner abandon.text = Cette zone et toutes ses ressources vont être perdues. locked = Verrouillé -complete = [lightgray]Compléter: +complete = [lightgray]Compléter : requirement.wave = Vague {0} dans {1} requirement.core = Détruire le Noyau ennemi dans {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Reprendre la partie:\n[lightgray]{0} -bestwave = [lightgray]Meilleur: {0} -launch = < LANCEMENT > -launch.text = Launch -launch.title = Lancement Réussi -launch.next = [lightgray]prochaine opportunité à la vague {0} -launch.unable2 = [scarlet]LANCEMENT impossible.[] -launch.confirm = Cela va transférer toutes les ressources de votre noyau.\nVous ne pourrez plus retourner à cette base. -launch.skip.confirm = Si vous passez à la vague suivante, vous ne pourrez pas effectuer le lancement avant les prochaines vagues. +requirement.research = Recherchez {0} +requirement.produce = Produisez {0} +requirement.capture = Capturez {0} +launch.text = Décoller +research.multiplayer = Seul l'hôte peut rechercher des objets. +map.multiplayer = Seul l'hôte peut voir les secteurs. uncover = Découvrir -configure = Modifier les ressources à emporter -loadout = Loadout -resources = Resources -bannedblocks = Blocs Bannis -addall = Ajouter TOUS +configure = Modifier le chargement + +loadout = Chargement +resources = Ressources +bannedblocks = Blocs bannis +addall = Ajouter TOUT +launch.from = Décollage depuis : [accent]{0} launch.destination = Destination: {0} -configure.invalid = Le montant doit être un nombre compris entre 0 et {0}. -zone.unlocked = [lightgray]{0} débloquée. -zone.requirement.complete = Exigences pour {0} complétées:[lightgray]\n{1} -zone.resources = [lightgray]Ressources détectées: -zone.objective = [lightgray]Objectif: [accent]{0} -zone.objective.survival = Survivre -zone.objective.attack = Détruire le noyau ennemi -add = Ajouter... -boss.health = Santé du Boss +configure.invalid = La quantité doit être un nombre compris entre 0 et {0}. +add = Ajouter +boss.health = Santé du Gardien -connectfail = [crimson]Échec de la connexion au serveur :\n\n[accent]{0} -error.unreachable = Serveur injoignable.\nL'adresse IP est-elle correcte? +connectfail = [scarlet]Échec de la connexion au serveur : \n\n[accent]{0} +error.unreachable = Serveur inaccessible.\nEst-ce que l'adresse est écrite correctement? error.invalidaddress = Adresse invalide. -error.timedout = Délai de connexion expiré!\nAssurez-vous que l'hôte a autorisé l'accès au port (port forwarding) et que l'adresse est correcte! -error.mismatch = Erreur de paquet:\nPossible différence de version entre le client et le serveur .\nVérifiez que vous et l'hôte avez la version de Mindustry la plus récente! -error.alreadyconnected = Déjà connecté(e). -error.mapnotfound = Carte introuvable! +error.timedout = Expiration du délai!\nAssurez-vous que l'ouverture des ports est configurée chez l'hôte et que l'adresse est correcte! +error.mismatch = Erreur de paquet :\nPossible incompatibilité de version client/serveur.\nAssurez-vous que l'hôte et vous disposez de la dernière version de Mindustry ! +error.alreadyconnected = Déjà connecté. +error.mapnotfound = Fichier de carte introuvable ! error.io = Erreur de Réseau (I/O) -error.any = Erreur réseau inconnue -error.bloom = Échec de l'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. +error.any = Erreur de réseau inconnue. +error.bloom = Échec de l'initialisation du flou lumineux.\nIl se peut que votre appareil ne le prenne pas en charge. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Pluie +weather.snow.name = Neige +weather.sandstorm.name = Tempête de sable +weather.sporestorm.name = Tempête de spores +weather.fog.name = Brouillard -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]Inexploré +sectors.resources = Ressources : +sectors.production = Production : +sectors.export = Exporter : +sectors.time = Temps de jeu : +sectors.threat = Menace : +sectors.wave = Vague : +sectors.stored = Stocké : +sectors.resume = Reprendre +sectors.launch = Décoller +sectors.select = Sélectionner +sectors.nonelaunch = [lightgray]Vide (soleil) +sectors.rename = Renommer le secteur +sectors.enemybase = [scarlet]Base ennemie +sectors.vulnerable = [scarlet]Vulnérable +sectors.underattack = [scarlet]Attaque en cours! [accent]{0}% endommagé +sectors.survives = [accent]Survécu à {0} vagues +sectors.go = Aller +sector.curcapture = Secteur capturé +sector.curlost = Secteur perdu +sector.missingresources = [scarlet]Ressources du Noyau insuffisantes ! +sector.attacked = Secteur [accent]{0}[white] attaqué ! +sector.lost = Secteur [accent]{0}[white] perdu ! +#note: the missing space in the line below is intentional +sector.captured = Sector [accent]{0}[white]capturé ! +threat.low = Faible +threat.medium = Normale +threat.high = Grande +threat.extreme = Extrême +threat.eradication = Éradication + +planets = Planètes + +planet.serpulo.name = Serpulo +planet.sun.name = Soleil + +sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -533,20 +598,43 @@ sector.overgrowth.name = Overgrowth sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass +sector.biomassFacility.name = Biomass Synthesis Facility +sector.windsweptIslands.name = Windswept Islands +sector.extractionOutpost.name = Extraction Outpost +sector.planetaryTerminal.name = Planetary Launch Terminal -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et le peu de ressources disponibles, rassemblez autant de cuivre et de plomb que possible pour continuer votre exploration. +sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin. +sector.saltFlats.description = À la périphérie du désert se trouvent les déserts de sel. Peu de ressources s'y trouvent.\n\nLà-bas, l'ennemi a construit un complexe de stockage de ressource. Détruisez leur Noyau et ne laissez rien debout. +sector.craters.description = Ce cratère est une relique d'anciennes guerres. De l'eau s'est accumulée au fond. Prenez le contrôle de la zone.\nCollectez du Sable et faites fondre du Verre trempé. Pompez de l'eau pour refroidir vos tourelles et vos foreuses. +sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il n’en reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie. +sector.stainedMountains.description = Plus loin, à l’intérieur des terres, se trouvent des montagnes qui n'ont pas été touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps d’envoyer leurs unités les plus fortes. +sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le. -settings.language = Langue +sector.tarFields.description = La périphérie d’une zone de production de pétrole, située entre les montagnes et le désert. L’une des rares avec des réserves de goudron utilisables.\nBien qu’abandonnée, quelques forces ennemies dangereuses se trouvent à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible. +sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu d’espace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquez de le regretter. +sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur ce minerai et ses nombreuses utilisations.\n\nL’ennemi est présent ici en grand nombre, recherchant constamment des attaquants. +sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poignards et des Rampeurs. +sector.biomassFacility.description = L’origine des spores. Il s’agit de l’installation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans l’écosystème local ne pouvait concurrencer un organisme aussi envahissant. +sector.windsweptIslands.description = Au-delà du rivage se trouve cette chaîne d’îles reculées. Les registres montrent qu’il y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines. +sector.extractionOutpost.description = Un avant-poste éloigné, construit par l’ennemi dans le but de transférer des ressources vers d’autres secteurs.\n\nCette technologie de transport inter-secteur est essentielle pour de nouvelles conquêtes. Détruisez la base et recherchez leurs Rampes de lancement. +sector.impact0078.description = Ici reposent les vestiges d'un vaisseau de transport interstellaire, premier à être entré dans ce système.\n\nRécuperez et recherchez autant de technologies que possible dans cette épave. +sector.planetaryTerminal.description = La cible finale.\n\nCette base côtière contient une structure capable de lancer des Noyaux sur les planètes voisines. Elle est extrêmement bien gardée.\n\nProduisez des unités navales, éliminez l’ennemi le plus rapidement possible et recherchez la structure de lancement. + +status.burning.name = Brûle +status.freezing.name = Gelé +status.wet.name = Humide +status.muddy.name = Boueux +status.melting.name = Fusion +status.sapped.name = Sapé +status.spore-slowed.name = Spore ralentie +status.tarred.name = Goudronné +status.overclock.name = Overclocker +status.shocked.name = Étourdie +status.blasted.name = Foudroyé +status.unmoving.name = Immobile + +settings.language = Language settings.data = Données du Jeu settings.reset = Valeurs par Défaut settings.rebind = Réattribuer @@ -556,140 +644,195 @@ settings.game = Jeu settings.sound = Son settings.graphics = Graphismes settings.cleardata = Effacer les données du jeu... -settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour en arrière n'est possible! -settings.clearall.confirm = [scarlet]ATTENTION![]\nCette action effacera toutes les données, y compris les sauvegardes, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'OK' le jeu effacera TOUTES les données et se fermera. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clear.confirm = Êtes-vous sûr de vouloir effacer ces données?\nAucun retour en arrière n'est possible ! +settings.clearall.confirm = [scarlet]ATTENTION ![]\nCette action effacera toutes les données, y compris les sauvegardes, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'OK', le jeu effacera TOUTES les données et se fermera. +settings.clearsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes vos sauvegardes? +settings.clearsaves = Supprimer les Sauvegardes +settings.clearresearch = Supprimer la Recherche +settings.clearresearch.confirm = Êtes-vous sûr de vouloir supprimer toutes les recherches de la campagne ? +settings.clearcampaignsaves = Supprimer la Campagne +settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne ? paused = [accent]< Pause > clear = Effacer -banned = [scarlet]Bannis -unplaceable.sectorcaptured = [scarlet]Nécessite la capture du secteur +banned = [scarlet]Banni yes = Oui no = Non info.title = Info -error.title = [crimson]Une erreur s'est produite +error.title = [scarlet]Une erreur s'est produite error.crashtitle = Une erreur s'est produite -unit.nobuild = [scarlet]Cette unité ne peut construire -blocks.input = Entrée -blocks.output = Sortie -blocks.booster = Booster -blocks.tiles = Pré-requis -blocks.affinities = Affinités +unit.nobuild = [scarlet]Cette unité ne peut pas construire +lastaccessed = [lightgray]Dernier accès : {0} block.unknown = [lightgray]??? -blocks.powercapacity = Capacité d'énergie -blocks.powershot = Énergie/Tir -blocks.damage = Dégâts -blocks.targetsair = Cibles Aériennes -blocks.targetsground = Cibles Terrestres -blocks.itemsmoved = Vitesse de Déplacement -blocks.launchtime = Temps entre chaque lancement -blocks.shootrange = Portée de tir -blocks.size = Taille -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacité liquide -blocks.powerrange = Portée électrique -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Nombre maximal de connections -blocks.poweruse = Énergie utilisée -blocks.powerdamage = Dégâts d'énergie -blocks.itemcapacity = Stockage -blocks.basepowergeneration = Production d'énergie -blocks.productiontime = Durée de production -blocks.repairtime = Durée de réparation complète du Bloc -blocks.speedincrease = Accélération -blocks.range = Portée -blocks.drilltier = Forable -blocks.drillspeed = Vitesse de forage de base -blocks.boosteffect = Effet du Boost -blocks.maxunits = Unités actives max -blocks.health = Santé -blocks.buildtime = Durée de construction -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Coût de construction -blocks.inaccuracy = Imprécision -blocks.shots = Tirs -blocks.reload = Tirs/Seconde -blocks.ammo = Munitions -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = Description +stat.input = Ressource(s) requise(s) +stat.output = Ressource(s) produite(s) +stat.booster = Boosteur +stat.tiles = Sol requis +stat.affinities = Affinités +stat.opposites = Opposés +stat.powercapacity = Capacité d'énergie +stat.powershot = Unités d'énergie/Tir +stat.damage = Dégâts +stat.targetsair = Cibles Aériennes +stat.targetsground = Cibles Terrestres +stat.itemsmoved = Vitesse de Déplacement +stat.launchtime = Temps entre chaque lancement +stat.shootrange = Portée de tir +stat.size = Taille +stat.displaysize = Résolution +stat.liquidcapacity = Capacité liquide +stat.powerrange = Portée électrique +stat.linkrange = Portée des liens +stat.instructions = Instructions +stat.powerconnections = Nombre maximal de connections +stat.poweruse = Énergie utilisée +stat.powerdamage = Unités d'énergie/Dégât +stat.itemcapacity = Stockage +stat.memorycapacity = Mémoire +stat.basepowergeneration = Production d'énergie de Base +stat.productiontime = Durée de production +stat.repairtime = Durée de la réparation complète d'un Bloc +stat.weapons = Armes +stat.bullet = Balles +stat.speedincrease = Accélération +stat.range = Portée +stat.drilltier = Forable +stat.drillspeed = Vitesse de forage de Base +stat.boosteffect = Effet(s) du Boost +stat.maxunits = Max d'Unités Actives +stat.health = Santé +stat.armor = Armure +stat.buildtime = Durée de construction +stat.maxconsecutive = Max Consécutif +stat.buildcost = Coût de construction +stat.inaccuracy = Précision +stat.shots = Tirs +stat.reload = Tirs/Seconde +stat.ammo = Munitions +stat.shieldhealth = Santé du bouclier +stat.cooldowntime = Temps de refroidissement +stat.explosiveness = Explosivité +stat.basedeflectchance = Chance de Détournement de Base +stat.lightningchance = Chance d'Éclairs +stat.lightningdamage = Dégâts des Éclairs +stat.flammability = Inflammabilité +stat.radioactivity = Radioactivité +stat.charge = Charge +stat.heatcapacity = Capacité Thermique +stat.viscosity = Viscosité +stat.temperature = Température +stat.speed = Vitesse +stat.buildspeed = Vitesse de construction +stat.minespeed = Vitesse de minage +stat.minetier = Niveau de minage +stat.payloadcapacity = Capacité de chargement +stat.commandlimit = Limite de contrôle +stat.abilities = Abilités +stat.canboost = Boost +stat.flying = Unité volante +stat.ammouse = Utilisation de munitions +stat.damagemultiplier = Multiplicateur de dégâts +stat.healthmultiplier = Multiplicateur de santé +stat.speedmultiplier = Multiplicateur de vitesse +stat.reloadmultiplier = Multiplicateur de rechargement +stat.buildspeedmultiplier = Multiplicateur de vitesse de construction +stat.reactive = Reacts + +ability.forcefield = Champ de Force +ability.repairfield = Champ de Réparation +ability.statusfield = Champ d'Amélioration +ability.unitspawn = Usine de {0} +ability.shieldregenfield = Champ de régénération de bouclier +ability.movelightning = Déplacement éclair bar.drilltierreq = Meilleure Foreuse Requise -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Ressources manquantes +bar.corereq = Noyau de base requis bar.drillspeed = Vitesse de Forage: {0}/s bar.pumpspeed = Vitesse de Pompage: {0}/s bar.efficiency = Efficacité: {0}% +bar.boost = Boost: {0}% bar.powerbalance = Énergie: {0}/s -bar.powerstored = En stock: {0}/{1} +bar.powerstored = Réserves d'Énergie: {0}/{1} bar.poweramount = Énergie: {0} bar.poweroutput = Énergie Produite: {0} +bar.powerlines = Connexions: {0}/{1} bar.items = Objets: {0} bar.capacity = Capacité: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] -bar.liquid = Liquide +bar.liquid = Liquides bar.heat = Chaleur bar.power = Énergie -bar.progress = Progression de la construction +bar.progress = Construction en cours bar.input = Entrée bar.output = Sortie +units.processorcontrol = [lightgray]Contrôlé par un processeur. + bullet.damage = [stat]{0}[lightgray] dégâts bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs bullet.incendiary = [stat]incendiaire bullet.homing = [stat]autoguidé -bullet.shock = [stat]choc électrique -bullet.frag = [stat]explosif +bullet.frag = [stat]fragmentation +bullet.lightning = [stat]{0}[lightgray]x lightning ~ [stat]{1}[lightgray] damage +bullet.buildingdamage = [stat]{0}%[lightgray] des dégâts aux bâtiments bullet.knockback = [stat]{0}[lightgray] recul -bullet.freezing = [stat]gel -bullet.tarred = [stat]goudronné +bullet.pierce = [stat]{0}[lightgray]x perforant +bullet.infinitepierce = [stat]perforant +bullet.healpercent = [stat]{0}[lightgray]% soins bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions bullet.reload = [stat]{0}[lightgray]x vitesse de tir unit.blocks = blocs -unit.powersecond = énergie/seconde -unit.liquidsecond = unité de liquide/seconde +unit.blockssquared = blocs² +unit.powersecond = unités d'énergie/seconde +unit.liquidsecond = unités de liquide/seconde unit.itemssecond = objets/seconde -unit.liquidunits = unité de liquide -unit.powerunits = unité d'énergie +unit.liquidunits = unités de liquide +unit.powerunits = unités d'énergie unit.degrees = degrés unit.seconds = secondes -unit.minutes = mins +unit.minutes = minutes unit.persecond = /sec unit.perminute = /min unit.timesspeed = x vitesse unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = santé du bouclier unit.items = objets unit.thousands = k -unit.millions = M -unit.billions = b -category.general = Général +unit.millions = mil +unit.billions = Md +unit.pershot = /tirs +category.purpose = Description +category.general = Caractéristiques category.power = Énergie category.liquids = Liquides category.items = Objets category.crafting = Fabrication -category.shooting = Puissance de feu -category.optional = Améliorations optionnelles -setting.landscape.name = Verrouiller en rotation paysage +category.function = Fonction +category.optional = Améliorations facultatives +setting.landscape.name = Verrouiller la rotation en mode paysage setting.shadows.name = Ombres -setting.blockreplace.name = Suggestions Automatiques de Blocs -setting.linear.name = Filtrage Linéaire +setting.blockreplace.name = Suggestion automatique des Blocs +setting.linear.name = Filtrage linéaire setting.hints.name = Astuces -setting.flow.name = Afficher le Débit des Ressources -setting.buildautopause.name = Confirmation avant la construction -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Eau animée +setting.logichints.name = Astuces pour les commandes des processeurs +setting.flow.name = Afficher le Débit des ressources +setting.backgroundpause.name = Pause en Arrière-plan +setting.buildautopause.name = Confirmation avant construction +setting.doubletapmine.name = Double-clic pour Miner +setting.modcrashdisable.name = Désactiver les mods lors d'un crash au démarrage +setting.animatedwater.name = Surfaces Animées setting.animatedshields.name = Boucliers Animés setting.antialias.name = Anticrénelage[lightgray] (redémarrage du jeu nécessaire)[] -setting.playerindicators.name = Indicateurs des Joueurs -setting.indicators.name = Indicateurs des Ennemis +setting.playerindicators.name = Indicateurs alliés +setting.indicators.name = Indicateurs ennemis setting.autotarget.name = Visée automatique setting.keyboard.name = Contrôles Souris+Clavier setting.touchscreen.name = Commandes d'écran tactile -setting.fpscap.name = FPS Max -setting.fpscap.none = Aucun +setting.fpscap.name = Max FPS +setting.fpscap.none = Illimité setting.fpscap.text = {0} FPS setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[] setting.swapdiagonal.name = Autoriser le placement en diagonale @@ -701,66 +844,66 @@ setting.difficulty.insane = Extrême setting.difficulty.name = Difficulté: setting.screenshake.name = Tremblement de l'Écran setting.effects.name = Afficher les Effets -setting.destroyedblocks.name = Afficher les Blocs Détruits +setting.destroyedblocks.name = Afficher les Blocs détruits setting.blockstatus.name = Afficher le Statut des Blocs -setting.conveyorpathfinding.name = Auto-placement Intelligent des Convoyeurs +setting.conveyorpathfinding.name = Placement intelligent des Convoyeurs setting.sensitivity.name = Sensibilité de la manette -setting.saveinterval.name = Intervalle des Sauvegardes Automatiques +setting.saveinterval.name = Intervalle des Sauvegardes automatiques setting.seconds = {0} secondes -setting.blockselecttimeout.name = Délai d'Attente de Sélection de Bloc setting.milliseconds = {0} millisecondes setting.fullscreen.name = Plein Écran -setting.borderlesswindow.name = Fenêtre sans bords (Borderless)[lightgray] (peut nécessiter le redémarrage du jeu) +setting.borderlesswindow.name = Fenêtre sans bords[lightgray] (peut nécessiter le redémarrage du jeu) setting.fps.name = Afficher FPS et Ping setting.smoothcamera.name = Lissage de la Caméra -setting.blockselectkeys.name = Afficher les Touches pour Sélectionner les Blocs avec un Clavier -setting.vsync.name = VSync -setting.pixelate.name = Pixeliser[lightgray] (désactive les animations) -setting.minimap.name = Afficher la Minimap -setting.coreitems.name = Display Core Items (WIP) +setting.vsync.name = Synchronisation Verticale +setting.pixelate.name = Pixeliser +setting.minimap.name = Afficher la Mini-carte +setting.coreitems.name = Afficher les objets du Noyau setting.position.name = Afficher la position du joueur -setting.musicvol.name = Volume Musique -setting.atmosphere.name = Son atmosphérique de la planète +setting.musicvol.name = Volume de la Musique +setting.atmosphere.name = Montrer l'Atmosphère de la planète setting.ambientvol.name = Volume Ambiant setting.mutemusic.name = Couper la Musique -setting.sfxvol.name = Volume des Effets Spéciaux -setting.mutesound.name = Couper le son des Effets Spéciaux -setting.crashreport.name = Envoyer des Rapports de Crash anonymes +setting.sfxvol.name = Volume des Sons et Effets +setting.mutesound.name = Couper les Sons et Effets +setting.crashreport.name = Envoyer des Rapports de crash anonymes setting.savecreate.name = Sauvegardes Automatiques -setting.publichost.name = Visibilité de la Partie Publique +setting.publichost.name = Visibilité de la Partie publique setting.playerlimit.name = Limite de Joueurs setting.chatopacity.name = Opacité du Chat -setting.lasersopacity.name = Opacité des Connections Laser +setting.lasersopacity.name = Opacité des Connexions laser setting.bridgeopacity.name = Opacité des ponts setting.playerchat.name = Montrer les bulles de discussion des joueurs -public.confirm = Voulez-vous rendre votre partie publique?\n[accent]N'importe qui pourrait rejoindre vos parties.\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique -public.beta = Notez que les versions bêta du jeu ne peuvent pas créer des salons publics. -uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement des paramètres d'avant et fermeture dans [accent] {0}[]... +setting.showweather.name = Montrer les Effets météo +public.confirm = Voulez-vous rendre votre partie publique ?\n[accent]N'importe qui pourra rejoindre vos parties.\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique +public.confirm.really = Si vous voulez jouer avec des amis, utilisez [green]Inviter un Ami[] Au lieu [scarlet]d'un Serveur Public[] !\nÊtes-vous sûrs de vouloir rendre votre partie [scarlet]publique[] ? +public.beta = Notez que les versions bêta du jeu ne peuvent pas créer de salons publics. +uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement des anciens paramètres et fermeture du jeu dans [accent] {0}[] secondes... uiscale.cancel = Annuler & Quitter setting.bloom.name = Flou lumineux -keybind.title = Raccourcis Clavier -keybinds.mobile = [scarlet]La plupart des raccourcis clavier ne sont pas fonctionnels sur mobile. Seuls les mouvements basiques sont supportés. +keybind.title = Paramètres des Touches du Clavier +keybinds.mobile = [scarlet]La plupart des touches de clavier ne sont pas fonctionnelles sur mobile. Seuls les mouvements basiques sont supportés. category.general.name = Général category.view.name = Voir category.multiplayer.name = Multijoueur -category.blocks.name = Block Select -command.attack = Attaque -command.rally = Rassembler +category.blocks.name = Sélection des blocs +command.attack = Attaquer +command.rally = Rallier command.retreat = Retraite -command.idle = Idle -placement.blockselectkeys = \n[lightgray]Touche: [{0}, -keybind.respawn.name = Réapparaitre -keybind.control.name = Controler une Unité -keybind.clear_building.name = Effacer les constructions -keybind.press = Appuyez sur une touche... -keybind.press.axis = Appuyez sur un axe ou une touche... -keybind.screenshot.name = Capture d'écran -keybind.toggle_power_lines.name = Montrer/Cacher les Connections d'Énergie -keybind.toggle_block_status.name = Montrer/Cacher les Status des Blocs -keybind.move_x.name = Mouvement X -keybind.move_y.name = Mouvement Y -keybind.mouse_move.name = Suivre la Souris -keybind.pan.name = Pan View +command.idle = Inactif +placement.blockselectkeys = \n[lightgray]Raccourci : [{0}, +keybind.respawn.name = Réapparaître +keybind.control.name = Contrôler une Unité +keybind.clear_building.name = Réinitialiser les constructions +keybind.press = Pressez une touche... +keybind.press.axis = Pressez un axe ou une touche... +keybind.screenshot.name = Capture d'écran de la carte +keybind.toggle_power_lines.name = Montrer/Cacher les Connexions d'Énergie +keybind.toggle_block_status.name = Montrer/Cacher le Statut des Blocs +keybind.move_x.name = Mouvement axe X +keybind.move_y.name = Mouvement axe Y +keybind.mouse_move.name = Suivre la souris +keybind.pan.name = Vue Panoramique keybind.boost.name = Boost keybind.schematic_select.name = Sélectionner une Région keybind.schematic_menu.name = Menu des schémas @@ -768,10 +911,10 @@ keybind.schematic_flip_x.name = Retourner le schéma sur l'axe des X keybind.schematic_flip_y.name = Retourner le schéma sur l'axe des Y keybind.category_prev.name = Catégorie Précédente keybind.category_next.name = Catégorie Suivante -keybind.block_select_left.name = Sélectionner Bloc de Gauche -keybind.block_select_right.name = Sélectionner Bloc de Droite -keybind.block_select_up.name = Sélectionner Bloc en Haut -keybind.block_select_down.name = Sélectionner Bloc en Bas +keybind.block_select_left.name = Sélectionner le Bloc de Gauche +keybind.block_select_right.name = Sélectionner le Bloc de Droite +keybind.block_select_up.name = Sélectionner le Bloc en Haut +keybind.block_select_down.name = Sélectionner le Bloc en Bas keybind.block_select_01.name = Sélectionner Catégorie/Bloc 1 keybind.block_select_02.name = Sélectionner Catégorie/Bloc 2 keybind.block_select_03.name = Sélectionner Catégorie/Bloc 3 @@ -788,76 +931,89 @@ keybind.diagonal_placement.name = Placement en diagonale keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Désélectionner -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Prendre un Chargement +keybind.dropCargo.name = Lâcher un Chargement +keybind.command.name = Commander keybind.shoot.name = Tirer -keybind.zoom.name = Zoomer +keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause -keybind.pause_building.name = Pauser/Reprendre la construction -keybind.minimap.name = Minimap -keybind.chat.name = Chat -keybind.player_list.name = Liste des Joueurs +keybind.pause_building.name = Pauser/Reprendre la Construction +keybind.minimap.name = Mini-carte +keybind.planet_map.name = Carte de la Planète +keybind.research.name = Recherche +keybind.block_info.name = Bloc information +keybind.chat.name = Tchat +keybind.player_list.name = Liste des joueurs keybind.console.name = Console keybind.rotate.name = Tourner -keybind.rotateplaced.name = Tourner un bloc existant (maintenir) +keybind.rotateplaced.name = Tourner un Bloc existant (maintenir) keybind.toggle_menus.name = Cacher/Afficher les Menus -keybind.chat_history_prev.name = Remonter l'Historique du Chat -keybind.chat_history_next.name = Descendre l'Historique du Chat -keybind.chat_scroll.name = Défilement du Chat -keybind.drop_unit.name = Larguer l'unité -keybind.zoom_minimap.name = Zoom Minimap +keybind.chat_history_prev.name = Remonter l'Historique du Tchat +keybind.chat_history_next.name = Descendre l'Historique du Tchat +keybind.chat_scroll.name = Défilement du Tchat +keybind.chat_mode.name = Changer le mode du Tchat +keybind.drop_unit.name = Larguer une unité +keybind.zoom_minimap.name = Zoomer la Mini-carte mode.help.title = Description des modes de jeu mode.survival.name = Survie -mode.survival.description = Le mode normal. Ressources limitées et vagues d'Ennemis automatiques.\n[gray]Nécessite un point d'apparition ennemi pour y jouer. -mode.sandbox.name = Bac à sable -mode.sandbox.description = Ressources infinies et pas de minuterie pour les vagues. +mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Requiert des points d'apparition ennemis pour pouvoir jouer à ce mode. +mode.sandbox.name = Bac à Sable +mode.sandbox.description = Ressources infinies et pas de compte à rebours pour les vagues. mode.editor.name = Éditeur -mode.pvp.name = PvP -mode.pvp.description = Battez-vous contre d'autres joueurs en local.\n[gray]Requiert aux moins 2 noyaux de couleurs différentes dans la carte pour y jouer. +mode.pvp.name = JcJ +mode.pvp.description = Lutter contre d'autres joueurs pour gagner !\n[gray]Requiert au moins 2 Noyaux de couleurs différentes pour pouvoir jouer à ce mode. mode.attack.name = Attaque -mode.attack.description = Pas de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un noyau rouge dans la map pour y jouer. -mode.custom = Règles personnalisées +mode.attack.description = Pas forcément de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un Noyau rouge pour jouer à ce mode. +mode.custom = Règles Personnalisées -rules.infiniteresources = Ressources infinies +rules.infiniteresources = Ressources Infinies rules.reactorexplosions = Explosion des Réacteurs -rules.wavetimer = Minuterie pour les vagues +rules.coreincinerates = Incinération des surplus du Noyau +rules.schematic = Schémas autorisés +rules.wavetimer = Compte à rebours des vagues rules.waves = Vagues rules.attack = Mode « Attaque » -rules.buildai = AI Building +rules.buildai = Constructions de l'IA rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge) rules.blockhealthmultiplier = Multiplicateur de Santé des Blocs rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs -rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction d'Unités +rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités rules.unithealthmultiplier = Multiplicateur de Santé des Unités rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités -rules.enemycorebuildradius = Périmètre de non-construction autour du noyau ennemi:[lightgray] (blocs) -rules.wavespacing = Espacement des vagues:[lightgray] (sec) +rules.unitcapvariable = Les Noyaux contribuent à la limite d'Unités actives +rules.unitcap = Limite d'Unités actives de Base +rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi :[lightgray] (blocs) +rules.wavespacing = Temps entre les Vagues :[lightgray] (sec) rules.buildcostmultiplier = Multiplicateur du prix de construction rules.buildspeedmultiplier = Multiplicateur du temps de construction rules.deconstructrefundmultiplier = Multiplicateur du remboursement lors de la déconstruction -rules.waitForWaveToEnd = Les Vagues Attendent la Mort des Ennemis -rules.dropzoneradius = Rayon d'Apparition des Ennemis:[lightgray] (tuiles) -rules.unitammo = Les Unités Nécessitent des Munitions +rules.waitForWaveToEnd = Les Vagues attendent la mort des ennemis +rules.dropzoneradius = Rayon d'Apparition des ennemis :[lightgray] (tuiles) +rules.unitammo = Les Unités nécessitent des munitions rules.title.waves = Vagues -rules.title.resourcesbuilding = Ressources & Construction +rules.title.resourcesbuilding = Resources & Construction rules.title.enemy = Ennemis rules.title.unit = Unités rules.title.experimental = Expérimental -rules.title.environment = Environment +rules.title.environment = Environnement rules.lighting = Éclairage -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Éclairage ennemi +rules.fire = Feu +rules.explosions = Dégâts d'explosion des Blocs/Unités rules.ambientlight = Éclairage Ambiant -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Météo +rules.weather.frequency = Fréquence : +rules.weather.always = Permanent +rules.weather.duration = Durée : content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités content.block.name = Blocs +content.status.name = Effet +content.sector.name = Secteurs + item.copper.name = Cuivre item.lead.name = Plomb item.coal.name = Charbon @@ -868,7 +1024,7 @@ item.silicon.name = Silicium item.plastanium.name = Plastanium item.phase-fabric.name = Tissu Phasé item.surge-alloy.name = Alliage Superchargé -item.spore-pod.name = Glande de Spore +item.spore-pod.name = Spore item.sand.name = Sable item.blast-compound.name = Mélange Explosif item.pyratite.name = Pyratite @@ -879,25 +1035,8 @@ liquid.slag.name = Scories liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide Cryogénique -item.explosiveness = [lightgray]Explosivité: {0} -item.flammability = [lightgray]Inflammabilité: {0} -item.radioactivity = [lightgray]Radioactivité: {0} - -unit.health = [lightgray]Santé: {0} -unit.speed = [lightgray]Vitesse: {0} -unit.weapon = [lightgray]Arme: {0} -unit.itemcapacity = [lightgray]Stockage: {0} -unit.minespeed = [lightgray]Vitesse de Minage: {0}% -unit.minepower = [lightgray]Puissance de Minage: {0} -unit.ability = [lightgray]Abilité: {0} -unit.buildspeed = [lightgray]Vitesse de Construction: {0}% - -liquid.heatcapacity = [lightgray]Capacité Thermique: {0} -liquid.viscosity = [lightgray]Viscosité: {0} -liquid.temperature = [lightgray]Température: {0} - unit.dagger.name = Poignard -unit.mace.name = Mace +unit.mace.name = Titan unit.fortress.name = Forteresse unit.nova.name = Nova unit.pulsar.name = Pulsar @@ -911,7 +1050,7 @@ unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse +unit.eclipse.name = Éclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega @@ -925,87 +1064,90 @@ unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign +unit.scepter.name = Destructeur +unit.reign.name = Éradicateur unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Resupply Point +block.resupply-point.name = Point de Rechargement block.parallax.name = Parallax block.cliff.name = Falaise block.sand-boulder.name = Bloc de Sable +block.basalt-boulder.name = Rocher de Basalte block.grass.name = Herbe block.slag.name = Scories +block.space.name = Espace block.salt.name = Sel -block.salt-wall.name = Salt Wall +block.salt-wall.name = Mur de Sel block.pebbles.name = Cailloux block.tendrils.name = Vrilles -block.sand-wall.name = Sand Wall +block.sand-wall.name = Mur de Sable block.spore-pine.name = Pin Sporeux -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Mur de Spores +block.boulder.name = Rocher +block.snow-boulder.name = Bloc de Neige block.snow-pine.name = Pin enneigé block.shale.name = Schiste block.shale-boulder.name = Blocs de Schiste block.moss.name = Mousse block.shrubs.name = Arbustes -block.spore-moss.name = Mousse Sporeuse -block.shale-wall.name = Shale Wall +block.spore-moss.name = Mousse Sporifère +block.shale-wall.name = Mur de Schiste block.scrap-wall.name = Mur de Ferraille block.scrap-wall-large.name = Grand Mur de Ferraille block.scrap-wall-huge.name = Énorme Mur de Ferraille block.scrap-wall-gigantic.name = Gigantesque Mur de Ferraille block.thruster.name = Propulseur -block.kiln.name = Four +block.kiln.name = Four à Verre block.graphite-press.name = Presse à Graphite block.multi-press.name = Multi-Presse -block.constructing = {0}\n[lightgray](En Construction) +block.constructing = {0} [lightgray](En Construction) block.spawn.name = Point d'Apparition Ennemi -block.core-shard.name = Noyau: Tesson +block.core-shard.name = Noyau: Fragment block.core-foundation.name = Noyau: Fondation block.core-nucleus.name = Noyau: Épicentre block.deepwater.name = Eau profonde block.water.name = Eau block.tainted-water.name = Eau Contaminée -block.darksand-tainted-water.name = Eau Contaminée avec fond de Sable Sombre +block.darksand-tainted-water.name = Eau Contaminée avec fond de Sable sombre block.tar.name = Goudron block.stone.name = Roche block.sand.name = Sable -block.darksand.name = Sable Sombre +block.darksand.name = Sable sombre block.ice.name = Glace block.snow.name = Neige block.craters.name = Cratères block.sand-water.name = Eau avec fond de Sable -block.darksand-water.name = Eau avec fond de Sable Sombre -block.char.name = Cendre +block.darksand-water.name = Eau avec fond de Sable sombre +block.char.name = Cendres block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite-wall.name = Mur de Dacite +block.dacite-boulder.name = Rocher de Dacite block.ice-snow.name = Neige et Glace -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = Mur de Pierre +block.ice-wall.name = Mur de Glace +block.snow-wall.name = Mur de Neige +block.dune-wall.name = Mur de Sable sombre block.pine.name = Pin -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Terre +block.dirt-wall.name = Mur de Terre +block.mud.name = Boue block.white-tree-dead.name = Arbre Blanc Mort block.white-tree.name = Arbre Blanc -block.spore-cluster.name = Grappe de Spores -block.metal-floor.name = Plancher Métallique 1 -block.metal-floor-2.name = Plancher Métallique 2 -block.metal-floor-3.name = Plancher Métallique 3 -block.metal-floor-5.name = Plancher Métallique 4 -block.metal-floor-damaged.name = Plancher Métallique Endommagé -block.dark-panel-1.name = Panneau Sombre 1 -block.dark-panel-2.name = Panneau Sombre 2 -block.dark-panel-3.name = Panneau Sombre 3 -block.dark-panel-4.name = Panneau Sombre 4 -block.dark-panel-5.name = Panneau Sombre 5 -block.dark-panel-6.name = Panneau Sombre 6 -block.dark-metal.name = Métal Sombre -block.basalt.name = Basalt +block.spore-cluster.name = Grappes de Spores +block.metal-floor.name = Sol métallique +block.metal-floor-2.name = Sol métallique 2 +block.metal-floor-3.name = Sol métallique 3 +block.metal-floor-5.name = Sol métallique 5 +block.metal-floor-damaged.name = Sol métallique endommagé +block.dark-panel-1.name = Panneau sombre 1 +block.dark-panel-2.name = Panneau sombre 2 +block.dark-panel-3.name = Panneau sombre 3 +block.dark-panel-4.name = Panneau sombre 4 +block.dark-panel-5.name = Panneau sombre 5 +block.dark-panel-6.name = Panneau sombre 6 +block.dark-metal.name = Métal sombre +block.basalt.name = Basalte block.hotrock.name = Roches Chaudes block.magmarock.name = Roches Magmatiques block.copper-wall.name = Mur de Cuivre @@ -1029,15 +1171,13 @@ block.conveyor.name = Convoyeur block.titanium-conveyor.name = Convoyeur en Titane block.plastanium-conveyor.name = Convoyeur en Plastanium block.armored-conveyor.name = Convoyeur Cuirassé -block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés. block.junction.name = Jonction block.router.name = Routeur block.distributor.name = Distributeur block.sorter.name = Trieur block.inverted-sorter.name = Trieur Inversé -block.message.name = Message +block.message.name = Bloc de Message block.illuminator.name = Illuminateur -block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner. block.overflow-gate.name = Barrière de Débordement block.underflow-gate.name = Barrière de Refoulement block.silicon-smelter.name = Fonderie de Silicium @@ -1046,7 +1186,7 @@ block.pulverizer.name = Pulvérisateur block.cryofluid-mixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur -block.spore-press.name = Presse à Spore +block.spore-press.name = Presse à Spores block.separator.name = Séparateur block.coal-centrifuge.name = Centrifugeuse à Charbon block.power-node.name = Transmetteur Énergétique @@ -1060,7 +1200,7 @@ block.steam-generator.name = Générateur à Turbine block.differential-generator.name = Générateur Différentiel block.impact-reactor.name = Réacteur à Impact block.mechanical-drill.name = Foreuse Mécanique -block.pneumatic-drill.name = Foreuse à Vérin +block.pneumatic-drill.name = Foreuse Pneumatique block.laser-drill.name = Foreuse Laser block.water-extractor.name = Extracteur d'Eau block.cultivator.name = Cultivateur @@ -1074,14 +1214,15 @@ block.power-void.name = Absorbeur Énergétique block.power-source.name = Source d'Énergie block.unloader.name = Déchargeur block.vault.name = Coffre-Fort -block.wave.name = Onde -block.swarmer.name = Nuée +block.wave.name = Vague +block.tsunami.name = Tsunami +block.swarmer.name = Essaim block.salvo.name = Salve -block.ripple.name = Percussion +block.ripple.name = Percuteur block.phase-conveyor.name = Convoyeur Phasé block.bridge-conveyor.name = Pont block.plastanium-compressor.name = Compresseur de Plastanium -block.pyratite-mixer.name = Mixeur de Pyratite +block.pyratite-mixer.name = Mixeur à Pyratite block.blast-mixer.name = Mixeur à Explosion block.solar-panel.name = Panneau Solaire block.solar-panel-large.name = Grand Panneau Solaire @@ -1090,216 +1231,460 @@ block.repair-point.name = Point de Réparation block.pulse-conduit.name = Conduit à Impulsion block.plated-conduit.name = Conduit Plaqué block.phase-conduit.name = Conduit Phasé -block.liquid-router.name = Routeur de Liquide -block.liquid-tank.name = Réservoir à Liquide -block.liquid-junction.name = Jonction à Liquide -block.bridge-conduit.name = Conduit Surélevé +block.liquid-router.name = Routeur de Liquides +block.liquid-tank.name = Réservoir à Liquides +block.liquid-junction.name = Jonction à Liquides +block.bridge-conduit.name = Pont à Liquide block.rotary-pump.name = Pompe Rotative block.thorium-reactor.name = Réacteur à Thorium -block.mass-driver.name = Catapulte Électromagnétique -block.blast-drill.name = Foreuse à Explosion -block.thermal-pump.name = Pompe Thermique -block.thermal-generator.name = Générateur Thermique +block.mass-driver.name = Transporteur de masse +block.blast-drill.name = Foreuse à explosion +block.thermal-pump.name = Pompe thermique +block.thermal-generator.name = Générateur thermique block.alloy-smelter.name = Fonderie d'Alliage Superchargé -block.mender.name = Réparateur -block.mend-projector.name = Projecteur Soignant +block.mender.name = Gardien +block.mend-projector.name = Projecteur soignant block.surge-wall.name = Mur Superchargé -block.surge-wall-large.name = Grand Mur Superchargé +block.surge-wall-large.name = Grand mur Superchargé block.cyclone.name = Cyclone block.fuse.name = Fusible -block.shock-mine.name = Mine -block.overdrive-projector.name = Projecteur Surmultiplicateur -block.force-projector.name = Champ de Force +block.shock-mine.name = Mine terrestre +block.overdrive-projector.name = Projecteur Accélérant +block.force-projector.name = Projecteur de Champ de force block.arc.name = Arc -block.rtg-generator.name = Générateur G.T.R. +block.rtg-generator.name = G.T.R block.spectre.name = Spectre block.meltdown.name = Fusion +block.foreshadow.name = Présage block.container.name = Conteneur -block.launch-pad.name = Plateforme de Lancement -block.launch-pad-large.name = Grande Plateforme de Lancement -block.segment.name = Diviseur -block.command-center.name = Command Center -block.ground-factory.name = Usine d'Unité Terrestre -block.air-factory.name = Usine d'Unité Aérienne -block.naval-factory.name = Usine d'Unité Navale +block.launch-pad.name = Rampe de lancement +block.launch-pad-large.name = Grande rampe de lancement +block.segment.name = Diviseur +block.command-center.name = Centre de Commande +block.ground-factory.name = Usine d'Unités Terrestres +block.air-factory.name = Usine d'Unités Aériennes +block.naval-factory.name = Usine d'Unités Navales block.additive-reconstructor.name = Reconstructeur Additif block.multiplicative-reconstructor.name = Reconstructeur Multiplicatif block.exponential-reconstructor.name = Reconstructeur Exponentiel block.tetrative-reconstructor.name = Reconstructeur Tétratif block.payload-conveyor.name = Convoyeur de Masse -block.payload-router.name = Routeur de Charge Utile -block.disassembler.name = Disassembler -block.silicon-crucible.name = Creuset de Silicium -block.overdrive-dome.name = Overdrive Dome +block.payload-router.name = Routeur de Masse +block.disassembler.name = Désassembleur +block.silicon-crucible.name = Grande Fonderie de Silicium +block.overdrive-dome.name = Dôme Accélérant +#experimental, may be removed +block.block-forge.name = Forgeur de Blocs +block.block-loader.name = Chargeur de Blocs +block.block-unloader.name = Déchargeur de Blocs +block.interplanetary-accelerator.name = Accélérateur Interplanétaire -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Interrupteur +block.micro-processor.name = Micro Processeur +block.logic-processor.name = Processeur +block.hyper-processor.name = Hyper Processeur +block.logic-display.name = Écran +block.large-logic-display.name = Grand Écran +block.memory-cell.name = Cellule de mémoire +block.memory-bank.name = Banque de mémoire team.blue.name = bleu team.crux.name = rouge -team.sharded.name = jaune +team.sharded.name = orange team.orange.name = orange team.derelict.name = abandonné team.green.name = vert -team.purple.name = violet +team.purple.name = mauve -tutorial.next = [lightgray] -tutorial.intro = Bienvenue sur le [scarlet]Tutoriel de Mindustry![]\nUtilisez [accent][[ZQSD ou WASD][] pour vous déplacer.\nFaites [accent]rouler[] la molette de la souris pour zoomer et dézoomer.\nCommencez en minant du [accent]cuivre[]. Pour cela, allez près de votre noyau, puis faites un clic gauche sur un minerai de cuivre.\n\n[accent]{0}/{1} cuivre -tutorial.intro.mobile = Bienvenue sur le [scarlet]Tutoriel de Mindustry![]\nBalayez l'écran pour vous déplacer.\n[accent] Pincez avec deux doigts [] pour zoomer et dézoomer.\nCommencez en[accent] minant du cuivre[]. Pour cela, allez près de votre noyau, puis appuyez sur un minerai de cuivre.\n\n[accent]{0}/{1} cuivre -tutorial.drill = Miner manuellement est inefficace.\nLes [accent]foreuses []peuvent miner pour vous.\nCliquez sur l'onglet des foreuses en bas à droite.\nSélectionnez la [accent]foreuse mécanique[]. Placez-la ensuite sur des minerais de cuivre avec un clic-gauche.\nVous pouvez aussi sélectionner la foreuse en appuyant sur [accent][[2][] et [accent][[1][] rapidement, peu importe l'onglet ouvert.\n[accent]Faites un clic-droit[] pour arrêter la construction. -tutorial.drill.mobile = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nAppuyez sur l'onglet des foreuses en bas à droite.\nSélectionnez la [accent]foreuse mécanique[].\nPlacez-la sur des minerais de cuivre en appuyant dessus, puis en touchant la[accent] coche[] pour confirmer votre placement.\nAppuyez sur le [accent]bouton X[] pour annuler le placement. -tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut miner que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc, appuyez sur le [accent]bouton "?" tout en le sélectionnant dans le menu de construction.[]\n\n[accent]Maintenant, essayez d'accéder aux statistiques de la foreuse mécanique.[] -tutorial.conveyor = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaites une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent]Maintenez votre souris pour les placer en ligne.[]\nGardez la touche[accent] CTRL[] enfoncée pour pouvoir les placer en diagonale.\n\nPlacez 2 convoyeurs en ligne, puis livrez un minerai au noyau. -tutorial.conveyor.mobile = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaites une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent] Maintenez votre doigt enfoncé[] et déplacez-le pour former une ligne.\n\nPlacez 2 convoyeurs en ligne, puis livrez un minerai au noyau. -tutorial.turret = Une fois qu'une ressource entre dans votre noyau, elle peut être utilisée pour la construction.\nGardez à l'esprit que certaines ressources ne peuvent pas être utilisées pour la construction.\nCes ressources, telles que[accent] le charbon[],[accent] le sable[] ou[accent] la ferraille[], ne peuvent pas entrer dans votre noyau.\nDes structures défensives doivent être construites pour repousser l'[lightgray] ennemi[].\nConstruisez une [accent]tourelle Duo[] près de votre noyau. -tutorial.drillturret = Les tourelles Duo ont besoin de[accent] munitions en cuivre []pour tirer.\nPlacez une foreuse près de la tourelle.\nÀ l'aide de convoyeurs, alimentez la tourelle en cuivre.\n\n[accent]Munitions livrées: 0/1 -tutorial.pause = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez planifier la construction de bâtiments tout en étant en pause.\n\n[accent]Appuyez sur la barre espace pour mettre en pause. -tutorial.pause.mobile = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez planifier la construction de bâtiments tout en étant en pause.\n\n[accent]Appuyez sur ce bouton en haut à gauche pour mettre en pause. -tutorial.unpause = Maintenant, appuyez à nouveau sur espace pour reprendre. -tutorial.unpause.mobile = Appuyez à nouveau dessus pour reprendre. -tutorial.breaking = Les blocs ou bâtiments doivent souvent être détruits.\n[accent]Gardez enfoncé le bouton droit de votre souris[] pour détruire tous les blocs en une sélection.[]\n\n[accent]Détruisez tous les blocs de ferraille situés à la gauche de votre noyau à l'aide de la sélection de zone. -tutorial.breaking.mobile = Les blocs ou bâtiments doivent souvent être détruits.\n[accent]Sélectionnez le mode de déconstruction[], puis appuyez sur un bloc pour commencer à le détruire.\nDétruisez une zone en maintenant votre doigt appuyé pendant quelques secondes[] et en le déplaçant dans une direction.\nAppuyez sur le bouton coche pour confirmer.\n\n[accent]Détruisez tous les blocs de ferraille situés à la gauche de votre noyau à l'aide de la sélection de zone. -tutorial.withdraw = Dans certaines situations, il est nécessaire de prendre des ressources directement à partir des bâtiments.\nPour faire cela, [accent]appuyez sur un bloc[] qui contient des ressources, puis [accent]appuyez sur une ressource[] dans son inventaire.\nPlusieurs objets d'une même ressource peuvent être retirées en [accent]appuyant pendant quelques secondes[].\n\n[accent]Retirez du cuivre du noyau.[] -tutorial.deposit = Vous pouvez déposer des ressources dans des bâtiments en les faisant glisser de votre vaisseau vers le bâtiment de destination.\n\n[accent]Déposez le cuivre récupéré précédemment dans le noyau.[] -tutorial.waves = L'[lightgray] ennemi[] approche.\n\nDéfendez le noyau pendant 2 vagues.[accent] Cliquez[] pour tirer.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. -tutorial.waves.mobile = L'[lightgray] ennemi[] approche.\n\nDéfendez le noyau pendant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. -tutorial.launch = Une fois que vous aurez atteint une vague spécifique, vous aurez la possibilité de[accent] faire décoller le noyau[], abandonnant vos défenses, mais [accent]sécurisant toutes les ressources stockées dans votre noyau.[]\nCes ressources peuvent ensuite être utilisées pour rechercher de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement. +hint.skip = Passer +hint.desktopMove = Utilisez [accent][[ZQSD][] pour bouger. +hint.zoom = [accent]Scrollez[] pour zoomer et dézoomer. +hint.mine = Bougez vers le \uf8c4 minerai de cuivre et [accent]cliquez[] dessus pour le miner manuellement. +hint.desktopShoot = [accent][[Clic-gauche][] pour tirer. +hint.depositItems = Pour déposer des ressources dans le Noyau, déplacez-les depuis votre vaisseau, vers ce dernier. +hint.respawn = Pour réapparaître en tant que vaisseau, pressez [accent][[V][]. +hint.respawn.mobile = Vous avez pris le contrôle d'une unité/structure. Pour réapparaître en tant que vaisseau, [accent]touchez l'avatar en haut à gauche.[] +hint.desktopPause = Pressez [accent][[Espace][] pour mettre en pause et reprendre le jeu. +hint.placeDrill = Sélectionnez l'onglet \ue85e [accent]Foreuses[] dans le menu en bas à droite, sélectionnez une \uf870 [accent]Foreuse[] et cliquez sur un filon de cuivre pour la placer. +hint.placeDrill.mobile = Sélectionnez l'onglet \ue85e [accent]Foreuses[] dans le menu en bas à droite, sélectionnez une \uf870 [accent]Foreuse Méchanique[] et touchez un filon de cuivre pour la placer.\n\nPressez le \ue800 [accent]V[] en bas à droite pour confirmer. +hint.placeConveyor = Les Convoyeurs transportent les ressources des foreuses vers d'autres blocs. Sélectionnez un \uf896 [accent]Convoyeur[] dans l'onglet \ue814 [accent]Distribution[].\n\nCliquez et maintenez pour placer plusieurs convoyeurs.\n[accent]Scrollez[] pour les faire pivoter. +hint.placeConveyor.mobile = Les Convoyeurs transportent les ressources des foreuses vers d'autres blocs. Sélectionnez un \uf896 [accent]Convoyeur[] dans l'onglet \ue814 [accent]Distribution[].\n\nMaintenez votre doigt et déplacez-le pour placer plusieurs convoyeurs. +hint.placeTurret = Placez des \uf861 [accent]Tourelles[] pour défendre votre base contre les ennemis.\n\nLes Tourelles nécessitent des munitions (dans ce cas, du \uf838Cuivre).\nUtilisez les convoyeurs et les foreuses pour les ravitailler. +hint.breaking = Maintenez [accent]Clic-droit[] pour détruire des blocs. +hint.breaking.mobile = Activez le \ue817 [accent]marteau[] en bas à droite Touchez pour détruire des blocs.\n\nRetenez votre doigt pendant une seconde et déplacez-le pour détruire les blocs dans la zone de sélection. +hint.research = Utilisez le bouton \ue875 [accent]Recherche[] pour rechercher de nouvelles technologies. +hint.research.mobile = Utilisez le bouton \ue875 [accent]Recherche[] dans le \ue88c [accent]Menu[] pour rechercher de nouvelles technologies. +hint.unitControl = Retenez [accent][[Ctrl-gauche][] et [accent]cliquez[] pour contrôler une tourelle ou une unité alliée. +hint.unitControl.mobile = [accent][[Tapez][] 2 fois une tourelle ou une unité alliée pour la contrôler. +hint.launch = Une fois que vous avez collecté assez de ressources, vous pouvez [accent]Lancer[] votre Noyau en sélectionnant un secteur depuis la \ue827 [accent]Carte[] en bas à droite. +hint.launch.mobile = Une fois que vous avez collecté assez de ressources, vous pouvez [accent]Lancer[] votre Noyau en sélectionnant un secteur depuis la \ue827 [accent]Carte[] dans le \ue88c [accent]Menu[]. +hint.schematicSelect = Retenez [accent][[F][] pour sélectionner des blocs dans une zone afin de les copier et les coller.\n\n[accent][[Clic du milieu][] pour copier un seul type de bloc. +hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement. +hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement. +hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler. +hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.\n\nSeules les unités terrestres peuvent contrôler d'autres unités terrestres. +hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger en formation. +hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités. +hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités. +hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement. +hint.payloadDrop.mobile = [accent]Tapez et retenez[] votre doigt pour larguer votre chargement. +hint.waveFire = [accent]Les tourelles à liquides[] approvisionnées en eau en tant que munitions, vont automatiquement éteindre les incendies proches. +hint.generator = \uf879 Les [accent]Générateurs à combustion[] brûlent du Charbon et transmettent de l'énergie aux blocs adjacents.\n\nLa transmission d'énergie peut être étendue avec des \uf87f [accent]Transmetteurs Énergétiques[]. +hint.guardian = Les [accent]Gardiens[] sont protégés par un bouclier. Les munitions faibles telles que le [accent]Cuivre[] et le [accent]Plomb[] ne seront [scarlet]pas efficaces[].\n\nUtilisez des tourelles de plus haut niveau, ou de meilleures munitions comme le \uf835 [accent]Graphite[] avec un \uf861Duo/\uf859Salve pour pouvoir tuer le gardien. +hint.coreUpgrade = Les Noyaux peuvent être améliorés [accent]en plaçant un Noyau de plus haut niveau sur eux[].\n\nPlacez un  Noyau [accent]Fondation[] sur le ï¡© Noyau [accent]Fragment[]. Soyez sûrs que rien n'obstrue la construction. +hint.presetLaunch = Les [accent]secteurs[] gris, tels que [accent]Frozen Forest[], peuvent être lançés de n'importe où. Ils ne requièrent pas la capture d'un secteur adjacent.\n\n[accent]Il y a beaucoup de secteurs[] comme celui-ci, qui sont [accent]optionels[]. +hint.coreIncinerate = Lorsqu'un Noyau est rempli d'une ressource en particulier, le surplus qui rentrera dans celui-ci sera [accent]incinéré[]. +hint.coopCampaign = Quand vous jouez en [accent]campagne multijoueur[], les ressources produites dans le secteur dans lequel vous jouez sera aussi envoyé [accent]dans vos secteurs[].\n\nLes recherches faites par l'hôte sont aussi partagées. -item.copper.description = Le matériau structurel de base. Utilisation très répandue dans tous les types de blocs. +item.copper.description = Le matériau structurel de base. Utilisation très répandue dans tous les types de blocs et en tant que munition. +item.copper.details = Le cuivre est un matériau anormalement abondant sur Serpulo. Il est structurellement faible à moins d'être renforcé. item.lead.description = Un matériau de départ. Utilisation très répandue en électronique et dans les blocs de transport de liquides. +item.lead.details = Dense et inerte, il est beaucoup utilisé dans les batteries.\nNote: Probablement toxique pour les formes de vie biologiques. Mais ce n'est pas comme s’il en restait beaucoup ici. item.metaglass.description = Un composé de verre super-résistant. Utilisation très répandue pour le transport et le stockage de liquides. -item.graphite.description = Du carbone minéralisé utilisé pour les munitions et l’isolation électrique. -item.sand.description = Un matériau commun largement utilisé dans la fonte, à la fois dans l'alliage et comme un flux. -item.coal.description = De la matière végétale fossilisée, formée bien avant l’ensemencement de ce monde. Utilisation très répandue pour la production de carburant et de ressources. -item.titanium.description = Un métal rare et super-léger largement utilisé dans le transport de liquides, dans les foreuses de hauts niveaux et dans l'aviation. -item.thorium.description = Un métal dense et radioactif utilisé comme support structurel et comme carburant nucléaire. -item.scrap.description = Un mix de métaux provenant des restes de vieilles structures et d'unités. Contient des traces de nombreux métaux différents. +item.graphite.description = Du carbone minéralisé utilisé pour les munitions et dans les composants électriques. +item.sand.description = Un matériau commun, largement utilisé pour la fabrication de matériaux raffinés. +item.coal.description = Un carburant commun et facile à obtenir. +item.coal.details = De la matière végétale fossilisée, formée bien avant l’ensemencement de ce monde. Utilisation très répandue pour la production de carburant et de ressources. +item.titanium.description = Un métal rare et super-léger, largement utilisé dans le transport de liquides, dans les foreuses de haut niveau et dans l'aviation. +item.thorium.description = Un métal dense et radioactif, utilisé comme support structurel et comme carburant nucléaire. +item.scrap.description = Il est utilisé dans les fours à fusion et les pulvériseurs, pour être raffiné en d'autres matériaux. +item.scrap.details = Un mix de métaux provenant des restes de vieilles structures et d'unités. Il contient des traces de nombreux métaux différents. item.silicon.description = Un matériau semi-conducteur extrêmement pratique utilisé dans les panneaux solaires, dans les munitions autoguidées et dans beaucoup d'autres composants électroniques complexes. -item.plastanium.description = Un matériau léger et ductile utilisé dans l'aviation avancée et dans les munitions à fragmentation. -item.phase-fabric.description = Une substance au poids quasiment inexistant utilisée pour l'électronique avancée et la technologie auto-réparatrice. -item.surge-alloy.description = Un alliage avancé avec des propriétés électriques uniques. -item.spore-pod.description = Une glande de spores synthétisées à partir de concentrations atmosphériques à des fins industrielles et utilisé pour la conversion en pétrole, en explosifs et en carburant. -item.blast-compound.description = Un composé instable synthétisé à partir de glandes de spores ou bien d'autres composés volatils et utilisé dans les bombes ainsi que dans les autres 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. +item.plastanium.description = Un matériau léger et ductile, utilisé dans l'isolation, la fabrication d'unités avancées et dans les munitions à fragmentation. +item.phase-fabric.description = Une substance au poids quasiment inexistant, utilisée pour l'électronique avancée et la technologie auto-réparatrice. +item.surge-alloy.description = Un alliage avancé aux propriétés électriques uniques, utilisé dans l'armement avancé. +item.spore-pod.description = Les bulbes sporifères sont utilisés pour l'obtention d'huile, d'explosifs et de carburants. +item.spore-pod.details = Les spores sont des formes de vies synthétiques, émettant des gaz qui sont toxiques pour les autres formes de vie biologiques. Elles sont extrêmement invasives et très inflammables dans certaines conditions. +item.blast-compound.description = Un matériau utilisé dans les bombes et les munitions explosives. +item.pyratite.description = Une substance extrêmement inflammable utilisée dans les armes incendiaires et comme combustible pour les générateurs. + liquid.water.description = Le liquide le plus utile. Couramment utilisé pour le refroidissement et le traitement des déchets. liquid.slag.description = Différents types de métaux en fusion mélangés. Peut être séparé en ses minéraux constitutifs ou tout simplement pulvérisé sur les unités ennemies. liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis, puis enflammé. liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir d’eau et de titane. Possède une capacité d'absorption de chaleur extrêmement élevée. Largement utilisé comme liquide de refroidissement. -block.message.description = Enregistre un message. Utilisé pour la communication entre alliés. -block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite pur. -block.multi-press.description = Une version améliorée de la presse à graphite. Utilise de l'eau et de l'électricité pour traiter le charbon rapidement et efficacement. -block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicium. -block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Nécessite une petite quantité d'énergie. +block.resupply-point.description = Approvisionne les unités proches en munitions. Pas compatible avec celles qui ont besoin d'énergie pour tirer. +block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner. +block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés. +block.message.description = Enregistre un message. Utilisé pour la communication entre alliés. Le message contenu peut être modifié par un processeur logique. +block.graphite-press.description = Compresse le charbon en graphite. +block.multi-press.description = Une version améliorée de la presse à graphite, utilisant de l'eau et de l'électricité pour traiter le charbon plus rapidement et plus efficacement. +block.silicon-smelter.description = Raffine du silicium avec du sable et du charbon. +block.kiln.description = Fait fondre le sable et le plomb en verre trempé. block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. -block.phase-weaver.description = Produit du tissu phasé à partir de thoriums et de grandes quantités de sable. Nécessite une quantité massive d'énergie pour fonctionner. +block.phase-weaver.description = Synthétise du tissu phasé à partir de thorium et de grandes quantités de sable. Nécessite une quantité massive d'énergie pour fonctionner. block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicium et de cuivre. -block.cryofluid-mixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable lors de l'utilisation de réacteurs aux thoriums. -block.blast-mixer.description = Écrase et mélange les amas de spores avec de la pyratite pour produire un mélange explosif. -block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable. -block.melter.description = Fait fondre la ferraille en scories pour un traitement ultérieur ou une utilisation dans les tourelles « Onde ». +block.cryofluid-mixer.description = Mélange de l’eau et de la poudre fine de titane pour former du liquide cryogénique. Indispensable lors de l'utilisation de réacteurs à thorium. +block.blast-mixer.description = Écrase et mélange des amas de spores avec de la pyratite pour produire un mélange explosif. +block.pyratite-mixer.description = Mélange du charbon, du plomb et du sable en pyratite hautement inflammable. +block.melter.description = Fait fondre la ferraille en scories. block.separator.description = Expose la scorie à de l'eau sous pression afin d'obtenir les différents minéraux qu'elle contient. -block.spore-press.description = Compresse les glandes de spore sous une pression extrême pour synthétiser du pétrole. +block.spore-press.description = Compresse des spores pour synthétiser du pétrole. block.pulverizer.description = Écrase la ferraille pour en faire du sable. Utile quand il y a un manque de sable naturel. block.coal-centrifuge.description = Solidifie le pétrole en blocs de charbon. -block.incinerator.description = Permet de se débarrasser de n'importe quel objet ou liquide en excès. +block.incinerator.description = Incinère ou vaporise n'importe quel objet ou liquide qu'il reçoit. block.power-void.description = Absorbe toute l'énergie qui va à l'intérieur. Bac à sable uniquement. block.power-source.description = Produit de l'énergie à l'infini. Bac à sable uniquement. -block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement . +block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement. block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur. Bac à sable uniquement. block.liquid-source.description = Source de liquide infinie. Bac à sable uniquement. block.liquid-void.description = Détruit n'importe quel liquide. Bac à sable uniquement. block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues. -block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues.\n2 x 2. -block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis. -block.titanium-wall-large.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis.\n2 x 2. -block.plastanium-wall.description = Un mur spécial qui absorbe les arcs électriques et bloque les connections automatiques des transmetteurs énergétiques. -block.plastanium-wall-large.description = Un mur spécial qui absorbe les arcs électriques et bloque les connections automatiques des transmetteurs énergétiques.\n2 x 2. -block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis. -block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.\n2 x 2. -block.phase-wall.description = Moins puissant qu'un mur en Thorium mais dévie les balles, sauf si elles sont trop puissantes. -block.phase-wall-large.description = Moins puissant qu'un mur en Thorium mais dévie les balles, sauf si elles sont trop puissantes.\n2 x 2. -block.surge-wall.description = Le plus puissant bloc défensif .\nA une faible chance de créer des éclairs vers les ennemis . -block.surge-wall-large.description = Le plus puissant bloc défensif .\nA une faible chance de créer des éclairs vers les ennemis .\n2 x 2. -block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte les ennemis peuvent tirer et passer à travers. -block.door-large.description = Une large porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte les ennemis peuvent tirer et passer à travers.\n2 x 2. -block.mender.description = Soigne périodiquement les bâtiments autour de lui. Permet de garder les défenses en bon état entre les vagues ennemies.\nPeut utiliser du Silicium pour booster la portée et l'efficacié. -block.mend-projector.description = Une version améliorée du Réparateur. Soigne périodiquement les bâtiments autour de lui.\nPeut utiliser du tissu phasé pour booster la portée et l'efficacié. -block.overdrive-projector.description = Accélère le fonctionnement des bâtiments autour de lui, notamment les foreuses et les convoyeurs.\nPeut utiliser du tissu phasé pour booster la portée et l'efficacié. -block.force-projector.description = Crée un champ de force hexagonal autour de lui qui protège des dégâts les bâtiments et les unités à l'intérieur.\nSurchauffe si trop de dégâts sont reçus. Peut utiliser du liquide cryogénique pour éviter la surchauffe. Peut utiliser du tissu phasé pour booster la taille du bouclier. -block.shock-mine.description = Blesse les ennemis qui marchent dessus. Quasiment invisible pour l'ennemi. +block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues. +block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les attaques ennemies. +block.titanium-wall-large.description = Un bloc défensif standard.\nProcure une protection modérée contre les attaques ennemies. +block.plastanium-wall.description = Un mur spécial qui peut absorber les arcs électriques et bloquer les connexions automatiques des transmetteurs énergétiques. +block.plastanium-wall-large.description = Un mur spécial qui peut absorber les arcs électriques et bloquer les connexions automatiques des transmetteurs énergétiques. +block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies. +block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies. +block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. +block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. +block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis. +block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis. +block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. +block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. +block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité. +block.mend-projector.description = Une version améliorée du Gardien. Soigne périodiquement les bâtiments autour de lui.\nPeut utiliser du tissu phasé pour booster la portée et l'efficacité. +block.overdrive-projector.description = Accélère le fonctionnement des bâtiments autour de lui, notamment les foreuses et les convoyeurs.\nPeut utiliser du tissu phasé pour booster la portée et l'efficacité. +block.force-projector.description = Crée un champ de force hexagonal autour de lui, qui protège des dégâts les bâtiments et les unités à l'intérieur.\nSurchauffe si trop de dégâts sont reçus. De l'eau ou du liquide cryogénique peuvent être utilisés pour ralentir la surchauffe et/ou accélérer le refroidissement. Peut utiliser du tissu phasé pour booster la taille du bouclier. +block.shock-mine.description = Blesse les ennemis qui marchent dessus. block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné. -block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standard. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. +block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards. +block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les décharge par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne. block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits. -block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou bâtiment. -block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance. +block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment. +block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée. block.sorter.description = Trie les ressources. Si une ressource correspond à la sélection, elle peut passer tout droit. Autrement, elle est distribuée vers la gauche ou la droite. -block.inverted-sorter.description = Trie les ressources comme un trieur standard, mais ceux correspondant à la sélection sont envoyés sur les côtés. Le reste est envoyé tout droit. -block.router.description = Accepte les objets depuis une ou plusieurs directions et les renvoie dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs. -block.distributor.description = Un routeur avancé qui répartit équitablement les objets entre au plus 7 directions différentes.\n2x2 +block.inverted-sorter.description = Trie les ressources comme un trieur standard, mais celles qui correspondent à la sélection sont envoyées sur les côtés. Le reste est envoyé tout droit. +block.router.description = Accepte les objets depuis une ou plusieurs directions et les renvoie équitablement dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs. +block.router.details = Un mal nécessaire... Utiliser un routeur à côté d'une usine est très déconseillé, car ceux-ci peuvent être bloqués par les matériaux produits par celle-ci. +block.distributor.description = Un routeur avancé qui répartit équitablement les objets jusqu'à 7 directions différentes. block.overflow-gate.description = Bloc envoyant les ressources à gauche et à droite si le chemin de devant est bloqué. -block.underflow-gate.description = Le contraire d'une barrière de débordement.\nEnvoie les ressources vers l'avant si les chemins de gauche et de droite sont bloqués. -block.mass-driver.description = Le moyen de transport de resources ultime. Collecte plusieurs ressources puis les envoie à une autre catapulte sur une longue distance. Nécessite de l'énergie pour fonctionner. -block.mechanical-pump.description = Une pompe de faible prix pompant lentement, mais ne consommant pas d'énergie. -block.rotary-pump.description = Une pompe avancée plus rapide mais utilisant de l'énergie.\n2x2 -block.thermal-pump.description = La pompe ultime.\n3x3 -block.conduit.description = Bloc de transport de liquide de base. Fait avancer les liquides. Utilisé avec des pompes et autres conduits. +block.underflow-gate.description = Le contraire d'une barrière de débordement. Envoie les ressources vers l'avant si les chemins de gauche et de droite sont bloqués. +block.mass-driver.description = Le moyen de transport de ressources ultime! Cette structure collecte des lots de ressources et les envoie à un autre transporteur de masse, sur une longue distance. Nécessite de l'énergie pour fonctionner. +block.mechanical-pump.description = Une pompe basique et bon marché qui pompe lentement des liquides. Elle ne consomme pas d'énergie. +block.rotary-pump.description = Une pompe avancée, plus rapide, mais utilisant de l'énergie. +block.thermal-pump.description = La pompe ultime. +block.conduit.description = Bloc de transport de liquide de base, faisant avancer les liquides. Utilisé avec des pompes et autres conduits. block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards. -block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé. N'accepte pas de liquides provenant des côtés par autre chose que des conduits.\nFuit moins. -block.liquid-router.description = Accepte les liquides depuis une direction et les rejette de tous les côtés équitablement. Peut aussi stocker une certaine quantité de liquide. Utile pour envoyer un liquide à plusieurs endroits. -block.liquid-tank.description = Stocke une grande quantité de liquide. Utile pour réguler la sortie quand la demande est inconstante ou comme sécurité pour refroidir des bâtiments importants. -block.liquid-junction.description = Agit comme une jonction pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits. -block.bridge-conduit.description = Bloc de transport de liquide avancé. Permet le transport de liquides à travers 3 blocs de n'importe quel terrain ou bâtiment au plus. +block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire. +block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide. +block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants. +block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits. +block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment. block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance. -block.power-node.description = Transmet l'énergie aux transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent, mais la connexion peut être activé/désactivé manuellement -block.power-node-large.description = Possède un rayon plus grand que le transmetteur énergétique standard, connectant d'autant plus de consommateurs ou transmetteurs d'énergie. -block.surge-tower.description = Un transmetteur énergétique de très grande portée mais avec moins de connections disponibles. -block.diode.description = L'énergie ne peut circuler à travers ce bloc que dans un sens, et uniquement si l’autre côté présente moins d’énergie en stock. +block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement. +block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions. +block.surge-tower.description = Un transmetteur énergétique à très grande portée mais avec moins de connexions disponibles. +block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si l’autre côté présente moins d’énergie en stock. Idéal pour protéger les lieux de production d'énergie. block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin. -block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. +block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou d'autres matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zones de chaleur. block.steam-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. block.differential-generator.description = Génère de grandes quantités d'énergie en utilisant la différence de température entre le liquide cryogénique et la pyratite brûlante. -block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium. +block.rtg-generator.description = Un générateur thermoélectrique à radioisotope qui ne demande pas de refroidissement, mais produit moins d'énergie qu'un réacteur à Thorium. block.solar-panel.description = Génère une faible quantité d'énergie grâce aux rayons du soleil. block.solar-panel-large.description = Génère bien plus d'énergie qu'un panneau solaire standard, mais est aussi bien plus cher à construire. block.thorium-reactor.description = Génère énormément d'énergie à l'aide de la radioactivité du thorium. Requiert néanmoins un refroidissement constant. Explosera violemment en cas de surchauffe. -block.impact-reactor.description = Un générateur avancé, capable de produire une quantité d'énergie gigantesque lorsqu'il atteint son efficacité maximale. Nécessite une quantité significative d'énergie pour lancer le générateur. -block.mechanical-drill.description = Une foreuse de faible coût. Si elle est placée sur un endroit approprié, produit des matériaux lentement à l'infini. -block.pneumatic-drill.description = Une foreuse améliorée plus rapide et capable de forer des matériaux plus durs comme le titane grâce à l'usage de vérins à air comprimé. -block.laser-drill.description = Permet de forer bien plus vite grâce à la technologie laser, mais requiert de l'énergie . Permet de miner le Thorium, un matériau radioactif. -block.blast-drill.description = La Foreuse ultime . Demande une grande quantité d'énergie. -block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'eau à proximité. -block.cultivator.description = Cultive le sol avec de l'eau afin d'obtenir de la biomasse. -block.oil-extractor.description = Utilise une grande quantité d'énergie afin d'extraire du pétrole à partir de sable. Utile quand il n'y a pas de lacs de pétrole à proximité. -block.core-shard.description = La première version du noyau. Une fois détruite tout contact avec la région est perdu. Ne laissez pas cela se produire. -block.core-foundation.description = La deuxième version du noyau. Meilleur blindage. Stocke plus de ressources. -block.core-nucleus.description = La troisième et dernière version du noyau. Extrêmement bien blindée. Stocke des quantités importantes de ressources. -block.vault.description = Stocke un grand nombre d'objets. Utile pour réguler le flux d'objets quand la demande de matériaux est inconstante. Un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le coffre-fort. -block.container.description = Stocke un petit nombre d'objets. Utile pour réguler le flux d'objets quand la demande de matériaux est inconstante. Un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le conteneur. -block.unloader.description = Décharge des objets depuis des conteneurs, coffres-forts ou d'un noyau sur un convoyeur ou directement dans un bloc adjacent. Le type d'objet peut être changé en appuyant sur le déchargeur. -block.launch-pad.description = Permet de transférer des ressources sans attendre le lancement du noyau. -block.launch-pad-large.description = Une version améliorée de la plateforme de lancement. Stocke plus de ressources et les envoie plus fréquemment. +block.impact-reactor.description = Ce réacteur est capable de produire de gigantesques quantités d'énergie lorsqu'il atteint son efficacité maximale. Nécessite une quantité significative d'énergie pour pouvoir le démarrer. +block.mechanical-drill.description = Une foreuse basique. Si elle est placée sur un endroit approprié, elle produira des matériaux lentement et indéfiniment. +block.pneumatic-drill.description = Une foreuse améliorée, plus rapide et capable de forer des minerais plus durs comme le titane. +block.laser-drill.description = Permet de forer bien plus vite grâce à la technologie laser, mais requiert de l'énergie pour fonctionner. Permet de miner du Thorium, un matériau radioactif. +block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner. +block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité. +block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères. +block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement l’incubateur initial des spores, qui couvrent maintenant Serpulo. +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 = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver. +block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équipé de propulseurs de lancement à usage unique. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire. +block.core-foundation.description = Le coeur de votre base. Cette version améliorée possède un meilleur blindage et stocke plus de ressources qu'un Noyau fragment. +block.core-foundation.details = La seconde version. +block.core-nucleus.description = Le coeur de votre base. Ce Noyau est extrêmement bien blindé et stocke des quantités massives de ressources. +block.core-nucleus.details = La version finale. +block.vault.description = Stocke un grand nombre d'objets de chaque type. Utilisez un déchargeur pour les récupérer.\nUtile pour réguler le flux d'objets quand la demande de matériaux est inconstante. +block.container.description = Stocke un petit nombre d'objets de chaque type. Utilisez un déchargeur pour les récupérer.\nUtile pour réguler le flux d'objets quand la demande de matériaux est inconstante. +block.unloader.description = Permet de décharger l'objet choisi, depuis les blocs adjacents. +block.launch-pad.description = Permet de transférer des ressources vers les secteurs sélectionnés. block.duo.description = Une petite tourelle à faible coût. Fonctionne bien contre les ennemis terrestres. block.scatter.description = Une tourelle anti-aérienne essentielle. Mitraille les ennemis de débris de plomb, de ferraille ou de verre trempé. block.scorch.description = Brûle les ennemis terrestres près de lui. Très efficace à courte portée. -block.hail.description = Une petite tourelle d'artillerie. Efficace à longue portée. -block.wave.description = Une tourelle de taille moyenne tirant rapidement des jets de liquide. Peut éteindre les incendies si elle est alimentée en eau. +block.hail.description = Une petite tourelle d'artillerie visant les ennemis terrestres. Efficace à longue portée. +block.wave.description = Une tourelle de taille moyenne tirant un jet de liquide. Peut éteindre les incendies automatiquement si elle est alimentée en eau. block.lancer.description = Une tourelle de taille moyenne chargeant et tirant de puissants lasers aux ennemis terrestres. -block.arc.description = Une petite tourelle de petite portée tirant des arcs électriques sur les ennemis. -block.swarmer.description = Une tourelle de taille moyenne attaquant les ennemis terrestres et aériens à l'aide de missiles autoguidés. +block.arc.description = Une petite tourelle tirant des arcs électriques sur les ennemis. +block.swarmer.description = Une tourelle de taille moyenne attaquant les ennemis terrestres et aériens à l'aide de missiles autoguidés. Consomme beaucoup de munitions. block.salvo.description = Une version plus grande et améliorée de la tourelle Duo. Tire par salves. -block.fuse.description = Une tourelle de grande taille et de petite portée. Elle perce les lignées ennemis avec ses trois tirs de sharpnel. -block.ripple.description = Une grande tourelle d'artillerie qui tire plusieurs salves simultanément sur de très longues distances. -block.cyclone.description = Une grande tourelle qui tire rapidement des débris explosifs aux ennemis terrestres et aériens. -block.spectre.description = Une tourelle massive à double cannon et qui tire de puissantes balles perce-blindages simultanément. +block.fuse.description = Une tourelle de grande taille et de petite portée. Elle perce les lignes ennemies avec ses trois tirs de sharpnel. +block.ripple.description = Lance des amas d’obus sur les ennemis terrestres sur de très longues distances. +block.cyclone.description = Une grande tourelle qui tire rapidement des balles explosives aux ennemis proches. +block.spectre.description = Une tourelle massive à double canon qui tire de puissantes balles perçantes. block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement. -block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. -block.segment.description = Endommage et détruit les tirs ennemis. Cependant, les lasers ne peuvent pas être ciblés. +block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité. +block.repair-point.description = Soigne l'unité endommagée la plus proche. +block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés. +block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts. +block.tsunami.description = Tire un puissant jet de liquide aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau. +block.silicon-crucible.description = Raffine du silicium avec du sable et du charbon en utilisant de la pyratite comme source de chaleur additionnelle. Cette usine est plus efficace dans les endroits chauds. +block.disassembler.description = Cette version avancée du séparateur peut produire du thorium. +block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner. +block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unités depuis leurs usines ou bien des conteneurs. +block.payload-router.description = Distribue les chargements qui entrent jusqu'à 3 directions différentes. +block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes. +block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. +block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. +block.naval-factory.description = Produit des unités navales. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. +block.additive-reconstructor.description = Améliore les unités entrantes au second niveau. +block.multiplicative-reconstructor.description = Améliore les unités entrantes au troisième niveau. +block.exponential-reconstructor.description = Améliore les unités entrantes au quatrième niveau. +block.tetrative-reconstructor.description = Améliore les unités entrantes au cinquième niveau. +block.switch.description = Un interrupteur pouvant être activé/désactivé. Le statut peut être lu et contrôlé avec des processeurs logiques. +block.micro-processor.description = Exécute une séquence d'instructions en boucle. Peut être utilisé pour contrôler des unités ou des bâtiments. +block.logic-processor.description = Exécute une séquence d'instructions en boucle. Peut être utilisé pour contrôler des unités ou des bâtiments. Plus rapide qu'un microprocesseur. +block.hyper-processor.description = Exécute une séquence d'instructions en boucle. Peut être utilisé pour contrôler des unités ou des bâtiments. Plus rapide qu'un processeur. +block.memory-cell.description = Stocke des informations pour un processeur logique. +block.memory-bank.description = Stocke des informations pour un processeur logique. Possède une plus grande capacité. +block.logic-display.description = Affiche des images à partir des instructions d'un processeur logique. +block.large-logic-display.description = Affiche des images à partir des instructions d'un processeur logique. Possède une plus grande résolution qu'un écran. +block.interplanetary-accelerator.description = Un énorme canon électromagnétique à rails. Accélère les Noyaux pour qu'ils échappent à la gravité de leur planète et leur permettent un déploiement interplanétaire. + +unit.dagger.description = Tire des balles normales aux ennemis proches. +unit.mace.description = Tire des jets de flammes aux ennemis proches. +unit.fortress.description = Tire des balles d’artillerie à longue portée, sur des cibles terrestres. +unit.scepter.description = Tire un barrage de balles super chargées aux ennemis proches. +unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches. +unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler. +unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler. +unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est doté d'un champ de force. +unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler. +unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur la plupart des terrains. +unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion. +unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur la plupart des terrains. +unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains. +unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains. +unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur la plupart des terrains. +unit.flare.description = Tire des balles normales aux cibles terrestres. +unit.horizon.description = Largue des bombes sur des cibles terrestres. +unit.zenith.description = Tire des salves de missiles sur les ennemis proches. +unit.antumbra.description = Tire un barrage de balles aux ennemis proches. +unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches. +unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche. +unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs à thorium) et assiste les autres unités lorsqu'elles construisent. +unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres. +unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne. +unit.oct.description = Protège les alliés proches avec son champ de force auto-régénérant. Capable de transporter des blocs et de grosses unités terrestres. +unit.risso.description = Tire un barrage de missiles et de balles aux ennemis proches. +unit.minke.description = Tire des obus et des balles normales aux ennemis proches. +unit.bryde.description = Tire des obus d'artillerie à longue portée et des missiles aux ennemis proches. +unit.sei.description = Tire un barrage de missiles et de balles perçantes aux ennemis proches. +unit.omura.description = Tire avec un canon à rails à longue portée, une puissante balle perçante aux ennemis proches. Possède une usine à flares. +unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures. +unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures. +unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures. + +lst.read = Lit un nombre depuis un bloc de mémoire relié au processeur. +lst.write = Écrit un nombre dans un bloc de mémoire relié au processeur. +lst.print = Ajoute du texte dans la mémoire tampon de l'imprimante.\nNe montrera aucun texte tant que [accent]Print Flush[] ne sera pas utilisé. +lst.draw = Ajoute une opération dans la mémoire tampon de dessin.\nNe montrera aucune image tant que [accent]Draw Flush[] ne sera pas utilisé. +lst.drawflush = Affiche les opérations [accent]Draw[] en file d'attente vers un écran. +lst.printflush = Affiche les opérations [accent]Print[] en file d'attente vers un bloc de message. +lst.getlink = Obtient un lien de processeur par index. Commence à 0. +lst.control = Contrôle un bâtiment. +lst.radar = Localise des unités dans la portée d'un bâtiment. +lst.sensor = Récupère des données depuis un bâtiment ou une unité. +lst.set = Définit une variable. +lst.operation = Effectue une opération sur 1 ou 2 variables. +lst.end = Saute au sommet de la série d’instructions. +lst.jump = Saute conditionnellement vers une autre instruction. +lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[]. +lst.unitcontrol = Contrôle l'unité actuellement liée. +lst.unitradar = Localise des unités dans la portée de l'unité actuellement liée. +lst.unitlocate = Localise une position ou un type spécifique de bâtiment, n'importe où sur la carte.\nRequiert une unité reliée. + +logic.nounitbuild = [red]Les unités contrôlées par des processeurs ne peuvent pas construire ici. + +lenum.type = Type de bâtiment/unité.\nPar exemple, pour tout routeur, cela retournera [accent]@router[].\nPas en texte. +lenum.shoot = Tire à une position donnée. +lenum.shootp = Tire à une unité/bâtiment avec la prédiction de mouvement. +lenum.configure = La configuration d'un bâtiment. Par exemple, l'objet sélectionné dans un trieur. +lenum.enabled = Retourne si le bloc est activé ou pas. + +laccess.color = La couleur d'un illuminateur. +laccess.controller = Le contrôleur de l'Unité.\nSi l'Unité est contrôlée par un processeur, cela retournera le processeur en question.\nSi l'Unité est en formation, cela retournera le leader de la formation.\nSinon, renvoie l’unité elle-même. +laccess.dead = Retourne si l'Unité/Bâtiment est morte/détruit ou plus valide. +laccess.controlled = Retourne:\n[accent]@ctrlProcessor[] si le contrôleur de l'Unité est un processeur\n[accent]@ctrlPlayer[] si l'Unité/Bâtiment est contrôlé par un joueur\n[accent]@ctrlFormation[] si l'Unité est en formation\nSinon, retourne 0. +laccess.commanded = [red]Obsolète! Cette commande sera supprimée.[]\nUtilisez [accent]controlled[] à la place. + +graphicstype.clear = Remplit l’écran d’une couleur. +graphicstype.color = Définit une couleur pour les prochaines opérations de dessin. +graphicstype.stroke = Définit la largeur d'une ligne. +graphicstype.line = Dessine un segment de droite. +graphicstype.rect = Dessine un rectangle. +graphicstype.linerect = Dessine le contour d'un rectangle. +graphicstype.poly = Dessine un polygone régulier. +graphicstype.linepoly = Dessine le contour d'un polygone régulier. +graphicstype.triangle = Dessine un triangle. +graphicstype.image = Dessine une image provenant du contenu du jeu.\nexemple: [accent]@router[] ou [accent]@dagger[]. + +lenum.always = Toujours [accent]true[]. +lenum.idiv = Division entière. +lenum.div = Division.\nRetourne [accent]null[] lors d'une division par zéro. +lenum.mod = Modulo. +lenum.equal = Égalité. Conversion des types.\nLes objets non-nuls comparés avec des nombres deviennent 1, sinon 0. +lenum.notequal = Inégalité. Conversion des types. +lenum.strictequal = Égalité stricte. Ne convertit pas les types.\nPeut être utilisé pour vérifier les valeurs [accent]null[]. +lenum.shl = Décalage de bits gauche. +lenum.shr = Décalage de bits droite. +lenum.or = Opération binaire OR. +lenum.land = Opération logique AND. +lenum.and = Opération binaire AND. +lenum.not = Opération binaire flip. +lenum.xor = Opération binaire XOR. + +lenum.min = Le minimum des 2 nombres. +lenum.max = Le maximum des 2 nombres. +lenum.angle = Angle d'un vecteur en degrés. +lenum.len = Longueur d'un vecteur. +lenum.sin = Calcule le Sinus, en degrés. +lenum.cos = Calcule le Cosinus, en degrés. +lenum.tan = Calcule la Tangente, en degrés. +#not a typo, look up 'range notation' +lenum.rand = Nombre aléatoire dans la plage [0, valeur). +lenum.log = Logarithme naturel (ln). +lenum.log10 = Logarithme de base 10. +lenum.noise = Bruit simplex 2D. +lenum.abs = Valeur absolue. +lenum.sqrt = Racine carrée. + +lenum.any = N'importe quelle unité. +lenum.ally = Unité alliée. +lenum.attacker = Unité avec des armes. +lenum.enemy = Unité ennemie. +lenum.boss = Gardien. +lenum.flying = Unité volante. +lenum.ground = Unité terrestre. +lenum.player = Unité contrôlée par un joueur. + +lenum.ore = Gisement de minerai. +lenum.damaged = Bâtiments alliés endommagés. +lenum.spawn = Point d'apparition ennemi.\nPeut être un noyau ou une position. +lenum.building = Bâtiment dans un groupe spécifique. + +lenum.core = N'importe quel noyau. +lenum.storage = Bâtiments de stockage, un coffre-fort par exemple. +lenum.generator = Bâtiments générant de l'énergie. +lenum.factory = Bâtiments traitant des ressources. +lenum.repair = Points de réparation. +lenum.rally = Centres de commandes. +lenum.battery = N'importe quelle batterie. +lenum.resupply = Points de rechargement.\nUtile seulement lorsque [accent]"munitions"[] sont limitées. +lenum.reactor = Réacteur à Impact/Thorium. +lenum.turret = N'importe quelle tourelle. + +sensor.in = Les bâtiments/unités à analyser. + +radar.from = Bâtiment de détection.\nLa portée du détecteur est limitée à la portée du bâtiment. +radar.target = Filtre pour les unités à détecter. +radar.and = Filtres additionnels +radar.order = Ordre de filtrage. 0 pour inverser. +radar.sort = Valeur par laquelle les résultats sont triés. +radar.output = Variable dans laquelle écrire l'unité retournée. + +unitradar.target = Filtre pour les unités à détecter. +unitradar.and = Filtres additionnels +unitradar.order = Ordre de filtrage. 0 pour inverser. +unitradar.sort = Valeur par laquelle les résultats sont triés. +unitradar.output = Variable dans laquelle écrire l'unité retournée. + +control.of = Bâtiment à contrôler. +control.unit = Unité/bâtiment à viser. +control.shoot = S’il faut tirer ou non. + +unitlocate.enemy = S'il faut détecter les bâtiments ennemis au non. +unitlocate.found = Retourne un booléen s'il l'objet a été trouvé ou non. +unitlocate.building = Retourne une variable pour le bâtiment localisé. +unitlocate.outx = Retourne la coordonnée X. +unitlocate.outy = Retourne la coordonnée Y. +unitlocate.group = Le groupe de bâtiments à rechercher. + +lenum.idle = L'Unité ne bouge plus, mais elle continue de construire/miner.\nL'état par défaut. +lenum.stop = Empêche l'unité de bouger/miner/construire. +lenum.move = Bouge vers la position exacte. +lenum.approach = Approche une position avec un rayon. +lenum.pathfind = Détermine un itinéraire et bouge vers le point d'apparition ennemi. +lenum.target = Tire vers la position donnée. +lenum.targetp = Tire sur un cible avec la prédiction de mouvement. +lenum.itemdrop = Lâche un objet. +lenum.itemtake = Prend un objet depuis un bâtiment. +lenum.paydrop = Lâche le chargement actuel. +lenum.paytake = Prend un chargement à la position actuelle. +lenum.flag = Drapeau numérique d'une unité. +lenum.mine = Mine à une position donnée. +lenum.build = Construit une structure. +lenum.getblock = Récupére des données sur un bâtiment et son type aux coordonnées données.\nL'unité doit se trouver dans la portée de la position.\nLes blocs solides qui ne sont pas des bâtiments auront le type [accent]@solid[]. +lenum.within = Vérifie si l'unité est près de la position. +lenum.boost = Active/Désactive le boost. + +#Added French translations +lenum.floor = Retourne le plus grand nombre entier,\nqui est inférieur ou égal au nombre donné (12.5 -> 12). +lenum.ceil = Retourne le nombre entier le plus petit,\nsupérieur ou égal au nombre donné (12.5 -> 13). \ No newline at end of file diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties deleted file mode 100644 index 02fe5e58b1..0000000000 --- a/core/assets/bundles/bundle_fr_BE.properties +++ /dev/null @@ -1,1305 +0,0 @@ -credits.text = Créé par [royal]Anuken[] - [sky]anukendev@gmail.com[] -credits = Crédits -contributors = Traducteurs et contributeurs -discord = Rejoignez le discord de Mindustry ! -link.discord.description = Le discord officiel de Mindustry -link.reddit.description = Le subreddit de Mindustry -link.github.description = Code source du jeu -link.changelog.description = Liste des mises à jour -link.dev-builds.description = Versions instables de développement -link.trello.description = Trello officiel pour les fonctionnalités planifiées. -link.itch.io.description = Site itch.io avec les versions téléchargeables pour ordinateur. -link.google-play.description = Page Google Play du jeu -link.f-droid.description = F-Droid catalogue listing -link.wiki.description = Wiki officiel de Mindustry -link.suggestions.description = Suggérer des nouvelles fonctionallitées -linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier. -screenshot = Capture d'écran enregistrée sur {0} -screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire pour la capture d'écran. -gameover = Le base a été détruite. -gameover.pvp = L'équipe[accent] {0}[] a gagnée ! -highscore = [accent]Nouveau meilleur score ! -copied = Copié. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet - -load.sound = Son -load.map = Maps -load.image = Images -load.content = Contenu -load.system = Système -load.mod = Mods -load.scripts = Scripts - -be.update = Une nouvelle version est disponible: -be.update.confirm = Voulez vous la télécharger et recommencer maintenant ? -be.updating = Entrain de mettre à jour... -be.ignore = Ignorer -be.noupdates = Aucune mise à jour n'as été trouvée. -be.check = Chercher des mises à jour - -schematic = Schéma -schematic.add = Enregistrer Schéma... -schematics = Schémas -schematic.replace = Un schéma avec ce nom existe déjà. Voulez vous le remplacer ? -schematic.exists = Un schéma avec ce nom existe déjà. -schematic.import = Importer le Schéma... -schematic.exportfile = Exporter Dossier -schematic.importfile = Importer Dossier -schematic.browseworkshop = Parcourir l'Atelier -schematic.copy = Copier dans le presse-papier -schematic.copy.import = Importer du presse-papier -schematic.shareworkshop = Partager sur l'Atelier -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner Schéma -schematic.saved = Schéma enregistré. -schematic.delete.confirm = Ce Schéma sera totalement éradiqué. -schematic.rename = Renommer Schéma -schematic.info = {0}x{1}, {2} blocks - -stat.wave = Vagues vaincues:[accent] {0} -stat.enemiesDestroyed = Ennemies détruits:[accent] {0} -stat.built = Bâtiments construits:[accent] {0} -stat.destroyed = Bâtiments détruits:[accent] {0} -stat.deconstructed = Bâtiments déconstruits:[accent] {0} -stat.delivered = Ressources transférées: -stat.playtime = Temps Joué:[accent] {0} -stat.rank = Rang Final: [accent]{0} - -globalitems = [accent]Global Items -map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"? -level.highscore = Meilleur score: [accent]{0} -level.select = Sélection de niveau -level.mode = Mode de jeu: -coreattack = -nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nextermination imminente -database = Base de données -savegame = Sauvegarder la partie -loadgame = Charger la partie -joingame = Rejoindre la partie -customgame = Partie personnalisée -newgame = Nouvelle partie -none = -minimap = Minimap -position = Position -close = Fermer -website = Site Web -quit = Quitter -save.quit = Save & Quit -maps = Cartes -maps.browse = Feuilleter les maps -continue = Continuer -maps.none = [lightgray]Aucune carte trouvée! -invalid = Invalide -pickcolor = Choisir Couleur -preparingconfig = Préparation Configuration -preparingcontent = Préparation Contenu -uploadingcontent = Télécharger Contenu -uploadingpreviewfile = Télécharger Aperçu de Dossier -committingchanges = Commettre Changements -done = Fini -feature.unsupported = Votre appareil ne prend pas en charge cette fonctionnalité. - -mods.alphainfo = Tenez en compte que les mods sont en version alpha et [scarlet] qu'ils peuvent avoir des bugs[].\nVeuillez signaler tout les problèmes que vous encontrez sur le Github de Mindustry ou sur Discord. -mods.alpha = [accent](Alpha) -mods = Mods -mods.none = [lightgray]Aucun Mod trouvé ! -mods.guide = Guide de Modding -mods.report = Signaler un Bug -mods.openfolder = Ouvrir Dossier Mod -mods.reload = Relancer -mods.reloadexit = Le jeu va quitter pour relancer les mods. -mod.display = [gray]Mod:[orange] {0} -mod.enabled = [lightgray]Activé -mod.disabled = [scarlet]Désactivé -mod.disable = Désactive -mod.content = Contenu: -mod.delete.error = Unable to delete mod. File may be in use. -mod.requiresversion = [scarlet]Requires min game version: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.erroredcontent = [scarlet]Content Errors -mod.errors = Errors have occurred loading content. -mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.file = Import File -mod.import.github = Import GitHub Mod -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! -mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. -mod.remove.confirm = This mod will be deleted. -mod.author = [lightgray]Author:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. - -about.button = À propos -name = Nom: -noname = Choisissez d'abord [accent]un pseudo[]. -planetmap = Planet Map -launchcore = Launch Core -filename = Nom du fichier: -unlocked = Nouveau bloc debloqué! -completed = [accent]Terminé -techtree = Arbre technologique -research.list = [lightgray]Recherche: -research = Recherche -researched = [lightgray]{0} recherché. -research.progress = {0}% complete -players = {0} joueurs -players.single = {0} joueur -players.search = search -players.notfound = [gray]no players found -server.closing = [accent]Fermeture du serveur ... -server.kicked.kick = Vous avez été expulsé du serveur ! -server.kicked.whitelist = You are not whitelisted here. -server.kicked.serverClose = Serveur fermé. -server.kicked.vote = Vous avez été expulsé par vote. Au revoir. -server.kicked.clientOutdated = Client dépassé! Mettez à jour votre jeu ! -server.kicked.serverOutdated = Serveur dépassé! Demandez à l'hôte de le mettre à jour ! -server.kicked.banned = Vous êtes banni de ce serveur. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place ce libére. -server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau. -server.kicked.nameInUse = Il y a déjà quelqu'un avec ce nom\nsur ce serveur. -server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chiffre. -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.kicked.serverRestarting = Le serveur est entrain de redémarrer. -server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[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 [lightgray]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[lightgray]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[lightgray]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 -invitefriends = Inviter des amis -hostserver.mobile = Héberger\nune partie -host = Héberger -hosting = [accent]Ouverture du serveur ... -hosts.refresh = Actualiser -hosts.discovering = Recherche de parties en LAN -hosts.discovering.any = Découverte des jeux -server.refreshing = Actualisation du serveur -hosts.none = [lightgray]Aucun jeu en LAN trouvé ! -host.invalid = [scarlet]Impossible de se\nconnecter à l'hôte. - -servers.local = Serveurs Locaux -servers.remote = Serveurs Distants -servers.global = Serveurs Communautaires - -trace = Suivre le joueur -trace.playername = Nom du joueur: [accent]{0} -trace.ip = IP: [accent]{0} -trace.id = ID Unique: [accent]{0} -trace.mobile = Client Mobile: [accent]{0} -trace.modclient = Client personnalisé: [accent]{0} -invalidid = ID client invalide ! Soumettre un rapport de bug -server.bans = Banni -server.bans.none = Aucun joueur banni trouvé ! -server.admins = Administrateurs -server.admins.none = Aucun administrateur trouvé ! -server.add = Ajouter un serveur -server.delete = Êtes-vous sûr de vouloir supprimer ce serveur ? -server.edit = Modifier le serveur -server.outdated = [crimson]Serveur obsolète ![] -server.outdated.client = [crimson]Client obsolète ![] -server.version = [lightgray]Version: {0} {1} -server.custombuild = [accent]Version personnalisée -confirmban = Êtes-vous sûr de vouloir bannir ce joueur ? -confirmkick = Êtes-vous sûr de vouloir expulser ce joueur ? -confirmvotekick = Êtes-vous sûr de vouloir voter que ce joueur soit banni ? -confirmunban = Êtes-vous sûr de vouloir annuler le ban de ce joueur ? -confirmadmin = Êtes-vous sûr de vouloir faire de ce joueur un administrateur ? -confirmunadmin = Êtes-vous sûr de vouloir supprimer le statut d'administrateur de ce joueur ? -joingame.title = Rejoindre une partie -joingame.ip = IP: -disconnect = Déconnecté. -disconnect.error = Un problème est survenu lors de la connection. -disconnect.closed = Connection fermée. -disconnect.timeout = Timed out. -disconnect.data = Les données du monde n'ont pas pu être chargées ! -cantconnect = Impossible de rejoindre le jeu ([accent]{0}[]). -connecting = [accent]Connexion... -connecting.data = [accent]Chargement des données du monde... -server.port = Port: -server.addressinuse = Adresse déjà utilisée ! -server.invalidport = Numéro de port incorrect ! -server.error = [crimson]Erreur lors de l'hébergement du serveur: [accent]{0} -save.new = Nouvelle sauvegarde -save.overwrite = Êtes-vous sûr de vouloir\nrecouvrir cette sauvegarde ? -overwrite = Recouvrir -save.none = Aucune sauvegarde trouvée ! -savefail = Échec de la sauvegarde ! -save.delete.confirm = Êtes-vous sûr de supprimer cette sauvegarde ? -save.delete = Supprimer -save.export = Exporter une\nSauvegarde -save.import.invalid = [accent]Cette sauvegarde est invalide! -save.import.fail = [crimson]L'importation de la sauvegarde\na échouée: [accent]{0} -save.export.fail = [crimson]L'exportation de la sauvegarde\na échouée: [accent]{0} -save.import = Importer une sauvegarde -save.newslot = Nom de la sauvegarde: -save.rename = Renommer -save.rename.text = Nouveau nom: -selectslot = Sélectionnez une sauvegarde. -slot = [accent]Emplacement {0} -editmessage = Modifier le Message -save.corrupted = [accent]Fichier de sauvegarde corrompu ou invalide!\nSi vous venez de mettre à jour votre jeu, c'est probablement dû à un changement du format de sauvegarde et [scarlet]non[] un bug. -empty = -on = Allumer -off = Éteint -save.autosave = Sauvegarde automatique {0} -save.map = Carte: {0} -save.wave = Vague {0} -save.mode = Mode de jeu {0} -save.date = Dernière sauvegarde: {0} -save.playtime = Temps de jeu: {0} -warning = Avertissement. -confirm = Confirmer -delete = Supprimer -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing -ok = OK -open = Ouvrir -customize = Personnaliser -cancel = Annuler -openlink = Ouvrir le lien -copylink = Copier le lien -back = Retour -data.export = Export Data -data.import = Import Data -data.openfolder = Open Data Folder -data.exported = Data exported. -data.invalid = Ceci ne sont pas des données de jeu valide. -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. -quit.confirm = Êtes-vous sûr de vouloir quitter? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] -loading = [accent]Chargement... -reloading = [accent]Reloading Mods... -saving = [accent]Sauvegarde... -respawn = [accent][[{0}][] to respawn in core -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building -wave = [accent]Vague {0} -wave.waiting = [lightgray]Prochaine vague dans {0} -wave.waveInProgress = [lightgray]Vague en cours -waiting = [lightgray]En attente... -waiting.players = En attente de joueurs ... -wave.enemies = [lightgray]{0} Ennemis restants -wave.enemy = [lightgray]{0} Ennemi restant -loadimage = Charger l'image -saveimage = Sauvegarder l'image -unknown = Inconnu -custom = Personnalisé -builtin = Pré-fait -map.delete.confirm = Êtes-vous sûr de vouloir effacer cette carte ? Cette action est irréversible ! -map.random = [accent]Carte aléatoire -map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître !Ajouter un [royal]base bleue[] sur cette carte dans l'éditeur. -map.nospawn.pvp = Cette carte ne contient aucune base ennemi dans lequel le joueur apparaît!\nAjoutez des bases [scarlet]rouge[] à cette carte dans l'éditeur. -map.nospawn.attack = Cette carte ne contient aucune base ennemi à attaquer! Ajoutez des bases [scarlet]rouge[] à cette carte dans l'éditeur. -map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): -eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} - -editor.brush = Pinceau -editor.openin = Ouvrir dans l'éditeur -editor.oregen = Génération des minerais -editor.oregen.info = Génération de minerais: -editor.mapinfo = Infos sur la carte -editor.author = Auteur: -editor.description = Description: -editor.nodescription = A map must have a description of at least 4 characters before being published. -editor.waves = Vagues: -editor.rules = Règles: -editor.generation = Generation: -editor.ingame = Modifier en jeu -editor.publish.workshop = Publish On Workshop -editor.newmap = Nouvelle carte -workshop = Workshop -waves.title = Vagues -waves.remove = Retirer -waves.never = -waves.every = tous les -waves.waves = vague(s) -waves.perspawn = par apparition -waves.shields = shields/wave -waves.to = à -waves.guardian = Guardian -waves.preview = Prévisualiser -waves.edit = Modifier... -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 = Aucun ennemi défini.\nNotez que les dispositions vides seront automatiquement remplacées par la dispositions par défaut. - -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health - -editor.default = [lightgray] -details = Details... -edit = Modifier... -editor.name = Nom: -editor.spawn = Ajouter une unité -editor.removeunit = Retirer l'unité -editor.teams = Équipes -editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0} -editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0} -editor.errorimage = C’est une image, pas une carte.\n\nSi vous souhaitez importer une carte 3.5/build 40, utilisez le bouton "Importer une carte héritée" dans l’éditeur. -editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte qui n'est plus pris en charge. -editor.errornot = Ce n'est pas un fichier de carte. -editor.errorheader = Ce fichier de carte n'est pas valide ou corrompu. -editor.errorname = La carte n'a pas de nom ! -editor.update = Mettre à jour -editor.randomize = Randomiser -editor.apply = Appliquer -editor.generate = Générer -editor.resize = Redimensionner -editor.loadmap = Charger une carte -editor.savemap = Sauvegarder une carte -editor.saved = Sauvegardé ! -editor.save.noname = Votre carte ne possède pas de nom ! Ajouter en un dans le menu 'Infos sur la carte'. -editor.save.overwrite = Une carte posséde déjà ce nom ! Choisissez un nom différent dans le menu 'Infos sur la carte'. -editor.import.exists = [scarlet]Importation impossible :[] Une carte nommé '{0}' existe déjà! -editor.import = Importation... -editor.importmap = Importer une carte -editor.importmap.description = Importer une carte déjà existante -editor.importfile = Importer un fichier -editor.importfile.description = Importer une carte à partir d'un fichier externe -editor.importimage = Importer la carte existante -editor.importimage.description = Importer une image de terrain à partir d'un fichier externe -editor.export = Exportation en cours... -editor.exportfile = Exporter un fichier -editor.exportfile.description = Exporter une carte -editor.exportimage = Exporter l'image du terrain -editor.exportimage.description = Exporter la carte sous forme d'image -editor.loadimage = Importer le terrain -editor.saveimage = Exportr le terrain -editor.unsaved = [scarlet] Vous avez des changements non sauvegardés ![] Êtes-vous sûr de vouloir quitter ? -editor.resizemap = Redimensionner\nla carte -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.exists = A map with this name already exists. -editor.selectmap = Sélectionnez une carte à charger: - -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 = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous. -filter.distort = Déformation -filter.noise = Bruit -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select -filter.median = Median -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 = Miroir -filter.clear = Nettoyer -filter.option.ignore = Ignorer -filter.scatter = Dispersement -filter.terrain = Terrain -filter.option.scale = Échelle -filter.option.chance = Chance -filter.option.mag = Magnitude -filter.option.threshold = Seuil -filter.option.circle-scale = Échelle du cercle -filter.option.octaves = Octaves -filter.option.falloff = Diminution -filter.option.angle = Angle -filter.option.amount = Amount -filter.option.block = Bloc -filter.option.floor = Sol -filter.option.flooronto = Sible au sol -filter.option.wall = Mur -filter.option.ore = Minerai -filter.option.floor2 = Sol secondaire -filter.option.threshold2 = Seuil secondaire -filter.option.radius = Rayon -filter.option.percentile = Centile - -width = Largeur: -height = Hauteur: -menu = Menu -play = Jouer -campaign = Campagne -load = Charger -save = Sauvegarder -fps = FPS: {0} -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 - -abandon = Abandonner -abandon.text = Cette zone et toutes ses ressources seront perdues. -locked = Verrouillé -complete = [lightgray]Compléter: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Reprendre la partie en cours:\n[lightgray]{0} -bestwave = [lightgray]Meilleur: {0} -launch = Lancement -launch.text = Launch -launch.title = Lancement réussi -launch.next = [lightgray]Prochaine opportunité à la vague {0} -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. -loadout = Loadout -resources = Resources -bannedblocks = Banned Blocks -addall = Add All -launch.destination = Destination: {0} -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [lightgray]{0} Débloquée. -zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées -zone.resources = Ressources détectées: -zone.objective = [lightgray]Objective: [accent]{0} -zone.objective.survival = Survive -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} -error.unreachable = Serveur inaccessible. -error.invalidaddress = Adresse invalide. -error.timedout = Expiration du délai !\nAssurez-vous que la redirection de port est configurée sur l'hôte et que l'adresse est correcte ! -error.mismatch = Erreur de paquet:\nPossible d'incompatibilité de version client/serveur.\nAssurez-vous que l'hôte et vous disposez de la dernière version de Mindustry ! -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 = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. - -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm - -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) - -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass - -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. - -settings.language = Langage -settings.data = Game Data -settings.reset = Valeur par défaut. -settings.rebind = Réatttribuer -settings.resetKey = Reset -settings.controls = Contrôles -settings.game = Jeu -settings.sound = Son -settings.graphics = Graphiques -settings.cleardata = Effacer les données du jeu... -settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\n[scarlet]Ceci est irréversible -settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données , incluant les sauvegarges, les cartes, les déblocages et la configuration des touches.\nUne fois que vous aurez pressé 'Ok' le jeu effacera toutes les données et se fermera. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves -paused = En pause -clear = Clear -banned = [scarlet]Banned -unplaceable.sectorcaptured = [scarlet]Requires captured sector -yes = Oui -no = Non -info.title = Info -error.title = [crimson]Une erreur s'est produite -error.crashtitle = Une erreur s'est produite -unit.nobuild = [scarlet]Unit can't build -blocks.input = Ressource(s) requise(s) -blocks.output = Ressource(s) produite(s) -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities -block.unknown = [lightgray]Inconnu -blocks.powercapacity = Capacité d'énergie -blocks.powershot = Énergie/Tir -blocks.damage = Damage -blocks.targetsair = Cible les unités aériennes -blocks.targetsground = Cible les unités terrestres -blocks.itemsmoved = Vitesse de déplacement -blocks.launchtime = Temps entre chaque lancement -blocks.shootrange = Portée -blocks.size = Taille -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacité en liquide -blocks.powerrange = Distance de transmission -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Énergie utilisée -blocks.powerdamage = Énergie/Dégâts -blocks.itemcapacity = Stockage -blocks.basepowergeneration = Production d'énergie de base -blocks.productiontime = Temps de production -blocks.repairtime = Temps pour la réparation totale du bloc -blocks.speedincrease = Augmentation de la vitesse -blocks.range = Portée -blocks.drilltier = Forable -blocks.drillspeed = Vitesse de forage de base -blocks.boosteffect = Effet boostant -blocks.maxunits = Maximum d'unitée active -blocks.health = Santé -blocks.buildtime = Temps de construction -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Coût de construction -blocks.inaccuracy = Précision -blocks.shots = Tirs -blocks.reload = Tirs/Seconde -blocks.ammo = Munition -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time - -bar.drilltierreq = Better Drill Required -bar.noresources = Missing Resources -bar.corereq = Core Base Required -bar.drillspeed = Vitesse de forage: {0}/s -bar.pumpspeed = Pump Speed: {0}/s -bar.efficiency = Efficacité: {0}% -bar.powerbalance = Énergie: {0} -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Énergie: {0} -bar.poweroutput = Énergie en sortie: {0} -bar.items = Objets: {0} -bar.capacity = Capacity: {0} -bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] -bar.liquid = Liquide -bar.heat = Chaleur -bar.power = Énergie -bar.progress = Progression de la construction -bar.input = Input -bar.output = Output - -bullet.damage = [stat]{0}[lightgray] dégats -bullet.splashdamage = [stat]{0}[lightgray] dgt zone ~[stat] {1}[lightgray] tuiles -bullet.incendiary = [stat]incendiaire -bullet.homing = [stat]autoguidage -bullet.shock = [stat]choc -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray]recul -bullet.freezing = [stat]gel -bullet.tarred = [stat]goudronné -bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions -bullet.reload = [stat]{0}[lightgray]x vitesse de rechargement - -unit.blocks = Blocs -unit.powersecond = Énergie/seconde -unit.liquidsecond = Liquides/seconde -unit.itemssecond = Objets/seconde -unit.liquidunits = Unité de liquide -unit.powerunits = Unité d'énergie -unit.degrees = degrés -unit.seconds = secondes -unit.minutes = mins -unit.persecond = /sec -unit.perminute = /min -unit.timesspeed = x vitesse -unit.percent = % -unit.shieldhealth = shield health -unit.items = Objets -unit.thousands = k -unit.millions = mil -unit.billions = b -category.general = Général -category.power = Énergie -category.liquids = Liquides -category.items = Objets -category.crafting = Fabrication -category.shooting = Défense -category.optional = Améliorations facultatives -setting.landscape.name = Verrouiller la rotation en mode paysage -setting.shadows.name = Ombres -setting.blockreplace.name = Automatic Block Suggestions -setting.linear.name = Filtrage linéaire -setting.hints.name = Hints -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) -setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Eau animée -setting.animatedshields.name = Boucliers Animés -setting.antialias.name = Antialias[lightgray] (demande le redémarrage de l'appareil)[] -setting.playerindicators.name = Player Indicators -setting.indicators.name = Indicateurs d'alliés -setting.autotarget.name = Visée automatique -setting.keyboard.name = Contrôles Souris + Clavier -setting.touchscreen.name = Touchscreen Controls -setting.fpscap.name = Max FPS -setting.fpscap.none = Vide -setting.fpscap.text = {0} FPS -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 -setting.difficulty.normal = Normal -setting.difficulty.hard = Difficile -setting.difficulty.insane = Êxtreme -setting.difficulty.name = Difficulté: -setting.screenshake.name = Tremblement d'écran -setting.effects.name = Montrer les effets -setting.destroyedblocks.name = Display Destroyed Blocks -setting.blockstatus.name = Display Block Status -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding -setting.sensitivity.name = Contôle de la sensibilité -setting.saveinterval.name = Intervalle des sauvegardes auto -setting.seconds = {0} Secondes -setting.blockselecttimeout.name = Block Select Timeout -setting.milliseconds = {0} milliseconds -setting.fullscreen.name = Plein écran -setting.borderlesswindow.name = Fenêtre sans bordure[lightgray] (peut nécessiter un redémarrage) -setting.fps.name = Afficher FPS -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys -setting.vsync.name = VSync -setting.pixelate.name = Pixélisé [lightgray](peut diminuer les performances)[] -setting.minimap.name = Montrer la minimap -setting.coreitems.name = Display Core Items (WIP) -setting.position.name = Show Player Position -setting.musicvol.name = Volume de la musique -setting.atmosphere.name = Show Planet Atmosphere -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.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility -setting.playerlimit.name = Player Limit -setting.chatopacity.name = Opacité du tchat -setting.lasersopacity.name = Power Laser Opacity -setting.bridgeopacity.name = Bridge Opacity -setting.playerchat.name = Afficher le tchat en jeu -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages... -uiscale.cancel = Annuler et quitter -setting.bloom.name = Flou lumineux -keybind.title = Paramétrer les touches -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 -category.blocks.name = Block Select -command.attack = Attaquer -command.rally = Rally -command.retreat = Retraite -command.idle = Idle -placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit -keybind.clear_building.name = Clear Building -keybind.press = Appuyez sur une touche ... -keybind.press.axis = Appuyez sur un axe ou une touche... -keybind.screenshot.name = Map Screenshot -keybind.toggle_power_lines.name = Toggle Power Lasers -keybind.toggle_block_status.name = Toggle Block Statuses -keybind.move_x.name = Mouvement X -keybind.move_y.name = Mouvement Y -keybind.mouse_move.name = Follow Mouse -keybind.pan.name = Pan View -keybind.boost.name = Boost -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y -keybind.category_prev.name = Previous Category -keybind.category_next.name = Next Category -keybind.block_select_left.name = Block Select Left -keybind.block_select_right.name = Block Select Right -keybind.block_select_up.name = Block Select Up -keybind.block_select_down.name = Block Select Down -keybind.block_select_01.name = Category/Block Select 1 -keybind.block_select_02.name = Category/Block Select 2 -keybind.block_select_03.name = Category/Block Select 3 -keybind.block_select_04.name = Category/Block Select 4 -keybind.block_select_05.name = Category/Block Select 5 -keybind.block_select_06.name = Category/Block Select 6 -keybind.block_select_07.name = Category/Block Select 7 -keybind.block_select_08.name = Category/Block Select 8 -keybind.block_select_09.name = Category/Block Select 9 -keybind.block_select_10.name = Category/Block Select 10 -keybind.fullscreen.name = Basculer en plein écran -keybind.select.name = Sélectionner/Tirer -keybind.diagonal_placement.name = Placement en diagonal -keybind.pick.name = Choisir un bloc -keybind.break_block.name = Supprimer un bloc -keybind.deselect.name = Déselectionner -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command -keybind.shoot.name = Tirer -keybind.zoom.name = Zoom -keybind.menu.name = Menu -keybind.pause.name = Pause -keybind.pause_building.name = Pause/Resume Building -keybind.minimap.name = Mini-Map -keybind.chat.name = Tchat -keybind.player_list.name = Liste des joueurs -keybind.console.name = Console -keybind.rotate.name = Tourner -keybind.rotateplaced.name = Rotate Existing (Hold) -keybind.toggle_menus.name = Montrer/Cacher les menus -keybind.chat_history_prev.name = Reculer dans l'historique du tchat -keybind.chat_history_next.name = Suite de l'historique du tchat -keybind.chat_scroll.name = Faire défiler le tchat -keybind.drop_unit.name = Larguer une unité -keybind.zoom_minimap.name = Zoomer la minimap -mode.help.title = Description des modes de jeu -mode.survival.name = Survival -mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques. -mode.sandbox.name = Bac à sable -mode.sandbox.description = Ressources infinies et pas de compte à rebours pour les vagues. -mode.editor.name = Editor -mode.pvp.name = PvP -mode.pvp.description = Lutter contre d'autres joueurs pour gagner ! -mode.attack.name = Attaque -mode.attack.description = Pas de vagues, le but est de détruire la base ennemie. -mode.custom = Règles personnalisées - -rules.infiniteresources = Ressources infinies -rules.reactorexplosions = Reactor Explosions -rules.wavetimer = Temps de vague -rules.waves = Vague -rules.attack = Mode attaque -rules.buildai = AI Building -rules.enemyCheat = Ressources infinies pour l'IA -rules.blockhealthmultiplier = Block Health Multiplier -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Multiplicateur de vitesse de création d'unités -rules.unithealthmultiplier = Multiplicateur de la santé des unités -rules.unitdamagemultiplier = Multiplicateur de dégât des unités -rules.enemycorebuildradius = Rayon de non-construction autour de la base ennemi:[lightgray] (tuiles) -rules.wavespacing = Espacement des vagues:[lightgray] (sec) -rules.buildcostmultiplier = Multiplicateur de coût de construction -rules.buildspeedmultiplier = Multiplicateur de vitesse de construction -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier -rules.waitForWaveToEnd = Les vagues attendent les ennemis -rules.dropzoneradius = Rayon de la zone de largage:[lightgray] (tuiles) -rules.unitammo = Units Require Ammo -rules.title.waves = Vagues -rules.title.resourcesbuilding = Ressources & Bâtiment -rules.title.enemy = Ennemis -rules.title.unit = Unités -rules.title.experimental = Experimental -rules.title.environment = Environment -rules.lighting = Lighting -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Ambient Light -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: - -content.item.name = Objets -content.liquid.name = Liquides -content.unit.name = Unités -content.block.name = Blocs -item.copper.name = Cuivre -item.lead.name = Plomb -item.coal.name = Charbon -item.graphite.name = Graphite -item.titanium.name = Titane -item.thorium.name = Thorium -item.silicon.name = Silicium -item.plastanium.name = Plastanium -item.phase-fabric.name = Phase Fabric -item.surge-alloy.name = Alliage superchargé -item.spore-pod.name = Bulbe sporifère -item.sand.name = Sable -item.blast-compound.name = Mélange explosif -item.pyratite.name = Pyratite -item.metaglass.name = Métaverre -item.scrap.name = Ferraille -liquid.water.name = Eau -liquid.slag.name = Scorie -liquid.oil.name = Pétrole -liquid.cryofluid.name = Liquide Cryogénique - -item.explosiveness = [lightgray]Explosivité: {0} -item.flammability = [lightgray]Inflammabilité: {0} -item.radioactivity = [lightgray]Radioactivité: {0} - -unit.health = [lightgray]Santé: {0} -unit.speed = [lightgray]Vitesse: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Capacité Thermique {0} -liquid.viscosity = [lightgray]Viscosité: {0} -liquid.temperature = [lightgray]Température: {0} - -unit.dagger.name = Poignard -unit.mace.name = Mace -unit.fortress.name = Forteresse -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Chenille -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus - -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax -block.cliff.name = Cliff -block.sand-boulder.name = Sable rocheux -block.grass.name = Herbe -block.slag.name = Slag -block.salt.name = Sel -block.salt-wall.name = Salt Wall -block.pebbles.name = Cailloux -block.tendrils.name = Vrilles -block.sand-wall.name = Sand Wall -block.spore-pine.name = Pin sporifère -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder -block.snow-pine.name = Snow Pine -block.shale.name = Schiste -block.shale-boulder.name = Rocher de schiste -block.moss.name = Mousse -block.shrubs.name = Arbustes -block.spore-moss.name = Mousse sporifère -block.shale-wall.name = Shale Wall -block.scrap-wall.name = Mur de ferraille -block.scrap-wall-large.name = Grand mur de ferraille -block.scrap-wall-huge.name = Enorme mur de ferraille -block.scrap-wall-gigantic.name = Gigantesque mur de ferraille -block.thruster.name = Propulseur -block.kiln.name = Four a métaverre -block.graphite-press.name = Presse à graphite -block.multi-press.name = Multi-Presse -block.constructing = {0}\n[lightgray](En construction) -block.spawn.name = Générateur d'ennemi -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Fondation -block.core-nucleus.name = Core: Nucleus -block.deepwater.name = Eau profonde -block.water.name = Eau -block.tainted-water.name = Eau contaminée -block.darksand-tainted-water.name = Eau contaminée par le sable noir -block.tar.name = Pétrole -block.stone.name = Pierre -block.sand.name = Sable -block.darksand.name = Sable noire -block.ice.name = Glace -block.snow.name = Neige -block.craters.name = Cratères -block.sand-water.name = Eau (sable) -block.darksand-water.name = Eau (sable noir) -block.char.name = Carboniser -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall -block.ice-snow.name = Neige glacée -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall -block.pine.name = Pin -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud -block.white-tree-dead.name = Arbre blanc mort -block.white-tree.name = Arbre blanc -block.spore-cluster.name = Grappe de spores -block.metal-floor.name = Sol métallique -block.metal-floor-2.name = Sol métallique 2 -block.metal-floor-3.name = Sol métallique 3 -block.metal-floor-5.name = Sol métallique 5 -block.metal-floor-damaged.name = Sol métallique endommagé -block.dark-panel-1.name = Panneau noir 1 -block.dark-panel-2.name = Panneau noir 2 -block.dark-panel-3.name = Panneau noir 3 -block.dark-panel-4.name = Panneau noir 4 -block.dark-panel-5.name = Panneau noir 5 -block.dark-panel-6.name = Panneau noir 6 -block.dark-metal.name = Métal noir -block.basalt.name = Basalt -block.hotrock.name = Roche chaude -block.magmarock.name = Roche de magma -block.copper-wall.name = Mur de cuivre -block.copper-wall-large.name = Grand mur de cuivre -block.titanium-wall.name = Mur de titane -block.titanium-wall-large.name = Grand mur de titane -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Mur phasé -block.phase-wall-large.name = Grand mur phasé -block.thorium-wall.name = Mur en thorium -block.thorium-wall-large.name = Grand mur en thorium -block.door.name = Porte -block.door-large.name = Grande porte -block.duo.name = Duo -block.scorch.name = Scorch -block.scatter.name = Scatter -block.hail.name = Hail -block.lancer.name = Lancer -block.conveyor.name = Transporteur -block.titanium-conveyor.name = Transporteur en titane -block.plastanium-conveyor.name = Plastanium Conveyor -block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. -block.junction.name = Junction -block.router.name = Routeur -block.distributor.name = [accent]Distributeur[] -block.sorter.name = Trieur -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message -block.illuminator.name = Illuminator -block.illuminator.description = A small, compact, configurable light source. Requires power to function. -block.overflow-gate.name = Barrière de Débordement -block.underflow-gate.name = Underflow Gate -block.silicon-smelter.name = Fonderie de silicium -block.phase-weaver.name = Tisseur à phase -block.pulverizer.name = Pulvérisateur -block.cryofluid-mixer.name = Refroidisseur -block.melter.name = Four à Fusion -block.incinerator.name = Incinérateur -block.spore-press.name = Spore presse -block.separator.name = Séparateur -block.coal-centrifuge.name = Centrifugeuse à charbon -block.power-node.name = Transmetteur énergétique -block.power-node-large.name = Grand transmetteur énergétique -block.surge-tower.name = Tour de surtension -block.diode.name = Battery Diode -block.battery.name = Batterie -block.battery-large.name = Batterie large -block.combustion-generator.name = Générateur à combustion -block.steam-generator.name = Générateur à turbine -block.differential-generator.name = Générateur différentiel -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 -block.water-extractor.name = Extracteur d'eau -block.cultivator.name = Cultivateur -block.conduit.name = Conduit -block.mechanical-pump.name = Pompe Méchanique -block.item-source.name = Source d'objets -block.item-void.name = Destructeur d'objets -block.liquid-source.name = Source de liquide -block.liquid-void.name = Liquid Void -block.power-void.name = Absorbeur énergétique -block.power-source.name = Puissance infinie -block.unloader.name = Déchargeur -block.vault.name = Coffre-Fort -block.wave.name = Vague -block.swarmer.name = Essaim -block.salvo.name = Salve -block.ripple.name = Ripple -block.phase-conveyor.name = Transporteur phasé -block.bridge-conveyor.name = Pont transporteur -block.plastanium-compressor.name = Compresseur de plastanium -block.pyratite-mixer.name = Mixeur à pyratite -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.repair-point.name = Point de Réparation -block.pulse-conduit.name = Conduit à Impulsion -block.plated-conduit.name = Plated Conduit -block.phase-conduit.name = Conduit à Phase -block.liquid-router.name = Routeur de Liquide -block.liquid-tank.name = Réservoir de Liquide -block.liquid-junction.name = Jonction à Liquide -block.bridge-conduit.name = Pont à liquide -block.rotary-pump.name = Pompe Rotative -block.thorium-reactor.name = Réacteur à Thorium -block.mass-driver.name = Transporteur de masse -block.blast-drill.name = Foreuse à explosion -block.thermal-pump.name = Pompe thermique -block.thermal-generator.name = Générateur thermique -block.alloy-smelter.name = Fonderie d'alliage superchargé -block.mender.name = Gardien -block.mend-projector.name = Projecteur soignant -block.surge-wall.name = Mur superchargé -block.surge-wall-large.name = Grand mur superchargé -block.cyclone.name = Cyclone -block.fuse.name = Fuse -block.shock-mine.name = Mines terrestre -block.overdrive-projector.name = Projecteur accélérant -block.force-projector.name = Projecteur de champ de force -block.arc.name = Arc -block.rtg-generator.name = G.T.R. -block.spectre.name = Spectre -block.meltdown.name = Meltdown -block.container.name = Conteneur -block.launch-pad.name = Rampe de lancement -block.launch-pad-large.name = Grande rampe de lancement -block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome - -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell - -team.blue.name = Bleu -team.crux.name = red -team.sharded.name = orange -team.orange.name = Orange -team.derelict.name = derelict -team.green.name = Vert -team.purple.name = Violet - -tutorial.next = [lightgray] -tutorial.intro = Vous êtes entré dans le[scarlet] Tutoriel de Mindustry.[]\nCommencez par[accent] miner du cuivre[]. Appuyez ou cliquez sur une veine de minerai de cuivre près de votre base pour commencer à miner.\n\n[accent]{0}/{1} cuivre -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre. -tutorial.drill.mobile = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nAppuyez sur l'onglet de forage en bas à droite.\nSélectionnez la[accent] perceuse mécanique[].\nPlacez-la sur une veine de cuivre, puis appuyez sur la[accent] coche(V)[] ci-dessous pour confirmer votre sélection.\nAppuyez sur le [accent] bouton X[]pour annuler le placement. -tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut extraire que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc,[accent] tapez sur le "?" tout en le sélectionnant dans le menu de compilation.[]\n\n[accent]Accédez aux statistiques de la foreuse mécanique maintenant.[] -tutorial.conveyor = [accent]Convoyeurs[] sont utilisés pour transporter des articles à la base.\nFaire une ligne de convoyeurs de la foreuse à la base.\n[accent]Maintenez le clique droit de la souris pour placer dans une ligne.[]\nMaintenir[accent] CTRL[] en sélectionnant une ligne à placer en diagonale.\n\n[accent]Placez 2 convoyeurs avec l'outil ligne, puis livrez un article dans la base. -tutorial.conveyor.mobile = [accent]Convoyeurs[] sont utilisés pour transporter des articles à la base.\nFaire une ligne de convoyeurs de la foreuse à la base.\n[accent] Placez dans une ligne en maintenant votre doigt appuyé pendant quelques secondes[] et en le faisant glisser dans une direction.\n\n[accent]Placez 2 convoyeurs avec l'outil ligne, puis livrez un article dans la base. -tutorial.turret = Des constructions défensives doivent être construites pour repousser [lightgray]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 = Pendant le combat, vous pouvez[accent] mettre le jeu en pause.[]\nVous pouvez construire des bâtiments pendant que le jeu est en pause.\n\n[accent]Appuyez sur espace pour mettre le jeu en pause. -tutorial.pause.mobile = Pendant le combat, vous pouvez[accent] mettre le jeu en pause.[]\nVous pouvez construire des bâtiments pendant que le jeu est en pause.\n\n[accent]Appuyez sur le bouton en haut à gauche pour mettre le jeu en pause. -tutorial.unpause = Appuyez de nouveau sur espace pour reprendre le cour du jeu -tutorial.unpause.mobile = Appuyez de nouveau sur cette touche pour reprendre le cour du jeu -tutorial.breaking = Les blocs doivent souvent être détruits.\n[accent]Maintenez le bouton droit de la souris enfoncé.[] pour détruire tous les blocs sélectionnés.[]\n\n[accent]Détruisez tous les blocs de ferraille à gauche de votre base à l'aide de la sélection de zone. -tutorial.breaking.mobile = Les blocs doivent souvent être détruits.\n[accent]Sélectionnez le mode de déconstruction[], puis appuyez sur un bloc pour commencer à le casser.\nDétruisez une zone en maintenant votre doigt enfoncé pendant quelques secondes[] et glisser dans une direction.\nAppuyez sur la coche(V) pour confirmer.\n\n[accent]Détruisez tous les blocs de ferraille à gauche de votre base à l'aide de la sélection de zone. -tutorial.withdraw = Dans certaines situations, il est nécessaire de prendre des articles directement des blocs..\nPour faire ça, [accent]tapez sur un bloc[] avec des articles à l'intérieur, alors [accent]appuyez sur l'élément[] dans l'inventaire.\nPlusieurs éléments peuvent être retirés en [accent]tapotant et en maintenant enfoncée la touche[].\n\n[accent]Retirez un peu de cuivre de votre base.[] -tutorial.deposit = Déposez les éléments dans des blocs en les faisant glisser de votre vaisseau vers un module de stockage.\n\n[accent]Déposez votre cuivre dans la base.[] -tutorial.waves = Les [lightgray]ennemies[] approchent.\n\nDéfendez votre base durant 2 vagues.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. -tutorial.waves.mobile = [lightgray]Les ennemies approchent[].\n\nDéfendez votre base durant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. -tutorial.launch = Une fois que vous atteignez une vague spécifique, vous êtes en mesure de[accent] lancer votre base[], laissant vos défenses derrière vous et[accent] en obtenant toutes les ressources de votre base.[]\nCes ressources peuvent ensuite servir à la recherche de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement. - -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 = 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 -item.thorium.description = Un métal dense, et radioactif utilisé comme support structurel et comme carburant nucléaire. -item.scrap.description = Restes de vieilles structures et unités. Contient des traces de nombreux métaux différents. -item.silicon.description = Un matériau semi-conducteur extrêmement utile, avec des utilisations dans les panneaux solaires et beaucoup d'autre composants électroniques complexes. -item.plastanium.description = Un matériau léger et docile utilisé dans l'aviation avancée et dans les munitions à fragmentation. -item.phase-fabric.description = Une substance presque en apesanteur utilisée dans l'électronique de pointe et la technologie autoréparable. -item.surge-alloy.description = Un alliage avancé aux propriétés électriques uniques. -item.spore-pod.description = Utilisé pour l'obtention d'huile, d'explosifs et de carburants -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 = 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. - -block.message.description = Stores a message. Used for communication between allies. -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. -block.phase-weaver.description = Produit un tissu de phase à partir de thorium radioactif et de grandes quantités de sable. -block.alloy-smelter.description = Produit un alliage de surtension à partir de titane, plomb, silicium et cuivre. -block.cryofluid-mixer.description = L'eau et le titane combinés forment un fluide cryo beaucoup plus efficace pour le refroidissement. -block.blast-mixer.description = Utilise du pétrole pour transformer la pyratite en un composé explosif moins inflammable mais plus explosif. -block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable. -block.melter.description = Chauffe la pierre à des températures très élevées pour obtenir de la lave. -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 = 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. -block.item-source.description = Sort infiniment les articles. Bac à sable seulement. -block.item-void.description = Détruit tous les objets qui y entrent sans utiliser d'énergie. Bac à sable seulement. -block.liquid-source.description = Débit infini de liquides. Bac à sable seulement. -block.liquid-void.description = Removes any liquids. Sandbox only. -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 = Un bloc défensif modérément fort.\nFournit une protection modérée contre les ennemis. -block.titanium-wall-large.description = Un bloc défensif modérément fort.\nFournit une protection modérée contre les ennemis.\nS'étend sur plusieurs tuiles. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. -block.thorium-wall.description = Un puissant bloc défensif.\nBonne protection contre les ennemis. -block.thorium-wall-large.description = Un puissant bloc défensif.\nBonne protection contre les ennemis.\nS'étend sur plusieurs tuiles. -block.phase-wall.description = Pas aussi fort qu'un mur de thorium, mais détournera les balles à moins qu'elles ne soient trop puissantes. -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 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. -block.shock-mine.description = Endommage les ennemis qui marchent sur la mine. Presque invisible à l'ennemi. -block.conveyor.description = Bloc de transport d'articles standard.\nDéplace les objets et les déposes automatiquement dans des tourelles ou des usines. Rotatif. -block.titanium-conveyor.description = Bloc de transport d'articles avancé.\nDéplace les articles plus rapidement que les convoyeurs standard. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. -block.junction.description = Agit comme un pont pour deux bandes transporteuses qui se croisent.\nUtile dans les situations avec deux convoyeurs différents transportant des matériaux différents à des endroits différents. -block.bridge-conveyor.description = Bloc de transport d'articles avancé. Permet de transporter des objets sur plus de 3 tuiles de n'importe quel terrain ou bâtiment. -block.phase-conveyor.description = Bloc de transport d'articles avancé.\nUtilise le pouvoir de téléporter des articles vers un convoyeur de phase connecté sur plusieurs carreaux. -block.sorter.description = Trie les articles. Si un article correspond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. -block.router.description = Accepte les éléments d'une direction et les envoie dans 3 autres directions de manière égale. Utile pour séparer les matériaux d'une source en plusieurs cibles. -block.distributor.description = Un routeur avancé qui divise les articles en 7 autres directions de manière égale. [scarlet]Seule et unique ![] -block.overflow-gate.description = C'est la combinaison entre un routeur et un diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué. -block.underflow-gate.description = The opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. -block.mass-driver.description = Bloc de transport d'articles ultime.\nRecueille plusieurs objets et les envoie ensuite à un autre pilote de masse sur une longue distance. -block.mechanical-pump.description = Une pompe bon marché avec un débit lent, mais aucune consommation d'énergie. -block.rotary-pump.description = Une pompe avancée qui double la vitesse en utilisant l’énergie. -block.thermal-pump.description = La pompe ultime. Trois fois plus rapide qu'une pompe mécanique et la seule pompe capable de récupérer de la lave. -block.conduit.description = Bloc de transport liquide de base. Fonctionne comme un convoyeur, mais avec des liquides. Utilisation optimale avec des extracteurs, des pompes ou d’autres conduits. -block.pulse-conduit.description = Bloc de transport de liquide avancé. Transporte les liquides plus rapidement et stocke plus que des conduits standard. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. -block.liquid-router.description = Accepte les liquides d'une direction et les envoie dans 3 autres directions de manière égale. Peut également stocker une certaine quantité de liquide. Utile pour séparer les liquides d'une source à plusieurs cibles. -block.liquid-tank.description = Stocke une grande quantité de liquides. Utilisez-le pour créer des tampons en cas de demande non constante de matériaux ou comme protection pour le refroidissement des blocs vitaux. -block.liquid-junction.description = Agit comme un pont pour deux conduits de croisement. Utile dans les situations avec deux conduits différents transportant des liquides différents à des endroits différents. -block.bridge-conduit.description = Bloc de transport de liquide avancé. Permet de transporter des liquides jusqu'à 3 tuiles de n'importe quel terrain ou bâtiment. -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 = Un nÅ“ud d'alimentation extrêmement longue portée avec moins de connexions disponibles. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. -block.battery.description = 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.steam-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. -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 = 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. -block.blast-drill.description = L'extracteur ultime. Nécessite de grandes quantités d'énergie. -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 = 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. [lightgray]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. [lightgray]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 = 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 = 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. -block.arc.description = Une petite tourelle qui tire de l'électricité dans un arc au hasard vers l'ennemi. -block.swarmer.description = Une tourelle de taille moyenne qui tire des missiles éclatés. -block.salvo.description = Une tourelle de taille moyenne qui tire des coups de salves. -block.fuse.description = Une grande tourelle qui tire de puissants faisceaux à courte portée. -block.ripple.description = Une grande tourelle d'artillerie qui tire plusieurs coups simultanément. -block.cyclone.description = Une grande tourelle à tir rapide. -block.spectre.description = Une grande tourelle qui tire deux balles puissantes à la fois. -block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée. -block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index b28d471cdd..47734eb072 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1,47 +1,58 @@ -credits.text = Készítette [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +#A fordításban közreműködött: Vajda Simon, Polgár Sándor és Erdélyi Nimród +credits.text = Készítette: [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Credits -contributors = Fordítók és készítÅ‘k -discord = Csatlakozz a Mindustry Discord-hoz! -link.discord.description = A hivatalos Mindustry Discord chatroom -link.reddit.description = A Mindustry subreddit +contributors = Fordítok és készítÅ‘k +discord = Csatlakozz a Mindustry Discord szerverhez! +link.discord.description = Az eredeti Mindustry Discord chatszoba +link.reddit.description = A Mindustry subreddit link.github.description = A játék forráskódja link.changelog.description = Frissítési változások listája -link.dev-builds.description = Instabil fejlesztÅ‘i build-ek +link.dev-builds.description = Instabil fejlesztÅ‘i buildek link.trello.description = Hivatalos Trello tábla a tervezett funkcióknak link.itch.io.description = itch.io oldal PC letöltésekkel link.google-play.description = Google Play áruház listázás link.f-droid.description = F-Droid katalógus listázás link.wiki.description = Hivatalos Mindustry wiki link.suggestions.description = Új funkciók ajánlása +link.bug.description = Találtál egyet? Jelentsd itt linkfail = Nem sikerült megnyitni a linket!\nAz URL a vágólapra lett másolva. screenshot = KépernyÅ‘kép mentve ide: {0} screenshot.invalid = Túl nagy a térkép, nincsen elég memória a képernyÅ‘képhez. -gameover = Vége a játéknak +gameover = Játék vége +gameover.disconnect = Kapcsolat bontása gameover.pvp = A[accent] {0}[] csapat nyert! +gameover.waiting = [accent]Várakozás a következÅ‘ mapra... highscore = [accent]Új rekord! copied = Másolva. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = A játéknak ez a része még nincsen kész +indev.campaign = [accent]Gratulálunk! Elérted a kampány végét! []\n\nA tartalom jelenleg csak eddig tart. A bolygóközi utazás a jövÅ‘beli frissítésekben szerepel. load.sound = Hangok -load.map = Térképek +load.map = Mapok load.image = Képek load.content = Tartalom load.system = Rendszer load.mod = Modok load.scripts = Szkriptek -be.update = Egy új Bleeding Edge build érhetÅ‘ el: -be.update.confirm = Letöltés és újraindítás?? +be.update = Új Bleeding Edge build áll rendelkezésre: +be.update.confirm = Letölti és újraindítod? be.updating = Frissítés... -be.ignore = Figyelmen kívül hagyás -be.noupdates = Nincsen új frissítés. -be.check = Frissítések keresése +be.ignore = Most nem +be.noupdates = Nem találtunk frissítést. +be.check = Frissítések keresése. + +mod.featured.dialog.title = Mod keresÅ‘ (WIP) +mods.browser.selected = Mod kiválasztása +mods.browser.add = Letöltés +mods.github.open = Megtekintés +mods.browser.sortdate = Rendezés dátum szerint +mods.browser.sortstars = Rendezés értékelés szerint schematic = Schematic schematic.add = Schematic mentése... schematics = Schematicok -schematic.replace = Már van ilyen nevű schematic. Csere? +schematic.replace = Már van ilyen nevű schematic. Lecseréled? schematic.exists = Már van ilyen nevű schematic. schematic.import = Schematic importálása... schematic.exportfile = Exportálás fájlba @@ -55,20 +66,22 @@ schematic.saved = Schematic mentve. schematic.delete.confirm = Ez a Schematic törölve lesz. schematic.rename = Schematic átnevezése schematic.info = {0}x{1}, {2} blokk +schematic.disabled = [scarlet]Schematicok letiltva[]\nNem használhat Schematicot ezen a [accent]mapon[] vagy [accent] szerveren. +stats = Statisztika stat.wave = Hullámok kivédve:[accent] {0} -stat.enemiesDestroyed = Ellenségek kivédve:[accent] {0} +stat.enemiesDestroyed = Elpusztított ellenség:[accent] {0} stat.built = Épített épületek:[accent] {0} -stat.destroyed = Ledöntött épületek:[accent] {0} +stat.destroyed = Szétrombolt épületek:[accent] {0} stat.deconstructed = Törölt épületek:[accent] {0} -stat.delivered = Elindított erÅ‘források: -stat.playtime = JátékidÅ‘:[accent] {0} +stat.delivered = Felküldött nyersanyagok: +stat.playtime = Játszott idÅ‘:[accent] {0} stat.rank = VégsÅ‘ értékelés: [accent]{0} -globalitems = [accent]Global Items -map.delete = Biztos, hogy törölni akarod a "[accent]{0}[]" térképet? -level.highscore = Rekord: [accent]{0} -level.select = Pálya választása +globalitems = [accent]Összes nyersanyag +map.delete = Biztosan törlöd a "[accent]{0}[]" mapot? +level.highscore = Legmagasabb pontszám: [accent]{0} +level.select = Szint kiválasztása level.mode = Játékmód: coreattack = < A mag támadás alatt van! > nearpoint = [[ [scarlet]AZONNAL HAGYD EL A LEDOBÃSI PONTOT[] ]\nveszélyes zóna @@ -76,79 +89,83 @@ database = Mag adatbázis savegame = Játék mentése loadgame = Játék betöltése joingame = Csatlakozás játékhoz -customgame = Speciális játék +customgame = Egyedi játék newgame = Új játék none = -minimap = Minitérkép +none.found = [lightgray] +minimap = Minimap position = Pozíció close = Bezárás website = Weboldal quit = Kilépés -save.quit = Mentés és kilépés -maps = Térképek -maps.browse = Térképek böngészése +save.quit = Mentés & Kilépés +maps = Mapok +maps.browse = Mapok keresése continue = Folytatás -maps.none = [lightgray]Nincsen térkép! +maps.none = [lightgray]Nem találtunk ilyen mapot! invalid = Érvénytelen -pickcolor = Szín kiválasztása +pickcolor = Válassz színt preparingconfig = Konfiguráció elÅ‘készítése preparingcontent = Tartalom elÅ‘készítése uploadingcontent = Tartalom feltöltése uploadingpreviewfile = ElÅ‘nézet feltöltése committingchanges = Változások mentése done = Kész -feature.unsupported = Az eszköz nem támogatja a funkciót. +feature.unsupported = Az eszköz nem támogatja ezt a funkciót. -mods.alphainfo = Figyelem! a modok alfa állapotban vannak, és[scarlet] nagyon sok lehet benne a hiba[].\nJelentsd be az esetleges hibákat a Mindustry GitHubon vagy a Discordon. -mods.alpha = [accent](Alfa) +mods.alphainfo = Figyelem! a modok alfa állapotban vannak, és[scarlet] nagyon sok lehet bennük a hiba[].\nJelentsd be az esetleges hibákat a Mindustry GitHubon. mods = Modok -mods.none = [LIGHT_GRAY]Nincsen Mod! +mods.none = [lightgray]Nincsen mod! mods.guide = Mod készítési útmutató -mods.report = Hiba bejelentése -mods.openfolder = Mod mappa -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.report = Hiba jelentése +mods.openfolder = Megnyitás mappából +mods.reload = Újratöltés +mods.reloadexit = Indítsd újra a játékot, hogy betöltÅ‘djenek a modok. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Aktív mod.disabled = [scarlet]Inaktív mod.disable = Letiltás -mod.content = Content: +mod.content = Tartalom: mod.delete.error = Nem lehet törölni a Modot. Lehet, hogy egy másik folyamat használja. mod.requiresversion = [scarlet]Minimális játék verzió: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) -mod.missingdependencies = [scarlet]Hiányzó függÅ‘ségek: {0} +mod.outdated = [scarlet]Nem kompatibilis V6-tal (no minGameVersion: 105) +mod.missingdependencies = [scarlet]Hiányzó függÅ‘ség: {0} mod.erroredcontent = [scarlet]Tartalom hiba mod.errors = Hiba történt a tartalom betöltése közben. -mod.noerrorplay = [scarlet]Vannak hibás Modok.[] Töröld le vagy javítsd ki a játék elÅ‘tt. +mod.noerrorplay = [scarlet]Vannak hibás Modok.[] Kapcsold ki vagy javítsd ki Å‘ket a játék elÅ‘tt. mod.nowdisabled = [scarlet]A '{0}' Modnak nincsen megfelelÅ‘ függÅ‘sége:[accent] {1}\n[lightgray]Ezeket elÅ‘bb le kell tölteni.\nEz a Mod automatikusan törölve lesz. mod.enable = Engedélyezés mod.requiresrestart = A játék kilép a módosítások alkalmazásához. mod.reloadrequired = [scarlet]Újratöltés szükséges mod.import = Mod importálása -mod.import.file = Import File +mod.import.file = Fájl importálása mod.import.github = GitHub Mod importálása -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]A JAR modok eredendÅ‘en nem biztonságosak.[]\nGyÅ‘zÅ‘dj meg arról, hogy ezt a modot megbízható forrásból importálod! mod.item.remove = Ez az elem része a [accent] '{0}'[] Modnak. A törléshez távolítsd el a Modot. mod.remove.confirm = Ez a Mod törölve lesz. mod.author = [LIGHT_GRAY]KészítÅ‘:[] {0} mod.missing = Ez a mentés nemrég törölt vagy frissített Modokat tartalmaz. ElképzelhetÅ‘, hogy nem fog működni. Biztosan betöltöd?\n[lightgray]Modok:\n{0} mod.preview.missing = MielÅ‘tt publikálod ezt a modot a workshopra, adj hozzá egy borítóképet.\nKészíts egy[accent] preview.png[] nevű képet a mod mappájába, majd próbáld újra. -mod.folder.missing = Csak mappa formában lehet feltölteni a workshopra.\nHogy átalakítsd, csomagold ki a ZIP-et egy mappába és töröld le a régit, Majd indítsd újra a játékot vagy töltsd újra a modot. -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.folder.missing = Csak mappa formában lehet feltölteni a workshopra.\nHogy átalakítsd, csomagold ki a ZIP-et egy mappába és töröld le a régit, majd indítsd újra a játékot vagy töltsd újra a modot. +mod.scripts.disable = Az eszköz nem támogatja a szkriptekkel rendelkezÅ‘ modokat. \nA játékhoz tiltsd le ezeket a modokat. about.button = KözreműködÅ‘k name = Név: -noname = Válassz egy[accent] nevet[] elÅ‘bb. -planetmap = Planet Map -launchcore = Launch Core +noname = ElÅ‘bb válassz egy[accent] nevet[]. +planetmap = Bolygó térkép +launchcore = Mag kilövése filename = Fájl név: unlocked = Új tartalom kinyitva! +available = Új kutatás áll rendelkezésre! completed = [accent]Kész techtree = Tech Tree +research.legacy = [accent]5.0[] kutatási adatok találhatók.\nSzeretnéd [accent] betölteni ezeket az adatokat [], vagy [accent] eldobni [], és újraindítani a kutatást az új kampányban (ajánlott)? +research.load = Betöltés +research.discard = Eldobás research.list = [lightgray]Fedezd fel: research = Felfedezés researched = [lightgray]{0} felfedezve. -research.progress = {0}% complete +research.progress = {0}% kész players = {0} játékos players.single = {0} játékos players.search = keresés @@ -157,7 +174,7 @@ server.closing = [accent]Szerver bezárása... server.kicked.kick = Ki lettél rúgva a szerverrÅ‘l! server.kicked.whitelist = Nem vagy a fehérlistán. server.kicked.serverClose = A szerver be lett zárva. -server.kicked.vote = Le lettél szavazva. Viszlát. +server.kicked.vote = Ki lettél szavazva. Viszlát! server.kicked.clientOutdated = Elavult verziót használsz! Frissítsd a játékot! server.kicked.serverOutdated = Elavult a szerver! Kérd meg a tulajdonost, hogy frissítse! server.kicked.banned = Ki vagy tiltva a szerverrÅ‘l. @@ -171,31 +188,36 @@ server.kicked.customClient = Ez a szerver nem támogatja a saját készítésű server.kicked.gameover = Vége a játéknak! server.kicked.serverRestarting = Ez a szerver újraindul. server.versions = Te verziód:[accent] {0}[]\nSzerver verzió:[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[] or [accent]global[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]If you want to connect to someone by IP, you would need to ask the host for their IP, which can be found by googling "my ip" from their device. -hostserver = Másik játékos meghívása +host.info = A [accent]Hosztolás[] gomb szervert nyit a [scarlet]6567[] porton.\nEzen a [lightgray] wifin vagy a helyi hálózaton [] bárki láthatja a szervert a szerverlistáján.\n\nHa azt szeretnéd, hogy az emberek bárhonnan IP-címmel csatlakozhassanak, [accent] port forwarding [] szükséges.\n\n[lightgray] Megjegyzés: Ha valakinek problémái vannak a LAN-játékhoz való csatlakozással, gyÅ‘zÅ‘dj meg arról, hogy a tűzfal beállításaiban engedélyezted-e a Mindustry hozzáférését a helyi hálózathoz. Ne feledd, hogy a nyilvános hálózatok néha nem teszik lehetÅ‘vé a szerverek felderítését. +join.info = Itt megadhatsz egy [accent]szerver IP-t[] a csatlakozáshoz, vagy felfedezheted a [accent]helyi hálózatot[] vagy [accent]globális[] szervereket, amelyekhez csatlakozhatsz.\n LAN és WAN multiplayer is támogatott.\n\n[lightgray]Ha IP-vel akarsz csatlakozni valakihez, akkor meg kell tudnod a gazdagép IP-jét, amit megtalálhatsz a "my ip" Google kereséssel. +hostserver = Többjátékos játék hosztolása invitefriends = Barátok meghívása -hostserver.mobile = JátékosMeghívása -host = meghívás +hostserver.mobile = Játék hosztolása +host = Hosztolás hosting = [accent]Szerver megnyitása... hosts.refresh = Frissítés hosts.discovering = LAN játék keresése hosts.discovering.any = Játék keresése server.refreshing = Szerver frissítése -hosts.none = [lightgray]Nincsen helyi játék! +hosts.none = [lightgray]Nincs helyi játék! host.invalid = [scarlet]Nem sikerült csatlakozni. -servers.local = Lokális Szerverek +servers.local = Helyi Szerverek servers.remote = Távoli Szerverek servers.global = Közösségi szerverek +servers.disclaimer = A közösségi szervereket [accent]nem[] a fejlesztÅ‘ birtokolja és ellenÅ‘rzi.\n\nA szerverek tartalmazhatnak olyan felhasználók által létrehozott tartalmat, amely nem minden korosztály számára megfelelÅ‘. +servers.showhidden = Rejtett szerverek megjelenítése +server.shown = Látható +server.hidden = Rejtett + trace = Játékos követése trace.playername = Játékos neve: [accent]{0} trace.ip = IP: [accent]{0} trace.id = Azonosító: [accent]{0} trace.mobile = Mobil kliens: [accent]{0} -trace.modclient = Nemhivatalos kliens: [accent]{0} -invalidid = Érvénytelen kliens ID! Submit a bug report. +trace.modclient = Nem hivatalos kliens: [accent]{0} +invalidid = Érvénytelen kliens ID! Küldj hibajelentést. server.bans = Tiltások server.bans.none = Nincsenek tiltott játékosok! server.admins = Adminok @@ -212,19 +234,20 @@ confirmkick = Biztosan kirúgod ezt a játékost? confirmvotekick = Biztosan ki akarod rúgatni ezt a játékost? confirmunban = Biztosan újra engedélyezed ezt a játékost? confirmadmin = Biztosan hozzá akarod adni ezt a játékost az adminokhoz? -confirmunadmin = Biztosan meg akarod szűntetni ennek a játékosnak az admin szátuszát? +confirmunadmin = Biztosan meg akarod szűntetni ennek a játékosnak az adminstátuszát? joingame.title = Csatlakozás joingame.ip = Cím: disconnect = Leválasztva. disconnect.error = Csatlakozási hiba. -disconnect.closed = Csatlakozás bezárva. +disconnect.closed = Kapcsolat bontva. disconnect.timeout = IdÅ‘túllépés. disconnect.data = Nem sikerült betölteni az adatokat! -cantconnect = Nem sikerült csatlakozni ehhez: ([accent]{0}[]). +cantconnect = Nem sikerült csatlakozni a ([accent]{0}[]) játékhoz. connecting = [accent]Csatlakozás... +reconnecting = [accent]Újracsatlakozás... connecting.data = [accent]Betöltés... server.port = Port: -server.addressinuse = Már van ilyen cím! +server.addressinuse = A cím már használatban van! server.invalidport = Érvénytelen port! server.error = [crimson]Nem sikerült megnyitni a szervert. save.new = Új mentés @@ -236,8 +259,8 @@ save.delete.confirm = Biztosan törlöd ezt a mentést? save.delete = Törlés save.export = Exportálás save.import.invalid = [accent]Ez a mentés érvénytelen! -save.import.fail = [crimson]Nem sikerült importálni a[accent]{0}[] mentést -save.export.fail = [crimson]Nem sikerült exportálni a[accent]{0}[] mentést +save.import.fail = [crimson]Nem sikerült importálni a [accent]{0}[] mentést +save.export.fail = [crimson]Nem sikerült exportálni a [accent]{0}[] mentést save.import = Importálás save.newslot = Név: save.rename = Ãtnevezés @@ -252,7 +275,7 @@ off = Ki save.autosave = Automatikus mentés: {0} save.map = Térkép: {0} save.wave = Hullám: {0} -save.mode = Mód: {0} +save.mode = Játékmód: {0} save.date = Utolsó Mentés: {0} save.playtime = JátékidÅ‘: {0} warning = Figyelmeztetés. @@ -267,261 +290,297 @@ cancel = Mégse openlink = Link megnyitása copylink = Link másolása back = Vissza +max = Max +crash.export = Összeomlási napló exportálása +crash.none = Nem található összeomlási napló. +crash.exported = Összeomlási napló exportálva. data.export = Adatok Exportálása data.import = Adatok Importálása data.openfolder = Adat mappa megnyitása data.exported = Adat exportálva. data.invalid = Érvénytelen adatok. -data.import.confirm = KülsÅ‘ adat importálása felülírja[scarlet] minden[] jelenlegi állapotodat.\n[accent]Nem lehet visszavonni![]\n\nAmint kész az importálás, kilép a játék. +data.import.confirm = KülsÅ‘ adat importálása felülírja[scarlet] minden[] jelenlegi adatodat.\n[accent]Nem lehet visszavonni![]\n\nAmint kész az importálás, kilép a játék. quit.confirm = Biztos kilépsz? quit.confirm.tutorial = Biztosan tudod, mit csinálsz?\nA bevezetÅ‘t megtalálod itt:[accent] Beállítások->Játék->BevezetÅ‘ újrajátszása[] loading = [accent]Betöltés... -reloading = [accent]Reloading Mods... -saving = [accent]Saving... -respawn = [accent][[{0}][] to respawn in core -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +reloading = [accent]Modok Újratöltése... +saving = [accent]Mentés... +respawn = Nyomd meg a(z) [accent][[{0}][] gombot, hogy újraéledj a magban. +cancelbuilding = Használd a(z) [accent][[{0}][] gombot, hogy töröld a tervrajzot. +selectschematic = Használd a(z) [accent][[{0}][] gombot, hogy kijelölj és másolj. +pausebuilding = Használd a(z) [accent][[{0}][] gombot, hogy megállítsd az építkezést. +resumebuilding = Használd a(z) [scarlet][[{0}][] gombot, hogy folytasd az építkezést. +showui = A kezelÅ‘felület elrejtve.\nNyomd meg a(z) [accent][[{0}][] gombot a megjelenítéséhez. wave = [accent]{0}. hullám -wave.waiting = [lightgray]KövetkezÅ‘ hullám: {0} -wave.waveInProgress = [lightgray]Wave in progress +wave.cap = [accent]{0}./{1} hullám +wave.waiting = [lightgray]KövetkezÅ‘ hullám {0} +wave.waveInProgress = [lightgray]Hullám folyamatban waiting = [lightgray]Várakozás... -waiting.players = Waiting for players... -wave.enemies = [lightgray]{0} ellenség maradt -wave.enemy = [lightgray]{0} ellenség maradt -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[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. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +waiting.players = Várakozás a játékosokra... +wave.enemies = [lightgray]{0} Megmaradt ellenség +wave.enemycores = [accent]{0}[lightgray] Ellenséges mag +wave.enemycore = [accent]{0}[lightgray] Ellenséges mag +wave.enemy = [lightgray]{0} Megmaradt ellenség +wave.guardianwarn = Egy Å‘rzÅ‘ érkezik [accent]{0}[] hullám múlva. +wave.guardianwarn.one = Egy Å‘rzÅ‘ érkezik [accent]{0}[] hullám múlva. +loadimage = Fénykép betöltése +saveimage = Fénykép mentése +unknown = Ismeretlen +custom = Egyedi +builtin = Beépített +map.delete.confirm = Biztosan törlöd ezt a mapot? Ez a művelet nem visszavonható! +map.random = [accent]Véletlenszerű Map +map.nospawn = Ez a map nem rendelkezik maggal, amelyen a játékos kezdhet! Adj hozzá egy [accent]narancssárga[] magot ehhez a maphoz a szerkesztÅ‘ben! +map.nospawn.pvp = Ezen a térképen nincsen ellenséges mag, amelyen a másik csapat kezdhet! Adjon hozzá [scarlet]nem narancssárga[] magot ehhez a maphoz a szerkesztÅ‘ben! +map.nospawn.attack = Ezen a térképen nincsen ellenséges mag! Adjon hozzá [scarlet]piros[] magot ehhez a maphoz a szerkesztÅ‘ben! +map.invalid = Hiba történt a map betöltésekor: sérült vagy érvénytelen mapfájl. +workshop.update = Item frissítése +workshop.error = Hiba történt a workshop részleteinek lekérdezésekor: {0} +map.publish.confirm = Biztos, hogy közzéteszed ezt a mapot?\n\n[lightgray] GyÅ‘zÅ‘dj meg róla, hogy elfogadtad a Workshop EULA-t, különben a mapjaid nem jelennek meg! +workshop.menu = Válaszd ki, mit szeretnél csinálni ezzel az itemmel. +workshop.info = Item Infó +changelog = Változtatási napló (opcionális): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +missing = Ezt az elemet törölték vagy áthelyezték.\n[lightgray] A workshop adatait automatikusan leválasztották. +publishing = [accent]Publikálás... +publish.confirm = Biztosan közzéteszed?\n\n[lightgray] GyÅ‘zÅ‘dj meg róla, hogy elfogadtad a Workshop EULA-t, különben az itemjeid nem jelennek meg! +publish.error = Hiba az item publikálásakor: {0} +steam.error = Nem sikerült inicializálni a Steam szolgáltatásokat.\nHiba: {0} -editor.brush = Brush -editor.openin = Open In Editor -editor.oregen = Ore Generation -editor.oregen.info = Ore Generation: -editor.mapinfo = Map Info -editor.author = Author: -editor.description = Description: -editor.nodescription = A map must have a description of at least 4 characters before being published. -editor.waves = Waves: -editor.rules = Rules: -editor.generation = Generation: -editor.ingame = Edit In-Game -editor.publish.workshop = Publish On Workshop -editor.newmap = New Map +editor.brush = Méret +editor.openin = Megnyitás a szerkesztÅ‘ben +editor.oregen = Érc generálás +editor.oregen.info = Érc generálás: +editor.mapinfo = Ãltalános +editor.author = KészítÅ‘: +editor.description = Leírás: +editor.nodescription = A mapnak rendelkeznie kell egy legalább 4 karakter hosszú leírással, mielÅ‘tt megosztod. +editor.waves = Hullámok: +editor.rules = Szabályok: +editor.generation = generálás: +editor.ingame = Szerkesztés játékban +editor.publish.workshop = Közzététel workshopon +editor.newmap = Új Map +editor.center = Ugrás középre workshop = Workshop -waves.title = Waves -waves.remove = Remove -waves.never = -waves.every = every -waves.waves = wave(s) +waves.title = Hullámok +waves.remove = Eltávolítás +waves.every = +waves.waves = hullámonként waves.perspawn = per spawn -waves.shields = shields/wave -waves.to = to -waves.guardian = Guardian -waves.preview = Preview -waves.edit = Edit... -waves.copy = Copy to Clipboard -waves.load = Load from Clipboard -waves.invalid = Invalid waves in clipboard. -waves.copied = Waves copied. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.shields = pajzs/hullám +waves.to = - +waves.guardian = Å‘rzÅ‘ +waves.preview = ElÅ‘nézet +waves.edit = Szerksztés... +waves.copy = Másolás a vágólapra +waves.load = Másolás a vágólapról +waves.invalid = Nem lehet beilleszteni a vágólapról. +waves.copied = Hullámok másolva. +waves.none = Nincs ellenség megadva.\nAz üresen hagyott tervek automatikusan lecserélÅ‘dnek az alapbeállításra. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#these are intentionally in lower case +wavemode.counts = típusokra bontva +wavemode.totals = öszzesítés +wavemode.health = életpontok -editor.default = [lightgray] -details = Details... -edit = Edit... -editor.name = Name: +editor.default = [lightgray] +details = Részletek... +edit = Szerkesztés... +editor.name = Név: editor.spawn = Spawn Unit editor.removeunit = Remove Unit -editor.teams = Teams -editor.errorload = Error loading file. -editor.errorsave = Error saving file. -editor.errorimage = That's an image, not a map.\n\nIf you want to import a 3.5/build 40 map, use the 'Import Legacy Map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. -editor.errornot = This is not a map file. -editor.errorheader = This map file is either not valid or corrupt. -editor.errorname = Map has no name defined. Are you trying to load a save file? -editor.update = Update -editor.randomize = Randomize -editor.apply = Apply -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. -editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! -editor.import = Import... -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 Legacy Map -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 = Import Terrain -editor.saveimage = Export Terrain -editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? -editor.resizemap = Resize Map -editor.mapname = Map Name: -editor.overwrite = [accent]Warning!\nThis overwrites an existing map. -editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? -editor.exists = A map with this name already exists. -editor.selectmap = Select a map to load: +editor.teams = Csapatok +editor.errorload = Hiba a fájl betöltése közben. +editor.errorsave = Hiba a fájl mentése közben. +editor.errorimage = Ez egy kép, nem egy Map.\n\nHa egy 3.5/build 40 Mapot szeretnél betölteni, használd a "Régi map betöltése" gombot a szerkesztÅ‘ben. +editor.errorlegacy = Ez a Map túl régi, és már nem támogatott formátumot használ. +editor.errornot = Ez nem egy Map fájl. +editor.errorheader = Ez a map fájl vagy érvénytelen vagy sérült. +editor.errorname = A Mapnak nincs neve. Mentést próbálsz betölteni? +editor.update = Frissítés +editor.randomize = Véletlenszerű +editor.apply = Alkalmazás +editor.generate = Haladó funkciók +editor.resize = Ãtméretezés +editor.loadmap = Map betöltése +editor.savemap = Mentés +editor.saved = Mentve! +editor.save.noname = Nem adtál meg nevet! Ãllíts be egyet az "Ãltalános" menüpont alatt! +editor.save.overwrite = A Mapod felülír egy már létezÅ‘ Mapot! Válassz egy másik nevet az "Ãltalános" menüpont alatt! +editor.import.exists = [scarlet]Nem lehet importálni:[] Már létezik "{0}" nevű Map! +editor.import = Importálás +editor.importmap = Map importálása +editor.importmap.description = LétezÅ‘ Map importálása +editor.importfile = Fájl importálása +editor.importfile.description = KülsÅ‘ Map fájl importálása +editor.importimage = Képfájl importálása +editor.importimage.description = KülsÅ‘ Map képfájl importálása +editor.export = Exportálás +editor.exportfile = Fájl exportálása +editor.exportfile.description = Exportálás Map fájlba +editor.exportimage = Domborzat exportálása +editor.exportimage.description = Domborzat exportálása képfájlba +editor.loadimage = Domborzat importálása +editor.saveimage = Domborzat exportálása +editor.unsaved = Biztos ki akarsz lépni?\n[scarlet]A nem mentett módosításaid elvesznek! +editor.resizemap = Ãtméretezés +editor.mapname = Map neve: +editor.overwrite = [accent]Vigyázz!\nEzzel felülírsz egy már létezÅ‘ Mapot. +editor.overwrite.confirm = [scarlet]Vigyázz![] Ilyen nevű Map már létezik:\n"[accent]{0}[]"\nBiztosan felülírod? +editor.exists = Ilyen nevű Map már létezik. +editor.selectmap = Válassz ki egy Mapot: -toolmode.replace = Replace +toolmode.replace = Csere 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.replaceall = Összes cseréje +toolmode.replaceall.description = Összes cseréje +toolmode.orthogonal = MerÅ‘leges +toolmode.orthogonal.description = Csak merÅ‘leges vonalakat rajzol. +toolmode.square = Négyzet +toolmode.square.description = Négyzet ecset +toolmode.eraseores = Ércradír +toolmode.eraseores.description = Csak az érceket törli. toolmode.fillteams = Fill Teams toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Draw Teams toolmode.drawteams.description = Draw teams instead of blocks. -filters.empty = [lightgray]No filters! Add one with the button below. +filters.empty = [lightgray]Még nincs filter! Adj hozzá egyet a lenti gombra kattintva! filter.distort = Distort -filter.noise = Noise +filter.noise = Zaj filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select -filter.median = Median -filter.oremedian = Ore Median +filter.median = Medián +filter.oremedian = Érc medián filter.blend = Blend -filter.defaultores = Default Ores -filter.ore = Ore -filter.rivernoise = River Noise -filter.mirror = Mirror -filter.clear = Clear +filter.defaultores = Alapértelmezett ércek +filter.ore = Érc +filter.rivernoise = Vízfolyás zaj +filter.mirror = Tükrözés +filter.clear = Blokkok törlése filter.option.ignore = Ignore filter.scatter = Scatter -filter.terrain = Terrain -filter.option.scale = Scale -filter.option.chance = Chance +filter.terrain = Domborzat +filter.option.scale = Méret +filter.option.chance = Gyakoriság 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.amount = Amount +filter.option.amount = Mennyiség filter.option.block = Block -filter.option.floor = Floor -filter.option.flooronto = Target Floor -filter.option.wall = Wall -filter.option.ore = Ore +filter.option.floor = Talaj +filter.option.flooronto = Jelenlegi mezÅ‘ +filter.option.target = Jelenlegi mezÅ‘ +filter.option.wall = Fal +filter.option.ore = Érc filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold -filter.option.radius = Radius -filter.option.percentile = Percentile +filter.option.radius = Sugár +filter.option.percentile = Arány width = Szélesség: height = Magasság: menu = Menü -play = Indítás -campaign = Campaign -load = Load -save = Save +play = Játék +campaign = Kampány +load = Betöltés +save = Mentés fps = FPS: {0} ping = Ping: {0}ms -language.restart = Please restart your game for the language settings to take effect. +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb +language.restart = Indítsd újra a játékot, hogy betöltÅ‘djenek a nyelvi beállítások! settings = Beállítások tutorial = BevezetÅ‘ tutorial.retake = BevezetÅ‘ újrajátszása editor = SzerkesztÅ‘ -mapeditor = TérképszerkesztÅ‘ +mapeditor = Map szerkesztÅ‘ -abandon = Elhagyás -abandon.text = Ez a zóna és minden tartalma el lesz hagyva. -locked = Zárva -complete = [lightgray]Complete: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} -bestwave = [lightgray]Best Wave: {0} -launch = < INDÃTÃS > -launch.text = Launch -launch.title = Indítás sikeres -launch.next = [lightgray]következÅ‘ lehetÅ‘ség a {0}. hullámnál -launch.unable2 = [scarlet]Nem lehet ELINDÃTANI.[] -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 -loadout = Loadout -resources = Resources -bannedblocks = Banned Blocks -addall = Add All -launch.destination = Destination: {0} -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [lightgray]{0} unlocked. -zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} -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 +abandon = Feladás +abandon.text = Ez a szektor benne minden nyersanyaggal az ellenség kezére kerül. +locked = Lezárva +complete = [lightgray]Feltételek: +requirement.wave = Juss el a {0}. hullámig {1} szektorban +requirement.core = Pusztítsd el az ellenséges magot {0} szektorban +requirement.research = Fedezd fel: {0} +requirement.produce = Gyártsd le: {0} +requirement.capture = Foglald el a(z) {0} szektort +launch.text = Indítás +research.multiplayer = Csak a host fedezhet fel itemeket. +map.multiplayer = Csak a host tekintheti meg a szektorokat. +uncover = Felfedés +configure = Rakomány szerkesztése -connectfail = [crimson]Connection error:\n\n[accent]{0} -error.unreachable = Server unreachable.\nIs the address spelled correctly? -error.invalidaddress = Invalid address. -error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -error.alreadyconnected = Already connected. -error.mapnotfound = Map file not found! -error.io = Network I/O error. -error.any = Unknown network error. +loadout = Rakomány +resources = Nyersanyagok +bannedblocks = Tiltott blokkok +addall = Összes hozzáadása +launch.from = Indítás: [accent]{0} +launch.destination = Irány: {0} +configure.invalid = A mennyiségnek 0 és {0} között kell lennie. +add = Hozzáadás... +boss.health = ÅrzÅ‘ élete + +connectfail = [scarlet]Csatlakozási hiba:\n\n[accent]{0} +error.unreachable = A szervert nem lehet elérni.\nBiztosan jól írtad be a címet? +error.invalidaddress = Érvénytelen cím. +error.timedout = IdÅ‘túllépés!\nGyÅ‘zÅ‘dj meg róla, hogy a port forwarding be van kapcsolva a host gépen és a cím helyes! +error.mismatch = Packet error:\nLehetséges kliens/szerver verzió eltérés.\nGyÅ‘zÅ‘dj meg róla, hogy te és a host is a Mindustry legfrissebb verzióját használjátok! +error.alreadyconnected = Már csatlakozva vagy. +error.mapnotfound = A map fájl nem található! +error.io = Internet I/O hiba. +error.any = Ismeretlen internet hiba. error.bloom = Failed to initialize bloom.\nYour device may not support it. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = EsÅ‘ +weather.snow.name = Hóesés +weather.sandstorm.name = Homokvihar +weather.sporestorm.name = Spóravihar +weather.fog.name = Köd -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select +sectors.unexplored = [lightgray]Felderítetlen +sectors.resources = Nyersanyagok: +sectors.production = Gyártás: +sectors.export = Export: +sectors.time = IdÅ‘: +sectors.threat = Fenyegetés: +sectors.wave = Hullámok: +sectors.stored = Tárolt: +sectors.resume = Folytatás +sectors.launch = Indítás +sectors.select = Kiválasztás sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Szektor átnevezése +sectors.enemybase = [scarlet]Ellenséges bázis +sectors.vulnerable = [scarlet]SebezhetÅ‘ +sectors.underattack = [scarlet]Támadás alatt! [accent]{0}% sérült +sectors.survives = [accent]Túlél {0} hullámot +sectors.go = Utazás +sector.curcapture = Szektor megszerezve +sector.curlost = A szektor elveszett +sector.missingresources = [scarlet]Nincs elég nyersanyag +sector.attacked = A(z) [accent]{0}[white] szektor támadás alatt áll! +sector.lost = A(z) [accent]{0}[white] szektor elveszett! +#note: the missing space in the line below is intentional +sector.captured = A(z) [accent]{0}[white] szektor megvédve! +threat.low = Alacsony +threat.medium = Közepes +threat.high = Magas +threat.extreme = Extrém +threat.eradication = Felszámolás + +planets = Bolygók + +planet.serpulo.name = Serpulo +planet.sun.name = Nap + +sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -533,368 +592,417 @@ sector.overgrowth.name = Overgrowth sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass +sector.biomassFacility.name = Biomass Synthesis Facility +sector.windsweptIslands.name = Windswept Islands +sector.extractionOutpost.name = Extraction Outpost +sector.planetaryTerminal.name = Planetary Launch Terminal -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -settings.language = Language -settings.data = Game Data -settings.reset = Reset to Defaults -settings.rebind = Rebind -settings.resetKey = Reset -settings.controls = Controls -settings.game = Game -settings.sound = Sound -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.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves -paused = [accent]< Paused > -clear = Clear -banned = [scarlet]Banned -unplaceable.sectorcaptured = [scarlet]Requires captured sector -yes = Yes -no = No -info.title = Info -error.title = [crimson]An error has occured -error.crashtitle = An error has occured -unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +sector.groundZero.description = Az ideális helyszín, hogy ismét belekezdjünk. Alacsony ellenséges fenyegetés. Némi nyersanyag.\nGyűjts annyi rezet és ólmot, amennyit csak tudsz.\nHaladj tovább. +sector.frozenForest.description = Még itt, a hegyekhez közel is elterjedtek a spórák. A fagypont alatti hÅ‘mérséklet nem tudja örökké fogva tartani Å‘ket.\n\nFedezd fel az lelktromosság erejét! Építs combustion generatort! Használj mendert! +sector.saltFlats.description = A sivatag peremén terül el a Salt Flats néven ismert síkság. Kevés nyersanyag található errefelé.\n\nAz ellenség egy raktárkomplexumot létesített itt. Pusztítsd el a magot! KÅ‘ kövön ne maradjon! +sector.craters.description = Régen háborúk folytak ezen a helyen és csak egy kráter maradt utánuk. De szerencsédre az évezredek alatt feltöltÅ‘dött vízzel így letudod hűteni vele a drilljeidet. Persze elÅ‘tte használd a homokot, hogy legyen üveged! +sector.ruinousShores.description = A romokon túl fekszik a vízpart. Egykor itt állt egy parti védelmi vonal. Mára nem sok maradt belÅ‘le. Csak a legegyszerűbb védelmi épületek maradtak sértetlenek, bármi más csak törmelékként van jelen.\nFolytasd a terjeszkedést! Fedezd fel a régi technológiákat! +sector.stainedMountains.description = Mélyebben benn a szárazföldön fekszenek a hegyek, a spóráktól még érintetlenül.\nTermeld ki a bÅ‘séges titanium készleteket a körzetben. Tanuld meg felhasználni!.\n\nAz ellenség itt nagyobb létszámban van jelen. Ne hagyj nekik idÅ‘t, hogy a legerÅ‘sebb egységeiket hadba állíthassák! +sector.overgrowth.description = Ez a terület közelebb esik a spórák forrásához, a spórák már kinÅ‘tték.\nAz ellenség egy helyÅ‘rséget létesített itt. Építs Mace egységeket! Pusztítsd el! +sector.tarFields.description = Egy olajtermelÅ‘ övezet peremvidéke a hegyek és a sivatag között. Egy a kevés térség közül, ahol még hasznosítható kátránykészletek találhatók.\nBár a terület elhagyatott, veszélyes ellenséges erÅ‘k fészkelnek a közelben. Ne becsüld alá Å‘ket!\n\n[lightgray]Fedezd fel az olajfeldolgozási lehetÅ‘ségeket, ha tudod! +sector.desolateRift.description = Egy extrém veszélyes zóna. Nyersanyagokban gazdag, de szűkös a hely. Magas kockázat. Hagyd el, amint lehet! Ne tévesszen meg a hosszú szünet az ellenség támadásai között! +sector.nuclearComplex.description = Egy néhai létesítmény thorium kitermelésére és feldolgozására, romokban.\n[lightgray] Fedezd fel a thoriumot és sokrétű felhasználását!\n\nAz ellenség nagy létszámban van jelen, és folyamatosan megfigyelés alatt tartják a környéket. +sector.fungalPass.description = Ãtmenet a magas hegyek és a mélyebben fekvÅ‘, spórák uralta lapály között. Egy kisebb ellenséges megfigyelÅ‘ állomás található itt.\nSemmisítsd meg!.\nHasználj Dagger és Crawler egységeket! Pusztítsd el a két magot! +sector.biomassFacility.description = A spórák származási helye. Ebben a létesítményben fejlesztették ki Å‘ket és eredetileg itt került sor a gyártásukra.\nFedezd fel az itt található technológiákat! Használd a spórákat üzemanyag és műanyagok gyártására!\n\n[lightgray]A létesítmény pusztulása nyomán a spórák elszabadultak. A helyi ökoszisztémában semmi sem tudta felvenni a versenyt egy ennyire invazív életformával. +sector.windsweptIslands.description = Távolabb a partvonalon túl fekszik ez az elszigetelt szigetcsoport. Feljegyzések szerint egykor [accent]Plastanium[] gyártása zajlott itt.\n\nVerd vissza az ellenség vízi egységeit! Ãllíts fel egy bázist a szigeteken! Fedezd fel az itt talált gyárakat! +sector.extractionOutpost.description = Távoli ellenséges támaszpont, fÅ‘ célja nyersanyagok továbbítása másik szektorokba.\n\n A szektorok közötti szállítás elengedhetetlen a további elÅ‘rehaladáshoz. Pusztítsd el a bázist! Tanulmányozd a Launch Padot! +sector.impact0078.description = Itt fekszenek a roncsai az elsÅ‘ csillagközi űrhajónak, amely a csillagrendszerbe érkezett.\n\nMents ki a romokból amit csak tudsz! Fedezd fel az épen maradt technológiákat. +sector.planetaryTerminal.description = A végsÅ‘ célpont.\n\nEzen a vízparti bázison található egy olyan építmény, amely képes magokat kilÅ‘ni közeli bolygókra. Folyamatosan Å‘rzik.\n\nKészíts vízi egységeket! Ãrtalmatlanítsd az ellenséget amilyen gyorsan tudod! Fedezd fel a kilövÅ‘szerkezetet! + +settings.language = Nyelvek +settings.data = Játék adatok +settings.reset = Alapértelmezett +settings.rebind = Módosítás +settings.resetKey = Visszaállítás +settings.controls = Irányítás +settings.game = Játék +settings.sound = Hangok +settings.graphics = Grafika +settings.cleardata = Játék adatok törlése... +settings.clear.confirm = Biztosan törlöd ezeket az adatokat?\n A műveletet nem lehet visszavonni! +settings.clearall.confirm = [scarlet] FIGYELEM! []\n Ez törli az összes adatot, beleértve a mentéseket, Mapokat, felfedezéseket és a billentyű beállításokat.\nAz 'OK' gomb megnyomásával a játék minden adatot töröl és automatikusan kilép. +settings.clearsaves.confirm = Biztosan törlöd az összes mentést? +settings.clearsaves = Mentések törlése +settings.clearresearch = Kutatás törlése +settings.clearresearch.confirm = Biztosan törlöd az összes kutatást? +settings.clearcampaignsaves = Kampány mentések törlése +settings.clearcampaignsaves.confirm = Biztosan törlöd az összes kampány mentést? +paused = [accent]< Megállítva > +clear = Törlés +banned = [scarlet]Kitiltva +yes = Igen +no = Nem +info.title = Infó +error.title = [scarlet]Hiba történt +error.crashtitle = Hiba történt +unit.nobuild = [scarlet]Az egység nem tud építeni +lastaccessed = [lightgray]Utoljára megtekintve: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -bar.drilltierreq = Better Drill Required -bar.noresources = Missing Resources +stat.description = Célja +stat.input = Bemenet +stat.output = Kimenet +stat.booster = Gyorsító +stat.tiles = Szükséges talaj +stat.affinities = Módosító körülmények +stat.powercapacity = Elektromos kapacitás +stat.powershot = Ãram/Lövés +stat.damage = Sebzés +stat.targetsair = RepülÅ‘ célpontok +stat.targetsground = Földi célpontok +stat.itemsmoved = Hozam +stat.launchtime = Kilövések közti idÅ‘ +stat.shootrange = Hatótáv +stat.size = Méret +stat.displaysize = Felbontás +stat.liquidcapacity = Folyadék kapacitás +stat.powerrange = Ãram hatótáv +stat.linkrange = Kapcsolat hatótáv +stat.instructions = Műveletek +stat.powerconnections = Max kapcsolat +stat.poweruse = Ãramhasználat +stat.powerdamage = Ãram/Sebzés +stat.itemcapacity = Item kapacitás +stat.memorycapacity = Memória méret +stat.basepowergeneration = Alap áramtermelés +stat.productiontime = Gyártás hossza +stat.repairtime = Teljes javítás hossza +stat.weapons = Fegyverek +stat.bullet = Töltény +stat.speedincrease = Gyorsítás +stat.range = Hatótáv +stat.drilltier = KitermelhetÅ‘ +stat.drillspeed = Alap kitermelési sebesség +stat.boosteffect = Boost hatása +stat.maxunits = Maximális aktív egység +stat.health = Életpontok +stat.buildtime = Építés hossza +stat.maxconsecutive = Maximum egymást követÅ‘ +stat.buildcost = Építés ára +stat.inaccuracy = Pontatlanság +stat.shots = Lövés +stat.reload = Lövés/Másodperc +stat.ammo = Lövedék +stat.shieldhealth = Pajzs élete +stat.cooldowntime = Újratöltés hossza +stat.explosiveness = Robbanékonyság +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Villámlás esélye +stat.lightningdamage = Villámlás sebzése +stat.flammability = ÉghetÅ‘ség +stat.radioactivity = Radioaktivitás +stat.charge = Charge +stat.heatcapacity = HÅ‘kapacitás +stat.viscosity = Viszkozitás +stat.temperature = HÅ‘mérséklet +stat.speed = Sebesség +stat.buildspeed = Építési sebesség +stat.minespeed = Kitermelési sebesség +stat.minetier = Kitermelési szint +stat.payloadcapacity = Teher kapacitás +stat.commandlimit = Utasítás limit +stat.abilities = Képességek +stat.canboost = Can Boost +stat.flying = Repül +stat.ammouse = Lövedék használat + +ability.forcefield = ErÅ‘tér +ability.repairfield = Javító mezÅ‘ +ability.statusfield = Status Field +ability.unitspawn = {0} Gyár +ability.shieldregenfield = Pajzsos regeneráló mezÅ‘ +ability.movelightning = Világítás + +bar.drilltierreq = ErÅ‘sebb Drill szükséges +bar.noresources = Nincs elég nyersanyag bar.corereq = Core Base Required -bar.drillspeed = Drill Speed: {0}/s -bar.pumpspeed = Pump Speed: {0}/s -bar.efficiency = Efficiency: {0}% -bar.powerbalance = Power: {0}/s -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} -bar.items = Items: {0} -bar.capacity = Capacity: {0} +bar.drillspeed = Kitermelés: {0}/s +bar.pumpspeed = Kitermelés: {0}/s +bar.efficiency = Hatékonyság: {0}% +bar.boost = Boost: {0}% +bar.powerbalance = Ãram: {0}/s +bar.powerstored = Tárolt: {0}/{1} +bar.poweramount = Ãram: {0} +bar.poweroutput = Ãramtermelés: {0} +bar.powerlines = Kapcsolat: {0}/{1} +bar.items = Nyersanyag: {0} +bar.capacity = Tárhely: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] -bar.liquid = Liquid -bar.heat = Heat -bar.power = Power -bar.progress = Build Progress -bar.input = Input -bar.output = Output +bar.liquid = Folyadék +bar.heat = HÅ‘ +bar.power = Ãram +bar.progress = Építés állapota +bar.input = Bemenet +bar.output = Kimenet -bullet.damage = [stat]{0}[lightgray] damage -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles -bullet.incendiary = [stat]incendiary -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing +units.processorcontrol = [lightgray]Processor Controlled + +bullet.damage = [stat]{0}[lightgray] sebzés +bullet.splashdamage = [stat]{0}[lightgray] területi sebzés ~[stat] {1}[lightgray] mezÅ‘ +bullet.incendiary = [stat]gyújtó +bullet.sapping = [stat]szipoly +bullet.homing = [stat]nyomkövetÅ‘ +bullet.shock = [stat]sokkoló +bullet.frag = [stat]repesz +bullet.buildingdamage = [stat]{0}%[lightgray] épület sebzés +bullet.knockback = [stat]{0}[lightgray] hátralökés +bullet.pierce = [stat]{0}[lightgray]x átütÅ‘ +bullet.infinitepierce = [stat]átütÅ‘ +bullet.healpercent = [stat]{0}[lightgray]% gyógyító +bullet.freezing = [stat]fagyasztó bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x fire rate +bullet.multiplier = [stat]{0}[lightgray]x lövedék szorzó +bullet.reload = [stat]{0}[lightgray]x tüzelési sebesség -unit.blocks = blocks -unit.powersecond = power units/second -unit.liquidsecond = liquid units/second -unit.itemssecond = items/second -unit.liquidunits = liquid units -unit.powerunits = power units -unit.degrees = degrees -unit.seconds = seconds -unit.minutes = mins +unit.blocks = blokk +unit.blockssquared = blokk² +unit.powersecond = egység/sec +unit.liquidsecond = egység/sec +unit.itemssecond = item/sec +unit.liquidunits = egység +unit.powerunits = egység +unit.degrees = fok +unit.seconds = másodperc +unit.minutes = perc unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed unit.percent = % unit.shieldhealth = shield health -unit.items = items +unit.items = item unit.thousands = k unit.millions = mil -unit.billions = b -category.general = General -category.power = Power -category.liquids = Liquids -category.items = Items -category.crafting = Input/Output -category.shooting = Shooting -category.optional = Optional Enhancements -setting.landscape.name = Lock Landscape -setting.shadows.name = Shadows -setting.blockreplace.name = Automatic Block Suggestions -setting.linear.name = Linear Filtering -setting.hints.name = Hints -setting.flow.name = Display Resource Flow Rate -setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player -setting.animatedwater.name = Animated Water -setting.animatedshields.name = Animated Shields -setting.antialias.name = Antialias[lightgray] (requires restart)[] -setting.playerindicators.name = Player Indicators -setting.indicators.name = Enemy/Ally Indicators -setting.autotarget.name = Auto-Target -setting.keyboard.name = Mouse+Keyboard Controls -setting.touchscreen.name = Touchscreen Controls +unit.billions = Mrd +unit.pershot = /lövés +category.purpose = Cél +category.general = Ãltalános +category.power = Ãram +category.liquids = Folyadékok +category.items = Itemek +category.crafting = Bemenet/Kimenet +category.function = Funkció +category.optional = Lehetséges fokozás +setting.landscape.name = FekvÅ‘ mód zárolása +setting.shadows.name = Ãrnyékok +setting.blockreplace.name = Automatikus blokk javaslatok +setting.linear.name = Lineáris szűrés +setting.hints.name = Tippek +setting.flow.name = A nyersanyagok áramlási sebességének megjelenítése +setting.backgroundpause.name = Szüneteltetés a háttérben +setting.buildautopause.name = Automatikus szünet építéskor +setting.animatedwater.name = Animált víz +setting.animatedshields.name = Animált pajzsok +setting.antialias.name = Antialias[lightgray] (újraindítás szükséges)[] +setting.playerindicators.name = Játékos mutató +setting.indicators.name = Ellenség mutató +setting.autotarget.name = Automatikus célzás +setting.keyboard.name = Irányítás egérrel és billentyűzettel +setting.touchscreen.name = Irányítás érintÅ‘képernyÅ‘vel setting.fpscap.name = Max FPS -setting.fpscap.none = None +setting.fpscap.none = Nincs setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement -setting.difficulty.training = Training -setting.difficulty.easy = Easy -setting.difficulty.normal = Normal -setting.difficulty.hard = Hard -setting.difficulty.insane = Insane -setting.difficulty.name = Difficulty: -setting.screenshake.name = Screen Shake -setting.effects.name = Display Effects -setting.destroyedblocks.name = Display Destroyed Blocks -setting.blockstatus.name = Display Block Status -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding -setting.sensitivity.name = Controller Sensitivity -setting.saveinterval.name = Save Interval -setting.seconds = {0} seconds -setting.blockselecttimeout.name = Block Select Timeout -setting.milliseconds = {0} milliseconds -setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.fps.name = Show FPS & Ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys +setting.uiscale.name = UI mérete [lightgray] (újraindítás szükséges)[] +setting.swapdiagonal.name = Mindig átlós elhelyezés +setting.difficulty.training = Kiképzés +setting.difficulty.easy = Könnyű +setting.difficulty.normal = Közepes +setting.difficulty.hard = Nehéz +setting.difficulty.insane = Årült +setting.difficulty.name = Nehézség: +setting.screenshake.name = KépernyÅ‘ rázkódása +setting.effects.name = Effektek +setting.destroyedblocks.name = Elpusztított épületek megjelenítése +setting.blockstatus.name = Blokk állapotának megjelenítése +setting.conveyorpathfinding.name = Futószalag útvonalkeresés építéskor +setting.sensitivity.name = Controller érzékenység +setting.saveinterval.name = Mentési idÅ‘köz +setting.seconds = {0} másodperc +setting.milliseconds = {0} ezredmásodperc +setting.fullscreen.name = TeljesképernyÅ‘ +setting.borderlesswindow.name = Keret nélküli ablak[lightgray] (újraindításra lehet szükség) +setting.fps.name = FPS és Ping mutatása +setting.smoothcamera.name = Sima kamera setting.vsync.name = VSync -setting.pixelate.name = Pixelate -setting.minimap.name = Show Minimap -setting.coreitems.name = Display Core Items (WIP) -setting.position.name = Show Player Position -setting.musicvol.name = Music Volume -setting.atmosphere.name = Show Planet Atmosphere -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.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility -setting.playerlimit.name = Player Limit -setting.chatopacity.name = Chat Opacity -setting.lasersopacity.name = Power Laser Opacity -setting.bridgeopacity.name = Bridge Opacity -setting.playerchat.name = Display Player Bubble Chat -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... -uiscale.cancel = Cancel & Exit +setting.pixelate.name = Pixeles +setting.minimap.name = Minimap +setting.coreitems.name = Magban lévÅ‘ nyersanyagok megjelenítése +setting.position.name = A játékos pozíciójának megjelenítése +setting.musicvol.name = Zene hangerÅ‘ +setting.atmosphere.name = Bolygó atmoszféra +setting.ambientvol.name = Környezeti hangerÅ‘ +setting.mutemusic.name = Zene némítása +setting.sfxvol.name = SFX hangerÅ‘ +setting.mutesound.name = Hang némítása +setting.crashreport.name = Névtelen crash jelentések +setting.savecreate.name = Automatikus mentés +setting.publichost.name = Nyilvános játék láthatósága +setting.playerlimit.name = Játékos limit +setting.chatopacity.name = Chat átlátszatlansága +setting.lasersopacity.name = Villanyvezeték álátszatlansága +setting.bridgeopacity.name = Híd átlátszatlansága +setting.playerchat.name = Játékos szóbuborékok megjelenítése +setting.showweather.name = IdÅ‘járás grafika megjelenítése +public.confirm = Szeretnéd a játékot nyilvánossá tenni?\n[accent]Bárki beléphet a játékaidba.\n[lightgray]Ezt késÅ‘bb megváltoztathatod a Beállítások->Játék->Nyilvános játék láthatósága menüpontban. +public.confirm.really = Ha a barátaiddal szeretnél játszani, használd a [green]Barátok meghívása[] funkciót [scarlet]Nyilvános szerver[] helyett!\nBiztosan szeretnéd, hogy a játékod [scarlet]nyilvános[] legyen? +public.beta = Ne feledd, hogy a játék béta verziójában nem tudsz nyilvános szobát nyitni. +uiscale.reset = Az UI mérete megváltozott.\nAz "OK" gombbal megerÅ‘sítheted ezt a méretet.\n[scarlet]Visszavonás és kilépés [accent] {0}[] másodperc múlva... +uiscale.cancel = Mégse és Kilépés 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 -category.blocks.name = Block Select -command.attack = Attack -command.rally = Rally -command.retreat = Retreat -command.idle = Idle +keybind.title = Gyorsbillentyűk +keybinds.mobile = [scarlet]A legtöbb billentyűfunkció mobilon nem működik. Csak a mozgás támogatott. +category.general.name = Ãltalános +category.view.name = Nézet +category.multiplayer.name = Többjátékos +category.blocks.name = Blokk választás +command.attack = Támadás +command.rally = Gyülekezés +command.retreat = Visszavonulás +command.idle = Semmi placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit -keybind.clear_building.name = Clear Building -keybind.press = Press a key... +keybind.respawn.name = Újraéledés +keybind.control.name = Egység irányítása +keybind.clear_building.name = Építési terv törlése +keybind.press = Nyomj meg egy billentyűt keybind.press.axis = Press an axis or key... -keybind.screenshot.name = Map Screenshot -keybind.toggle_power_lines.name = Toggle Power Lasers -keybind.toggle_block_status.name = Toggle Block Statuses -keybind.move_x.name = Move X -keybind.move_y.name = Move Y -keybind.mouse_move.name = Follow Mouse -keybind.pan.name = Pan View +keybind.screenshot.name = Map képernyÅ‘kép +keybind.toggle_power_lines.name = Villanyvezetékek be/ki +keybind.toggle_block_status.name = Blokk státusz be/ki +keybind.move_x.name = Mozgás vízszintesen +keybind.move_y.name = Mozgás függÅ‘legesen +keybind.mouse_move.name = Egér követése +keybind.pan.name = Felderítés keybind.boost.name = Boost -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y -keybind.category_prev.name = Previous Category -keybind.category_next.name = Next Category -keybind.block_select_left.name = Block Select Left -keybind.block_select_right.name = Block Select Right -keybind.block_select_up.name = Block Select Up -keybind.block_select_down.name = Block Select Down -keybind.block_select_01.name = Category/Block Select 1 -keybind.block_select_02.name = Category/Block Select 2 -keybind.block_select_03.name = Category/Block Select 3 -keybind.block_select_04.name = Category/Block Select 4 -keybind.block_select_05.name = Category/Block Select 5 -keybind.block_select_06.name = Category/Block Select 6 -keybind.block_select_07.name = Category/Block Select 7 -keybind.block_select_08.name = Category/Block Select 8 -keybind.block_select_09.name = Category/Block Select 9 -keybind.block_select_10.name = Category/Block Select 10 -keybind.fullscreen.name = Toggle Fullscreen -keybind.select.name = Select/Shoot -keybind.diagonal_placement.name = Diagonal Placement -keybind.pick.name = Pick Block -keybind.break_block.name = Break Block -keybind.deselect.name = Deselect -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command -keybind.shoot.name = Shoot +keybind.schematic_select.name = Terület kijelölése +keybind.schematic_menu.name = Schematic menü +keybind.schematic_flip_x.name = Schematic tükrözése vízszintesen +keybind.schematic_flip_y.name = Schematic tükrözése függÅ‘legesen +keybind.category_prev.name = ElÅ‘zÅ‘ kategória +keybind.category_next.name = KövetkezÅ‘ kategória +keybind.block_select_left.name = Blokk váltás balra +keybind.block_select_right.name = Blokk váltás jobbra +keybind.block_select_up.name = Blokk váltás fel +keybind.block_select_down.name = Blokk váltás le +keybind.block_select_01.name = Blokk kategória 1 +keybind.block_select_02.name = Blokk kategória 2 +keybind.block_select_03.name = Blokk kategória 3 +keybind.block_select_04.name = Blokk kategória 4 +keybind.block_select_05.name = Blokk kategória 5 +keybind.block_select_06.name = Blokk kategória 6 +keybind.block_select_07.name = Blokk kategória 7 +keybind.block_select_08.name = Blokk kategória 8 +keybind.block_select_09.name = Blokk kategória 9 +keybind.block_select_10.name = Blokk kategória 10 +keybind.fullscreen.name = TeljesképernyÅ‘ be/ki +keybind.select.name = Kiválasztás/Lövés +keybind.diagonal_placement.name = Ãtlós elhelyezés +keybind.pick.name = Blokk másolása +keybind.break_block.name = Blokk törlése +keybind.deselect.name = Blokk választás törlése +keybind.pickupCargo.name = Rakomány felvétele +keybind.dropCargo.name = Rakomány lerakása +keybind.command.name = Irányítás +keybind.shoot.name = Lövés keybind.zoom.name = Zoom -keybind.menu.name = Menu -keybind.pause.name = Pause -keybind.pause_building.name = Pause/Resume Building +keybind.menu.name = Menü +keybind.pause.name = Szünet +keybind.pause_building.name = Építés szüneteltetése/folytatása keybind.minimap.name = Minimap +keybind.planet_map.name = Bolygó térkép +keybind.research.name = Kutatás keybind.chat.name = Chat -keybind.player_list.name = Player List -keybind.console.name = Console -keybind.rotate.name = Rotate -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.player_list.name = Játékos lista +keybind.console.name = Konzol +keybind.rotate.name = Frogatás +keybind.rotateplaced.name = Épület forgatása (tartsd nyomva) keybind.toggle_menus.name = Toggle Menus -keybind.chat_history_prev.name = Chat History Prev -keybind.chat_history_next.name = Chat History Next -keybind.chat_scroll.name = Chat Scroll -keybind.drop_unit.name = Drop Unit -keybind.zoom_minimap.name = Zoom Minimap -mode.help.title = Description of modes +keybind.chat_history_prev.name = Chat görgetés fel +keybind.chat_history_next.name = Chat görgetés le +keybind.chat_scroll.name = Chat görgetés +keybind.chat_mode.name = Chat mód megváltoztatása +keybind.drop_unit.name = Egység elengedése +keybind.zoom_minimap.name = Zoom a Minimapoon +mode.help.title = Játékmódok leírása mode.survival.name = TúlélÅ‘ -mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. +mode.survival.description = A normál mód. Korlátozott nyersanyag és automatikusan érkezÅ‘ hullámok.\n[gray]Szükséges hozzá ellenséges spawn a Mapon. mode.sandbox.name = Homokozó -mode.sandbox.description = Infinite resources and no timer for waves. -mode.editor.name = Editor +mode.sandbox.description = Végtelen erÅ‘forrás, nincs idÅ‘zítés a hullámokhoz. +mode.editor.name = SzerkesztÅ‘ mode.pvp.name = PvP -mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. +mode.pvp.description = Harcolj másik játékosok ellen.\n[gray]Szükséges hozzá legalább két különbözÅ‘ színű mag a Mapon. mode.attack.name = Támadás -mode.attack.description = Destroy the enemy's base. \n[gray]Requires a red core in the map to play. -mode.custom = Custom Rules +mode.attack.description = Pusztítsd el az ellenség bázisát. \n[gray]Szükséges hozzá egy piros mag a Mapon. +mode.custom = Egyéni szabályok -rules.infiniteresources = Infinite Resources -rules.reactorexplosions = Reactor Explosions -rules.wavetimer = Wave Timer -rules.waves = Waves -rules.attack = Attack Mode +rules.infiniteresources = Végtelen erÅ‘forrás +rules.reactorexplosions = Reaktor robbanás +rules.coreincinerates = Túlcsorduló itemek megsemmisítse a magban +rules.schematic = Schematicok +rules.wavetimer = Hullám idÅ‘zítÅ‘ +rules.waves = Hullámok +rules.attack = Támadás mód rules.buildai = AI Building -rules.enemyCheat = Infinite AI (Red Team) Resources -rules.blockhealthmultiplier = Block Health Multiplier -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier -rules.unithealthmultiplier = Unit Health Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier -rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) -rules.wavespacing = Wave Spacing:[lightgray] (sec) -rules.buildcostmultiplier = Build Cost Multiplier -rules.buildspeedmultiplier = Build Speed Multiplier -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier +rules.enemyCheat = Végtelen AI (Piros csapat) ErÅ‘forrás +rules.blockhealthmultiplier = Épület életpont szorzó +rules.blockdamagemultiplier = Épület sebzés szorzó +rules.unitbuildspeedmultiplier = Egység gyártási sebesség szorzó +rules.unithealthmultiplier = Egység életpont szorzó +rules.unitdamagemultiplier = Egység sebzés szorzó +rules.enemycorebuildradius = Ellenséges mag körüli tiltott zóna sugara:[lightgray] (mezÅ‘) +rules.wavespacing = Hullám idÅ‘zítés:[lightgray] (sec) +rules.buildcostmultiplier = Építési költség szorzó +rules.buildspeedmultiplier = Építési sebesség szorzó +rules.deconstructrefundmultiplier = Bontási visszatérítés szorzó rules.waitForWaveToEnd = Waves Wait for Enemies -rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) -rules.unitammo = Units Require Ammo -rules.title.waves = Waves -rules.title.resourcesbuilding = Resources & Building -rules.title.enemy = Enemies -rules.title.unit = Units -rules.title.experimental = Experimental -rules.title.environment = Environment -rules.lighting = Lighting -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Ambient Light -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.dropzoneradius = Ledobási zóna sugara:[lightgray] (mezÅ‘) +rules.unitammo = Egységeknek kell lövedék +rules.title.waves = Hullámok +rules.title.resourcesbuilding = ErÅ‘források és épületek +rules.title.enemy = Ellenségek +rules.title.unit = Egységek +rules.title.experimental = Kísérleti +rules.title.environment = Környezet +rules.lighting = Világítás +rules.enemyLights = Ellenséges fények +rules.fire = Tűz +rules.explosions = Épület/Egység robbanás sebzés +rules.ambientlight = Háttérvilágítás +rules.weather = IdÅ‘járás +rules.weather.frequency = Gyakoriság: +rules.weather.always = Mindig +rules.weather.duration = IdÅ‘tartam: -content.item.name = Items -content.liquid.name = Liquids -content.unit.name = Units -content.block.name = Blocks -item.copper.name = Copper -item.lead.name = Lead -item.coal.name = Coal -item.graphite.name = Graphite -item.titanium.name = Titanium -item.thorium.name = Thorium -item.silicon.name = Silicon -item.plastanium.name = Plastanium -item.phase-fabric.name = Phase Fabric -item.surge-alloy.name = Surge Alloy -item.spore-pod.name = Spore Pod -item.sand.name = Sand -item.blast-compound.name = Blast Compound -item.pyratite.name = Pyratite -item.metaglass.name = Metaglass -item.scrap.name = Scrap -liquid.water.name = Water -liquid.slag.name = Slag -liquid.oil.name = Oil -liquid.cryofluid.name = Cryofluid +content.item.name = Itemek +content.liquid.name = Folyadékok +content.unit.name = Egységek +content.block.name = Blokkok +content.sector.name = Szektor -item.explosiveness = [lightgray]Robbanékonyság: {0}% -item.flammability = [lightgray]Gyúlékonyság: {0}% -item.radioactivity = [lightgray]Radioaktivitás: {0}% - -unit.health = [lightgray]Health: {0} -unit.speed = [lightgray]Sebesség: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]HÅ‘ hapacitás: {0} -liquid.viscosity = [lightgray]Viszkozitás: {0} -liquid.temperature = [lightgray]HÅ‘mérséklet: {0} +item.copper.name = Réz +item.lead.name = Ólom +item.coal.name = Szén +item.graphite.name = Grafit +item.titanium.name = Titán +item.thorium.name = Tórium +item.silicon.name = Szilícium +item.plastanium.name = Plasztínium +item.phase-fabric.name = Fázisos Szövet +item.surge-alloy.name = Multiötvözet +item.spore-pod.name = Spóratok +item.sand.name = Homok +item.blast-compound.name = Robbanóelegy +item.pyratite.name = Piratit +item.metaglass.name = Ólomüveg +item.scrap.name = Hulladék +liquid.water.name = Víz +liquid.slag.name = Salak +liquid.oil.name = Olaj +liquid.cryofluid.name = HűtÅ‘folyadék unit.dagger.name = Dagger unit.mace.name = Mace @@ -934,8 +1042,10 @@ block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder +block.basalt-boulder.name = Basalt Boulder block.grass.name = Grass block.slag.name = Slag +block.space.name = Space block.salt.name = Salt block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -981,6 +1091,7 @@ block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1029,7 +1140,6 @@ block.conveyor.name = Conveyor block.titanium-conveyor.name = Titanium Conveyor block.plastanium-conveyor.name = Plastanium Conveyor block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts. block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor @@ -1037,7 +1147,6 @@ block.sorter.name = Sorter block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.illuminator.name = Illuminator -block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Overflow Gate block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter @@ -1071,10 +1180,11 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1224,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1126,11 +1237,16 @@ block.additive-reconstructor.name = Additive Reconstructor block.multiplicative-reconstructor.name = Multiplicative Reconstructor block.exponential-reconstructor.name = Exponential Reconstructor block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor +block.payload-conveyor.name = Payload Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Overdrive Dome +#experimental, may be removed +block.block-forge.name = Block Forge +block.block-loader.name = Block Loader +block.block-unloader.name = Block Unloader +block.interplanetary-accelerator.name = Interplanetary Accelerator block.switch.name = Switch block.micro-processor.name = Micro Processor @@ -1139,167 +1255,259 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank -team.blue.name = blue -team.crux.name = red -team.sharded.name = orange -team.orange.name = orange -team.derelict.name = derelict -team.green.name = green -team.purple.name = purple +team.blue.name = kék +team.crux.name = piros +team.sharded.name = narancssárga +team.orange.name = narancssárga +team.derelict.name = elhagyatott +team.green.name = zöld +team.purple.name = lila -tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse[accent] [[WASD][] to move.\n[accent]Scroll[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\n[accent]Right-click[] to stop building. -tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. -tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\nUse the scrollwheel to rotate blocks before placing them.\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. -tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. -tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo[] to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 -tutorial.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 obtained resources can then be used to research new technology.\n\n[accent]Press the launch button. +hint.skip = Ãtugrás +hint.desktopMove = Használd a [accent][[WASD][] gombokat a mozgáshoz. +hint.zoom = Használd a [accent]görgÅ‘t[] a zoomhoz.. +hint.mine = Menj a \uf8c4 copper közelébe, és [accent]kattints rá[] a kézi bányászáshoz. +hint.desktopShoot = Használd a [accent]bal egérgombot[] a lövéshez. +hint.depositItems = Az itemeket a hajóról a magra húzva áthelyezheted. +hint.respawn = Hogy hajóként újraéledj, nyomd meg a [accent][[V][] gombot. +hint.respawn.mobile = Ãtvetted az irányítást egy egység vagy torony felett. Hogy újraéledj hajóként, [accent]érintsd meg az avatárt a bal felsÅ‘ sarokban.[] +hint.desktopPause = Nyomd meg a [accent][[Space][]-t, hogy szüneteltesd vagy folytasd a játékot. +hint.placeDrill = Válaszd ki a \ue85e [accent]Drill[] lapot a jobb alsó sarokban található menüben, válassz ki egy \uf870 [accent]Drill[] épületet, és kattints egy rézfoltra, hogy lerakd. +hint.placeDrill.mobile = Válaszd ki a \ue85e [accent]Drill[] lapot a jobb alsó sarokban található menüben, válassz ki egy \uf870 [accent]Drill[] épületet, és nyomj egy rézfoltra, hogy lerakd.\n\nNyomj a \ue800 [accent]pipára[] jobb lent, hogy megerÅ‘sítsd. +hint.placeConveyor = A futószalagok az itemeket a DrillektÅ‘l más épületekhez szállítják. Válassz ki egy \uf896 [accent]futószalagot[] a \ue814 [accent]Distribution[] lapról.\n\nKattints és tartsd lenyomva, hogy többet is lehelyezz.\n[accent]Görgess[] a forgatáshoz. +hint.placeConveyor.mobile = A futószalagok az itemeket a DrillektÅ‘l más épületekhez szállítják. Válassz ki egy \uf896 [accent]futószalagot[] a \ue814 [accent]Distribution[] lapról.\n\nTartsd lenyomva az ujjad és húzd, hgy egyszerre többet is lehelyezz. +hint.placeTurret = Helyezz le \uf861 [accent]Tornyokat[], hogy megvédd a bázisod az ellenségtÅ‘l.\n\nA tornyoknak lövedékre van szükségük - ebben az esetben \uf838rézre.\nHasználd a futószalagokat és Drilleket, hogy ellásd Å‘ket. +hint.breaking = [accent]Jobb gombot[] nyomva kijelölhetsz lebontandó épületeket. +hint.breaking.mobile = Használd a \ue817 [accent]kalapácsot[] jobb lent és töröld vele az útban lévÅ‘ épületeket.\n\nTartsd lenyomva az ujjad és húzd, hogy nagyobb területet kijelölj. +hint.research = Használd a \ue875 [accent]Kutatás[] gombot, hogy felfedezz új technológiákat. +hint.research.mobile = Használd a \ue875 [accent]Kutatás[] gombot a \ue88c [accent]Menü[]ben, hogy felfedezz új technológiákat. +hint.unitControl = Nyomd le a [accent][[L-ctrl][] billentyÅ‘t és [accent]kattints[], hogy átvedd az irányítást szövetséges egységek vagy tornyok felett. +hint.unitControl.mobile = [accent][[Dupla koppintás][]sal átveheted az irányítást szövetséges egységek és tornyok felett. +hint.launch = Ha elegendÅ‘ nyersanyagot gyűjtöttél, [accent]KilÅ‘hetsz[] egy közeli szektorba. Ezt a jobb lent látható \ue827 [accent]Térkép[]en teheted meg. +hint.launch.mobile = Ha elegendÅ‘ nyersanyagot gyűjtöttél, [accent]KilÅ‘hetsz[] egy közeli szektorba. Ezt a \ue88c [accent]Menü[]bÅ‘l elérhetÅ‘ \ue827 [accent]Térkép[]en teheted meg. +hint.schematicSelect = Az [accent][[F][] nyomva tartásával kijelölhetsz és másolhastz épületeket.\n\nKattints a [accent][[görgÅ‘vel][], hogy egy épületet lemásolj. +hint.conveyorPathfind = Tartsd nyomva a [accent][[L-Ctrl][] billentyűt futószalagok lerakása közben, hogy a játék útvnalat generáljon. +hint.conveyorPathfind.mobile = Enegdélyezd az \ue844 [accent]átlós mód[]ot és tagyél le egyszerre több futószalagot, hogy a játék útvonalat generáljon. +hint.boost = Tartsd nyomva a [accent][[L-Shift][] billentyűt, hogy átrepülj az akadályok felett.\n\nErre nem minden földi egység képes. +hint.command = A [accent][[G][] megnyomására a [accent]azonos típusú[] közeli egységek formációba rendezÅ‘dnek.\n\nA földi egységek irányításához neked is földi egységet kell irányítanod. +hint.command.mobile = [accent][[Koppints kétszer][] a hajódra, hogy a közeli egységeid formációba rendezÅ‘djenek. +hint.payloadPickup = A [accent][[[] gombbal kis épületeket vagy egységeket emelhetsz fel. +hint.payloadPickup.mobile = [accent]Tartsd nyomva az ujjad[] egy kis épületen vagy egségen, hogy felemeld. +hint.payloadDrop = A [accent]][] megnyomásával lerakhatod a terhedet. +hint.payloadDrop.mobile = [accent]Tartsd nyomva az ujjad[] egy üres területen, hogy letedd a terhedet. +hint.waveFire = A [accent]Wave[] tornyok, ha víz van bennük, automatikusan eloltják a közeli tüzeket. +hint.generator = \uf879 A [accent]Combustion Generator[] szenet éget, és átadja az áramot a vele érintkezÅ‘ épületeknek.\n\n Ãramot nagyobb távolságra is szállíthatsz \uf87f [accent]Power Node[]-ok segítségével. +hint.guardian = Az [accent]ÅrzÅ‘[]knek páncélja van. A gyenge lövedékeknek, mint a [accent]Copper[] vagy a [accent]Lead[] [scarlet]nincs hatásuk[].\n\nHasználj magasabb szintű tornyokat vagy \uf835 [accent]Graphite[] lövedéket a \uf861Duo/\uf859Salvo tornyokba, hogy leszedd az ÅrzÅ‘ket. +hint.coreUpgrade = A magot fejlesztheted, ha [accent]magasabb sintű magot teszel rá[].\n\nHelyezz egy [accent]Foundation[] magot a [accent]Shard[] magra. Figyelj rá, hogy ne legyenek az új mag területén épületek. +hint.presetLaunch = A szürke [accent]kampány szektorok[]ba, amilyen például a [accent]Frozen Forest[], bárhonnan kilÅ‘hetsz. Nem kell szomszédos területtel rendelkezned.\n\nA [accent]számozott szektorok[], mint ez is, [accent]opcionálisak[]. +hint.coreIncinerate = Ha a magodban egy nyersanyag elérte a maximumot, a beérkezÅ‘ ilyen nyersanyagaid azonnal [accent]megsemmisítésre kerülnek[]. +hint.coopCampaign = Ha [accent]co-op kampány[]t játszol, az adott mapon termelt nyersanyagok a [accent]saját szektoraidba[] is bekerülnek.\n\nA host minden fejlesztése is átkerül. -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 components. -item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. -item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. -item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. -item.silicon.description = An extremely useful semiconductor. Applications in solar panels, complex electronics and homing turret ammunition. -item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. -item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.spore-pod.description = A pod of synthetic spores, synthesized from atmospheric concentrations for industrial purposes. Used for conversion into oil, explosives and fuel. -item.blast-compound.description = An unstable compound used in bombs and explosives. Synthesized from spore pods and other volatile substances. Use as fuel is not advised. -item.pyratite.description = An extremely flammable substance used in incendiary weapons. -liquid.water.description = The most useful liquid. Commonly used for cooling machines and waste processing. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. -liquid.oil.description = A liquid used in advanced material production. Can be converted into coal as fuel, or sprayed and set on fire as a weapon. -liquid.cryofluid.description = An inert, non-corrosive liquid created from water and titanium. Has extremely high heat capacity. Extensively used as coolant. +item.copper.description = Széleskörűen felhasználható építkezésre és lövedékként. +item.copper.details = Szokatlanul elterjedt fém a Serpulón. Gyenge szerkezetű, de megerÅ‘síthetÅ‘. +item.lead.description = Folyadékszállításban és elektromos eszközökben használható. +item.lead.details = Sűrű. Közömbös. Széles körben használják elemekben.\nMegjegyzés: Valószínűleg mérgezÅ‘ a biológiai életformákra. Nem mintha sok maradt volna errefelé. +item.metaglass.description = Folyadékok szállítására és tárolására használható. +item.graphite.description = Elektromos alkatrészek alapanyaga és lövedék. +item.sand.description = Egyéb finom nyersanyagok gyártási alapanyaga. +item.coal.description = TüzelÅ‘anyag és gyártási alapanyag. +item.coal.details = Fosszílizálódott növényi anyagnak tűnik, jóval a "seeding event" elÅ‘ttrÅ‘l. +item.titanium.description = Folyadékok szállítására, fúrókban és légi járművekben használható. +item.thorium.description = Strapabíró szerkezetekben használható nukleáris tüzelÅ‘anyagként. +item.scrap.description = Olvasztással és porítással finom nyersanyagok nyerhetÅ‘k ki belÅ‘le. +item.scrap.details = Åsi építmények és egységek hátrahagyott maradványai. +item.silicon.description = Napelemek, összetett áramkörök és nyomkövetÅ‘ lövedékek fontos alapanyaga. Sosincs elég. +item.plastanium.description = Fejlett egységek alapanyagaként, hÅ‘szigetelésre és repeszes lövedékekhez használható. +item.phase-fabric.description = Fejlett elektromos eszközökben és önjavító szerkezetekben használható. +item.surge-alloy.description = Magas szintű fegyverzetekben és aktív védelemhez használható. +item.spore-pod.description = Ãtalakítható olajjá vagy robbanószerekké, de használható tüzelÅ‘anyagként is. +item.spore-pod.details = Spórák. Egy valószínűleg mesterséges életforma. Más életformák számára halálos gázt bocsátanak ki. SzélsÅ‘ségesen invazív. MegfelelÅ‘ körülmények között erÅ‘sen gyúlékony. +item.blast-compound.description = Bombák és robbanó lövedékek része. +item.pyratite.description = Gyújtó lövedékekben és tüzelÅ‘anyag-alapú generátorokban használható. + +liquid.water.description = Gépek hűtésére és hulladékfeldolgozásra használható. +liquid.slag.description = Separatorban finomítva értékes fémek forrása, az ellenségre fröcskölve gyilkos fegyver. +liquid.oil.description = Magas szintű nyersanyagok gyártására vagy gyújtólövedékként használható. +liquid.cryofluid.description = HűtÅ‘folyadék reaktorok, tornyok és gyárak számára. + +block.resupply-point.description = Resupplies nearby units with copper ammunition. Not compatible with units that require battery power. +block.armored-conveyor.description = Nyersanyagokat továbbít. Nem fogad el nyersanyagot oldalról. +block.illuminator.description = Világít. +block.message.description = Üzenetet tárol szövetségesek kommunikációjához. +block.graphite-press.description = Szenet présel grafittá. +block.multi-press.description = Szenet présel grafittá. Hatékonyan dolgozik, de vizet igényel hűtéshez. +block.silicon-smelter.description = Szilíciumot nyer ki homok és szén keverékébÅ‘l. +block.kiln.description = Ólmomból és homokból olvaszt ólomüveget. +block.plastanium-compressor.description = Plastaniumot gyárt olaj és titán felhasználásával. +block.phase-weaver.description = Phase fabricot szintetizál tórium és homok keverékébÅ‘l. +block.alloy-smelter.description = Titán, ólom, szilícium és réz olvadékából állít elÅ‘ surge alloy-t. +block.cryofluid-mixer.description = Finom titánport kever vízhez cryofluid előállításához. +block.blast-mixer.description = Piratitból és spóra kapszulákból készít robbanóelegyet. +block.pyratite-mixer.description = Szenet, homokot és ólmot vegyít piratittá. +block.melter.description = Hulladékot olvaszt salakká. +block.separator.description = Szétbontja a salakot ásványi összetevÅ‘ire. +block.spore-press.description = Nagy nyomáson olajat présel spórákból. +block.pulverizer.description = Finom homokká Å‘rli a hulladékot. +block.coal-centrifuge.description = Szenet nyer ki olajból. +block.incinerator.description = Megsemmisít minden nyersanyagot és folyadékot. +block.power-void.description = Elnyel minden áramot. Csak homokozó módban. +block.power-source.description = Végtelen áramot termel. Csak homokozó módban. +block.item-source.description = Végtelen nyersanyagot bocsát ki. Csak homokozó módban. +block.item-void.description = Megsemmisít minden nyersanyagot. Csak homokozó módban. +block.liquid-source.description = Végtelen folyadékot bocsát ki. Csak homokozó módban. +block.liquid-void.description = Megsemmisít minden folyadékot. Csak homokozó módban. +block.copper-wall.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. +block.copper-wall-large.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. +block.titanium-wall.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. +block.titanium-wall-large.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. +block.plastanium-wall.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. Elnyeli a lézereket és elektromos szikrákat. Gátolja a villanyvezetékek automatikus kapcsolódását. +block.plastanium-wall-large.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. Elnyeli a lézereket és elektromos szikrákat. Gátolja a villanyvezetékek automatikus kapcsolódását. +block.thorium-wall.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. +block.thorium-wall-large.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l. +block.phase-wall.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l, a legtöbb lövedék visszapattan róla. +block.phase-wall-large.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l, a legtöbb lövedék visszapattan róla. +block.surge-wall.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l, periodikusan elektromos kisüléseket generál, ha hozzáérnek. +block.surge-wall-large.description = Megvédi az épületeket az ellenséges lövedékektÅ‘l, periodikusan elektromos kisüléseket generál, ha hozzáérnek. +block.door.description = Fal, amit nyitni és zárni lehet. +block.door-large.description = Fal, amit nyitni és zárni lehet. De ez nagyobb. +block.mender.description = Javítja az épületeket a hatókörén belül.\nSzilíciummal növelhetÅ‘ a hatósugara és hatékonysága. +block.mend-projector.description = Javítja az épületeket a hatókörén belül.\nSzilíciummal növelhetÅ‘ a hatósugara és hatékonysága. +block.overdrive-projector.description = Növeli a közeli épületek sebességét.\nPhase fabric-kal növelhetÅ‘ a hatósugara és hatékonysága. +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 increases shield size. +block.shock-mine.description = Elektromos kisülést hoz létre, ha ellenséggel érintkezik. +block.conveyor.description = Futószalag. Nyersanyagokat továbbít. +block.titanium-conveyor.description = Nyersanyagokat továbbít. Gyorsabb a sima futószalagnál. +block.plastanium-conveyor.description = Nyersanyagokat szállít tömbösítve. Hátulról fogadja a nyersanyagokat, elöl három irányba szétosztja Å‘ket. Több kezdÅ‘- és végponttal növelhetÅ‘ az áteresztÅ‘képessége. +block.junction.description = Hídként működik két keresztezÅ‘dÅ‘ futószalag között. +block.bridge-conveyor.description = Nyersanyagokat szállít épületek és terepakadályok fölött. +block.phase-conveyor.description = Nyersanyagokat szállít épületek és terepakadályok fölött. Nagyobb távolságra ér, mint a sima bridge conveyor, de áramot használ. +block.sorter.description = Csak a kiválasztott nyersanyagot engedi tovább egyenesen, minden mást oldalra ad ki. +block.inverted-sorter.description = A kiválasztott nyersanyagot oldalra adja ki, minden mást egyenesen enged tovább. +block.router.description = Háromfelé osztja szét a beérkezÅ‘ nyersanyagokat. +block.router.details = Pokoli masina. Ne tedd közvetlenül gyárak mellé, mert az épületek termékei eltömítik. +block.distributor.description = Hétfelé osztja szét a beérkezÅ‘ nyersanyagokat. +block.overflow-gate.description = Csak akkor ad ki nyersanyagot oldalra, ha elÅ‘refelé már nem tud. Nem használható közvetlenül owerflow gate vagy underflow gate mellett. +block.underflow-gate.description = Csak akkor enged tovább nyersanyagokat elÅ‘re, ha oldalra már nem tudja kiadni Å‘ket. Nem használható közvetlenül owerflow gate vagy underflow gate mellett. +block.mass-driver.description = Nagy hatótávolságú nyeranyagszállító. Csomagokban lÅ‘ át nyersanyagokat egy másik mass drivernek. +block.mechanical-pump.description = Folyadékot szivattyúz. Nem igényel áramot. +block.rotary-pump.description = Folyadékot szivattyúz. Ãrammal működik. +block.thermal-pump.description = Folyadékot szivattyúz. Sokat termel, sok áramot fogyaszt. +block.conduit.description = Folyadékot továbbít. +block.pulse-conduit.description = Folyadékot továbbít. Gyorsabb és nagyobb tárolókapacitású, mint a sima conduit. +block.plated-conduit.description = Folyadékot továbbít. Nem fogad el folyadékot oldalról. Nem önti ki a folyadékot, ha nincs a végén semmi. +block.liquid-router.description = Háromfelé osztja szét a beérkezÅ‘ folyadékot. Bizonyos mennyiség tárolására is képes. +block.liquid-tank.description = Nagy mennyiségű folyadékot tárol, minden oldalán képes leadni. +block.liquid-junction.description = Hídként működik két keresztezÅ‘dÅ‘ conduit között. +block.bridge-conduit.description = Folyadékot szállít épületek és terepakadályok fölött. +block.phase-conduit.description = Folyadékot szállít épületek és terepakadályok fölött. Nagyobb távolságr ér, mint a sima bridge conduit, de áramot használ. +block.power-node.description = Ãramot továbbít az összekapcsolt épületekhez. Az érintkezÅ‘ épületekkel automatikusan kapcsolatban van. +block.power-node-large.description = Nagyobb power node nagyobb hatótávolsággal. +block.surge-tower.description = Hosszútávú power node, csak kevés kapcsolatra képes. +block.diode.description = Tárolt áramot irányít át egy irányba, de csak ha a fogadó oldalon van kevesebb tárolva. +block.battery.description = Ãramot raktároz el, ha túltermelés van. Leadja az áramot, ha hiány van. +block.battery-large.description = Ãramot raktároz el, ha túltermelés van. Leadja az áramot, ha hiány van. Nagyobb kapacitású a sima battery-nél. +block.combustion-generator.description = Ãramot termel éghetÅ‘ anyagok elégetésével. +block.thermal-generator.description = Forró környezetben áramot termel. +block.steam-generator.description = Ãramot termel éghetÅ‘ anyagok elégetésével és víz gÅ‘zzé alakításával. +block.differential-generator.description = Egy lórúgásnyi áramot termel. Hasznosítja a cryofluid és az égÅ‘ piratit hÅ‘mérsékletkülönbségét. +block.rtg-generator.description = A radioaktív bomlás energiáját hasznosítja, hogy lassan de biztosan áramot termeljen. +block.solar-panel.description = NapfénybÅ‘l állít elÅ‘ kevés áramot. +block.solar-panel-large.description = NapfénybÅ‘l állít elÅ‘ kevés áramot. Hatékonyabb a sima solar panelnél. +block.thorium-reactor.description = JelentÅ‘s áramot állít elÅ‘ tóriumból. Ãllandó hűtést igényel. Ha túlmelegszik, felrobban. +block.impact-reactor.description = Csúcsra járatva rengeteg áramot termel. JelentÅ‘s árambefektetést igényel a reakció beindításához. +block.mechanical-drill.description = Ércre helyezve kis tempóban termeli ki az adott nyersanyagot. Csak alapvetÅ‘ nyersanyagok kitermelésére képes. +block.pneumatic-drill.description = Egy fejlettebb drill, képes titán kitermelésére. Gyorsabban dolgozik a mechanical drillnél. +block.laser-drill.description = Lézerek használatával még gyorsabban tud dolgozni, de áramot használ. Képes tóriumot kitermelni. +block.blast-drill.description = A technológia csúcsa. Rengeteg áramot használ. +block.water-extractor.description = Képes a talajvíz kiszívására. Használd, ha nincs elérhetÅ‘ víz a felszínen. +block.cultivator.description = A légkörben szálló spórákat kapszulákba sűríti. +block.cultivator.details = Visszaszerzett technológia. Hatalmas tömegű biomassza gyártására alkalmas a lehetÅ‘ leghatékonyabban. Valószínűleg a Serpulót ma borító spórák kezdeti inkubátora. +block.oil-extractor.description = Nagy mennyiségben használ vizet, homokot és áramot, hogy olajat nyerjen ki a földbÅ‘l. +block.core-shard.description = A bázis magja. Ha elpusztul, a szektor elveszett. +block.core-shard.details = Az elsÅ‘ modell. Kompakt. Önsokszorosító. Egyszer használatós gyorsítófúvókákkal van felszerelve, nem bolygóközi utazásra tervezték. +block.core-foundation.description = A bázis magja. Páncélozott. Több nyersanyagot tárol, mint a shard. +block.core-foundation.details = A második modell. +block.core-nucleus.description = A bázis magja. MegerÅ‘sített páncélzat. Hatalmas mennyiségek tárolására képes. +block.core-nucleus.details = A harmadik, végsÅ‘ modell. +block.vault.description = Nagy mennyiséget tárol minden nyersanyagtípusból. A tartalma unloader segítségével nyerhetÅ‘ ki. +block.container.description = Kis mennyiséget tárol minden nyersanyagtípusból. A tartalma unloader segítségével nyerhetÅ‘ ki. +block.unloader.description = Kitölti a szomszédos épületekbÅ‘l a kiválasztott nyersanyagot. +block.launch-pad.description = Nyersanyagokat juttat el más szektorokba. +block.duo.description = Változatos lövedékekkel lÅ‘ az ellenségre. +block.scatter.description = Ólom, ólomüveg vagy hulladék darabokkal tüzel az ellenséges légierÅ‘re. +block.scorch.description = Megégeti az ellenség közeli földi egységeit. Kis távolságra nagyon hatékony. +block.hail.description = Kis lemezeketFires small shells at ground enemies over long distances. +block.wave.description = Folyadékot önt az ellenségre. Eloltja a tüzet, ha vízzel van feltöltve. +block.lancer.description = ErÅ‘s energiasugarakat lÅ‘ közeli földi célpontokra. +block.arc.description = Elektromos szikrákat kelt földi célpontok között. +block.swarmer.description = NyomkövetÅ‘ rakétákat lÅ‘ az ellenségre. +block.salvo.description = Kis sorozatokat lÅ‘ az ellenségre. +block.fuse.description = Három kis hatótávú átütÅ‘ töltényt lÅ‘ egyszerre. +block.ripple.description = Lövedékek csoportjával tüzel földi célpontokra nagy távolságra. +block.cyclone.description = Robbanó lövedékeket lÅ‘ közeli ellenségekre. +block.spectre.description = Nagy, a páncélon is áthatoló lövedékekkel tüzel légi és földi célpontokra is. +block.meltdown.description = FeltöltÅ‘dés után folyamatos lézersugarat lÅ‘ a közeli ellenségekre. Hűtést igényel. +block.foreshadow.description = Fires a large single-target bolt over long distances. +block.repair-point.description = Folyamatosan gyógyítja a legközelebbi sérült egységet a körzetében. +block.segment.description = Megsemmisíti a beérkezÅ‘ lövedékeket. A lézerrel szemben hatástalan. +block.parallax.description = Vonónyalábot bocsát ki, amivel magához vonzza és sebzi a repülÅ‘ egységeket. +block.tsunami.description = ErÅ‘s folyadékhullámokat lÅ‘ az ellenségre. Eloltja a tüzet, ha vízzel van feltöltve. +block.silicon-crucible.description = Szilíciumot finomít homokból és szénbÅ‘l, piratitot használ kiegészítÅ‘ hÅ‘forrásként. Forró környezetben hatékonyabb. +block.disassembler.description = Ritka ásványi elemeket választ ki salakból. Képes tóriumot kiválasztani. +block.overdrive-dome.description = Megnöveli a környezÅ‘ épületek sebességét. Phase fabricot és szilíciumot igényel. +block.payload-conveyor.description = Képes egységeket továbbítani. +block.payload-router.description = Háromfelé osztja szét a beérkezÅ‘ egységeket. +block.command-center.description = Néhány paranccsal képes az egységeket irányítani. +block.ground-factory.description = Földi egységeket gyárt. A kész egységek használhatók azonnal, vagy reconstructorokban fejleszthetÅ‘k. +block.air-factory.description = Légi egységeket gyárt. A kész egységek használhatók azonnal, vagy reconstructorokban fejleszthetÅ‘k. +block.naval-factory.description = Vízi egységeket gyárt. A kész egységek használhatók azonnal, vagy reconstructorokban fejleszthetÅ‘k. +block.additive-reconstructor.description = Kettes szintre fejleszti a beérkezÅ‘ egységeket. +block.multiplicative-reconstructor.description = Hármas szintre fejleszti a beérkezÅ‘ egységeket. +block.exponential-reconstructor.description = Négyes szintre fejleszti a beérkezÅ‘ egységeket. +block.tetrative-reconstructor.description = Ötös szintre fejleszti a beérkezÅ‘ egységeket. +block.switch.description = Kétállású kapcsoló. Az állapota leolvasható és módosítható processzorokkal. +block.micro-processor.description = Logikai műveletek sorozatát hajtja végre végtelenítve. Használható egységek vagy épületek irányítására is. +block.logic-processor.description = Logikai műveletek sorozatát hajtja végre végtelenítve. Használható egységek vagy épületek irányítására is. Gyorsabb a micro processornál. +block.hyper-processor.description = Logikai műveletek sorozatát hajtja végre végtelenítve. Használható egységek vagy épületek irányítására is. Gyorsabb a logic processornál. +block.memory-cell.description = Információt tárol processzorok számára. +block.memory-bank.description = Információt tárol processzorok számára. Nagyobb kapacitású. +block.logic-display.description = Ãbrák rajzolhatók rá processzorral. +block.large-logic-display.description = Ãbrák rajzolhatók rá processzorral. +block.interplanetary-accelerator.description = Hatalmas elektromágneses gyorsítótorony. Képes magokat szökési sebességre gyorsítani bolygóközi bevetéshez. + +unit.dagger.description = Egyszerű töltényeket lÅ‘ közeli ellenségekre +unit.mace.description = Lángnyelveket küld a közeli ellenségek felé. +unit.fortress.description = Nagy hatótávú rakétákat lÅ‘ földi célpontokra. +unit.scepter.description = Töltött lövedékek záporát lövi közeli ellenségekre. +unit.reign.description = Méretes átütÅ‘ lövedékeket zúdít minden közeli ellenségre. +unit.nova.description = Lézereket lÅ‘, amik az ellenséget sebzik, de gyógyítják a szövetségeseket. Repülésre alkalmas. +unit.pulsar.description = Elektromos szikrákat indít, amik az ellenséget sebzik, de gyógyítják a szövetségeseket. Repülésre alkalmas. +unit.quasar.description = ÃtütÅ‘ lézersugarakat lÅ‘, amik az ellenséget sebzik, de gyógyítják a szövetségeseket. Repülésre alkalmas. Pajzsa van. +unit.vela.description = Folyamatos lézernyalábot bocsát ki, ami sebzi az ellenséget, felgyújtja az épületeiket, de gyógyítja a szövetségeseket. Repülésre alkalmas. +unit.corvus.description = Hatalmas lézersugarat lÅ‘, ami ami sebzi az ellenséget, de gyógyítja a szövetségeseket. A legtöbb terepakadályt átlépi. +unit.crawler.description = Az ellenséghez rohan és nagy robbanásban megsemmisíti magát. +unit.atrax.description = GyengítÅ‘ salakgolyókat lÅ‘ a földi célpontokra. A legtöbb terepakadályt átlépi. +unit.spiroct.description = Elszívja az ellenség életerejét, önmagát gyógyítva közben. A legtöbb terepakadályt átlépi. +unit.arkyid.description = Nagy lézernyalábokkal elszívja az ellenség életerejét, önmagát gyógyítva közben. A legtöbb terepakadályt átlépi. +unit.toxopid.description = Nagy elektromos bombákat és átütÅ‘ lézert lÅ‘ az ellenségre. A legtöbb terepakadályt átlépi. +unit.flare.description = Egyszerű töltényeket lÅ‘ közeli földi célpontokra. +unit.horizon.description = Bombákat szór földi célpontokra. +unit.zenith.description = Rakétasorozatokat lÅ‘ közeli ellenségekre. +unit.antumbra.description = Lövedékek záporát zúdítja minden közeli ellenségre. +unit.eclipse.description = Két átütÅ‘ lézersugarat és rengeteg lövedéket zúdít minden közeli ellenségre. +unit.mono.description = Automatikusan bányászik rezet és ólmot a magba juttatva Å‘ket. +unit.poly.description = Automatikusan újjáépíti az elpusztult épületeket és segít más egységeknek építkezni. +unit.mega.description = Automatikusan javítja a sérült épületeket. Képes kis épülete és földi egységek szállítására. +unit.quad.description = Nagy bombákat szór földi célpontokra, amik sebzik az ellenséget, de javítják a szövetséges épületeket. Képes közepes méretű földi egységek szállítására. +unit.oct.description = Megvédi a közeli szövetségeseket regeneráló pajzsával. Képes szállítani a legtöbb földi egységet. +unit.risso.description = Rakéták és lövedékek záporát zúdítja minden közeli ellenségre. +unit.minke.description = Tüzérségi lövedékeket és egyszerű töltényeket lÅ‘ közeli föld célpontokra. +unit.bryde.description = Nagytávolságú tüzérségi rakétákat lÅ‘ az ellenségre. +unit.sei.description = Rakéták és páncéltörÅ‘ lövedékek záporát zúdítja az ellenségre. +unit.omura.description = Nagy hatótávolságú átütÅ‘ lövedékeket lÅ‘ az ellenségre. Flare egységeket gyárt. +unit.alpha.description = Megvédi a Shard core-t az ellenségtÅ‘l. Épít. +unit.beta.description = Megvédi a Foundation core-t az ellenségtÅ‘l. Épít. +unit.gamma.description = Megvédi a Nucleus core-t az ellenségtÅ‘l. Épít. -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon. -block.kiln.description = Smelts sand and lead into the compound known as metaglass. Requires small amounts of power to run. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. -block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. -block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. -block.separator.description = Separates slag into its mineral components. Outputs the cooled result. -block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. -block.pulverizer.description = Crushes scrap into fine sand. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. -block.incinerator.description = Vaporizes any excess item or liquid it receives. -block.power-void.description = Voids all power inputted into it. Sandbox only. -block.power-source.description = Infinitely outputs power. Sandbox only. -block.item-source.description = Infinitely outputs items. Sandbox only. -block.item-void.description = Destroys any items. Sandbox only. -block.liquid-source.description = Infinitely outputs liquids. Sandbox only. -block.liquid-void.description = Removes any 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.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. -block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. -block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. -block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. -block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. -block.door.description = A small door. Can be opened or closed by tapping. -block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = An upgraded version of the Mender. Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. -block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric can be used to increase shield size. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into blocks. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. -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.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. -block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] -block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. -block.overflow-gate.description = Only outputs to the left and right if the front path is blocked. -block.underflow-gate.description = The opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. -block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. -block.thermal-pump.description = The ultimate pump. -block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. -block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = An advanced power node with greater range. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. -block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning flammable materials, such as coal. -block.thermal-generator.description = Generates power when placed in hot locations. -block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. -block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. -block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. -block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. -block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. -block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. -block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. -block.core-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = Stores a large amount of items of each type. An unloader block can be used to retrieve items from the vault. -block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. -block.unloader.description = Unloads items from any nearby non-transportation block. The type of item to be unloaded can be changed by tapping. -block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. -block.duo.description = A small, cheap turret. Useful against ground units. -block.scatter.description = An essential anti-air turret. Sprays clumps of lead, scrap or metaglass flak at enemy units. -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. -block.hail.description = A small, long-range artillery turret. -block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. -block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. -block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. -block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. -block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. -block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. -block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances. -block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. -block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. -block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 32aabb9eb5..da3a524ae7 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -2,60 +2,73 @@ credits.text = Diciptakan oleh [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Kredit contributors = Penerjemah dan Kontributor discord = Bergabung di Discord Mindustry! -link.discord.description = Discord Mindustry Resmi +link.discord.description = Discord Mindustry Resmi link.reddit.description = Subreddit Mindustry link.github.description = Sumber Kode Permainan link.changelog.description = Daftar Rekam Pembaruan -link.dev-builds.description = Bentuk pengembangan (kurang stabil) +link.dev-builds.description = Bentuk pengembangan kurang stabil link.trello.description = Papan Trello resmi untuk fitur terencana -link.itch.io.description = Halaman itch.io dengan unduhan PC dan versi situs jaringan +link.itch.io.description = Halaman itch.io dengan unduhan PC link.google-play.description = Google Play Store -link.f-droid.description = Daftar katalog F-Droid -link.wiki.description = Wiki Mindustry resmi +link.f-droid.description = F-Droid +link.wiki.description = Wiki Mindustry resmi link.suggestions.description = Saran fitur baru -linkfail = Gagal membuka tautan!\nURL disalin ke papan ke papan klip. +link.bug.description = Menemukan bug? Laporkan di sini +linkfail = Gagal membuka tautan!\nURL disalin ke papan ke papan salin. screenshot = Tangkapan layar disimpan di {0} screenshot.invalid = Peta terlalu besar, tidak cukup memori untuk menangkap layar. -gameover = Permainan Habis +gameover = Permainan Selesai +gameover.disconnect = Jaringan Terputus gameover.pvp = Tim[accent] {0}[] menang! -highscore = [accent]Rekor Baru! +gameover.waiting = [accent]Menunggu peta selanjutnya... +highscore = [accent]Rekor baru! copied = Tersalin. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Bagian tersebut saat ini belum siap +indev.campaign = [accent]Selamat! Kamu telah mencapai batas dari kampanye![]\n\nHanya sejauh ini yang kamu bisa. Perjalanan antarplanet akan ditambahkan di masa mendatang. load.sound = Suara load.map = Peta load.image = Gambar load.content = Konten load.system = Sistem -load.mod = Mods +load.mod = Mod load.scripts = Skrip be.update = Versi Bleeding Edge terbaru tersedia: be.update.confirm = Unduh dan ulang kembali sekarang? be.updating = Memperbarui... -be.ignore = Biarkan -be.noupdates = Tidak ada hal baru yang ditemukan. +be.ignore = Abaikan +be.noupdates = Tidak ada pembaruan yang ditemukan. be.check = Cek versi baru -schematic = Skema -schematic.add = Menyimpan skema... -schematics = Kumpulan skema -schematic.replace = Skema dengan nama tersebut sudah ada. Ganti dengan yang baru? -schematic.exists = Sebuah skema dengan nama tersebut sudah ada. -schematic.import = Mengimpor skema... +mod.featured.dialog.title = Browser Mod +mods.browser.selected = Mod yang Dipilih +mods.browser.add = Pasang mod +mods.browser.reinstall = Pasang kembali +mods.github.open = Repo +mods.browser.sortdate = Urut berdasarkan waktu +mods.browser.sortstars = Urut berdasarkan bintang + +schematic = Bagan +schematic.add = Menyimpan bagan... +schematics = Kumpulan bagan +schematic.replace = Bagan dengan nama tersebut sudah ada. Ganti dengan yang baru? +schematic.exists = Sebuah bagan dengan nama tersebut sudah ada. +schematic.import = Mengimpor bagan... schematic.exportfile = Ekspor File schematic.importfile = Impor File schematic.browseworkshop = Cari di Workshop schematic.copy = Salin ke papan klip schematic.copy.import = Impor dari papan klip schematic.shareworkshop = Bagikan di Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Balik Skema -schematic.saved = Skema telah disimpan. -schematic.delete.confirm = Skema ini akan benar - benar dihapus -schematic.rename = Ganti nama Skema +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Balik Bagan +schematic.saved = Bagan telah disimpan. +schematic.delete.confirm = Bagan ini akan benar-benar dihapus. +schematic.rename = Ganti Nama Bagan schematic.info = {0}x{1}, {2} blok +schematic.disabled = [scarlet]Bagan dilarang[]\nAnda tidak diperbolehkan untuk menggunakan bagan di [accent]peta[] atau [accent]server ini. +stats = Statistik stat.wave = Gelombang Terkalahkan:[accent] {0} stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0} stat.built = Jumlah Blok yang Dibangun:[accent] {0} @@ -65,7 +78,7 @@ stat.delivered = Sumber Daya yang Diluncurkan: stat.playtime = Waktu Bermain:[accent] {0} stat.rank = Nilai Akhir: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]Bahan Keseluruhan map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? level.highscore = Nilai Tertinggi: [accent]{0} level.select = Pilih Level @@ -79,18 +92,19 @@ joingame = Bermain Bersama customgame = Permainan Modifikasi newgame = Permainan Baru none = +none.found = [lightgray] minimap = Peta Kecil position = Posisi close = Tutup website = Situs Jaringan quit = Keluar save.quit = Simpan & Keluar -maps = Maps +maps = Peta maps.browse = Cari Peta continue = Lanjutkan maps.none = [lightgray]Peta tidak ditemukan! invalid = Tidak valid -pickcolor = Pilih warna +pickcolor = Pilih Warna preparingconfig = Menyiapkan Konfigurasi preparingcontent = Menyiapkan Konten uploadingcontent = Mengunggah Konten @@ -99,66 +113,72 @@ committingchanges = Membuat Perubahan done = Selesai feature.unsupported = Perangkat Anda tidak mendukung fitur ini. -mods.alphainfo = Perlu diingat bahwa mod masih dalam perkembangan, dan[scarlet] bisa mengakibatkan kerusakan[].\nLapor isu atau masalah di Github atau Discord Mindustry. -mods.alpha = [accent](Alpha) +mods.initfailed = [red]âš [] Proses Mindustry sebelumnya gagal untuk dimulai. Kemungkinan besar disebabkan oleh mod yang bermasalah.\n\nUntuk menghindari kesalahan berulang, [red]semua mod telah dinonaktifkan.[]\n\nUntuk menonaktifkan fitur ini, matikan di [accent]Pengaturan->Permainan->Matikan Mod Ketika Ada Masalah Saat Memulai Permainan[]. mods = Mod mods.none = [lightgray]Tidak ada mod yang ditemukan! -mods.guide = Panduan Modding +mods.guide = Panduan Memodifikasi mods.report = Lapor Kesalahan mods.openfolder = Buka Folder Mod -mods.reload = mengulangi -mods.reloadexit = game akan keluar, untuk mengulang mod. +mods.viewcontent = Buka Konten +mods.reload = Muat Ulang +mods.reloadexit = Game akan keluar, untuk mengulang mod. +mod.installed = [[Terpasang] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Aktif mod.disabled = [scarlet]Nonaktif +mod.multiplayer.compatible = [gray]Bisa Digunakan dalam Multiplayer mod.disable = Aktif -mod.content = konten: -mod.delete.error = Tidak bisa menghapus mod. File mungkin sedang digunakan. -mod.requiresversion = [scarlet]Versi game minimal yang dibutuhkan: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.content = Konten: +mod.delete.error = Tidak dapat menghapus mod. File mungkin sedang digunakan. +mod.requiresversion = [scarlet]Versi permainan minimal yang dibutuhkan: [accent]{0} +mod.outdated = [scarlet]Tidak cocok dengan V6 (minGameVersion: 105) mod.missingdependencies = [scarlet]Ketergantungan hilang: {0} mod.erroredcontent = [scarlet]Konten Mengalami Kesalahan mod.errors = Kesalahan terjadi disaat memuat konten. mod.noerrorplay = [scarlet]Anda memiliki mod dengan suatu kesalahan.[] Antara nonaktifkan modnya atau perbaiki kesalahan tersebut sebelum bermain. mod.nowdisabled = [scarlet]Mod '{0}' tidak memiliki ketergantungan:[accent] {1}\n[lightgray]Mod ini butuh untuk diunduh terlebih dahulu.\nMod ini akan dinonaktifkan secara otomatis. -mod.enable = Aktif +mod.enable = Aktifkan mod.requiresrestart = Game akan keluar untuk mengaktifkan mod. mod.reloadrequired = [scarlet]Dibutuhkan untuk memuat ulang mod.import = Impor Mod -mod.import.file = Import File +mod.import.file = Impor File mod.import.github = Impor Mod GitHub -mod.jarwarn = [scarlet]mod dari JAR sebenarnya tidak aman.[]\nPastikan anda mengimpor mod dari sumber terpercaya! +mod.jarwarn = [scarlet]Mod dari JAR sebenarnya tidak aman.[]\nPastikan anda mengimpor mod dari sumber terpercaya! mod.item.remove = Item ini merupakan bagian dari mod[accent] '{0}'[] mod. Untuk dihilangkan, hapus mod ini. mod.remove.confirm = Mod ini akan dihapus. mod.author = [lightgray]Pencipta:[] {0} mod.missing = Simpanan ini mengandung mod yang telah diperbarui atau sudah lama tidak dipasang. Kemungkinan akan terjadi perubahan. Apakah Anda yakin untuk memuatnya?\n[lightgray]Mods:\n{0} mod.preview.missing = Sebelum memposting mod di workshop, kamu harus memberi foto pratinjau.\nBeri sebuah foto berformat[accent] preview.png[] ke dalam folder mod dan ulang kembali. -mod.folder.missing = Hanya mod dengan format folder yang dapat diposting di workshop.\nUntuk mengubah mod menjadi folder, ekstrak file mod tersebut dan pastikan berbentuk sebuah folder, kemudian ulang game Anda atau mod Anda.. -mod.scripts.disable = perangkat anda tidak mendukung mod berformat skrip/JS. Anda harus menonaktifkan mod untuk lanjut bermain!. +mod.folder.missing = Hanya mod dengan format folder yang dapat diposting di workshop.\nUntuk mengubah mod menjadi folder, ekstrak file mod tersebut dan pastikan berbentuk sebuah folder, kemudian ulang game Anda atau mod Anda. +mod.scripts.disable = Perangkat anda tidak mendukung mod berformat skrip/JS. Anda harus menonaktifkan mod untuk lanjut bermain! about.button = Tentang name = Nama: noname = Pilih[accent] nama pemain[] dahulu. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Peta Planet +launchcore = Luncurkan Inti filename = Nama File: unlocked = Konten baru terbuka! +available = Penelitian baru tersedia! completed = [accent]Terselesaikan techtree = Cabang Teknologi +research.legacy = Data penelitian [accent]5.0[] ditemukan.\nApakah kamu ingin [accent]memuat data ini[], atau [accent]mengabaikannya[] dan memulai ulang penelitian di kampanye terbaru (disarankan)? +research.load = Muat +research.discard = Abaikan research.list = [lightgray]Penelitian: research = Penelitian researched = [lightgray]{0} telah diteliti. -research.progress = {0}% complete +research.progress = {0}% diteliti players = {0} pemain aktif players.single = {0} pemain aktif -players.search = cari -players.notfound = [gray]tidak ada pemain ditemukan +players.search = Cari +players.notfound = [gray]Tidak ada pemain ditemukan server.closing = [accent]Menutup server... server.kicked.kick = Anda telah dikeluarkan dari server! server.kicked.whitelist = Anda tidak ada di dalam whitelist. server.kicked.serverClose = Server ditutup. server.kicked.vote = Anda dipilih untuk dikeluarkan. Sampai jumpa! -server.kicked.clientOutdated = Client kadaluarsa! Perbarui mindustry Anda! +server.kicked.clientOutdated = Client kadaluarsa! Perbarui game Anda! server.kicked.serverOutdated = Server kadaluarsa! Tanya pemilik untuk memperbarui! server.kicked.banned = Anda telah dilarang untuk memasuki server ini. server.kicked.typeMismatch = Server ini tidak cocok dengan versi build Anda. @@ -167,11 +187,11 @@ server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu s server.kicked.nameInUse = Sudah ada pemain dengan nama tersebut \ndi server ini. server.kicked.nameEmpty = Nama yang dipilih tidak valid. server.kicked.idInUse = Anda telah berada di server ini! Memasuki dengan dua akun tidak diizinkan. -server.kicked.customClient = Server ini tidak mendukung versi modifikasi. Download versi resmi. +server.kicked.customClient = Server ini tidak mendukung versi modifikasi. Unduh versi resmi. server.kicked.gameover = Permainan telah berakhir! server.kicked.serverRestarting = Server sedang mengulang kembali. server.versions = Versi Anda:[accent] {0}[]\nVersi server:[accent] {1}[] -host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[]. \nSemua orang yang memiliki [lightgray]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, dibutuhkan untuk melakukan [accent]port forwarding[].\n\n[lightgray]Diingat: Jika seseorang mengalami masalah memasuki permainan LAN-mu, pastikan Anda telah mengizinkan Mindustry akses ke jaringan lokalmu di pengaturan firewall. +host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[]. \nSemua orang yang memiliki [lightgray]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, dibutuhkan untuk melakukan [accent]port forwarding[].\n\n[lightgray]Diingat: Jika seseorang mengalami masalah memasuki permainan lokalmu, 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[lightgray]Ingat: Tidak ada daftar server global; jika anda ingin bergabung dengan seseorang memakai IP, Anda perlu menanyakan host tentang IP mereka. hostserver = Host Permainan invitefriends = Undang Teman @@ -179,7 +199,7 @@ hostserver.mobile = Host\nPermainan host = Host hosting = [accent]Membuka server... hosts.refresh = Muat Ulang -hosts.discovering = Mencari permainan LAN +hosts.discovering = Mencari permainan lokal hosts.discovering.any = Mencari permainan server.refreshing = Memuat ulang server hosts.none = [lightgray]Tidak ditemukan game lokal! @@ -189,15 +209,22 @@ servers.local = Server Lokal servers.remote = Server Jarak Jauh (Simpanan) servers.global = Server Komunitas +servers.disclaimer = Server komunitas [accent]tidak[] dimiliki atau diatur oleh pengembang.\n\nServer dapat berisi konten buatan pemain lain yang mungkin tidak sesuai untuk semua umur. +servers.showhidden = Tampilkan Server Tersembunyi +server.shown = Ditampilkan +server.hidden = Disembunyikan + trace = Melacak Pemain trace.playername = Nama pemain: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID Unik: [accent]{0} trace.mobile = Client Mobile: [accent]{0} trace.modclient = Client Modifikasi: [accent]{0} +trace.times.joined = Total Bergabung: [accent]{0} +trace.times.kicked = Total Dikeluarkan: [accent]{0} invalidid = Client ID tidak valid! Laporkan masalah. server.bans = Pemain Dilarang Masuk -server.bans.none = Tidak ada pemain yang diberiizin masuk! +server.bans.none = Tidak ada pemain yang tidak diberi izin masuk! server.admins = Admin server.admins.none = Tidak ada admin! server.add = Tambahkan Server @@ -221,7 +248,8 @@ disconnect.closed = Koneksi ditutup. disconnect.timeout = Waktu habis. disconnect.data = Gagal memuat data server! cantconnect = Gagal menyambung! ([accent]{0}[]). -connecting = [accent]Memasuki... +connecting = [accent]Menghubungkan... +reconnecting = [accent]Menghubungkan kembali... connecting.data = [accent]Memuat data server... server.port = Port: server.addressinuse = Alamat sudah ada! @@ -262,11 +290,15 @@ view.workshop = Lihat di Workshop workshop.listing = Sunting Daftar Workshop ok = OK open = Buka -customize = edit +customize = Sunting Peraturan cancel = Batal openlink = Buka Tautan copylink = Salin Tautan back = Kembali +max = Batas +crash.export = Ekspor Crash Log +crash.none = Tidak ada crash log ditemukan. +crash.exported = Crash log diekspor. data.export = Ekspor Data data.import = Impor Data data.openfolder = Buka Folder Data @@ -283,13 +315,20 @@ cancelbuilding = [accent][[{0}][] untuk menghapus rencana selectschematic = [accent][[{0}][] untuk memilih+salin pausebuilding = [accent][[{0}][] untuk berhenti membangun resumebuilding = [scarlet][[{0}][] untuk lanjut membangun +enablebuilding = [scarlet][[{0}][] untuk mulai membangun +showui = UI disembunyikan.\nTekan [accent][[{0}][] untuk menampilkan UI. wave = [accent]Gelombang {0} +wave.cap = [accent]Gelombang {0}/{1} wave.waiting = [lightgray]Gelombang di {0} wave.waveInProgress = [lightgray]Gelombang sedang berlangsung waiting = [lightgray]Menunggu... waiting.players = Menunggu pemain lainnya... wave.enemies = [lightgray]{0} Musuh Tersisa +wave.enemycores = [accent]{0}[lightgray] Inti Musuh +wave.enemycore = [accent]{0}[lightgray] Inti Musuh wave.enemy = [lightgray]{0} Musuh Tersisa +wave.guardianwarn = Penjaga akan tiba dalam [accent]{0}[] gelombang. +wave.guardianwarn.one = Penjaga akan tiba dalam [accent]{0}[] gelombang. loadimage = Memuat Gambar saveimage = Simpan Gambar unknown = Tak diketahui @@ -321,23 +360,23 @@ editor.oregen.info = Generasi Sumber Daya: editor.mapinfo = Info Peta editor.author = Pencipta: editor.description = Deskripsi: -editor.nodescription = Sebuah peta harus memiliki sebuah deskripsi atau 4 karakter sebelum diterbitkan. +editor.nodescription = Setiap peta harus memiliki sebuah deskripsi setidaknya 4 karakter sebelum diterbitkan. editor.waves = Gelombang: editor.rules = Peraturan: editor.generation = Generasi: editor.ingame = Sunting dalam Permainan editor.publish.workshop = Terbitkan di Workshop editor.newmap = Peta Baru +editor.center = Pusat workshop = Workshop waves.title = Gelombang waves.remove = Hapus -waves.never = waves.every = setiap waves.waves = gelombang waves.perspawn = per muncul -waves.shields = shields/wave +waves.shields = perisai/gelombang waves.to = sampai -waves.guardian = Guardian +waves.guardian = Penjaga waves.preview = Pratinjau waves.edit = Sunting... waves.copy = Salin ke Papan klip @@ -346,9 +385,10 @@ waves.invalid = Gelombang tidak valid di papan klip. waves.copied = Gelombang tersalin. waves.none = Tidak ada musuh yang didefinisikan.\nIngat bahwa susunan gelombang yang kosong akan diubah menjadi susunan gelombang standar secara otomatis. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#memang sengaja diberi huruf kecil +wavemode.counts = jumlah +wavemode.totals = total +wavemode.health = darah editor.default = [lightgray] details = Detail... @@ -357,14 +397,14 @@ editor.name = Nama: editor.spawn = Munculkan Unit editor.removeunit = Hapus Unit editor.teams = Tim -editor.errorload = Terjadi kesalahan saat memuat file:\n[accent]{0} -editor.errorsave = Terjadi kesalahan saat menyimpan file:\n[accent]{0} -editor.errorimage = Itu gambar biasa, bukan peta. Jangan merubah ekstensi dan megharapkan akan berhasil.\n\nJika anda ingin mengimpor peta "Legacy", gunakan tombol 'impor peta legacy ' di penyunting. +editor.errorload = Terjadi kesalahan saat memuat file. +editor.errorsave = Terjadi kesalahan saat menyimpan file. +editor.errorimage = Itu gambar biasa, bukan peta. editor.errorlegacy = Peta ini terlalu tua, dan memakai format peta "legacy" yang tidak didukung lagi. editor.errornot = Ini bukan merupakan file peta. editor.errorheader = File peta ini bisa jadi tidak sah atau rusak. -editor.errorname = Peta tidak ada nama. -editor.update = Perbaruan +editor.errorname = Peta tidak ada nama. Apakah Anda mencoba untuk memuat file simpanan? +editor.update = Perbaruan editor.randomize = Acak editor.apply = Terapkan editor.generate = Generasi @@ -380,8 +420,8 @@ editor.importmap = Impor Peta editor.importmap.description = Mengimpor peta yang telah ada editor.importfile = Impor File editor.importfile.description = Mengimpor file peta dari luar -editor.importimage = Impor Peta "Legacy" -editor.importimage.description = Mengimpor peta legacy dari luar +editor.importimage = Impor File Gambar +editor.importimage.description = Mengimpor file peta berbentuk gambar dari luar editor.export = Ekspor... editor.exportfile = Ekspor File editor.exportfile.description = Mengekspor sebuah file peta @@ -389,11 +429,11 @@ editor.exportimage = Expor Gambar Dunia editor.exportimage.description = Ekspor sebuah file gambar peta editor.loadimage = Impor Dunia editor.saveimage = Ekspor Dunia -editor.unsaved = [scarlet]Anda memiliki perubahan belum disimpan![]\nYakin ingin keluar? +editor.unsaved = Yakin ingin keluar?\n[scarlet]Perubahan yang belum disimpan akan hilang. editor.resizemap = Ubah Ukuran Peta editor.mapname = Nama Peta: -editor.overwrite = [accent]Peringatan!\nIni menindih peta yang telah ada. -editor.overwrite.confirm = [scarlet]Peringatan![] Peta dengan nama ini sudah ada. Yakin ingin menindihnya? +editor.overwrite = [accent]Peringatan!\nIni akan menindih peta yang telah ada. +editor.overwrite.confirm = [scarlet]Peringatan![] Peta dengan nama ini sudah ada. Yakin ingin menindihnya?\n"[accent]{0}[]" editor.exists = Sebuah peta dengan nama ini sudah ada. editor.selectmap = Pilih peta untuk dimuat: @@ -415,8 +455,9 @@ toolmode.drawteams.description = Menggambar tim bukannya blok. filters.empty = [lightgray]Tidak ada filter! Tambahkan dengan tombol dibawah. filter.distort = Kerusakkan filter.noise = Kebisingan -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = Pilih Munculnya Musuh +filter.spawnpath = Path To Spawn +filter.corespawn = Pilih Inti filter.median = Median filter.oremedian = Median Bijih filter.blend = Campur @@ -436,10 +477,11 @@ filter.option.circle-scale = Ukuran Lingkaran filter.option.octaves = Oktaf filter.option.falloff = Kemerosotan filter.option.angle = Sudut -filter.option.amount = Amount +filter.option.amount = Jumlah filter.option.block = Blok filter.option.floor = Lantai filter.option.flooronto = Target Lantai +filter.option.target = Target filter.option.wall = Dinding filter.option.ore = Sumber Daya filter.option.floor2 = Lantai Sekunder @@ -451,11 +493,13 @@ width = Lebar: height = Tinggi: menu = Menu play = Bermain -campaign = kampanye +campaign = Kampanye load = Memuat save = Simpan fps = FPS: {0} ping = Ping: {0}ms +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb language.restart = Silahkan mengulang kembali permainan agar pengaturan bahasa berpengaruh. settings = Pengaturan tutorial = Tutorial @@ -469,35 +513,26 @@ locked = Terkunci complete = [lightgray]Mencapai: requirement.wave = Capai gelombang {0} dalam {1} requirement.core = Hancurkan inti musuh dalam {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Lanjutkan Zona:\n[lightgray]{0} -bestwave = [lightgray]Gelombang Terbaik: {0} -launch = < MELUNCUR > -launch.text = Launch -launch.title = Berhasil Meluncur -launch.next = [lightgray]kesempatan berikutnya di gelombang {0} -launch.unable2 = [scarlet]Tidak dapat MELUNCUR.[] -launch.confirm = Ini akan meluncurkan semua sumber daya di inti.\nAnda tidak bisa kembali lagi ke tempat ini. -launch.skip.confirm = Jika Anda lewati sekarang, Anda tidak akan dapat meluncur hingga gelombang berikutnya. +requirement.research = Kembangkan {0} +requirement.produce = Produksi {0} +requirement.capture = Kuasai {0} +launch.text = Luncurkan +research.multiplayer = Hanya host yang dapat meneliti barang. +map.multiplayer = Hanya host yang dapat melihat sektor. uncover = Buka configure = Konfigurasi Muatan -loadout = Loadout -resources = Resources -bannedblocks = Balok yang dilarang -addall = Tambah Semu -launch.destination = Destination: {0} -configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}. -zone.unlocked = [lightgray]{0} terbuka. -zone.requirement.complete = Gelombang {0} terselesaikan:\nPersyaratan zona {1} tercapai. -zone.resources = Sumber Daya Terdeteksi: -zone.objective = [lightgray]Objektif: [accent]{0} -zone.objective.survival = Bertahan -zone.objective.attack = Hancurkan Inti Musuh -add = Menambahkan... -boss.health = Darah Bos -connectfail = [crimson]Gagal menyambung ke server:\n\n[accent]{0} +loadout = Muatan +resources = Sumber Daya +bannedblocks = Balok yang dilarang +addall = Tambah Semua +launch.from = Meluncurkan Dari: [accent]{0} +launch.destination = Destinasi: {0} +configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}. +add = Menambahkan... +boss.health = Darah Penjaga + +connectfail = [scarlet]Gagal menyambung ke server:\n\n[accent]{0} error.unreachable = Server tak terjangkau.\nApakah alamatnya benar? error.invalidaddress = Alamat tidak valid. error.timedout = Kehabisan waktu!\nPastikan pemilik mempunyai port forwarding, dan alamatnya benar! @@ -508,47 +543,99 @@ error.io = Terjadi kesalahan jaringan I/O. error.any = Terjadi kesalahan Jaringan tidak diketahui. error.bloom = Gagal untuk menginisialisasi bloom.\nPerangkat Anda mungkin tidak mendukung fitur ini. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Hujan +weather.snow.name = Salju +weather.sandstorm.name = Badai Pasir +weather.sporestorm.name = Badai Spora +weather.fog.name = Kabut -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]Belum Ditelusuri +sectors.resources = Sumber Daya: +sectors.production = Produksi: +sectors.export = Ekspor: +sectors.time = Waktu: +sectors.threat = Tingkat: +sectors.wave = Gelombang: +sectors.stored = Terisi: +sectors.resume = Lanjutkan +sectors.launch = Luncurkan +sectors.select = Pilih +sectors.nonelaunch = [lightgray]tidak ada (matahari) +sectors.rename = Ganti Nama Sektor +sectors.enemybase = [scarlet]Markas Musuh +sectors.vulnerable = [scarlet]Rawan diserang +sectors.underattack = [scarlet]Dalam Serangan! [accent]Kerusakan sebesar {0}% +sectors.survives = [accent]Bertahan sebanyak {0} gelombang +sectors.go = Mulai +sector.curcapture = Sektor Dikuasai +sector.curlost = Sektor Gagal Bertahan +sector.missingresources = [scarlet]Sumber Daya Inti Tidak Cukup +sector.attacked = Sektor [accent]{0}[white] sedang diserang! +sector.lost = Sektor [accent]{0}[white] telah dihancurkan! +#note: the missing space in the line below is intentional +sector.captured = Sektor [accent]{0}[white]ditaklukkan! -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = Rendah +threat.medium = Sedang +threat.high = Tinggi +threat.extreme = Berbahaya +threat.eradication = Pemusnahan -sector.groundZero.description = lokasi yang optimal untuk bermain satu kali lagi. Sangat sedikit musuh. Beberapa sumber daya.\nKumpulkan timah dan tembaga sebanyak yang anda bisa.\nPindah. -sector.frozenForest.description = disini, dekat dengan gunung, spora spora sudah menyebar. Temperatur yang sangat rendah tidak dapat mempertahankan selamanya.\n\nBerusaha untuk kekuatan. Bangun generator pembakaran. Pelajari cara menggunakan mender. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +planets = Planet + +planet.serpulo.name = Serpulo +planet.sun.name = Matahari + +sector.impact0078.name = Benturan 0078 +sector.groundZero.name = Titik Awal +sector.craters.name = Kawah +sector.frozenForest.name = Hutan Beku +sector.ruinousShores.name = Pantai Yang Hancur +sector.stainedMountains.name = Gunung Bernoda +sector.desolateRift.name = Retakan Terpencil +sector.nuclearComplex.name = Kompleks Produksi Nuklir +sector.overgrowth.name = Pertumbuhan +sector.tarFields.name = Lahan Perminyakan Mentah +sector.saltFlats.name = Dataran Garam +sector.fungalPass.name = Lintasan Spora +sector.biomassFacility.name = Pabrik Sintesis Biomassa +sector.windsweptIslands.name = Pulau Bersemilir +sector.extractionOutpost.name = Pos Ekstraksi Terdepan +sector.planetaryTerminal.name = Pusat Peluncuran Planet + +sector.groundZero.description = Lokasi yang optimal untuk bermain satu kali lagi. Sangat sedikit musuh. Beberapa sumber daya dapat dikumpulkan.\nKumpulkan timah dan tembaga sebanyak yang kamu bisa.\nMulai dari sini. +sector.frozenForest.description = Disini, dekat dengan gunung, spora sudah menyebar. Suhu dingin tidak dapat menahannya.\n\nHasilkan listrik. Bangun generator pembakar. Pelajari cara menggunakan mender. +sector.saltFlats.description = Di pinggiran padang pasir terdapat Daratan Garam. Beberapa sumber daya dapat ditemukan disini.\n\nMusuh telah membangun gudang disini. Hancurkan inti mereka. Jangan biarkan satupun tersisa. +sector.craters.description = Air banyak terkumpul di kawah ini, sebuah peninggalan dari perang masa lalu. Klaim area ini lagi. Kumpulkan pasir. Lebur metaglass. Pompa air untuk mendinginkan turret dan bor. +sector.ruinousShores.description = Keluar dari lembah gunung, terdapat garis pantai. Sebelumnya, area ini adalah garis pertahanan pantai. Sekarang tidak banyak yang tersisa. Hanya pertahanan dasar yang tersisa, yang lain hancur berkeping keping.\nBangun kembali pertahanan di sini. Pelajari lebih banyak teknologi. +sector.stainedMountains.description = Area ini terletak di dekat pegunungan, namun belum tersentuh oleh spora.\nTambang titanium yang ada di area ini. Pelajari fungsinya.\n\nMusuh jauh lebih kuat disini. Jangan biarkan mereka meluncurkan unit yang lebih kuat. +sector.overgrowth.description = Area ini banyak ditumbuhi spora, karena dekat dengan sumber spora.\nMusuh telah membangun basis disini. Bangun unit Mace. Hancurkan mereka. Klaim apapun yang tersisa. +sector.tarFields.description = Terletak di pinggiran zona produksi minyak, diantara gunung dan padang pasir. Salah satu dari beberapa area yang memiliki cadangan minyak yang dapat digunakan.\nMeskipun ditinggalkan, area ini terdapat pertahanan musuh yang sangat kuat disekitarnya. Jangan meremehkan mereka.\n\n[lightgray]Pelajari proses penyulingan minyak jika bisa. +sector.desolateRift.description = Zona yang sangat berbahaya. Banyak sumber daya, tetapi terdapat sedikit ruang. Sangat beresiko tinggi untuk dihancurkan. Keluar secepat yang kamu bisa. Jangan terlena karena waktu antara gelombang yang lama. +sector.nuclearComplex.description = Sebuah fasilitas untuk memproduksi dan memproses thorium, telah hancur.\n[lightgray]Pelajari thorium dan cara penggunaanya.\n\nMusuh disini menyerang dalam jumlah besar, yang siap untuk menghadapi siapapun. +sector.fungalPass.description = Area ini terdapat diantara pegunungan yang lebih tinggi dengan yang lebih rendah, juga daerah yang dipenuhi spora. Musuh membangun basis kecil disini.\nHancurkan itu.\nGunakan unit Dagger dan Crawler. Hancurkan dua inti mereka. +sector.biomassFacility.description = Asal dari semua spora di planet ini. Tempat ini adalah fasilitas dimana spora dipelajari dan diproduksi.\nPelajari teknologi yang terkait dengannya. Budi dayakan spora untuk memproduksi bahan bakar dan plastik.\n\n[lightgray]Setelah fasilitas ini hancur, spora menyebar. Tidak ada di ekosistem lokal yang dapat bersaing dengan organisme invasif seperti itu. +sector.windsweptIslands.description = Jauh dari pantai terdapat sekumpulan pulau. Catatan yang ada mengatakan bahwa mereka memiliki struktur untuk memproduksi [accent]Plastanium[].\n\nKalahkan unit laut musuh. Bangun basis di kepulauan ini. Pelajari pabriknya. +sector.extractionOutpost.description = Sebuah pos jarak jauh, dibangun musuh untuk meluncurkan sumber daya ke sektor yang lain.\n\nTeknologi tarnsportasi antar sektor dapat memudahkan untuk menaklukan lebih banyak sektor. Hancurkan basis itu. Pelajari Alas Peluncur mereka. +sector.impact0078.description = Di sini terletak sisa-sisa pesawat antarbintang yang pertama kali memasuki sistem ini.\n\nSelamatkan apapun yang ada dari sisa-sisa pesawat. Pelajari teknologi apa pun yang utuh. +sector.planetaryTerminal.description = Target terakhir.\n\nBasis pantai ini memiliki struktur yang dapat meluncurkan inti ke planet disekitarnya. Memiliki pertahanan yang sangat bagus.\n\nProduksi unit laut. Hancurkan musuh secepat mungkin. Pelajari struktur peluncuran mereka. + +status.burning.name = Membakar +status.freezing.name = Membeku +status.wet.name = Basah +status.muddy.name = Berlumpur +status.melting.name = Meleleh +status.sapped.name = Melemahkan +status.spore-slowed.name = Spora Melambat +status.tarred.name = Berminyak +status.overclock.name = Melebihi Batas +status.shocked.name = Mengkejut +status.blasted.name = Meledak +status.unmoving.name = Terdiam settings.language = Bahasa -settings.data = Game Data -settings.reset = Atur ulang ke Default (standar) +settings.data = Data Game +settings.reset = Atur ulang pilihan ke awal settings.rebind = Ganti tombol settings.resetKey = Atur ulang settings.controls = Kontrol @@ -558,76 +645,121 @@ settings.graphics = Grafik settings.cleardata = Menghapus Data Permainan... settings.clear.confirm = Anda yakin ingin menghapus data ini?\nWaktu tidak bisa diulang kembali! settings.clearall.confirm = [scarlet]PERINGATAN![]\nIni akan menghapus semua data permainan, termasuk simpanan, peta, bukaan dan keybind.\nSetelah Anda menekan 'ok' permainan akan menghapus semua data dan keluar otomatis. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = Anda yakin ingin menghapus semua simpanan? +settings.clearsaves = Bersihkan Simpanan +settings.clearresearch = Bersihkan Penelitian +settings.clearresearch.confirm = Apakah Anda yakin ingin membersihkan semua penelitian kampanye? +settings.clearcampaignsaves = Bersihkan Simpanan Kampanye +settings.clearcampaignsaves.confirm = Apakah Anda yakin ingin membersihkan semua simpanan kampanye? paused = [accent]< Jeda > clear = Bersih banned = [scarlet]Dilarang -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = Ya no = Tidak info.title = Info error.title = [crimson]Sebuah kesalahan telah terjadi error.crashtitle = Sebuah kesalahan telah terjadi -unit.nobuild = [scarlet]Unit can't build -blocks.input = Masukan -blocks.output = Pengeluaran -blocks.booster = Pendorong -blocks.tiles = Kotak yang dibutuhkan -blocks.affinities = Afinitas +unit.nobuild = [scarlet]Unit tidak dapat membangun +lastaccessed = [lightgray]Terakhir Diakses: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Kapasitas Tenaga -blocks.powershot = Tenaga/Tembakan -blocks.damage = Kerusakan -blocks.targetsair = Menargetkan Udara -blocks.targetsground = Menargetkan Darat -blocks.itemsmoved = Kecepatan Gerak -blocks.launchtime = Waktu Diantara Peluncuran -blocks.shootrange = Jarak -blocks.size = Ukuran -blocks.displaysize = Display Size -blocks.liquidcapacity = Kapasitas Zat Cair -blocks.powerrange = Jarak Tenaga -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Koneksi Maksimal -blocks.poweruse = Penggunaan Tenaga -blocks.powerdamage = Tenaga/Pukulan -blocks.itemcapacity = Kapasitas Item -blocks.basepowergeneration = Basis Generasi Tenaga -blocks.productiontime = Waktu Produksi -blocks.repairtime = Waktu Memperbaiki Blok Penuh -blocks.speedincrease = Tambahan Kecepatan -blocks.range = Jarak -blocks.drilltier = Sumber Daya yang Bisa di Bor -blocks.drillspeed = Basis Kecepatan Bor -blocks.boosteffect = Efek Pendorong -blocks.maxunits = Maks Unit Aktif -blocks.health = Darah -blocks.buildtime = Waktu Pembuatan -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Biaya Bangunan -blocks.inaccuracy = Jarak Melenceng -blocks.shots = Tembakan -blocks.reload = Tembakan/Detik -blocks.ammo = Amunisi -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = Kegunaan +stat.input = Masukan +stat.output = Pengeluaran +stat.booster = Pendorong +stat.tiles = Kotak yang dibutuhkan +stat.affinities = Kecocokan +stat.opposites = Bertentangan +stat.powercapacity = Kapasitas Tenaga +stat.powershot = Tenaga/Tembakan +stat.damage = Kerusakan +stat.targetsair = Sasaran Udara +stat.targetsground = Sasaran Darat +stat.itemsmoved = Kecepatan Gerak +stat.launchtime = Waktu Diantara Peluncuran +stat.shootrange = Jarak +stat.size = Ukuran +stat.displaysize = Ukuran Tampilan +stat.liquidcapacity = Kapasitas Zat Cair +stat.powerrange = Jarak Tenaga +stat.linkrange = Jarak Tautan +stat.instructions = Instruksi +stat.powerconnections = Koneksi Maksimal +stat.poweruse = Penggunaan Tenaga +stat.powerdamage = Tenaga/Pukulan +stat.itemcapacity = Kapasitas Bahan +stat.memorycapacity = Kapasitas Memori +stat.basepowergeneration = Basis Generasi Tenaga +stat.productiontime = Waktu Produksi +stat.repairtime = Waktu Memperbaiki Blok Penuh +stat.weapons = Senjata +stat.bullet = Peluru +stat.speedincrease = Tambahan Kecepatan +stat.range = Jarak +stat.drilltier = Sumber Daya yang Bisa di Bor +stat.drillspeed = Basis Kecepatan Bor +stat.boosteffect = Efek Pendorong +stat.maxunits = Batas Unit Aktif +stat.health = Darah +stat.armor = Pelindung +stat.buildtime = Waktu Pembuatan +stat.maxconsecutive = Batas Konsekutif +stat.buildcost = Biaya Bangunan +stat.inaccuracy = Jarak Melenceng +stat.shots = Tembakan +stat.reload = Tembakan/Detik +stat.ammo = Amunisi +stat.shieldhealth = Darah Perisai +stat.cooldowntime = Waktu Pendinginan +stat.explosiveness = Ledakan +stat.basedeflectchance = Peluang Defleksi Dasar +stat.lightningchance = Peluang Menghasilkan Petir +stat.lightningdamage = Kerusakan Petir +stat.flammability = Pembakar +stat.radioactivity = Radiasi +stat.charge = Setruman +stat.heatcapacity = Kapasitas Panas +stat.viscosity = Kelekatan +stat.temperature = Temperatur +stat.speed = Kecepatan +stat.buildspeed = Kecepatan Membangun +stat.minespeed = Kecepatan Menambang +stat.minetier = Tingkat Menambang +stat.payloadcapacity = Kapasitas Muatan +stat.commandlimit = Batas Perintah +stat.abilities = Kemampuan +stat.canboost = Dapat dipercepat +stat.flying = Terbang +stat.ammouse = Penggunaan Amunisi +stat.damagemultiplier = Penggandaan Kekuatan (dmg) +stat.healthmultiplier = Penggandaan Darah +stat.speedmultiplier = Penggandaan Kecepatan +stat.reloadmultiplier = Penggandaan Isi Ulang +stat.buildspeedmultiplier = Penggandaan Kecepatan Membangun +stat.reactive = Reaksi + +ability.forcefield = Bidang Kekuatan +ability.repairfield = Bidang Perbaikan +ability.statusfield = Bidang Status +ability.unitspawn = {0} Pabrik +ability.shieldregenfield = Bidang Regenerasi Perisai +ability.movelightning = Pergerakan Petir bar.drilltierreq = Membutuhkan Bor yang Lebih Baik -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Sumber Daya Tidak Ditemukan +bar.corereq = Memerlukan Inti Dasar bar.drillspeed = Kecepatan Bor: {0}/s bar.pumpspeed = Kecepatan Pompa: {0}/s bar.efficiency = Daya Guna: {0}% +bar.boost = Percepatan: {0}% bar.powerbalance = Tenaga: {0}/s bar.powerstored = Disimpan: {0}/{1} bar.poweramount = Tenaga: {0} bar.poweroutput = Pengeluaran Tenaga: {0} -bar.items = Item: {0} +bar.powerlines = Sambungan: {0}/{1} +bar.items = Bahan: {0} bar.capacity = Kapasitas: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = Zat Cair bar.heat = Panas bar.power = Tenaga @@ -635,60 +767,70 @@ bar.progress = Perkembangan Pembangunan bar.input = Masukan bar.output = Keluaran +units.processorcontrol = [lightgray]Dikendalikan Prosesor + bullet.damage = [stat]{0}[lightgray] kekuatan (dmg) bullet.splashdamage = [stat]{0}[lightgray] kekuatan percikan~[stat] {1}[lightgray] kotak bullet.incendiary = [stat]membakar bullet.homing = [stat]mengejar -bullet.shock = [stat]mengkejut -bullet.frag = [stat]menyebar -bullet.knockback = [stat]{0}[lightgray] pantulan kembali -bullet.freezing = [stat]membeku -bullet.tarred = [stat]tar -bullet.multiplier = [stat]{0}[lightgray]x multiplikasi amunisi -bullet.reload = [stat]{0}[lightgray]x rasio menembak +bullet.frag = [stat]memecah +bullet.lightning = [stat]{0}[lightgray]x petir ~ [stat]{1}[lightgray] kerusakan +bullet.buildingdamage = [stat]{0}%[lightgray] kerusakan bangunan +bullet.knockback = [stat]{0}[lightgray] terdorong +bullet.pierce = [stat]{0}[lightgray]x tembus +bullet.infinitepierce = [stat]menembus +bullet.healpercent = [stat]{0}[lightgray]% menyembuhkan +bullet.multiplier = [stat]{0}[lightgray]x penggandaan amunisi +bullet.reload = [stat]{0}[lightgray]x laju tembakan unit.blocks = blok +unit.blockssquared = blok² unit.powersecond = unit tenaga/detik unit.liquidsecond = unit zat cair/detik -unit.itemssecond = item/detik +unit.itemssecond = bahan/detik unit.liquidunits = unit zat cair unit.powerunits = unit tenaga unit.degrees = derajat unit.seconds = detik -unit.minutes = mins +unit.minutes = menit unit.persecond = /detik -unit.perminute = /min +unit.perminute = /menit unit.timesspeed = x kecepatan unit.percent = % -unit.shieldhealth = shield health -unit.items = item -unit.thousands = ribu -unit.millions = juta -unit.billions = b +unit.shieldhealth = darah perisai +unit.items = bahan +unit.thousands = rb +unit.millions = jt +unit.billions = m +unit.pershot = /tembakan +category.purpose = Kegunaan category.general = Umum category.power = Tenaga category.liquids = Zat Cair -category.items = Item +category.items = Barang category.crafting = Pemasukan/Pengeluaran -category.shooting = Menembak +category.function = Fungsi category.optional = Peningkatan Opsional setting.landscape.name = Kunci Pemandangan setting.shadows.name = Bayangan setting.blockreplace.name = Usulan Blok Otomatis setting.linear.name = Filter Bergaris setting.hints.name = Petunjuk -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) +setting.logichints.name = Petunjuk Logika +setting.flow.name = Tampilan Laju Aliran Sumber Daya +setting.backgroundpause.name = Jeda di Latar setting.buildautopause.name = Jeda Otomatis saat Membangun -setting.mapcenter.name = Auto Center Map To Player +setting.doubletapmine.name = Dua-kali Sentuh untuk Menambang +setting.modcrashdisable.name = Matikan Mod Ketika Ada Masalah Saat Memulai Permainan setting.animatedwater.name = Animasi Perairan -setting.animatedshields.name = Animasi Pelindung +setting.animatedshields.name = Animasi Perisai setting.antialias.name = Antialiasi[lightgray] (membutuhkan restart)[] -setting.playerindicators.name = Player Indicators +setting.playerindicators.name = Indikasi Pemain setting.indicators.name = Indikasi Musuh/Teman Lain setting.autotarget.name = Target Secara Otomatis setting.keyboard.name = Kontrol Mouse+Papan Ketik setting.touchscreen.name = Kontrol Layar Sentuh -setting.fpscap.name = Maksimal FPS +setting.fpscap.name = Pembatasan FPS setting.fpscap.none = Tidak Ada setting.fpscap.text = {0} FPS setting.uiscale.name = Skala UI[lightgray] (butuh untuk mengulang game)[] @@ -697,30 +839,28 @@ setting.difficulty.training = Latihan setting.difficulty.easy = Mudah setting.difficulty.normal = Normal setting.difficulty.hard = Susah -setting.difficulty.insane = Sangat sulit! +setting.difficulty.insane = Sangat sulit setting.difficulty.name = Tingkat Kesulitan: setting.screenshake.name = Layar Getar setting.effects.name = Munculkan Efek setting.destroyedblocks.name = Tunjukkan Blok yang Telah Hancur -setting.blockstatus.name = Display Block Status +setting.blockstatus.name = Tunjukan Status Blok setting.conveyorpathfinding.name = Navigasi Pengantar Otomatis setting.sensitivity.name = Sensitivitas Kontroler setting.saveinterval.name = Jarak Menyimpan -setting.seconds = {0} Sekon -setting.blockselecttimeout.name = Waktu Habis Pemilihan Blok -setting.milliseconds = {0} milisekon +setting.seconds = {0} detik +setting.milliseconds = {0} milidetik setting.fullscreen.name = Layar Penuh setting.borderlesswindow.name = Jendela tak Berbatas[lightgray] (mungkin memerlukan mengulang kembali) setting.fps.name = Tunjukkan FPS -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Tunjukkan Kunci Pilih Blok +setting.smoothcamera.name = Kamera Halus setting.vsync.name = VSync setting.pixelate.name = Mode Pixel[lightgray] (menonaktifkan animasi) setting.minimap.name = Tunjukkan Peta Kecil -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Tunjukkan Bahan Inti (WIP) setting.position.name = Tunjukkan Posisi Pemain setting.musicvol.name = Volume Musik -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = Tunjukkan Atmosfer Planet setting.ambientvol.name = Volume Sekeliling setting.mutemusic.name = Diamkan Musik setting.sfxvol.name = Volume Efek Suara @@ -733,35 +873,37 @@ setting.chatopacity.name = Jelas-Beningnya Pesan setting.lasersopacity.name = Jelas-Beningnya Tenaga Laser setting.bridgeopacity.name = Jelas-Beningnya Jembatan setting.playerchat.name = Tunjukkan Pesan dalam Permainan +setting.showweather.name = Perlihatkan Cuaca public.confirm = Apakah kamu ingin mempublikasi permainanmu?\n[accent]Siapa saja bisa masuk ke permainanmu.\n[lightgray]Ini bisa diganti di Peraturan->Permainan->Visibilitas Game Publik. +public.confirm.really = Jika kamu ingin bermain dengan temanmu, gunakan [green]Undang Teman[] daripada [scarlet]server publik[]!\nApakah kamu yakin ingin membuat permainanmu [scarlet]publik[]? public.beta = Ingat bahwa game versi beta tidak dapat membuat lobi publik. uiscale.reset = Skala UI telah diubah.\nTekan "OK" untuk mengonfirmasi.\n[scarlet]Kembali dan keluar di[accent] {0}[] pengaturan... uiscale.cancel = Batal & Keluar setting.bloom.name = Bloom -keybind.title = Ganti Kunci -keybinds.mobile = [scarlet]Mayoritas kunci tidak mendukung mobile. Hanya gerakan dasar yang didukung. +keybind.title = Ganti Tombol +keybinds.mobile = [scarlet]Mayoritas tombol tidak didukung oleh perangkat ponsel Hanya gerakan dasar yang didukung. category.general.name = Umum category.view.name = Melihat category.multiplayer.name = Bermain Bersama -category.blocks.name = Block Select +category.blocks.name = Pilih Blok command.attack = Serang -command.rally = Kumpul/Patroli +command.rally = Berkumpul command.retreat = Mundur -command.idle = Idle -placement.blockselectkeys = \n[lightgray]Kunci: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +command.idle = Diam di Tempat +placement.blockselectkeys = \n[lightgray]Tombol: [{0}, +keybind.respawn.name = Muncul Kembali +keybind.control.name = Kontrol Unit keybind.clear_building.name = Hapus Bangunan -keybind.press = Tekan kunci... -keybind.press.axis = Tekan sumbu atau kunci... +keybind.press = Tekan tombol... +keybind.press.axis = Tekan sumbu atau tombol... keybind.screenshot.name = Tangkapan Layar Peta keybind.toggle_power_lines.name = Aktifkan Tenaga Laser -keybind.toggle_block_status.name = Toggle Block Statuses -keybind.move_x.name = Pindah x -keybind.move_y.name = Pindah y -keybind.mouse_move.name = Ikut Mouse -keybind.pan.name = Pan View -keybind.boost.name = Boost +keybind.toggle_block_status.name = Status Blok +keybind.move_x.name = Pindah X +keybind.move_y.name = Pindah Y +keybind.mouse_move.name = Ikuti Mouse +keybind.pan.name = Tampilan Geser +keybind.boost.name = Dorongan keybind.schematic_select.name = Pilih Daerah keybind.schematic_menu.name = Menu Skema keybind.schematic_flip_x.name = Balik Skema X @@ -788,76 +930,89 @@ keybind.diagonal_placement.name = Penaruhan Diagonal keybind.pick.name = Memilih Blok keybind.break_block.name = Menghancurkan Blok keybind.deselect.name = Batal Memilih -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Angkat Muatan +keybind.dropCargo.name = Turunkan Muatan +keybind.command.name = Perintah keybind.shoot.name = Menembak keybind.zoom.name = Perbesar keybind.menu.name = Menu keybind.pause.name = Jeda keybind.pause_building.name = Jeda/Lanjut Membangun keybind.minimap.name = Peta Kecil +keybind.planet_map.name = Peta Planet +keybind.research.name = Penelitian +keybind.block_info.name = Info Blok keybind.chat.name = Pesan keybind.player_list.name = Daftar pemain keybind.console.name = Papan Konsol keybind.rotate.name = Putar -keybind.rotateplaced.name = Putar yang ada (Tekan) +keybind.rotateplaced.name = Putar yang ada (Tekan dan Tahan) keybind.toggle_menus.name = Muncul Tidaknya Menu keybind.chat_history_prev.name = Sejarah Pesan Sebelumnya keybind.chat_history_next.name = Sejarah Pesan Setelahnya keybind.chat_scroll.name = Scroll Pesan +keybind.chat_mode.name = Ubah Mode Pesan keybind.drop_unit.name = Jatuhkan Unit keybind.zoom_minimap.name = Perbesar Peta Kecil mode.help.title = Deskripsi mode mode.survival.name = Bertahan Hidup -mode.survival.description = Mode normal. Sumber daya terbatas dan gelombang otomatis. +mode.survival.description = Mode normal. Sumber daya terbatas dan gelombang otomatis.\n[gray]Membutuhkan titik munculnya musuh di dalam peta untuk main. mode.sandbox.name = Mode Sandbox/Bebas mode.sandbox.description = Sumber daya tak terbatas dan tidak ada gelombang otomatis. -mode.editor.name = Sunting +mode.editor.name = Penyunting mode.pvp.name = PvP -mode.pvp.description = Melawan pemain lain. Membutuhkan setidaknya 2 inti berbeda warna didalam peta untuk main. +mode.pvp.description = Melawan pemain lain.\n[gray]Membutuhkan setidaknya 2 inti berbeda warna di dalam peta untuk main. mode.attack.name = Penyerangan -mode.attack.description = Menghancurkan tempat musuh. Tidak ada gelombang. Membutuhkan inti merah di dalam peta untuk main. +mode.attack.description = Hancurkan markas musuh. Membutuhkan inti merah di dalam peta untuk main. mode.custom = Pengaturan Modifikasi rules.infiniteresources = Sumber Daya Tak Terbatas rules.reactorexplosions = Ledakan Reaktor -rules.wavetimer = Pengaturan Waktu Gelombang +rules.coreincinerates = Penghangusan Luapan Inti +rules.schematic = Bagan Diperbolehkan +rules.wavetimer = Pengaturan Waktu Gelombang rules.waves = Gelombang rules.attack = Mode Penyerangan -rules.buildai = AI Building -rules.enemyCheat = Sumber Daya A.I Musuh (Tim Merah) Tak Terbatas -rules.blockhealthmultiplier = Multiplikasi Darah Blok -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Multiplikasi Kecepatan Munculnya Unit -rules.unithealthmultiplier = Multiplikasi Darah Unit -rules.unitdamagemultiplier = Multiplikasi Kekuatan Unit +rules.buildai = Bangunan A.I. +rules.enemyCheat = Sumber Daya A.I. Musuh (Tim Merah) Tak Terbatas +rules.blockhealthmultiplier = Penggandaan Darah Blok +rules.blockdamagemultiplier = Penggandaan Kekuatan Blok +rules.unitbuildspeedmultiplier = Penggandaan Kecepatan Munculnya Unit +rules.unithealthmultiplier = Penggandaan Darah Unit +rules.unitdamagemultiplier = Penggandaan Kekuatan Unit +rules.unitcapvariable = Inti Memengaruhi Batas Unit +rules.unitcap = Batas Unit Dasar rules.enemycorebuildradius = Dilarang Membangun Radius Inti Musuh :[lightgray] (blok) rules.wavespacing = Jarak Gelombang:[lightgray] (detik) -rules.buildcostmultiplier = Multiplikasi Harga Bangunan -rules.buildspeedmultiplier = Multiplikasi Waktu Pembuatan Bangunan -rules.deconstructrefundmultiplier = Penggembalian Dana Mendekonstraksi Blok +rules.buildcostmultiplier = Penggandaan Harga Bangunan +rules.buildspeedmultiplier = Penggandaan Waktu Pembuatan Bangunan +rules.deconstructrefundmultiplier = Penggandaan Kembalinya Bahan Bangunan yang Dihancurkan rules.waitForWaveToEnd = Gelombang menunggu musuh rules.dropzoneradius = Radius Titik Muncul:[lightgray] (Blok) -rules.unitammo = Units Require Ammo +rules.unitammo = Unit Membutuhkan Amunisi rules.title.waves = Gelombang rules.title.resourcesbuilding = Sumber Daya & Bangunan rules.title.enemy = Musuh rules.title.unit = Unit rules.title.experimental = Eksperimental -rules.title.environment = Environment +rules.title.environment = Lingkungan rules.lighting = Penerangan -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Sinar dari Musuh +rules.fire = Api +rules.explosions = Kekuatan Ledakan Blok/Unit rules.ambientlight = Sinar Disekeliling -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Cuaca +rules.weather.frequency = Frekuensi: +rules.weather.always = Selalu +rules.weather.duration = Durasi: -content.item.name = Item +content.item.name = Bahan content.liquid.name = Zat Cair content.unit.name = Unit content.block.name = Blok +content.status.name = Status Efek +content.sector.name = Sektor + item.copper.name = Tembaga item.lead.name = Timah item.coal.name = Batu Bara @@ -873,29 +1028,12 @@ item.sand.name = Pasir item.blast-compound.name = Senyawa Peledak item.pyratite.name = Pyratit item.metaglass.name = Metaglass -item.scrap.name = Kepingan +item.scrap.name = Rongsokan liquid.water.name = Air -liquid.slag.name = Terak +liquid.slag.name = Lava liquid.oil.name = Minyak liquid.cryofluid.name = Cairan Dingin -item.explosiveness = [lightgray]Tingkat Keledakan: {0}% -item.flammability = [lightgray]Tingkat Kebakaran: {0}% -item.radioactivity = [lightgray]Tingkat Radioaktif: {0}% - -unit.health = [lightgray]Darah: {0} -unit.speed = [lightgray]Kecepatan: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Kapasitas Panas: {0} -liquid.viscosity = [lightgray]Kelekatan: {0} -liquid.temperature = [lightgray]Suhu: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -930,32 +1068,34 @@ unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Resupply Point +block.resupply-point.name = Titik Pemasok Ulang block.parallax.name = Parallax block.cliff.name = Cliff -block.sand-boulder.name = Batu Pasir +block.sand-boulder.name = Batu Pasir Besar +block.basalt-boulder.name = Batu Basal Besar block.grass.name = Rumput -block.slag.name = Slag +block.slag.name = Lahar +block.space.name = Luar Angkasa block.salt.name = Garam -block.salt-wall.name = Salt Wall +block.salt-wall.name = Bukit Garam block.pebbles.name = Kerikil block.tendrils.name = Sulur -block.sand-wall.name = Sand Wall +block.sand-wall.name = Bukit Pasir block.spore-pine.name = Cemara Spora -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Bukit Spora +block.boulder.name = Batu Besar +block.snow-boulder.name = Batu Salju Besar block.snow-pine.name = Pinus Salju block.shale.name = Serpihan block.shale-boulder.name = Serpihan Batu Besar block.moss.name = Lumut block.shrubs.name = Semak-Semak block.spore-moss.name = Lumut Spora -block.shale-wall.name = Shale Wall -block.scrap-wall.name = Dinding Kepingan -block.scrap-wall-large.name = Dinding Kepingan Besar 1 -block.scrap-wall-huge.name = Dinding Kepingan Besar 2 -block.scrap-wall-gigantic.name = Dinding Kepingan Besar 3 +block.shale-wall.name = Bukit Serpih +block.scrap-wall.name = Dinding Rongsokan +block.scrap-wall-large.name = Dinding Rongsokan Besar +block.scrap-wall-huge.name = Dinding Rongsokan Sangat Besar +block.scrap-wall-gigantic.name = Dinding Rongsokan Raksasa block.thruster.name = Pendorong block.kiln.name = Pengeringan block.graphite-press.name = Pencetak Grafit @@ -969,7 +1109,7 @@ block.deepwater.name = Air Dalam block.water.name = Air block.tainted-water.name = Air Ternoda block.darksand-tainted-water.name = Air Ternodai Pasir Hitam -block.tar.name = Tar +block.tar.name = Minyak Mentah block.stone.name = Batu block.sand.name = Pasir block.darksand.name = Pasir Hitam @@ -979,17 +1119,18 @@ block.craters.name = Kawah block.sand-water.name = Air Pasir block.darksand-water.name = Air Pasir Hitam block.char.name = Bara -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = Dasit +block.dacite-wall.name = Dinding Dasit +block.dacite-boulder.name = Batu Besar Dasit block.ice-snow.name = Salju Es -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = Dinding Batu +block.ice-wall.name = Dinding Es +block.snow-wall.name = Dinding Salju +block.dune-wall.name = Dinding Pasir block.pine.name = Cemara -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Tanah +block.dirt-wall.name = Dinding Tanah +block.mud.name = Lumpur block.white-tree-dead.name = Pohon Putih Mati block.white-tree.name = Pohon Putih block.spore-cluster.name = Kumpulan Spora @@ -1005,7 +1146,7 @@ block.dark-panel-4.name = Panel Gelap 4 block.dark-panel-5.name = Panel Gelap 5 block.dark-panel-6.name = Panel Gelap 6 block.dark-metal.name = Besi Gelap -block.basalt.name = Basalt +block.basalt.name = Basal block.hotrock.name = Batu Panas block.magmarock.name = Batu Lahar block.copper-wall.name = Dinding Tembaga @@ -1021,285 +1162,524 @@ block.thorium-wall-large.name = Dinding Thorium Besar block.door.name = Pintu block.door-large.name = Pintu Besar block.duo.name = Duo -block.scorch.name = Penghangus -block.scatter.name = Penabur -block.hail.name = Penghujan +block.scorch.name = Penyembur Api +block.scatter.name = Scatter +block.hail.name = Meriam block.lancer.name = Lancer block.conveyor.name = Pengantar block.titanium-conveyor.name = Pengantar Berbahan Titanium -block.plastanium-conveyor.name = Plastanium Conveyor +block.plastanium-conveyor.name = Pengantar Berbahan Plastanium block.armored-conveyor.name = Pengantar Berlapis Pelindung -block.armored-conveyor.description = Memindahkan barang sama cepatnya dengan pengantar titanium, namun memiliki lebih banyak armor. Tidak dapat menerima masukan dari samping dari apapun kecuali dari pengantar. block.junction.name = Simpangan block.router.name = Pengarah block.distributor.name = Distributor block.sorter.name = Penyortir -block.inverted-sorter.name = Penyortir terbalik +block.inverted-sorter.name = Penyortir Terbalik block.message.name = Pesan -block.illuminator.name = Penerang -block.illuminator.description = Sebuah benda berukuran kecil, sumber penghasil cahaya. Membutuhkan tenaga untuk berfungsi. +block.illuminator.name = Lampu block.overflow-gate.name = Gerbang Luap -block.underflow-gate.name = Gerbang Tidak Meluap +block.underflow-gate.name = Gerbang Luap Terbalik block.silicon-smelter.name = Pelebur Silikon -block.phase-weaver.name = Pengrajut Phase -block.pulverizer.name = Pulverisator -block.cryofluid-mixer.name = Penyampur Cairan Dingin +block.phase-weaver.name = Pengrajut Phase +block.pulverizer.name = Penghancur +block.cryofluidmixer.name = Penyampur Cairan Dingin block.melter.name = Pencair block.incinerator.name = Penghangus block.spore-press.name = Penekan Spora block.separator.name = Pemisah block.coal-centrifuge.name = Sentrifugal Batu Bara block.power-node.name = Simpul Tenaga -block.power-node-large.name = Tiang Listrik Besar +block.power-node-large.name = Simpul Tenaga Besar block.surge-tower.name = Tiang Listrik block.diode.name = Dioda Baterai block.battery.name = Baterai block.battery-large.name = Baterai Besar block.combustion-generator.name = Generator Pembakar -block.steam-generator.name = Generator Turbin +block.steam-generator.name = Generator Uap block.differential-generator.name = Generator Majemuk block.impact-reactor.name = Reaktor Tumbukan block.mechanical-drill.name = Bor Mekanik block.pneumatic-drill.name = Bor Pneumatik -block.laser-drill.name = Bor Laser +block.laser-drill.name = Bor Laser block.water-extractor.name = Pengekstrak Air block.cultivator.name = Pembudidaya block.conduit.name = Pipa block.mechanical-pump.name = Pompa Mekanik -block.item-source.name = Sumber Item -block.item-void.name = Penghilang Item +block.item-source.name = Sumber Bahan +block.item-void.name = Penghilang Bahan block.liquid-source.name = Sumber Zat Cair block.liquid-void.name = Penghilang Zat Zair block.power-void.name = Penghilang Tenaga block.power-source.name = Sumber Tenaga block.unloader.name = Pembongkar Muatan block.vault.name = Gudang -block.wave.name = Ombak -block.swarmer.name = Pengurung +block.wave.name = Penyemprot +block.tsunami.name = Tsunami +block.swarmer.name = Peluncur Misil block.salvo.name = Salvo -block.ripple.name = Periak +block.ripple.name = Mortir block.phase-conveyor.name = Pengantar Berbahan Phase block.bridge-conveyor.name = Jembatan Pengantar -block.plastanium-compressor.name = Kompresor Plastanium +block.plastanium-compressor.name = Kompresor Plastanium block.pyratite-mixer.name = Penyampur Pyratit -block.blast-mixer.name = Penyampur Peledak +block.blast-mixer.name = Penyampur Bahan Peledak block.solar-panel.name = Panel Surya block.solar-panel-large.name = Panel Surya Besar -block.oil-extractor.name = Penggali Minyak +block.oil-extractor.name = Pengekstrak Minyak block.repair-point.name = Tempat Perbaikan block.pulse-conduit.name = Selang Denyut block.plated-conduit.name = Pipa Terlapis block.phase-conduit.name = Selang Phase -block.liquid-router.name = Pembagi Zat Cair -block.liquid-tank.name = Tank Zat Cair -block.liquid-junction.name = Simpangan Zat Cair +block.liquid-router.name = Pengarah Cairan +block.liquid-tank.name = Bak Cairan +block.liquid-junction.name = Simpangan Cairan block.bridge-conduit.name = Jembatan Saluran block.rotary-pump.name = Pompa Putaran -block.thorium-reactor.name = Reaktor Thorium +block.thorium-reactor.name = Reaktor Thorium block.mass-driver.name = Penggerak Massal block.blast-drill.name = Bor Ledakan Udara block.thermal-pump.name = Pompa Suhu Panas -block.thermal-generator.name = Generator Suhu Panas -block.alloy-smelter.name = Pelebur Paduan Listrik -block.mender.name = Reparator -block.mend-projector.name = Proyeksi Reparator +block.thermal-generator.name = Generator Panas +block.alloy-smelter.name = Pelebur Paduan Logam +block.mender.name = Mender +block.mend-projector.name = Mender Projektor block.surge-wall.name = Dinding Listrik block.surge-wall-large.name = Dinding Listrik Besar -block.cyclone.name = Topan -block.fuse.name = Padu +block.cyclone.name = Cyclone +block.fuse.name = Fuse block.shock-mine.name = Ranjau Listrik -block.overdrive-projector.name = Proyeksi Pencepat -block.force-projector.name = Proyeksi Medan Gaya -block.arc.name = Arca -block.rtg-generator.name = Generator RTG -block.spectre.name = Iblis -block.meltdown.name = Pelebur +block.overdrive-projector.name = Projektor Pemercepat +block.force-projector.name = Projektor Pelindung +block.arc.name = Busur Petir +block.rtg-generator.name = Generator Radiasi +block.spectre.name = Meriam Raksasa +block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Kontainer block.launch-pad.name = Alas Peluncur block.launch-pad-large.name = Alas Peluncur Besar block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.command-center.name = Pusat Perintah +block.ground-factory.name = Pabrik Unit Darat +block.air-factory.name = Pabrik Unit Udara +block.naval-factory.name = Pabrik Unit Laut +block.additive-reconstructor.name = Rekonstruktor Aditif +block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatif +block.exponential-reconstructor.name = Rekonstruktor Eksponensial +block.tetrative-reconstructor.name = Rekonstruktor Tetratif +block.payload-conveyor.name = Pengantar Massa +block.payload-router.name = Pengarah Massa +block.disassembler.name = Pembongkar +block.silicon-crucible.name = Pelebur Raksasa +block.overdrive-dome.name = Kubah Projektor Pemercepat +#experimental, may be removed +block.block-forge.name = Pemadu Blok +block.block-loader.name = Pemuat Blok +block.block-unloader.name = Pembongkar Blok +block.interplanetary-accelerator.name = Akselerator Antarplanet -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Saklar +block.micro-processor.name = Prosesor Mikro +block.logic-processor.name = Prosesor Logika +block.hyper-processor.name = Prosesor Raksasa +block.logic-display.name = Tampilan Logika +block.large-logic-display.name = Tampilan Logika Besar +block.memory-cell.name = Sel Memori +block.memory-bank.name = Bank Memori team.blue.name = biru team.crux.name = merah -team.sharded.name = oranye +team.sharded.name = kuning team.orange.name = jingga -team.derelict.name = derelict +team.derelict.name = abu-abu team.green.name = hijau team.purple.name = ungu -tutorial.next = [lightgray] -tutorial.intro = Kamu telah memasuki[scarlet] Tutorial Mindustry.[]\nMulai dengan[accent] menambang tembaga[]. Tekan bijih tembaga dekat intimu.\n\n[accent]{0}/{1} tembaga -tutorial.intro.mobile = Kamu telah memasuki[scarlet] Tutorial Mindustry.[]\nGesek layar untuk bergerak.\n[accent]Gunakan 2 jari [] untuk mengecilkan dan membesarkan gambar.\nMulai dengan[accent] menambang tembaga[]. Dekati tembaganya, kemudian tekan bijih tembaga untuk mulai menambang.\n\n[accent]{0}/{1} tembaga -tutorial.drill = Menambang manual tidak efisien.\n[accent]Bor []bisa menambang otomatis.\nTaruh satu di sekumpulan tembaga. -tutorial.drill.mobile = Menambang manual tidak efisien.\n[accent]Bor []dapat menambang otomatis.\nTekan kategori bor di bawah-kanan.\nPilih[accent] Bor Mekanik[].\nLetakkan di bijih tembaga, kemudian tekan tombol[accent] centang[] dibawah untuk mengonfirmasi pilihanmu.\nTekan[accent] tombol X[] untuk membatalkan rencana. -tutorial.blockinfo = Setiap blok memiliki status berbeda. Setiap bor hanya dapat menambang bijih tertentu.\nUntuk mencari info sebuah blok,[accent] Tekan tombol "?" saat memilih blok dari menu bangunan.[]\n\n[accent]Akses status Bor Mekanik sekarang.[] -tutorial.conveyor = [accent]Pengantar[] digunakan untuk transportasi item ke inti.\nJejerlah pengantar dari bor ke inti. -tutorial.conveyor.mobile = [accent]Pengantar[] digunakan untuk transportasi item ke inti.\nJejerlah pengantar dari bor ke inti.\n[accent] Buat sebuah garis dengan menekan jarimu selama beberapa detik[] dan tarik dengan suatu arah.\n\n[accent]{0}/{1} item dari garis pengantar\n[accent]0/1 terkirim -tutorial.turret = Struktur pertahanan harus dibuat untuk menangkal [lightgray] musuh[].\nBangun menara "duo" dekat intimu. -tutorial.drillturret = Menara "duo" membutuhkan[accent] amunisi tembaga []untuk menembak.\nTaruh bor didekat menara untuk mengisinya dengan tembaga. -tutorial.pause = Disaat bermain, kamu dapat[accent] menjeda game.[]\nKamu berhenti membangun selama jeda.\n\n[accent]Tekan spasi untuk jeda. -tutorial.pause.mobile = Disaat bermain, kamu dapat[accent] menjeda game.[]\nKamu berhenti membangun selama jeda.\n\n[accent]Tekan tombol ini di atas-kiri untuk jeda. -tutorial.unpause = Tekan spasi lagi untuk menghentikan jeda. -tutorial.unpause.mobile = Tekan tombol tersebut lagi untuk berhenti jeda. -tutorial.breaking = Blok biasanya butuh untuk dihapus.\n[accent]Tekan mouse-kanan[] untuk menghapus semua blok yang diseleksi.[]\n\n[accent]Hapus semua blok kepingan di sebelah intimu. -tutorial.breaking.mobile = Blok biasanya butuh untuk dihapus.\n[accent]Tekan mode dekonstraksi[], kemudian tekan blok untuk mulai menghapus.\nHapus sebuah area dengan menahan jari beberapa detik[] dan tarik ke suatu arah .\nTekan tombol centang untuk mengonfirmasi.\n\n[accent]Hapus semua blok kepingan di sebelah intimu. -tutorial.withdraw = Di beberapa situasi, mengambil item dari blok diperlukan.\nUntuk melakukan ini, [accent]tekan sebuah blok[] berisi sebuah item, kemudian [accent]tekan item itu[] dalam inventaris.\nItem dengan jumlah banyak dapat diambil[accent]dengan cara menahan[].\n\n[accent]Ambil beberapa tembaga dari inti.[] -tutorial.deposit = Setor item dari pesawatmu ke suatu blok dengan cara menarik itemnya.\n\n[accent]Setor kembali tembagamu ke inti.[] -tutorial.waves = [lightgray] Musuh[] mendatang.\n\nLindungi intimu selama 2 gelombang. Bangun lebih banyak kubah dan bor. -tutorial.waves.mobile = Para[lightgray] Musuh[] telah muncul.\n\nLindungi intimu selama 2 gelombang. Pesawatmu akan menembak musuh secara otomatis.\nBuat lebih banyak kubah dan bor. Tambang tembaga lebih banyak. -tutorial.launch = Saat kamu mencapai gelombang tertentu, kamu dapat[accent] meluncurkan intimu[], meninggalkan pertahananmu[accent] mendapatkan semua sumber daya di intimu.[]\nSumber daya ini digunakan sebagai riset teknologi.\n\n[accent]Tekan tombol meluncur. +hint.skip = Lewati +hint.desktopMove = Tekan [accent][[WASD][] untuk bergerak. +hint.zoom = [accent]Skrol[] untuk membesarkan atau mengecilkan layar. +hint.mine = Dekati \uf8c4 bijih tembaga dan [accent]tekan[] untuk menambangnya secara manual. +hint.desktopShoot = [accent][[Klik][] untuk menembak. +hint.depositItems = Untuk memindahkan bahan, tarik bahan dari pesawatmu ke inti. +hint.respawn = Untuk muncul kembali seperti awal, tekan [accent][[V][]. +hint.respawn.mobile = Kamu telah mengambil alih kontrol dari sebuah unit/struktur. Untuk muncul kembali, [accent]tekan avatar di kiri atas.[] +hint.desktopPause = Tekan [accent][[Spasi][] untuk menjeda dan menghentikan jeda permainan. +hint.placeDrill = Pilih \ue85e [accent]Bor[] menu di kanan bawah, lalu pilih \uf870 [accent]Bor[] dan klik diatas bijih tembaga untuk menaruhnya. +hint.placeDrill.mobile = Pilih \ue85e[accent]Bor[] tab di menu di kanan bawah, lalu pilih \uf870 [accent]Bor[] dan klik diatas bijih tembaga untuk menaruhnya.\n\nTekan \ue800 [accent]tanda centang[] di bawah kanan untuk menkonfirmasi pembangunan. +hint.placeConveyor = Pengantar dapat memindahkan bahan dari bor ke blok yang lain. Pilih \uf896 [accent]Pengantar[] dari menu \ue814 [accent]Distribusi[].\n\nKlik dan tarik untuk menaruh beberapa pengantar.\n[accent]Skrol[] untuk memutarnya. +hint.placeConveyor.mobile = Pengantar dapat memindahkan bahan dari bor ke blok yang lain. Pilih \uf896 [accent]Pengantar[] dari menu \ue814 [accent]Distribusi[].\n\nTahan jari kamu sebentar dan seret untuk menaruh beberapa pengantar. +hint.placeTurret = Taruh \uf861 [accent]Menara[] untuk mempertahankan basismu daru musuh.\n\nTurret membutuhkan amunisi - yang satu ini, \uf838copper.\nGunakan pengantar dan bor untuk mengisinya. +hint.breaking = [accent]Klik kanan[] dan tarik untuk menghancurkan blok. +hint.breaking.mobile = Aktifkan \ue817 [accent]palu[] di kanan bawah dan tekan untuk menghancurkan blok.\n\nTahan jari kamu sebentar dan seret untuk menghancurkannya. +hint.research = Gunakan tombol \ue875 [accent]Riset[] untuk mempelajari teknologi baru. +hint.research.mobile = Gunakan tombol \ue875 [accent]Riset[] di \ue88c [accent]Menu[] untuk mempelajari teknologi baru. +hint.unitControl = Tahan [accent][[L-ctrl][] dan [accent]klik[] untuk mengendalikan unit atau turret teman. +hint.unitControl.mobile = [accent][Klik dua kali[] untuk mengendalikan unit atau turret teman. +hint.launch = Ketika sumber daya sudah mencukupi, kamu bisa [accent]Meluncurkan[] dengan memilih sektor terdekat dari \ue827 [accent]Map[] di kanan bawah. +hint.launch.mobile = Ketika sumber daya sudah mencukupi, kamu bisa [accent]Meluncurkan[] dengan memilih sektor terdekat dari \ue827 [accent]Map[] di \ue88c [accent]Menu[]. +hint.schematicSelect = Tahan [accent][[F][] dan tarik ke bangunan untuk menyalin bangunan.\n\n[accent][[Klik tengah][] untuk menyalin blok setipe. +hint.conveyorPathfind = Tahan [accent][[L-Ctrl][] ketika menarik pengantar untuk membuat jalur secara otomatis. +hint.conveyorPathfind.mobile = Aktifkan \ue844 [accent]diagonal mode[] dan tarik pengantar untuk membuat jalur secara otomatis. +hint.boost = Tahan [accent][[L-Shift][] untuk terbang dengan unit sekarang.\n\nHanya beberapa unit darat yang memiliki pendorong. +hint.command = Tekan [accent][[G][] untuk memperintah unit sekitarmu kedalam formasi. +hint.command.mobile = [accent][[Tekan dua kali][] unitmu untuk memperintah unit sekitarmu kedalam formasi. +hint.payloadPickup = Tekan [accent][[[] untuk membawa blok kecil atau unit. +hint.payloadPickup.mobile = [accent]Tekan dan tahan[] untuk membawa blok kecil atau unit. +hint.payloadDrop = Tekan [accent]][] untuk menurunkan muatan. +hint.payloadDrop.mobile = [accent]Tekan dan tahan[] di lokasi yang kosong untuk menurunkan muatan. +hint.waveFire = [accent]Wave[] yang terisi dengan air akan memadamkan air dalam jangkauannya. +hint.generator = \uf879 [accent]Generator Pembakar[] membakar batu bara dan menghasilkan energik ke blok yang berdekatan.\n\nTransmisi energi dapat diperluas menggunakan \uf87f [accent]Tiang Listrik[]. +hint.guardian = Unit [accent]Penjaga[] adalah unit yang diperkuat. Amunisi lemah seperti [accent]Tembaga[] dan [accent]Timah[] [scarlet]tidak efektif[].\n\nGunakan menara yang lebih bagus atau amunisi yang lebih kuat seperti \uf835 [accent]Grafit[] \uf861Duo/\uf859Salvo untuk menghancurkan Penjaga. +hint.coreUpgrade = Inti dapat ditingkatkan dengan cara [accent]meletakkan yang lebih besar diatasnya[].\n\nLetakan sebuah inti  [accent]Fondasi[] diatas inti ï¡© [accent]Shard[]. Pastikan terdapat ruang kosong dari bangunan yang lain. +hint.presetLaunch = [accent]Zona pendaratan[] yang berwarna abu-abu, seperti [accent]Hutan yang Beku[], dapat diluncurkan dari mana saja. Sektor seperti ini tidak perlu diluncurkan dari sektor terdekat milik kamu.\n\n[accent]Sektor yang bernomor[], seperti yang ini, bisa [accent]dikuasai atau diabaikan[]. +hint.coreIncinerate = Setelah inti penuh dengan suatu barang, barang yang setipe akan [accent]dihancurkan[]. +hint.coopCampaign = Ketika bermain [accent]kampanye multiplayer[], barang yang diproduksi di map ini akan diberikan ke [accent]sektor kamu juga[].\n\nSetiap penelitian baru yang dilakukan oleh host juga akan diberikan kepadamu. -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. -item.graphite.description = Karbon termineralisasi, dipakai untuk amunisi dan penyekatan listrik. -item.sand.description = Bahan umum yang digunakan di berbagai peleburan -item.coal.description = Bahan bakar umum. -item.titanium.description = Logam langka yang sangat ringan digunakan di transportasi zat cair, bor dan pesawat terbang. -item.thorium.description = Logam yang padat dan radioaktif, sebagai bantuan struktur ban bahan bakar nuklir. -item.scrap.description = Peninggalan bangunan dan unit tua. mengandung beberapa zat logam. -item.silicon.description = Semi-konduktor yang sangat berguna, penerapan di panel surya dan banyak benda elektronik. -item.plastanium.description = Bahan yang ringan dan elastis, digunakan di pesawat terbang canggih dan amunisi kepingan. -item.phase-fabric.description = Zat yang hampir tidak ada bobot ini digunakan di elektronik canggih dan teknologi reparasi. -item.surge-alloy.description = Paduan canggih dengan properti listrik yang unik. +item.copper.description = Digunakan pada semua tipe konstruksi dan amunisi. +item.copper.details = Tembaga. Logam yang sangat melimpah di Serpulo. Lemah secara struktural kecuali jika diperkuat. +item.lead.description = Digunakan pada transportasi cairan dan bangunan listrik. +item.lead.details = Padat. Lembam. Biasanya digunakan untuk baterai.\nCatatan: Kemungkinan beracun untuk kehidupan biologis. Bukan berarti tidak banyak disini. +item.metaglass.description = Digunakan pada bangunan distribusi cairan/penyimpanan. +item.graphite.description = Digunakan pada komponen listrik dan amunisi menara. +item.sand.description = Digunakan sebagai bahan produksi untuk material yang akan dimurnikan. +item.coal.description = Digunakan sebagai bahan bakar dan memurnikan material. +item.coal.details = Merupakan hasil dari tumbuhan yang menjadi fosil, sudah terjadi sangat lama sebelum spora-spora menyebar. +item.titanium.description = Digunakan pada bangunan transportasi cairan, bor dan pesawat terbang. +item.thorium.description = Digunakan pada bangunan yang kuat dan sebagai bahan bakar nuklir. +item.scrap.description = Digunakan pada Pelebur dan Penghancur untuk dimurnikan menjadi material lain. +item.scrap.details = Sisa-sisa dari bangunan dan unit tua. +item.silicon.description = Digunakan pada panel surya, bahan elektronik yang kompleks dan amunisi yang bisa mengejar. +item.plastanium.description = Digunakan dalam unit canggih, isolasi dan amunisi fragmentasi. +item.phase-fabric.description = Digunakan di elektronik canggih dan teknologi perbaikan diri sendiri. +item.surge-alloy.description = Digunakan di pertahanan yang lebih canggih dan struktur pertahanan reaktif. item.spore-pod.description = Digunakan untuk produksi minyak, bahan peledak dan bahan bakar. -item.blast-compound.description = Senyawa yang digunakan di bom dan peledak lainnya. Bisa dipakai untuk bahan bakar, tetapi tidak disarankan. -item.pyratite.description = Zat yang mudah dibakar ini digunakan di senjata pembakar. -liquid.water.description = Umumnya digunakan untuk mendinginkan mesin-mesin dan pendaur ulang. -liquid.slag.description = Berbagai tipe logam yang meleleh. Dapat dipisahkan menjadi mineral masing-masing, atau disemprokat ke musuh dijadikn senjata. -liquid.oil.description = Bisa dibakar, diledakkan atau sebagai pendigin. -liquid.cryofluid.description = Zat cair paling efisien untuk mendinginkan hal-hal. +item.spore-pod.details = Spora. Sepertinya bentuk kehidupan sintetis. Menghasilkan gas beracun yang meracuni kehidupan biologis lainnya. Sangat mudah menyebar. Sangat mudah terbakar dalam kondisi tertentu. +item.blast-compound.description = Digunakan sebagai bom dan amunisi peledak. +item.pyratite.description = Digunakan di senjata pembakar dan generator yang membutuhkan bahan mudah terbakar. -block.message.description = Menyimpan pesan. Digunakan untuk komunikasi antar sekutu. -block.graphite-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit murni. -block.multi-press.description = Versi pemadat grafit yang lebih bagus. Membutuhkan air dan tenaga untuk memproses batu bara lebih cepat dan efisien. -block.silicon-smelter.description = Mengubah pasir dengan batu bara untuk memproduksi silikon. -block.kiln.description = Membakar pasir dan timah menjadi kaca meta. Membutuhkan tenaga. +liquid.water.description = Umumnya digunakan untuk mendinginkan mesin dan pengolahan limbah. +liquid.slag.description = Dapat dipadatkan menjadi logam tertentu, atau disemprotkan ke musuh sebagai senjata. +liquid.oil.description = Digunakan di produksi material lanjutan dan sebagai amunisi yang mudah terbakar. +liquid.cryofluid.description = Digunakan sebagai pendingin di reaktor, menara, dan pabrik. + +block.resupply-point.description = Mengisi ulang amunisi unit terdekat dengan tembaga. Tidak dapat mengisi ulang unit yang menggunakan tenaga baterai. +block.armored-conveyor.description = Memindahkan barang ke depan. Tidak dapat menerima masukan dari samping. +block.illuminator.description = Memancarkan cahaya. +block.message.description = Menyimpan pesan untuk komunikasi antar sekutu. +block.graphite-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit. +block.multi-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit. Membutuhkan air sebagai pendingin. +block.silicon-smelter.description = Memproduksi silikon dari pasir dan batu bara. +block.kiln.description = Membakar pasir dan timah menjadi metaglass. block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium. block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. block.alloy-smelter.description = Memproduksi campuran logam dari titanium, timah, silikon dan tembaga. -block.cryofluid-mixer.description = Mencampur air dan titanium menjadi cairan dingin yang lebih efisien untuk pendingin. -block.blast-mixer.description = Menggunakan minyak untuk membentuk pyratite menjadi senyawa peledak yang kurang mudah terbakar tetapi lebih eksplosif. -block.pyratite-mixer.description = Mencampur batu bara, timah dan pasir menjadi pyratite yang sangat mudah terbakar. -block.melter.description = Melelehkan kepingan menjadi terak untuk proses selanjutnya atau digunakan menara. -block.separator.description = Mengekstrak logam-logam berguna dari terak. +block.cryofluidmixer.description = Mencampur air dan titanium menjadi cairan dingin. +block.blast-mixer.description = Memproduksi senyawa peledak dari pyratit dan polong spora. +block.pyratite-mixer.description = Mencampur batu bara, timah dan pasir menjadi pyratit. +block.melter.description = Melelehkan rongsokan menjadi lava. +block.separator.description = Mengekstrak komponen mineral dari lava. block.spore-press.description = Menekan polong spora menjadi minyak. -block.pulverizer.description = Menghancurkan kepingan menjadi pasir. Berguna jika tidak ada pasir disekitar. +block.pulverizer.description = Menghancurkan kepingan menjadi pasir. block.coal-centrifuge.description = Memadatkan minyak menjadi bongkahan batu bara. -block.incinerator.description = Menghancurkan mineral atau zat cair sisa. +block.incinerator.description = Menghancurkan bahan atau zat cair yang masuk. block.power-void.description = Menghilangkan semua tenaga yang masuk kedalamnya. Sandbox eksklusif. -block.power-source.description = Menghasilkan tenaga tak terbatas. Sandbox eksklusif. -block.item-source.description = Mengeluarkan item tak terhingga. Sandbox eksklusif. -block.item-void.description = Menghancurkan item apa saja tanpa penggunaan tenaga. Sandbox eksklusif. +block.power-source.description = Menghasilkan tenaga tak terhingga. Sandbox eksklusif. +block.item-source.description = Mengeluarkan bahan tak terhingga. Sandbox eksklusif. +block.item-void.description = Menghancurkan bahan apa saja. Sandbox eksklusif. block.liquid-source.description = Mengeluarkan zat cair tak terhingga. Sandbox eksklusif. -block.liquid-void.description = Menghancurkan zat cair apa saja tanpa penggunaan tenaga. Sandbox eksklusif. -block.copper-wall.description = Blok pelindung murah.\nBerguna untuk melindungi inti dan menara di beberapa gelombang awal. -block.copper-wall-large.description = Blok pelindung murah.\nBerguna untuk melindungi inti dan menara di beberapa gelombang awal.\nSebesar 4 kotak. -block.titanium-wall.description = Blok pelindung kekuatan yang sedang.\nMemberi perlindungan yang sedang dari musuh. -block.titanium-wall-large.description = Blok pelindumg dengan kekuatan yang sedang.\nMemberi perlindungan yang sedang dari musuh.\nSebesar 4 kotak. -block.plastanium-wall.description = Dinding spesial yang menyerap listrik arca dan memblokir koneksi simpul tenaga otomatis. -block.plastanium-wall-large.description = Dinding spesial yang menyerap listrik arca dan memblokir koneksi simpul tenaga otomatis.\nSebesar 4 kotak. -block.thorium-wall.description = Blok pelindung yang kuat.\nPelindung bagus dari musuh. -block.thorium-wall-large.description = Blok pelindung yang kuat.\nPelindung bagus dari musuh.\nSebesar 4 blok. -block.phase-wall.description = Tidak sekuat dinding thorium tetapi akan memantulkan peluru senjata jika tidak terlalu kuat. -block.phase-wall-large.description = Tidak sekuat dinding thorium tetapi akan memantulkan peluru senjata jika tidak terlalu kuat. \nSebesar 4 blok. -block.surge-wall.description = Blok pelindung terkuat.\nMempunyai kemungkinan untuk menyetrum penyerang. -block.surge-wall-large.description = Blok pelindung terkuat.\nMempunyai kemungkinan untuk menyetrum penyerang. \nSebesar 4 blok. -block.door.description = Pintu kecil yang bisa dibuka-tutup dengan menekannya.\nJika dibuka, musuh bisa masuk dan menembak. -block.door-large.description = Pintu kecil yang bisa dibuka-tutup dengan menekannya.\nJika dibuka, musuh bisa masuk dan menembak.\nSebesar 4 blok. -block.mender.description = Menyembuhkan blok di sekelilingnya secara berkala. Menjaga keutuhan pertahanan di sela-sela gelombang.\nDapat menggunakan silikon untuk meningkatkan jangkauan dan efisiensi. -block.mend-projector.description = Versi reparator yang lebih baik. Menyembuhkan blok di sekelilingnya secara berkala.\nDapat menggunakan silikon untuk meningkatkan jangkauan dan efisiensi. -block.overdrive-projector.description = Menambah kecepatan bangunan sekitar, seperti bor dan pengantar. -block.force-projector.description = Membentuk medan gaya berbentuk heksagon disekitar, melindungi bangunan dan unit didalamnya dari tembakan. Dapat mengalami kelebihan panas jika membendung terlalu banyak kerusakan. Bisa menggunakan cairan untuk mendinginkan. Gunakan fabrik phase untuk memperbesar jangkauan. -block.shock-mine.description = Mencedera musuh yang menginjak ranjau. Hampir tak kasat mata kepada musuh. -block.conveyor.description = Blok transportasi dasar. Memindahkan item ke kubah ataupun pabrik. Bisa diputar. -block.titanium-conveyor.description = Blok transportasi canggih. Memindahkan item lebih cepat daripada pengantar biasa. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. -block.junction.description = Berguna seperti jembatan untuk dua pengantar yang bersimpangan. Berguna di situasi dimana dua pengantar berbeda membawa bahan berbeda ke lokasi yang berbeda. -block.bridge-conveyor.description = Blok transportasi item canggih. bisa memindahkan item hingga 3 blok panjang melewati apapun lapangan atau bangunan. -block.phase-conveyor.description = Blok transportasi canggih. Menggunakan tenaga untuk teleportasi item ke sambungan pengantar phase melewati beberapa blok. -block.sorter.description = Memilah Item. Jika item cocok dengan seleksi, itemnya diperbolehkan lewat. Jika tidak, item akan dikeluarkan dari kiri dan/atau kanan. -block.inverted-sorter.description = Sama seperti penyortir, melainkan mengeluarkan item terpilih ke samping. -block.router.description = Menerima bahan dari satu arah dan mengeluarkannya ke 3 arah yang sama. Bisa juga menyimpan sejumlah bahan. Berguna untuk memisahkan bahan dari satu sumber ke target yang banyak. -block.distributor.description = Pemisah canggih yang memisah item ke 7 arah berbeda bersamaan. -block.overflow-gate.description = Kombinasi antara pemisah dan penyortir yang hanya mengeluarkan item ke kiri dan/atau ke kanan jika bagian depan tertutup. -block.underflow-gate.description = Kebalikan dari gerbang luap. Mengeluarkan ke depan jika kanan dan kiri tertutup. -block.mass-driver.description = Blok item transportasi tercanggih. Membawa beberapa item dan menembaknya ke penggerak massal lainnya dari arah yang jauh. -block.mechanical-pump.description = Pompa murah dengan pengeluaran yang pelan, tetapi tidak mengkonsumsi tenaga. -block.rotary-pump.description = Pompa canggih yang kecepatannya dua kali lipat jika menggunakan tenaga. -block.thermal-pump.description = Pompa Tercanggih. -block.conduit.description = Blok transportasi zat cair umum. Bekerja seperti pengantar, tetapi untuk zat cair. -block.pulse-conduit.description = Blok transportasi zat cair canggih. Memindahkan dan menyimpan zat cair lebih cepat dan banyak daripada saluran biasa. -block.plated-conduit.description = Sama seperti pengantar berlapis baja, tetapi menuju ke zat cair. Lebih sedikit bocor. -block.liquid-router.description = Menerima zat cair dari satu arah dan mengeluarkannya ke 3 arah yang sama. Bisa juga menyimpan sejumlah zat cair. Berguna untuk memisahkan zat cair dari satu sumber ke target yang banyak. -block.liquid-tank.description = Menyimpan jumlah zat cair yang banyak. Gunakan sebagai penyangga ketika kebutuhan zat cair tidak konstan atau sebagai penjaga untuk mendinginkan blok yang vital. -block.liquid-junction.description = Berguna seperti jembatan untuk dua saluran yang bersimpangan. Berguna di situasi dimana dua saluran berbeda membawa zat cair berbeda ke lokasi yang berbeda. -block.bridge-conduit.description = Blok transportasi zat cair canggih. bisa memindahkan zat cair hingga 3 blok panjang melewati apapun lapangan atau bangunan. -block.phase-conduit.description = Blok transportasi zat cair canggih. Menggunakan listrik untuk teleportasi zat zair ke saluran phase yang terhubung dari jarak jauh. -block.power-node.description = Membawa tenaga ke tiang tersambung. hingga empat sumber listrik, sambungan atau tiang lainnya yang bisa disambung. Tiang akan mendapatkan atau memberi tenaga ke/dari blok yang disambung. +block.liquid-void.description = Menghancurkan zat cair apa saja. Sandbox eksklusif. +block.copper-wall.description = Melindungi bangunan dari tembakan musuh. +block.copper-wall-large.description = Melindungi bangunan dari tembakan musuh. +block.titanium-wall.description = Melindungi bangunan dari tembakan musuh. +block.titanium-wall-large.description = Melindungi bangunan dari tembakan musuh. +block.plastanium-wall.description = Melindungi bangunan dari tembakan musuh. Mampu menyerap laser dan listrik arca. Memblokir koneksi simpul tenaga secara otomatis. +block.plastanium-wall-large.description = Melindungi bangunan dari tembakan musuh. Mampu menyerap laser dan listrik arca. Memblokir koneksi simpul tenaga secara otomatis. +block.thorium-wall.description = Melindungi bangunan dari tembakan musuh. +block.thorium-wall-large.description = Melindungi bangunan dari tembakan musuh. +block.phase-wall.description = Melindungi bangunan dari tembakan musuh, dan dapat memantulkan beberapa jenis peluru senjata. +block.phase-wall-large.description = Melindungi bangunan dari tembakan musuh, dan dapat memantulkan beberapa jenis peluru senjata. +block.surge-wall.description = Melindungi bangunan dari tembakan musuh, dan dapat mengeluarkan setruman arca. +block.surge-wall-large.description = Melindungi bangunan dari tembakan musuh, dan dapat mengeluarkan setruman arca. +block.door.description = Dinding yang bisa dibuka dan ditutup. +block.door-large.description = Dinding yang bisa dibuka dan ditutup. +block.mender.description = Menyembuhkan blok di sekelilingnya secara berkala.\nDapat menggunakan silikon untuk meningkatkan jangkauan dan efisiensi. +block.mend-projector.description = Menyembuhkan blok di sekelilingnya secara berkala.\nDapat menggunakan kain phase untuk meningkatkan jangkauan dan efisiensi. +block.overdrive-projector.description = Menambah kecepatan bangunan sekitar.\nDapat menggunakan kain phase untuk meningkatkan jangkauan dan efisiensi. +block.force-projector.description = Membentuk medan gaya berbentuk heksagon disekitar, melindungi bangunan dan unit didalamnya dari kerusakan.\nDapat mengalami kelebihan panas jika membendung terlalu banyak kerusakan. Dapat menggunakan cairan pendingin untuk mencegah kepanasan. Gunakan fabrik phase untuk memperbesar jangkauan. +block.shock-mine.description = Mengeluarkan setruman listrik kepada musuh yang menginjak ranjau. +block.conveyor.description = Memindahkan barang ke depan. +block.titanium-conveyor.description = Memindahkan barang ke depan. Lebih cepat daripada pengantar biasa. +block.plastanium-conveyor.description = Memindahkan barang secara bertumpuk. Menerima barang dari belakang, dan membaginya ke tiga arah di depan. Membutuhkan beberapa titik pemuat dan pembongkar untuk hasil yang maksimal. +block.junction.description = Berguna seperti jembatan untuk dua pengantar yang bersimpangan. +block.bridge-conveyor.description = Memindahkan barang melewati tanah atau bangunan. +block.phase-conveyor.description = Memindahkan barang secara instan melewati tanah atau bangunan. Memiliki jarak yang lebih jauh daripada jembatan, namun memerlukan tenaga. +block.sorter.description = Jika barang yang masuk cocok dengan seleksi, barang akan diperbolehkan lewat ke depan. Jika tidak, barang akan dikeluarkan ke kiri dan kanan. +block.inverted-sorter.description = Sama seperti penyortir, namun mengeluarkan barang terpilih ke samping. +block.router.description = Membagi barang ke 3 arah secara rata. +block.router.details = Bisa sangat menggangu. Jangan meletakannya disamping input produksi, karena laju pengeluaran barang dapat tersumbat. +block.distributor.description = Pemisah canggih yang memisah barang ke 7 arah secara rata. +block.overflow-gate.description = Hanya mengeluarkan barang ke kiri dan ke kanan jika bagian depan tertutup. +block.underflow-gate.description = Kebalikan dari gerbang luap. Mengeluarkan barang ke depan jika bagian kiri dan kanan tertutup. +block.mass-driver.description = Blok transportasi barang jarak jauh. Membawa beberapa barang dan menembaknya ke penggerak massal lainnya. +block.mechanical-pump.description = Memompa dan mengeluarkan cairan. Tidak memerlukan tenaga. +block.rotary-pump.description = Memompa dan mengeluarkan cairan. Menggunakan tenaga. +block.thermal-pump.description = Memeompa dan mengluarkan cairan. +block.conduit.description = Memindahkan cairan ke depan. Digunakan dengan pompa dan saluran lainnya. +block.pulse-conduit.description = Memindahkan cairan ke depan. Mengantarkan lebih cepat dan banyak daripada saluran biasa. +block.plated-conduit.description = Memindahkan cairan ke depan. Tidak menerima cairan dari samping. Tidak bocor. +block.liquid-router.description = Menerima cairan dari satu arah dan mengeluarkannya ke 3 arah secara rata. Dapat digunakan untuk menyimpan sejumlah cairan. +block.liquid-tank.description = Menyimpan jumlah cairan yang banyak. Mengeluarkan cairan ke segala arah, sama seperti pengarah cairan. +block.liquid-junction.description = Berguna seperti jembatan untuk dua saluran yang bersimpangan. +block.bridge-conduit.description = Memindahkan cairan melewati tanah atau bangunan. +block.phase-conduit.description = Memindahkan cairan melewati tanah atau bangunan. Memiliki jarak yang lebih jauh daripada jembatan cairan, namun memerlukan tenaga. +block.power-node.description = Membawa tenaga ke tiang tersambung. Tiang akan menerima atau memberi tenaga ke atau dari blok yang disambung. block.power-node-large.description = Mempunyai radius lebih besar dari tiang listrik biasa dan bisa menyambung hingga enam sumber listrik, sambungan atau tiang lainnya. block.surge-tower.description = Sebuah menara listrik dengan jangkauan sangat jauh tetapi sambungan yang sedikit. block.diode.description = Tenaga baterai dapat mengalir hanya dari satu arah, tetapi hanya jika tenaga di sebelah lebih sedikit. -block.battery.description = Menyimpan tenaga jika ada kelimpahan dan memberikan tenaga jika ada kekurangan, asalkan ada kapasitas tersisa. -block.battery-large.description = Menyimpan lebih banyak tenaga daripada baterai biasa. -block.combustion-generator.description = Menghasilkan tenaga dengan membakar minyak atau bahan bakar. -block.thermal-generator.description = Menghasilkan tenaga disaat ditaruh di lokasi yang panas. -block.steam-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air. -block.differential-generator.description = Menghasilkan banyak sekali tenaga. Memanfaatkan perbedaan suhu dingin cairan pendingin dan suhu panas pyratite. -block.rtg-generator.description = Generator yang tidak membutuhkan pendiginan tetapi lebih memberi sedikit tenaga daripada reaktor thorium. -block.solar-panel.description = Menghasilkan jumlah tenaga kecil dari matahari. -block.solar-panel-large.description = Menghasilkan lebih banyak tenaga dari panel surya biasa, tapi lebih mahal untuk dibangun. -block.thorium-reactor.description = Menghasilkan tenaga yang besar dari konsumsi thorium. Membutuhkan pendinginan konstan. Akan meledak jika tidak cukup pendingin . Pengeluaran tenaga tergantung kepenuhan. -block.impact-reactor.description = Sebuah generator yang lebih maju, dapat menghasilkan tenaga dengan jumlah yang sangat banyak. Memerlukan tenaga untuk menyelakan reaktor terlebih dahulu. -block.mechanical-drill.description = Bor murah. Saat ditaruh ditempat yang sesuai, mengeluarkan item dengan pelan tanpa batas. +block.battery.description = Menyimpan tenaga jika ada kelebihan. Memberikan tenaga jika ada kekurangan. +block.battery-large.description = Menyimpan tenaga jika ada kelebihan. Memberikan tenaga jika ada kekurangan. Memiliki kapasitas yang besar daripada baterai biasa. +block.combustion-generator.description = Menghasilkan tenaga dengan membakar bahan yang mudah terbakar, seperti batu bara. +block.thermal-generator.description = Menghasilkan tenaga saat ditaruh di lokasi yang panas. +block.steam-generator.description = Menghasilkan tenaga dengan membakar bahan yang mudah terbakar dan mengubah air menjadi uap. +block.differential-generator.description = Menghasilkan tenaga dalam jumlah banyak. Memanfaatkan perbedaan suhu cairan pendingin dan pyratit yang terbakar. +block.rtg-generator.description = Menggunakan panas dari senyawa radioaktif untuk memproduksi tenaga secara perlahan. +block.solar-panel.description = Menghasilkan sedikit tenaga dari sinar matahari. +block.solar-panel-large.description = Menghasilkan sedikit tenaga dari sinar matahari. Lebih efisien daripada panel surya biasa. +block.thorium-reactor.description = Menghasilkan tenaga yang besar dari konsumsi thorium. Membutuhkan pendinginan konstan. Akan meledak jika tidak cukup pendingin yang diterima. +block.impact-reactor.description = Menghasilkan tenaga dengan jumlah yang sangat banyak secara efisien. Memerlukan tenaga untuk menyalakan reaktor terlebih dahulu. +block.mechanical-drill.description = Bor murah. Saat ditaruh ditempat yang sesuai, mengeluarkan bahan dengan pelan tanpa batas. block.pneumatic-drill.description = Bor lebih cepat dari bor mekanik dan bisa memproses bahan lebih keras dengan menggunakan tekanan udara. -block.laser-drill.description = Mengebor lebih cepat lewat teknologi laser, tapi membutuhkan tenaga. Bisa menambang thorium dengan bor ini. +block.laser-drill.description = Mengebor lebih cepat lewat teknologi laser, tapi membutuhkan tenaga. Dapat menambang thorium. block.blast-drill.description = Bor tercanggih. Membutuhkan banyak tenaga. -block.water-extractor.description = Mengekstrak air dari tanah. Gunakan jika tidak ada sumber air disekitar. -block.cultivator.description = Membudidaya spora kecil menjadi polong siap diolah. -block.oil-extractor.description = Menggunakan tenaga cukup besar untuk mengekstrak minyak dari pasir. Gunakan jika tidak ada sumber minyak disekitar. -block.core-shard.description = Versi pertama dari pengulangan kapsul inti. Jika hancur, Semua kontak dengan daerah akan hilang. Jangan biarkan ini terjadi. -block.core-foundation.description = Versi kedua dari intk. Lebih kuat. Menyimpan banyak sumber daya. -block.core-nucleus.description = Versi ketiga dan pengulangan terakhir dari kapsul inti. Sangkat kuat. Menyimpan sangat banyak sumberr daya. -block.vault.description = Menyimpan semua tipe item berkuantitas besar. [lightgray] pembongkar muatan[] bisa digunakan untuk mengeluarkan item dari gudang. -block.container.description = Menyimpan semua tipe item. [lightgray] pembongkar muatan[] bisa digunakan untuk mengeluarkan item dari kontainer. -block.unloader.description = Mengeluarkan item dari kontainer, gudang atau inti kedalam pengantar atau langsung ke blok yang dituju. Tipe item yang dimuat bisa diganti dengan mengetuk pembongkar muatan. -block.launch-pad.description = Meluncurkan beberapa item tanpa meninggalkan tempat. -block.launch-pad-large.description = Sebuah alas luncur yang ditingkatkan. Menyimpan lebih banyak item dan lebih sering meluncur. -block.duo.description = menara yang murah nan kecil. Berguna melawan unit darat. -block.scatter.description = Menara Anti-Udara berukuran sedang. Melempar gumpalan timah atau kepingan ke unit musuh. -block.scorch.description = Membakar musuh yang dekat. Sangat efektif di jarak dekat. -block.hail.description = Menara meriam kecil. -block.wave.description = Menara penembak beruntun ukuran sedang yang menembak gelembung air. -block.lancer.description = Menara ukuran sedang yang menembak sinar listrik. -block.arc.description = Menara kecil jarak dekat ini menembak listrik secara acak ke arah musuh. -block.swarmer.description = Menara ukuran sedang yang menembak misil bertubi-tubi. -block.salvo.description = Menara ukuran sedang yang menembak pelurunya secara serentak. -block.fuse.description = Menara besar ini menembak sinar pendek yang kuat. -block.ripple.description = Menara meriam besar yang menembak beberapa peluru sekaligus. -block.cyclone.description = Menara penembak beruntun besar. -block.spectre.description = Menara besar yang menembak dua peluru kuat sekaligus. -block.meltdown.description = Menara besar ini menembak sinar panjang yang kuat. -block.repair-point.description = Terus menerus memulihkan unit terluka disekitar. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.water-extractor.description = Memompa air dari tanah. Gunakan jika tidak ada sumber air di sekitar. +block.cultivator.description = Menumbuhkan konsentrasi spora yang kecil di atmosfer menjadi polong spora. +block.cultivator.details = Teknologi yang dipulihkan. Digunakan untuk memproduksi biomassa secara efisien. Kemungkinan merupakan inkubator awal dari spora yang sekarang menutupi Serpulo. +block.oil-extractor.description = Menggunakan jumlah tenaga, pasir dan air yang banyak untuk diolah menjadi minyak. +block.core-shard.description = Inti markas. Jika hancur, sektormu akan hilang. +block.core-shard.details = Iterasi pertama. Padat. Bisa menggandakan dirinya (untuk menguasai sektor disekitarnya). Dilengkapi dengan pendorong yang sekali pakai. Tidak didesain untuk perjalanan antar planet. +block.core-foundation.description = Inti markas. Lebih kuat. Menyimpan banyak sumber daya. +block.core-foundation.details = Iterasi kedua. +block.core-nucleus.description = Inti markas. Sangat kuat. Menyimpan sangat banyak sumber daya. +block.core-nucleus.details = Iterasi ketiga dan yang terakhir. +block.vault.description = Menyimpan semua tipe bahan dalam jumlah besar. Bahan dapat dikeluarkan dengan pembongkar muatan. +block.container.description = Menyimpan semua tipe bahan dalam jumlah kecil. Bahan dapat dikeluarkan dengan pembongkar muatan. +block.unloader.description = Mengeluarkan bahan yang ditentukan dari bangunan. +block.launch-pad.description = Meluncurkan beberapa bahan ke sektor yang dipilih. +block.duo.description = Menembakkan peluru bergantian ke musuh. +block.scatter.description = Menembakkan gumpalan timah, rongsokan atau metaglass ke musuh udara. +block.scorch.description = Membakar musuh darat yang dekat dengannya. Sangat efektif dalam jarak dekat. +block.hail.description = Menembakkan peluru kecil ke musuh darat dari jarak jauh. +block.wave.description = Menembakkan aliran cairan ke musuh. Secara otomatis memadamkan api saat disuplai dengan air. +block.lancer.description = Memuat dan menembakkan sinar energi yang kuat ke target darat. +block.arc.description = Menembakkan sambaran arca ke musuh darat. +block.swarmer.description = Menembakkan misil yang mengejar ke arah musuh. +block.salvo.description = Menembakkan peluru cepat ke arah musuh. +block.fuse.description = Menembakkan tiga penusuk tajam jarak dekat ke musuh terdekat. +block.ripple.description = Menembakkan cangkang berkelompok ke musuh darat dari jarak jauh. +block.cyclone.description = Menembakkan gumpalan peledak ke musuh terdekat. +block.spectre.description = Menembakkan peluru besar yang menembus lapis baja ke target udara dan darat. +block.meltdown.description = Mengisi dan menembakkan sinar laser yang terus-menerus ke musuh di sekitar. Membutuhkan pendingin untuk beroperasi. +block.foreshadow.description = Menembakkan baut besar jarak jauh yang hanya menembak satu target. Mengutamakan musuh dengan batas darah tertinggi. +block.repair-point.description = Memulihkan unit terluka disekitar secara terus-menerus. +block.segment.description = Merusakkan dan menghancurkan proyektil yang datang. Proyektil laser tidak akan ditargetkan. +block.parallax.description = Menembakkan laser yang menarik target udara, juga merusaknya selama dalam proses. +block.tsunami.description = Menembakkan cairan dalam jumlah dan tekanan besar ke arah musuh. Akan memadamkan api secara otomatis jika diisi dengan air. +block.silicon-crucible.description = Memurnikan silikon dari pasir dan batubara, menggunakan pyratit sebagai sumber panas tambahan. Lebih efesien jika diletakkan di area yang panas. +block.disassembler.description = Memisahkan lava menjadi mineral langka dalam efesiensi rendah. Bisa memproduksi thorium. +block.overdrive-dome.description = Menambahkan kecepatan pada bangunan disekitarnya. Membutuhkan kain phase dan silikon untuk bekerja. +block.payload-conveyor.description = Memindahkan muatan yang besar, seperti unit dari pabrik. +block.payload-router.description = Membagi muatan masukan menjadi 3 arah keluaran. +block.command-center.description = Mengontrol perilaku unit dengan beberapa perintah berbeda. +block.ground-factory.description = Memproduksi unit darat. Hasil unit dapat digunakan secara langsung, atau dipindah ke rekonstruktor untuk ditingkatkan. +block.air-factory.description = Memproduksi unit udara. Hasil unit dapat digunakan secara langsung, atau dipindah ke rekonstruktor untuk ditingkatkan. +block.naval-factory.description = Memproduksi unit laut. Hasil unit dapat digunakan secara langsung, atau dipindah ke rekonstruktor untuk ditingkatkan. +block.additive-reconstructor.description = Meningkatkan unit didalamnya menjadi tingkat dua. +block.multiplicative-reconstructor.description = Meningkatkan unit didalamnya menjadi tingkat tiga. +block.exponential-reconstructor.description = Meningkatkan unit didalamnya menjadi tingkat empat. +block.tetrative-reconstructor.description = Meningkatkan unit didalamnya menjadi tingkat lima dan terakhir. +block.switch.description = Sakelar yang dapat dialihkan. Status dapat dibaca dan dikontrol dengan prosesor logika. +block.micro-processor.description = Menjalankan urutan instruksi logika dalam satu lingkaran. Dapat digunakan untuk mengontrol unit dan bangunan. +block.logic-processor.description = Menjalankan urutan instruksi logika dalam satu lingkaran. Dapat digunakan untuk mengontrol unit dan bangunan. Lebih cepat dibandingkan prosesor mikro. +block.hyper-processor.description = Menjalankan urutan instruksi logika dalam satu lingkaran. Dapat digunakan untuk mengontrol unit dan bangunan. Lebih cepat dibandingkan prosesor logika. +block.memory-cell.description = Menyimpan informasi untuk prosesor. +block.memory-bank.description = Menyimpan informasi untuk prosesor. Berkapasitas besar. +block.logic-display.description = Menampilkan grafik sembarang dari prosesor. +block.large-logic-display.description = Menampilkan grafik sembarang dari prosesor. Lebih besar. +block.interplanetary-accelerator.description = Sebuah menara railgun elektromagnetik raksasa. Meluncurkan Inti dengan kecepatan tinggi untuk peluncuran antarplanet. + +unit.dagger.description = Menembak musuh terdekat dengan amunisi standar. +unit.mace.description = Menyerang musuh terdekat dengan cara membakarnya. +unit.fortress.description = Menembak musuh darat dengan altileri jarak jauh. +unit.scepter.description = Menembak semua musuh terdekat dengan rentetan peluru bermuatan listrik. +unit.reign.description = Menembak semua musuh terdekat dengan gugusan peluru tajam dalam jumlah banyak. +unit.nova.description = Menembak baut laser yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat terbang. +unit.pulsar.description = Menembak petir yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat terbang. +unit.quasar.description = Menembak sinar laser yang dapat menembus bangunan yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat terbang. Memiliki perisai. +unit.vela.description = Menembak sinar laser besar dan kontinu yang dapat merusak musuh, membakarnya dan memperbaiki bangunan musuh. Dapat terbang. +unit.corvus.description = Menembak sinar laser besar yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat berjalan diatas hampir semua medan. +unit.crawler.description = Berlari menuju musuh dan menghancurkan dirinya, yang dapat menghasilkan ledakan besar. +unit.atrax.description = Menembak musuh dengan cairan lava kepada target darat. Dapat berjalan diatas hampir semua medan. +unit.spiroct.description = Menembak laser pelemah kepada musuh, dapat memperbaiki dirinya dalam proses. Dapat berjalan diatas hampir semua medan. +unit.arkyid.description = Menembak laser pelemah besar kepada musuh, dapat memperbaiki dirinya dalam proses. Dapat berjalan diatas hampir semua medan. +unit.toxopid.description = Menembak gugusan cangkang energi besar dan laser penusuk kepada musuh. Dapat berjalan diatas hampir semua medan. +unit.flare.description = Menembak musuh darat terdekat dengan amunisi standar. +unit.horizon.description = Menjatuhkan gugusan bom kepada musuh darat. +unit.zenith.description = Menembak misil kepada musuh terdekat. +unit.antumbra.description = Menembak rentetan peluru kepada musuh terdekat. +unit.eclipse.description = Menembak dua sinar laser dan rentetan peluru kepada musuh terdekat. +unit.mono.description = Menambang tembaga dan timah secara otomatis, membawanya menuju inti. +unit.poly.description = Membangun kembali bangunan yang hancur secara otomatis dan membantu unit lain dalam pembangunan. +unit.mega.description = Memperbaiki bangunan secara otomatis. Dapat membawa bangunan dan unit darat kecil. +unit.quad.description = Menjatuhkan bom besar kepada target darat, yang bisa memberbaiki struktur teman dan merusak musuh. Dapat membawa unit darat berukuran sedang. +unit.oct.description = Melindungi teman disekitarnya dengan perisai yang dapat beregenerasi. Dapat membawa hampir semua unit darat. +unit.risso.description = Menembak misil dan peluru kepada semua musuh terdekat. +unit.minke.description = Menembak cangkang pembakar dan peluru standar kepada musuh darat terdekat. +unit.bryde.description = Menembak altileri jarak jauh dan misil kepada musuh. +unit.sei.description = Menembak rentetan misil dan peluru yang dapat menembus baju besi kepada musuh. +unit.omura.description = Menembak railgun jarak jauh kepada musuh. Dapat memproduksi unit flare. +unit.alpha.description = Melindungi Inti Bagian dari musuh. Dapat membangun. +unit.beta.description = Melindungi Inti Fondasi dari musuh. Dapat membangun. +unit.gamma.description = Melindungi Inti Nukleus dari musuh. Dapat membangun. + +lst.read = Membaca angka dari memori sel yang dihubungkan. +lst.write = Menulis angka ke memori sel yang dihubungkan. +lst.print = Menambahkan teks ke daftar cetak.\nTidak dapat menampilkan apapun sampai [accent]Print Flush[] dipakai. +lst.draw = Menambahkan perintah ke daftar gambar.\nTidak dapat menampilkan apapun sampai [accent]Draw Flush[] dipakai. +lst.drawflush = Mengeluarkan perintah [accent]Draw[] dari daftar antrean untuk ditampilkan. +lst.printflush = Mengeluarkan perintah [accent]Print[] dari daftar antrean untuk blok pesan. +lst.getlink = Dapatkan tautan prosesor dengan indeks. Dimulai dari 0. +lst.control = Mengendalikan bangunan. +lst.radar = Mendeteksi unit di sekitar bangunan dalam jarak. +lst.sensor = Mengambil data dari bangunan atau unit. +lst.set = Menentukan sebuah variabel. +lst.operation = Melakukan operasi pada 1-2 variabel. +lst.end = Loncati ke awal dari tumpukan perintah. +lst.jump = Loncati secara bersyarat ke pernyataan berikutnya. +lst.unitbind = Menautkan ke unit jenis berikutnya, dan menyimpannya di [accent]@unit[]. +lst.unitcontrol = Mengendalikan unit yang saat ini dihubungkan. +lst.unitradar = Mendeteksi unit lain di sekitar unit yang saat ini dihubungkan. +lst.unitlocate = Mendeteksi sebuah tipe tertentu dari posisi/bangunan di mana saja di peta.\nMemerlukan unit yang dihubungkan. + +logic.nounitbuild = [red]Logika unit membangun tidak diperbolehkan di sini. + +lenum.type = Bentuk dari bangunan/unit.\nMisalnya, untuk blok pengarah masa, akan tampil sebagai [accent]@router[].\nBukan string. +lenum.shoot = Menembak pada suatu posisi yang ditentukan. +lenum.shootp = Menembak pada unit/bangunan dengan prediksi kecepatan. +lenum.configure = Pengaturan bangunan, misalnya menyortir barang. +lenum.enabled = Menentukan aktif tidaknya suatu blok. + +laccess.color = Warna lampu. +laccess.controller = Pengendali unit. Jika dikendalikan prosesor, mengembalikan prosesor.\nJika unit dalam barisan, mengembalikan leader.\nSebaliknya, mengembalikan unit itu sendiri. +laccess.dead = Menentukan apakah unit/bangunan itu hancur atau tidak ada lagi. +laccess.controlled = Mengembalikan:\n[accent]@ctrlProcessor[] bila pengendali unit adalah prosesor\n[accent]@ctrlPlayer[] bila pengendali unit/bangunan adalah pemain\n[accent]@ctrlFormation[] bila unit dalam formasi\nSebaliknya, 0. +laccess.commanded = [red]Kadaluarsa. Akan segera dihapus![]\nLebih baik gunakan [accent]controlled[]. + +graphicstype.clear = Mengisi tampilan dangan warna. +graphicstype.color = Menentukan warna untuk operasi mengambar selanjutnya. +graphicstype.stroke = Menentukan lebar garis. +graphicstype.line = Menggambar segmen garis. +graphicstype.rect = Mengisi sebuah persegi panjang. +graphicstype.linerect = Menggambar sebuah garis persegi panjang. +graphicstype.poly = Mengisi sebuah poligon beraturan. +graphicstype.linepoly = Menggambar sebuah garis poligon beraturan. +graphicstype.triangle = Mengisi sebuah segitiga. +graphicstype.image = Membentuk sebuah gambar dari suatu konten.\nMisal: [accent]@router[] atau [accent]@dagger[]. + +lenum.always = Selalu benar. +lenum.idiv = Pembagian integer. +lenum.div = Pembagian.\nMengembalikan [accent]null[] pada pembagian dengan nol. +lenum.mod = Modulus. +lenum.equal = Kesetaraan. Mengonversikan tipe.\nObjek bukan nol dibandingkan dengan angka menjadi 1, jika tidak 0. +lenum.notequal = Kesetaraan tanpa jenis pemaksaan. Mengonversikan tipe. +lenum.strictequal = Kesetaraan dengan jenis pemaksaan. Tidak mengonversikan tipe.\nDapat digunakan untuk memeriksa [accent]null[]. +lenum.shl = Bit-shift kiri. +lenum.shr = Bit-shift kanan. +lenum.or = Bitwise OR. +lenum.land = Logika AND. +lenum.and = Bitwise AND. +lenum.not = Bitwise flip. +lenum.xor = Bitwise XOR. + +lenum.min = Minimum dari dua angka. +lenum.max = Maksimum dari dua angka. +lenum.angle = Sudut vektor dalam derajat. +lenum.len = Panjang vektor. +lenum.sin = Sinus, dalam derajat. +lenum.cos = Kosinus, dalam derajat. +lenum.tan = Tangen, dalam derajat. +#bukan typo, cari 'daerah hasil fungsi' +lenum.rand = Angka Acak dalam jarak [0, value). +lenum.log = Logaritma natural (ln). +lenum.log10 = Logaritma basis 10. +lenum.noise = Kebisingan simpleks 2D. +lenum.abs = Nilai absolut. +lenum.sqrt = Akar pangkat dua. + +lenum.any = Unit apapun. +lenum.ally = Unit teman. +lenum.attacker = Unit dengan senjata. +lenum.enemy = Unit musuh. +lenum.boss = Unit penjaga. +lenum.flying = Unit terbang. +lenum.ground = Unit darat. +lenum.player = Unit yang dikendalikan oleh pemain. + +lenum.ore = Bahan tambang. +lenum.damaged = Bangunan teman yang rusak. +lenum.spawn = Titik munculnya musuh.\nDapat berupa inti atau suatu posisi. +lenum.building = Bangunan dalam suatu kumpulan. + +lenum.core = Inti apapun. +lenum.storage = Bangunan penyimpanan, misalnya gudang. +lenum.generator = Bangunan yang menghasilkan tenaga. +lenum.factory = Bangunan yang mengubah sumber daya. +lenum.repair = Tempat perbaikan. +lenum.rally = Pusat perintah. +lenum.battery = Baterai apapun. +lenum.resupply = Titik pemasok ulang.\nHanya berguna ketika [accent]"Amunisi Unit"[] dihidupkan. +lenum.reactor = Reaktor Benturan/Thorium. +lenum.turret = Menara apapun. + +sensor.in = Bangunan/unit yang akan dilacak. + +radar.from = Bangunan yang akan dilacak.\nJarak pelacakan dibatasi oleh jarak bangunan. +radar.target = Saringan untuk unit yang akan dilacak. +radar.and = Penyaring tambahan. +radar.order = Menyortir perintah. 0 untuk memutar balik. +radar.sort = Metrik untuk mengurutkan hasil. +radar.output = Variabel untuk menuliskan perintah unit. + +unitradar.target = Saringan untuk unit yang akan dilacak. +unitradar.and = Penyaring tambahan. +unitradar.order = Menyortir perintah. 0 untuk memutar balik. +unitradar.sort = Metrik untuk mengurutkan hasil. +unitradar.output = Variabel untuk menuliskan perintah unit. + +control.of = Bangunan yang akan dikendalikan. +control.unit = Unit/bangunan yang akan ditargetkan. +control.shoot = Menentukan apakah akan menembak. + +unitlocate.enemy = Menentukan apakah akan menemukan bangunan musuh. +unitlocate.found = Menentukan ditemukannya objek tersebut. +unitlocate.building = Mengeluarkan variabel untuk bangunan yang terlihat. +unitlocate.outx = Mengeluarkan koordinat X. +unitlocate.outy = Mengeluarkan koordinat Y. +unitlocate.group = Kumpulan bangunan yang akan dicari. + +lenum.idle = Tidak bergerak, namun tetap membangun/menambang.\nSifat awalan. +lenum.stop = Berhenti bergerak/menambang/membangun. +lenum.move = Bergerak ke posisi yang ditentukan. +lenum.approach = Mendekati posisi dalam radius. +lenum.pathfind = Mencari arah ke tempat munculnya musuh. +lenum.target = Menembak pada posisi. +lenum.targetp = Menembak target dengan perkiraan kecepatan. +lenum.itemdrop = Menjatuhkan bahan. +lenum.itemtake = Mengambil bahan dari suatu bangunan. +lenum.paydrop = Menurunkan muatan yang ada. +lenum.paytake = Mengangkut muatan pada lokasi ini. +lenum.flag = Tanda numerik unit. +lenum.mine = Menambang pada sebuah posisi. +lenum.build = Membangun sebuah sttruktur. +lenum.getblock = Mengambil bangunan dan tipenya pada koordinat tertentu.\nUnit harus ada dalam jangkauan tersebut.\nBentuk padat yang bukan merupakan bangunan akan memiliki tipe [accent]@solid[]. +lenum.within = Memeriksa apakah unit di dekat suatu posisi. +lenum.boost = Mulai/berhenti mempercepat. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index c10f894851..dd1d40f0f7 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1,4 +1,4 @@ -credits.text = Creato da [royal]Anuken[] - [sky]anukendev@gmail.com[]\n\nVersione Italiana:[lightgray]\nDeltaRays\nGioIacca9[] +credits.text = Creato da [royal]Anuken[] - [sky]anukendev@gmail.com[]\n\nVersione Italiana:[lightgray]\nDeltaRays\nGioIacca9 and Diegator04[] credits = Crediti contributors = Traduttori e Contributori discord = Entra nel server Discord di Mindustry! @@ -7,7 +7,7 @@ link.reddit.description = Il subreddit di Mindustry! link.github.description = Codice sorgente del gioco link.changelog.description = Elenco delle modifiche del gioco link.dev-builds.description = Build di sviluppo versioni instabili -link.trello.description = Scheda ufficiale Trello per funzionalità pianificate +link.trello.description = Sezione ufficiale Trello per funzionalità pianificate link.itch.io.description = Pagina di itch.io con download per PC e versione web link.google-play.description = Elenco di Google Play Store link.f-droid.description = Catalogo F-Droid @@ -16,19 +16,21 @@ link.suggestions.description = Suggerisci nuove funzionalità linkfail = Impossibile aprire il link! L'URL è stato copiato negli appunti. screenshot = Screenshot salvato a {0} screenshot.invalid = Mappa troppo pesante, probabilmente non c'è abbastanza spazio sul disco. -gameover = Il Nucleo è stato distrutto. +gameover = Hai Perso. +gameover.disconnect = Disconnetti gameover.pvp = La squadra[accent] {0}[] ha vinto! +gameover.waiting = [accent]In attesa della prossima mappa... highscore = [accent]Nuovo record! copied = Copiato. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Questa parte del gioco non è ancora pronta +indev.campaign = [accent]Congratulazioni! Hai raggiunto la fine della modalità campagna![]\n\nI contenuti per ora si fermano qui. In qualche aggiornamento futuro scoprirai i viaggi interplanetari. load.sound = Suoni load.map = Mappe load.image = Immagini load.content = Contenuti load.system = Sistema -load.mod = Mods +load.mod = Mod load.scripts = Scripts be.update = Una nuova build Bleeding Edge è disponibile: @@ -55,7 +57,9 @@ schematic.saved = Schematica salvata. schematic.delete.confirm = Questa schematica sarà cancellata definitivamente. schematic.rename = Rinomina Schematica schematic.info = {0}x{1}, {2} blocchi +schematic.disabled = [scarlet]Schematiche disabilitate[]\nNon hai il permesso di usare schematiche in questa [accent]mappa[] o [accent]server. +stats = Statistiche stat.wave = Ondate Sconfitte:[accent] {0} stat.enemiesDestroyed = Nemici Distrutti:[accent] {0} stat.built = Costruzioni Erette:[accent] {0} @@ -65,7 +69,7 @@ stat.delivered = Risorse Lanciate: stat.playtime = Tempo Di Gioco:[accent] {0} stat.rank = Livello Finale: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]Oggetti Globali map.delete = Sei sicuro di voler eliminare la mappa '[accent]{0}[]'? level.highscore = Miglior Punteggio: [accent]{0} level.select = Selezione del Livello @@ -95,19 +99,18 @@ preparingconfig = Preparo la Configurazione preparingcontent = Preparo il Contenuto uploadingcontent = Carico il Contenuto uploadingpreviewfile = Carico File di Anteprima -committingchanges = Applico le Modifiche +committingchanges = Applicando le Modifiche done = Fatto feature.unsupported = Il tuo dispositivo non supporta questa funzione. -mods.alphainfo = Tieni a mente che queste mods sono in alpha e[scarlet] possono contenere molti bug[]. Segnala tutti i problemi che trovi sulla pagina GitHub o sul server Discord di Mindustry. -mods.alpha = [accent](Alpha) -mods = Mods +mods.alphainfo = Tieni a mente che queste mod sono in alpha e[scarlet] possono contenere molti bug[]. Segnala eventuali problemi che trovi sulla pagina GitHub o sul server Discord di Mindustry. +mods = Mod mods.none = [lightgray]Nessuna mod trovata! mods.guide = Guida per il modding mods.report = Segnala un Bug mods.openfolder = Apri Cartella mods.reload = Ricarica -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Il gioco si chiuderà per ricaricare le mod. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Abilitato mod.disabled = [scarlet]Disabilitato @@ -115,40 +118,44 @@ mod.disable = Disabilita mod.content = Contenuto: mod.delete.error = Impossibile eliminare questa mod. Il file potrebbe essere in uso. mod.requiresversion = [scarlet]Versione minima richiesta: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]Non compatibile con V6 (Versione minima: 105) mod.missingdependencies = [scarlet]Dipendenze mancanti: {0} mod.erroredcontent = [scarlet]Errori di Contenuto mod.errors = Si sono verificati degli errori durante il caricamento del contenuto. mod.noerrorplay = [scarlet]Sono presenti delle mod con errori.[] Puoi disabilitare le mod affette oppure sistemarle prima di giocare. -mod.nowdisabled = [scarlet]Alla mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste mods devono essere scaricate prima.\nQuesta mod verrà disabilitata automaticamente. +mod.nowdisabled = [scarlet]Alla mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste mod devono essere scaricate prima.\nQuesta mod verrà disabilitata automaticamente. mod.enable = Abilita mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti. mod.reloadrequired = [scarlet]Riavvio necessario mod.import = Importa Mod mod.import.file = Importa File mod.import.github = Importa Mod da GitHub -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]Le mod JAR mod sono intrinsecamente pericolose.[]\nAssicuratevi di star importando questa mod da una fonte affidabile!! mod.item.remove = Questo item fa parte della mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa mod. mod.remove.confirm = Questa mod verrà eliminata. mod.author = [lightgray]Autore:[] {0} -mod.missing = Questo salvataggio contiene delle mods che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} -mod.preview.missing = Prima di pubblicare questa mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine con nome[accent] preview.png[] nella cartella della mods e riprova. -mod.folder.missing = Solo le mods in una cartella possono essere pubblicate nel Workshop.\nPer convertire una mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods. +mod.missing = Questo salvataggio contiene delle mod che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mod:\n{0} +mod.preview.missing = Prima di pubblicare questa mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine con nome[accent] preview.png[] nella cartella della mod e riprova. +mod.folder.missing = Solo le mod in una cartella possono essere pubblicate nel Workshop.\nPer convertire una mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mod. mod.scripts.disable = Il tuo dispositivo non supporta le mod con gli script. Devi disabilitare queste mod per poter giocare. about.button = Info name = Nome: noname = Scegli un[accent] nome[] prima di unirti. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Mappa Pianeta +launchcore = Lancia Nucleo filename = Nome File: unlocked = Nuovo contenuto sbloccato! +available = Nuova scoperta disponibile! completed = [accent]Completato -techtree = Albero Scoperta +techtree = Albero Scoperte +research.legacy = Sono stati trovati dati dell'albero delle scoperte della [accent]v5.0[]\nVuoi [accent]caricare questi dati[], o [accent]scartarli[] e ricominciare le scoperte nella nuova campagna (consigliato)? +research.load = Carica +research.discard = Scarta research.list = [lightgray]Ricerca: -research = Ricerca +research = Albero Scoperte researched = [lightgray]{0} cercati. -research.progress = {0}% complete +research.progress = {0}% completato players = {0} giocatori online players.single = {0} giocatore online players.search = Cerca @@ -189,6 +196,11 @@ servers.local = Server Locali servers.remote = Server Remoti servers.global = Server Community +servers.disclaimer = I server della Community [accent]non[] appartengono o sono controllati dallo sviluppatore.\n\nI servers potrebbero contenere del contenuto generato dall'utente che non è appropriato per tutte le età. +servers.showhidden = Mostra Server Nascosti +server.shown = Visibile +server.hidden = Nascosto + trace = Traccia Giocatore trace.playername = Nome del Giocatore: [accent]{0} trace.ip = IP: [accent]{0} @@ -203,8 +215,8 @@ server.admins.none = Nessun amministratore trovato! server.add = Aggiungi Server server.delete = Sei sicuro di voler eliminare questo server? server.edit = Modifica Server -server.outdated = [crimson]Server Obsoleto![] -server.outdated.client = [crimson]Client Obsoleto![] +server.outdated = [scarlet]Server Obsoleto![] +server.outdated.client = [scarlet]Client Obsoleto![] server.version = [gray]v{0} {1} server.custombuild = [accent]Build Personalizzata confirmban = Sei sicuro di voler bandire "{0}[white]"? @@ -222,11 +234,12 @@ disconnect.timeout = Connessione scaduta. disconnect.data = Errore durante il caricamento del mondo! cantconnect = Impossibile unirsi alla partita ([accent]{0}[]). connecting = [accent]Connessione in corso... +reconnecting = [accent]Riconnessione in corso... connecting.data = [accent]Caricamento del mondo... server.port = Porta: server.addressinuse = Indirizzo già in uso! server.invalidport = Numero porta non valido! -server.error = [crimson]Errore nell'hosting del server. +server.error = [scarlet]Errore nell'hosting del server. save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? overwrite = Sovrascrivi @@ -236,8 +249,8 @@ save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio? save.delete = Elimina save.export = Esporta Salvataggio save.import.invalid = [accent]Questo salvataggio non è valido! -save.import.fail = [crimson]Impossibile importare il salvataggio: [accent]{0} -save.export.fail = [crimson]Impossibile esportare il salvataggio: [accent]{0} +save.import.fail = [scarlet]Impossibile importare il salvataggio: [accent]{0} +save.export.fail = [scarlet]Impossibile esportare il salvataggio: [accent]{0} save.import = Importa Salvataggio save.newslot = Nome: save.rename = Rinomina @@ -267,6 +280,9 @@ cancel = Annulla openlink = Apri Link copylink = Copia link back = Indietro +crash.export = Esporta Logs del Crash +crash.none = Nessun Log trovato. +crash.exported = Crash logs esportati. data.export = Esporta Salvataggio data.import = Importa Salvataggio data.openfolder = Apri Cartella\nSalvataggi @@ -276,20 +292,26 @@ data.import.confirm = Importare dati di gioco esterni sovrascriverà[scarlet] tu quit.confirm = Sei sicuro di voler uscire? quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent]\nImpostazioni -> Gioco -> Ripeti il Tutorial.[] loading = [accent]Caricamento in Corso... -reloading = [accent]Ricaricamento delle mods... +reloading = [accent]Ricaricamento delle mod... saving = [accent]Salvataggio in corso... -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][] per rinascere nel nucleo cancelbuilding = [accent][[{0}][] per pulire la selezione selectschematic = [accent][[{0}][] per selezionare+copiare pausebuilding = [accent][[{0}][] per smettere di costruire resumebuilding = [scarlet][[{0}][] per riprendere a costruire +showui = Interfaccia utente nascosta.\nPremere [accent][[{0}][] per mostrarla nuovamente. wave = [accent]Ondata {0} +wave.cap = [accent]Ondata {0}/{1} wave.waiting = [lightgray]Ondata tra {0} wave.waveInProgress = [lightgray]Ondata in corso waiting = In attesa... waiting.players = Attendendo giocatori... wave.enemies = [lightgray]{0} Nemici Rimasti +wave.enemycores = [accent]{0}[lightgray] Nuclei Nemici +wave.enemycore = [accent]{0}[lightgray] Nucleo Nemico wave.enemy = [lightgray]{0} Nemico Rimasto +wave.guardianwarn = Il Guardiano arriverà in [accent]{0}[] ondate. +wave.guardianwarn.one = Il Guardiano arriverà in [accent]{0}[] ondata. loadimage = Carica immagine saveimage = Salva Immagine unknown = Sconosciuto @@ -328,16 +350,17 @@ editor.generation = Generazione: editor.ingame = Modifica in Gioco editor.publish.workshop = Pubblica nel Workshop editor.newmap = Nuova Mappa +editor.center = Centro workshop = Workshop waves.title = Ondate waves.remove = Rimuovi waves.never = waves.every = sempre waves.waves = ondata/e -waves.perspawn = per spawn -waves.shields = shields/wave +waves.perspawn = per generazione +waves.shields = scudi/ondata waves.to = a -waves.guardian = Guardian +waves.guardian = Guardiano waves.preview = Anteprima waves.edit = Modifica... waves.copy = Copia negli Appunti @@ -346,9 +369,10 @@ waves.invalid = Ondate dagli appunti non valide. waves.copied = Ondate copiate. waves.none = Nessun nemico impostato.\nNota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#Questi sono intenzionalmente in minuscolo +wavemode.counts = conteggi +wavemode.totals = totali +wavemode.health = salute editor.default = [lightgray] details = Dettagli... @@ -389,7 +413,7 @@ editor.exportimage = Esporta Immagine Terreno editor.exportimage.description = Esporta un file immagine contenente solo il terreno editor.loadimage = Importa\nTerreno editor.saveimage = Esporta\nTerreno -editor.unsaved = [scarlet]Alcune modifiche non sono state salvate![]\nSei sicuro di voler uscire? +editor.unsaved = Sei sicuro di voler uscire?\n[scarlet]Tutte le modifiche andranno perse. editor.resizemap = Ridimensiona la mappa editor.mapname = Nome Mappa: editor.overwrite = [accent]Attenzione!\nQuesto sovrascrive una mappa esistente. @@ -415,7 +439,8 @@ toolmode.drawteams.description = Disegna squadre al posto di blocchi. filters.empty = [lightgray]Nessun filtro! Aggiungine uno cliccando il tasto sotto. filter.distort = Modifica filter.noise = Rumore -filter.enemyspawn = Seleziona Spawn Nemico +filter.enemyspawn = Seleziona Punto di Generazione del Nemico +filter.spawnpath = Percorso per il Punto di Generazione filter.corespawn = Seleziona Nucleo filter.median = Mediana filter.oremedian = Mediana Minerali @@ -440,6 +465,7 @@ filter.option.amount = Quantità filter.option.block = Blocco filter.option.floor = Terreno filter.option.flooronto = Terreno Mirato +filter.option.target = Obiettivo filter.option.wall = Muro filter.option.ore = Minerale filter.option.floor2 = Terreno Secondario @@ -456,7 +482,9 @@ load = Carica save = Salva fps = FPS: {0} ping = Ping: {0}ms -language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto. +memory = Memoria: {0}MB +memory2 = Memoria:\n {0}MB +\n {1}MB +language.restart = Riavvia il gioco affinché le impostazioni della lingua abbiano effetto. settings = Impostazioni tutorial = Tutorial tutorial.retake = Ripeti il Tutorial @@ -466,41 +494,32 @@ mapeditor = Editor Mappe abandon = Abbandona abandon.text = Questa zona e tutte le tue risorse saranno perdute e passeranno al nemico. locked = Bloccato -complete = [lightgray]Completato: +complete = [lightgray]Completa: requirement.wave = Raggiungi l'ondata {0} in {1} requirement.core = Distruggi il Nucleo Nemico in {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Riprendi Zona:\n[lightgray]{0} -bestwave = [lightgray]Ondata Migliore: {0} -launch = < DECOLLARE > -launch.text = Launch -launch.title = Decollo Riuscito! -launch.next = [lightgray]nuova opportunità all'ondata {0} -launch.unable2 = [scarlet]IMPOSSIBILE DECOLLARE![] -launch.confirm = Questo trasporterà tutte le risorse nel tuo Nucleo.\nNon riuscirai a ritornare in questa base. -launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive +requirement.research = Scopri {0} +requirement.produce = Produci {0} +requirement.capture = Cattura {0} +launch.text = Lancia +research.multiplayer = Solo l'host può scoprire gli oggetti. +map.multiplayer = Solo l'host può vedere i settori. uncover = Scopri configure = Configura Equipaggiamento -loadout = Loadout -resources = Resources + +loadout = Equipaggiamento +resources = Risorse bannedblocks = Blocchi Banditi addall = Aggiungi Tutti -launch.destination = Destination: {0} -configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. -zone.unlocked = [lightgray]{0} sbloccata. -zone.requirement.complete = Ondata {0} raggiunta:\n[lightgray]{1}[] requisiti di zona soddisfatti. -zone.resources = [lightgray]Risorse Trovate: -zone.objective = [lightgray]Obiettivo: [accent]{0} -zone.objective.survival = Sopravvivere -zone.objective.attack = Distruggere il Nucleo Nemico -add = Aggiungi -boss.health = Vita del Boss +launch.from = Partenza da: [accent]{0} +launch.destination = Destinazione: {0} +configure.invalid = Il valore deve essere un numero compresto tra 0 e {0}. +add = Aggiungi... +boss.health = Vita del Guardiano -connectfail = [crimson]Impossibile connettersi al server:\n\n[accent] {0} +connectfail = [scarlet]Impossibile connettersi al server:\n\n[accent] {0} error.unreachable = Server irraggiungibile. L'indirizzo è scritto correttamente? error.invalidaddress = Indirizzo non valido. -error.timedout = Timeout!\nAssicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto! +error.timedout = Tempo scaduto!\nAssicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto! error.mismatch = Errore dei pacchetti:\nPossibile discordanza della versione client/server.\nAssicurati che tu e l'host possiediate l'ultima versione di Mindustry! error.alreadyconnected = Già connesso. error.mapnotfound = Mappa non trovata! @@ -508,43 +527,82 @@ error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. error.bloom = Errore dell'avvio delle shaders.\nIl tuo dispositivo potrebbe non supportarle. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Pioggia +weather.snow.name = Neve +weather.sandstorm.name = Tempesta di Sabbia +weather.sporestorm.name = Tempesta di Spore +weather.fog.name = Nebbia -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]Inesplorato +sectors.resources = Risorse: +sectors.production = Produzione: +sectors.export = Merce: +sectors.time = Tempo: +sectors.threat = Minaccia: +sectors.wave = Ondata: +sectors.stored = Immagazzinato: +sectors.resume = Riprendi +sectors.launch = Lancia +sectors.select = Seleziona +sectors.nonelaunch = [lightgray]nessuno (sole) +sectors.rename = Rinomina Settore +sectors.enemybase = [scarlet]Base Nemica +sectors.vulnerable = [scarlet]Vulnerabile +sectors.underattack = [scarlet]Sotto attacco! [accent]{0}% danneggiato +sectors.survives = [accent]Sopravvissuto a {0} ondate +sectors.go = Lancia +sector.curcapture = Settore Catturato +sector.curlost = Settore Perso +sector.missingresources = [scarlet]Risorse del Nucleo Insufficienti +sector.attacked = Settore [accent]{0}[white] sotto attacco! +sector.lost = Settore [accent]{0}[white] perso! +#nota: lo spazio mancante nella linea sotto è intenzionale +sector.captured = Settore [accent]{0}[white]catturato! -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = Bassa +threat.medium = Media +threat.high = Alta +threat.extreme = Estrema +threat.eradication = Eradicazione -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +planets = Pianeti + +planet.serpulo.name = Serpulo +planet.sun.name = Sole + +sector.impact0078.name = Impatto 0078 +sector.groundZero.name = Terreno Zero +sector.craters.name = Crateri +sector.frozenForest.name = Foresta Ghiacciata +sector.ruinousShores.name = Rive in Rovina +sector.stainedMountains.name = Montagne Macchiate +sector.desolateRift.name = Spaccatura Desolata +sector.nuclearComplex.name = Complesso di Produzione Nucleare +sector.overgrowth.name = Profilassi +sector.tarFields.name = Distese di Catrame +sector.saltFlats.name = Saline +sector.fungalPass.name = Passo Fungino +sector.biomassFacility.name = Struttura di Sintesi di Biomassa +sector.windsweptIslands.name = Isole Ventose +sector.extractionOutpost.name = Avamposto di Estrazione Mineraria +sector.planetaryTerminal.name = Terminale di Lancio Planetario + +sector.groundZero.description = La posizione ottimale per ricominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nParti. +sector.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature gelide non possono contenerle per sempre.\n\nInizia l'avventura nell'energia. Costruisci generatori a combustione. Impara a usare i riparatori. +sector.saltFlats.description = Alla periferia nel deserto si trovano le saline. Si possono ricavare poche risorse in questa posizione.\n\nIl nemico ha costruito un complesso di immagazzinamento delle risorse qui. Elimina il loro nucleo. Non lasciare niente in piedi. +sector.craters.description = L'acqua si è accumulata in questo cratere, reliquia delle antiche guerre. Bonifica l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa acqua per raffreddare torrette e trivelle. +sector.ruinousShores.description = Oltre le distese, c'è il litorale. Una volta, questa posizione ospitava uno schieramento difensivo sulla costa. Non ne rimane molto. Solo le strutture di difesa più elementari sono rimaste intatte, tutto il resto è stato ridotto a rottami.\nContinua l'espansione verso l'esterno. Riscopri la tecnologia. +sector.stainedMountains.description = Oltre l'entroterra ci sono le montagne, ma non contaminato da spore.\nEstrai l'abbondante titanio in questa zona. Impara come usarlo.\n\nQui la presenza nemica è maggiore. Non dare loro il tempo di inviare le loro unità più forti. +sector.overgrowth.description = Questa zona è ricoperta di vegetazione, più vicina alla fonte delle spore.\nIl nemico ha stabilito un avamposto qui. Costruisci le unità Titano. Distruggilo. Recupera ciò che è stato perso. +sector.tarFields.description = La periferia di una zona adibita di produzione di petrolio, tra le montagne e il deserto. Una delle poche aree con riserve di catrame utilizzabili.\nAnche se abbandonata, quest'area ha alcune pericolose forze nemiche nelle vicinanze. Non sottovalutarli.\n\n[lightgray]Scopri tecnologie di raffinazione del petrolio, se possibile. +sector.desolateRift.description = Una zona estremamente pericolosa. Risorse abbondanti, ma poco spazio. Alto rischio di distruzione. Parti il prima possibile. Non lasciarti ingannare dalla lunga distanza tra gli attacchi nemici. +sector.nuclearComplex.description = Una vecchia struttura per la produzione e la lavorazione del torio, ridotta in rovina.\n[lightgray] Fai scoperte sul torio e sui suoi usi.\n\nIl nemico è presente in gran numero, costantemente alla ricerca di attaccanti. +sector.fungalPass.description = Una zona di transizione tra le alte montagne e le terre inferiori, piene di spore. Una piccola base di ricognizione nemica si trova qui.\nDistruggila.\nUsa le unità come Pugnalatori e Strisciatori. Togli i due nuclei. +sector.biomassFacility.description = L'origine delle spore. Questa è la struttura nella quale loro sono state studiate ed inizialmente prodotte.\nScopri la tecnologia contenuta all'interno. Coltiva spore per la produzione di carburante e plastica.\n\n[lightgray]Da fallimento di questa struttura, le spore sono state rilasciate. Nulla nell'ecosistema locale potrebbe competere con un orgamismo talmente invasivo. +sector.windsweptIslands.description = Oltre la fascia costiera si trova questo remoto arcipelago. Le registrazioni mostrano che una volta avevano [accent]Plastanio[]-producendo strutture.\n\nRespingi le unità navali nemiche. Stabilisci una base nelle isole. Scopri queste fabbriche. +sector.extractionOutpost.description = Un avamposto remoto, costruito dai nemici con l'obiettivo di lanciare risorse in altri settori.\n\nLa tecnologia di trasposto a settori-incrociati è essenziale per un ulteriore conquista. Distruggi la base. scopri la loro Rampa di Lancio. +sector.impact0078.description = Qui giaciono i resti della nave da trasporto interstellare che fu la prima ad entrare in questo sistema.\n\nRecupera per quanto possibile dal relitto. Scopri qualsiasi tecnologia intatta. +sector.planetaryTerminal.description = Il bersaglio finale.\n\nQuesta base costiera contiene una struttura capace di lanciare Nuclei ai pianeti locali. È estremamente protetto.\n\nProduci unità navali. Elimina il nemico il più rapidamente possibile. Scopri la struttura di lancio. settings.language = Lingua settings.data = Dati di Gioco @@ -558,65 +616,99 @@ settings.graphics = Grafica settings.cleardata = Elimina Dati di Gioco settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata! settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = Sei sicuro di voler eliminare tutti i tuoi salvataggi? +settings.clearsaves = Elimina Salvataggi +settings.clearresearch = Elimina Scoperte +settings.clearresearch.confirm = Sei sicuro di voler eliminare le scoperte della modalità campagna? +settings.clearcampaignsaves = Elimina Salvataggi Campagna +settings.clearcampaignsaves.confirm = Sei sicuro di voler eliminare tutti i salvataggi della modalità campagna? paused = [accent]< In Pausa > clear = Pulisci banned = [scarlet]Bandito -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = Si no = No info.title = Info -error.title = [crimson]Si è verificato un errore +error.title = [scarlet]Si è verificato un errore error.crashtitle = Si è verificato un errore unit.nobuild = [scarlet]L'unità non può costruire -blocks.input = Ingresso -blocks.output = Uscita -blocks.booster = Potenziamenti -blocks.tiles = Blocchi Richiesti -blocks.affinities = Affinità +lastaccessed = [lightgray]Ultimo Accesso: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Capacità Energetica -blocks.powershot = Danno/Colpo -blocks.damage = Danno -blocks.targetsair = Attacca Nemici Aerei -blocks.targetsground = Attacca Nemici Terreni -blocks.itemsmoved = Velocità di Movimento -blocks.launchtime = Tempo fra Decolli -blocks.shootrange = Raggio -blocks.size = Dimensioni -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacità del Liquido -blocks.powerrange = Raggio Energia -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Connessioni Massime -blocks.poweruse = Utilizzo Energia -blocks.powerdamage = Energia/Danno -blocks.itemcapacity = Capacità -blocks.basepowergeneration = Generazione Energia di Base -blocks.productiontime = Tempo di Produzione -blocks.repairtime = Tempo di Riparazione Completa -blocks.speedincrease = Aumento Velocità -blocks.range = Raggio -blocks.drilltier = Scavabili -blocks.drillspeed = Velocità di Scavo Stabile -blocks.boosteffect = Effetto Boost -blocks.maxunits = Unità Attive Max -blocks.health = Salute -blocks.buildtime = Tempo di Costruzione -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Costo di Costruzione -blocks.inaccuracy = Inaccuratezza -blocks.shots = Colpi -blocks.reload = Ricarica -blocks.ammo = Munizioni -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = Obiettivo +stat.input = Ingresso +stat.output = Uscita +stat.booster = Potenziamenti +stat.tiles = Blocchi Richiesti +stat.affinities = Affinità +stat.powercapacity = Capacità Energetica +stat.powershot = Energia/Colpo +stat.damage = Danno +stat.targetsair = Attacca Nemici Aerei +stat.targetsground = Attacca Nemici Terreni +stat.itemsmoved = Velocità +stat.launchtime = Tempo tra Lanci +stat.shootrange = Raggio +stat.size = Dimensione +stat.displaysize = Dimensione Schermo +stat.liquidcapacity = Capacità Liquidi +stat.powerrange = Raggio di Connessione +stat.linkrange = Raggio di Collegamento +stat.instructions = Istruzioni +stat.powerconnections = Connessioni Massime +stat.poweruse = Consumo Energetico +stat.powerdamage = Energia/Danno +stat.itemcapacity = Capacità Oggetti +stat.memorycapacity = Capacità di Memoria +stat.basepowergeneration = Generazione Minina di Energia +stat.productiontime = Tempo di Produzione +stat.repairtime = Tempo di Riparazione Completa +stat.weapons = Armi +stat.bullet = Proiettile +stat.speedincrease = Potenziamento Velocità +stat.range = Raggio +stat.drilltier = Scavabili +stat.drillspeed = Velocità di Scavo +stat.boosteffect = Effetto Boost +stat.maxunits = Unità Attive Massime +stat.health = Salute +stat.buildtime = Tempo di Costruzione +stat.maxconsecutive = Limite Consecutive +stat.buildcost = Costo di Costruzione +stat.inaccuracy = Inaccuratezza +stat.shots = Colpi +stat.reload = Cadenza +stat.ammo = Munizioni +stat.shieldhealth = Integrità Scudo +stat.cooldowntime = Tempo Raffreddamento +stat.explosiveness = Esplosività +stat.basedeflectchance = Probabilità di Deviazione +stat.lightningchance = Probabilità di Fulmine +stat.lightningdamage = Danno Fulmine +stat.flammability = Infiammabilità +stat.radioactivity = Radioattività +stat.heatcapacity = Capacità Termica +stat.viscosity = Viscosità +stat.temperature = Temperatura +stat.speed = Velocità +stat.buildspeed = Velocità Costruzione +stat.minespeed = Velocità Estrazione +stat.minetier = Livello Estrazione +stat.payloadcapacity = Capacità di Carico +stat.commandlimit = Limite di Comando +stat.abilities = Abilità +stat.canboost = Capace di Potenziamento +stat.flying = Volo + +ability.forcefield = Campo di Forza +ability.repairfield = Campo Riparativo +ability.statusfield = Campo di Stato +ability.unitspawn = {0} Fabbrica +ability.shieldregenfield = Campo di Rigenerazione Scudo +ability.movelightning = Movimento Fulminante bar.drilltierreq = Miglior Trivella Richiesta -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Risorse Mancanti +bar.corereq = Nucleo Richiesto bar.drillspeed = Velocità Scavo: {0}/s bar.pumpspeed = Velocità di Pompaggio: {0}/s bar.efficiency = Efficienza: {0}% @@ -624,10 +716,11 @@ bar.powerbalance = Energia: {0}/s bar.powerstored = Immagazzinata: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Energia in Uscita: {0} +bar.powerlines = Connessioni: {0}/{1} bar.items = Oggetti: {0} bar.capacity = Capacità: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unità disabilitata] bar.liquid = Liquido bar.heat = Calore bar.power = Energia @@ -635,42 +728,50 @@ bar.progress = Progresso Costruzione bar.input = Entrata bar.output = Uscita +units.processorcontrol = [lightgray]Controllato dal Processore + bullet.damage = [stat]{0}[lightgray] danno bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray] blocchi bullet.incendiary = [stat]incendiario +bullet.sapping = [stat]debilitante bullet.homing = [stat]autoguidato bullet.shock = [stat]stordente bullet.frag = [stat]a frammentazione bullet.knockback = [stat]{0}[lightgray] contraccolpo +bullet.pierce = [stat]{0}[lightgray]x perforazione +bullet.infinitepierce = [stat]perforazione +bullet.healpercent = [stat]{0}[lightgray]% guarigione bullet.freezing = [stat]congelante bullet.tarred = [stat]viscoso bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni bullet.reload = [stat]{0}[lightgray]x ricarica unit.blocks = blocchi -unit.powersecond = unità energia/s +unit.blockssquared = blocchi² +unit.powersecond = unità energetica/s unit.liquidsecond = unità liquide/s unit.itemssecond = oggetti/s unit.liquidunits = unità liquidi -unit.powerunits = unità energia +unit.powerunits = unità energetica unit.degrees = gradi unit.seconds = secondi -unit.minutes = mins +unit.minutes = minuti unit.persecond = /s unit.perminute = /min unit.timesspeed = x velocità unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = salute scudo unit.items = oggetti unit.thousands = k unit.millions = mln -unit.billions = b +unit.billions = mld +category.purpose = Scopo category.general = Generali category.power = Energia category.liquids = Liquidi category.items = Oggetti category.crafting = Produzione -category.shooting = Potenza di fuoco +category.function = Funzione category.optional = Miglioramenti Opzionali setting.landscape.name = Visuale Orizontale setting.shadows.name = Ombre @@ -678,8 +779,8 @@ setting.blockreplace.name = Suggerimento Blocchi Automatico setting.linear.name = Filtro Lineare setting.hints.name = Suggerimenti setting.flow.name = Visualizza Portata Nastri/Condotti +setting.backgroundpause.name = Metti in pausa quando in background setting.buildautopause.name = Pausa Automatica nella Costruzione -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Fluidi Animati setting.animatedshields.name = Scudi Animati setting.antialias.name = Antialias[lightgray] (richiede riavvio)[] @@ -707,17 +808,15 @@ setting.conveyorpathfinding.name = Posizionamento Nastri Trasportatori Intellige setting.sensitivity.name = Sensibilità del Controller setting.saveinterval.name = Intervallo di Salvataggio Automatico setting.seconds = {0} secondi -setting.blockselecttimeout.name = Tempo di Selezione del Blocco setting.milliseconds = {0} millisecondi setting.fullscreen.name = Schermo Intero setting.borderlesswindow.name = Finestra Senza Bordi[lightgray] (potrebbe richiedere il riavvio) setting.fps.name = Mostra FPS e Ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Mostra Tasto di Selezione del Blocco +setting.smoothcamera.name = Visuale fluida setting.vsync.name = VSync -setting.pixelate.name = Effetto Pixel[lightgray] (disabilita le animazioni) +setting.pixelate.name = Pixellato setting.minimap.name = Mostra Minimappa -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Mostra Oggetti Nucleo (WIP) setting.position.name = Mostra Posizione Giocatori setting.musicvol.name = Volume Musica setting.atmosphere.name = Mostra Atmosfera Pianeta @@ -743,14 +842,14 @@ keybinds.mobile = [scarlet]La maggior parte dei controlli qui non sono funzionan category.general.name = Generale category.view.name = Visualizzazione category.multiplayer.name = Multigiocatore -category.blocks.name = Block Select +category.blocks.name = Seleziona Blocco command.attack = Attacca command.rally = Guardia command.retreat = Ritirata -command.idle = Idle +command.idle = Inattivo placement.blockselectkeys = \n[lightgray]Tasto: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.respawn.name = Rinasci +keybind.control.name = Controlla Unità keybind.clear_building.name = Pulisci Costruzione keybind.press = Premi un tasto... keybind.press.axis = Premi un'asse o un tasto... @@ -760,7 +859,7 @@ keybind.toggle_block_status.name = Attiva/Disattiva Stato Blocchi keybind.move_x.name = Muovi Orizzontalmente keybind.move_y.name = Muovi Verticalmente keybind.mouse_move.name = Segui il Mouse -keybind.pan.name = Pan View +keybind.pan.name = Vista Panoramica keybind.boost.name = Scatto keybind.schematic_select.name = Seleziona Regione keybind.schematic_menu.name = Menu Schematica @@ -788,15 +887,17 @@ keybind.diagonal_placement.name = Posiziona Diagonalmente keybind.pick.name = Scegli Blocco keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Raccogli Carico +keybind.dropCargo.name = Rilascia Carico +keybind.command.name = Comanda keybind.shoot.name = Spara keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausa keybind.pause_building.name = Interrompi/Riprendi Costruzione keybind.minimap.name = Minimappa +keybind.planet_map.name = Mappa Pianeta +keybind.research.name = Albero Scoperte keybind.chat.name = Chat keybind.player_list.name = Lista dei Giocatori keybind.console.name = Console @@ -815,20 +916,21 @@ mode.sandbox.name = Creativa mode.sandbox.description = Risorse infinite e nessun timer per le ondate. mode.editor.name = Editor mode.pvp.name = PvP -mode.pvp.description = Lotta contro altri giocatori. +mode.pvp.description = Combatti contro altri giocatori in locale.\n[gray]Per giocare la mappa sono necessari almeno due nuclei di colore diverso. mode.attack.name = Schermaglia -mode.attack.description = Distruggi la base nemica. \n[gray]Richiede un Nucleo rosso nella mappa per essere giocata. +mode.attack.description = Distruggi la base nemica. \n[gray]Richiede un nucleo rosso nella mappa per essere giocata. mode.custom = Regole Personalizzate rules.infiniteresources = Risorse Infinite rules.reactorexplosions = Esplosioni Reattore +rules.schematic = Schematiche Consentite rules.wavetimer = Timer Ondate rules.waves = Ondate rules.attack = Modalità Attacco -rules.buildai = AI Building -rules.enemyCheat = Risorse AI Infinite -rules.blockhealthmultiplier = Moltiplicatore Danno Blocco -rules.blockdamagemultiplier = Block Damage Multiplier +rules.buildai = Costruzioni dell'AI +rules.enemyCheat = Risorse AI (Team Rosso) Infinite +rules.blockhealthmultiplier = Moltiplicatore Salute Blocco +rules.blockdamagemultiplier = Moltiplicatore Danno Blocco rules.unitbuildspeedmultiplier = Moltiplicatore Velocità Costruzione Unità rules.unithealthmultiplier = Moltiplicatore Vita Unità rules.unitdamagemultiplier = Moltiplicatore Danno Unità @@ -839,25 +941,28 @@ rules.buildspeedmultiplier = Moltiplicatore Velocità Costruzione rules.deconstructrefundmultiplier = Moltiplicatore Rimborso di Smantellamento rules.waitForWaveToEnd = Le ondate aspettano fino a quando l'ondata precedente finisce rules.dropzoneradius = Raggio di Generazione:[lightgray] (blocchi) -rules.unitammo = Units Require Ammo +rules.unitammo = Unità Richiedono Munizioni rules.title.waves = Ondate rules.title.resourcesbuilding = Risorse e Costruzioni rules.title.enemy = Nemici rules.title.unit = Unità rules.title.experimental = Sperimentale -rules.title.environment = Environment +rules.title.environment = Ambiente rules.lighting = Illuminazione -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Illuminazione Nemica +rules.fire = Fuoco +rules.explosions = Danno da Esplosione Blocchi/Unità rules.ambientlight = Illuminazione\nAmbientale -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Meteo +rules.weather.frequency = Frequenza: +rules.weather.duration = Durata: content.item.name = Oggetti content.liquid.name = Liquidi content.unit.name = Unità content.block.name = Blocchi +content.sector.name = Settori + item.copper.name = Rame item.lead.name = Piombo item.coal.name = Carbone @@ -879,79 +984,64 @@ liquid.slag.name = Scoria liquid.oil.name = Petrolio liquid.cryofluid.name = Criofluido -item.explosiveness = [lightgray]Esplosività: {0} -item.flammability = [lightgray]Infiammabilità: {0} -item.radioactivity = [lightgray]Radioattività: {0} - -unit.health = [lightgray]Salute: {0} -unit.speed = [lightgray]Velocità: {0} -unit.weapon = [lightgray]Armi: {0} -unit.itemcapacity = [lightgray]Capacità Oggetti: {0} -unit.minespeed = [lightgray]Velocità di Scavo: {0}% -unit.minepower = [lightgray]Potenza di Scavo: {0} -unit.ability = [lightgray]Abilità: {0} -unit.buildspeed = [lightgray]Velocità di Costruzione: {0}% - -liquid.heatcapacity = [lightgray]Capacità Termica: {0} -liquid.viscosity = [lightgray]Viscosità: {0} -liquid.temperature = [lightgray]Temperatura: {0} - -unit.dagger.name = Drone Pugnalatore -unit.mace.name = Mace +unit.dagger.name = Pugnalatore +unit.mace.name = Randellatore unit.fortress.name = Fortezza -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar +unit.nova.name = Scintilla +unit.pulsar.name = Folgore +unit.quasar.name = Lampo unit.crawler.name = Strisciatore unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura +unit.spiroct.name = Aracnideto +unit.arkyid.name = Treppiede +unit.toxopid.name = Cataclisma +unit.flare.name = Sentinella +unit.horizon.name = Orizzonte +unit.zenith.name = Apice +unit.antumbra.name = Penombra +unit.eclipse.name = Eclisse +unit.mono.name = Minatore +unit.poly.name = Costruttore +unit.mega.name = Riparatore +unit.quad.name = Bombardiere +unit.oct.name = Curatore +unit.risso.name = Corvetta +unit.minke.name = Cacciatorpediniere +unit.bryde.name = Incrociatore +unit.sei.name = Nave da Guerra +unit.omura.name = Portaerei unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.scepter.name = Infiltratore +unit.reign.name = Conquistatore +unit.vela.name = Radiante +unit.corvus.name = Disgregatore -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax +block.resupply-point.name = Punto di Rifornimento +block.parallax.name = Parallasse block.cliff.name = Scogliera block.sand-boulder.name = Masso di Sabbia +block.basalt-boulder.name = Masso di Basalto block.grass.name = Erba block.slag.name = Scoria +block.space.name = Spazio block.salt.name = Sale -block.salt-wall.name = Salt Wall +block.salt-wall.name = Muro di Sale block.pebbles.name = Ciottoli block.tendrils.name = Viticci -block.sand-wall.name = Sand Wall +block.sand-wall.name = Muro di Sabbia block.spore-pine.name = Pino di Spore -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Muro di Spore +block.boulder.name = Masso +block.snow-boulder.name = Masso di Neve block.snow-pine.name = Pino Innevato block.shale.name = Scisto block.shale-boulder.name = Masso di Scisto block.moss.name = Muschio block.shrubs.name = Arbusti block.spore-moss.name = Muschio di Spore -block.shale-wall.name = Shale Wall +block.shale-wall.name = Muro di Scisto block.scrap-wall.name = Muro di Rottami block.scrap-wall-large.name = Muro di Rottami Grande block.scrap-wall-huge.name = Muro di Rottami Enorme @@ -961,7 +1051,7 @@ block.kiln.name = Forno block.graphite-press.name = Pressa per Grafite block.multi-press.name = Multi Pressa block.constructing = {0}\n[lightgray](In Costruzione) -block.spawn.name = Spawn Nemico +block.spawn.name = Punto di Generazione Nemico block.core-shard.name = Nucleo: Frammento block.core-foundation.name = Nucleo: Fondamento block.core-nucleus.name = Nucleo: Kernel @@ -980,16 +1070,17 @@ block.sand-water.name = Acqua Sabbiosa block.darksand-water.name = Acqua Sabbiosa Scura block.char.name = Carbone block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite-wall.name = Muro di Dacite +block.dacite-boulder.name = Masso di Dacite block.ice-snow.name = Neve Ghiacciata -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = Muro di Pietra +block.ice-wall.name = Muro di Ghiaccio +block.snow-wall.name = Muro di Neve +block.dune-wall.name = Muro di Duna block.pine.name = Pino -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Terra +block.dirt-wall.name = Muro di Terra +block.mud.name = Fango block.white-tree-dead.name = Albero Bianco Morto block.white-tree.name = Albero Morto block.spore-cluster.name = Agglomerato di Spore @@ -1005,7 +1096,7 @@ block.dark-panel-4.name = Pannello Scuro 4 block.dark-panel-5.name = Pannello Scuro 5 block.dark-panel-6.name = Pannello Scuro 6 block.dark-metal.name = Metallo Scuro -block.basalt.name = Basalt +block.basalt.name = Basalto block.hotrock.name = Roccia Bollente block.magmarock.name = Roccia Magmatica block.copper-wall.name = Muro di Rame @@ -1029,7 +1120,6 @@ block.conveyor.name = Nastro Trasportatore block.titanium-conveyor.name = Nastro di Titanio block.plastanium-conveyor.name = Nastro di Plastanio block.armored-conveyor.name = Nastro Corazzato -block.armored-conveyor.description = Trasporta gli oggetti alla stessa velocità del nastro di titanio, ma è più resistente. Accetta input dai lati solo da altri nastri. block.junction.name = Incrocio block.router.name = Distributore block.distributor.name = Distributore Grande @@ -1037,13 +1127,12 @@ block.sorter.name = Filtro block.inverted-sorter.name = Filtro Inverso block.message.name = Messaggio block.illuminator.name = Lanterna -block.illuminator.description = Una piccola, compatta sorgente di luce. Richiede energia per funzionare. block.overflow-gate.name = Separatore per Eccesso block.underflow-gate.name = Separatore per Eccesso Inverso block.silicon-smelter.name = Fonderia block.phase-weaver.name = Tessitore di Fase block.pulverizer.name = Polverizzatore -block.cryofluid-mixer.name = Miscelatore di Liquidi +block.cryofluid-mixer.name = Miscelatore di Criofluido block.melter.name = Fonditore block.incinerator.name = Inceneritore block.spore-press.name = Pressa di Spore @@ -1075,6 +1164,7 @@ block.power-source.name = Fonte Infinita (energia) block.unloader.name = Scaricatore block.vault.name = Deposito block.wave.name = Idrogetto +block.tsunami.name = Tsunami block.swarmer.name = Sciamatore block.salvo.name = Cannone Leggero block.ripple.name = Cannone Pesante @@ -1114,31 +1204,38 @@ block.arc.name = Arco Elettrico block.rtg-generator.name = Generatore RTG block.spectre.name = Spettro block.meltdown.name = Fusione +block.foreshadow.name = Tenebra block.container.name = Contenitore block.launch-pad.name = Ascensore Spaziale block.launch-pad-large.name = Ascensore Spaziale Avanzato -block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.segment.name = Segmentatore +block.command-center.name = Centro di Controllo +block.ground-factory.name = Fabbrica Terrestre +block.air-factory.name = Fabbrica Aerea +block.naval-factory.name = Fabbrica Navale +block.additive-reconstructor.name = Ricostruttore Adattivo +block.multiplicative-reconstructor.name = Ricostruttore Moltiplicativo +block.exponential-reconstructor.name = Ricostruttore Esponenziale +block.tetrative-reconstructor.name = Ricostruttore Tetrattivo +block.payload-conveyor.name = Trasportatore di Massa +block.payload-router.name = Distributore di Carico +block.disassembler.name = Disassemblatore +block.silicon-crucible.name = Crogiolo per Silicio +block.overdrive-dome.name = Cupola di Overdrive +#sperimentale, potrebbero esseri rimossi +block.block-forge.name = Forgia per Blocco +block.block-loader.name = Caricatore Blocchi +block.block-unloader.name = Scaricatore Blocchi +block.interplanetary-accelerator.name = Acceleratore Interplanetario -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Interruttore +block.micro-processor.name = Micro Processore +block.logic-processor.name = Processore Logico +block.hyper-processor.name = Iper Processore +block.logic-display.name = Display Logico +block.large-logic-display.name = Grande Display Logico +block.memory-cell.name = Cella di Memoria +block.memory-bank.name = Banca di Memoria team.blue.name = blu team.crux.name = rosso @@ -1148,158 +1245,246 @@ team.derelict.name = abbandonato team.green.name = verde team.purple.name = viola -tutorial.next = [lightgray] -tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nUsa[accent] [[WASD][] per muoverti.\n[accent]Scorri[] per eseguire lo zoom.\nInizia[accent] minando il rame[]. Per farlo, posizionati sulla vena di rame vicina al tuo Nucleo e clicca su di essa.\n\n[accent]{0}/{1} rame -tutorial.intro.mobile = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nScorri sullo schermo per muoverti.\n[accent]Avvicina due dita[] per eseguire lo zoom in/out.\nInizia [accent] scavando del rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame -tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle[] scavano da sole e sono più efficienti. Piazzane una su un minerale di rame. -tutorial.drill.mobile = Ora crea una trivella.\n[accent]Le trivelle[] scavano da sole e sono più efficienti.\nTocca la scheda della trivella in basso a destra.\nSeleziona la [accent]Trivella Meccanica[].\nPiazzala su una vena di rame toccando, quindi premi il [accent]segno di spunta[] in basso per confermare la selezione.\nCon il tasto [accent]X[] puoi annullare il posizionamento. -tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database.[]\n\n[accent]Accedi ora alle statistiche della trivella meccanica.[] -tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo.\nCrea una linea di nastri dalla trivella al Nucleo. -tutorial.conveyor.mobile = [accent]I nastri trasportatori[] sono usati per trasportare oggetti nel Nucleo.\nCrea una linea di nastri trasportatori dalla trivella al Nucleo.\n[accent]Piazzali in linea tenendo premuto per qualche secondo e trascinando il dito in una direzione.\n\n[accent]Piazza 2 nastri trasportatori con lo strumento linea, quindi trasporta un oggetto fino al Nucleo. -tutorial.turret = Costruisci delle torrette per respingere il nemico[lightgray][].\nCostruisci una torretta Duo vicino alla tua base. -tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto. -tutorial.pause = Durante la battaglia puoi[accent] mettere in pausa il gioco.[]\nPuoi disporre gli edifici mentre il gioco è in pausa.\n\nPer mettere in pausa, premi [accent]spazio[]. -tutorial.pause.mobile = Durante la battaglia puoi[accent] mettere in pausa il gioco.[]\nPuoi disporre gli edifici mentre il gioco è in pausa.\n\nPer mettere in pausa, premi il bottone in alto a sinistra. -tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa. -tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa. -tutorial.breaking = I blocchi spesso devono essere distrutti.\n[accent]Tieni premuto il tasto destro del mouse []per distruggere tutti i blocchi in una selezione.[]\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. -tutorial.breaking.mobile = I blocchi spesso devono essere distrutti.\n[accent]Seleziona la modalità di decostruzione[], quindi tocca un blocco per iniziare a smantellarlo.\nDistruggi un'area tenendo premuto il dito per alcuni secondi[] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione.\n\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. -tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent]tocca un blocco []con oggetti al suo interno, quindi[accent] tocca l'oggetto []nell'inventario.\nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo.[] -tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione.\n[accent]Rimetti il rame nel Nucleo. [] -tutorial.waves = [lightgray]Il nemico si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. -tutorial.waves.mobile = [lightgray]Il nemico si avvicina.\n\nDifendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. -tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent]decollare con il Nucleo[], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n[accent]Decolla e conferma per terminare il tutorial. +hint.skip = Salta +hint.desktopMove = Usa [accent][[WASD][] per muoverti. +hint.zoom = [accent]Scorri[] per aumentare o ridurre la visuale. +hint.mine = Muoviti vicino il \uf8c4 minerale di rame e[accent]toccalo[] per minare manualmente. +hint.desktopShoot = [accent][[Click-sinistro][] per sparare. +hint.depositItems = Per trasferire oggetti, trascinadalla tua nave al nucleo. +hint.respawn = Per rinascere come nave, premi [accent][[V][]. +hint.respawn.mobile = Hai cambiato il controllo a unità/strutture. Per rinascere come nave, [accent]tocca the l'avatar in alto a sinistra.[] +hint.desktopPause = Premi[accent][[Space][] per mettere in pausa o riprendere il gioco. +hint.placeDrill = Seleziona la sezione delle \ue85e [accent]Trivelle[] nel menu in fondo a destra, dopo seleziona una \uf870 [accent]Trivella[] e cliccala su una risorsa di rame per piazzarla. +hint.placeDrill.mobile = Seleziona la sezione \ue85e [accent]Trivelle[] nel menu in fondo a destra, dopo seleziona una \uf870 [accent]Drill[] e cliccalo su una risorsa di rame per piazzarlo.\n\nPremi il \ue800 [accent]checkmark[] in fonod a destra per confermare. +hint.placeConveyor = I nastri trasportatori muovono oggetti dalle trivelle in altri blocchi. Seleziona un \uf896 [accent]Nastro[] dalla sezione \ue814 [accent]Distribuzione[].\n\nClicca e trascina per piazziare più nastri.\n[accent]Scorri[] per ruotare. +hint.placeConveyor.mobile = I nastri trasportatori muovono gli oggetti dalle trivelle ad altri blocchi. Seleziona un \uf896 [accent]Nastro Trasportatore[] dal menu \ue814 [accent]Distribuzione[].\n\nTieni premuto il dito per un secondo e trascinalo per disporre più nastri contemporaneamente. +hint.placeTurret = Posiziona \uf861 [accent]Torrette[] per difendere la tua base dai nemici.\n\n Le torrette richiedono munizioni- in questo caso, \uf838rame.\nUsa nastri e trivelle per rifornirli. +hint.breaking = [accent]Click-destro[] e trascina per distruggere blocchi. +hint.breaking.mobile = Attivita il \ue817 [accent]martello[] in fondo a destra e tocca per distruggere blocchi.\n\nTieni premuto il tuo dito per un secondo e trascina per distruggere blocchi in una selezione. +hint.research = Usa il pulsante \ue875 [accent]Scopri[] per scoprire nuova tecnologia. +hint.research.mobile = Usa il pulsante \ue875 [accent]Research[] nel \ue88c [accent]menu[] per scoprire una nuova tecnologia. +hint.unitControl = Tieni premuto [accent][[L-ctrl][] e [accent]clic[] per controllare unità o torrette amichevoli. +hint.unitControl.mobile = [accent][[Doppio-tocco][] per controllare unità o torrette amichevoli. +hint.launch = Una volta che sono state raccolte abbastanza risorse, puoi[accent]Lanciare[] selezionando settori vicini dalla \ue827 [accent]Mappa[] in fondo a destra. +hint.launch.mobile = Una volta che sono state raccolte abbastanza risorse, puoi[accent]Lanciare[] selezionando settori vicini dalla \ue827 [accent]Mappa[] nel \ue88c [accent]menu[]. +hint.schematicSelect = Tieni premuto [accent][[F][] e trascina per selezionare blocchi da copiare ed incollare.\n\n[accent][[Middle Click][] per copiare un singolo tipo di blocco. +hint.conveyorPathfind = Tieni premuto [accent][[L-Ctrl][] mentre trascini nastri per generare automaticamente un percorso. +hint.conveyorPathfind.mobile = Attiva la \ue844 [accent]modalità diagonale[] e trascina nastri per generare automaticamente un percorso. +hint.boost = Tieni premuto [accent][[L-Shift][] per volare sopra gli ostacoli con la tua unità attuale.\n\nSolo poche unità terrestri possono farlo. +hint.command = Premi [accent][[G][] per comandare le unità vicine di [accent]simile tipologia[] in formazione.\n\nPer comandare unità terrestri, devi prima controllare un'altra unità terrestre. +hint.command.mobile = [accent][[Double-tap][] per comandare le unità vicine in formazione. +hint.payloadPickup = Premi [accent][[[] per raccogliere piccoli blocchi o unità. +hint.payloadPickup.mobile = [accent]Clicca e trattieni[] piccoli blocchi o unità per raccglierla. +hint.payloadDrop = Premi [accent]][] per rilasciare un carico. +hint.payloadDrop.mobile = [accent]Clicca e trattieni[] una posizione vuota per rilasciarci un carico. +hint.waveFire = [accent]Idrogetto[] torrette con acqua per munizioni spegneranno automaticamente incendi. +hint.generator = \uf879 [accent]Generatori a Combustibile[] bruciano carbone e trasferiscono energia ai blocchi adiacenti.\n\nIl raggio di trasmissione dell'enrgia può essere esteso con \uf87f [accent]Nodo Energetico[]. +hint.guardian = Unità [accent]Guardiano[] sono corazzate. Munizioni deboli come [accent]Rame[] e [accent]Piombo[] sono [scarlet]inefficaci[].\n\nUsa torrette di grado superiore o \uf835 [accent]Grafite[] \uf861Duo/\uf859Cannone Leggero per buttare giù il boss. +hint.coreUpgrade = I nuclei possono essere aggiornati [accent]piazzando nuclei di un livello superiore sopra di loro[].\n\nPiazzia un nucleo  [accent]Fondazione[] sopra il nucleo ï¡© [accent]Frammento[]. Assicurati che sia libero da ostacoli. +hint.presetLaunch = [accent]Settori grigi d'atterraggio[], come [accent]Foresta Ghiacciata[], possono essere lanciati da ovunque. Non richiedono la cattura nei terrotori circostanti.\n\n[accent]Settori numerati[], come questo qui, sono [accent]opzionali[]. -item.copper.description = Un materiale utile, usato dappertutto. -item.lead.description = Un materiale di base, molto usato nei blocchi per il trasporto. -item.metaglass.description = Un durissimo composto di vetro. Ampiamente usato per trasporto di liquidi ed immagazzinamento. -item.graphite.description = Carbone mineralizzato, utilizzato per munizioni e componenti elettrici. -item.sand.description = Un materiale di base che viene usato molto nei processi di fusione, sia come lega che come reagente. -item.coal.description = Un combustibile comune facilmente ottenibile. -item.titanium.description = Un raro metallo incredibilmente leggero usato ampiamente nella costruzione di trasporti, trivelle e navi. -item.thorium.description = Un materiale denso e radioattivo, utilizzato nella costruzione di strutture e come carburante del reattore nucleare. -item.scrap.description = Resti rimanenti di vecchie strutture ed unità. Contiene tracce di molti metalli diversi. -item.silicon.description = Un semiconduttore molto utile che viene utilizzato nei pannelli solari e nei macchinari elettronici. -item.plastanium.description = Un materiale leggero e duttile, utilizzato nelle navi avanzate e come munizione. -item.phase-fabric.description = Una sostanza quasi senza peso utilizzata nell'elettronica avanzata e nella tecnologia autoriparante. -item.surge-alloy.description = Una lega avanzata con proprietà elettriche uniche. +item.copper.description = Usato in molti tipi di costruzioni e munizioni. +item.copper.details = Rame. Metallo anormalmente abbondante su Serpulo. Strutturalmente debole se non rinforzato. +item.lead.description = Usato nel trasporto di liquidi e strutture elettriche. +item.lead.details = Denso. Inerte. Ampiamente utilizzato in batterie.\nNota: Probabilmente tossico per le forme di vita biologica. Non che siano rimaste in molti qui. +item.metaglass.description = Usato nelle strutture per il trasporto/immagazzinamento dei liquidi. +item.graphite.description = Usato nei componenti elettrici e come munizione per le torrette. +item.sand.description = Usata per la produzione di altri materiali raffinati. +item.coal.description = Usato per la produzione di combustibili e materiali più raffinati. +item.coal.details = Sembra siano resti organici fossilizzati di piante, formato prima dell'evento di semina. +item.titanium.description = Usato nelle strutture per il trasporto dei liquidi e per le trivelle. +item.thorium.description = Utilizzato per la costruzione delle strutture più robuste e come combustibile nucleare. +item.scrap.description = Utilizzato nel fonditore e nel polverizzatore per essere raffinato in altri materiali. +item.scrap.details = Detriti di vecchie strutture e unità abbandonate. +item.silicon.description = Usato nei pannelli solari, circuiti complessi e come munizione per certe torrette. +item.plastanium.description = Utilizzato per le unità avanzate e come munizione. +item.phase-fabric.description = Usato nei circuiti avanzati e per le strutture autoriparanti. +item.surge-alloy.description = Usato come munizione per torrette avanzate. item.spore-pod.description = Utilizzato per la conversione in petrolio, esplosivi e carburante. +item.spore-pod.details = Spore. Probabilmente una forma di vita sintetica. Emettono gas tossici alle vita biologica. Estremamente invasive. Altamente infiammabili in certe condizioni. item.blast-compound.description = Un composto altamente volatile, utilizzato nella produzione di bombe ed esplosivi. Può essere utilizzato come combustibile anche se non è consigliabile. item.pyratite.description = Una sostanza molto infiammabile che viene utilizzata nelle armi da fuoco. -liquid.water.description = Il liquido più utile. Comunemente usato per il raffreddamento di macchinari ed il trattamento dei rifiuti. -liquid.slag.description = Diversi tipi di metalli fusi, mescolati insieme. Può essere separato nei suoi minerali costituenti o spruzzato sulle unità nemiche come un'arma. -liquid.oil.description = Un liquido usato nella produzione avanzata.\nPuò essere convertito in carbone per uso combustibile o spruzzato ed incendiato come arma. -liquid.cryofluid.description = Un liquido inerte e non corrosivo creato da acqua e titanio.\nÈ il liquido più efficiente per il raffreddamento. -block.message.description = Memorizza un messaggio. Utilizzato per la comunicazione tra alleati. -block.graphite-press.description = Comprime pezzi di carbone in fogli di grafite puri. -block.multi-press.description = Una versione aggiornata della pressa per grafite. Impiega acqua ed energia per elaborare il carbone in modo rapido ed efficiente. -block.silicon-smelter.description = Fonde sabbia e carbone riscaldati per ottenere silicio. -block.kiln.description = Fonde la sabbia ed il piombo in vetro metallico. Richiede piccole quantità di energia. +liquid.water.description = Usato per il raffreddamento di macchinari ed il trattamento dei rifiuti. +liquid.slag.description = Raffinata nei separatori in diversi metalli o spruzzata sui nemici come munizione. +liquid.oil.description = Usato nella produzione di materiali avanzati e come munizione incendiaria. +liquid.cryofluid.description = Usato come refrigerante in reattori, torrette e macchinari. + +block.resupply-point.description = Rifornisce untià vicine con munizioni in rame. Incompatibile con unità che richiedono energia. +block.armored-conveyor.description = Trasporta gli oggetti. Non accetta oggetti dai lati. +block.illuminator.description = Emette luce. +block.message.description = Memorizza un messaggio per le comunicazioni tra alleati. +block.graphite-press.description = Comprime il carbone in grafite. +block.multi-press.description = Comprime il carbone in grafite. Necessite di acqua come refrigerante. +block.silicon-smelter.description = Raffina il silicio da sabbia e carbone. +block.kiln.description = Fonde sabbia e piombo in vetro metallico. block.plastanium-compressor.description = Produce plastanio da petrolio e titanio. -block.phase-weaver.description = Produce tessuto di fase da torio radioattivo ed elevate quantità di sabbia. -block.alloy-smelter.description = Produce leghe di sovratensione da titanio, piombo, silicio e rame. -block.cryofluid-mixer.description = Combina acqua e titanio in criofluido che è molto più efficiente per il raffreddamento. -block.blast-mixer.description = Frantuma e mescola le spore con la pirite per produrre composto esplosivo. -block.pyratite-mixer.description = Mescola carbone, piombo e sabbia in pirite altamente infiammabile. -block.melter.description = Riscalda la pietra a temperature molto elevate per ottenere scoria liquida. -block.separator.description = Sottopone le scoria a centrifugazione per ottenere i vari minerali contenuti. -block.spore-press.description = Comprime le spore in petrolio. -block.pulverizer.description = Polverizza la pietra.\nUtile quando manca la sabbia naturale. -block.coal-centrifuge.description = Solidifica il petrolio in pezzi di carbone. -block.incinerator.description = Elimina qualsiasi oggetto o liquido in eccesso. -block.power-void.description = Elimina tutta l'energia che riceve. Esiste solo nella modalità creativa. -block.power-source.description = Produce energia infinita. Esiste solo nella modalità creativa. -block.item-source.description = Produce oggetti infiniti. Esiste solo nella modalità creativa. -block.item-void.description = Elimina gli oggetti che vi entrano senza bisogno di energia. Esiste solo nella modalità creativa. -block.liquid-source.description = Emette continuamente liquidi. Esiste solo nella modalità creativa. -block.liquid-void.description = Elimina i liquidi in entrata. Esiste solo nella modalità creativa. -block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. -block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate.\nOccupa più blocchi. -block.titanium-wall.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. -block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici.\nOccupa più blocchi -block.plastanium-wall.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche del nodo d'energia. -block.plastanium-wall-large.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche dei nodi d'energia.\nSi estende su più blocchi. -block.thorium-wall.description = Un forte blocco difensivo.\nBuona protezione dai nemici. -block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più blocchi. -block.phase-wall.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti. -block.phase-wall-large.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.\nOccupa più blocchi. -block.surge-wall.description = Il blocco difensivo più forte.\nHa una piccola possibilità di innescare un fulmine verso l'attaccante. -block.surge-wall-large.description = Il blocco difensivo più forte.\nHa una piccola possibilità di innescare un fulmine verso l'attaccante.\nOccupa più blocchi. -block.door.description = Una piccola porta che può essere aperta e chiusa toccandola.\nSe aperta, i nemici possono sparare ed attraversare. -block.door-large.description = Una grande porta che può essere aperta e chiusa toccandola.\nSe aperta, i nemici possono sparare ed attraversare.\nOccupa più blocchi. -block.mender.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del silicio per aumentarne portata ed efficienza. -block.mend-projector.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del tessuto di fase per aumentarne portata ed efficienza. -block.overdrive-projector.description = Aumenta la velocità di edifici vicini come trivelle e nastri trasportatori. -block.force-projector.description = Crea un campo di forza esagonale attorno a sé, proteggendo gli edifici e le unità all'interno da danni causati da proiettili. -block.shock-mine.description = Danneggia i nemici che la calpestano. Quasi invisibile al nemico. -block.conveyor.description = Nastro di base. Sposta gli oggetti in avanti e li deposita automaticamente in altri blocchi. È rotabile. -block.titanium-conveyor.description = Nastro avanzato. Sposta gli oggetti più velocemente dei nastri standard. -block.plastanium-conveyor.description = Sposta gli oggetti in lotti.\nAccetta gli oggetti dal retro e li scarica in tre direzioni nella parte anteriore. -block.junction.description = Permette di incrociare nastri che trasportano materiali diversi in posizioni diverse. -block.bridge-conveyor.description = Consente il trasporto di oggetti fino a 3 blocchi ad un altro nastro sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. -block.phase-conveyor.description = Nastro avanzato. Consuma energia per teletrasportare gli oggetti su un altro nastro di fase collegato. -block.sorter.description = Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati. -block.inverted-sorter.description = Elabora gli oggetti come uno filtro standard, ma in uscita dà gli elementi selezionati ai lati. -block.router.description = Accetta gli elementi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Utile per suddividere i materiali da una fonte a più destinazioni. -block.distributor.description = Un distributore avanzato che divide gli oggetti in altre 7 direzioni allo stesso modo. -block.overflow-gate.description = Distribuisce gli oggetti ai lati se il nastro davanti a sé è saturo. -block.underflow-gate.description = L'opposto di un separatore per eccesso. Distribuisce gli oggetti nel nastro davanti a sé se i nastri a destra e a sinistra sono saturi. -block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie diversi oggetti e poi li spara su un'altra lancia materiali a lungo raggio. -block.mechanical-pump.description = Una pompa economica a bassa efficienza, ma nessun consumo di energia. -block.rotary-pump.description = Una pompa avanzata che raddoppia la velocità consumando energia. -block.thermal-pump.description = La pompa migliore. Tre volte più veloce di una pompa meccanica e l'unica pompa in grado di recuperare la lava. -block.conduit.description = Condotto di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altri condotti. -block.pulse-conduit.description = Condotto avanzato. Trasporta più liquido e più velocemente dei condotti standard. -block.plated-conduit.description = Trasferisce i liquidi alla stessa velocità del Condotto a Impulsi, ma è più resistente. Non accetta liquidi dai lati da parte di condotti diversi.\nMeno perdite. -block.liquid-router.description = Accetta i liquidi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Può anche immagazzinare una certa quantità di liquido. Utile per suddividere i liquidi da una fonte verso più destinazioni. -block.liquid-tank.description = Conserva una grande quantità di liquidi. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali o come protezione per il raffreddamento di blocchi vitali. -block.liquid-junction.description = Permette di incrociare condotti che trasportano liquidi diversi in posizioni diverse. -block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 blocchi da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. -block.phase-conduit.description = Condotto avanzato. Consuma energia per teletrasportare i liquidi in un altro condotto di fase collegato. -block.power-node.description = Trasmette energia tra i nodi collegati. È possibile creare fino a quattro collegamenti.\nClicca sul nodo per configurare i collegamenti. -block.power-node-large.description = Ha un raggio maggiore rispetto al Nodo Energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti. -block.surge-tower.description = Un nodo di alimentazione a lungo raggio solo due connessioni disponibili.\nClicca sul nodo per configurare i collegamenti. -block.diode.description = L'energia della batteria può attraversare questo blocco in una sola direzione, ma solo se l'altra parte ha meno energia. -block.battery.description = Accumula energia ogni volta che c'è abbondanza e fornisce energia ogni volta che c'è carenza, purché sia carica. -block.battery-large.description = Immagazzina molta più energia di una normale batteria. -block.combustion-generator.description = Genera energia bruciando combustibile. -block.thermal-generator.description = Genera una grande quantità di energia dalla lava. -block.steam-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. -block.differential-generator.description = Genera grandi quantità di energia. Utilizza la differenza di temperatura tra criofluido e pirite in combustione. -block.rtg-generator.description = Un generatore che sfrutta il calore del decadimento di materiale radioattivo per produrre energia.\nNon richiede raffreddamento ma fornisce meno energia di un reattore al torio. -block.solar-panel.description = Fornisce una piccola quantità di energia dal sole. -block.solar-panel-large.description = Fornisce un'alimentazione migliore rispetto a un pannello solare standard, ma è anche molto più costoso da costruire. -block.thorium-reactor.description = Genera enormi quantità di energia dal torio altamente radioattivo. Richiede un raffreddamento costante. Esploderà violentemente se vengono fornite quantità insufficienti di refrigerante. -block.impact-reactor.description = Un generatore avanzato, in grado di creare enormi quantità di energia alla massima efficienza. Richiede un significativo apporto di energia per avviare il processo. -block.mechanical-drill.description = Una trivella economica. Se posizionata su slot appropriati, estrae minerali a un ritmo lento e costante. -block.pneumatic-drill.description = Una trivella migliorata più veloce ed in grado di elaborare materiali più duri sfruttando la pressione dell'aria. -block.laser-drill.description = Consente di perforare ancora più velocemente attraverso la tecnologia laser, ma richiede energia. Inoltre, con questa trivella è possibile recuperare il torio radioattivo. -block.blast-drill.description = La trivella migliore. Richiede grandi quantità di energia. -block.water-extractor.description = Estrae l'acqua dal terreno. Usalo quando non c'è nessun lago nelle vicinanze. -block.cultivator.description = Coltiva il terreno con acqua per ottenere materia organica. -block.oil-extractor.description = Utilizza grandi quantità di energia per estrarre petrolio dalla sabbia. Usalo quando non c'è una fonte diretta di petrolio nelle vicinanze. -block.core-shard.description = La prima iterazione del Nucleo. Una volta distrutto, tutti i contatti con la regione vengono persi. Non lasciare che questo accada. -block.core-foundation.description = La seconda versione del Nucleo. Meglio corazzato. Immagazzina più risorse. -block.core-nucleus.description = La terza ed ultima versione del Nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse. -block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [lightgray]scaricatore[] può essere utilizzato per recuperare elementi dal deposito. -block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [lightgray]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore. -block.unloader.description = Scarica gli oggetti da un contenitore, deposito o Nucleo su un nastro trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. -block.launch-pad.description = Lancia oggetti nel tuo Nucleo senza necessità di lasciare la zona. -block.launch-pad-large.description = Una versione migliore dell'Ascensore Spaziale, immagazzina più oggetti. Lancia oggetti più frequentemente. -block.duo.description = Una torretta piccola ed economica. -block.scatter.description = Una torretta antiaerea essenziale. Spara schegge di piombo, rottami o vetro metallico alle unità nemiche. -block.scorch.description = Brucia qualsiasi nemico di terra vicino ad esso. Molto efficace a distanza ravvicinata. -block.hail.description = Una piccola torretta di artiglieria. -block.wave.description = Una torretta a fuoco rapido di medie dimensioni che spara liquidi. -block.lancer.description = Una torretta di medie dimensioni che dopo un breve caricamento spara potenti fasci elettrici. -block.arc.description = Una piccola torretta che spara elettricità in un arco casuale verso il nemico. -block.swarmer.description = Una torretta di medie dimensioni che spara missili esplosivi. -block.salvo.description = Una torretta di medie dimensioni che spara colpi in salve. -block.fuse.description = Una grande torretta a corto raggio che spara tre potenti schegge perforanti. -block.ripple.description = Una grande torretta di artiglieria che spara più colpi contemporaneamente. -block.cyclone.description = Una grande torretta a fuoco rapido. -block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente. -block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio. -block.repair-point.description = Cura continuamente l'unità danneggiata più vicina. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.phase-weaver.description = Sintetizza il tessuto di fase da torio e sabbia. +block.alloy-smelter.description = Fonde titanio, piombo, silicio e rame nella lega di sovratensione. +block.cryofluid-mixer.description = Miscela acqua e polvere di titanio per produrre il criofluido. +block.blast-mixer.description = Produce composto esplosivo dalla pirite e dal baccello di spore. +block.pyratite-mixer.description = Miscela carbone, piombo e sabbia in pirite. +block.melter.description = Fonde i rottami in scorie. +block.separator.description = Raffina le scorie nei minerali che le compongono. +block.spore-press.description = Comprime i baccelli di spore in petrolio. +block.pulverizer.description = Polverizza i rottami in sabbia. +block.coal-centrifuge.description = Trasforma il petrolio in carbone. +block.incinerator.description = Distrugge ogni oggetto o liquido che riceve. +block.power-void.description = Distrugge l'energia in entrata. Disponibile solo nella modalità creativa. +block.power-source.description = Genera energia infinita. Disponibile solo nella modalità creativa. +block.item-source.description = Genera oggetti infiniti. Disponibile solo nella modalità creativa. +block.item-void.description = Distrugge tutti gli oggetti che riceve. Disponibile solo nella modalità creativa. +block.liquid-source.description = Genera liquidi infiniti. Disponibile solo nella modalità creativa. +block.liquid-void.description = Distrugge qualsiasi liquido che riceve. Disponibile solo nella modalità creativa. +block.copper-wall.description = Protegge le strutture dai proiettili nemici. +block.copper-wall-large.description = Protegge le strutture dai proiettili nemici. +block.titanium-wall.description = Protegge le strutture dai proiettili nemici. +block.titanium-wall-large.description = Protegge le strutture dai proiettili nemici. +block.plastanium-wall.description = Protegge le strutture dai proiettili nemici. Assorbe i raggi laser e gli archi elettrici. Absorbs lasers and electric arcs. Blocca le connessioni automatiche dei nodi energetici. +block.plastanium-wall-large.description = Protegge le strutture dai proiettili nemici. Assorbe i raggi laser e gli archi elettrici. Absorbs lasers and electric arcs. Blocca le connessioni automatiche dei nodi energetici. +block.thorium-wall.description = Protegge le strutture dai proiettili nemici. +block.thorium-wall-large.description = Protegge le strutture dai proiettili nemici. +block.phase-wall.description = Protegge le strutture dai proiettili nemici riflettendone la maggior parte all'impatto. +block.phase-wall-large.description = Protegge le strutture dai proiettili nemici riflettendone la maggior parte all'impatto. +block.surge-wall.description = Protegge le strutture dai proiettili nemici rilasciando periodicamente archi elettrici al contatto. +block.surge-wall-large.description = Protegge le strutture dai proiettili nemici rilasciando periodicamente archi elettrici al contatto. +block.door.description = Un muro che può essere aperto o chiuso. +block.door-large.description = Un muro che può essere aperto o chiuso. +block.mender.description = Ripara periodicamente i blocchi nelle sue vicinanze.\nAccetta silicio per aumentare la portata e l'efficienza. +block.mend-projector.description = Ripara periodicamente i blocchi nelle sue vicinanze.\nAccetta tessuto di fase per aumentare la portata e l'efficienza. +block.overdrive-projector.description = Aumenta la velocità delle strutture vicine.\nAccetta tessuto di fase per aumentare la portata e l'efficienza. +block.force-projector.description = Crea un campo di forza esagonale attorno a se proteggendo le strutture e le unità dai proiettili nemici.\nSi surriscalda se subisce troppi colpi. Accetta liquidi refrigeranti per prevenire il surriscaldamento. Il tessuto di fase aumenta la portata dello scudo. +block.shock-mine.description = Rilascia archi elettrici al contatto con un nemico. +block.conveyor.description = Trasporta gli oggetti. +block.titanium-conveyor.description = Trasporta gli oggetti. È più veloce di un nastro trasportatore standard. +block.plastanium-conveyor.description = Trasporta gli oggetti in lotti. Accetta gli oggetti dal retro e li scarica in tre direzioni. Necessita di molteplici punti di carico e scarico per aumentare la portata. +block.junction.description = Funge da ponte tra due nastri trasportatori che si incrociano. +block.bridge-conveyor.description = Trasporta gli oggetti sopra blocchi e strutture. +block.phase-conveyor.description = Trasporta gli oggetti sopra blocchi e strutture istantaneamente. Ha un raggio più ampio rispetto al nastro trasportatore sopraelevato, ma ha bisogno di energia per funzionare. +block.sorter.description = Se un oggetto in ingresso corrisponde al filtro selezionato, passa avanti. Altrimenti l'oggetto viene deviato a destra e sinistra. +block.inverted-sorter.description = Simile al filtro comune ma devia a destra e sinistra gli oggetti se corrispondono al filtro selezionato. +block.router.description = Distribuisce equamente gli oggetti in entrata nelle 3 uscite. +block.router.details = Un male necessario. L'uso dei distributori accanto agli input di produzione non è consigliato poiché verrebbero intasati dall'output. +block.distributor.description = Distribuisce equamente gli oggetti in entrata nelle 7 uscite. +block.overflow-gate.description = Devia gli oggetti a destra e a sinistra solo se l'uscita anteriore è bloccata. Non può essere usato insieme ad altri blocchi per la gestione degli oggetti. +block.underflow-gate.description = L'esatto opposto del separatore per eccesso. Devia gli oggetti verso l'uscita anteriore solo se le uscite laterali sono bloccate. Non può essere usato insieme ad altri blocchi per la gestione degli oggetti. +block.mass-driver.description = Struttura per il trasporto di oggetti a lungo raggio. Immagazzina lotti di oggetti e li spara ad un altro trasportatore di massa. +block.mechanical-pump.description = Pompa liquidi. Non richiede energia. +block.rotary-pump.description = Pompa liquidi. Richiede energia. +block.thermal-pump.description = Pompa liquidi. +block.conduit.description = Trasporta i liquidi. Spesso usato insieme a pompe e altri condotti. +block.pulse-conduit.description = Trasporta i liquidi più velocemente. Ha una capacità maggiore rispetto ai condotti tradizionali. +block.plated-conduit.description = Trasporta i liquidi. Non accetta liquidi dai lati. Non spande. +block.liquid-router.description = Accetta liquidi da un lato e li divide equamente nelle 3 uscite. Può anche immagazzinare una piccola quantità di liquido. +block.liquid-tank.description = Immagazzina una grande quantità di liquido. Emette il liquido che contiene da tutti i lati, simile ad un distributore di liquidi. +block.liquid-junction.description = Funge da ponte tra due condotti che si incrociano. +block.bridge-conduit.description = Trasporta i liquidi sopra blocchi e strutture. +block.phase-conduit.description = Trasporta i liquidi sopra blocchi e strutture istantaneamente. Ha un raggio più ampio rispetto al condotto sopraelevato, ma ha bisogno di energia per funzionare. +block.power-node.description = Trasmette l'energia ai nodi connessi. Il nodo riceve e trasmette l'energia a tutti i blocchi adiacenti. +block.power-node-large.description = Un nodo energetico avanzato con un raggio maggiore. +block.surge-tower.description = Un nodo energetico a lungo raggio ma con poche connessioni disponibili. +block.diode.description = Dirige l'energia delle batterie in una direzione solo se dal lato opposto l'energia immagazzinata è minore. +block.battery.description = Immagazzina l'energia quando in eccesso. Emette l'energia nei momenti di deficit. +block.battery-large.description = Immagazzina l'energia quando in eccesso. Emette l'energia nei momenti di deficit. Ha una capacità maggiore rispetto le batterie tradizionali. +block.combustion-generator.description = Genera energia bruciando combustibili come il carbone. +block.thermal-generator.description = Genera energia se posizionato su luoghi caldi. +block.steam-generator.description = Genera energia bruciando combustibili per trasformare l'acqua in vapore. +block.differential-generator.description = Genera grandi quantità di energia sfruttando la differenza di temperatura tra criofluido e pirite ardente. +block.rtg-generator.description = Sfrutta lentamente il calore dei composti radioattivi in decadimento per produrre energia. +block.solar-panel.description = Genera piccole quantità di energia dal sole. +block.solar-panel-large.description = Genera piccole quantità di energia dal sole. Più efficente del pannello solare tradizionale. +block.thorium-reactor.description = Genera grandi quantità di energia dal torio. Ha bisogno di essere costantemente raffreddato. Esplode violentemente quando il liquido refrigerante non è sufficente a raffreddarlo. +block.impact-reactor.description = Quando alla massima efficienza, genera enormi quantità di energia. Ha bisogno di una discreta quantità di energia per avviare il processo. +block.mechanical-drill.description = Quando posizionata su un minerale, estrae minerali ad un ritmo lento ma costante. Può scavare solo i minerali più teneri. +block.pneumatic-drill.description = Una trivella migliorata capace di estrarre il titanio. Lavora più velocemente di una trivella meccanica. +block.laser-drill.description = Grazie alla tecnologia laser, permette di scavare ancora più velocemente ma deve essere alimentata. È in grado di estrarre il torio. +block.blast-drill.description = La trivella migliore. Richiede grandi quantità di energia per funzionare. +block.water-extractor.description = Estrae l'acqua dal terreno. Utilizzato nei luoghi senza una fonte d'acqua superficiale nelle vicinanze. +block.cultivator.description = Coltiva delle piccole concentrazioni di spore presenti nell'atmosfera in baccelli di spore. +block.cultivator.details = Tecnologia recuperata. Usata per la produzione di enormi quantità di materiale organico il più efficientemente possibile. È probabile che sia il primo incubatore delle spore che ora ricoprono Serpulo. +block.oil-extractor.description = Utilizza grandi quantità di energia, sabbia ed acqua per estrarre il petrolio. +block.core-shard.description = Nucleo della base. Una volta distrutto, il settore è perso. +block.core-shard.details = La prima generazione. Compatto. Autoreplicante. Dotato di propulsori di lancio monouso. Non pensato per viaggi interplanetari. +block.core-foundation.description = Nucleo della base. Corazzato. Immagazzina più risorse del Frammento. +block.core-foundation.details = La seconda generazione. +block.core-nucleus.description = Nucleo della base. Estremamente resistente. Immagazzina enormi quantità di risorse. +block.core-nucleus.details = La terza e ultima generazione. +block.vault.description = Immagazzina grandi quantità di oggetti di ogni tipo. Può essere svuotato con uno scaricatore. +block.container.description = Imagazzina piccole quantità di oggetti di ogni tipo. Può essere svuotato con uno scaricatore. +block.unloader.description = Scarica l'oggetto selezionato dai blocchi adiacenti. +block.launch-pad.description = Lancia lotti di oggetti ai settori selezionati. +block.duo.description = Spara proiettili ai nemici. +block.scatter.description = Spara agglomerati di piombo, rottami o vetro metallico ai nemici aerei. +block.scorch.description = Incenerisce qualsiasi unità terrena nelle vicinanze. Altamente efficace a distanza ravvicinata. +block.hail.description = Spara piccole schegge alle unità terrene su lunghe distanze. +block.wave.description = Spara liquidi ai nemici. Quando alimentato ad acqua, estingue automaticamente gli incendi. +block.lancer.description = Carica e spara potenti raggi di energia alle unità terrene. +block.arc.description = Spara archi elettrici alle unità terrene. +block.swarmer.description = Spara missili automiranti ai nemici. +block.salvo.description = Spara raffiche di proiettili ai nemici. +block.fuse.description = Colpisce i nemici vicini con tre scariche penetranti. +block.ripple.description = Spara molteplici proiettili alle unità terrene, anche su lunghe distanze. +block.cyclone.description = Spara raffiche di proiettili ai nemici nelle vicinanze. +block.spectre.description = Spara raffiche di proiettili perforanti alle unità aeree e terrene. +block.meltdown.description = Carica e spara un potentissimo raggio laser ai nemici vicini. Richiede liquido refrigerante per funzionare. +block.foreshadow.description = Spara con precisione un potente raggio, anche su grandi distanze. +block.repair-point.description = Ripara costantemente l'unità più vicina nel suo raggio d'azione. +block.segment.description = Indebolisce e distrugge i proiettili nel suo raggio d'azione. I laser non vengono mirati. +block.parallax.description = Spara un raggio traente che avvicina i bersagli aerei, indebolendoli allo stesso tempo. +block.tsunami.description = Spara potenti getti di liquidi ai nemici. Quando alimentato ad acqua, estingue automaticamente gli incendi. +block.silicon-crucible.description = Produce il silicio da sabbia e carbone usando la pirite come fonte di calore aggiuntiva. Aumenta la sua efficienza su terreni caldi. +block.disassembler.description = Separa le scorie in diversi minerali, tra cui il torio. +block.overdrive-dome.description = Aumenta la velocità delle strutture vicine. Richiede tessuto di fase e silicio per funzionare. +block.payload-conveyor.description = Trasporta carichi pesanti come le unità prodotte nelle fabbriche. +block.payload-router.description = Divide equamente il carico dei trasportatori di massa in 3 direzioni. +block.command-center.description = Permette di controllare il comportamento delle unità con diversi comandi. +block.ground-factory.description = Produce le unità terrene. Le unità prodotte possono essere utilizzate direttamente o trasferite nei ricostruttori per essere potenziate. +block.air-factory.description = Produce le unità aeree. Le unità prodotte possono essere utilizzate direttamente o trasferite nei ricostruttori per essere potenziate. +block.naval-factory.description = Produce le unità navali. Le unità prodotte possono essere utilizzate direttamente o trasferite nei ricostruttori per essere potenziate. +block.additive-reconstructor.description = Migliora le unità in ingresso ad unità di seconda generazione. +block.multiplicative-reconstructor.description = Migliora le unità in ingresso ad unità di terza generazione. +block.exponential-reconstructor.description = Migliora le unità in ingresso ad unità di quarta generazione. +block.tetrative-reconstructor.description = Migliora le unità in ingresso ad unità di quinta generazione. +block.switch.description = Un semplice interruttore. Il suo stato può essere letto e controllato dai processori. +block.micro-processor.description = Esegue costantemente una sequenza di istruzioni. Può essere usato per controllare unità e strutture. +block.logic-processor.description = Esegue costantemente una sequenza di istruzioni. Può essere usato per controllare unità e strutture. Più veloce del micro processore. +block.hyper-processor.description = Esegue costantemente una sequenza di istruzioni. Può essere usato per controllare unità e strutture. Più veloce del processore logico. +block.memory-cell.description = Imagazzina le informazioni elaborate dai processori. +block.memory-bank.description = Imagazzina le informazioni elaborate dai processori. Alta capacità. +block.logic-display.description = Visualizza la grafica arbitraria elaborata dal processore. +block.large-logic-display.description = Visualizza la grafica arbitraria elaborata dal processore. +block.interplanetary-accelerator.description = Una massiccia torre che utilizza potenti campi elettromagnetici. Accelera nuclei fino alla velocità di fuga per un impiego interplanetario. + +unit.dagger.description = Spara proiettili standard ai nemici vicini. +unit.mace.description = Spara raffiche infuocate ai nemici vicini. +unit.fortress.description = Spara proiettili con l'artiglieria a lungo raggio alle unità terrene. +unit.scepter.description = Spara una raffica di proiettili Fires a barrage of charged bullets at all nearby enemies. +unit.reign.description = Spara una serie di proiettili perforanti a tutti i nemici nelle vicinanze. +unit.nova.description = Spara raggi laser che danneggiano i nemici e riparano le strutture degli alleati. È in grado di volare. +unit.pulsar.description = Spara archi elettrici che danneggiano i nemici e riparano le strutture degli alleati. È in grado di volare. +unit.quasar.description = Spara raggi laser perforanti che danneggiano i nemici e riparano le strutture degli alleati. È in grado di volare. Corazzato. +unit.vela.description = Spara un enorme e costante raggio laser che danneggia i nemici e ripara le strutture degli alleati. È in grado di volare. +unit.corvus.description = Spara un enorme raggio laser esplosivo che danneggia i nemici e ripara le strutture degli alleati. Può camminare sopra la maggior parte dei terreni. +unit.crawler.description = Corre verso i nemici ed esplode, causando una grande esplosione. Può camminare sopra la maggior parte dei terreni. +unit.atrax.description = Spara sfere debilitanti di scorie alle unità terrene. Può camminare sopra la maggior parte dei terreni. +unit.spiroct.description = Spara raggi laser ai nemici, riparando se stesso. Può camminare sopra la maggior parte dei terreni. +unit.arkyid.description = Spara enormi raggi laser ai nemici, riparando se stesso. Può camminare sopra la maggior parte dei terreni. +unit.toxopid.description = Spara archi elettrici e laser perforanti ai nemici. Può camminare sopra la maggior parte dei terreni. +unit.flare.description = Spara proiettili standard alle unità terrene e alle strutture nemiche. +unit.horizon.description = Rilascia bombe alle unità terrene e alle strutture nemiche. +unit.zenith.description = Spara salve di missili ai nemici vicini. +unit.antumbra.description = Spara una raggica di proiettili ai nemici nelle vicinanze. +unit.eclipse.description = Spara due laser perforanti e schegge ai nemici nelle vicinanze. +unit.mono.description = Estrae rame e piombo automaticamente per poi depositarlo nel nucleo. +unit.poly.description = Ricostruisce automaticamente le strutture danneggiate e assiste altre unità durante la costruzione. +unit.mega.description = Ripara automaticamente le strutture danneggiate. È in grado di trasportare blocchi e piccole unità terrene. +unit.quad.description = Rilascia grandi bombe alle unità terrene, riparando le strutture alleate e danneggiando quelle nemiche. È in grado di trasportare unità terrene di medie dimensioni. +unit.oct.description = Protegge gli alleati nelle vicinanze con lo scudo rigenerante integrato. È in grado di trasportare la maggior parte delle unità terrene. +unit.risso.description = Spara una raffica di missili e proiettili ai nemici nelle vicinanze. +unit.minke.description = Spara proiettili incendiari e standard alle unità terrene. +unit.bryde.description = Spara proiettili e missili a lungo raggio ai nemici. +unit.sei.description = Spara raffiche di missili e proiettili corazzati e perforanti ai nemici. +unit.omura.description = Utilizza un bullone sparatato grazie a due binari a scorrimento accelerati da un campo elettromagnetico. Lunga gittata e perforazione estrema. Costruisce unità flare. +unit.alpha.description = Difende il nucleo Frammento dai nemici. Costruisce strutture. +unit.beta.description = Difende il nucleo Fondamento dai nemici. Costruisce strutture. +unit.gamma.description = Difende il nucleo Kernel dai nemici. Costruisce strutture. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index fdb915ff96..7b43e80516 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -13,15 +13,18 @@ link.google-play.description = Google Play ストアを開ã link.f-droid.description = F-Droid ã‚’é–‹ã link.wiki.description = å…¬å¼ Mindustry Wiki link.suggestions.description = æ–°æ©Ÿèƒ½ã‚’ææ¡ˆã™ã‚‹ +link.bug.description = Found one? Report it here linkfail = リンクを開ã‘ã¾ã›ã‚“ã§ã—ãŸ!\nURLをクリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸã€‚ screenshot = スクリーンショットを {0} ã«ä¿å­˜ã—ã¾ã—ãŸã€‚ screenshot.invalid = マップãŒåºƒã™ãŽã¾ã™ã€‚スクリーンショットã«å¿…è¦ãªãƒ¡ãƒ¢ãƒªãŒè¶³ã‚Šãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ gameover = ゲームオーãƒãƒ¼ +gameover.disconnect = 切断 gameover.pvp = [accent] {0}[] ãƒãƒ¼ãƒ ã®å‹åˆ©! +gameover.waiting = [accent]次ã®ãƒžãƒƒãƒ—ã‚’å¾…ã£ã¦ã„ã¾ã™... highscore = [accent]ãƒã‚¤ã‚¹ã‚³ã‚¢ã‚’æ›´æ–°! copied = コピーã—ã¾ã—ãŸã€‚ -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. indev.notready = This part of the game isn't ready yet +indev.campaign = [accent]Congratulations! You've reached the end of the campaign![]\n\nThis is as far as the content goes right now. Interplanetary travel will be added in future updates. load.sound = サウンド load.map = マップ @@ -38,6 +41,11 @@ be.ignore = 無視ã™ã‚‹ be.noupdates = æ›´æ–°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 be.check = 更新を確èªã—ã¾ã™ã€‚ +mod.featured.dialog.title = Mod ブラウザー (作業中) +mods.browser.selected = é¸æŠžã•れãŸmod +mods.browser.add = インストール +mods.github.open = 見る + schematic = 設計図 schematic.add = 設計図をä¿å­˜ schematics = 設計図一覧 @@ -55,7 +63,9 @@ schematic.saved = 設計図をä¿å­˜ã—ã¾ã—ãŸã€‚ schematic.delete.confirm = ã“ã®è¨­è¨ˆå›³ã¯å®Œå…¨ã«å‰Šé™¤ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ schematic.rename = 設計図ã®åå‰ã‚’変更ã™ã‚‹ã€‚ schematic.info = {1}x{0}, {2} ブロック +schematic.disabled = [scarlet]設計図使用ä¸å¯[]\nã“ã®[accent]マップ[]ã€[accent]サーãƒãƒ¼[]ã§ã¯è¨­è¨ˆå›³ã®ä½¿ç”¨ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 +stats = Stats stat.wave = 防衛ã—ãŸã‚¦ã‚§ãƒ¼ãƒ–:[accent] {0} stat.enemiesDestroyed = 敵ã«ç ´å£Šã•ã‚ŒãŸæ•°:[accent] {0} stat.built = 建設ã—ãŸå»ºé€ ç‰©æ•°:[accent] {0} @@ -65,7 +75,7 @@ stat.delivered = ç²å¾—ã—ãŸè³‡æº: stat.playtime = プレイ時間:[accent] {0} stat.rank = 最終ランク: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]グローãƒãƒ«ã‚¢ã‚¤ãƒ†ãƒ  map.delete = マップ "[accent]{0}[]" を削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? level.highscore = ãƒã‚¤ã‚¹ã‚³ã‚¢: [accent]{0} level.select = ãƒ¬ãƒ™ãƒ«é¸æŠž @@ -79,6 +89,7 @@ joingame = マルãƒãƒ—レイ customgame = カスタムプレイ newgame = æ–°ã—ãå§‹ã‚ã‚‹ none = <ãªã—> +none.found = [lightgray]<見ã¤ã‹ã‚Šã¾ã›ã‚“> minimap = ミニマップ position = ä½ç½® close = é–‰ã˜ã‚‹ @@ -99,15 +110,14 @@ committingchanges = 変更をé©å¿œä¸­ done = 完了 feature.unsupported = ã‚ãªãŸã®ãƒ‡ãƒã‚¤ã‚¹ã¯ã“ã®æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 -mods.alphainfo = Mods機能ã¯å®Ÿé¨“çš„ãªã‚‚ã®ã§ã™ã€‚[scarlet] エラーãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™[]。\n å•題を発見ã—ãŸå ´åˆã¯ Mindustry GitHubã«å ±å‘Šã—ã¦ãã ã•ã„。 -mods.alpha = [accent](Alpha) +mods.alphainfo = Mod機能ã¯å®Ÿé¨“çš„ãªã‚‚ã®ã§ã™ã€‚[scarlet] エラーãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™[]。\n å•題を発見ã—ãŸå ´åˆã¯ Mindustry GitHubã«å ±å‘Šã—ã¦ãã ã•ã„。 mods = Mods mods.none = [lightgray]ModãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ! mods.guide = Mod作æˆã‚¬ã‚¤ãƒ‰ mods.report = ãƒã‚°ã‚’報告ã™ã‚‹ mods.openfolder = MODã®ãƒ•ォルダを開ã mods.reload = å†èª­ã¿è¾¼ã¿ -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Modを読ã¿è¾¼ã‚€ç‚ºã«ã‚²ãƒ¼ãƒ ã‚’å†èµ·å‹•ã—ã¾ã™ã€‚ mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]有効 mod.disabled = [scarlet]無効 @@ -115,7 +125,7 @@ mod.disable = 無効化 mod.content = コンテンツ: mod.delete.error = MODを削除ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ mod.requiresversion = [scarlet]ModãŒè¦æ±‚ã™ã‚‹æœ€ä½Žãƒãƒ¼ã‚¸ãƒ§ãƒ³: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]V6 ã¨ã®äº’æ›æ€§ãŒã‚りã¾ã›ã‚“ (minGameVersion ㌠105 未満) mod.missingdependencies = [scarlet]ä¾å­˜é–¢ä¿‚ãŒã‚りã¾ã›ã‚“。: {0} mod.erroredcontent = [scarlet]コンテンツエラー mod.errors = コンテンツã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ @@ -127,7 +137,7 @@ mod.reloadrequired = [scarlet]Modを有効ã«ã™ã‚‹ã«ã¯ã€ã“ã®ç”»é¢ã‚’é–‹ mod.import = Modをインãƒãƒ¼ãƒˆ mod.import.file = ファイルをインãƒãƒ¼ãƒˆ mod.import.github = GitHubã‹ã‚‰Modをインãƒãƒ¼ãƒˆ -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR mods ã¯æœ¬è³ªçš„ã«å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“。[]\nä¿¡é ¼ã§ãる場所ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„! mod.item.remove = ã“れã¯ä»¥ä¸‹ã®Modã®ä¸€éƒ¨ã§ã™ã€‚[accent] '{0}'[] 削除ã™ã‚‹ã«ã¯ãã®Modを削除ã—ã¦ãã ã•ã„。 mod.remove.confirm = ã“ã®Modを削除ã—ã¾ã™ã€‚ mod.author = [lightgray]著者:[] {0} @@ -139,16 +149,20 @@ mod.scripts.disable = ãŠä½¿ã„ã®ãƒ‡ãƒã‚¤ã‚¹ã¯Scriptを使用ã—ãŸModをサ about.button = 情報 name = åå‰: noname = [accent]プレイヤーå[]を入力ã—ã¦ãã ã•ã„。 -planetmap = Planet Map -launchcore = Launch Core +planetmap = 惑星地図 +launchcore = コアを打ã¡ä¸Šã’ã‚‹ filename = ファイルå: unlocked = æ–°ã—ã„è¦ç´ ã‚’アンロック! +available = æ–°ã—ã„研究ãŒåˆ©ç”¨å¯èƒ½ã§ã™! completed = [accent]完了 techtree = テックツリー +research.legacy = [accent]5.0[] ã®ç ”究データãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚\n[accent]ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿è¾¼ã¿ã¾ã™ã‹?[] ãれã¨ã‚‚ã€[accent]破棄ã—ã¦æ–°ã—ã„キャンペーンã§ç ”究をやり直ã—ã¾ã™ã‹?[](推奨) +research.load = ロード +research.discard = 破棄 research.list = [lightgray]研究: research = 研究 researched = [lightgray]{0} ã®ç ”ç©¶ãŒå®Œäº†ã—ã¾ã—㟠-research.progress = {0}% complete +research.progress = {0}% 完了 players = {0} 人ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ players.single = {0} 人ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ players.search = 検索 @@ -189,6 +203,11 @@ servers.local = ローカルサーãƒãƒ¼ servers.remote = リモートサーãƒãƒ¼ servers.global = コミュニティサーãƒãƒ¼ +servers.disclaimer = コミュニティサーãƒãƒ¼ã¯ã€[accent]é–‹ç™ºè€…ãŒæ‰€æœ‰ã€ç®¡ç†ã—ã¦ã„ã¾ã›ã‚“。[] \n\nサーãƒãƒ¼ã«ã¯å…¨ã¦ã®å¹´é½¢å±¤ã«é©ã•ãªã„コンテンツãŒå­˜åœ¨ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +servers.showhidden = éžè¡¨ç¤ºã®ã‚µãƒ¼ãƒãƒ¼ã‚’表示ã™ã‚‹ +server.shown = 表示 +server.hidden = éžè¡¨ç¤º + trace = プレイヤーã®è¨˜éŒ² trace.playername = プレイヤーå: [accent]{0} trace.ip = IP: [accent]{0} @@ -222,6 +241,7 @@ disconnect.timeout = タイムアウトã—ã¾ã—ãŸã€‚ disconnect.data = ワールドデータã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ! cantconnect = ゲームã«å‚加ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ([accent]{0}[]) connecting = [accent]接続中... +reconnecting = [accent]å†æŽ¥ç¶šä¸­... connecting.data = [accent]ワールドデータを読ã¿è¾¼ã¿ä¸­... server.port = ãƒãƒ¼ãƒˆ: server.addressinuse = アドレスãŒã™ã§ã«ä½¿ç”¨ã•れã¦ã„ã¾ã™! @@ -267,6 +287,9 @@ cancel = キャンセル openlink = リンクを開ã copylink = リンクをコピー back = 戻る +crash.export = クラッシュログを出力 +crash.none = クラッシュログãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +crash.exported = クラッシュログを出力ã—ã¾ã—ãŸã€‚ data.export = エクスãƒãƒ¼ãƒˆ data.import = インãƒãƒ¼ãƒˆ data.openfolder = データフォルダーを開ã @@ -283,13 +306,19 @@ cancelbuilding = [accent][[{0}][] é¸æŠžã‚’è§£é™¤ã™ã‚‹ selectschematic = [accent][[{0}][] é¸æŠžã—ã€ã‚³ãƒ”ーã™ã‚‹ pausebuilding = [accent][[{0}][] 建築を一時的ã«ä¸­æ–­ã™ã‚‹ resumebuilding = [scarlet][[{0}][] 建築をå†é–‹ã™ã‚‹ +showui = UI hidden.\nPress [accent][[{0}][] to show UI. wave = [accent]ウェーブ {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]次ã®ã‚¦ã‚§ãƒ¼ãƒ–ã¾ã§ {0} ç§’ wave.waveInProgress = [lightgray]ウェーブ進行中 waiting = [lightgray]待機中... waiting.players = プレイヤーを待ã£ã¦ã„ã¾ã™... wave.enemies = [lightgray]æ•µã¯æ®‹ã‚Š {0} 体 +wave.enemycores = [accent]{0}[lightgray] Enemy Cores +wave.enemycore = [accent]{0}[lightgray] Enemy Core wave.enemy = [lightgray]æ•µã¯æ®‹ã‚Š {0} 体 +wave.guardianwarn = [red][[警告][]ガーディアンãŒã‚㨠[accent]{0}[] ã‚¦ã‚§ãƒ¼ãƒ–ã§æ¥ã¾ã™ã€‚ +wave.guardianwarn.one = [red][[警告][]ガーディアンãŒã‚㨠[accent]{0}[] ã‚¦ã‚§ãƒ¼ãƒ–ã§æ¥ã¾ã™ã€‚ loadimage = ç”»åƒã‚’読ã¿è¾¼ã‚€ saveimage = ç”»åƒã‚’ä¿å­˜ unknown = 䏿˜Ž @@ -328,6 +357,7 @@ editor.generation = 生æˆ: editor.ingame = ゲーム内ã§ç·¨é›†ã™ã‚‹ editor.publish.workshop = ワークショップã§å…¬é–‹ editor.newmap = æ–°ã—ã„マップ +editor.center = Center workshop = ワークショップ waves.title = ウェーブ waves.remove = 削除 @@ -346,9 +376,10 @@ waves.invalid = クリップボードã®ã‚¦ã‚§ãƒ¼ãƒ–ã¯ç„¡åйãªã‚¦ã‚§ãƒ¼ãƒ–ã§ waves.copied = ウェーブをコピーã—ã¾ã—ãŸã€‚ waves.none = 敵ãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“。\n空ã®ã‚¦ã‚§ãƒ¼ãƒ–レイアウトã¯ãƒ‡ãƒ•ォルトã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã«è‡ªå‹•çš„ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#these are intentionally in lower case +wavemode.counts = æ•° +wavemode.totals = ç·æ•° +wavemode.health = ç·ä½“力 editor.default = [lightgray]<デフォルト> details = 詳細... @@ -416,6 +447,7 @@ filters.empty = [lightgray]フィルターãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“! 下㮠filter.distort = ゆãŒã¿ filter.noise = ノイズ filter.enemyspawn = 敵スãƒãƒ¼ãƒ³ã‚»ãƒ¬ã‚¯ãƒˆ +filter.spawnpath = Path To Spawn filter.corespawn = コアセレクト filter.median = メディアン filter.oremedian = メディアン (鉱石) @@ -440,6 +472,7 @@ filter.option.amount = é‡ filter.option.block = ブロック filter.option.floor = åœ°é¢ filter.option.flooronto = 対象ã®åœ°é¢ +filter.option.target = ターゲット filter.option.wall = å£ filter.option.ore = 鉱石 filter.option.floor2 = 2番目ã®åœ°é¢ @@ -456,6 +489,8 @@ load = 読ã¿è¾¼ã‚€ save = ä¿å­˜ fps = FPS: {0} ping = Ping: {0}ms +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb language.restart = ゲームをå†èµ·å‹•後ã€è¨€èªžè¨­å®šãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚ settings = 設定 tutorial = ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« @@ -469,31 +504,22 @@ locked = ロック complete = [lightgray]锿ˆæ¸ˆã¿: requirement.wave = {1} ã§ã‚¦ã‚§ãƒ¼ãƒ– {0} ã«åˆ°é” requirement.core = {0} ã®æ•µã®ã‚³ã‚¢ã‚’破壊 -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = å†é–‹:\n[lightgray]{0} -bestwave = [lightgray]最高ウェーブ: {0} -launch = < 発射 > -launch.text = Launch -launch.title = 発射æˆåŠŸ -launch.next = [lightgray]次㯠ウェーブ {0} ã§ç™ºå°„å¯èƒ½ã§ã™ã€‚ -launch.unable2 = [scarlet]発射ã§ãã¾ã›ã‚“。[] -launch.confirm = ã™ã¹ã¦ã®è³‡æºã‚’ã‚³ã‚¢ã«æ¬å…¥ã—ã€ç™ºå°„ã—ã¾ã™ã€‚\nã‚‚ã†ã“ã®åŸºåœ°ã«ã¯æˆ»ã£ã¦ãã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -launch.skip.confirm = スキップã™ã‚‹ã¨ã€æ¬¡ã®ç™ºå°„å¯èƒ½ãªã‚¦ã‚§ãƒ¼ãƒ–ã¾ã§ç™ºå°„ã§ãã¾ã›ã‚“。 +requirement.research = 研究 {0} +requirement.produce = ç²å¾— {0} +requirement.capture = 制圧 {0} +launch.text = 発射 +research.multiplayer = 研究ã§ãã‚‹ã®ã¯ãƒ›ã‚¹ãƒˆã®ã¿ã§ã™ã€‚ +map.multiplayer = ホストã®ã¿ãŒã‚»ã‚¯ã‚¿ãƒ¼ã‚’表示ã§ãã¾ã™ã€‚ uncover = 開放 configure = ç©ã¿è·ã®è¨­å®š -loadout = Loadout -resources = Resources + +loadout = ロードアウト +resources = è³‡æº bannedblocks = ç¦æ­¢ãƒ–ロック addall = ã™ã¹ã¦è¿½åŠ  +launch.from = [accent]{0}[] ã‹ã‚‰ã®ç™ºå°„ launch.destination = Destination: {0} configure.invalid = 値㯠0 ã‹ã‚‰ {0} ã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 -zone.unlocked = [lightgray]{0} ãŒã‚¢ãƒ³ãƒ­ãƒƒã‚¯ã•れã¾ã—ãŸ. -zone.requirement.complete = ウェーブ {0} ã‚’é”æˆ:\n{1} ã®é–‹æ”¾æ¡ä»¶ã‚’锿ˆã—ã¾ã—ãŸã€‚ -zone.resources = 発見ã—ãŸè³‡æº: -zone.objective = [lightgray]目標: [accent]{0} -zone.objective.survival = 敵ã‹ã‚‰ã‚³ã‚¢ã‚’守り切る -zone.objective.attack = 敵ã®ã‚³ã‚¢ã‚’破壊ã™ã‚‹ add = 追加... boss.health = ボスã®HP @@ -508,31 +534,65 @@ error.io = ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ error.any = 䏿˜Žãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ error.bloom = ブルームã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚\næã‚‰ãã‚ãªãŸã®ãƒ‡ãƒã‚¤ã‚¹ã§ã¯ãƒ–ルームãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = 雨 +weather.snow.name = 雪 +weather.sandstorm.name = ç ‚åµ +weather.sporestorm.name = 胞å­åµ +weather.fog.name = 霧 -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select +sectors.unexplored = [lightgray]æœªè¸æŸ» +sectors.resources = 資æº: +sectors.production = 生産: +sectors.export = æ¬å‡º: +sectors.time = 時間: +sectors.threat = è„…å¨: +sectors.wave = ウェーブ: +sectors.stored = ä¿å­˜æ¸ˆã¿: +sectors.resume = å†é–‹ +sectors.launch = 打ã¡ä¸Šã’ +sectors.select = é¸æŠž sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = セクターåを変更 +sectors.enemybase = [scarlet]敵基地 +sectors.vulnerable = [scarlet]Vulnerable +sectors.underattack = [scarlet]攻撃をå—ã‘ã¾ã™! [accent]{0}% ç ´æ +sectors.survives = [accent]{0} ウェーブ生存 +sectors.go = Go +sector.curcapture = 制圧ã—ãŸã‚»ã‚¯ã‚¿ãƒ¼ +sector.curlost = 失ã‚れãŸã‚»ã‚¯ã‚¿ãƒ¼ +sector.missingresources = [scarlet]資æºãŒè¶³ã‚Šã¾ã›ã‚“ +sector.attacked = セクター [accent]{0}[white] ãŒæ”»æ’ƒã‚’å—ã‘ã¦ã„ã¾ã™! +sector.lost = セクター [accent]{0}[white] 喪失! +#note: the missing space in the line below is intentional +sector.captured = セクター [accent]{0}[white]制圧! -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = 低 +threat.medium = 中 +threat.high = 高 +threat.extreme = éŽæ¿€ +threat.eradication = 根絶 + +planets = 惑星 + +planet.serpulo.name = セルプロ +planet.sun.name = 太陽 + +sector.impact0078.name = インパクト 0078 +sector.groundZero.name = グラウンド · ゼロ +sector.craters.name = ã‚¶ · クレーター +sector.frozenForest.name = フローズン · フォレスト +sector.ruinousShores.name = ルーイナス · ショアーズ +sector.stainedMountains.name = ステインド · マウンテン +sector.desolateRift.name = ディサレット · リフト +sector.nuclearComplex.name = ニュークリア · プロダクション · コンプレックス +sector.overgrowth.name = オーãƒãƒ¼ã‚°ãƒ­ã‚¦ã‚¹ +sector.tarFields.name = ター · フィールズ +sector.saltFlats.name = ソルト · フラッツ +sector.fungalPass.name = ファングル · パス +sector.biomassFacility.name = Biomass Synthesis Facility +sector.windsweptIslands.name = Windswept Islands +sector.extractionOutpost.name = Extraction Outpost +sector.planetaryTerminal.name = Planetary Launch Terminal sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.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. @@ -545,6 +605,11 @@ sector.tarFields.description = The outskirts of an oil production zone, between sector.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. sector.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. sector.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. +sector.biomassFacility.description = The origin of spores. This is the facility in which they were researched and initially produced.\nResearch the technology contained within. Cultivate spores for the production of fuel and plastics.\n\n[lightgray]Upon this facility's demise, the spores were released. Nothing in the local ecosystem could compete with such an invasive organism. +sector.windsweptIslands.description = Further past the shoreline is this remote chain of islands. Records show they once had [accent]Plastanium[]-producing structures.\n\nFend off the enemy's naval units. Establish a base on the islands. Research these factories. +sector.extractionOutpost.description = A remote outpost, constructed by the enemy for the purpose of launching resources to other sectors.\n\nCross-sector transport technology is essential for further conquest. Destroy the base. Research their Launch Pads. +sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology. +sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure. settings.language = 言語 settings.data = ゲームデータ @@ -558,61 +623,96 @@ settings.graphics = グラフィック settings.cleardata = データを削除... settings.clear.confirm = データを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?\nã“ã‚Œã‚’å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“! settings.clearall.confirm = [scarlet]警告![]\nã“れã¯ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãŒå‰Šé™¤ã•れã¾ã™ã€‚ã“れã«ã¯ã‚»ãƒ¼ãƒ–データã€ãƒžãƒƒãƒ—ã€ã‚¢ãƒ³ãƒ­ãƒƒã‚¯ã€ã‚­ãƒ¼ãƒã‚¤ãƒ³ãƒ‰ãŒå«ã¾ã‚Œã¾ã™ã€‚\n「ok〠を押ã™ã¨ã€ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãŒå‰Šé™¤ã•れã€è‡ªå‹•çš„ã«çµ‚了ã—ã¾ã™ã€‚ -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = カスタムプレイã®ã‚»ãƒ¼ãƒ–データをã™ã¹ã¦å‰Šé™¤ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ +settings.clearsaves = セーブデータを削除 +settings.clearresearch = 研究リセット +settings.clearresearch.confirm = キャンペーンã®ç ”ç©¶ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ +settings.clearcampaignsaves = キャンペーンã®ãƒªã‚»ãƒƒãƒˆ +settings.clearcampaignsaves.confirm = キャンペーンã®ã‚»ãƒ¼ãƒ–データをã™ã¹ã¦å‰Šé™¤ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ paused = [accent]< ãƒãƒ¼ã‚º > clear = 消去 banned = [scarlet]ä½¿ç”¨ç¦æ­¢ -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = ã¯ã„ no = ã„ã„㈠info.title = 情報 error.title = [crimson]エラーãŒç™ºç”Ÿã—ã¾ã—㟠error.crashtitle = エラーãŒç™ºç”Ÿã—ã¾ã—㟠-unit.nobuild = [scarlet]ユニットを構築ã§ãã¾ã›ã‚“ -blocks.input = æ¬å…¥ -blocks.output = æ¬å‡º -blocks.booster = ブースト -blocks.tiles = å¿…è¦ãªã‚¿ã‚¤ãƒ« -blocks.affinities = 親和性 +unit.nobuild = [scarlet]構築ä¸å¯ +lastaccessed = [lightgray]最終アクセス {0} block.unknown = [lightgray]??? -blocks.powercapacity = é›»åŠ›å®¹é‡ -blocks.powershot = 電力/ショット -blocks.damage = ダメージ -blocks.targetsair = 対空攻撃 -blocks.targetsground = 対地攻撃 -blocks.itemsmoved = 輸é€é€Ÿåº¦ -blocks.launchtime = 発射ã®å¾…機時間 -blocks.shootrange = 範囲 -blocks.size = 大ãã• -blocks.displaysize = Display Size -blocks.liquidcapacity = æ¶²ä½“å®¹é‡ -blocks.powerrange = 電力範囲 -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 最大接続数 -blocks.poweruse = é›»åŠ›ä½¿ç”¨é‡ -blocks.powerdamage = 電力/ダメージ -blocks.itemcapacity = ã‚¢ã‚¤ãƒ†ãƒ å®¹é‡ -blocks.basepowergeneration = åŸºæœ¬ç™ºé›»é‡ -blocks.productiontime = 製造速度 -blocks.repairtime = ブロックã®å®Œå…¨ä¿®å¾©é€Ÿåº¦ -blocks.speedincrease = 速度å‘上 -blocks.range = 範囲 -blocks.drilltier = ドリル -blocks.drillspeed = 基本採掘速度 -blocks.boosteffect = ブースト効果 -blocks.maxunits = 最大ユニット数 -blocks.health = è€ä¹…値 -blocks.buildtime = 建設時間 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = 建設費用 -blocks.inaccuracy = 誤差 -blocks.shots = ショット -blocks.reload = リロード速度 -blocks.ammo = 弾薬 -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = 説明 +stat.input = æ¬å…¥ +stat.output = æ¬å‡º +stat.booster = ブースト +stat.tiles = å¿…è¦ãªã‚¿ã‚¤ãƒ« +stat.affinities = 親和性 +stat.powercapacity = é›»åŠ›å®¹é‡ +stat.powershot = 電力/ショット +stat.damage = ダメージ +stat.targetsair = 対空攻撃 +stat.targetsground = 対地攻撃 +stat.itemsmoved = 輸é€é€Ÿåº¦ +stat.launchtime = 発射ã®å¾…機時間 +stat.shootrange = 範囲 +stat.size = 大ãã• +stat.displaysize = ç”»é¢ã‚µã‚¤ã‚º +stat.liquidcapacity = æ¶²ä½“å®¹é‡ +stat.powerrange = 電力範囲 +stat.linkrange = 接続範囲 +stat.instructions = 命令数 +stat.powerconnections = 最大接続数 +stat.poweruse = é›»åŠ›ä½¿ç”¨é‡ +stat.powerdamage = 電力/ダメージ +stat.itemcapacity = ã‚¢ã‚¤ãƒ†ãƒ å®¹é‡ +stat.memorycapacity = ãƒ¡ãƒ¢ãƒªãƒ¼å®¹é‡ +stat.basepowergeneration = åŸºæœ¬ç™ºé›»é‡ +stat.productiontime = 製造速度 +stat.repairtime = ブロックã®å®Œå…¨ä¿®å¾©é€Ÿåº¦ +stat.weapons = 武器 +stat.bullet = 弾丸 +stat.speedincrease = 速度å‘上 +stat.range = 範囲 +stat.drilltier = ドリル +stat.drillspeed = 基本採掘速度 +stat.boosteffect = ブースト効果 +stat.maxunits = 最大ユニット数 +stat.health = è€ä¹…値 +stat.buildtime = 建設時間 +stat.maxconsecutive = Max Consecutive +stat.buildcost = 建設費用 +stat.inaccuracy = 誤差 +stat.shots = ショット +stat.reload = リロード速度 +stat.ammo = 弾薬 +stat.shieldhealth = シールド +stat.cooldowntime = クールタイム +stat.explosiveness = 爆発性 +stat.basedeflectchance = å射確率 +stat.lightningchance = 電撃確率 +stat.lightningdamage = 電撃ダメージ +stat.flammability = å¯ç‡ƒæ€§ +stat.radioactivity = 放射能 +stat.heatcapacity = ç†±å®¹é‡ +stat.viscosity = 粘度 +stat.temperature = 温度 +stat.speed = 速度 +stat.buildspeed = 建築速度 +stat.minespeed = 採掘速度 +stat.minetier = 採掘 +stat.payloadcapacity = ç©è¼‰å®¹é‡ +stat.commandlimit = 指æ®ä¸Šé™ +stat.abilities = 能力 +stat.canboost = ブーストå¯èƒ½ +stat.flying = 飛行 +stat.ammouse = 使用弾薬 + +ability.forcefield = フォースフィールド +ability.repairfield = リペアフィールド +ability.statusfield = ステータスフィールド +ability.unitspawn = {0} 生産 +ability.shieldregenfield = シールドリペアフィールド +ability.movelightning = ムーブメントライトニング bar.drilltierreq = より高性能ãªãƒ‰ãƒªãƒ«ã‚’使用ã—ã¦ãã ã•ã„ bar.noresources = Missing Resources @@ -624,10 +724,10 @@ bar.powerbalance = 電力å‡è¡¡: {0}/ç§’ bar.powerstored = ç·è“„é›»é‡: {0}/{1} bar.poweramount = è“„é›»é‡: {0} bar.poweroutput = 発電é‡: {0} +bar.powerlines = 接続数: {0}/{1} bar.items = アイテム: {0} bar.capacity = 容é‡: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = 液体 bar.heat = 熱 bar.power = 電力 @@ -635,19 +735,27 @@ bar.progress = å»ºè¨­çŠ¶æ³ bar.input = 入力 bar.output = 出力 +units.processorcontrol = [lightgray]プロセッサーã®åˆ¶å¾¡ä¸‹ + bullet.damage = [stat]{0}[lightgray] ダメージ bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ ç´„[stat] {1}[lightgray] タイル bullet.incendiary = [stat]焼夷弾 +bullet.sapping = [stat]sapping bullet.homing = [stat]追尾弾 bullet.shock = [stat]電撃 bullet.frag = [stat]爆発弾 +bullet.buildingdamage = [stat]{0}%[lightgray] 対物ダメージ bullet.knockback = [stat]{0}[lightgray] ノックãƒãƒƒã‚¯ +bullet.pierce = [stat]{0}[lightgray]x レーザー弾 +bullet.infinitepierce = [stat]レーザー弾 +bullet.healpercent = [stat]{0}[lightgray]% 回復 bullet.freezing = [stat]å‡çµ bullet.tarred = [stat]タール弾 bullet.multiplier = [stat]弾薬 {0}[lightgray]å€ bullet.reload = [stat]リロード速度 {0}[lightgray]å€ unit.blocks = ブロック +unit.blockssquared = ブロック² unit.powersecond = 電力/ç§’ unit.liquidsecond = 液体/ç§’ unit.itemssecond = アイテム/ç§’ @@ -655,22 +763,24 @@ unit.liquidunits = 液体 unit.powerunits = 電力 unit.degrees = 度 unit.seconds = ç§’ -unit.minutes = mins +unit.minutes = 分 unit.persecond = /ç§’ -unit.perminute = /min +unit.perminute = /分 unit.timesspeed = å€ã®é€Ÿåº¦ unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = シールド unit.items = アイテム unit.thousands = k unit.millions = mil unit.billions = b +unit.pershot = /発 +category.purpose = 説明 category.general = 一般 category.power = 電力 category.liquids = 液体 category.items = アイテム category.crafting = æ¬å…¥/æ¬å‡º -category.shooting = ショット +category.function = 役割 category.optional = 強化オプション setting.landscape.name = 横画é¢ã§å›ºå®š setting.shadows.name = å½± @@ -678,8 +788,8 @@ setting.blockreplace.name = è‡ªå‹•ãƒ–ãƒ­ãƒƒã‚¯ææ¡ˆ setting.linear.name = リニアフィルター setting.hints.name = ヒント setting.flow.name = è³‡æºæµé€šé‡ã®è¡¨ç¤º +setting.backgroundpause.name = ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ä¸€æ™‚åœæ­¢ä¸­ setting.buildautopause.name = オートãƒãƒ¼ã‚ºãƒ“ルディング -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = æµä½“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ setting.animatedshields.name = シールドã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ setting.antialias.name = アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹[lightgray] (å†èµ·å‹•ãŒå¿…è¦)[] @@ -707,17 +817,15 @@ setting.conveyorpathfinding.name = コンベアーé…置経路探索 setting.sensitivity.name = æ“作感度 setting.saveinterval.name = 自動ä¿å­˜é–“éš” setting.seconds = {0} ç§’ -setting.blockselecttimeout.name = ãƒ–ãƒ­ãƒƒã‚¯é¸æŠžã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ setting.milliseconds = {0} milliseconds setting.fullscreen.name = フルスクリーン setting.borderlesswindow.name = 境界ã®ç„¡ã„ウィンドウ[lightgray] (å†èµ·å‹•ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™) setting.fps.name = FPSを表示 -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = ãƒ–ãƒ­ãƒƒã‚¯é¸æŠžã‚­ãƒ¼ã‚’è¡¨ç¤º +setting.smoothcamera.name = スムーズãªã‚«ãƒ¡ãƒ© setting.vsync.name = åž‚ç›´åŒæœŸ setting.pixelate.name = ピクセル化[lightgray] (アニメーションãŒç„¡åŠ¹åŒ–ã•れã¾ã™) setting.minimap.name = ミニマップを表示 -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = コアã®è³‡æºã‚’表示 (WIP) setting.position.name = プレイヤーã®ä½ç½®è¡¨ç¤º setting.musicvol.name = 音楽 éŸ³é‡ setting.atmosphere.name = 惑星ã®å¤§æ°—を表示 @@ -733,7 +841,9 @@ setting.chatopacity.name = ãƒãƒ£ãƒƒãƒˆã®é€æ˜Žåº¦ setting.lasersopacity.name = レーザーã®é€æ˜Žåº¦ setting.bridgeopacity.name = ブリッジã®é€æ˜Žåº¦ setting.playerchat.name = ゲーム内ã«ãƒãƒ£ãƒƒãƒˆã‚’表示 +setting.showweather.name = 天気ã®ã‚°ãƒ©ãƒ•ィックを表示 public.confirm = ゲームを公開ã—ã¾ã™ã‹ï¼Ÿ\n[accent]誰ã§ã‚‚ゲームã«å‚加ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚\n[lightgray]ã‚ã¨ã‹ã‚‰è¨­å®šã§å¤‰æ›´ã§ãã¾ã™ã€‚ +public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]? public.beta = ベータ版ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。 uiscale.reset = UIサイズãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚\nã“ã®ã¾ã¾ã§ã‚ˆã‘れã°ã€ŒOKã€ã‚’押ã—ã¦ãã ã•ã„。\n[scarlet][accent]{0}[] ç§’ã§å…ƒã®è¨­å®šã«æˆ»ã‚Šã¾ã™... uiscale.cancel = キャンセル & 終了 @@ -743,11 +853,11 @@ keybinds.mobile = [scarlet]モãƒã‚¤ãƒ«ã§ã¯å¤šãã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ãƒ‰ãŒæ©Ÿ category.general.name = 一般 category.view.name = 表示 category.multiplayer.name = マルãƒãƒ—レイ -category.blocks.name = Block Select +category.blocks.name = ブロックセレクト command.attack = 攻撃 command.rally = çµé›† command.retreat = 後退 -command.idle = Idle +command.idle = 待機 placement.blockselectkeys = \n[lightgray]キー: [{0}, keybind.respawn.name = リスãƒãƒ¼ãƒ³ keybind.control.name = ユニットをコントロール @@ -760,7 +870,7 @@ keybind.toggle_block_status.name = ブロックã®çŠ¶æ…‹è¡¨ç¤ºã®åˆ‡ã‚Šæ›¿ãˆ keybind.move_x.name = å·¦å³ç§»å‹• keybind.move_y.name = 上下移動 keybind.mouse_move.name = マウスを追ㆠ-keybind.pan.name = Pan View +keybind.pan.name = パン keybind.boost.name = ブースト keybind.schematic_select.name = 地域ã®é¸æŠž keybind.schematic_menu.name = 設計図メニュー @@ -788,15 +898,17 @@ keybind.diagonal_placement.name = æ–œã‚設置 keybind.pick.name = ブロックã®é¸æŠž keybind.break_block.name = ブロックã®ç ´å£Š keybind.deselect.name = é¸æŠžè§£é™¤ -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = 貨物を拾ㆠ+keybind.dropCargo.name = 貨物をé™ã‚ã™ +keybind.command.name = æŒ‡æ® keybind.shoot.name = ショット keybind.zoom.name = ズーム keybind.menu.name = メニュー keybind.pause.name = ãƒãƒ¼ã‚º keybind.pause_building.name = 建築ã®ãƒãƒ¼ã‚º/レジューム keybind.minimap.name = ミニマップ +keybind.planet_map.name = 惑星地図 +keybind.research.name = 研究 keybind.chat.name = ãƒãƒ£ãƒƒãƒˆ keybind.player_list.name = プレイヤーリスト keybind.console.name = コンソール @@ -806,6 +918,7 @@ keybind.toggle_menus.name = メニュー切り替㈠keybind.chat_history_prev.name = å‰ã®ãƒãƒ£ãƒƒãƒˆå±¥æ­´ keybind.chat_history_next.name = 次ã®ãƒãƒ£ãƒƒãƒˆå±¥æ­´ keybind.chat_scroll.name = ãƒãƒ£ãƒƒãƒˆã‚¹ã‚¯ãƒ­ãƒ¼ãƒ« +keybind.chat_mode.name = Change Chat Mode keybind.drop_unit.name = ドロップユニット keybind.zoom_minimap.name = ミニマップã®ã‚ºãƒ¼ãƒ  mode.help.title = モード説明 @@ -822,13 +935,14 @@ mode.custom = カスタムルール rules.infiniteresources = 資æºã®ç„¡é™åŒ– rules.reactorexplosions = リアクターã®çˆ†ç™º +rules.schematic = è¨­è¨ˆå›³ã‚’è¨±å¯ rules.wavetimer = ウェーブã®è‡ªå‹•進行 rules.waves = ウェーブ rules.attack = アタックモード -rules.buildai = AI Building +rules.buildai = AI 建築 rules.enemyCheat = 敵(赤ãƒãƒ¼ãƒ )ã®è³‡æºã®ç„¡é™åŒ– rules.blockhealthmultiplier = ブロックã®ä½“力å€çއ -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = ブロックã®ãƒ€ãƒ¡ãƒ¼ã‚¸å€çއ rules.unitbuildspeedmultiplier = ユニットã®è£½é€ é€Ÿåº¦å€çއ rules.unithealthmultiplier = ユニットã®ä½“力å€çއ rules.unitdamagemultiplier = ユニットã®ãƒ€ãƒ¡ãƒ¼ã‚¸å€çއ @@ -839,25 +953,29 @@ rules.buildspeedmultiplier = 建設速度ã®å€çއ rules.deconstructrefundmultiplier = ブロック破壊時ã®é‚„å…ƒå€çއ rules.waitForWaveToEnd = 敵ãŒå€’ã•れるã¾ã§ã‚¦ã‚§ãƒ¼ãƒ–ã®é€²è¡Œã‚’中断 rules.dropzoneradius = 出ç¾ç¯„囲ã®åŠå¾„:[lightgray] (タイル) -rules.unitammo = Units Require Ammo +rules.unitammo = ユニットã¯å¼¾ä¸¸ãŒå¿…è¦ rules.title.waves = ウェーブ rules.title.resourcesbuilding = è³‡æº & 建設 rules.title.enemy = 敵 rules.title.unit = ユニット rules.title.experimental = 実験的ãªã‚²ãƒ¼ãƒ ãƒ—レイ -rules.title.environment = Environment +rules.title.environment = 環境 rules.lighting = 霧 +rules.enemyLights = Enemy Lights rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.explosions = 爆発ダメージ rules.ambientlight = 霧ã®è‰² -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = 気象 +rules.weather.frequency = 頻度: +rules.weather.always = Always +rules.weather.duration = 継続時間: content.item.name = アイテム content.liquid.name = 液体 content.unit.name = ユニット content.block.name = ブロック +content.sector.name = セクター + item.copper.name = 銅 item.lead.name = 鉛 item.coal.name = 石炭 @@ -879,79 +997,64 @@ liquid.slag.name = スラグ liquid.oil.name = 石油 liquid.cryofluid.name = 冷崿°´ -item.explosiveness = [lightgray]爆発性: {0}% -item.flammability = [lightgray]å¯ç‡ƒæ€§: {0}% -item.radioactivity = [lightgray]放射能: {0}% - -unit.health = [lightgray]è€ä¹…値: {0} -unit.speed = [lightgray]速度: {0} -unit.weapon = [lightgray]武器: {0} -unit.itemcapacity = [lightgray]アイテム容é‡: {0} -unit.minespeed = [lightgray]採掘速度: {0}% -unit.minepower = [lightgray]採掘性能: {0} -unit.ability = [lightgray]能力: {0} -unit.buildspeed = [lightgray]建築速度: {0}% - -liquid.heatcapacity = [lightgray]熱容é‡: {0} -liquid.viscosity = [lightgray]粘度: {0} -liquid.temperature = [lightgray]温度: {0} - unit.dagger.name = ダガー -unit.mace.name = Mace +unit.mace.name = メイス unit.fortress.name = フォートレス -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar +unit.nova.name = ノヴァ +unit.pulsar.name = パルサー +unit.quasar.name = クエーサー unit.crawler.name = クローラー -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.atrax.name = アトラックス +unit.spiroct.name = スパイロクト +unit.arkyid.name = アーキッド +unit.toxopid.name = トキソピッド +unit.flare.name = フレア +unit.horizon.name = ホライゾン +unit.zenith.name = ゼニス +unit.antumbra.name = アンタンブラ +unit.eclipse.name = エクリプス +unit.mono.name = モノ +unit.poly.name = ãƒãƒª +unit.mega.name = メガ +unit.quad.name = クアッド +unit.oct.name = オクト +unit.risso.name = リッソ +unit.minke.name = ミンク +unit.bryde.name = ブライド +unit.sei.name = セイ +unit.omura.name = オムラ +unit.alpha.name = アルファ +unit.beta.name = ベータ +unit.gamma.name = ガンマ +unit.scepter.name = セプター +unit.reign.name = レイン +unit.vela.name = ヴェラ +unit.corvus.name = コーãƒã‚¹ -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax +block.resupply-point.name = 補給ãƒã‚¤ãƒ³ãƒˆ +block.parallax.name = パララックス block.cliff.name = å´– block.sand-boulder.name = 巨大ãªç¤« +block.basalt-boulder.name = 玄武岩ã®ç¤« block.grass.name = è‰ block.slag.name = スラグ +block.space.name = Space block.salt.name = 岩塩氷河 -block.salt-wall.name = Salt Wall +block.salt-wall.name = å¡©ã®å£ block.pebbles.name = å°çŸ³ block.tendrils.name = ã¤ã‚‹ -block.sand-wall.name = Sand Wall +block.sand-wall.name = ç ‚ã®å£ block.spore-pine.name = 胞å­ã®æ¾ã®æœ¨ -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = 胞å­ã®å£ +block.boulder.name = 礫 +block.snow-boulder.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.shale-wall.name = Shale Wall +block.shale-wall.name = æ³¥æ¿å²© block.scrap-wall.name = スクラップã®å£ block.scrap-wall-large.name = 大ããªã‚¹ã‚¯ãƒ©ãƒƒãƒ—ã®å£ block.scrap-wall-huge.name = ã¨ã¦ã‚‚大ããªã‚¹ã‚¯ãƒ©ãƒƒãƒ—ã®å£ @@ -979,17 +1082,18 @@ block.craters.name = クレーター block.sand-water.name = æ¿ã£ãŸæ°´ block.darksand-water.name = é»’ã„ç ‚ã§æ¿ã£ãŸæ°´ block.char.name = 焦ã’è·¡ -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = デイサイト +block.dacite-wall.name = デイサイトã®å£ +block.dacite-boulder.name = デイサイトã®ç¤« block.ice-snow.name = 雪氷 -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = 石ã®å£ +block.ice-wall.name = æ°·ã®å£ +block.snow-wall.name = 雪ã®å£ +block.dune-wall.name = 砂丘ã®å£ block.pine.name = æ¾ã®æœ¨ -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = æ³¥ +block.dirt-wall.name = æ³¥ã®å£ +block.mud.name = 汚泥 block.white-tree-dead.name = ç™½ã„æž¯ã‚ŒãŸæ¨¹æœ¨ block.white-tree.name = ç™½ã„æ¨¹æœ¨ block.spore-cluster.name = 胞å­ã®æˆ¿ @@ -1005,7 +1109,7 @@ block.dark-panel-4.name = ダークパãƒãƒ« 4 block.dark-panel-5.name = ダークパãƒãƒ« 5 block.dark-panel-6.name = ダークパãƒãƒ« 6 block.dark-metal.name = ダークメタル -block.basalt.name = Basalt +block.basalt.name = 玄武岩 block.hotrock.name = ホットロック block.magmarock.name = マグマã®å²© block.copper-wall.name = 銅ã®å£ @@ -1029,7 +1133,6 @@ block.conveyor.name = コンベアー block.titanium-conveyor.name = ãƒã‚¿ãƒ³ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ block.plastanium-conveyor.name = プラスタニウムコンベアー block.armored-conveyor.name = 装甲コンベアー -block.armored-conveyor.description = ãƒã‚¿ãƒ³ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ã¨åŒã˜é€Ÿåº¦ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’輸é€ã™ã‚‹ã“ã¨ãŒã§ãã€è€ä¹…性ã«å„ªã‚Œã¦ã„ã¾ã™ã€‚\nã¾ãŸã€ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ä»¥å¤–ã«ã‚ˆã‚‹å´é¢ã¸ã®å…¥åŠ›ã‚’å—ã‘入れã¾ã›ã‚“。 block.junction.name = ジャンクション block.router.name = ルーター block.distributor.name = ディストリビューター @@ -1037,7 +1140,6 @@ block.sorter.name = ソーター block.inverted-sorter.name = å転ソーター block.message.name = メッセージブロック block.illuminator.name = イルミãƒãƒ¼ã‚¿ãƒ¼ -block.illuminator.description = コンパクトãªå…‰æºã§ã™ã€‚電力ãŒå¿…è¦ã§ã™ã€‚ block.overflow-gate.name = オーãƒãƒ¼ãƒ•ローゲート block.underflow-gate.name = アンダーフローゲート block.silicon-smelter.name = シリコン溶鉱炉 @@ -1075,6 +1177,7 @@ block.power-source.name = ç„¡é™é›»æº block.unloader.name = æ¬å‡ºæ©Ÿ block.vault.name = ボールト block.wave.name = ウェーブ +block.tsunami.name = ツナミ block.swarmer.name = スウォーマー block.salvo.name = サルボー block.ripple.name = リップル @@ -1114,31 +1217,38 @@ block.arc.name = アーク block.rtg-generator.name = RTG発電機 block.spectre.name = スペクター block.meltdown.name = メルトダウン +block.foreshadow.name = フォーシャドウ block.container.name = コンテナー block.launch-pad.name = ç™ºå°„å° block.launch-pad-large.name = å¤§åž‹ç™ºå°„å° -block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory +block.segment.name = セグメント +block.command-center.name = å¸ä»¤å¡” +block.ground-factory.name = 陸è»å·¥å ´ +block.air-factory.name = 空è»å·¥å ´ +block.naval-factory.name = æµ·è»å·¥å ´ block.additive-reconstructor.name = Additive Reconstructor block.multiplicative-reconstructor.name = Multiplicative Reconstructor block.exponential-reconstructor.name = Exponential Reconstructor block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.payload-conveyor.name = マスコンベアー +block.payload-router.name = ペイロードルーター +block.disassembler.name = ディスアセンブラー +block.silicon-crucible.name = シリコンクルーシブル +block.overdrive-dome.name = 加速ドーム +#experimental, may be removed +block.block-forge.name = ブロックフォージ +block.block-loader.name = ブロックç©è¼‰æ©Ÿ +block.block-unloader.name = ブロックæ¬å‡ºæ©Ÿ +block.interplanetary-accelerator.name = 惑星間加速器 -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = スイッム+block.micro-processor.name = マイクロプロセッサー +block.logic-processor.name = ロジックプロセッサー +block.hyper-processor.name = ãƒã‚¤ãƒ‘ープロセッサー +block.logic-display.name = ロジックディスプレイ +block.large-logic-display.name = 大型ロジックディスプレイ +block.memory-cell.name = メモリーセル +block.memory-bank.name = メモリーãƒãƒ³ã‚¯ team.blue.name = ブルー team.crux.name = レッド @@ -1148,49 +1258,76 @@ team.derelict.name = 廃墟 team.green.name = グリーン team.purple.name = パープル -tutorial.next = [lightgray]<タップã—ã¦ç¶šã‘ã‚‹> -tutorial.intro = [scarlet]Mindustry ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«[]ã¸ã‚ˆã†ã“ã。\nã¾ãšã¯ã€ã‚³ã‚¢ã®è¿‘ãã«ã‚る銅鉱石をタップã—ã¦ã€[accent]銅を採掘[]ã—ã¦ã¿ã¾ã—ょã†ã€‚\n\n[accent]銅: {0}/{1} -tutorial.intro.mobile = [scarlet]Mindustry ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«[]ã¸ã‚ˆã†ã“ã。\nç”»é¢ã‚’スワイプã§ç§»å‹•ã—ã¾ã™ã€‚\n2æœ¬ã®æŒ‡ã§ã¤ã¾ã‚“ã§æ‹¡å¤§ · 縮å°ã—ã¾ã™ã€‚\nã¾ãšã¯ã€ã‚³ã‚¢ã®è¿‘ãã«ã‚る銅鉱石をタップã—ã¦ã€[accent]銅を採掘[]ã—ã¦ã¿ã¾ã—ょã†ã€‚\n\n[accent]銅: {0}/{1} -tutorial.drill = æ‰‹å‹•ã§æŽ¡æŽ˜ã™ã‚‹ã®ã¯éžåŠ¹çŽ‡çš„ã§ã™ã€‚\n[accent]ドリル[]を使ãˆã°è‡ªå‹•ã§æŽ¡æŽ˜ã§ãã¾ã™ã€‚\nå³ä¸‹ã«ã‚るドリルã®ã‚¿ãƒ–をクリックã—ã¦ã€\n[accent]機械ドリル[]ã‚’é¸æŠžã—ã¦ã€éŠ…é‰±è„ˆã«è¨­ç½®ã—ã¦ã¿ã¾ã—ょã†ã€‚\n[accent]å³ã‚¯ãƒªãƒƒã‚¯[]ã§å»ºè¨­ã‚’æ­¢ã‚ã‚‹ã“ã¨ãŒã§ãã€[accent]Ctrlキーを押ã—ãªãŒã‚‰ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«[]ã™ã‚‹ã“ã¨ã§ã€ã‚ºãƒ¼ãƒ ãŒã§ãã¾ã™ã€‚ -tutorial.drill.mobile = æ‰‹å‹•ã§æŽ¡æŽ˜ã™ã‚‹ã®ã¯éžåŠ¹çŽ‡çš„ã§ã™ã€‚\n[accent]ドリル[]を使ãˆã°è‡ªå‹•ã§æŽ¡æŽ˜ã§ãã¾ã™ã€‚\nå³ä¸‹ã«ã‚るドリルã®ã‚¿ãƒ–をタップã—ã¦ã€\n[accent]機械ドリル[]ã‚’é¸æŠžã—ã¾ã—ょã†ã€‚\nタップã§ãƒ‰ãƒªãƒ«ã‚’銅鉱脈ã«é…ç½®ã—ãŸã‚‰ã€ä¸‹ã«ã‚ã‚‹[accent]ãƒã‚§ãƒƒã‚¯ãƒžãƒ¼ã‚¯[]を押ã™ã“ã¨ã§ã€å»ºè¨­ãŒé–‹å§‹ã•れã¾ã™ã€‚\n[accent]X ボタン[]ã§å»ºè¨­ã‚’キャンセルã§ãã¾ã™ã€‚ -tutorial.blockinfo = ãれãžã‚Œã®ãƒ–ロックã«ã¯ç•°ãªã‚‹æ€§è³ªãŒã‚りã¾ã™ã€‚特定ã®ãƒ‰ãƒªãƒ«ã§ã—ã‹æŽ¡æŽ˜ã§ããªã„鉱石もã‚りã¾ã™ã€‚\nãƒ–ãƒ­ãƒƒã‚¯ã®æƒ…報や性質を知りãŸã‹ã£ãŸã‚‰ã€[accent]ビルドメニューã«ã‚ã‚‹ "?" ボタンを押ã—ã¦ãã ã•ã„。[]\n\n[accent]æ©Ÿæ¢°ãƒ‰ãƒªãƒ«ã®æ€§è³ªã‚’見ã¦ã¿ã¾ã—ょã†ã€‚[] -tutorial.conveyor = [accent]コンベアー[]ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’コアã«è¼¸é€ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\nドリルã‹ã‚‰ã‚³ã‚¢ã¾ã§ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ä½œã‚Šã¾ã—ょã†ã€‚\n[accent]マウスをクリックã—ãªãŒã‚‰å‹•ã‹ã™ã“ã¨ã§ã€ç·šã‚’引ãã“ã¨ãŒã§ãã¾ã™ã€‚[]\n[accent]Ctrlキー[]を押ã—ãªãŒã‚‰ç·šã‚’引ãã¨ã€æ–œã‚ã«ç·šãŒå¼•ã‘ã¾ã™ã€‚\n\n[accent]ラインツールã§2ã¤ã®ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ã‚’設置ã—ã€ã‚³ã‚¢ã¾ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’輸é€ã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.conveyor.mobile = [accent]コンベアー[]ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’コアã«è¼¸é€ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\nドリルã‹ã‚‰ã‚³ã‚¢ã¾ã§ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ä½œã‚Šã¾ã—ょã†ã€‚\n[accent]指を数秒間押ã—ãŸã¾ã¾[]ドラッグã™ã‚‹ã“ã¨ã§ã€ä¸€ç›´ç·šã«é…ç½®ã§ãã¾ã™ã€‚\n\n[accent]ラインツールã§2ã¤ã®ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ã‚’設置ã—ã€ã‚³ã‚¢ã¾ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’輸é€ã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.turret = ã‚³ã‚¢ã«æ¬å…¥ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€å»ºç‰©ã®å»ºè¨­ã«åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\nå…¨ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒå»ºè¨­ã«åˆ©ç”¨ã§ãã‚‹ã‚ã‘ã§ã¯ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。\n[accent]石炭[]ã‚„[accent]スクラップ[]ã®ã‚ˆã†ãªå»ºè¨­ã«åˆ©ç”¨ã§ããªã„アイテムã¯ã€ã‚³ã‚¢ã«æ¬å…¥ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n[lightgray]敵[]を撃退ã™ã‚‹ãŸã‚ã«ã¯ã€é˜²è¡›ä½“制を整ãˆãªã‘れã°ãªã‚Šã¾ã›ã‚“。\nã‚ãªãŸã®æ‹ ç‚¹ã®è¿‘ãã«[accent]デュオ[]を設置ã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.drillturret = デュオã«ã¯å¼¾ã¨ã—ã¦[accent]銅ã®å¼¾è–¬[]ãŒå¿…è¦ã§ã™ã€‚\nデュオã®è¿‘ãã«ãƒ‰ãƒªãƒ«ã‚’設置ã—ã€æŽ¡æŽ˜ã—ãŸéŠ…ã‚’ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ã§ä¾›çµ¦ã—ã¦ã¿ã¾ã—ょã†ã€‚\n\n[accent]弾薬: 0/1 -tutorial.pause = ãƒãƒˆãƒ«ä¸­ã€[accent]ã‚²ãƒ¼ãƒ ã‚’ä¸€æ™‚åœæ­¢[]ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\nä¸€æ™‚åœæ­¢ä¸­ã€å»ºç‰©ã®å»ºè¨­ã¯ã‚­ãƒ¥ãƒ¼ã«è¿½åŠ ã•れã¾ã™ã€‚\n\n[accent]スペースキーã§ä¸€æ™‚åœæ­¢ã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.pause.mobile = ãƒãƒˆãƒ«ä¸­ã€[accent]ã‚²ãƒ¼ãƒ ã‚’ä¸€æ™‚åœæ­¢[]ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\nä¸€æ™‚åœæ­¢ä¸­ã€å»ºç‰©ã®å»ºè¨­ã¯ã‚­ãƒ¥ãƒ¼ã«è¿½åŠ ã•れã¾ã™ã€‚\n\n[accent]左上ã®ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ä¸€æ™‚åœæ­¢ã‚’ã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.unpause = ã‚‚ã†ä¸€åº¦ã‚¹ãƒšãƒ¼ã‚¹ã‚­ãƒ¼ã‚’押ã—ã¦ã€ã‚²ãƒ¼ãƒ ã‚’å†é–‹ã—ã¾ã—ょã†ã€‚ -tutorial.unpause.mobile = ã‚‚ã†ä¸€åº¦ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã‚²ãƒ¼ãƒ ã‚’å†é–‹ã—ã¾ã—ょã†ã€‚ -tutorial.breaking = ブロックを破壊ã—ãŸã„時ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。\n[accent]å³ã‚¯ãƒªãƒƒã‚¯ã‚’押ã—ãŸã¾ã¾[]ç¯„å›²ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ã€ç¯„囲内ã®ã™ã¹ã¦ã®ãƒ–ロックãŒç ´å£Šã•れã¾ã™ã€‚\n\n[accent]コアã®è¿‘ãã«ã‚るスクラップブロックをã€å³ã‚¯ãƒªãƒƒã‚¯ã§é¸æŠžã—ã¦ç ´å£Šã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.breaking.mobile = ブロックを破壊ã—ãŸã„時ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。\n[accent]ç ´å£Šãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠž[]ã—ã¦ã€ç ´å£Šã—ãŸã„ブロックをタップã§é¸æŠžã—ã¾ã™ã€‚\n[accent]指を数秒間押ã—ãŸã¾ã¾[]ドラッグã™ã‚‹ã“ã¨ã§ã€ç ´å£Šã™ã‚‹ç¯„å›²ã‚’é¸æŠžã§ãã¾ã™ã€‚\nãƒã‚§ãƒƒã‚¯ãƒžãƒ¼ã‚¯ã®ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ç ´å£Šã—ã¾ã™ã€‚\n\n[accent]コアã®å·¦å´ã«ã‚ã‚‹ã‚¹ã‚¯ãƒ©ãƒƒãƒ—ãƒ–ãƒ­ãƒƒã‚¯ã‚’é¸æŠžã—ã¦ã€ç ´å£Šã—ã¦ã¿ã¾ã—ょã†ã€‚ -tutorial.withdraw = 状æ³ã«ã‚ˆã£ã¦ã¯ã€ãƒ–ロックã‹ã‚‰ç›´æŽ¥ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–り出ã™å¿…è¦ãŒã‚りã¾ã™ã€‚\nブロックã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–り出ã™ã«ã¯ã€å–り出ã—ãŸã„アイテムãŒå…¥ã£ã¦ã„ã‚‹[accent]ブロックをタップ[]ã—ã¦ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®ä¸­ã«ã‚ã‚‹[accent]アイテムをタップ[]ã—ã¾ã™ã€‚\n[accent]長押ã—ã™ã‚‹[]ã“ã¨ã§ã€è¤‡æ•°å€‹ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’引ã出ã™ã“ã¨ãŒã§ãã¾ã™ã€‚\n\n[accent]コアã‹ã‚‰ã„ãã¤ã‹ã®éŠ…ã‚’å–り出ã—ã¦ã¿ã¾ã—ょã†ã€‚[] -tutorial.deposit = 機体ã«ã‚るアイテムをドラッグアンドドロップã§ã€ãƒ–ロックã¸ç§»å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n\n[accent]コアã‹ã‚‰å–り出ã—ãŸéŠ…ã‚’ã‚³ã‚¢ã«æˆ»ã—ã¦ã¿ã¾ã—ょã†ã€‚[] -tutorial.waves = [lightgray]敵[]ãŒã‚„ã£ã¦ãã¾ã™ã€‚\n\n2ウェーブã®é–“コアを守ã£ã¦ã¿ã¾ã—ょã†ã€‚[accent]クリック[]ã§å¼¾ã‚’発射ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\nã•らã«ãƒ‰ãƒªãƒ«ã‚„デュオを設置ã—ã¾ã—ょã†ã€‚ã•らã«éŠ…ã‚’æŽ¡æŽ˜ã—ã¾ã—ょã†ã€‚ -tutorial.waves.mobile = [lightgray]敵[]ãŒã‚„ã£ã¦ãã¾ã™ã€‚\n\n2ウェーブã®é–“コアを守ã£ã¦ã¿ã¾ã—ょã†ã€‚ã‚ãªãŸã®æ©Ÿä½“ã¯è‡ªå‹•ã§æ•µã‚’攻撃ã—ã¦ãれã¾ã™ã€‚\nã•らã«ãƒ‰ãƒªãƒ«ã‚„デュオを設置ã—ã¾ã—ょã†ã€‚ã•らã«éŠ…ã‚’æŽ¡æŽ˜ã—ã¾ã—ょã†ã€‚ -tutorial.launch = 発射å¯èƒ½ãªã‚¦ã‚§ãƒ¼ãƒ–ã«é”ã™ã‚‹ã¨ã€[accent]コアã«ã‚ã‚‹å…¨ã¦ã®è³‡æºã‚’æŒã£ã¦[]ã€ãƒžãƒƒãƒ—ã‹ã‚‰[accent]離脱ã™ã‚‹[]ã“ã¨ãŒã§ãã¾ã™ã€‚\nã“れらã®è³‡æºã¯ã€æ–°ã—ã„æŠ€è¡“ã®ç ”ç©¶ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n\n[accent]発射ボタンを押ã—ã¾ã—ょã†ã€‚ +hint.skip = スキップ +hint.desktopMove = Use [accent][[WASD][] to move. +hint.zoom = [accent]Scroll[] to zoom in or out. +hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually. +hint.desktopShoot = [accent][[Left-click][] to shoot. +hint.depositItems = To transfer items, drag from your ship to the core. +hint.respawn = To respawn as a ship, press [accent][[V][]. +hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[] +hint.desktopPause = Press [accent][[Space][] to pause and unpause the game. +hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it. +hint.placeDrill.mobile = Select the \ue85e[accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm. +hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. +hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors. +hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them. +hint.breaking = [accent]Right-click[] and drag to break blocks. +hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection. +hint.research = Use the \ue875 [accent]Research[] button to research new technology. +hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology. +hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. +hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets. +hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right. +hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[]. +hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type. +hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path. +hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path. +hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters. +hint.command = Press [accent][[G][] to command nearby units of [accent]similar type[] into formation.\n\nTo command ground units, you must first control another ground unit. +hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation. +hint.payloadPickup = Press [accent][[[] to pick up small blocks or units. +hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up. +hint.payloadDrop = Press [accent]][] to drop a payload. +hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. +hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. +hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[]. +hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. +hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the ï¡© [accent]Shard[] core. Make sure it is free from nearby obstructions. +hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[]. +hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. +hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. item.copper.description = 便利ãªé‰±çŸ³ã§ã™ã€‚様々ãªãƒ–ãƒ­ãƒƒã‚¯ã®ææ–™ã¨ã—ã¦å¹…広ã使ã‚れã¦ã„ã¾ã™ã€‚ +item.copper.details = セルプロã«è±Šå¯Œãªé‡‘属。補強ã—ãªã„é™ã‚Šæ§‹é€ çš„ã«å¼±ã„。 item.lead.description = ä¸€èˆ¬çš„ã§æ‰‹è»½ãªé‰±çŸ³ã§ã™ã€‚機械や液体輸é€ãƒ–ロックãªã©ã«ä½¿ã‚れã¾ã™ã€‚ +item.lead.details = Dense. Inert. Extensively used in batteries.\nNote: Likely toxic to biological life forms. Not that there are many left here. item.metaglass.description = ã¨ã¦ã‚‚頑丈ãªå¼·åŒ–ガラスã§ã™ã€‚液体ã®è¼¸é€ã‚„タンクã¨ã—ã¦å¹…広ã使ã‚れã¦ã„ã¾ã™ã€‚ item.graphite.description = 弾薬や絶ç¸ä½“ã¨ã—ã¦åˆ©ç”¨ã•れã¦ã„ã¾ã™ã€‚ item.sand.description = åˆé‡‘ã‚„èžå‰¤ãªã©åºƒã使用ã•れã¦ã„ã‚‹ä¸€èˆ¬çš„ãªææ–™ã§ã™ã€‚ item.coal.description = ä¸€èˆ¬çš„ã§æœ‰ç”¨ãªç‡ƒæ–™ã§ã™ã€‚ +item.coal.details = Appears to be fossilized plant matter, formed long before the seeding event. item.titanium.description = 希少ã§éžå¸¸ã«è»½é‡ãªé‡‘属ã§ã™ã€‚液体輸é€ã‚„ドリルã€èˆªç©ºæ©Ÿãªã©ã§ä½¿ã‚れã¾ã™ã€‚ item.thorium.description = 放射性をæŒã¤é«˜å¯†åº¦ãªé‡‘属ã§ã™ã€‚å»ºé€ ç‰©ã®æ”¯ãˆã‚„核燃料ã¨ã—ã¦ä½¿ã‚れã¾ã™ã€‚ item.scrap.description = 昔ã®å»ºé€ ç‰©ã‚„ãƒ¦ãƒ‹ãƒƒãƒˆã®æ®‹éª¸ã§ã™ã€‚様々ãªç¨®é¡žã®é‡‘属ãŒå¾®é‡ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +item.scrap.details = Leftover remnants of old structures and units. item.silicon.description = éžå¸¸ã«æœ‰ç”¨ãªåŠå°Žä½“ã§ã‚½ãƒ¼ãƒ©ãƒ¼ãƒ‘ãƒãƒ«ã‚„多ãã®è¤‡é›‘ãªæ©Ÿæ¢°ã«å¿œç”¨ã§ãã¾ã™ã€‚ item.plastanium.description = 軽é‡ã§ä¼¸ç¸®æ€§ã®ã‚ã‚‹ææ–™ã§ã™ã€‚高度ãªèˆªç©ºæ©Ÿã‚„分散型ã®å¼¾è–¬ã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã€‚ item.phase-fabric.description = 極ã‚ã¦è»½é‡ãªç´ æã§ã™ã€‚é«˜åº¦ãªæ©Ÿæ¢°ã‚„自己修復技術ã«ä½¿ç”¨ã•れã¾ã™ã€‚ item.surge-alloy.description = 電気的特性をæŒã£ãŸé«˜åº¦ãªåˆé‡‘ã§ã™ã€‚ item.spore-pod.description = 石油や爆薬ã€ç‡ƒæ–™ã¸ã®è»¢æ›ã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã€‚ +item.spore-pod.details = Spores. Likely a synthetic life form. Emit gases toxic to other biological life. Extremely invasive. Highly flammable in certain conditions. item.blast-compound.description = 爆弾や爆発物ã«ä½¿ã‚れるä¸å®‰å®šãªåŒ–åˆç‰©ã§ã™ã€‚胞å­ã¨æ®ç™ºæ€§ç‰©è³ªã‹ã‚‰åˆæˆã•れã¾ã™ã€‚燃料ã¨ã—ã¦ç‡ƒã‚„ã™ã“ã¨ã‚‚ã§ãã¾ã™ãŒã€ãŠå‹§ã‚ã—ã¾ã›ã‚“。 item.pyratite.description = 焼夷兵器ãªã©ã«ä½¿ã‚れるéžå¸¸ã«ç‡ƒãˆã‚„ã™ã„物質ã§ã™ã€‚ + liquid.water.description = 機械ã®å†·å´ã‚„廃棄物ã®å‡¦ç†ãªã©å¹…広ã使ã‚れã¦ã„る液体ã§ã™ã€‚ liquid.slag.description = 様々ãªç¨®é¡žã®é‰±çŸ³ãŒæ··ã–りåˆã£ã¦ã„ã¾ã™ã€‚ãれãžã‚Œã®é‰±çŸ³ã«åˆ†é¡žã™ã‚‹ã‹ã€å™´å°„ã™ã‚‹æ­¦å™¨ã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã€‚ liquid.oil.description = é«˜åº¦ãªææ–™ç”Ÿç”£ã§ä½¿ç”¨ã•れる液体ã§ã™ã€‚ 燃料ã¨ã—ã¦çŸ³ç‚­ã«å¤‰æ›ã—ãŸã‚Šã€æ­¦å™¨ã¨ã—ã¦å™´éœ§ã—ã¦ç™ºç«ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ liquid.cryofluid.description = æ°´ã¨ãƒã‚¿ãƒ‹ã‚¦ãƒ ã‹ã‚‰ä½œã‚‰ã‚Œã‚‹ä¸æ´»æ€§ã§éžè…é£Ÿæ€§ã®æ¶²ä½“ã§ã™ã€‚ éžå¸¸ã«é«˜ã„熱容é‡ã‚’æŒã£ã¦ã„ã‚‹ãŸã‚ã€å†·å´ã«ä½¿ç”¨ã•れã¾ã™ã€‚ +block.resupply-point.description = è¿‘ãã®ãƒ¦ãƒ‹ãƒƒãƒˆã«éŠ…ã®å¼¾è–¬ã‚’補給ã—ã¾ã™ã€‚エãƒãƒ«ã‚®ãƒ¼ã‚’å¿…è¦ã¨ã™ã‚‹ãƒ¦ãƒ‹ãƒƒãƒˆã¨ã¯äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。 +block.armored-conveyor.description = ãƒã‚¿ãƒ³ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ã¨åŒã˜é€Ÿåº¦ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’輸é€ã™ã‚‹ã“ã¨ãŒã§ãã€è€ä¹…性ã«å„ªã‚Œã¦ã„ã¾ã™ã€‚\nã¾ãŸã€ã‚³ãƒ³ãƒ™ã‚¢ãƒ¼ä»¥å¤–ã«ã‚ˆã‚‹å´é¢ã¸ã®å…¥åŠ›ã‚’å—ã‘入れã¾ã›ã‚“。 +block.illuminator.description = 電力ãŒå¿…è¦ãªå…‰æºã§ã™ã€‚ block.message.description = メッセージをä¿å­˜ã—ã€ä»²é–“é–“ã®é€šä¿¡ã«ä½¿ç”¨ã—ã¾ã™ã€‚ block.graphite-press.description = 石炭を圧縮ã—ã€é»’鉛を生æˆã—ã¾ã™ã€‚ block.multi-press.description = 黒鉛圧縮機ã®ã‚¢ãƒƒãƒ—グレード版ã§ã™ã€‚æ°´ã¨é›»åŠ›ã‚’ä½¿ç”¨ã—ã¦ã€ã‚ˆã‚ŠåŠ¹çŽ‡çš„ã«çŸ³ç‚­ã‚’圧縮ã—ã¾ã™ã€‚ @@ -1242,6 +1379,7 @@ block.phase-conveyor.description = 改良ã•れãŸã‚¢ã‚¤ãƒ†ãƒ è»¢é€ãƒ–ロック block.sorter.description = アイテムを分別ã—ã¦æ¬å‡ºã—ã¾ã™ã€‚設定ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯é€šéŽã•ã›ã¾ã™ã€‚ä»–ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒæ¬å…¥ã•れるã¨å´é¢ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¬å‡ºã—ã¾ã™ã€‚ block.inverted-sorter.description = アイテムを分別ã—ã¦æ¬å‡ºã—ã¾ã™ã€‚設定ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯å´é¢ã«æ¬å‡ºã•れã¾ã™ã€‚ä»–ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒæ¬å…¥ã•れるã¨ã‚¢ã‚¤ãƒ†ãƒ ã‚’通éŽã•ã›ã¾ã™ã€‚通常ã®ãƒ«ãƒ¼ã‚¿ãƒ¼ã¨å対ã®å‹•作をã—ã¾ã™ã€‚ block.router.description = æ¬å…¥ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’ã»ã‹ã®3æ–¹å‘ã«å‡ç­‰ã«æ¬å‡ºã—ã¾ã™ã€‚一ã¤ã®è³‡æºã‹ã‚‰è¤‡æ•°ã«åˆ†ã‘ã‚‹éš›ãªã©ã«ä½¿ã‚れã¾ã™ã€‚ +block.router.details = A necessary evil. Using next to production inputs is not advised, as they will get clogged by output. block.distributor.description = 高度ãªãƒ«ãƒ¼ã‚¿ãƒ¼ã§ã™ã€‚æ¬å…¥ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’ã»ã‹ã®7æ–¹å‘ã«å‡ç­‰ã«åˆ†ã‘ã¦æ¬å‡ºã—ã¾ã™ã€‚ block.overflow-gate.description = æ¬å‡ºå…ˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¬å…¥ã™ã‚‹ç©ºããŒãªã„å ´åˆã«å·¦å³ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¬å‡ºã—ã¾ã™ã€‚ block.underflow-gate.description = オーãƒãƒ¼ãƒ•ローゲートã®åå¯¾ã®æ©Ÿèƒ½ã‚’æŒã¡ã¾ã™ã€‚ å·¦å³ã«å‡ºåŠ›ã§ããªã„å ´åˆã€å‰é¢ã«å‡ºåŠ›ã—ã¾ã™ã€‚ @@ -1278,15 +1416,18 @@ block.laser-drill.description = 電力を使用ã—ãŸãƒ¬ãƒ¼ã‚¶ãƒ¼æŠ€è¡“ã§ã‚ˆã‚Š block.blast-drill.description = 上ä½ã®ãƒ‰ãƒªãƒ«ã§ã™ã€‚大é‡ã®é›»åŠ›ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ block.water-extractor.description = 地é¢ã‹ã‚‰æ°´ã‚’æ±²ã¿ä¸Šã’ã¾ã™ã€‚è¿‘ãã«æ¹–ãŒãªã„å ´åˆã«æœ‰ç”¨ã§ã™ã€‚ block.cultivator.description = 胞å­ã®å°ã•ãªé›†ã¾ã‚Šã‚’工業用ãƒãƒƒãƒ‰ã«åŸ¹é¤Šã—ã¾ã™ã€‚ +block.cultivator.details = Recovered technology. Used to produce massive amounts of biomass as efficiently as possible. Likely the initial incubator of the spores now covering Serpulo. block.oil-extractor.description = 大é‡ã®é›»åŠ›ã‚’ä½¿ç”¨ã—ã¦ã€ç ‚ã‹ã‚‰çŸ³æ²¹ã‚’回åŽã—ã¾ã™ã€‚è¿‘ãã«æ²¹ç”°ãŒãªã„å ´åˆã«æœ‰ç”¨ã§ã™ã€‚ block.core-shard.description = 基本的ãªã‚³ã‚¢ã§ã™ã€‚一度破壊ã•れるã¨ã€ãã®åœ°åŸŸã¨ã®æŽ¥ç¶šãŒé€”çµ¶ãˆã¾ã™ã€‚破壊ã•れãªã„よã†ã«ã—ã¾ã—ょã†ã€‚ +block.core-shard.details = The first iteration. Compact. Self-replicating. Equipped with single-use launch thrusters. Not designed for interplanetary travel. block.core-foundation.description = ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¢ãƒƒãƒ—ã—ãŸã‚³ã‚¢ã§ã™ã€‚より堅ãã€ã‚ˆã‚Šå¤šãã®è³‡æºã‚’æ ¼ç´ã§ãã¾ã™ã€‚ +block.core-foundation.details = The second iteration. block.core-nucleus.description = ã•らã«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¢ãƒƒãƒ—ã—ãŸã‚³ã‚¢ã§ã™ã€‚優れãŸè€ä¹…性ã¨å¤§é‡ã®è³‡æºã‚’æ ¼ç´ã§ãã¾ã™ã€‚ +block.core-nucleus.details = The third and final iteration. block.vault.description = å„種類ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’大é‡ã«ä¿ç®¡ã—ã¾ã™ã€‚隣接ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒŠãƒ¼ã‚„ボールåœã€ã‚³ã‚¢ã¯ä¸€ã¤ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ¦ãƒ‹ãƒƒãƒˆã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚[lightgray]æ¬å‡ºæ©Ÿ[]を使ã£ã¦ã€ãƒœãƒ¼ãƒ«ãƒˆã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¬å‡ºã§ãã¾ã™ã€‚ block.container.description = å„種類ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å°‘é‡ãšã¤ä¿ç®¡ã—ã¾ã™ã€‚隣接ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒŠãƒ¼ã‚„ボールåœã€ã‚³ã‚¢ã¯ä¸€ã¤ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ¦ãƒ‹ãƒƒãƒˆã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ [lightgray]æ¬å‡ºæ©Ÿ[]を使ã£ã¦ã€ã‚³ãƒ³ãƒ†ãƒŠãƒ¼ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¬å‡ºã§ãã¾ã™ã€‚ block.unloader.description = コンテナやボールトã€ã‚³ã‚¢ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’コンベアーã‹éš£æŽ¥ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã«æ¬å‡ºã—ã¾ã™ã€‚æ¬å‡ºæ©Ÿã‚’タップã—ã¦æ¬å‡ºã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ block.launch-pad.description = 離脱ã™ã‚‹ã“ã¨ãªãã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’回åŽã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -block.launch-pad-large.description = 発射å°ã®æ”¹è‰¯ç‰ˆã§ã™ã€‚より多ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã€ã‚ˆã‚Šé »ç¹ã«å›žåŽã—ã¾ã™ã€‚ block.duo.description = å°ã•ã安価ãªã‚¿ãƒ¼ãƒ¬ãƒƒãƒˆã§ã™ã€‚ block.scatter.description = ä¸­è¦æ¨¡ã®å¯¾ç©ºåž‹ã‚¿ãƒ¼ãƒ¬ãƒƒãƒˆã§ã™ã€‚敵ã«é‰›ã‚„スクラップã®å¡Šã€ãƒ¡ã‚¿ã‚¬ãƒ©ã‚¹ã‚’分散ã™ã‚‹ã‚ˆã†ã«ç™ºå°„ã—ã¾ã™ã€‚。 block.scorch.description = è¿‘ãã®åœ°ä¸Šã®æ•µã‚’燃やã—ã¾ã™ã€‚è¿‘è·é›¢ã ã¨éžå¸¸ã«åŠ¹æžœçš„ã§ã™ã€‚ @@ -1301,5 +1442,64 @@ block.ripple.description = åŒæ™‚ã«è¤‡æ•°ã‚·ãƒ§ãƒƒãƒˆã‚’発射ã™ã‚‹å¤§åž‹ã‚¿ block.cyclone.description = 大型ã®é€£å°„型ターレットã§ã™ã€‚ block.spectre.description = 一度ã«2発ã®å¼·åŠ›ãªå¼¾ã‚’放ã¤å¤§åž‹ã®ã‚¿ãƒ¼ãƒ¬ãƒƒãƒˆã§ã™ã€‚ block.meltdown.description = 強力ãªé•·è·é›¢æ”»æ’ƒãŒå¯èƒ½ãªå¤§åž‹ã®ã‚¿ãƒ¼ãƒ¬ãƒƒãƒˆã§ã™ã€‚ +block.foreshadow.description = 一ã¤ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’ç‹™ã†é«˜ç«åŠ›ã€é•·å°„程ã®ã‚¿ãƒ¬ãƒƒãƒˆã§ã™ã€‚ block.repair-point.description = è¿‘ãã®è² å‚·ã—ãŸãƒ¦ãƒ‹ãƒƒãƒˆã‚’修復ã—ã¾ã™ã€‚ -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = 射程内ã«å…¥ã£ã¦ããŸå¼¾ä¸¸ã‚’破壊ã—ã¾ã™ã€‚レーザー弾ã¯ç ´å£Šã§ãã¾ã›ã‚“。 +block.parallax.description = 航空ユニットを引ã込むビームを発射ã—ã€ãã®éŽç¨‹ã§ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã¾ã™ã€‚ +block.tsunami.description = 敵ã«å¼·åŠ›ãªæµä½“を発射ã—ã¾ã™ã€‚æ°´ãŒä¾›çµ¦ã•れるã¨è‡ªå‹•çš„ã«ç«ã‚’消ã—ã¾ã™ã€‚ +block.silicon-crucible.description = 追加ã®ç†±æºã¨ã—ã¦ãƒ”ラタイトを使用ã—ã€ç ‚ã¨çŸ³ç‚­ã‹ã‚‰ã‚·ãƒªã‚³ãƒ³ã‚’効率的ã«ç²¾è£½ã—ã¾ã™ã€‚ã¾ãŸã€ç†±æºã®ä¸Šã§ã‚ˆã‚ŠåŠ¹çŽ‡çš„ã«ç²¾è£½ã—ã¾ã™ã€‚ +block.disassembler.description = スラグを低効率ã§è²´é‡ãªé‰±ç‰©æˆåˆ†ã«åˆ†é›¢ã—ã¾ã™ã€‚トリウムãªã©ãŒç”Ÿç”£å¯èƒ½ã§ã™ã€‚ +block.overdrive-dome.description = è¿‘ãã®å»ºé€ ç‰©ã®é€Ÿåº¦ã‚’上ã’ã¾ã™ã€‚電気ã®ä»–ã«ã€ãƒ•ェーズファイãƒãƒ¼ã¨ã‚·ãƒªã‚³ãƒ³ãŒå¿…è¦ã§ã™ã€‚ +block.payload-conveyor.description = 工場ã§ç”Ÿç”£ã•れãŸãƒ¦ãƒ‹ãƒƒãƒˆãªã©ã€å¤§ããªç‰©ã‚’輸é€ã—ã¾ã™ã€‚ +block.payload-router.description = æ¬å…¥ã—ãŸç‰©ã‚’3æ–¹å‘ã«å‡ç­‰ã«æ¬å‡ºã—ã¾ã™ã€‚ +block.command-center.description = ã„ãã¤ã‹ã®ã‚³ãƒžãƒ³ãƒ‰ã§ãƒ¦ãƒ‹ãƒƒãƒˆã®å‹•作を制御ã—ã¾ã™ã€‚ +block.ground-factory.description = 陸è»ãƒ¦ãƒ‹ãƒƒãƒˆã‚’生産ã—ã¾ã™ã€‚生産ã•れãŸãƒ¦ãƒ‹ãƒƒãƒˆã¯ç›´æŽ¥ä½¿ç”¨ã™ã‚‹ã ã‘ã§ãªãã€ã‚¢ãƒƒãƒ—グレードã®ãŸã‚ã«ç§»å‹•ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ +block.air-factory.description = 空è»ãƒ¦ãƒ‹ãƒƒãƒˆã‚’生産ã—ã¾ã™ã€‚生産ã•れãŸãƒ¦ãƒ‹ãƒƒãƒˆã¯ç›´æŽ¥ä½¿ç”¨ã™ã‚‹ã ã‘ã§ãªãã€ã‚¢ãƒƒãƒ—グレードã®ãŸã‚ã«ç§»å‹•ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ +block.naval-factory.description = æµ·è»ãƒ¦ãƒ‹ãƒƒãƒˆã‚’生産ã—ã¾ã™ã€‚生産ã•れãŸãƒ¦ãƒ‹ãƒƒãƒˆã¯ç›´æŽ¥ä½¿ç”¨ã™ã‚‹ã ã‘ã§ãªãã€ã‚¢ãƒƒãƒ—グレードã®ãŸã‚ã«ç§»å‹•ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ +block.additive-reconstructor.description = æ¬å…¥ã—ãŸãƒ¦ãƒ‹ãƒƒãƒˆã‚’第2段階ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™ã€‚ +block.multiplicative-reconstructor.description = æ¬å…¥ã—ãŸãƒ¦ãƒ‹ãƒƒãƒˆã‚’第3段階ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™ã€‚ +block.exponential-reconstructor.description = æ¬å…¥ã—ãŸãƒ¦ãƒ‹ãƒƒãƒˆã‚’第4段階ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™ã€‚ +block.tetrative-reconstructor.description = æ¬å…¥ã—ãŸãƒ¦ãƒ‹ãƒƒãƒˆã‚’第5段階ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™ã€‚ +block.switch.description = トグルå¯èƒ½ãªã‚¹ã‚¤ãƒƒãƒã§ã™ã€‚プロセッサを使用ã—ã¦èª­ã¿å–りや制御ãŒã§ãã¾ã™ã€‚ +block.micro-processor.description = 一連ã®å‘½ä»¤ã‚’ループã§å®Ÿè¡Œã—ã¾ã™ã€‚ ユニットや建物ã®åˆ¶å¾¡ã«ä½¿ç”¨ã§ãã¾ã™ã€‚ +block.logic-processor.description = 一連ã®å‘½ä»¤ã‚’ループã§å®Ÿè¡Œã—ã¾ã™ã€‚ ユニットや建物ã®åˆ¶å¾¡ã«ä½¿ç”¨ã§ãã¾ã™ã€‚マイクロプロセッサーより高速ã«å‘½ä»¤ã‚’実行å¯èƒ½ã§ã™ã€‚ +block.hyper-processor.description = 一連ã®å‘½ä»¤ã‚’ループã§å®Ÿè¡Œã—ã¾ã™ã€‚ ユニットや建物ã®åˆ¶å¾¡ã«ä½¿ç”¨ã§ãã¾ã™ã€‚ロジックプロセッサーより高速ã«å‘½ä»¤ã‚’実行å¯èƒ½ã§ã™ã€‚ +block.memory-cell.description = 情報を格ç´ã—ã¾ã™ã€‚ +block.memory-bank.description = より多ãã®æƒ…報を格ç´ã—ã¾ã™ã€‚ +block.logic-display.description = プロセッサã‹ã‚‰ã®ä»»æ„ã®ã‚°ãƒ©ãƒ•ィックを表示ã—ã¾ã™ã€‚ +block.large-logic-display.description = プロセッサã‹ã‚‰ã®ä»»æ„ã®ã‚°ãƒ©ãƒ•ィックを表示ã—ã¾ã™ã€‚ +block.interplanetary-accelerator.description = 巨大ãªé›»ç£ãƒ¬ãƒ¼ãƒ«ã‚¬ãƒ³ã‚¿ãƒ¯ãƒ¼ã§ã™ã€‚別惑星ã¸ã®å±•é–‹ã®ãŸã‚ã«ã‚³ã‚¢ã‚’é‡åŠ›åœè„±å‡ºå¯èƒ½é€Ÿåº¦ã¾ã§åŠ é€Ÿã—ã¾ã™ã€‚ + +unit.dagger.description = Fires standard bullets at all nearby enemies. +unit.mace.description = Fires streams of flame at all nearby enemies. +unit.fortress.description = Fires long-range artillery at ground targets. +unit.scepter.description = Fires a barrage of charged bullets at all nearby enemies. +unit.reign.description = Fires a barrage of massive piercing bullets at all nearby enemies. +unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight. +unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight. +unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded. +unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight. +unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain. +unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion. +unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain. +unit.spiroct.description = Fires sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. +unit.arkyid.description = Fires large sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. +unit.toxopid.description = Fires large electric cluster-shells and piercing lasers at enemies. Can step over most terrain. +unit.flare.description = Fires standard bullets at nearby ground targets. +unit.horizon.description = Drops clusters of bombs on ground targets. +unit.zenith.description = Fires salvos of missiles at all nearby enemies. +unit.antumbra.description = Fires a barrage of bullets at all nearby enemies. +unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies. +unit.mono.description = Automatically mines copper and lead, depositing it into the core. +unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction. +unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units. +unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units. +unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units. +unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies. +unit.minke.description = Fires shells and standard bullets at nearby ground targets. +unit.bryde.description = Fires long-range artillery shells and missiles at enemies. +unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies. +unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units. +unit.alpha.description = Defends the Shard core from enemies. Builds structures. +unit.beta.description = Defends the Foundation core from enemies. Builds structures. +unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 87f3d00a1b..fbd7d3cdce 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1,52 +1,63 @@ credits.text = 만든ì´: [royal]Anuken[] - [sky]anukendev@gmail.com[] -credits = ì œìž‘ìž -contributors = 번역가 ë° ê¸°ì—¬ìž -discord = Mindustry Discord ì— ê°€ìž…í•˜ì„¸ìš”! +credits = 제작진 +contributors = 번역가와 ê¸°ì—¬ìž +discord = Mindustry Discord ì„œë²„ì— ê°€ìž…í•˜ì„¸ìš”! link.discord.description = Mindustry Discord ê³µì‹ ëŒ€í™”ë°© link.reddit.description = Mindustry 서브레딧 -link.github.description = 게임 소스코드 +link.github.description = Mindustry 소스코드 link.changelog.description = ì—…ë°ì´íЏ ë‚´ìš© ëª©ë¡ -link.dev-builds.description = 불안정한 개발 빌드 -link.trello.description = 출시 ì˜ˆì •ì¸ ê¸°ëŠ¥ë“¤ì„ ê²Œì‹œí•œ ê³µì‹ Trello 보드 +link.dev-builds.description = 불안정한 개발 버전 +link.trello.description = 출시 예정 기능 계íšì„ 게시한 ê³µì‹ Trello 보드 link.itch.io.description = PC 다운로드가 있는 itch.io 페ì´ì§€ -link.google-play.description = Google Play 스토어 ëª©ë¡ +link.google-play.description = oogle Play 스토어 ëª©ë¡ link.f-droid.description = F-Droid 카탈로그 ëª©ë¡ link.wiki.description = ê³µì‹ Mindustry 위키 -link.suggestions.description = 새로운 기능 제안 +link.suggestions.description = 새 기능 제안하기 +link.bug.description = 버그 제보하기 linkfail = ë§í¬ë¥¼ ì—´ì§€ 못했습니다!\nURLì´ í´ë¦½ë³´ë“œì— 복사ë˜ì—ˆìŠµë‹ˆë‹¤. -screenshot = 스í¬ë¦° ìƒ·ì´ {0} ì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤. -screenshot.invalid = ë§µì´ ë„ˆë¬´ 커서 스í¬ë¦°ìƒ·ì— ì‚¬ìš©ë  ë©”ëª¨ë¦¬ê°€ 부족할 수 있습니다. +screenshot = 스í¬ë¦° 캡처가 {0} ì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤. +screenshot.invalid = ë§µì´ ë„ˆë¬´ 커서 스í¬ë¦° ìº¡ì²˜ì— ì‚¬ìš©ë  ë©”ëª¨ë¦¬ê°€ 부족합니다. gameover = 게임 오버 +gameover.disconnect = ì—°ê²° ëŠê¸° gameover.pvp = [accent]{0}[] íŒ€ì´ ìŠ¹ë¦¬í–ˆìŠµë‹ˆë‹¤! +gameover.waiting = [accent]ë‹¤ìŒ ë§µ 기다리는 중... highscore = [accent]새로운 최고 ì ìˆ˜! copied = 복사ë¨. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = ì´ ë¶€ë¶„ì€ ì•„ì§ ì¤€ë¹„ë˜ì§€ 않았습니다. +indev.campaign = [accent]ë‹¹ì‹ ì€ ìº íŽ˜ì¸ì˜ ëì— ë„달했습니다![]\n\nì´ê²ƒìœ¼ë¡œ 캠페ì¸ì— 있는 ëŒ€ë¶€ë¶„ì˜ ì½˜í…츠는 ë났으며, 행성 ê°„ ì—¬í–‰ì€ í–¥í›„ ì—…ë°ì´íŠ¸ì— ì¶”ê°€ë  ì˜ˆì •ìž…ë‹ˆë‹¤. load.sound = 소리 load.map = ë§µ load.image = 사진 -load.content = 컨í…츠 +load.content = 콘í…츠 load.system = 시스템 load.mod = 모드 load.scripts = 스í¬ë¦½íЏ -be.update = 새로운 Bleeding Edge 빌드 사용 가능: -be.update.confirm = 지금 다운로드하고 다시 시작하시겠습니까? -be.updating = ì—…ë°ì´íЏ 중... +be.update = 새로운 Bleeding Edge 버전 사용 가능: +be.update.confirm = 지금 내려받고 다시 시작하시겠습니까? +be.updating = ì—…ë°ì´íЏ 중…. be.ignore = 무시 be.noupdates = ì—…ë°ì´íŠ¸ê°€ 없습니다. be.check = ì—…ë°ì´íЏ í™•ì¸ +mods.browser = 모드 íƒìƒ‰ê¸° +mods.browser.selected = ì„ íƒëœ 모드 +mods.browser.add = 설치 +mods.browser.reinstall = 재설치 +mods.github.open = ë ˆí¬ì§€í† ë¦¬ 보기 +mods.browser.sortdate = 최근 ì—…ë°ì´íЏ +mods.browser.sortstars = 추천(스타) 수 + schematic = ì„¤ê³„ë„ schematic.add = ì„¤ê³„ë„ ì €ìž¥í•˜ê¸° schematics = 설계ë„들 schematic.replace = 해당 ì´ë¦„ì˜ ì„¤ê³„ë„ê°€ ì´ë¯¸ 존재합니다. êµì²´í•˜ì‹œê² ìŠµë‹ˆê¹Œ? schematic.exists = 해당 ì´ë¦„ì˜ ì„¤ê³„ë„ê°€ ì´ë¯¸ 존재합니다. -schematic.import = ì„¤ê³„ë„ ê°€ì ¸ì˜¤ê¸°... +schematic.import = ì„¤ê³„ë„ ê°€ì ¸ì˜¤ê¸° schematic.exportfile = íŒŒì¼ ë‚´ë³´ë‚´ê¸° schematic.importfile = íŒŒì¼ ê°€ì ¸ì˜¤ê¸° -schematic.browseworkshop = 창작마당 검색 +schematic.browseworkshop = ì°½ìž‘ë§ˆë‹¹ì— ê²€ìƒ‰ schematic.copy = í´ë¦½ ë³´ë“œì— ë³µì‚¬ schematic.copy.import = í´ë¦½ 보드ì—서 가져오기 schematic.shareworkshop = ì°½ìž‘ë§ˆë‹¹ì— ê³µìœ  @@ -55,8 +66,10 @@ schematic.saved = ì„¤ê³„ë„ ì €ìž¥ë¨. schematic.delete.confirm = ì´ ì„¤ê³„ë„는 완전히 ì‚­ì œë  ê²ƒìž…ë‹ˆë‹¤. schematic.rename = ì„¤ê³„ë„ ì´ë¦„ 바꾸기 schematic.info = {0}x{1}, {2} ë¸”ë¡ +schematic.disabled = [scarlet]ì„¤ê³„ë„ ë¹„í™œì„±í™”ë¨[]\nì´ [accent]ë§µ[] ë˜ëŠ” [accent]서버[] ì—서는 설계ë„를 사용할 수 없습니다. -stat.wave = 패배한 웨ì´ë¸Œ:[accent] {0} +stats = 전투 ê²°ê³¼ +stat.wave = 패배한 단계:[accent] {0} stat.enemiesDestroyed = íŒŒê´´ëœ ì :[accent] {0} stat.built = 지어진 건물: [accent]{0} stat.destroyed = íŒŒê´´ëœ ê±´ë¬¼: [accent]{0} @@ -65,20 +78,21 @@ stat.delivered = ì–»ì€ ìžì›: stat.playtime = í”Œë ˆì´ ì‹œê°„: [accent] {0} stat.rank = 최종 순위: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]ì „ì²´ ìžì› map.delete = ì •ë§ë¡œ "[accent]{0}[]" ë§µì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? level.highscore = 최고 ì ìˆ˜: [accent]{0} level.select = ë§µ ì„ íƒ level.mode = 게임 모드: -coreattack = < 코어가 공격 받고 있습니다! > -nearpoint = [[ [scarlet]낙하 ì§€ì ì—서 나가세요[] ]\nì  ë‚™í•˜ 시 낙하 ì§€ì  ë‚´ 건물 ë° ìœ ë‹› 파괴 +coreattack = < 코어가 ê³µê²©ì„ ë°›ê³  있습니다! > +nearpoint = [[ [scarlet]즉시 ì  ì†Œí™˜êµ¬ì—­ì—서 떠나십시오[] ]\n단계가 시작하는 순간 ì¸ê·¼ 건물들과 ìœ ë‹›ë“¤ì´ ì „ë©¸í•©ë‹ˆë‹¤! database = 코어 ë°ì´í„°ë² ì´ìФ savegame = 게임 저장 loadgame = 게임 불러오기 joingame = 게임 참여 customgame = ì‚¬ìš©ìž ì§€ì • 게임 newgame = 새 게임 -none = <ì—†ìŒ> +none = < ì—†ìŒ > +none.found = [lightgray]< ì°¾ì„ ìˆ˜ ì—†ìŒ > minimap = 미니맵 position = 위치 close = 닫기 @@ -91,65 +105,71 @@ continue = 계ì†í•˜ê¸° maps.none = [lightgray]ë§µì„ ì°¾ì„ ìˆ˜ 없습니다! invalid = 오류 pickcolor = ìƒ‰ìƒ ì„ íƒ -preparingconfig = 설정 준비중 -preparingcontent = 컨í…츠 준비중 -uploadingcontent = 컨í…츠 업로드중 -uploadingpreviewfile = 미리 보기 íŒŒì¼ ì—…ë¡œë“œ 중 +preparingconfig = 설정 준비 중 +preparingcontent = 콘í…츠 준비 중 +uploadingcontent = 콘í…츠 올리는 중 +uploadingpreviewfile = 미리 보기 íŒŒì¼ ì˜¬ë¦¬ëŠ” 중 committingchanges = ë°”ë€ ì  ì ìš© done = 완료 feature.unsupported = 기기가 ì´ ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다. -mods.alphainfo = 현재 모드는 알파ì´ë©°, [scarlet]버그가 ë§Žì„ ìˆ˜ 있습니다[].\n발견한 문제는 Mindustry Github ë˜ëŠ” Discordì— ë³´ê³ í•˜ì„¸ìš”. -mods.alpha = [accent](알파) +mods.initfailed = [red]âš []ì´ì „ Mindustry ì¸ìŠ¤í„´ìŠ¤ë¥¼ 초기화하지 못했습니다. ìž˜ëª»ëœ ëª¨ë“œë¡œ ì¸í•´ ë°œìƒí•œ ê²ƒì¼ ìˆ˜ 있습니다.\n\n 게임 ì¶©ëŒ ë¬´í•œë°˜ë³µì„ ë§‰ê¸° 위해, [red]모든 모드가 비활성화ë˜ì—ˆìŠµë‹ˆë‹¤.[]\n\nì´ ì‹œìŠ¤í…œì„ ë¹„í™œì„±í™”í• ë ¤ë©´, [accent]설정->게임->로딩 중 ì¶©ëŒ ì‹œ 모드 비활성화[]ì„¤ì •ì„ ë„세요. mods = 모드 mods.none = [lightgray]모드를 ì°¾ì„ ìˆ˜ 없습니다! mods.guide = 모드 제작 ê°€ì´ë“œ mods.report = 버그 제보하기 mods.openfolder = í´ë” 열기 +mods.viewcontent = 콘í…츠 보기 mods.reload = 새로 고침 mods.reloadexit = ê²Œìž„ì´ ì¢…ë£Œëœ í›„ 모드를 불러올 것입니다. +mod.installed = [[설치ë¨] mod.display = [gray]모드:[orange] {0} mod.enabled = [lightgray]í™œì„±í™”ë¨ mod.disabled = [scarlet]ë¹„í™œì„±í™”ë¨ +mod.multiplayer.compatible = [gray]멀티플레ì´ì–´ 호환 가능 mod.disable = 비활성화 mod.content = 콘í…츠: mod.delete.error = 모드를 삭제할 수 없습니다. 파ì¼ì´ 사용 ì¤‘ì¼ ìˆ˜ 있습니다. mod.requiresversion = [scarlet]필요한 최소 게임 버전: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) -mod.missingdependencies = [scarlet]누ë½ëœ 요구 모드: {0} +mod.outdated = [scarlet]V6 버전과 호환ë˜ì§€ ì•ŠìŒ (minGameVersion: 105 ì´ìƒì´ 아님) +mod.missingdependencies = [scarlet]누ë½ëœ í•„ìš” 모드: {0} mod.erroredcontent = [scarlet]콘í…츠 오류 -mod.errors = 콘í…츠를 로드하는 ë™ì•ˆ 오류가 ë°œìƒí•¨. -mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] ì˜í–¥ì„ 받는 모드를 비활성화 하거나 í”Œë ˆì´ í•˜ê¸° ì „ì— ì˜¤ë¥˜ë¥¼ 수정하세요. -mod.nowdisabled = [scarlet]모드 '{0}'ì— í•„ìš”í•œ 종ì†ì„±ì´ 없습니다:[accent] {1}\n[lightgray]ì´ ëª¨ë“œë¥¼ 먼저 다운로드 해야합니다.\nì´ ëª¨ë“œëŠ” ìžë™ìœ¼ë¡œ 비활성화ë©ë‹ˆë‹¤.. +mod.errors = 콘í…츠를 불러오는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•¨. +mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] ì˜í–¥ì„ 받는 모드를 비활성화하거나 플레ì´í•˜ê¸° ì „ì— ì˜¤ë¥˜ë¥¼ 수정하세요. +mod.nowdisabled = [scarlet]모드 '{0}'ì— í•„ìš”í•œ 종ì†ì„±ì´ 없습니다:[accent] {1}\n[lightgray]ì´ ëª¨ë“œë¥¼ 먼저 내려받아야 합니다.\nì´ ëª¨ë“œëŠ” ìžë™ìœ¼ë¡œ 비활성화ë©ë‹ˆë‹¤. mod.enable = 활성화 mod.requiresrestart = 모드 변경 ì‚¬í•­ì„ ì ìš©í•˜ê¸° 위해 ê²Œìž„ì„ ì¢…ë£Œí•©ë‹ˆë‹¤. mod.reloadrequired = [scarlet]재시작 í•„ìš” mod.import = 모드 가져오기 mod.import.file = íŒŒì¼ ê°€ì ¸ì˜¤ê¸° mod.import.github = Github ì—서 모드 가져오기 -mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스ì—서 ì–»ì€ ëª¨ë“œë§Œì„ ì‚¬ìš©í•´ì•¼ 합니다! -mod.item.remove = ì´ ìžì›ì€[accent] '{0}' ëª¨ë“œì˜ ì¼ë¶€ìž…니다. ì´ë¥¼ 제거하려면 해당 모드를 제거하세요. +mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 개발ìžì—게서 ì–»ì€ ëª¨ë“œë§Œì„ ì‚¬ìš©í•´ì•¼ 합니다! +mod.item.remove = ì´ ì•„ì´í…œì€[accent] '{0}' ëª¨ë“œì˜ ì¼ë¶€ìž…니다. ì´ë¥¼ 제거하려면 해당 모드를 제거하세요. mod.remove.confirm = ì´ ëª¨ë“œê°€ ì‚­ì œë  ê²ƒìž…ë‹ˆë‹¤. mod.author = [lightgray]제작ìž:[] {0} -mod.missing = ì´ ì €ìž¥ 파ì¼ì—는 ìµœê·¼ì— ì—…ë°ì´íЏë˜ì—ˆê±°ë‚˜ ë” ì´ìƒ 설치ë˜ì§€ ì•Šì€ ëª¨ë“œê°€ í¬í•¨ë˜ì–´ 있습니다. 저장 파ì¼ì´ ì†ìƒë  수 있습니다. ì •ë§ë¡œ 불러 오시겠습니까?\n[lighthray]모드들:\n{0} -mod.preview.missing = ì°½ìž‘ë§ˆë‹¹ì— ëª¨ë“œë¥¼ 업로드하기 ì „ì— ë¯¸ë¦¬ë³´ê¸° ì´ë¯¸ì§€ë¥¼ 추가해야합니다.\n[accent]preview.png[] ë¼ëŠ” ì´ë¦„ì˜ ë¯¸ë¦¬ë³´ê¸° ì´ë¯¸ì§€ë¥¼ 모드 í´ë”ì— ë„£ê³  다시 시ë„하세요. -mod.folder.missing = 창작마당ì—는 í´ë” í˜•íƒœì˜ ëª¨ë“œë§Œ 게시할 수 있습니다.\n모드를 í´ë” 형태로 바꾸려면 모드 파ì¼ì„ 모드 í´ë”ì— ì••ì¶•ì„ í’€ê³  ì´ì „ 모드 파ì¼ì„ ì‚­ì œ 후, ê²Œìž„ì„ ìž¬ì‹œìž‘í•˜ê±°ë‚˜ 모드를 다시 로드하십시오. +mod.missing = ì´ ì €ìž¥ 파ì¼ì—는 ìµœê·¼ì— ì—…ë°ì´íЏë˜ì—ˆê±°ë‚˜ 현재 ê¸°ê¸°ì— ì„¤ì¹˜ë˜ì§€ ì•Šì€ ëª¨ë“œê°€ í¬í•¨ë˜ì–´ 있습니다. 저장 파ì¼ì´ ì†ìƒë  수 있습니다. ì •ë§ë¡œ 불러오시겠습니까?\n[lightgray]모드들:\n{0} +mod.preview.missing = ì°½ìž‘ë§ˆë‹¹ì— ëª¨ë“œë¥¼ 올리기 ì „ì— ë¯¸ë¦¬ 보기 ì´ë¯¸ì§€ë¥¼ 추가해야 합니다.\n[accent]preview.png[] ë¼ëŠ” ì´ë¦„ì˜ ë¯¸ë¦¬ 보기 ì´ë¯¸ì§€ë¥¼ 모드 í´ë”ì— ë„£ê³  다시 시ë„하세요. +mod.folder.missing = 창작마당ì—는 í´ë” í˜•íƒœì˜ ëª¨ë“œë§Œ 게시할 수 있습니다.\n모드를 í´ë” 형태로 바꾸려면 모드 파ì¼ì„ 모드 í´ë”ì— ì••ì¶•ì„ í’€ê³  ì´ì „ 모드 파ì¼ì„ ì‚­ì œ 후, ê²Œìž„ì„ ìž¬ì‹œìž‘í•˜ê±°ë‚˜ 모드를 다시 불러오십시오. mod.scripts.disable = ì´ ê¸°ê¸°ëŠ” 스í¬ë¦½íŠ¸ê°€ 있는 모드를 ì§€ì›í•˜ì§€ 않습니다. ê²Œìž„ì„ í”Œë ˆì´í•˜ë ¤ë©´ ì´ ëª¨ë“œë¥¼ 비활성화해야 합니다. about.button = ì •ë³´ -name = ì´ë¦„: +name = 닉네임 : noname = 먼저 [accent]플레ì´ì–´ ì´ë¦„[]ì„ ì„¤ì •í•˜ì„¸ìš”. -planetmap = Planet Map -launchcore = Launch Core -filename = íŒŒì¼ ì´ë¦„: +planetmap = 행성 ì§€ë„ +launchcore = 코어 출격 +filename = íŒŒì¼ ì´ë¦„: unlocked = 새로운 콘í…츠가 해금ë˜ì—ˆìŠµë‹ˆë‹¤! +available = 새로운 콘í…츠 í•´ê¸ˆì´ ê°€ëŠ¥í•©ë‹ˆë‹¤! completed = [accent]ì™„ë£Œë¨ techtree = 연구 ê¸°ë¡ +research.legacy = [accent]5.0[] 연구 ë°ì´í„°ë¥¼ 찾았습니다.\n[accent]ì´ ë°ì´í„°ë¥¼ 불러오시겠습니까?[], 아니면 ì´ ë°ì´í„°ë¥¼ 무시하고 캠페ì¸ì„ 새로 시작하시겠습니까? [accent]무시한 ë°ì´í„°ëŠ” ì‚­ì œë©ë‹ˆë‹¤.[] (권장ë¨) +research.load = 불러오기 +research.discard = 무시하기 research.list = [lightgray]연구: research = 연구 researched = [lightgray]{0} 연구 완료. -research.progress = {0}% complete -players = {0} 플레ì´ì–´ë“¤ +research.progress = {0}% ì™„ë£Œë¨ +players = {0} 플레ì´ì–´ players.single = {0} 플레ì´ì–´ players.search = 검색 players.notfound = [gray]플레ì´ì–´ë¥¼ ì°¾ì„ ìˆ˜ 없습니다. @@ -157,48 +177,55 @@ server.closing = [accent]서버를 닫는 중... server.kicked.kick = 서버ì—서 추방ë˜ì—ˆìŠµë‹ˆë‹¤! server.kicked.whitelist = ë‹¹ì‹ ì€ ì´ ì„œë²„ì˜ í™”ì´íŠ¸ë¦¬ìŠ¤íŠ¸ì— ë“±ë¡ë˜ì–´ 있지 않습니다. server.kicked.serverClose = 서버 닫힘. -server.kicked.vote = ë‹¹ì‹ ì€ íˆ¬í‘œë¡œ 추방ë˜ì—ˆìŠµë‹ˆë‹¤. 안녕히 계십시오. +server.kicked.vote = ë‹¹ì‹ ì€ íˆ¬í‘œë¡œ 추방ë˜ì—ˆìŠµë‹ˆë‹¤. 안녕히 가세요. server.kicked.clientOutdated = 구버전 í´ë¼ì´ì–¸íŠ¸ìž…ë‹ˆë‹¤! ê²Œìž„ì„ ì—…ë°ì´íŠ¸í•˜ì„¸ìš”! server.kicked.serverOutdated = 구버전 서버입니다! 호스트ì—게 ì—…ë°ì´íŠ¸ë¥¼ 요청하세요! -server.kicked.banned = ë‹¹ì‹ ì€ ì´ ì„œë²„ì—서 차단ë˜ì—ˆìŠµë‹ˆë‹¤. -server.kicked.typeMismatch = ì´ ì„œë²„ëŠ” 현재 빌드 유형과 호환ë˜ì§€ 않습니다. +server.kicked.banned = ë‹¹ì‹ ì€ ì´ ì„œë²„ì—서 ì˜êµ¬ì ìœ¼ë¡œ 차단ë˜ì—ˆìŠµë‹ˆë‹¤. +server.kicked.typeMismatch = ì´ ì„œë²„ëŠ” 현재 빌드와 호환ë˜ì§€ 않습니다. server.kicked.playerLimit = ì„œë²„ì˜ ì¸ì›ì´ 꽉 찼습니다. 빈 ìŠ¬ë¡¯ì´ ìƒê¸¸ 때까지 기다려주세요. -server.kicked.recentKick = ìµœê·¼ì— ì¶”ë°©ë˜ì—ˆìŠµë‹ˆë‹¤.\n다시 ì ‘ì†í•˜ê¸° ì „ì— ê¸°ë‹¤ë¦¬ì„¸ìš”. +server.kicked.recentKick = ìµœê·¼ì— ì¶”ë°©ë˜ì—ˆìŠµë‹ˆë‹¤.\n추방 ì¿¨íƒ€ìž„ì´ ëë‚  때까지 기다리세요. server.kicked.nameInUse = ì´ ì„œë²„ì— í•´ë‹¹ ì´ë¦„ì„ ê°€ì§„ ì‚¬ëžŒì´ ìžˆìŠµë‹ˆë‹¤. server.kicked.nameEmpty = ì„¤ì •ëœ ë‹‰ë„¤ìž„ì´ ì—†ìŠµë‹ˆë‹¤. -server.kicked.idInUse = ë‹¹ì‹ ì€ ì´ë¯¸ ì´ ì„œë²„ì— ìžˆìŠµë‹ˆë‹¤! ë‘ ê°œì˜ ê³„ì •ìœ¼ë¡œ 연결하는건 허용ë˜ì§€ 않습니다. -server.kicked.customClient = ì´ ì„œë²„ëŠ” ì‚¬ìš©ìž ì •ì˜ ë¹Œë“œë¥¼ ì§€ì›í•˜ì§€ 않습니다. ê³µì‹ ë²„ì „ì„ ë‹¤ìš´ë¡œë“œ 하세요. +server.kicked.idInUse = ë‹¹ì‹ ì€ ì´ë¯¸ ì´ ì„œë²„ì— ìžˆìŠµë‹ˆë‹¤! ë‘ ê°œì˜ ê³„ì •ìœ¼ë¡œ 연결하는 ê±´ 허용ë˜ì§€ 않습니다. +server.kicked.customClient = ì´ ì„œë²„ëŠ” ì‚¬ìš©ìž ì •ì˜ ë¹Œë“œë¥¼ ì§€ì›í•˜ì§€ 않습니다. ê³µì‹ ë²„ì „ì„ ë‚´ë ¤ë°›ìœ¼ì„¸ìš”. server.kicked.gameover = 게임 오버! server.kicked.serverRestarting = 서버가 다시 시작ë˜ê³  있습니다. -server.versions = ë‹¹ì‹ ì˜ ë²„ì „: [accent] {0}[]\n서버 버전:[accent] {1}[] -host.info = [accent]호스트[] ë²„íŠ¼ì€ í¬íЏ[scarlet] 6567[]ì—서 호스팅합니다.\nê°™ì€ [lightgray]Wi-Fi ë˜ëŠ” LAN[]ì— ìžˆëŠ” 모든 사용ìžë“¤ì´ ìžì‹ ì˜ 서버 목ë¡ì—서 서버를 ë³¼ 수 있어야 합니다.\n\nì‚¬ëžŒë“¤ì´ IP를 통해 어디서나 ì ‘ì†í•  수 있게 하려면 [accent]í¬íЏ í¬ì›Œë”©[]ì´ í•„ìš”í•©ë‹ˆë‹¤.\n\n참고: 누군가 LAN ê²Œìž„ì— ì—°ê²°í•˜ëŠ” ë° ë¬¸ì œê°€ 있는 경우 방화벽 설정ì—서 Mindustryê°€ LANì— ì•¡ì„¸ìŠ¤ í•  수 있ë„ë¡ í—ˆìš©í–ˆëŠ”ì§€ 확ì¸í•˜ì„¸ìš”. 공용 네트워í¬ëŠ” ê°€ë”씩 서버 ê²€ìƒ‰ì„ í—ˆìš©í•˜ì§€ 않습니다. +server.versions = ë‹¹ì‹ ì˜ ë²„ì „ : [accent] {0}[]\n서버 버전 : [accent] {1}[] +host.info = [accent]호스트[] ë²„íŠ¼ì€ í¬íЏ[scarlet] 6567[]ì—서 호스팅합니다.\nê°™ì€ [lightgray]Wi-Fi ë˜ëŠ” LAN[]ì— ìžˆëŠ” 모든 사용ìžê°€ ìžì‹ ì˜ 서버 목ë¡ì—서 서버를 ë³¼ 수 있습니다.\n\nì‚¬ëžŒë“¤ì´ IP를 통해 어디서나 ì ‘ì†í•  수 있게 하려면 [accent]í¬íЏ í¬ì›Œë”©[]ì´ í•„ìš”í•©ë‹ˆë‹¤.\n\n참고: 누군가 LAN ê²Œìž„ì— ì—°ê²°í•˜ëŠ” ë° ë¬¸ì œê°€ 있는 경우 방화벽 설정ì—서 Mindustryê°€ LANì— ì ‘ê·¼í•  수 있ë„ë¡ í—ˆìš©í–ˆëŠ”ì§€ 확ì¸í•˜ì„¸ìš”. 공용 네트워í¬ëŠ” ê°€ë” ì„œë²„ ê²€ìƒ‰ì„ í—ˆìš©í•˜ì§€ 않습니다. join.info = ì—¬ê¸°ì— ì—°ê²°í•  [accent]서버 IP[]를 입력하거나 [accent]LAN[] ë˜ëŠ” [accent]글로벌[] 서버를 검색할 수 있습니다.\nLAN ë° WAN 멀티 플레ì´ì–´ ëª¨ë‘ ì§€ì›ë©ë‹ˆë‹¤.\n\n[lightgray]IP로 ì„œë²„ì— ì—°ê²°í•˜ë ¤ë©´ 호스트ì—게 IP를 요청해야 합니다. 호스트 ìª½ì˜ ìž¥ì¹˜ì—서 êµ¬ê¸€ì— "ë‚´ IP" ë¼ê³  검색하면 쉽게 ì°¾ì„ ìˆ˜ 있습니다. -hostserver = ë©€í‹°í”Œë ˆì´ ì„œë²„ 호스트 +hostserver = ë©€í‹°í”Œë ˆì´ ì„œë²„ 열기 invitefriends = 친구 초대 hostserver.mobile = 서버\n열기 host = 서버 열기 hosting = [accent]서버 여는 중... -hosts.refresh = 새로고침 -hosts.discovering = LAN 게임 찾는중 -hosts.discovering.any = 서버 찾는중 -server.refreshing = 서버 ëª©ë¡ ìƒˆë¡œê³ ì¹˜ëŠ”ì¤‘ +hosts.refresh = 새로 고침 +hosts.discovering = LAN 게임 찾는 중 +hosts.discovering.any = 서버 찾는 중 +server.refreshing = 서버 ëª©ë¡ ë™ê¸°í™”하는 중 hosts.none = [lightgray]LAN ê²Œìž„ì„ ì°¾ì„ ìˆ˜ 없습니다! -host.invalid = [scarlet]í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•  수 없습니다! +host.invalid = [scarlet]ì„œë²„ì— ì—°ê²°í•  수 없습니다! servers.local = 로컬 서버 servers.remote = ì›ê²© 서버 servers.global = 커뮤니티 서버 +servers.disclaimer = 커뮤니티 서버는 개발ìžê°€ 소유하거나 제어하지 [accent]않습니다[].\n\nì„œë²„ë“¤ì€ ì „ì—°ë ¹ëŒ€ì— ì í•©í•˜ì§€ ì•Šì€ ì‚¬ìš©ìž ì§€ì • 콘í…츠를 보유할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. +servers.showhidden = 숨겨진 서버 ë³´ì´ê¸°/숨기기 +server.shown = 서버 숨기기 +server.hidden = 서버 ë³´ì´ê¸° + trace = 플레ì´ì–´ ì •ë³´ 보기 trace.playername = 플레ì´ì–´ ì´ë¦„: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = 고유 ID: [accent]{0} +trace.id = UUID: [accent]{0} trace.mobile = ëª¨ë°”ì¼ í´ë¼ì´ì–¸íЏ: [accent]{0} trace.modclient = ì‚¬ìš©ìž ì§€ì • í´ë¼ì´ì–¸íЏ: [accent]{0} +trace.times.joined = 입장 횟수: [accent]{0} +trace.times.kicked = 추방 횟수: [accent]{0} invalidid = ìž˜ëª»ëœ í´ë¼ì´ì–¸íЏ ID입니다! 버그 보고서를 보내주세요. server.bans = 차단 ëª©ë¡ server.bans.none = ì°¨ë‹¨ëœ í”Œë ˆì´ì–´ë¥¼ ì°¾ì„ ìˆ˜ 없습니다! -server.admins = 관리ìžë“¤ +server.admins = ê´€ë¦¬ìž server.admins.none = 관리ìžë¥¼ ì°¾ì„ ìˆ˜ 없습니다! server.add = 서버 추가 server.delete = ì •ë§ë¡œ ì´ ì„œë²„ë¥¼ 삭제하시겠습니까? @@ -207,12 +234,12 @@ server.outdated = [scarlet]서버 ë²„ì „ì´ ë‚®ìŠµë‹ˆë‹¤![] server.outdated.client = [scarlet]í´ë¼ì´ì–¸íЏ ë²„ì „ì´ ë‚®ìŠµë‹ˆë‹¤![] server.version = [gray]v{0} {1} server.custombuild = [accent]ì‚¬ìš©ìž ì •ì˜ ì„œë²„ -confirmban = ì •ë§ë¡œ "{0}[white]" ì„(를) 차단 하시겠습니까? -confirmkick = ì •ë§ë¡œ "{0}[white]" ì„(를) 추방 하시겠습니까? -confirmvotekick = ì •ë§ë¡œ "{0}[white]" ì„(를) 투표로 추방 하시겠습니까? -confirmunban = ì •ë§ë¡œ ì´ í”Œë ˆì´ì–´ë¥¼ 차단 í•´ì œ 하시겠습니까? -confirmadmin = ì •ë§ë¡œ "{0}[white]" ì„(를) 관리ìžë¡œ 만들겠습니까? -confirmunadmin = ì •ë§ë¡œ "{0}[white]" ì„(를) ê´€ë¦¬ìž ìƒíƒœë¥¼ 제거 하시겠습니까? +confirmban = ì •ë§ë¡œ "{0}[white]" ì„(를) 차단하시겠습니까? +confirmkick = ì •ë§ë¡œ "{0}[white]" ì„(를) 추방하시겠습니까? +confirmvotekick = ì •ë§ë¡œ "{0}[white]" ì„(를) 투표로 추방하시겠습니까? +confirmunban = ì •ë§ë¡œ ì´ í”Œë ˆì´ì–´ë¥¼ 차단 해제하시겠습니까? +confirmadmin = ì •ë§ë¡œ "{0}[white]" ì„(를) 관리ìžë¡œ 임명하겠습니까? +confirmunadmin = ì •ë§ë¡œ "{0}[white]"ì˜ ê´€ë¦¬ìžë¥¼ 박탈하시겠습니까? joingame.title = 게임 참가 joingame.ip = 주소: disconnect = ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤. @@ -221,18 +248,19 @@ disconnect.closed = ì—°ê²°ì´ ì¢…ë£Œë˜ì—ˆìŠµë‹ˆë‹¤. disconnect.timeout = 시간 초과. disconnect.data = ë§µ ë°ì´í„°ë¥¼ 로드하지 못했습니다! cantconnect = [accent]{0}[] ê²Œìž„ì— ì°¸ì—¬í•  수 없습니다. -connecting = [accent]연결중... -connecting.data = [accent]ë§µ ë°ì´í„° 로딩중... +connecting = [accent] 연결중... +reconnecting = [accent]재접ì†ì¤‘... +connecting.data = [accent]ë§µ ë°ì´í„° 불러오는중... server.port = í¬íЏ: -server.addressinuse = ì´ë¯¸ ì‚¬ìš©ì¤‘ì¸ ì£¼ì†Œìž…ë‹ˆë‹¤! +server.addressinuse = ì´ë¯¸ 사용 ì¤‘ì¸ ì£¼ì†Œìž…ë‹ˆë‹¤! server.invalidport = ìž˜ëª»ëœ í¬íЏ 번호입니다! server.error = [scarlet]서버 호스팅 오류. save.new = 새로 저장 -save.overwrite = ì €ìž¥ëœ ìŠ¬ë¡¯ì„ ë®ì–´ 쓰시겠습니까? +save.overwrite = ì €ìž¥ëœ ìŠ¬ë¡¯ì„ ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? overwrite = ë®ì–´ì“°ê¸° save.none = ì €ìž¥ëœ íŒŒì¼ì„ ì°¾ì„ ìˆ˜ 없습니다! savefail = ê²Œìž„ì„ ì €ìž¥í•˜ì§€ 못했습니다! -save.delete.confirm = ì´ ì €ìž¥ì„ ì‚­ì œ 하시겠습니까? +save.delete.confirm = ì´ ì €ìž¥ì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? save.delete = ì‚­ì œ save.export = 저장 내보내기 save.import.invalid = [accent]저장 파ì¼ì´ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤! @@ -243,15 +271,15 @@ save.newslot = 저장 ì´ë¦„: save.rename = ì´ë¦„ 변경 save.rename.text = 새 ì´ë¦„: selectslot = ì €ìž¥ìŠ¬ë¡¯ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. -slot = [accent]슬롯 {0} -editmessage = 메세지 편집 +slot = [accent] 슬롯 {0} +editmessage = 메시지 편집 save.corrupted = [accent]ì†ìƒë˜ì—ˆê±°ë‚˜ ìž˜ëª»ëœ ì €ìž¥ 파ì¼ìž…니다! empty = <비어있ìŒ> on = 활성화 off = 비활성화 save.autosave = ìžë™ì €ìž¥: {0} save.map = ë§µ: {0} -save.wave = {0} 웨ì´ë¸Œ +save.wave = {0} 단계 save.mode = 게임모드: {0} save.date = 마지막 저장ì¼: {0} save.playtime = í”Œë ˆì´ ì‹œê°„: {0} @@ -267,29 +295,40 @@ cancel = 취소 openlink = ë§í¬ 열기 copylink = ë§í¬ 복사 back = 뒤로가기 +max = 최대 +crash.export = 오류 로그 내보내기 +crash.none = 오류 로그가 발견ë˜ì§€ 않았습니다. +crash.exported = 오류 로그가 추출ë˜ì—ˆìŠµë‹ˆë‹¤. data.export = ë°ì´í„° 내보내기 data.import = ë°ì´í„° 가져오기 data.openfolder = ë°ì´í„° í´ë” 열기 data.exported = ë°ì´í„°ë¥¼ 내보냈습니다. data.invalid = 유효한 게임 ë°ì´í„°ê°€ 아닙니다. data.import.confirm = 외부 ë°ì´í„°ë¥¼ 가져오면 현재 게임 ë°ì´í„°ë¥¼ [scarlet]모ë‘[] ë®ì–´ì“°ê²Œ ë©ë‹ˆë‹¤.\n[accent]ì´ ìž‘ì—…ì€ ì·¨ì†Œí•  수 없습니다![]\n\në°ì´í„°ë¥¼ 가져오면 ê²Œìž„ì´ ì¦‰ì‹œ 종료ë©ë‹ˆë‹¤. -quit.confirm = ì •ë§ë¡œ 종료 하시겠습니까? +quit.confirm = ì •ë§ë¡œ 종료하시겠습니까? quit.confirm.tutorial = íŠœí† ë¦¬ì–¼ì„ ì¢…ë£Œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?\n튜토리얼ì€[accent]설정->게임->튜토리얼[]ì—서 다시 하실 수 있습니다. loading = [accent]불러오는중... reloading = [accent]모드 새로고침하는중... saving = [accent]저장중... -respawn = 코어ì—서 부활까지 [accent][[{0}][]ì´ˆ 남ìŒ. -cancelbuilding = [accent][[{0}][] 를 눌러 ê³„íš ì´ˆê¸°í™” -selectschematic = [accent][[{0}][] 를 눌러 ì„ íƒ+복사 -pausebuilding = [accent][[{0}][] 를 눌러 건설 ì¼ì‹œì¤‘ì§€ -resumebuilding = [scarlet][[{0}][] 를 눌러 건설 재개 -wave = [accent]{0} 웨ì´ë¸Œ -wave.waiting = ë‹¤ìŒ ì›¨ì´ë¸Œê¹Œì§€[lightgray] {0}ì´ˆ -wave.waveInProgress = [lightgray]웨ì´ë¸Œ 진행중 +respawn = [accent][[{0}][] 키를 눌러 코어ì—서 부활 +cancelbuilding = [accent][[{0}][] 키를 눌러 건설 계íšì„ 초기화 +selectschematic = [accent][[{0}][] 키를 눌러 ì„ íƒ+복사 +pausebuilding = [accent][[{0}][] 키를 눌러 ê±´ì„¤ì„ ì¼ì‹œì¤‘ì§€ +resumebuilding = [scarlet][[{0}][] 키를 눌러 ê±´ì„¤ì„ ìž¬ê°œ +enablebuilding = [scarlet][[{0}][] 키를 눌러 ê±´ì„¤ì„ í™œì„± +showui = UIê°€ 숨겨졌습니다. [accent][[{0}][] 키를 눌러 UI를 활성화하세요. +wave = [accent]{0} 단계 +wave.cap = [accent]단계 {0}/{1} +wave.waiting = ë‹¤ìŒ ë‹¨ê³„ê¹Œì§€[lightgray] {0}ì´ˆ +wave.waveInProgress = [lightgray]단계 진행중 waiting = [lightgray]대기중... waiting.players = ìƒëŒ€ 플레ì´ì–´ë¥¼ 기다리는 중... wave.enemies = [lightgray]ì  ìœ ë‹› {0}명 ë‚¨ìŒ +wave.enemycores = [accent]{0}[lightgray] ì  ì½”ì–´ë“¤ +wave.enemycore = [accent]{0}[lightgray] ì  ì½”ì–´ wave.enemy = [lightgray]{0}명 ë‚¨ìŒ +wave.guardianwarn = [accent]{0}[] 단계 í›„ì— ìˆ˜í˜¸ìžê°€ 접근합니다. +wave.guardianwarn.one = [accent]{0}[] 단계 í›„ì— ìˆ˜í˜¸ìžê°€ 접근합니다. loadimage = 사진 불러오기 saveimage = 사진 저장 unknown = 알 수 ì—†ìŒ @@ -297,8 +336,8 @@ custom = ì‚¬ìš©ìž ì •ì˜ builtin = 내장 map.delete.confirm = ì •ë§ë¡œ ì´ ë§µì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? ì´ ëª…ë ¹ì€ ì·¨ì†Œí•  수 없습니다! map.random = [accent]무작위 ë§µ -map.nospawn = ì´ ë§µì— í”Œë ˆì´ì–´ê°€ ìŠ¤í° í•  코어가 없습니다! 편집기ì—서 [accent]orange[] 코어를 ë§µì— ì¶”ê°€í•˜ì„¸ìš”. -map.nospawn.pvp = ì´ ë§µì—는 ì  í”Œë ˆì´ì–´ê°€ 스í°í•  코어가 없습니다! 편집기ì—서 [royal]orange íŒ€ì´ ì•„ë‹Œ[] 코어를 추가하세요. +map.nospawn = ì´ ë§µì— í”Œë ˆì´ì–´ê°€ ìƒì„±ë  코어가 없습니다! 편집기ì—서 [accent]orange[] 코어를 ë§µì— ì¶”ê°€í•˜ì„¸ìš”. +map.nospawn.pvp = ì´ ë§µì—는 ì  í”Œë ˆì´ì–´ê°€ ìƒì„±ë  코어가 없습니다! 편집기ì—서 [royal]orange íŒ€ì´ ì•„ë‹Œ[] 코어를 추가하세요. map.nospawn.attack = ì´ ë§µì—는 플레ì´ì–´ê°€ 공격할 수 있는 ì ì˜ 코어가 없습니다! ì—디터ì—서 [royal]빨간색[] ì½”ì–´ë“¤ì„ ë§µì— ì¶”ê°€í•˜ì„¸ìš”. map.invalid = ë§µ 로드 오류: ë§µ 파ì¼ì´ ì†ìƒë˜ì—ˆê±°ë‚˜ ìž˜ëª»ëœ íŒŒì¼ìž…니다. workshop.update = ì•„ì´í…œ ì—…ë°ì´íЏ @@ -306,11 +345,11 @@ workshop.error = 창작마당 세부 ì‚¬í•­ì„ ê°€ì ¸ì˜¤ëŠ” 중 오류가 ë°œìƒ map.publish.confirm = ì´ ë§µì„ ê²Œì‹œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?\n\n[lightgray]창작마당 EULAì— ë¨¼ì € ë™ì˜í•´ì•¼ 하며, 그렇지 않으면 ë§µì´ í‘œì‹œë˜ì§€ 않습니다! workshop.menu = ì´ ì•„ì´í…œìœ¼ë¡œ 수행 í•  ìž‘ì—…ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. workshop.info = ì•„ì´í…œ ì •ë³´ -changelog = ë³€ê²½ì  (ì„ íƒ ì‚¬í•­) : +changelog = ë³€ê²½ì  (ì„ íƒ ì‚¬í•­): eula = 스팀 EULA missing = ì´ ì•„ì´í…œì€ ì‚­ì œë˜ê±°ë‚˜ ì´ë™ë˜ì—ˆìŠµë‹ˆë‹¤.\n[lightgray]창작마당 목ë¡ì´ ìžë™ìœ¼ë¡œ ì—°ê²° í•´ì œë˜ì—ˆìŠµë‹ˆë‹¤. -publishing = [accent]업로드 중... -publish.confirm = ì´ê²ƒì„ 게시 하시겠습니까?[lightgray]창작마당 EULAì— ë™ì˜í•´ì•¼ 합니다. 그렇지 않으면 ì•„ì´í…œì´ 표시ë˜ì§€ 않습니다! +publishing = [accent]게시 중... +publish.confirm = ì´ê²ƒì„ 게시하시겠습니까?[lightgray]창작마당 EULAì— ë™ì˜í•´ì•¼ 합니다. 그렇지 않으면 ì•„ì´í…œì´ 표시ë˜ì§€ 않습니다! publish.error = ì•„ì´í…œ 게시 오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} @@ -322,48 +361,49 @@ editor.mapinfo = ë§µ ì •ë³´ editor.author = 제작ìž: editor.description = 설명: editor.nodescription = ë§µì„ ì—…ë¡œë“œí•˜ë ¤ë©´ 최소 4ìž ì´ìƒì˜ ì„¤ëª…ì´ ìžˆì–´ì•¼ 합니다. -editor.waves = 웨ì´ë¸Œ: +editor.waves = 단계: editor.rules = 규칙: -editor.generation = ìƒì„±: -editor.ingame = ì¸ê²Œìž„ 편집 +editor.generation = 지형 ìƒì„±: +editor.ingame = ì¸ ê²Œìž„ 편집 editor.publish.workshop = 창작마당 게시 editor.newmap = ì‹ ê·œ ë§µ +editor.center = 중앙 workshop = 창작마당 -waves.title = 웨ì´ë¸Œ +waves.title = 단계 waves.remove = ì‚­ì œ -waves.never = 여기까지 유닛ìƒì„± waves.every = 매 -waves.waves = 웨ì´ë¸Œë§ˆë‹¤ -waves.perspawn = ìƒì„± -waves.shields = 보호막/웨ì´ë¸Œ +waves.waves = 단계마다 +waves.perspawn = 마리씩 ìƒì„±ë¨ +waves.shields = 방어막 hp/단계 waves.to = 부터 -waves.guardian = ë³´í˜¸ìž +waves.guardian = ìˆ˜í˜¸ìž waves.preview = 미리보기 waves.edit = 편집 waves.copy = í´ë¦½ë³´ë“œë¡œ 복사 waves.load = í´ë¦½ë³´ë“œì—서 불러오기 -waves.invalid = í´ë¦½ë³´ë“œì— ìž˜ëª»ëœ ì›¨ì´ë¸Œ ë°ì´í„°ê°€ 있습니다. -waves.copied = 웨ì´ë¸Œ ë³µì‚¬ë¨ -waves.none = ì  ì›¨ì´ë¸Œê°€ 설정ë˜ì§€ 않았습니다.\në¹„ì–´ìžˆì„ ì‹œ ìžë™ìœ¼ë¡œ 기본 ì  ì›¨ì´ë¸Œë¡œ 설정ë©ë‹ˆë‹¤. +waves.invalid = í´ë¦½ë³´ë“œì— ìž˜ëª»ëœ ë‹¨ê³„ ë°ì´í„°ê°€ 있습니다. +waves.copied = 단계 복사ë¨. +waves.none = ì  ë‹¨ê³„ê°€ 설정ë˜ì§€ 않았습니다.\në¹„ì–´ìžˆì„ ì‹œ ìžë™ìœ¼ë¡œ 기본 ì  ë‹¨ê³„ ë°ì´í„°ë¡œ 설정ë©ë‹ˆë‹¤. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#these are intentionally in lower case +wavemode.counts = 마리 +wavemode.totals = ì´ +wavemode.health = ì²´ë ¥ editor.default = [lightgray]<기본값> -details = 설명 -edit = 편집 +details = 설명... +edit = 편집... editor.name = ì´ë¦„: editor.spawn = 유닛 ìƒì„± editor.removeunit = 유닛 ì‚­ì œ editor.teams = 팀 editor.errorload = 파ì¼ì„ 불러오지 못했습니다. editor.errorsave = 파ì¼ì„ 저장하지 못했습니다. -editor.errorimage = ì´ê²ƒì€ ë§µì´ ì•„ë‹ˆë¼ ì‚¬ì§„ìž…ë‹ˆë‹¤.\n\n3.5/build 40 ë§µì„ ê°€ì ¸ì˜¬ë ¤ë©´ 편집기ì—서 '예전 ë§µ 가져오기' ë²„íŠ¼ì„ ì‚¬ìš©í•˜ì„¸ìš”. +editor.errorimage = ì´ê²ƒì€ ë§µì´ ì•„ë‹ˆë¼ ì‚¬ì§„ìž…ë‹ˆë‹¤. editor.errorlegacy = ì´ ë§µì€ ë„ˆë¬´ 오래ë˜ì–´ ë” ì´ìƒ ì§€ì›ë˜ì§€ 않는 구형 ë§µ 형ì‹ì„ 사용합니다. editor.errornot = ë§µ 파ì¼ì´ 아닙니다. editor.errorheader = ì´ ë§µ 파ì¼ì€ 유효하지 않거나 ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤. -editor.errorname = ë§µì— ì´ë¦„ì´ ì§€ì •ë˜ì–´ 있지 않습니다. 저장 파ì¼ì„ 불러오려 합니까? +editor.errorname = ë§µì— ì´ë¦„ì´ ì§€ì •ë˜ì–´ 있지 않습니다. 저장 파ì¼ì„ 불러오려고 시ë„하는 건가요? editor.update = ì—…ë°ì´íЏ editor.randomize = 무작위 editor.apply = ì ìš© @@ -382,7 +422,7 @@ editor.importfile = íŒŒì¼ ê°€ì ¸ì˜¤ê¸° editor.importfile.description = 외부 ë§µ íŒŒì¼ ê°€ì ¸ì˜¤ê¸° editor.importimage = 사진 íŒŒì¼ ê°€ì ¸ì˜¤ê¸° editor.importimage.description = 외부 ë§µ 사진 íŒŒì¼ ê°€ì ¸ì˜¤ê¸° -editor.export = 내보내기 +editor.export = 내보내기... editor.exportfile = íŒŒì¼ ë‚´ë³´ë‚´ê¸° editor.exportfile.description = ë§µ íŒŒì¼ ë‚´ë³´ë‚´ê¸° editor.exportimage = 지형 ì´ë¯¸ì§€ 내보내기 @@ -404,48 +444,50 @@ toolmode.replaceall.description = ë§µì— ìžˆëŠ” 모든 블ë¡ì„ 재배치합니 toolmode.orthogonal = ì§ê° toolmode.orthogonal.description = ì§ê°ìœ¼ë¡œ 블ë¡ì„ 배치합니다. toolmode.square = 정사ê°í˜• -toolmode.square.description = 정사ê°í˜• í˜•íƒœì˜ ë¸ŒëŸ¬ì‹œ. +toolmode.square.description = 정사ê°í˜• í˜•íƒœì˜ ë¸ŒëŸ¬ì‹œë¡œ êµì²´í•©ë‹ˆë‹¤. toolmode.eraseores = ìžì› 초기화 toolmode.eraseores.description = ìžì›ë§Œ 초기화합니다. toolmode.fillteams = 팀 채우기 -toolmode.fillteams.description = ë¸”ë¡ ëŒ€ì‹  팀 건물로 채ì›ë‹ˆë‹¤. -toolmode.drawteams = 팀 색ìƒìœ¼ë¡œ 그리기 -toolmode.drawteams.description = ë¸”ë¡ ëŒ€ì‹  팀 ê±´ë¬¼ì„ ë°°ì¹˜í•©ë‹ˆë‹¤. +toolmode.fillteams.description = ë¸”ë¡ ëŒ€ì‹  ì„ íƒí•œ 팀으로 ë¸”ë¡ íŒ€ì„ ì±„ì›ë‹ˆë‹¤. +toolmode.drawteams = 팀 그리기 +toolmode.drawteams.description = ë¸”ë¡ ëŒ€ì‹  ì„ íƒí•œ 팀으로 ë¸”ë¡ íŒ€ì„ ê·¸ë¦½ë‹ˆë‹¤. filters.empty = [lightgray]í•„í„°ê°€ 없습니다! 아래 ë²„íŠ¼ì„ ëˆŒëŸ¬ 하나를 추가하세요. filter.distort = 왜곡 filter.noise = ë…¸ì´ì¦ˆ -filter.enemyspawn = ì  ìŠ¤í° ì„ íƒ +filter.enemyspawn = ì  ì†Œí™˜ì§€ì  ì„ íƒ +filter.spawnpath = ìžë™ìƒì„±ëœ ì  ì´ë™ê²½ë¡œ í­ filter.corespawn = 코어 ì„ íƒ filter.median = 중앙값 -filter.oremedian = ìžì› 중앙값 -filter.blend = 블렌드 -filter.defaultores = 기본 ìžì› -filter.ore = ìžì› -filter.rivernoise = 협곡 ë…¸ì´ì¦ˆ +filter.oremedian = 광물 중앙값 +filter.blend = 가장ìžë¦¬ +filter.defaultores = 기본 광물 +filter.ore = 광물 +filter.rivernoise = ê°• ë…¸ì´ì¦ˆ filter.mirror = 거울 filter.clear = 초기화 filter.option.ignore = 무시 filter.scatter = í©ë¿Œë¦¬ê¸° filter.terrain = 지형 -filter.option.scale = 규모 -filter.option.chance = 배치 횟수 +filter.option.scale = í¬ê¸° +filter.option.chance = 배치 ë¹ˆë„ filter.option.mag = í¬ê¸° -filter.option.threshold = 문턱 +filter.option.threshold = í•œê³„ì  filter.option.circle-scale = ì› í¬ê¸° filter.option.octaves = 옥타브 filter.option.falloff = 경사 filter.option.angle = ê°ë„ filter.option.amount = 개수 filter.option.block = ë¸”ë¡ -filter.option.floor = 바닥 -filter.option.flooronto = 목표 바닥 +filter.option.floor = íƒ€ì¼ +filter.option.flooronto = ëŒ€ìƒ íƒ€ì¼ +filter.option.target = ëŒ€ìƒ filter.option.wall = ë²½ -filter.option.ore = ìžì› -filter.option.floor2 = 2층 바닥 -filter.option.threshold2 = 2번째 문턱 +filter.option.ore = 광물 +filter.option.floor2 = 2번째 íƒ€ì¼ +filter.option.threshold2 = 2번째 경계선 filter.option.radius = 반경 -filter.option.percentile = 백분위수 +filter.option.percentile = 백분율 width = ë„“ì´: height = 높ì´: @@ -453,79 +495,102 @@ menu = 메뉴 play = í”Œë ˆì´ campaign = ìº íŽ˜ì¸ load = 불러오기 -save = 저장 +save = 저장하기 fps = FPS: {0} ping = Ping: {0}ms +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb language.restart = 언어 ì„¤ì •ì„ ì ìš©í•˜ë ¤ë©´ ê²Œìž„ì„ ë‹¤ì‹œ 시작하세요. settings = 설정 tutorial = 튜토리얼 -tutorial.retake = 튜토리얼 다시 시작 +tutorial.retake = íŠœí† ë¦¬ì–¼ì„ ë‹¤ì‹œ 시작하기 editor = 편집기 mapeditor = ë§µ 편집기 -abandon = í¬ê¸° +abandon = í¬ê¸°í•˜ê¸° abandon.text = ì´ ì§€ì—­ê³¼ 모든 ìžì›ì´ ì ì—게 넘어갑니다. locked = ìž ê¹€ complete = [lightgray]해금 ì¡°ê±´ : -requirement.wave = {1}지역ì—서 {0}웨ì´ë¸Œ 달성 -requirement.core = {0}지역ì—서 ì  ì½”ì–´ë¥¼ 파괴 -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = 지역 재개:\n[lightgray]{0} -bestwave = [lightgray]최고 웨ì´ë¸Œ: {0} -launch = < 출격 > -launch.text = Launch -launch.title = 출격 성공 -launch.next = [lightgray]ë‹¤ìŒ ì¶œê²© 기회는 {0} 웨ì´ë¸Œì—서 나타납니다. -launch.unable2 = [scarlet]출격할 수 없습니다.[] -launch.confirm = ì´ê²ƒì€ ë‹¹ì‹ ì˜ ì½”ì–´ì— ìžˆëŠ” 모든 ìžì›ì„ 출격 시킬 것입니다.\në‹¹ì‹ ì€ ì´ ê¸°ì§€ë¡œ 다시 ëŒì•„올 수 ì—†ì„ ê²ƒìž…ë‹ˆë‹¤. -launch.skip.confirm = 지금 건너뛰면 ë‹¤ìŒ ì¶œê²© 웨ì´ë¸Œê°€ ëë‚  때까지 출격할 수 없습니다. +requirement.wave = {1} 지역ì—서 {0}단계 달성 +requirement.core = {0} 지역ì—서 ì  ì½”ì–´ë¥¼ 파괴 +requirement.research = {0} 연구 +requirement.capture = {0} ì ë ¹ +bestwave = [lightgray]최고 단계: {0} +launch.text = 출격 +research.multiplayer = ìº íŽ˜ì¸ ë©€í‹° í”Œë ˆì´ ì‹œì—는 해당 ìº íŽ˜ì¸ ì„œë²„ì˜ í˜¸ìŠ¤íŠ¸ë§Œ 연구할 수 있습니다. +map.multiplayer = ìº íŽ˜ì¸ ë©€í‹° í”Œë ˆì´ ì‹œì—는 해당 ìº íŽ˜ì¸ ì„œë²„ì˜ í˜¸ìŠ¤íŠ¸ë§Œ 다른 ì„¹í„°ë“¤ì„ ë³´ê³ , ì´ë™ì´ 가능합니다. uncover = 지역 개방 -configure = 로드아웃 설정 -loadout = Loadout -resources = Resources +configure = 초기ìžì› 설정 + +loadout = 출격 +resources = ìžì› bannedblocks = ê¸ˆì§€ëœ ë¸”ë¡ë“¤ addall = ëª¨ë‘ ì¶”ê°€ -launch.destination = Destination: {0} +launch.from = 출격 출발지 : [accent]{0} +launch.destination = 목ì ì§€: {0} configure.invalid = 해당 ê°’ì€ 0ì—서 {0} 사ì´ì˜ 숫ìžì—¬ì•¼ 합니다. -zone.unlocked = [lightgray]{0} 해금ë¨. -zone.requirement.complete = {0}ì— ëŒ€í•œ 요구 사항 충족:[lightgray]\n{1} -zone.resources = [lightgray]ê°ì§€ëœ ìžì›: -zone.objective = [lightgray]목표: [accent]{0} -zone.objective.survival = ìƒì¡´ -zone.objective.attack = ì  ì½”ì–´ 파괴 add = 추가... -boss.health = 보스 ì²´ë ¥ +boss.health = ìˆ˜í˜¸ìž ì²´ë ¥ connectfail = [scarlet]ì—°ê²° 오류:\n\n[accent]{0} error.unreachable = ì„œë²„ì— ì—°ê²°í•˜ì§€ 못했습니다.\n서버 주소가 정확히 ìž…ë ¥ë˜ì—ˆë‚˜ìš”? error.invalidaddress = ìž˜ëª»ëœ ì£¼ì†Œìž…ë‹ˆë‹¤. -error.timedout = 시간 초과!\nì„œë²„ì— í¬íЏ í¬ì›Œë”©ì´ 설정ë˜ì–´ 있고 주소가 올바른지 확ì¸í•˜ì‹­ì‹œì˜¤. +error.timedout = 시간 초과!\nì„œë²„ì— í¬íЏ í¬ì›Œë”©ì´ 설정ë˜ì–´ 있고 주소가 올바른지 확ì¸í•˜ì„¸ìš”. error.mismatch = 패킷 오류\ní´ë¼ì´ì–¸íЏ/서버 ë²„ì „ì´ ì¼ì¹˜í•˜ì§€ 않습니다.\nì ‘ì†í•˜ë ¤ëŠ” 서버가 최신 버전ì¸ì§€ 확ì¸í•˜ì„¸ìš”! -error.alreadyconnected = ì´ë¯¸ ì ‘ì†ì¤‘입니다. +error.alreadyconnected = ì´ë¯¸ ì ‘ì† ì¤‘ìž…ë‹ˆë‹¤. error.mapnotfound = ë§µ 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다! error.io = ë„¤íŠ¸ì›Œí¬ I/O 오류. error.any = 알 수 없는 ë„¤íŠ¸ì›Œí¬ ì˜¤ë¥˜. -error.bloom = 블룸 그래픽 효과를 ì ìš©í•˜ì§€ 못했습니다.\në‹¹ì‹ ì˜ ê¸°ê¸°ê°€ ì´ ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않는 ê²ƒì¼ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. +error.bloom = 블룸 그래픽 효과를 ì ìš©í•˜ì§€ 못했습니다.\n기기가 ì´ ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않는 ê²ƒì¼ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = 비 +weather.snow.name = 눈 +weather.sandstorm.name = 모래 í­í’ +weather.sporestorm.name = í¬ìž í­í’ +weather.fog.name = 안개 -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]미개척지 +sectors.resources = ìžì›: +sectors.production = ìƒì‚°ëŸ‰: +sectors.export = 수출량: +sectors.time = ì§„í–‰ 시간: +sectors.threat = 위험ë„: +sectors.wave = 단계: +sectors.stored = 저장량: +sectors.resume = 재개 +sectors.launch = 출격 +sectors.select = ì„ íƒ +sectors.nonelaunch = [lightgray]ì—†ìŒ (sun) +sectors.rename = 구역 ì´ë¦„ 변경 +sectors.enemybase = [scarlet]ì  ê¸°ì§€ +sectors.vulnerable = [scarlet]취약함 +sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% ì†ìƒë¨. +sectors.survives = [accent]{0} 단계 ì´ìƒ 버티세요. +sectors.go =ì§„ìž… +sector.curcapture = 지역 ì ë ¹ë¨ +sector.curlost = 지역 ìžƒìŒ +sector.missingresources = [scarlet]ìžì› 부족 +sector.attacked = [accent]{0}[white] ì§€ì—­ì´ ê³µê²©ë°›ê³  있습니다! +sector.lost = [accent]{0}[white] ì§€ì—­ì„ ìžƒì—ˆìŠµë‹ˆë‹¤! +#note: the missing space in the line below is intentional +sector.captured = [accent]{0}[white] ì§€ì—­ì„ ì ë ¹í–ˆìŠµë‹ˆë‹¤! +threat.low = ë‚®ìŒ +threat.medium = 높지 않지만 ë‚®ì§€ë„ ì•ŠìŒ +threat.high = ë†’ìŒ +threat.extreme = 매우 ë†’ìŒ +threat.eradication = 극한 + +planets = 태양계 + +planet.serpulo.name = 세르플로 +planet.sun.name = 태양 + +sector.impact0078.name = íí—ˆ : Impact 0078 sector.groundZero.name = 전초기지 sector.craters.name = í¬ë ˆì´í„° sector.frozenForest.name = ì–¼ì–´ë¶™ì€ ìˆ² -sector.ruinousShores.name = íí—ˆ +sector.ruinousShores.name = íŒŒê´´ëœ í•´ì•ˆê°€ sector.stainedMountains.name = 얼룩진 ì‚°ë§¥ sector.desolateRift.name = 황í한 협곡 sector.nuclearComplex.name = 핵 ìƒì‚° 단지 @@ -533,158 +598,235 @@ sector.overgrowth.name = 과성장 지대 sector.tarFields.name = 타르 ë²ŒíŒ sector.saltFlats.name = 소금 사막 sector.fungalPass.name = í¬ìž 지대 +sector.biomassFacility.name = 유기물 합성 시설 +sector.windsweptIslands.name = í­í’ì˜ ê²©ì „ì§€ +sector.extractionOutpost.name = ìžì› 추출기지 +sector.planetaryTerminal.name = 대행성 출격단지 -sector.groundZero.description = ì´ ìž¥ì†ŒëŠ” 다시 ì‹œìž‘í•˜ê¸°ì— ìµœì ì˜ í™˜ê²½ì„ ì§€ë‹Œ 장소입니다. ì ì˜ 위협 ìˆ˜ì¤€ì´ ë‚®ìœ¼ë©°, ìžì›ì´ ê±°ì˜ ì—†ìŠµë‹ˆë‹¤.\n가능 한 ë§Žì€ ì–‘ì˜ êµ¬ë¦¬ì™€ ë‚©ì„ ìˆ˜ì§‘í•˜ì„¸ìš”.\nì´ë™ 합시다. +sector.groundZero.description = ì´ ìž¥ì†ŒëŠ” 다시 ì‹œìž‘í•˜ê¸°ì— ìµœì ì˜ í™˜ê²½ì„ ì§€ë‹Œ 장소입니다. ì ì˜ 위협 ìˆ˜ì¤€ì´ ë‚®ìœ¼ë©°, ìžì›ì´ ê±°ì˜ ì—†ìŠµë‹ˆë‹¤.\n가능 한 ë§Žì€ ì–‘ì˜ êµ¬ë¦¬ì™€ ë‚©ì„ ìˆ˜ì§‘í•˜ì„¸ìš”.\nì´ì œ 출격할 시간입니다! sector.frozenForest.description = ì´ê³³ì—서ë„, ì‚°ì— ê°€ê¹Œìš´ ê³³ì— í¬ìžê°€ í¼ì¡ŒìŠµë‹ˆë‹¤. 추운 온ë„ì—ì„œë„ í¬ìžë“¤ì„ ë§‰ì„ ìˆ˜ ì—†ì„ ê²ƒ 같습니다.\n화력 발전기를 건설하고, 멘ë”를 사용하는 ë°©ë²•ì„ ë°°ìš°ì„¸ìš”. sector.saltFlats.description = ì´ ì†Œê¸ˆ ì‚¬ë§‰ì€ ë§¤ìš° 척박하여 ìžì›ì´ ê±°ì˜ ì—†ìŠµë‹ˆë‹¤.\n하지만 ìžì›ì´ í¬ì†Œí•œ ì´ê³³ì—ì„œë„ ì ë“¤ì˜ 요새가 발견ë˜ì—ˆìŠµë‹ˆë‹¤. ê·¸ë“¤ì„ ì‚¬ë§‰ì˜ ëª¨ëž˜ë¡œ 만들어버리십시오. sector.craters.description = ë¬¼ì´ ê°€ë“한 ì´ í¬ë ˆì´í„°ì—는 옛 ì „ìŸì˜ ìœ ë¬¼ë“¤ì´ ìŒ“ì—¬ìžˆìŠµë‹ˆë‹¤.\nì´ê³³ì„ 다시 ì ë ¹í•´ ê°•í™” 유리를 제작하고 ë¬¼ì„ ëŒì–´ì˜¬ë ¤ í¬íƒ‘ê³¼ ë“œë¦´ì— ê³µê¸‰í•˜ì—¬ ë” ì¢‹ì€ íš¨ìœ¨ë¡œ ë°©ì–´ì„ ì„ ê°•í™”í•˜ì‹­ì‹œì˜¤. sector.ruinousShores.description = ì´ ì§€ì—­ì€ ê³¼ê±° 해안방어기지로 사용ë˜ì—ˆìŠµë‹ˆë‹¤.\n그러나 ì§€ê¸ˆì€ ê¸°ë³¸êµ¬ì¡°ë¬¼ë§Œ 남아있으니 ì´ ì§€ì—­ì„ ì–´ì„œ ì‹ ì†ížˆ 수리하여 외부로 ì„¸ë ¥ì„ í™•ìž¥í•œ ë’¤, 잃어버린 ê¸°ìˆ ì„ ë‹¤ì‹œ 회수하십시오. -sector.stainedMountains.description = ë” ì•ˆìª½ì—는 í¬ìžì— ì˜¤ì—¼ëœ ì‚°ë§¥ì´ ìžˆì§€ë§Œ, ì´ ê³³ì€ í¬ìžì— 오염ë˜ì§€ 않았습니다.\nì´ ì§€ì—­ì—서 í‹°íƒ€ëŠ„ì„ ì±„êµ´í•˜ê³  ì´ê²ƒì„ 어떻게 사용하는지 배우십시오.\n\nì ë“¤ì€ ì´ê³³ì—서 ë” ê°•ë ¥í•©ë‹ˆë‹¤. ë” ê°•í•œ ìœ ë‹›ë“¤ì´ ë‚˜ì˜¬ 때까지 ì‹œê°„ì„ ë‚­ë¹„í•˜ì§€ 마십시오. -sector.overgrowth.description = ì´ ê³³ì€ í¬ìžë“¤ì˜ ê·¼ì›ê³¼ 가까ì´ì— 있는 과성장 지대입니다. ì ì´ ì´ ê³³ì— ì „ì´ˆê¸°ì§€ë¥¼ 설립했습니다. 디거를 ìƒì‚°í•´ ì ì˜ 코어를 ë°•ì‚´ ë‚´ê³  우리가 잃어버린 ê²ƒë“¤ì„ ë˜ëŒë ¤ë°›ìœ¼ì‹­ì‹œì˜¤! -sector.tarFields.description = 산지와 사막 사ì´ì— 위치한 ì„유 ìƒì‚°ì§€ì˜ 외곽 지역ì´ë©°, 사용 가능한 타르가 매장ë˜ì–´ 있는 í¬ê·€í•œ 지역 중 하나입니다. 버려진 지역ì´ì§€ë§Œ ì´ê³³ì—는 위험한 ì êµ°ë“¤ì´ 있습니다. ê·¸ë“¤ì„ ê³¼ì†Œí‰ê°€í•˜ì§€ 마십시오.\n\n[lightgray]ì„유 ìƒì‚°ê¸°ìˆ ì„ ìµížˆëŠ” ê²ƒì´ ë„ì›€ì´ ë  ê²ƒìž…ë‹ˆë‹¤. -sector.desolateRift.description = ê·¹ë„로 위험한 지역입니다. ìžì›ì€ í’부하지만 사용 가능한 ê³µê°„ì€ ê±°ì˜ ì—†ìŠµë‹ˆë‹¤. 코어 íŒŒê´´ì˜ ìœ„í—˜ì„±ì´ ë†’ìœ¼ë‹ˆ 가능한 빨리 떠나십시오. ë˜í•œ ì ì˜ 공격 딜레ì´ê°€ 길다고 안심하지 마십시오. -sector.nuclearComplex.description = 과거 í† ë¥¨ì˜ ìƒì‚°, 연구와 처리를 위해 ìš´ì˜ë˜ì—ˆë˜ 시설입니다. ì§€ê¸ˆì€ ê·¸ì € í허로 ì „ë½í–ˆìœ¼ë©°, ë‹¤ìˆ˜ì˜ ì ì´ 배치ë˜ì–´ 있는 지역입니다. ê·¸ë“¤ì€ ëŠìž„ì—†ì´ ë‹¹ì‹ ì„ ê³µê²©í•  것입니다.\n\n[lightgray]í† ë¥¨ì˜ ë‹¤ì–‘í•œ ì‚¬ìš©ë²•ì„ ì—°êµ¬í•˜ê³  ìµížˆì‹­ì‹œì˜¤. -sector.fungalPass.description = ë†’ì€ ì‚°ê³¼ ë‚®ì€ ë•… 사ì´ì˜ 전환 지역. ìž‘ì€ ì  ì •ì°° 기지가 ì—¬ê¸°ì— ìžˆìŠµë‹ˆë‹¤.\nê·¸ê²ƒë“¤ì„ íŒŒê´´í•˜ì„¸ìš”.\n대거와 í¬ë¡¤ëŸ¬ ìœ ë‹›ì„ ì‚¬ìš©í•˜ì—¬ ë‘ê°œì˜ ì½”ì–´ë¥¼ 파괴하세요. +sector.stainedMountains.description = ë” ì•ˆìª½ì—는 í¬ìžì— ì˜¤ì—¼ëœ ì‚°ë§¥ì´ ìžˆì§€ë§Œ, ì´ê³³ì€ ì•„ì§ í¬ìžì— 오염ë˜ì§€ 않았습니다.\nì´ ì§€ì—­ì—서 í‹°íƒ€ëŠ„ì„ ì±„êµ´í•˜ê³  ì´ê²ƒì„ 어떻게 사용하는지 배우십시오.\n\nì ë“¤ì€ ì´ê³³ì—서 ë” ê°•ë ¥í•©ë‹ˆë‹¤. ë” ê°•í•œ ìœ ë‹›ë“¤ì´ ë‚˜ì˜¬ 때까지 ì‹œê°„ì„ ë‚­ë¹„í•˜ì§€ 마십시오. +sector.overgrowth.description = ì´ê³³ì€ í¬ìžë“¤ì˜ ê·¼ì›ê³¼ 가까ì´ì— 있는 과성장 지대입니다. ì ì´ ì´ê³³ì— 전초기지를 설립했습니다. 대거를 ìƒì‚°í•´ ì ì˜ 코어를 ë°•ì‚´ ë‚´ê³  우리가 잃어버린 ê²ƒë“¤ì„ ë˜ëŒë ¤ë°›ìœ¼ì‹­ì‹œì˜¤! +sector.tarFields.description = 산지와 사막 사ì´ì— 있는 ì„유 ìƒì‚°ì§€ì˜ 외곽 지역ì´ë©°, 사용 가능한 타르가 매장ë˜ì–´ 있는 í¬ê·€í•œ 지역 중 하나입니다. 버려진 지역ì´ì§€ë§Œ ì´ê³³ì—는 위험한 ì êµ°ë“¤ì´ 있습니다. ê·¸ë“¤ì„ ê³¼ì†Œí‰ê°€í•˜ì§€ 마십시오.\n\n[lightgray]ì„유 ìƒì‚°ê¸°ìˆ ì„ ìµížˆëŠ” ê²ƒì´ ë„ì›€ì´ ë  ê²ƒìž…ë‹ˆë‹¤. +sector.desolateRift.description = ê·¹ë„로 위험한 지역입니다. ìžì›ì€ í’부하지만, 사용 가능한 ê³µê°„ì€ ê±°ì˜ ì—†ìŠµë‹ˆë‹¤. 코어 íŒŒê´´ì˜ ìœ„í—˜ì„±ì´ ë†’ìœ¼ë‹ˆ 가능한 한 빨리 떠나십시오. ë˜í•œ, ì ì˜ 공격 딜레ì´ê°€ 길다고 안심하지 마십시오. +sector.nuclearComplex.description = 과거 í† ë¥¨ì˜ ìƒì‚°, 연구와 처리를 위해 ìš´ì˜ë˜ì—ˆë˜ 시설입니다. ì§€ê¸ˆì€ ê·¸ì € í허로 ì „ë½í–ˆìœ¼ë©°, ë‹¤ìˆ˜ì˜ ì ì´ ë°°ì¹˜ëœ ì§€ì—­ìž…ë‹ˆë‹¤. ê·¸ë“¤ì€ ëŠìž„ì—†ì´ ë‹¹ì‹ ì„ ê³µê²©í•  것입니다.\n\n[lightgray]í† ë¥¨ì˜ ë‹¤ì–‘í•œ ì‚¬ìš©ë²•ì„ ì—°êµ¬í•˜ê³  ìµížˆì‹­ì‹œì˜¤. +sector.fungalPass.description = ë†’ì€ ì‚°ê³¼ ë‚®ì€ ë•… 사ì´ì˜ 전환 지역. ìž‘ì€ ì  ì •ì°° 기지가 ì—¬ê¸°ì— ìžˆìŠµë‹ˆë‹¤.\nê·¸ê²ƒë“¤ì„ íŒŒê´´í•˜ì„¸ìš”.\n대거와 í¬ë¡¤ëŸ¬ ìœ ë‹›ì„ ì‚¬ìš©í•˜ì—¬ ë‘ ê°œì˜ ì½”ì–´ë¥¼ 파괴하세요. +sector.biomassFacility.description = í¬ìžì˜ ì‹œìž‘ì´ ë˜ëŠ” 지역입니다. ì´ ì‹œì„¤ì€ í¬ìžë¥¼ 연구하고 ê·¸ê²ƒë“¤ì„ ê°€ìž¥ ì²˜ìŒ ìƒì‚°í–ˆìŠµë‹ˆë‹¤.\nì´ ì‹œì„¤ì— ê¸°ë¡ëœ ê¸°ìˆ ì„ ë°°ìš°ê³ , 연료와 플ë¼ìŠ¤í„°ëŠ„ì„ ìƒì‚°í•˜ê¸° 위해 í¬ìžë¥¼ 배양하세요. \n\n[lightgray]ì´ ì‹œì„¤ì´ ë¶•ê´´í•œ 후ì—, 시설 ë‚´ì— ë°°ì–‘ë˜ë˜ í¬ìžë“¤ì´ 외부로 ë°©ì¶œë˜ì—ˆìŠµë‹ˆë‹¤. ì´ë¡œ ì¸í•´ ìƒíƒœê³„ êµëž€ì¢…ì¸ í¬ìžê°€ 지역 ìƒíƒœê³„ì—서 번ì‹í•˜ê²Œ ë˜ì—ˆê³ , ê·¸ ë¬´ì—‡ë„ ì´ ë¬´ìžë¹„하고 ìž‘ì€ ì¹¨ëžµìžì—게 대항할 수 없었습니다. +sector.windsweptIslands.description = 육지ì—서 멀리 떨어진 ì´ê³³ì—는 ìž‘ì€ êµ°ë„ê°€ 있습니다. ì´ ì§€ì—­ì„ ì¡°ì‚¬í•´ë³´ë©´ 한 때 [accent]플ë¼ìŠ¤í„°ëŠ„[]ì„ ìƒì‚°í•œ í”ì ì´ 남아있습니다.\n\n몰려오는 ì  í•´êµ°ì„ ë§‰ìœ¼ë©°, ì„¬ì— ê¸°ì§€ë¥¼ 건설하고, ê³µìž¥ë“¤ì„ ì—°êµ¬í•˜ì‹­ì‹œì˜¤. +sector.extractionOutpost.description = ì ì´ 다른 ì§€ì—­ì— ìžì›ì„ 보내기 위한 ìš©ë„로 건설한 보급기지입니다.\n\n강력한 ì ë“¤ì´ 지키고 있거나, 침공해올 ì˜ˆì •ì¸ ì§€ì—­ì„ íš¨ê³¼ì ìœ¼ë¡œ 침공/수호하기 위해서는 ìš°ë¦¬ë„ ì´ ìˆ˜ì†¡ ê¸°ìˆ ì´ í•„ìš”í•©ë‹ˆë‹¤. ì ì˜ 기지를 파괴하고, ê·¸ë“¤ì˜ ìˆ˜ì†¡ ê¸°ìˆ ì„ ì•½íƒˆí•˜ì‹­ì‹œì˜¤. +sector.impact0078.description = ì´ê³³ì—는 ì‹œìŠ¤í…œì— ì²˜ìŒ ì§„ìž…í•œ 우주 ìˆ˜ì†¡ì„ ì˜ ìž”í•´ê°€ 있습니다.\n\nìš°ì£¼ì„ ì´ íŒŒê´´ëœ ìž”í•´ì—서 최대한 ë§Žì€ ìžì›ì„ 회수하고, ì†ìƒë˜ì§€ ì•Šì€ ê·¸ë“¤ì˜ ê¸°ìˆ ì„ íšë“하세요. +sector.planetaryTerminal.description = ì´ í–‰ì„±ì—ì„œì˜ ë§ˆì§€ë§‰ 전투를 준비하세요.\n\nì ì´ í•„ì‚¬ì˜ ê°ì˜¤ë¡œ 지키고 있는 ì´ í•´ì•ˆ 기지엔 ìš°ì£¼ì— ì½”ì–´ë¥¼ 발사할 수 있는 ì‹œì„¤ì´ ìžˆìŠµë‹ˆë‹¤.\n\ní•´êµ°ì„ ìƒì‚°í•˜ì—¬ ì ì„ ì‹ ì†í•˜ê²Œ 제거하고, ê·¸ë“¤ì˜ ì½”ì–´ 발사 ê¸°ìˆ ì„ ì•½íƒˆí•˜ì‹­ì‹œì˜¤.\n\n[royal] 건투를 빕니다.[] + +status.burning.name = ë°©í™” +status.freezing.name = 빙결 +status.wet.name = ì –ìŒ +status.muddy.name = ì§ˆì²™í•´ì§ +status.melting.name = 융해 +status.sapped.name = í¡í˜ˆë¨ +status.spore-slowed.name = í¬ìž ëŠë ¤ì§ +status.tarred.name = Tarred +status.overclock.name = 과부하 +status.shocked.name = 충격 +status.blasted.name = í­íŒŒë¨ +status.unmoving.name = 멈춤 settings.language = 언어 settings.data = 게임 ë°ì´í„° -settings.reset = 설정 초기화 -settings.rebind = 키 설정 -settings.resetKey = 키 초기화 +settings.reset = 기본값으로 초기화 +settings.rebind = 설정 +settings.resetKey = 초기화 settings.controls = ì¡°ìž‘ settings.game = 게임 settings.sound = 소리 settings.graphics = 그래픽 -settings.cleardata = 게임 ë°ì´í„° 초기화... -settings.clear.confirm = ì •ë§ë¡œ ì´ ë°ì´í„°ë¥¼ 지우시겠습니까?\nì™„ë£Œëœ ìž‘ì—…ì€ ì·¨ì†Œí•  수 없습니다! -settings.clearall.confirm = [scarlet]경고![]\nì´ ìž‘ì—…ì€ ì €ìž¥ëœ ë§µ, 맵파ì¼, 잠금 í•´ì œëœ ëª©ë¡ê³¼ 키 매핑, 그리고 모든 ë°ì´í„°ë¥¼ 삭제합니다.\ní™•ì¸ ë²„íŠ¼ì„ ë‹¤ì‹œ 눌러 모든 ë°ì´í„°ë¥¼ 삭제하고 게임ì—서 나갑니다. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.cleardata = 게임 ë°ì´í„° 초기화 +settings.clear.confirm = ì •ë§ë¡œ ì´ ë°ì´í„°ë¥¼ 지우시겠습니까?\në˜ëŒë¦´ 수 없습니다! +settings.clearall.confirm = [scarlet]경고![]\nì´ ìž‘ì—…ì€ ì €ìž¥ëœ ë§µ, 맵파ì¼, 잠금 í•´ì œëœ ëª©ë¡ê³¼ 조작키 설정, 그리고 모든 ë°ì´í„°ë¥¼ 삭제합니다.\ní™•ì¸ ë²„íŠ¼ì„ ë‹¤ì‹œ 눌러 모든 ë°ì´í„°ë¥¼ 삭제하고 게임ì—서 나갑니다. +settings.clearsaves.confirm = ì •ë§ë¡œ 모든 ì €ìž¥ëœ íŒŒì¼ë“¤ì„ 삭제하시겠습니까? +settings.clearsaves = 저장 초기화 +settings.clearresearch = 연구 초기화 +settings.clearresearch.confirm = ì •ë§ë¡œ 모든 연구를 삭제하시겠습니까? +settings.clearcampaignsaves = ìº íŽ˜ì¸ ë§µ 초기화 +settings.clearcampaignsaves.confirm = ì •ë§ë¡œ 캠페ì¸ì„ 초기화하시겠습니까? paused = [accent]< ì¼ì‹œì •ì§€ > clear = 초기화 -banned = [scarlet]ì°¨ë‹¨ë¨ -unplaceable.sectorcaptured = [scarlet]ì ë ¹ëœ êµ¬ì—­ì´ í•„ìš”í•©ë‹ˆë‹¤ -yes = 예 -no = 아니오 +banned = [scarlet]ê¸ˆì§€ë¨ +yes = O +no = X info.title = ì •ë³´ -error.title = [scarlet]오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. +error.title = [scarlet]오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤ error.crashtitle = 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤ -unit.nobuild = [scarlet]ì´ ìœ ë‹›ì€ ê±´ì„¤í•  수 없습니다. -blocks.input = ìž…ë ¥ -blocks.output = 출력 -blocks.booster = ê°€ì† -blocks.tiles = 필요한 íƒ€ì¼ -blocks.affinities = 친화력 +unit.nobuild = [scarlet]건설 불가 +lastaccessed = [lightgray]마지막 ì ‘ê·¼: {0} block.unknown = [lightgray]??? -blocks.powercapacity = ì „ë ¥ 용량 -blocks.powershot = ì „ë ¥/ë°œ -blocks.damage = 공격력 -blocks.targetsair = 공중 공격 -blocks.targetsground = ì§€ìƒ ê³µê²© -blocks.itemsmoved = ì´ë™ ì†ë„ -blocks.launchtime = 출격 간격 -blocks.shootrange = 사거리 -blocks.size = í¬ê¸° -blocks.displaysize = Display Size -blocks.liquidcapacity = ì•¡ì²´ 용량 -blocks.powerrange = ì „ë ¥ 범위 -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 최대 ì—°ê²° 수 -blocks.poweruse = ì „ë ¥ 사용 -blocks.powerdamage = ì „ë ¥/ë°ë¯¸ì§€ -blocks.itemcapacity = 저장 용량 -blocks.basepowergeneration = 기본 ì „ë ¥ ìƒì„±ëŸ‰ -blocks.productiontime = 제작 시간 -blocks.repairtime = ì „ì²´ ë¸”ë¡ ìˆ˜ë¦¬ì‹œê°„ -blocks.speedincrease = ì†ë„ ì¦ê°€ -blocks.range = 사거리 -blocks.drilltier = 드릴 -blocks.drillspeed = 기본 드릴 ì†ë„ -blocks.boosteffect = ê°€ì† íš¨ê³¼ -blocks.maxunits = 최대 활성 유닛수 -blocks.health = ì²´ë ¥ -blocks.buildtime = 건설 시간 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = 건설 재료 -blocks.inaccuracy = ì˜¤ì°¨ê° -blocks.shots = 공격 ì†ë„ -blocks.reload = ë°œ/ì´ˆ -blocks.ammo = 탄약 -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -bar.drilltierreq = ë” ì¢‹ì€ ë“œë¦´ì´ í•„ìš” +stat.description = 특성 +stat.input = ìž…ë ¥ +stat.output = 출력 +stat.booster = ê°€ì† +stat.tiles = 필요한 íƒ€ì¼ +stat.affinities = 친화력 +stat.opposites = ìƒì„± +stat.powercapacity = ì „ë ¥ 용량 +stat.powershot = ì „ë ¥/ë°œ +stat.damage = 피해량 +stat.targetsair = 공중 조준 +stat.targetsground = ì§€ìƒ ì¡°ì¤€ +stat.itemsmoved = ì´ë™ ì†ë„ +stat.launchtime = 출격 간격 +stat.shootrange = 사거리 +stat.size = í¬ê¸° +stat.displaysize = 화면 í¬ê¸° +stat.liquidcapacity = ì•¡ì²´ 용량 +stat.powerrange = ì „ì„  ê¸¸ì´ +stat.linkrange = ì—°ê²° ê¸¸ì´ +stat.instructions = ì—°ì‚° ì†ë„ +stat.powerconnections = 최대 ì—°ê²° +stat.poweruse = ì „ë ¥ 요구량 +stat.powerdamage = ì „ë ¥/피해량 +stat.itemcapacity = ìžì› 용량 +stat.memorycapacity = 변수 용량 +stat.basepowergeneration = 기본 ì „ë ¥ 발전량 +stat.productiontime = 소요 시간 +stat.repairtime = 건물 완전 수리 시간 +stat.weapons = 무기 +stat.bullet = 탄환 +stat.speedincrease = ì†ë„ ì¦ê°€ +stat.range = 사거리 +stat.drilltier = 채굴 가능 +stat.drillspeed = 기본 채굴 ì†ë„ +stat.boosteffect = 버프 효과 +stat.maxunits = 최대 유닛 수 +stat.health = ì²´ë ¥ +stat.armor = ë°©ì–´ë ¥ +stat.buildtime = 건설 시간 +stat.maxconsecutive = 최대 ì²´ì¸ +stat.buildcost = 건설 비용 +stat.inaccuracy = ì˜¤ì°¨ê° +#stat.shots = 발사 수 (안쓰임) +stat.reload = 초당 발사 수 +stat.ammo = 탄약 +stat.shieldhealth = 보호막 ì²´ë ¥ +stat.cooldowntime = 쿨타임 +stat.explosiveness = í­ë°œì„± +stat.basedeflectchance = 기본 반사 확률 +stat.lightningchance = 전격 확률 +stat.lightningdamage = 전격 피해량 +stat.flammability = ì¸í™”성 +stat.radioactivity = 방사성 +stat.charge = 과충전율 +stat.heatcapacity = ì—´ 용량 +stat.viscosity = ì ì„± +stat.temperature = ì˜¨ë„ +stat.speed = ì†ë„ +stat.buildspeed = 건설 ì†ë„ +stat.minespeed = 채굴 ì†ë„ +stat.minetier = 채굴 í‹°ì–´ +stat.payloadcapacity = 화물 용량 +stat.commandlimit = 지휘 한계 +stat.abilities = 능력 +stat.canboost = ì´ë¥™ 가능 +stat.flying = 비행 +stat.ammouse = 탄약 사용 +stat.damagemultiplier = 피해량 배수 +stat.healthmultiplier = ì²´ë ¥ 배수 +stat.speedmultiplier = ì´ë™ì†ë„ 배수 +stat.reloadmultiplier = 재장전 배수 +stat.buildspeedmultiplier = 건설ì†ë„ 배수 +stat.reactive = ë°˜ì‘성 + +ability.forcefield = 보호막 필드 +ability.repairfield = 수리 필드 +ability.statusfield = ìƒíƒœì´ìƒ 필드 +ability.unitspawn = {0} 공장 +ability.shieldregenfield = 방어막 복구 필드 +ability.movelightning = ê°€ì† ì „ê²© + +bar.drilltierreq = ë” ì¢‹ì€ ë“œë¦´ í•„ìš” bar.noresources = ìžì› 부족 -bar.corereq = 코어 기지 í•„ìš” +bar.corereq = 기본 코어 í•„ìš” bar.drillspeed = 드릴 ì†ë„: {0}/s bar.pumpspeed = 펌프 ì†ë„: {0}/s bar.efficiency = 효율: {0}% +bar.boost = ê°€ì†: {0}% bar.powerbalance = ì „ë ¥: {0}/s bar.powerstored = 저장량: {0}/{1} bar.poweramount = ì „ë ¥: {0} bar.poweroutput = ì „ë ¥ 출력: {0} +bar.powerlines = ì—°ê²°: {0}/{1} bar.items = ìžì›ëŸ‰: {0} bar.capacity = 용량: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[장비를 정지합니다] bar.liquid = ì•¡ì²´ bar.heat = 발열 bar.power = ì „ë ¥ -bar.progress = ìƒì‚° ì§„í–‰ë„ +bar.progress = 건설 ì§„í–‰ë„ bar.input = ìž…ë ¥ bar.output = 출력 -bullet.damage = [stat]{0}[lightgray] 피해 -bullet.splashdamage = [stat]{0}[lightgray] 범위 공격 ~[stat] {1}[lightgray] íƒ€ì¼ +units.processorcontrol = [lightgray]프로세서 ì œì–´ë¨ + +bullet.damage = [stat]{0}[lightgray] 피해량 +bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat] {1}[lightgray] íƒ€ì¼ bullet.incendiary = [stat]ë°©í™” bullet.homing = [stat]ìœ ë„ -bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[lightgray] 밀침 -bullet.freezing = [stat]빙결 -bullet.tarred = [stat]타르 -bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 -bullet.reload = [stat]{0}[lightgray]x 발사 ì†ë„ +bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량 +bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량 +bullet.knockback = [stat]{0}[lightgray] 넉백 +bullet.pierce = [stat]{0}[lightgray]번 관통 +bullet.infinitepierce = [stat]관통 +bullet.healpercent = [stat]{0}[lightgray]% 회복 +bullet.multiplier = [stat]{0}[lightgray]ë°° 탄약 배수 +bullet.reload = [stat]{0}[lightgray]ë°° 발사 ì†ë„ unit.blocks = ë¸”ë¡ +unit.blockssquared = 블ë¡Â² unit.powersecond = ì „ë ¥/ì´ˆ unit.liquidsecond = ì•¡ì²´/ì´ˆ -unit.itemssecond = ê°œ/ì´ˆ +unit.itemssecond = ìžì›/ì´ˆ unit.liquidunits = ì•¡ì²´ unit.powerunits = ì „ë ¥ unit.degrees = ë„ unit.seconds = ì´ˆ -unit.minutes = mins +unit.minutes = ë¶„ unit.persecond = /ì´ˆ -unit.perminute = /min +unit.perminute = /ë¶„ unit.timesspeed = x ë°° unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = 보호막 ì²´ë ¥ unit.items = ìžì› -unit.thousands = 천 -unit.millions = 백만 +unit.thousands = k +unit.millions = m unit.billions = b +unit.pershot = /ë°œ +category.purpose = ëª©ì  category.general = ì¼ë°˜ category.power = ì „ë ¥ category.liquids = ì•¡ì²´ category.items = ìžì› category.crafting = ìž…ë ¥/출력 -category.shooting = 사격 -category.optional = ë³´ì¡° ìžì› +category.function = 기능 +category.optional = ì„ íƒì  í–¥ìƒ setting.landscape.name = 가로화면 잠금 setting.shadows.name = ê·¸ë¦¼ìž setting.blockreplace.name = ìžë™ ë¸”ë¡ ì œì•ˆ setting.linear.name = 선형 í•„í„°ë§ -setting.hints.name = 힌트 +setting.hints.name = 힌트 표시 +setting.logichints.name = ë¡œì§ ížŒíŠ¸ 표시 setting.flow.name = ìžì› í름량 표시 +setting.backgroundpause.name = 백그ë¼ìš´ë“œì—서 ì¼ì‹œì •ì§€ setting.buildautopause.name = 건설 ìžë™ ì¼ì‹œì •ì§€ -setting.mapcenter.name = 플레ì´ì–´ 기준으로 ë§µ 중앙 ê³ ì • -setting.animatedwater.name = 움ì§ì´ëŠ” 유체 -setting.animatedshields.name = 움ì§ì´ëŠ” 보호막 -setting.antialias.name = 안티 ì—ì¼ë¦¬ì–´ì‹±[lightgray] (재시작 í•„ìš”)[] -setting.playerindicators.name = 플레ì´ì–´ 표시기 -setting.indicators.name = ì  í‘œì‹œê¸° +setting.doubletapmine.name = ì—°ì† í„°ì¹˜ë¡œ 채광 +setting.modcrashdisable.name = 로딩 중 ì¶©ëŒ ì‹œ 모드 비활성화 +setting.animatedwater.name = ì•¡ì²´ 애니메ì´ì…˜ 효과 +setting.animatedshields.name = 보호막 애니메ì´ì…˜ 효과 +setting.antialias.name = 위신호 제거 í•„í„°[lightgray] (재시작 í•„ìš”)[] +setting.playerindicators.name = 플레ì´ì–´ 위치 표시기 +setting.indicators.name = ì  ìœ„ì¹˜ 표시기 setting.autotarget.name = ìžë™ 조준 setting.keyboard.name = 마우스+키보드 ì¡°ìž‘ setting.touchscreen.name = 터치스í¬ë¦° ì¡°ìž‘ @@ -694,26 +836,24 @@ setting.fpscap.text = {0} FPS setting.uiscale.name = UI 스케ì¼ë§[lightgray] (재시작 í•„ìš”)[] setting.swapdiagonal.name = í•­ìƒ ëŒ€ê°ì„  배치 setting.difficulty.training = 훈련 -setting.difficulty.easy = 쉬움 +setting.difficulty.easy = 무난 setting.difficulty.normal = 보통 -setting.difficulty.hard = 어려움 -setting.difficulty.insane = 미침 -setting.difficulty.name = 난ì´ë„: +setting.difficulty.hard = í˜¼ëˆ +setting.difficulty.insane = 박멸 +setting.difficulty.name = 난ì´ë„: setting.screenshake.name = 화면 í”들림 -setting.effects.name = 효과 ë³´ìž„ +setting.effects.name = 효과 표시 setting.destroyedblocks.name = íŒŒê´´ëœ ë¸”ë¡ í‘œì‹œ setting.blockstatus.name = ë¸”ë¡ ìƒíƒœ 표시 -setting.conveyorpathfinding.name = 컨베ì´ì–´ 배치 경로찾기 +setting.conveyorpathfinding.name = 컨베ì´ì–´ 배치 길찾기 setting.sensitivity.name = 컨트롤러 ê°ë„ setting.saveinterval.name = 저장 간격 -setting.seconds = {0} ì´ˆ -setting.blockselecttimeout.name = ë¸”ë¡ ì„ íƒ ì‹œê°„ 초과 -setting.milliseconds = {0} 밀리 ì´ˆ +setting.seconds = {0}ì´ˆ +setting.milliseconds = {0} 밀리초 setting.fullscreen.name = ì „ì²´ 화면 setting.borderlesswindow.name = í…Œë‘리 없는 ì°½ 모드[lightgray] (ìž¬ì‹œìž‘ì´ í•„ìš”í•  수 있습니다) setting.fps.name = FPS와 í•‘ 표시 setting.smoothcamera.name = 부드러운 ì‹œì  -setting.blockselectkeys.name = ë¸”ë¡ ì„ íƒ í‚¤ 표시 setting.vsync.name = ìˆ˜ì§ ë™ê¸°í™” setting.pixelate.name = 픽셀화 setting.minimap.name = 미니맵 표시 @@ -727,47 +867,49 @@ setting.sfxvol.name = íš¨ê³¼ìŒ í¬ê¸° setting.mutesound.name = 소리 ë„기 setting.crashreport.name = ìµëª…으로 오류 보고서 ìžë™ 전송 setting.savecreate.name = ìžë™ 저장 활성화 -setting.publichost.name = ë©€í‹°í”Œë ˆì´ ê³µìš© 서버로 표시 +setting.publichost.name = 공용 서버로 표시 setting.playerlimit.name = 플레ì´ì–´ 제한 setting.chatopacity.name = 채팅창 íˆ¬ëª…ë„ -setting.lasersopacity.name = ì „ë ¥ ë ˆì´ì € íˆ¬ëª…ë„ +setting.lasersopacity.name = ì „ì„  íˆ¬ëª…ë„ setting.bridgeopacity.name = í„°ë„ íˆ¬ëª…ë„ setting.playerchat.name = 채팅 ë§í’ì„  표시 +setting.showweather.name = 날씨 그래픽 표시 public.confirm = ê²Œìž„ì„ ëª¨ë‘ì—게 공개하시겠습니까?\n[accent]모든 플레ì´ì–´ê°€ ê²Œìž„ì— ì°¸ì—¬í•  수 있습니다.\n[lightgray]설정->게임->ë©€í‹°í”Œë ˆì´ ê³µìš© 서버로 표시ì—서 ë‚˜ì¤‘ì— ë³€ê²½í•  수 있습니다.\n\n[sky]ë²ˆì—­ìž ì¶”ê°€[]\n[accent]친구ë¼ë¦¬ 하려고 ì´ ê¸°ëŠ¥ì„ í™œì„±í™” 한 ë’¤ì—, 친구 ì™¸ì— ë‹¤ë¥¸ 플레ì´ì–´ê°€ ë“¤ì–´ì™”ì„ ë•Œ\n해당 플레ì´ì–´ë¥¼ 차단하는 행위는 비매너를 넘어서는 얌체 행위 ê·¸ ìžì²´ìž…니다.\nì •ë§ë¡œ [scarlet]ë§Žì€ ë‹¤ë¥¸ 플레ì´ì–´ë“¤ì´ 오길 ì›í•œë‹¤[]ë©´ 확ì¸í•˜ì„¸ìš”. +public.confirm.really = [red]친구하고 í”Œë ˆì´ í•˜ê³  싶으면 [scarlet]공용 서버[] ëŒ€ì‹ ì— [green]친구 초대[] 를 사용하세요. ì •ë§ë¡œ [scarlet]공용 서버[] 를 열겠습니까?[] public.beta = 베타 ë²„ì „ì˜ ê²Œìž„ì€ ê³µê°œ 서버를 만들 수 없습니다. uiscale.reset = UI 스케ì¼ì´ 변경ë˜ì—ˆìŠµë‹ˆë‹¤.\n"확ì¸"ë²„íŠ¼ì„ ëˆŒëŸ¬ 저장하세요.\n[accent] {0}[][scarlet]ì´ˆ í›„ì— ì˜ˆì „ 설정으로 ë˜ëŒë¦¬ê³  ê²Œìž„ì„ ì¢…ë£Œí•©ë‹ˆë‹¤... uiscale.cancel = 취소 후 나가기 setting.bloom.name = 화려한 효과 keybind.title = 조작키 설정 -keybinds.mobile = [scarlet]ëŒ€ë¶€ë¶„ì˜ í‚¤ ë§µí•‘ì€ ëª¨ë°”ì¼ì—서 ìž‘ë™í•˜ì§€ 않습니다. 기본 ì´ë™ë§Œ ì§€ì›ë©ë‹ˆë‹¤. +keybinds.mobile = [scarlet]ëŒ€ë¶€ë¶„ì˜ ì¡°ìž‘í‚¤ ì„¤ì •ì€ ëª¨ë°”ì¼ì—서 ìž‘ë™í•˜ì§€ 않습니다. 기본 ì´ë™ë§Œ ì§€ì›ë©ë‹ˆë‹¤. category.general.name = ì¼ë°˜ category.view.name = 보기 category.multiplayer.name = 멀티플레ì´ì–´ category.blocks.name = ë¸”ë¡ ì„ íƒ command.attack = 공격 -command.rally = 순찰 +command.rally = ì§‘ê²° command.retreat = 후퇴 -command.idle = Idle -placement.blockselectkeys = \n[lightgray]키: [{0}, +command.idle = 대기 +placement.blockselectkeys = \n[lightgray]단축키: [{0}, keybind.respawn.name = ë¦¬ìŠ¤í° keybind.control.name = 유닛 제어 keybind.clear_building.name = ì„¤ê³„ë„ ì´ˆê¸°í™” keybind.press = 키를 누르세요... keybind.press.axis = 마우스 휠 ë˜ëŠ” 키를 누르세요... -keybind.screenshot.name = ë§µ 스í¬ë¦°ìƒ· -keybind.toggle_power_lines.name = ì „ë ¥ ë ˆì´ì € 토글 -keybind.toggle_block_status.name = ë¸”ë¡ ìƒíƒœ 토글 +keybind.screenshot.name = ë§µ 스í¬ë¦° 캡처 +keybind.toggle_power_lines.name = ì „ì„  ê°€ì‹œë„ ì„¤ì • +keybind.toggle_block_status.name = ë¸”ë¡ ìƒíƒœ ê°€ì‹œë„ keybind.move_x.name = Xì¶• ì´ë™ keybind.move_y.name = Yì¶• ì´ë™ keybind.mouse_move.name = 커서를 ë”°ë¼ì„œ ì´ë™ -keybind.pan.name = Pan View -keybind.boost.name = 부스트 +keybind.pan.name = 펜 보기 +keybind.boost.name = ì´ë¥™ keybind.schematic_select.name = ì˜ì—­ 설정 keybind.schematic_menu.name = ì„¤ê³„ë„ ë©”ë‰´ keybind.schematic_flip_x.name = ì„¤ê³„ë„ Xì¶• 뒤집기 keybind.schematic_flip_y.name = ì„¤ê³„ë„ Yì¶• 뒤집기 -keybind.category_prev.name = ì´ì „ ëª©ë¡ -keybind.category_next.name = ë‹¤ìŒ ëª©ë¡ +keybind.category_prev.name = ì´ì „ 카테고리 +keybind.category_next.name = ë‹¤ìŒ ì¹´í…Œê³ ë¦¬ keybind.block_select_left.name = ë¸”ë¡ ì™¼ìª½ ì„ íƒ keybind.block_select_right.name = ë¸”ë¡ ì˜¤ë¥¸ìª½ ì„ íƒ keybind.block_select_up.name = ë¸”ë¡ ìœ„ìª½ ì„ íƒ @@ -788,15 +930,18 @@ keybind.diagonal_placement.name = 대ê°ì„  설치 keybind.pick.name = ë¸”ë¡ ì„ íƒ keybind.break_block.name = ë¸”ë¡ íŒŒê´´ keybind.deselect.name = ì„ íƒí•´ì œ -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = 화물 집기 +keybind.dropCargo.name = 화물 내려놓기 +keybind.command.name = 명령 keybind.shoot.name = 사격 -keybind.zoom.name = 확대 +keybind.zoom.name = 확대/축소 keybind.menu.name = 메뉴 keybind.pause.name = ì¼ì‹œì¤‘ì§€ keybind.pause_building.name = 건설 ì¼ì‹œì •ì§€/재개 keybind.minimap.name = 미니맵 +keybind.planet_map.name = 행성 ì§€ë„ +keybind.research.name = 연구 +keybind.block_info.name = ë¸”ë¡ ì •ë³´ keybind.chat.name = 채팅 keybind.player_list.name = 플레ì´ì–´ ëª©ë¡ keybind.console.name = 콘솔 @@ -806,58 +951,68 @@ keybind.toggle_menus.name = 메뉴 ë³´ì´ê¸°/숨기기 keybind.chat_history_prev.name = ì´ì „ 채팅 ê¸°ë¡ keybind.chat_history_next.name = ë‹¤ìŒ ì±„íŒ… ê¸°ë¡ keybind.chat_scroll.name = 채팅 스í¬ë¡¤ -keybind.drop_unit.name = 유닛 떨구기 +keybind.chat_mode = 대화 ëŒ€ìƒ ë³€ê²½ +keybind.drop_unit.name = 유닛 내려놓기 keybind.zoom_minimap.name = 미니맵 확대 mode.help.title = 모드 설명 mode.survival.name = ìƒì¡´ -mode.survival.description = ì´ê²ƒì€ ì¼ë°˜ 모드입니다. ì œí•œëœ ìžì›ê³¼ ìžë™ìœ¼ë¡œ 시작ë˜ëŠ” 웨ì´ë¸Œê°€ 있습니다.\n[gray]플레ì´í•˜ë ¤ë©´ ë§µì— ì ì˜ 스í°ì§€ì ì´ 필요합니다. +mode.survival.description = 기본 모드. ì œí•œëœ ìžì›ì´ 있으며, 단계가 ìžë™ìœ¼ë¡œ 시작합니다.\n[gray]플레ì´í•˜ë ¤ë©´ ë§µì— ì ì˜ 스í°ì§€ì ì´ 필요합니다. mode.sandbox.name = 샌드박스 -mode.sandbox.description = 무한한 ìžì›ê³¼ 웨ì´ë¸Œ 시작 타ì´ë¨¸ê°€ 없습니다. +mode.sandbox.description = 무한한 ìžì›ì´ 있으며, 시간 ì œí•œì´ ì—†ìŠµë‹ˆë‹¤. mode.editor.name = 편집기 mode.pvp.name = PvP -mode.pvp.description = 다른 플레ì´ì–´ì™€ 현장ì—서 싸우십시오.\n[gray]플레ì´í•˜ë ¤ë©´ ë§µì— ë‹¤ë¥¸ 색ìƒì˜ 코어가 2ê°œ ì´ìƒ 있어야합니다. +mode.pvp.description = 다른 플레ì´ì–´ì™€ 현장ì—서 싸우십시오.\n[gray]플레ì´í•˜ë ¤ë©´ ë§µì— ë‹¤ë¥¸ 색ìƒì˜ 코어가 2ê°œ ì´ìƒ 있어야 합니다. mode.attack.name = 공격 mode.attack.description = ì ì˜ 기지를 파괴하세요.\n[gray]플레ì´í•˜ë ¤ë©´ ë§µì— ë¹¨ê°„ìƒ‰ 코어가 필요합니다. mode.custom = ì‚¬ìš©ìž ì •ì˜ ê·œì¹™ rules.infiniteresources = 무한 ìžì› -rules.reactorexplosions = ì›ìžë¡œ í­ë°œ -rules.wavetimer = 웨ì´ë¸Œ 시간 -rules.waves = 웨ì´ë¸Œ +rules.reactorexplosions = ì›ìžë¡œ í­ë°œ 허용 +rules.coreincinerates = 코어 ë°©í™” 비허용 +rules.schematic = ì„¤ê³„ë„ í—ˆìš© +rules.wavetimer = 시간 ì œí•œì´ ìžˆëŠ” 단계 +rules.waves = 단계 rules.attack = 공격 모드 -rules.buildai = AI Building +rules.buildai = AI 건설 rules.enemyCheat = 무한 AI (빨간팀) ìžì› rules.blockhealthmultiplier = ë¸”ë¡ ì²´ë ¥ 배수 rules.blockdamagemultiplier = ë¸”ë¡ ê³µê²©ë ¥ 배수 rules.unitbuildspeedmultiplier = 유닛 ìƒì‚° ì†ë„ 배수 rules.unithealthmultiplier = 유닛 ì²´ë ¥ 배수 rules.unitdamagemultiplier = 유닛 공격력 배수 +rules.unitcapvariable = 코어 유닛 제한 추가 +rules.unitcap = 기본 유닛 제한 rules.enemycorebuildradius = ì  ì½”ì–´ 건설 금지구역 범위:[lightgray] (타ì¼) -rules.wavespacing = 웨ì´ë¸Œ 간격:[lightgray] (ì´ˆ) -rules.buildcostmultiplier = 건설 ìžì›ì†Œëª¨ 배수 +rules.wavespacing = 단계 간격:[lightgray] (ì´ˆ) +rules.buildcostmultiplier = 건설 비용 배수 rules.buildspeedmultiplier = 건설 ì†ë„ 배수 -rules.deconstructrefundmultiplier = í•´ì²´ 환불 배수 -rules.waitForWaveToEnd = 웨ì´ë¸Œê°€ ë날때까지 대기중 +rules.deconstructrefundmultiplier = ì² ê±° 환불 배수 +rules.waitForWaveToEnd = 한 단계가 ë날때까지 대기 rules.dropzoneradius = ìŠ¤í° êµ¬ì—­ 범위: [lightgray] (타ì¼) -rules.unitammo = ìœ ë‹›ì— íƒ„ì•½ì´ í•„ìš” -rules.title.waves = 웨ì´ë¸Œ +rules.unitammo = 유닛 탄약 í•„ìš” +rules.title.waves = 단계 rules.title.resourcesbuilding = ìžì› & ê±´ì¶• rules.title.enemy = ì  rules.title.unit = 유닛 rules.title.experimental = 실험ì ì¸ 기능 rules.title.environment = 환경 -rules.lighting = 조명 -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = ìžì—° 조명 -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.lighting = 조명 표시 +rules.enemyLights = ìƒëŒ€ì—게 조명 표시 +rules.fire = ë°©í™” 허용 +rules.explosions = 블ë¡/유닛 í­ë°œ ë°ë¯¸ì§€ +rules.ambientlight = ìžì—° 조명 표시 +rules.weather = 날씨 추가 +rules.weather.frequency = 빈ë„: +rules.weather.always = í•­ìƒ +rules.weather.duration = ì§€ì† ì‹œê°„: content.item.name = ìžì› content.liquid.name = ì•¡ì²´ content.unit.name = 유닛 content.block.name = ë¸”ë¡ +content.status.name = ìƒíƒœ ì´ìƒ +content.sector.name = 지역 + item.copper.name = 구리 item.lead.name = ë‚© item.coal.name = ì„탄 @@ -868,7 +1023,7 @@ item.silicon.name = 실리콘 item.plastanium.name = 플ë¼ìŠ¤í„°ëŠ„ item.phase-fabric.name = 메타 item.surge-alloy.name = 설금 -item.spore-pod.name = í¬ìž 버섯 +item.spore-pod.name = í¬ìž item.sand.name = 모래 item.blast-compound.name = í­ë°œë¬¼ item.pyratite.name = 파ì´ë¼íƒ€ì´íЏ @@ -876,26 +1031,9 @@ item.metaglass.name = ê°•í™” 유리 item.scrap.name = ê³ ì²  liquid.water.name = 물 liquid.slag.name = 광재 -liquid.oil.name = 기름 +liquid.oil.name = ì„유 liquid.cryofluid.name = 냉ê°ìˆ˜ -item.explosiveness = [lightgray]í­ë°œì„±: {0} -item.flammability = [lightgray]ì¸í™”성: {0} -item.radioactivity = [lightgray]방사능: {0} - -unit.health = [lightgray]ì²´ë ¥: {0} -unit.speed = [lightgray]ì†ë„: {0} -unit.weapon = [lightgray]무기: {0} -unit.itemcapacity = [lightgray]ìžì› 수용량: {0} -unit.minespeed = [lightgray]채광 ì†ë„: {0}% -unit.minepower = [lightgray]채광 레벨: {0} -unit.ability = [lightgray]능력: {0} -unit.buildspeed = [lightgray]건설 ì†ë„: {0}% - -liquid.heatcapacity = [lightgray]비열: {0} -liquid.viscosity = [lightgray]ì ë„: {0} -liquid.temperature = [lightgray]온ë„: {0} - unit.dagger.name = 대거 unit.mace.name = ë©”ì´ìФ unit.fortress.name = í¬íŠ¸ë¦¬ìŠ¤ @@ -906,7 +1044,7 @@ unit.crawler.name = í¬ë¡¤ëŸ¬ unit.atrax.name = 아트ë½ìФ unit.spiroct.name = 스피ë¡íЏ unit.arkyid.name = 아키드 -unit.toxopid.name = Toxopid +unit.toxopid.name = 톡소피드 unit.flare.name = 플레어 unit.horizon.name = 호ë¼ì´ì¦Œ unit.zenith.name = 제니스 @@ -915,27 +1053,29 @@ unit.eclipse.name = ì´í´ë¦½ìФ unit.mono.name = 모노 unit.poly.name = í´ë¦¬ unit.mega.name = 메가 -unit.quad.name = Quad -unit.oct.name = Oct +unit.quad.name = 쿼드 +unit.oct.name = 옥트 unit.risso.name = 리소 unit.minke.name = 민케 -unit.bryde.name = 브리드 +unit.bryde.name = 브ë¼ì´ë“œ unit.sei.name = ì„¸ì´ unit.omura.name = ì˜¤ë¬´ë¼ unit.alpha.name = 알파 unit.beta.name = 베타 unit.gamma.name = ê°ë§ˆ -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.scepter.name = 셉터 +unit.reign.name = ë ˆì¸ +unit.vela.name = ë²¨ë¼ +unit.corvus.name = 코르버스 -block.resupply-point.name = Resupply Point -block.parallax.name = 시차 -block.cliff.name = 낭떠러지 -block.sand-boulder.name = 사암 +block.resupply-point.name = 보급 ì§€ì  +block.parallax.name = 패럴랙스 +block.cliff.name = ì–¸ë• +block.sand-boulder.name = 사암 바위 +block.basalt-boulder.name = 현무암 바위 block.grass.name = 잔디 -block.slag.name = 광재 +block.slag.name = 용암 +block.space.name = 우주 block.salt.name = 소금 block.salt-wall.name = 소금 ë²½ block.pebbles.name = ì¡°ì•½ëŒ @@ -949,11 +1089,11 @@ block.snow-pine.name = 눈 ë®ì¸ 소나무 block.shale.name = ì´íŒì•” block.shale-boulder.name = 둥근 ì´íŒì•” block.moss.name = ì´ë¼ -block.shrubs.name = 관목 +block.shrubs.name = 관목 ë²½ block.spore-moss.name = í¬ìž ì´ë¼ block.shale-wall.name = ì´íŒì•” ë²½ -block.scrap-wall.name = ì¡°ê°ë²½ -block.scrap-wall-large.name = 대형 ì¡°ê°ë²½ +block.scrap-wall.name = ì¡°ê° ë²½ +block.scrap-wall-large.name = 대형 ì¡°ê° ë²½ block.scrap-wall-huge.name = 거대한 ì¡°ê° ë²½ block.scrap-wall-gigantic.name = 엄청나게 í° ì¡°ê° ë²½ block.thruster.name = 쓰러스터 @@ -961,7 +1101,7 @@ block.kiln.name = 가마 block.graphite-press.name = í‘ì—° 압축기 block.multi-press.name = 다중 압축기 block.constructing = {0} [lightgray](제작중) -block.spawn.name = ì  ì†Œí™˜ +block.spawn.name = ì  ì†Œí™˜ì§€ì  block.core-shard.name = 코어: ì¡°ê° block.core-foundation.name = 코어: 기반 block.core-nucleus.name = 코어: 핵심 @@ -969,7 +1109,7 @@ block.deepwater.name = ê¹Šì€ ë¬¼ block.water.name = 물 block.tainted-water.name = ì˜¤ì—¼ëœ ë¬¼ block.darksand-tainted-water.name = ì˜¤ì—¼ëœ ì –ì€ ê²€ì€ ëª¨ëž˜ -block.tar.name = ì„유 +block.tar.name = 타르 block.stone.name = 바위 block.sand.name = 모래 block.darksand.name = ê²€ì€ ëª¨ëž˜ @@ -979,8 +1119,9 @@ block.craters.name = 구ë©ì´ block.sand-water.name = ì –ì€ ëª¨ëž˜ block.darksand-water.name = ì –ì€ ê²€ì€ ëª¨ëž˜ block.char.name = 숯 -block.dacite.name = ë°ì´ì‚¬ì´íЏ -block.dacite-wall.name = ë°ì´ì‚¬ì´íЏ ë²½ +block.dacite.name = ì„ì˜ì•ˆì‚°ì•” +block.dacite-wall.name = ì„ì˜ì•ˆì‚°ì•” ë²½ +block.dacite-boulder.name = ì„ì˜ì•ˆì‚°ì•” block.ice-snow.name = ì–¼ìŒëˆˆ block.stone-wall.name = ëŒ ë²½ block.ice-wall.name = ì–¼ìŒ ë²½ @@ -991,23 +1132,23 @@ block.dirt.name = í™ block.dirt-wall.name = í™ ë²½ block.mud.name = ì§„í™ block.white-tree-dead.name = ì£½ì€ í•˜ì–€ë‚˜ë¬´ -block.white-tree.name = 하얀 나무 +block.white-tree.name = 하얀나무 block.spore-cluster.name = í¬ìžë‚­ block.metal-floor.name = 금ì†ì œ 바닥 -block.metal-floor-2.name = 금ì†ì œ 바닥 2 -block.metal-floor-3.name = 금ì†ì œ 바닥 3 -block.metal-floor-5.name = 금ì†ì œ 바닥 5 -block.metal-floor-damaged.name = ì†ìƒëœ 금ì†ì œ 바닥 -block.dark-panel-1.name = ì–´ë‘ìš´ íŒ¨ë„ 1 -block.dark-panel-2.name = ì–´ë‘ìš´ íŒ¨ë„ 2 -block.dark-panel-3.name = ì–´ë‘ìš´ íŒ¨ë„ 3 -block.dark-panel-4.name = ì–´ë‘ìš´ íŒ¨ë„ 4 -block.dark-panel-5.name = ì–´ë‘ìš´ íŒ¨ë„ 5 -block.dark-panel-6.name = ì–´ë‘ìš´ íŒ¨ë„ 6 -block.dark-metal.name = ì–´ë‘ìš´ 금ì†ì œ +block.metal-floor-2.name = ê¸ˆì† íƒ€ì¼ 2 +block.metal-floor-3.name = ê¸ˆì† íƒ€ì¼ 3 +block.metal-floor-5.name = ê¸ˆì† íƒ€ì¼ 5 +block.metal-floor-damaged.name = ì†ìƒëœ ê¸ˆì† íƒ€ì¼ +block.dark-panel-1.name = ê²€ì€ íŒ¨ë„ 1 +block.dark-panel-2.name = ê²€ì€ íŒ¨ë„ 2 +block.dark-panel-3.name = ê²€ì€ íŒ¨ë„ 3 +block.dark-panel-4.name = ê²€ì€ íŒ¨ë„ 4 +block.dark-panel-5.name = ê²€ì€ íŒ¨ë„ 5 +block.dark-panel-6.name = ê²€ì€ íŒ¨ë„ 6 +block.dark-metal.name = í‘ì²  ë²½ block.basalt.name = 현무암 -block.hotrock.name = 뜨거운 바위 -block.magmarock.name = 용암 바위 +block.hotrock.name = 녹아내리는 íƒ€ì¼ +block.magmarock.name = ìš©ì•”ì´ í르는 íƒ€ì¼ block.copper-wall.name = 구리 ë²½ block.copper-wall-large.name = 대형 구리 ë²½ block.titanium-wall.name = 티타늄 ë²½ @@ -1029,7 +1170,6 @@ block.conveyor.name = 컨베ì´ì–´ block.titanium-conveyor.name = 티타늄 컨베ì´ì–´ block.plastanium-conveyor.name = 플ë¼ìŠ¤í„°ëŠ„ 컨베ì´ì–´ block.armored-conveyor.name = 장갑 컨베ì´ì–´ -block.armored-conveyor.description = 티타늄 컨베ì´ì–´ì™€ ê°™ì€ ì†ë„로 ìžì›ì„ 운송하지만, ë” ë†’ì€ ë°©ì–´ë ¥ì„ ê°€ì§€ê³  있습니다. 다른 컨베ì´ì–´ 벨트 ì´ì™¸ 측면ì—서는 ìžì›ì„ ë°›ì„ ìˆ˜ 없습니다. block.junction.name = êµì°¨ê¸° block.router.name = 분배기 block.distributor.name = 대형 분배기 @@ -1037,7 +1177,6 @@ block.sorter.name = í•„í„° block.inverted-sorter.name = 반전 í•„í„° block.message.name = 메모 ë¸”ë¡ block.illuminator.name = 조명 -block.illuminator.description = 작고, 간단하고, 설정 가능한 ê´‘ì›ìž…니다. ìž‘ë™í•˜ë ¤ë©´ ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. block.overflow-gate.name = í¬í™” í•„í„° block.underflow-gate.name = 불í¬í™” í•„í„° block.silicon-smelter.name = 실리콘 제련소 @@ -1047,17 +1186,17 @@ block.cryofluid-mixer.name = 냉ê°ìˆ˜ 제조기 block.melter.name = 융해기 block.incinerator.name = 소ê°ë¡œ block.spore-press.name = í¬ìž 압축기 -block.separator.name = 분리기 -block.coal-centrifuge.name = ì„탄 분리기 +block.separator.name = 광재 분리기 +block.coal-centrifuge.name = ì„탄 정제기 block.power-node.name = ì „ë ¥ 노드 block.power-node-large.name = 대형 ì „ë ¥ 노드 block.surge-tower.name = 설금 타워 -block.diode.name = 배터리 다ì´ì˜¤ë“œ +block.diode.name = 다ì´ì˜¤ë“œ block.battery.name = 배터리 block.battery-large.name = 대형 배터리 -block.combustion-generator.name = 연소 발전기 -block.steam-generator.name = ì¦ê¸° 발전기 -block.differential-generator.name = ì°¨ë™ ë°œìž”ê¸° +block.combustion-generator.name = 화력 발전기 +block.steam-generator.name = 터빈 발전기 +block.differential-generator.name = ì°¨ë™ ë°œì „ê¸° block.impact-reactor.name = 핵융합 ì›ìžë¡œ block.mechanical-drill.name = ê¸°ê³„ì‹ ë“œë¦´ block.pneumatic-drill.name = 공압 드릴 @@ -1075,7 +1214,8 @@ block.power-source.name = ì „ë ¥ 공급기 block.unloader.name = ì–¸ë¡œë” block.vault.name = 창고 block.wave.name = íŒŒë„ -block.swarmer.name = 스워머 +block.tsunami.name = 쓰나미 +block.swarmer.name = 스웜 block.salvo.name = ì‚´ë³´ block.ripple.name = 립플 block.phase-conveyor.name = 메타 컨베ì´ì–´ @@ -1099,7 +1239,7 @@ block.thorium-reactor.name = 토륨 ì›ìžë¡œ block.mass-driver.name = 매스 드ë¼ì´ë²„ block.blast-drill.name = ì••ì¶• 공기분사 드릴 block.thermal-pump.name = 화력 펌프 -block.thermal-generator.name = 화력 ìƒì„±ê¸° +block.thermal-generator.name = 지열 발전기 block.alloy-smelter.name = 설금 제련소 block.mender.name = ë©˜ë” block.mend-projector.name = 수리 프로ì í„° @@ -1109,36 +1249,43 @@ block.cyclone.name = 사ì´í´ë¡  block.fuse.name = 퓨즈 block.shock-mine.name = 전격 지뢰 block.overdrive-projector.name = 과부하 프로ì í„° -block.force-projector.name = í¬ìФ 프로ì í„° +block.force-projector.name = 보호막 프로ì í„° block.arc.name = ì•„í¬ block.rtg-generator.name = RTG 발전기 block.spectre.name = 스펙터 block.meltdown.name = 멜트다운 +block.foreshadow.name = í¬ì–´ì‰ë„ìš° block.container.name = 컨테ì´ë„ˆ -block.launch-pad.name = 출격 패드 -block.launch-pad-large.name = 대형 출격 패드 +block.launch-pad.name = 지역 ìžì› 수송기 +block.launch-pad-large.name = 대형 지역 ìžì› 수송기 block.segment.name = 세그먼트 -block.command-center.name = Command Center +block.command-center.name = 유닛 지휘소 block.ground-factory.name = ì§€ìƒ ê³µìž¥ block.air-factory.name = í•­ê³µ 공장 block.naval-factory.name = í•´ì–‘ 공장 -block.additive-reconstructor.name = 첨가물 재구성기 -block.multiplicative-reconstructor.name = 다중 재구성기 -block.exponential-reconstructor.name = 지수 재구성기 -block.tetrative-reconstructor.name = 정서 재구성기 +block.additive-reconstructor.name = 재구성기 : Additive +block.multiplicative-reconstructor.name = 재구성기 : Multiplicative +block.exponential-reconstructor.name = 재구성기 : Exponential +block.tetrative-reconstructor.name = 재구성기 : Tetrative block.payload-conveyor.name = 화물 컨베ì´ì–´ block.payload-router.name = 화물 분배기 -block.disassembler.name = ê°€ì† ë¶„í•´ê¸° +block.disassembler.name = 광재 분해기 block.silicon-crucible.name = 실리콘 ë„가니 block.overdrive-dome.name = 대형 과부하 프로ì í„° +#experimental, may be removed / ì´ ì•„ëž˜ì˜ ë¸”ë¡ë“¤ì€ 테스트용 임시 블ë¡ë“¤ìž…니다. +block.block-forge.name = ë¸”ë¡ ì œìž‘ëŒ€ +block.block-loader.name = ë¸”ë¡ ë¡œë” +block.block-unloader.name = ë¸”ë¡ ì–¸ë¡œë” +block.interplanetary-accelerator.name = 성간 코어 ê°€ì†ê¸° -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = 스위치 +block.micro-processor.name = 마ì´í¬ë¡œ 프로세서 +block.logic-processor.name = ë¡œì§ í”„ë¡œì„¸ì„œ +block.hyper-processor.name = 하ì´í¼ 프로세서 +block.logic-display.name = ë¡œì§ ë””ìŠ¤í”Œë ˆì´ +block.large-logic-display.name = 대형 ë¡œì§ ë””ìŠ¤í”Œë ˆì´ +block.memory-cell.name = 메모리 ì…€ +block.memory-bank.name = 메모리 보관소 team.blue.name = 파랑색 팀 team.crux.name = 빨강색 팀 @@ -1148,122 +1295,150 @@ team.derelict.name = 버려진 팀 team.green.name = ì´ˆë¡ìƒ‰ 팀 team.purple.name = ë³´ë¼ìƒ‰ 팀 -tutorial.next = [lightgray]<ì´ ê³³ì„ í„°ì¹˜í•´ 진행하세요> -tutorial.intro = [scarlet]Mindustry 튜토리얼[]ì„ ì‹œìž‘í•˜ê² ìŠµë‹ˆë‹¤.\n[WASD] 키를 눌러 ì´ë™í•  수 있습니다.\n[accent]스í¬ë¡¤[]ì„ í•´ì„œ 화면 확대와 축소를 합니다.\n[accent]구리[]를 채광하는 것부터 시작합니다. 코어 ê·¼ì²˜ì˜ êµ¬ë¦¬ ê´‘ë§¥ì„ ëˆŒëŸ¬ ì´ ìž‘ì—…ì„ ì‹œìž‘í•˜ì„¸ìš”.\n\n[accent]{0}/{1} 구리 -tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]ì„ ì‹œìž‘í•˜ê² ìŠµë‹ˆë‹¤.\ní™”ë©´ì„ ë“œëž˜ê·¸í•˜ì—¬ ì´ë™ì´ 가능합니다.\në‘ ì†ê°€ë½ì„ í™”ë©´ì— ëˆ„ë¥¸ 후 모으거나 벌려 확대와 축소가 가능합니다.\n[accent]구리[]를 채광하는 것부터 시작합니다. 코어 ê·¼ì²˜ì˜ êµ¬ë¦¬ ê´‘ë§¥ì„ ëˆŒëŸ¬ ì´ ìž‘ì—…ì„ ì‹œìž‘í•˜ì„¸ìš”.\n\n[accent]{0}/{1} 구리 -tutorial.drill = 수ë™ìœ¼ë¡œ 채광하는 ê²ƒì€ íš¨ìœ¨ì´ ë‚®ìŠµë‹ˆë‹¤.\n[accent]드릴[]ì€ ìžë™ìœ¼ë¡œ 드릴 바로 ì•„ëž˜ì— ìžˆëŠ” ê´‘ë¬¼ë“¤ì„ ì±„ê´‘í•©ë‹ˆë‹¤.\n드릴 ì¹´í…Œê³ ë¦¬ì˜ ê¸°ê³„ì‹ ë“œë¦´ì„ ì„ íƒí•˜ì—¬ 구리 ê´‘ë§¥ìœ„ì— ì„¤ì¹˜í•˜ì„¸ìš”.\n마우스 오른쪽 버튼으로 취소가 가능합니다. -tutorial.drill.mobile = 수ë™ìœ¼ë¡œ 채광하는 ê²ƒì€ íš¨ìœ¨ì´ ë‚®ìŠµë‹ˆë‹¤.\n[accent]드릴[]ì€ ìžë™ìœ¼ë¡œ 드릴 ë°‘ì— ìžˆëŠ” ê´‘ë¬¼ë“¤ì„ ì±„ê´‘í•©ë‹ˆë‹¤.\n드릴 ì¹´í…Œê³ ë¦¬ì˜ ê¸°ê³„ì‹ ë“œë¦´ì„ ì„ íƒí•˜ì—¬ 구리 ê´‘ë§¥ìœ„ì— ì„¤ì¹˜í•˜ì„¸ìš”.\n취소 ë²„íŠ¼ì„ ëˆŒëŸ¬ 건축하기 ì „ì˜ ì„¤ê³„ë¥¼ 취소할 수 있습니다. -tutorial.blockinfo = ê° ë¸”ë¡ë§ˆë‹¤ 다른 íŠ¹ì„±ì„ ê°€ì§€ê³  있으며, ê° ë“œë¦´ì€ íŠ¹ì • ê´‘ì„ë§Œ 채굴할 수 있습니다.\n블ë¡ì˜ 정보와 íŠ¹ì„±ì„ í™•ì¸í•˜ë ¤ë©´, [accent]건설 메뉴ì—서 "?" ë²„íŠ¼ì„ ì„ íƒí•˜ì„¸ìš”.[]\n\n[accent]지금 ê¸°ê³„ì‹ ë“œë¦´ì˜ ì •ë³´ë¥¼ 보세요. -tutorial.conveyor = [accent]컨베ì´ì–´[]는 ìžì›ì„ 코어로 ìš´ë°˜í•˜ëŠ”ë° ì‚¬ìš©ë©ë‹ˆë‹¤.\n드릴ì—서 코어까지 컨베ì´ì–´ 경로를 만드세요.\n[accent]마우스를 길게 눌러 ê²½ë¡œì— ë†“ìŠµë‹ˆë‹¤.\n대ê°ì„ ìœ¼ë¡œ 배치할 경로를 ì„ íƒí•˜ëŠ” ë™ì•ˆ [accent]CTRL[] 키를 누른 ìƒíƒœë¡œ 유지하세요.\n스í¬ë¡¤ íœ ì„ ì‚¬ìš©í•˜ì—¬ 블ë¡ì„ 배치하기 ì „ì— ë¸”ë¡ì„ 회전시킬 수 있습니다.\n[accent]ì„  ë„구를 사용하여 컨베ì´ì–´ 2개를 ë†“ì€ ë‹¤ìŒ, ìžì›ì„ 코어로 넣으세요. -tutorial.conveyor.mobile = [accent]컨베ì´ì–´[]는 ìžì›ì„ 코어로 ìš´ë°˜í•˜ëŠ”ë° ì‚¬ìš©ë©ë‹ˆë‹¤.\n드릴ì—서 코어까지 컨베ì´ì–´ 경로를 만드세요.\n[accent]몇 ì´ˆ ë™ì•ˆ ì†ê°€ë½ì„ 누른 ìƒíƒœì—서 드래그 하여 경로를 그립니다.\n\n[accent]ì„  ë„구로 컨베ì´ì–´ 2개를 ë†“ì€ ë‹¤ìŒ ìžì›ì„ ì½”ì–´ì— ë„£ìœ¼ì„¸ìš”. -tutorial.turret = ìžì›ì´ ì½”ì–´ì— ë“¤ì–´ê°„ 후ì—는 ê±´ë¬¼ì„ ê±´ì„¤í•˜ëŠ”ë° ì‚¬ìš©í•  수 있습니다.\n모든 ìžì›ì´ ê±´ë¬¼ì— ì‚¬ìš©ë  ìˆ˜ 있는 ê²ƒì€ ì•„ë‹™ë‹ˆë‹¤.\nê±´ë¬¼ì— ì‚¬ìš©ë˜ì§€ 않는 ìžì›(예: [accent]ì„탄[] ë˜ëŠ” [accent]광재[])ì€ ì½”ì–´ì— ë„£ì„ ìˆ˜ 없습니다.\n[lightgray]ì []ì„ ê²©ì¶”í•˜ê¸° 위해 ë°©ì–´ ê±´ë¬¼ì„ ì„¸ì›Œì•¼ 합니다.\n기지 ê·¼ì²˜ì— [accent]듀오 í¬íƒ‘[]ì„ ê±´ì„¤í•˜ì„¸ìš”. -tutorial.drillturret = 듀오 í¬íƒ‘ì€ ì‚¬ê²©í•˜ëŠ”ë° [accent]구리 탄약[]ì´ í•„ìš”í•©ë‹ˆë‹¤.\ní¬íƒ‘ ê·¼ì²˜ì— ë“œë¦´ì„ ì„¤ì¹˜í•˜ì„¸ìš”.\n구리를 공급하기 위해 컨베ì´ì–´ë¥¼ í¬íƒ‘으로 ê°€ë„ë¡ ê±´ì„¤í•˜ì„¸ìš”.\n\n[accnet]탄약 ìš´ë°˜: 0/1 -tutorial.pause = 전투 중ì—는 ê²Œìž„ì„ [accent]ì¼ì‹œì •ì§€[] í•  수 있습니다.\nì¼ì‹œì •ì§€ ë˜ëŠ” ë™ì•ˆ ê±´ì„¤ì„ ëŒ€ê¸°ì‹œí‚¬ 수 있습니다.\n\n[accent]ì¼ì‹œì •지하려면 스페ì´ìФ 키를 누르세요. -tutorial.pause.mobile = 싱글 플레ì´ì—서는 ê²Œìž„ì„ [accent]ì¼ì‹œì •ì§€[]í•  수 있습니다.\nì¼ì‹œì •지하면 êµì „ê³¼ ë”불어 건설까지 ì¼ì‹œì •ì§€ë©ë‹ˆë‹¤.\n\n[accent]ì¼ì‹œì •지하려면 왼쪽 ìƒë‹¨ì— 있는 ì´ ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš”. -tutorial.unpause = ì´ì œ 스페ì´ìŠ¤ë¥¼ 누르면 ì¼ì‹œì •지가 í•´ì œë©ë‹ˆë‹¤. -tutorial.unpause.mobile = ì´ì œ 다시 누르면 ì¼ì‹œì •지가 í•´ì œë©ë‹ˆë‹¤. -tutorial.breaking = 블ë¡ì€ 종종 파괴 ë˜ì–´ì•¼ 합니다.\nì„ íƒí•œ 모든 블ë¡ì„ 파괴하려면 [accent]마우스 오른쪽 í´ë¦­ì„ 길게 누르세요[].\n\n[accent]ì˜ì—­ ì„ íƒì„ 사용하여 코어 ì™¼ìª½ì˜ ëª¨ë“  ì¡°ê°ë²½ì„ 파괴하세요. -tutorial.breaking.mobile = 블ë¡ì€ 종종 파괴 ë˜ì–´ì•¼ 합니다.\n[accent]ì‚­ì œ 모드[]를 ì„ íƒí•œ ë‹¤ìŒ ë¸”ë¡ì„ 탭 하여 파괴할 수 있습니다.\n[accnet]몇 ì´ˆ ë™ì•ˆ ì†ê°€ë½ì„ 누르고 ì›í•˜ëŠ” 방향으로 드래그[]하여 범위 안ì—있는 블ë¡ì„ 파괴하세요.\n그리고 ì²´í¬ í‘œì‹œ ë²„íŠ¼ì„ ëˆŒëŸ¬ ì‚­ì œ ìž‘ì—…ì„ í•  수 있습니다.\n[accent]ì˜ì—­ ì„ íƒì„ 사용하여 코어 ì™¼ìª½ì˜ ëª¨ë“  ì¡°ê° ë²½ì„ íŒŒê´´í•˜ì„¸ìš”. -tutorial.withdraw = ê²½ìš°ì— ë”°ë¼ ë¸”ë¡ì—서 ìžì›ì„ ì§ì ‘ 가져와야 합니다.\nì´ ìž‘ì—…ì„ í•˜ë ¤ë©´ [accent]ìžì›ì´ 있는 블ë¡[]ì„ íƒ­í•œ 다ìŒ, ì¸ë²¤í† ë¦¬ì—서 [accent]ìžì›[]ì„ íƒ­í•˜ì„¸ìš”.\n[accent]누른 ìƒíƒœë¥¼ 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어ì—서 구리를 빼내세요. -tutorial.deposit = 기체ì—서 목ì ì§€ 블ë¡ìœ¼ë¡œ 드래그하여 ìžì›ì„ 블ë¡ì— 넣으세요.\n\n[accent]구리를 다시 ì½”ì–´ì— ë„£ìœ¼ì„¸ìš”[]. -tutorial.waves = [lightgray]ì []ì´ ë‹¤ê°€ì˜µë‹ˆë‹¤.\n2 웨ì´ë¸Œë¡œë¶€í„° 코어를 방어하세요. [accent]í´ë¦­[]하여 사격할 수 있습니다.\në” ë§Žì€ í¬íƒ‘ê³¼ ë“œë¦´ì„ ê±´ì„¤í•˜ê³  구리를 ë” ëª¨ìœ¼ì„¸ìš”. -tutorial.waves.mobile = [lightgray]ì []ì´ ë‹¤ê°€ì˜µë‹ˆë‹¤.\n2 웨ì´ë¸Œë¡œë¶€í„° 코어를 방어하세요. ë‹¹ì‹ ì˜ ê¸°ì²´ëŠ” ìžë™ìœ¼ë¡œ ì ì„ 향해 사격합니다.\në” ë§Žì€ í¬íƒ‘ê³¼ ë“œë¦´ì„ ê±´ì„¤í•˜ê³  구리를 ë” ëª¨ìœ¼ì„¸ìš”. -tutorial.launch = 특정 웨ì´ë¸Œì— ë„달하면 [accent]코어로 출격[] ì„ í•  수 있습니다.\n\nì´ë ‡ê²Œ ì–»ì€ ìžì›ì„ 사용하여 새로운 ê¸°ìˆ ì„ ì—°êµ¬ í•  수 있습니다.\n\n[accent]출격 ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš”. +hint.skip = 힌트 넘기기 +hint.desktopMove = [accent][[WASD][] 키를 ì´ìš©í•´ ìžì‹ ì˜ ìœ ë‹›ì„ ì¡°ì¢…í•˜ì„¸ìš”. +hint.zoom = [accent]마우스 스í¬ë¡¤[]ì„ ì‚¬ìš©í•´ 확대 ë˜ëŠ” 축소가 가능합니다. +hint.mine =\uf8c4 ì£¼ë³€ì˜ êµ¬ë¦¬ ê´‘ì„ì„ ìˆ˜ë™ìœ¼ë¡œ 채굴하려면 ê´‘ì„ì„ [accent]누르십시오[]. (추가 설명) 마우스가 있으면 마우스 오른쪽 í´ë¦­ì„ 하면 채굴 ì¤‘ë‹¨ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. +hint.desktopShoot = [accent][[마우스 좌í´ë¦­][]으로 발사할 수 있습니다. +hint.depositItems = ìžì›ì„ 코어로 옮기려면, ê¸°ì²´ì˜ ìžì›ì„ 코어로 ëŒì–´ë†“으세요. +hint.respawn = 기체를 떠나려면 [accent][[V][]를 누르십시오. +hint.respawn.mobile = 유닛 í˜¹ì€ í¬íƒ‘ì„ ì¡°ì¢…í•  수 있습니다. 기체를 떠나려면 [accent]왼쪽 ìœ„ì— ìžˆëŠ” 아바타를 누르십시오.[] +hint.desktopPause = ê²Œìž„ì„ ì¼ì‹œ ì •ì§€/재시작하기 위해 [accent][[Space][]를 누르십시오. +hint.placeDrill = ë“œë¦´ì„ ì„¤ì¹˜í•˜ë ¤ë©´ 오른쪽 ì•„ëž˜ì˜ \ue85e [accent]드릴[]ì„ ì„ íƒí•˜ê³ , \uf870 [accent]드릴[]ì„ ì„ íƒí•´ì„œ 구리 ê´‘ì„ ìœ„ë¥¼ 누르십시오. +hint.placeDrill.mobile = 오른쪽 아래 ë©”ë‰´ì˜ \ue85e [accent] 드릴[]ì„ ì„ íƒí•˜ê³ , \uf870 [accent]드릴[]ì„ ì„ íƒí•´ì„œ 구리 ê´‘ì„ ìœ„ë¥¼ 누르십시오.\n\n설치를 완료하려면 오른쪽 ì•„ëž˜ì˜ \ue800 [accent]완료 버튼[]ì„ ëˆ„ë¥´ì‹­ì‹œì˜¤. +hint.placeConveyor = 컨베ì´ì–´ëŠ” ìžì›ì„ 드릴ì—서 다른 블ë¡ìœ¼ë¡œ ì´ë™ì‹œì¼œì¤ë‹ˆë‹¤. \ue814 [accent]ë¶„ë°°[] 카테고리ì—서 \uf896 [accent]컨베ì´ì–´[]를 ì„ íƒí•˜ì‹­ì‹œì˜¤.\n\ní´ë¦­í•˜ê±°ë‚˜ 드래그로 ë‹¤ìˆ˜ì˜ ì»¨ë² ì´ì–´ë¥¼ 설치할 수 있습니다.\ní´ë¦­í•˜ê³  놓지 ì•Šì€ ì±„ë¡œ 마우스 [accent]íœ ì„ ëŒë¦¬ë©´ ëŒì•„갑니다. +hint.placeConveyor.mobile = 컨베ì´ì–´ëŠ” ìžì›ì„ 드릴ì—서 다른 블ë¡ìœ¼ë¡œ ì´ë™ì‹œì¼œì¤ë‹ˆë‹¤. \ue814 [accent]ë¶„ë°°[] 카테고리ì—서 \uf896 [accent]컨베ì´ì–´[]를 ì„ íƒí•˜ì‹­ì‹œì˜¤.\n\n여러 ê°œì˜ ì»¨ë² ì´ì–´ë¥¼ 놓으려면 ì†ê°€ë½ìœ¼ë¡œ 누른 채로 ëŒì–´ì„œ 설치 범위를 지정하십시오. +hint.placeTurret = ì ì—게서 기지를 막아내려면 \uf861 [accent]í¬íƒ‘[]를 설치하십시오.\n\ní¬íƒ‘ 탄약 í•„ìš” - ì§€ê¸ˆì€ \uf838 구리가 필요합니다.\n컨베ì´ì–´ë¥¼ 사용해 ë“œë¦´ì— êµ¬ë¦¬ë¥¼ 공급하십시오. +hint.breaking = 블ë¡ì„ 부수려면 [accent]ìš°í´ë¦­[]ì´ë‚˜ 드래그를 하십시오. +hint.breaking.mobile = 블ë¡ì„ 부수려면 오른쪽 ì•„ëž˜ì˜ \ue817 [accent]ë§ì¹˜[]를 눌러 í•´ì²´ 모드를 활성화하십시오.\n\nì†ê°€ë½ìœ¼ë¡œ 누른 채로 ëŒì–´ì„œ í•´ì²´ 범위를 지정하십시오. +hint.research = 새 ê¸°ìˆ ì„ ì—°êµ¬í•˜ë ¤ë©´ \ue875 [accent]연구[]ë²„íŠ¼ì„ ëˆ„ë¥´ì‹­ì‹œì˜¤. +hint.research.mobile = 새 ê¸°ìˆ ì„ ì—°êµ¬í•˜ë ¤ë©´ \ue88c [accent]메뉴[] ì•„ëž˜ì˜ \ue875 [accent]연구[]ë²„íŠ¼ì„ ëˆ„ë¥´ì‹­ì‹œì˜¤. +hint.unitControl = ì•„êµ° 유닛과 í¬íƒ‘ì„ ì¡°ì¢…í•˜ë ¤ë©´ [accent][[왼쪽 ctrl][]ì„ ëˆ„ë¥¸ 채로 [accent]í´ë¦­[] 하십시오. +hint.unitControl.mobile = ì•„êµ° 유닛과 í¬íƒ‘ì„ ì¡°ì¢…í•˜ë ¤ë©´ 해당 개체를 [accent]빠르게 ë‘ ë²ˆ 누르십시오[]. +hint.launch = 충분한 ìžì›ì„ 모았으면, 오른쪽 ì•„ëž˜ì˜ \ue827 [accent]Map[]ì—서 주변 ì§€ì—­ì„ ì„ íƒí•´ì„œ [accent]Launch[]í•  수 있습니다. +hint.launch.mobile = 충분한 ìžì›ì„ 모았으면, 오른쪽 ì•„ëž˜ì˜ \ue88c [accent]메뉴[]ì— ìžˆëŠ” \ue827 [accent]Map[]ì—서 주변 ì§€ì—­ì„ ì„ íƒí•´ì„œ [accent]Launch[]í•  수 있습니다. +hint.schematicSelect = 블ë¡ì„ 복사하고 붙여넣으려면 [accent][[F][]를 누른 채로 ëŒì–´ì„œ êµ¬ì—­ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤. \n\n [accent][[마우스 휠][]ì„ ëˆ„ë¥´ë©´ 한 ê°œì˜ ë¸”ë¡ë§Œ 복사할 수 있습니다. +hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]ì„ ëˆ„ë¥¸ 채로 컨베ì´ì–´ë¥¼ 대ê°ì„ ìœ¼ë¡œ ëŒë©´ ê¸¸ì„ ìžë™ìœ¼ë¡œ 만들어ì¤ë‹ˆë‹¤. +hint.conveyorPathfind.mobile = \ue844 [accent]diagonal mode[]를 활성화하고 컨베ì´ì–´ë¥¼ 대ê°ì„ ìœ¼ë¡œ ëŒë©´ ê¸¸ì„ ìžë™ìœ¼ë¡œ 찾아ì¤ë‹ˆë‹¤. +hint.boost = 유닛과 ê°™ì´ ìž¥ì• ë¬¼ì„ ë„˜ì–´ê°€ë ¤ë©´ [accent][[L-Shift][]ì„ ëˆ„ë¥´ê³  ì´ë™í•˜ì‹­ì‹œì˜¤. \n\n ì ì€ ìˆ˜ì˜ ì§€ìƒ ìœ ë‹›ë§Œ ë‚  수 있습니다. +hint.command = ì£¼ë³€ì˜ ì•„êµ° ìœ ë‹›ì„ ë°ë¦¬ê³  다니려면 비슷한 ë‹¨ê³„ì˜ ìœ ë‹› 무리 주변ì—서 [accent][[G][]를 누르십시오. \n\n ì§€ìƒ ìœ ë‹›ì„ ë°ë¦¬ê³  다니기 위해서는 먼저 다른 ì§€ìƒ ìœ ë‹›ì„ ì¡°ì¢…í•˜ê³  있어야 합니다. +hint.command.mobile = ì•„êµ° ìœ ë‹›ì„ ë°ë¦¬ê³  다니려면 비슷한 ë‹¨ê³„ì˜ ìœ ë‹› 무리 주변ì—서 [accent]빠르게 ë‘ ë²ˆ 누르십시오[]. +hint.payloadPickup = ìž‘ì€ ë¸”ë¡ì´ë‚˜ ìœ ë‹›ì„ ì§‘ìœ¼ë ¤ë©´ [accent][[[]를 누르십시오. +hint.payloadPickup.mobile = ìž‘ì€ ë¸”ë¡ì´ë‚˜ ìœ ë‹›ì„ ì§‘ìœ¼ë ¤ë©´ [accent]ìž ê¹ ëˆ„ë¥´ì‹­ì‹œì˜¤[]. +hint.payloadDrop = 다시 내려놓으려면 [accent]][]를 누르십시오. +hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간ì—서 [accent]í™”ë©´ì„ ìž ê¹ ëˆ„ë¥´ì‹­ì‹œì˜¤[]. +hint.waveFire = [accent]Wave[]í¬íƒ‘ì— íƒ„ì•½ìœ¼ë¡œ ë¬¼ì„ ë„£ìœ¼ë©´ ì£¼ë³€ì˜ ë¶ˆì„ ìžë™ìœ¼ë¡œ 꺼ì¤ë‹ˆë‹¤. +hint.generator = \uf879 [accent]화력 발전기[]는 ì„íƒ„ì„ íƒœì›Œì„œ 주변 블ë¡ì— ì „ë ¥ì„ ì „ë‹¬í•©ë‹ˆë‹¤.\n\n \uf87f ë” ë„“ì€ ë²”ìœ„ì˜ ë¸”ë¡ì— ì „ë ¥ì„ ì „ë‹¬í•˜ë ¤ë©´ [accent]Power Nodes[]를 사용하십시오. +hint.guardian = [accent]수호ìž[] ìœ ë‹›ë“¤ì€ ë°©ì–´ë ¥ì„ ê°€ì§‘ë‹ˆë‹¤. [accent]구리[]와 [accent]ë‚©[] ê°™ì€ ì•½í•œ 탄약으로는 [scarlet]아무런 íš¨ê³¼ë„ ì—†ìŠµë‹ˆë‹¤[].\n\n그런 수호ìžë¥¼ 없애려면 ë†’ì€ ë‹¨ê³„ì˜ í¬íƒ‘ ë˜ëŠ” \uf835 [accent]í‘ì—°[]ì„ íƒ„ì•½ìœ¼ë¡œ ë„£ì€ \uf861듀오/\uf859살보를 사용하십시오. +hint.coreUpgrade = 코어는 [accent]ìƒìœ„ 코어를 ìœ„ì— ì„¤ì¹˜í•¨[]ìœ¼ë¡œì¨ ì—…ê·¸ë ˆì´ë“œí•  수 있습니다.\n\n [accent]기반[] 코어를 [accent]ì¡°ê°[] 코어 ìœ„ì— ì„¤ì¹˜í•˜ì‹­ì‹œì˜¤. ì£¼ë³€ì— ìž¥ì• ë¬¼ì´ ì—†ëŠ”ì§€ë„ í™•ì¸í•˜ì‹­ì‹œì˜¤. +hint.presetLaunch = [accent]ì–¼ì–´ë¶™ì€ ìˆ²[]ê³¼ ê°™ì€ íšŒìƒ‰[accent]ìº íŽ˜ì¸ ì§€ì—­[]ì€ ì–´ë””ì—서나 출격해서 올 수 있습니다. 주변 ì§€ì—­ì„ ì ë ¹í•˜ì§€ ì•Šì•„ë„ ë©ë‹ˆë‹¤.\n\nì´ì™€ ê°™ì€ [accent]네임드 지역[]ë“¤ì€ [accent]ì„ íƒì []입니다. +hint.coreIncinerate = 코어가 ìžì›ìœ¼ë¡œ ê°€ë“ ì°¬ í›„ì— ë°›ëŠ” 모든 ìžì›ë“¤ì€ [accent]소ê°[]ë  ê²ƒìž…ë‹ˆë‹¤. +hint.coopCampaign = [accent]í˜‘ë™ ìº íŽ˜ì¸[]ì„ í•  때, 현재 ë§µì—서 ìƒì‚°ëœ ìžì›ë“¤ì€ [accent]ìº íŽ˜ì¸ ì§€ì—­[]ìœ¼ë¡œë„ ë³´ë‚´ì§‘ë‹ˆë‹¤.\n\n호스트가 새로 해금한 모든 ê²ƒë“¤ë„ ê°€ì ¸ê°‘ë‹ˆë‹¤. item.copper.description = 가장 기본ì ì¸ 건설 재료. 모든 ìœ í˜•ì˜ ë¸”ë¡ì—서 광범위하게 사용ë©ë‹ˆë‹¤. +item.copper.details = í‰ë²”한 구리. ì„¸ë¥´í”Œë¡œì— ë¹„ì •ìƒì ìœ¼ë¡œ ë§Žì´ ë¶„í¬í•©ë‹ˆë‹¤. 별다른 보강재 ì—†ì´ëŠ” êµ¬ì¡°ì  ë¬¸ì œ ë•Œë¬¸ì— ë‚´êµ¬ì„±ì´ ë¹„êµì  약합니다. item.lead.description = 기본 초반 재료. ì „ìž ë° ì•¡ì²´ 수송 블ë¡ì—서 광범위하게 사용ë˜ëŠ” ìžì›ìž…니다. -item.metaglass.description = 초강력 방탄 유리. ì•¡ì²´ ë¶„ë°° ë° ì €ìž¥ì— ê´‘ë²”ìœ„í•˜ê²Œ 사용ë©ë‹ˆë‹¤. +item.lead.details = ë°€ë„ê°€ 높으며 ë°˜ì‘ì„±ì´ ì ì€ ìžì›. ë°°í„°ë¦¬ì— ì£¼ë¡œ 사용ë©ë‹ˆë‹¤. +item.metaglass.description = 초강력 방탄유리. ì•¡ì²´ ë¶„ë°° ë° ì €ìž¥ì— ê´‘ë²”ìœ„í•˜ê²Œ 사용ë©ë‹ˆë‹¤. item.graphite.description = 탄약 ë° ì „ê¸° ë¶€í’ˆì— ì‚¬ìš©ë˜ëŠ” 무기질 탄소. item.sand.description = 제련ì—서 합금 ë˜ëŠ” 플럭스ì—서 광범위하게 사용ë˜ëŠ” ì¼ë°˜ì ì¸ 재료. item.coal.description = í™”ì„í™”ëœ ì‹ë¬¼ 물질. ì”¨ì•—ì´ ë‚˜ì˜¤ê¸° 훨씬 ì „ì— í˜•ì„±ë˜ì—ˆìŠµë‹ˆë‹¤. 연료 ë° ìžì› ìƒì‚°ì— 광범위하게 사용ë©ë‹ˆë‹¤. -item.titanium.description = ì•¡ì²´ 수송, 드릴 ë° í•­ê³µê¸°ì— ê´‘ë²”ìœ„í•˜ê²Œ 사용ë˜ëŠ” í¬ê·€ 초경량 금ì†. +item.coal.details = 발화 작용 ì´ì „, ì˜¤ëž˜ì „ì— ìƒì„±ëœ í™”ì„í™” ìž‘ìš©ì„ ê±°ì¹œ ì‹ë¬¼ì²´ë¡œ 보입니다. +item.titanium.description = ì•¡ì²´ 수송, 드릴ì´ë‚˜ í•­ê³µê¸°ì— ê´‘ë²”ìœ„í•˜ê²Œ 사용ë˜ëŠ” í¬ê·€ 초경량 금ì†. item.thorium.description = êµ¬ì¡°ì  ì§€ì§€ ë° í•µì—°ë£Œë¡œ 사용ë˜ëŠ” ê³ ë°€ë„ì˜ ë°©ì‚¬ì„± 금ì†. item.scrap.description = ì˜¤ëž˜ëœ ê±´ë¬¼ê³¼ ìœ ë‹›ì˜ ë‚¨ì€ ìž”í•´. ë¯¸ëŸ‰ì˜ ë‹¤ì–‘í•œ 금ì†ë“¤ì´ í¬í•¨ë˜ì–´ 있습니다. +item.scrap.details = ì˜¤ëž˜ëœ êµ¬ì¡°ë¬¼ê³¼ ìœ ë‹›ì˜ ìž”í•´. item.silicon.description = 매우 유용한 ë°˜ë„ì²´. 복잡한 ì „ìž ìž¥ì¹˜ë‚˜ 유ë„íƒ„ì— ì‚¬ìš©ë©ë‹ˆë‹¤. item.plastanium.description = 고급 기체 ë° íŒŒíŽ¸í™” íƒ„ì•½ì— ì‚¬ìš©ë˜ëŠ” ê°€ë³ê³  ì—°ì„±ì´ ìžˆëŠ” 재료입니다. -item.phase-fabric.description = 최첨단 ì „ìž ì œí’ˆê³¼ ìžê¸°ìˆ˜ë¦¬ ê¸°ìˆ ì— ì‚¬ìš©ë˜ëŠ” ê±°ì˜ ë¬´ì¤‘ë ¥ì— ê°€ê¹Œìš´ 물질입니다. +item.phase-fabric.description = 최첨단 ì „ìž ì œí’ˆê³¼ ìžê°€ 수리 ê¸°ìˆ ì— ì‚¬ìš©ë˜ëŠ” ê±°ì˜ ë¬´ì¤‘ë ¥ì— ê°€ê¹Œìš´ 물질입니다. item.surge-alloy.description = ë…특한 ì „ê¸°ì  íŠ¹ì„±ì„ ê°€ì§„ 고급 합금. -item.spore-pod.description = ì‚°ì—… 목ì ì„ 위해 대기 ë†ë„ì—서 í•©ì„±ëœ í¬ìž 버섯. ì„유, í­ë°œë¬¼ ë° ì—°ë£Œë¡œ 전환하는 ë° ì‚¬ìš©ë©ë‹ˆë‹¤. +item.spore-pod.description = ì‚°ì—… 목ì ì„ 위해 대기 ë†ë„ì—서 í•©ì„±ëœ í¬ìž 버섯. ì„유, í­ë°œë¬¼ê³¼ 연료로 전환하는 ë° ì‚¬ìš©ë©ë‹ˆë‹¤. +item.spore-pod.details = í¬ìž. 유기ì ì¸ ìƒëª…체로 íŒë‹¨ëœë‹¤. 타 ìœ ê¸°ì²´ì— ì¹˜ëª…ì ì¸ ë…가스를 내뿜는다. ì¹¨ìž…ì„±ì´ ë§¤ìš° 강하다. 특정 ì¡°ê±´ì—서 강력한 ì¸í™”ì„±ì„ ë³´ìž…ë‹ˆë‹¤. item.blast-compound.description = í­íƒ„ê³¼ í­ë°œë¬¼ì— 사용ë˜ëŠ” 불안정한 화합물. í¬ìž 버섯 ë° ê¸°íƒ€ 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤. -item.pyratite.description = ì†Œì´ ë¬´ê¸°ì—서 사용ë˜ëŠ” 매우 ë†’ì€ ê°€ì—°ì„± 물질. -liquid.water.description = 가장 유용한 ì•¡ì²´. 냉ê°ê¸° ë° í기물 ì²˜ë¦¬ì— ì¼ë°˜ì ìœ¼ë¡œ 사용ë©ë‹ˆë‹¤. -liquid.slag.description = 다양한 ì¢…ë¥˜ì˜ ê¸ˆì†ë“¤ì´ 함께 섞여 녹아있습니다. 분리기를 ì´ìš©í•´ 다른 광물들로 분리하거나 탄약으로 사용해 ì  ë¶€ëŒ€ë¥¼ 향해 ì‚´í¬í•  수 있습니다. -liquid.oil.description = 고급 재료 ìƒì‚°ì— 사용ë˜ëŠ” ì•¡ì²´. ì„탄으로 전환하거나 무기로 뿌려서 ë¶ˆì„ ì§€ë¥¼ 수 있습니다. -liquid.cryofluid.description = 물과 티타늄으로 만든 비 ë¶€ì‹ì„± ì•¡ì²´. ì—´ ìš©ëŸ‰ì´ ë§¤ìš° 높으며 냉ê°ìˆ˜ë¡œ 광범위하게 사용ë©ë‹ˆë‹¤. +item.pyratite.description = ì†Œì´ ë¬´ê¸°ì—서 사용ë˜ëŠ” 가연성 매우 ë†’ì€ ë¬¼ì§ˆ. -block.message.description = 메시지를 남ê¹ë‹ˆë‹¤. ê°™ì€ íŒ€ ê°„ì˜ ì†Œí†µì— ì‚¬ìš©ë©ë‹ˆë‹¤. -block.graphite-press.description = ì„탄 ë©ì–´ë¦¬ë¥¼ 순수한 í‘연으로 압축합니다. -block.multi-press.description = í‘ì—° ì••ì¶•ê¸°ì˜ ê°•í™” 버전. ì„íƒ„ì„ ë¹ ë¥´ê³  효율ì ìœ¼ë¡œ 처리하기 위해 물과 ì „ë ¥ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. -block.silicon-smelter.description = 순수한 ì„탄과 모래로 ì‹¤ë¦¬ì½˜ì„ ìƒì‚°í•©ë‹ˆë‹¤. -block.kiln.description = 모래를 제련하여 ê°•í™” 유리ë¼ê³  알려진 화합물로 만듭니다. ìž‘ë™ë ¤ë©´ ì†ŒëŸ‰ì˜ ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. +liquid.water.description = ê¸°ëŠ¥ì„±ì´ ë›°ì–´ë‚œ ì•¡ì²´. 냉ê°ê¸° ë° í기물 ì²˜ë¦¬ì— ì¼ë°˜ì ìœ¼ë¡œ 사용ë©ë‹ˆë‹¤. +liquid.slag.description = 다양한 ì¢…ë¥˜ì˜ ê¸ˆì†ë“¤ì´ 함께 섞여 녹아있습니다. 분리기를 ì´ìš©í•´ 다른 광물들로 분리하거나 탄약으로 사용해 ì  ë¶€ëŒ€ë¥¼ 향해 ì‚´í¬í•  수 있습니다. +liquid.oil.description = 고급 재료 ìƒì‚°ì— 사용ë˜ëŠ” ì•¡ì²´. ì„탄으로 전환하거나 무기로 뿌려서 ë¶ˆì„ ì§€ë¥¼ 수 있습니다. +liquid.cryofluid.description = 물과 티타늄으로 만든 비부ì‹ì„± ì•¡ì²´. ì—´ìš©ëŸ‰ì´ ë§¤ìš° 높으며 냉ê°ìˆ˜ë¡œ 광범위하게 사용ë©ë‹ˆë‹¤. + +block.resupply-point.description = 주변 ìœ ë‹›ë“¤ì— êµ¬ë¦¬ íƒ„ì•½ì„ ë³´ê¸‰í•©ë‹ˆë‹¤. 배터리 ì „ë ¥ì´ í•„ìš”í•œ ìœ ë‹›ë“¤ì€ í˜¸í™˜ë˜ì§€ 않습니다. +block.armored-conveyor.description = 앞으로 ìžì›ë“¤ì„ 운반합니다. 측면ì—서 ìžì›ë“¤ì„ 받아들ì´ì§€ 않습니다. +block.illuminator.description = 발광합니다. +block.message.description = ì•„êµ° ê°„ì˜ ì†Œí†µì„ ìœ„í•œ 메시지를 저장합니다. +block.graphite-press.description = ì„íƒ„ì„ í‘연으로 압축합니다. +block.multi-press.description = ì„íƒ„ì„ í‘연으로 압축합니다. 냉ê°ìˆ˜ë¡œì¨ ë¬¼ì´ í•„ìš”í•©ë‹ˆë‹¤. +block.silicon-smelter.description = ì„탄과 모래로부터 ì‹¤ë¦¬ì½˜ì„ ì •ì œí•©ë‹ˆë‹¤. +block.kiln.description = 모래와 ë‚©ì„ ê°•í™” 유리로 제련합니다. block.plastanium-compressor.description = ì„유와 티타늄으로 플ë¼ìŠ¤í„°ëŠ„ì„ ìƒì‚°í•©ë‹ˆë‹¤. -block.phase-weaver.description = 방사성 토륨과 모래ì—서 메타를 합성합니다. ìž‘ë™í•˜ë ¤ë©´ 엄청난 ì–‘ì˜ ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. +block.phase-weaver.description = 토륨과 모래로 메타를 합성합니다. block.alloy-smelter.description = 티타늄, ë‚©, 실리콘, 구리를 결합하여 ì„¤ê¸ˆì„ ìƒì‚°í•©ë‹ˆë‹¤. -block.cryofluid-mixer.description = 물과 미세 티타늄 ë¶„ë§ì„ 냉ê°ìˆ˜ë¡œ 혼합합니다. 토륨 ì›ìžë¡œ ì‚¬ìš©ì— í•„ìˆ˜ì ìž…니다. -block.blast-mixer.description = í¬ìž í´ëŸ¬ìŠ¤í„°ë¥¼ 파ì´ë¼íƒ€ì´íŠ¸ì™€ 분쇄하고 혼합하여 í­ë°œë¬¼ì„ 만듭니다. -block.pyratite-mixer.description = ì„탄, ë‚©, 모래를 ê°€ì—°ì„±ì´ ë†’ì€ íŒŒì´ë¼íƒ€ì´íŠ¸ë¡œ 만듭니다. -block.melter.description = 웨ì´ë¸Œ í¬íƒ‘ì—서 추가 처리 ë˜ëŠ” ì‚¬ìš©ì„ ìœ„í•´ ê³ ì² ì„ ê´‘ìž¬ë¡œ 녹입니다. -block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉ê°ëœ 결과를 출력합니다. -block.spore-press.description = í¬ìž ë²„ì„¯ì„ ê·¹ì••ìœ¼ë¡œ 압축하여 ê¸°ë¦„ì„ í•©ì„±í•©ë‹ˆë‹¤. -block.pulverizer.description = ê³ ì² ì„ ë­‰ê°œì„œ ê³ ìš´ 모래로 만듭니다. -block.coal-centrifuge.description = 기름ì—서 ì„탄 ë©ì–´ë¦¬ë¥¼ 추출합니다. +block.cryofluid-mixer.description = 물과 미세 티타늄 ë¶„ë§ì„ 냉ê°ìˆ˜ë¡œ 혼합합니다. +block.blast-mixer.description = 파ì´ë¼íƒ€ì´íŠ¸ì™€ í¬ìžë¡œ í­ë°œë¬¼ì„ ìƒì‚°í•©ë‹ˆë‹¤. +block.pyratite-mixer.description = ì„탄, ë‚©, 그리고 모래를 파ì´ë¼íƒ€ì´íŠ¸ë¡œ 혼합합니다. +block.melter.description = ê³ ì² ì„ ê´‘ìž¬ë¡œ 녹입니다. +block.separator.description = 광재를 광물들로 분리합니다. +block.spore-press.description = í¬ìžë¥¼ ì„유로 압축합니다. +block.pulverizer.description = ê³ ì² ì„ ê°ˆì•„ 모래로 만듭니다. +block.coal-centrifuge.description = ì„유ì—서 ì„íƒ„ì„ ì¶”ì¶œí•©ë‹ˆë‹¤. block.incinerator.description = 넘치는 ìžì›ì´ë‚˜ 액체를 ì¦ë°œì‹œí‚µë‹ˆë‹¤. -block.power-void.description = ìž…ë ¥ëœ ëª¨ë“  ì „ë ¥ì„ ë¬´íš¨í™”í•©ë‹ˆë‹¤. 샌드박스 ì „ìš©. +block.power-void.description = ìž…ë ¥ëœ ëª¨ë“  ì „ë ¥ì„ ë¬´íš¨ë¡œ 합니다. 샌드박스 ì „ìš©. block.power-source.description = 무한한 ì „ë ¥ì„ ê³µê¸‰í•´ì£¼ëŠ” 블ë¡ìž…니다. 샌드박스 ì „ìš©. block.item-source.description = ìžì›ì„ 무한대로 출력합니다. 샌드박스 ì „ìš©. block.item-void.description = 모든 ìžì›ì„ 파괴합니다. 샌드박스 ì „ìš©. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 ì „ìš©. block.liquid-void.description = 액체를 제거합니다. 샌드박스 ì „ìš©. -block.copper-wall.description = 저렴한 수비 블ë¡.\nì²˜ìŒ ëª‡ 웨ì´ë¸Œì—서 코어와 í¬íƒ‘ì„ ë³´í˜¸í•˜ëŠ”ë° ìœ ìš©í•©ë‹ˆë‹¤. -block.copper-wall-large.description = 저렴한 수비 블ë¡.\nì²˜ìŒ ëª‡ 웨ì´ë¸Œì—서 코어와 í¬íƒ‘ì„ ë³´í˜¸í•˜ëŠ”ë° ìœ ìš©í•©ë‹ˆë‹¤.\n여러 타ì¼ì„ 차지합니다. +block.copper-wall.description = 저렴한 수비 블ë¡.\n초반 단계ì—서 코어와 í¬íƒ‘ì„ ë³´í˜¸í•˜ëŠ” ë° ìœ ìš©í•©ë‹ˆë‹¤. +block.copper-wall-large.description = 저렴한 수비 블ë¡.\n초반 단계ì—서 코어와 í¬íƒ‘ì„ ë³´í˜¸í•˜ëŠ” ë° ìœ ìš©í•©ë‹ˆë‹¤.\n여러 타ì¼ì„ 차지합니다. block.titanium-wall.description = ì ë‹¹ížˆ 강한 ë°©ì–´ 블ë¡.\nì ì—게서 ì ì ˆí•œ 보호를 제공합니다. block.titanium-wall-large.description = ì ë‹¹ížˆ 강한 ë°©ì–´ 블ë¡.\nì ì—게서 ì ì ˆí•œ 보호를 제공합니다.\n여러 타ì¼ì„ 차지합니다. block.plastanium-wall.description = 전격 ê³µê²©ì„ í¡ìˆ˜í•˜ê³  ì „ë ¥ ë…¸ë“œì˜ ìžë™ ì—°ê²°ì„ ì°¨ë‹¨í•˜ëŠ” 특수 ìœ í˜•ì˜ ë²½. block.plastanium-wall-large.description = 전격 ê³µê²©ì„ í¡ìˆ˜í•˜ê³  ì „ë ¥ ë…¸ë“œì˜ ìžë™ ì—°ê²°ì„ ì°¨ë‹¨í•˜ëŠ” 특수 ìœ í˜•ì˜ ë²½.\n여러 타ì¼ì„ 차지합니다. block.thorium-wall.description = 강력한 ë°©ì–´ 블ë¡.\nì ìœ¼ë¡œë¶€í„° ì ì ˆí•œ 보호를 í•  수 있습니다. block.thorium-wall-large.description = 강력한 ë°©ì–´ 블ë¡.\nì ìœ¼ë¡œë¶€í„° ì ì ˆí•œ 보호를 í•  수 있습니다.\n여러 타ì¼ì„ 차지합니다. -block.phase-wall.description = 특수 메타기반 반사 화합물로 ì½”íŒ…ëœ ë²½. ëŒ€ë¶€ë¶„ì˜ ì´ì•Œì„ 반사시킵니다. -block.phase-wall-large.description = 특수 메타기반 반사 화합물로 ì½”íŒ…ëœ ë²½. ëŒ€ë¶€ë¶„ì˜ ì´ì•Œì„ 반사시킵니다.\n여러 타ì¼ì„ 차지합니다. +block.phase-wall.description = 특수 메타기반 반사 화합물로 ì½”íŒ…ëœ ë²½. ì´ì•Œ ëŒ€ë¶€ë¶„ì„ ë°˜ì‚¬í•©ë‹ˆë‹¤. +block.phase-wall-large.description = 특수 메타기반 반사 화합물로 ì½”íŒ…ëœ ë²½. ì´ì•Œ ëŒ€ë¶€ë¶„ì„ ë°˜ì‚¬í•©ë‹ˆë‹¤.\n여러 타ì¼ì„ 차지합니다. block.surge-wall.description = ë‚´êµ¬ì„±ì´ ë§¤ìš° 강한 ë°©ì–´ 블ë¡.\nì´íƒ„ì´ ë‚ ì•„ì˜¤ë©´ ì¶©ì „ëŸ‰ì„ ë†’ì—¬ 무작위로 방출합니다. block.surge-wall-large.description = ë‚´êµ¬ì„±ì´ ë§¤ìš° 강한 ë°©ì–´ 블ë¡.\nì´íƒ„ì´ ë‚ ì•„ì˜¤ë©´ ì¶©ì „ëŸ‰ì„ ë†’ì—¬ 무작위로 방출합니다.\n여러 타ì¼ì„ 차지합니다. -block.door.description = ìž‘ì€ ë¬¸. 탭하여 열거나 ë‹«ì„ ìˆ˜ 있습니다. -block.door-large.description = í° ë¬¸. 탭하여 열거나 ë‹«ì„ ìˆ˜ 있습니다.\n여러 타ì¼ì„ 차지합니다. -block.mender.description = ì£¼ë³€ì˜ ë¸”ë¡ì„ 주기ì ìœ¼ë¡œ 수리합니다. 웨ì´ë¸Œ 사ì´ì˜ 방어를 유지하게 합니다.\nì„ íƒì ìœ¼ë¡œ ì‹¤ë¦¬ì½˜ì„ ì‚¬ìš©í•˜ì—¬ 범위와 íš¨ìœ¨ì„±ì„ í–¥ìƒì‹œí‚µë‹ˆë‹¤. -block.mend-projector.description = 소형 수리 프로ì í„°ì˜ ê°•í™” 버전. ì£¼ë³€ì˜ ë¸”ë¡ì„ 수리합니다.\nì„ íƒì ìœ¼ë¡œ 메타를 사용하여 범위와 íš¨ìœ¨ì„±ì„ í–¥ìƒì‹œí‚µë‹ˆë‹¤. +block.door.description = ìž‘ì€ ë¬¸. 탭 하여 열거나 ë‹«ì„ ìˆ˜ 있습니다. +block.door-large.description = í° ë¬¸. 탭 하여 열거나 ë‹«ì„ ìˆ˜ 있습니다.\n여러 타ì¼ì„ 차지합니다. +block.mender.description = ì£¼ë³€ì˜ ë¸”ë¡ì„ 주기ì ìœ¼ë¡œ 수리합니다. ê° ë‹¨ê³„ 사ì´ì˜ 방어를 유지하게 합니다.\nì„ íƒì ìœ¼ë¡œ ì‹¤ë¦¬ì½˜ì„ ì‚¬ìš©í•˜ì—¬ 범위와 íš¨ìœ¨ì„±ì„ í–¥ìƒí•©ë‹ˆë‹¤. +block.mend-projector.description = 소형 수리 프로ì í„°ì˜ ê°•í™” 버전. ì£¼ë³€ì˜ ë¸”ë¡ì„ 수리합니다.\nì„ íƒì ìœ¼ë¡œ 메타를 사용하여 범위와 íš¨ìœ¨ì„±ì„ í–¥ìƒí•©ë‹ˆë‹¤. block.overdrive-projector.description = 주변 ê±´ë¬¼ì˜ ì†ë„를 높입니다.\nì„ íƒì ìœ¼ë¡œ 메타를 사용하여 범위와 íš¨ìœ¨ì„±ì„ ë†’ìž…ë‹ˆë‹¤. -block.force-projector.description = 건물과 ë‚´ë¶€ì˜ ìœ ë‹›ì„ ê³µê²©ìœ¼ë¡œë¶€í„° 보호하며, ê·¸ ì£¼ìœ„ì— ìœ¡ê°í˜• ì—­ìž¥ì„ í˜•ì„±í•©ë‹ˆë‹¤.\n너무 ë§Žì€ ì†ìƒì´ ì§€ì†ë˜ë©´ 과열ë˜ë©°, ì„ íƒì ìœ¼ë¡œ 냉ê°ìˆ˜ë¥¼ 사용하여 ê³¼ì—´ì„ ë°©ì§€í•  수 있고, 메타는 ì—­ìž¥ì˜ í¬ê¸°ë¥¼ 늘리는 ë° ì‚¬ìš©í•  수 있습니다. -block.shock-mine.description = 지뢰를 ë°Ÿê³  있는 ì ì—게 피해를 입힙니다. ì ì—게는 ê±°ì˜ ë³´ì´ì§€ 않습니다. -block.conveyor.description = 기본 ìžì› 수송 ë ˆì¼. ìžì›ì„ ë°°ì¹˜ëœ ë°©í–¥ì„ ë”°ë¼ ì´ë™ì‹œì¼œ ìžë™ìœ¼ë¡œ ê±´ë¬¼ì— ë„£ì–´ì¤ë‹ˆë‹¤. 회전ì‹. +block.force-projector.description = 건물과 ë‚´ë¶€ì˜ ìœ ë‹›ì„ ê³µê²©ìœ¼ë¡œë¶€í„° 보호하며, ê·¸ ì£¼ìœ„ì— ìœ¡ê°í˜• ì—­ìž¥ì„ í˜•ì„±í•©ë‹ˆë‹¤.\nê°‘ìžê¸° ë§Žì€ ì†ìƒì´ 피해를 받으면 과열ë˜ë©°, ì„ íƒì ìœ¼ë¡œ 냉ê°ìˆ˜ë¥¼ 사용하여 ê³¼ì—´ì„ ë°©ì§€í•  수 있고, 메타는 ì—­ìž¥ì˜ í¬ê¸°ë¥¼ 늘리는 ë° ì‚¬ìš©í•  수 있습니다. +block.shock-mine.description = 지뢰를 ë°Ÿê³  있는 ì ì—게 피해를 ì¤ë‹ˆë‹¤. ì ì—게는 ê±°ì˜ ë³´ì´ì§€ 않습니다. +block.conveyor.description = 기본 ìžì› 수송 ë ˆì¼. ìžì›ì„ ë°°ì¹˜ëœ ë°©í–¥ì„ ë”°ë¼ ì´ë™ 시켜 ìžë™ìœ¼ë¡œ ê±´ë¬¼ì— ë„£ì–´ì¤ë‹ˆë‹¤. 회전ì‹. block.titanium-conveyor.description = 고급 ìžì› 수송 ë ˆì¼. 기본 컨베ì´ì–´ë³´ë‹¤ ìžì›ì„ ë” ë¹¨ë¦¬ ì´ë™ì‹œí‚µë‹ˆë‹¤. block.plastanium-conveyor.description = ìžì›ì„ ì¼ê´„ì ìœ¼ë¡œ 운송시킵니다. 컨베ì´ì— ë’¤ì—서 ìžì›ì„ 받고 ì•žìª½ì— ì„¸ 방향으로 내보냅니다. block.junction.description = 2ê°œì˜ ì»¨ë² ì´ì–´ 벨트를 êµì°¨ì‹œí‚¤ëŠ” 다리 ì—­í• ì„ í•©ë‹ˆë‹¤. 서로 다른 재료를 다른 장소로 운반하는 ë‘ ê°œì˜ ë‹¤ë¥¸ 컨베ì´ì–´ì˜ ìƒí™©ì—서 유용합니다. block.bridge-conveyor.description = 고급 ìžì› 운송 블ë¡. 지형ì´ë‚˜ ê±´ë¬¼ì„ ë„˜ì–´ 최대 3ê°œ 타ì¼ì„ 건너뛰고 ìžì›ì„ 운송할 수 있습니다. block.phase-conveyor.description = 고급 ìžì› 운송 블ë¡. ì „ë ¥ì„ ì‚¬ìš©í•˜ì—¬ 여러 타ì¼ì„ 통해 ì—°ê²°ëœ ì»¨ë² ì´ì–´ë¡œ ìžì›ì„ 순간ì´ë™ 시킵니다. -block.sorter.description = ìžì›ì„ 정렬합니다. ìžì›ì´ ì„ íƒê³¼ ì¼ì¹˜í•˜ë©´ 앞방향으로 통과하며, 그렇지 ì•Šì„ ê²½ìš° 왼쪽과 오른쪽으로 출력ë©ë‹ˆë‹¤. +block.sorter.description = ìžì›ì„ 정렬합니다. ìžì›ì´ ì„ íƒê³¼ ì¼ì¹˜í•˜ë©´ 앞 방향으로 통과하며, 그렇지 않으면 왼쪽과 오른쪽으로 출력ë©ë‹ˆë‹¤. block.inverted-sorter.description = 표준 분류기와 ê°™ì€ ìžì›ì„ 처리하지만, 대신 ì„ íƒëœ ìžì›ì„ 측면으로 출력합니다. -block.router.description = ìžì›ì„ 받아서 최대 3ê°œì˜ ë‹¤ë¥¸ 방향으로 ë™ì¼í•˜ê²Œ 출력합니다. í•˜ë‚˜ì˜ ì†ŒìŠ¤ì—서 여러 대ìƒìœ¼ë¡œ 재료를 분할하는 ë° ìœ ìš©í•©ë‹ˆë‹¤.\n\n[scarlet]공장ì—서 ìƒì‚°ëœ 재료는 ì¶œë ¥ì— ì˜í•´ 막히게 ë˜ë¯€ë¡œ, 절대로 공장 옆ì—서 사용하지 마십시오. -block.distributor.description = 고급 분배기. ìžì›ì„ 최대 7ê°œì˜ ë‹¤ë¥¸ 방향으로 ë™ì¼í•˜ê²Œ 분할합니다. -block.overflow-gate.description = ì „ë©´ 경로가 차단 ëœ ê²½ìš°ì—ë§Œ 왼쪽과 오른쪽으로 출력ë©ë‹ˆë‹¤. +block.router.description = ìžì›ì„ 받아서 최대 3ê°œì˜ ë‹¤ë¥¸ 방향으로 ë™ì¼í•˜ê²Œ 출력합니다. í•˜ë‚˜ì˜ ì†ŒìŠ¤ì—서 여러 대ìƒìœ¼ë¡œ 재료를 분할하는 ë° ìœ ìš©í•©ë‹ˆë‹¤.\n\n[scarlet]공장ì—서 ìƒì‚°ëœ ìžì›ì€ 출력 ë•Œë¬¸ì— ë§‰ížˆê²Œ ë˜ë¯€ë¡œ, 절대로 공장 옆ì—서 사용하지 마십시오. +block.router.details = 필요악. 공장 ì˜†ì— ì„¤ì¹˜í•˜ëŠ” ê²ƒì€ ê·¸ ê³µìž¥ì˜ ì¶œë ¥ìœ¼ë¡œ ì¸í•´ ë§‰íž ìˆ˜ 있으므로 바람ì§í•˜ì§€ 못하다. +block.distributor.description = 고급 분배기. ìžì›ì„ 최대 7ê°œì˜ ë‹¤ë¥¸ 방향으로 ë™ì¼í•˜ê²Œ 분배합니다. +block.overflow-gate.description = ì „ë©´ 경로가 ì°¨ë‹¨ëœ ê²½ìš°ì—ë§Œ 왼쪽과 오른쪽으로 출력ë©ë‹ˆë‹¤. block.underflow-gate.description = 오버플로 게ì´íŠ¸ì˜ ë°˜ëŒ€. 왼쪽 ë° ì˜¤ë¥¸ìª½ 경로가 차단ë˜ë©´ 전면으로 출력ë©ë‹ˆë‹¤. block.mass-driver.description = ìµœê³ ì˜ ìžì› 운송 블ë¡. 여러 ìžì›ì„ 모아서 ìž¥ê±°ë¦¬ì— ê±¸ì³ ë‹¤ë¥¸ 매스 드ë¼ì´ë²„ì—게 발사합니다. ìž‘ë™í•˜ë ¤ë©´ ì „ì›ì´ 필요합니다. -block.mechanical-pump.description = ëŠë¦° ì†ë„로 액체를 í¼ì˜¬ë¦¬ì§€ë§Œ, 전력를 사용하지 않는 펌프입니다. -block.rotary-pump.description = 고급 펌프. ë” ë§Žì€ ì•¡ì²´ë¥¼ í¼ì˜¬ë¦¬ì§€ë§Œ, ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. +block.mechanical-pump.description = ëŠë¦° ì†ë„로 액체를 í¼ ì˜¬ë¦¬ì§€ë§Œ, ì „ë ¥ì„ ì‚¬ìš©í•˜ì§€ 않는 펌프입니다. +block.rotary-pump.description = 고급 펌프. ë” ë§Žì€ ì•¡ì²´ë¥¼ í¼ ì˜¬ë¦¬ì§€ë§Œ, ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. block.thermal-pump.description = 가장 강력한 펌프. -block.conduit.description = 기본 ì•¡ì²´ 운송 블ë¡. 액체를 앞으로 ì´ë™ì‹œí‚µë¯¸ë‹¤. 펌프 ë° ê¸°íƒ€ 파ì´í”„와 함께 사용ë©ë‹ˆë‹¤. +block.conduit.description = 기본 ì•¡ì²´ 운송 블ë¡. 액체를 앞으로 ì´ë™ì‹œí‚µë‹ˆë‹¤. 펌프 ë° ê¸°íƒ€ 파ì´í”„와 함께 사용ë©ë‹ˆë‹¤. block.pulse-conduit.description = 고급 ì•¡ì²´ 운송 블ë¡. 액체를 ë” ë¹ ë¥´ê²Œ 운반하고 표준 파ì´í”„보다 ë” ë§Žì´ ì €ìž¥í•©ë‹ˆë‹¤. -block.plated-conduit.description = 펄스 파ì´í”„와 ê°™ì€ ì†ë„로 ì´ë™í•˜ì§€ë§Œ ë” ë†’ì€ ë°©ì–´ë ¥ì„ ê°€ì§€ê³  있습니다. 파ì´í”„ ì´ì™¸ì˜ 물체로 ì¸¡ë©´ì˜ ì•¡ì²´ë¥¼ 받아들ì´ì§€ 않습니다.\nëˆ„ì„¤ì´ ì ìŠµë‹ˆë‹¤. -block.liquid-router.description = 한 ë°©í–¥ì—서 액체를 받아 최대 3ê°œì˜ ë‹¤ë¥¸ 방향으로 ë™ì¼í•˜ê²Œ 출력합니다. ì¼ì •ëŸ‰ì˜ ì•¡ì²´ë¥¼ 저장할 ìˆ˜ë„ ìžˆìœ¼ë©° 한 소스ì—서 여러 대ìƒìœ¼ë¡œ 액체를 분할하는 ë° ìœ ìš©í•©ë‹ˆë‹¤. +block.plated-conduit.description = 펄스 파ì´í”„와 ê°™ì€ ì†ë„로 ì´ë™í•˜ì§€ë§Œ ë” ë†’ì€ ë°©ì–´ë ¥ì„ ê°€ì§€ê³  있습니다. 측면ì—서 ì•¡ì²´ë“¤ì„ ë°›ì•„ë“¤ì´ì§€ 않습니다.\nì•¡ì²´ê°€ 누설하지 않습니다. +block.liquid-router.description = 한 ë°©í–¥ì—서 액체를 받아 최대 3ê°œì˜ ë‹¤ë¥¸ 방향으로 ê°™ì´ ì¶œë ¥í•©ë‹ˆë‹¤. ì¼ì •ëŸ‰ì˜ ì•¡ì²´ë¥¼ 저장할 ìˆ˜ë„ ìžˆìœ¼ë©° 한 소스ì—서 여러 대ìƒìœ¼ë¡œ 액체를 나누는 ë° ìœ ìš©í•©ë‹ˆë‹¤. block.liquid-tank.description = ëŒ€ëŸ‰ì˜ ì•¡ì²´ë¥¼ 저장합니다. 재료가 ì¼ì •하지 ì•Šì€ ìƒí™©ì—서 버í¼ë¥¼ ìƒì„±í•˜ê±°ë‚˜ 중요한 블ë¡ì„ 냉ê°í•˜ê¸° 위한 보호 장치로 사용하세요. block.liquid-junction.description = ë‘ ê°œì˜ êµì°¨ 파ì´í”„를 위한 다리 ì—­í• ì„ í•©ë‹ˆë‹¤. 다른 액체를 다른 위치로 운반하는 ë‘ ê°œì˜ ë‹¤ë¥¸ 파ì´í”„ê°€ 있는 ìƒí™©ì—서 유용합니다. block.bridge-conduit.description = 고급 ì•¡ì²´ 운송 블ë¡. 지형ì´ë‚˜ ê±´ë¬¼ì„ ë„˜ì–´ 최대 3ê°œ íƒ€ì¼ ìœ„ë¡œ 액체를 운반할 수 있습니다. -block.phase-conduit.description = 고급 ì•¡ì²´ 운송 블ë¡. ì „ë ¥ì„ ì‚¬ìš©í•˜ì—¬ 액체를 여러 타ì¼ì„ 건너뛰어 ì—°ê²°ëœ ë©”íƒ€ 파ì´í”„로 순간 ì´ë™ì‹œí‚µë‹ˆë‹¤. -block.power-node.description = ì—°ê²°ëœ ë…¸ë“œì— ì „ë ¥ì„ ì „ì†¡í•©ë‹ˆë‹¤. 노드는 ì¸ì ‘한 블ë¡ì—서 ì „ë ¥ì„ ê³µê¸‰ 받거나 ì „ë ¥ì„ ê³µê¸‰ 합니다. +block.phase-conduit.description = 고급 ì•¡ì²´ 운송 블ë¡. ì „ë ¥ì„ ì‚¬ìš©í•˜ì—¬ 액체를 여러 타ì¼ì„ 건너뛰어 ì—°ê²°ëœ ë©”íƒ€ 파ì´í”„로 순간 ì´ë™ì‹œí‚µë‹ˆë‹¤. +block.power-node.description = ì—°ê²°ëœ ë…¸ë“œì— ì „ë ¥ì„ ì „ì†¡í•©ë‹ˆë‹¤. 노드는 ì¸ì ‘한 블ë¡ì—서 ì „ë ¥ì„ ê³µê¸‰ë°›ê±°ë‚˜ ì „ë ¥ì„ ê³µê¸‰í•©ë‹ˆë‹¤. block.power-node-large.description = ë” ë„“ì€ ë²”ìœ„ì˜ ê³ ê¸‰ ì „ë ¥ 노드. block.surge-tower.description = 사용 가능한 ì—°ê²° 수가 ì ì€ 장거리 ì „ë ¥ 노드. block.diode.description = 배터리 ì „ë ¥ì€ ì´ ë¸”ë¡ì„ 통해 한 방향으로만 í를 수 있지만, 출력 ë°©í–¥ ë°°í„°ë¦¬ì˜ ì „ë ¥ì´ ë” ì ì€ 경우ì—ë§Œ 가능합니다. -block.battery.description = ì—너지가 넘ì³ë‚  때 완충재로 ì „ë ¥ì„ ì €ìž¥í•©ë‹ˆë‹¤. ì „ë ¥ì— ì ìžê°€ ë°œìƒí•  때 ì „ë ¥ì„ ì¶œë ¥í•©ë‹ˆë‹¤. +block.battery.description = ì „ë ¥ì´ ë„˜ì³ë‚  때 저장할 수 있습니다. ì „ë ¥ì— ì ìžê°€ ë°œìƒí•  때 ì „ë ¥ì„ ì¶œë ¥í•©ë‹ˆë‹¤. block.battery-large.description = ì¼ë°˜ 배터리보다 훨씬 ë” ë§Žì€ ì „ë ¥ì„ ì €ìž¥í•©ë‹ˆë‹¤. -block.combustion-generator.description = ì„탄과 ê°™ì€ ê°€ì—°ì„± ë¬¼ì§ˆì„ ì—°ì†Œì‹œì¼œ ì „ë ¥ì„ ìƒì‚°í•©ë‹ˆë‹¤. +block.combustion-generator.description = ì„탄과 ê°™ì€ ê°€ì—°ì„± ë¬¼ì§ˆì„ ì—°ì†Œ 시켜 ì „ë ¥ì„ ìƒì‚°í•©ë‹ˆë‹¤. block.thermal-generator.description = ì—´ì´ ìžˆëŠ” ê³³ì— ì„¤ì¹˜í•˜ë©´ ì „ë ¥ì´ ìƒì„±ë©ë‹ˆë‹¤. block.steam-generator.description = 고급 연소 발전기. ë” íš¨ìœ¨ì ì´ì§€ë§Œ ì¦ê¸°ë¥¼ ìƒì„±í•˜ê¸° 위해 ë¬¼ì´ í•„ìš”í•©ë‹ˆë‹¤. block.differential-generator.description = ë§Žì€ ì–‘ì˜ ì „ë ¥ì„ ìƒì„±í•©ë‹ˆë‹¤. 냉ê°ìˆ˜ì™€ 불타는 파ì´ë¼íƒ€ì´íŠ¸ì˜ ì˜¨ë„ ì°¨ì´ë¥¼ ì´ìš©í•©ë‹ˆë‹¤. @@ -1271,35 +1446,442 @@ block.rtg-generator.description = 간단하고 안정ì ì¸ 발전기. 붕괴하 block.solar-panel.description = 태양으로부터 ì†ŒëŸ‰ì˜ ì „ë ¥ì„ ìƒì„±í•©ë‹ˆë‹¤. block.solar-panel-large.description = 표준 태양 ì „ì§€íŒë³´ë‹¤ 훨씬 ë” íš¨ìœ¨ì ì¸ 버전. block.thorium-reactor.description = 토륨으로부터 ìƒë‹¹í•œ ì–‘ì˜ ì „ë ¥ì„ ìƒì‚°í•©ë‹ˆë‹¤. ì§€ì†ì ì¸ 냉ê°ì´ 필요하며, 충분한 ì–‘ì˜ ëƒ‰ê°ìˆ˜ê°€ 공급ë˜ì§€ 않으면 í¬ê²Œ í­ë°œí•©ë‹ˆë‹¤. ì „ë ¥ ì¶œë ¥ì€ í† ë¥¨ì˜ ì–‘ì— ë”°ë¼ ë‹¬ë¼ì§‘니다. -block.impact-reactor.description = 최고 효율로 ëŒ€ëŸ‰ì˜ ì „ë ¥ì„ ìƒì‚°í•  수 있는 고급 발전기. 프로세스를 시작하려면 ìƒë‹¹í•œ ì „ë ¥ ê³µê¸‰ì´ í•„ìš”í•©ë‹ˆë‹¤. +block.impact-reactor.description = 최고 효율로 ëŒ€ëŸ‰ì˜ ì „ë ¥ì„ ìƒì‚°í•  수 있는 고급 발전기. ê°€ë™ì„ 시작하려면 ìƒë‹¹í•œ ì „ë ¥ ê³µê¸‰ì´ í•„ìš”í•©ë‹ˆë‹¤. block.mechanical-drill.description = ê°€ê²©ì´ ì‹¼ 드릴. ì ì ˆí•œ 타ì¼ì— 설치하면 ìžì›ì„ 천천히 ëŠë¦° ì†ë„로 출력합니다. 기본 ìžì›ë§Œ 채굴할 수 있습니다. -block.pneumatic-drill.description = í‹°íƒ€ëŠ„ì„ ì±„ê´‘í•  수 있는 í–¥ìƒëœ 드릴. ê¸°ê³„ì‹ ë“œë¦´ë³´ë‹¤ ë” ë¹ ë¥¸ ì†ë„로 채굴합니다. -block.laser-drill.description = ë ˆì´ì € ê¸°ìˆ ì„ í†µí•´ ë”ìš± 빠르게 ë“œë¦´ë§ í•  수 있지만 ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. 토륨 채굴 가능. +block.pneumatic-drill.description = í‹°íƒ€ëŠ„ì„ ìº˜ 수 있는 í–¥ìƒëœ 드릴. ê¸°ê³„ì‹ ë“œë¦´ë³´ë‹¤ ë” ë¹ ë¥¸ ì†ë„로 채굴합니다. +block.laser-drill.description = ë ˆì´ì € ê¸°ìˆ ì„ í†µí•´ ë”ìš±ë” ë¹ ë¥´ê²Œ 채광할 수 있지만, ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. 토륨 채굴 가능. block.blast-drill.description = 최ìƒìœ„ 드릴. ë§Žì€ ì–‘ì˜ ì „ë ¥ì´ í•„ìš”í•©ë‹ˆë‹¤. -block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 ê³³ì—서 사용합니다. -block.cultivator.description = 대기 ì¤‘ì˜ ìž‘ì€ ë†ë„ì˜ í¬ìžë¥¼ ì‚°ì—…ìš© 버섯으로 배양합니다. +block.water-extractor.description = 지하수를 추출합니다. ë¬¼ì„ êµ¬í•˜ê¸° 어려운 ê³³ì—서 사용합니다. +block.cultivator.description = 대기 ì¤‘ì˜ ìž‘ì€ ë†ë„ì˜ í¬ìžë¥¼ ì‚°ì—…ìš© í¬ìžë¡œ 배양합니다. +block.cultivator.details = ìž¬ë°œê²¬ëœ ê¸°ìˆ . 가장 효율ì ìœ¼ë¡œ ëŒ€ëŸ‰ì˜ ìœ ê¸°ì²´ë¥¼ ìƒì‚°í•  때 사용ëœë‹¤. 과거, ì„¸ë¥´í”Œë¡œì„ ë’¤ë®ì€ í¬ìžì˜ 최초 배양지로 íŒë‹¨ëœë‹¤. block.oil-extractor.description = ì„유를 추출하기 위해 ë§Žì€ ì–‘ì˜ ì „ë ¥ê³¼ 모래 ë° ë¬¼ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. -block.core-shard.description = 코어 캡ìŠì˜ 첫 번째 형태. 파괴ë˜ë©´ 해당 ì§€ì—­ê³¼ì˜ ëª¨ë“  ì—°ê²°ì´ ëŠì–´ì§‘니다. ì´ëŸ° ì¼ì´ ì¼ì–´ë‚˜ì§€ 않ë„ë¡ í•˜ì‹­ì‹œì˜¤. -block.core-foundation.description = ì½”ì–´ì˜ ë‘ ë²ˆì§¸ 버전. ë” ë‚˜ì€ ë°©ì–´ë ¥ê³¼ ìžì›ì„ 저장합니다. -block.core-nucleus.description = 코어 캡ìŠì˜ 세 번째ì´ìž 마지막 형태입니다. ë°©ì–´ë ¥ì´ ë§¤ìš° 높고 ëŒ€ëŸ‰ì˜ ìžì›ì„ 저장할 수 있습니다. +block.core-shard.description = ê¸°ì§€ì˜ í•µì‹¬ìž…ë‹ˆë‹¤. 파괴ë˜ë©´ 해당 ì§€ì—­ê³¼ì˜ ëª¨ë“  ì—°ê²°ì´ ëŠì–´ì§‘니다. ì´ëŸ° ì¼ì´ ì¼ì–´ë‚˜ì§€ 않ë„ë¡ í•˜ì‹­ì‹œì˜¤. +block.core-shard.details = 첫 번째 버전. 휴대용. ìžê°€ë³µì œ 가능. ì¼íšŒìš© 출격 추진기를 가졌으며, 행성간 ì´ë™ì—는 ë¶€ì í•©í•¨. +block.core-foundation.description = ê¸°ì§€ì˜ í•µì‹¬ìž…ë‹ˆë‹¤. ë” ë‚˜ì€ ë°©ì–´ë ¥ê³¼ ìžì›ì„ 저장합니다. +block.core-foundation.details = ë‘ ë²ˆì§¸ 버전. +block.core-nucleus.description = ê¸°ì§€ì˜ í•µì‹¬ìž…ë‹ˆë‹¤. ë°©ì–´ë ¥ì´ ë§¤ìš° 높고 ëŒ€ëŸ‰ì˜ ìžì›ì„ 저장할 수 있습니다. +block.core-nucleus.details = 세 번째, ê¶ê·¹ì˜ 버전. block.vault.description = ê° ìœ í˜•ì˜ ë§Žì€ ì–‘ì˜ ìžì›ì„ 저장합니다. ì–¸ë¡œë” ë¸”ë¡ì„ 사용하여 창고ì—서 ìžì›ì„ 빼낼 수 있습니다. -block.container.description = ê° ìœ í˜•ì˜ ì†ŒëŸ‰ì˜ ìžì›ì„ 저장합니다. ì–¸ë¡œë” ë¸”ë¡ì„ 사용하여 컨테ì´ë„ˆì—서 ìžì›ì„ 빼낼 수 있습니다. -block.unloader.description = ê·¼ì²˜ì˜ ë¹„ 수송 블ë¡ì—서 ìžì›ì„ 빼냅니다. 눌러서 빼낼 ìžì›ì„ 변경할 수 있십니다. +block.container.description = ê° ìœ í˜•ì˜ ìžì›ì„ 소량 저장합니다. ì–¸ë¡œë” ë¸”ë¡ì„ 사용하여 컨테ì´ë„ˆì—서 ìžì›ì„ 빼낼 수 있습니다. +block.unloader.description = ê·¼ì²˜ì˜ ë¹„ 수송 블ë¡ì—서 ìžì›ì„ 빼냅니다. 눌러서 빼낼 ìžì›ì„ 변경할 수 있습니다. block.launch-pad.description = 코어 출격 ì—†ì´ë„ ìžì›ì„ 묶어 출격시킬 수 있습니다. -block.launch-pad-large.description = 출격 íŒ¨ë“œì˜ ê°œì„ ëœ ë²„ì „. ë” ë§Žì€ ìžì›ì„ 저장하며 ë” ìžì£¼ 출격합니다. -block.duo.description = 작고 저렴한 í¬íƒ‘. ì§€ìƒ ìœ ë‹›ì— ìœ ìš©í•©ë‹ˆë‹¤. -block.scatter.description = 필수 대공 í¬íƒ‘. ì êµ°ì—게 ë‚© ë©ì–´ë¦¬, ê³ ì² , ë˜ëŠ” ê°•í™” 유리 ì¡°ê° ë©ì–´ë¦¬ë¥¼ 뿌립니다. -block.scorch.description = ì£¼ë³€ì˜ ëª¨ë“  ì ì„ 불태ì›ë‹ˆë‹¤. 근거리ì—서 매우 효과ì ìž…니다. -block.hail.description = ìž‘ì€ ìž¥ê±°ë¦¬ í¬ë³‘ í¬íƒ‘입니다. -block.wave.description = 중형 í¬íƒ‘. ì ì—게 액체를 발사합니다. ë¬¼ì´ ê³µê¸‰ë˜ë©´ ìžë™ìœ¼ë¡œ 화재를 진압합니다. -block.lancer.description = 중형 대지 ë ˆì´ì € í¬íƒ‘. 강력한 ì—너지 ë¹”ì„ ì¶©ì „í•˜ì—¬ 발사합니다. -block.arc.description = ìž‘ì€ ê·¼ê±°ë¦¬ 전격 í¬íƒ‘. ì ì—게 전격 ì•„í¬ë¥¼ 발사합니다. -block.swarmer.description = 중형 ë¯¸ì‚¬ì¼ í¬íƒ‘. 공중과 ì§€ìƒì˜ ì ì„ ëª¨ë‘ ê³µê²©í•˜ë©°, 유ë„íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. -block.salvo.description = ë” í° ê³ ê¸‰ 듀오 í¬íƒ‘입니다. ì ì—게 ì´ì•Œì„ 빠르게 발사합니다. -block.fuse.description = ë„“ì€ ê·¼ê±°ë¦¬ 파편 í¬íƒ‘. ê·¼ì²˜ì˜ ì ì—게 3ê°œì˜ ê´€í†µ ì´ì•Œì„ 발사합니다. -block.ripple.description = 매우 강력한 í¬ë³‘ í¬íƒ‘. ì›ê±°ë¦¬ì— 있는 ì ì—게 í¬íƒ„ 무리를 ì˜ì„¸ìš”. -block.cyclone.description = 대공 ë° ëŒ€ì§€ í¬íƒ‘. 근처 유닛ì—게 í­ë°œì„± ë©ì–´ë¦¬ë¥¼ 발사합니다. -block.spectre.description = 거대한 ì´ì¤‘ 배럴 대í¬. 공중 ë° ì§€ìƒ ëª©í‘œë¬¼ì— í° ê´€í†µ ì² ê°‘íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. -block.meltdown.description = 거대한 ë ˆì´ì € 대í¬. ê·¼ì²˜ì˜ ì ì—게 ì§€ì†ì ì¸ ë ˆì´ë²„ ë¹”ì„ ì¶©ì „í•˜ì—¬ 발사합니다. 냉ê°ìˆ˜ê°€ 있어야 ìž‘ë™í•©ë‹ˆë‹¤. -block.repair-point.description = 주변ì—서 가장 가까운 ìœ ë‹›ì„ ì§€ì†ì ìœ¼ë¡œ 치료합니다. -block.segment.description = 날아오는 발사체를 요격합니다. ë ˆì´ì €ëŠ” 목표 대ìƒì´ 아닙니다. +block.duo.description = ì ì—게 íƒ„í™˜ì„ êµëŒ€í•˜ë©° 발사합니다. +block.scatter.description = ì êµ°ì—게 ë‚©, ê³ ì² , ë˜ëŠ” ê°•í™” 유리 ì¡°ê° ë©ì–´ë¦¬ë¥¼ 발사합니다. +block.scorch.description = ì£¼ë³€ì˜ ëª¨ë“  ì§€ìƒ ì ì„ 불태ì›ë‹ˆë‹¤. 근거리ì—서 매우 효과ì ìž…니다. +block.hail.description = ìž¥ê±°ë¦¬ì— ê±¸ì³ ì§€ìƒ ì ì—게 ìž‘ì€ í¬íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +block.wave.description = ì ì—게 ì•¡ì²´ 줄기를 발사합니다. ë¬¼ì´ ê³µê¸‰ë˜ë©´ ìžë™ìœ¼ë¡œ 화재를 진압합니다. +block.lancer.description = ì§€ìƒ ëª©í‘œë¬¼ì— ê°•ë ¥í•œ ì—너지 ë¹”ì„ ì¶©ì „í•˜ì—¬ 발사합니다. +block.arc.description = ì§€ìƒ ëª©í‘œë¬¼ì— ì „ê²© ì•„í¬ë¥¼ 발사합니다. +block.swarmer.description = ì ì—게 유ë„íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +block.salvo.description = ì ì—게 ì´ì•Œì„ 빠르게 ì¼ì œížˆ 발사합니다. +block.fuse.description = 주변 ì ì—게 3ê°œì˜ ë‹¨ê±°ë¦¬ 관통 ë ˆì´ì €ë¥¼ 발사합니다. +block.ripple.description = ìž¥ê±°ë¦¬ì— ê±¸ì³ ì§€ìƒ ì ì—게 í¬íƒ„ 무리를 발사합니다. +block.cyclone.description = 근처 ì ì—게 í­ë°œ 파편 ë©ì–´ë¦¬ë¥¼ 발사합니다. +block.spectre.description = 공중 ë° ì§€ìƒ ëª©í‘œë¬¼ì— í° ê´€í†µ ì² ê°‘íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +block.meltdown.description = 주변 ì ì—게 ì§€ì†ì ì¸ ë ˆì´ì € ë¹”ì„ ì¶©ì „í•˜ì—¬ 발사합니다. ëƒ‰ê° ì•¡ì²´ê°€ 있어야 ìž‘ë™í•©ë‹ˆë‹¤. +block.foreshadow.description = ìž¥ê±°ë¦¬ì— ê±¸ì¹œ 거대한 ë‹¨ì¼ ëª©í‘œ ì €ê²©íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. 최대 ì²´ë ¥ì´ ë†’ì€ ì ì„ 먼저 조준합니다. +block.repair-point.description = ì¸ê·¼ì— 가장 가까운 ìœ ë‹›ì„ ì§€ì†í•´ì„œ 치료합니다. +block.segment.description = 날아오는 발사체를 요격합니다. í° ë°œì‚¬ì²´ì—” 조준하지 않습니다. +block.parallax.description = 공중 ëª©í‘œë¬¼ì„ ëŒì–´ì˜¤ëŠ” ê²¬ì¸ ê´‘ì„ ì„ ë°œì‚¬í•˜ë©°, ê²¬ì¸ ê³¼ì •ì—서 ë°ë¯¸ì§€ë¥¼ ì¤ë‹ˆë‹¤. +block.tsunami.description = ì ì—게 강력한 ì•¡ì²´ 줄기를 발사합니다. ë¬¼ì´ ê³µê¸‰ë˜ë©´ ìžë™ìœ¼ë¡œ ì£¼ë³€ì˜ í™”ìž¬ë¥¼ 진압합니다. +block.silicon-crucible.description = 추가로 파ì´ë¼íƒ€ì´íŠ¸ë¥¼ 사용하여 ë” ë†’ì€ ì˜¨ë„ì—서 ì„탄과 모래를 제련합니다. 뜨거운 ê³³ì—서 ë” íš¨ìœ¨ì ìž…니다. +block.disassembler.description = 광재를 ë‚®ì€ í™•ë¥ ë¡œ ë¯¸ëŸ‰ì˜ í¬ê·€í•œ 광물들로 분리합니다. í† ë¥¨ì„ ìƒì‚°í•  수 있습니다. +block.overdrive-dome.description = ì¸ê·¼ 블ë¡ë“¤ì„ 과부하시킵니다. ìž‘ë™í•˜ê¸° 위해 실리콘과 메타가 필요합니다. +block.payload-conveyor.description = 유닛ì´ë‚˜ ê³µìž¥ê°™ì´ í° í™”ë¬¼ë“¤ì„ ìš´ë°˜í•©ë‹ˆë‹¤. +block.payload-router.description = 3가지 방향으로 번갈아서 í™”ë¬¼ë“¤ì„ ìš´ë°˜í•©ë‹ˆë‹¤. +block.command-center.description = 4ê°œì˜ ëª…ë ¹ì–´ë¡œ 유닛 í–‰ë™ì„ 제어합니다. +block.ground-factory.description = ì§€ìƒ ìœ ë‹›ë“¤ì„ ìƒì‚°í•©ë‹ˆë‹¤. ìƒì‚°ëœ ìœ ë‹›ë“¤ì€ ë°”ë¡œ ì‚¬ìš©ë  ìˆ˜ 있고, ë˜ëŠ” 강화를 위해 ìž¬êµ¬ì„±ê¸°ì— ë“¤ì–´ê°€ì§ˆ 수 있습니다. +block.air-factory.description = 공중 ìœ ë‹›ë“¤ì„ ìƒì‚°í•©ë‹ˆë‹¤. ìƒì‚°ëœ ìœ ë‹›ë“¤ì€ ë°”ë¡œ ì‚¬ìš©ë  ìˆ˜ 있고, ë˜ëŠ” 강화를 위해 ìž¬êµ¬ì„±ê¸°ì— ë“¤ì–´ê°€ì§ˆ 수 있습니다. +block.naval-factory.description = í•´ìƒ ìœ ë‹›ë“¤ì„ ìƒì‚°í•©ë‹ˆë‹¤. ìƒì‚°ëœ ìœ ë‹›ë“¤ì€ ë°”ë¡œ ì‚¬ìš©ë  ìˆ˜ 있고, ë˜ëŠ” 강화를 위해 ìž¬êµ¬ì„±ê¸°ì— ë“¤ì–´ê°€ì§ˆ 수 있습니다. +block.additive-reconstructor.description = 들어온 ìœ ë‹›ë“¤ì„ ë‘ ë²ˆì§¸ 티어로 강화합니다. +block.multiplicative-reconstructor.description = 들어온 ìœ ë‹›ë“¤ì„ ì„¸ 번째 티어로 강화합니다. +block.exponential-reconstructor.description = 들어온 ìœ ë‹›ë“¤ì„ ë„¤ 번째 티어로 강화합니다. +block.tetrative-reconstructor.description = 들어온 ìœ ë‹›ë“¤ì„ ë‹¤ì„¯ 번째, ê¶ê·¹ì˜ 티어로 강화합니다. +block.switch.description = on/off 가능한 스위치입니다. 스위치 ìƒíƒœëŠ” í”„ë¡œì„¸ì„œì— ì˜í•´ ì½ížˆê±°ë‚˜ ì œì–´ë  ìˆ˜ 있습니다. +block.micro-processor.description = ë¡œì§ ì‹¤í–‰ë¬¸ì„ ìˆœì„œëŒ€ë¡œ 무한히 실행합니다. 유닛 ë˜ëŠ” ê±´ë¬¼ì„ ì œì–´í•˜ëŠ” ë° ì“°ì¼ ìˆ˜ 있습니다. +block.logic-processor.description = ë¡œì§ ì‹¤í–‰ë¬¸ì„ ìˆœì„œëŒ€ë¡œ 무한히 실행합니다. 유닛 ë˜ëŠ” ê±´ë¬¼ì„ ì œì–´í•˜ëŠ” ë° ì“°ì¼ ìˆ˜ 있습니다. 마ì´í¬ë¡œ 프로세서보다 실행 ì†ë„ê°€ ë” ë¹ ë¦…ë‹ˆë‹¤. +block.hyper-processor.description = ë¡œì§ ì‹¤í–‰ë¬¸ì„ ìˆœì„œëŒ€ë¡œ 무한히 실행합니다. 유닛 ë˜ëŠ” ê±´ë¬¼ì„ ì œì–´í•˜ëŠ” ë° ì“°ì¼ ìˆ˜ 있습니다. ë¡œì§ í”„ë¡œì„¸ì„œë³´ë‹¤ 실행 ì†ë„ê°€ ë” ë¹ ë¦…ë‹ˆë‹¤. +block.memory-cell.description = 프로세서를 위한 ë°ì´í„°ë¥¼ 저장합니다. +block.memory-bank.description = 프로세서를 위한 ë°ì´í„°ë¥¼ 저장합니다. 저장 ê³µê°„ì´ ì…€ë³´ë‹¤ í½ë‹ˆë‹¤. +block.logic-display.description = 프로세서를 ì´ìš©í•´ ê·¸ëž˜í”½ì„ ì¶œë ¥í•  수 있습니다. +block.large-logic-display.description = 프로세서를 ì´ìš©í•´ ê·¸ëž˜í”½ì„ ì¶œë ¥í•  수 있습니다. +block.interplanetary-accelerator.description = 거대한 ì „ìžê¸° ë ˆì¼ê±´ 타워. 코어를 행성 ê°„ ì´ë™ì„ 위한 탈출 ì†ë„까지 ê°€ì†í•©ë‹ˆë‹¤. + +unit.dagger.description = 주변 모든 ì ì—게 ì¼ë°˜ì ì¸ íƒ„í™˜ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +unit.mace.description = 주변 모든 ì ì—게 화염 줄기를 발사합니다. +unit.fortress.description = ì§€ìƒ ëª©í‘œë¬¼ì— ìž¥ê±°ë¦¬ í¬íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +unit.scepter.description = 주변 모든 ì ì—게 ìž¥ì „ëœ íƒ„í™˜ì„ ì¼ì œížˆ 발사합니다. +unit.reign.description = 주변 모든 ì ì—게 거대한 관통 íƒ„í™˜ì„ ì¼ì œížˆ 발사합니다. +unit.nova.description = ì ì—게 피해를 주고, ì•„êµ° êµ¬ì¡°ë¬¼ì„ ìˆ˜ë¦¬í•˜ëŠ” ë ˆì´ì € 볼트를 발사합니다. 비행할 수 있습니다. +unit.pulsar.description = ì ì—게 피해를 주고, ì•„êµ° êµ¬ì¡°ë¬¼ì„ ìˆ˜ë¦¬í•˜ëŠ” ì „ê²©ì„ ë°œì‚¬í•©ë‹ˆë‹¤. 비행할 수 있습니다. +unit.quasar.description = ì ì—게 피해를 주고, ì•„êµ° êµ¬ì¡°ë¬¼ì„ ìˆ˜ë¦¬í•˜ëŠ” 관통 ë ˆì´ì € ë¹”ì„ ë°œì‚¬í•©ë‹ˆë‹¤. 비행할 수 있습니다. ì—­ìž¥ì„ ê°€ì§€ê³  있습니다. +unit.vela.description = ì ì—게 피해를 주고, ì•„êµ° êµ¬ì¡°ë¬¼ë“¤ì„ ìˆ˜ë¦¬í•˜ëŠ” 거대한 ì§€ì†ì ì¸ ë ˆì´ì € ë¹”ì„ ë°œì‚¬í•©ë‹ˆë‹¤. 비행할 수 있습니다. +unit.corvus.description = ì ì—게 피해를 주고, ì•„êµ° êµ¬ì¡°ë¬¼ì„ ìˆ˜ë¦¬í•˜ëŠ” 거대한 ë ˆì´ì € 블레스트를 발사합니다. ëŒ€ë¶€ë¶„ì˜ ì§€í˜• 위를 ë°Ÿì„ ìˆ˜ 있습니다. +unit.crawler.description = ì ì—게 달려들어서 거대한 í­ë°œì„ ì¼ìœ¼í‚¤ëŠ” ìží­ì„ 합니다. +unit.atrax.description = ì§€ìƒ ëª©í‘œë¬¼ì„ ì•½í™”í•˜ëŠ” 광재 구체를 발사합니다. ëŒ€ë¶€ë¶„ì˜ ì§€í˜• 위를 ë°Ÿì„ ìˆ˜ 있습니다. +unit.spiroct.description = ì ì—게 í¡í˜ˆ ë ˆì´ì € ë¹”ì„ ë°œì‚¬í•˜ë©°, í¡í˜ˆì„ 통해 ì²´ë ¥ì„ íšŒë³µí•©ë‹ˆë‹¤. ëŒ€ë¶€ë¶„ì˜ ì§€í˜• 위를 ë°Ÿì„ ìˆ˜ 있습니다. +unit.arkyid.description = ì ì—게 í° í¡í˜ˆ ë ˆì´ì € ë¹”ì„ ë°œì‚¬í•˜ë©°, í¡í˜ˆì„ 통해 ì²´ë ¥ì„ íšŒë³µí•©ë‹ˆë‹¤. ëŒ€ë¶€ë¶„ì˜ ì§€í˜• 위를 ë°Ÿì„ ìˆ˜ 있습니다. +unit.toxopid.description = ì ì—게 í° ì „ê²© í¬íƒ„ 무리와 관통 ë ˆì´ì €ë¥¼ 발사합니다. ëŒ€ë¶€ë¶„ì˜ ì§€í˜• 위를 ë°Ÿì„ ìˆ˜ 있습니다. +unit.flare.description = ì§€ìƒ ëª©í‘œë¬¼ì— ì¼ë°˜ì ì¸ íƒ„í™˜ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +unit.horizon.description = ì§€ìƒ ëª©í‘œë¬¼ì— í­íƒ„ì„ íˆ¬í•˜í•©ë‹ˆë‹¤. +unit.zenith.description = 주변 모든 ì ì—게 미사ì¼ì„ ì‚´í¬í•©ë‹ˆë‹¤. +unit.antumbra.description = 주변 모든 ì ì—게 íƒ„í™˜ë“¤ì„ ì¼ì œížˆ 발사합니다. +unit.eclipse.description = 주변 모든 ì ì—게 ë‘ ê°œì˜ ê´€í†µ ë ˆì´ì €ì™€ 대공 íƒ„ì„ ì¼ì œížˆ 발사합니다. +unit.mono.description = ìžë™ìœ¼ë¡œ 구리와 ë‚©ì„ ìºì„œ 코어로 넣습니다. +unit.poly.description = ìžë™ìœ¼ë¡œ 부서진 êµ¬ì¡°ë¬¼ì„ ìž¬ê±´ì„¤í•˜ê±°ë‚˜ 다른 ìœ ë‹›ë“¤ì˜ ê±´ì„¤ì„ ë³´ì¡°í•©ë‹ˆë‹¤. +unit.mega.description = ìžë™ìœ¼ë¡œ ì†ìƒëœ êµ¬ì¡°ë¬¼ì„ ìˆ˜ë¦¬í•©ë‹ˆë‹¤. 블ë¡ì´ë‚˜ ìž‘ì€ ì§€ìƒ ìœ ë‹›ë“¤ì„ ìˆ˜ì†¡í•  수 있습니다. +unit.quad.description = ì§€ìƒ ëª©í‘œë¬¼ì— ì ì—게 피해를 주고, ì•„êµ° êµ¬ì¡°ë¬¼ì„ ìˆ˜ë¦¬í•˜ëŠ” í° í­íƒ„ì„ íˆ¬í•˜í•©ë‹ˆë‹¤. 중간 í¬ê¸°ì˜ ì§€ìƒ ìœ ë‹›ë“¤ì„ ìˆ˜ì†¡í•  수 있습니다. +unit.oct.description = 주변 ì•„êµ°ë“¤ì„ ìž¬ìƒ ì—­ìž¥ìœ¼ë¡œ 보호합니다. ëŒ€ë¶€ë¶„ì˜ ì§€ìƒ ìœ ë‹›ë“¤ì„ ìˆ˜ì†¡í•  수 있습니다. +unit.risso.description = 주변 모든 ì ì—게 탄환과 미사ì¼ì„ ì¼ì œížˆ 발사합니다. +unit.minke.description = 주변 ì§€ìƒ ì ì—게 ì¼ë°˜ì ì¸ 탄환과 í¬íƒ„ì„ ë°œì‚¬í•©ë‹ˆë‹¤. +unit.bryde.description = ì ì—게 장거리 í¬íƒ„ê³¼ 미사ì¼ì„ 발사합니다. +unit.sei.description = ì ì—게 ë°©ì–´ë ¥ 관통 탄환과 미사ì¼ì„ ì¼ì œížˆ 발사합니다. +unit.omura.description = ì ì—게 장거리 관통 ë ˆì¼ê±´ì„ 발사합니다. 플레어를 ìƒì‚°í•©ë‹ˆë‹¤. +unit.alpha.description = ì ìœ¼ë¡œë¶€í„° 코어: ì¡°ê°ì„ 방어합니다. êµ¬ì¡°ë¬¼ì„ ì§“ìŠµë‹ˆë‹¤. +unit.beta.description = ì ìœ¼ë¡œë¶€í„° 코어: ê¸°ë°˜ì„ ë°©ì–´í•©ë‹ˆë‹¤. êµ¬ì¡°ë¬¼ì„ ì§“ìŠµë‹ˆë‹¤. +unit.gamma.description = ì ìœ¼ë¡œë¶€í„° 코어: í•µì‹¬ì„ ë°©ì–´í•©ë‹ˆë‹¤. êµ¬ì¡°ë¬¼ì„ ì§“ìŠµë‹ˆë‹¤. + +lst.read = ì—°ê²°ëœ ë©”ëª¨ë¦¬ ì…€ì—서 ìˆ«ìž ì½ê¸° +lst.write = ì—°ê²°ëœ ë©”ëª¨ë¦¬ ì…€ì— ìˆ«ìž ì“°ê¸° +lst.print = 프린트 버í¼ì— í…스트 추가하기\n[accent]Print Flush[]ê°€ 사용ë˜ê¸° 전까진 ì•„ë¬´ê²ƒë„ ë³´ì—¬ì£¼ì§€ 않습니다. +lst.draw = 드로잉 버í¼ì— 실행문 추가하기\n[accent]Draw Flush[]ê°€ 사용ë˜ê¸° 전까진 ì•„ë¬´ê²ƒë„ ë³´ì—¬ì£¼ì§€ 않습니다. +lst.drawflush = ëŒ€ê¸°ì¤‘ì¸ [accent]Draw[]ì‹¤í–‰ë¬¸ì„ ë””ìŠ¤í”Œë ˆì´ì— 출력하기 +lst.printflush = ëŒ€ê¸°ì¤‘ì¸ [accent]Print[]ì‹¤í–‰ë¬¸ì„ ë©”ì‹œì§€ 블ë¡ì— 출력하기 +lst.getlink = 순서별로 프로세서 ì—°ê²° 가져오기. 0부터 시작 +lst.control = 건물 조종하기 +lst.radar = 건물 ì£¼ë³€ì˜ ìœ ë‹› 검색하기 +lst.sensor = 건물 ë˜ëŠ” ìœ ë‹›ì˜ ì •ë³´ 얻기 +lst.set = 변수 ì„ ì–¸/할당하기 +lst.operation = 1~2ê°œì˜ ë³€ìˆ˜ë¡œ 연산하기 +lst.end = ì‹¤í–‰ì¤„ì˜ ê°€ìž¥ 위로 ì í”„하기 +lst.jump = 조건부로 다른 실행문으로 ì í”„하기 +lst.unitbind = type ì˜†ì— ìžˆëŠ” ìœ ë‹›ì„ ì§€ì •í•˜ê³ , [accent]@unit[]ì— ì €ìž¥í•˜ê¸° +lst.unitcontrol = 현재 ì§€ì •ëœ ìœ ë‹›ì„ ì¡°ì¢…í•˜ê¸° +lst.unitradar = 현재 ì§€ì •ëœ ìœ ë‹› ì£¼ë³€ì˜ ìœ ë‹› 검색하기 +lst.unitlocate = 특정 ìœ í˜•ì˜ ìœ„ì¹˜/ê±´ë¬¼ì„ ì§€ë„ìƒì—서 찾기\nì§€ì •ëœ ìœ ë‹›ì´ í•„ìš”í•©ë‹ˆë‹¤. + +logic.nounitbuild = [red]ìœ ë‹›ì˜ ê±´ë¬¼ 로ì§ì€ 여기서 허용ë˜ì§€ 않습니다. + +lenum.type = 건물/ìœ ë‹›ì˜ íƒ€ìž…\n예로 분배기는 문ìžì—´ì´ ì•„ë‹ˆë¼ [accent]@router[]를 반환합니다. +lenum.shoot = 특정 ìœ„ì¹˜ì— ë°œì‚¬ +lenum.shootp = 목표물 ì†ë„를 예측하여 발사 +lenum.configure = í•„í„°ì˜ ì•„ì´í…œê°™ì€ ê±´ë¬¼ì˜ ì„¤ì • +lenum.enabled = 블ë¡ì˜ 활성 여부 + +lenum.color = 조명 색 설정 +laccess.controller = 유닛 제어ìž. 프로세서가 제어하면, 프로세서를 반환합니다.\n다른 ìœ ë‹›ì— ì˜í•´ 지휘ë˜ë©´(G키), 지휘하는 ìœ ë‹›ì„ ë°˜í™˜í•©ë‹ˆë‹¤.\nê·¸ 외ì—는 ìžì‹ ì„ 반환합니다. +laccess.dead = 유닛 ë˜ëŠ” 건물 사ë§/무효 여부 +laccess.controlled = 만약 유닛 제어ìžê°€ 프로세서ë¼ë©´ [accent]@ctrlProcessor[]를 반환합니다.\n만약 유닛/건물 제어ìžê°€ 플레ì´ì–´ë¼ë©´ [accent]@ctrlPlayer[]를 반환합니다.\n만약 ìœ ë‹›ì´ ë‹¤ë¥¸ ìœ ë‹›ì— ì˜í•´ 지휘ë˜ë©´(G키)[accent]@ctrlFormation[]를 반환합니다.\nê·¸ 외ì—는 0ì„ ë°˜í™˜í•©ë‹ˆë‹¤. +laccess.commanded = [red]ì´ì œ 사용ë˜ì§€ 않으며, ê³§ ì œê±°ë  ì˜ˆì •ìž…ë‹ˆë‹¤![]\n대신 [accent]controlled[]를 사용하세요. + +graphicstype.clear = ì´ ìƒ‰ìœ¼ë¡œ í™”ë©´ì„ ì±„ìš°ê¸° +graphicstype.color = 아래 그래픽 ì‹¤í–‰ë¬¸ë“¤ì˜ ìƒ‰ 설정하기 +graphicstype.stroke = ì„  굵기 설정하기 +graphicstype.line = ì„ ë¶„ 그리기 +graphicstype.rect = ì§ì‚¬ê°í˜• 채우기 +graphicstype.linerect = ì§ì‚¬ê°í˜• 외곽선 그리기 +graphicstype.poly = 정다ê°í˜• 채우기 +graphicstype.linepoly = 정다ê°í˜• 외곽선 그리기 +graphicstype.triangle = 삼ê°í˜• 채우기 +graphicstype.image = ì¼ë¶€ 콘í…ì¸ ì˜ ì´ë¯¸ì§€ 그리기\n예: [accent]@router[] ë˜ëŠ” [accent]@dagger[]. + +lenum.always = í•­ìƒ ì°¸ +lenum.idiv = 정수 나누기 +lenum.div = 나누기\n0으로 나누면 [accent]null[]ì„ ë°˜í™˜í•©ë‹ˆë‹¤. +lenum.mod = 나머지 +lenum.equal = ë™ì¹˜ 비êµ. 형변환 가능\nNullì´ ì•„ë‹Œ ê°ì²´ê°€ 숫ìžì™€ 비êµí• ë ¤ë©´ 1ì´ ë˜ê³ , Nullì´ë©´ 0ì´ ë©ë‹ˆë‹¤. +lenum.notequal = ë™ì¹˜ 부정. 형변환 가능 +lenum.strictequal = 엄격한 ë™ì¹˜ 비êµ. 형변환 불가능\n[accent]null[]를 확ì¸í•˜ëŠ”ë° ì“¸ 수 있습니다. +lenum.shl = 왼쪽으로 비트 ì´ë™ +lenum.shr = 오른쪽으로 비트 ì´ë™ +lenum.or = ë¹„íŠ¸ì—°ì‚°ìž OR +lenum.land = ë…¼ë¦¬ì—°ì‚°ìž AND +lenum.and = ë¹„íŠ¸ì—°ì‚°ìž AND +lenum.not = ë¹„íŠ¸ì—°ì‚°ìž NOT +lenum.xor = ë¹„íŠ¸ì—°ì‚°ìž XOR + +lenum.min = ë‘ ìˆ˜ì˜ ìµœì†Ÿê°’ +lenum.max = ë‘ ìˆ˜ì˜ ìµœëŒ“ê°’ +lenum.angle = ë²¡í„°ì˜ ê°(ë„) +lenum.len = ë²¡í„°ì˜ ê¸¸ì´ +lenum.sin = 사ì¸(ë„) +lenum.cos = 코사ì¸(ë„) +lenum.tan = 탄젠트(ë„) +#not a typo, look up 'range notation' +lenum.rand = 범위 ë‚´ 십진법 난수[0 ~ ê°’) +lenum.log = ìžì—° 로그(진수) +lenum.log10 = ìƒìˆ˜ 로그 +lenum.noise = 2D 심플렉스 ë…¸ì´ì¦ˆ +lenum.abs = 절댓값 +lenum.sqrt = 제곱근 + +lenum.any = 유닛 +lenum.ally = ì•„êµ° 유닛 +lenum.attacker = 무기를 가진 유닛 +lenum.enemy = ì  ìœ ë‹› +lenum.boss = ìˆ˜í˜¸ìž ìœ ë‹› +lenum.flying = 공중 유닛 +lenum.ground = ì§€ìƒ ìœ ë‹› +lenum.player = 플레ì´ì–´ì— ì˜í•´ ì¡°ì¢…ëœ ìœ ë‹› + +lenum.ore = ê´‘ì„ ë§¤ìž¥ì§€ +lenum.damaged = ì†ìƒëœ ì•„êµ° 건물 +lenum.spawn = ì  ìŠ¤í° ì§€ì \n코어 ë˜ëŠ” ì§€ì ì¼ 수 있ìŒ. +lenum.building = 특정 건물 ì§‘ë‹¨ì— ì†í•œ 건물 + +lenum.core = 코어 +lenum.storage = ì°½ê³ ê°™ì€ ì €ìž¥ 건물 +lenum.generator = ì „ë ¥ì„ ìƒì‚°í•˜ëŠ” 건물 +lenum.factory = ìžì›ì„ 변환하는 건물 +lenum.repair = 수리 ì§€ì  +lenum.rally = 지휘소 +lenum.battery = 배터리 +lenum.resupply = 보급 ì§€ì .\n[accent]"유닛 탄약 í•„ìš”"[]ê°€ 활성화ë˜ì—ˆì„ 때만 유ì˜ë¯¸í•©ë‹ˆë‹¤. +lenum.reactor = 핵융합로/토륨 ì›ìžë¡œ +lenum.turret = í¬íƒ‘ + +sensor.in = ê°ì§€í•  건물/유닛 + +radar.from = ê°ì§€ë¥¼ í•  건물\nê°ì§€ 범위는 ê±´ë¬¼ì˜ ê°ì§€ ë²”ìœ„ì— ì˜í•´ 제한ë©ë‹ˆë‹¤. +radar.target = 유닛 ê°ì§€ í•„í„° +radar.and = 추가 í•„í„° +radar.order = ì •ë ¬ 순서. 0ì€ ë°˜ì „ +radar.sort = 결과를 정렬할 측정 수단 +radar.output = ì°¾ì€ ìœ ë‹›ì„ ëŒ€ìž…í•  변수 + +unitradar.target = 유닛 ê°ì§€ í•„í„° +unitradar.and = 추가 í•„í„° +unitradar.order = ì •ë ¬ 순서. 0ì€ ë°˜ì „ +unitradar.sort = 결과를 정렬할 측정 수단 +unitradar.output = ì°¾ì€ ìœ ë‹›ì„ ëŒ€ìž…í•  변수 + +control.of = 조종할 건물 +control.unit = 조준할 유닛/건물 +control.shoot = 발사 여부 + +unitlocate.enemy = ì  ê±´ë¬¼ í¬í•¨ 여부 +unitlocate.found = ëŒ€ìƒ ë°œê²¬ 여부 +unitlocate.building = ì°¾ì€ ê±´ë¬¼ì„ ëŒ€ìž…í•  변수 +unitlocate.outx = X좌표 +unitlocate.outy = Y좌표 +unitlocate.group = ì°¾ì„ ê±´ë¬¼ 집단 + +lenum.idle = 채광/건설 제외 ì´ë™ë§Œ 중단\n기본 ìƒíƒœìž…니다. +lenum.stop = ì´ë™/채광/건설 중단 +lenum.move = 특정 위치로 ì´ë™ +lenum.approach = 특정 위치로 ë°˜ì§€ë¦„ë§Œí¼ ì ‘ê·¼ +lenum.pathfind = ì  ìŠ¤í° ì§€ì ìœ¼ë¡œ 길찾기 +lenum.target = 특정 ìœ„ì¹˜ì— ë°œì‚¬ +lenum.targetp = 목표물 ì†ë„를 예측하여 발사 +lenum.itemdrop = ì•„ì´í…œ 투하 +lenum.itemtake = 건물ì—서 ì•„ì´í…œ 수송 +lenum.paydrop = 현재 화물 투하 +lenum.paytake = 현재 위치ì—서 화물 수송 +lenum.flag = 깃발 수 설정 +lenum.mine = 특정 위치ì—서 채광 +lenum.build = 구조물 건설 +lenum.getblock = 특정 ì¢Œí‘œì˜ ë¹Œë”©ê³¼ 블ë¡ì„ 반환합니다.\n위치는 ìœ ë‹›ì˜ ì¸ì§€ 범위 내여야 합니다.\nìžì—° ì§€í˜•ì€ [accent]@solid[]ì˜ íƒ€ìž…ì„ ê°€ì§‘ë‹ˆë‹¤. +lenum.within = 좌표 주변 유닛 발견 여부 +lenum.boost = ì´ë¥™ 시작/중단 +#1665 줄 매칭 + +#-------------ë¹„ê³µì‹ ë²ˆì—­ì£¼------------- +#íŒ, 패치 기ë¡, ì•½ê°„ì˜ ê´€ë ¨ ë“œë¦½ì„ ë„£ëŠ” 곳입니다. ì´ë¯¸ 쓰여진 ì¤„ì´ ìžˆë‹¤ë©´ \n\n를 입력한 ë‹¤ìŒ ìž‘ì„±í•˜ê³  ëì— ê¹ƒí—ˆë¸Œ ìž‘ì„±ìž ë‹‰ë„¤ìž„(ë˜ëŠ” 디스코드)ì„ ì ì–´ì£¼ì„¸ìš”. +#심ê°í•œ 노잼, 뇌절, 무례한 ë§ë“¤ì„ ì ì§€ ë§ì•„주세요, ì´ëŠ” 목ì ì´ 어떠하든 공통ì ìœ¼ë¡œ ì ìš©ë©ë‹ˆë‹¤(친근함 유ë„를 위한 í‰ì–´ x). ë‹¤ìŒ íŒ¨ì¹˜ì— ì—…ë°ì´íЏë˜ì–´ ê·¸ 언어를 쓰는 모든 유저가 보게 ë©ë‹ˆë‹¤. +#ì–‘ì´ ë„ˆë¬´ 많으면 ì‚¬ì¡±ì„ ë” ë¶™ì´ëŠ”ê±¸ 추천하지 않습니다. +#ì´ ë¹„ê³µì‹ ë²ˆì—­ì£¼ëŠ” ê³µì‹ ë””í…Œì¼ì´ 추가ë˜ë©´ 언제든지 ì‚­ì œë  ìˆ˜ 있습니다. +#비어있는 디테ì¼ì€ 아래 detailsê°€ ì „ë¶€ì´ë¯€ë¡œ 추가 ë˜ëŠ” 삭제를 따로 ì•ˆí•˜ì…”ë„ ë©ë‹ˆë‹¤. +#유색코드가 아닌, í‘ë°± 색코드만 사용 가능합니다. ë˜ë„ë¡ì´ë©´ 그냥 안쓰시는걸 추천. +#관련 문ì˜ëŠ” ê³µì‹ ë””ìŠ¤ì½”ë“œì—서 ì ˆ 불러주세요. Sharlotte#0018 + +#ì•„ì´í…œ +item.metaglass.details = 쓰임세가 가장 ì ì€ ì•„ì´í…œ +item.graphite.details = +item.sand.details = +item.titanium.details = +item.thorium.details = +item.silicon.details = +item.plastanium.details = +item.phase-fabric.details = +item.surge-alloy.details = +item.blast-compound.details = 화력 ë°œì „ê¸°ì— ë„£ì–´ë³´ì„¸ìš”. +item.pyratite.details = + +#ì•¡ì²´ +liquid.water.details = +liquid.slag.details = +liquid.oil.details = +liquid.cryofluid.details = í‹°íƒ€ëŠ„ì„ ê°ˆì•„ì„œ ë¬¼ì— í¬ì„했다는 ì†Œë¬¸ì´ ìžˆë‹¤. + +#ë¸”ë¡ +block.resupply-point.details = +block.armored-conveyor.details = +block.illuminator.details = +block.message.details = +block.graphite-press.details = +block.multi-press.details = +block.silicon-smelter.details = +block.kiln.details = +block.plastanium-compressor.details = ì„유를 ì •ë§ ë§Žì´ ë¨¹ëŠ”ë‹¤. +block.phase-weaver.details = +block.alloy-smelter.details = +block.cryofluid-mixer.details = +block.blast-mixer.details = +block.pyratite-mixer.details = +block.melter.details = +block.separator.details = +block.spore-press.details = +block.pulverizer.details = +block.coal-centrifuge.details = 가성비가 매우 뛰어나다. +block.incinerator.details = +block.power-void.details = +block.power-source.details = +block.item-source.details = +block.item-void.details = +block.liquid-source.details = +block.liquid-void.details = +block.copper-wall.details = +block.copper-wall-large.details = +block.titanium-wall.details = +block.titanium-wall-large.details = +block.plastanium-wall.details = +block.plastanium-wall-large.details = +block.thorium-wall.details = +block.thorium-wall-large.details = +block.phase-wall.details = +block.phase-wall-large.details = +block.surge-wall.details = +block.surge-wall-large.details = +block.door.details = +block.door-large.details = +block.mender.details = +block.mend-projector.details = +block.overdrive-projector.details = +block.force-projector.details = +block.shock-mine.details = +block.conveyor.details = +block.titanium-conveyor.details = +block.plastanium-conveyor.details = +block.junction.details = +block.bridge-conveyor.details = 티타늄 컨베ì´ì–´ë³´ë‹¤ 빠르다. +block.phase-conveyor.details = +block.sorter.details = ìžì›ì„ 분류하여 주변 블ë¡ì— 건내는 ê³¼ì •ì´ ê±°ì˜ í•œìˆœê°„ì— ì¼ì–´ë‚œë‹¤. +block.inverted-sorter.details = +block.distributor.details = +block.overflow-gate.details = +block.underflow-gate.details = +block.mass-driver.details = 발사할려면 최소 ì•„ì´í…œ 10개가 필요하다. +block.mechanical-pump.details = +block.rotary-pump.details = +block.thermal-pump.details = +block.conduit.details = +block.pulse-conduit.details = +block.plated-conduit.details = +block.liquid-router.details = +block.liquid-tank.details = +block.liquid-junction.details = +block.bridge-conduit.details = +block.phase-conduit.details = +block.power-node.details = +block.power-node-large.details = +block.surge-tower.details = +block.diode.details = +block.battery.details = +block.battery-large.details = +block.combustion-generator.details = +block.thermal-generator.details = +block.steam-generator.details = +block.differential-generator.details = +block.rtg-generator.details = +block.solar-panel.details = +block.solar-panel-large.details = +block.thorium-reactor.details = +block.impact-reactor.details = +block.mechanical-drill.details = +block.pneumatic-drill.details = +block.laser-drill.details = +block.blast-drill.details = +block.water-extractor.details = +block.cultivator.details = +block.cultivator.details = +block.oil-extractor.details = +block.vault.details = +block.container.details = +block.unloader.details = +block.launch-pad.details = +block.duo.details = +block.scatter.details = +block.scorch.details = +block.hail.details = ì¼ì ì‚¬í•˜ë©´ 립플보다 ë” ë›°ì–´ë‚œ 정확ë„와 ì—°ì‚¬ë ¥ì„ ë³´ì—¬ì¤€ë‹¤. +block.wave.details = +block.lancer.details = +block.arc.details = +block.swarmer.details = +block.salvo.details = +block.fuse.details = +block.ripple.details = +block.cyclone.details = +block.spectre.details = +block.meltdown.details = +block.foreshadow.details = +block.repair-point.details = +block.segment.details = +block.parallax.details = +block.tsunami.details = +block.silicon-crucible.details = +block.disassembler.details = +block.overdrive-dome.details = +block.payload-conveyor.details = +block.payload-router.details = +block.command-center.details = +block.ground-factory.details = +block.air-factory.details = 건설&연구 재료는 구리와 ë‚©ë¿ì´ì§€ë§Œ, ì •ìž‘ ìœ ë‹›ì„ ìƒì‚°í•  ë• ì‹¤ë¦¬ì½˜ì´ í•„ìš”í•˜ë‹¤. +block.naval-factory.details = +block.additive-reconstructor.details = +block.multiplicative-reconstructor.details = +block.exponential-reconstructor.details = +block.tetrative-reconstructor.details = +block.switch.details = +block.micro-processor.details = +block.logic-processor.details = +block.hyper-processor.details = +block.memory-cell.details = +block.memory-bank.details = +block.logic-display.details = +block.large-logic-display.details = +block.interplanetary-accelerator.details = + +#유닛 +unit.dagger.details = ì´ì „ì— ë””ê±°ëž€ ì´ëª…으로 종êµê°€ ìƒê²¼ì—ˆë‹¤. +unit.mace.details = +unit.fortress.details = +unit.scepter.details = +unit.reign.details = +unit.nova.details = +unit.pulsar.details = +unit.quasar.details = +unit.vela.details = +unit.corvus.details = ì •ë§ ëŠë¦¬ë‹¤. +unit.crawler.details = ìµœê·¼ì— ìží­ AIê°€ í–¥ìƒë˜ë©´ì„œ 컨베ì´ì–´ë¡œ ìží­ì„ 유ë„í•  수 없게 ë˜ì—ˆë‹¤. +unit.atrax.details = +unit.spiroct.details = +unit.arkyid.details = +unit.toxopid.details = +unit.flare.details = +unit.horizon.details = +unit.zenith.details = +unit.antumbra.details = +unit.eclipse.details = +unit.mono.details = +unit.poly.details = +unit.mega.details = +unit.quad.details = +unit.oct.details = +unit.risso.details = 뭉치면 ì—°ì‚¬ë ¥ì´ ë¬´ì‹œë¬´ì‹œí•˜ë‹¤. +unit.minke.details = +unit.bryde.details = +unit.sei.details = +unit.omura.details = +unit.alpha.details = +unit.beta.details = +unit.gamma.details = diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index a318c53f5f..0a8290e544 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -55,6 +55,7 @@ schematic.saved = Schema iÅ¡saugota. schematic.delete.confirm = Å i schema bus negrįžtamai paÅ¡alinta. schematic.rename = Pervadinti schemÄ… schematic.info = {0}x{1}, {2} blokai +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Ä®veikta bangų:[accent] {0} stat.enemiesDestroyed = Sunaikinta priešų:[accent] {0} @@ -100,7 +101,6 @@ done = Baigta feature.unsupported = JÅ«sų įrenginys nepalaiko Å¡ios funkcijos. mods.alphainfo = Prisiminkite, jog modifikacijos vis dar yra alpha, ir[scarlet] gali bÅ«ti [].\nPraneÅ¡kite apie rastas klaidas Mindustry GitHub puslapyje arba Discord serveryje. -mods.alpha = [accent](Alpha) mods = Modifikacijos mods.none = [lightgray]Modifikacijos nerastos mods.guide = Modifikavimo pagalba @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] pasirinkimui+kopijavimui pausebuilding = [accent][[{0}][] statymo sustabdymui resumebuilding = [scarlet][[{0}][] statymo pratÄ™simui wave = [accent]Banga {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Banga po {0} wave.waveInProgress = [lightgray]Vyksta banga waiting = [lightgray]Laukiama... waiting.players = Laukiama žaidÄ—jų... wave.enemies = [lightgray]{0} LikÄ™ prieÅ¡ai wave.enemy = [lightgray]{0} LikÄ™s prieÅ¡as +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Užkrauti vaizdÄ… saveimage = IÅ¡saugoti vaizdÄ… unknown = Nežinomas @@ -328,6 +331,7 @@ editor.generation = Generacija: editor.ingame = Redaguoti žaidime editor.publish.workshop = Publikuoti DirbtuvÄ—je editor.newmap = Naujas žemÄ—lapis +editor.center = Center workshop = DirbtuvÄ— waves.title = Bangos waves.remove = Panaikinti @@ -416,6 +420,7 @@ filters.empty = [lightgray]NÄ—ra filtrų! PridÄ—kite su mygtuku easanÄiu žemia filter.distort = IÅ¡kraipyti filter.noise = TriukÅ¡mas filter.enemyspawn = Priešų atsiradimo vietos pasirinkimas +filter.spawnpath = Path To Spawn filter.corespawn = Branduolio pasirinkimas filter.median = Mediana filter.oremedian = RÅ«dų mediana @@ -440,6 +445,7 @@ filter.option.amount = Kiekis filter.option.block = Blokas filter.option.floor = Sluoksnis filter.option.flooronto = Pasirinktas sluoksnis +filter.option.target = Target filter.option.wall = Siena filter.option.ore = RÅ«da filter.option.floor2 = Antrasis sluoksnis @@ -471,15 +477,9 @@ requirement.wave = Pasiekite {0} zonoje {1} requirement.core = Sunaikinkite priešų branduolį zonoje {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = PratÄ™sti zonÄ…:\n[lightgray]{0} bestwave = [lightgray]Bangos rekordas: {0} -launch = < PALEISTI > launch.text = Launch -launch.title = Paleidimas sÄ—kmingas -launch.next = [lightgray]kita proga bangoje {0} -launch.unable2 = [scarlet]Negalima PALEISTI.[] -launch.confirm = Tai paleis visus resursus jÅ«sų branduolyje.\nJÅ«s nebegalÄ—site sugrįžti į Å¡iÄ… bazÄ™. -launch.skip.confirm = Jei praleisite dabar, negalÄ—site paleisti iki vÄ—lesnių bangų. +research.multiplayer = Only the host can research items. uncover = Atidengti configure = Keisti resursų kiekį loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Ar tikrai norite iÅ¡trinti Å¡iuos duomenis?\nTai negali settings.clearall.confirm = [scarlet]Ä®SPÄ–JIMAS![]\nTai iÅ¡trins visus duomenis, įskaitant iÅ¡saugojimus, žemÄ—lapius, atrakinimus ir mygtukų pakeitimus.\nVos paspaudus 'gerai' žaidimas iÅ¡trins visus duomenis ir iÅ¡sijungs. settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Sustabdyta > clear = IÅ¡valyti banned = [scarlet]Užblokuota @@ -570,49 +580,74 @@ info.title = Informacija error.title = [crimson]Ä®vyko klaida error.crashtitle = Ä®vyko klaida unit.nobuild = [scarlet]Unit can't build -blocks.input = Ä®eiga -blocks.output = IÅ¡eiga -blocks.booster = Stiprintuvas -blocks.tiles = Privalomi -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Energijos Talpumas -blocks.powershot = Energija per šūvį -blocks.damage = Žala -blocks.targetsair = Å audo į oro taikinius -blocks.targetsground = Å audo į žemÄ—s taikinius -blocks.itemsmoved = JudÄ—jimo Greitis -blocks.launchtime = Laikas Tarp Paleidimų -blocks.shootrange = Atstumas -blocks.size = Dydis -blocks.displaysize = Display Size -blocks.liquidcapacity = SkysÄių Talpumas -blocks.powerrange = Energijos Skleidimo Atstumas -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maks. JungÄių Kiekis -blocks.poweruse = Energijos Suvartojimas -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Daiktų Talpumas -blocks.basepowergeneration = Bazinis Energijos Generavimas -blocks.productiontime = Gamybos Laikas -blocks.repairtime = Pilnas bloko sutaisymo laikas -blocks.speedincrease = GreiÄio PadidÄ—jimas -blocks.range = Atstumas -blocks.drilltier = Gręžiama -blocks.drillspeed = Bazinis Grąžto Greitis -blocks.boosteffect = Pastiprinimo Efektas -blocks.maxunits = Maks. Aktyvių Vienetų Kiekis -blocks.health = GyvybÄ—s -blocks.buildtime = Statymo Laikas -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Statymo Kaina -blocks.inaccuracy = Netikslumas -blocks.shots = Å Å«viai -blocks.reload = Å Å«viai per sekundÄ™ -blocks.ammo = Å oviniai -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Ä®eiga +stat.output = IÅ¡eiga +stat.booster = Stiprintuvas +stat.tiles = Privalomi +stat.affinities = Affinities +stat.powercapacity = Energijos Talpumas +stat.powershot = Energija per šūvį +stat.damage = Žala +stat.targetsair = Å audo į oro taikinius +stat.targetsground = Å audo į žemÄ—s taikinius +stat.itemsmoved = JudÄ—jimo Greitis +stat.launchtime = Laikas Tarp Paleidimų +stat.shootrange = Atstumas +stat.size = Dydis +stat.displaysize = Display Size +stat.liquidcapacity = SkysÄių Talpumas +stat.powerrange = Energijos Skleidimo Atstumas +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maks. JungÄių Kiekis +stat.poweruse = Energijos Suvartojimas +stat.powerdamage = Power/Damage +stat.itemcapacity = Daiktų Talpumas +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Bazinis Energijos Generavimas +stat.productiontime = Gamybos Laikas +stat.repairtime = Pilnas bloko sutaisymo laikas +stat.speedincrease = GreiÄio PadidÄ—jimas +stat.range = Atstumas +stat.drilltier = Gręžiama +stat.drillspeed = Bazinis Grąžto Greitis +stat.boosteffect = Pastiprinimo Efektas +stat.maxunits = Maks. Aktyvių Vienetų Kiekis +stat.health = GyvybÄ—s +stat.buildtime = Statymo Laikas +stat.maxconsecutive = Max Consecutive +stat.buildcost = Statymo Kaina +stat.inaccuracy = Netikslumas +stat.shots = Å Å«viai +stat.reload = Å Å«viai per sekundÄ™ +stat.ammo = Å oviniai +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Privalomas Geresnis Grąžtas bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Energija: {0}/s bar.powerstored = Sukaupta: {0}/{1} bar.poweramount = Energija: {0} bar.poweroutput = Energijos IÅ¡eiga: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Daiktai: {0} bar.capacity = Talpumas: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Statymo Progresas bar.input = Ä®eiga bar.output = IÅ¡eiga +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] žalos bullet.splashdamage = [stat]{0}[lightgray] zonos žalos ~[stat] {1}[lightgray] blokai bullet.incendiary = [stat]uždegantis @@ -642,12 +680,15 @@ bullet.homing = [stat]sekimas bullet.shock = [stat]Å¡okas bullet.frag = [stat]skilantis bullet.knockback = [stat]{0}[lightgray] numuÅ¡imas +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]Å¡aldantis bullet.tarred = [stat]dervuotas bullet.multiplier = [stat]{0}[lightgray]x Å¡ovinių daugiklis bullet.reload = [stat]{0}[lightgray]x Å¡audymo greitis unit.blocks = blokai +unit.blockssquared = blocks² unit.powersecond = energijos per sekundÄ™ unit.liquidsecond = skysÄio per sekundÄ™ unit.itemssecond = daiktų per sekundÄ™ @@ -670,7 +711,7 @@ category.power = Energija category.liquids = SkysÄiai category.items = Daiktai category.crafting = Ä®eiga/IÅ¡eiga -category.shooting = Å audymas +category.function = Function category.optional = Galimi Pagerinimai setting.landscape.name = Užrakinti pasukimÄ… setting.shadows.name = Å ešėliai @@ -679,7 +720,6 @@ setting.linear.name = Linijinis Filtravimas setting.hints.name = Užuominos setting.flow.name = Rodyti Resursų Srauto Geritį[scarlet] (experimental) setting.buildautopause.name = Automatinis Statybų Sustabdymas -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Vandens Animacija setting.animatedshields.name = Skydų Animacija setting.antialias.name = Glodinimas[lightgray] (reikalingas perkrovimas)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Langas Be PakrasÄių[lightgray] (gali reikÄ—ti perkrauti) setting.fps.name = Rodyti FPS ir Ping setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Rodyti Blokų Pasirinkimo Mygtukus setting.vsync.name = VSync setting.pixelate.name = Pikseliavimas setting.minimap.name = Rodyti Mini ŽemÄ—lapį @@ -822,6 +861,7 @@ mode.custom = PasirinktinÄ—s TaisyklÄ—s rules.infiniteresources = Neriboti Resursai rules.reactorexplosions = Reaktorių Sprogimai +rules.schematic = Schematics Allowed rules.wavetimer = Bangų Laikmatis rules.waves = Bangos rules.attack = Puolimo Režimas @@ -847,6 +887,7 @@ rules.title.unit = Vienetai rules.title.experimental = Eksperimentinis rules.title.environment = Environment rules.lighting = ApÅ¡vietimas +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Aplinkos Å viesa @@ -858,6 +899,7 @@ content.item.name = Daiktai content.liquid.name = SkysÄiai content.unit.name = Vienetai content.block.name = Blokai + item.copper.name = Varis item.lead.name = Å vinas item.coal.name = Anglis @@ -879,23 +921,6 @@ liquid.slag.name = Å lakas liquid.oil.name = Nafta liquid.cryofluid.name = Krio Skystis -item.explosiveness = [lightgray]Sprogstamumas: {0}% -item.flammability = [lightgray]Degumas: {0}% -item.radioactivity = [lightgray]Radioaktyvumas: {0}% - -unit.health = [lightgray]GyvybÄ—s: {0} -unit.speed = [lightgray]Greitis: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]KarÅ¡Äio Talpumas: {0} -liquid.viscosity = [lightgray]Klampumas: {0} -liquid.temperature = [lightgray]TemperatÅ«ra: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = SmÄ—lio Riedulys block.grass.name = ŽolÄ— block.slag.name = Slag +block.space.name = Space block.salt.name = Druska block.salt-wall.name = Salt Wall block.pebbles.name = Akmenukai @@ -981,6 +1007,7 @@ block.darksand-water.name = Tamsaus SmÄ—lio Vanduo block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ledinis Sniegas block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1075,6 +1102,7 @@ block.power-source.name = BegalinÄ— Energija block.unloader.name = IÅ¡kroviklis block.vault.name = Seifas block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generatorius block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Talpykla block.launch-pad.name = Paleidimo AikÅ¡telÄ— block.launch-pad-large.name = DidelÄ— Paleidimo AikÅ¡telÄ— @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = mÄ—lyna team.crux.name = raudona diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 634b6eb00e..6523ead319 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -55,6 +55,7 @@ schematic.saved = Ontwerp bewaard. schematic.delete.confirm = Dit ontwerp zal in een zwart gat verdwijnen. schematic.rename = Hernoem ontwerp schematic.info = {0}x{1}, {2} blokken +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Waves Verslagen:[accent] {0} stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0} @@ -100,7 +101,6 @@ done = Klaar feature.unsupported = Je apparaat ondersteunt deze functionaliteit niet. mods.alphainfo = Houd in gedachten dat mod ondersteuning nieuw is, en daarom[scarlet] mogelijk ontstabiel is[].\nVermeld problemen die je ermee ondervind in de Mindustry GitHub of Discord. -mods.alpha = [accent](Onstabiel) mods = Mods mods.none = [lightgray]Geen mods gevonden! mods.guide = Modding Handboek @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] om te selecteren + kopiëren pausebuilding = [accent][[{0}][] om bouwen te pauzeren resumebuilding = [scarlet][[{0}][] om bouwen te hervatten wave = [accent]Ronde {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Volgende ronde over {0} wave.waveInProgress = [lightgray]Ronde bezig waiting = [lightgray]Wachten... waiting.players = Wachten op spelers... wave.enemies = [lightgray]{0} Vijanden resterend wave.enemy = [lightgray]{0} Vijand resterend +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Laad afbeelding saveimage = Bewaar afbeelding unknown = Onbekend @@ -328,6 +331,7 @@ editor.generation = Generatie: editor.ingame = Bewerk In-Game editor.publish.workshop = Publiceer in Werkplaats editor.newmap = Nieuwe Kaart +editor.center = Center workshop = Werkplaats waves.title = Rondes waves.remove = Verwijder @@ -416,6 +420,7 @@ filters.empty = [lightgray]Geen filters! Voeg een toe met onderstaande knop. filter.distort = Verdraai filter.noise = Geluid filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Mediaan filter.oremedian = Ertsmediaan @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Blok filter.option.floor = Vloer filter.option.flooronto = Doel Vloer +filter.option.target = Target filter.option.wall = Muur filter.option.ore = Grondstof filter.option.floor2 = Secundaire vloer @@ -467,19 +473,13 @@ abandon = Verlaat abandon.text = Je verliest deze kaart met alles erop en eraan aan de vijand. locked = Op slot complete = [lightgray]Voltooid: -requirement.wave = Berijk ronde {0} in {1} +requirement.wave = Bereik ronde {0} in {1} requirement.core = Vernietig vijandige core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Hervat zone:\n[lightgray]{0} bestwave = [lightgray]Beste ronde: {0} -launch = < LANCEER > launch.text = Launch -launch.title = Lancering Sucessvol -launch.next = [lightgray]volgende lanceerkans in ronde {0} -launch.unable2 = [scarlet]Lanceren niet mogelijk.[] -launch.confirm = Dit lanceert alle items in je core.\nJe zal niet meer terug kunnen keren naar deze basis. -launch.skip.confirm = Als je nu niet lanceert zul je moeten wachten tot de volgende mogelijkheid. +research.multiplayer = Only the host can research items. uncover = Ontdek configure = Configureer startinventaris loadout = Loadout @@ -489,7 +489,7 @@ addall = Voeg Alles Toe launch.destination = Destination: {0} configure.invalid = Hoeveelheid moet een getal zijn tussen 0 en {0}. zone.unlocked = [lightgray]{0} vrijgespeeld. -zone.requirement.complete = Ronde {0} berijkt:\n{1} zone vrijgespeeld. +zone.requirement.complete = Ronde {0} bereikt:\n{1} zone vrijgespeeld. zone.resources = Vindbare grondstoffen: zone.objective = [lightgray]Doel: [accent]{0} zone.objective.survival = Overleef @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Weet je zeker dat je deze data wilt verwijderen?\nDit i settings.clearall.confirm = [scarlet]WAARSCHUWING![]\nDit verwijderd alle data, inclusief saves, kaarten, technologie en bedienings-instellingen.\nAls je op doorgaat wist het spel al je data en stopt automatisch. settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Gepauzeerd > clear = Wis banned = [scarlet]Verbannen @@ -570,49 +580,74 @@ info.title = Informatie error.title = [crimson]Een fout is opgetreden error.crashtitle = Een fout is opgetreden unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Stroomcapaciteit -blocks.powershot = Stroom/Schot -blocks.damage = Schade -blocks.targetsair = Luchtdoelwitten -blocks.targetsground = Gronddoelwitten -blocks.itemsmoved = Beweegingssnelheid -blocks.launchtime = Tijd tussen lanceringen -blocks.shootrange = Bereik -blocks.size = Formaat -blocks.displaysize = Display Size -blocks.liquidcapacity = Vloeistofcapaciteit -blocks.powerrange = Stroombereik -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maximale Hoeveelheid Connecties -blocks.poweruse = Stroomverbruik -blocks.powerdamage = Stroom/Schade -blocks.itemcapacity = Materiaalcapaciteit -blocks.basepowergeneration = Standaard Stroom Generatie -blocks.productiontime = Productie Tijd -blocks.repairtime = Volledige Blok Repareertijd -blocks.speedincrease = Snelheidsverhoging -blocks.range = Bereik -blocks.drilltier = Valt te delven -blocks.drillspeed = Standaard mine snelheid -blocks.boosteffect = Boost Effect -blocks.maxunits = Maximaal Actieve Units -blocks.health = Levenspunten -blocks.buildtime = Bouwtijd -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Bouwkosten -blocks.inaccuracy = Onnauwkeurigheid -blocks.shots = Shoten -blocks.reload = Schoten/Seconde -blocks.ammo = Ammunitie -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Stroomcapaciteit +stat.powershot = Stroom/Schot +stat.damage = Schade +stat.targetsair = Luchtdoelwitten +stat.targetsground = Gronddoelwitten +stat.itemsmoved = Beweegingssnelheid +stat.launchtime = Tijd tussen lanceringen +stat.shootrange = Bereik +stat.size = Formaat +stat.displaysize = Display Size +stat.liquidcapacity = Vloeistofcapaciteit +stat.powerrange = Stroombereik +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Maximale Hoeveelheid Connecties +stat.poweruse = Stroomverbruik +stat.powerdamage = Stroom/Schade +stat.itemcapacity = Materiaalcapaciteit +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Standaard Stroom Generatie +stat.productiontime = Productie Tijd +stat.repairtime = Volledige Blok Repareertijd +stat.speedincrease = Snelheidsverhoging +stat.range = Bereik +stat.drilltier = Valt te delven +stat.drillspeed = Standaard mine snelheid +stat.boosteffect = Boost Effect +stat.maxunits = Maximaal Actieve Units +stat.health = Levenspunten +stat.buildtime = Bouwtijd +stat.maxconsecutive = Max Consecutive +stat.buildcost = Bouwkosten +stat.inaccuracy = Onnauwkeurigheid +stat.shots = Shoten +stat.reload = Schoten/Seconde +stat.ammo = Ammunitie +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Betere miner nodig bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Stroom: {0} bar.powerstored = Opgeslagen: {0}/{1} bar.poweramount = Stroom: {0} bar.poweroutput = Stroom Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capaciteit: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Bouw Voortgang bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] dmg bullet.splashdamage = [stat]{0}[lightgray] gebied dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]brandstichtend @@ -642,12 +680,15 @@ bullet.homing = [stat]doelzoekend bullet.shock = [stat]schok bullet.frag = [stat]clusterbom bullet.knockback = [stat]{0}[lightgray] terugslag +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]bevriezend bullet.tarred = [stat]pek bullet.multiplier = [stat]{0}[lightgray]x ammunitieverdubbelaar bullet.reload = [stat]{0}[lightgray]x herlaad unit.blocks = blokken +unit.blockssquared = blocks² unit.powersecond = stroomeenheid/seconde unit.liquidsecond = vloeistofeenheid/seconde unit.itemssecond = items/seconde @@ -670,7 +711,7 @@ category.power = Stroom category.liquids = Vloeisof category.items = Items category.crafting = Productie -category.shooting = Wapens +category.function = Function category.optional = Optionele Verbeteringen setting.landscape.name = Vergrendel Landschap setting.shadows.name = Schaduwen @@ -679,7 +720,6 @@ setting.linear.name = Linear Filtering setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Pauzeer Bouw Automatisch -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animeer Water setting.animatedshields.name = Animeer Schilden setting.antialias.name = Antialias[lightgray] (herstart vereist)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Volledig scherm setting.borderlesswindow.name = Borderless Venster[lightgray] (wellicht herstart vereist) setting.fps.name = Show FPS setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Toon Blok Selectie Toetscombinaties setting.vsync.name = VSync setting.pixelate.name = Pixelate [lightgray](mogelijk verminderde performance) setting.minimap.name = Toon Minimap @@ -822,6 +861,7 @@ mode.custom = Aangepaste regels rules.infiniteresources = Oneindige Resources rules.reactorexplosions = Ontploffende Reactors +rules.schematic = Schematics Allowed rules.wavetimer = Ronde timer rules.waves = Rondes rules.attack = Aanval modus @@ -847,6 +887,7 @@ rules.title.unit = Units rules.title.experimental = Experimenteel rules.title.environment = Environment rules.lighting = Belichting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Mist @@ -858,6 +899,7 @@ content.item.name = Items content.liquid.name = Vloeisof content.unit.name = Eenheiden content.block.name = Blokken + item.copper.name = Coper item.lead.name = Lood item.coal.name = Steenkool @@ -879,23 +921,6 @@ liquid.slag.name = Slag liquid.oil.name = Olie liquid.cryofluid.name = Koelvloeistof -item.explosiveness = [lightgray]Explosivieit: {0}% -item.flammability = [lightgray]Vlambaarheid: {0}% -item.radioactivity = [lightgray]Radioactiviteit: {0}% - -unit.health = [lightgray]Health: {0} -unit.speed = [lightgray]Snelheid: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Warmte Capaciteit: {0} -liquid.viscosity = [lightgray]Viscositeit: {0} -liquid.temperature = [lightgray]Tempratuur: {0} - unit.dagger.name = Dolk unit.mace.name = Mace unit.fortress.name = Fortress @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Zandkei block.grass.name = Gras block.slag.name = Slag +block.space.name = Space block.salt.name = Zout block.salt-wall.name = Salt Wall block.pebbles.name = Steentjes @@ -981,6 +1007,7 @@ block.darksand-water.name = Donker Zand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1037,7 +1064,7 @@ block.sorter.name = Sorteerder block.inverted-sorter.name = Omgekeerder Sorteerder block.message.name = Bericht block.illuminator.name = Lamp -block.illuminator.description = Een kleine aanpasbare lamp, heef stroom nodig. +block.illuminator.description = Een kleine aanpasbare lamp, heeft stroom nodig. block.overflow-gate.name = Overflow Gate block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Siliciumsmelter @@ -1071,10 +1098,11 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Kluis block.wave.name = Golf +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Doos block.launch-pad.name = Lanceerplatform block.launch-pad-large.name = Groot Lanceerplatform @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blauw team.crux.name = rood @@ -1171,9 +1201,9 @@ tutorial.waves.mobile = De[lightgray] vijand[] naderd.\n\nVerdedig je core voor tutorial.launch = Tijdens sommige waves, kan je je core[accent] lanceren[], hiermee verlaat je de basis permanent[accent] maar je neemt wel alles dat in de core zit met je mee.[]\nMet deze grondstoffen kan je nieuwe technologieën onderzoeken.\n\n[accent]Druk op de lanceerknop. item.copper.description = Een nuttig materiaal voor gebouwen. Wordt erg vaak in blokken gebruikt. -item.lead.description = Een basismateriaal. Wordt vaak gebruikt in elektronica en vloeistoftransport. -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.lead.description = Een basismateriaal. Wordt veel gebruikt in elektronica en vloeistoftransport. +item.metaglass.description = Een supersterke glas-samenstelling. Veel gebruikt voor vloeistof transport en opslag. +item.graphite.description = Gemineraliseerde koolstof, gebruikt voor ammunitie en elektrische isolatie. 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. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index ce59b257f7..2f6d94840c 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -55,6 +55,7 @@ schematic.saved = Blauwdruk opgeslagen. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Blauwdruk Hernoemen schematic.info = {0}x{1}, {2} blokken +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[]. stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0} @@ -100,7 +101,6 @@ done = Klaar feature.unsupported = Uw apparaat ondersteunt deze functie niet. mods.alphainfo = Mods zijn nog in alfa en [scarlet] kunnen zeer onstabiel zijn[].\nMeld problemen die je ondervindt op de Mindustry Github of Discord. -mods.alpha = [accent](Alfa) mods = Mods mods.none = [lightgray]Geen mods gevonden! mods.guide = Handleiding tot Modding @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] om te selecter+kopieren pausebuilding = [accent][[{0}][] om het bouwen te pauseren resumebuilding = [scarlet][[{0}][] om verder te gaan met bouwen wave = [accent]Golf {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Golf in {0} wave.waveInProgress = [lightgray]Golf bezig waiting = [lightgray]Wachten... waiting.players = Aan het wachten op spelers... wave.enemies = [lightgray]{0} Vijanden Over wave.enemy = [lightgray]{0} Vijand Over +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Laad Afbeelding saveimage = Sla Afbeelding Op unknown = Onbekend @@ -328,6 +331,7 @@ editor.generation = Generation: editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map +editor.center = Center workshop = Workshop waves.title = Waves waves.remove = Remove @@ -416,6 +420,7 @@ filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Median filter.oremedian = Ore Median @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Block filter.option.floor = Floor filter.option.flooronto = Target Floor +filter.option.target = Target filter.option.wall = Wall filter.option.ore = Ore filter.option.floor2 = Secondary Floor @@ -471,15 +477,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -launch = < LAUNCH > launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +research.multiplayer = Only the host can research items. uncover = Uncover configure = Configure Loadout loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done 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.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -570,49 +580,74 @@ info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Damage +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Size +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Shots +stat.reload = Shots/Second +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Build Progress bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -642,12 +680,15 @@ bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce 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.blockssquared = blocks² unit.powersecond = power units/second unit.liquidsecond = liquid units/second unit.itemssecond = items/second @@ -670,7 +711,7 @@ category.power = Power category.liquids = Liquids category.items = Items category.crafting = Input/Output -category.shooting = Shooting +category.function = Function category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows @@ -679,7 +720,6 @@ setting.linear.name = Linear Filtering setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -691,7 +731,7 @@ setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Max FPS setting.fpscap.none = None setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.uiscale.name = UI Scaling[lightgray] (requires restart)[] setting.swapdiagonal.name = Always Diagonal Placement setting.difficulty.training = training setting.difficulty.easy = easy @@ -713,7 +753,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = Show FPS setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate [lightgray](may decrease performance, disables animations) setting.minimap.name = Show Minimap @@ -822,6 +861,7 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -847,6 +887,7 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Items content.liquid.name = Liquids content.unit.name = Units content.block.name = Blocks + item.copper.name = Copper item.lead.name = Lead item.coal.name = Coal @@ -879,23 +921,6 @@ liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid -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} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viscosity: {0} -liquid.temperature = [lightgray]Temperature: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag +block.space.name = Space block.salt.name = Salt block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -981,6 +1007,7 @@ block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1071,10 +1098,11 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blue team.crux.name = red diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index f0c67c6a88..c89019a76f 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -10,18 +10,21 @@ link.dev-builds.description = Niestabilne wersje gry link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.google-play.description = Strona w sklepie Google Play -link.f-droid.description = F-Droid catalogue listing -link.wiki.description = Oficjana Wiki Mindustry +link.f-droid.description = Pozycja w F-Droid +link.wiki.description = Oficjalna Wiki Mindustry link.suggestions.description = Zaproponuj nowe funkcje +link.bug.description = ZnalazÅ‚eÅ› błąd? ZgÅ‚oÅ› go tutaj linkfail = Nie udaÅ‚o siÄ™ otworzyć linku!\nURL zostaÅ‚ skopiowany. -screenshot = Zapisano zdjÄ™cie w {0} +screenshot = Zapisano zrzut ekranu w {0} screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamiÄ™ci urzÄ…dzenia. gameover = Koniec Gry +gameover.disconnect = Odłącz gameover.pvp = ZwyciężyÅ‚a drużyna [accent]{0}[]! -highscore = [accent] Nowy rekord! +gameover.waiting = [accent]Oczekiwanie na nastÄ™pnÄ… mapÄ™... +highscore = [accent]Nowy rekord! copied = Skopiowano. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Ta część gry nie jest jeszcze ukoÅ„czona +indev.campaign = [accent]UdaÅ‚o ci siÄ™ zakoÅ„czyć kampaniÄ™![]\n\nZawartość koÅ„czy siÄ™ na tym. Podróż miÄ™dzyplanetarna zostanie dodana w przyszÅ‚ych aktualizacjach. load.sound = DźwiÄ™ki load.map = Mapy @@ -38,6 +41,14 @@ be.ignore = Zignoruj be.noupdates = Nie znaleziono aktualizacji. be.check = Sprawdź aktualizacje +mod.featured.dialog.title = PrzeglÄ…darka Modów +mods.browser.selected = Wybrany Mod +mods.browser.add = Zainsta-\nluj Moda +mods.browser.reinstall = Przeins-\ntaluj +mods.github.open = Otwórz w GitHub'ie +mods.browser.sortdate = Sortuj wg ostatnich +mods.browser.sortstars = Sortuj wg gwiazdek + schematic = Schemat schematic.add = Zapisz schemat... schematics = Schematy @@ -55,7 +66,9 @@ schematic.saved = Schemat zapisany. schematic.delete.confirm = Ten schemat zostanie usuniÄ™ty. schematic.rename = ZmieÅ„ nazwÄ™ schematu schematic.info = {0}x{1}, {2} bloków +schematic.disabled = [scarlet]Schematy sÄ… wyłączone[]\nNie możesz używać schematów na tej [accent]mapie[] lub [accent]serwerze. +stats = Statystyki stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -65,7 +78,7 @@ stat.delivered = Surowce wystrzelone: stat.playtime = Czas Gry:[accent] {0} stat.rank = Ocena: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]Wszystkie przedmioty map.delete = JesteÅ› pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Wybrany poziom @@ -79,6 +92,7 @@ joingame = Dołącz Do Gry customgame = WÅ‚asna Gra newgame = Nowa Gra none = +none.found = [lightgray]<żaden znaleziony> minimap = Minimapa position = Pozycja close = Zamknij @@ -99,25 +113,27 @@ committingchanges = Zatwierdzanie Zmian done = Gotowe feature.unsupported = Twoje urzÄ…dzenie nie wspiera tej funkcji. -mods.alphainfo = PamiÄ™taj, że mody sÄ… wersji alpha, i[scarlet] mogÄ… być peÅ‚ne błędów[].\nZgÅ‚aszaj wszystkie znalezione problemy na Mindustry GitHub lub Discord. -mods.alpha = [scarlet](Alpha) +mods.initfailed = [red]âš [] Inicjalizacja poprzedniej instancji Mindustry nie powiodÅ‚a siÄ™. Najprawdopodobniej byÅ‚o to spowodowane niewÅ‚aÅ›ciwym dziaÅ‚aniem modów.\n\nAby zapobiec pÄ™tli awarii, [red]wszystkie mody zostaÅ‚y wyłączone.[]\n\nAby wyłączyć tÄ™ funkcjÄ™, należy wyłączyć jÄ… w ustawieniach [accent]Ustawienia->Gra->Wyłącz mody w przypadku awarii podczas uruchamiania[]. mods = Mody mods.none = [lightgray]Nie znaleziono modów! mods.guide = Poradnik do modów mods.report = ZgÅ‚oÅ› Błąd mods.openfolder = Otwórz folder z modami +mods.viewcontent = View Content mods.reload = PrzeÅ‚aduj -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Gra zostanie teraz zamkniÄ™ta, aby ponownie zaÅ‚adować mody. +mod.installed = [[Installed] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony +mod.multiplayer.compatible = [gray]Kompatybilny z trybem wieloosobowym mod.disable = Wyłącz -mod.content = Content: +mod.content = Zawartość: mod.delete.error = Nie udaÅ‚o siÄ™ usunąć moda. Plik może być w użyciu. mod.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]Niekompatybilne z wersjÄ… v6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]BrakujÄ…ce zależnoÅ›ci: {0} -mod.erroredcontent = [scarlet]Content Errors +mod.erroredcontent = [scarlet]Błędy ZawartoÅ›ci mod.errors = WystÄ…piÅ‚ błąd podczas Å‚adowania treÅ›ci. mod.noerrorplay = [scarlet]Twoje mody zawierajÄ… błędy.[] Wyłącz je lub napraw błędy przed rozpoczÄ™ciem gry. mod.nowdisabled = [scarlet]Brakuje zależnoÅ›ci dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba Å›ciÄ…gnąć te mody.\nMod zostanie automatycznie wyłączony. @@ -127,7 +143,7 @@ mod.reloadrequired = [scarlet]Wymagany restart mod.import = Importuj Mod mod.import.file = Importuj Plik mod.import.github = Importuj mod z GitHuba -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]Mody JAR sÄ… niebezpieczne.[]\nUpewnij siÄ™, że importujesz ten mod z dobrze znanego źródÅ‚a! mod.item.remove = Ten przedmiot jest częściÄ… moda[accent] '{0}'[]. Aby usunąć go, odinstaluj modyfikacjÄ™. mod.remove.confirm = Ten mod zostanie usuniÄ™ty. mod.author = [lightgray]Autor:[] {0} @@ -139,23 +155,27 @@ mod.scripts.disable = Twoje urzÄ…dzenie nie wspiera modów ze skryptami. Musisz about.button = O Grze name = Nazwa: noname = Najpierw wybierz[accent] nazwÄ™ gracza[]. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Mapa Planety +launchcore = Wystrzel RdzeÅ„ filename = Nazwa Pliku: unlocked = Odblokowano nowÄ… zawartość! +available =Nowe Odkrycie dostÄ™pne completed = [accent]UkoÅ„czony -techtree = Drzewo Technologiczne +techtree = Drzewo Techno-\nlogiczne +research.legacy = Znaleziono badania z wersji [accent]5.0[].\nChcesz [accent]zaÅ‚adować je[], czy [accent]usunąć[] dane z drzewa technologicznego w nowej kampanii (zalecane)? +research.load = ZaÅ‚aduj +research.discard = Odrzuć research.list = [lightgray]Badania: -research = Badaj +research = Badania researched = [lightgray]{0} zbadane. -research.progress = {0}% complete +research.progress = {0}% ukoÅ„czone players = {0} graczy players.single = {0} gracz -players.search = search +players.search = wyszukaj players.notfound = [gray]nie znaleziono graczy -server.closing = [accent] Zamykanie serwera... +server.closing = [accent]Zamykanie serwera... server.kicked.kick = ZostaÅ‚eÅ› wyrzucony z serwera! -server.kicked.whitelist = Nie ma ciÄ™ tu na biaÅ‚ej liÅ›cie. +server.kicked.whitelist = Nie jesteÅ› na biaÅ‚ej liÅ›cie. server.kicked.serverClose = Serwer zostaÅ‚ zamkniÄ™ty. server.kicked.vote = ZostaÅ‚eÅ› wyrzucony z gry. Å»egnaj. server.kicked.clientOutdated = Nieaktualna gra! ZaktualizujÄ… jÄ…! @@ -171,11 +191,11 @@ server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobi server.kicked.gameover = Koniec gry! server.kicked.serverRestarting = Restart serwera. server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[] -host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[]. \nKażdy w tej samej sieci [lightgray]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeÅ›li chcesz, aby każdy z twoim IP mógÅ‚ dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[lightgray]Notka: JeÅ›li ktokolwiek ma problem z dołączeniem do gry lokalnej, upewnij siÄ™, że udostÄ™pniÅ‚eÅ› Mindustry dostÄ™p do sieci w ustawieniach zapory (firewall). Zauważ, że niektóre sieci publiczne mogÄ… nie zezwalać na wykrycie serwerów. -join.info = Tutaj możesz wpisać [accent]adres IP serwera[] aby do niego dołączyć lub wyszukać [accent]serwery w lokalnej sieci[], do których możesz dołączyć.\nGra wieloosobowa na LAN i WAN jest wspierana.\n\n[lightgray]Notka: Nie ma automatycznej listy wszystkich serwerów; jeÅ›li chcesz dołączyć przez IP, musisz zapytać hosta o jego IP, które można znaleźć po wpisaniu "my ip" w przeglÄ…darce na urzÄ…dzeniu hosta. +host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[]. \nKażdy w tej samej sieci [lightgray]wifi lub hotspocie[] powinien zobaczyć twój serwer na ich liÅ›cie serwerów.\n\nJeÅ›li chcesz, aby każdy z twoim IP mógÅ‚ dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[lightgray]Notka: JeÅ›li ktokolwiek ma problem z dołączeniem do gry lokalnej, upewnij siÄ™, że udostÄ™pniÅ‚eÅ› Mindustry dostÄ™p do sieci w ustawieniach zapory (firewall). Zauważ, że niektóre sieci publiczne mogÄ… nie zezwalać na wykrycie serwerów. +join.info = Tutaj możesz wpisać [accent]adres IP serwera[] aby do niego dołączyć lub wyszukać [accent]serwery w lokalnej sieci[] lub wyszukać [accent]publiczne[] serwery, do których możesz dołączyć.\nGra wieloosobowa na LAN i WAN jest wspierana.\n\n[lightgray]JeÅ›li chcesz dołączyć przez IP, musisz zapytać hosta o jego IP, które można znaleźć po wpisaniu "my ip" w przeglÄ…darce na urzÄ…dzeniu hosta. hostserver = Stwórz Serwer invitefriends = ZaproÅ› Znajomych -hostserver.mobile = Hostuj\nGrÄ™ +hostserver.mobile = Hostuj GrÄ™ host = Hostuj hosting = [accent]Otwieranie serwera... hosts.refresh = OdÅ›wież @@ -189,13 +209,20 @@ servers.local = Serwery Lokalne servers.remote = Serwery Zdalne servers.global = Serwery Publiczne +servers.disclaimer = Serwery spoÅ‚ecznoÅ›ci [accent]nie sÄ…[] w posiadaniu ani nie moderuje nimi twórca gry.\n\nSerwery mogÄ… posiadać zawartość stworzonÄ… przez graczy, która może być nieodpowiednia dla wszystkich grup wiekowych. +servers.showhidden = Pokaż Ukryte Serwery +server.shown = Pokazane +server.hidden = Ukryte + trace = Zlokalizuj Gracza trace.playername = Nazwa gracza: [accent]{0} trace.ip = IP: [accent]{0} trace.id = WyjÄ…tkowe ID: [accent]{0} trace.mobile = Klient Mobilny: [accent]{0} trace.modclient = Zmodowany klient: [accent]{0} -invalidid = ZÅ‚e ID klienta! UdostÄ™pnij raport błędu. +trace.times.joined = DołączyÅ‚: [accent]{0}[] razy +trace.times.kicked = Wyrzucony: [accent]{0}[] razy +invalidid = ZÅ‚e ID klienta! WyÅ›lij raport błędu. server.bans = Bany server.bans.none = Nie znaleziono zbanowanych osób! server.admins = Admini @@ -208,11 +235,11 @@ server.outdated.client = [crimson]PrzestarzaÅ‚y klient![] server.version = [gray]Wersja: {0} server.custombuild = [accent]Zmodowany klient confirmban = JesteÅ› pewny, że chcesz zbanować "{0}[white]"? -confirmkick = JesteÅ› pewny, że chcesz wyrzucić {0}[white]"? -confirmvotekick = JesteÅ› pewny, że chcesz gÅ‚osować za wyrzuceniem {0}[white]"? +confirmkick = JesteÅ› pewny, że chcesz wyrzucić "{0}[white]"? +confirmvotekick = JesteÅ› pewny, że chcesz gÅ‚osować za wyrzuceniem "{0}[white]"? confirmunban = JesteÅ› pewny, że chcesz odbanować tego gracza? -confirmadmin = JesteÅ› pewny, że chcesz dać rangÄ™ admina {0}[white]"? -confirmunadmin = JesteÅ› pewny, że chcesz zabrać rangÄ™ admina {0}[white]"? +confirmadmin = JesteÅ› pewny, że chcesz dać rangÄ™ administratora "{0}[white]"? +confirmunadmin = JesteÅ› pewny, że chcesz zabrać rangÄ™ administratora "{0}[white]"? joingame.title = Dołącz do gry joingame.ip = IP: disconnect = Rozłączono. @@ -222,6 +249,7 @@ disconnect.timeout = Przekroczono limit czasu. disconnect.data = Nie udaÅ‚o siÄ™ zaÅ‚adować mapy! cantconnect = Nie można dołączyć do gry ([accent]{0}[]). connecting = [accent]ÅÄ…czenie... +reconnecting = [accent]Ponowne łączenie... connecting.data = [accent]Åadowanie danych Å›wiata... server.port = Port: server.addressinuse = Adres jest już w użyciu! @@ -237,8 +265,8 @@ save.delete = UsuÅ„ save.export = Eksportuj save.import.invalid = [accent]Zapis gry jest niepoprawny! save.import.fail = [crimson]Nie udaÅ‚o siÄ™ zaimportować zapisu: [accent]{0} -save.export.fail = [crimson]Nie można wyeksportować zapisu: [accent]{0} -save.import = Importuj Zapis +save.export.fail = [crimson]Nie udaÅ‚o siÄ™ wyeksportować zapisu: [accent]{0} +save.import = Importuj zapis save.newslot = Zapisz nazwÄ™: save.rename = ZmieÅ„ nazwÄ™ save.rename.text = Nowa nazwa: @@ -252,50 +280,61 @@ off = Wyłączone save.autosave = Autozapis: {0} save.map = Mapa: {0} save.wave = Fala {0} -save.mode = Tryb Gry: {0} -save.date = Ostatnio Zapisane: {0} +save.mode = Tryb gry: {0} +save.date = Ostatnio zapisane: {0} save.playtime = Czas gry: {0} -warning = Uwaga +warning = Uwaga. confirm = Potwierdź delete = UsuÅ„ view.workshop = Pokaż w Warsztacie workshop.listing = Edytuj pozycjÄ™ w Warsztacie ok = OK open = Otwórz -customize = Dostosuj +customize = Dostosuj zasady cancel = Anuluj openlink = Otwórz Link copylink = Kopiuj Link back = Wróć +max = Max +crash.export = Eksportuj Logi Błędów +crash.none = Nie znaleziono logów błędów. +crash.exported = Logi zostaÅ‚y wyeksportowane. data.export = Eksportuj Dane data.import = Importuj Dane -data.openfolder = Otwórz folder danych +data.openfolder = Otwórz Folder Danych data.exported = Dane wyeksportowane. data.invalid = NieprawidÅ‚owe dane gry. -data.import.confirm = Zaimportowanie zewnÄ™trznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostanÄ… zimportowane, gra automatycznie siÄ™ wyłączy. +data.import.confirm = Zaimportowanie zewnÄ™trznych danych nadpisze[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostanÄ… zaimportowane, gra automatycznie siÄ™ wyłączy. quit.confirm = Czy na pewno chcesz wyjść? quit.confirm.tutorial = JesteÅ› pewien?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[] loading = [accent]Åadowanie... -reloading = [accent]PrzeÅ‚adowywanie Modów... +reloading = [accent]PrzeÅ‚adowywanie modów... saving = [accent]Zapisywanie... -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][] by odrodzić siÄ™ w rdzeniu cancelbuilding = [accent][[{0}][] by wyczyÅ›cić plan selectschematic = [accent][[{0}][] by wybrać+skopiować pausebuilding = [accent][[{0}][] by wstrzymać budowÄ™ resumebuilding = [scarlet][[{0}][] by kontynuować budowÄ™ +enablebuilding = [scarlet][[{0}][] wznów budowÄ™ +showui = Interfejs ukryty.\nNaciÅ›nij [accent][[{0}][] by go pokazać. wave = [accent]Fala {0} -wave.waiting = Fala za {0} +wave.cap = [accent]Fala {0}/{1} +wave.waiting = [lightgray]Fala za {0} wave.waveInProgress = [lightgray]Fala w trakcie waiting = [lightgray]Oczekiwanie... waiting.players = Oczekiwanie na graczy... wave.enemies = PozostaÅ‚o [lightgray]{0} wrogów +wave.enemycores = [accent]{0}[lightgray] Rdzeni Wroga +wave.enemycore = [accent]{0}[lightgray] RdzeÅ„ Wroga wave.enemy = PozostaÅ‚ [lightgray]{0} wróg +wave.guardianwarn = Strażnik nadejdzie za [accent]{0}[] fale. +wave.guardianwarn.one = Strażnik nadejdzie za [accent]{0}[] fale. loadimage = ZaÅ‚aduj Obraz saveimage = Zapisz Obraz unknown = Nieznane custom = WÅ‚asne builtin = Wbudowane -map.delete.confirm = JesteÅ› pewny, że chcesz usunąć tÄ™ mapÄ™? Nie bÄ™dzie można jej przywrócić. +map.delete.confirm = JesteÅ› pewny, że chcesz usunąć tÄ™ mapÄ™? Nie bÄ™dzie można jej przywrócić! map.random = [accent]Losowa Mapa map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [accent]pomaraÅ„czowy[] rdzeÅ„ do tej mapy w edytorze. map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli siÄ™ zrespić przeciwnicy! Dodaj[scarlet] inny niż pomaraÅ„czowy[] rdzeÅ„ do mapy w edytorze. @@ -309,7 +348,7 @@ workshop.info = Informacja o pozycji changelog = Historia aktualizacji (opcjonalna): eula = Umowa Użytkownika KoÅ„cowego (EULA) Steam missing = Ta pozycja zostaÅ‚a przeniesiona bÄ…dź usuniÄ™ta.\n[lightgray]Pozycja na Warsztacie zostaÅ‚a automatycznie odłączona. -publishing = [accent]Trwa publikowanie... +publishing = [accent]Publikowanie... publish.confirm = Czy jesteÅ› pewien, że chcesz to opublikować?\n\n[lightgray]Najpierw upewnij siÄ™, że zgadzasz siÄ™ z umowÄ… EULA Warsztatu, w przeciwnym razie twoje pozycje nie bÄ™dÄ… widoczne! publish.error = Błąd podczas publikowania pozycji: {0} steam.error = Nie udaÅ‚o siÄ™ zainicjować serwisów Steam.\nBłąd: {0} @@ -328,16 +367,16 @@ editor.generation = Generacja: editor.ingame = Edytuj w Grze editor.publish.workshop = Opublikuj w Warsztacie editor.newmap = Nowa Mapa +editor.center = WyÅ›rodkuj workshop = Warsztat waves.title = Fale waves.remove = UsuÅ„ -waves.never = waves.every = co waves.waves = fal(e) waves.perspawn = co pojawienie -waves.shields = shields/wave +waves.shields = tarcze/fala waves.to = do -waves.guardian = Guardian +waves.guardian = Strażnik waves.preview = PodglÄ…d waves.edit = Edytuj... waves.copy = Kopiuj Do Schowka @@ -346,9 +385,10 @@ waves.invalid = NieprawidÅ‚owe fale w schowku. waves.copied = Fale zostaÅ‚y skopiowane. waves.none = Brak zdefiniowanych wrogów.\nPamiÄ™taj, że puste ukÅ‚ady fal zostanÄ… automatycznie zastÄ…pione ukÅ‚adem domyÅ›lnym. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#these are intentionally in lower case +wavemode.counts = liczba +wavemode.totals = sumy +wavemode.health = życie editor.default = [lightgray] details = Detale... @@ -386,10 +426,10 @@ editor.export = Eksportuj... editor.exportfile = Eksportuj Plik editor.exportfile.description = Eksportuj plik mapy editor.exportimage = Eksportuj Obraz Terenu -editor.exportimage.description = Eksportuj plik obrazu terenu +editor.exportimage.description = Eksportuj plik obrazu zawierajÄ…cy tylko podstawowy teren editor.loadimage = ZaÅ‚aduj Teren editor.saveimage = Zapisz Teren -editor.unsaved = [scarlet]Masz niezapisane zmiany![]\nCzy na pewno chcesz wyjść? +editor.unsaved = Czy na pewno chcesz wyjść?[]\n[scarlet]Wszelkie niezapisane zmiany zostanÄ… utracone. editor.resizemap = ZmieÅ„ Rozmiar Mapy editor.mapname = Nazwa Mapy: editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejÄ…cej mapy. @@ -416,6 +456,7 @@ filters.empty = [lightgray]Brak filtrów! Dodaj jeden za pomocÄ… przycisku poni filter.distort = ZnieksztaÅ‚canie filter.noise = Szum filter.enemyspawn = Wybierz spawn przeciwnika +filter.spawnpath = Droga Do Spawnu filter.corespawn = Wybierz rdzeÅ„ filter.median = Mediana filter.oremedian = Mediana Rud @@ -440,6 +481,7 @@ filter.option.amount = Ilość filter.option.block = Blok filter.option.floor = PodÅ‚oga filter.option.flooronto = PodÅ‚oga Docelowa +filter.option.target = Cel filter.option.wall = Åšciana filter.option.ore = Ruda filter.option.floor2 = Druga PodÅ‚oga @@ -456,6 +498,8 @@ load = Wczytaj save = Zapisz fps = FPS: {0} ping = Ping: {0}ms +memory = Pam: {0}mb +memory2 = Pam:\n {0}mb +\n {1}mb language.restart = Uruchom grÄ™ ponownie, aby nowo ustawiony jÄ™zyk zaczÄ…Å‚ funkcjonować. settings = Ustawienia tutorial = Poradnik @@ -464,43 +508,34 @@ editor = Edytor mapeditor = Edytor Map abandon = Opuść -abandon.text = Ta strefa i wszystkie jej surowce bÄ™dÄ… przejÄ™te przez przeciwników. +abandon.text = Ta strefa i wszystkie jej surowce zostanÄ… przejÄ™te przez przeciwników. locked = Zablokowane complete = [lightgray]UkoÅ„czone: requirement.wave = OsiÄ…gnij falÄ™ {0} w {1} -requirement.core = Zniszcz RdzeÅ„ wroga w {0} -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Kontynuuj StrefÄ™:\n[lightgray]{0} -bestwave = [lightgray]Najwyższa fala: {0} -launch = < WYSTRZEL > -launch.text = Launch -launch.title = Wystrzelenie udane -launch.next = [lightgray]NastÄ™pna okazja przy fali {0} -launch.unable2 = [scarlet]WYSTRZELENIE niedostÄ™pne.[] -launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie bÄ™dziesz mógÅ‚ wrócić do tej bazy. -launch.skip.confirm = JeÅ›li teraz przejdziesz do kolejnej fali, nie bÄ™dziesz miaÅ‚ możliwoÅ›ci wystrzelenia do czasu pokonania dalszych fal. +requirement.core = Zniszcz rdzeÅ„ wroga w {0} +requirement.research = Zbadaj {0} +requirement.produce = Produkcja {0} +requirement.capture = ZdobÄ…dź {0} +launch.text = Wystrzel +research.multiplayer = Tylko host może odkrywać przedmoty. +map.multiplayer = Tylko host może widzieć sektory uncover = Odkryj configure = Skonfiguruj Åadunek -loadout = Loadout -resources = Resources + +loadout = Åadunek +resources = Zasoby bannedblocks = Zabronione bloki addall = Dodaj wszystkie -launch.destination = Destination: {0} +launch.from = Wystrzelony z: [accent]{0} +launch.destination = Cel: {0} configure.invalid = Ilość musi być liczbÄ… pomiÄ™dzy 0 a {0}. -zone.unlocked = [lightgray]Strefa {0} odblokowana. -zone.requirement.complete = Fala {0} osiÄ…gniÄ™ta:\n{1} Wymagania strefy zostaÅ‚y speÅ‚nione. -zone.resources = [lightgray]Wykryte Zasoby: -zone.objective = [lightgray]Cel: [accent]{0} -zone.objective.survival = Przeżyj -zone.objective.attack = Zniszcz RdzeÅ„ Wroga add = Dodaj... -boss.health = Zdrowie Bossa +boss.health = Zdrowie Strażnika 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.unreachable = Serwer niedostÄ™pny.\nSprawdź, czy adres jest wpisany poprawnie. error.invalidaddress = Niepoprawny adres. -error.timedout = Przekroczono limit czasu!\nUpewnij siÄ™, że host ma ustawione przekierowanie portu oraz poprawność wpisanego adresu! +error.timedout = Przekroczono limit czasu!\nUpewnij siÄ™, że host ma ustawione przekierowanie portu oraz sprawdź poprawność wpisanego adresu! error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij siÄ™, że ty i host macie najnowszÄ… wersjÄ™ Mindustry! error.alreadyconnected = JesteÅ› już połączony. error.mapnotfound = Plik mapy nie zostaÅ‚ znaleziony! @@ -508,20 +543,50 @@ error.io = Błąd sieciowy I/O. error.any = Nieznany błąd sieci. error.bloom = Nie udaÅ‚o siÄ™ zaÅ‚adować bloom.\nTwoje urzÄ…dzenie może nie wspierać tej funkcji. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Deszcz +weather.snow.name = Åšnieg +weather.sandstorm.name = Burza piaskowa +weather.sporestorm.name = Burza zarodników +weather.fog.name = MgÅ‚a -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]Niezbadane +sectors.resources = Zasoby: +sectors.production = Produkcja: +sectors.export = Eksport: +sectors.time = Czas: +sectors.threat = Zagrożenie: +sectors.wave = Fala: +sectors.stored = Zmagazynowane: +sectors.resume = Kontynuuj +sectors.launch = Wystrzel +sectors.select = Wybierz +sectors.nonelaunch = [lightgray]żaden (sÅ‚oÅ„ce) +sectors.rename = ZmieÅ„ NazwÄ™ Sektora +sectors.enemybase = [scarlet]Baza Wroga +sectors.vulnerable = [scarlet]Wrażliwy +sectors.underattack = [scarlet] Jest Atakowany! [accent]{0}% uszkodzono +sectors.survives = [accent]Przeżywa {0} fal +sectors.go = Idź +sector.curcapture = Sektor Podbity +sector.curlost = Sektor Stracony +sector.missingresources = [scarlet]NiewystarczajÄ…ce Zasoby Rdzenia +sector.attacked = Sektor [accent]{0}[white] jest atakowany! +sector.lost = Sektor [accent]{0}[white] zostaÅ‚ stracony! +#note: the missing space in the line below is intentional +sector.captured = Sektor [accent]{0}[white]zostaÅ‚ podbity! +threat.low = Niski +threat.medium = Åšredni +threat.high = Wysoki +threat.extreme = Ekstremalny +threat.eradication = Czystka + +planets = Planety + +planet.serpulo.name = Serpulo +planet.sun.name = SÅ‚oÅ„ce + +sector.impact0078.name = Uderzenie 0078 sector.groundZero.name = Punkt Zerowy sector.craters.name = Kratery sector.frozenForest.name = Zamrożony Las @@ -533,18 +598,27 @@ sector.overgrowth.name = PrzeroÅ›niÄ™ty Las sector.tarFields.name = Pola SmoÅ‚owe sector.saltFlats.name = Solne Równiny sector.fungalPass.name = Grzybowa Przełęcz +sector.biomassFacility.name = Obiekt Syntezy Biomasy +sector.windsweptIslands.name = Wyspy Wiatru +sector.extractionOutpost.name = Placówka Ekstrakcji +sector.planetaryTerminal.name = Planetarny Terminal Startowy sector.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. -sector.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. -sector.saltFlats.description = Na obrzeżach pustyni spoczywajÄ… Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazÄ™ skÅ‚adujÄ…cÄ… surowce. Zniszcz ich rdżeÅ„. Zniszcz wszystko co stanie ci na drodze. +sector.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 prÄ…du. Buduj generatory spalinowe. Naucz siÄ™ korzystać z naprawiaczy. +sector.saltFlats.description = Na obrzeżach pustyni spoczywajÄ… Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazÄ™ skÅ‚adujÄ…cÄ… surowce. Zniszcz ich rdzeÅ„. Zniszcz wszystko co stanie ci na drodze. sector.craters.description = W tym kraterze zebraÅ‚a siÄ™ woda. PozostaÅ‚ość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkÅ‚o. Pompuj wodÄ™ do dziaÅ‚ek obronnych i wierteÅ‚ by je schÅ‚odzić sector.ruinousShores.description = Za pustkowiami ciÄ…gnie siÄ™ linia brzegowa. KiedyÅ› znajdowaÅ‚a siÄ™ tu przybrzeżna linia obronna. Niewiele z niej zostaÅ‚o. OstaÅ‚y siÄ™ tylko podstawowe struktury obronne, z reszty zostaÅ‚ tylko zÅ‚om.\nKontynuuj eksploracje. Odkryj pozostawionÄ… tu technologiÄ™. -sector.stainedMountains.description = W głębi lÄ…du leżą góry, jeszcze nieskażone przez zarodniki.\nWydobÄ…dź obfity tytan w tym obszarze. Dowiedz siÄ™, jak z niego korzystać.\n\nObecność wroga jest tutaj wiÄ™ksza. Nie daj im czasu na wysÅ‚anie swoich najsilniejszych jednostek. +sector.stainedMountains.description = W głębi lÄ…du leżą góry, jeszcze nieskażone przez zarodniki.\nWydobÄ…dź bogate zÅ‚oża tytanu w tym obszarze. Dowiedz siÄ™, jak z niego korzystać.\n\nObecność wroga jest tutaj wiÄ™ksza. Nie daj im czasu na wysÅ‚anie swoich najsilniejszych jednostek. sector.overgrowth.description = Obszar ten jest zaroÅ›niÄ™ty, bliżej źródÅ‚a zarodników.\nWróg zaÅ‚ożyÅ‚ tu placówkÄ™. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano. sector.tarFields.description = Obrzeża strefy produkcji ropy, miÄ™dzy górami a pustyniÄ…. Jeden z niewielu obszarów z rezerwami użytecznej smoÅ‚y.\nMimo że ta strefa jest opuszczona, w pobliżu znajdujÄ… siÄ™ niebezpieczne siÅ‚y wroga. Nie lekceważ ich.\n\n[lightgray]JeÅ›li to możliwe, zbadaj technologiÄ™ przetwarzania oleju. sector.desolateRift.description = Strefa wyjÄ…tkowo niebezpieczna. Obfita w zasoby ale maÅ‚o miejsca. Wysokie ryzyko zniszczenia. Opuść tÄ™ strefe jak najszybciej. Nie daj siÄ™ zwieść dÅ‚ugiemu odstÄ™powi miÄ™dzy atakami wroga. sector.nuclearComplex.description = Dawny zakÅ‚ad produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej iloÅ›ci, nieustannie poszukuje napastników. -sector.fungalPass.description = PrzejÅ›ciowy obszar pomiÄ™dzy wysokimi górami a nisko znajdujÄ…cymi siÄ™, ogarniÄ™tymi przez zarodniki równinami. Znajduje siÄ™ tu maÅ‚a postawiona przez wrogów baza zwiadowcza.\nZniszcz jÄ….\nUżyj jednostek Nóż i PeÅ‚zak. Zniszcz oba rdzenie. +sector.fungalPass.description = PrzejÅ›ciowy obszar pomiÄ™dzy wysokimi górami a nisko znajdujÄ…cymi siÄ™, ogarniÄ™tymi przez zarodniki, równinami. Znajduje siÄ™ tu maÅ‚a, postawiona przez wrogów, baza zwiadowcza.\nZniszcz jÄ….\nUżyj jednostek Nóż i PeÅ‚zak. Zniszcz oba rdzenie. +sector.biomassFacility.description = Miejsce powstania zarodników. TutaÅ‚ byÅ‚y badane i poczÄ…tkowo produkowane.\nZbadaj zawartÄ… w nim technologiÄ™. Hoduj zarodniki dla paliwa i tworzyw sztucznych.\n\n[lightgray]Po upadku tej placówki zarodniki zostaÅ‚y uwolnione. Nic w lokalnym ekosystemie nie mogÅ‚o konkurować z tak inwazyjnym organizmem. +sector.windsweptIslands.description = Dalej za liniÄ… brzegowÄ… znajduje siÄ™ ten odlegÅ‚y Å‚aÅ„cuch wysp. Zapisy wykazujÄ…, że byÅ‚y tu struktury produkujÄ…ce [accent]Plastan[].\n\nOdeprzyj morskie jednostki wroga. Załóż bazÄ™ na wyspach. Odkryj te fabryki. +sector.extractionOutpost.description = OdlegÅ‚a placówka zbudowana przez wroga w celu wystrzeliwania zasobów do innych sektorów.\n\nDo dalszych podbojów niezbÄ™dna jest miÄ™dzysektorowa technologia transportu. Zniszcz bazÄ™. Zbadaj ich Wyrzutnie. +sector.impact0078.description = Tutaj leżą pozostaÅ‚oÅ›ci miÄ™dzygwiezdnego statku transportowego, który jako pierwszy wszedÅ‚ do tego ukÅ‚adu.\n\nWydobÄ…dź jak najwiÄ™cej z wraku. Zbadaj każdÄ… nienaruszonÄ… technologiÄ™. +sector.planetaryTerminal.description = Ostatni cel.\n\nTa baza przybrzeżna zawiera strukturÄ™ zdolnÄ… do wyrzucania rdzeni na lokalne planety. Jest wyjÄ…tkowo dobrze strzeżona.\n\nProdukuj jednostki morskie. Jak najszybciej wyeliminuj wroga. Zbadaj tÄ… strukturÄ™. settings.language = JÄ™zyk settings.data = Dane Gry @@ -557,77 +631,115 @@ settings.sound = DźwiÄ™k settings.graphics = Grafika settings.cleardata = Wyczyść Dane Gry... settings.clear.confirm = Czy jesteÅ› pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! -settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciÅ›niesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy siÄ™. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisami, drzewem technologicznym, mapami, ustawieniami i przypisanymi klawiszami.\nKiedy naciÅ›niesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy siÄ™. +settings.clearsaves.confirm = JesteÅ› pewny że chcesz usunąć wszystkie zapisy? +settings.clearsaves = UsuÅ„ Zapisy +settings.clearresearch = UsuÅ„ PostÄ™p Drzewa Tech. +settings.clearresearch.confirm = JesteÅ› pewny że chcesz usunąć caÅ‚y postÄ™p drzewa technologicznego? +settings.clearcampaignsaves = UsuÅ„ Zapisy Kampanii +settings.clearcampaignsaves.confirm = JesteÅ› pewny że chcesz usunąć wszystkie zapisy kampanii? paused = [accent]< Wstrzymano > clear = Wyczyść banned = [scarlet]Zbanowano -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = Tak no = Nie info.title = Informacje error.title = [crimson]WystÄ…piÅ‚ błąd error.crashtitle = WystÄ…piÅ‚ błąd unit.nobuild = [scarlet]Jednostka nie może budować -blocks.input = WejÅ›cie -blocks.output = WyjÅ›cie -blocks.booster = Wzmacniacz -blocks.tiles = Wymagane Pola -blocks.affinities = Uwydajnienie +lastaccessed = [lightgray]Ostatnia interakcja: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Pojemność mocy -blocks.powershot = moc/strzaÅ‚ -blocks.damage = Obrażenia -blocks.targetsair = Namierzanie wrogów powietrznych -blocks.targetsground = Namierzanie wrogów lÄ…dowych -blocks.itemsmoved = PrÄ™dkość poruszania siÄ™ -blocks.launchtime = Czas pomiÄ™dzy wystrzeleniami -blocks.shootrange = ZasiÄ™g -blocks.size = Rozmiar -blocks.displaysize = Display Size -blocks.liquidcapacity = Pojemność cieczy -blocks.powerrange = Zakres mocy -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Maksymalna ilość połączeÅ„ -blocks.poweruse = Zużycie prÄ…du -blocks.powerdamage = Moc/Zniszczenia -blocks.itemcapacity = Pojemność przedmiotów -blocks.basepowergeneration = Podstawowa generacja mocy -blocks.productiontime = Czas produkcji -blocks.repairtime = Czas peÅ‚nej naprawy bloku -blocks.speedincrease = ZwiÄ™kszenie prÄ™dkoÅ›ci -blocks.range = ZasiÄ™g -blocks.drilltier = Co może wykopać -blocks.drillspeed = Podstawowa szybkość kopania -blocks.boosteffect = Efekt wzmocnienia -blocks.maxunits = Maksymalna ilość jednostek -blocks.health = Zdrowie -blocks.buildtime = Czas budowy -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Koszt budowy -blocks.inaccuracy = Niecelność -blocks.shots = StrzaÅ‚y -blocks.reload = Strzałów/sekundÄ™ -blocks.ammo = Amunicja -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = Opis +stat.input = WejÅ›cie +stat.output = WyjÅ›cie +stat.booster = Wzmacniacz +stat.tiles = Wymagane Pola +stat.affinities = Uwydajnienie +stat.powercapacity = Pojemność mocy +stat.powershot = moc/strzaÅ‚ +stat.damage = Obrażenia +stat.targetsair = Namierza wrogów powietrznych +stat.targetsground = Namierza wrogów lÄ…dowych +stat.itemsmoved = PrÄ™dkość poruszania siÄ™ +stat.launchtime = Czas pomiÄ™dzy wystrzeleniami +stat.shootrange = ZasiÄ™g +stat.size = Rozmiar +stat.displaysize = Wielkość WyÅ›wietlania +stat.liquidcapacity = Pojemność cieczy +stat.powerrange = Zakres mocy +stat.linkrange = OdlegÅ‚ość połączeÅ„ +stat.instructions = Instrukcje +stat.powerconnections = Maksymalna ilość połączeÅ„ +stat.poweruse = Zużycie prÄ…du +stat.powerdamage = Moc/Zniszczenia +stat.itemcapacity = Pojemność przedmiotów +stat.memorycapacity = Pojemość PamiÄ™ci +stat.basepowergeneration = Podstawowa generacja mocy +stat.productiontime = Czas produkcji +stat.repairtime = Czas peÅ‚nej naprawy bloku +stat.weapons = Bronie +stat.bullet = Pocisk +stat.speedincrease = ZwiÄ™kszenie prÄ™dkoÅ›ci +stat.range = ZasiÄ™g +stat.drilltier = Co może wykopać +stat.drillspeed = Podstawowa szybkość kopania +stat.boosteffect = Efekt wzmocnienia +stat.maxunits = Maksymalna ilość jednostek +stat.health = Zdrowie +stat.armor = Pancerz +stat.buildtime = Czas budowy +stat.maxconsecutive = Maksymalnie Kolejny +stat.buildcost = Koszt budowy +stat.inaccuracy = NiedokÅ‚adność +stat.shots = StrzaÅ‚y +stat.reload = Strzałów/SekundÄ™ +stat.ammo = Amunicja +stat.shieldhealth = Å»ycie Tarczy +stat.cooldowntime = Czas Odnowienia +stat.explosiveness = Wybuchowość +stat.basedeflectchance = Bazowa Szansa Na Odbicie +stat.lightningchance = Szansa Na BÅ‚yskawicÄ™ +stat.lightningdamage = Obrażenia BÅ‚yskawic +stat.flammability = Palność +stat.radioactivity = Radioaktywność +stat.charge = Charge +stat.heatcapacity = Pojemność Cieplna +stat.viscosity = Lepkość +stat.temperature = Temperatura +stat.speed = PrÄ™dkość +stat.buildspeed = PrÄ™dkość Budowy +stat.minespeed = PrÄ™dkość Wydobycia +stat.minetier = StopieÅ„ Wydobycia +stat.payloadcapacity = Åadowność +stat.commandlimit = Limit ZarzÄ…danych Jednostek +stat.abilities = UmiejÄ™tnoÅ›ci +stat.canboost = Może przyspieszyć +stat.flying = Może latać +stat.ammouse = Zużycie Amunicji + +ability.forcefield = Pole Mocy +ability.repairfield = Pole Naprawy +ability.statusfield = Pole Statusu +ability.unitspawn = Fabryka Jednostek {0} +ability.shieldregenfield = Strefa Tarczy RegenerujÄ…cej +ability.movelightning = Pioruny Poruszania bar.drilltierreq = Wymagane Lepsze WiertÅ‚o -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Brak Zasobów +bar.corereq = Wymagany RdzeÅ„ bar.drillspeed = PrÄ™dkość wiertÅ‚a: {0}/s bar.pumpspeed = PrÄ™dkość pompy: {0}/s bar.efficiency = Efektywność: {0}% +bar.boost = Przyspieszenie: {0}% bar.powerbalance = Moc: {0} bar.powerstored = Zmagazynowano: {0}/{1} bar.poweramount = Moc: {0} bar.poweroutput = WyjÅ›cie mocy: {0} +bar.powerlines = Połączenia: {0}/{1} bar.items = Przedmiotów: {0} bar.capacity = Pojemność: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = PÅ‚yn bar.heat = CiepÅ‚o bar.power = PrÄ…d @@ -635,19 +747,27 @@ bar.progress = PostÄ™p Budowy bar.input = WejÅ›cie bar.output = WyjÅ›cie +units.processorcontrol = [lightgray]Kontrolowany przez procesor + bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.incendiary = [stat]zapalajÄ…cy +bullet.sapping = [stat]wyczerpujÄ…cy bullet.homing = [stat]naprowadzajÄ…cy bullet.shock = [stat]piorunowy bullet.frag = [stat]fragmentacyjny +bullet.buildingdamage = [stat]{0}%[lightgray] obrażeÅ„ budynkom bullet.knockback = [stat]{0}[lightgray] odrzut +bullet.pierce = [stat]{0}[lightgray]x przebicia +bullet.infinitepierce = [stat]przebijajÄ…cy +bullet.healpercent = [stat]{0}[lightgray]% leczenia bullet.freezing = [stat]zamrażajÄ…cy bullet.tarred = [stat]smolny bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji bullet.reload = [stat]{0}[lightgray]x szybkość ataku unit.blocks = bloki +unit.blockssquared = bloki² unit.powersecond = jednostek prÄ…du na sekundÄ™ unit.liquidsecond = jednostek pÅ‚ynu na sekundÄ™ unit.itemssecond = przedmiotów na sekundÄ™ @@ -660,38 +780,43 @@ unit.persecond = /sekundÄ™ unit.perminute = /min unit.timesspeed = x prÄ™dkość unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = życie tarczy unit.items = przedmioty unit.thousands = tys. unit.millions = mln -unit.billions = b +unit.billions = mld +unit.pershot = /strzaÅ‚ +category.purpose = Opis category.general = Główne category.power = PrÄ…d category.liquids = PÅ‚yny category.items = Przedmioty category.crafting = Przetwórstwo -category.shooting = Strzelanie +category.function = Funkcja category.optional = Dodatkowe ulepszenia setting.landscape.name = Zablokuj tryb panoramiczny setting.shadows.name = Cienie setting.blockreplace.name = Automatyczne sugestie bloków -setting.linear.name = Filtrowanie Liniowe +setting.linear.name = Filtrowanie liniowe setting.hints.name = Podpowiedzi -setting.flow.name = WyÅ›wietl szybkość przepÅ‚ywu zasobów[scarlet] (eksperymentalne) +setting.logichints.name = Wskazówki dot. logiki +setting.flow.name = WyÅ›wietl szybkość przepÅ‚ywu zasobów +setting.backgroundpause.name = Wstrzymaj w tle setting.buildautopause.name = Automatycznie zatrzymaj budowanie -setting.mapcenter.name = Auto Center Map To Player +setting.doubletapmine.name = Kliknij podwójnie, aby wydobywać +setting.modcrashdisable.name = Wyłącz mody w przypadku awarii podczas uruchamiania setting.animatedwater.name = Animowana woda setting.animatedshields.name = Animowana tarcza setting.antialias.name = Antyaliasing[lightgray] (wymaga restartu)[] -setting.playerindicators.name = Znaczniki Graczy -setting.indicators.name = Znaczniki Przyjaciół -setting.autotarget.name = Automatyczne Celowanie +setting.playerindicators.name = Znaczniki graczy +setting.indicators.name = Znaczniki przyjaciół +setting.autotarget.name = Automatyczne celowanie setting.keyboard.name = Sterowanie - Myszka+Klawiatura setting.touchscreen.name = Sterowanie - Ekran Dotykowy setting.fpscap.name = Maksymalny FPS setting.fpscap.none = Nieograniczone setting.fpscap.text = {0} FPS -setting.uiscale.name = Skalowanie Interfejsu[lightgray] (wymaga restartu)[] +setting.uiscale.name = Skalowanie interfejsu[lightgray] (wymaga restartu)[] setting.swapdiagonal.name = Pozwala na ukoÅ›nÄ… budowÄ™ setting.difficulty.training = Treningowy setting.difficulty.easy = Åatwy @@ -707,61 +832,61 @@ setting.conveyorpathfinding.name = Ustalanie Å›cieżki przenoÅ›ników setting.sensitivity.name = CzuÅ‚ość kontrolera setting.saveinterval.name = InterwaÅ‚ automatycznego zapisywania setting.seconds = {0} sekund -setting.blockselecttimeout.name = Block Select Timeout setting.milliseconds = {0} milisekund setting.fullscreen.name = PeÅ‚ny ekran setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu) setting.fps.name = Pokazuj FPS oraz ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Pokazuj skróty klawiszowe bloków +setting.smoothcamera.name = PÅ‚ynna kamera setting.vsync.name = Synchronizacja pionowa setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje) -setting.minimap.name = Pokaż MinimapÄ™ -setting.coreitems.name = Display Core Items (WIP) +setting.minimap.name = Pokaż minimapÄ™ +setting.coreitems.name = Pokazuj przedmoty w rdzeniu setting.position.name = Pokazuj poÅ‚ożenie gracza setting.musicvol.name = GÅ‚oÅ›ność muzyki -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = Pokazuj atmosferÄ™ planety setting.ambientvol.name = GÅ‚oÅ›ność otoczenia setting.mutemusic.name = Wycisz muzykÄ™ setting.sfxvol.name = GÅ‚oÅ›ność dźwiÄ™ków setting.mutesound.name = Wycisz dźwiÄ™ki setting.crashreport.name = WysyÅ‚aj anonimowo dane o crashu gry -setting.savecreate.name = Automatyczne tworzenie zapisu -setting.publichost.name = Widoczność Gry Publicznej -setting.playerlimit.name = Limit Graczy +setting.savecreate.name = Automatyczne tworzenie zapisów +setting.publichost.name = Widoczność gry publicznej +setting.playerlimit.name = Limit graczy setting.chatopacity.name = Przezroczystość czatu setting.lasersopacity.name = Przezroczystość laserów zasilajÄ…cych setting.bridgeopacity.name = Przezroczystość mostów -setting.playerchat.name = WyÅ›wietlaj czat w grze +setting.playerchat.name = WyÅ›wietlaj dymek czatu w grze +setting.showweather.name = Pokaż pogodÄ™ public.confirm = Czy chcesz ustawić swojÄ… grÄ™ jako publicznÄ…?\n[accent]Każdy bÄ™dzie mógÅ‚ dołączyć do Twojej gry.\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej. +public.confirm.really = JeÅ›li chcesz zagrać ze znajomymi, użyj opcji [green]ZaproÅ› Znajomych[] zamiast [scarlet]Publiczny serwer[]!\nJesteÅ› pewny że chcesz rozpocząć grÄ™ [scarlet]publicznÄ…[]? public.beta = Wersje beta gry nie mogÄ… tworzyć publicznych pokoi. uiscale.reset = Skala interfejsu ulegÅ‚a zmianie.\nNaciÅ›nij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjÅ›cie z gry za[accent] {0}[] -uiscale.cancel = Anuluj i Wyjdź +uiscale.cancel = Anuluj i wyjdź setting.bloom.name = Efekt Bloom keybind.title = ZmieÅ„ keybinds.mobile = [scarlet]WiÄ™kszość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie siÄ™ jest wspierane. category.general.name = Ogólne category.view.name = WyÅ›wietl category.multiplayer.name = Wielu graczy -category.blocks.name = Block Select +category.blocks.name = Wybierz Blok command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj -command.idle = Idle +command.idle = Nieaktywny placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.respawn.name = Odrodzenie +keybind.control.name = Kontroluj jednostkÄ™ keybind.clear_building.name = Wyczyść budynek keybind.press = NaciÅ›nij wybrany klawisz... keybind.press.axis = NaciÅ›nij oÅ› lub klawisz... keybind.screenshot.name = Zrzut ekranu mapy keybind.toggle_power_lines.name = ZmieÅ„ widoczność linii energetycznych -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_block_status.name = Przełączanie MiÄ™dzy Statusami Bloków keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie keybind.mouse_move.name = Podążaj Za MyszÄ… -keybind.pan.name = Pan View -keybind.boost.name = Boost +keybind.pan.name = Widok Panoramiczny +keybind.boost.name = Przyspiesz keybind.schematic_select.name = Wybierz region keybind.schematic_menu.name = Menu schematów keybind.schematic_flip_x.name = Obróć schemat horyzontalnie @@ -788,24 +913,27 @@ keybind.diagonal_placement.name = Budowa po skosie keybind.pick.name = Wybierz Blok keybind.break_block.name = Zniszcz Blok keybind.deselect.name = Odznacz -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = PodnieÅ› Åadunek +keybind.dropCargo.name = Opuść Åadunek +keybind.command.name = Rozkazuj keybind.shoot.name = Strzelanie keybind.zoom.name = Przybliżanie keybind.menu.name = Menu keybind.pause.name = Pauza keybind.pause_building.name = Wstrzymaj/kontynuuj budowÄ™ keybind.minimap.name = Minimapa +keybind.planet_map.name = Mapa Planety +keybind.research.name = Odkryj keybind.chat.name = Czat keybind.player_list.name = Lista graczy keybind.console.name = Konsola keybind.rotate.name = Obracanie -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotateplaced.name = Obracanie bloku pod kursorem (przytrzymaj) keybind.toggle_menus.name = Zmiana widocznoÅ›ci menu keybind.chat_history_prev.name = PrzewiÅ„ wiadomoÅ›ci w górÄ™ keybind.chat_history_next.name = PrzewiÅ„ wiadomoÅ›ci w dół keybind.chat_scroll.name = Przewijaj WiadomoÅ›ci +keybind.chat_mode.name = ZmieÅ„ tryb czatu keybind.drop_unit.name = Wyrzucanie przedmiot keybind.zoom_minimap.name = PowiÄ™kszenie mapy mode.help.title = Opis trybów @@ -818,46 +946,54 @@ mode.pvp.name = PvP mode.pvp.description = Walcz przeciwko innym graczom.\n[gray]Wymaga co najmniej dwóch rdzeni o róźnych kolorach na mapie, aby móc grać w tym trybie mode.attack.name = Atak mode.attack.description = Brak fal. Celem jest zniszczenie bazy przeciwnika.\n[gray]Wymaga czerwonego rdzenia na mapie, aby móc grać w tym trybie. -mode.custom = WÅ‚asny tryb +mode.custom = WÅ‚asny Tryb -rules.infiniteresources = NieskoÅ„czone zasoby -rules.reactorexplosions = Eksplozje reaktorów -rules.wavetimer = Zegar fal +rules.infiniteresources = NieskoÅ„czone Zasoby +rules.reactorexplosions = Eksplozje Reaktorów +rules.coreincinerates = RdzeÅ„ Spala Nadmarowe Przedmioty +rules.schematic = Zezwalaj na schematy +rules.wavetimer = Zegar Fal rules.waves = Fale -rules.attack = Tryb ataku -rules.buildai = AI Building -rules.enemyCheat = NieskoÅ„czone zasoby komputera-przeciwnika (czerwonego zespoÅ‚u) -rules.blockhealthmultiplier = Mnożnik życia bloków -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Mnożnik prÄ™dkoÅ›ci tworzenia jednostek -rules.unithealthmultiplier = Mnożnik życia jednostek -rules.unitdamagemultiplier = Mnożnik obrażeÅ„ jednostek -rules.enemycorebuildradius = ZasiÄ™g blokady budowy przy rdzeniu wroga:[lightgray] (kratki) -rules.wavespacing = OdstÄ™py miÄ™dzy falami:[lightgray] (sek) -rules.buildcostmultiplier = Mnożnik kosztów budowania -rules.buildspeedmultiplier = Mnożnik prÄ™dkoÅ›ci budowania +rules.attack = Tryb Ataku +rules.buildai = SI Może Budować +rules.enemyCheat = NieskoÅ„czone Zasoby SI (czerwonego zespoÅ‚u) +rules.blockhealthmultiplier = Mnożnik Å»ycia Bloków +rules.blockdamagemultiplier = Mnożnik UszkodzeÅ„ Bloków +rules.unitbuildspeedmultiplier = Mnożnik PrÄ™dkoÅ›ci Tworzenia Jednostek +rules.unithealthmultiplier = Mnożnik Å»ycia Jednostek +rules.unitdamagemultiplier = Mnożnik ObrażeÅ„ jednostek +rules.unitcapvariable = Rdzenie majÄ… wpÅ‚yw na limit jednostek +rules.unitcap = Podstawowy limit jednostek +rules.enemycorebuildradius = ZasiÄ™g Blokady Budowy Przy Rdzeniu Wroga:[lightgray] (kratki) +rules.wavespacing = OdstÄ™py MiÄ™dzy Falami:[lightgray] (sek) +rules.buildcostmultiplier = Mnożnik Kosztów Budowania +rules.buildspeedmultiplier = Mnożnik PrÄ™dkoÅ›ci Budowania rules.deconstructrefundmultiplier = Mnożnik Zwrotu Dekonstrukcji -rules.waitForWaveToEnd = Fale czekajÄ… na przeciwników -rules.dropzoneradius = ZasiÄ™g strefy zrzutu:[lightgray] (kratki) -rules.unitammo = Units Require Ammo +rules.waitForWaveToEnd = Fale CzekajÄ… Na Przeciwników +rules.dropzoneradius = ZasiÄ™g Strefy Zrzutu:[lightgray] (kratki) +rules.unitammo = Jednostki PotrzebujÄ… Amunicji rules.title.waves = Fale rules.title.resourcesbuilding = Zasoby i Budowanie rules.title.enemy = Przeciwnicy rules.title.unit = Jednostki rules.title.experimental = Eksperymentalne -rules.title.environment = Environment +rules.title.environment = Otoczenie rules.lighting = OÅ›wietlenie -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = OtaczajÄ…ce ÅšwiatÅ‚o -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.enemyLights = Wrogowie EmitujÄ… ÅšwiatÅ‚o +rules.fire = OgieÅ„ +rules.explosions = Uszkodzenia Wybuchu Bloku/Jednostki +rules.ambientlight = OtaczajÄ…ce\nÅšwiatÅ‚o +rules.weather = Pogoda +rules.weather.frequency = CzÄ™stotliwość: +rules.weather.always = Zawsze +rules.weather.duration = Czas trwania: content.item.name = Przedmioty content.liquid.name = PÅ‚yny content.unit.name = Jednostki content.block.name = Klocki +content.sector.name = Sektory + item.copper.name = Miedź item.lead.name = Ołów item.coal.name = WÄ™giel @@ -879,39 +1015,22 @@ liquid.slag.name = Å»użel liquid.oil.name = Ropa liquid.cryofluid.name = Lodociecz -item.explosiveness = [lightgray]Wybuchowość: {0} -item.flammability = [lightgray]Palność: {0} -item.radioactivity = [lightgray]Promieniotwórczość: {0} - -unit.health = [lightgray]Zdrowie: {0} -unit.speed = [lightgray]PrÄ™dkość: {0} -unit.weapon = [lightgray]BroÅ„: {0} -unit.itemcapacity = [lightgray]Pojemność przedmiotów: {0} -unit.minespeed = [lightgray]PrÄ™dkość kopania: {0}% -unit.minepower = [lightgray]Moc kopania: {0} -unit.ability = [lightgray]UmiejÄ™tność: {0} -unit.buildspeed = [lightgray]PrÄ™dkość budowania: {0}% - -liquid.heatcapacity = [lightgray]WytrzymaÅ‚ość na przegrzewanie: {0} -liquid.viscosity = [lightgray]Lepkość: {0} -liquid.temperature = [lightgray]Temperatura: {0} - -unit.dagger.name = Nóż +unit.dagger.name = Dagger unit.mace.name = Mace -unit.fortress.name = Forteca +unit.fortress.name = Fortress unit.nova.name = Nova unit.pulsar.name = Pulsar unit.quasar.name = Quasar -unit.crawler.name = PeÅ‚zak +unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid unit.toxopid.name = Toxopid -unit.flare.name = BÅ‚ysk -unit.horizon.name = Horyzont -unit.zenith.name = Zenit +unit.flare.name = Flare +unit.horizon.name = Horizon +unit.zenith.name = Zenith unit.antumbra.name = Antumbra -unit.eclipse.name = Zaćmienie +unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega @@ -930,28 +1049,30 @@ unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Resupply Point +block.resupply-point.name = Punkt UzupeÅ‚nienia block.parallax.name = Parallax block.cliff.name = Klif block.sand-boulder.name = Piaskowy GÅ‚az +block.basalt-boulder.name = Bazaltowy GÅ‚az block.grass.name = Trawa block.slag.name = Å»użel +block.space.name = Kosmos block.salt.name = Sól -block.salt-wall.name = Salt Wall +block.salt-wall.name = Åšciana Solna block.pebbles.name = Kamyki -block.tendrils.name = Wić -block.sand-wall.name = Sand Wall +block.tendrils.name = PnÄ…cza +block.sand-wall.name = Piaskowa Åšciana block.spore-pine.name = Sosna Zarodnikowa -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Zarodinkowa Åšciana +block.boulder.name = GÅ‚az +block.snow-boulder.name = Åšnieżny GÅ‚az block.snow-pine.name = Sosna Å›niegowa block.shale.name = Åupek block.shale-boulder.name = GÅ‚az Åupkowy block.moss.name = Mech block.shrubs.name = Krzewy block.spore-moss.name = Mech Zarodnikowy -block.shale-wall.name = Shale Wall +block.shale-wall.name = Åšciana z Åupku block.scrap-wall.name = Åšciana ze ZÅ‚omu block.scrap-wall-large.name = Duża Åšciana ze ZÅ‚omu block.scrap-wall-huge.name = Ogromna Åšciana ze ZÅ‚omu @@ -979,24 +1100,25 @@ block.craters.name = Kratery block.sand-water.name = Woda z Piaskiem block.darksand-water.name = Woda z Ciemnym Piaskiem block.char.name = Popiół -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = Dacyt +block.dacite-wall.name = Dacytowa Åšciana +block.dacite-boulder.name = Dacytowy GÅ‚az block.ice-snow.name = Lodowy Åšnieg -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = Kamienna Åšciana +block.ice-wall.name = Lodowa Åšciana +block.snow-wall.name = Åšnieżna Åšciana +block.dune-wall.name = Wydmowa Åšciana block.pine.name = Sosna -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud -block.white-tree-dead.name = BiaÅ‚e Drzewo Martwe +block.dirt.name = Ziemia +block.dirt-wall.name = Ziemna Åšciana +block.mud.name = BÅ‚oto +block.white-tree-dead.name = BiaÅ‚e Martwe Drzewo block.white-tree.name = BiaÅ‚e Drzewo block.spore-cluster.name = Skupisko Zarodników block.metal-floor.name = Metalowa PodÅ‚oga block.metal-floor-2.name = Metalowa PodÅ‚oga 2 block.metal-floor-3.name = Metalowa PodÅ‚oga 3 -block.metal-floor-5.name = Metalowa PodÅ‚oga 5 +block.metal-floor-5.name = Metalowa PodÅ‚oga 4 block.metal-floor-damaged.name = Uszkodzona Metalowa PodÅ‚oga block.dark-panel-1.name = Ciemny Panel 1 block.dark-panel-2.name = Ciemny Panel 2 @@ -1005,9 +1127,9 @@ block.dark-panel-4.name = Ciemny Panel 4 block.dark-panel-5.name = Ciemny Panel 5 block.dark-panel-6.name = Ciemny Panel 6 block.dark-metal.name = Ciemny Metal -block.basalt.name = Basalt +block.basalt.name = Bazalt block.hotrock.name = GorÄ…cy KamieÅ„ -block.magmarock.name = SkaÅ‚a magmowa +block.magmarock.name = SkaÅ‚a Magmowa block.copper-wall.name = Miedziana Åšciana block.copper-wall-large.name = Duża Miedziana Åšciana block.titanium-wall.name = Tytanowa Åšciana @@ -1029,7 +1151,6 @@ block.conveyor.name = PrzenoÅ›nik block.titanium-conveyor.name = PrzenoÅ›nik Tytanowy block.plastanium-conveyor.name = PrzenoÅ›nik Plastanowy block.armored-conveyor.name = PrzenoÅ›nik Opancerzony -block.armored-conveyor.description = PrzesyÅ‚a przedmioty z takÄ… samÄ… szybkoÅ›ciÄ… jak PrzenoÅ›nik Tytanowy, ale jest bardziej odporny. WejÅ›ciami bocznymi mogÄ… być tylko inne przenoÅ›niki. block.junction.name = WÄ™zeÅ‚ block.router.name = Rozdzielacz block.distributor.name = Dystrybutor @@ -1037,7 +1158,6 @@ block.sorter.name = Sortownik block.inverted-sorter.name = Odwrotny Sortownik block.message.name = Wiadomość block.illuminator.name = Illuminator -block.illuminator.description = MaÅ‚e, kompaktowe i konfigurowane źródÅ‚o Å›wiatÅ‚a. Wymaga energii do funkcjonowania. block.overflow-gate.name = Brama PrzepeÅ‚nieniowa block.underflow-gate.name = Brama Niedomiaru block.silicon-smelter.name = Huta Krzemu @@ -1075,6 +1195,7 @@ block.power-source.name = ŹródÅ‚o prÄ…du block.unloader.name = Ekstraktor block.vault.name = Magazyn block.wave.name = StrumieÅ„ +block.tsunami.name = Tsunami block.swarmer.name = DziaÅ‚o Rojowe block.salvo.name = DziaÅ‚o Salwowe block.ripple.name = DziaÅ‚o Falowe @@ -1114,31 +1235,38 @@ block.arc.name = Piorun block.rtg-generator.name = Generator RTG block.spectre.name = Huragan block.meltdown.name = Rozpad +block.foreshadow.name = Foreshadow block.container.name = Kontener block.launch-pad.name = Wyrzutnia block.launch-pad-large.name = Duża Wyrzutnia block.segment.name = Segment -block.command-center.name = Command Center +block.command-center.name = Centrum Dowodzenia block.ground-factory.name = Fabryka Naziemna block.air-factory.name = Fabryka Powietrzna block.naval-factory.name = Fabryka Morska block.additive-reconstructor.name = Rekonstruktor Addytywny block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatywny block.exponential-reconstructor.name = Rekonstruktor WykÅ‚adniczy -block.tetrative-reconstructor.name = Tetrative Reconstructor +block.tetrative-reconstructor.name = Rekonstruktor Tetratywny block.payload-conveyor.name = PrzenoÅ›nik Masowy block.payload-router.name = Rozdzielacz Åadunku -block.disassembler.name = Dezasembler -block.silicon-crucible.name = Silicon Crucible +block.disassembler.name = RozkÅ‚adacz +block.silicon-crucible.name = Tygiel Krzemu block.overdrive-dome.name = KopuÅ‚a Pola Overdrive +#experimental, may be removed +block.block-forge.name = Piec Bloków +block.block-loader.name = Åadownik Bloków +block.block-unloader.name = Opróżniacz Bloków +block.interplanetary-accelerator.name = Przyspieszacz MiÄ™dzyplanetarny -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Przełącznik +block.micro-processor.name = Mikroprocesor +block.logic-processor.name = Procesor Logiczny +block.hyper-processor.name = Hiperprocesor +block.logic-display.name = WyÅ›wietlacz Logiczny +block.large-logic-display.name = Duży WyÅ›wietlacz Logiczny +block.memory-cell.name = Komórka PamiÄ™ci +block.memory-bank.name = Bank PamiÄ™ci team.blue.name = niebieski team.crux.name = czerwony @@ -1148,54 +1276,81 @@ team.derelict.name = szary team.green.name = zielony team.purple.name = fioletowy -tutorial.next = [lightgray] -tutorial.intro = WszedÅ‚eÅ› do[scarlet] Samouczka Mindustry.[]\nUżyj [accent][[WASD][], aby poruszyć siÄ™.\n[accent]Przytrzymaj [[Ctrl] podczas przewijania[], aby przybliżyć i oddalić widok.\nZacznij od[accent] wydobycia miedzi[]. W tym celu przybliż siÄ™, a nastÄ™pnie dotknij żyÅ‚y rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź -tutorial.intro.mobile = WszedÅ‚eÅ› do[scarlet] Samouczka Mindustry.[]\nPrzesuÅ„ palcem po ekranie, aby poruszyć siÄ™.\n[accent]Użyj dwóch palcy[], aby przybliżyć i oddalić widok.\nZacznij od[accent] wydobycia miedzi[]. W tym celu przybliż siÄ™, a nastÄ™pnie dotknij żyÅ‚y rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź -tutorial.drill = Wydobywanie rÄ™czne nie jest efektywne.\n[accent]WiertÅ‚a []mogÄ… kopać automatycznie.\nKliknij zakÅ‚adkÄ™ wiertÅ‚a w prawym dolnym rogu.\nWybierz[accent] wiertÅ‚o mechaniczne[]. Umieść go na zÅ‚ożu miedzi, klikajÄ…c.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować. -tutorial.drill.mobile = Wydobywanie rÄ™czne jest nieefektywne.\n[accent]WiertÅ‚a []mogÄ… kopać automatycznie.\nDotknij zakÅ‚adkÄ™ wiertÅ‚a w prawym dolnym rogu.\nWybierz[accent] wiertÅ‚o mechaniczne[].\nUmieść go na zÅ‚ożu miedzi poprzez StukniÄ™cie, potem wciÅ›nij[accent] ptaszek[] na dole by potwierdzić wybór.\nNaciÅ›nij przycisk[accent] X[] by anulować budowe. -tutorial.blockinfo = Każdy blok ma inne statystyki. Każde wiertÅ‚o może kopać tylko wybrane rudy.\nBy sprawdzić informacje i statystyki bloku,[accent] kliknij przycisk "?" podczas jego wyboru w menu budowy.[]\n\n[accent]Sprawdź teraz statystyki mechanicznego wiertÅ‚a.[] -tutorial.conveyor = [accent]PrzenoÅ›nik[] jest używany do transportowania przedmiotów do rdzenia.\nStwórz linie przenoÅ›ników z wierteÅ‚ do rdzenia.\n[accent]Przytrzymaj przycisk myszy by poÅ‚ożyć w linii.[]\nPrzytrzymaj[accent] CTRL[] podczas wybierania linii, by budować po skosie.\n\n[accent]{0}/{1} PrzenoÅ›niki poÅ‚ożone w linii\n[accent]0/1 Przedmioty dostarczone -tutorial.conveyor.mobile = [accent]PrzenoÅ›nik[] jest używany do transportowania przedmiotów do rdzenia.\nStwórz linie przenoÅ›ników z wierteÅ‚ do rdzenia.\n[accent] Zbuduj w linii poprzez przytrzymanie palcem przez moment[] i przesuniÄ™cie w którymÅ› kierunku.\n\n[accent]{0}/{1} PrzenoÅ›niki poÅ‚ożone w linii\n[accent]0/1 Przedmioty dostarczone -tutorial.turret = Kiedy przedmiot dociera do rdzenia, może zostać użyty do budowy.\nPamiÄ™taj że nie każdy przedmiot może zostać użyty do budowy.\nprzedmioty które nie sÄ… używane do budowy, takie jak[accent] WÄ™giel[] lub[accent] zÅ‚om[], nie moga zostać wprowadzone do rdzenia.\nStruktury obronne muszÄ… zostać zbudowane by odeprzeć[lightgray] wroga[].\nZbuduj[accent] podwójne dziaÅ‚ko[] niedaleko swojej bazy. -tutorial.drillturret = Podwójne dziaÅ‚ka wymagajÄ…[accent] miedzianej amunicji []do strzelania.\nPołóż wiertÅ‚o obok dziaÅ‚ka.\nPoprowadź przenoÅ›niki do dziaÅ‚ek by zaopatrzyć je w miedź.\n\n[accent]Amunicja dostarczona: 0/1 -tutorial.pause = Podczas gry, możesz[accent] zatrzymać grÄ™.[]\nMożesz ustalić kolejkÄ™ budowy podczas pauzy.\n\n[accent]NaciÅ›nij spacje by zapauzować. -tutorial.pause.mobile = Podczas gry, możesz[accent] zatrzymać grÄ™.[]\nMożesz ustalić kolejkÄ™ budowy podczas pauzy.\n\n[accent]NacniÅ›nij przycisk w lewym górnym rogu by zapauzować. -tutorial.unpause = Teraz znowu naciÅ›nij spacje by odpauzować. -tutorial.unpause.mobile = NaciÅ›nij go znowu by odpauzować. -tutorial.breaking = Bloki czÄ™sto wymagajÄ… rozbiórki.\n[accent]Przytrzymaj prawy przcisk myszy[] by niszczyć wszystkie wybrane bloki.[]\n\n[accent]Zniszcz wszystkie bloki zÅ‚omu na lewo od twojego rdzenia używajÄ…c selekcji obszarowej. -tutorial.breaking.mobile = Bloki czÄ™sto wymagajÄ… rozbiórki.\n[accent]Wybierz tryb dekonstrukcji[], a nastÄ™pnie dotknij blok by zacząć go niszczyć.\nZdekonstruuj obszarowo poprzez przytrzymanie palcem przez moment[] i przesuniÄ™cie go w jakimÅ› kierunku.\nNaciÅ›nij przycisk ptaszka by potwierdzić rozbiórkÄ™.\n\n[accent]Zniszcz wszystkie bloki zÅ‚omu na lewo od twojego rdzenia używajÄ…c selekcji obszarowej. -tutorial.withdraw = Czasami, konieczne jest wyjmowanie przedmiotów prosto z bloków.\nBy tego dokonać, [accent]kliknij blok[] z przedmiotami w nim, potem [accent]kliknij przedmiot[] w inwentarzu.\nMożesz zebrać wiele przedmiotów naraz poprzez [accent]klikniÄ™cie i przytrzymanie[].\n\n[accent]Zabierz trochÄ™ miedzi z rdzenia.[] -tutorial.deposit = Włóż przedmioty do bloków poprzez przeciÄ…gniÄ™cie z twojego statku do danego bloku.\n\n[accent]Włóż miedź z powrotem do rdzenia .[] -tutorial.waves = [lightgray] Wrogowie[] nadchodzÄ….\n\nBroÅ„ swój rdżeÅ„ przez 2 fale.[accent] Kliknij[] by strzelać.\nZbuduj wiecej dziaÅ‚ek i wierteÅ‚. WydobÄ…dź wiÄ™cej miedzi. -tutorial.waves.mobile = [lightgray] Wrogowie[] nadchodzÄ….\n\nBroÅ„ swój rdzeÅ„ przez 2 fale. Twój statek bÄ™dzie automatycznie atakowaÅ‚ wrogów.\nZbuduj wiecej dziaÅ‚ek i wierteÅ‚. WydobÄ…dź wiÄ™cej miedzi. -tutorial.launch = Kiedy dotrzesz do okreÅ›lonej fali, masz możliwość[accent] wystrzelenia rdzenia[], pozostawiajÄ…c struktury obronne za sobÄ… i[accent] otrzymujÄ…c wszystkie surowce znajdujÄ…ce siÄ™ w rdzeniu.[]\nSurowce te mogÄ… potem zostać użyte do odkrywania nowych technologii.\n\n[accent]NaciÅ›nij przycisk WystrzaÅ‚u. +hint.skip = PomiÅ„ +hint.desktopMove = Użyj [accent][[WASD][] by siÄ™ poruszać. +hint.zoom = [accent]Użyj[] by przybliżać lub oddalać obraz. +hint.mine = Zbliż siÄ™ do \uf8c4 rudy miedzi i [accent]kliknij[] by kopać manualnie. +hint.desktopShoot = Kliknij [accent][[Lewy przycisk myszy][] by strzelać. +hint.depositItems = By przenosić przedmoty, przeciÄ…gij je ze swojego statku do rdzenia. +hint.respawn = By siÄ™ odrodzić jako statek, kliknij [accent][[V][]. +hint.respawn.mobile = PrzełączyÅ‚eÅ› siÄ™ na innÄ… jednoskÄ™/strukturÄ™. By odrodzić siÄ™ jako statek, [accent]kliknij w awatar w lewym górnym rogu.[] +hint.desktopPause = NaciÅ›nij [accent][[SpacjÄ™][] by zatrzymać lub wznowić grÄ™. +hint.placeDrill = Wybierz \ue85e [accent]WiertÅ‚o[] w menu w prawym dolnym rogu, i wybierz wtedy \uf870 [accent]WiertÅ‚o[] i kliknij na miedzi by je postawić. +hint.placeDrill.mobile = Wybierz zakÅ‚adkÄ™ z \ue85e[accent]WiertÅ‚em[] w menu w prawym dolnym rogu, i wtedy wybierz \uf870 [accent]WietÅ‚o[] i kliknij na miedzi by je postawić.\n\nNaciÅ›nij \ue800 [accent]znak potwierdzenia[] w dolnym prawym rogu by potwierdzić. +hint.placeConveyor = PrzenoÅ›niki mogÄ… przenosić przedmioty z wierteÅ‚. Wybierz \uf896 [accent]PrzenoÅ›nik[] z zakÅ‚adki \ue814 [accent]Dystrybucja[].\n\nKliknij i przeciÄ…gnij by poÅ‚ożyć wiele przeciÄ…gników.\n[accent]PrzewiÅ„[] by obrócić. +hint.placeConveyor.mobile = PrzenoÅ›niki mogÄ… przenosić przedmioty z wierteÅ‚. Wybierz \uf896 [accent]PrzenoÅ›nik[] z zakÅ‚adki \ue814 [accent]Dystrybucja[].\n\nPrzytrzymaj palcem i przeciÄ…gij by poÅ‚ożyć wiele przeciÄ…gników. +hint.placeTurret = Postaw \uf861 [accent]DziaÅ‚ka[] by bronić siÄ™ przed wrogami.\n\nDziaÅ‚ka potzebujÄ… amunicji - w tym wypadku, \uf838copper.\nUżyj przenoÅ›ników i wierteÅ‚ by je naÅ‚adować. +hint.breaking = Użyj [accent]Prawego przycisku myszy[] i przeciÄ…gnij by zniszczyć bloki. +hint.breaking.mobile = Aktywuj \ue817 [accent]ikonÄ™ mÅ‚ota[] w dolnym prawym rogu by zniszczyć bloki.\n\nPrzytrymaj swój palec i przeciÄ…gij by wybrać wiele bloków do zniszczenia. +hint.research = Klikij przycisk \ue875 [accent]BadaÅ„[] by odkrwyać nowe technologie. +hint.research.mobile = Użyj przycisku \ue875 [accent]BadaÅ„[] w \ue88c [accent]Menu[] by odkrywać nowe technologie. +hint.unitControl = Przytrzymaj [accent][[Lewy CTRL][] i [accent]kliknij[], by kontrolować sojusznicze jednostki i dziaÅ‚ka. +hint.unitControl.mobile = [accent][Kliknij dwukrotnie[] by kontrolować sojusznicze jednostki i dziaÅ‚ka. +hint.launch = Gdy zebraÅ‚eÅ› wystarczajÄ…co materiałów możesz [accent]Wystrzelić[] wybierajÄ…c \ue827 [accent]MapÄ™[] w dolnym prawym rogu. +hint.launch.mobile = Gdy zebraÅ‚eÅ› wystarczajÄ…co materiałów możesz [accent]Wystrzelić[] do pobliskich sektorów klikajÄ…c w \ue827 [accent]Mape[] w \ue88c [accent]Menu[]. +hint.schematicSelect = Przytrzymaj [accent][[F][] by kopiować i wkleić bloki.\n\n[accent][[Åšrodkowy przycisk myszy][] kopiuje pojedyÅ„czy blok. +hint.conveyorPathfind = PrzeciÄ…gij i przytrzymaj [accent][[Lewy CTRL][] w trakcie budowania przenoÅ›ników by wygenerować Å›cieżkÄ™. +hint.conveyorPathfind.mobile = Włącz \ue844 [accent]tryb ukoÅ›ny[] i przeciÄ…gnij w trakcie budowania przenoÅ›ników by wygenerować Å›cieżkÄ™. +hint.boost = Przytrzymaj [accent][[Lewy Shift][] by przelecieć ponad przeszkody.\n\nNie wszystkie jednostki tak mogÄ…. +hint.command = Kliknij [accent][[G][] by uksztaÅ‚tować formacje z pobliskich jednostek. +hint.command.mobile = [accent][[Podwójne klikniÄ™cie][] ksztaÅ‚tuje formacje z pobliskich jednostek. +hint.payloadPickup = Kliknij [accent][[[] by podnieść maÅ‚e bloki lub jednostki. +hint.payloadPickup.mobile = [accent]Kliknij i przytrzymaj[] maÅ‚y blok by go podnieść. +hint.payloadDrop = Kliknij [accent]][] by opuÅ›cić podniesiony towar. +hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuÅ›cić podniesiony towar. +hint.waveFire = [accent]StrumieÅ„[] wypeÅ‚niony wodÄ… bÄ™dzie gasić pobiskie pożary. +hint.generator = \uf879 [accent]Generatory Spalinowe[] spalajÄ… wÄ™giel i przekazujÄ… moc do pobliskich bloków.\n\nMożesz powiÄ™kszyć odlegÅ‚ość transmitowanej mocy używająć \uf87f [accent]WÄ™zÅ‚y PrÄ…du[]. +hint.guardian = Jednostki [accent]Strażnicze[] sÄ… uzbrojone. SÅ‚aba amunicja - taka jak [accent]Miedź[] czy [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych dziaÅ‚ek takich jak \uf835 [accent]NaÅ‚adowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć siÄ™ strażników. +hint.coreUpgrade = Rdzenie mogÄ… być ulepszone poprzez [accent]pÅ‚ożenie na nich rdzeÅ„ wyższego poziomu[].\n\nPołóż  rdzeÅ„ [accent]Fundacji[] na ï¡© rdzeÅ„:[accent]OdÅ‚amek[] core. Å»adna przeszkoda ani blok nie może stać na miejscu rdzenia. +hint.presetLaunch = Szare [accent]sektory[], takie jak [accent]Zamrożony Las[], to sektory do których możesz dotrzeć z każdego miejsca. Nie wymagajÄ… podbicia pobliskiego terenu.\n\n[accent]Ponumerowane sektory[], takie jak ten, [accent]sÄ… dodatkowe[]. +hint.coreIncinerate = Jak rdzeÅ„ zostanie w peÅ‚ni wypeÅ‚niony danym przedmiotem, reszta przedmiotów tego typu zostanie [accent]spalona[]. +hint.coopCampaign = Gdy grasz [accent]kooperacyjnÄ… kampaniÄ™[], przedmioty które sÄ… produkowane na mapie trafiÄ… także [accent]do twoich lokalnych sektorów[].\n\nWszelkie nowe badania przeprowadzone przez hosta sÄ… również przenoszone. item.copper.description = Przydatny materiaÅ‚ budowlany. Szeroko używany w prawie każdej konstrukcji. +item.copper.details = Miedź. Nienormalnie obfity metal na Serpulo. Strukturalnie sÅ‚aba, chyba że zostanie wzmocniona. item.lead.description = Podstawowy materiaÅ‚. Używany w przesyle przemiotów i pÅ‚ynów. Nie jest on przypadkiem szkodliwy? +item.lead.details = GÄ™sty. ObojÄ™tny. Intensywnie używany w bateriach. \nUwaga: prawdopodobnie toksyczny dla biologicznych form życia... nie żeby zostaÅ‚o ich tu wiele... item.metaglass.description = WyjÄ…tkowo wytrzymaÅ‚y stop szkÅ‚a. Szeroko używany w transporcie i przechowywaniu pÅ‚ynów. item.graphite.description = Zmineralizowany wÄ™giel, wykorzystywany do amunicji i izolacji elektrycznej. item.sand.description = ZwykÅ‚y materiaÅ‚ używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne. item.coal.description = ZwykÅ‚y i Å‚atwo dostÄ™pny materiaÅ‚ energetyczny. Używany powszechnie jako paliwo oraz w produkcji surowców. +item.coal.details = WyglÄ…da na skamieniałą materiÄ™ roÅ›linnÄ…, uformowanÄ… na dÅ‚ugo przed siewem. item.titanium.description = Rzadki i bardzo lekki materiaÅ‚. Używany w bardzo zaawansowanym przewodnictwie, wiertÅ‚ach i samolotach. Poczuj siÄ™ jak Tytan! item.thorium.description = Zwarty i radioaktywny materiaÅ‚ używany w strukturach i paliwie nuklearnym. Nie trzymaj go w rÄ™kach! item.scrap.description = PozostaÅ‚oÅ›ci starych budynków i jednostek. SkÅ‚ada siÄ™ z maÅ‚ej iloÅ›ci wszystkiego. -item.silicon.description = Niesamowicie przydatny półprzewodnk. Używany w panelach sÅ‚onecznych, skomplikowanej elektronice i pociskach samonaprowadzajÄ…cych. -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.scrap.details = PozostaÅ‚oÅ›ci po jednostkach oraz strukturach. +item.silicon.description = Niesamowicie przydatny półprzewodnik. Używany w panelach sÅ‚onecznych, skomplikowanej elektronice i pociskach samonaprowadzajÄ…cych. +item.plastanium.description = Lekki i plastyczny materiaÅ‚ używany w amunicji odÅ‚amkowej i samolotach. item.phase-fabric.description = Niewiarygodnie lekkie włókno używane w zaawansowanej elektronice i technologii samo-naprawiajÄ…cej item.surge-alloy.description = Zaawansowany materiaÅ‚ z niesÅ‚ychanymi wartoÅ›ciami energetycznymi. item.spore-pod.description = Syntetyczne zarodniki, które mogÄ… być przeksztaÅ‚cone na olej, materiaÅ‚y wybuchowe i paliwo. +item.spore-pod.details = Zarodniki. Prawdopodobnie syntetyczna forma życia. EmitujÄ… gazy toksyczne dla innych organizmów biologicznych. WyjÄ…tkowo inwazyjne. W pewnych warunkach wysoce Å‚atwopalny. item.blast-compound.description = Niestabilny zwiÄ…zek używany w materiaÅ‚ach wybuchowych. Powstaje podczas syntezy z zarodników i innych lotnych substancji. Używanie go jako materiaÅ‚ energetyczny jest niewskazane. 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 = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale skÅ‚adowe, albo wystrzelony w wrogie jednostki i użyty jako broÅ„. -liquid.oil.description = Używany w do produkcji zÅ‚ożonych materiałów. Może zostać przetworzony na wÄ™giel, lub wystrzelony w wrogów przez wieżyczke. -liquid.cryofluid.description = ObojÄ™tna, niekorozyjna ciecz utworzona z wody i tytanu +liquid.water.description = Powszechnie używana do schÅ‚adzania budowli i przetwarzania odpadów. +liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale skÅ‚adowe, albo wystrzelony we wrogie jednostki i użyty jako broÅ„. +liquid.oil.description = Używany w do produkcji zÅ‚ożonych materiałów. Może zostać przetworzony na wÄ™giel, lub wystrzelony we wrogów przez wieżyczke. +liquid.cryofluid.description = ObojÄ™tna, niekorozyjna ciecz utworzona z wody i tytanu. + +block.resupply-point.description = WypeÅ‚nia pobliskie jednostki amunicjÄ… z miedzi. Nie jest kompatybilny z jednostkami, które wykorzystujÄ… energiÄ™ z baterii. +block.armored-conveyor.description = PrzesyÅ‚a przedmioty z takÄ… samÄ… szybkoÅ›ciÄ… jak PrzenoÅ›nik Tytanowy, ale jest bardziej odporny. WejÅ›ciami bocznymi mogÄ… być tylko inne przenoÅ›niki. +block.illuminator.description = MaÅ‚e, kompaktowe i konfigurowane źródÅ‚o Å›wiatÅ‚a. Wymaga energii do funkcjonowania. block.message.description = Przechowuje wiadomość. Wykorzystywane do komunikacji pomiÄ™dzy sojusznikami. block.graphite-press.description = Kompresuje kawaÅ‚ki wÄ™gla w czyste blaszki grafitu. block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prÄ…du do kompresowania wÄ™gla szybko i efektywnie. 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.kiln.description = Stapia ołów i piasek na metaszkÅ‚o. block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu. block.phase-weaver.description = Produkuje Włókna Fazowe z radioaktywnego toru i dużych iloÅ›ci piasku. block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, oÅ‚owiu, krzemu i miedzi. @@ -1211,15 +1366,15 @@ 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.item-void.description = Niszczy wszystkie przedmioty, które idÄ… do tego bloku. 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.liquid-void.description = Usuwa każdÄ… ciecz. DostÄ™pny tylko w trybie sandbox. 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.plastanium-wall.description = Specjajny typ Å›ciany, który pochÅ‚ania Å‚uki elektryczne oraz blokuje automatyczne łączenie wÄ™złów. -block.plastanium-wall-large.description = Specjajny typ Å›ciany, który pochÅ‚ania Å‚uki elektryczne oraz blokuje automatyczne łączenie wÄ™złów.\nObejmuje wiele kratek. +block.plastanium-wall.description = Specjalny typ Å›ciany, który pochÅ‚ania Å‚uki elektryczne oraz blokuje automatyczne łączenie wÄ™złów. +block.plastanium-wall-large.description = Specjalny typ Å›ciany, który pochÅ‚ania Å‚uki elektryczne oraz blokuje automatyczne łączenie wÄ™złów.\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 = Åšciana pokryta specjalnÄ… mieszankÄ… opartÄ… o Włókna Fazowe, która odbija wiÄ™kszość pocisków. @@ -1232,23 +1387,24 @@ block.mender.description = Co jakiÅ› czas naprawia bloki w zasiÄ™gu. Utrzymuje s block.mend-projector.description = Ulepszona wersja Naprawiacza. Naprawia bloki w jego otoczeniu.\nMoże wykorzystywać włókno fazowe, aby zwiÄ™kszyć efektywność budowli. block.overdrive-projector.description = ZwiÄ™ksza szybkość budynków w zasiÄ™gu takich jak wiertÅ‚a czy przenoÅ›niki. Może wykorzystywać włókno fazowe, aby zwiÄ™kszyć zasiÄ™g i efektywność budowli. block.force-projector.description = Wytwarza pole siÅ‚owe w ksztaÅ‚cie szeÅ›ciokÄ…ta wokół siebie, chroniÄ…c budynki i jednostki wewnÄ…trz od obrażeÅ„ zadanych przez pociski. -block.shock-mine.description = Zadaje obrażenia jednostkom wroga którzy na niÄ… wejdÄ…. Ledwo widoczne dla wrogów. +block.shock-mine.description = Zadaje obrażenia jednostkom wroga, które wejdÄ… na niÄ…. Ledwo widoczne dla wrogów. block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Automatycznie przesyÅ‚a przedmioty naprzód do dziaÅ‚ek oraz maszyn. Można obrócić. block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. PrzesyÅ‚a przedmioty szybciej od zwykÅ‚ego przenoÅ›nika. -block.plastanium-conveyor.description = Przenosi przedmity partiami. Przyjmuje przedmioty z tyÅ‚u i rozÅ‚adowuje je w trzech kierunkach z przodu. Wymaga wielu punktów Å‚adujÄ…cych i rozÅ‚adowujÄ…cych w celu osiÄ…gniÄ™cia maksymalnej przepustowoÅ›ci. +block.plastanium-conveyor.description = Przenosi przedmioty partiami. Przyjmuje przedmioty z tyÅ‚u i rozÅ‚adowuje je w trzech kierunkach z przodu. Wymaga wielu punktów Å‚adujÄ…cych i rozÅ‚adowujÄ…cych w celu osiÄ…gniÄ™cia maksymalnej przepustowoÅ›ci. block.junction.description = Używany jako most dla dwóch krzyżujÄ…cych siÄ™ przenoÅ›ników. Przydatne w sytuacjach kiedy dwa różne przenoÅ›niki transportujÄ… różne surowce do różnych miejsc. block.bridge-conveyor.description = Zaawansowany blok transportujÄ…cy. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek. block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii do teleportacji przedmiotów do połączonego transportera fazowego na spore odlegÅ‚oÅ›ci. block.sorter.description = Sortuje przedmioty. JeÅ›li przedmiot pasuje to przechodzi dalej, jeÅ›li nie - to przechodzi na boki. block.inverted-sorter.description = Sortuje przedmioty jak zwykÅ‚y sortownik, ale odpowiednie surowce wyciÄ…gane sÄ… na boki. block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródÅ‚a do wielu celów.\n\n[scarlet]Nigdy nie używaj przy punkcje wejÅ›cia materiałów produkcyjnych, ponieważ zostanÄ… one zatkane przez materiaÅ‚y wyjÅ›ciowe.[] +block.router.details = Konieczne zÅ‚o. Nie zaleca siÄ™ stosowania obok nakÅ‚adów produkcyjnych, ponieważ zostanÄ… one zatkane. block.distributor.description = Zaawansowany rozdzielacz, rozdzielajÄ…cy przedmioty do 7 innych kierunków. block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepeÅ‚niona. block.underflow-gate.description = Odwrotność bramy przepeÅ‚nieniowej, który przepuszcza przedmioty głównÄ… drogÄ…, gdy boczne drogi sÄ… przepeÅ‚nione. block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odlegÅ‚oÅ›ci. block.mechanical-pump.description = Tania pompa o niskiej wydajnoÅ›ci. Nie wymaga prÄ…du. block.rotary-pump.description = Zaawansowana pompa. Pompuje wiÄ™cej cieczy, ale wymaga zasilania. -block.thermal-pump.description = Najlepsza pompa. +block.thermal-pump.description = Najlepsza pompa. Pompuje ogromne iloÅ›ci cieczy, ale wymaga zasilania. block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami. block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje wiÄ™cej niż standardowe rury. block.plated-conduit.description = PrzesyÅ‚a ciecze z takÄ… samÄ… szybkoÅ›ciÄ… co rura tytanowa, ale jest bardziej odporna. WejÅ›ciami bocznymi mogÄ… być tylko inne rury.\nWycieka z niej mniej cieczy. @@ -1270,7 +1426,7 @@ block.differential-generator.description = Generuje duże iloÅ›ci prÄ…du. Wykorz block.rtg-generator.description = Prosty, niezawodny generator. Wykorzystuje ciepÅ‚o powstaÅ‚e z rozpadu izotopów promieniotwórczych. Nie wymaga chÅ‚odzenia, ale produkuje mniej energii od reaktora torowego. block.solar-panel.description = Wytwarza maÅ‚e iloÅ›ci prÄ…du wykorzystujÄ…c energiÄ™ sÅ‚onecznÄ…. block.solar-panel-large.description = Wytwarza o wiele wiÄ™cej prÄ…du niż zwykÅ‚y panel sÅ‚oneczny. -block.thorium-reactor.description = Produkuje bardzo duże iloÅ›ci prÄ…du z wysoce radioaktywnego toru. Wymaga ciÄ…gÅ‚ego chÅ‚odzenia. Silnie eksploduje jeÅ›li nie zostanie dostarczona wystarczajÄ…ca ilość chÅ‚odziwa. Produkcja energii zależy od zapeÅ‚nienia, produkujÄ…c bazowÄ… ilość energii przy caÅ‚kowitym zapeÅ‚nieniu. +block.thorium-reactor.description = Produkuje bardzo duże iloÅ›ci prÄ…du z wysoce radioaktywnego toru. Wymaga ciÄ…gÅ‚ego chÅ‚odzenia. Silnie eksploduje, jeÅ›li nie zostanie dostarczona wystarczajÄ…ca ilość chÅ‚odziwa. Produkcja energii zależy od zapeÅ‚nienia, produkujÄ…c bazowÄ… ilość energii przy caÅ‚kowitym zapeÅ‚nieniu. block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych iloÅ›ci prÄ…du u szczytu swoich możliwoÅ›ci. Wymaga znacznych iloÅ›ci energii do rozpoczÄ™cia procesu. block.mechanical-drill.description = Tanie wiertÅ‚o. Kiedy zostanie zbudowane na odpowiednich polach, wydobywa surowce w wolnym tempie. Może wydobywać tylko podstawowe rudy. block.pneumatic-drill.description = Ulepszone wiertÅ‚o, zdolne do wydobywania tytanu. Wydobywa w szybszym tempie niż wiertÅ‚o mechaniczne. @@ -1278,15 +1434,18 @@ block.laser-drill.description = Pozwala kopać jeszcze szybciej poprzez technolo block.blast-drill.description = Najlepsze wiertÅ‚o. Wymaga dużych iloÅ›ci energii. block.water-extractor.description = Wydobywa wodÄ™ z ziemi. Użyj go, gdy w pobliżu brakuje wody. block.cultivator.description = Uprawia maÅ‚e skupiska zarodników i umieszcza je w gotowych do dalszego przetwarzania kapsuÅ‚ach. +block.cultivator.details = Odzyskana technologia. SÅ‚uży do jak najbardziej wydajnej produkcji ogromnych iloÅ›ci biomasy. Prawdopodobnie poczÄ…tkowy inkubator zarodników pokrywajÄ…cy teraz Serpulo. block.oil-extractor.description = Używa bardzo dużych iloÅ›ci energii do ekstrakcji ropy z piasku. Używaj go w sytuacji kiedy nie ma bezpoÅ›redniego źródÅ‚a ropy w okolicy. block.core-shard.description = Pierwsza wersja rdzenia. Gdy zostaje zniszczony, wszelki kontakt do regionu zostaje utracony. Nie pozwól na to. +block.core-shard.details = Pierwsza generacja. Kompaktowy. Samoreplikuje siÄ™. Wyposażony w jednorazowe silniki startowe. Nie jest przeznaczony do podróży miÄ™dzyplanetarnych. block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Przechowuje wiÄ™cej surowców. -block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opanczerzony. Przechowuje ogromne iloÅ›ci surowców. -block.vault.description = Przechowuje duże iloÅ›ci przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozÅ‚adować magazyn. -block.container.description = Przechowuje maÅ‚e iloÅ›ci przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozÅ‚adować kontener. +block.core-foundation.details = Druga generacja. +block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opancerzony. Przechowuje ogromne iloÅ›ci surowców. +block.core-nucleus.details = Trzecia i ostatnia generacja. +block.vault.description = Przechowuje duże iloÅ›ci przedmiotów każdego rodzaju. Zawartość magazynu można wyciÄ…gnąć za pomocÄ… ekstraktorów. +block.container.description = Przechowuje maÅ‚e iloÅ›ci przedmiotów każdego rodzaju. Zawartość kontenera można wyciÄ…gnąć za pomocÄ… ekstraktorów. block.unloader.description = WyciÄ…ga przedmioty z przylegÅ‚ych bloków. Typ przedmiotu jaki zostanie wyciÄ…gniety może zostać zmieniony poprzez klikniÄ™cie. block.launch-pad.description = WysyÅ‚a pakiety przedmiotów bez potrzeby wystrzeliwania rdżenia. -block.launch-pad-large.description = Ulepszona wersja wyrzutni. Magazynuje wiÄ™cej przedmiotów. WysyÅ‚a częściej. block.duo.description = MaÅ‚a, tania wieża. Przydatna przeciwko jednostkom naziemnym. block.scatter.description = Åšredniej wielkoÅ›ci wieża przeciwlotnicza. Rozsiewa Å›ruty z oÅ‚owiu, zÅ‚omu lub metaszkÅ‚a na jednostki wroga. block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odlegÅ‚oÅ›ci. @@ -1301,5 +1460,207 @@ block.ripple.description = Duża wieża artyleryjska, która strzela jednoczeÅ›n block.cyclone.description = Duża szybkostrzelna wieża. block.spectre.description = Duże dziaÅ‚o dwulufowe, które strzela potężnymi pociskami przebijajÄ…cymi pancerz w jednostki naziemne i powietrzne. block.meltdown.description = Duże dziaÅ‚o laserowe, które strzela potężnymi wiÄ…zkami dalekiego zasiÄ™gu. Wymaga chÅ‚odzenia. +block.foreshadow.description = Strzela potężnym pociskiem z daleka we wrogów. block.repair-point.description = Bez przerw naprawia najbliższÄ… uszkodzonÄ… jednostkÄ™ w jego zasiÄ™gu. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Uszkadza i niszczy wrogie pociskiski poza laserami. +block.parallax.description = Wykorzystuje laser przyciÄ…gajÄ…cy do siebie wrogów, zadajÄ…c im obrażenia. +block.tsunami.description = Strzela wielkim strumieniem cieczy we wrogów. Automatycznie gasi ogieÅ„, gdy jest podłączony do wody. +block.silicon-crucible.description = Oczyszcza krzem z wÄ™gla i piasku wykorzystujÄ…c piratian. Bardziej efektywny w gorÄ…cych miejscach. +block.disassembler.description = Oddziela egzotyczne materiaÅ‚y z mieszaniny jakÄ… jest żużel z małą efektywnoÅ›ciÄ…. Może wyprodukować tor. +block.overdrive-dome.description = ZwiÄ™ksza szybkość budynków w zasiÄ™gu. Wymaga włókna fazowego oraz krzemu by dziaÅ‚ać. +block.payload-conveyor.description = Przenosi duże Å‚adunki, takie jak jednostki z fabryk. +block.payload-router.description = Dzieli wejÅ›cie z przenoÅ›nika masowego w 3 różne strony. +block.command-center.description = Kontroluje zachowanie jednostek paroma różnymi komendami. +block.ground-factory.description = Produkuje jednostki naziemne. Jednostki mogÄ… być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć. +block.air-factory.description = Produkuje jednostki powietrzne. Jednostki mogÄ… być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć. +block.naval-factory.description = Produkuje jednostki morskie. Jednostki mogÄ… być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć. +block.additive-reconstructor.description = Ulepsza wsadzone jednostki do stopnia drugiego. +block.multiplicative-reconstructor.description = Ulepsza wsadzone jednostki do stopnia trzeciego. +block.exponential-reconstructor.description = Ulepsza wsadzone jednostki do stopnia czwartego. +block.tetrative-reconstructor.description = Ulepsza wsadzone jednostki do piÄ…tego, ostatniego stopnia. +block.switch.description = Jest przełączalny. Stan jego może być odczytywany lub kontrolowany przez procesory. +block.micro-processor.description = Uruchamia sekwencjÄ™ instrukcji logicznych w pÄ™tli. Może być wykorzystany do kontroli bloków lub jednostek. +block.logic-processor.description = Uruchamia sekwencjÄ™ instrukcji logicznych w pÄ™tli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż mikroprocesor. +block.hyper-processor.description = Uruchamia sekwencjÄ™ instrukcji logicznych w pÄ™tli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż procesor logiczny. +block.memory-cell.description = Przechowuje informacje dla procesora. +block.memory-bank.description = Przechowuje informacje dla procesora. Duża pojemność. +block.logic-display.description = WyÅ›wietla obraz z procesora. +block.large-logic-display.description = WyÅ›wietla obraz z procesora. +block.interplanetary-accelerator.description = Masywna elektromagnetyczna wieża. Przyspiesza rdzeÅ„ do prÄ™dkoÅ›ci ucieczki by wylÄ…dować na innych planetach. + +unit.dagger.description = Strzela standardowymi pociskami w najbliższych wrogów. +unit.mace.description = Strzela strumieniami ognia w najbliższych wrogów. +unit.fortress.description = Strzela artyleriÄ… dalekiego zasiÄ™gu we wrogie jednostki na ziemi. +unit.scepter.description = Strzela salwÄ… naÅ‚adowanych pocisków we wszystkich przeciwników. +unit.reign.description = Strzela salwÄ… masywnych przebijajÄ…cych pocisków we wszystkich przeciwników. +unit.nova.description = Wystrzeliwuje pioruny, które uszkadzajÄ… przeciwników i leczÄ… sojusznicze struktury. Może latać. +unit.pulsar.description = Wystrzeliwuje elektryczne pioruny, które uszkadzajÄ… przeciwników i leczÄ… sojusznicze struktury. Może latać. +unit.quasar.description = Wystrzeliwuje przeszywajÄ…cÄ… wiÄ…zkÄ™ laserowÄ…, uszkadzajÄ…cÄ… przeciwników i leczÄ…cÄ… sojusznicze struktury. Może latać. Posiada tarcze. +unit.vela.description = Wystrzeliwuje masywny ciÄ…gÅ‚y laser, który uszkadza przeciwników i leczy sojusznicze struktury. Może latać. +unit.corvus.description = Wystrzeliwuje masywnÄ… ciÄ…głą wiÄ…zkÄ™ laserowÄ…, która uszkadza przeciwników i leczy sojusznicze struktury. Może przejść po wiÄ™kszoÅ›ci terenu. +unit.crawler.description = Wbiega w przeciwników i dokonuje samozniszczenia powodujÄ…c dużą eksplozje. +unit.atrax.description = Wystrzeliwuje wyniszczajÄ…ce kule żużlu w cele na ziemi. Może przejść po wiÄ™kszoÅ›ci terenu. +unit.spiroct.description = Strzela wyczerpujÄ…cymi życie laserami we wrogów, naprawiajÄ…c siebie. Może przejść po wiÄ™kszoÅ›ci terenu. +unit.arkyid.description = Strzela dużymi wyczerpujÄ…cymi życie laserami we wrogów, naprawiajÄ…c siebie. Może przejść po wiÄ™kszoÅ›ci terenu. +unit.toxopid.description = Strzela wielkimi elektrycznymi skupionymi kulami i przebijajÄ…cymi laserami we wrogów. Może przejść po wiÄ™kszoÅ›ci terenu. +unit.flare.description = Strzela standardowymi pociskami we jednostki naziemne. +unit.horizon.description = Upuszcza seriÄ™ bomb na jednostki naziemne. +unit.zenith.description = Strzela salwÄ… rakiet w każdego pobliskiego wroga. +unit.antumbra.description = Strzela zaporÄ… rakiet w każdego pobliskiego wroga. +unit.eclipse.description = Strzela dwoma przebijajÄ…cymi laserami i pociskami przeciwlotniczymi we wrogów. +unit.mono.description = Automatycznie wykopuje miedź i ołów i odkÅ‚ada je do rdzenia. +unit.poly.description = Automatycznie naprawia zniszczone struktury i asystuje w budowie. +unit.mega.description = Automatycznie naprawia zniszczone struktury. Może podnosić maÅ‚e jednostki i bloki. +unit.quad.description = Upuszcza wielkie bomby na cele naziemne, uszkadzajÄ…c przeciwników i leczÄ…c sojusznicze struktury. Może podnosić jednostki naziemne Å›redniej wielkoÅ›ci. +unit.oct.description = Broni wszystkie jednostki tarczÄ… regeneracyjnÄ…. Może podnosić wiÄ™kszość jednostek naziemnych. +unit.risso.description = Strzela sporÄ… iloÅ›ciÄ… pocisków i rakiet w najbliższych przeciwników. +unit.minke.description = Strzela granatami i standardowymi pociskami w najbliższych przeciwników. +unit.bryde.description = Strzela granatami i rakietami na dużą odlegÅ‚ość we wrogów. +unit.sei.description = Strzela dużą iloÅ›ciÄ… rakiet oraz przebijajÄ…cych zbroje pocisków we wrogów. +unit.omura.description = Strzela przebijajÄ…cym superszybkim pociskiem we wrogów ze sporej odlegÅ‚oÅ›ci. Produkuje BÅ‚yski (jednostki). +unit.alpha.description = Chroni RdzeÅ„: OdÅ‚amek przed wrogami. Buduje struktury. +unit.beta.description = Chroni RdzeÅ„: Podstawa przed wrogami. Buduje struktury. +unit.gamma.description = Chroni RdzeÅ„: JÄ…dro przed wrogami. Buduje struktury. + +lst.read = Read a number from a linked memory cell. +lst.write = Write a number to a linked memory cell. +lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. +lst.drawflush = Flush queued [accent]Draw[] operations to a display. +lst.printflush = Flush queued [accent]Print[] operations to a message block. +lst.getlink = Get a processor link by index. Starts at 0. +lst.control = Control a building. +lst.radar = Locate units around a building with range. +lst.sensor = Get data from a building or unit. +lst.set = Set a variable. +lst.operation = Perform an operation on 1-2 variables. +lst.end = Jump to the top of the instruction stack. +lst.jump = Conditionally jump to another statement. +lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. +lst.unitcontrol = Control the currently bound unit. +lst.unitradar = Locate units around the currently bound unit. +lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. + +logic.nounitbuild = [red]Unit building logic is not allowed here. + +lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. +lenum.shoot = Shoot at a position. +lenum.shootp = Shoot at a unit/building with velocity prediction. +lenum.configure = Building configuration, e.g. sorter item. +lenum.enabled = Whether the block is enabled. + +laccess.color = Illuminator color. +laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself. +laccess.dead = Whether a unit/building is dead or no longer valid. +laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0. +laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. + +graphicstype.clear = Fill the display with a color. +graphicstype.color = Set color for next drawing operations. +graphicstype.stroke = Set line width. +graphicstype.line = Draw line segment. +graphicstype.rect = Fill a rectangle. +graphicstype.linerect = Draw a rectangle outline. +graphicstype.poly = Fill a regular polygon. +graphicstype.linepoly = Draw a regular polygon outline. +graphicstype.triangle = Fill a triangle. +graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[]. + +lenum.always = Always true. +lenum.idiv = Integer division. +lenum.div = Division.\nReturns [accent]null[] on divide-by-zero. +lenum.mod = Modulo. +lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0. +lenum.notequal = Not equal. Coerces types. +lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[]. +lenum.shl = Bit-shift left. +lenum.shr = Bit-shift right. +lenum.or = Bitwise OR. +lenum.land = Logical AND. +lenum.and = Bitwise AND. +lenum.not = Bitwise flip. +lenum.xor = Bitwise XOR. + +lenum.min = Minimum of two numbers. +lenum.max = Maximum of two numbers. +lenum.angle = Angle of vector in degrees. +lenum.len = Length of vector. +lenum.sin = Sine, in degrees. +lenum.cos = Cosine, in degrees. +lenum.tan = Tangent, in degrees. +#not a typo, look up 'range notation' +lenum.rand = Random decimal in range [0, value). +lenum.log = Natural logarithm (ln). +lenum.log10 = Base 10 logarithm. +lenum.noise = 2D simplex noise. +lenum.abs = Absolute value. +lenum.sqrt = Square root. + +lenum.any = Any unit. +lenum.ally = Ally unit. +lenum.attacker = Unit with a weapon. +lenum.enemy = Enemy unit. +lenum.boss = Guardian unit. +lenum.flying = Flying unit. +lenum.ground = Ground unit. +lenum.player = Unit controlled by a player. + +lenum.ore = Ore deposit. +lenum.damaged = Damaged ally building. +lenum.spawn = Enemy spawn point.\nMay be a core or a position. +lenum.building = Building in a specific group. + +lenum.core = Any core. +lenum.storage = Storage building, e.g. Vault. +lenum.generator = Buildings that generate power. +lenum.factory = Buildings that transform resources. +lenum.repair = Repair points. +lenum.rally = Command center. +lenum.battery = Any battery. +lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled. +lenum.reactor = Impact/Thorium reactor. +lenum.turret = Any turret. + +sensor.in = The building/unit to sense. + +radar.from = Building to sense from.\nSensor range is limited by building range. +radar.target = Filter for units to sense. +radar.and = Additional filters. +radar.order = Sorting order. 0 to reverse. +radar.sort = Metric to sort results by. +radar.output = Variable to write output unit to. + +unitradar.target = Filter for units to sense. +unitradar.and = Additional filters. +unitradar.order = Sorting order. 0 to reverse. +unitradar.sort = Metric to sort results by. +unitradar.output = Variable to write output unit to. + +control.of = Building to control. +control.unit = Unit/building to aim at. +control.shoot = Whether to shoot. + +unitlocate.enemy = Whether to locate enemy buildings. +unitlocate.found = Whether the object was found. +unitlocate.building = Output variable for located building. +unitlocate.outx = Output X coordinate. +unitlocate.outy = Output Y coordinate. +unitlocate.group = Building group to look for. + +lenum.idle = Don't move, but keep building/mining.\nThe default state. +lenum.stop = Stop moving/mining/building. +lenum.move = Move to exact position. +lenum.approach = Approach a position with a radius. +lenum.pathfind = Pathfind to the enemy spawn. +lenum.target = Shoot a position. +lenum.targetp = Shoot a target with velocity prediction. +lenum.itemdrop = Drop an item. +lenum.itemtake = Take an item from a building. +lenum.paydrop = Drop current payload. +lenum.paytake = Pick up payload at current location. +lenum.flag = Numeric unit flag. +lenum.mine = Mine at a position. +lenum.build = Build a structure. +lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[]. +lenum.within = Check if unit is near a position. +lenum.boost = Start/stop boosting. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 7754faa059..82c7401fcd 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -20,8 +20,8 @@ gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [accent]Novo recorde! copied = Copiado -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.popup = [accent]v6[] está atualmente em [accent]alpha[].\n[lightgray]Isso significa:[]\n[scarlet]- A campanha está inacabada[]\n- Está faltando conteúdo\n - A maioria das [scarlet]IAs das unidades[] não funciona adequadamente\n- A maioria das unidades estão inacabadas\n- Tudo o que você ver está sujeito a mudanças ou remoção.\n\nReporte bugs ou crashes em [accent]Github[]. +indev.notready = Essa parte do jogo ainda não esta pronta load.sound = Sons load.map = Mapas @@ -34,7 +34,7 @@ load.scripts = Scripts be.update = Uma nova versão beta está disponível: be.update.confirm = Baixar e reiniciar o jogo agora? be.updating = Atualizando... -be.ignore = Ignore +be.ignore = Ignorar be.noupdates = Nenhuma atualização encontrada. be.check = Cheque por atualizações @@ -50,11 +50,12 @@ schematic.browseworkshop = Navegar pela oficina schematic.copy = Copiar para a área de transferência schematic.copy.import = Importar da área de transferência schematic.shareworkshop = Compartilhar na Oficina -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o esquema schematic.saved = Esquema salvo. schematic.delete.confirm = Esse esquema será apagado. Tem certeza? schematic.rename = Renomear esquema schematic.info = {0}x{1}, {2} blocos +schematic.disabled = [scarlet]Esquemas desativados[]\nVocê precisa de permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor. stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos destruídos:[accent] {0} @@ -65,12 +66,12 @@ stat.delivered = Recursos lançados: stat.playtime = Tempo jogado:[accent] {0} stat.rank = Classificação final: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]Itens Globais map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de fase level.mode = Modo de jogo: -coreattack = < O núcleo está sobre ataque! > +coreattack = < O núcleo está sob ataque! > nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE database = Banco de dados savegame = Salvar jogo @@ -99,23 +100,22 @@ committingchanges = Enviando mudanças done = Feito feature.unsupported = Seu dispositivo não suporta essa função. -mods.alphainfo = Tenha em mente que os mods estão em alpha, e[scarlet] talvez eles contenham erros e instabilidades[].\nReporte quaisquer problemas no Discord ou GitHub do Mindustry. -mods.alpha = [accent](Alpha) +mods.alphainfo = Lembre-se que o sistema de mods está em alpha, e[scarlet] que eles talvez contenham erros e instabilidades[].\nReporte quaisquer problemas no Discord ou GitHub do Mindustry. mods = Mods mods.none = [lightgray]Nenhum mod encontrado! mods.guide = Guia de mods mods.report = Reportar um Bug mods.openfolder = Abrir pasta de mods -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reload = Recarregar +mods.reloadexit = O jogo vai fechar, para poder recarregar os mods. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Ativado mod.disabled = [scarlet]Desativado mod.disable = Desati-\nvar -mod.content = Content: +mod.content = Conteúdo: mod.delete.error = Incapaz de deletar o mod. O arquivo talvez esteja em uso. mod.requiresversion = [scarlet]Requer no mínimo versão [accent]{0} [scarlet]do jogo. -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]Não compatível com a V6 (sem minGameVersion: 105) mod.missingdependencies = [scarlet]Dependências ausentes: {0} mod.erroredcontent = [scarlet]Erros no conteúdo mod.errors = Ocorreram erros ao carregar o conteúdo. @@ -125,22 +125,22 @@ mod.enable = Ativar mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do mod. mod.reloadrequired = [scarlet]Recarregamento necessário mod.import = Importar mod -mod.import.file = Import File +mod.import.file = Importar Arquivo mod.import.github = Importar mod do GitHub -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]mods JAR são altamente inseguros.[]\nTenha certeza que esse mod tenha uma fonte confiável! mod.item.remove = Este item é parte do mod[accent] '{0}'[]. Para removê-lo, desinstale esse mod. mod.remove.confirm = Este mod será deletado. mod.author = [lightgray]Autor:[] {0} mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. Pode ocorrer uma corrupção no salvamento. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0} mod.preview.missing = Antes de publicar esse mod na oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do mod e tente novamente. -mod.folder.missing = Somente mods no formato de pasta serão publicados na oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os mods. -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.folder.missing = Somente mods no formato de pasta serão publicados na oficina.\nPara converter qualquer Mod em uma pasta, simplesmente descompacte seu arquivo numa pasta e delete o arquivo ZIP antigo, então reinicie seu jogo ou recarregue os mods. +mod.scripts.disable = Seu dispositivo não suporta mods com scripts. Você precisa desabilitar esses mods para conseguir jogar. about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Mapa do Planeta +launchcore = Lançar núcleo filename = Nome do arquivo: unlocked = Novo bloco desbloqueado! completed = [accent]Completado @@ -148,7 +148,7 @@ techtree = Ãrvore Tecnológica research.list = [lightgray]Pesquise: research = Pesquisar researched = [lightgray]{0} Pesquisado. -research.progress = {0}% complete +research.progress = {0}% completo players = {0} Jogadores ativos players.single = {0} Jogador ativo players.search = Procurar @@ -168,11 +168,11 @@ server.kicked.nameInUse = Este nome já está sendo usado\nneste servidor. server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome. server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. -server.kicked.gameover = Fim de jogo! +server.kicked.gameover = Fim do jogo! server.kicked.serverRestarting = O servidor esta reiniciando. server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] -host.info = O botão de [accent]Hospedar[] hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [lightgray]Wi-fi ou internet local[] pode ver este servidor na lista de servidores.\n\nSe você quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[lightgray]Nota: Se alguém esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall -join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[lightgray]Nota: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. +host.info = O botão de [accent]Hospedar[] hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [lightgray]Wi-fi ou internet local[] pode ver este servidor na lista de servidores.\n\nSe você quiser poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é necessário.\n\n[lightgray]Nota: Se alguém está com problemas em conectar no seu servidor lan, tenha certeza que mindustry tem acesso a sua internet local nas configurações do seu 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[lightgray]Nota: Não há uma lista de servidores automáticos; Se você quiser se conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. hostserver = Hospedar servidor invitefriends = Convidar amigos hostserver.mobile = Hospedar\nJogo @@ -272,30 +272,33 @@ data.import = Importar dados data.openfolder = Abrir pasta de dados data.exported = Dados exportados. data.invalid = Estes dados de jogo não são válidos. -data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando sua data é importada, seu jogo ira sair imediatamente. +data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando seus dados serão importados, seu jogo irá sair imediatamente. quit.confirm = Você tem certeza que quer sair? quit.confirm.tutorial = Você tem certeza que você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] loading = [accent]Carregando... reloading = [accent]Recarregando mods... saving = [accent]Salvando... -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][] para nascer no núcleo cancelbuilding = [accent][[{0}][] para cancelar a construção selectschematic = [accent][[{0}][] para selecionar + copiar pausebuilding = [accent][[{0}][] para parar a construção resumebuilding = [scarlet][[{0}][] para continuar a construção wave = [accent]Horda {0} +wave.cap = [accent]Horda {0}/{1} wave.waiting = Proxima horda em {0} wave.waveInProgress = [lightgray]Horda em progresso waiting = Aguardando... waiting.players = Esperando por jogadores... wave.enemies = [lightgray]{0} inimigos restantes wave.enemy = [lightgray]{0} inimigo restante +wave.guardianwarn = Guardião se aproximando em [accent]{0}[] Hordas. +wave.guardianwarn.one = Guardião se aproximando em [accent]{0}[] Horda. loadimage = Carregar\nimagem saveimage = Salvar\nimagem unknown = Desconhecido custom = Customizado builtin = Padrão -map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser desfeito! +map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser anulado! map.random = [accent]Mapa aleatório map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um núcleo[accent] amarelo[] para este mapa no editor. map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[scarlet] núcleos vermelhos[] no mapa no editor. @@ -321,13 +324,14 @@ editor.oregen.info = Geração de minério: editor.mapinfo = Informação do mapa editor.author = Autor: editor.description = Descrição: -editor.nodescription = Um mapa deve ter uma descrição de no mínimo 4 caracteres antes de ser publicado. +editor.nodescription = Um mapa deve ter uma descrição de ao mínimo 4 caracteres antes de ser publicado. editor.waves = Hordas: editor.rules = Regras: editor.generation = Geração: editor.ingame = Editar em jogo editor.publish.workshop = Publicar na oficina editor.newmap = Novo mapa +editor.center = Center workshop = Oficina waves.title = Hordas waves.remove = Remover @@ -335,9 +339,9 @@ waves.never = waves.every = a cada waves.waves = Horda(s) waves.perspawn = por spawn -waves.shields = shields/wave +waves.shields = Escudo/Horda waves.to = para -waves.guardian = Guardian +waves.guardian = Guardião waves.preview = Pré-visualizar waves.edit = Editar... waves.copy = Copiar para área de transferência @@ -346,9 +350,9 @@ waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +wavemode.counts = quantidade +wavemode.totals = total +wavemode.health = vida editor.default = [lightgray] details = Detalhes... @@ -415,8 +419,9 @@ toolmode.drawteams.description = Muda o time do qual o bloco pertence. filters.empty = [lightgray]Sem filtro! Adicione um usando o botão abaixo. filter.distort = Distorcedor filter.noise = Geração aleatória -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = Seleção de Spawn do Inimigo +filter.spawnpath = Caminho para o Spawn +filter.corespawn = Seleção de Núcleo filter.median = Medio filter.oremedian = Minério mediano filter.blend = Misturar @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Bloco filter.option.floor = Chão filter.option.flooronto = Chão alvo +filter.option.target = Target filter.option.wall = Parede filter.option.ore = Minério filter.option.floor2 = Chão secundário @@ -469,24 +475,18 @@ locked = Trancado complete = [lightgray]Completo: requirement.wave = Alcançar a Horda {0} em {1} requirement.core = Destruir o núcleo inimigo em {0} -requirement.research = Research {0} +requirement.research = Pesquise {0} requirement.capture = Capture {0} -resume = Resumir Zona:\n[lightgray]{0} bestwave = [lightgray]Melhor: {0} -launch = Lançar -launch.text = Launch -launch.title = Lançamento feito com sucesso -launch.next = [lightgray]Próxima oportunidade na Horda {0} -launch.unable2 = [scarlet]Impossível lançar.[] -launch.confirm = Isto vai lançar todos os seus recursos no seu núcleo.\nVoce não será capaz de retornar para esta base. -launch.skip.confirm = Se você pular a horda agora, você não será capaz de lançar até hordas futuras. +launch.text = Lançar +research.multiplayer = Apenas o host pode pesquisar itens. uncover = Descobrir configure = Configurar carregamento -loadout = Loadout -resources = Resources +loadout = Carregamento +resources = Recursos bannedblocks = Blocos Banidos addall = Adicionar Todos -launch.destination = Destination: {0} +launch.destination = Destino: {0} configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [lightgray]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. @@ -500,7 +500,7 @@ boss.health = Vida do Chefão connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} error.unreachable = Servidor fora de alcance. error.invalidaddress = Endereço inválido. -error.timedout = Desconectado!\nTenha certeza que o anfitrião tenha feito redirecionamento de portas e que o endereço esteja correto! +error.timedout = Desconectado!\nTenha certeza que o anfitrião tenha feito o port forwarding e que o endereço esteja correto! error.mismatch = Erro de pacote:\nPossivel incompatibilidade com a versão do cliente/servidor.\nTenha certeza que você e o anfitrião tenham a última versão! error.alreadyconnected = Já conectado. error.mapnotfound = Arquivo de mapa não encontrado! @@ -508,43 +508,49 @@ error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = Chuva +weather.snow.name = Neve +weather.sandstorm.name = Tempestade de Areia +weather.sporestorm.name = Tempestade de Esporos +weather.fog.name = Névoa -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]Inexplorado +sectors.resources = Recursos: +sectors.production = Produção: +sectors.stored = Armazenado: +sectors.resume = Continuar +sectors.launch = Lançar +sectors.select = Selecione +sectors.nonelaunch = [lightgray]nenhum (sun) +sectors.rename = Renomear Setor +sector.missingresources = [scarlet]Recursos Insuficientes no Núcleo -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +planet.serpulo.name = Serpulo +planet.sun.name = Sol -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +sector.groundZero.name = Marco Zero +sector.craters.name = As Crateras +sector.frozenForest.name = Floresta Congelada +sector.ruinousShores.name = Costas Ruinosas +sector.stainedMountains.name = Montanhas Manchadas +sector.desolateRift.name = Fenda Desolada +sector.nuclearComplex.name = Complexo de Prodção Nuclear +sector.overgrowth.name = Supercrescimento +sector.tarFields.name = Campos de Piche +sector.saltFlats.name = Planícies de Sal +sector.fungalPass.name = Passagem Fúngica + +sector.groundZero.description = Um lugar bom para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsiga o máximo possível de chumbo e cobre.\nContinue. +sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos se espalharam. As temperaturas baixas não conseguirão contê-los para sempre.\n\nComeçe a aventura com energia. Construa geradores a combustão. Aprenda a usar reparadores. +sector.saltFlats.description = Nos arredores do deserto ficam as planícies de sal. Muitos recursos podem ser encontrados nesse local.\n\nO inimigo construiu um complexo de armazenamento de recursos aqui. Destrua o núcleo deles. Não deixe nada sobrando. +sector.craters.description = A água se acumulou nessa cratera, relíquias de guerras antigas. Re-conquiste a área. Colete areia. Faça metavidro. Use a água para melhorar suas brocas e torretas. +sector.ruinousShores.description = Passando o terreno desolado, está localizada a costa. Antigamente, este local abrigava uma rede de defesa costeira. Não restou muita coisa. Apenas as estruturas de defesas básicas permaneceram ilesas, o resto foi reduzido a sucata.\nContinue expandindo seus territórios, re-descubra a tecnologia. +sector.stainedMountains.description = Mais para o interior estão as montanhas, ainda não contaminadas pelos esporos.\nExtraia o titânio que é abundante nessa área. Aprenda a usá-lo.\n\nA presença inimiga é maior aqui. Não dê tempo a eles de trazerem fortes unidades. +sector.overgrowth.description = Essa área coberta por vegetação, próxima ao local de origem dos esporos.\nO inimigo estabeleceu um posto de controle aqui. Faça unidades Titan. Destrua eles. Recupere o que foi perdido. +sector.tarFields.description = Nos arredores de uma zone de produção de petróleo, entre as montanhas e o deserto. Uma das poucas áreas com reservas de piche utilizáveis.\nMesmo abandonada, essa área tem forças inimigas por perto. Não subestime-os.\n\n[lightgray]Pesquise a tecnologia de processamento de petróleo se possível. +sector.desolateRift.description = Uma zona extremamente perigosa. Uma zona com recursos abundantes, mas pouco espaço. Grande risco de destruição. Saia o quanto antes. Não se deixe levar pelo tempo entre os ataques inimigos. +sector.nuclearComplex.description = Uma antiga instalação de produção e processamento de tório, reduzida a ruínas.\n[lightgray]Pesquise sobre o tório e seu vários usos.\n\nO inimigo está presente aqui em grande número, constantemente procurando por atacantes. +sector.fungalPass.description = Uma área de transição entre altas montanhas e terras baixas, repletas de esporos. Uma pequena base de reconhecimento inimiga está aqui.\nDestrua o núcleo. settings.language = Idioma settings.data = Dados do jogo @@ -558,65 +564,95 @@ settings.graphics = Gráficos settings.cleardata = Apagar dados settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, incluindo jogos salvos, mapas, teclas personalizadas e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = Você tem certeza que quer apagar todos os seus saves? +settings.clearsaves = Apagar Saves +settings.clearresearch = Apagar Pesquisas +settings.clearresearch.confirm = Você tem certeza que quer apagar todas as suas pesquisas da campanha? +settings.clearcampaignsaves = Apagar Saves da Campanha +settings.clearcampaignsaves.confirm = Você tem certeza que quer apagar todos os seus saves da campanha? paused = Pausado clear = Limpo banned = [scarlet]BANIDO -unplaceable.sectorcaptured = [scarlet]Requires captured sector +unplaceable.sectorcaptured = [scarlet]Requer captura de setor yes = Sim no = Não info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro -unit.nobuild = [scarlet]Unit can't build -blocks.input = Entrada -blocks.output = Saída -blocks.booster = Apoio -blocks.tiles = Required Tiles -blocks.affinities = Affinities +unit.nobuild = [scarlet]Unidades não podem construir +lastaccessed = [lightgray]Último Acesso: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Capacidade de Energia -blocks.powershot = Energia/tiro -blocks.damage = Dano -blocks.targetsair = Mira no ar -blocks.targetsground = Mira no chão -blocks.itemsmoved = Velocidade de movimento -blocks.launchtime = Tempo entre Disparos. -blocks.shootrange = Alcance -blocks.size = Tamanho -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacidade de Líquido -blocks.powerrange = Alcance da Energia -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Conexões Máximas -blocks.poweruse = Uso de energia -blocks.powerdamage = Dano/Poder -blocks.itemcapacity = Capacidade de Itens -blocks.basepowergeneration = Geração de poder base -blocks.productiontime = Tempo de produção -blocks.repairtime = Tempo de reparo total do bloco -blocks.speedincrease = Aumento de velocidade -blocks.range = Distância -blocks.drilltier = Brocas -blocks.drillspeed = Velocidade base da Broca -blocks.boosteffect = Efeito do Impulso -blocks.maxunits = Máximo de unidades ativas -blocks.health = Saúde -blocks.buildtime = Tempo de construção -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Custo de construção -blocks.inaccuracy = Imprecisão -blocks.shots = Tiros -blocks.reload = Tiros por segundo -blocks.ammo = Munição -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Entrada +stat.output = Saída +stat.booster = Apoio +stat.tiles = Required Tiles +stat.affinities = Afinidades +stat.powercapacity = Capacidade de Energia +stat.powershot = Energia/tiro +stat.damage = Dano +stat.targetsair = Mira no ar +stat.targetsground = Mira no chão +stat.itemsmoved = Velocidade de movimento +stat.launchtime = Tempo entre Disparos. +stat.shootrange = Alcance +stat.size = Tamanho +stat.displaysize = Tamanho do Display +stat.liquidcapacity = Capacidade de Líquido +stat.powerrange = Alcance da Energia +stat.linkrange = Alcance do Link +stat.instructions = Instruções +stat.powerconnections = Conexões Máximas +stat.poweruse = Uso de energia +stat.powerdamage = Dano / Poder +stat.itemcapacity = Capacidade de Itens +stat.memorycapacity = Capacidade de Memória +stat.basepowergeneration = Geração de poder base +stat.productiontime = Tempo de produção +stat.repairtime = Tempo de reparo total do bloco +stat.speedincrease = Aumento de velocidade +stat.range = Distância +stat.drilltier = Brocas +stat.drillspeed = Velocidade base da Broca +stat.boosteffect = Efeito do Impulso +stat.maxunits = Máximo de unidades ativas +stat.health = Saúde +stat.buildtime = Tempo de construção +stat.maxconsecutive = Max Consecutive +stat.buildcost = Custo de construção +stat.inaccuracy = Imprecisão +stat.shots = Tiros +stat.reload = Tempo de recarga +stat.ammo = Munição + +stat.shieldhealth = Vida do Escudo +stat.cooldowntime = Tempo de espera +stat.explosiveness = Explosividade +stat.basedeflectchance = Chance Base de Esquiva +stat.lightningchance = Lightning Chance +stat.lightningdamage = Dano por Raio +stat.flammability = Inflamabilidade +stat.radioactivity = Radioatividade +stat.heatcapacity = Capacidade de Aquecimento +stat.viscosity = Viscosidade +stat.temperature = Temperatura +stat.speed = Velocidade +stat.buildspeed = Velocidade de Construção +stat.minespeed = Velocidade de Mineração +stat.minetier = Nível de Mineração +stat.payloadcapacity = Capacidade de Carga +stat.commandlimit = Limite de Comando +stat.abilities = Habilidades + +ability.forcefield = Campo de Força +ability.repairfield = Campo de Reparação +ability.statusfield = Status Field +ability.unitspawn = {0} Fábrica +ability.shieldregenfield = Raio de Regeneração do Escudo bar.drilltierreq = Broca melhor necessária. -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Recursos Insuficientes +bar.corereq = Base do Núcleo Necessária bar.drillspeed = Velocidade da Broca: {0}/s bar.pumpspeed = Velocidade da Bomba: {0}/s bar.efficiency = Eficiência: {0}% @@ -624,6 +660,7 @@ bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Saída de energia: {0} +bar.powerlines = Conexões: {0}/{1} bar.items = Itens: {0} bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} @@ -633,7 +670,9 @@ bar.heat = Aquecer bar.power = Poder bar.progress = Progresso da construção bar.input = Entrada -bar.output = Sainda +bar.output = Saída + +units.processorcontrol = [lightgray]Processor Controlled bullet.damage = [stat]{0}[lightgray] de dano bullet.splashdamage = [stat]{0}[lightgray] de dano em área ~[stat] {1}[lightgray] bloco(s) @@ -642,12 +681,15 @@ bullet.homing = [stat]Guiado bullet.shock = [stat]Choque bullet.frag = [stat]Fragmentação bullet.knockback = [stat]{0}[lightgray]Impulso +bullet.pierce = [stat]{0}[lightgray]x perfuração +bullet.infinitepierce = [stat]perfuração bullet.freezing = [stat]Congelamento bullet.tarred = [stat]Grudento bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.reload = [stat]{0}[lightgray]x cadência de tiro unit.blocks = Blocos +unit.blockssquared = Blocos² unit.powersecond = unidades de energia por segundo unit.liquidsecond = líquido segundo unit.itemssecond = itens por segundo @@ -660,7 +702,7 @@ unit.persecond = por segundo unit.perminute = /min unit.timesspeed = x Velocidade unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = Saúde do escudo unit.items = itens unit.thousands = k unit.millions = m @@ -670,20 +712,19 @@ category.power = Energia category.liquids = Líquidos category.items = Itens category.crafting = Entrada/Saída -category.shooting = Atiradores +category.function = Função category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras setting.blockreplace.name = Sugestões automáticas de blocos setting.linear.name = Filtragem linear setting.hints.name = Dicas -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) +setting.flow.name = Mostrar Fluxo de Recursos[scarlet] (experimental) setting.buildautopause.name = Pausar construções automaticamente -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Ãgua animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[lightgray] (reinicialização requerida)[] -setting.playerindicators.name = Player Indicators +setting.playerindicators.name = Indicador de Jogadores setting.indicators.name = Indicador de aliados/inimigos setting.autotarget.name = Alvo automatico setting.keyboard.name = Controles de mouse e teclado @@ -702,7 +743,7 @@ setting.difficulty.name = Dificuldade setting.screenshake.name = Balanço da Tela setting.effects.name = Efeitos setting.destroyedblocks.name = Mostrar Blocos Destruídos -setting.blockstatus.name = Display Block Status +setting.blockstatus.name = Mostrar a Propriedade dos Blocos setting.conveyorpathfinding.name = Esteiras Encontram Caminho setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de Auto Salvamento @@ -712,15 +753,14 @@ setting.milliseconds = {0} milissegundos setting.fullscreen.name = Tela Cheia setting.borderlesswindow.name = Janela sem borda[lightgray] (Pode precisar reiniciar) setting.fps.name = Mostrar FPS e Ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Mostrar teclas de seleção de blocos +setting.smoothcamera.name = Suavizar movimentos da câmera setting.vsync.name = VSync setting.pixelate.name = Pixelizado [lightgray](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Mostrar Itens no Núcleo (WIP) setting.position.name = Mostrar a posição do Jogador setting.musicvol.name = Volume da Música -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = Mostrar a atmosfera do planeta setting.ambientvol.name = Volume do Ambiente setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos @@ -728,40 +768,40 @@ setting.mutesound.name = Desligar Som setting.crashreport.name = Enviar denúncias anônimas de erros setting.savecreate.name = Criar salvamentos automaticamente setting.publichost.name = Visibilidade do jogo público -setting.playerlimit.name = Player Limit +setting.playerlimit.name = Limites de Player setting.chatopacity.name = Opacidade do chat setting.lasersopacity.name = Opacidade do laser setting.bridgeopacity.name = Opacidade da ponte setting.playerchat.name = Mostrar chat em jogo public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública. -public.beta = Note que as versões beta do jogo não podem fazer salas publicas. +public.beta = Note que as versões beta do jogo não podem fazer salas públicas. uiscale.reset = A escala da interface foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] segundos... uiscale.cancel = Cancelar e sair setting.bloom.name = Bloom keybind.title = Refazer teclas -keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em dispositivos móveis. Apenas movimento básico é suportado. +keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em dispositivos móveis. É unicamente suportado movimento básico. category.general.name = Geral category.view.name = Ver category.multiplayer.name = Multijogador -category.blocks.name = Block Select +category.blocks.name = Selecionar bloco command.attack = Atacar command.rally = Reunir command.retreat = Recuar -command.idle = Idle +command.idle = Parado placement.blockselectkeys = \n[lightgray]Tecla: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.respawn.name = Reaparecer +keybind.control.name = Controlar unidade keybind.clear_building.name = Limpar construção keybind.press = Pressione uma tecla... keybind.press.axis = Pressione um eixo ou tecla... keybind.screenshot.name = Captura do mapa keybind.toggle_power_lines.name = Mudar lasers -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_block_status.name = Mostrar as propriedades dos blocos keybind.move_x.name = Mover no eixo x keybind.move_y.name = Mover no eixo Y -keybind.mouse_move.name = Seguir Mouse -keybind.pan.name = Pan View -keybind.boost.name = Boost +keybind.mouse_move.name = Seguir o Cursor +keybind.pan.name = Câmera livre +keybind.boost.name = Impulsionar keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu de Esquemas keybind.schematic_flip_x.name = Girar o Esquema no eixo X @@ -784,15 +824,15 @@ keybind.block_select_09.name = Categoria/Selecionar bloco 9 keybind.block_select_10.name = Categoria/Selecionar bloco 10 keybind.fullscreen.name = Alterar tela cheia keybind.select.name = selecionar -keybind.diagonal_placement.name = Colocação diagonal +keybind.diagonal_placement.name = Posicionamento Diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Desselecionar -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Pegar Carga +keybind.dropCargo.name = Soltar Carga +keybind.command.name = Comandar keybind.shoot.name = Atirar -keybind.zoom.name = Zoom +keybind.zoom.name = Ampliar keybind.menu.name = Menu keybind.pause.name = Pausar keybind.pause_building.name = Parar/Resumir a construção @@ -807,7 +847,7 @@ keybind.chat_history_prev.name = Historico do chat anterior keybind.chat_history_next.name = Historico do próximo chat keybind.chat_scroll.name = Rolar chat keybind.drop_unit.name = Soltar unidade -keybind.zoom_minimap.name = Zoom do minimapa +keybind.zoom_minimap.name = Ampliar minimapa mode.help.title = Descrição dos modos mode.survival.name = Sobrevivência mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. @@ -815,62 +855,65 @@ mode.sandbox.name = Criativo mode.sandbox.description = Recursos infinitos e sem tempo para ataques. mode.editor.name = Editor mode.pvp.name = JxJ -mode.pvp.description = Lutar contra outros jogadores locais. +mode.pvp.description = Luta contra outros jogadores locais. mode.attack.name = Ataque mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. mode.custom = Regras personalizadas rules.infiniteresources = Recursos infinitos rules.reactorexplosions = Reatores explodem +rules.schematic = Permitir Esquemas rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque -rules.buildai = AI Building +rules.buildai = Habilitar construção da IA rules.enemyCheat = Recursos de IA Infinitos rules.blockhealthmultiplier = Multiplicador de vida do bloco -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = Multiplicador de dano do bloco rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade rules.unithealthmultiplier = Multiplicador de vida de unidade rules.unitdamagemultiplier = Multiplicador de dano de Unidade -rules.enemycorebuildradius = Raio de "Não-criação" de core inimigo:[lightgray] (blocos) +rules.enemycorebuildradius = Raio de "não-criação" de core inimigo:[lightgray] (blocos) rules.wavespacing = Espaço de tempo entre hordas:[lightgray] (seg) rules.buildcostmultiplier = Multiplicador de custo de construção rules.buildspeedmultiplier = Multiplicador de velocidade de construção -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier +rules.deconstructrefundmultiplier = Multiplicador de reembolso de desconstrução rules.waitForWaveToEnd = Hordas esperam inimigos rules.dropzoneradius = Raio da zona de spawn:[lightgray] (blocos) -rules.unitammo = Units Require Ammo +rules.unitammo = Unidades requerem munição rules.title.waves = Hordas rules.title.resourcesbuilding = Recursos e Construções rules.title.enemy = Inimigos rules.title.unit = Unidades rules.title.experimental = Experimental -rules.title.environment = Environment +rules.title.environment = Ambiente rules.lighting = Iluminação -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Iluminação Inimiga +rules.fire = Fogo +rules.explosions = Dano de explosão de unidades/blocos rules.ambientlight = Luz ambiente -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Clima +rules.weather.frequency = Frequência: +rules.weather.duration = Duração: content.item.name = Itens content.liquid.name = Líquidos content.unit.name = Unidades content.block.name = Blocos + item.copper.name = Cobre item.lead.name = Chumbo item.coal.name = Carvão item.graphite.name = Grafite item.titanium.name = Titânio item.thorium.name = Tório -item.silicon.name = Sílicio +item.silicon.name = Silício item.plastanium.name = Plastânio item.phase-fabric.name = Tecido de fase -item.surge-alloy.name = Liga de surto -item.spore-pod.name = Cápsula de esporos +item.surge-alloy.name = Liga de súrgio +item.spore-pod.name = Pedaço de esporo item.sand.name = Areia -item.blast-compound.name = Composto de explosão +item.blast-compound.name = Composto Explosivo item.pyratite.name = Piratita item.metaglass.name = Metavidro item.scrap.name = Sucata @@ -879,23 +922,6 @@ liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Fluído Criogênico -item.explosiveness = [lightgray]Explosibilidade: {0} -item.flammability = [lightgray]Inflamabilidade: {0} -item.radioactivity = [lightgray]Radioatividade: {0} - -unit.health = [lightgray]Vida: {0} -unit.speed = [lightgray]Velocidade: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Capacidade de aquecimento: {0} -liquid.viscosity = [lightgray]Viscosidade: {0} -liquid.temperature = [lightgray]Temperatura: {0} - unit.dagger.name = Adaga unit.mace.name = Mace unit.fortress.name = Fortaleza @@ -909,7 +935,7 @@ unit.arkyid.name = Arkyid unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon -unit.zenith.name = Zenith +unit.zenith.name = Zênite unit.antumbra.name = Antumbra unit.eclipse.name = Eclipse unit.mono.name = Mono @@ -925,33 +951,34 @@ unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma -unit.scepter.name = Scepter +unit.scepter.name = Sceptro unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax -block.cliff.name = Cliff +block.resupply-point.name = Ponto de Reabastecimento +block.parallax.name = Paralaxe +block.cliff.name = Relevo block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama -block.slag.name = Slag +block.slag.name = Escória +block.space.name = Space block.salt.name = Sal -block.salt-wall.name = Salt Wall +block.salt-wall.name = Parede de sal block.pebbles.name = Pedrinhas block.tendrils.name = Gavinhas -block.sand-wall.name = Sand Wall +block.sand-wall.name = Muro de Areia block.spore-pine.name = Pinheiro de esporo -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Muro de Esporos +block.boulder.name = Rochedo +block.snow-boulder.name = Monte de neve block.snow-pine.name = Pinheiro com neve -block.shale.name = Xisto -block.shale-boulder.name = Pedra de Xisto +block.shale.name = Folhelho +block.shale-boulder.name = Pedra de Folhelho block.moss.name = Musgo block.shrubs.name = Arbusto block.spore-moss.name = Musgo de Esporos -block.shale-wall.name = Shale Wall +block.shale-wall.name = Parede de Folhelho block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -961,14 +988,14 @@ block.kiln.name = Forno block.graphite-press.name = Prensa de grafite block.multi-press.name = Multi-Prensa block.constructing = {0}\n[lightgray](Construindo) -block.spawn.name = Area inimiga +block.spawn.name = Ãrea inimiga block.core-shard.name = Fragmento do núcleo block.core-foundation.name = Fundação do núcleo block.core-nucleus.name = Centro do núcleo block.deepwater.name = Ãgua profunda block.water.name = Ãgua -block.tainted-water.name = Ãgua contaminada -block.darksand-tainted-water.name = Ãgua contaminada sobre areia escura +block.tainted-water.name = Ãgua tinta +block.darksand-tainted-water.name = Ãgua tinta sobre areia escura block.tar.name = Piche block.stone.name = Pedra block.sand.name = Areia @@ -978,18 +1005,19 @@ block.snow.name = Neve block.craters.name = Crateras block.sand-water.name = Ãgua sobre areia block.darksand-water.name = Ãgua sobre areia escura -block.char.name = Char -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall -block.ice-snow.name = Gelo de neve -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.char.name = Cinzas +block.dacite.name = Dacito +block.dacite-wall.name = Parede de Dacito +block.dacite-boulder.name = Dacite Boulder +block.ice-snow.name = Gelo com Neve +block.stone-wall.name = Parede de Pedra +block.ice-wall.name = Parede de Gelo +block.snow-wall.name = Parede de Neve +block.dune-wall.name = Duna block.pine.name = Pinheiro -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Terra +block.dirt-wall.name = Parede de Terra +block.mud.name = Lama block.white-tree-dead.name = Ãrvore branca morta block.white-tree.name = Ãrvore branca block.spore-cluster.name = Aglomerado de esporos @@ -1005,7 +1033,7 @@ block.dark-panel-4.name = Painel escuro 4 block.dark-panel-5.name = Painel escuro 5 block.dark-panel-6.name = Painel escuro 6 block.dark-metal.name = Metal escuro -block.basalt.name = Basalt +block.basalt.name = Basalto block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma block.copper-wall.name = Muro de Cobre @@ -1019,15 +1047,15 @@ block.phase-wall-large.name = Muralha de Fase block.thorium-wall.name = Muro de Tório block.thorium-wall-large.name = Muralha de Tório block.door.name = Porta -block.door-large.name = Portão +block.door-large.name = Porta grande block.duo.name = Torreta dupla -block.scorch.name = Lança-fogo +block.scorch.name = Lança-chamas block.scatter.name = Dispersão block.hail.name = Artilharia block.lancer.name = Lanceiro block.conveyor.name = Esteira block.titanium-conveyor.name = Esteira de titânio -block.plastanium-conveyor.name = Plastanium Conveyor +block.plastanium-conveyor.name = Esteira de plastânio block.armored-conveyor.name = Esteira blindada block.armored-conveyor.description = Move os itens com a mesma velocidade das esteiras de titânio, mas tem mais armadura. Não aceita itens dos lados de nada além de outras esteiras. block.junction.name = Junção @@ -1037,10 +1065,10 @@ block.sorter.name = Ordenador block.inverted-sorter.name = Ordenador invertido block.message.name = Mensagem block.illuminator.name = Iluminador -block.illuminator.description = Uma pequena, compacta e configurável fonte de luz. Precisa de energia para funcionar. -block.overflow-gate.name = Comporta -block.underflow-gate.name = Comporta invertida -block.silicon-smelter.name = Fundidora de silicio +block.illuminator.description = Uma fonte de luz pequena, configurável e compacta. Precisa de energia para funcionar. +block.overflow-gate.name = Portão de Fluxo +block.underflow-gate.name = Portão de Fluxo invertido +block.silicon-smelter.name = Fundidora de silício block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador block.cryofluid-mixer.name = Misturador de Crio Fluido @@ -1048,10 +1076,10 @@ block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporo block.separator.name = Separador -block.coal-centrifuge.name = Centrífuga de Carvão +block.coal-centrifuge.name = Centrífugador de Carvão block.power-node.name = Célula de energia block.power-node-large.name = Célula de energia grande -block.surge-tower.name = Torre de surto +block.surge-tower.name = Torre de súrgio block.diode.name = Diodo block.battery.name = Bateria block.battery-large.name = Bateria grande @@ -1075,6 +1103,7 @@ block.power-source.name = Fonte de energia block.unloader.name = Descarregador block.vault.name = Cofre block.wave.name = Onda +block.tsunami.name = Tsunami block.swarmer.name = Enxame block.salvo.name = Salvo block.ripple.name = Ondulação @@ -1087,8 +1116,8 @@ block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande block.oil-extractor.name = Bomba de Petróleo block.repair-point.name = Ponto de Reparo -block.pulse-conduit.name = Cano de Tinânio -block.plated-conduit.name = Cano blindado +block.pulse-conduit.name = Cano de Pulso +block.plated-conduit.name = Cano Blindado block.phase-conduit.name = Cano de Fase block.liquid-router.name = Roteador de Líquido block.liquid-tank.name = Tanque de Líquido @@ -1110,35 +1139,37 @@ block.fuse.name = Fusivel block.shock-mine.name = Mina de choque block.overdrive-projector.name = Projetor de sobrecarga block.force-projector.name = Projetor de campo de força -block.arc.name = Bobina de Tesla +block.arc.name = Tesla block.rtg-generator.name = Gerador GTR block.spectre.name = Espectro block.meltdown.name = Fusão -block.container.name = Contâiner +block.foreshadow.name = Foreshadow +block.container.name = Contêiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande -block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.segment.name = Segmento +block.command-center.name = Centro de Comando +block.ground-factory.name = Fábrica de unidades terrestres +block.air-factory.name = Fábrica de unidades aéreas +block.naval-factory.name = Fábrica de unidades navais +block.additive-reconstructor.name = Reconstrutor Aditivo +block.multiplicative-reconstructor.name = Reconstrutor Multiplicativo +block.exponential-reconstructor.name = Reconstrutor Exponencial +block.tetrative-reconstructor.name = Reconstrutor Tetrativo +block.payload-conveyor.name = Esteira de Carga +block.payload-router.name = Roteador de Carga +block.disassembler.name = Desmontador +block.silicon-crucible.name = Fornalha De Silício +block.overdrive-dome.name = Domo de Sobrecarga -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Alavanca +block.micro-processor.name = Micro Processador +block.logic-processor.name = Processador Lógico +block.hyper-processor.name = Hiper Processador +block.logic-display.name = Monitor Lógico +block.large-logic-display.name = Monitor lógico grande +block.memory-cell.name = Célula de Memória +block.memory-bank.name = Banco de Memória team.blue.name = Azul team.crux.name = Vermelho @@ -1168,7 +1199,7 @@ tutorial.withdraw = Em algumas situações é necessário pegar itens diretament tutorial.deposit = Deposite itens em blocos arrastando da sua nave até o bloco.\n\n[accent]Deposite seu cobre de volta no núcleo.[] tutorial.waves = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Construa mais torretas. tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre. -tutorial.launch = Quando você atinge uma horda específica, Você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. +tutorial.launch = Quando você atinge uma horda específica, você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. item.copper.description = O material mais básico. Usado em todos os tipos de blocos. item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. @@ -1191,14 +1222,14 @@ liquid.slag.description = Vários metais derretidos misturados juntos. Pode ser liquid.oil.description = Um líquido usado na produção de materias avançados. Pode ser convertido em carvão como combustível, ou pulverizado e incendiado como arma. liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa, até seu corpo quando está calor, mas não faça isto. -block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados. +block.message.description = Mostra uma mensagem. Usado para comunicação entre aliados. block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro. block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente. -block.silicon-smelter.description = Reduz areia a silicio usando carvão puro. Produz silício. +block.silicon-smelter.description = Reduz areia a silício usando carvão puro. Produz silício. block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia. block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. -block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. +block.alloy-smelter.description = Combina titânio, chumbo, silício e cobre para produzir liga de surto. block.cryofluid-mixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. block.blast-mixer.description = Quebra e mistura aglomerados de esporos com piratita para produzir composto de explosão. block.pyratite-mixer.description = Mistura carvão, chumbo e areia em piratita altamente inflamável. @@ -1208,14 +1239,14 @@ block.spore-press.description = Comprime cápsulas de esporos em petróleo. block.pulverizer.description = Esmaga sucata em areia. Util quando esta em falta de areia natural. block.coal-centrifuge.description = Solidifica petróleo em carvão. block.incinerator.description = Se livra de itens em excesso ou liquidos. -block.power-void.description = Destroi qualquer energia que entre dentro. Apenas caixa de areia. -block.power-source.description = Infinitivamente da energia. Apenas caixa de areia. -block.item-source.description = Infinivamente da itens. Apenas caixa de areia. -block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. -block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. -block.liquid-void.description = Remove todos os líquidos. Apenas sandbox. -block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo. -block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. +block.power-void.description = Destroi qualquer energia que entra dentro. Apenas no modo sandbox. +block.power-source.description = Infinitivamente da energia. Apenas no modo sandbox. +block.item-source.description = Infinitamente dá itens. Apenas caixa de areia. +block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas no modo sandbox. +block.liquid-source.description = Infinitivamente dá Liquidos. Apenas no modo sanbox. +block.liquid-void.description = Destroi qualquer líquidos que entrar dentro. Apenas no modo sandbox. +block.copper-wall.description = Um bloco defensivo barato.\nUtil para proteger o núcleo e torretas no começo. +block.copper-wall-large.description = Um bloco defensivo barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. block.titanium-wall.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos. block.titanium-wall-large.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos.\nOcupa múltiplos blocos. block.plastanium-wall.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia. @@ -1223,30 +1254,30 @@ block.plastanium-wall-large.description = Um tipo especial de muro que absorve a block.thorium-wall.description = Um bloco defensivo forte.\nBoa proteção contra inimigos. block.thorium-wall-large.description = Um bloco defensivo forte.\nBoa proteção contra inimigos.\nOcupa múltiplos blocos. block.phase-wall.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto. -block.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto.\nSOcupa múltiplos blocos. -block.surge-wall.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente. -block.surge-wall-large.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente.\nOcupa multiplos blocos. +block.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas ao impacto.\nOcupa múltiplos blocos. +block.surge-wall.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. +block.surge-wall-large.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-as aleatoriamente.\nOcupa multiplos blocos. block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar.\nOcupa múltiplos blocos. -block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficiência. -block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficiência. -block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficiência. -block.force-projector.description = Cria um campo de força hexagonal ao redor de si, protegendo construções e unidades.\nSuperaquece se suportar muito dano. Pode usar líquidos para evitar superaquecimento. Pode-se usar tecido de fase para aumentar o tamanho do escudo. +block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficácia. +block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficácia. +block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficácia. +block.force-projector.description = Cria um campo de força hexagonal ao redor de si, protegendo construções e unidades.\nAquece demais se o escudo tomar dano. Pode usar líquidos para evitar superaquecimento. Pode-se usar tecido de fase para aumentar o tamanho do escudo. block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionável. block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. -block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. +block.plastanium-conveyor.description = Move os itens por grupos.\nRecebe os itens por trás, e despeja eles nas três outras direções. +block.junction.description = Funciona como uma ponte para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras separadas carregando materiais diferentes para lugares diferentes. block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. -block.sorter.description = [interact]Aperte no bloco para configurar[] -block.inverted-sorter.description = Processa os itens como um sorteador normal, mas os itens escolhidos sairão pelas laterais ao invés. -block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais da fonte para multiplos alvos. -block.distributor.description = Um roteador avançado que espalhas os itens em 7 outras direções igualmente. -block.overflow-gate.description = Uma combinação de roteador e divisor Que apenas manda para a esquerda e Direita se a frente estiver bloqueada. +block.sorter.description = Filtra itens passando o selecionado para frente e os outros para os lados. +block.inverted-sorter.description = Filtra os itens como um ordenador normal, porém, os itens escolhidos sairão pelas laterais. +block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais de uma fonte para multiplos alvos. +block.distributor.description = Um roteador avançado que espalhas os itens em 7 direções igualmente. +block.overflow-gate.description = Uma combinação de roteador e divisor que apenas manda para a esquerda e direita se a frente estiver bloqueada. block.underflow-gate.description = O oposto de um portão de sobrecarga. Manda pra frente se a esquerda e a direita estiverem bloqueadas. block.mass-driver.description = Bloco de transporte de itens supremo. Coleta itens severos e atira eles em outro mass driver de uma longa distancia. -block.mechanical-pump.description = Uma bomba barata com baixa saída de líquidos, mas sem consumo de energia. +block.mechanical-pump.description = Uma bomba barata com baixa saída de líquidos, sem consumo de energia. block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas requer energia. block.thermal-pump.description = A bomba final. block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos. @@ -1260,38 +1291,38 @@ block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa e block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente. block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões. block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis. -block.diode.description = A energia de baterias pode fluir através desse bloco em apenas uma direção, mas apenas se o outro lado possuir menos energia armazenada. +block.diode.description = A energia de baterias pode fluir através desse bloco em apenas uma direção, mas sómente se o outro lado possuir menos energia armazenada. block.battery.description = Armazena energia em tempos de energia excedente. Libera energia em tempos de déficit. block.battery-large.description = Guarda muito mais energia que uma bateria comum. block.combustion-generator.description = Gera energia queimando materiais inflamáveis, como carvão. block.thermal-generator.description = Gera energia quando colocado em lugares quentes. block.steam-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. -block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o Fluido Criogênico e a Piratita. -block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos que não precisa de refriamento mas dá muito menos energia que o reator de tório. +block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o fluido friogênico e a piratita. +block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos que não precisa de resfriamento mas dá muito menos energia que o reator de tório. block.solar-panel.description = Gera pequenas quantidades de energia do sol. block.solar-panel-large.description = Uma versão significantemente mais eficiente que o painel solar padrão. -block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido. +block.thorium-reactor.description = Gera altas quantidades de energia pelo tório radioativo. Requer resfriamento constante. Explodirá violentamente se o resfriamento for insuficiente. block.impact-reactor.description = Um gerador avançado, capaz de criar quantidades enormes de energia em seu poder total. Requer uma entrada significativa de energia ao iniciar. -block.mechanical-drill.description = Uma broca barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. -block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de processar materiais mais duros usando a pressão do ar -block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora +block.mechanical-drill.description = Uma broca barata. Quando colocado nos blocos apropriados, retira itens em um ritmo lento, eternamente. +block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de extrair materiais mais duros usando a pressão do ar. +block.laser-drill.description = Possibilita mineração ainda mais rapida usando tecnologia a laser, mas requer poder adicionalmente. Tório pode ser recuperado com essa mineradora. block.blast-drill.description = A melhor mineradora. Requer muita energia. -block.water-extractor.description = Extrai água subterrânea. Usado em locais sem água superficial disponível. +block.water-extractor.description = Extrai água subterrânea. Usado em locais sem água disponível na superficie. block.cultivator.description = Cultiva pequenas concentrações de esporos na atmosfera em cápsulas prontas. block.oil-extractor.description = Usa altas quantidades de energia para extrair petróleo da areia. Use quando não tiver fontes de petróleo por perto. block.core-shard.description = A primeira iteração do núcleo. Uma vez destruído, todo o contato com a região é perdido. Não deixe isso acontecer. -block.core-foundation.description = A segunda versão do núcleo. Mais bem armadurado. Armazena mais recursos. -block.core-nucleus.description = A terceira e ultima iteração do núcleo. Extremamente bem armadurada. Guarda quantidades massivas de recursos. -block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. -block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. +block.core-foundation.description = A segunda versão do núcleo. Armadurado melhor. Armazena mais recursos. +block.core-nucleus.description = A terceira e última versão do núcleo. Extremamente bem armadurada. Guarda quantidades massivas de recursos. +block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes quando não há uma entrada constante de materiais. Um[lightgray] descarregador[] pode ser usado para recuperar esses itens do container. +block.container.description = Guarda uma pequena quantidade de itens. Usado para criar fontes quando não há uma entrada constante de materiais. Um[lightgray] descarregador[] pode ser usado para recuperar esses itens do container. block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. block.launch-pad-large.description = Uma versão melhorada da plataforma de lançamento. Guarda mais itens. Lança mais frequentemente. block.duo.description = Uma pequena torre de baixo custo. Útil contra unidades terrestres. block.scatter.description = Uma torre antiaérea essencial para a defesa. Dispara vários tiros aglomerados de chumbo, sucata ou metavidro. -block.scorch.description = Uma torre que queima qualquer unidade que estiver próxima. Altamente efetivo se for a queima-roupa. +block.scorch.description = Uma torre que queima qualquer unidade que estiver próxima. Altamente efetivo se for de perto. block.hail.description = Uma pequena torre de artilharia com grande alcance. -block.wave.description = Uma torre de tamanho médio. Lança jatos de líquidos nos seus inimigos. Automaticamente apaga incêndios se for abastecido com água ou crio fluido. +block.wave.description = Uma torre de tamanho médio. Lança jatos de líquidos nos seus inimigos. Automaticamente apaga incêndios se for abastecido com água ou fluido criogênico. block.lancer.description = Uma torre laser anti-terrestre média. Carrega e dispara poderosos feixes de energia. block.arc.description = Uma pequena torre elétrica com curto alcance. Dispara arcos de eletricidade nos seus inimigos. block.swarmer.description = Uma torre de mísseis de tamanho médio. Ataca ambos terrestre e aéreo disparando misseis teleguiados. @@ -1300,6 +1331,6 @@ block.fuse.description = Uma torre grande com curto alcance. Dispara três feixe block.ripple.description = Uma torre de artilharia extremamente poderosa. Dispara varios tiros aglomerados a uma grande distância nos seus inimigos. block.cyclone.description = Uma grande torre que dispara balas explosivas que se fragmentam em unidades aéreas e terrestres próximas. block.spectre.description = Um grande canhão massivo. Dispara grandes tiros perfuradores de blindagem em inimigos aéreos e terrestres. -block.meltdown.description = Um grande canhão laser massivo. Carrega e dispara um poderoso e persistente feixe nos seus inimigos. Requer uma refrigeração para ser operada. +block.meltdown.description = Um grande canhão laser massivo. Carrega e dispara um poderoso e persistente feixe nos seus inimigos. Requer um resfriamento para ser operada. block.repair-point.description = Continuamente repara a unidade danificada mais proxima. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Destrói projéteis inimigos que se aproximam. Feixes não serão detectados. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 0b6948191b..6e08cc7d3f 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -55,6 +55,7 @@ schematic.saved = Esquema gravado. schematic.delete.confirm = Este esquema irá ser completamente apagado. schematic.rename = Renomear Esquema schematic.info = {0}x{1}, {2} blocos +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} @@ -100,7 +101,6 @@ done = Feito feature.unsupported = O teu dispositivos não suporta esta característica. mods.alphainfo = Lembre-se de que os mods estão em alfa, e [scarlet] pode estar cheio de falhas[].\nReporta qualquer problema que encontres no the Mindustry GitHub ou Discord. -mods.alpha = [accent](Alpha) mods = Mods mods.none = [lightgray]Mods não encontrados! mods.guide = Guia de mods @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] para selecionar+copy pausebuilding = [accent][[{0}][] para pausar construção resumebuilding = [scarlet][[{0}][] para resumir construção wave = [accent]Horda {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = Horda em {0} wave.waveInProgress = [lightgray]Horda Em Progresso waiting = Aguardando... waiting.players = Esperando por jogadores... wave.enemies = [lightgray]{0} inimigos restantes wave.enemy = [lightgray]{0} inimigo restante +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Carregar\nimagem saveimage = Gravarr\nimagem unknown = Desconhecido @@ -328,6 +331,7 @@ editor.generation = Geração: editor.ingame = Editar em jogo editor.publish.workshop = Publicar na oficina editor.newmap = Novo mapa +editor.center = Center workshop = Oficina waves.title = Hordas waves.remove = Remover @@ -416,6 +420,7 @@ filters.empty = [lightgray]Sem filtro! Adicione um usando o botão abaixo. filter.distort = Distorcedor filter.noise = Geração aleatória filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Mediano filter.oremedian = Minério Mediano @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Bloco filter.option.floor = Chão filter.option.flooronto = Chão alvo +filter.option.target = Target filter.option.wall = Parede filter.option.ore = Minério filter.option.floor2 = Chão secundário @@ -471,15 +477,9 @@ requirement.wave = Ronda alcançada {0} / {1} requirement.core = Destruir Núcleo Inimigo em {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resumir Zona:\n[lightgray]{0} bestwave = [lightgray]Melhor: {0} -launch = Lançar launch.text = Launch -launch.title = Lançamento feito com sucesso -launch.next = [lightgray]Próxima oportunidade na Horda {0} -launch.unable2 = [scarlet]Impossível lançar.[] -launch.confirm = Isto vai lançar todos os seus recursos no seu núcleo.\nVoce não será capaz de retornar para esta base. -launch.skip.confirm = Se você pular a horda agora, você não será capaz de lançar até hordas mais avançadas. +research.multiplayer = Only the host can research items. uncover = Descobrir configure = Configurar carregamento loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. settings.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = Pausado clear = Limpar banned = [scarlet]Banido @@ -570,49 +580,74 @@ info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro unit.nobuild = [scarlet]Unit can't build -blocks.input = Entrada -blocks.output = Saida -blocks.booster = Booster -blocks.tiles = Telhas Requeridas -blocks.affinities = Afinidades +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Capacidade de Energia -blocks.powershot = Energia/tiro -blocks.damage = Dano -blocks.targetsair = Mirar no ar -blocks.targetsground = Mirar no chão -blocks.itemsmoved = Velocidade de movimento -blocks.launchtime = Tempo entre tiros -blocks.shootrange = Alcance -blocks.size = Tamanho -blocks.displaysize = Display Size -blocks.liquidcapacity = Capacidade de Líquido -blocks.powerrange = Alcance da Energia -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Uso de energia -blocks.powerdamage = Dano/Poder -blocks.itemcapacity = Capacidade de Itens -blocks.basepowergeneration = Geração de poder base -blocks.productiontime = Tempo de produção -blocks.repairtime = Tempo de reparo total do bloco -blocks.speedincrease = Aumento de velocidade -blocks.range = Distância -blocks.drilltier = Furáveis -blocks.drillspeed = Velocidade da broca base -blocks.boosteffect = Efeito do Boost -blocks.maxunits = Máximo de unidades ativas -blocks.health = Saúde -blocks.buildtime = Tempo de construção -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Custo de construção -blocks.inaccuracy = Imprecisão -blocks.shots = Tiros -blocks.reload = Tiros por segundo -blocks.ammo = Munição -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Entrada +stat.output = Saida +stat.booster = Booster +stat.tiles = Telhas Requeridas +stat.affinities = Afinidades +stat.powercapacity = Capacidade de Energia +stat.powershot = Energia/tiro +stat.damage = Dano +stat.targetsair = Mirar no ar +stat.targetsground = Mirar no chão +stat.itemsmoved = Velocidade de movimento +stat.launchtime = Tempo entre tiros +stat.shootrange = Alcance +stat.size = Tamanho +stat.displaysize = Display Size +stat.liquidcapacity = Capacidade de Líquido +stat.powerrange = Alcance da Energia +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Uso de energia +stat.powerdamage = Dano/Poder +stat.itemcapacity = Capacidade de Itens +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Geração de poder base +stat.productiontime = Tempo de produção +stat.repairtime = Tempo de reparo total do bloco +stat.speedincrease = Aumento de velocidade +stat.range = Distância +stat.drilltier = Furáveis +stat.drillspeed = Velocidade da broca base +stat.boosteffect = Efeito do Boost +stat.maxunits = Máximo de unidades ativas +stat.health = Saúde +stat.buildtime = Tempo de construção +stat.maxconsecutive = Max Consecutive +stat.buildcost = Custo de construção +stat.inaccuracy = Imprecisão +stat.shots = Tiros +stat.reload = Tiros por segundo +stat.ammo = Munição +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Saída de energia: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Itens: {0} bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Progresso da construção bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] dano bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos bullet.incendiary = [stat]Incendiário @@ -642,12 +680,15 @@ bullet.homing = [stat]Guiado bullet.shock = [stat]Choque bullet.frag = [stat]Fragmentação bullet.knockback = [stat]{0}[lightgray]Impulso +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]Congelamento bullet.tarred = [stat]Grudento bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.reload = [stat]{0}[lightgray]x cadência de tiro unit.blocks = Blocos +unit.blockssquared = blocks² unit.powersecond = Unidades de energia/segundo unit.liquidsecond = Unidades de líquido/segundo unit.itemssecond = itens/segundo @@ -670,7 +711,7 @@ category.power = Poder category.liquids = Líquidos category.items = Itens category.crafting = Construindo -category.shooting = Atirando +category.function = Function category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras @@ -679,7 +720,6 @@ setting.linear.name = Filtragem linear setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Ãgua animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[lightgray] (reinicialização requerida)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Ecrã inteiro setting.borderlesswindow.name = Janela sem borda[lightgray] (Pode precisar reiniciar) setting.fps.name = Mostrar FPS setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelizado [lightgray](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa @@ -822,6 +861,7 @@ mode.custom = Regras personalizadas rules.infiniteresources = Recursos infinitos rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque @@ -847,6 +887,7 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Itens content.liquid.name = Liquidos content.unit.name = Unidades content.block.name = Blocos + item.copper.name = Cobre item.lead.name = Chumbo item.coal.name = Carvão @@ -879,23 +921,6 @@ liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido -item.explosiveness = [lightgray]Explosibilidade: {0} -item.flammability = [lightgray]Inflamabilidade: {0} -item.radioactivity = [lightgray]Radioatividade: {0} - -unit.health = [lightgray]Vida: {0} -unit.speed = [lightgray]Velocidade: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Capacidade de aquecimento: {0} -liquid.viscosity = [lightgray]Viscosidade: {0} -liquid.temperature = [lightgray]Temperatura: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortaleza @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.slag.name = Slag +block.space.name = Space block.salt.name = Sal block.salt-wall.name = Salt Wall block.pebbles.name = Pedrinhas @@ -981,6 +1007,7 @@ block.darksand-water.name = Ãgua sobre areia escura block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Gelo de neve block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1075,6 +1102,7 @@ block.power-source.name = Criador de energia block.unloader.name = Descarregador block.vault.name = Cofre block.wave.name = Onda +block.tsunami.name = Tsunami block.swarmer.name = Enxame block.salvo.name = Salvo block.ripple.name = Ondulação @@ -1114,6 +1142,7 @@ block.arc.name = Arco Elétrico block.rtg-generator.name = Gerador GTR block.spectre.name = Espectro block.meltdown.name = Fusão +block.foreshadow.name = Foreshadow block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = Azul team.crux.name = Vermelho diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 221ab0aab6..07b492b444 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -13,15 +13,18 @@ link.google-play.description = Google Play link.f-droid.description = Catalogul F-Droid link.wiki.description = Wikiul oficial al Mindustry link.suggestions.description = Sugerează noi funcÈ›ii +link.bug.description = Ai găsit vreunul? Raportează-l aici linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată. screenshot = Captură de ecran salvată la {0} screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran. gameover = Jocul s-a încheiat +gameover.disconnect = Deconectare gameover.pvp = Echipa [accent] {0}[] este câștigătoare! +gameover.waiting = [accent]Se aÈ™teaptă următoarea hartă... highscore = [accent]Scor maxim nou! copied = Copiat. -indev.popup = [accent]v6[] este momentan în [accent]alpha[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este complet neterminată[]\n- Majoritatea [scarlet]AI-ului unităților[] nu funcÈ›ionează bine\n- Multe unități sunt neterminate\n- Modul campanie nu este terminat \n- Tot ce vedeÈ›i se poate schimba sau poate fi eliminat.\n\nPentru a raporta buguri È™i crashuri intraÈ›i pe [accent]Github[]. indev.notready = Această secÈ›iune a jocului nu este gata încă. +indev.campaign = [accent]Felicitări! Ai ajuns la finalul campaniei![]\n\nAi mers cât de departe se poate momentan. Călătoria interplanetară va fi adăugată într-un update viitor. load.sound = Sunete load.map = HărÈ›i @@ -38,6 +41,14 @@ be.ignore = Ignoră be.noupdates = Niciun update disponibil. be.check = Verifică updateurile +mods.browser = Browser de Moduri +mods.browser.selected = Mod selectat +mods.browser.add = Instalare +mods.browser.reinstall = Reinstal. +mods.github.open = Github +mods.browser.sortdate = Cele mai recente +mods.browser.sortstars = Cele mai multe stele + schematic = Schemă schematic.add = Salvează Schema... schematics = Scheme @@ -50,12 +61,14 @@ schematic.browseworkshop = Intră pe Workshop schematic.copy = Copiază în Clipboard schematic.copy.import = Importă din Clipboard schematic.shareworkshop = Partajează pe Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: ÃŽntoarce Schemă +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: ÃŽntoarce Schema schematic.saved = Schemă salvată. schematic.delete.confirm = Schema această va fi È™tearsă permanent. schematic.rename = RedenumeÈ™te Schema schematic.info = {0}x{1}, {2} blocuri +schematic.disabled = [scarlet]Schemele sunt dezactivate[]\nNu ai voie să foloseÈ™ti scheme pe această [accent]hartă[] sau [accent]server. +stats = InformaÈ›ii stat.wave = Valuri ÃŽnvinse:[accent] {0} stat.enemiesDestroyed = Inamici DistruÈ™i:[accent] {0} stat.built = Structuri Construite:[accent] {0} @@ -65,7 +78,7 @@ stat.delivered = Resurse Lansate: stat.playtime = Timp Joc:[accent] {0} stat.rank = Rang Final: [accent]{0} -globalitems = [accent]Materiale Globale +globalitems = [accent]Materiale Totale map.delete = Sigur vrei să È™tergi harta "[accent]{0}[]"? level.highscore = Scor Maxim: [accent]{0} level.select = Selectează Nivelul @@ -78,6 +91,7 @@ loadgame = ÃŽncarcă Jocul joingame = Intră în Joc customgame = Personalizat newgame = Joc Nou +none.found = [lightgray] none = minimap = Minihartă position = PoziÈ›ie @@ -99,18 +113,20 @@ committingchanges = Se ÃŽncarcă Schimbările done = Gata feature.unsupported = Dispozitivul tău nu suportă această funcÈ›ie. -mods.alphainfo = Modurile sunt încă în alpha È™i[scarlet] pot avea multe buguri[].\nRaportaÈ›i orice probleme apărute pe Githubul Mindustry sau pe Discord. -mods.alpha = [accent](Alpha) +mods.initfailed = [red]âš [] InstanÈ›a Mindustry precedentă a eÈ™uat la iniÈ›ializare. De obicei se întâmplă din cauza unui mod care nu se acÈ›ionează cum trebuie.\n\nPt a preveni un lanÈ› de crashuri continue, [red]toate modurile au fost dezactivate.[]\n\nPoÈ›i dezactiva asta din [accent]Setări->Joc->Dezactivează Modurile în Cazul unui Crash la Pornire[]. mods = Moduri mods.none = [lightgray]Nu s-au găsit moduri! mods.guide = Ghid de Modding mods.report = Raportează Bug mods.openfolder = Deschide Folder +mods.viewcontent = Vezi ConÈ›inut mods.reload = Reîncarcă mods.reloadexit = Jocul se va opri ca să reîncarce modurile. +mod.installed = [[Instalat] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Activat mod.disabled = [scarlet]Dezactivat +mod.multiplayer.compatible = [gray]Compatibil cu Multiplayer mod.disable = Dezactivează mod.content = ConÈ›inut: mod.delete.error = Nu s-a putut È™terge modul. FiÈ™ierul ar putea fi în uz. @@ -127,11 +143,11 @@ mod.reloadrequired = [scarlet]E Nevoie de o Repornire mod.import = Importă Mod mod.import.file = Importă FiÈ™ier mod.import.github = Importă din GitHub -mod.jarwarn = [scarlet]Modurile în format JAR nu sunt sigure.[]\nAi grijă să importezi acest mod dintr-o sursă de încredere! -mod.item.remove = Acest obiect este parte din modul [accent] '{0}'[]. Ca să îl poÈ›i elimina, dezinstalează acel mod. +mod.jarwarn = [scarlet]Modurile în format JAR nu sunt sigure.[]\nAi grijă să imporÈ›i acest mod dintr-o sursă de încredere! +mod.item.remove = Acest obiect face parte din modul [accent] '{0}'[]. Ca să îl poÈ›i elimina, dezinstalează acel mod. mod.remove.confirm = Acest mod va fi È™ters. mod.author = [lightgray]Autor:[] {0} -mod.missing = Această salvare conÈ›ine moduri cărora le-ai făcut update recent sau nu mai sunt instalate. FiÈ™ierul poate fi corupt. Sigur vrei să îl încarci?\n[lightgray]Moduri:\n{0} +mod.missing = Această salvare conÈ›ine moduri cărora le-ai făcut update recent sau care nu mai sunt instalate. FiÈ™ierul poate fi corupt. Sigur vrei să îl încarci?\n[lightgray]Moduri:\n{0} mod.preview.missing = ÃŽnainte să publici acest mod pe Workshop, trebuie să adaugi o imagine pt previzualizare.\nPune o imagine numită[accent] preview.png[] în folderul modului È™i încearcă din nou. mod.folder.missing = Doar modurile din câmpul folder pot fi publicate pe Workshop.\nPt a converti orice mod într-un folder, dezarhivează zipul într-un folder È™i È™terge vechiul zip, apoi reporneÈ™te jocul sau reîncărcă-È›i modurile. mod.scripts.disable = Dispozitivul tău nu suportă moduri cu scripturi. Trebuie să dezactivezi aceste moduri ca să joci jocul. @@ -143,8 +159,12 @@ planetmap = Harta Planetei launchcore = Lansează Nucleu filename = Nume FiÈ™ier: unlocked = Nou conÈ›inut deblocat! +available = PoÈ›i cerceta noi tehnologii! completed = [accent]Finalizat -techtree = Tehnologie +techtree = Cercetează +research.legacy = Au fost găsite date de cercetare din versiunea [accent]5.0[].\n DoreÈ™ti să [accent]păstrezi aceste date[], sau [accent]să renunÈ›i la ele[] È™i să reîncepi cercetarea în noua campanie (recomandat)? +research.load = Păstrează Datele +research.discard = Renunță research.list = [lightgray]Cercetare: research = Cercetează researched = [lightgray]{0} cercetat. @@ -172,7 +192,7 @@ server.kicked.gameover = Joc încheiat! server.kicked.serverRestarting = Acest server se reporneÈ™te. server.versions = Versiunea ta:[accent] {0}[]versiunea serverului:[accent] {1}[] host.info = Butonul [accent]găzduieÈ™te[] va găzdui un server pe portul [scarlet]6567[]. \nOrice persoană de pe acelaÈ™i port [lightgray]wifi sau reÈ›ea locală[] ar trebui să-È›i vadă serverul în lista lor de servere.\n\nDacă vrei ca lumea să se poată conecta de oriunde cu IP-ul, este nevoie de [accent]port forwarding[].\n\n[lightgray]Notă: Dacă cineva are probleme în a se conecta la jocul tău LAN, verifică dacă ai lăsat Mindustry să acceseze reÈ›eaua locală în setările de firewall. De menÈ›ionat este faptul că uneori reÈ›elele publice nu permit descoperirea serverului. -join.info = Aici poÈ›i scrie un [accent]IP de server[] pt a te conecta, a descoperi [accent]reÈ›eaua locală[] sau serverele [accent]globale[] pt a te conecta la ele.\nAtât multiplayerul LAN cât È™i cel WAN este suportat.\n\n[lightgray]Dacă vrei să te conectezi la cineva cu IP-ul, trebuie să ceri gazdei IP-ul său, care poate fi găsit căutând pe Google "my ip' de pe dispozitivul lor. +join.info = Aici poÈ›i scrie un [accent]IP de server[] pt a te conecta sau pt a descoperi [accent]reÈ›eaua locală[] sau serverele [accent]globale[] la care să te conectezi.\nAtât multiplayerul LAN cât È™i cel WAN sunt suportate.\n\n[lightgray]Dacă vrei să te conectezi la cineva cu IP-ul, trebuie să ceri gazdei IP-ul său, care poate fi găsit căutând pe Google "my ip" de pe dispozitivul său. hostserver = GăzduieÈ™te Joc Multiplayer invitefriends = Invită Prieteni hostserver.mobile = GăzduieÈ™te Joc @@ -189,12 +209,19 @@ servers.local = Servere Locale servers.remote = Servere de la Distanță servers.global = Servere ale Comunității +servers.disclaimer = Serverele comunității [accent]nu[] sunt deÈ›inute sau controlate de către dezvoltator.\n\nServerele pot prezenta conÈ›inut generat de utilizatori care nu este potrivit tuturor vârstelor. +servers.showhidden = Vezi Serverele Ascunse +server.shown = AfiÈ™ate +server.hidden = Ascunse + trace = UrmăreÈ™te Jucător trace.playername = Nume jucător: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = ID unic: [accent]{0} +trace.id = ID: [accent]{0} trace.mobile = Client Mobil: [accent]{0} trace.modclient = Client Personalizat: [accent]{0} +trace.times.joined = A Intrat: de [accent]{0}[] ori +trace.times.kicked = Dat Afară: de [accent]{0}[] ori invalidid = ID client invalid! Raportează bugul. server.bans = InterziÈ™i server.bans.none = Nu s-au găsit jucători intreziÈ™i! @@ -222,6 +249,7 @@ disconnect.timeout = ÃŽntârzie să răspundă. disconnect.data = Nu s-au putut încărca datele lumii! cantconnect = Nu te-ai putut alătura jocului ([accent]{0}[]). connecting = [accent]Conectare... +reconnecting = [accent]Reconectare... connecting.data = [accent]Se încarcă datele hărÈ›ii... server.port = Port: server.addressinuse = Adresa este deja în uz! @@ -264,9 +292,13 @@ ok = OK open = Deschide customize = Personalizează Regulile cancel = Anulare -openlink = Deschidr Linkul +openlink = Deschide Linkul copylink = Copiază Linkul back = ÃŽnapoi +max = Maximum +crash.export = Exportă Crash Logs +crash.none = Nu s-au găsit crash logs. +crash.exported = Crash logs exportate. data.export = Exportă Date data.import = Importă Date data.openfolder = Deschide Folderul cu Date @@ -283,13 +315,20 @@ cancelbuilding = [accent][[{0}][] pt a curăța planul selectschematic = [accent][[{0}][] pt selectare+copiere pausebuilding = [accent][[{0}][] pt a face o pauză de la construit resumebuilding = [scarlet][[{0}][] pt a continua construitul +enablebuilding = [scarlet][[{0}][] pt a construi +showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfaÈ›a. wave = [accent]Valul {0} +wave.cap = [accent]Valul {0}/{1} wave.waiting = [lightgray]Val în {0} wave.waveInProgress = [lightgray]Val în desfășurare waiting = [lightgray]ÃŽn aÈ™teptare... waiting.players = Se aÈ™teaptă jucătorii... wave.enemies = [lightgray]Mai sunt {0} inamici +wave.enemycores = [accent]{0}[lightgray] Nuclee Inamice +wave.enemycore = [accent]{0}[lightgray] Nucleu Inamic wave.enemy = [lightgray]Mai e {0} inamic +wave.guardianwarn = Gardianul va veni în [accent]{0}[] valuri. +wave.guardianwarn.one = Gardianul va veni într-[accent]un[] val. loadimage = ÃŽncarcă Imagine saveimage = Salvează Imagine unknown = Necunoscut @@ -328,10 +367,10 @@ editor.generation = Generare: editor.ingame = Editează în Joc editor.publish.workshop = Publică pe Workshop editor.newmap = Hartă Nouă +editor.center = Centrează workshop = Workshop waves.title = Valuri waves.remove = Elimină -waves.never = waves.every = la fiecare waves.waves = val(uri) waves.perspawn = per apariÈ›ie @@ -346,6 +385,7 @@ waves.invalid = Valuri invalide în clipboard. waves.copied = Valuri copiate. waves.none = Niciun inamic definit.\nDe reÈ›inut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită. +#intenÈ›ionat cu literă mică wavemode.counts = numere wavemode.totals = totaluri wavemode.health = viață @@ -358,8 +398,10 @@ editor.spawn = Adaugă Unitate editor.removeunit = ÃŽnlătură Unitate editor.teams = Echipe editor.errorload = Eroare la încărcarea fiÈ™ierului. +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb editor.errorsave = Eroare la salvarea fiÈ™ierului. -editor.errorimage = Aceasta este o imagine, nu o hartă.\n\nDacă vrei să imporÈ›i o hartă din versiunile 3.5/build 40, foloseÈ™te butonul 'Importă Hartă Veche' din editor. +editor.errorimage = Aceasta este o imagine, nu o hartă. editor.errorlegacy = Hartă aceasta este prea veche, È™i foloseÈ™te un format învechit care nu mai este suportat. editor.errornot = Acesta nu este un fiÈ™ier cu o hartă. editor.errorheader = Acest fiÈ™ier de hartă este invalid sau corupf. @@ -398,7 +440,7 @@ editor.exists = Există deja o hartă cu acelaÈ™i nume. editor.selectmap = Selectează o hartă de încărcat: toolmode.replace = ÃŽnlocuieÈ™te -toolmode.replace.description = Desenează doar pe blocurile solide. +toolmode.replace.description = Desenează doar peste blocurile solide. toolmode.replaceall = ÃŽnlocuieÈ™te-le pe toate toolmode.replaceall.description = ÃŽnlocuieÈ™te toate blocurile solide de pe hartă. toolmode.orthogonal = Ortogonal @@ -408,7 +450,7 @@ toolmode.square.description = Pensulă pătrată. toolmode.eraseores = Șterge Minereurile toolmode.eraseores.description = Șterge doar minereurile. toolmode.fillteams = Umplere Echipe -toolmode.fillteams.description = Umple hartă cu echipe în loc de blocuri. +toolmode.fillteams.description = Umple harta cu echipe în loc de blocuri. toolmode.drawteams = Desenează Echipe toolmode.drawteams.description = Desenează echipe în loc de blocuri. @@ -416,11 +458,12 @@ filters.empty = [lightgray]Fără filtre! Adaugă unul folosind butonul de mai j filter.distort = Distorsionare filter.noise = Zgomot Vizual filter.enemyspawn = Selectare Punct de Lansare Inamic +filter.spawnpath = Cale Către Punctul de Lansare filter.corespawn = Selectare Nucleu filter.median = Mediană filter.oremedian = Mediană Minereu filter.blend = Amestecare -filter.defaultores = Miercuri Prestabilite +filter.defaultores = Minereuri Prestabilite filter.ore = Minereu filter.rivernoise = Zgomot Vizual Râuri filter.mirror = Oglindă @@ -439,7 +482,8 @@ filter.option.angle = Unghi filter.option.amount = Cantitate filter.option.block = Bloc filter.option.floor = Podea -filter.option.flooronto = Podea È›intă +filter.option.flooronto = Podea Èšintă +filter.option.target = Èšintă filter.option.wall = Perete filter.option.ore = Minereu filter.option.floor2 = Podea Secundară @@ -456,7 +500,7 @@ load = ÃŽncarcă save = Salvează fps = FPS: {0} ping = Ping: {0}ms -language.restart = Vă rugăm să reporniÈ›i jocul pentru că setările de limbă să aibă efect. +language.restart = ReporneÈ™te jocul pentru ca setările de limbă să aibă efect. settings = Setări tutorial = Tutorial tutorial.retake = Reia Tutorial @@ -467,33 +511,24 @@ abandon = Abandonează abandon.text = Zona aceasta È™i toate resursele ei vor fi cedate inamicului. locked = Blocat complete = [lightgray]Finalizat: -requirement.wave = Ajungi la valul {0} în {1} -requirement.core = Distruge Nucleu Inamic în{0} +requirement.wave = Treci de valul {0} în {1} +requirement.core = Distruge Nucleul Inamic din {0} requirement.research = Cercetează {0} +requirement.produce = Produ {0} requirement.capture = Capturează {0} -resume = Revin la Zonă:\n[lightgray]{0} -bestwave = [lightgray]Cel Mai Bun Val: {0} -launch = < LANSARE > launch.text = Lansează -launch.title = Lansare Finalizată -launch.next = [lightgray]următoarea ocazie la valul {0} -launch.unable2 = [scarlet]Imposibil de LANSAT.[] -launch.confirm = Asta va lansa toate resursele din nucleu.\nNu te vei mai putea întoarce la această bază. -launch.skip.confirm = Dacă sari acum, Nu vei mai putea lansa decât valurile viitoare. +research.multiplayer = Doar gazda poate cerceta noi tehnologii. +map.multiplayer = Doar gazda poate vedea harta sectoarelor. uncover = Descoperă -configure = Configurează ÃŽncărcarea +configure = Configurează ÃŽncărcarea + loadout = ÃŽncărcare resources = Resurse bannedblocks = Blocuri Interzise addall = Adaugă-le pe toate -launch.destination = Destination: {0} +launch.from = Lansează Din: [accent]{0} +launch.destination = DestinaÈ›ie: {0} configure.invalid = Cantitatea trebuie să fie un număr între 0 È™i {0}. -zone.unlocked = [lightgray]{0} deblocat(ă). -zone.requirement.complete = CerinÈ›ele pt {0} finalizate:[lightgray]\n{1} -zone.resources = [lightgray]Resurse Detectate: -zone.objective = [lightgray]Obiectiv: [accent]{0} -zone.objective.survival = SupravieÈ›uieÈ™te -zone.objective.attack = Distruge Nucleul Inamic add = Adaugă... boss.health = ViaÈ›a Gardianului @@ -512,39 +547,91 @@ weather.rain.name = Ploaie weather.snow.name = Ninsoare weather.sandstorm.name = Furtună de nisip weather.sporestorm.name = Furtună de spori +weather.fog.name = Ceață sectors.unexplored = [lightgray]Neexplorat sectors.resources = Resurse: sectors.production = ProducÈ›ie: +sectors.export = Export: +sectors.time = Timp: +sectors.threat = AmeninÈ›are: +sectors.wave = Valul: sectors.stored = Stocat: sectors.resume = Revino sectors.launch = Lansare -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.select = Selectează +sectors.nonelaunch = [lightgray]nimic (soarele) +sectors.rename = RedenumeÈ™te Sectorul +sectors.enemybase = [scarlet]Bază Inamică +sectors.vulnerable = [scarlet]Vulnerabil +sectors.underattack = [scarlet]Sectorul e atacat! [accent]{0}% deteriorat +sectors.survives = [accent]SupravieÈ›uieÈ™te {0} valuri +sectors.go = Start +sector.curcapture = Sector Capturat +sector.curlost = Sector Pierdut +sector.missingresources = [scarlet]Resurse din Nucleu Insuficiente +sector.attacked = Sectorul [accent]{0}[white] este atacat! +sector.lost = Ai pierdut sectorul [accent]{0}[white]! +#spaÈ›iul lipsă de mai jos e intenÈ›ionat +sector.captured = Ai capturat sectorul [accent]{0}[white]! -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = Scăzută +threat.medium = Medie +threat.high = Mare +threat.extreme = Extremă +threat.eradication = Eradicare + +planets = Planete + +planet.serpulo.name = Serpulo +planet.sun.name = Soare + +sector.impact0078.name = Impact 0078 +sector.groundZero.name = Punctul Zero +sector.craters.name = Craterele +sector.frozenForest.name = Pădurea Glacială +sector.ruinousShores.name = Țărmurile Părăsite +sector.stainedMountains.name = MunÈ›ii PătaÈ›i +sector.desolateRift.name = Riftul Dezolat +sector.nuclearComplex.name = Complexul de ProducÈ›ie Nucleară +sector.overgrowth.name = SupracreÈ™terea +sector.tarFields.name = Câmpurile cu Păcură +sector.saltFlats.name = PodiÈ™urile Saline +sector.fungalPass.name = Pasul Fungic +sector.biomassFacility.name = Facilitatea de Sinteză a Biomasei +sector.windsweptIslands.name = Insulele Măturate de Vânt +sector.extractionOutpost.name = Avanpostul de ExtracÈ›ie +sector.planetaryTerminal.name = Terminalul de Lansare Planetară sector.groundZero.description = LocaÈ›ia optimă pt a începe încă odată. Risc de inamici scăzut. PuÈ›ine resurse.\nAdună cât de mult plumb È™i cupru se poate.\nMergi mai departe. -sector.frozenForest.description = Chiar È™i aici, aproape de munÈ›i, sperii s-au împrăștiat. Temperaturile reci nu-i pot reÈ›ine la infinit.\n\nÃŽncepe călătoria către electricitate. ConstruieÈ™te generatoare de combustie. ÃŽnvață să foloseÈ™ti reparatoare. -sector.saltFlats.description = La periferia deÈ™ertului stau Salt Flats. PuÈ›ine resurse pot fi găsite în această locaÈ›ie.\n\nInamicul a ridicat un complex-depozit aici. Distruge-le nucleul. Nu lăsa nimic în urmă. +sector.frozenForest.description = Chiar È™i aici, aproape de munÈ›i, sporii s-au împrăștiat. Temperaturile reci nu-i pot reÈ›ine la infinit.\n\nÃŽncepe călătoria către electricitate. ConstruieÈ™te generatoare de combustie. ÃŽnvață să foloseÈ™ti reparatoare. +sector.saltFlats.description = La periferia deÈ™ertului stau PodiÈ™urile Saline. PuÈ›ine resurse pot fi găsite în această locaÈ›ie.\n\nInamicul a ridicat un complex de depozitare aici. Distruge-le nucleul. Nu lăsa nimic în urmă. sector.craters.description = Apa s-a acumulat în acest crater, rămășiță a vechilor războaie. CucereÈ™te din nou zona. Adună nisip. Toarnă-l în metasticlă. Pompează apă pt a răci armele È™i burghiele. -sector.ruinousShores.description = După deÈ™erturi vine țărmul. Odată, locaÈ›ia aceasta a avut un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai de bază rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea în afară. Redescoperă tehnologia. -sector.stainedMountains.description = Mai înspre continent sunt munÈ›ii, încă neatinÈ™i de spori.\nExtrage abundentele resurse de titan din zonă. ÃŽnvață cum să-l foloseÈ™ti.\n\nPrezenÈ›a inamicului e mai mare aici. Nu le da timp să-È™i trimită cele mai puternice unități. -sector.overgrowth.description = Zona asta e plină de buruieni, mai aproape de sursa sporilor.\nInamicul È™i-a stabilit un adăpost aici. ConstruieÈ™te unități Titan. Distruge-o. CucereÈ™te din nou ce s-a pierdut. -sector.tarFields.description = O zonă aflată la periferia unei zone de producÈ›ie petrolieră, între munÈ›i È™i deÈ™ert. Una din puÈ›inele zone cu resurse utilizabile de È›iÈ›ei.\nDeÈ™i abandonată, zona aceasta are niÈ™te forÈ›e inamice periculoase înapropiere. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului dacă se poate. -sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puÈ›in spaÈ›iu. Mare risc de distrugere. Pleacă cât mai curând. Nu te lăsa păcălit de timpul mare dintre atacurile inamice. -sector.nuclearComplex.description = O fostă facilitate pt producerea È™i procesarea de torium, redusă la ruine.\n[lightgray]Cercetează toriul È™i multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constând atacatori. +sector.ruinousShores.description = După deÈ™erturi vine țărmul. Odată, locaÈ›ia aceasta avea un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai simple au rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea înspre exterior. Redescoperă tehnologia. +sector.stainedMountains.description = Mai spre mijlocul continentului sunt munÈ›ii, încă neatinÈ™i de spori.\nExtrage abundentele resurse de titan din zonă. ÃŽnvață cum să-l foloseÈ™ti.\n\nPrezenÈ›a inamicului e mai mare aici. Nu le da timp să trimită cele mai puternice unități. +sector.overgrowth.description = Această zonă este plină de buruieni, mai aproape de sursa sporilor.\nInamicul È™i-a stabilit un avanpost aici. ConstruieÈ™te unități Mace. Distruge-l. +sector.tarFields.description = O zonă aflată la periferia unui complex de producÈ›ie petrolieră, între munÈ›i È™i deÈ™ert. Una din puÈ›inele zone cu resurse utilizabile de È›iÈ›ei.\nDeÈ™i abandonată, în apropierea zonei se află forÈ›e inamice periculoase. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului pe cât posibil. +sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puÈ›in spaÈ›iu. Mare risc de distrugere. Pleacă curând, cât mai curând. Nu te lăsa păcălit de pauzele mari dintre atacurile inamice. +sector.nuclearComplex.description = O fostă facilitate pt producerea È™i procesarea de toriu, redusă la ruine.\n[lightgray]Cercetează toriul È™i multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constant atacatori. sector.fungalPass.description = O zonă de tranziÈ›ie dintre munÈ›ii înalÈ›i È™i zonele joase, pline cu spori. O mică bază de recunoaÈ™tere a inamicului este localizată aici.\nDistruge-o.\nFoloseÈ™te unități Dagger È™i Crawler. Distruge cele 2 nuclee. +sector.biomassFacility.description = Originea sporilor. Aceasta este facilitatea în care au fost cercetaÈ›i È™i produÈ™i iniÈ›ial.\nCercetează tehnologia ce poate fi găsită aici. Cultivă spori pt producÈ›ia de combustibil È™i mase plastice.\n\n[lightgray]Când facilitatea a decăzut, sporii au fost eliberaÈ›i. Nimic din din ecosistemul local nu a putut concura cu un organism atât de invaziv. +sector.windsweptIslands.description = Acest arhipelag izolat se află mai departe, după țărm. Datele arată că odată aveau structuri care produceau [accent]Plastaniu[].\n\nApără-te de unitățile navale ale inamicului. ConstruieÈ™te o bază pe insule. Cercetează fabricile necesare. +sector.extractionOutpost.description = Un avanpost izolat, construit de inamic cu scopul de a lansa resurse către alte sectoare.\n\nTehnologia de transport intersectorial este esenÈ›ială pt cuceririle ce urmează. Distruge baza. Cercetează platformele lor de lansare. +sector.impact0078.description = Aici se află rămășiÈ›ele primei nave de transport interstelar care a intrat în acest sistem stelar.\n\nSalvează cât de mult posibil din epavă. Cercetează orice tehnologie intactă. +sector.planetaryTerminal.description = Èšinta finală.\n\nAceastă bază de coastă conÈ›ine o structură capabilă să lanseze nuclee către alte planete locale. Este extrem de bine păzită.\n\nProdu unități navale. Elimină inamicul cât de rapid se poate. Cercetează structura de lansare. + +status.burning.name = Arde +status.freezing.name = ÃŽngheață +status.wet.name = Umed +status.muddy.name = Noroios +status.melting.name = TopeÈ™te +status.sapped.name = SlăbeÈ™te +status.spore-slowed.name = ÃŽmpiedicat de Spori +status.tarred.name = Păcurit +status.overclock.name = Suprasolicitat +status.shocked.name = Șoc +status.blasted.name = Explozie +status.unmoving.name = NemiÈ™cat settings.language = Limbă settings.data = Datele Jocului @@ -560,59 +647,103 @@ settings.clear.confirm = Sigur vrei să È™tergi datele?\nCe e făcut nu poate fi settings.clearall.confirm = [scarlet]AtenÈ›ie![]\nAsta va È™terge toate datele, inclusiv salvări, hărÈ›i, deblocări È™i atribuiri de controale.\nOdată ce apeÈ™i 'ok' jocul va È™terge toate datele È™i se va închide automat. settings.clearsaves.confirm = Sigur vrei să È™tergi toate salvările? settings.clearsaves = Șterge Salvările +settings.clearresearch = Șterge Tehnologiile Cercetate +settings.clearresearch.confirm = Sigur vrei să È™tergi toate tehnologiile cercetate în campanie? +settings.clearcampaignsaves = Șterge Salvările din Campanie +settings.clearcampaignsaves.confirm = Sigur vrei să È™tergi toate salvările din campanie? paused = [accent]< Pauză > clear = Curăță banned = [scarlet]Interzis -unplaceable.sectorcaptured = [scarlet]Ai nevoie de un sector capturat yes = Da no = Nu info.title = Info error.title = [scarlet]A apărut o eroare. error.crashtitle = A apărut o eroare. unit.nobuild = [scarlet]Unitatea nu poate construi. -blocks.input = Necesită -blocks.output = Produce -blocks.booster = Booster -blocks.tiles = Teren Necesar -blocks.affinities = Efecte Teren +lastaccessed = [lightgray]Ultima Accesare: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Capacitate electrică -blocks.powershot = Electricitate/GlonÈ› -blocks.damage = Forță -blocks.targetsair = LoveÈ™te Aeronave -blocks.targetsground = LoveÈ™te Artilerie -blocks.itemsmoved = Viteza de MiÈ™care a Materialelor -blocks.launchtime = Timp între Lansări -blocks.shootrange = Rază -blocks.size = Mărime -blocks.displaysize = Mărimea Monitorului Logic -blocks.liquidcapacity = Capacitate Lichid -blocks.powerrange = Raza Electrică -blocks.linkrange = Raza Legăturilor -blocks.instructions = InstrucÈ›iuni -blocks.powerconnections = Maxim Conexiuni -blocks.poweruse = Consum Electricitate -blocks.powerdamage = Electricitate/ForÈ›a GlonÈ›ului -blocks.itemcapacity = Capacitate Materiale -blocks.basepowergeneration = Generare Electricitate (Bază) -blocks.productiontime = Timp ProducÈ›ie -blocks.repairtime = Durata Reparării Blocului -blocks.speedincrease = CreÈ™tere Viteză -blocks.range = Rază -blocks.drilltier = Minabile -blocks.drillspeed = Viteză Burghiu (Bază) -blocks.boosteffect = Efect de Boost -blocks.maxunits = Maxim Unități Active -blocks.health = Viață -blocks.buildtime = Timp ConstrucÈ›ie -blocks.maxconsecutive = Maxim Consecutive -blocks.buildcost = Cost ConstrucÈ›ie -blocks.inaccuracy = InacurateÈ›e -blocks.shots = Lovituri -blocks.reload = Lovituri/Secundă -blocks.ammo = MuniÈ›ie -blocks.shieldhealth = ViaÈ›a Scutului -blocks.cooldowntime = Timp de Reîncărcare + +stat.description = Utilizare +stat.input = Necesită +stat.output = Produce +stat.opposites = OpuÈ™i +stat.booster = ÃŽmbunătățiri +stat.tiles = Teren Necesar +stat.affinities = Afinități +stat.powercapacity = Capacitate electrică +stat.powershot = Electricitate/GlonÈ› +stat.damage = Forță +stat.targetsair = LoveÈ™te Aeronave +stat.targetsground = LoveÈ™te Artilerie +stat.itemsmoved = Viteză de MiÈ™care a Materialelor +stat.launchtime = Timp între Lansări +stat.shootrange = Rază +stat.size = Mărime +stat.displaysize = Mărime Monitor Logic +stat.liquidcapacity = Capacitate Lichid +stat.powerrange = Rază Electrică +stat.linkrange = Rază Legături +stat.instructions = InstrucÈ›iuni +stat.powerconnections = Maxim Conexiuni +stat.poweruse = Consum Electricitate +stat.powerdamage = Electricitate/ForÈ›a GlonÈ›ului +stat.itemcapacity = Capacitate Materiale +stat.memorycapacity = Capacitate Memorie +stat.basepowergeneration = Generare Electricitate (Bază) +stat.productiontime = Timp ProducÈ›ie +stat.repairtime = Durată Reparare Bloc +stat.weapons = Arme +stat.bullet = GlonÈ› +stat.speedincrease = CreÈ™tere Viteză +stat.range = Rază +stat.drilltier = Minabile +stat.drillspeed = Viteză Burghiu (Bază) +stat.boosteffect = Efect de ÃŽmbunătățire +stat.maxunits = Maxim Unități Active +stat.health = Viață +stat.armor = Armură +stat.buildtime = Timp ConstrucÈ›ie +stat.maxconsecutive = Maxim Consecutive +stat.buildcost = Cost ConstrucÈ›ie +stat.inaccuracy = InacurateÈ›e +stat.shots = Lovituri +stat.reload = Lovituri/Secundă +stat.ammo = MuniÈ›ie +stat.shieldhealth = Viață Scut +stat.cooldowntime = Timp de Reîncărcare +stat.explosiveness = Explozivitate +stat.basedeflectchance = Șansă de Reflexie +stat.lightningchance = Șansă Fulger +stat.lightningdamage = Forță Fulger +stat.flammability = Inflamabilitate +stat.radioactivity = Radioactivitate +stat.heatcapacity = Capacitate de Căldură +stat.viscosity = Vâscozitate +stat.temperature = Temperatură +stat.charge = Sarcină Electrică +stat.speed = Viteză +stat.buildspeed = Viteză ConstrucÈ›ie +stat.minespeed = Viteză Minare +stat.minetier = Minabile +stat.payloadcapacity = Capacitate ÃŽncărcătură +stat.commandlimit = Nr Unități Comandate +stat.abilities = Abilități +stat.canboost = Are Propulsor +stat.flying = Zboară +stat.ammouse = Consum muniÈ›ie +stat.damagemultiplier = Multiplicator Forță +stat.healthmultiplier = Multiplicator Viață +stat.speedmultiplier = Multiplicator Viteză +stat.reloadmultiplier = Multiplicator Lovituri/sec +stat.buildspeedmultiplier = Multiplicator Viteză ConstrucÈ›ie +stat.reactive = ReacÈ›ionează la + +ability.forcefield = Câmp de Forță +ability.repairfield = Câmp de Reparare +ability.statusfield = Câmp Suprasolicitare Unități +ability.unitspawn = Fabrică de {0} +ability.shieldregenfield = Scut Regenerabil +ability.movelightning = MiÈ™care Fulger bar.drilltierreq = Burghiu Mai Bun Necesar bar.noresources = Resurse lipsă @@ -620,14 +751,15 @@ bar.corereq = Plasare pe Nucleu Necesară bar.drillspeed = Viteză Minare: {0}/s bar.pumpspeed = Viteză Pompare: {0}/s bar.efficiency = Eficiență: {0}% +bar.boost = Efect Grăbire: {0}% bar.powerbalance = Electricitate: {0}/s bar.powerstored = Stocată: {0}/{1} bar.poweramount = Electricitate: {0} bar.poweroutput = Electricitate Produsă: {0} +bar.powerlines = Conexiuni: {0}/{1} bar.items = Materiale: {0} bar.capacity = Capacitate: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = Lichid bar.heat = Căldură bar.power = Electricitate @@ -635,19 +767,24 @@ bar.progress = Progres bar.input = Necesită bar.output = Produce +units.processorcontrol = [lightgray]Controlat de Procesor + bullet.damage = [stat]{0}[lightgray] forță -bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate +bullet.splashdamage = [stat]{0}[lightgray] forță pe raza ~[stat] {1}[lightgray] pătrate bullet.incendiary = [stat]incendiar bullet.homing = [stat]cu radar -bullet.shock = [stat]È™oc -bullet.frag = [stat]fragil +bullet.frag = [stat]se sparge +bullet.lightning = [stat]{0}[lightgray]x fulgere ~ [stat]{1}[lightgray] forță +bullet.buildingdamage = [stat]{0}%[lightgray] forță/clădire bullet.knockback = [stat]{0} [lightgray]împingere -bullet.freezing = [stat]îngheÈ›at -bullet.tarred = [stat]lipicios +bullet.pierce = [stat]{0}[lightgray]x penetrează +bullet.infinitepierce = [stat]penetrează +bullet.healpercent = [stat]{0}[lightgray]% reparare bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniÈ›ie bullet.reload = [stat]{0}[lightgray]x lovituri unit.blocks = blocuri +unit.blockssquared = blocuri² unit.powersecond = electricitate/secundă unit.liquidsecond = unități lichid/secundă unit.itemssecond = materiale/secundă @@ -660,27 +797,32 @@ unit.persecond = /sec unit.perminute = /min unit.timesspeed = x viteză unit.percent = % -unit.shieldhealth = viaÈ›a scutului +unit.shieldhealth = viață scut unit.items = materiale unit.thousands = mii unit.millions = mil unit.billions = b +unit.pershot = /lovitură +category.purpose = Utilizare category.general = General category.power = Electricitate category.liquids = Lichide category.items = Materiale category.crafting = Necesită/Produce -category.shooting = Lovire +category.function = FuncÈ›ionare category.optional = ÃŽmbunătățiri opÈ›ionale setting.landscape.name = Blochează Mod Peisaj setting.shadows.name = Umbre setting.blockreplace.name = Sugestii Plasare Automats setting.linear.name = Filtrare Liniară setting.hints.name = Indicii +setting.logichints.name = Indicii Procesoare Logice setting.flow.name = AfiÈ™ează Rata de Curgere a lichidelor setting.buildautopause.name = Autopauză de la Construit -setting.mapcenter.name = Auto Centrează Harta La Jucător -setting.animatedwater.name = Fluide Animate +setting.backgroundpause.name = Pune Pauză în Fundal +setting.doubletapmine.name = Dublu-Click pt a Mina +setting.modcrashdisable.name = Dezactivează Modurile în Cazul unui Crash la Pornire +setting.animatedwater.name = SuprafeÈ›e Animate setting.animatedshields.name = Scuturi Animate setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[] setting.playerindicators.name = Indicatori Jucător @@ -707,23 +849,21 @@ setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii setting.sensitivity.name = Sensibilitatea Controlului setting.saveinterval.name = Interval de Salvare setting.seconds = {0} secunde -setting.blockselecttimeout.name = Selectarea Blocului a ÃŽntârziat setting.milliseconds = {0} millisecunde setting.fullscreen.name = Ecran Complet setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară) setting.fps.name = Vezi FPS & Ping setting.smoothcamera.name = Cameră Graduală -setting.blockselectkeys.name = Vezi Detalii Cheie cu Privire la Selectarea Blocurilor setting.vsync.name = VSync setting.pixelate.name = Pixelează setting.minimap.name = Vezi Miniharta -setting.coreitems.name = Vezi Materialele din Nucleu (neterminat) +setting.coreitems.name = Vezi Materialele din Nucleu setting.position.name = Vezi PoziÈ›ia Jucătorului setting.musicvol.name = Volumul Muzicii setting.atmosphere.name = Vezi Atmosfera Planetelor setting.ambientvol.name = Volum Ambiental setting.mutemusic.name = Muzica pe Mut -setting.sfxvol.name = Volum SFX +setting.sfxvol.name = Volum Efecte Sonore setting.mutesound.name = Sunetul pe Mut setting.crashreport.name = Trimite Rapoarte de Crash anonime setting.savecreate.name = Auto-Creează Salvări @@ -733,7 +873,9 @@ setting.chatopacity.name = Opacitate Chat setting.lasersopacity.name = Opacitate Laser Electric setting.bridgeopacity.name = Opacitate Poduri setting.playerchat.name = Vezi Chat Temporar -public.confirm = Vrei să îți faci jocul public?\n[accent]Oricine va putea intra în jocurile tale.\n[lightgray]Asta se poate schimba mai târziu în Setări->Joc->Vizibilitatea Jocurilor Publice. +setting.showweather.name = Vezi Vremea +public.confirm = Vrei să îți faci jocul public?\n[accent]Oricine va putea intra în jocurile tale.\n[lightgray]PoÈ›i schimba asta mai târziu din Setări->Joc->Vizibilitatea Jocurilor Publice. +public.confirm.really = Dacă vrei să joci cu prietenii, foloseÈ™te butonul [green]Invită Prieteni[] în loc de un [scarlet]Server Public[]!\nSigur vrei să-È›i faci jocul [scarlet]public[]? public.beta = De reÈ›inut că versiunile beta ale jocului nu poate face servere publice. uiscale.reset = Scara interfeÈ›ei a fost schimbată.\nApasă "OK" pt a confirma această scară.\n[scarlet]Revin setările È™i se iese în [accent] {0}[] secunde... uiscale.cancel = Anulare È™i ieÈ™ire @@ -797,15 +939,19 @@ keybind.menu.name = Meniu keybind.pause.name = Pauză keybind.pause_building.name = Pauză/Reia Construit keybind.minimap.name = Minihartă +keybind.planet_map.name = Harta Planetei +keybind.research.name = Cercetare +keybind.block_info.name = InformaÈ›iile Blocului keybind.chat.name = Chat keybind.player_list.name = Listă Jucători keybind.console.name = Consolă keybind.rotate.name = RoteÈ™te keybind.rotateplaced.name = RoteÈ™te Existent (Èšine) keybind.toggle_menus.name = PorneÈ™te/OpreÈ™te Meniuri -keybind.chat_history_prev.name = Previzualizare Istoric Chat -keybind.chat_history_next.name = Chat History Next +keybind.chat_history_prev.name = Istoric Chat ÃŽnapoi +keybind.chat_history_next.name = Istoric Chat Mai Departe keybind.chat_scroll.name = Scroll Chat +keybind.chat_mode.name = Schimbă Modul Chatului keybind.drop_unit.name = Lasă Unitatea keybind.zoom_minimap.name = Zoom Minihartă mode.help.title = Descrierea modurilor @@ -821,7 +967,9 @@ mode.attack.description = Distruge baza inamicului. \n[gray]E nevoie de un nucle mode.custom = Reguli Personalizate rules.infiniteresources = Resurse Infinite -rules.reactorexplosions = Explozia Reactoarelor +rules.reactorexplosions = Reactoarele Explodează +rules.coreincinerates = Nucleul Incinerează Resursele în Plus +rules.schematic = Se Pot Folosi Scheme rules.wavetimer = Valuri pe Timp rules.waves = Valuri rules.attack = Modul Atac @@ -832,6 +980,8 @@ rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților rules.unithealthmultiplier = Multiplicatorul VieÈ›ii Unităților rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților +rules.unitcapvariable = Nucleele Contribuie la Limita Unităților +rules.unitcap = Limita de Bază a Unităților rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) rules.wavespacing = SpaÈ›iul Dintre Valuri:[lightgray] (sec) rules.buildcostmultiplier = Multiplicatorul Costului ConstrucÈ›iei @@ -846,18 +996,23 @@ rules.title.enemy = Inamici rules.title.unit = Unități rules.title.experimental = Experimental rules.title.environment = Mediu -rules.lighting = Luminozitate +rules.lighting = Luminozitate Ambientală +rules.enemyLights = Inamicii Luminează rules.fire = Foc rules.explosions = Explozia Deteriorează Blocul/Unitatea rules.ambientlight = Ambient rules.weather = Vreme rules.weather.frequency = Frevență: +rules.weather.always = ÃŽncontinuu rules.weather.duration = Durată: content.item.name = Materiale content.liquid.name = Lichide content.unit.name = Unități content.block.name = Blocuri +content.status.name = Efecte de Status +content.sector.name = Sectoare + item.copper.name = Cupru item.lead.name = Plumb item.coal.name = Cărbune @@ -879,23 +1034,6 @@ liquid.slag.name = Zgură liquid.oil.name = Petrol liquid.cryofluid.name = Criofluid -item.explosiveness = [lightgray]Explozivitate: {0}% -item.flammability = [lightgray]Inflamabilitate: {0}% -item.radioactivity = [lightgray]Radioactivitate: {0}% - -unit.health = [lightgray]Viață: {0} -unit.speed = [lightgray]Viteză: {0} -unit.weapon = [lightgray]Armă: {0} -unit.itemcapacity = [lightgray]Capacitatea de Material: {0} -unit.minespeed = [lightgray]Viteza de Minare: {0}% -unit.minepower = [lightgray]Puterea Minării: {0} -unit.ability = [lightgray]Abilitate: {0} -unit.buildspeed = [lightgray]Viteza de ConstrucÈ›ie: {0}% - -liquid.heatcapacity = [lightgray]Capacitatea de Căldură: {0} -liquid.viscosity = [lightgray]Vâscozitatea: {0} -liquid.temperature = [lightgray]Temperatura: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -935,7 +1073,9 @@ block.parallax.name = Parallax block.cliff.name = Deal block.sand-boulder.name = Bolovan de Nisip block.grass.name = Iarbă +block.basalt-boulder.name = Bolovan de Bazalt block.slag.name = Zgură +block.space.name = Cosmos block.salt.name = Sare block.salt-wall.name = Perete de Sare block.pebbles.name = Pietricele @@ -980,6 +1120,7 @@ block.sand-water.name = Apă cu Nisip block.darksand-water.name = Apă cu Nisip Negru block.char.name = Turbă block.dacite.name = Dacit +block.dacite-boulder.name = Bolovan de Dacit block.dacite-wall.name = Perete de Dacit block.ice-snow.name = Gheață ÃŽnzăpezită block.stone-wall.name = Perete de Piatră @@ -1029,7 +1170,6 @@ block.conveyor.name = Bandă block.titanium-conveyor.name = Bandă de Titan block.plastanium-conveyor.name = Bandă de Plastaniu block.armored-conveyor.name = Bandă Armată -block.armored-conveyor.description = Cară materialele la aceeaÈ™i viteză ca benzile de titan, dar posedă o armură. Nu acceptă materiale de pe lateral decât de la alte benzi armate. block.junction.name = IntersecÈ›ie block.router.name = Router block.distributor.name = Distributor @@ -1037,7 +1177,6 @@ block.sorter.name = Sortator block.inverted-sorter.name = Sortator Invers block.message.name = Mesaj block.illuminator.name = Iluminator -block.illuminator.description = O sursă de lumină mică, compactă, configurabilă. Necesită electricitate pt a funcÈ›iona. block.overflow-gate.name = Poartă de Revărsare block.underflow-gate.name = Poartă de Subversare block.silicon-smelter.name = Topitor de Silicon @@ -1071,10 +1210,11 @@ block.item-void.name = Portal de Material block.liquid-source.name = Sursă de Lichid block.liquid-void.name = Portal de Lichid block.power-void.name = Consumator de Electricitate -block.power-source.name = Electricitate Infinită +block.power-source.name = Sursă de Electricitate block.unloader.name = Descărcător block.vault.name = Seif block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1112,8 +1252,9 @@ block.overdrive-projector.name = Proiector de Suprasolicitare block.force-projector.name = Proiector de Forță block.arc.name = Arc block.rtg-generator.name = Generator RTG -block.spectre.name = Specter +block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Platformă de Lansare block.launch-pad-large.name = Platformă de Lansare Mare @@ -1131,175 +1272,414 @@ block.payload-router.name = Router în Masă block.disassembler.name = Dezasamblator block.silicon-crucible.name = Creuzet de Silicon block.overdrive-dome.name = Dom de Suprasolicitare +block.interplanetary-accelerator.name = Accelerator Interplanetar +#experimental, pot fi È™terse în viitor +block.block-forge.name = Forjă de Blocuri +block.block-loader.name = ÃŽncărcător de Blocuri +block.block-unloader.name = Descărcător de Blocuri block.switch.name = ÃŽntrerupător block.micro-processor.name = Microprocesor block.logic-processor.name = Procesor Logic -block.hyper-processor.name = Hyperprocesor +block.hyper-processor.name = Hiperprocesor block.logic-display.name = Monitor Logic block.large-logic-display.name = Monitor Logic Mare block.memory-cell.name = Celulă de Memorie +block.memory-bank.name = Bancă de Memorie team.blue.name = albastră team.crux.name = roÈ™ie team.sharded.name = portocalie team.orange.name = portocalie -team.derelict.name = abandon +team.derelict.name = abandonată team.green.name = verde team.purple.name = mov -tutorial.next = [lightgray] -tutorial.intro = Bun venit în[scarlet] Tutorialul Mindustry.[]\nFoloseÈ™te[accent] [[WASD][] ca să te miÈ™ti.\n[accent]Cu rotiÈ›a[] poÈ›i face harta mai mare sau mai mică.\nÃŽncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru -tutorial.intro.mobile = Bun venit în[scarlet] Tutorialul Mindustry.[]\nGlisează pe ecran pt a te miÈ™ca.\n[accent]Trage cu 2 degete[] pt face harta mai mare sau mai mică.\nÃŽncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru -tutorial.drill = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colÈ›ul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click.\nPoÈ›i selecta burghiul È™i apăsând [accent][[2][] apoi rapid [accent][[1][], indiferent de ce tab este deschis.\n[accent]Click-dreapta[] ca să te opreÈ™ti din a construi. -tutorial.drill.mobile = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colÈ›ul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click, apoi apasă pe[accent] bifa[] de mai jos pt a-È›i confirma selecÈ›ia.\nApasă pe[accent] butonul X[] pt a anula plasarea. -tutorial.blockinfo = Fiecare bloc are statistici diferite. Fiecare burghiu poate mina minereuri diferite.\nPt a verifica informaÈ›iile despre un bloc,[accent] dă click pe butonul "?" care apare când blocul este selectat din meniu.[]\n\n[accent]Accesează informaÈ›ii despre Burghiul Mecanic.[] -tutorial.conveyor = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruieÈ™te o bandă rulantă de la burghiu către nucleu.\n[accent]Èšine apăsat pe mouse pt a desena o linie.[]\nÈšine[accent] CTRL[] în timp se plasezi o line pt a o plasa diagonal.\nFoloseÈ™te rotiÈ›a pt a roti blocurile înainte să le plasezi.\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. -tutorial.conveyor.mobile = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruieÈ™te o bandă rulantă de la burghiu către nucleu.\n[accent] ConstruieÈ™te o linie È›inând degetul pe ecran câteva secunde È™i apoi[] trage într-o direcÈ›ie.\n\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. -tutorial.turret = Odată ce un material intră în nucleu, poate fi folosit pt a construi.\nDe reÈ›inut că nu toate materialele pot fi folosite pt construit.\nMaterialele care nu sunt folosite pt construit, cum ar fi[accent] cărbunele[] sau[accent] fierul vechi[], nu pot fi puse în nucleu.\nTrebuie să construieÈ™ti structuri defensive ca să te aperi de[lightgray] inamici[].\nConstruieÈ™te [accent]o armă duo[] lângă baza ta. -tutorial.drillturret = Armele Duo au nevoie de[accent] muniÈ›ie de cupru[] pt a trage.\nPlasează un burghiu lângă armă.\nConstruieÈ™te o bandă către armă pt a o alimenta cu muniÈ›ie de cupru.\n\n[accent]MuniÈ›ie livrată: 0/1 -tutorial.pause = ÃŽn timpul luptei, poÈ›i[accent] da pauză la joc.[]\nPoÈ›i planifica construcÈ›ii în timpul pauzei.\n\n[accent]Apasă pe space pt a da pauză. -tutorial.pause.mobile = ÃŽn timpul luptei, poÈ›i[accent] da pauză la joc.[]\nPoÈ›i planifica construcÈ›ii în timpul pauzei.\n\n[accent]Apasă butonul din colÈ›ul din stânga sus pt a da pauză. -tutorial.unpause = Acum apasă space din nou pt a continua. -tutorial.unpause.mobile = Acum apasă-l din nou pt a continua. -tutorial.breaking = Uneori, blocurile trebuie distruse.\n[accent]Èšine apăsat pe click dreapta[] pt a distruge toate blocurile dintr-o selecÈ›ie.[]\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. -tutorial.breaking.mobile = Uneori, blocurile trebuie distruse.\n[accent]Selectează modul deconstrucÈ›ie[], aopi dă click pe un bloc pt a-l distruge.\nDistruge o zonă È›inând apăsat cu degetul pt câteva secunde[] È™i apoi trăgând într-o direcÈ›ie.\nApasă bifa de mai jos pt a confirma distrugerea.\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. -tutorial.withdraw = Câteodată a lua materiale direct din blocuri este necesar.\nPt a face asta, [accent]dă click pe un bloc[] cu materiale în el, apoi [accent]dă click pe materialul[] din inventar.\nMai multe materiale pot fi luate [accent]făcând click È™i È›inând apăsat[].\n\n[accent]Ia niÈ™te cupru din nucleu.[] -tutorial.deposit = Depozitează materiale înapoi în blocuri trăgând din nava ta către blocul de destinaÈ›ie.\n\n[accent]Depozitează cuprul înapoi în nucleu.[] -tutorial.waves = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri.[accent] Click[] pt a trage cu arma.\nConstruieÈ™te mai multe arme È™i burghie. Minează mai mult cupru. -tutorial.waves.mobile = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri. Nava ta va trage automat către inamici.\nConstruieÈ™te mai multe arme È™i burghie. Minează mai mult cupru. -tutorial.launch = Odată ce ajungi la un anumit val, poÈ›i [accent]lansa nucleul[], lăsându-È›i apărările în urmă È™i[accent] obÈ›inând toate resursele din nucleu.[]\nResursele obÈ›inute pot fi apoi folosite pt a cerceta noi tehnologii.\n\n[accent]Apasă butonul de lansare. +hint.skip = Treci peste +hint.desktopMove = FoloseÈ™te [accent][[WASD][] ca să te miÈ™ti. +hint.zoom = [accent]Cu rotiÈ›a de la mouse[] poÈ›i ajusta zoomul. +hint.mine = Du-te lângă \uf8c4 minereul de cupru È™i [accent]dă click[] pe el pt a mina manual. +hint.desktopShoot = [accent][[Click-stânga][] pt a trage cu armele navei. +hint.depositItems = Pt a transfera materiale, trage-le din nava ta către nucleu. +hint.respawn = Pt a te regenera ca navă în nucleu, apasă [accent][[V][]. +hint.respawn.mobile = Acum controlezi o unitate/structură. Pt a te regenera ca navă în nucleu, [accent]dă click pe avatarul din colÈ›ul din stânga-sus.[] +hint.desktopPause = Apasă pe [accent][[Space][] pt a da pauză jocului. Apasă din nou pt a ieÈ™i din modul pauză. +hint.placeDrill = Selectează tabul \ue85e [accent]Burghie[] din meniul din dreapta-jos, apoi selectează un \uf870 [accent]Burghiu[] È™i dă click pe un minereu de cupru pt a mina. +hint.placeDrill.mobile = Selectează tabul \ue85e [accent]Burghie[] din meniul din dreapta-jos, apoi selectează un \uf870 [accent]Burghiu[] È™i dă click un minereu de cupru pt a mina.\n\nApasă pe \ue800 [accent]bifa[] din dreapta-jos pt confirmare. +hint.placeConveyor = Benzile transportă materiale din burghie către alte blocuri. Selectează o \uf896 [accent]Bandă[] din tabul \ue814 [accent]DistribÈ›ie[].\n\nDă click pe ecran È™i trage pt a desena o linie de bandă.\nFoloseÈ™te [accent]rotiÈ›a mouseului[] pt rotire. +hint.placeConveyor.mobile = Benzile transportă materiale din burghie către alte blocuri. Selectează o \uf896 [accent]Bandă[] din tabul \ue814 [accent]DistribÈ›ie[].\n\nÈšine apăsat cu degetul pt o secundă È™i trage pt a desena o linie de bandă. +hint.placeTurret = ConstruieÈ™te \uf861 [accent]Arme[] pt a-È›i apăra baza de inamici.\n\nArmele necesită muniÈ›ie. Putem folosi \uf838cupru.\nAlimentează arma folosind benzi È™i burghie. +hint.breaking = Èšine apăsat [accent]click-dreapta[] È™i trage pe ecran pt a distruge blocuri. +hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos È™i dă click pt a distruge blocuri.\n\nÈšine apăsat cu degetul pt o secundă È™i trage pt a distruge mai multe blocuri deodată. +hint.research = FoloseÈ™te butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii. +hint.research.mobile = FoloseÈ™te butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii. +hint.unitControl = Èšine apăsat [accent][[Ctrl][] È™i [accent]dă click[] pt a controla unități aliate sau arme. +hint.unitControl.mobile = [accent][[Dă dublu click][] pt a controla unități aliate sau arme. +hint.launch = Odată ce s-au strâns suficiente resurse, poÈ›i [accent]Lansa[] către o altă zonă selectând sectoarele învecinate folosind \ue827 [accent]Harta[] din dreapta-jos. +hint.launch.mobile = Odată ce s-au strâns suficiente resurse, poÈ›i [accent]Lansa[] către o altă zonă selectând sectoarele învecinate folosind \ue827 [accent]Harta[] din \ue88c [accent]Meniu[]. +hint.schematicSelect = Èšine apăsat [accent][[F][] È™i trage pt a selecta blocuri pt copiere.\n\n[accent][[Click pe rotiță][] pt a copia un singur tip de bloc. +hint.conveyorPathfind = Èšine apăsat [accent][[Ctrl][] în timp ce plasezi benzi pt a genera automat o cale între 2 puncte. +hint.conveyorPathfind.mobile = Activează \ue844 [accent]modul diagonal[] È™i plasează benzi pt a genera automat o cale între 2 puncte. +hint.boost = Èšine apăsat [accent][[Shift][] pt a zbura peste obstacole cu unitatea ta.\n\nDoar câteva unități de artilerie au propulsoare. +hint.command = Apasă [accent][[G][] pt a comanda unitățile [accent]similare[] din apropiere în formaÈ›ie.\n\nPt a comanda unități de artilerie, trebuie întâi să controlezi o unitate de artilerie. +hint.command.mobile = [accent][[Dublu-click][] pe unitatea ta pt a comanda unitățile [accent]similare[] din apropiere în formaÈ›ie. +hint.payloadPickup = Apasă [accent][[[] pt a ridica blocuri mici sau unități. +hint.payloadPickup.mobile = [accent]Èšine apăsat[] pe un bloc mic/o unitate pt a o ridica. +hint.payloadDrop = Apasă [accent]][] pt a descărca încărcătura. +hint.payloadDrop.mobile = [accent]Èšine apăsat[] pe o locaÈ›ie goală pt a descărca încărcătura acolo. +hint.waveFire = Armele [accent]Wave[] încărcate cu apă vor stinge incendiile automat. +hint.generator = \uf879 [accent]Generatoarele pe Combustie[] ard cărbunele È™i transmit electricitatea blocurilor învecinate.\n\nElectricitatea poate fi transmisă pe distanÈ›e lungi folosind \uf87f [accent]Noduri Electrice[]. +hint.guardian = Unitățile [accent]Gardian[] au armuri puternice. MuniÈ›iile slabe precum [accent]Cuprul[] È™i [accent]Plumbul[] [scarlet]nu sunt eficiente[].\n\nFoloseÈ™te arme mai bune sau muniÈ›ie de \uf835 [accent]Grafit[] pt \uf861Duo/\uf859Salvo pt a nimici Gardianul. +hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu  [accent]Foundation[] peste nucleul ï¡© [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea. +hint.presetLaunch = PoÈ›i lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opÈ›ionale[]. +hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[]. +hint.coopCampaign = Când joci [accent]campania cooperând cu alÈ›i jucători[], materialele produse în sectorul curent vor fi transferate È™i către [accent]sectoarele tale locale[].\n\nDe asemenea, vei debloca tot ceea ce cercetează gazda. -item.copper.description = Materialul structural cel mai de bază. Folosit în mod extensiv în toate tipurile de blocuri. -item.lead.description = Un material de bază. Folosit în mod extensiv în electronice È™i blocuri transportoare de lichid. -item.metaglass.description = Un compus de sticlă super rezistent. Folosit în mod extensiv pt distribuirea È™i stocarea de lichide. -item.graphite.description = Carbon mineralizat, folosit pt muniÈ›ie È™i componente electrice. -item.sand.description = Un material des întâlnit care se foloseÈ™te extensiv în topitorii, în special pt aliaje. -item.coal.description = Materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. Folosit extensiv ca combustibil È™i pt producerea de resurse. -item.titanium.description = Un metal rar È™i super uÈ™or folosit extensiv pt transportul lichidelor, burghie È™i aeronautică. -item.thorium.description = Un metal dens, radioactiv, folosit ca suport structural È™i combustibil nuclear. -item.scrap.description = RămășiÈ›e ale structurilor È™i unităților vechi. ConÈ›ine urme ale multor metale diferite. -item.silicon.description = Un semiconductor extrem de folositor. AplicaÈ›ii în energia solară, electronice complexe È™i muniÈ›ie cu radar. -item.plastanium.description = Un material uÈ™or, flexibil folosit în aeronautica avansată È™i muniÈ›ie fragilă. -item.phase-fabric.description = O substanță cu greutate aproape de 0 folosită în electronica avansată È™i tehnologia de autoreparare. -item.surge-alloy.description = Un aliaj avansat cu proprietăți electrice unice. -item.spore-pod.description = O păstaie de spori, sintetizaÈ›i din concentraÈ›iile atmosferice pt utilizări industriale. Folosit pt a fi convertit în petrol, explozibili È™i combustibil. -item.blast-compound.description = Un compus instabil folosit în bombe È™i explozibili. Sintetizat din păstăile de spori È™i alte materiale volatile. Folosirea ca combustibil nu e recomandată. -item.pyratite.description = O substanță extrem de inflamabilă folosită în armele incendiare. -liquid.water.description = Cel mai util lichid. Folosit deseori pt răcirea maÈ™inăriilor È™i procesarea deÈ™eurilor. -liquid.slag.description = Diferite tipuri de metal topit amestacate laolaltă. Poate fi separat în materialele constituente, sau pulverizat înspre unitățile inamice ca armă. -liquid.oil.description = Un lichid folosit în producerea de materiale avansate. Poate fi convertit în cărbune pt combustibil, sau pulverizat È™i ars ca armă. -liquid.cryofluid.description = Un lichid inert, non coroziv creat din apă È™i titan. Are o capacitate de absorbÈ›ie a căldurii mare. Folosit în mod extensiv ca răcitor. +item.copper.description = Folosit în tot felul de construcÈ›ii È™i muniÈ›ie. +item.copper.details = Cupru. Metal anormal de abundent pe Serpulo. Structural slab dacă nu este consolidat. +item.lead.description = Folosit în transportarea lichidelor È™i în electronică. +item.lead.details = Dens. Inert. Folosit extensiv în baterii.\nObservaÈ›ie: Probabil toxic pt formele de viață biologice. Nu că ar mai fi rămas prea multe aici. +item.metaglass.description = Folosită pt distribuirea È™i stocarea de lichide. +item.graphite.description = Folosit pt componente electrice È™i alimentarea armelor cu muniÈ›ie. +item.sand.description = Folosit pt producÈ›ie sau alte materiale rafinate. +item.coal.description = Folosit extensiv ca combustibil È™i pt producerea de materiale rafinate. +item.coal.details = Pare să fie materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. +item.titanium.description = Folosit pt structuri transportatoare de lichid, burghie È™i aeronautică. +item.thorium.description = Folosit în structuri durabile È™i combustibil nuclear. +item.scrap.description = Folosit in topitoare È™i pulverizatoare pt a fi rafinat în alte materiale. +item.scrap.details = RămășiÈ›e ale structurilor È™i unităților vechi. +item.silicon.description = Folosit în producerea energiei solare, electronice complexe È™i muniÈ›ie cu radar pt armament. +item.plastanium.description = Folosit pt unitățile militare avansate, ca izolator electric È™i muniÈ›ie fragilă. +item.phase-fabric.description = Folosită în electronica avansată È™i tehnologia de autoreparare. +item.surge-alloy.description = Folosit în electronica avansată È™i structurile defensive reactive. +item.spore-pod.description = Folosită pt a fi convertită în petrol, explozibili È™i combustibil. +item.spore-pod.details = Spori. Probabil o formă de viață sintetică. Emite gaze toxice altor forme de viață biologică. Nu că ar mai fi rămas prea multe aici. +item.blast-compound.description = Folosit în bombe È™i muniÈ›ie explozibilă. +item.pyratite.description = Folosită în armele incendiare È™i generatoarele pe bază de procese de combustie. +liquid.water.description = Folosită pt răcirea maÈ™inăriilor È™i procesarea deÈ™eurilor. +liquid.slag.description = Rafinată în separatoare înapoi în materialele constituente, sau pulverizată înspre unitățile inamice ca armă. +liquid.oil.description = Folosit în producerea avansată de materiale È™i ca muniÈ›ie incendiară. +liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme È™i fabrici. + +block.resupply-point.description = Realimentează unitățile din apropiere cu muniÈ›ie de cupru. Nu este compatibil cu unitățile care se încarcă din baterii. +block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi. +block.illuminator.description = Emite lumină. block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliaÈ›i. -block.graphite-press.description = Compresează bucăți de cărbune în plăci de grafit pur. -block.multi-press.description = O versiune mai bună a presei de grafit. FoloseÈ™te apă È™i electricitate pt a procesa cărbunele rapid È™i eficient. -block.silicon-smelter.description = Transformă nisipul È™i cărbunele pur. Produce silicon. -block.kiln.description = Toarnă nisip È™i plumb în compusul numit metasticlă. Necesită puÈ›ină electricitate pt pornire. +block.graphite-press.description = Compresează cărbunele în grafit. +block.multi-press.description = Compresează cărbunele în grafit. Are nevoie de apă ca răcitor. +block.silicon-smelter.description = Rafinează silicon din nisip È™i cărbune. +block.kiln.description = Toarnă nisipul È™i plumbul în metasticlă. block.plastanium-compressor.description = Produce plastaniu din petrol È™i titan. -block.phase-weaver.description = Sintetizează fibră-fază din toriu radioactiv È™i nisip. Necesită electricitate pt a funcÈ›iona. +block.phase-weaver.description = Sintetizează fibră-fază din toriu È™i nisip. block.alloy-smelter.description = Combină titan, plumb, silicon È™i cupru pt a produce supra aliaj. -block.cryofluid-mixer.description = Amestecă apă È™i pudră fină de titan în criofluid. EsenÈ›ial pt folosirea în reactoarele de toriu. -block.blast-mixer.description = ZdrobeÈ™te È™i amestecă gramezi de spori cu piratită pt a produce un compus explozibil. -block.pyratite-mixer.description = Amestecă niÈ™te cărbune, plumb È™i nisip în inflamabila piratită. -block.melter.description = TopeÈ™te fierul vechi în zgură pt procesare ulterioară sau folosire în armele Wave. -block.separator.description = Separă zgura în componentele sale minerale. Furnizează rezultatul răcit. -block.spore-press.description = Compresează păstăi de spori sub presiuni extreme pt a sintetiza petrol. +block.cryofluid-mixer.description = Amestecă apă È™i pudră fină de titan pt a produce criofluid. +block.blast-mixer.description = Produce un compus explozibil din piratită È™i păstăi de spori. +block.pyratite-mixer.description = Amestecă plumb, cărbune È™i nisip în piratită. +block.melter.description = TopeÈ™te fierul vechi în zgură. +block.separator.description = Separă zgura în componentele sale minerale. +block.spore-press.description = Compresează păstăile de spori în petrol. block.pulverizer.description = ZdrobeÈ™te fierul vechi în nisip fin. -block.coal-centrifuge.description = Solidifică petrolul în bucăți de cărbune. -block.incinerator.description = Vaporizează orice exces de material sau lichid primeÈ™te. +block.coal-centrifuge.description = Transformă petrolul în cărbune. +block.incinerator.description = Vaporizează orice material sau lichid primeÈ™te. block.power-void.description = Consumă toată electricitatea primită. Doar în modul sandbox. block.power-source.description = Generează electricitate infinită. Doar în modul sandbox. block.item-source.description = Generează materiale la infinit. Doar în modul sandbox. block.item-void.description = Distruge orice material. Doar în modul sandbox. block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox. block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox. -block.copper-wall.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul È™i armele în primele valuri. -block.copper-wall-large.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul È™i armele în primele valuri.\nSe întinde pe mai multe pătrate. -block.titanium-wall.description = Un perete defensiv de rezistență moderată.\nFurnizează protecÈ›ie moderată împotriva inamicilor. -block.titanium-wall-large.description = Un perete defensiv de rezistență moderată.\nFurnizează protecÈ›ie moderată împotriva inamicilor. \nSe întinde pe mai multe pătrate. -block.plastanium-wall.description = Un tip special de perete care absoarbe laserele electrice È™i blochează conectarea automată a nodurilor electrice. -block.plastanium-wall-large.description = Un tip special de perete care absoarbe laserele electrice È™i blochează conectarea automată a nodurilor electrice.\nSe întinde pe mai multe pătrate. -block.thorium-wall.description = Un perete defenziv puternic. \nProtecÈ›ie decentă împotriva inamicilor. -block.thorium-wall-large.description = Un perete defenziv puternic. \nProtecÈ›ie decentă împotriva inamicilor.\nSe întinde pe mai multe pătrate. -block.phase-wall.description = Un perete învelit într-un material reflexiv special bazat pe fibra-fază. Reflectă majoritatea gloanÈ›elor la impact. -block.phase-wall-large.description = Un perete învelit într-un material reflexiv special bazat pe fibra-fază. Reflectă majoritatea gloanÈ›elor la impact.\nSe întinde pe mai multe pătrate. -block.surge-wall.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanÈ›ele, lansând-o la întâmplare. -block.surge-wall-large.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanÈ›ele, lansând-o la întâmplare.\nSe întinde pe mai multe pătrate. -block.door.description = O ușă mică. Poate fi deschisă sau închisă dând click. -block.door-large.description = O ușă mare. Poate fi deschisă sau închisă dând click.\nSe întinde pe mai multe pătrate. -block.mender.description = Repară periodic blocurile din vecinătate. MenÈ›ine apărările în stare bună între valuri.\nPoate folosi silicon pt un boost al razei de acÈ›iune È™i al eficienÈ›ei. -block.mend-projector.description = O versiune mai bună a reparatorului. Repară periodic blocurile din vecinătate. \nPoate folosi fibră-fază pt un boost al razei de acÈ›iune È™i al eficienÈ›ei. -block.overdrive-projector.description = GrăbeÈ™te blocurile din apropiere.\nPoate folosi fibră-fază pt un boost al razei de acÈ›iune È™i al eficienÈ›ei. -block.force-projector.description = Creează un câmp de forță hexagonal în jurul său, protejând blocurile È™i unitățile din interior de deteriorare.\nSe supraîncălzeÈ™te dacă este prea deteriorat. Poate folosi răcitor pt a preveni supraîncălzirea pt a preveni supraîncălzirea. Fibra-fază poate fi folosită pt a creÈ™te mărimea scutului. -block.shock-mine.description = RăneÈ™te inamicii care calcă pe ea. Aproape invizibilă pt inamic. -block.conveyor.description = Bloc de transport al materialelor. ÃŽmpinge materialele în față È™i le depozitează automat în blocuri. Poate fi rotită. -block.titanium-conveyor.description = Bloc avansat de transport al materialelor. ÃŽmpinge materialele mai rapid decât blocurile standard. -block.plastanium-conveyor.description = ÃŽmpingee grămezi de materiale.\nAcceptă materiale din spate, È™i le descarcă în 3 direcÈ›ii în față.\nNecesită mai multe puncte de încărcare È™i descărcare pt a transporta nr maxim de materiale/secundă. -block.junction.description = AcÈ›ionează ca un pod pt două benzi care se intersectează. Util în situaÈ›ii în care se intersectează 2 benzi cărând diverse materiale în diferite locaÈ›ii. -block.bridge-conveyor.description = Bloc avansat de transport al materialelor. Permite transportul materialelor peste orice teren sau clădire, până la 3 pătrate distanță. -block.phase-conveyor.description = Bloc avansat de transport al materialelor. FoloseÈ™te electricitate pt a teleporta materialele la o altă bandă de fază peste mai multe pătrate. -block.sorter.description = Sortează materialele. Dacă un material se potriveÈ™te selecÈ›iei, este lăsat să treacă. Altfel, materialul este transportat la stânga sau la dreapta. -block.inverted-sorter.description = Procesează materialele ca un sortator standard, dar materialele selectate sunt transportate la stânga sau la dreapta. -block.router.description = Acceptă materiale, apoi le distribuie în alte 3 direcÈ›ii în mod egal. Util pt a împărÈ›i materialele de la o sursă către mai multe destinaÈ›ii.\n\n[scarlet]Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produÈ™ii blocurilor.[] -block.distributor.description = Un router avansat. ÃŽmparte materialele în alte 7 direcÈ›ii în mod egal. +block.copper-wall.description = Protejează clădirile de proiectilele inamice. +block.copper-wall-large.description = Protejează clădirile de proiectilele inamice. +block.titanium-wall.description = Protejează clădirile de proiectilele inamice. +block.titanium-wall-large.description = Protejează clădirile de proiectilele inamice. +block.plastanium-wall.description = Protejează clădirile de proiectilele inamice. Absoarbe laserele electrice. Blochează conectarea automată a nodurilor electrice. +block.plastanium-wall-large.description = Protejează clădirile de proiectilele inamice. Absoarbe laserele electrice. Blochează conectarea automată a nodurilor electrice. +block.thorium-wall.description = Protejează clădirile de proiectilele inamice. +block.thorium-wall-large.description = Protejează clădirile de proiectilele inamice. +block.phase-wall.description = Protejează clădirile de proiectilele inamice, reflectând majoritatea gloanÈ›elor la impact. +block.phase-wall-large.description = Protejează clădirile de proiectilele inamice, reflectând majoritatea gloanÈ›elor la impact. +block.surge-wall.description = Protejează clădirile de proiectilele inamice, lansând periodic lasere electrice la contactul cu gloanÈ›ele. +block.surge-wall-large.description = Protejează clădirile de proiectilele inamice, lansând periodic lasere electrice la contactul cu gloanÈ›ele. +block.door.description = Un perete care poate fi deschis sau închis. +block.door-large.description = Un perete care poate fi deschis sau închis. +block.mender.description = Repară periodic blocurile din vecinătate. \nPoate folosi silicon pt a îmbunătăți raza de acÈ›iune È™i eficienÈ›a. +block.mend-projector.description = Repară blocurile din vecinătate. \nPoate folosi fibră-fază pt a îmbunătăți raza de acÈ›iune È™i eficienÈ›a. +block.overdrive-projector.description = GrăbeÈ™te blocurile din apropiere.\nPoate folosi fibră-fază a îmbunătăți raza de acÈ›iune È™i eficienÈ›a. +block.force-projector.description = Crează un câmp hexagonal de forță în jurul său, protejând blocurile È™i unitățile din interior de deteriorare. Se supraîncălzeÈ™te dacă este prea deteriorat. Poate folosi răcitor pt a preveni supraîncălzirea. Fibra-fază poate fi folosită pt a creÈ™te mărimea scutului. +block.shock-mine.description = Lansează lasere electrice la contactul cu inamicul. +block.conveyor.description = Transportă materialele înainte. +block.titanium-conveyor.description = Transportă materialele înainte. Mai rapidă decât benzile standard. +block.plastanium-conveyor.description = Transportă grămezi de materialele înainte.\nAcceptă materiale din spate, È™i le descarcă în 3 direcÈ›ii în față.\nNecesită mai multe puncte de încărcare È™i descărcare pt a transporta nr maxim de materiale/secundă. +block.junction.description = AcÈ›ionează ca un pod pt două benzi care se intersectează. +block.bridge-conveyor.description = Transportă materiale peste orice teren sau clădire. +block.phase-conveyor.description = Transportă instant materiale peste orice teren sau clădire. Poate fi mai lung decât podul de bandă, dar necesită electricitate. +block.sorter.description = Dacă un material se potriveÈ™te selecÈ›iei, este lăsat să treacă. Altfel, materialul este transportat la stânga sau la dreapta. +block.inverted-sorter.description = Similar sortatorului standard, dar materialul selectat este transportat la stânga sau la dreapta. +block.router.description = Distribuie materialele primite în alte 3 direcÈ›ii în mod egal. +block.router.details = Un rău necesar. Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produÈ™ii blocurilor. +block.distributor.description = Distribuie materialele primite în alte 7 direcÈ›ii în mod egal. block.overflow-gate.description = Transportă materialele doar la stânga È™i dreapta dacă drumul din față este blocat. block.underflow-gate.description = Opusul porÈ›ii de revărsare. Transportă materialele în față dacă benzile din stânga È™i dreapta sunt blocate. -block.mass-driver.description = Cel mai bun bloc de transport al materialelor. Adună mai multe materiale È™i apoi le lansează până la un alt distributor în masă pe o rază mare. Necesită electricitate pt a opera. -block.mechanical-pump.description = O pompă ieftină care pompează puÈ›in, dar nu consumă electricitate. -block.rotary-pump.description = O pompă avansată. Pompează mai mult lichid dar consumă electricitate. -block.thermal-pump.description = Cea mai bună pompă. -block.conduit.description = Un bloc de transport al lichidelor. ÃŽmpinge lichidele în față. Folosit cu pompe È™i alte conducte. -block.pulse-conduit.description = Un bloc avansat de transport al lichidelor. Transportă lichidele mai rapid È™i stochează mai mult decât conductele standard. -block.plated-conduit.description = Transportă lichidele lafel de rapid precum conductele cu puls, dar este mai rezistent. Nu acceptă fluide din lateral de la altceva în afară de conducte.\nCurge mai puÈ›in. -block.liquid-router.description = Acceptă lichide dintr-o direcÈ›ie È™i le distribuie în alte 3 direcÈ›ii în mod egal. Poate stoca o anumită cantitate de lichid. Folositor pt a distribui lichidele dintr-o sursă către mai multe destinaÈ›ii. -block.liquid-tank.description = Stochează o mare cantitate de lichid. Util pt depozita lichide pt situaÈ›iile în care cererea de materiale nu e constantă sau ca extra securitate pt răcirea blocurilor vitale. -block.liquid-junction.description = AcÈ›ionează ca un pod pt două conducte care se intersectează. Util în situaÈ›ia în care se intersectează 2 conducte diferite ce cară divesre lichide către diverse locaÈ›ii. -block.bridge-conduit.description = Un bloc avansat de transport al lichidelor. Permite transportul lichidelor peste orice tip teren sau bloc, până la 3 pătrate distanță. -block.phase-conduit.description = Un bloc avansat de transport al lichidelor. FoloseÈ™te electricitate pt a teleporta lichidele către o altă conductă de fază la o mare distanță. +block.mass-driver.description = Dispozitiv folosit pt transportul materialelor pe distanÈ›e mari. Adună mai multe materiale È™i apoi le lansează până la un alt distributor în masă pe o rază mare. +block.mechanical-pump.description = Pompează lichide din mediul înconjurător. Nu necesită electricitate. +block.rotary-pump.description = Pompează lichide din mediul înconjurător. Necesită electricitate. +block.thermal-pump.description = Pompează lichide din mediul înconjurător. +block.conduit.description = ÃŽmpinge lichidele în față. Folosit cu pompe È™i alte conducte. +block.pulse-conduit.description = ÃŽmpinge lichidele în față. Transportă lichidele mai rapid È™i stochează mai mult decât conductele standard. +block.plated-conduit.description = ÃŽmpinge lichidele în față. Nu acceptă lichide din lateral de la altceva în afară de conducte. Lichidul nu se varsă la exterior. +block.liquid-router.description = Acceptă lichide dintr-o direcÈ›ie È™i le distribuie în alte 3 direcÈ›ii în mod egal. Poate stoca o anumită cantitate de lichid. +block.liquid-tank.description = Stochează o mare cantitate de lichid È™i îl lasă să curgă prin toate conductele adiacente, similar unui router de lichid. +block.liquid-junction.description = AcÈ›ionează ca un pod pt două conducte care se intersectează. +block.bridge-conduit.description = Transportă lichidele peste orice teren sau clădire. +block.phase-conduit.description = Transportă lichidele peste orice teren sau clădire. Poate fi mai lungă decât podul de conductă, dar necesită electricitate. block.power-node.description = Transmite electricitate către nodurile conectate. Nodul primeÈ™te electricitate din sau oferă electricitate oricăror blocuri adiacente. block.power-node-large.description = Un nod electric avansat cu o rază mare. block.surge-tower.description = Un nod electric cu o rază extrem de mare dar cu mai puÈ›ine conexiuni disponibile. -block.diode.description = Energia din baterii poate trece prin acest bloc doar într-o direcÈ›ie, dar doar dacă o parte are mai puÈ›ină energie stocată. +block.diode.description = Transportă energia din baterii într-o direcÈ›ie, dar doar dacă partea cealaltă are mai puÈ›ină energie stocată. block.battery.description = Stochează electricitatea pt rezerve atunci când există un surplus în reÈ›ea. Oferă electricitate atunci când există un deficit. -block.battery-large.description = Stochează mai multă electricitate decât bateria standard. +block.battery-large.description = Stochează electricitatea pt rezerve atunci când există un surplus în reÈ›ea. Oferă electricitate atunci când există un deficit. Capacitate mai mare decât cea a bateriei obiÈ™nuite. block.combustion-generator.description = Generează electricitate arzând materiale inflamabile, precum cărbunele. block.thermal-generator.description = Generează electricitate atunci când este plasat în locuri calde. -block.steam-generator.description = Un generator de combustie avansat. Mai eficient, dar necesită apă pt a genera abur. +block.steam-generator.description = Generează electricitate arzând materiale inflamabile È™i convertind apa în abur. block.differential-generator.description = Generează mari cantități de electricitate. Utilizează diferenÈ›a de temperatură dintre criofluid È™i piratită arzând. -block.rtg-generator.description = Un generator simplu pe care te poÈ›i baza. FoloseÈ™te căldura materialelor radioactive care se dezintegrează pt a produce încet electricitate. +block.rtg-generator.description = FoloseÈ™te căldura materialelor radioactive care se dezintegrează pt a produce încet electricitate. block.solar-panel.description = Oferă o cantitate mică de energie solară. -block.solar-panel-large.description = O versiune cu mult mai eficientă a panoului solar standard. +block.solar-panel-large.description = Oferă o cantitate mică de energie solară. Mai eficient decât panoul solar standard. block.thorium-reactor.description = Generează mari cantități de electricitate din toriu. Necesită răcire constantă. Explodează violent dacă i se oferă cantități insuficiente de răcitor. Electricitatea produsă depinde de cât de plin e, cu electricitatea de bază produsă la capacitate maximă. -block.impact-reactor.description = Un generator avansat, capabil să creeze cantități masive de electricitate la eficiență maximă. Are nevoie de o cantitate de electricitate pt a începe procesul. -block.mechanical-drill.description = Un burghiu ieftin. Odată plasat pe blocurile corezpunzătoare, minează încet materiale. Capabil să mineze materiale de bază. +block.impact-reactor.description = Crează cantități masive de electricitate la eficiență maximă. Are nevoie de o cantitate de electricitate pt a începe procesul. +block.mechanical-drill.description = Odată plasat pe un minereu, minează încet materialele. Capabil să mineze materiale de bază. block.pneumatic-drill.description = Un burghiu îmbunătățit, capabil să mineze titan. Minează mai rapid decât burghiul mecanic. block.laser-drill.description = Poate mina mai rapid prin tehnologia bazată pe laser, dar necesită electricitate. Poate mina toriu. block.blast-drill.description = Cel mai bun burghiu. Necesită cantități mari de electricitate. block.water-extractor.description = Extrage apă din pământ. Folosit în locaÈ›ii unde apa de suprafață nu este disponibilă. -block.cultivator.description = Cultivă mici concentraÈ›ii de spori din atmosferă în păstăi pregătite pt procesare industrială. +block.cultivator.description = Cultivă micile concentraÈ›ii atomsferice de spori în păstăi de spori. +block.cultivator.details = Tehnologie recuperată. Folosit pt a produce cantități masive de biomasă cât de eficient posibil. Posibil să fie incubatorul iniÈ›ial al sporilor care acoperă acum Serpulo. block.oil-extractor.description = FoloseÈ™te mari cantități de electricitate, nisip È™i apă pt a extrage petrol. -block.core-shard.description = Prima versiune a capsulei nucleice. Odată distrusă, orice contact cu regiunea se pierde. Nu lăsa asta să se întâmple. -block.core-foundation.description = A doua versiune a nucleului. Mai bine armată. Stochează mai multe resurse. -block.core-nucleus.description = A treia È™i ultima versiune a capsulei nucleice. Extrem de bine armată. Stochează mari cantități de resurse. -block.vault.description = Stochează o mare cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din seif. -block.container.description = Stochează o mică cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din container. -block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puÈ›in cele de transport. Tipul materialului de descărcat poate fi schimbat. Click pe descărcător. -block.launch-pad.description = Lansează grămezi de materiale fără a fi nevoie să lansezi nucleul. -block.launch-pad-large.description = O versiune mai bună a platformei de lansare. Stochează mai multe materiale. Lansează mai frecvent. -block.duo.description = O armă mică, ieftină. Util împotriva unităților de artilerie. -block.scatter.description = O armă esenÈ›ială anti aeronave. Aruncă bucățele de plumb, fier vechi sau metasticlă către inamici. -block.scorch.description = Arde orice artilerie inamică din apropiere. Mai eficient la distanță mică. -block.hail.description = O armă anti-artilerie mică, care trage la mari distanÈ›e. -block.wave.description = O armă medie. Trage cu lichid către inamici. Stinge focul automat când este alimentată cu apă. -block.lancer.description = O armă anti-artilerie medie, cu laser. Se încarcă È™i trage cu lasere puternice de electricitate. -block.arc.description = O armă electrică cu o rază de acÈ›iune mică. Trage cu mici lasere de electricitate către inamici. -block.swarmer.description = O armă medie cu rachete. Atacă atât artileria cât È™i navele inamice. Trage cu rachete cu radar. -block.salvo.description = O versiune mai mare, mai avansată a armei Duo. Trage salve rapide de gloanÈ›e către inamici. -block.fuse.description = O armă È™rapnel mare cu rază de acÈ›iune mică. Trage trei raze de gloanÈ›e care găuresc scuturile inamicilor din apropiere. -block.ripple.description = O armă de artilerie extrem de puternică. LoveÈ™te grămezi de bucăți de material înspre inamici pe distanÈ›e mari. -block.cyclone.description = O mare armă anti-artilerie È™i anti-aer. Trage cu grămezi explozive de material către ddunitățile inamice. -block.spectre.description = O armă masivă cu două È›evi. Trage cu gloanÈ›e mari care găuresc armurile È›intelor aeriene È™i artileriei. -block.meltdown.description = O armă cu laser masivă. Trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. +block.core-shard.description = Nucleul bazei. Odată distrus, sectorul e pierdut. +block.core-shard.details = Prima versiune. Compact. Autoreprodus. Echipat cu propulsoare de unică folosință. Nu e făcut pt călătorii interplanetare. +block.core-foundation.description = Nucleul bazei. Bine armat. Stochează mai multe resurse decât nucleul Shard. +block.core-foundation.details = A doua versiune. +block.core-nucleus.description = Nucleul bazei. Extrem de bine armat. Stochează cantități masive de resurse. +block.core-nucleus.details = A treia È™i ultima versiune. +block.vault.description = Stochează o mare cantitate de materiale de orice tip. ConÈ›inutul poate fi recuperat folosind un descărcător. +block.container.description = Stochează o mică cantitate de materiale de orice tip. ConÈ›inutul poate fi recuperat folosind un descărcător. +block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puÈ›in cele de transport. +block.launch-pad.description = Lansează grămezi de materiale către sectoarele selectate. +block.duo.description = Trage cu gloanÈ›e alternante către inamici. +block.scatter.description = Trage cu bucățele de plumb, fier vechi sau metasticlă către aeronavele inamice. +block.scorch.description = Arde orice artilerie inamică din apropiere. Foarte eficient la distanță mică. +block.hail.description = Trage cu mici capsule către artileria inamică pe distanÈ›e lungi. +block.wave.description = Trage jeturi de lichid către inamici. Stinge focul automat când este alimentată cu apă. +block.lancer.description = Se încarcă È™i trage cu lasere puternice de electricitate. +block.arc.description = Trage cu mici lasere de electricitate către artileria inamică. +block.swarmer.description = Trage cu rachete cu radar către inamici. +block.salvo.description = Trage salve rapide de gloanÈ›e către inamici. +block.fuse.description = Trage trei raze de gloanÈ›e care penetrează scuturile inamicilor din apropiere. +block.ripple.description = LoveÈ™te cu capsule către inamici pe distanÈ›e mari. +block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere. +block.spectre.description = Trage cu gloanÈ›e mari care penetrează scuturile inamicilor din apropiere. +block.meltdown.description = Se încarcă È™i trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. +block.foreshadow.description = Trage către o È›intă cu un glonÈ› imens pe distanÈ›e lungi. Inamicii cu mai multă viață au prioritate. block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. block.segment.description = Deteriorează È™i distruge proiectilele din apropiere. Laserele nu sunt afectate. +block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le. +block.tsunami.description = Trage jeturi puternice de lichid către inamici. Stinge focul automat când este alimentată cu apă. +block.silicon-crucible.description = Rafinează silicon din nisip È™i cărbune, folosind piratită ca sursă adiÈ›ională de cărbune. Mai eficient când e plasat în locuri calde. +block.disassembler.description = Separă zgura în componentele sale minerale exotice. Eficiență mică. Poate produce toriu. +block.overdrive-dome.description = GrăbeÈ™te blocurile din apropiere. Necesită fibră-fază È™i silicon pt a opera. +block.payload-conveyor.description = MiÈ™că încărcături mari, cum ar fi unitățile militare din fabrici. +block.payload-router.description = Distribuie încărcătura primită în 3 direcÈ›ii diferite. +block.command-center.description = Controlează comportamentul unităților militare folosind diverse comenzi. +block.ground-factory.description = Produce unități de artilerie. Unitățile produse pot fi folosite direct sau mutate în reconstructoare pt îmbunătățiri. +block.air-factory.description = Produce unități aeriene. Unitățile produse pot fi folosite direct sau mutate în reconstructoare pt îmbunătățiri. +block.naval-factory.description = Produce unități navale. Unitățile produse pot fi folosite direct sau mutate în reconstructoare pt îmbunătățiri. +block.additive-reconstructor.description = ÃŽmbunătățeÈ™te unitățile primite, transformându-le în unități de nivel doi. +block.multiplicative-reconstructor.description = ÃŽmbunătățeÈ™te unitățile primite, transformându-le în unități de nivel trei. +block.exponential-reconstructor.description = ÃŽmbunătățeÈ™te unitățile primite, transformându-le în unități de nivel patru. +block.tetrative-reconstructor.description = ÃŽmbunătățeÈ™te unitățile primite, transformându-le în unități de ltimă generaÈ›ie: nivelul cinci. +block.switch.description = Un întrerupător. Poate fi pornit sau oprit. Statusul său poate fi citit È™i controlat de procesoarele logice. +block.micro-processor.description = Rulează într-o buclă continuă o secvență de instrucÈ›iuni logice. Poate fi folosit pt a controla unități È™i diverse clădiri. +block.logic-processor.description = Rulează într-o buclă continuă o secvență de instrucÈ›iuni logice. Poate fi folosit pt a controla unități È™i diverse clădiri. Mai rapid decât microprocesorul. +block.hyper-processor.description = Rulează într-o buclă continuă o secvență de instrucÈ›iuni logice. Poate fi folosit pt a controla unități È™i diverse clădiri. Mai rapid decât procesorul logic. +block.memory-cell.description = Stochează informaÈ›ie pt un procesor. +block.memory-bank.description = Stochează informaÈ›ie pt un procesor. Capacitate mare. +block.logic-display.description = AfiÈ™ează grafica transmisă de un procesor logic. +block.large-logic-display.description = AfiÈ™ează grafica transmisă de un procesor logic. +block.interplanetary-accelerator.description = Un turn masiv cu o armă railgun electromagnetică. Accelerează nucleele la viteză cosmică pt lansare interplanetară. + +unit.dagger.description = Trage cu gloanÈ›e standard către toÈ›i inamicii din apropiere. +unit.mace.description = Trage cu jeturi de flacără aprinsă către toÈ›i inamicii din apropiere. +unit.fortress.description = Trage cu gloanÈ›e de artilerie către artileria inamică pe distanÈ›e lungi. +unit.scepter.description = Trage cu un baraj de gloanÈ›e încărcate către toÈ›i inamicii din apropiere. +unit.reign.description = Trage cu un baraj de gloanÈ›e masive care penetrează scuturile tuturor inamicilor din apropiere. +unit.nova.description = Trage cu mici lasere care deteriorează inamicii È™i repară structurile aliate. Poate zbura. +unit.pulsar.description = Trage cu lasere electrice care deteriorează inamicii È™i repară structurile aliate. Poate zbura. +unit.quasar.description = Trage cu lasere electrice care deteriorează inamicii È™i repară structurile aliate. Poate zbura. Echipat cu un scut. +unit.vela.description = Trage cu un laser masiv, continuu, inflamabil care deteriorează inamicii È™i repară structurile aliate. Poate zbura. +unit.corvus.description = Trage cu e explozie masivă de lasere care deteriorează inamicii È™i repară structurile aliate. Poate merge peste majoritatea terenurilor. +unit.crawler.description = Aleargă către inamici È™i se autodistruge, cauzând o explozie. +unit.atrax.description = Trage cu globuri de zgură care slăbesc artileria inamică. Poate merge peste majoritatea terenurilor. +unit.spiroct.description = Trage cu lasere care apropie È™i slăbesc inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor. +unit.arkyid.description = Trage cu lasere mari care apropie È™i slăbesc inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor. +unit.toxopid.description = Trage cu capsule electrice mari È™i lasere care penetrează scuturile inamice. Poate merge peste majoritatea terenurilor. +unit.flare.description = Trage cu gloanÈ›e standard la artileria inamică din apropiere. +unit.horizon.description = Aruncă grămezi de bombe peste artileria inamică. +unit.zenith.description = Trage cu salve de rachete către inamicii din apropiere. +unit.antumbra.description = Trage cu un baraj de gloanÈ›e către inamicii din apropiere. +unit.eclipse.description = Trage cu un baraj de grămezi de material È™i două lasere care penetrează scuturile tuturor inamicilor din apropiere. +unit.mono.description = Minează automat cupru È™i plumb, depozitându-le în nucleu. +unit.poly.description = ReconstruieÈ™te automat structurile distruse È™i asistă alte unități la construire. +unit.mega.description = Repară automat structurile deteriorate. Capabilă să care blocuri È™i mici unități de artilerie. +unit.quad.description = Aruncă bombe mari peste artileria inamică, reparând structurile aliate È™i deteriorând inamicii. Capabilă să care unități de artilerie de dimensiuni medii. +unit.oct.description = Protejează aliaÈ›ii din apropiere cu scutul său care se regenerează. Capabilă să care majoritatea unităților de artilerie. +unit.risso.description = Trage un baraj de rachete È™i gloanÈ›e către toÈ›i inamicii din apropiere. +unit.minke.description = Trage cu capsule È™i gloanÈ›e standard către artileria inamică din apropiere. +unit.bryde.description = Trage cu capsule de artilerie È™i rachete către inamici pe distanÈ›e lungi. +unit.sei.description = Trage cu un baraj de rachete È™i gloanÈ›e care penetrează scuturile inamicilor. +unit.omura.description = Trage cu un railgun cu gloanÈ›e care penetrează scuturile inamice pe distanÈ›e lungi. ConstruieÈ™te unități Flare. +unit.alpha.description = Apără nucleul Shard de inamici. ConstruieÈ™te structuri. +unit.beta.description = Apără nucleul Foundation de inamici. ConstruieÈ™te structuri. +unit.gamma.description = Apără nucleul Core de inamici. ConstruieÈ™te structuri. + +lst.read = CiteÈ™te un număr dintr-o celulă de memorie conectată. +lst.write = Scrie un număr într-o celulă de memorie conectată. +lst.print = Adaugă text în bufferul de tipărire.\nNu tipăreÈ™te decât când se execută [accent]Print Flush[]. +lst.draw = Adaugă o operaÈ›ie în bufferul de desenare.\nNu afiÈ™ează decât când se execută [accent]Draw Flush[]. +lst.drawflush = AfiÈ™ează pe un monitor instrucÈ›iunile [accent]Draw[] aflate în aÈ™teptare. +lst.printflush = TipăreÈ™te într-un bloc Mesaj instrucÈ›iunile [accent]Print[] aflate în aÈ™teptare. +lst.getlink = ObÈ›ine o conexiune a procesorului după index. ÃŽncepe de la 0. +lst.control = Controlează o clădire. +lst.radar = Localizează unitățile aflate în jurul unei clădiri. Are o anumită rază de acÈ›iune. +lst.sensor = ObÈ›ine date de la o clădire sau unitate. +lst.set = Setează o variabilă. +lst.operation = Efectuează o operaÈ›ie pe 1-2 variabile. +lst.end = Sari la începutul listei de instrucÈ›iuni. +lst.jump = Dacă condiÈ›ia este adevărată, mergi la o altă instrucÈ›iune. +lst.unitbind = Controlează următoarea unitate de tipul selectat È™i reÈ›ine-o în [accent]@unit[]. +lst.unitcontrol = Controlează unitatea controlată de procesor. +lst.unitradar = Localizează unitățile din jurul unității controlate de procesor. +lst.unitlocate = Localizează o poziÈ›ie/clădire specifică oriunde pe hartă.\nNecesită o unitate controlată de procesor. + +logic.nounitbuild = [red]Nu ai voie să construieÈ™ti cu unitățile folosind procesoare. + +lenum.type = Tipul clădirii/unității.\nde ex.: pt orice Router, va returna [accent]@router[].\nNu e un È™ir de caractere. +lenum.shoot = LoveÈ™te către o locaÈ›ie. +lenum.shootp = LoveÈ™te către o unitate/clădire. Anticipează viteza È›intei È™i a proiectilului. +lenum.configure = ConfiguraÈ›ia clădirii, de ex. materialul selectat pt Sortator. +lenum.enabled = Specifică dacă clădirea este pornită. + +laccess.color = Culoarea iluminatorului. +laccess.controller = Controlorul unității. Dacă e controlată de procesor, returnează procesorul.\nDacă e într-o formaÈ›ie, returnează liderul.\nAltfel, returnează unitatea însăși. +laccess.dead = Specifică dacă o unitate sau clădire a murit/nu mai e validă. +laccess.controlled = Returnează:\n[accent]@ctrlProcessor[] dacă controlorul unității e procesor\n[accent]@ctrlPlayer[] dacă controlorul unității/clădirii e jucător\n[accent]@ctrlFormation[] dacă unitatea e într-o formaÈ›ie\nAltfel dă 0. +laccess.commanded = [red]ÃŽnvechit. Se va È™terge![]\nFoloseÈ™te [accent]controlled[]. + +graphicstype.clear = Umple monitorul cu o culoare. +graphicstype.color = Setează culoarea pt următoarele instrucÈ›iuni Draw. +graphicstype.stroke = Setează grosimea liniei. +graphicstype.line = Desenează un segment de linie. +graphicstype.rect = Desenează un dreptunghi. +graphicstype.linerect = Desenează conturul unui dreptunghi. +graphicstype.poly = Desenează un poligon regulat. +graphicstype.linepoly = Desenează conturul unui poligon regulat. +graphicstype.triangle = Desenează un triunghi. +graphicstype.image = Desenează imaginea unui obiect din joc.\nde ex.: [accent]@router[] sau [accent]@dagger[]. + +lenum.always = Mereu adevărat. +lenum.idiv = ÃŽmpărÈ›irea naturală a numerelor (int). +lenum.div = ÃŽmpărÈ›irea.\nReturnează [accent]null[] dacă împarÈ›i la 0. +lenum.mod = Modulo (restul împărÈ›irii). +lenum.equal = Egal. ConverteÈ™te tipurile variabilelor.\nObiectele nenule comparate cu numere devin 1, cele nule devin 0. +lenum.notequal = Nu e egal. ConverteÈ™te tipurile variabilelor. +lenum.strictequal = Egalitate strictă. Nu converteÈ™te tipurile variabilelor.\nPoate fi folosit pt a verifica dacă ceva este [accent]null[]. +lenum.shl = Shift left pe biÈ›i. +lenum.shr = Shift right pe biÈ›i. +lenum.or = OR/SAU. Èšine cont de biÈ›i. +lenum.land = Logical AND/ȘI logic. Nu È›ine cont de biÈ›i. +lenum.and = AND/ȘI. Èšine cont de biÈ›i. +lenum.not = NOT. Inversează biÈ›ii. +lenum.xor = XOR/disjuncÈ›ie exclusivă. Èšine cont de biÈ›i. + +lenum.min = Minimul a două numere. +lenum.max = Maximul a două numere. +lenum.angle = Unghiul unui vector în grade. +lenum.len = Lungimea unui vector. +lenum.sin = Sinus în grade. +lenum.cos = Cosinus în grade. +lenum.tan = Tangentă în grade. +#cea de mai jos nu-i o greÈ™eală, caută pe net notarea intervalelor în matematică +lenum.rand = Număr natural aleatoriu în intervalul [0, val). +lenum.log = Logaritm natural (ln). +lenum.log10 = Logaritm în baza 10. +lenum.noise = 2D simplex noise. +lenum.abs = Valoarea absolută. +lenum.sqrt = Radical/rădăcina pătrată. + +lenum.any = Orice unitate. +lenum.ally = Unitate aliată. +lenum.attacker = Unitate cu armă. +lenum.enemy = Unitate inamică. +lenum.boss = Unitate gardian. +lenum.flying = Unitate care zboară. +lenum.ground = Unitate de artilerie. +lenum.player = Unitate controlată de un jucător. + +lenum.ore = Depozit de minereu. +lenum.damaged = Clădire aliată deteriorată. +lenum.spawn = Punct de lansare inamic.\nPoate fi un nucleu sau o poziÈ›ie. +lenum.building = Clădire dintr-un grup specific. + +lenum.core = Orice nucleu. +lenum.storage = Clădire de stocare, de ex. Containerul. +lenum.generator = Clădiri care generează electricitate. +lenum.factory = Clădiri care transformă resurse. +lenum.repair = Puncte de Reparare. +lenum.rally = Centre de Comandă. +lenum.battery = Orice baterie. +lenum.resupply = Puncte de Realimentare.\nRelevant doar când [accent]"Unitățile Necesită MuniÈ›ie"[] este activată. +lenum.reactor = Reactor de Toriu/Impact. +lenum.turret = Orice armă. + +sensor.in = Clădirea/unitatea care trebuie detectată. + +radar.from = Clădirea de la care detectăm.\nRaza senzorului e limitată de raza de costrucÈ›ie. +radar.target = Filtru pt unitățile care trebuie detectate. +radar.and = Adaugă filtre. +radar.order = Ordinea de sortare. 0 pt a inversa ordinea. +radar.sort = Modul cum sortăm rezultatele. +radar.output = Variabila în care se va scrie unitatea detectată. + +unitradar.target = Filtru pt unitățile care trebuie detectate. +unitradar.and = Adaugă filtre. +unitradar.order = Ordinea de sortare. 0 pt a inversa ordinea. +unitradar.sort = Modul cum sortăm rezultatele. +unitradar.output = Variabila în care se reÈ›ine unitatea detectată. + +control.of = Clădirea de controlat. +control.unit = Unitatea/clădirea către care se È›inteÈ™te. +control.shoot = Specifică dacă armele trag. + +unitlocate.enemy = Specifică dacă se detectează clădirile inamice. +unitlocate.found = Specifică dacă obiectul a fost găsit. +unitlocate.building = Clădirea detectată. +unitlocate.outx = Coordonata X a obiectului detectat. +unitlocate.outy = Coordonata Y a obiectului detectat. +unitlocate.group = Grupul clădirilor de detectat. + +lenum.idle = Nu miÈ™ca, dar continuă să construieÈ™ti/minezi.\nModul prestabilit. +lenum.stop = OpreÈ™te acÈ›iunea curentă. Nu miÈ™ca/mina/construi. +lenum.move = Mergi la această poziÈ›ie. +lenum.approach = Apropie-te la o anumită distanță de poziÈ›ie. +lenum.pathfind = GăseÈ™te ruta către punctul de lansare inamic. Poate fi un nucleu. +lenum.target = LoveÈ™te către o poziÈ›ie. +lenum.targetp = LoveÈ™te o È›intă. Anticipează viteza È›intei È™i a proiectilului. +lenum.itemdrop = Descarcă o bucată de material. +lenum.itemtake = Ia o bucată de material dintr-o clădire. +lenum.paydrop = Descarcă încărcătura curentă. +lenum.paytake = Ia o încărcătură de la locaÈ›ia curentă. +lenum.flag = Oferă o etichetă numerică unității. +lenum.mine = Minează din această locaÈ›ie. +lenum.build = ConstruieÈ™te o structură. +lenum.getblock = ObÈ›ine clădirea È™i tipul clădirii aflate la coordonatele specificate.\nUnitatea trebuie să se afle în raza poziÈ›iei.\nBlocurile solide care nu sunt clădiri vor avea tipul [accent]@solid[]. +lenum.within = Verifică dacă unitatea se află în apropierea poziÈ›iei. +lenum.boost = PorneÈ™te/opreÈ™te propulsorul. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 716cf580fa..94bde81323 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -13,15 +13,18 @@ link.google-play.description = Скачать Ð´Ð»Ñ Android Ñ Google Play link.f-droid.description = Скачать Ð´Ð»Ñ Android Ñ F-Droid link.wiki.description = ÐžÑ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð¸ÐºÐ¸ link.suggestions.description = Предложить новые возможноÑти +link.bug.description = Ðашли ошибку? Доложите о ней здеÑÑŒ linkfail = Ðе удалоÑÑŒ открыть ÑÑылку!\nURL-Ð°Ð´Ñ€ÐµÑ Ð±Ñ‹Ð» Ñкопирован в буфер обмена. screenshot = Скриншот Ñохранён в {0} screenshot.invalid = Карта Ñлишком большаÑ, возможно, не хватает памÑти Ð´Ð»Ñ Ñкриншота. gameover = Игра окончена +gameover.disconnect = Отключение gameover.pvp = [accent]{0}[] команда победила! +gameover.waiting = [accent]Ожидание Ñледующей карты... highscore = [accent]Ðовый рекорд! copied = Скопировано. -indev.popup = [accent]v6[] находитÑÑ Ð½Ð° Ñтадии [accent]alpha[].\n[lightgray]Это означает Ñледующее:[]\n[scarlet]- ÐšÐ°Ð¼Ð¿Ð°Ð½Ð¸Ñ Ð½Ðµ завершена[]\n- ОтÑутÑтвие контента\n- БольшинÑтво [scarlet]ИИ единиц[] не работает правильно\n- МножеÑтво единиц не готово\n- Ð’ÑÑ‘, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]GitHub[]. indev.notready = Эта чаÑть игры ещё не готова +indev.campaign = [accent]ПоздравлÑем! Ð’Ñ‹ доÑтигли конца кампании![]\n\nЭто вÑÑ‘, что предоÑтавлÑет ÑÐµÐ¹Ñ‡Ð°Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚. Межпланетные путешеÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ добавлены в будущих обновлениÑÑ…. load.sound = Звуки load.map = Карты @@ -38,6 +41,14 @@ be.ignore = Игнорировать be.noupdates = ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ найдены. be.check = Проверить Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ +mods.browser = Браузер\nмодификаций +mods.browser.selected = Выбранный мод +mods.browser.add = Скачать +mods.browser.reinstall = ПереуÑтановить +mods.github.open = Сайт +mods.browser.sortdate = Сортировка по дате +mods.browser.sortstars = Сортировка по звёздам + schematic = Схема schematic.add = Сохранить Ñхему… schematics = Схемы @@ -55,8 +66,9 @@ schematic.saved = Схема Ñохранена. schematic.delete.confirm = Эта Ñхема будет поджарена ИÑпепелителем. schematic.rename = Переименовать Ñхему schematic.info = {0}x{1}, {2} блоков -schematic.disabled = [scarlet]Схемы отключены[]\nÐа Ñтой [accent]карте[] или [accent]Ñервере запрещено иÑпользование Ñхем. +schematic.disabled = [scarlet]Схемы отключены[]\nÐа Ñтой [accent]карте[] или [accent]Ñервере[] запрещено иÑпользование Ñхем. +stats = СтатиÑтика stat.wave = Волн отражено:[accent] {0} stat.enemiesDestroyed = Врагов уничтожено:[accent] {0} stat.built = Строений поÑтроено:[accent] {0} @@ -66,7 +78,7 @@ stat.delivered = РеÑурÑов запущено: stat.playtime = Ð’Ñ€ÐµÐ¼Ñ Ð¸Ð³Ñ€Ñ‹:[accent] {0} stat.rank = Финальный ранг: [accent]{0} -globalitems = [accent]Глобальные предметы +globalitems = [accent]Общие предметы map.delete = Ð’Ñ‹ дейÑтвительно хотите удалить карту «[accent]{0}[]»? level.highscore = Рекорд: [accent]{0} level.select = Выбор карты @@ -80,6 +92,7 @@ joingame = Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¸Ð³Ñ€Ð° customgame = ПользовательÑÐºÐ°Ñ Ð¸Ð³Ñ€Ð° newgame = ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð° none = <ничего> +none.found = [lightgray]<ничего не найдено> minimap = Мини-карта position = Координаты close = Закрыть @@ -100,18 +113,20 @@ committingchanges = ВнеÑение изменений done = Готово feature.unsupported = Ваше уÑтройÑтво не поддерживает Ñту возможноÑть. -mods.alphainfo = Имейте в виду, что модификации находÑÑ‚ÑÑ Ð² альфа-верÑии и [scarlet]могут Ñодержать много ошибок[]. Докладывайте о любых проблемах, которые вы найдете в Mindustry Github или Discord. -mods.alpha = [accent](Ðльфа) +mods.initfailed = [red]âš [] Ðе удалоÑÑŒ инициализировать предыдущий запуÑк Mindustry. Это могло быть вызвано неиÑправными модификациÑми.\n\nЧтобы предотвратить зацикленные вылеты игры, [red]вÑе модификации были отключены.[]\n\nЧтобы отключить Ñту функцию, выключите её в [accent]ÐаÑтройки->Игра->Отключение модификаций поÑле вылета при запуÑке[]. mods = Модификации mods.none = [lightgray]Модификации не найдены! -mods.guide = РуководÑтво по модам +mods.guide = РуководÑтво по модификациÑм mods.report = Доложить об ошибке mods.openfolder = Открыть папку Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñми +mods.viewcontent = ПроÑмотреть Ñодержимое mods.reload = Перезагрузить -mods.reloadexit = Игра будет закрыта Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ модов. +mods.reloadexit = Игра будет закрыта Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ модификаций. +mod.installed = [[УÑтановлено] mod.display = [gray]МодификациÑ:[orange] {0} mod.enabled = [lightgray]Включён mod.disabled = [scarlet]Выключен +mod.multiplayer.compatible = [gray]ДоÑтупна в игре по Ñети mod.disable = Выкл. mod.content = Содержимое: mod.delete.error = Ðевозможно удалить модификацию. Возможно, файл иÑпользуетÑÑ. @@ -127,25 +142,29 @@ mod.requiresrestart = Теперь игра закроетÑÑ, чтобы пр mod.reloadrequired = [scarlet]Ðеобходим перезапуÑк mod.import = Импортировать модификацию mod.import.file = Импортировать файл -mod.import.github = Импортировать мод Ñ GitHub -mod.jarwarn = [scarlet]JAR-модификации по Ñути не безопаÑны.[]\nУбедитеÑÑŒ, что вы импортируете Ñтот мод из надежного иÑточника! +mod.import.github = Импортировать модификацию Ñ GitHub +mod.jarwarn = [scarlet]JAR-модификации по Ñути не безопаÑны.[]\nУбедитеÑÑŒ, что вы импортируете Ñту модификацию из надёжного иÑточника! mod.item.remove = Этот предмет ÑвлÑетÑÑ Ñ‡Ð°Ñтью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите Ñаму модификацию. mod.remove.confirm = Эта Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ удалена. mod.author = [lightgray]Ðвтор(Ñ‹):[] {0} mod.missing = Ð’ Ñтом Ñохранении еÑть Ñледы модификации, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚ÑутÑтвует или уÑтановлена её Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ‘Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ. Может произойти повреждение ÑохранениÑ. Ð’Ñ‹ уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.preview.missing = Перед публикацией Ñтой модификации в МаÑтерÑкой, вы должны добавить изображение предпроÑмотра.\nРазмеÑтите изображение Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼[accent] preview.png[] в папке модификации и попробуйте Ñнова. mod.folder.missing = Модификации могут быть опубликованы в МаÑтерÑкой только в виде папки.\nЧтобы конвертировать любой мод в папку, проÑто извлеките его из архива и удалите Ñтарый архив .zip, затем перезапуÑтите игру или перезагрузите модификации. -mod.scripts.disable = Ваше уÑтройÑтво не поддерживает модификации Ñо Ñкриптами. Отключите такие моды, чтобы играть. +mod.scripts.disable = Ваше уÑтройÑтво не поддерживает модификации Ñо Ñкриптами. Отключите такие модификации, чтобы играть. about.button = Об игре name = ИмÑ: -noname = Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°, придумайте[accent] Ñебе имÑ[]. +noname = Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° придумайте[accent] Ñебе имÑ[]. planetmap = Карта планеты launchcore = ЗапуÑк Ñдра filename = Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: unlocked = Ðовый контент разблокирован! +available = ДоÑтупно новое иÑÑледование! completed = [accent]Завершено techtree = Дерево\n технологий +research.legacy = Ðайдены данные иÑÑледований из [accent]5.0[].\nХотите [accent]загрузить Ñти данные[], или [accent]отказатьÑÑ Ð¾Ñ‚ них[] и перезапуÑтить иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² новой кампании (рекомендуетÑÑ)? +research.load = Загрузить +research.discard = ОтказатьÑÑ research.list = [lightgray]ИÑÑледуйте: research = ИÑÑледовать researched = [lightgray]{0} иÑÑледовано. @@ -190,10 +209,17 @@ servers.local = Локальные Ñерверы servers.remote = Удалённые Ñерверы servers.global = Серверы ÑообщеÑтва +servers.disclaimer = Серверы ÑообщеÑтва [accent]не[] принадлежат разработчику и [accent]не[] контролируютÑÑ Ð¸Ð¼.\n\nСерверы могут Ñодержать пользовательÑкий контент, который не подходит Ð´Ð»Ñ Ð²Ñех возраÑтов. +servers.showhidden = Отображать Ñкрытые Ñерверы +server.shown = ОтображаетÑÑ +server.hidden = Скрыт + trace = ОтÑлеживать игрока trace.playername = Ð˜Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} +trace.times.joined = ПриÑоединÑлÑÑ Ñ€Ð°Ð·: [accent]{0} +trace.times.kicked = Был выгнан раз: [accent]{0} trace.mobile = Мобильный клиент: [accent]{0} trace.modclient = ПользовательÑкий клиент: [accent]{0} invalidid = ÐедопуÑтимый ID клиента! Отправьте отчёт об ошибке. @@ -223,6 +249,7 @@ disconnect.timeout = Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ñтекло. disconnect.data = Ошибка при загрузке данных мира! cantconnect = Ðе удаётÑÑ Ð¿Ñ€Ð¸ÑоединитьÑÑ Ðº игре ([accent]{0}[]). connecting = [accent]Подключение… +reconnecting = [accent]Переподключение… connecting.data = [accent]Загрузка данных мира… server.port = Порт: server.addressinuse = Данный Ð°Ð´Ñ€ÐµÑ ÑƒÐ¶Ðµ иÑпользуетÑÑ! @@ -268,6 +295,10 @@ cancel = Отмена openlink = Открыть ÑÑылку copylink = Скопировать ÑÑылку back = Ðазад +max = Заполнить полноÑтью +crash.export = ЭкÑпорт отчёта об ошибках +crash.none = Отчёты об ошибках не найдены. +crash.exported = Отчёты об ошибках ÑкÑпортированы. data.export = ЭкÑпортировать данные data.import = Импортировать данные data.openfolder = Открыть папку Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ @@ -284,13 +315,20 @@ cancelbuilding = [accent][[{0}][] Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки плана selectschematic = [accent][[{0}][] выделить и Ñкопировать pausebuilding = [accent][[{0}][] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ñтановки ÑтроительÑтва resumebuilding = [scarlet][[{0}][] Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ ÑтроительÑтва +enablebuilding = [scarlet][[{0}][] Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑтроительÑтва +showui = Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñкрыт.\nÐажмите [accent][[{0}][] Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа. wave = [accent]Волна {0} +wave.cap = [accent]Волна {0}/{1} wave.waiting = [lightgray]Волна через {0} wave.waveInProgress = [lightgray]Волна продолжаетÑÑ waiting = [lightgray]Ожидание… waiting.players = Ожидание игроков… wave.enemies = [lightgray]Враги: {0} +wave.enemycores = [lightgray]ВражеÑких Ñдер: [accent]{0} +wave.enemycore = [accent]{0}[lightgray] вражеÑкое Ñдро wave.enemy = [lightgray]ОÑталÑÑ {0} враг +wave.guardianwarn = Волн до Ð¿Ñ€Ð¸Ð±Ñ‹Ñ‚Ð¸Ñ Ð¡Ñ‚Ñ€Ð°Ð¶Ð°: [accent]{0}[]. +wave.guardianwarn.one = [accent]{0}[] волна до Ð¿Ñ€Ð¸Ð±Ñ‹Ñ‚Ð¸Ñ Ð¡Ñ‚Ñ€Ð°Ð¶Ð°. loadimage = Загрузить изображение saveimage = Сохранить изображение unknown = ÐеизвеÑтно @@ -298,9 +336,9 @@ custom = ПользовательÑÐºÐ°Ñ builtin = Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ map.delete.confirm = Ð’Ñ‹ дейÑтвительно хотите удалить Ñту карту? Это дейÑтвие не может быть отменено! map.random = [accent]Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° -map.nospawn = Эта карта не имеет ни одного Ñдра, в котором игрок может поÑвитьÑÑ! Добавьте[accent] оранжевое[] Ñдро на Ñту карту в редакторе. -map.nospawn.pvp = У Ñтой карты нет вражеÑких Ñдер, в которых игрок может поÑвитьÑÑ! Добавьте[scarlet] не оранжевое[] Ñдро на Ñту карту в редакторе. -map.nospawn.attack = У Ñтой карты нет вражеÑких Ñдер Ð´Ð»Ñ Ð°Ñ‚Ð°ÐºÐ¸ игроком! Добавьте[scarlet] краÑное[] Ñдро на Ñту карту в редакторе. +map.nospawn = Эта карта не имеет ни одного Ñдра, в котором игрок может поÑвитьÑÑ! Добавьте [accent]оранжевое[] Ñдро на Ñту карту в редакторе. +map.nospawn.pvp = У Ñтой карты нет вражеÑких Ñдер, в которых игрок может поÑвитьÑÑ! Добавьте [scarlet]не оранжевое[] Ñдро на Ñту карту в редакторе. +map.nospawn.attack = У Ñтой карты нет вражеÑких Ñдер Ð´Ð»Ñ Ð°Ñ‚Ð°ÐºÐ¸ игроком! Добавьте [scarlet]краÑное[] Ñдро на Ñту карту в редакторе. map.invalid = Ошибка загрузки карты: повреждённый или недопуÑтимый файл карты. workshop.update = Обновить Ñодержимое workshop.error = Ошибка загрузки информации из МаÑтерÑкой: {0} @@ -329,15 +367,15 @@ editor.generation = ГенерациÑ: editor.ingame = Редактировать в игре editor.publish.workshop = Опубликовать в МаÑтерÑкой editor.newmap = ÐÐ¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° +editor.center = Центрировать workshop = МаÑтерÑÐºÐ°Ñ waves.title = Волны waves.remove = Удалить -waves.never = ∞ waves.every = каждый waves.waves = волна(Ñ‹) waves.perspawn = за поÑвление waves.shields = ед. щита/волну -waves.to = к +waves.to = до waves.guardian = Страж waves.preview = Предварительный проÑмотр waves.edit = Редактировать… @@ -350,7 +388,7 @@ waves.none = Враги не были определены.\nОбратите в #these are intentionally in lower case wavemode.counts = количеÑтво единиц wavemode.totals = вÑего единиц -wavemode.health = вÑего Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ +wavemode.health = вÑего прочноÑти editor.default = [lightgray]<По умолчанию> details = ПодробноÑти… @@ -361,7 +399,7 @@ editor.removeunit = Удалить боевую единицу editor.teams = Команды editor.errorload = Ошибка загрузки файла. editor.errorsave = Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°. -editor.errorimage = Это изображение, а не карта.\n\nЕÑли вы хотите импортировать карту верÑии 3.5/40 Ñборки, то иÑпользуйте кнопку [accent][Импортировать уÑтаревшую карту][] в редакторе. +editor.errorimage = Это изображение, а не карта. editor.errorlegacy = Эта карта Ñлишком ÑÑ‚Ð°Ñ€Ð°Ñ Ð¸ иÑпользует уÑтаревший формат карты, который больше не поддерживаетÑÑ. editor.errornot = Это не файл карты. editor.errorheader = Этот файл карты недейÑтвителен или повреждён. @@ -387,8 +425,8 @@ editor.importimage.description = Импортировать изображени editor.export = ЭкÑпорт… editor.exportfile = ЭкÑпортировать файл editor.exportfile.description = ЭкÑпорт файла карты -editor.exportimage = ЭкÑпортировать изображение ландшафта -editor.exportimage.description = ЭкÑпортировать файл изображениÑ, Ñодержащего только базовую меÑтноÑть +editor.exportimage = ЭкÑпортировать ландшафт +editor.exportimage.description = ЭкÑпортировать файл изображениÑ, Ñодержащий только базовую меÑтноÑть editor.loadimage = Импортировать\nизображение editor.saveimage = ЭкÑпортировать\nизображение editor.unsaved = Ð’Ñ‹ уверены, что хотите выйти?\n[scarlet]Ð’Ñе неÑохранённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ потерÑны. @@ -418,6 +456,7 @@ filters.empty = [lightgray]Ðет фильтров! Добавьте один п filter.distort = ИÑкажение filter.noise = Шум filter.enemyspawn = Случайный выбор \nточек выÑадки +filter.spawnpath = Путь до точки выÑадки filter.corespawn = Случайный выбор Ñдра filter.median = Медиана filter.oremedian = Ð ÑƒÐ´Ð½Ð°Ñ Ð¼ÐµÐ´Ð¸Ð°Ð½Ð° @@ -442,6 +481,7 @@ filter.option.amount = КоличеÑтво filter.option.block = Блок filter.option.floor = ПоверхноÑть filter.option.flooronto = Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñть +filter.option.target = Цель filter.option.wall = Стена filter.option.ore = Руда filter.option.floor2 = Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñть @@ -458,6 +498,8 @@ load = Загрузить save = Сохранить fps = FPS: {0} ping = Пинг: {0}Ð¼Ñ +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb language.restart = Перезагрузите игру, чтобы Ñзыковые наÑтройки вÑтупили в Ñилу. settings = ÐаÑтройки tutorial = Обучение @@ -472,17 +514,11 @@ complete = [lightgray]Ðеобходимо: requirement.wave = ДоÑтигните {0} волны в зоне {1} requirement.core = Уничтожьте вражеÑкое Ñдро в зоне {0} requirement.research = ИÑÑледуйте {0} +requirement.produce = Произведите {0} requirement.capture = Захватите {0} -resume = Возобновить зону:\n[lightgray]{0} -bestwave = [lightgray]Ð›ÑƒÑ‡ÑˆÐ°Ñ Ð²Ð¾Ð»Ð½Ð°: {0} - -launch = < ЗÐПУСК > launch.text = Ð’Ñ‹Ñадка -launch.title = ЗапуÑк уÑпешен -launch.next = [lightgray]ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñть на {0}-той волне -launch.unable2 = [scarlet]ЗÐПУСК невозможен.[] -launch.confirm = Это [accent]запуÑтит[] вÑе реÑурÑÑ‹ в вашем Ñдре.\nÐ’Ñ‹ не Ñможете вернутьÑÑ Ð½Ð° Ñту базу. -launch.skip.confirm = ЕÑли вы пропуÑтите ÑейчаÑ, то вы не Ñможете произвеÑти [accent]запуÑк[] до более поздних волн. +research.multiplayer = Только хоÑÑ‚ может иÑÑледовать предметы. +map.multiplayer = Только хоÑÑ‚ может проÑматривать Ñекторы. uncover = РаÑкрыть configure = ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ @@ -490,16 +526,11 @@ loadout = Груз resources = РеÑурÑÑ‹ bannedblocks = Запрещённые блоки addall = Добавить вÑÑ‘ +launch.from = ЗапуÑк из: [accent]{0} launch.destination = МеÑто назначениÑ: {0} configure.invalid = КоличеÑтво должно быть чиÑлом между 0 и {0}. -zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована. -zone.requirement.complete = УÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ð·Ð¾Ð½Ñ‹ «{0}» выполнены:[lightgray]\n{1} -zone.resources = [lightgray]Обнаруженные реÑурÑÑ‹: -zone.objective = [lightgray]Цель: [accent]{0} -zone.objective.survival = Выжить -zone.objective.attack = Уничтожить вражеÑкое Ñдро add = Добавить… -boss.health = Здоровье боÑÑа +boss.health = ПрочноÑть Ñтража connectfail = [scarlet]Ошибка подключениÑ:\n\n[accent]{0} error.unreachable = Сервер недоÑтупен.\nÐ’Ñ‹ уверены, что Ð°Ð´Ñ€ÐµÑ Ð²Ð²ÐµÐ´Ñ‘Ð½ корректно? @@ -516,17 +547,46 @@ weather.rain.name = Дождь weather.snow.name = Снегопад weather.sandstorm.name = ÐŸÑ‹Ð»ÑŒÐ½Ð°Ñ Ð±ÑƒÑ€Ñ weather.sporestorm.name = Ð¡Ð¿Ð¾Ñ€Ð¾Ð²Ð°Ñ Ð±ÑƒÑ€Ñ +weather.fog.name = Туман sectors.unexplored = [lightgray]Ðе иÑÑледовано sectors.resources = РеÑурÑÑ‹: sectors.production = Производит: +sectors.export = ЭкÑпорт: +sectors.time = ВремÑ: +sectors.threat = Угроза: +sectors.wave = Волна: sectors.stored = Ðакоплено: sectors.resume = Продолжить sectors.launch = Ð’Ñ‹Ñадка sectors.select = Выбор sectors.nonelaunch = [lightgray]нет (Ñолнце) +sectors.rename = Переименовать Ñектор +sectors.enemybase = [scarlet]ВражеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° +sectors.vulnerable = [scarlet]УÑзвим +sectors.underattack = [scarlet]Ðтакован! [accent]{0}% повреждений +sectors.survives = [accent]ПродержитÑÑ {0} волн(Ñ‹) +sectors.go = Перейти +sector.curcapture = Сектор захвачен +sector.curlost = Сектор потерÑн +sector.missingresources = [scarlet]ÐедоÑтаточно реÑурÑов Ð´Ð»Ñ Ð²Ñ‹Ñадки +sector.attacked = Сектор [accent]{0}[white] атакован! +sector.lost = Сектор [accent]{0}[white] потерÑн! +#note: the missing space in the line below is intentional (недоÑтающий пробел управлÑетÑÑ ÐºÐ¾Ð´Ð¾Ð¼) +sector.captured = Сектор [accent]{0}[white]захвачен! -#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway +threat.low = ÐÐ¸Ð·ÐºÐ°Ñ +threat.medium = СреднÑÑ +threat.high = Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ +threat.extreme = ЭкÑÑ‚Ñ€ÐµÐ¼Ð°Ð»ÑŒÐ½Ð°Ñ +threat.eradication = ИÑтреблÑÑŽÑ‰Ð°Ñ + +planets = Планеты + +planet.serpulo.name = Серпуло +planet.sun.name = Солнце + +sector.impact0078.name = Крушение 0078 sector.groundZero.name = ÐžÑ‚Ð¿Ñ€Ð°Ð²Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° sector.craters.name = Кратеры sector.frozenForest.name = ЛедÑной Ð»ÐµÑ @@ -538,10 +598,10 @@ sector.overgrowth.name = ЗароÑли sector.tarFields.name = ДегтÑрные Ð¿Ð¾Ð»Ñ sector.saltFlats.name = СолÑные равнины sector.fungalPass.name = Грибной перевал - -#unused -#sector.impact0078.name = ВоздейÑтвие 0078 -#sector.crags.name = Скалы +sector.biomassFacility.name = Центр иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð¾Ð¼Ð°ÑÑÑ‹ +sector.windsweptIslands.name = Штормовой архипелаг +sector.extractionOutpost.name = Ð”Ð¾Ð±Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð±Ð°Ð·Ð° +sector.planetaryTerminal.name = Планетарный пуÑковой терминал sector.groundZero.description = ÐžÐ¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¾ÐºÐ°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ñ‹Ñ… игр. ÐÐ¸Ð·ÐºÐ°Ñ Ð²Ñ€Ð°Ð¶ÐµÑÐºÐ°Ñ ÑƒÐ³Ñ€Ð¾Ð·Ð°. Ðемного реÑурÑов.\nСоберите как можно больше Ñвинца и меди.\nДвигайтеÑÑŒ дальше. sector.frozenForest.description = Даже здеÑÑŒ, ближе к горам, Ñпоры раÑпроÑтранилиÑÑŒ. Холодные температуры не могут Ñдерживать их вечно.\n\nÐачните вкладыватьÑÑ Ð² Ñнергию. ПоÑтройте генераторы внутреннего ÑгораниÑ. ÐаучитеÑÑŒ пользоватьÑÑ Ñ€ÐµÐ³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼. @@ -549,11 +609,29 @@ sector.saltFlats.description = Ðа окраине пуÑтыни лежат Ñ sector.craters.description = Вода ÑкопилаÑÑŒ в Ñтом кратере, реликвии времён Ñтарых войн. ВоÑÑтановите облаÑть. Соберите пеÑок. Выплавьте метаÑтекло. Качайте воду Ð´Ð»Ñ Ð¾Ñ…Ð»Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ‚ÑƒÑ€ÐµÐ»ÐµÐ¹ и буров. sector.ruinousShores.description = Мимо пуÑтошей проходит Ð±ÐµÑ€ÐµÐ³Ð¾Ð²Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ. Когда-то здеÑÑŒ раÑполагалÑÑ Ð¼Ð°ÑÑив береговой обороны. Ðе так много от него оÑталоÑÑŒ. Только Ñамые базовые оборонительные ÑÐ¾Ð¾Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¾ÑталиÑÑŒ невредимыми, вÑÑ‘ оÑтальное превратилоÑÑŒ в металлолом.\nПродолжайте ÑкÑпанÑию вовне. Переоткройте Ð´Ð»Ñ ÑÐµÐ±Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¸. sector.stainedMountains.description = Дальше, вглубь меÑтноÑти, лежат горы, еще не запÑтнанные Ñпорами.\nИзвлеките изобилие титана в Ñтой облаÑти. ÐаучитеÑÑŒ им пользоватьÑÑ.\n\nВражеÑкое приÑутÑтвие здеÑÑŒ Ñильнее. Ðе дайте им времени Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Ñвоих Ñильнейших боевых единиц. -sector.overgrowth.description = Эта зароÑÑˆÐ°Ñ Ð¾Ð±Ð»Ð°Ñть находитÑÑ Ð±Ð»Ð¸Ð¶Ðµ к иÑточнику Ñпор.\nВраг организовал здеÑÑŒ форпоÑÑ‚. ПоÑтройте боевые единицы «Титан». Уничтожьте его. Верните то, что было потерÑно. -sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пуÑтыней. Один из немногих районов Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ‹Ð¼Ð¸ запаÑами дёгтÑ.\nÐ¥Ð¾Ñ‚Ñ Ñта облаÑть заброшенна, в ней поблизоÑти приÑутÑтвуют некоторые опаÑные вражеÑкие Ñилы. Ðе Ñтоит их недооценивать.\n\n[lightgray]ИÑÑледуйте технологию переработки нефти, еÑли возможно. +sector.overgrowth.description = Эта зароÑÑˆÐ°Ñ Ð¾Ð±Ð»Ð°Ñть находитÑÑ Ð±Ð»Ð¸Ð¶Ðµ к иÑточнику Ñпор.\nВраг организовал здеÑÑŒ форпоÑÑ‚. ПоÑтройте боевые единицы «Булава». Уничтожьте его. Верните то, что было потерÑно. +sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пуÑтыней. Один из немногих районов Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ‹Ð¼Ð¸ запаÑами дёгтÑ.\nÐ¥Ð¾Ñ‚Ñ Ñта облаÑть заброшена, в ней поблизоÑти приÑутÑтвуют некоторые опаÑные вражеÑкие Ñилы. Ðе Ñтоит их недооценивать.\n\n[lightgray]ИÑÑледуйте технологию переработки нефти, еÑли возможно. sector.desolateRift.description = Чрезвычайно опаÑÐ½Ð°Ñ Ð·Ð¾Ð½Ð°. Обилие реÑурÑов, но мало меÑта. Ð’Ñ‹Ñокий риÑк разрушениÑ. ЭвакуироватьÑÑ Ð½ÑƒÐ¶Ð½Ð¾ как можно Ñкорее. Ðе раÑÑлаблÑйтеÑÑŒ во Ð²Ñ€ÐµÐ¼Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… перерывов между вражеÑкими атаками. sector.nuclearComplex.description = Бывший завод по производÑтву и переработке ториÑ, превращенный в руины.\n[lightgray]ИÑÑледуйте торий и варианты его многочиÑленного применениÑ.\n\nВраг приÑутÑтвует здеÑÑŒ в большом чиÑле, поÑтоÑнно Ñ€Ð°Ð·Ð²ÐµÐ´Ñ‹Ð²Ð°Ñ Ð½Ð°Ð¿Ð°Ð´Ð°ÑŽÑ‰Ð¸Ñ…. -sector.fungalPass.description = ÐŸÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ð°Ñ Ð¾Ð±Ð»Ð°Ñть между выÑокими горами и более низкими, покрытыми Ñпорами землÑми. ЗдеÑÑŒ раÑположена Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ€Ð°Ð·Ð²ÐµÐ´Ñ‹Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð±Ð°Ð·Ð° противника.\nУничтожьте ее.\nИÑпользуйте единицы «Кинжал» и «Камикадзе». ДоÑтаньте до обоих Ñдер. +sector.fungalPass.description = ÐŸÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ð°Ñ Ð¾Ð±Ð»Ð°Ñть между выÑокими горами и более низкими, покрытыми Ñпорами землÑми. ЗдеÑÑŒ раÑположена Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ€Ð°Ð·Ð²ÐµÐ´Ñ‹Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð±Ð°Ð·Ð° противника.\nУничтожьте ее.\nИÑпользуйте единицы «Кинжал» и «Ползун». ДоÑтаньте до обоих Ñдер. +sector.biomassFacility.description = ПервоиÑточник Ñпор. Объект, на котором они были иÑÑледованы и изначально получены.\nИÑÑледуйте технологию, находÑщуюÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸. Культивируйте Ñпоры Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва топлива и плаÑтмаÑÑ.\n\n[lightgray]ПоÑле развала Ñтого объекта Ñпоры оказалиÑÑŒ выброшены наружу. Ðичто в меÑтной ÑкоÑиÑтеме не могло Ñоперничать Ñ Ñ‚Ð°ÐºÐ¸Ð¼ агреÑÑивным организмом. +sector.windsweptIslands.description = Дальше за береговой линией проÑтираетÑÑ Ñта Ð¾Ñ‚Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ñ‡ÐµÑ€ÐµÐ´Ð° оÑтровов. СоглаÑно запиÑÑм, когда-то они раÑполагали [accent]плаÑтано[]производÑщими ÑооружениÑми.\n\nОтбейтеÑÑŒ от морÑких Ñил противника. ОбоÑнуйте базу на оÑтровах. Изучите Ñти заводы. +sector.extractionOutpost.description = Отдаленный аванпоÑÑ‚, поÑтроенный противником Ñ Ñ†ÐµÐ»ÑŒÑŽ переброÑки реÑурÑов в другие Ñекторы.\n\nМежÑÐµÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½ÑÐ¿Ð¾Ñ€Ñ‚Ð½Ð°Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð° Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ³Ð¾ завоеваниÑ. Уничтожьте базу. Изучите их пуÑковые площадки. +sector.impact0078.description = ЗдеÑÑŒ лежат оÑтатки межзвездного транÑпортного Ñудна, первым вошедшего в Ñту ÑиÑтему.\n\nИзвлеките как можно больше из обломков. Изучите любую уцелевшую технологию. +sector.planetaryTerminal.description = ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ†ÐµÐ»ÑŒ.\n\nЭта Ð±ÐµÑ€ÐµÐ³Ð¾Ð²Ð°Ñ Ð±Ð°Ð·Ð° Ñодержит Ñооружение, ÑпоÑобное запуÑкать Ñдра к окреÑтным планетам. Оно крайне хорошо охранÑетÑÑ.\n\nПроизведите морÑкие единицы. Уничтожьте врага как можно Ñкорее. Изучите пуÑковую конÑтрукцию. + +status.burning.name = Горит +status.freezing.name = Замерзает +status.wet.name = Влажный +status.muddy.name = Ð’ грÑзи +status.melting.name = ПлавитÑÑ +status.sapped.name = ИÑтощён +status.spore-slowed.name = Замедлен Ñпорами +status.tarred.name = Покрыт нефтью +status.overclock.name = УÑкорен +status.shocked.name = Шокирован +status.blasted.name = Подорван +status.unmoving.name = Ðеподвижен settings.language = Язык settings.data = Игровые данные @@ -569,60 +647,103 @@ settings.clear.confirm = Ð’Ñ‹ дейÑтвительно хотите очиÑÑ‚ settings.clearall.confirm = [scarlet]ОСТОРОЖÐО![]\nЭто Ñотрёт вÑе данные, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑохранениÑ, карты, прогреÑÑ ÐºÐ°Ð¼Ð¿Ð°Ð½Ð¸Ð¸ и наÑтройки управлениÑ.\nПоÑле того как вы нажмёте [accent][ОК][], игра уничтожит вÑе данные и автоматичеÑки закроетÑÑ. settings.clearsaves.confirm = Ð’Ñ‹ уверены, что хотите удалить вÑе ÑохранениÑ? settings.clearsaves = Удалить вÑе ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ +settings.clearresearch = СброÑить иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ +settings.clearresearch.confirm = Ð’Ñ‹ уверены, что хотите ÑброÑить вÑе ваши иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð¼Ð¿Ð°Ð½Ð¸Ð¸? +settings.clearcampaignsaves = ОчиÑтить ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼Ð¿Ð°Ð½Ð¸Ð¸ +settings.clearcampaignsaves.confirm = Ð’Ñ‹ уверены, что хотите очиÑтить вÑе ваши ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼Ð¿Ð°Ð½Ð¸Ð¸? paused = [accent]< Пауза > clear = ОчиÑтить banned = [scarlet]Запрещено -unplaceable.sectorcaptured = [scarlet]ТребуетÑÑ Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð¸Ñ‚ÑŒ Ñектор yes = Да no = Ðет info.title = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ error.title = [scarlet]Произошла ошибка error.crashtitle = Произошла ошибка -unit.nobuild = [scarlet]Ð‘Ð¾ÐµÐ²Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° не может Ñтроить -blocks.input = Вход -blocks.output = Выход -blocks.booster = УÑкоритель -blocks.tiles = Ðеобходимые плитки -blocks.affinities = Увеличение ÑффективноÑти +unit.nobuild = [scarlet]Единица не может Ñтроить +lastaccessed = [lightgray]ПоÑледнÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ {0} block.unknown = [lightgray]??? -blocks.powercapacity = ВмеÑтимоÑть Ñнергии -blocks.powershot = ЭнергиÑ/Ð’Ñ‹Ñтрел -blocks.damage = Урон -blocks.targetsair = Воздушные цели -blocks.targetsground = Ðаземные цели -blocks.itemsmoved = СкороÑть Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ -blocks.launchtime = Интервал запуÑков -blocks.shootrange = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ -blocks.size = Размер -blocks.displaysize = Размер диÑÐ¿Ð»ÐµÑ -blocks.liquidcapacity = ВмеÑтимоÑть жидкоÑти -blocks.powerrange = ДальноÑть передачи Ñнергии -blocks.linkrange = ДальноÑть ÑвÑзи -blocks.instructions = ИнÑтрукции -blocks.powerconnections = КоличеÑтво Ñоединений -blocks.poweruse = ПотреблÑет Ñнергии -blocks.powerdamage = ЭнергиÑ/урон -blocks.itemcapacity = ВмеÑтимоÑть предметов -blocks.memorycapacity = Размер памÑти -blocks.basepowergeneration = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñнергии -blocks.productiontime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва -blocks.repairtime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ регенерации -blocks.speedincrease = Увеличение ÑкороÑти -blocks.range = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ -blocks.drilltier = Бурит -blocks.drillspeed = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑкороÑть Ð±ÑƒÑ€ÐµÐ½Ð¸Ñ -blocks.boosteffect = УÑкорÑющий Ñффект -blocks.maxunits = МакÑимальное количеÑтво активных единиц -blocks.health = ПрочноÑть -blocks.buildtime = Ð’Ñ€ÐµÐ¼Ñ ÑтроительÑтва -blocks.maxconsecutive = МакÑ. поÑледовательноÑть -blocks.buildcost = СтоимоÑть ÑтроительÑтва -blocks.inaccuracy = Ð Ð°Ð·Ð±Ñ€Ð¾Ñ -blocks.shots = Ð’Ñ‹Ñтрелы -blocks.reload = Ð’Ñ‹Ñтрелы/Ñекунду -blocks.ammo = БоеприпаÑÑ‹ -blocks.shieldhealth = ПрочноÑть щита -blocks.cooldowntime = Ð’Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ + +stat.description = Ðазначение +stat.input = Вход +stat.output = Выход +stat.booster = УÑкоритель +stat.tiles = Ðеобходимые плитки +stat.affinities = Увеличение ÑффективноÑти +stat.opposites = Уменьшение ÑффективноÑти +stat.powercapacity = ВмеÑтимоÑть Ñнергии +stat.powershot = ЭнергиÑ/выÑтрел +stat.damage = Урон +stat.targetsair = Воздушные цели +stat.targetsground = Ðаземные цели +stat.itemsmoved = СкороÑть Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ +stat.launchtime = Интервал запуÑков +stat.shootrange = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ +stat.size = Размер +stat.displaysize = Размер диÑÐ¿Ð»ÐµÑ +stat.liquidcapacity = ВмеÑтимоÑть жидкоÑти +stat.powerrange = ДальноÑть передачи Ñнергии +stat.linkrange = ДальноÑть ÑвÑзи +stat.instructions = ИнÑтрукции +stat.powerconnections = КоличеÑтво Ñоединений +stat.poweruse = ПотреблÑет Ñнергии +stat.powerdamage = ЭнергиÑ/урон +stat.itemcapacity = ВмеÑтимоÑть предметов +stat.memorycapacity = Размер памÑти +stat.basepowergeneration = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñнергии +stat.productiontime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва +stat.repairtime = Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ регенерации +stat.weapons = ÐžÑ€ÑƒÐ´Ð¸Ñ +stat.bullet = СнарÑд +stat.speedincrease = Увеличение ÑкороÑти +stat.range = Ð Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ +stat.drilltier = Бурит +stat.drillspeed = Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑкороÑть Ð±ÑƒÑ€ÐµÐ½Ð¸Ñ +stat.boosteffect = УÑкорÑющий Ñффект +stat.maxunits = МакÑимальное количеÑтво активных единиц +stat.health = ПрочноÑть +stat.armor = Ð‘Ñ€Ð¾Ð½Ñ +stat.buildtime = Ð’Ñ€ÐµÐ¼Ñ ÑтроительÑтва +stat.maxconsecutive = МакÑ. поÑледовательноÑть +stat.buildcost = СтоимоÑть ÑтроительÑтва +stat.inaccuracy = Ð Ð°Ð·Ð±Ñ€Ð¾Ñ +stat.shots = Ð’Ñ‹Ñтрелы +stat.reload = Ð’Ñ‹Ñтрелы/Ñекунду +stat.ammo = БоеприпаÑÑ‹ +stat.shieldhealth = ПрочноÑть щита +stat.cooldowntime = Ð’Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ +stat.explosiveness = ВзрывоопаÑноÑть +stat.basedeflectchance = Базовый ÑˆÐ°Ð½Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ +stat.lightningchance = Ð¨Ð°Ð½Ñ ÑƒÐ´Ð°Ñ€Ð° молнии +stat.lightningdamage = Урон молнии +stat.flammability = ВоÑпламенÑемоÑть +stat.radioactivity = РадиоактивноÑть +stat.charge = ЗарÑд +stat.heatcapacity = ТеплоёмкоÑть +stat.viscosity = Ð’ÑзкоÑть +stat.temperature = Температура +stat.speed = СкороÑть +stat.buildspeed = СкороÑть ÑтроительÑтва +stat.minespeed = СкороÑть добычи +stat.minetier = Уровень добычи +stat.payloadcapacity = ГрузоподъёмноÑть +stat.commandlimit = Лимит ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð²Ð°Ð½Ð¸Ñ +stat.abilities = СпоÑобноÑти +stat.canboost = Может взлететь +stat.flying = Летающий +stat.ammouse = ИÑпользование боеприпаÑов +stat.damagemultiplier = Множитель урона +stat.healthmultiplier = Множитель прочноÑти +stat.speedmultiplier = Множитель ÑкороÑти +stat.reloadmultiplier = Множитель перезарÑдки +stat.buildspeedmultiplier = Множитель ÑкороÑти ÑтроительÑтва +stat.reactive = Реактивен + +ability.forcefield = Силовое поле +ability.repairfield = Ремонтирующее поле +ability.statusfield = {0} УÑиливающее поле +ability.unitspawn = Завод единиц «{0}» +ability.shieldregenfield = Поле воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‰Ð¸Ñ‚Ð° +ability.movelightning = Молнии при движении bar.drilltierreq = ТребуетÑÑ Ð±ÑƒÑ€ получше bar.noresources = ÐедоÑтаточно реÑурÑов @@ -630,14 +751,15 @@ bar.corereq = ТребуетÑÑ Ð¾Ñнова Ñдра bar.drillspeed = СкороÑть бурениÑ: {0}/Ñ bar.pumpspeed = СкороÑть выкачиваниÑ: {0}/Ñ bar.efficiency = ЭффективноÑть: {0}% +bar.boost = УÑкорение: {0}% bar.powerbalance = ЭнергиÑ: {0}/Ñ bar.powerstored = Ðакоплено: {0}/{1} bar.poweramount = ЭнергиÑ: {0} bar.poweroutput = Выход Ñнергии: {0} +bar.powerlines = Подключений: {0}/{1} bar.items = Предметы: {0} bar.capacity = ВмеÑтимоÑть: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[единица отключена] bar.liquid = ЖидкоÑти bar.heat = Ðагрев bar.power = Ð­Ð½ÐµÑ€Ð³Ð¸Ñ @@ -645,27 +767,32 @@ bar.progress = ПрогреÑÑ ÑтроительÑтва bar.input = Ввод bar.output = Вывод +units.processorcontrol = [lightgray]УправлÑетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑором + bullet.damage = [stat]{0}[lightgray] урона bullet.splashdamage = [stat]{0}[lightgray] урона в радиуÑе ~[stat] {1}[lightgray] блоков bullet.incendiary = [stat]зажигательный bullet.homing = [stat]ÑамонаводÑщийÑÑ -bullet.shock = [stat]шоковый bullet.frag = [stat]оÑколочный -bullet.knockback = [stat]{0}[lightgray] отдачи -bullet.freezing = [stat]замораживающий -bullet.tarred = [stat]замедлÑющий, горючий +bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона +bullet.buildingdamage = [stat]{0}%[lightgray] урона по поÑтройкам +bullet.knockback = [stat]{0}[lightgray] отбраÑÑ‹Ð²Ð°Ð½Ð¸Ñ +bullet.pierce = [stat]{0}[lightgray]x пробитие +bullet.infinitepierce = [stat]беÑконечное пробитие +bullet.healpercent = [stat]{0}[lightgray]% Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпаÑов bullet.reload = [stat]{0}[lightgray]x ÑкороÑть Ñтрельбы -unit.blocks = блоки +unit.blocks = блоков +unit.blockssquared = блоков² unit.powersecond = единиц Ñнергии/Ñекунду unit.liquidsecond = жидкоÑтных единиц/Ñекунду unit.itemssecond = предметов/Ñекунду unit.liquidunits = жидкоÑтных единиц unit.powerunits = Ñнерг. единиц -unit.degrees = град. -unit.seconds = Ñек. -unit.minutes = мин. +unit.degrees = ° +unit.seconds = Ñек +unit.minutes = мин unit.persecond = /Ñек unit.perminute = /мин unit.timesspeed = x ÑкороÑть @@ -675,22 +802,27 @@ unit.items = предметов unit.thousands = к unit.millions = М unit.billions = кM +unit.pershot = /выÑтрел +category.purpose = Ðазначение category.general = ОÑновные category.power = Ð­Ð½ÐµÑ€Ð³Ð¸Ñ category.liquids = ЖидкоÑти category.items = Предметы -category.crafting = Ввод/Вывод -category.shooting = Стрельба +category.crafting = Ввод/вывод +category.function = ДейÑтвие category.optional = Дополнительные ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ setting.landscape.name = Только альбомный (горизонтальный) режим setting.shadows.name = Тени setting.blockreplace.name = ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°Ð¼ÐµÐ½Ð° блоков setting.linear.name = Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ setting.hints.name = ПодÑказки +setting.logichints.name = ПодÑказки Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÐºÐ¸ setting.flow.name = Показывать ÑкороÑть потока реÑурÑов +setting.backgroundpause.name = Ð¤Ð¾Ð½Ð¾Ð²Ð°Ñ Ð¿Ð°ÑƒÐ·Ð° setting.buildautopause.name = ÐвтоматичеÑÐºÐ°Ñ Ð¿Ñ€Ð¸Ð¾Ñтановка ÑтроительÑтва -setting.mapcenter.name = Центрирование карты на игроке -setting.animatedwater.name = Ðнимированные жидкоÑти +setting.doubletapmine.name = Добыча руды двойным нажатием +setting.modcrashdisable.name = Отключение модификаций поÑле вылета при запуÑке +setting.animatedwater.name = Ðнимированные поверхноÑти setting.animatedshields.name = Ðнимированные щиты setting.antialias.name = Сглаживание[lightgray] (требует перезапуÑка)[] setting.playerindicators.name = Индикаторы Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð² @@ -717,17 +849,15 @@ setting.conveyorpathfinding.name = ПоиÑк пути Ð´Ð»Ñ ÑƒÑтановки setting.sensitivity.name = ЧувÑтвительноÑть контроллера setting.saveinterval.name = Интервал ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ setting.seconds = {0} Ñекунд -setting.blockselecttimeout.name = Тайм-аут выбора блока setting.milliseconds = {0} миллиÑекунд setting.fullscreen.name = ПолноÑкранный режим setting.borderlesswindow.name = Безрамочное окно[lightgray] (может потребоватьÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк) setting.fps.name = Показывать FPS и пинг setting.smoothcamera.name = ÐŸÐ»Ð°Ð²Ð½Ð°Ñ ÐºÐ°Ð¼ÐµÑ€Ð° -setting.blockselectkeys.name = Показать клавиши выбора блока setting.vsync.name = Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ setting.pixelate.name = ПикÑÐµÐ»Ð¸Ð·Ð°Ñ†Ð¸Ñ setting.minimap.name = Отображать мини-карту -setting.coreitems.name = Отображать предметы из Ñдра (WIP) +setting.coreitems.name = Отображать предметы из Ñдра setting.position.name = Отображать координаты игрока setting.musicvol.name = ГромкоÑть музыки setting.atmosphere.name = Отображать атмоÑферу планеты @@ -743,13 +873,15 @@ setting.chatopacity.name = ÐепрозрачноÑть чата setting.lasersopacity.name = ÐепрозрачноÑть лазеров ÑнергоÑÐ½Ð°Ð±Ð¶ÐµÐ½Ð¸Ñ setting.bridgeopacity.name = ÐепрозрачноÑть моÑтов setting.playerchat.name = Отображать облака чата над игроками +setting.showweather.name = Отображать погоду public.confirm = Ð’Ñ‹ хотите, чтобы ваша игра Ñтала публичной?\n[accent] Любой игрок Ñможет приÑоединитьÑÑ Ðº вашим играм.\n[lightgray]Позже, Ñто можно будет изменить в ÐаÑтройки->Игра->ОбщедоÑтупноÑть игры. +public.confirm.really = ЕÑли вы хотите поиграть Ñ Ð´Ñ€ÑƒÐ·ÑŒÑми, то иÑпользуйте кнопку «[green]ПриглаÑить друзей[]» вмеÑто ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ [scarlet]публичного Ñервера[]!\nÐ’Ñ‹ уверены, что хотите Ñделать Ñвою игру [scarlet]публичной[]? public.beta = Имейте в виду, что бета-верÑÐ¸Ñ Ð¸Ð³Ñ€Ñ‹ не может делать игры публичными. uiscale.reset = МаÑштаб пользовательÑкого интерфейÑа был изменён.\nÐажмите «ОК» Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ñтого маÑштаба.\n[scarlet]Возврат наÑтроек и выход через[accent] {0}[] Ñекунд… uiscale.cancel = Отменить & Выйти setting.bloom.name = Свечение keybind.title = ÐаÑтройка ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ -keybinds.mobile = [scarlet]БольшинÑтво комбинаций клавиш здеÑÑŒ не работают на мобильных уÑтройÑтвах. ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ базовое движение. +keybinds.mobile = [scarlet]БольшинÑтво комбинаций клавиш здеÑÑŒ не работает на мобильных уÑтройÑтвах. ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ базовое движение. category.general.name = ОÑновное category.view.name = ПроÑмотр category.multiplayer.name = Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¸Ð³Ñ€Ð° @@ -771,7 +903,7 @@ keybind.move_x.name = Движение по оÑи X keybind.move_y.name = Движение по оÑи Y keybind.mouse_move.name = Следовать за курÑором keybind.pan.name = Панорамирование камеры -keybind.boost.name = Полёт/УÑкорение +keybind.boost.name = Полёт/уÑкорение keybind.schematic_select.name = Выбрать облаÑть keybind.schematic_menu.name = Меню Ñхем keybind.schematic_flip_x.name = Отразить Ñхему по оÑи X @@ -782,18 +914,18 @@ keybind.block_select_left.name = Выбор левого блока keybind.block_select_right.name = Выбор правого блока keybind.block_select_up.name = Выбор верхнего блока keybind.block_select_down.name = Выбор нижнего блока -keybind.block_select_01.name = КатегориÑ/Выбор блока 1 -keybind.block_select_02.name = КатегориÑ/Выбор блока 2 -keybind.block_select_03.name = КатегориÑ/Выбор блока 3 -keybind.block_select_04.name = КатегориÑ/Выбор блока 4 -keybind.block_select_05.name = КатегориÑ/Выбор блока 5 -keybind.block_select_06.name = КатегориÑ/Выбор блока 6 -keybind.block_select_07.name = КатегориÑ/Выбор блока 7 -keybind.block_select_08.name = КатегориÑ/Выбор блока 8 -keybind.block_select_09.name = КатегориÑ/Выбор блока 9 -keybind.block_select_10.name = КатегориÑ/Выбор блока 10 +keybind.block_select_01.name = КатегориÑ/выбор блока 1 +keybind.block_select_02.name = КатегориÑ/выбор блока 2 +keybind.block_select_03.name = КатегориÑ/выбор блока 3 +keybind.block_select_04.name = КатегориÑ/выбор блока 4 +keybind.block_select_05.name = КатегориÑ/выбор блока 5 +keybind.block_select_06.name = КатегориÑ/выбор блока 6 +keybind.block_select_07.name = КатегориÑ/выбор блока 7 +keybind.block_select_08.name = КатегориÑ/выбор блока 8 +keybind.block_select_09.name = КатегориÑ/выбор блока 9 +keybind.block_select_10.name = КатегориÑ/выбор блока 10 keybind.fullscreen.name = Переключение полноÑкранного режима -keybind.select.name = Выбор/Ð’Ñ‹Ñтрел +keybind.select.name = Выбор/выÑтрел keybind.diagonal_placement.name = Диагональное размещение keybind.pick.name = Выбрать блок keybind.break_block.name = Разрушить блок @@ -807,6 +939,9 @@ keybind.menu.name = Меню keybind.pause.name = Пауза keybind.pause_building.name = ПриоÑтановить/возобновить ÑтроительÑтво keybind.minimap.name = Мини-карта +keybind.planet_map.name = Карта планеты +keybind.research.name = ИÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ +keybind.block_info.name = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ блоке keybind.chat.name = Чат keybind.player_list.name = СпиÑок игроков keybind.console.name = КонÑоль @@ -816,6 +951,7 @@ keybind.toggle_menus.name = Переключение меню keybind.chat_history_prev.name = Пред. иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‡Ð°Ñ‚Ð° keybind.chat_history_next.name = След. иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‡Ð°Ñ‚Ð° keybind.chat_scroll.name = Прокрутка чата +keybind.chat_mode.name = Изменить режим чата keybind.drop_unit.name = СброÑить боев. ед. keybind.zoom_minimap.name = МаÑштабировать мини-карту mode.help.title = ОпиÑание режимов @@ -832,17 +968,20 @@ mode.custom = ПользовательÑкие правила rules.infiniteresources = БеÑконечные реÑурÑÑ‹ (Игрок) rules.reactorexplosions = Взрывы реакторов +rules.coreincinerates = Ядро Ñжигает избыток реÑурÑов rules.schematic = Схемы разрешены rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки rules.buildai = СтроительÑтво ИИ rules.enemyCheat = БеÑконечные реÑурÑÑ‹ ИИ (краÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°) -rules.blockhealthmultiplier = Множитель Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð±Ð»Ð¾ÐºÐ¾Ð² +rules.blockhealthmultiplier = Множитель прочноÑти блоков rules.blockdamagemultiplier = Множитель урона блоков rules.unitbuildspeedmultiplier = Множитель ÑкороÑти производÑтва боев. ед. -rules.unithealthmultiplier = Множитель Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð±Ð¾ÐµÐ². ед. +rules.unithealthmultiplier = Множитель прочноÑти боев. ед. rules.unitdamagemultiplier = Множитель урона боев. ед. +rules.unitcapvariable = Ядра увеличивают лимит единиц +rules.unitcap = Ðачальный лимит единиц rules.enemycorebuildradius = Ð Ð°Ð´Ð¸ÑƒÑ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ враж. Ñдер:[lightgray] (блок.) rules.wavespacing = Интервал волн:[lightgray] (Ñек) rules.buildcostmultiplier = Множитель затрат на ÑтроительÑтво @@ -858,17 +997,22 @@ rules.title.unit = Боевые единицы rules.title.experimental = ЭкÑпериментально rules.title.environment = Окружение rules.lighting = ОÑвещение +rules.enemyLights = ВражеÑкие огни rules.fire = Огонь rules.explosions = Урон от взрывов блоков/единиц rules.ambientlight = Окружающий Ñвет rules.weather = Погода rules.weather.frequency = ПериодичноÑть: +rules.weather.always = Ð’Ñегда rules.weather.duration = ДлительноÑть: content.item.name = Предметы content.liquid.name = ЖидкоÑти content.unit.name = Боевые единицы content.block.name = Блоки +content.status.name = Эффекты ÑтатуÑа +content.sector.name = Секторы + item.copper.name = Медь item.lead.name = Свинец item.coal.name = Уголь @@ -890,23 +1034,6 @@ liquid.slag.name = Шлак liquid.oil.name = Ðефть liquid.cryofluid.name = ÐšÑ€Ð¸Ð¾Ð³ÐµÐ½Ð½Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñть -item.explosiveness = [lightgray]ВзрывоопаÑноÑть: {0}% -item.flammability = [lightgray]ВоÑпламенÑемоÑть: {0}% -item.radioactivity = [lightgray]РадиоактивноÑть: {0}% - -unit.health = [lightgray]ЦелоÑтноÑть: {0} -unit.speed = [lightgray]СкороÑть: {0} -unit.weapon = [lightgray]Оружие: {0} -unit.itemcapacity = [lightgray]ВмеÑтимоÑть предметов: {0} -unit.minespeed = [lightgray]СкороÑть добычи: {0}% -unit.minepower = [lightgray]МощноÑть добычи: {0} -unit.ability = [lightgray]СпоÑобноÑть: {0} -unit.buildspeed = [lightgray]СкороÑть ÑтроительÑтва: {0}% - -liquid.heatcapacity = [lightgray]ТеплоёмкоÑть: {0} -liquid.viscosity = [lightgray]Ð’ÑзкоÑть: {0} -liquid.temperature = [lightgray]Температура: {0} - unit.dagger.name = Кинжал unit.mace.name = Булава unit.fortress.name = КрепоÑть @@ -938,15 +1065,17 @@ unit.beta.name = Бета unit.gamma.name = Гамма unit.scepter.name = Скипетр unit.reign.name = ВлаÑть -# unit.vela.name = Vela +unit.vela.name = ÐŸÐ°Ñ€ÑƒÑ unit.corvus.name = Ворон block.resupply-point.name = Пункт ÑÐ½Ð°Ð±Ð¶ÐµÐ½Ð¸Ñ block.parallax.name = ÐŸÐ°Ñ€Ð°Ð»Ð»Ð°ÐºÑ block.cliff.name = Скала block.sand-boulder.name = ПеÑчаный валун +block.basalt-boulder.name = Базальтовый валун block.grass.name = Трава block.slag.name = Шлак +block.space.name = КоÑÐ¼Ð¾Ñ block.salt.name = Соль block.salt-wall.name = СолÑÐ½Ð°Ñ Ñтена block.pebbles.name = Галька @@ -992,6 +1121,7 @@ block.darksand-water.name = Тёмный пеÑок Ñ Ð²Ð¾Ð´Ð¾Ð¹ block.char.name = Ð’Ñ‹Ð¶Ð¶ÐµÐ½Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ block.dacite.name = Дацит block.dacite-wall.name = Ð”Ð°Ñ†Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +block.dacite-boulder.name = Дацитовый валун block.ice-snow.name = ЗаÑнеженный лёд block.stone-wall.name = ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ñтена block.ice-wall.name = ЛедÑÐ½Ð°Ñ Ñтена @@ -1040,7 +1170,6 @@ block.conveyor.name = Конвейер block.titanium-conveyor.name = Титановый конвейер block.plastanium-conveyor.name = ПлаÑтановый конвейер block.armored-conveyor.name = Бронированный конвейер -block.armored-conveyor.description = Перемещает предметы Ñ Ñ‚Ð¾Ð¹ же ÑкороÑтью, что и титановые конвейеры, но обладает большей бронёй. Ðе принимает на вход Ñ Ð±Ð¾ÐºÐ¾Ð² ни от чего кроме как от других конвейеров. block.junction.name = ПерекрёÑток block.router.name = Маршрутизатор block.distributor.name = РаÑпределитель @@ -1048,7 +1177,6 @@ block.sorter.name = Сортировщик block.inverted-sorter.name = Инвертированный Ñортировщик block.message.name = Сообщение block.illuminator.name = ОÑветитель -block.illuminator.description = Маленький, компактный, наÑтраиваемый иÑточник Ñвета. ТребуетÑÑ ÑÐ½ÐµÑ€Ð³Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. block.overflow-gate.name = Избыточный затвор block.underflow-gate.name = Избыточный шлюз block.silicon-smelter.name = ÐšÑ€ÐµÐ¼Ð½Ð¸ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ @@ -1086,6 +1214,7 @@ block.power-source.name = ИÑточник Ñнергии block.unloader.name = Разгрузчик block.vault.name = Хранилище block.wave.name = Волна +block.tsunami.name = Цунами block.swarmer.name = Роевик block.salvo.name = Залп block.ripple.name = РÑбь @@ -1125,6 +1254,7 @@ block.arc.name = Дуга block.rtg-generator.name = Радиоизотопный термоÑлектричеÑкий генератор block.spectre.name = Спектр block.meltdown.name = ИÑпепелитель +block.foreshadow.name = Знамение block.container.name = Контейнер block.launch-pad.name = ПуÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¾Ñ‰Ð°Ð´ÐºÐ° block.launch-pad-large.name = Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð¿ÑƒÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¾Ñ‰Ð°Ð´ÐºÐ° @@ -1142,6 +1272,11 @@ block.payload-router.name = Разгрузочный маршрутизатор block.disassembler.name = Разборщик block.silicon-crucible.name = Кремниевый тигель block.overdrive-dome.name = Сверхприводный купол +#experimental, may be removed +block.block-forge.name = Завод блоков +block.block-loader.name = Загрузчик блоков +block.block-unloader.name = Разгрузчик блоков +block.interplanetary-accelerator.name = Межпланетный уÑкоритель block.switch.name = Переключатель block.micro-processor.name = МикропроцеÑÑор @@ -1160,158 +1295,391 @@ team.derelict.name = ÐŸÐ¾ÐºÐ¸Ð½ÑƒÑ‚Ð°Ñ team.green.name = Ð—ÐµÐ»Ñ‘Ð½Ð°Ñ team.purple.name = Ð¤Ð¸Ð¾Ð»ÐµÑ‚Ð¾Ð²Ð°Ñ -tutorial.next = [lightgray]<Ðажмите Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ> -tutorial.intro = Ð’Ñ‹ начали[scarlet] обучение по Mindustry.[]\nИÑпользуйте кнопки [accent][[WASD][] Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ.\n[accent]Покрутите колеÑо мыши[] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð¾Ñ‚Ð´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹.\nÐачните Ñ [accent]добычи меди[]. ПриблизьтеÑÑŒ к ней, затем нажмите на медную жилу возле вашего Ñдра, чтобы Ñделать Ñто.\n\n[accent]{0}/{1} меди -tutorial.intro.mobile = Ð’Ñ‹ начали[scarlet] обучение по Mindustry.[]\nПроведите по Ñкрану, чтобы двигатьÑÑ.\n[accent]Сведите или разведите 2 пальца[] Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð°Ñштаба.\nÐачните Ñ [accent]добычи меди[]. ПриблизьтеÑÑŒ к ней, затем нажмите на медную жилу возле Ввашего Ñдра, чтобы Ñделать Ñто.\n\n[accent]{0}/{1} меди -tutorial.drill = Ð ÑƒÑ‡Ð½Ð°Ñ Ð´Ð¾Ð±Ñ‹Ñ‡Ð° не ÑвлÑетÑÑ Ñффективной.\n[accent]Буры[] могут добывать автоматичеÑки.\nÐажмите на вкладку Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ Ñверла Ñнизу Ñправа.\nВыберите[accent] механичеÑкий бур[]. РазмеÑтите его на медной жиле нажатием.\n[accent]Ðажатие по правой кнопке[] прервёт ÑтроительÑтво. -tutorial.drill.mobile = Ð ÑƒÑ‡Ð½Ð°Ñ Ð´Ð¾Ð±Ñ‹Ñ‡Ð° не ÑвлÑетÑÑ Ñффективной.\n[accent]Буры []могут добывать автоматичеÑки.\nÐажмите на вкладку Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ Ñверла Ñнизу Ñправа.\nВыберите[accent] механичеÑкий бур[].\nРазмеÑтите его на медной жиле нажатием, затем нажмите [accent] белую галку[] ниже, чтобы подтвердить поÑтроение выделенного.\nÐажмите [accent] кнопку X[], чтобы отменить размещение. -tutorial.blockinfo = Каждый блок имеет разные характериÑтики. ÐšÐ°Ð¶Ð´Ð°Ñ Ð´Ñ€ÐµÐ»ÑŒ может добывать определенные руды.\nЧтобы узнать информацию о блоке и о его характериÑтиках,[accent] нажмите на «?», когда он выбран в меню ÑтроительÑтва.[]\n\n[accent]СейчаÑ, узнайте характериÑтики механичеÑкого бура.[] -tutorial.conveyor = [accent]Конвейеры[] иÑпользуютÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортировки реÑуров в Ñдро.\nСделайте линию конвейеров от бура к Ñдру\n[accent]Удерживайте левую кнопку мыши, чтобы размеÑтить в линию.[]\nУдерживайте[accent] CTRL[] при поÑтройке линии блоков, чтобы Ñделать её диагональной\n\n[accent]РазмеÑтите 2 конвейера в линию и доÑтавьте предметы в Ñдро. -tutorial.conveyor.mobile = [accent]Конвейеры[] иÑпользуютÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортировки реÑурÑов в Ñдро\nСделайте линию конвейеров от бура к Ñдру\n[accent]Сделайте линию, ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ð¿Ð°Ð»ÐµÑ† неÑколько Ñекунд в том меÑте, в котором вы хотите начать линию,[] и перетÑните его в нужном направлении. [accent]РазмеÑтите 2 конвейера в линию и доÑтавьте предметы в Ñдро. -tutorial.turret = Как только предмет попадает в Ñдро, его можно иÑпользовать в ÑтроительÑтве.\nИмейте в виду, что не вÑе предметы могут быть иÑпользованы в ÑтроительÑтве.\nПредметы, которые Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ ÑтоительÑтва, такие как[accent] уголь[] или[accent] металлолом[], не могут быть транÑпортированы в Ñдро.\nЗащитные Ñтруктуры нужно Ñтроить Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ[lightgray] противников[].\nПоÑтройте[accent] двойную турель[] возле вашей базы. -tutorial.drillturret = Двойным турелÑм нужна [accent]медные боеприпаÑÑ‹[] Ð´Ð»Ñ Ñтрельбы.\nРазмеÑтите бур Ñ€Ñдом Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒÑŽ.\nПроведите конвейеры к турели, чтобы Ñнабдить её медью.\n\n[accent]БоеприпаÑов доÑтавлено: 0/1 -tutorial.pause = Во Ð²Ñ€ÐµÐ¼Ñ Ð±Ð¸Ñ‚Ð²Ñ‹, вы можете[accent] приоÑтановить игру.[]\nÐ’Ñ‹ можете планировать ÑтроительÑтво, когда игра Ñтоит на паузе.\n\n[accent]Ðажмите ПРОБЕЛ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ñтановки игры. -tutorial.pause.mobile = Во Ð²Ñ€ÐµÐ¼Ñ Ð±Ð¸Ñ‚Ð²Ñ‹, вы можете[accent] приоÑтановить игру.[]\nÐ’Ñ‹ можете планировать ÑтроительÑтво, когда игра Ñтоит на паузе.\n\n[accent]Ðажмите кнопку вверху Ñлева, чтобы поÑтавить игру на паузу. -tutorial.unpause = Снова нажмите пробел Ð´Ð»Ñ ÑнÑÑ‚Ð¸Ñ Ð¿Ð°ÑƒÐ·Ñ‹. -tutorial.unpause.mobile = Снова нажмите туда Ð´Ð»Ñ ÑнÑÑ‚Ð¸Ñ Ð¿Ð°ÑƒÐ·Ñ‹. -tutorial.breaking = ЗачаÑтую, блоки приходитÑÑ Ñ€Ð°Ð·Ñ€ÑƒÑˆÐ°Ñ‚ÑŒ\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в выбранной зоне.[]\n\n[accent]Разрушьте вÑе Ñтены из металлолома Ñлева от вашего Ñдра. -tutorial.breaking.mobile = ЗачаÑтую, блоки приходитÑÑ Ñ€Ð°Ð·Ñ€ÑƒÑˆÐ°Ñ‚ÑŒ.\n[accent]Выберите режим деконÑтрукции[], поÑле чего нажмите на нужный блок, чтобы разрушить его.\nРазрушьте блоки в выбранной зоне, зажав палец на неÑколько Ñекунд[], и Ð¿Ñ€Ð¾Ð²ÐµÐ´Ñ ÐµÐ³Ð¾ в нужном направлении.\nÐажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте вÑе Ñтены из металлолома Ñлева от вашего Ñдра. -tutorial.withdraw = Ð’ некоторых ÑитуациÑÑ…, необходимо забрать предметы из блоков вручную.\nЧтобы Ñделать Ñто, [accent]нажмите на блок[], в котором находÑÑ‚ÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ‹, затем [accent]нажмите на предмет[] в инвентаре.\nМожно забрать неÑколько предметов [accent]нажатием Ñ Ð·Ð°Ð¶Ð¸Ð¼Ð¾Ð¼[].\n\n[accent]Заберите немного меди из Ñдра[] -tutorial.deposit = Положите предметы в блок, перетащив их от Ñвоего ÐºÐ¾Ñ€Ð°Ð±Ð»Ñ Ð² нужный блок.\n\n[accent]ПеренеÑите медь обратно в Ñдро[] -tutorial.waves = [lightgray]Противники[] приближаютÑÑ.\n\nЗащитите Ñдро от двух волн. ИÑпользуйте[accent] левую кнопку мыши[] Ð´Ð»Ñ Ñтрельбы.\nПоÑтройте больше турелей и буров. Добудьте больше меди. -tutorial.waves.mobile = [lightgray]Противники[] приближаютÑÑ.\n\nЗащитите Ñдро от двух волн. Ваш корабль будет автоматичеÑки атаковать противника.\nПоÑтройте больше турелей и буров. Добудьте больше меди. -tutorial.launch = Когда вы доÑтигаете определенной волны, вы можете оÑущеÑтвить[accent] запуÑк Ñдра[], оÑтавив базу и[accent] перенеÑти реÑурÑÑ‹ из Ñдра.[]\nЭти реÑурÑÑ‹ могут быть иÑпользованы Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… технологий.\n\n[accent]Ðажмите кнопку запуÑка. +hint.skip = ПропуÑтить +hint.desktopMove = ИÑпользуйте [accent][[WASD][], чтобы двигатьÑÑ. +hint.zoom = [accent]Покрутите колеÑо мыши[] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð¾Ñ‚Ð´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹. +hint.mine = ПриблизьтеÑÑŒ к \uf8c4 медной руде и [accent]нажмите[] на неё Ð´Ð»Ñ Ñ€ÑƒÑ‡Ð½Ð¾Ð¹ добычи. +hint.desktopShoot = ИÑпользуйте [accent][[Левую кнопку мыши][] Ð´Ð»Ñ Ñтрельбы. +hint.depositItems = Чтобы перенеÑти предметы, перетÑните их Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÐºÐ¾Ñ€Ð°Ð±Ð»Ñ Ð² Ñдро. +hint.respawn = Чтобы заново поÑвитьÑÑ Ð² корабле нажмите [accent][[V][]. +hint.respawn.mobile = Ð’Ñ‹ переключили управление единицей/Ñтруктурой. Чтобы заново поÑвитьÑÑ Ð² корабле, [accent]нажмите на аватар Ñлева Ñверху.[] +hint.desktopPause = Ðажмите [accent][[Пробел][] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ñтановки и Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ñ‹. +hint.placeDrill = Выберите в меню Ñправа внизу вкладку \ue85e [accent]Добычи[], затем выберите \uf870 [accent]Бур[] и нажмите на медные вкраплениÑ, чтобы размеÑтить его. +hint.placeDrill.mobile = Выберите в меню Ñправа внизу вкладку \ue85e [accent]Добычи[], затем выберите \uf870 [accent]Бур[] и коÑнитеÑÑŒ медных вкраплений, чтобы размеÑтить его.\n\nÐажмите \ue800 [accent]галочку[] Ñправа внизу Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ. +hint.placeConveyor = Конвейеры перемещают предметы из буров в другие блоки. Выберите \uf896 [accent]Конвейер[] во вкладке \ue814 [accent]ТранÑпортировки[].\n\nÐажмите и перемеÑтите курÑор Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких конвейеров.\n[accent]Покрутите колеÑо мыши[] Ð´Ð»Ñ Ñмены направлениÑ. +hint.placeConveyor.mobile = Конвейеры перемещают предметы из буров в другие блоки. Выберите \uf896 [accent]Конвейер[] во вкладке \ue814 [accent]ТранÑпортировки[].\n\nУдерживайте палец Ñекунду, а затем перемеÑтите Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких конвейеров. +hint.placeTurret = УÑтановите \uf861 [accent]Турели[] Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñвоей базы от врагов.\n\nТурелÑм требуютÑÑ Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°ÑÑ‹ — в данном Ñлучае \uf838медные.\nИÑпользуйте конвейеры и буры Ð´Ð»Ñ Ð¸Ñ… подачи. +hint.breaking = Выделите блоки в рамку [accent]правой кнопкой мыши[], чтобы разобрать их. +hint.breaking.mobile = Ðктивируйте \ue817 [accent]молоток[] в правом нижнем углу и нажимайте на блоки, чтобы разобрать их. Удерживайте палец в течение Ñекунды и перемеÑтите, чтобы разобрать выделением. +hint.research = ИÑпользуйте кнопку \ue875 [accent]ИÑÑледований[], чтобы иÑÑледовать новые технологии. +hint.research.mobile = ИÑпользуйте кнопку \ue875 [accent]ИÑÑледований[] в \ue88c [accent]Меню[], чтобы иÑÑледовать новые технологии. +hint.unitControl = Зажмите [accent][[Л-Ctrl][] и [accent]нажмите левую кнопку мыши[], чтобы контролировать дружеÑтвенные единицы и турели. +hint.unitControl.mobile = [accent]Дважды коÑнитеÑÑŒ[], чтобы контролировать дружеÑтвенные единицы и турели. +hint.launch = Как только будет Ñобрано доÑтаточно реÑурÑов, вы Ñможете оÑущеÑтвить [accent]ЗапуÑк[], выбрав близлежащие Ñекторы на \ue827 [accent]Карте[] из правого нижнего угла. +hint.launch.mobile = Как только будет Ñобрано доÑтаточно реÑурÑов, вы Ñможете оÑущеÑтвить [accent]ЗапуÑк[], выбрав близлежащие Ñекторы на \ue827 [accent]Карте[] в \ue88c [accent]Меню[]. +hint.schematicSelect = Зажмите [accent][[F][] и перемеÑтите, чтобы выбрать блоки Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ вÑтавки.\n\nЩелкните [accent][[колёÑиком][] по блоку Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. +hint.conveyorPathfind = Удерживайте [accent][[Л-Ctrl][] при размещении конвейеров Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой прокладки пути. +hint.conveyorPathfind.mobile = Включите \ue844 [accent]диагональный режим[] и перетащите конвейеры Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой прокладки пути. +hint.boost = Удерживайте [accent][[Л-Shift][], чтобы пролететь над препÑÑ‚ÑтвиÑми при помощи вашей единицы.\n\nТолько некоторые наземные единицы могут взлетать. +hint.command = Ðажмите [accent][[G][], чтобы объединить ближайшие единицы [accent]Ñхожего типа[] в группу.\n\nЧтобы управлÑть наземными единицами, вы должны Ñначала взÑть под контроль другую наземную единицу. +hint.command.mobile = [accent][[Дважды нажмите][] на вашу единицу, чтобы объединить ближайшие единицы в группу. +hint.payloadPickup = Ðажмите [accent][[[], чтобы подобрать маленькие блоки или единицы. +hint.payloadPickup.mobile = [accent]Ðажмите и удерживайте[] палец на маленьком блоке или единице, чтобы подобрать их. +hint.payloadDrop = Ðажмите [accent]][], чтобы ÑброÑить груз. +hint.payloadDrop.mobile = [accent]Ðажмите и удерживайте[] палец на пуÑтой локации, чтобы ÑброÑить туда груз. +hint.waveFire = Турели [accent]Волна[] при подаче воды будут автоматичеÑки тушить пожары вокруг. +hint.generator = \uf879 [accent]Генераторы внутреннего ÑгораниÑ[] Ñжигают уголь и передают Ñнергию Ñ€ÑдомÑтоÑщим блокам.\n\nДальноÑть передачи Ñнергии может быть увеличена при помощи \uf87f [accent]Ñиловых узлов[]. +hint.guardian = [accent]Стражи[] бронированы. Слабые боеприпаÑÑ‹, такие как [accent]медь[] и [accent]Ñвинец[], [scarlet]не Ñффективны[].\n\ИÑпользуйте турели выÑокого ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¸Ð»Ð¸ \uf835 [accent]графитные[] боеприпаÑÑ‹ в \uf861двойных турелÑÑ…/\uf859залпах, чтобы уничтожить Стража. +hint.coreUpgrade = Ядра могут быть улучшены путем [accent]Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð°Ð´ ними Ñдер более выÑокого уровнÑ[].\n\nПомеÑтите Ñдро  [accent]Штаб[] поверх Ñдра ï¡© [accent]ОÑколок[]. УбедитеÑÑŒ, что никакие препÑÑ‚ÑÑ‚Ð²Ð¸Ñ Ð½Ðµ мешают ему. +hint.presetLaunch = Ð’ Ñерые [accent]Ñекторы Ñ Ð¿Ð¾Ñадочными зонами[], такие как [accent]ЛедÑной леÑ[], можно запуÑкатьÑÑ Ð¸Ð· любого меÑта. Они не требуют захвата близлежащей территории.\n\n[accent]Ðумерованные Ñекторы[], такие как Ñтот, [accent]не обÑзательны[] Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ. +hint.coreIncinerate = ПоÑле того, как Ñдро будет заполнено предметом до отказа, любые лишние входÑщие предметы Ñтого типа будут [accent]Ñожжены[]. +hint.coopCampaign = Во Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ñ€Ñ‹ в [accent]кампанию по Ñети[], произведённые на текущей карте предметы будут также отправлены [accent]на ваши локальные Ñекторы[].\n\nЛюбое иÑÑледование Ñо Ñтороны хоÑта также будет перенеÑено. -item.copper.description = Самый оÑновной Ñтроительный материал. Широко иÑпользуетÑÑ Ð²Ð¾ вÑех типах блоков. -item.lead.description = ОÑновной Ñтартовый материал. Широко иÑпользуетÑÑ Ð² Ñлектронике и блоках Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортировки жидкоÑтей. -item.metaglass.description = Сверхпрочный Ñплав Ñтекла. Широко иÑпользуетÑÑ Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñти. -item.graphite.description = Минерализованный углерод, иÑпользуемый Ð´Ð»Ñ Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°Ñов и ÑлектричеÑких компонентов. -item.sand.description = Обычный материал, который широко иÑпользуетÑÑ Ð¿Ñ€Ð¸ выплавке, как при легировании, так и в качеÑтве флюÑа. -item.coal.description = Окаменелое раÑтительное вещеÑтво, образовавшееÑÑ Ð·Ð°Ð´Ð¾Ð»Ð³Ð¾ до поÑева. Широко иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва топлива и реÑурÑов. -item.titanium.description = Редкий Ñверхлёгкий металл, широко иÑпользуемый Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортировки жидкоÑтей, буров и авиации. -item.thorium.description = Плотный радиоактивный металл, иÑпользуемый в качеÑтве Ñтруктурной опоры и Ñдерного топлива. -item.scrap.description = ОÑтатки Ñтарых Ñооружений и боевых единиц. Содержит небольшие количеÑтва многих различных металлов. -item.silicon.description = Чрезвычайно полезный полупроводник. ПрименÑетÑÑ Ð² Ñолнечных панелÑÑ…, Ñложной Ñлектронике и ÑамонаводÑщихÑÑ Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°Ñах. -item.plastanium.description = Лёгкий, плаÑтичный материал, иÑпользуемый в продвинутой авиации и оÑколочных боеприпаÑах. -item.phase-fabric.description = ПрактичеÑки невеÑомое вещеÑтво, иÑпользуемое в передовой Ñлектронике и технологиÑÑ… ÑамовоÑÑтановлениÑ. -item.surge-alloy.description = Современный Ñплав Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ ÑлектричеÑкими ÑвойÑтвами. -item.spore-pod.description = Стручок Ñпор, Ñинтезированных из атмоÑферных концентраций Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ñ‹ÑˆÐ»ÐµÐ½Ð½Ñ‹Ñ… целей. ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ в нефть, взрывчатые вещеÑтва или топливо. -item.blast-compound.description = ÐеÑтабильное Ñоединение, иÑпользуемое в бомбах и взрывчатых вещеÑтвах. СинтезируетÑÑ Ð¸Ð· Ñтручков Ñпор и других летучих вещеÑтв. ИÑпользовать в качеÑтве топлива не рекомендуетÑÑ. -item.pyratite.description = Чрезвычайно огнеопаÑное вещеÑтво, иÑпользуемое в зажигательном оружии. -liquid.water.description = Ð¡Ð°Ð¼Ð°Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñть. Обычно иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ñ…Ð»Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¼Ð°ÑˆÐ¸Ð½ и переработки отходов. -liquid.slag.description = Ð’Ñевозможно различные типы раÑплавленного металла, Ñмешанные вмеÑте. Может быть разделен на ÑоÑтавлÑющие его минералы или раÑпылён на вражеÑких боевые единицы в качеÑтве оружиÑ. -liquid.oil.description = ЖидкоÑть, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð² производÑтве Ñовременных материалов. Может быть превращена в уголь Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве топлива или раÑпылена и подожжена как оружие. -liquid.cryofluid.description = ИнертнаÑ, Ð½ÐµÐµÐ´ÐºÐ°Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñть, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð¸Ð· воды и титана. Обладает чрезвычайно выÑокой теплоёмкоÑтью. Широко иÑпользуетÑÑ Ð² качеÑтве охлаждающей жидкоÑти. +item.copper.description = ИÑпользуетÑÑ Ð²Ð¾ вÑех типах поÑтроек и боеприпаÑов. +item.copper.details = Медь. Ðномально широко раÑпроÑтранённый металл на Серпуло. Структурно Ñлабый, еÑли не укреплён. +item.lead.description = ИÑпользуетÑÑ Ð² транÑпортировке жидкоÑти и ÑлектричеÑких поÑтройках. +item.lead.details = Плотный. Инертный. Широко иÑпользуетÑÑ Ð² аккумулÑторах.\nПримечание: ВероÑтно, токÑичен Ð´Ð»Ñ Ð±Ð¸Ð¾Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑких форм жизни. Ðе то чтобы их здеÑÑŒ много оÑталоÑÑŒ. +item.metaglass.description = ИÑпользуетÑÑ Ð² поÑтройках раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñти. +item.graphite.description = ИÑпользуетÑÑ Ð² ÑлектричеÑких компонентах и как Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°Ñ Ð´Ð»Ñ Ñ‚ÑƒÑ€ÐµÐ»ÐµÐ¹. +item.sand.description = ИÑпользуетÑÑ Ð² производÑтве других обработанных материалов. +item.coal.description = ИÑпользуетÑÑ ÐºÐ°Ðº топливо и в производÑтве обработанных материалов. +item.coal.details = Похоже, что Ñто окаменевшее раÑтительное вещеÑтво, образовавшееÑÑ Ð·Ð°Ð´Ð¾Ð»Ð³Ð¾ до ПоÑева. +item.titanium.description = Широко иÑпользуетÑÑ Ð² транÑпортировке жидкоÑтей, бурах и авиации. +item.thorium.description = ИÑпользуетÑÑ Ð² прочных поÑтройках и как Ñдерное топливо. +item.scrap.description = ИÑпользуетÑÑ Ð² плавильнÑÑ… и измельчителÑÑ… Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… материалов. +item.scrap.details = ОÑтатки Ñтарых поÑтроек и единиц. +item.silicon.description = ИÑпользуетÑÑ Ð² Ñолнечных панелÑÑ…, Ñложной Ñлектронике и ÑамонаводÑщихÑÑ Ð±Ð¾ÐµÐ¿Ñ€Ð¸Ð¿Ð°Ñах Ð´Ð»Ñ Ñ‚ÑƒÑ€ÐµÐ»ÐµÐ¹. +item.plastanium.description = ИÑпользуетÑÑ Ð² продвинутой авиации, изолÑции и оÑколочных боеприпаÑах. +item.phase-fabric.description = ИÑпользуетÑÑ Ð² продвинутой Ñлектронике и ÑамовоÑÑтанавливающихÑÑ Ð¿Ð¾Ñтройках. +item.surge-alloy.description = ИÑпользуетÑÑ Ð² продвинутом вооружении и реактивных оборонительных поÑтройках. +item.spore-pod.description = ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ в нефть, взрывчатку и топливо. +item.spore-pod.details = Споры. Похоже, ÑвлÑÑŽÑ‚ÑÑ ÑинтетичеÑкой формой жизни. ВыделÑÑŽÑ‚ газы, токÑичные Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… биологичеÑких форм жизни. Чрезвычайно инвазивны. Легко воÑпламенÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ определенных уÑловиÑÑ…. +item.blast-compound.description = ИÑпользуетÑÑ Ð² бомбах и взрывчатых вещеÑтвах. +item.pyratite.description = ИÑпользуетÑÑ Ð² зажигательном оружии и твердотопливных генераторах. -block.message.description = СохранÑет Ñообщение. ИÑпользуетÑÑ Ð´Ð»Ñ ÑвÑзи между Ñоюзниками. -block.graphite-press.description = Сжимает куÑки ÑƒÐ³Ð»Ñ Ð² чиÑтые лиÑты графита. -block.multi-press.description = ÐžÐ±Ð½Ð¾Ð²Ð»Ñ‘Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð³Ñ€Ð°Ñ„Ð¸Ñ‚Ð¾Ð²Ð¾Ð³Ð¾ преÑÑа. ИÑпользует воду и Ñнергию Ð´Ð»Ñ Ð±Ñ‹Ñтрой и Ñффективной обработки углÑ. -block.silicon-smelter.description = СоединÑет пеÑок Ñ Ñ‡Ð¸Ñтым углем. Производит кремний. -block.kiln.description = ВыплавлÑет пеÑок и Ñвинец в Ñоединение, извеÑтное как метаÑтекло. ТребуетÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ðµ количеÑтво Ñнергии Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. +liquid.water.description = ИÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ñ…Ð»Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¼Ð°ÑˆÐ¸Ð½ и переработки отходов. +liquid.slag.description = Может быть переработан в разделителе на ÑоÑтавлÑющие металлы или раÑпылён на врагов в качеÑтве оружиÑ. +liquid.oil.description = ИÑпользуетÑÑ Ð² производÑтве продвинутых материалов и как зажигательный боеприпаÑ. +liquid.cryofluid.description = ИÑпользуетÑÑ Ð² качеÑтве охлаждающей жидкоÑти Ð´Ð»Ñ Ñ€ÐµÐ°ÐºÑ‚Ð¾Ñ€Ð¾Ð², турелей и фабрик. + +block.resupply-point.description = СнарÑжает медными боеприпаÑами ближайшие боевые единицы. Ðе ÑовмеÑтим Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°Ð¼Ð¸, требующими Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð¾Ñ‚ батареи. +block.armored-conveyor.description = Перемещает предметы вперёд. Ðе принимает вход по бокам. +block.illuminator.description = Излучает Ñвет. +block.message.description = СохранÑет Ñообщение Ð´Ð»Ñ ÑвÑзи между Ñоюзниками. +block.graphite-press.description = Сжимает куÑки ÑƒÐ³Ð»Ñ Ð² лиÑты графита. +block.multi-press.description = Сжимает куÑки ÑƒÐ³Ð»Ñ Ð² лиÑты графита. ТребуетÑÑ Ð²Ð¾Ð´Ð° в качеÑтве охлаждающей жидкоÑти. +block.silicon-smelter.description = Синтезирует кремний из пеÑка и углÑ. +block.kiln.description = ВыплавлÑет пеÑок и Ñвинец в метаÑтекло. block.plastanium-compressor.description = Производит плаÑтан из нефти и титана. -block.phase-weaver.description = Синтезирует фазовую ткань из радиоактивного Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸ пеÑка. ТребуетÑÑ Ð¾Ð³Ñ€Ð¾Ð¼Ð½Ð¾Ðµ количеÑтво Ñнергии Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. -block.alloy-smelter.description = ОбъединÑет титан, Ñвинец, кремний и медь Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва кинетичеÑкого Ñплава. -block.cryofluid-mixer.description = Смешивает воду и мелкий титановый порошок в криогенную жидкоÑть. ÐÐµÐ¾Ñ‚ÑŠÐµÐ¼Ð»ÐµÐ¼Ð°Ñ Ñ‡Ð°Ñть при иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ€Ð¸ÐµÐ²Ð¾Ð³Ð¾ реактора -block.blast-mixer.description = Раздавливает и Ñмешивает ÑÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ñпор Ñ Ð¿Ð¸Ñ€Ð¾Ñ‚Ð¸Ñ‚Ð¾Ð¼ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ð·Ñ€Ñ‹Ð²Ñ‡Ð°Ñ‚Ð¾Ð³Ð¾ вещеÑтва. -block.pyratite-mixer.description = Смешивает уголь, Ñвинец и пеÑок в легковоÑпламенÑющийÑÑ Ð¿Ð¸Ñ€Ð¾Ñ‚Ð¸Ñ‚. -block.melter.description = Плавит металлолом в шлак Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ¹ обработки или иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² турелÑÑ… «Волна». -block.separator.description = РазделÑет шлак на его минеральные компоненты. Выводит охлажденный результат. -block.spore-press.description = Сжимает капÑулы Ñпор под Ñильным давлением Ð´Ð»Ñ Ñинтеза нефти. +block.phase-weaver.description = Синтезирует фазовую ткань из Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸ пеÑка. +block.alloy-smelter.description = СоединÑет титан, Ñвинец, кремний и медь в кинетичеÑкий Ñплав. +block.cryofluid-mixer.description = Смешивает воду и мелкий титановый порошок в криогенную жидкоÑть. +block.blast-mixer.description = Производит взрывчатую ÑмеÑÑŒ из пиротита и Ñтручков Ñпор. +block.pyratite-mixer.description = Смешивает уголь, Ñвинец и пеÑок в пиротит. +block.melter.description = Плавит металлолом в шлак. +block.separator.description = РазделÑет шлак на его минеральные компоненты. +block.spore-press.description = Сжимает Ñтручки Ñпор Ð´Ð»Ñ Ñинтеза нефти. block.pulverizer.description = Измельчает металлолом в мелкий пеÑок. -block.coal-centrifuge.description = Отвердевает нефть в куÑки углÑ. -block.incinerator.description = ИÑпарÑет любой лишний предмет или жидкоÑть, которую он получает. +block.coal-centrifuge.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.liquid-void.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.plastanium-wall.description = Специальный тип Ñтены, который поглощает ÑлектричеÑкие разрÑды и блокирует автоматичеÑкое Ñоединение между Ñиловыми узлами. -block.plastanium-wall-large.description = Специальный тип Ñтены, который поглощает ÑлектричеÑкие разрÑды и блокирует автоматичеÑкое Ñоединение между Ñиловыми узлами.\nРазмещаетÑÑ Ð½Ð° неÑкольких плитках. -block.thorium-wall.description = Сильный защитный блок.\nÐ¥Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° от врагов. -block.thorium-wall-large.description = Сильный защитный блок.\nÐ¥Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° от врагов.\nРазмещаетÑÑ Ð½Ð° неÑкольких плитках. -block.phase-wall.description = Стена, Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ñпециальным фазовым отражающим ÑоÑтавом. Отражает большинÑтво пуль при ударе. -block.phase-wall-large.description = Стена, Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ñпециальным фазовым отражающим ÑоÑтавом. Отражает большинÑтво пуль при ударе.\nРазмещаетÑÑ Ð½Ð° неÑкольких плитках. -block.surge-wall.description = Очень прочный защитный блок.\nÐакапливает зарÑд при контакте Ñ Ð¿ÑƒÐ»ÐµÐ¹, выпуÑÐºÐ°Ñ ÐµÐ³Ð¾ Ñлучайным образом. -block.surge-wall-large.description = Очень прочный защитный блок.\nÐакапливает зарÑд при контакте Ñ Ð¿ÑƒÐ»ÐµÐ¹, выпуÑÐºÐ°Ñ ÐµÐ³Ð¾ Ñлучайным образом.\nРазмещаетÑÑ Ð½Ð° неÑкольких плитках. -block.door.description = ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð´Ð²ÐµÑ€ÑŒ. Можно открыть или закрыть нажатием. -block.door-large.description = Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð´Ð²ÐµÑ€ÑŒ. Можно открыть и закрыть нажатием.\nРазмещаетÑÑ Ð½Ð° неÑкольких плитках. -block.mender.description = ПериодичеÑки ремонтирует блоки в непоÑредÑтвенной близоÑти. СохранÑет ÑредÑтва защиты в целоÑтноÑти между волнами.\nОпционально иÑпользует кремний Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñти и ÑффективноÑти. -block.mend-projector.description = ÐžÐ±Ð½Ð¾Ð²Ð»Ñ‘Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð ÐµÐ³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°. Ремонтирует блоки в непоÑредÑтвенной близоÑти.\nОпционально иÑпользует фазовую ткань Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñти и ÑффективноÑти. +block.copper-wall.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. +block.copper-wall-large.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. +block.titanium-wall.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. +block.titanium-wall-large.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. +block.plastanium-wall.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. Поглощает лазеры и ÑлектричеÑкие разрÑды. Блокирует автоматичеÑкие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð². +block.plastanium-wall-large.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. Поглощает лазеры и ÑлектричеÑкие разрÑды. Блокирует автоматичеÑкие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð². +block.thorium-wall.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. +block.thorium-wall-large.description = Защищает поÑтройки от вражеÑких ÑнарÑдов. +block.phase-wall.description = Защищает поÑтройки от вражеÑких ÑнарÑдов, Ð¾Ñ‚Ñ€Ð°Ð¶Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтво пуль при ударе. +block.phase-wall-large.description = Защищает поÑтройки от вражеÑких ÑнарÑдов, Ð¾Ñ‚Ñ€Ð°Ð¶Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтво пуль при ударе. +block.surge-wall.description = Защищает поÑтройки от вражеÑких ÑнарÑдов, периодичеÑки выпуÑкает ÑлектричеÑкий разрÑд при ударе. +block.surge-wall-large.description = Защищает поÑтройки от вражеÑких ÑнарÑдов, периодичеÑки выпуÑкает ÑлектричеÑкий разрÑд при ударе. +block.door.description = Стена, которую можно открыть или закрыть нажатием. +block.door-large.description = Стена, которую можно открыть или закрыть нажатием. +block.mender.description = ПериодичеÑки ремонтирует блоки в непоÑредÑтвенной близоÑти.\nОпционально иÑпользует кремний Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñти и ÑффективноÑти. +block.mend-projector.description = ПериодичеÑки ремонтирует блоки в непоÑредÑтвенной близоÑти.\nОпционально иÑпользует фазовую ткань Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñти и ÑффективноÑти. block.overdrive-projector.description = Увеличивает ÑкороÑть близлежащих зданий.\nОпционально иÑпользует фазовую ткань Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñти и ÑффективноÑти. -block.force-projector.description = Создает вокруг ÑÐµÐ±Ñ ÑˆÐµÑтиугольное Ñиловое поле, Ð·Ð°Ñ‰Ð¸Ñ‰Ð°Ñ Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ боевые единицы внутри от повреждений.\nПерегреваетÑÑ, еÑли нанеÑено Ñлишком большое количеÑтво повреждений. Опционально иÑпользует охлаждающую жидкоÑть Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ³Ñ€ÐµÐ²Ð°. Ð¤Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚ÐºÐ°Ð½ÑŒ может быть иÑпользована Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° щита. -block.shock-mine.description = ÐаноÑит урон врагам, наÑтупающим на мину. Почти невидима Ð´Ð»Ñ Ð²Ñ€Ð°Ð³Ð°. -block.conveyor.description = Базовый транÑпортный блок. Перемещает предметы вперед и автоматичеÑки Ñкладывает их в блоки. Можно повернуть. -block.titanium-conveyor.description = Улучшенный транÑпортный блок. Перемещает предметы быÑтрее, чем Ñтандартные конвейеры. -block.plastanium-conveyor.description = ТранÑпортирует предметы пачками.\nПринимает предметы только Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñегмента, а разгружает Ñ Ð¿Ð¾Ñледнего Ñо вÑех Ñторон.\nИмеет большую пропуÑкную ÑпоÑобноÑть по Ñравнению Ñ Ð¾Ñтальными логиÑтичеÑкими блоками. -block.junction.description = ДейÑтвует как моÑÑ‚ Ð´Ð»Ñ Ð´Ð²ÑƒÑ… переÑекающихÑÑ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑ€Ð½Ñ‹Ñ… лент. Полезен в ÑитуациÑÑ…, когда два разных конвейера перевозÑÑ‚ разные материалы в разные меÑта. -block.bridge-conveyor.description = Улучшенный транÑпортный блок. ПозволÑет транÑпортировать предметы над 3 плитками любой меÑтноÑти или зданиÑ. -block.phase-conveyor.description = Улучшенный транÑпортный блок. ИÑпользует Ñнергию Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ предметов на подключенный фазовый конвейер над неÑколькими плитками. -block.sorter.description = Сортирует предметы. ЕÑли предмет ÑоответÑтвует выбору, он может пройти. Ð’ противном Ñлучае предмет выводитÑÑ Ð¿Ð¾ бокам. -block.inverted-sorter.description = Работает Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð°Ð¼Ð¸ так же, как и Ñтандартный Ñортировщик, но выводит выбранный предмет по бокам, а не прÑмо. -block.router.description = Принимает предмет в одном направлении и выводит их до 3 других направлений в равной Ñтепени. Полезен Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¾Ð² из одного иÑточника на неÑколько целей.\n\n[scarlet]Ðикогда не иÑпользуйте Ñ€Ñдом Ñ Ð·Ð°Ð²Ð¾Ð´Ð°Ð¼Ð¸ и Ñ‚.п., так как маршрутизатор будет забит выходными предметами.[] -block.distributor.description = РаÑширенный маршрутизатор. РазделÑет предметы до 7 других направлений в равной Ñтепени. +block.force-projector.description = Создает вокруг ÑÐµÐ±Ñ ÑˆÐµÑтиугольное Ñиловое поле, Ð·Ð°Ñ‰Ð¸Ñ‰Ð°Ñ Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ боевые единицы внутри от повреждений.\nПерегреваетÑÑ, еÑли нанеÑено Ñлишком большое количеÑтво повреждений. Опционально иÑпользует охлаждающую жидкоÑть Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ³Ñ€ÐµÐ²Ð°. Ð¤Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚ÐºÐ°Ð½ÑŒ увеличивает размера щита. +block.shock-mine.description = Ð’Ñ‹Ñвобождает ÑлектричеÑкий разрÑд при контакте Ñ Ð²Ñ€Ð°Ð¶ÐµÑкой единицей. +block.conveyor.description = Перемещает предметы вперёд. +block.titanium-conveyor.description = Перемещает предметы вперёд. БыÑтрее, чем Ñтандартный конвейер. +block.plastanium-conveyor.description = Перемещает предметы вперёд пачками. Принимает предметы только Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñегмента, а разгружает Ñ Ð¿Ð¾Ñледнего в три Ñтороны. ТребуетÑÑ Ð½ÐµÑколько загрузочных и разгрузочных точек Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной пропуÑкной ÑпоÑобноÑти. +block.junction.description = ДейÑтвует как моÑÑ‚ Ð´Ð»Ñ Ð´Ð²ÑƒÑ… переÑекающихÑÑ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑ€Ð½Ñ‹Ñ… лент. +block.bridge-conveyor.description = Перемещает предметы над меÑтноÑтью или зданиÑми. +block.phase-conveyor.description = Мгновенно перемещает предметы над меÑтноÑтью или зданиÑми. Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð´Ð¸ÑтанциÑ, чем у моÑта, но требует Ñнергию. +block.sorter.description = ЕÑли входÑщий предмет Ñовпадает Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð¾Ð¼, то он проходит вперёд. ЕÑли нет, то предмет выводитÑÑ Ð²Ð»ÐµÐ²Ð¾ и вправо. +block.inverted-sorter.description = Работает так же, как и Ñтандартный Ñортировщик, но выводит выбранный предмет по бокам, а не прÑмо. +block.router.description = Равномерно раÑпределÑет входÑщие предметы по 3 выходÑщим направлениÑм. +block.router.details = Ðеобходимое зло. Ðе рекомендуетÑÑ Ðº иÑпользованию как блок ввода возле производÑтвенных зданий, Ñ‚.к. может ÑлучитьÑÑ Ð·Ð°Ñ‚Ð¾Ñ€ выходным материалом. +block.distributor.description = Равномерно раÑпределÑет входÑщие предметы по 7 выходÑщим направлениÑм. block.overflow-gate.description = Выводит предметы по бокам, только еÑли передний путь заблокирован. block.underflow-gate.description = ПротивоположноÑть избыточного затвора. Выводит предметы вперёд только в том Ñлучае, еÑли боковые пути заблокированы. -block.mass-driver.description = Самый продвинутый транÑпортный блок. Собирает неÑколько предметов и затем ÑтрелÑет ими в другую катапульту на большом раÑÑтоÑнии. ТребуетÑÑ ÑÐ½ÐµÑ€Ð³Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. -block.mechanical-pump.description = Дешёвый наÑÐ¾Ñ Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ производительноÑтью, но без ÑнергопотреблениÑ. -block.rotary-pump.description = Продвинутый наÑоÑ. Качает больше жидкоÑти, но требуют Ñнергию. -block.thermal-pump.description = Ðаилучший наÑоÑ. -block.conduit.description = ОÑновной блок транÑпортировки жидкоÑти. Перемещает жидкоÑти вперед. ИÑпользуетÑÑ ÑовмеÑтно Ñ Ð½Ð°ÑоÑами и другими трубопроводами. -block.pulse-conduit.description = Улучшенный блок транÑпортировки жидкоÑти. ТранÑпортирует жидкоÑти быÑтрее и хранит больше, чем Ñтандартные трубопроводы. -block.plated-conduit.description = Перемещает жидкоÑти Ñ Ñ‚Ð¾Ð¹ же ÑкороÑтью, что и импульÑные трубопроводы, но обладает большей прочноÑтью. Ðе принимает жидкоÑти Ñо Ñторон, кроме как от других трубопроводов.\nПротекает меньше. -block.liquid-router.description = Принимает жидкоÑти из одного Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ выводит их до 3 других направлений в равной Ñтепени. Также может хранить определенное количеÑтво жидкоÑти. Полезен Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñтей из одного иÑточника на неÑколько целей. -block.liquid-tank.description = Хранит большое количеÑтво жидкоÑти. ИÑпользуетÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€Ð¾Ð² в ÑитуациÑÑ… Ñ Ð½ÐµÐ¿Ð¾ÑтоÑнной потребноÑтью в материалах или в качеÑтве защиты Ð´Ð»Ñ Ð¾Ñ…Ð»Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½Ð¾ важных блоков. -block.liquid-junction.description = ДейÑтвует как моÑÑ‚ Ð´Ð»Ñ Ð´Ð²ÑƒÑ… переÑекающихÑÑ Ñ‚Ñ€ÑƒÐ±Ð¾Ð¿Ñ€Ð¾Ð²Ð¾Ð´Ð¾Ð². Полезен в ÑитуациÑÑ…, когда два разных трубопровода переноÑÑÑ‚ разные жидкоÑти в разные меÑта. -block.bridge-conduit.description = РаÑширенный блок транÑпортировки жидкоÑти. ПозволÑет транÑпортировать жидкоÑти над 3 плитками любой меÑтноÑти или зданиÑ. -block.phase-conduit.description = РаÑширенный блок транÑпортировки жидкоÑти. ИÑпользует Ñнергию Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ жидкоÑтей в подключенный фазовый трубопровод над неÑколькими плиткам. +block.mass-driver.description = ПоÑтройка Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ транÑпортировки предметов. Собирает неÑколько предметов и затем ÑтрелÑет ими в другие катапульты. +block.mechanical-pump.description = Перекачивает и выводит жидкоÑти. Ðе требует Ñнергию. +block.rotary-pump.description = Перекачивает и выводит жидкоÑти. Требует Ñнергию. +block.thermal-pump.description = Перекачивает и выводит жидкоÑти. +block.conduit.description = Перемещает жидкоÑти вперёд. ИÑпользуетÑÑ Ð²Ð¼ÐµÑте Ñ Ð½Ð°ÑоÑами и другими трубопроводами. +block.pulse-conduit.description = Перемещает жидкоÑти вперёд. Работает быÑтрее и вмещает в Ñебе больше, чем Ñтандартный трубопровод. +block.plated-conduit.description = Перемещает жидкоÑти вперёд. Ðе принимает ввод по бокам. Ðе протекает. +block.liquid-router.description = Принимает жидкоÑти из одного Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ равномерно раÑпределÑет и до 3 других направлений. Также может хранить определенное количеÑтво жидкоÑти. +block.liquid-tank.description = Хранит большое количеÑтво жидкоÑти. Выводит жидкоÑти во вÑе Ñтороны, подобно жидкоÑтному маршрутизатору. +block.liquid-junction.description = ДейÑтвует как моÑÑ‚ Ð´Ð»Ñ Ð´Ð²ÑƒÑ… переÑекающихÑÑ Ñ‚Ñ€ÑƒÐ±Ð¾Ð¿Ñ€Ð¾Ð²Ð¾Ð´Ð¾Ð². +block.bridge-conduit.description = Перемещает жидкоÑти над любой меÑтноÑтью или зданиÑми. +block.phase-conduit.description = Перемещает жидкоÑти над любой меÑтноÑтью или зданиÑми. Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð´Ð¸ÑтанциÑ, чем у жидкоÑтного моÑта, но требует Ñнергию. block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поÑтавлÑть питание на любые ÑоÑедние блоки. block.power-node-large.description = УÑовершенÑтвованный Ñиловой узел Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ дальноÑтью. -block.surge-tower.description = Силовой узел Ñ Ð¾Ñ‡ÐµÐ½ÑŒ большим радиуÑом дейÑтвиÑ, но меньшим количеÑтвом доÑтупных Ñоединений. -block.diode.description = ÐÐ°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð½Ð°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ возможноÑть перемещатьÑÑ Ñ‡ÐµÑ€ÐµÐ· Ñтот блок в одну Ñторону, еÑли на выходе имеетÑÑ Ð¼ÐµÐ½ÑŒÑˆÐµ Ñнергии в запаÑе, чем на входе. -block.battery.description = Ðакапливает Ñнергию как буфер во времена избытка Ñнергии. Выводит Ñнергию во времена дефицита. -block.battery-large.description = Хранит гораздо больше Ñнергии, чем обычный аккумулÑтор. -block.combustion-generator.description = Вырабатывает Ñнергию путём ÑÐ¶Ð¸Ð³Ð°Ð½Ð¸Ñ Ð»ÐµÐ³ÐºÐ¾Ð²Ð¾ÑпламенÑющихÑÑ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¾Ð², таких как уголь. -block.thermal-generator.description = Генерирует Ñнергию, когда находитÑÑ Ð² горÑчих меÑтах. -block.steam-generator.description = УÑовершенÑтвованный генератор ÑгораниÑ. Более Ñффективен, но дополнительно требует воду Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ пара. -block.differential-generator.description = Генерирует большое количеÑтво Ñнергии. ИÑпользует разницу температур между криогенной жидкоÑтью и горÑщим пиротитом. -block.rtg-generator.description = ПроÑтой, надежный генератор. ИÑпользует тепло раÑпадающихÑÑ Ñ€Ð°Ð´Ð¸Ð¾Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ñ… Ñоединений Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñтва Ñнергии Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ ÑкороÑтью. +block.surge-tower.description = Силовой узел Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ радиуÑом дейÑтвиÑ, но меньшим количеÑтвом доÑтупных Ñоединений. +block.diode.description = Перемещает Ñнергию из аккумулÑторов в одну Ñторону, но только еÑли у аккумулÑторов на другой Ñтороне накоплено меньше Ñнергии. +block.battery.description = Ðакапливает Ñнергию во времена её избытка. Выводит Ñнергию во времена дефицита. +block.battery-large.description = Ðакапливает Ñнергию во времена её избытка. Выводит Ñнергию во времена дефицита. Хранит больше Ñнергии, чем обычный аккумулÑтор. +block.combustion-generator.description = Вырабатывает Ñнергию путём ÑÐ¶Ð¸Ð³Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ€ÑŽÑ‡Ð¸Ñ… материалов, таких как уголь. +block.thermal-generator.description = Вырабатывает Ñнергию, когда размещён в горÑчих меÑтах. +block.steam-generator.description = Вырабатывает Ñнергию путём ÑÐ¶Ð¸Ð³Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ€ÑŽÑ‡Ð¸Ñ… материалов и Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾Ð´Ñ‹ в пар +block.differential-generator.description = Вырабатывает большое количеÑтво Ñнергии. ИÑпользует разницу температур между криогенной жидкоÑтью и горÑщим пиротитом. +block.rtg-generator.description = ИÑпользует тепло раÑпадающихÑÑ Ñ€Ð°Ð´Ð¸Ð¾Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ñ… Ñоединений Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñнергии Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ ÑкороÑтью. block.solar-panel.description = ОбеÑпечивает небольшое количеÑтво Ñнергии от Ñолнца. -block.solar-panel-large.description = Значительно более Ñффективный вариант Ñтандартной Ñолнечной панели. -block.thorium-reactor.description = Генерирует значительное количеÑтво Ñнергии из ториÑ. Требует поÑтоÑнного охлаждениÑ. ВзорвётÑÑ Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ Ñилой при недоÑтаточном количеÑтве охлаждающей жидкоÑти. Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ Ð·Ð°Ð²Ð¸Ñит от наполненноÑти торием, при Ñтом Ð±Ð°Ð·Ð¾Ð²Ð°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÑ‚ÑÑ Ð¿Ñ€Ð¸ макÑимальном заполнении. -block.impact-reactor.description = УÑовершенÑтвованный генератор, ÑпоÑобный Ñоздавать огромное количеÑтво Ñнергии на пике ÑффективноÑти. ТребуетÑÑ Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ðµ количеÑтво Ñнергии Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка процеÑÑа. -block.mechanical-drill.description = Дешёвый бур. При размещении на ÑоответÑтвующих плитках, предметы поÑтоÑнно выдаютÑÑ Ð² медленном темпе. СпоÑобен добывать только базовые реÑурÑÑ‹. +block.solar-panel-large.description = ОбеÑпечивает небольшое количеÑтво Ñнергии от Ñолнца. Более Ñффективный вариант Ñтандартной Ñолнечной панели. +block.thorium-reactor.description = Вырабатывает значительное количеÑтво Ñнергии из ториÑ. Требует поÑтоÑнного охлаждениÑ. ВзорвётÑÑ Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ Ñилой при недоÑтаточном количеÑтве охлаждающей жидкоÑти. +block.impact-reactor.description = Создаёт огромное количеÑтво Ñнергии на пике ÑффективноÑти. ТребуетÑÑ Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ðµ количеÑтво Ñнергии Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка процеÑÑа. +block.mechanical-drill.description = При размещении на ÑоответÑтвующей руде, поÑтоÑнно выводит предметы в медленном темпе. СпоÑобен добывать только базовые реÑурÑÑ‹. block.pneumatic-drill.description = Улучшенный бур, ÑпоÑобный добывать титан. Добывает быÑтрее, чем механичеÑкий бур. block.laser-drill.description = ПозволÑет добывать еще быÑтрее Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ лазерной технологии, но требует Ñнергию. СпоÑобен добывать торий. block.blast-drill.description = Самый продвинутый бур. Требует большое количеÑтво Ñнергии. block.water-extractor.description = Выкачивает подземные воды. ИÑпользуетÑÑ Ð² меÑтах, где нет поверхноÑтных вод. -block.cultivator.description = Выращивает крошечные концентрации Ñпор из атмоÑферы в готовые к иÑпользованию Ñпоры. +block.cultivator.description = Выращивает крошечные концентрации атмоÑферных Ñпор в Ñтручки Ñпор. +block.cultivator.details = ВоÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ. ИÑпользовалаÑÑŒ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð³Ñ€Ð¾Ð¼Ð½Ð¾Ð³Ð¾ количеÑтва биомаÑÑÑ‹ наиболее Ñффективным ÑпоÑобом. Возможно, Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸Ð½ÐºÑƒÐ±Ð°Ñ†Ð¸Ñ Ñпор теперь покрывает Серпуло. 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.launch-pad.description = ЗапуÑкает партии предметов без необходимоÑти запуÑка Ñдра. -block.launch-pad-large.description = Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿ÑƒÑковой площадки. Хранит больше предметов. ЗапуÑкаетÑÑ Ñ‡Ð°Ñ‰Ðµ. -block.duo.description = МаленькаÑ, Ð´ÐµÑˆÑ‘Ð²Ð°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ. Полезна против наземных юнитов. -block.scatter.description = ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ð²Ð¾Ð·Ð´ÑƒÑˆÐ½Ð°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ. Ð’Ñ‹Ñтреливает куÑки Ñвинца, металлолома или метаÑтекла на вражеÑкие подразделениÑ. +block.core-shard.description = Ядро базы. ПоÑле уничтожениÑ, веÑÑŒ контакт Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð¾Ð¼ терÑетÑÑ. +block.core-shard.details = ÐŸÐµÑ€Ð²Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ. Компактное. СамовоÑпроизводÑщееÑÑ. Укомплектовано одноразовыми пуÑковыми двигателÑми. Ðе предназначено Ð´Ð»Ñ Ð¼ÐµÐ¶Ð¿Ð»Ð°Ð½ÐµÑ‚Ð½Ñ‹Ñ… перелётов. +block.core-foundation.description = Ядро базы. Лучше бронировано. Хранит больше реÑурÑов, чем «ОÑколок». +block.core-foundation.details = Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ. +block.core-nucleus.description = Ядро базы. Очень хорошо бронировано. Хранит огромное количеÑтво реÑурÑов. +block.core-nucleus.details = Ð¢Ñ€ÐµÑ‚ÑŒÑ Ð¸ поÑледнÑÑ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ. +block.vault.description = Хранит большое количеÑтво предметов каждого типа. Предметы можно извлечь при помощи разгрузчика. +block.container.description = Хранит небольшое количеÑтво предметов каждого типа. Предметы можно извлечь при помощи разгрузчика. +block.unloader.description = Выгружает выбранный предмет из ÑоÑедних блоков. +block.launch-pad.description = ЗапуÑкает партии предметов в выбранные Ñекторы. +block.duo.description = СтрелÑет по врагам чередующимиÑÑ Ð¿ÑƒÐ»Ñми. +block.scatter.description = СтрелÑет куÑками Ñвинца, металлолома или метаÑтекла по вражеÑким воздушным единицам. block.scorch.description = Сжигает любых наземных врагов Ñ€Ñдом Ñ Ð½Ð¸Ð¼. Ð’Ñ‹ÑокоÑффективен на близком раÑÑтоÑнии. -block.hail.description = ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ð±Ð¾Ð¹Ð½Ð°Ñ Ð°Ñ€Ñ‚Ð¸Ð»Ð»ÐµÑ€Ð¸Ð¹ÑÐºÐ°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ. -block.wave.description = Турель Ñреднего размера. ВыпуÑкает поток жидкоÑти по врагам. ÐвтоматичеÑки тушит пожары при подаче воды. -block.lancer.description = Ð›Ð°Ð·ÐµÑ€Ð½Ð°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ Ñреднего размера. ЗарÑжает и ÑтрелÑет мощными лучами Ñнергии по наземным целÑм. -block.arc.description = ÐÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ ÑлектричеÑÐºÐ°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ ближнего радиуÑа дейÑтвиÑ. Ð’Ñ‹Ñтреливает дуги ÑлектричеÑтва по врагам. -block.swarmer.description = Ð Ð°ÐºÐµÑ‚Ð½Ð°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ Ñреднего размера. Ðтакует как воздушных, так и наземных врагов. ЗапуÑкает ÑамонаводÑщиеÑÑ Ñ€Ð°ÐºÐµÑ‚Ñ‹. -block.salvo.description = БольшаÑ, более Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ турели. ВыпуÑкает быÑтрые залпы из пуль по врагу. -block.fuse.description = Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÑˆÑ€Ð°Ð¿Ð½ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ ближнего радиуÑа дейÑтвиÑ. СтрелÑет Ñ‚Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð½Ð¸ÐºÐ°ÑŽÑ‰Ð¸Ð¼Ð¸ зарÑдами по ближайшим врагам. -block.ripple.description = Очень Ð¼Ð¾Ñ‰Ð½Ð°Ñ Ð°Ñ€Ñ‚Ð¸Ð»Ð»ÐµÑ€Ð¸Ð¹ÑÐºÐ°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ. СтрелÑет ÑкоплениÑми ÑнарÑдов по врагам на большие раÑÑтоÑниÑ. -block.cyclone.description = Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ веÑти огонь по воздушным и наземным целÑм. СтрелÑет разрывными ÑнарÑдами по ближайшим врагам. -block.spectre.description = МаÑÑÐ¸Ð²Ð½Ð°Ñ Ð´Ð²ÑƒÑÑ‚Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ Ð¿ÑƒÑˆÐºÐ°. СтрелÑет крупными бронебойными ÑнарÑдами по воздушным и наземным целÑм. -block.meltdown.description = МаÑÑÐ¸Ð²Ð½Ð°Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ð°Ñ Ð¿ÑƒÑˆÐºÐ°. ЗарÑжает и ÑтрелÑет поÑтоÑнным лазерным лучом в ближайших врагов. ТребуетÑÑ Ð¾Ñ…Ð»Ð°Ð¶Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñть Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. -block.repair-point.description = Ðепрерывно лечит ближайшую поврежденную боевую единицу или мех в Ñвоём радиуÑе. +block.hail.description = СтрелÑет маленькими ÑнарÑдами по наземным вражеÑким целÑм на большой диÑтанции. +block.wave.description = ВыпуÑкает поток жидкоÑти по врагам. ÐвтоматичеÑки тушит пожары при подаче воды. +block.lancer.description = ЗарÑжает и ÑтрелÑет мощными лучами Ñнергии по наземным целÑм. +block.arc.description = ВыпуÑкает ÑлектричеÑкие дуги по наземным целÑм. +block.swarmer.description = СтрелÑет ÑамонаводÑщимиÑÑ Ñ€Ð°ÐºÐµÑ‚Ð°Ð¼Ð¸ по врагам. +block.salvo.description = СтрелÑет по врагам быÑтрыми залпами пуль. +block.fuse.description = СтрелÑет Ñ‚Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð±Ð¸Ð²Ð°ÑŽÑ‰Ð¸Ð¼Ð¸ зарÑдами по ближайшим врагам. +block.ripple.description = СтрелÑет ÑкоплениÑми ÑнарÑдов по врагам на большой диÑтанции. +block.cyclone.description = СтрелÑет разрывными ÑнарÑдами по ближайшим врагам. +block.spectre.description = СтрелÑет крупными бронебойными ÑнарÑдами по воздушным и наземным целÑм. +block.meltdown.description = ЗарÑжает и ÑтрелÑет поÑтоÑнным лазерным лучом по ближайшим врагам. ТребуетÑÑ Ð¾Ñ…Ð»Ð°Ð¶Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñть Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. +block.foreshadow.description = СтрелÑет большим дальнобойным ÑнарÑдом, наноÑÑщим урон только по одной цели. +block.repair-point.description = Ðепрерывно ремонтирует ближайшую поврежденную единицу в Ñвоём радиуÑе. block.segment.description = Повреждает и разрушает приближающиеÑÑ ÑнарÑды. Ðе взаимодейÑтвует Ñ Ð»Ð°Ð·ÐµÑ€Ð½Ñ‹Ð¼Ð¸ лучами. +block.parallax.description = ПритÑгивает воздушные цели лучом, Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´Ð°Ñ Ð¸Ñ… в процеÑÑе. +block.tsunami.description = СтрелÑет мощными потоками жидкоÑти по врагам. ÐвтоматичеÑки тушит пожары при подаче воды. +block.silicon-crucible.description = Синтезирует кремний из пеÑка и углÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¸Ñ€Ð¾Ñ‚Ð¸Ñ‚ как дополнительный иÑточник тепла. Более Ñффективен в горÑчих меÑтах. +block.disassembler.description = РазделÑет шлак на крупицы ÑкзотичеÑких минеральных компонентов Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ ÑффективноÑтью. Может производить торий. +block.overdrive-dome.description = Увеличивает ÑкороÑть близлежащих зданий. Требует фазовую ткань и кремний Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹. +block.payload-conveyor.description = Передвигает большие грузы, такие как единицы из фабрик. +block.payload-router.description = РазделÑет входÑщие грузы на 3 выходÑщих направлениÑ. +block.command-center.description = УправлÑет поведением единиц при помощи различных команд. +block.ground-factory.description = Производит наземные единицы. Вывод единиц может быть оÑущеÑтвлён напрÑмую, либо перенаправлен в реконÑтрукторы Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ. +block.air-factory.description = Производит воздушные единицы. Вывод единиц может быть оÑущеÑтвлён напрÑмую, либо перенаправлен в реконÑтрукторы Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ. +block.naval-factory.description = Производит морÑкие единицы. Вывод единиц может быть оÑущеÑтвлён напрÑмую, либо перенаправлен в реконÑтрукторы Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ. +block.additive-reconstructor.description = Улучшает введённые юниты до второго уровнÑ. +block.multiplicative-reconstructor.description = Улучшает введённые юниты до третьего уровнÑ. +block.exponential-reconstructor.description = Улучшает введённые юниты до четвёртого уровнÑ. +block.tetrative-reconstructor.description = Улучшает введённые юниты до пÑтого и поÑледнего уровнÑ. +block.switch.description = Переключатель. СоÑтоÑние может быть Ñчитано и изменено при помощи логичеÑких процеÑÑоров. +block.micro-processor.description = ВыполнÑет поÑледовательноÑть логичеÑких инÑтрукций в цикле. Может быть иÑпользован Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°Ð¼Ð¸ и поÑтройками. +block.logic-processor.description = ВыполнÑет поÑледовательноÑть логичеÑких инÑтрукций в цикле. Может быть иÑпользован Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°Ð¼Ð¸ и поÑтройками. БыÑтрее, чем микропроцеÑÑор. +block.hyper-processor.description = ВыполнÑет поÑледовательноÑть логичеÑких инÑтрукций в цикле. Может быть иÑпользован Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°Ð¼Ð¸ и поÑтройками. БыÑтрее, чем логичеÑкий процеÑÑор. +block.memory-cell.description = Хранит информацию Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого процеÑÑора. +block.memory-bank.description = Хранит информацию Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого процеÑÑора. Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ‘Ð¼ÐºÐ¾Ñть. +block.logic-display.description = Отображает произвольную графику из логичеÑкого процеÑÑора. +block.large-logic-display.description = Отображает произвольную графику из логичеÑкого процеÑÑора. +block.interplanetary-accelerator.description = МаÑÑивный рельÑотронный уÑкоритель. УÑкорÑет Ñдро, позволÑÑ Ð¿Ñ€ÐµÐ¾Ð´Ð¾Ð»ÐµÑ‚ÑŒ гравитацию Ð´Ð»Ñ Ð¼ÐµÐ¶Ð¿Ð»Ð°Ð½ÐµÑ‚Ð½Ð¾Ð³Ð¾ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ + +unit.dagger.description = СтрелÑет Ñтандартными пулÑми по вÑем врагам поблизоÑти. +unit.mace.description = СтрелÑет потоками Ð¾Ð³Ð½Ñ Ð¿Ð¾ вÑем врагам поблизоÑти. +unit.fortress.description = СтрелÑет дальнобойной артиллерией по наземным целÑм. +unit.scepter.description = СтрелÑет залпом из зарÑженных пуль по вÑем врагам поблизоÑти. +unit.reign.description = СтрелÑет залпом из маÑÑивных пробивающих пуль по вÑем врагам поблизоÑти. +unit.nova.description = СтрелÑет лазерными ÑнарÑдами, которые повреждают врагов и ремонтируют Ñоюзные поÑтройки. СпоÑобен летать. +unit.pulsar.description = ВыпуÑкает ÑлектричеÑкие дуги, которые повреждают врагов и ремонтируют Ñоюзные поÑтройки. СпоÑобен летать. +unit.quasar.description = СтрелÑет пробивающими лазерными лучами, которые повреждают врагов и ремонтируют Ñоюзные поÑтройки. СпоÑобен летать. Имеет щит. +unit.vela.description = СтрелÑет маÑÑивным продолжительным лазерным лучом, который повреждает врагов, вызывает пожар и ремонтирует Ñоюзные поÑтройки. СпоÑобен летать. +unit.corvus.description = СтрелÑет маÑÑивным лазерным зарÑдом, который повреждает врагов и ремонтирует Ñоюзные поÑтройки. Может переÑтупать через большую чаÑть меÑтноÑти. +unit.crawler.description = Бежит на врагов и ÑамоуничтожаетÑÑ, Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ взрыв. +unit.atrax.description = СтрелÑет Ñферами шлака по наземным целÑм, Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´Ð°Ñ Ð¸ замедлÑÑ Ð²Ñ€Ð°Ð³Ð¾Ð². Может переÑтупать через большую чаÑть меÑтноÑти. +unit.spiroct.description = СтрелÑет иÑтощающими лазерными лучами по врагам, Ñ€ÐµÐ¼Ð¾Ð½Ñ‚Ð¸Ñ€ÑƒÑ ÑÐµÐ±Ñ Ð² процеÑÑе. Может переÑтупать через большую чаÑть меÑтноÑти. +unit.arkyid.description = СтрелÑет большими иÑтощающими лазерными лучами по врагам, Ñ€ÐµÐ¼Ð¾Ð½Ñ‚Ð¸Ñ€ÑƒÑ ÑÐµÐ±Ñ Ð² процеÑÑе. Может переÑтупать через большую чаÑть меÑтноÑти. +unit.toxopid.description = СтрелÑет большими ÑлектричеÑкими ÑкоплениÑми ÑнарÑдов и пробивающими лазерами по врагам. Может переÑтупать через большую чаÑть меÑтноÑти. +unit.flare.description = СтрелÑет Ñтандартными пулÑми по наземным целÑм. +unit.horizon.description = СбраÑывает ÑÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð¼Ð± на наземные цели. +unit.zenith.description = СтрелÑет залпами ракет по вÑем врагам поблизоÑти. +unit.antumbra.description = СтрелÑет залпами пуль по вÑем врагам поблизоÑти. +unit.eclipse.description = СтрелÑет Ð´Ð²ÑƒÐ¼Ñ Ð¿Ñ€Ð¾Ð±Ð¸Ð²Ð°ÑŽÑ‰Ð¸Ð¼Ð¸ лазерами и залпами разрывных ÑнарÑдов по вÑем врагам поблизоÑти. +unit.mono.description = ÐвтоматичеÑки добывает медь и Ñвинец и доÑтавлÑет их в Ñдро. +unit.poly.description = ÐвтоматичеÑки воÑÑтанавливает разрушенные поÑтройки и помогает в ÑтроительÑтве другим единицам. +unit.mega.description = ÐвтоматичеÑки ремонтирует повреждённые поÑтройки. Может переноÑить блоки и небольшие единицы. +unit.quad.description = СбраÑывает большие бомбы на наземные цели, воÑÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ñоюзные поÑтройки и Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´Ð°Ñ Ð²Ñ€Ð°Ð³Ð¾Ð². Может переноÑить единицы Ñреднего размера. +unit.oct.description = Защищает Ñоюзников поблизоÑти при помощи Ñвоего воÑÑтанавливающегоÑÑ Ñ‰Ð¸Ñ‚Ð°. Может переноÑить большинÑтво наземных единиц. +unit.risso.description = СтрелÑет залпами ракет и пуль по вÑем врагам поблизоÑти. +unit.minke.description = СтрелÑет зажигательными ÑнарÑдами и Ñтандартными пулÑми по наземным целÑм. +unit.bryde.description = СтрелÑет дальнобойными артиллерийÑкими ÑнарÑдами и ракетами по врагам. +unit.sei.description = СтрелÑет залпами ракет и бронебойных пуль по врагам. +unit.omura.description = СтрелÑет дальнобойным пробивающим ÑнарÑдом из рельÑотрона по врагам. Производит единицы «ВÑпышка». +unit.alpha.description = Защищает Ñдро «ОÑколок» от врагов. ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑÑ‚Ñ€Ð¾Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +unit.beta.description = Защищает Ñдро «Штаб» от врагов. ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑÑ‚Ñ€Ð¾Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +unit.gamma.description = Защищает Ñдро «Ðтом» от врагов. ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑÑ‚Ñ€Ð¾Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. + +lst.read = Считывает чиÑло из Ñоединённой Ñчейки памÑти. +lst.write = ЗапиÑывает чиÑло в Ñоединённую Ñчейку памÑти. +lst.print = ДобавлÑет текÑÑ‚ в текÑтовый буфер. Ðичего не отображает, пока не будет вызван [accent]Print Flush[]. +lst.draw = ДобавлÑет операцию в буфер отриÑовки. Ðичего не отображает, пока не будет вызван [accent]Draw Flush[]. +lst.drawflush = СбраÑывает буфер [accent]Draw[] операций на диÑплей. +lst.printflush = СбраÑывает буфер [accent]Print[] операций в блок-Ñообщение. +lst.getlink = Получает Ñоединение процеÑÑора по индекÑу. Ðачинает Ñ 0. +lst.control = Контролирует блок. +lst.radar = Обнаруживает единицы вокруг поÑтройки Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ радиуÑом. +lst.sensor = Получает данные из поÑтройки или единицы. +lst.set = УÑтанавливает переменную. +lst.operation = Совершает операцию над 1-2 переменными. +lst.end = Переходит к началу Ñтека операций. +lst.jump = УÑловно переходит к другой операции. +lst.unitbind = ПривÑзываетÑÑ Ðº единице определённого типа и ÑохранÑет её в [accent]@unit[]. +lst.unitcontrol = УправлÑет привÑзанной в данный момент единицей. +lst.unitradar = Обнаруживает единицы вокруг привÑзанной в данный момент единицы. +lst.unitlocate = Обнаруживает позицию/поÑтройку определённого типа где-либо на карте. Требует привÑзанную единицу. + +logic.nounitbuild = [red]СтроительÑтво Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ процеÑÑоров здеÑÑŒ запрещено. + +lenum.type = Тип поÑтройки/единицы. \nÐапример, Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° Ñто будет [accent]@router[].\nÐе Ñтрока. +lenum.shoot = Стрельба в определённую позицию. +lenum.shootp = Стрельба в единицу/поÑтройку Ñ Ñ€Ð°Ñчётом ÑкороÑти. +lenum.configure = ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ñтройки, например, предмет Ñортировки. +lenum.enabled = Включён ли блок. + +laccess.color = Цвет оÑветителÑ. +laccess.controller = Командующий единицей. ЕÑли единица управлÑетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑором, возвращает процеÑÑор. ЕÑли в Ñтрою, возращает командуещего.\nÐ’ противном Ñлучае возвращает Ñаму единицу. +laccess.dead = ЯвлÑетÑÑ Ð»Ð¸ единица/поÑтройка неработающей или неÑущеÑтвующей. +laccess.controlled = Возвращает:\n[accent]@ctrlProcessor[] еÑли единица управлÑетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑором\n[accent]@ctrlPlayer[] еÑли единица/поÑтройка управлÑетÑÑ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð¼\n[accent]@ctrlFormation[] еÑли единица в Ñтрою\nÐ’ противном Ñлучае — 0. +laccess.commanded = [red]УÑтарело. Будет удалено![]\nВмеÑто Ñтого, иÑпользуйте [accent]controlled[]. + +graphicstype.clear = Заливка диÑÐ¿Ð»ÐµÑ Ñ†Ð²ÐµÑ‚Ð¾Ð¼. +graphicstype.color = УÑтановка цвета Ð´Ð»Ñ Ñледующих операций отриÑовки. +graphicstype.stroke = УÑтановка толщины линии. +graphicstype.line = ОтриÑовка отрезка. +graphicstype.rect = ОтриÑовка закрашенного прÑмоугольника. +graphicstype.linerect = ОтриÑовка контура прÑмоугольника. +graphicstype.poly = ОтриÑовка закрашенного правильного многоугольника. +graphicstype.linepoly = ОтриÑовка контура правильного многоугольника. +graphicstype.triangle = ОтриÑовка закрашенного треугольника. +graphicstype.image = ОтриÑовка внутриигровых Ñпрайтов.\nÐапример: [accent]@router[] или [accent]@dagger[]. + +lenum.always = Ð’Ñегда иÑтина. +lenum.idiv = ЦелочиÑленное деление. +lenum.div = Деление.\nВозвращает [accent]null[] при делении на ноль. +lenum.mod = ОÑтаток от делениÑ. +lenum.equal = Равно. Приводит типы.\nÐе-null объекты, по Ñравнению Ñ Ñ‡Ð¸Ñлами, ÑтановÑÑ‚ÑÑ 1, иначе — 0. +lenum.notequal = Ðе равно. Приводит типы. +lenum.strictequal = Строгое равенÑтво. Ðе приводит типы.\nМожет быть иÑпользовано Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ на [accent]null[]. +lenum.shl = Побитовый Ñдвиг влево. +lenum.shr = Побитовый Ñдвиг вправо. +lenum.or = Побитовое ИЛИ. +lenum.land = Булевое И. +lenum.and = Побитовое И. +lenum.not = Побитовое ÐЕ. +lenum.xor = Побитовое иÑключающее ИЛИ. + +lenum.min = Минимальное из двух чиÑел. +lenum.max = МакÑимальное из двух чиÑел. +lenum.angle = Угол вектора в градуÑах. +lenum.len = Длина вектора. +lenum.sin = СинуÑ, в градуÑах. +lenum.cos = КоÑинуÑ, в градуÑах. +lenum.tan = ТангенÑ, в градуÑах. +#Ñто не ошибка, поищите 'обозначение диапазонов' +lenum.rand = Случайное чиÑло в диапазоне [0, значение). +lenum.log = Ðатуральный логарифм (ln). +lenum.log10 = Логарифм по оÑнованию 10. +lenum.noise = СимплекÑный шум, 2D. +lenum.abs = ÐбÑÐ¾Ð»ÑŽÑ‚Ð½Ð°Ñ Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð°. +lenum.sqrt = Квадратный корень. + +lenum.any = Ð›ÑŽÐ±Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +lenum.ally = ДружеÑÐºÐ°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +lenum.attacker = Единица Ñ Ð¾Ñ€ÑƒÐ¶Ð¸ÐµÐ¼. +lenum.enemy = ВражеÑÐºÐ°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +lenum.boss = Страж. +lenum.flying = Ð›ÐµÑ‚Ð°ÑŽÑ‰Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +lenum.ground = ÐÐ°Ð·ÐµÐ¼Ð½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°. +lenum.player = Единица, управлÑÐµÐ¼Ð°Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð¼. + +lenum.ore = ИÑточник руды. +lenum.damaged = ÐŸÐ¾Ð²Ñ€ÐµÐ¶Ð´Ñ‘Ð½Ð½Ð°Ñ Ð´Ñ€ÑƒÐ¶ÐµÑÐºÐ°Ñ Ð¿Ð¾Ñтройка. +lenum.spawn = Точка поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€Ð°Ð³Ð¾Ð².\nМожет быть Ñдром или позицией на карте. +lenum.building = ПоÑтройка определённой группы. + +lenum.core = Любое Ñдро. +lenum.storage = Здание хранениÑ, например, хранилище. +lenum.generator = ПоÑтройки, вырабатывающие Ñнергию. +lenum.factory = ПоÑтройки, перерабатывающие предметы. +lenum.repair = Ремонтные пункты. +lenum.rally = Командный центр. +lenum.battery = Любой аккумулÑтор. +lenum.resupply = Пункты ÑнабжениÑ.\nÐктуально только при включённом [accent]"Боев. ед. требуют боеприпаÑÑ‹"[]. +lenum.reactor = ИмпульÑный/ториевый реактор. +lenum.turret = Ð›ÑŽÐ±Ð°Ñ Ñ‚ÑƒÑ€ÐµÐ»ÑŒ. + +sensor.in = ПоÑтройка/единица Ð´Ð»Ñ Ñ€Ð°ÑпознаваниÑ. + +radar.from = ПоÑтройка, от которой раÑпознавать.\nДальноÑть ÑенÑора ограничена дальноÑтью поÑтройки. +radar.target = Фильтр Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†. +radar.and = Дополнительные фильтры. +radar.order = ПорÑдок Ñортировки. 0 Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð³Ð¾. +radar.sort = Показатель Ð´Ð»Ñ Ñортировки результатов. +radar.output = ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи конечной единицы. + +unitradar.target = Фильтр Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†. +unitradar.and = Дополнительные фильтры. +unitradar.order = ПорÑдок Ñортировки. 0 Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð³Ð¾. +unitradar.sort = Показатель Ð´Ð»Ñ Ñортировки результатов. +unitradar.output = ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи конечной единицы. + +control.of = ПоÑтройка Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. +control.unit = Единица/поÑтройка Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ†ÐµÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ. +control.shoot = СтрелÑть ли. + +unitlocate.enemy = Обнаруживать ли вражеÑкие поÑтройки. +unitlocate.found = Ðайден ли объект. +unitlocate.building = ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи обнаруженной поÑтройки. +unitlocate.outx = Вывод X координаты. +unitlocate.outy = Вывод Y координаты. +unitlocate.group = Группа поÑтроек Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка. + +lenum.idle = ОÑтановка движениÑ, но продолжение ÑтроительÑтва/копаниÑ.\nСоÑтоÑние по умолчанию. +lenum.stop = ОÑтановка передвижениÑ/копаниÑ/ÑтроительÑтва. +lenum.move = Перемещение в определённую позицию. +lenum.approach = Приближение к позиции Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ радиуÑом. +lenum.pathfind = Перемещение к точке поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€Ð°Ð³Ð¾Ð². +lenum.target = Стрельба в определённую позицию. +lenum.targetp = Стрельба в единицу/поÑтройку Ñ Ñ€Ð°Ñчётом ÑкороÑти. +lenum.itemdrop = СбраÑывание предметов. +lenum.itemtake = ВзÑтие предметов из поÑтройки. +lenum.paydrop = СбраÑывание текущего груза. +lenum.paytake = ВзÑтие груза на текущей позиции. +lenum.flag = ЧиÑловой флаг единицы. +lenum.mine = Копание в позиции. +lenum.build = СтроительÑтво Ñтруктур. +lenum.getblock = РаÑпознавание блока и его типа на координатах.\nЕдиница должна находитьÑÑ Ð² пределах доÑÑгаемоÑти.\nТвёрдые не-поÑтройки будут иметь тип [accent]@solid[]. +lenum.within = Проверка на нахождение единицы Ñ€Ñдом Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸ÐµÐ¹. +lenum.boost = Включение/выключение полёта. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 0d29e6a89e..12c3e84a7b 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -16,19 +16,19 @@ link.suggestions.description = FöreslÃ¥ nya funktioner linkfail = Kunde inte öppna länken!\nLänken har kopierats till ditt urklipp. screenshot = Skärmdump har sparats till {0} screenshot.invalid = Karta för stor, potentiellt inte tillräckligt minne för skärmdump. -gameover = Game Over -gameover.pvp = The[accent] {0}[] team is victorious! +gameover = Spelet Slut +gameover.pvp = Laget [accent] {0}[] vann! highscore = [accent]Nytt rekord! copied = Kopierad. indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = Denna del av spelet är iunte färdig ännu load.sound = Ljud load.map = Kartor load.image = Bilder load.content = InnehÃ¥ll load.system = System -load.mod = Mods +load.mod = Moddar load.scripts = Scripts be.update = En ny beta version är tillgänglig: @@ -55,6 +55,7 @@ schematic.saved = Schematic sparad. schematic.delete.confirm = Den här schematicen kommer bli ytterst borttagen. schematic.rename = Döp om Schematic schematic.info = {0}x{1}, {2} block +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Besegrade vÃ¥gor:[accent] {0} stat.enemiesDestroyed = Besegrade fiender:[accent] {0} @@ -97,24 +98,23 @@ uploadingcontent = Laddar upp innehÃ¥ll uploadingpreviewfile = Laddar upp förhandsgranskningsfil committingchanges = Comitting Changes done = Klar -feature.unsupported = Your device does not support this feature. +feature.unsupported = Din enhet stödjer inte denna funktion. -mods.alphainfo = Kom ihÃ¥g att mods är i alpha, och[scarlet] kan vara väldigt buggiga[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) -mods = Mods -mods.none = [lightgray]No mods found! +mods.alphainfo = Kom ihÃ¥g att moddar är i alpha, och[scarlet] kan vara väldigt buggiga[].\nReport any issues you find to the Mindustry GitHub or Discord. +mods = Moddar +mods.none = [lightgray]Hittar inga Moddar! mods.guide = Modding Guide mods.report = Report Bug mods.openfolder = Open Mod Folder mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Spelat kommer nu att starta om, för att ladda om moddarna. mod.display = [gray]Mod:[orange] {0} -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable +mod.enabled = [lightgray]Aktiverad +mod.disabled = [scarlet]Inaktiverad +mod.disable = Inaktivera mod.content = Content: -mod.delete.error = Unable to delete mod. File may be in use. -mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.delete.error = Kunde inte ta bort modden. Filen kanske används. +mod.requiresversion = [scarlet]Kräver som minst version: [accent]{0} mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors @@ -123,10 +123,10 @@ mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affec mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.file = Import File -mod.import.github = Import GitHub Mod +mod.reloadrequired = [scarlet]Omstart krävs +mod.import = Importera Mod +mod.import.file = Importera Fil +mod.import.github = Importera GitHub Mod mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = This mod will be deleted. @@ -139,7 +139,7 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Om name = Namn: noname = Välj ett[accent] namn[] först. -planetmap = Planet Map +planetmap = Planet Karta launchcore = Launch Core filename = Filnamn: unlocked = Nytt innehÃ¥ll upplÃ¥st! @@ -169,14 +169,14 @@ server.kicked.nameEmpty = Ditt namn är ogiltigt. server.kicked.idInUse = Du är redan pÃ¥ den här servern! Det är inte tillÃ¥tet att koppla med tvÃ¥ konton. server.kicked.customClient = This server does not support custom builds. Ladda ned en officiell verision. server.kicked.gameover = Game over! -server.kicked.serverRestarting = The server is restarting. +server.kicked.serverRestarting = Servern startar om. 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 = Hosta Multiplayer Spel invitefriends = Invite Friends -hostserver.mobile = Host\nGame -host = Host +hostserver.mobile = Hosta\nSpel +host = Hosta hosting = [accent]Öppnar server... hosts.refresh = Refresh hosts.discovering = Discovering LAN games @@ -256,7 +256,7 @@ save.mode = Gamemode: {0} save.date = Last Saved: {0} save.playtime = Speltid: {0} warning = Varning. -confirm = Confirm +confirm = Bekräfta delete = Radera view.workshop = View In Workshop workshop.listing = Edit Workshop Listing @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]VÃ¥g {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]VÃ¥g om {0} wave.waveInProgress = [lightgray]Wave in progress waiting = [lightgray]Väntar... waiting.players = Väntar pÃ¥ spelare... wave.enemies = [lightgray]{0} Fiender kvarvarande wave.enemy = [lightgray]{0} Fiende kvar +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Ladda bild saveimage = Spara bild unknown = Okänd @@ -328,6 +331,7 @@ editor.generation = Generering: editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map +editor.center = Center workshop = Workshop waves.title = VÃ¥gor waves.remove = Ta bort @@ -416,6 +420,7 @@ filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Brus filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Median filter.oremedian = Malmmedian @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Block filter.option.floor = Golv filter.option.flooronto = Target Floor +filter.option.target = Target filter.option.wall = Vägg filter.option.ore = Malm filter.option.floor2 = Secondary Floor @@ -471,15 +477,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -launch = < LAUNCH > launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +research.multiplayer = Only the host can research items. uncover = Uncover configure = Configure Loadout loadout = Loadout @@ -512,27 +512,33 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch +sectors.unexplored = [lightgray]Oupptäckt +sectors.resources = Resurser: +sectors.production = Produktion: +sectors.stored = Lagrade: +sectors.resume = Ã…teruppta +sectors.launch = Skjuta upp sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Byt namn pÃ¥ sektor +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest +sector.craters.name = Kratrarna +sector.frozenForest.name = Fryst skog sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +sector.stainedMountains.name = Färgade berg +sector.desolateRift.name = Ödslig rift +sector.nuclearComplex.name = Kärnkraftsproduktionskomplex +sector.overgrowth.name = Överväxt +sector.tarFields.name = Tjärfält +sector.saltFlats.name = Saltöken +sector.fungalPass.name = Svamppass sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.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. @@ -547,7 +553,7 @@ sector.nuclearComplex.description = A former facility for the production and pro sector.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. settings.language = SprÃ¥k -settings.data = Game Data +settings.data = Spel Data settings.reset = Ã…terställ till Standardvärden settings.rebind = Byt settings.resetKey = Reset @@ -560,6 +566,10 @@ settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done 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.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = [accent]< Pausat > clear = Clear banned = [scarlet]Banned @@ -570,49 +580,74 @@ info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build -blocks.input = Inmatning -blocks.output = Utmatning -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Skada -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Storlek -blocks.displaysize = Display Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Skott -blocks.reload = Shots/Second -blocks.ammo = Ammunition -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Inmatning +stat.output = Utmatning +stat.booster = Booster +stat.tiles = Nödvändiga Tiles +stat.affinities = Affinities +stat.powercapacity = Power Capacity +stat.powershot = Power/Shot +stat.damage = Skada +stat.targetsair = Targets Air +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Range +stat.size = Storlek +stat.displaysize = Display Size +stat.liquidcapacity = Liquid Capacity +stat.powerrange = Power Range +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Power Use +stat.powerdamage = Power/Damage +stat.itemcapacity = Item Capacity +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Drillables +stat.drillspeed = Base Drill Speed +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Health +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = Inaccuracy +stat.shots = Skott +stat.reload = Shots/Second +stat.ammo = Ammunition +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Bättre Borr Krävs bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = FöremÃ¥l: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Build Progress bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] skada bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -642,12 +680,15 @@ bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce 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.blockssquared = blocks² unit.powersecond = power units/second unit.liquidsecond = liquid units/second unit.itemssecond = items/second @@ -670,7 +711,7 @@ category.power = Energi category.liquids = Vätskor category.items = FöremÃ¥l category.crafting = Inmatning/Utmatning -category.shooting = Skjutning +category.function = Function category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Skuggor @@ -679,7 +720,6 @@ setting.linear.name = Linear Filtering setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animerat Vatten setting.animatedshields.name = Animerade Sköldar setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -691,7 +731,7 @@ setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Begränsade FPS setting.fpscap.none = Inga setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.uiscale.name = UI Scaling[lightgray] (requires restart)[] setting.swapdiagonal.name = Always Diagonal Placement setting.difficulty.training = Träning setting.difficulty.easy = Lätt @@ -713,7 +753,6 @@ setting.fullscreen.name = Fullskärm setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = Show FPS setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixellera[lightgray] (disables animations) setting.minimap.name = Visa Minikarta @@ -822,6 +861,7 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = VÃ¥gtimer rules.waves = VÃ¥gor rules.attack = Attack Mode @@ -847,6 +887,7 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -856,15 +897,16 @@ rules.weather.duration = Duration: content.item.name = FöremÃ¥l content.liquid.name = Vätskor -content.unit.name = Units +content.unit.name = Enheter content.block.name = Block + item.copper.name = Koppar item.lead.name = Bly item.coal.name = Kol item.graphite.name = Grafit item.titanium.name = Titan item.thorium.name = Torium -item.silicon.name = Silikon +item.silicon.name = Kisel item.plastanium.name = Plast item.phase-fabric.name = Phase Fabric item.surge-alloy.name = Surge Alloy @@ -879,23 +921,6 @@ liquid.slag.name = Slag liquid.oil.name = Olja liquid.cryofluid.name = Cryofluid -item.explosiveness = [lightgray]Explosiveness: {0}% -item.flammability = [lightgray]Flammability: {0}% -item.radioactivity = [lightgray]Radioactivity: {0}% - -unit.health = [lightgray]Health: {0} -unit.speed = [lightgray]Fart: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viskositet: {0} -liquid.temperature = [lightgray]Temperatur: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Sandbumling block.grass.name = Gräs block.slag.name = Slag +block.space.name = Space block.salt.name = Salt block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -981,6 +1007,7 @@ block.darksand-water.name = Mörksandvatten block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Issnö block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1075,6 +1102,7 @@ block.power-source.name = Energikälla block.unloader.name = Urladdare block.vault.name = Valv block.wave.name = VÃ¥g +block.tsunami.name = Tsunami block.swarmer.name = Svärmare block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = BÃ¥ge block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blÃ¥a team.crux.name = röda diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 6a89ac29ca..01b8310b19 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -7,21 +7,21 @@ link.reddit.description = ซับเรดดิท (subreddit) ของ Mind link.github.description = source code ของเà¸à¸¡ link.changelog.description = รายà¸à¸²à¸£à¸—ี่อัปเดต link.dev-builds.description = เวอร์ชั่นระหว่างพัฒนา (ไม่เสถียร) -link.trello.description = Official Trello board for planned features -link.itch.io.description = itch.io page with PC downloads -link.google-play.description = Google Play store listing -link.f-droid.description = F-Droid catalogue listing -link.wiki.description = Official Mindustry wiki -link.suggestions.description = Suggest new features +link.trello.description = Trello board ทางà¸à¸²à¸£à¸ªà¸³à¸«à¸£à¸±à¸šà¸Ÿà¸µà¹€à¸ˆà¸­à¸£à¹Œà¸•่างๆที่วางà¹à¸œà¸™à¹„ว้ +link.itch.io.description = หน้าเว็บ itch.io สำหรับดาวน์โหลดบน PC +link.google-play.description = หน้า Google Play store ของเà¸à¸¡ +link.f-droid.description = หน้าà¹à¸„ตาลอค F-Droid ของเà¸à¸¡ +link.wiki.description = วิà¸à¸´à¸‚อง Mindustry อย่างเป็นทางà¸à¸²à¸£ +link.suggestions.description = เสนอฟีเจอร์ใหม่ linkfail = ไม่สามารถเปิดลิ้งค์ได้\nคัดลอภURL ลงในคลิปบอร์ดà¹à¸¥à¹‰à¸§ screenshot = Screenshot บันทึà¸à¸—ี่ {0} screenshot.invalid = à¹à¸¡à¸žà¹ƒà¸«à¸à¹ˆà¹€à¸à¸´à¸™à¹„ป, หน่วยความจำอาจจะไม่พอสำหรับ screenshot. -gameover = Game Over +gameover = จบเà¸à¸¡ gameover.pvp = ทีมที่ชนะคือทีม[accent] {0}[]! highscore = [accent]คะà¹à¸™à¸™à¸ªà¸¹à¸‡à¸ªà¸¸à¸”ใหม่! copied = คัดลอà¸à¹à¸¥à¹‰à¸§. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.popup = [accent]เวอร์ชั่น v6[] ณ ขณะนี้อยู่ในช่วง [accent]alpha[].\n[lightgray]นั้นหมายถึง:[]\n[scarlet]- เคมเปà¸à¹„ม่ยังเสร็จสมบูรณ์ []\n- เนื้อหาบางอย่างขาดหาย\n - [scarlet]AI ของยูนิต[] ส่วนใหà¸à¹ˆà¸—ำงานได้à¹à¸šà¸šà¹„ม่สมบูรณ์\n- ยูนิตส่วนมาà¸à¸¢à¸±à¸‡à¹„ม่เสร็จ\n- ที่อย่างที่เห็นอาจเปลี่ยนà¹à¸›à¸¥à¸‡à¹„ด้หรือลบออà¸à¹‚ดยสิ้นเชิงในอนาคต\n\nà¹à¸ˆà¹‰à¸‡à¸šà¸±à¸„หรือปัà¸à¸«à¸²à¸—ี่พบเจอได้ที่ [accent]Github[]. +indev.notready = ส่วนนี้ของเà¸à¸¡à¸¢à¸±à¸‡à¹„ม่พร้อมให้ใช้งาน load.sound = เสียง load.map = à¹à¸¡à¸ž @@ -31,7 +31,7 @@ load.system = ระบบ load.mod = มอด load.scripts = สคริปต์ -be.update = A new Bleeding Edge build is available: +be.update = เวอร์ชั้นล่าสุดออà¸à¹à¸¥à¹‰à¸§: be.update.confirm = ดาวน์โหลดเวอร์ชั่นใหม่à¹à¸¥à¹‰à¸§à¸£à¸µà¸ªà¸•าร์ทเลยไหม? be.updating = à¸à¸³à¸¥à¸±à¸‡à¸­à¸±à¸›à¹€à¸”ต... be.ignore = ยà¸à¹€à¸¥à¸´à¸ @@ -42,7 +42,7 @@ schematic = à¹à¸œà¸™à¸œà¸±à¸‡ schematic.add = à¸à¸³à¸¥à¸±à¸‡à¸šà¸±à¸™à¸—ึà¸à¹à¸œà¸™à¸œà¸±à¸‡... schematics = à¹à¸œà¸™à¸œà¸±à¸‡ schematic.replace = มีà¹à¸œà¸™à¸œà¸±à¸‡à¸—ี่ใช้ชื่อนี้à¹à¸¥à¹‰à¸§. à¹à¸—นที่เลยไหม? -schematic.exists = A schematic by that name already exists. +schematic.exists = มีà¹à¸œà¸™à¸œà¸±à¸‡à¹ƒà¸™à¸Šà¸·à¹ˆà¸­à¸™à¸±à¹‰à¸™à¸­à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ schematic.import = นำเข้าà¹à¸œà¸™à¸œà¸±à¸‡... schematic.exportfile = ส่งออà¸à¹„ฟล์ schematic.importfile = นำเข้าไฟล์ @@ -55,6 +55,7 @@ schematic.saved = บันทึà¸à¹à¸œà¸™à¸œà¸±à¸‡à¹à¸¥à¹‰à¸§. schematic.delete.confirm = à¹à¸œà¸™à¸œà¸±à¸‡à¸™à¸µà¹‰à¸ˆà¸°à¸–ูà¸à¸à¸³à¸ˆà¸±à¸”ให้หมดสิ้นโดยสิ้นเชิง schematic.rename = เปลี่ยนชื่อของà¹à¸œà¸™à¸œà¸±à¸‡ schematic.info = {0}x{1}, {2} บล็อค +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = จำนวนคลื่น(รอบ)ที่à¸à¸³à¸ˆà¸±à¸”ได้:[accent] {0} stat.enemiesDestroyed = จำนวนศัตรูที่ทำลายไปได้:[accent] {0} @@ -62,17 +63,17 @@ stat.built = จำนวนสิ่งà¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡à¸—ี่สร stat.destroyed = จำนวนสิ่งà¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡à¸‚องศัตรูที่ทำลายไปได้:[accent] {0} stat.deconstructed = จำนวนสิ่งà¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡à¸—ี่ถูà¸à¸—ำลายไป:[accent] {0} stat.delivered = ทรัพยาà¸à¸£à¸—ี่ส่งไปได้: -stat.playtime = Time Played:[accent] {0} +stat.playtime = ระยะเวลาที่เล่นไป:[accent] {0} stat.rank = ระดับ: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]ไอเท็มโà¸à¸¥à¸šà¸­à¸¥ map.delete = คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¸¥à¸šà¹à¸¡à¸žà¸Šà¸·à¹ˆà¸­ "[accent]{0}[]"? level.highscore = คะà¹à¸™à¸™à¸ªà¸¹à¸‡à¸ªà¸¸à¸”: [accent]{0} level.select = เลือà¸à¸”่าน level.mode = เà¸à¸¡à¹‚หมด: coreattack = < à¹à¸à¸™à¸à¸¥à¸²à¸‡à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¹‚จมตี! > nearpoint = [[ [scarlet]ออà¸à¸ˆà¸²à¸à¸”รอปพอยท์ด่วน IMMEDIATELY[] ]\nà¸à¸²à¸£à¸—ำลายล้างà¸à¸³à¸¥à¸±à¸‡à¹ƒà¸à¸¥à¹‰à¹€à¸‚้ามา -database = à¸à¸²à¸™à¸‚้อมูหลัง +database = à¸à¸²à¸™à¸‚้อมูลหลัภsavegame = เซฟเà¸à¸¡ loadgame = โหลดเà¸à¸¡ joingame = เข้าร่วมเà¸à¸¡ @@ -90,69 +91,68 @@ maps.browse = ค้นหาà¹à¸¡à¸ž continue = ต่อ maps.none = [lightgray]ไม่มีà¹à¸¡à¸ž! invalid = ไม่ถูà¸à¸•้อง -pickcolor = Pick Color +pickcolor = เลือà¸à¸ªà¸µ preparingconfig = à¸à¸³à¸¥à¸±à¸‡à¹€à¸•รียม Config -preparingcontent = à¸à¸³à¸¥à¸±à¸‡à¹€à¸•รียม Content -uploadingcontent = à¸à¸³à¸¥à¸±à¸‡à¸­à¸±à¸›à¹‚หลด Content +preparingcontent = à¸à¸³à¸¥à¸±à¸‡à¹€à¸•รียมเนื้อหา +uploadingcontent = à¸à¸³à¸¥à¸±à¸‡à¸­à¸±à¸›à¹‚หลดเนื้อหา uploadingpreviewfile = à¸à¸³à¸¥à¸±à¸‡à¸­à¸±à¸›à¹‚หลดไฟล์พรีวิว -committingchanges = Comitting Changes +committingchanges = à¸à¸³à¸¥à¸±à¸‡à¸—ำà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡ done = เรียบร้อย feature.unsupported = อุปà¸à¸£à¸“์ของคุณไม่รองรับฟีเจอร์นี้ mods.alphainfo = จำไว้ว่ามอดนั้นยังอยู่ในขั้น alpha à¹à¸¥à¸°[scarlet] อาจจะมีบัค[].\nโปรดรายงานปัà¸à¸«à¸²à¸—ี่คุณพบใน Github ของ Mindustry หรือ ในเซิฟเวอร์ Discord -mods.alpha = [accent](Alpha) mods = มอด mods.none = [lightgray]ไม่พบมอด! mods.guide = คู่มือà¸à¸²à¸£à¸—ำมอด mods.report = รายงานบัค mods.openfolder = เปิดมอดโฟลเดอร์ -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reload = โหลดใหม่ +mods.reloadexit = เà¸à¸¡à¸ˆà¸°à¸­à¸­à¸à¹€à¸žà¸·à¹ˆà¸­à¸ˆà¸°à¹‚หลดมอด mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]เปิดใช้งาน mod.disabled = [scarlet]ปิดใช้งาน mod.disable = ปิดใช้งาน -mod.content = Content: +mod.content = เนื้อหา: mod.delete.error = ไม่สามารถลบมอดได้. ไฟล์อาจอยู่ในระหว่างà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™. -mod.requiresversion = [scarlet]Requires min game version: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.requiresversion = [scarlet]เวอร์ชั่นเà¸à¸¡à¸‚ั้นต่ำที่ต้องà¸à¸²à¸£: [accent]{0} +mod.outdated = [scarlet]ไม่สามารถใช้ได้ในเวอร์ชั่น V6 (ไม่มี minGameVersion: 105) mod.missingdependencies = [scarlet]dependencies หาย: {0} -mod.erroredcontent = [scarlet]Content Errors -mod.errors = Errors have occurred loading content. -mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. +mod.erroredcontent = [scarlet]เนื้อหาผิดพลาด +mod.errors = มีข้อผิดพลาดเà¸à¸´à¸”ขึ้นระหว่าโหลดเนื้อหา +mod.noerrorplay = [scarlet]คุณมีมอดที่มีข้อผิดพลาด.[] à¸à¸£à¸¸à¸“าปิดมอดนั้นๆหรือà¹à¸à¹‰à¹„ขข้อผิดพลาดà¸à¹ˆà¸­à¸™à¸—ี่จะเล่น mod.nowdisabled = [scarlet]มอด '{0}' ไม่มี dependencies:[accent] {1}\n[lightgray]จำเป็นต้องโหลดมอดพวà¸à¸™à¸µà¹‰à¸à¹ˆà¸­à¸™\nมอดนี้จะถูà¸à¸›à¸´à¸”ใช้งานโดยอัตโนมัติ mod.enable = เปิดใช้งาน mod.requiresrestart = เà¸à¸¡à¸ˆà¸°à¸›à¸´à¸”ลงเพื่อใส่มอด mod.reloadrequired = [scarlet]จำเป็นต้องรีโหลด mod.import = นำเข้ามอด -mod.import.file = Import File +mod.import.file = นำเข้าไฟล์ mod.import.github = นำเข้ามอดจาภGithub -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! -mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. +mod.jarwarn = [scarlet]มอดไฟล์ JAR นั้นค่อนข้างไม่ปลอดภัย.[]\nà¸à¸£à¸¸à¸“าเช็คให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸„ุณนำเข้ามอดนี้จะà¹à¸«à¸¥à¹ˆà¸‡à¸—ี่เชื่อถือได้! +mod.item.remove = ไอเทมนี้เป็นส่วนหนึ่งของมอด[accent] '{0}'[]. หาà¸à¸•้องà¸à¸²à¸£à¸™à¸³à¸­à¸­à¸ à¸à¸£à¸¸à¸“าถอดà¸à¸²à¸£à¸•ิดตั้งมอดนั้น mod.remove.confirm = มอดนี้จะถูà¸à¸¥à¸š mod.author = [lightgray]ผู้สร้าง:[] {0} -mod.missing = เซฟนี้มีมอดที่คุณอัปเดตหรือไม่ได้ติดตั้งà¹à¸¥à¹‰à¸§. อาจทำให้เซฟเสีย. คุณà¹à¸™à¹ˆà¸ˆà¸°à¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¹‚หลดเซฟนี้?\n[lightgray]Mods:\n{0} +mod.missing = เซฟนี้มีมอดที่คุณอัปเดตหรือไม่ได้ติดตั้งà¹à¸¥à¹‰à¸§. อาจทำให้เซฟเสีย. คุณà¹à¸™à¹ˆà¸ˆà¸°à¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¹‚หลดเซฟนี้?\n[lightgray]มอดที่ใช้:\n{0} mod.preview.missing = à¸à¹ˆà¸­à¸™à¸—ี่จะนำมอดไปลงใน workshop, คุณต้องใส่รูปพรีวิวà¸à¹ˆà¸­à¸™\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของมอดà¹à¸¥à¹‰à¸§à¸¥à¸­à¸‡à¸­à¸µà¸à¸„รั้ง mod.folder.missing = มอดที่อยู่ในรูปà¹à¸šà¸šà¹‚ฟลเดอร์เท่านั้นที่สามารถลงใน workshop ได้\nunzip ไฟล์à¹à¸¥à¹‰à¸§à¸¥à¸šà¹„ฟล์ zip เà¸à¹ˆà¸² à¹à¸¥à¹‰à¸§à¸£à¸µà¸ªà¸•าร์ทเà¸à¸¡à¸«à¸£à¸·à¸­à¸£à¸µà¹‚หลดมอด -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.scripts.disable = เครื่องของคุณไม่รองรับมอดที่มี scripts. คุณจำเป็นต้องปิดมอดเหล่านี้à¸à¹ˆà¸­à¸™à¸ˆà¸¶à¸‡à¸ˆà¸°à¸ªà¸²à¸¡à¸²à¸£à¸–เล่นได้. about.button = เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š name = ชื่อ: noname = ใส่ชื่อ[accent] ผู้เล่น[] à¸à¹ˆà¸­à¸™. -planetmap = Planet Map -launchcore = Launch Core +planetmap = à¹à¸œà¸™à¸—ี่ดาวเคราะห์ +launchcore = ส่ง Core filename = ชื่อไฟล์: -unlocked = content ใหม่ปลดล็อค! +unlocked = เนื้อหาใหม่ปลดล็อค! completed = [accent]สำเร็จ techtree = ความคืบหน้าในà¸à¸²à¸£à¸§à¸´à¸ˆà¸±à¸¢ research.list = [lightgray]วิจัย: research = วิจัย researched = [lightgray]{0} วิจัยà¹à¸¥à¹‰à¸§. -research.progress = {0}% complete +research.progress = เสร็จà¹à¸¥à¹‰à¸§ {0}% players = {0} ผู้เล่น players.single = {0} ผู้เล่น -players.search = search -players.notfound = [gray]no players found +players.search = ค้นหา +players.notfound = [gray]ไม่พบผู้เล่น server.closing = [accent]à¸à¸³à¸¥à¸±à¸‡à¸›à¸´à¸”เซิฟเวอร์... server.kicked.kick = คุณถูà¸à¹€à¸•ะออà¸à¸ˆà¸²à¸à¹€à¸‹à¸´à¸Ÿà¹€à¸§à¸­à¸£à¹Œ! server.kicked.whitelist = คุณไม่ได้อยู่ใน whitelisted @@ -168,8 +168,8 @@ server.kicked.nameInUse = มีคนที่ใช้ชืชื่อนี server.kicked.nameEmpty = ชื่อของคุณไม่สามารถใช้ได้ server.kicked.idInUse = คุณเชื่อมต่อà¸à¸±à¸šà¹€à¸‹à¸´à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸™à¸µà¹‰à¸­à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ เราไม่อนุà¸à¸²à¸•ให้เชื่อมต่อ 2 บัà¸à¸Šà¸µà¹ƒà¸™à¹€à¸‹à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¹€à¸”ียวà¸à¸±à¸™ server.kicked.customClient = เซิฟเวอร์นี้ไม่รองรับ builds ปรับà¹à¸•่ง. à¸à¸£à¸¸à¸“าโหลดของ official. -server.kicked.gameover = Game over! -server.kicked.serverRestarting = The server is restarting. +server.kicked.gameover = จบเà¸à¸¡! +server.kicked.serverRestarting = เซิฟเวอร์à¸à¸³à¸¥à¸±à¸‡à¹€à¸£à¸´à¹ˆà¸¡à¹ƒà¸«à¸¡à¹ˆ. server.versions = เวอร์ชั่นของคุณ:[accent] {0}[]\nเวอร์ชั่นของเซิฟเวอร์:[accent] {1}[] host.info = ปุ่ม [accent]โฮสต์[] นั้นโฮสต์เซฟเวอร์ที่พอร์ท [scarlet]6567[]. \nทุà¸à¸„นที่อยู่ใน [lightgray]wifi หรือ local network[] เดียวà¸à¸±à¸™à¸ˆà¸°à¸ªà¸²à¸¡à¸²à¸£à¸–เห็นเซิฟเวอร์ของคุณในลิสของเซิฟเวอร์ได้\n\nถ้าคุณต้องà¸à¸²à¸£à¹ƒà¸«à¹‰à¸œà¸¹à¹‰à¹€à¸¥à¹ˆà¸™à¸­à¸·à¹ˆà¸™à¹†à¸ªà¸²à¸¡à¸²à¸£à¸–เชื่อมต่อได้จาà¸à¸—ุà¸à¸—ี่โดยใช้ IP, จำเป็นจะต้องใช้à¸à¸²à¸£ [accent]port forwarding[] \n\n[lightgray]Note: ถ้าผู้เล่นคนใดมีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ LAN ของคุณ เช็คให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸„ุณได้อนุà¸à¸²à¸•ให้ Mindustry เข้าถึง local network ของคุณในà¸à¸²à¸£à¸•ั้งค่า firewall. จำให้ว่า network สาธารณะบางครั้งไม่อนุà¸à¸²à¸•à¸à¸²à¸£à¸„้นหาเซิฟเวอร์ join.info = คุณสามารถใส่ [accent]IP ของเซิฟเวอร์[] เพื่อที่จะเชื่อมต่อหรือค้นหา เซิฟเวอร์ที่ใช้[accent]local network[] จะสามารถเชื่อมโดยใช้\n LAN หรือ WAN à¸à¹‡à¹„ด้\n\n[lightgray]โน้ต: เà¸à¸¡à¸™à¸µà¹‰à¹„ม่มีระบบค้นหาเซิฟเวอร์ global ให้อัตโนมัติserver list; ถ้าคุณต้องà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อà¸à¸±à¸šà¹€à¸‹à¸´à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¹‚ดยใช้ IP, คุณจำเป็นต้องถาม IP ผู้เล่นที่โฮสต์เซิฟเวอร์นั้นๆ. @@ -185,9 +185,9 @@ server.refreshing = à¸à¸³à¸¥à¸±à¸‡à¸£à¸µà¹€à¸Ÿà¸£à¸Šà¹€à¸‹à¸´à¸Ÿà¹€à¸§à¸­à¸£à¹Œ hosts.none = [lightgray]ไม่พบเซิฟเวอร์ใน local! host.invalid = [scarlet]ไม่สามารถเชื่อมต่อà¸à¸±à¸šà¹‚ฮสต์ได้ -servers.local = Local Servers -servers.remote = Remote Servers -servers.global = Community Servers +servers.local = เซิฟเวอร์ Local +servers.remote = เซิฟเวอร์ Remote +servers.global = เซิฟเวอร์ Community trace = Trace ผู้เล่น/ à¹à¸à¸°à¸£à¸­à¸¢à¸œà¸¹à¹‰à¹€à¸¥à¹ˆà¸™ trace.playername = ชื่อผู้เล่น: [accent]{0} @@ -269,7 +269,7 @@ copylink = คัดลอà¸à¸¥à¸´à¹‰à¸‡à¸„์ back = à¸à¸¥à¸±à¸š data.export = ส่งออà¸à¸‚้อมูล data.import = นำเข้าข้อมูล -data.openfolder = Open Data Folder +data.openfolder = เปิดโฟลเดอร์ข้อมูล data.exported = ข้อมูลส่งออà¸à¹à¸¥à¹‰à¸§ data.invalid = นี่ไม่ใช่ข้อมูลเà¸à¸¡à¸—ี่ถูà¸à¸•้อง. data.import.confirm = à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าข้อมูลจาà¸à¸ à¸²à¸¢à¸™à¸­à¸à¸ˆà¸°à¹€à¸‚ียนทับข้อมูลเà¸à¹ˆà¸²[scarlet]ทั้งหมด[]\n[accent]à¹à¸¥à¸°à¹„ม่สามารถย้อนà¸à¸¥à¸±à¸šà¹„ด้![]\n\nหลังจาà¸à¸—ี่นำข้อมูลà¹à¸¥à¹‰à¸§à¹€à¸à¸¡à¸ˆà¸°à¸›à¸´à¸”ลงโดยทันที @@ -278,18 +278,21 @@ quit.confirm.tutorial = คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸„ุณ loading = [accent]à¸à¸³à¸¥à¸±à¸‡à¹‚หลด... reloading = [accent]à¸à¸³à¸¥à¸±à¸‡à¸£à¸µà¹‚หลดมอด... saving = [accent]à¸à¸³à¸¥à¸±à¸‡à¹€à¸‹à¸Ÿ... -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}]][]เพื่อเà¸à¸´à¸”ใหม่ที่ core cancelbuilding = [accent][[{0}][]เพื่อเคลียà¹à¸œà¸™ selectschematic = [accent][[{0}][]เพื่อเลือà¸à¹à¸¥à¸°à¸„ัดลอภpausebuilding = [accent][[{0}][]เพื่อหยุดà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸Šà¸±à¹ˆà¸§à¸„ราว resumebuilding = [scarlet][[{0}][]เพื่อสร้างต่อ wave = [accent]Wave {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Wave ในอีภ{0} wave.waveInProgress = [lightgray]Wave à¸à¸³à¸¥à¸±à¸‡à¸”ำเนินà¸à¸²à¸£ waiting = [lightgray]à¸à¸³à¸¥à¸±à¸‡à¸£à¸­... waiting.players = รอผู้เล่น... wave.enemies = ศัตรูคงเหลือ [lightgray]{0} wave.enemy = ศัตรูคงเหลือ [lightgray]{0} +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = โหลดรูป saveimage = เซฟรูป unknown = ไม่ทราบ @@ -315,7 +318,7 @@ publish.error = à¸à¸²à¸£à¹€à¸œà¸¢à¹à¸žà¸£à¹ˆà¹„อเท็มดังต่ steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} editor.brush = à¹à¸›à¸£à¸‡ -editor.openin = เปิดมน Editor +editor.openin = เปิดใน Editor editor.oregen = à¸à¸²à¸£à¹€à¸à¸´à¸”ของà¹à¸£à¹ˆ editor.oregen.info = à¸à¸²à¸£à¹€à¸à¸´à¸”ของà¹à¸£à¹ˆ: editor.mapinfo = ข้อมูลของà¹à¸¡à¸ž @@ -328,16 +331,17 @@ editor.generation = à¸à¸²à¸£à¹€à¸à¸´à¸”: editor.ingame = à¹à¸à¹‰à¹„ขในเà¸à¸¡ editor.publish.workshop = เผยà¹à¸žà¸£à¹ˆà¸šà¸™ Workshop editor.newmap = à¹à¸¡à¸žà¹ƒà¸«à¸¡à¹ˆ +editor.center = ศูนย์à¸à¸¥à¸²à¸‡à¹à¸¡à¸ž workshop = Workshop waves.title = Waves waves.remove = ลบ -waves.never = +waves.never = <ไม่เคย> waves.every = ทุà¸à¹† waves.waves = wave(s) waves.perspawn = ต่อสปาวน์ -waves.shields = shields/wave -waves.to = to -waves.guardian = Guardian +waves.shields = เà¸à¸£à¸²à¸°/wave +waves.to = ถึง +waves.guardian = à¸à¸²à¸£à¹Œà¹€à¸”ียน waves.preview = พรีวิว waves.edit = à¹à¸à¹‰à¹„ข... waves.copy = คัดลอà¸à¹„ปยังคลิปบอร์ด @@ -346,9 +350,9 @@ waves.invalid = waves ในคลิปบอร์ดไม่ถูà¸à¸•้ waves.copied = คัดลอภWaves à¹à¸¥à¹‰à¸§ waves.none = ไม่ได้à¸à¸³à¸«à¸™à¸”ศัตรู\nwave layouts เปล่าจะถูà¸à¹à¸—นที่โดย layout ค่าเริ่มต้นของเà¸à¸¡ -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +wavemode.counts = จำนวน +wavemode.totals = ทั้งหมด +wavemode.health = เลือด editor.default = [lightgray]<ค่าเริ่่มต้น> details = รสยละเอียด... @@ -415,8 +419,9 @@ toolmode.drawteams.description = วาดทีมà¹à¸—นที่จะเ filters.empty = [lightgray]ไม่มีฟิลเตอร์! เพิ่มด้วยปุ่มด้านล่างนี้ filter.distort = บิดเบือน filter.noise = นอยส์ -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = เบือà¸à¸—ี่เà¸à¸´à¸”ศัตรู +filter.spawnpath = Path To Spawn +filter.corespawn = เลือภCore filter.median = เฉลี่ย filter.oremedian = เฉลี่ยà¹à¸£à¹ˆ filter.blend = ผสมผสาน @@ -436,10 +441,11 @@ filter.option.circle-scale = สเà¸à¸¥à¸§à¸‡à¸à¸¥à¸¡ filter.option.octaves = เลอะเลือน filter.option.falloff = หลุด filter.option.angle = มุม -filter.option.amount = Amount +filter.option.amount = จำนวน filter.option.block = บล็อค filter.option.floor = พื้น filter.option.flooronto = พื้น Target +filter.option.target = Target filter.option.wall = à¸à¸³à¹à¸žà¸‡ filter.option.ore = à¹à¸£à¹ˆ filter.option.floor2 = พื้นชั้น 2 @@ -471,20 +477,14 @@ requirement.wave = ถึง Wave ที่ {0} ใน {1} requirement.core = ทำลาย Core ของศัตรูใน {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = เล่นต่อในโซน:\n[lightgray]{0} bestwave = [lightgray]Wave สูงสุด: {0} -launch = < ส่ง > -launch.text = Launch -launch.title = ส่งเรียบร้อย -launch.next = [lightgray]โอà¸à¸²à¸ªà¸„รั้งหน้าที่ wave {0} -launch.unable2 = [scarlet]ไม่สามารถส่งได้[] -launch.confirm = นี่จะส่งทรัพยาà¸à¸£à¸—ั้งหมดใน core ของคุณ\nคุณจะไม่สามารถà¸à¸¥à¸±à¸šà¸¡à¸²à¸—ี่à¸à¸²à¸™à¸™à¸µà¹‰à¹„ด้อีภ-launch.skip.confirm = ถ้าคุณข้ามตอนนี้, คุณจะไม่สามารถส่งจนà¸à¸§à¹ˆà¸²à¸ˆà¸°à¸–ึง waves ต่อๆไป +launch.text = ส่ง +research.multiplayer = Only the host can research items. uncover = เปิดเผย configure = ตั้งค่า Loadout loadout = Loadout -resources = Resources -bannedblocks = Banned Blocks +resources = ทรัพยาà¸à¸£ +bannedblocks = บล็อคต้องห้าม addall = เพิ่มทั้งหมด launch.destination = Destination: {0} configure.invalid = จำนวนต้อยู่ระหว่าง 0 ถึง {0}. @@ -508,19 +508,25 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = ไม่สามารถเริ่มต้น bloom ได้\nอุปà¸à¸£à¸“์ของคุณอาจไม่รองรับ -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = à¸à¸™ +weather.snow.name = หิมะ +weather.sandstorm.name = พายุทราย +weather.sporestorm.name = พายุสปอร์ +weather.fog.name = หมอภ-sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select +sectors.unexplored = [lightgray]ยังไม่ได้สำรวจ +sectors.resources = ทรัพยาà¸à¸£: +sectors.production = à¸à¸²à¸£à¸œà¸¥à¸´à¸•: +sectors.stored = เà¸à¹‡à¸š: +sectors.resume = ทำต่อ +sectors.launch = ส่ง +sectors.select = เลือภsectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]สิ่งของทำ core ไม่ครบ + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -534,22 +540,22 @@ sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +sector.groundZero.description = ที่ที่ดีที่สุดในà¸à¸²à¸£à¹€à¸£à¸´à¹ˆà¸¡à¸•้นอีà¸à¸„รั้ง. ศัตรูมีน้อย. ทรัพยาà¸à¸£à¸™à¹‰à¸­à¸¢à¸ƒ.\nเà¸à¹‡à¸šà¸•ะà¸à¸±à¹ˆà¸§à¹à¸¥à¸°à¸—องà¹à¸”งให้ได้มาà¸à¸—ี่สุด.\nà¹à¸¥à¹‰à¸§à¹„ปต่อ. +sector.frozenForest.description = à¹à¸¡à¹‰à¹à¸•่ที่นี่, ที่ที่อยู่ใà¸à¸¥à¹‰à¸ à¸¹à¹€à¸‚า, สปอร์à¸à¹‡à¸¢à¸±à¸‡à¹à¸žà¸£à¹ˆà¸¡à¸²à¸–ึงที่นี่. อาà¸à¸²à¸¨à¸—ี่เย็นเยือà¸à¹„ม่สามารถหยุดยั้งพวà¸à¸¡à¸±à¸™à¹„ด้ตลอดไป.\n\nเริ่มต้นà¸à¸²à¸£à¹ƒà¸Šà¹‰à¹„ฟฟ้า. สร้างเครื่องà¸à¸³à¹€à¸™à¸´à¸”ไฟฟ้าเผาไหม้ถ่าน. เรียนรู้ที่จะใช้เครื่องซ่อมà¹à¸‹à¸¡. +sector.saltFlats.description = ณ ขอบของทะเลทราย เป็นที่ตั้งของ Salt Flats. สามารถพบทรัพยาà¸à¸£à¸šà¸²à¸‡à¸­à¸¢à¹ˆà¸²à¸‡à¹„ด้ที่นี่.\n\nศัตรูได้ตั้งà¸à¸²à¸™à¹€à¸à¹‡à¸šà¸—รัพยาà¸à¸£à¹„ว้ที่นี่. ทำลาย core ของพวà¸à¸¡à¸±à¸™. อย่าให้มีอะไรเหลือ. +sector.craters.description = น้ำขังอยู่ในหลุมอุà¸à¸à¸²à¸šà¸²à¸¨à¸™à¸µà¹‰, ที่นี้เป็นอนุสรณ์ของสองคราม. ยึดพื้นที่นี่มา. เà¸à¹‡à¸šà¸—ราย. เผาà¸à¸£à¸°à¸ˆà¸à¹€à¸¡à¸•้า. ปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนà¹à¸¥à¸°à¹à¸—่นขุดเจาะ. +sector.ruinousShores.description = ต่อจาà¸à¸‚องเสียต่างๆ, เป็นที่ตั้งของชายà¸à¸±à¹ˆà¸‡. ครั้งà¸à¹ˆà¸­à¸™, ที่นี่เคยเป็นที่ตั้งของà¸à¸²à¸™à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸Šà¸²à¸¢à¸à¸±à¹ˆà¸‡. ณ ตอนนี้à¹à¸—บจะไม่เหลือà¹à¸¥à¹‰à¸§. มีเหลือà¹à¸„่ระบบà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸žà¸·à¹‰à¸™à¸à¸²à¸™, ทุà¸à¸­à¸¢à¹ˆà¸²à¸‡à¸—ี่เหลือถูà¸à¸—ำลายเหลือเพียงà¹à¸„่เศษเหล็à¸.\nทำà¸à¸²à¸£à¸‚ยายà¸à¸²à¸£à¸ªà¸³à¸£à¸§à¸ˆà¸•่อไป. ค้นพบà¸à¸±à¸šà¹€à¸—คโนโลยีอีà¸à¸„รั้ง. +sector.stainedMountains.description = เข้าลึà¸à¹„ปในพื้นที่ จะพบà¸à¸±à¸šà¸ à¸¹à¹€à¸‚า, ซึ่งยังไม่ถูà¸à¸ªà¸›à¸­à¸£à¹Œà¹à¸•ะต้อง.\nขุดไทเทเนียมที่อุดมสมบูรณ์ในพื้นที่นี้. เรียนรู้ที่จะใช้มัน.\n\nมีศัตรูมาà¸à¸‚ึ้นในบริเวณนี้. อย่าปล่อยให้พวà¸à¸¡à¸±à¸™à¸›à¸¥à¹ˆà¸­à¸¢à¸¢à¸¹à¸™à¸´à¸•ที่à¹à¸‚็งà¹à¸à¸£à¹ˆà¸‡à¸—ี่สุดของพวà¸à¸¡à¸±à¸™à¸­à¸­à¸à¸¡à¸². +sector.overgrowth.description = พื้นที่นี้ถูà¸à¸›à¸à¸„ลุมไปด้วยพืช, ใà¸à¸¥à¹‰à¸à¸±à¸šà¹à¸«à¸¥à¹ˆà¸‡à¸à¸³à¹€à¸™à¸´à¸‚องสปอร์.\nศัตรูได้ตั้งà¸à¸²à¸™à¹€à¸à¹‰à¸²à¸£à¸°à¸§à¸±à¸‡à¹„ว้ที่นี่. สร้างยูนิตไททัน. ทำลายà¸à¸²à¸™à¸‹à¸°. à¹à¸¥à¹‰à¸§à¸™à¸³à¸ªà¸´à¹ˆà¸‡à¸—ี่ถูà¸à¸¢à¸¶à¸”ไปà¸à¸¥à¸±à¸šà¸„ืนมา. +sector.tarFields.description = ขอบของพื้นที่ผลิตน้ำมัน, อยู่ระหว่างภูเขาà¹à¸¥à¸°à¸—ะเลทราย. หนึ่งในพื้นที่ที่มีà¹à¸«à¸¥à¹ˆà¸‡à¸™à¹‰à¸³à¸¡à¸±à¸™à¸”ิบที่ใช้ได้.\nà¹à¸¡à¹‰à¸§à¹ˆà¸²à¸ˆà¸°à¸–ูà¸à¸—ิ้งร้าง, พื้นที่นี้ยังคงมีทัพของศัตรูอยู่ใà¸à¸¥à¹‰à¹†. อย่าประมาทà¸à¸±à¸šà¸žà¸§à¸à¸¡à¸±à¸™.\n\n[lightgray]วิจัยเทคโนโลยีà¸à¸²à¸£à¹à¸›à¸£à¸£à¸¹à¸›à¸™à¹‰à¸³à¸¡à¸±à¸™à¸«à¸²à¸à¹€à¸›à¹‡à¸™à¹„ปได้. +sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาà¸. ทรัพยาà¸à¸£à¸¡à¸²à¸à¸¡à¸²à¸¢, à¹à¸•่พื้นที่น้อย. ความเสี่ยงà¸à¸²à¸£à¹‚ดนทำลายล้างสูง. ออà¸à¹„ปจาà¸à¸—ี่นี่ให้ไวที่สุด. อย่าถูà¸à¸«à¸¥à¸­à¸à¹‚ดนระยะเวลาระหว่างà¸à¸²à¸£à¹‚จมตีของศัตรูที่เว้นไว้นานà¸à¸§à¹ˆà¸²à¸›à¸à¸•ิ. +sector.nuclearComplex.description = สถานที่ผลิตà¹à¸¥à¸°à¹à¸›à¸£à¸£à¸¹à¸›à¸—อเรี่ยมเà¸à¹ˆà¸², ถูà¸à¸—ำลายà¸à¸¥à¸²à¸¢à¹€à¸›à¹‡à¸™à¸‹à¸²à¸.\n[lightgray]วิจัยทอเรี่ยมà¹à¸¥à¸°à¸§à¸´à¸˜à¸µà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸¡à¸±à¸™.\n\nศัตรูในบริเวณนี้มีจำนวนมาà¸, ตรวจตราหาผู้บุà¸à¸£à¸¸à¸à¸­à¸¢à¸¹à¹ˆà¸•ลอดเวลา. +sector.fungalPass.description = พื้นที่ระหว่างพื้นที่สูงà¹à¸¥à¸°à¸•่ำของภูเขา, พื้นที่นี้เต็มไปด้วยสปอร์. à¸à¸²à¸™à¸¥à¸²à¸”ตระเวนขนาดเล็à¸à¸‚องศัตรูตั้งอยู่ที่นี่.\nทำลายมันซะ.\nใช้ยูนิตเด็à¸à¹€à¸à¸­à¸£à¹Œà¹à¸¥à¸°à¸„รอว์เลอร์. ทำลาย core ทั้งสองซะ. settings.language = ภาษา settings.data = ข้อมูลเà¸à¸¡ settings.reset = รีเซ็ตเป็นค่าเริ่มต้น -settings.rebind = Rebind +settings.rebind = à¹à¸à¹‰à¹„ขปุ่ม settings.resetKey = Reset settings.controls = à¸à¸²à¸£à¸„วบคุม settings.game = เà¸à¸¡ @@ -558,65 +564,94 @@ settings.graphics = à¸à¸£à¸²à¸Ÿà¸´à¸ settings.cleardata = เคลียร์ข้อมูลเà¸à¸¡... settings.clear.confirm = คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¹€à¸„ลียร์ข้อมูลเà¸à¸¡?\nสิ่งที่ทำไปà¹à¸¥à¹‰à¸§à¸ˆà¸°à¹„ม่สามารถย้อนà¸à¸¥à¸±à¸šà¹„ด้! settings.clearall.confirm = [scarlet]คำเตือน![]\nà¸à¸²à¸£à¸à¸£à¸°à¸—ำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ, à¹à¸¡à¸ž, สิ่งที่ปลดล็อคà¹à¸¥à¹‰à¸§à¹à¸¥à¸° keybinds.\nเมื่อคุณà¸à¸” 'โอเค' เà¸à¸¡à¸ˆà¸°à¸¥à¸šà¸‚้อมูลทุà¸à¸­à¸¢à¹ˆà¸²à¸‡à¹à¸¥à¸°à¸­à¸­à¸à¹‚ดยอัตโนมัติ -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸„ุณต้องà¸à¸²à¸£à¹€à¸„ลียร์เซฟทั้งหมด? +settings.clearsaves = เคลียร์เซฟ +settings.clearresearch = ลบà¸à¸²à¸£ Research +settings.clearresearch.confirm = à¹à¸™à¹ˆà¹ƒà¸ˆà¸—ี่จะลบà¸à¸²à¸£ Research หรือไม่? +settings.clearcampaignsaves = ลบเซฟ Campaign +settings.clearcampaignsaves.confirm = à¹à¸™à¹ˆà¹ƒà¸ˆà¸—ี่จะลบเซฟ Campaign หรือไม่? paused = [accent]< หยุดชั่วคราว > clear = เคลียร์ banned = [scarlet]à¹à¸šà¸™ -unplaceable.sectorcaptured = [scarlet]Requires captured sector +unplaceable.sectorcaptured = [scarlet]ต้องà¸à¸²à¸£ captured sector yes = ใช่ no = ไม่ info.title = ข้อมูล error.title = [crimson]มีบางอย่างผิดพลาดเà¸à¸´à¸”ขึ้น error.crashtitle = มีบางอย่างผิดพลาดเà¸à¸´à¸”ขึ้น -unit.nobuild = [scarlet]Unit can't build -blocks.input = นำเข้า -blocks.output = ส่งออภ-blocks.booster = บูสเตอร์ -blocks.tiles = Required Tiles -blocks.affinities = Affinities +unit.nobuild = [scarlet]ยูนิตไม่สามารถสร้างได้ +lastaccessed = [lightgray]:คนที่à¹à¸•ะเป็นคนสุดท้าย {0} block.unknown = [lightgray]??? -blocks.powercapacity = ความจุพลังงาน -blocks.powershot = หน่วยพลังงาน/นัด -blocks.damage = ดาเมจ -blocks.targetsair = ยิงอาà¸à¸²à¸¨à¸¢à¸²à¸™ -blocks.targetsground = ยิงภาคพื้นดิน -blocks.itemsmoved = ความเร็วเคลื่อนที่ -blocks.launchtime = เวลาระหว่างà¸à¸²à¸£à¸ªà¹ˆà¸‡ -blocks.shootrange = ระยะยิง -blocks.size = ขนาด -blocks.displaysize = Display Size -blocks.liquidcapacity = จุของเหลว -blocks.powerrange = ระยะพลังงาน -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = จำนวนà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อสูงสุด -blocks.poweruse = ใช้พลังงาน -blocks.powerdamage = หน่วยพลังงาน/ดาเมจ -blocks.itemcapacity = จุไอเท็ม -blocks.basepowergeneration = à¸à¸³à¹€à¸™à¸´à¸”พลังงานพื้นà¸à¸²à¸™ -blocks.productiontime = เวลาที่ใช้ในà¸à¸²à¸£à¸œà¸¥à¸´à¸• -blocks.repairtime = เวลาที่ใช้ในà¸à¸²à¸£à¸‹à¹ˆà¸­à¸¡à¹à¸‹à¸¡à¹ƒà¸«à¹‰à¸ªà¸¡à¸šà¸¹à¸£à¸“์ -blocks.speedincrease = เพิ่มความเร็ว -blocks.range = ระยะ -blocks.drilltier = ขุดได้ -blocks.drillspeed = ความเร็วขุดพื้นà¸à¸²à¸™ -blocks.boosteffect = à¹à¸­à¸Ÿà¹€à¸Ÿà¹‡à¸„ของบูสต์ -blocks.maxunits = จำนวนยูนิตสูงสุด -blocks.health = เลือด -blocks.buildtime = เวลาในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = ใช้ -blocks.inaccuracy = ความคลาดเคลื่อน -blocks.shots = นัด -blocks.reload = นัด/วินาที -blocks.ammo = à¸à¸£à¸°à¸ªà¸¸à¸™ -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = นำเข้า +stat.output = ส่งออภ+stat.booster = บูสเตอร์ +stat.tiles = ต้องà¸à¸²à¸£ Tiles +stat.affinities = affinities +stat.powercapacity = ความจุพลังงาน +stat.powershot = หน่วยพลังงาน/นัด +stat.damage = ดาเมจ +stat.targetsair = ยิงอาà¸à¸²à¸¨à¸¢à¸²à¸™ +stat.targetsground = ยิงภาคพื้นดิน +stat.itemsmoved = ความเร็วเคลื่อนที่ +stat.launchtime = เวลาระหว่างà¸à¸²à¸£à¸ªà¹ˆà¸‡ +stat.shootrange = ระยะยิง +stat.size = ขนาด +stat.displaysize = ขนาดที่โชว์ +stat.liquidcapacity = จุของเหลว +stat.powerrange = ระยะพลังงาน +stat.linkrange = ระยะà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ +stat.instructions = คำà¹à¸™à¸°à¸™à¸³ +stat.powerconnections = จำนวนà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อสูงสุด +stat.poweruse = ใช้พลังงาน +stat.powerdamage = หน่วยพลังงาน/ดาเมจ +stat.itemcapacity = จุไอเท็ม +stat.memorycapacity = ความจุหน่วยความจำ +stat.basepowergeneration = à¸à¸³à¹€à¸™à¸´à¸”พลังงานพื้นà¸à¸²à¸™ +stat.productiontime = เวลาที่ใช้ในà¸à¸²à¸£à¸œà¸¥à¸´à¸• +stat.repairtime = เวลาที่ใช้ในà¸à¸²à¸£à¸‹à¹ˆà¸­à¸¡à¹à¸‹à¸¡à¹ƒà¸«à¹‰à¸ªà¸¡à¸šà¸¹à¸£à¸“์ +stat.speedincrease = เพิ่มความเร็ว +stat.range = ระยะ +stat.drilltier = ขุดได้ +stat.drillspeed = ความเร็วขุดพื้นà¸à¸²à¸™ +stat.boosteffect = à¹à¸­à¸Ÿà¹€à¸Ÿà¹‡à¸„ของบูสต์ +stat.maxunits = จำนวนยูนิตสูงสุด +stat.health = เลือด +stat.buildtime = เวลาในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ +stat.maxconsecutive = ติดต่อà¸à¸±à¸™à¸ªà¸¹à¸‡à¸ªà¸¸à¸” +stat.buildcost = ใช้ +stat.inaccuracy = ความคลาดเคลื่อน +stat.shots = นัด +stat.reload = นัด/วินาที +stat.ammo = à¸à¸£à¸°à¸ªà¸¸à¸™ +stat.shieldhealth = เลือดของเà¸à¸£à¸²à¸° +stat.cooldowntime = เวลา Cooldown +stat.explosiveness = ความà¹à¸£à¸‡à¸‚องระเบิด +stat.basedeflectchance = โอà¸à¸²à¸ªà¸à¸£à¸°à¸ªà¸¸à¸™à¸à¸£à¸°à¹€à¸”็นà¸à¸¥à¸±à¸š +stat.lightningchance = โอà¸à¸²à¸ªà¸—ี่จะเà¸à¸´à¸”สายฟ้า +stat.lightningdamage = ความà¹à¸£à¸‡à¸‚องสายฟ้า +stat.flammability = ความไวไฟ +stat.radioactivity = ความà¹à¸£à¸‡à¸‚องรังสี +stat.heatcapacity = ความจุความร้อน +stat.viscosity = Viscosity +stat.temperature = อุณหภูมิ +stat.speed = ความไว +stat.buildspeed = ความไวในà¸à¸²à¸£à¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡ +stat.minespeed = ความไวในà¸à¸²à¸£à¸‚ุด +stat.minetier = ความà¹à¸£à¸‡à¸‚องเลเซอร์ขุด +stat.payloadcapacity = ความจุà¸à¸²à¸£à¸‚นของ +stat.commandlimit = จำนวน Unit ที่สามารถสูงสุด +stat.abilities = ทัà¸à¸©à¸° + +ability.forcefield = สนามพลัง +ability.repairfield = รัà¸à¸©à¸² Unit รอบข้าง +ability.statusfield = บัฟ Unit รอบข้าง +ability.unitspawn = โรงงานทำ {0} +ability.shieldregenfield = บัฟโล่รอบข้าง bar.drilltierreq = จำเป็นต้องใช้เครื่องขุดที่ดีà¸à¸§à¹ˆà¸² -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = ทรัพยาà¸à¸£à¸«à¸²à¸¢ +bar.corereq = à¸à¸²à¸™ Core ที่ต้องà¸à¸²à¸£ bar.drillspeed = ความเร็วขุด: {0}/s bar.pumpspeed = ความเร็วปั้ม: {0}/s bar.efficiency = ประสิทธิภาพ: {0}% @@ -624,10 +659,11 @@ bar.powerbalance = พลังงาน: {0}/s bar.powerstored = เà¸à¹‡à¸šà¹à¸¥à¹‰à¸§: {0}/{1} bar.poweramount = พลังงาน: {0} bar.poweroutput = พลังงานออà¸: {0} +bar.powerlines = Connections: {0}/{1} bar.items = ไอเท็ม: {0} bar.capacity = ความจุ: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[ยูนิตถูà¸à¸›à¸´à¸”] bar.liquid = ของเหลว bar.heat = ความร้อน bar.power = พลังงาน @@ -635,6 +671,8 @@ bar.progress = ความคืบหน้าในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ bar.input = นำเข้า bar.output = ส่งออภ+units.processorcontrol = [lightgray]ถูภProcessor ควบคุม + bullet.damage = [stat]{0}[lightgray] ดาเมจ bullet.splashdamage = [stat]{0}[lightgray] ดาเมจà¸à¸£à¸°à¸ˆà¸²à¸¢ ~[stat] {1}[lightgray] ช่อง bullet.incendiary = [stat]ติดไฟ @@ -642,12 +680,15 @@ bullet.homing = [stat]ติดตาม bullet.shock = [stat]ช็อค bullet.frag = [stat]à¹à¸•à¸à¸­à¸­à¸ bullet.knockback = [stat]{0}[lightgray] ดันà¸à¸¥à¸±à¸š +bullet.pierce = [stat]{0}[lightgray]x ทะลุ +bullet.infinitepierce = [stat]ทะลุ bullet.freezing = [stat]à¹à¸Šà¹ˆà¹à¸‚็ง bullet.tarred = [stat]เปื้อนน้ำมัน bullet.multiplier = [stat]{0}[lightgray]x จำนวนà¸à¸£à¸°à¸ªà¸¸à¸™à¸•่อ 1 ไอเท็ม bullet.reload = [stat]{0}[lightgray]x ความเร็วยิง unit.blocks = บล็อค +unit.blockssquared = blocks² unit.powersecond = หน่วยพลังงาน/วินาที unit.liquidsecond = หน่วยของเหลว/วินาที unit.itemssecond = ไอเท็ม/วินาที @@ -655,41 +696,40 @@ unit.liquidunits = หน่วยของเหลว unit.powerunits = หน่วยพลังงาน unit.degrees = องศา unit.seconds = วินาที -unit.minutes = mins +unit.minutes = นาที unit.persecond = /วินาที -unit.perminute = /min +unit.perminute = /ต่อนาที unit.timesspeed = เท่าเร็วขึ้น unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = เลือดเà¸à¸£à¸²à¸° unit.items = ไอเท็ม -unit.thousands = k -unit.millions = mil -unit.billions = b +unit.thousands = พัน +unit.millions = ล้าน +unit.billions = พันล้าน category.general = ทั่วไป category.power = พลังงาน category.liquids = ของเหลว category.items = ไอเท็ม category.crafting = นำเข้า/ส่งออภ-category.shooting = à¸à¸²à¸£à¸¢à¸´à¸‡ +category.function = Function category.optional = à¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸›à¸£à¸°à¸ªà¸´à¸—ธิภาพทางเลือภsetting.landscape.name = ล็อค Landscape à¹à¸™à¸§à¸™à¸­à¸™ setting.shadows.name = เงา setting.blockreplace.name = à¹à¸™à¸°à¸™à¸³à¸šà¸¥à¹‡à¸­à¸„โดยอัตโนมัติ setting.linear.name = à¸à¸²à¸£à¸à¸£à¸­à¸‡à¹€à¸Šà¸´à¸‡à¹€à¸ªà¹‰à¸™ setting.hints.name = คำà¹à¸™à¸°à¸™à¸³ -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) +setting.flow.name = à¹à¸ªà¸”งอัตราà¸à¸²à¸£à¹„หลของทรัพยาà¸à¸£[scarlet] (รุ่นทดลอง) setting.buildautopause.name = หยุดสร้างชั่วคราวà¹à¸šà¸šà¸­à¸±à¸•โนมัติ -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = à¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™à¸™à¹‰à¸³ setting.animatedshields.name = à¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™à¹€à¸à¸£à¸²à¸° setting.antialias.name = Antialias[lightgray] (จำเป็นต้องรีสตาร์ท)[] -setting.playerindicators.name = Player Indicators +setting.playerindicators.name = ตัวบอà¸à¸œà¸¹à¹‰à¹€à¸¥à¹ˆà¸™ setting.indicators.name = ตัวบอà¸à¸¨à¸±à¸•รู/พัà¸à¸žà¸§à¸ setting.autotarget.name = เล็งเป้าอัตโนมัติ setting.keyboard.name = à¸à¸²à¸£à¸„วบคุมà¹à¸šà¸š เม้าส์+คีย์บอร์ด setting.touchscreen.name = à¸à¸²à¸£à¸„วบคุมà¹à¸šà¸šà¸«à¸™à¹‰à¸²à¸ˆà¸­à¸ªà¸±à¸¡à¸œà¸±à¸ª setting.fpscap.name = FPS -setting.fpscap.none = ไม่มี +setting.fpscap.none = ∞ setting.fpscap.text = {0} FPS setting.uiscale.name = ขนาด UI[lightgray] (จำเป็นต้องรีสตาร์ท)[] setting.swapdiagonal.name = à¸à¸²à¸£à¸§à¸²à¸‡à¹€à¸›à¹‡à¸™à¹€à¸ªà¹‰à¸™à¸—à¹à¸¢à¸‡à¹€à¸ªà¸¡à¸­ @@ -702,25 +742,24 @@ setting.difficulty.name = ระดับความยาà¸: setting.screenshake.name = à¸à¸²à¸£à¸ªà¸±à¹ˆà¸™à¸‚องจอ setting.effects.name = à¹à¸ªà¸”งเอฟเฟ็ค setting.destroyedblocks.name = à¹à¸ªà¸”งบล็อคที่ถูà¸à¸—ำลาย -setting.blockstatus.name = Display Block Status +setting.blockstatus.name = à¹à¸ªà¸”งสเตตัสของบล็อค setting.conveyorpathfinding.name = Pathfinding setting.sensitivity.name = ความไวของตัวควบคุม setting.saveinterval.name = ระยะห่าวระหว่างเซฟ setting.seconds = {0} วินาที -setting.blockselecttimeout.name = Block Select Timeout -setting.milliseconds = {0} milliseconds +setting.blockselecttimeout.name = à¸à¸²à¸£à¸«à¸¡à¸”เวลาในà¸à¸²à¸£à¹€à¸¥à¸·à¸­à¸à¸šà¸¥à¹‡à¸­à¸„ +setting.milliseconds = {0} มิลลิวินาที setting.fullscreen.name = เต็มจอ setting.borderlesswindow.name = วินโดว์à¹à¸šà¸šà¹„ร้ขอบ[lightgray] (อาจจะต้องรีตาร์ท) setting.fps.name = à¹à¸ªà¸”ง FPS à¹à¸¥à¸° Ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys +setting.smoothcamera.name = à¸à¸¥à¹‰à¸­à¸‡à¹à¸šà¸šà¸ªà¸¡à¸¹à¸— setting.vsync.name = VSync setting.pixelate.name = Pixelate[lightgray] (ปิดใช้งานà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™) setting.minimap.name = à¹à¸ªà¸”งมินิà¹à¸¡à¸ž -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = à¹à¸ªà¸”งไอเท็มใน Core (ยังไม่เสร็จสมบูรณ์) setting.position.name = à¹à¸ªà¸”งตำà¹à¸«à¸™à¹ˆà¸‡à¸‚องผู้เล่น setting.musicvol.name = ระดับเสียงเพลง -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = à¹à¸ªà¸”งชั้นบรรยาà¸à¸²à¸¨à¸‚องดาวเคราะห์ setting.ambientvol.name = ระดับเสียงล้อมรอบ setting.mutemusic.name = ปิดเพลง setting.sfxvol.name = ระดับเสียง SFX @@ -728,10 +767,10 @@ setting.mutesound.name = ปิดเสียง setting.crashreport.name = ส่งรายงานà¸à¸²à¸£à¹à¸„รชà¹à¸šà¸šà¹„ม่ระบุตัวตน setting.savecreate.name = สร้างเซฟโดยอัตโนมัติ setting.publichost.name = à¸à¸²à¸£à¸¡à¸­à¸‡à¹€à¸«à¹‡à¸™à¹€à¸‹à¸´à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸ªà¸²à¸˜à¸²à¸£à¸“ะ -setting.playerlimit.name = Player Limit +setting.playerlimit.name = จัดà¸à¸±à¸”ผู้เล่น setting.chatopacity.name = ความโปร่งà¹à¸ªà¸‡à¸‚องà¹à¸Šà¸— setting.lasersopacity.name = ความโปร่งà¹à¸ªà¸‡à¸‚องเลเซอร์พลังงาน -setting.bridgeopacity.name = Bridge Opacity +setting.bridgeopacity.name = ความโปร่งà¹à¸ªà¸‡à¸‚องสะพาน setting.playerchat.name = à¹à¸ªà¸”งบับเบิ้ลà¹à¸Šà¸—ของผู้เล่น public.confirm = คุณต้องà¸à¸²à¸£à¹ƒà¸«à¹‰à¹€à¸à¸¡à¸‚องคุณเปิดเป็นสาธารณะหรือไม่?\n[accent]ทุà¸à¸„นจะสามารถเข้าร่วมเà¸à¸¡à¸‚องคุณได้.\n[lightgray]คุณสามารถเปลี่ยนà¸à¸²à¸£à¸•ั้งค่านี้ได้ที่ ตั้งค่า->เà¸à¸¡->à¸à¸²à¸£à¸¡à¸­à¸‡à¹€à¸«à¹‡à¸™à¹€à¸‹à¸´à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸ªà¸²à¸˜à¸²à¸£à¸“ะ. public.beta = เà¸à¸¡à¹€à¸§à¸­à¸£à¹Œà¸Šà¸±à¹ˆà¸™à¹€à¸šà¸•้าไม่สามารถเปิดเซิฟเวอร์สาธารณะได้ @@ -743,54 +782,54 @@ keybinds.mobile = [scarlet]à¸à¸²à¸£à¸•ั้งค่าปุ่มส่ว category.general.name = ทั่วไป category.view.name = วิว category.multiplayer.name = ผู้เล่นหลายคน -category.blocks.name = Block Select +category.blocks.name = เลือà¸à¸šà¸¥à¹‡à¸­à¸„ command.attack = โจมตี command.rally = ชุมนุม command.retreat = ถอยà¸à¸¥à¸±à¸š -command.idle = Idle +command.idle = อยู่เฉยๆ placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.respawn.name = เà¸à¸´à¸”ใหม่ +keybind.control.name = ควบคุมยูนิต keybind.clear_building.name = เคลียร์สิ่งà¸à¹‡à¸ªà¸£à¹‰à¸²à¸‡ keybind.press = à¸à¸”ปุ่มใดà¸à¹‡à¹„ด้... keybind.press.axis = à¸à¸”à¹à¸à¸™à¸«à¸£à¸·à¸­à¸›à¸¸à¹ˆà¸¡à¹ƒà¸”à¸à¹‡à¹„ด้... keybind.screenshot.name = à¹à¸¡à¸ž Screenshot -keybind.toggle_power_lines.name = Toggle Power Lasers -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_power_lines.name = เปิดปิดเลเซอร์พลังงาน +keybind.toggle_block_status.name = เปิดปิดสถานะของบล็อค keybind.move_x.name = เคลื่อนที่ในà¹à¸à¸™ x keybind.move_y.name = เคลี่อนที่ในà¹à¸à¸™ y keybind.mouse_move.name = ตามเม้าส์ -keybind.pan.name = Pan View -keybind.boost.name = Boost +keybind.pan.name = à¹à¸žà¸™à¸§à¸´à¸§ +keybind.boost.name = บูสต์ keybind.schematic_select.name = เลือà¸à¸ à¸¹à¸¡à¸´à¸ à¸²à¸„ keybind.schematic_menu.name = เมนู Schematic -keybind.schematic_flip_x.name = à¸à¸¥à¸±à¸š Schematic ในà¹à¸à¸™ X -keybind.schematic_flip_y.name = à¸à¸¥à¸±à¸š Schematic ในà¹à¸à¸™ Y -keybind.category_prev.name = Previous Category -keybind.category_next.name = Next Category -keybind.block_select_left.name = Block Select Left -keybind.block_select_right.name = Block Select Right -keybind.block_select_up.name = Block Select Up -keybind.block_select_down.name = Block Select Down -keybind.block_select_01.name = Category/Block Select 1 -keybind.block_select_02.name = Category/Block Select 2 -keybind.block_select_03.name = Category/Block Select 3 -keybind.block_select_04.name = Category/Block Select 4 -keybind.block_select_05.name = Category/Block Select 5 -keybind.block_select_06.name = Category/Block Select 6 -keybind.block_select_07.name = Category/Block Select 7 -keybind.block_select_08.name = Category/Block Select 8 -keybind.block_select_09.name = Category/Block Select 9 -keybind.block_select_10.name = Category/Block Select 10 -keybind.fullscreen.name = เปิด/ปิด Fullscreen +keybind.schematic_flip_x.name = à¸à¸¥à¸±à¸šà¹à¸œà¸™à¸œà¸±à¸‡à¹à¸à¸™ X +keybind.schematic_flip_y.name = à¸à¸¥à¸±à¸šà¹à¸œà¸™à¸œà¸±à¸‡à¹à¸à¸™ Y +keybind.category_prev.name = หมวดหมู่à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸² +keybind.category_next.name = หมวดหมู่ถ้ดไป +keybind.block_select_left.name = เลือà¸à¸šà¸¥à¹‡à¸­à¸„ ซ้าย +keybind.block_select_right.name = เลือà¸à¸šà¸¥à¹‡à¸­à¸„ ขวา +keybind.block_select_up.name = เลือà¸à¸šà¸¥à¹‡à¸­à¸„ ขึ้น +keybind.block_select_down.name = เลือà¸à¸šà¸¥à¹‡à¸­à¸„ ลง +keybind.block_select_01.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 1 +keybind.block_select_02.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 2 +keybind.block_select_03.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 3 +keybind.block_select_04.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 4 +keybind.block_select_05.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 5 +keybind.block_select_06.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 6 +keybind.block_select_07.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 7 +keybind.block_select_08.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 8 +keybind.block_select_09.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 9 +keybind.block_select_10.name = หมวดหมู่/เลือà¸à¸šà¸¥à¹‡à¸­à¸„ 10 +keybind.fullscreen.name = เปิด/ปิด เต็มจอ keybind.select.name = เลือà¸/ยิง keybind.diagonal_placement.name = วางเป็นà¹à¸™à¸§à¸—à¹à¸¢à¸‡ keybind.pick.name = เลือà¸à¸šà¸¥à¹‡à¸­à¸„ keybind.break_block.name = ทุบบล็อค keybind.deselect.name = ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹€à¸šà¸·à¸­à¸ -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = ยà¸à¸‚องขึ้น +keybind.dropCargo.name = วางของลง +keybind.command.name = คำสั่ง keybind.shoot.name = ยิง keybind.zoom.name = ซูม keybind.menu.name = เมนู @@ -811,7 +850,7 @@ keybind.zoom_minimap.name = ซูมมินิà¹à¸¡à¸ž mode.help.title = คำอธิบายโหมด mode.survival.name = เอาชีวิตรอด mode.survival.description = โหมดปà¸à¸•ิ. ทรัพยาà¸à¸£à¸¡à¸µà¸ˆà¸³à¸à¸±à¸”à¹à¸¥à¸° wave มาโดยอัตโนมัติ.\n[gray]ต้องมีสปาวน์ของศัตรูเพื่อที่จะเล่น. -mode.sandbox.name = Sandbox +mode.sandbox.name = โหมดอิสระ mode.sandbox.description = ทรัพยาดรไม่จำà¸à¸±à¸”à¹à¸¥à¸° wave ไม่จับเวลา. mode.editor.name = Editor mode.pvp.name = PvP @@ -822,13 +861,14 @@ mode.custom = à¸à¸Žà¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เอง rules.infiniteresources = ทรัพยาà¸à¸£à¹„ม่จำà¸à¸±à¸” rules.reactorexplosions = à¸à¸²à¸£à¸£à¸°à¹€à¸šà¸´à¸”ของ +rules.schematic = อนุà¸à¸²à¸•à¹à¸œà¸™à¸œà¸±à¸‡ rules.wavetimer = ตัวนับเวลาปล่อยคลื่น(รอบ) rules.waves = คลื่น(รอบ) rules.attack = โหมดà¸à¸²à¸£à¹‚จมตี -rules.buildai = AI Building +rules.buildai = สิ่à¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡à¸‚อง AI rules.enemyCheat = AI (ทีมสีà¹à¸”ง) มีทรัพยาà¸à¸£à¹„ม่จำà¸à¸±à¸” rules.blockhealthmultiplier = พหุคูณเลือดของบล็อค -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = พหุคูณดาเมจของบล็อค rules.unitbuildspeedmultiplier = พหุคูณความเร็วในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸¢à¸¹à¸™à¸´à¸• rules.unithealthmultiplier = พหุคูณเลือดของยูนิต rules.unitdamagemultiplier = พหุคูณพลังโจมตีของยูนิต @@ -836,28 +876,30 @@ rules.enemycorebuildradius = รัศมีห้ามสร้างบริ rules.wavespacing = ระยะเวลาระหว่างคลื่น(รอบ):[lightgray] (วินาที) rules.buildcostmultiplier = พหุคูณจำนวนทรัพยาà¸à¸£à¸—ี่ใช้ในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ rules.buildspeedmultiplier = พหุคูณความเร็วในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier +rules.deconstructrefundmultiplier = พหุคูณà¸à¸²à¸£à¸„ืนทรัพยาà¸à¸£à¹€à¸¡à¸·à¹ˆà¸­à¸—ำà¸à¸²à¸£à¸—ำลายสิ่งà¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡ rules.waitForWaveToEnd = คลื่น(รอบ)รอศัตรู rules.dropzoneradius = รัศมีจุดเà¸à¸´à¸”ของศัตรู:[lightgray] (ช่อง) -rules.unitammo = Units Require Ammo +rules.unitammo = ยูนิตต้องใช้à¸à¸£à¸°à¸ªà¸¸à¸™ rules.title.waves = คลื่น(รอบ) rules.title.resourcesbuilding = ทรัพยาà¸à¸£à¹à¸¥à¸°à¸ªà¸´à¹ˆà¸‡à¸à¹ˆà¸­à¸ªà¸£à¹‰à¸²à¸‡ rules.title.enemy = ศัตรู rules.title.unit = ยูนิต -rules.title.experimental = Experimental -rules.title.environment = Environment -rules.lighting = Lighting -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Ambient Light -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.title.experimental = ทดลอง +rules.title.environment = สิ่งà¹à¸§à¸”ล้อม +rules.lighting = à¹à¸ªà¸‡ +rules.enemyLights = ไฟศัตรู +rules.fire = ไฟ +rules.explosions = ดาเมจบล็อค/ยูนิตระเบิด +rules.ambientlight = à¹à¸ªà¸‡à¸ˆà¸²à¸à¹à¸§à¸”ล้อม +rules.weather = สภาพอาà¸à¸²à¸¨ +rules.weather.frequency = ความถี่: +rules.weather.duration = ระยะเวลา: content.item.name = ไอเท็ม content.liquid.name = ของเหลว content.unit.name = ยูนิต content.block.name = บล็อค + item.copper.name = ทองà¹à¸”ง item.lead.name = ตะà¸à¸±à¹ˆà¸§ item.coal.name = ถ่านหิน @@ -879,79 +921,63 @@ liquid.slag.name = เศษà¹à¸£à¹ˆ liquid.oil.name = น้ำมัน liquid.cryofluid.name = โครโรฟิวล์ -item.explosiveness = [lightgray]ค่าà¸à¸²à¸£à¸£à¸°à¹€à¸šà¸´à¸”: {0}% -item.flammability = [lightgray]ความไวต่อไฟ: {0}% -item.radioactivity = [lightgray]ค่าà¸à¸±à¸¡à¸¡à¸±à¸™à¸•ภาพรังสี: {0}% - -unit.health = [lightgray]เลือด: {0} -unit.speed = [lightgray]ความเร็ว: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]ความจุความร้อน: {0} -liquid.viscosity = [lightgray]ความหนืด: {0} -liquid.temperature = [lightgray]อุณหภูมิ: {0} - unit.dagger.name = à¹à¸”็à¸à¹€à¸à¸­à¸£à¹Œ -unit.mace.name = Mace +unit.mace.name = เมส unit.fortress.name = ฟอร์เทรส -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar +unit.nova.name = โนว่า +unit.pulsar.name = พอวซ่า +unit.quasar.name = ควอซ่า unit.crawler.name = ครอว์เลอร์ -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.atrax.name = เอà¹à¸—รซ +unit.spiroct.name = สปิรอคท์ +unit.arkyid.name = อาร์คิดย์ +unit.toxopid.name = โทโสพิด +unit.flare.name = à¹à¸Ÿà¸¥à¸£à¹Œ +unit.horizon.name = ฮอไรซอน +unit.zenith.name = ซีนิท +unit.antumbra.name = à¹à¸­à¸™à¸—ัมบรา +unit.eclipse.name = อีคลิปส์ +unit.mono.name = โมโน +unit.poly.name = โพลี +unit.mega.name = เมà¸à¹‰à¸² +unit.quad.name = ควอด +unit.oct.name = ออà¸à¸„์ +unit.risso.name = ริสโส +unit.minke.name = มิงค์ +unit.bryde.name = ไบรดย์ +unit.sei.name = ไซย์ +unit.omura.name = โอมูร่า +unit.alpha.name = อัลฟ่า +unit.beta.name = บีตเา +unit.gamma.name = à¹à¸à¸¡à¸¡à¹ˆà¸² +unit.scepter.name = สเซปเตอร์ +unit.reign.name = เรน +unit.vela.name = เวล่า +unit.corvus.name = คอร์วัส -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax -block.cliff.name = Cliff +block.resupply-point.name = จุดเติมของ +block.parallax.name = พาราà¹à¸¥à¹‡à¸‹ +block.cliff.name = หน้าผ่า block.sand-boulder.name = à¸à¹‰à¸­à¸™à¸«à¸´à¸™à¸—ราย block.grass.name = หà¸à¹‰à¸² -block.slag.name = Slag +block.slag.name = à¸à¸²à¸à¹à¸£à¹ˆ +block.space.name = อวà¸à¸²à¸¨ block.salt.name = เà¸à¸¥à¸·à¸­ -block.salt-wall.name = Salt Wall +block.salt-wall.name = à¸à¸³à¹à¸žà¸‡à¹€à¸à¸¥à¸·à¸­ block.pebbles.name = à¸à¹‰à¸­à¸™à¸à¸£à¸§à¸” block.tendrils.name = ไม้เลื้อย -block.sand-wall.name = Sand Wall +block.sand-wall.name = à¸à¸³à¹à¸žà¸‡à¸—ราย block.spore-pine.name = ต้นสนสปอร์ -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = à¸à¸³à¹à¸žà¸‡à¸ªà¸›à¸­à¸£à¹Œ +block.boulder.name = à¸à¹‰à¸­à¸¢à¸«à¸´à¸™à¹ƒà¸«à¸à¹ˆ +block.snow-boulder.name = หินหิมะใหà¸à¹ˆ block.snow-pine.name = ต้นสนที่คลุมหิมะ block.shale.name = หินดินดาน block.shale-boulder.name = à¸à¹‰à¸­à¸™à¸«à¸´à¸™à¸”ินดาน block.moss.name = ตะไคร่น้ำ block.shrubs.name = พุ่มไม้ block.spore-moss.name = พุ่มไม้สปอร์ -block.shale-wall.name = Shale Wall +block.shale-wall.name = à¸à¸³à¹à¸žà¸‡à¸«à¸´à¸™à¸”ินดาน block.scrap-wall.name = à¸à¸³à¹à¸žà¸‡à¹€à¸¨à¸©à¹€à¸«à¸¥à¹‡à¸ block.scrap-wall-large.name = à¸à¸³à¹à¸žà¸‡à¹€à¸¨à¸©à¹€à¸«à¸¥à¹‡à¸à¸‚นาดใหà¸à¹ˆ block.scrap-wall-huge.name = à¸à¸³à¹à¸žà¸‡à¹€à¸¨à¸©à¹€à¸«à¸¥à¹‡à¸à¸‚นาดใหà¸à¹ˆà¸¡à¸²à¸ @@ -969,7 +995,7 @@ block.deepwater.name = น้ำลึภblock.water.name = น้ำ block.tainted-water.name = น้ำเสีย block.darksand-tainted-water.name = น้ำเสียบนทรายดำ -block.tar.name = น้ำมันดิน +block.tar.name = น้ำมันดิบ block.stone.name = หิน block.sand.name = ทราย block.darksand.name = ทรายดำ @@ -979,17 +1005,18 @@ block.craters.name = หลุมอุà¸à¸à¸²à¸šà¸²à¸• block.sand-water.name = น้ำบนทราย block.darksand-water.name = น้ำบนทรายดำ block.char.name = ถ่าน -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = ดาไซต์ +block.dacite-wall.name = à¸à¸³à¹à¸žà¸‡à¸”าไซต์ +block.dacite-boulder.name = โขดหินดาไซต์ block.ice-snow.name = น้ำà¹à¸‚็งหิมะ -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = à¸à¸³à¹à¸žà¸‡à¸«à¸´à¸™ +block.ice-wall.name = à¸à¸³à¹à¸žà¸‡à¸™à¹‰à¸³à¹à¸‚็ง +block.snow-wall.name = à¸à¸³à¹à¸žà¸‡à¸«à¸´à¸¡à¸° +block.dune-wall.name = à¸à¸³à¹à¸žà¸‡à¹€à¸™à¸´à¸™à¸—ราย block.pine.name = ต้นสน -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = ดิน +block.dirt-wall.name = à¸à¸³à¹à¸žà¸‡à¸”ิน +block.mud.name = โคลน block.white-tree-dead.name = ต้นไม้ขาวที่ตายà¹à¸¥à¹‰à¸§ block.white-tree.name = ต้มไม้ขาว block.spore-cluster.name = à¸à¸¥à¸¸à¹ˆà¸¡à¸ªà¸›à¸­à¸£à¹Œ @@ -1005,7 +1032,7 @@ block.dark-panel-4.name = à¹à¸œà¹ˆà¸™à¸”ำ 4 block.dark-panel-5.name = à¹à¸œà¹ˆà¸™à¸”ำ 5 block.dark-panel-6.name = à¹à¸œà¹ˆà¸™à¸”ำ 6 block.dark-metal.name = เหล็à¸à¸”ำ -block.basalt.name = Basalt +block.basalt.name = บะซอลต์ block.hotrock.name = หินร้อน block.magmarock.name = หินà¹à¸¡à¸à¸¡à¹ˆà¸² block.copper-wall.name = à¸à¸³à¹à¸žà¸‡à¸—องà¹à¸”ง @@ -1027,7 +1054,7 @@ block.hail.name = à¹à¸®à¸¥ block.lancer.name = à¹à¸¥à¸™à¹€à¸‹à¸­à¸£à¹Œ block.conveyor.name = สายพาน block.titanium-conveyor.name = สายพานไทเทเนี่ยม -block.plastanium-conveyor.name = Plastanium Conveyor +block.plastanium-conveyor.name = สายพานพสาตตาเนี่ยม block.armored-conveyor.name = สายพานเสริมเà¸à¸£à¸²à¸° block.armored-conveyor.description = เคลื่อนย้ายไอเท็มได้เร็วเทียบเท่าสายพานไทเทเนี่ยม à¹à¸•่มีเà¸à¸£à¸²à¸°à¸—ี่à¹à¸‚็งà¹à¸£à¸‡à¸à¸§à¹ˆà¸² ไม่สามารถรับไอเท็มจาà¸à¸”้านข้างà¹à¸¥à¸°à¸ˆà¸²à¸à¸ªà¸²à¸¢à¸žà¸²à¸™à¸Šà¸™à¸´à¸”อื่นนอà¸à¸ˆà¸²à¸à¸ªà¸²à¸¢à¸žà¸²à¸™à¸Šà¸™à¸´à¸”เดียวà¸à¸±à¸™. block.junction.name = ทางà¹à¸¢à¸ @@ -1036,10 +1063,10 @@ block.distributor.name = ตัวà¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢ block.sorter.name = เครื่องà¹à¸¢à¸ block.inverted-sorter.name = เครื่องà¹à¸¢à¸à¸à¸¥à¸±à¸šà¸”้าน block.message.name = ตัวเà¸à¹‡à¸šà¸‚้อความ -block.illuminator.name = Illuminator -block.illuminator.description = A small, compact, configurable light source. Requires power to function. +block.illuminator.name = ตัวเปล่งà¹à¸ªà¸‡ +block.illuminator.description = à¹à¸«à¸¥à¹ˆà¸‡à¸à¸³à¹€à¸™à¸´à¸”à¹à¸ªà¸‡à¸‚นาดเล็ภสามารถดัดà¹à¸›à¸¥à¸‡à¹„ด้. จำเป็นต้องใช้พลังงานในà¸à¸²à¸£à¸—ำงาน. block.overflow-gate.name = ประตูระบายไอเทม -block.underflow-gate.name = Underflow Gate +block.underflow-gate.name = ประตูระบายไอเท็มย้อนà¸à¸¥à¸±à¸š block.silicon-smelter.name = เตาเผาซิลิà¸à¸­à¸™ block.phase-weaver.name = เครื่องทอใยเฟส block.pulverizer.name = เครื่องบด @@ -1055,7 +1082,7 @@ block.surge-tower.name = เสาเสิร์จ block.diode.name = ไดโอดà¹à¸šà¸•เตอรี่ block.battery.name = à¹à¸šà¸•เตอรี่ block.battery-large.name = à¹à¸šà¸•เตอรี่ขนาดใหà¸à¹ˆ -block.combustion-generator.name = เครื่องà¸à¸³à¹€à¸™à¸´à¸”ไฟฟ้าโดยà¸à¸²à¸£à¸ªà¸±à¸™à¸”าป +block.combustion-generator.name = เครื่องà¸à¸³à¹€à¸™à¸´à¸”ไฟฟ้าเผาไหม้ถ่าน block.steam-generator.name = เครื่องà¸à¸³à¹€à¸™à¸´à¸”ไฟฟ้าไอน้ำ block.differential-generator.name = เครื่องà¸à¸³à¹€à¸™à¸´à¸”ไฟฟ้าดิฟเฟอเร่นเตอร์ block.impact-reactor.name = เตาปà¸à¸´à¸à¸£à¸“์อัดà¸à¸£à¸°à¹à¸—ภ@@ -1075,6 +1102,7 @@ block.power-source.name = จุดà¸à¸³à¹€à¸™à¸´à¸”พลังงาน block.unloader.name = ตัวถ่ายไอเทม block.vault.name = ตู้นิรภัย block.wave.name = เวฟ +block.tsunami.name = สึนามิ block.swarmer.name = สวอร์มเมอร์ block.salvo.name = ซัลโว block.ripple.name = ริปเปิล @@ -1114,37 +1142,39 @@ block.arc.name = อาร์ค block.rtg-generator.name = เครื่องà¸à¸³à¹€à¸™à¸´à¸”ไฟฟ้า RTG block.spectre.name = สเปคเตอร์ block.meltdown.name = เมลท์ดาวน์ +block.foreshadow.name = ฟอร์ชาโดว์ block.container.name = ตู้เà¸à¹‡à¸šà¸‚อง block.launch-pad.name = à¸à¸²à¸™à¸ªà¹ˆà¸‡à¸‚อง block.launch-pad-large.name = à¸à¸²à¸™à¸ªà¹ˆà¸‡à¸‚องขนาดใหà¸à¹ˆ -block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor +block.segment.name = เซ็à¸à¹€à¸¡à¸™à¸•์ +block.command-center.name = ศูนย์ควบคุม +block.ground-factory.name = โรงงานภาคพื้นดิน +block.air-factory.name = โรงงานภาคอาà¸à¸²à¸¨ +block.naval-factory.name = โรงงานทางน้ำ +block.additive-reconstructor.name = Reconstructor à¹à¸šà¸šà¸šà¸§à¸ +block.multiplicative-reconstructor.name = Reconstructor à¹à¸šà¸šà¸„ูณ +block.exponential-reconstructor.name = Reconstructor à¹à¸šà¸šà¹€à¸­à¹‡à¸à¹‚พเนนเชียว block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.payload-conveyor.name = สายพาน Mass +block.payload-router.name = ตัวเปลี่ยเส้นทาง Payload +block.disassembler.name = ตัวชำà¹à¸«à¸¥à¸° +block.silicon-crucible.name = เบ้าหลอมซิลิคอน +block.overdrive-dome.name = โดม Overdrive -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = สวิชต์ +block.micro-processor.name = ตัวประมวลผล Micro +block.logic-processor.name = ตัวประมวลผล Logic +block.hyper-processor.name = ตัวประมวลผล Hyper +block.logic-display.name = ตัวà¹à¸ªà¸”ง Logic +block.large-logic-display.name = ตัวà¹à¸ªà¸”ง Logic ขนาดใหà¸à¹ˆ +block.memory-cell.name = เซลล์ความจำ +block.memory-bank.name = Memory Bank team.blue.name = น้ำเงิน team.crux.name = à¹à¸”ง team.sharded.name = ส้ม team.orange.name = ส้ม -team.derelict.name = derelict +team.derelict.name = ไม่มี team.green.name = เขียว team.purple.name = ม่วง @@ -1208,12 +1238,12 @@ block.spore-press.description = อัดà¸à¸£à¸°à¹€à¸›à¸²à¸°à¸ªà¸›à¸­à¸£à¹Œà¸” block.pulverizer.description = บดเศษเหล็à¸à¹ƒà¸«à¹‰à¹€à¸›à¹‡à¸™à¸—รายละเอียด. block.coal-centrifuge.description = ทำให้น้ำมันà¹à¸‚็งตัวเป็นà¸à¹‰à¸­à¸™à¸–่านหิน. block.incinerator.description = ทำลายไอเท็มหรือของเหลวทุà¸à¸­à¸¢à¹ˆà¸²à¸‡à¸—ี่ได้รับมา. -block.power-void.description = ทิ้งพลังงานทั้งหมดที่ได้รับ. เฉพาะ Sandbox เท่านั้น. -block.power-source.description = ส่งออà¸à¸žà¸¥à¸±à¸‡à¸‡à¸²à¸™à¹„ม่จำà¸à¸±à¸”. เฉพาะ Sandbox เท่านั้น. -block.item-source.description = ส่งออà¸à¹„อเท็มไม่จำà¸à¸±à¸”. เฉพาะ Sandbox เท่านั้น. -block.item-void.description = ทำลายทุà¸à¹„อเท็ม . เฉพาะ Sandbox เท่านั้น. -block.liquid-source.description = ส่งออà¸à¸‚องเหลวไม่จำà¸à¸±à¸”. เฉพาะ Sandbox เท่านั้น. -block.liquid-void.description = Removes any liquids. Sandbox only. +block.power-void.description = ทิ้งพลังงานทั้งหมดที่ได้รับ. เฉพาะ โหมดอิสระ เท่านั้น. +block.power-source.description = ส่งออà¸à¸žà¸¥à¸±à¸‡à¸‡à¸²à¸™à¹„ม่จำà¸à¸±à¸”. เฉพาะ โหมดอิสระ เท่านั้น. +block.item-source.description = ส่งออà¸à¹„อเท็มไม่จำà¸à¸±à¸”. เฉพาะ โหมดอิสระ เท่านั้น. +block.item-void.description = ทำลายทุà¸à¹„อเท็ม . เฉพาะ โหมดอิสระ เท่านั้น. +block.liquid-source.description = ส่งออà¸à¸‚องเหลวไม่จำà¸à¸±à¸”. เฉพาะ โหมดอิสระ เท่านั้น. +block.liquid-void.description = ทิ้งของเหลวทุà¸à¸Šà¸™à¸´à¸”. เฉพาะ โหมดอิสระ เท่านั้น. block.copper-wall.description = บล็อคป้องà¸à¸±à¸™à¸£à¸²à¸„าถูà¸.\nมีประโยชน์สำหรับป้องà¸à¸±à¸™ core à¹à¸¥à¸°à¸›à¹‰à¸­à¸¡à¸›à¸·à¸™à¹ƒà¸™ wave à¹à¸£à¸à¹†. block.copper-wall-large.description = บล็อคป้องà¸à¸±à¸™à¸£à¸²à¸„าถูà¸.\nมีประโยชน์สำหรับป้องà¸à¸±à¸™ core à¹à¸¥à¸°à¸›à¹‰à¸­à¸¡à¸›à¸·à¸™à¹ƒà¸™ wave à¹à¸£à¸à¹†.\nคลอบคลุมหลายข่อง. block.titanium-wall.description = บล็อคป้องà¸à¸±à¸™à¹à¸‚็งà¹à¸à¸£à¹ˆà¸‡à¸›à¸²à¸™à¸à¸¥à¸²à¸‡.\nป้องà¸à¸±à¸™à¸¨à¸±à¸•รูได้ในระดับหนึ่ง. @@ -1222,8 +1252,8 @@ block.plastanium-wall.description = à¸à¸³à¹à¸žà¸‡à¸žà¸´à¹€à¸¨à¸©à¸—ี่ส block.plastanium-wall-large.description = à¸à¸³à¹à¸žà¸‡à¸žà¸´à¹€à¸¨à¸©à¸—ี่สามารถดูดซับไฟฟ้าà¹à¸¥à¸°à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸à¸²à¸£à¸•่อไฟà¸à¸±à¸šà¹‚หนดพลังงานโดยอัตโนมัติได้.\nคลอบคลุมหลายช่อง. block.thorium-wall.description = บล็อคป้องà¸à¸±à¸™à¸—ี่à¹à¸‚็งà¹à¸£à¸‡.\nป้องà¸à¸±à¸™à¸¨à¸±à¸•รูได้อย่างดี. block.thorium-wall-large.description = บล็อคป้องà¸à¸±à¸™à¸—ี่à¹à¸‚็งà¹à¸£à¸‡.\nป้องà¸à¸±à¸™à¸¨à¸±à¸•รูได้อย่างดี.\nคลอบคลุมหลายช่อง. -block.phase-wall.description = 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.\nคลอบคลุมหลายช่อง. +block.phase-wall.description = à¸à¸³à¹à¸žà¸‡à¸—ี่เคลือบด้วยวัสดุสะท้อนพิเศษจำพวภphase. เบี่ยงเบนà¸à¸£à¸°à¸ªà¸¸à¸™à¸ªà¹ˆà¸§à¸™à¹ƒà¸«à¸à¹ˆà¸—ี่รับมา. +block.phase-wall-large.description = à¸à¸³à¹à¸žà¸‡à¸—ี่เคลือบด้วยวัสดุสะท้อนพิเศษจำพวภphase. เบี่ยงเบนà¸à¸£à¸°à¸ªà¸¸à¸™à¸ªà¹ˆà¸§à¸™à¹ƒà¸«à¸à¹ˆà¸—ี่รับมา.\nคลอบคลุมหลายช่อง. block.surge-wall.description = บล็อคป้องà¸à¸±à¸™à¸—ี่มีทนทานสูง.\nสะสมพลังงานจาà¸à¸à¸£à¸°à¸ªà¸¸à¸™, à¹à¸¥à¹‰à¸§à¸›à¸¥à¹ˆà¸­à¸¢à¸­à¸­à¸à¸¡à¸²à¹à¸šà¸šà¸ªà¸¸à¹ˆà¸¡. block.surge-wall-large.description = บล็อคป้องà¸à¸±à¸™à¸—ี่มีทนทานสูง.\nสะสมพลังงานจาà¸à¸à¸£à¸°à¸ªà¸¸à¸™, à¹à¸¥à¹‰à¸§à¸›à¸¥à¹ˆà¸­à¸¢à¸­à¸­à¸à¸¡à¸²à¹à¸šà¸šà¸ªà¸¸à¹ˆà¸¡.\nคลอบคลุมหลายช่อง. block.door.description = ประตูขนาดเล็à¸. สามารถเปิดได้โดยà¸à¸²à¸£à¸à¸”. @@ -1235,7 +1265,7 @@ block.force-projector.description = สร้างสนามพลังง block.shock-mine.description = ดาเมจศัตรูที่เหยียบ. à¹à¸–บจะล่องหนต่อศัตรู. block.conveyor.description = บล็อคขนส่งไอเท็มพื้นà¸à¸²à¸™. เคลื่อนไอเท็มไปข้างหน้าà¹à¸¥à¸°à¹ƒà¸ªà¹ˆà¸¥à¸‡à¸šà¸¥à¹‡à¸­à¸„โดยอัตโนมัติ. สามารถหมุนได้. block.titanium-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. เคลื่อนไอเท็มเร็วà¸à¸§à¹ˆà¸²à¸ªà¸²à¸¢à¸žà¸²à¸™à¸—ั่วไป. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. +block.plastanium-conveyor.description = เคลื่อนย้ายไอเท็มเป็นชุด.\nรับไอดท็มจาà¸à¸”้านหลัง, à¹à¸¥à¸°à¸™à¸³à¸­à¸­à¸à¹„ปสามทางข้างหน้า. block.junction.description = มีหน้าที่เป็นสะพานสำหรับสายพาน 2 สายข้ามà¸à¸±à¸™. มีประโยชน์สำหรับเวลาสายพาน 2 สายที่ขนไอเท็มมา 2 ชนิดไปยัง 2 สถานที่. block.bridge-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ทำให้สามารถส่งไอเท็มข้ามบล็อคใดà¸à¹‡à¹„ด้ 3 ช่อง. block.phase-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ใช้พลังงานเพื่อส่งไอเท็มไปยังสายพานเฟสอีà¸à¸­à¸±à¸™ ข้ามได้หลายช่อง. @@ -1244,14 +1274,14 @@ block.inverted-sorter.description = à¹à¸¢à¸à¹„อเท็มคล้าย block.router.description = รับไอเท็มà¹à¸¥à¹‰à¸§à¸ªà¹ˆà¸‡à¸­à¸­à¸ 3 ทางเท่าๆà¸à¸±à¸™. มีประโยชน์สำหรับà¹à¸¢à¸à¹„อเท็มจาà¸à¹à¸«à¸¥à¹ˆà¸‡à¹€à¸”ียวไปหลายที่.\n\n[scarlet]อย่าวางไว้ติดà¸à¸±à¸šà¸—างส่งไอเท็มเข้าเพราะของออà¸à¸ˆà¸°à¹„ปอุดตันได้.[] block.distributor.description = เร้าเตอร์ขั้นสูง. à¹à¸¢à¸à¹„อเท็มออภ7 ทางอย่างเท่าๆà¸à¸±à¸™. block.overflow-gate.description = ของจะออà¸à¸ˆà¸²à¸à¸‚้างๆเมื่อทางข้างหน้ถูà¸à¸šà¸¥à¹‡à¸­à¸„เท่านั้น. -block.underflow-gate.description = The opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. +block.underflow-gate.description = ตรงข้ามà¸à¸±à¸šà¸›à¸£à¸°à¸•ูระบายไอเท็ม. ส่งออà¸à¹„อเท็มไปข้างหน้าหาà¸à¸—างซ้ายà¹à¸¥à¸°à¸‚วาถูà¸à¸šà¸¥à¹‡à¸­à¸„. block.mass-driver.description = บล็อคขนส่งไอเท็มขั้นสุดยอด. รวบรวมไอเท็มจำนวนหนึ่งà¹à¸¥à¹‰à¸§à¸¢à¸´à¸‡à¹„ปหาà¹à¸¡à¸ªà¹„ดรเวอร์อีà¸à¸­à¸±à¸™à¸—ี่อยู่ไà¸à¸¥à¸­à¸­à¸à¹„ป. ต้องใช้พลังงานในà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™. block.mechanical-pump.description = ปั๊มราคาถูภเอ้าพุธต์ช้า à¹à¸•่ไม่ใช้พลังงาน. block.rotary-pump.description = ปั๊มขั้นสูง. ปั๊มของเหลวได้มาà¸à¸‚ึ้นà¹à¸„่ใช้พลังงาน. block.thermal-pump.description = ปั๊มขั้นสุดยอด. block.conduit.description = บล็อคขนส่งของเหลวพื้นà¸à¸²à¸™. เคลื่อนของเหลวไปข้างหน้า. ใช้ร่วมà¸à¸±à¸šà¸›à¸±à¹Šà¸¡à¹à¸¥à¸°à¸£à¸²à¸‡à¸™à¹‰à¸³à¸­à¸·à¹ˆà¸™à¹†. block.pulse-conduit.description = บล็อคขนส่งของเหลวขั้นสูง. เคลื่อนย้ายของเหลวเร็วขึ้นà¹à¸¥à¸°à¹€à¸à¹‡à¸šà¹€à¸¢à¸­à¸°à¸à¸§à¹ˆà¸²à¸£à¸²à¸‡à¸™à¹‰à¸³à¸˜à¸£à¸£à¸¡à¸”า. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. +block.plated-conduit.description = เคลื่อนย้ายของเหลวได้เร็วพอๆà¸à¸±à¸š ท่อน้ำพัลซ์, à¹à¸•่มีเà¸à¸£à¸²à¸°à¸—ี่หนาà¸à¸§à¹ˆà¸². ไม่รับของเหลวจาà¸à¸”้านข้างจาà¸à¸­à¸¢à¹ˆà¸²à¸‡à¸­à¸·à¹ˆà¸™à¸™à¸­à¸à¸ˆà¸²à¸à¸—่อน้ำด้วยà¸à¸±à¸™à¹€à¸­à¸‡.\nรั่วน้อยà¸à¸§à¹ˆà¸². block.liquid-router.description = รับของเหลวจาà¸à¸—างเดียวà¹à¸¥à¹‰à¸§à¸ªà¹ˆà¸‡à¸­à¸­à¸ 3 ทางเท่าๆà¸à¸±à¸™. สามารถเà¸à¹‡à¸šà¸‚อง้หลวได้จำนวนหนึ่ง. มีประโยชน์สำหรับà¸à¸²à¸£à¹à¸¢à¸à¸‚องเหลวจาà¸à¹à¸«à¸¥à¹ˆà¸‡à¹€à¸”ียวไปหลายที่. block.liquid-tank.description = เà¸à¹‡à¸šà¸‚องเหลวจำนวนมาà¸. ใช่สำหรับสร้างบัฟเฟอร์ในเวลาที่ความต้องà¸à¸²à¸£à¸‚องทรัพยาà¸à¸£à¹„ม่คงที่หรือเป็นตัวเซฟสำหรับบล็อคที่จำเป็นต้องใช้à¸à¸²à¸£à¸«à¸¥à¹ˆà¸­à¹€à¸¢à¹‡à¸™. block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับรางน้ำ 2 รางที่ข้ามà¸à¸±à¸™à¸—ี่มีของเหลว 2 ชนิด ซึ่งต้องà¸à¸²à¸£à¸ˆà¸°à¹„ปคนละที่. @@ -1302,4 +1332,4 @@ block.cyclone.description = ป้อมปืนต่อต้านอาภblock.spectre.description = ปืนใหà¸à¹ˆà¸¥à¸³à¸à¸¥à¹‰à¸­à¸‡à¸„ูขนาดยัà¸à¸©à¹Œ. ยิงà¸à¸£à¸°à¸ªà¸¸à¸™à¹€à¸ˆà¸²à¸°à¹€à¸à¸£à¸²à¸°à¹ƒà¸ªà¹ˆà¸¨à¸±à¸•รูทั้งบนอาà¸à¸²à¸¨à¹à¸¥à¸°à¸ à¸²à¸”พื้นดิน. block.meltdown.description = ปืนใหà¸à¹ˆà¹€à¸¥à¹€à¸‹à¸­à¸£à¹Œà¸‚นาดยัà¸à¸©à¹Œ. ชาร์จà¹à¸¥à¹‰à¸§à¸¢à¸´à¸‡à¸¥à¸³à¹à¸ªà¸‡à¹€à¸¥à¹€à¸‹à¸­à¸£à¹Œà¹ƒà¸ªà¹ˆà¸¨à¸±à¸•รูที่อยู่ใà¸à¸¥à¹‰. จำเป็นต้องใช้สารหล่อเย็น. block.repair-point.description = ซ่อมà¹à¸‹à¸¡à¸¢à¸¹à¸™à¸´à¸•ที่อยู่ในรัศมีอย่างต่อเนื่อง. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = ทำดาเมจà¹à¸¥à¸°à¸—ำลายโปรเจà¸à¹„ตล์ที่à¸à¸³à¸¥à¸±à¸‡à¹€à¸‚้ามา. โปรเจà¸à¹„ตล์เลเซอร์จะไม่ถูà¸à¸¥à¹‡à¸­à¸„เป้าด้วยบล็อคนี้. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index edfae05b29..8b9f3a97aa 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -55,6 +55,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} @@ -100,7 +101,6 @@ done = Done feature.unsupported = Your device does not support this feature. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) mods = Mods mods.none = [lightgray]No mods found! mods.guide = Modding Guide @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Dalga {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = Dalganin baslamasina: {0} wave.waveInProgress = [lightgray]Wave in progress waiting = Bekleniyor... waiting.players = Waiting for players... wave.enemies = [lightgray]{0} Enemies Remaining wave.enemy = [lightgray]{0} Enemy Remaining +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Resimden Yukle saveimage = Resimi kaydet unknown = Bilinmeyen @@ -328,6 +331,7 @@ editor.generation = Generation: editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map +editor.center = Center workshop = Workshop waves.title = Waves waves.remove = Remove @@ -416,6 +420,7 @@ filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise filter.enemyspawn = Enemy Spawn Select +filter.spawnpath = Path To Spawn filter.corespawn = Core Select filter.median = Median filter.oremedian = Ore Median @@ -440,6 +445,7 @@ filter.option.amount = Amount filter.option.block = Block filter.option.floor = Floor filter.option.flooronto = Target Floor +filter.option.target = Target filter.option.wall = Wall filter.option.ore = Ore filter.option.floor2 = Secondary Floor @@ -471,15 +477,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best: {0} -launch = Launch launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +research.multiplayer = Only the host can research items. uncover = Uncover configure = Configure Loadout loadout = Loadout @@ -512,6 +512,7 @@ weather.rain.name = Rain weather.snow.name = Snow weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm +weather.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: @@ -521,6 +522,11 @@ sectors.resume = Resume sectors.launch = Launch sectors.select = Select sectors.nonelaunch = [lightgray]none (sun) +sectors.rename = Rename Sector +sector.missingresources = [scarlet]Insufficient Core Resources + +planet.serpulo.name = Serpulo +planet.sun.name = Sun sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -560,6 +566,10 @@ settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done 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.clearsaves.confirm = Are you sure you want to clear all your saves? settings.clearsaves = Clear Saves +settings.clearresearch = Clear Research +settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? +settings.clearcampaignsaves = Clear Campaign Saves +settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? paused = Duraklatildi clear = Clear banned = [scarlet]Banned @@ -570,49 +580,74 @@ info.title = [accent]Bilgi error.title = [crimson]Bir hata olustu error.crashtitle = Bir hata olustu unit.nobuild = [scarlet]Unit can't build -blocks.input = Input -blocks.output = Output -blocks.booster = Booster -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Guc kapasitesi -blocks.powershot = Guc/Saldiri hizi -blocks.damage = Damage -blocks.targetsair = Havayi hedef alir mi? -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Menzil -blocks.size = Buyukluk -blocks.displaysize = Display Size -blocks.liquidcapacity = Sivi kapasitesi -blocks.powerrange = Menzil -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = Max Connections -blocks.poweruse = Guc kullanimi -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Esya kapasitesi -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Kazilabilirler -blocks.drillspeed = Ana kazma hizi -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Can -blocks.buildtime = Build Time -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = Build Cost -blocks.inaccuracy = sekme -blocks.shots = vuruslar -blocks.reload = Yeniden doldurma -blocks.ammo = Ammo -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = Input +stat.output = Output +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Guc kapasitesi +stat.powershot = Guc/Saldiri hizi +stat.damage = Damage +stat.targetsair = Havayi hedef alir mi? +stat.targetsground = Targets Ground +stat.itemsmoved = Move Speed +stat.launchtime = Time Between Launches +stat.shootrange = Menzil +stat.size = Buyukluk +stat.displaysize = Display Size +stat.liquidcapacity = Sivi kapasitesi +stat.powerrange = Menzil +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Guc kullanimi +stat.powerdamage = Power/Damage +stat.itemcapacity = Esya kapasitesi +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Base Power Generation +stat.productiontime = Production Time +stat.repairtime = Block Full Repair Time +stat.speedincrease = Speed Increase +stat.range = Range +stat.drilltier = Kazilabilirler +stat.drillspeed = Ana kazma hizi +stat.boosteffect = Boost Effect +stat.maxunits = Max Active Units +stat.health = Can +stat.buildtime = Build Time +stat.maxconsecutive = Max Consecutive +stat.buildcost = Build Cost +stat.inaccuracy = sekme +stat.shots = vuruslar +stat.reload = Yeniden doldurma +stat.ammo = Ammo +stat.shieldhealth = Shield Health +stat.cooldowntime = Cooldown Time +stat.explosiveness = Explosiveness +stat.basedeflectchance = Base Deflect Chance +stat.lightningchance = Lightning Chance +stat.lightningdamage = Lightning Damage +stat.flammability = Flammability +stat.radioactivity = Radioactivity +stat.heatcapacity = HeatCapacity +stat.viscosity = Viscosity +stat.temperature = Temperature +stat.speed = Speed +stat.buildspeed = Build Speed +stat.minespeed = Mine Speed +stat.minetier = Mine Tier +stat.payloadcapacity = Payload Capacity +stat.commandlimit = Command Limit +stat.abilities = Abilities + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -624,6 +659,7 @@ bar.powerbalance = Power: {0} bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Build Progress bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] dmg bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -642,12 +680,15 @@ bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x reload unit.blocks = Yapilar +unit.blockssquared = blocks² unit.powersecond = saniyede bir unit.liquidsecond = Saniyede bir unit.itemssecond = Saniyede bir @@ -670,7 +711,7 @@ category.power = Guc category.liquids = sivilar category.items = esyalar category.crafting = uretim -category.shooting = sikma +category.function = Function category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows @@ -679,7 +720,6 @@ setting.linear.name = Linear Filtering setting.hints.name = Hints setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) setting.buildautopause.name = Auto-Pause Building -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -691,7 +731,7 @@ setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Max FPS setting.fpscap.none = Yok setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.uiscale.name = UI Scaling[lightgray] (requires restart)[] setting.swapdiagonal.name = Always Diagonal Placement setting.difficulty.training = training setting.difficulty.easy = kolay @@ -713,7 +753,6 @@ setting.fullscreen.name = Tam ekran setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = FPS'i goster setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate [lightgray](may decrease performance) setting.minimap.name = Haritayi goster @@ -822,6 +861,7 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -847,6 +887,7 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light @@ -858,6 +899,7 @@ content.item.name = Esyalar content.liquid.name = Sivilar content.unit.name = Units content.block.name = Blocks + item.copper.name = Bakir item.lead.name = Kursun item.coal.name = Komur @@ -879,23 +921,6 @@ liquid.slag.name = Slag liquid.oil.name = Benzin liquid.cryofluid.name = kriyo sivisi -item.explosiveness = [lightgray]Patlayicilik: {0} -item.flammability = [lightgray]Yanbilirlik: {0} -item.radioactivity = [lightgray]Radyoaktivite: {0} - -unit.health = [lightgray]Can: {0} -unit.speed = [lightgray]hiz: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]isinma kapasitesi: {0} -liquid.viscosity = [lightgray]Yari sivilik: {0} -liquid.temperature = [lightgray]isi: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -936,6 +961,7 @@ block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag +block.space.name = Space block.salt.name = Salt block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -981,6 +1007,7 @@ block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1075,6 +1102,7 @@ block.power-source.name = sonsuz guc block.unloader.name = bekletici block.vault.name = kasa block.wave.name = Dalga +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1114,6 +1142,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1139,6 +1168,7 @@ block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blue team.crux.name = red diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 1fd6a6618e..bfe05a9828 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -20,8 +20,8 @@ gameover = Kaybettin gameover.pvp = [accent] {0}[] Takımı kazandı! highscore = [accent]Yeni rekor! copied = Panoya Kopyalandı. -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.popup = [accent]v6[] ÅŸu anda [accent]beta aÅŸamasındadır[].\n[lightgray]Bu demektir ki:[]\n[scarlet]- Mücadele modu tamamlanmamıştır[]\n- Müzik ve ses efektleri tamamlanmamıştır veya eksiktir\n- Gördüğün her ÅŸey deÄŸiÅŸime ya da kaldırılmaya açıktır.\n\nHataları ve çökmeleri [accent]Github[]'da bildir. +indev.notready = Oyunun bu kısmı henüz hazır deÄŸil. load.sound = Sesler load.map = Haritalar @@ -38,23 +38,30 @@ be.ignore = Hayır be.noupdates = Yeni güncelleme bulunamadı. be.check = Güncellemeleri kontrol et +mod.featured.title = Mod Tarayıcısı +mod.featured.dialog.title = Mod Tarayıcısı +mods.browser.selected = Seçilen Mod +mods.browser.add = Modu İndir +mods.github.open = Modun GitHub Sayfasını Aç + schematic = Åžema schematic.add = Åžemayı Kaydet... schematics = Åžemalar schematic.replace = Aynı isimde bir ÅŸema zaten var. Üzerine yazılsın mı? -schematic.exists = A schematic by that name already exists. +schematic.exists = Aynı isimde bir ÅŸema zaten var. schematic.import = Åžema İçeri Aktar... schematic.exportfile = Dışa Aktar schematic.importfile = İçe Aktar -schematic.browseworkshop = Workshop'u incele +schematic.browseworkshop = Atölyeyi incele schematic.copy = Panoya Kopyala schematic.copy.import = Panodan İçeri Aktar -schematic.shareworkshop = Workshop'ta Kaydet +schematic.shareworkshop = Atölyede Kaydet schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Åžemayı döndür schematic.saved = Åžema Kaydedildi. schematic.delete.confirm = Bu ÅŸema tamamen yok edilecek. schematic.rename = Åžemayı yeniden adlandır schematic.info = {0}x{1}, {2} blok +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Yenilen Dalgalar:[accent] {0} stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0} @@ -62,10 +69,10 @@ stat.built = İnÅŸa Edilen Yapılar:[accent] {0} stat.destroyed = Yok Edilen Yapılar:[accent] {0} stat.deconstructed = Yıkılan Yapılar:[accent] {0} stat.delivered = Gönderilen Kaynaklar: -stat.playtime = Time Played:[accent] {0} +stat.playtime = Oynama Süresi:[accent] {0} stat.rank = Rütbe: [accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]Toplanan Kaynaklar map.delete = "[accent]{0}[]" haritasını silmek istediÄŸine emin misin? level.highscore = Rekor: [accent]{0} level.select = Seviye Seçimi @@ -82,7 +89,7 @@ none = minimap = Harita position = Pozisyon close = Kapat -website = Website +website = Web sitesi quit = Çık save.quit = Kaydet & Çık maps = Haritalar @@ -100,22 +107,21 @@ done = Bitti feature.unsupported = Cihazınızda bu özellik desteklenmemektedir. mods.alphainfo = Modların alfa aÅŸamasında olduÄŸunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduÄŸunuz sorunları Mindustry GitHub'ı veya Discord'una bildirin. -mods.alpha = [accent](Alpha) mods = Modlar mods.none = [lightgray]Hiç mod bulunamadı! mods.guide = Mod Rehberi mods.report = Hata bildir mods.openfolder = Mod klasörünü aç -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. +mods.reload = Yeniden Yükle +mods.reloadexit = Modları yeniden yüklemek için oyun kapanacak. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Etkin mod.disabled = [scarlet]Devre Dışı mod.disable = Devre Dışı Bırak -mod.content = Content: +mod.content = İçerik: mod.delete.error = Mod silinemiyor. Dosya kullanımda olabilir. -mod.requiresversion = [scarlet]Gereken en düşük oun versiyonu: [accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.requiresversion = [scarlet]Gereken en düşük oyun versiyonu: [accent]{0} +mod.outdated = [scarlet]V6 ile uyumlu deÄŸil (minGameVersion: 105 yok) mod.missingdependencies = [scarlet]Bu modun çalışması için gereken modlar: {0} mod.erroredcontent = [scarlet]İçerik hatası. mod.errors = İçerik yüklenirken bir hata oluÅŸtu. @@ -125,9 +131,9 @@ mod.enable = EtkinleÅŸtir mod.requiresrestart = Oyun mod deÄŸiÅŸikliklerini uygulamak için kapatılacak. mod.reloadrequired = [scarlet]Yeniden Yükleme Gerekli mod.import = Mod İçeri Aktar -mod.import.file = Import File +mod.import.file = Dosya İçeri Aktar mod.import.github = GitHub Modu İçeri Aktar -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]Jar modları doÄŸası gereÄŸi güvenli deÄŸildir.[]\nBu modu güvenilir bir kaynaktan içeri aktardığına emin ol! mod.item.remove = Bu eÅŸya[accent] '{0}'[] modunun bir parçası. Kaldırmak için modu silebilirsiniz. mod.remove.confirm = Bu mod silinecek. mod.author = [lightgray]Yayıncı:[] {0} @@ -139,8 +145,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Hakkında name = İsim: noname = Bir[accent] kullanıcı adı[] seçmelisin. -planetmap = Planet Map -launchcore = Launch Core +planetmap = Gezegen Haritası +launchcore = Kalkış filename = Dosya Adı: unlocked = Yeni içerik açıldı! completed = [accent]Tamamlandı @@ -148,11 +154,11 @@ techtree = Teknoloji AÄŸacı research.list = [lightgray]AraÅŸtırmalar: research = AraÅŸtır researched = [lightgray]{0} AraÅŸtırıldı. -research.progress = {0}% complete +research.progress = %{0} tamamlandı players = {0} çevrimiçi oyuncu players.single = {0} çevrimiçi oyuncu -players.search = search -players.notfound = [gray]no players found +players.search = ara +players.notfound = [gray]hiç oyuncu bulunamadı server.closing = [accent]Sunucu kapatılıyor... server.kicked.kick = Sunucudan atıldın! server.kicked.whitelist = Beyaz listede deÄŸilsin. @@ -185,9 +191,9 @@ server.refreshing = Sunucu yenileniyor hosts.none = [lightgray]Yerel oyun bulunamadı! host.invalid = [scarlet]Kurucuya baÄŸlanılamıyor. -servers.local = Local Servers -servers.remote = Remote Servers -servers.global = Community Servers +servers.local = Yerel Sunucular +servers.remote = Uzak Sunucular +servers.global = Topluluk Sunucuları trace = Oyuncuyu Takip Et trace.playername = Oyuncu İsmi: [accent]{0} @@ -234,22 +240,22 @@ save.none = Kayıt bulunamadı! savefail = Oyun kaydedilemedi! save.delete.confirm = Bu kaydı silmek istediÄŸine emin misin? save.delete = Sil -save.export = Kayıdı Dışa Aktar +save.export = Kaydı Dışa Aktar save.import.invalid = [accent]Bu kayıt geçersiz! save.import.fail = [crimson]Kayıt içe aktarılamadı: [accent]{0} save.export.fail = [crimson]Kayıt dışa aktarılamadı: [accent]{0} -save.import = Kayıdı İçe Aktar +save.import = Kaydı İçe Aktar save.newslot = İsmi kaydet: save.rename = Yeniden isimlendir save.rename.text = Yeni isim: selectslot = Bir kayıt seçin. -slot = [accent]Slot {0} +slot = [accent]Yuva {0} editmessage = Mesajı Düzenle save.corrupted = [accent]Kayıt dosyası bozuk veya geçersiz! empty = on = Aç off = Kapa -save.autosave = Otomatk kayıt: {0} +save.autosave = Otomatik kayıt: {0} save.map = Harita: {0} save.wave = Dalga {0} save.mode = Oyun modu: {0} @@ -269,27 +275,30 @@ copylink = BaÄŸlantıyı Kopyala back = Geri data.export = Veriyi Dışa Aktar data.import = Veriyi İçe Aktar -data.openfolder = Open Data Folder +data.openfolder = Veri Klasörü Aç data.exported = Veri dışa aktarıldı. data.invalid = Bu oyun verisi geçerli deÄŸil. data.import.confirm = Dışarıdan içeri veri aktarmak ÅŸu anki verilerinizin [scarlet]tamamını[] silecektir.[accent]Bu iÅŸlem geri alınamaz![]\n\nVeri içeri aktarıldığında oyundan çıkacaksınız. quit.confirm = Çıkmak istediÄŸinize emin misiniz? -quit.confirm.tutorial = Ne yaptığınıza emin misiniz?\nÖğreticiyi [accent] Ayarlar->Oyun->Öğreticiyi Yeniden Al'dan[] tekrar yapabilirsiniz. +quit.confirm.tutorial = Ne yaptığınıza emin misiniz?\nÖğreticiyi [accent] Ayarlar -> Oyun -> Öğreticiyi Yeniden Al[]'dan tekrar yapabilirsiniz. loading = [accent]Yükleniyor... reloading = [accent]Modlar Yeniden Yükleniyor... saving = [accent]Kayıt ediliyor... -respawn = [accent][[{0}][] to respawn in core -cancelbuilding = Planı temizlemek için [accent][[{0}][] -selectschematic = Seçmek ve kopyalamak için [accent][[{0}][] -pausebuilding = İnÅŸaatı durdurmak için [accent][[{0}][] -resumebuilding = İnÅŸaata devam etmek için [scarlet][[{0}][] +respawn = [accent][[{0}][] Çekirdekte yeniden doÄŸ +cancelbuilding = [accent][[{0}][] Planı temizle +selectschematic = [accent][[{0}][] Seç ve kopyala +pausebuilding = [accent][[{0}][] İnÅŸaatı durdur +resumebuilding = [scarlet][[{0}][] İnÅŸaata devam et wave = [accent]Dalga {0} +wave.cap = [accent]Dalga {0}/{1} wave.waiting = [lightgray]{0} saniye içinde dalga baÅŸlayacak wave.waveInProgress = [lightgray]Dalga gerçekleÅŸiyor waiting = [lightgray]Bekleniliyor... waiting.players = Oyuncular bekleniliyor... wave.enemies = [lightgray]{0} Tane Düşman Kaldı wave.enemy = [lightgray]{0} Tane Düşman Kaldı +wave.guardianwarn = [accent]{0}[] dalga sonra gardiyan yaklaşıyor. +wave.guardianwarn.one = [accent]{0}[] dalga sonra gardiyan yaklaşıyor. loadimage = Resim Aç saveimage = Resim Kaydet unknown = Bilinmeyen @@ -307,7 +316,7 @@ map.publish.confirm = Bu haritayı yayınlamak istediÄŸinize emin misiniz?\n[lig workshop.menu = Bu eÅŸya ile ne yapmak istediÄŸinizi seçin. workshop.info = EÅŸya açıklaması changelog = DeÄŸiÅŸim Listesi (isteÄŸe baÄŸlı): -eula = Steam Kullanıvı SözleÅŸmesi +eula = Steam Kullanıcı SözleÅŸmesi missing = Bu eÅŸya silinmiÅŸ veya taşınmış.\n[lightgray]Workshop listesinden kaldırıldı. publishing = [accent]Yayınlanıyor... publish.confirm = Bunu yayınlamak istediÄŸinize emin misiniz?\n[lightgray]önce Atölye SözleÅŸmesine uyduÄŸunuza emin olun, yoksa yapıtlarınız gözükmeyecektir! @@ -328,6 +337,7 @@ editor.generation = OluÅŸum: editor.ingame = Oyun içinde düzenle editor.publish.workshop = Atölyede Yayınla editor.newmap = Yeni Harita +editor.center = Ortala workshop = Atölye waves.title = Dalgalar waves.remove = Kaldır @@ -335,9 +345,9 @@ waves.never = waves.every = her waves.waves = dalga(lar) waves.perspawn = doÄŸma noktası başına -waves.shields = shields/wave +waves.shields = kalkan/dalga waves.to = doÄŸru -waves.guardian = Guardian +waves.guardian = Gardiyan waves.preview = Önizleme waves.edit = Düzenle... waves.copy = Panodan kopyala @@ -346,9 +356,9 @@ waves.invalid = Panoda geçersiz dalga sayısı var. waves.copied = Dalgalar kopyalandı. waves.none = Düşman bulunamadı.\nBoÅŸ dalga düzenlerin otomatik olarak varsayılan düzenle deÄŸiÅŸtirileceÄŸini unutmayın -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +wavemode.counts = miktarlar +wavemode.totals = toplamlar +wavemode.health = can editor.default = [lightgray] details = Detaylar... @@ -401,7 +411,7 @@ toolmode.replace = DeÄŸiÅŸtir toolmode.replace.description = Sadece katı blokların üzerinde çizer. toolmode.replaceall = Hepsini DeÄŸiÅŸtir toolmode.replaceall.description = Haritadaki bütün blokları deÄŸiÅŸtirir. -toolmode.orthogonal = Dik +toolmode.orthogonal = Çizgi toolmode.orthogonal.description = Sadece dik çizgiler çizer. toolmode.square = Kare toolmode.square.description = Kare fırça. @@ -415,8 +425,9 @@ toolmode.drawteams.description = Bloklar yerine takımları çizer.. filters.empty = [lightgray]Hiç filtre yok! AÅŸağıdaki butonla bir adet ekleyin. filter.distort = Çarpıt filter.noise = Gürültü -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = Düşman DoÄŸma Alanı Seçimi +filter.spawnpath = DoÄŸma Noktasına Yol +filter.corespawn = Çekirdek Seçimi filter.median = Medyan filter.oremedian = Maden Medyanı filter.blend = GeçiÅŸ @@ -436,10 +447,11 @@ filter.option.circle-scale = Daire Ölçek filter.option.octaves = Oktavlar filter.option.falloff = Düşüş filter.option.angle = Açı -filter.option.amount = Amount +filter.option.amount = Miktar filter.option.block = Blok filter.option.floor = Zemin filter.option.flooronto = Hedef Zemin +filter.option.target = Target filter.option.wall = Duvar filter.option.ore = Maden filter.option.floor2 = İkincil Duvar @@ -451,7 +463,7 @@ width = Eni: height = Boyu: menu = Menü play = Oyna -campaign = BaÅŸla +campaign = Mücadele load = Yükle save = Kaydet fps = FPS: {0} @@ -469,24 +481,18 @@ locked = Kilitli complete = [lightgray]UlaÅŸ: requirement.wave = Bölge {1}'de Dalga {0} requirement.core = {0}`da Düşman ÇekirdeÄŸi Yok Et -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Bölgeye Devam Et:\n[lightgray]{0} +requirement.research = {0} araÅŸtır +requirement.capture = {0} sektörünü ele geçir bestwave = [lightgray]En İyi Dalga: {0} -launch = < KALKIÅž > -launch.text = Launch -launch.title = Kalkış BaÅŸarılı -launch.next = [lightgray]Bir sonraki imkan {0}. dalgada olacak. -launch.unable2 = [scarlet]KALKIÅž mümkün deÄŸil.[] -launch.confirm = Bu iÅŸlem çekirdeÄŸinizdeki bütün kaynakları yollayacak.\nBu üsse geri dönemeyeceksiniz. -launch.skip.confirm = EÄŸer ÅŸimdi geçerseniz, +launch.text = Kalkış +research.multiplayer = Sadece kurucu araÅŸtırma yapabilir. uncover = Aç configure = Ekipmanı Yapılandır -loadout = Loadout -resources = Resources +loadout = Yükleme +resources = Kaynaklar bannedblocks = Yasaklı Bloklar addall = Hepsini Ekle -launch.destination = Destination: {0} +launch.destination = Varış Yeri: {0} configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. zone.unlocked = [lightgray]{0} kilidi açıldı. zone.requirement.complete = {0}. dalgaya ulaşıldı:\n{1} bölge ÅŸartları karşılandı. @@ -498,7 +504,7 @@ add = Ekle... boss.health = Boss Canı connectfail = [crimson]BaÄŸlantı hatası:\n\n[accent]{0} -error.unreachable = Sunucuya ulaşılamıyor.\nAdrwsin doÄŸru yazıldığına emin misiniz? +error.unreachable = Sunucuya ulaşılamıyor.\nAdresin doÄŸru yazıldığına emin misiniz? error.invalidaddress = Geçersiz adres. error.timedout = Zaman aşımı!\nSunucunun port yönlendirmeyi ayarladığına ve adresin doÄŸru olduÄŸuna emin olun! error.mismatch = Paket hatası:\nSunucu ve alıcı arasında versiyon uyuÅŸmazlığı ihtimali var.\nHem sizde hem de sunucuda Mindustry'nin en son sürümü yüklü olduÄŸuna emin olun! @@ -508,43 +514,49 @@ error.io = AÄŸ I/O hatası. error.any = Bilinmeyen aÄŸ hatası. error.bloom = KamaÅŸma baÅŸlatılamadı.\nCihazınız bu özelliÄŸi desteklemiyor olabilir. -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = YaÄŸmur +weather.snow.name = Kar +weather.sandstorm.name = Kum Fırtınası +weather.sporestorm.name = Spor YaÄŸmuru +weather.fog.name = Sis -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]KeÅŸfedilmemiÅŸ +sectors.resources = Kaynaklar: +sectors.production = Üretim: +sectors.stored = Depolanan: +sectors.resume = Devam Et +sectors.launch = Kalkış +sectors.select = Seç +sectors.nonelaunch = [lightgray]yok (güneÅŸ) +sectors.rename = Sektörü Yeniden Adlandır +sector.missingresources = [scarlet]Yetersiz Çekirdek Kaynakları -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +planet.serpulo.name = Serpulo +planet.sun.name = GüneÅŸ -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +sector.groundZero.name = Sıfır Noktası +sector.craters.name = Kraterler +sector.frozenForest.name = DonmuÅŸ Orman +sector.ruinousShores.name = Harap Kıyılar +sector.stainedMountains.name = Lekeli DaÄŸlar +sector.desolateRift.name = Issız Aralık +sector.nuclearComplex.name = Kompleks Nükleer Üretimi +sector.overgrowth.name = Fazla Büyüme +sector.tarFields.name = Katran Alanları +sector.saltFlats.name = Tuz Düzlükleri +sector.fungalPass.name = Mantar Geçidi + +sector.groundZero.description = Yeniden baÅŸlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduÄŸunca çok bakır ve kurÅŸun topla.\nİlerle. +sector.frozenForest.description = Burada, daÄŸlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soÄŸuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya baÅŸla. Termik jeneratörler inÅŸa et. Tamircileri kullanmayı öğren. +sector.saltFlats.description = Çölün kenar kısımlarında tuz düzlükleri uzanır. Bu konumda az miktarda kaynak bulunur.\n\nDüşman burada kompleks bir kaynak depolama sistemi inÅŸa etti. Çekirdeklerini yok et. Ayakta hiçbir ÅŸey bırakma. +sector.craters.description = Eski savaÅŸların bir anıtı olan bu kratere su dolmuÅŸ. Alanı yeniden ele geçir. Kum topla ve metacam üret. Taret ve matkapları soÄŸutmak için su pompala. +sector.ruinousShores.description = Yıkıntıların ardında bir kıyı var. Bir zamanlar bu konum bir dizi kıyı defansına ev sahipliÄŸi yapmış. Geriye pek bir ÅŸey kalmamış. Sadece en temel savunma yapıları zarar görmeden kaldı, onun dışındaki her ÅŸey hurdaya geri dönüştü.\nDışa doÄŸru geniÅŸletmeye devam et. Teknolojiyi yeniden keÅŸfet. +sector.stainedMountains.description = Daha uzaklarda daÄŸlar uzanıyor, daha sporlar tarafından istilaya uÄŸramamışlar.\nAlandaki serbest titanyumu çıkart ve kullanmasını öğren.\n\nDüşman varlığı burada daha fazla. Onların daha güçlü birimlerini göndermelerine izin verme. +sector.overgrowth.description = Bu alan aşırı büyümüştür, sporların kaynağına daha yakındır.\nDüşman burada bir merkez kurdu. Titan birlikleri inÅŸa et. Onu yok et. Kaybedileni geri al. +sector.tarFields.description = Bir petrol üretim bölgesinin eteklerinde, daÄŸların ve çölün arasındadır. Birkaç kullanılabilir katran rezervlerinden biri. \nTerk edilmiÅŸ olmasına raÄŸmen, bu alan yakınlarda bazı tehlikeli düşman güçlerine sahip. Onları küçümseme.\n\n[lightgray]Mümkünse petrol üretme teknolojisini araÅŸtır. +sector.desolateRift.description = Aşırı tehlikeli bir bölge. Bol kaynaklar, ama az yer mevcut. Yüksek yıkım riski. Mümkün olduÄŸunca çabuk ayrılmaya çalış. Düşman saldırıları arasındaki uzun mesafeye aldanma. +sector.nuclearComplex.description = Toryum üretimi ve iÅŸlenmesi için eski bir tesistir, harabeye dönüşmüştür.\n[lightgray]Toryumu ve onun birçok kullanımını araÅŸtır. \n\nDüşman burada çok sayıda mevcut ve sürekli saldırganları arıyorlar. +sector.fungalPass.description = Yüksek daÄŸlar ve daha alçak, sporla dolu topraklar arasında bir geçiÅŸ alanıdır. Burada küçük bir düşman keÅŸif üssü bulunuyor.\nOnu yok et.\nDagger ve Crawler birlikleri kullan. İki çekirdeÄŸi çıkar. settings.language = Dil settings.data = Oyun Verisi @@ -557,97 +569,132 @@ settings.sound = Ses settings.graphics = Grafikler settings.cleardata = Oyun Verisini Sil... settings.clear.confirm = Verileri silmek istediÄŸinizden emin misiniz?\nBu iÅŸlemi geri alamazsınız! -settings.clearall.confirm = [scarlet]Uyarı![]\nBu iÅŸlem kayıtlar, haritalar açılan bloklar ve tuÅŸ atamaları dahil bütün verileri silecektir.\n"ok" tuÅŸuna bastığınızda bütün verileriniz silinecek ve oyun kapanacaktır. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearall.confirm = [scarlet]Uyarı![]\nBu iÅŸlem kayıtlar, haritalar açılan bloklar ve tuÅŸ atamaları dahil bütün verileri silecektir.\n"Tamam" tuÅŸuna bastığınızda bütün verileriniz silinecek ve oyun kapanacaktır. +settings.clearsaves.confirm = Tüm kayıtlarınızı silmek istediÄŸinizden emin misiniz? +settings.clearsaves = Kayıtları Sil +settings.clearresearch = AraÅŸtırma Verisini Sil +settings.clearresearch.confirm = Mücadele modundaki yaptığınız tüm araÅŸtırmaları sıfırlamak istediÄŸinize emin misiniz? +settings.clearcampaignsaves = Mücadele Kayıt Verisini Sil +settings.clearcampaignsaves.confirm = Mücadele modundaki oynadığınız tüm sektörleri sıfırlamak istediÄŸinize emin misiniz? paused = [accent] clear = Temizle banned = [scarlet]Yasaklı -unplaceable.sectorcaptured = [scarlet]Requires captured sector +unplaceable.sectorcaptured = [scarlet]Ele geçirilmiÅŸ sektör gerekir yes = Evet no = Hayır info.title = Bilgi error.title = [crimson]Bir hata oldu error.crashtitle = Bir hata oldu -unit.nobuild = [scarlet]Unit can't build -blocks.input = GiriÅŸ -blocks.output = Çıkış -blocks.booster = Güçlendirici -blocks.tiles = Required Tiles -blocks.affinities = Affinities +unit.nobuild = [scarlet]Birlik inÅŸa edemiyor +lastaccessed = [lightgray]Son EriÅŸme: {0} block.unknown = [lightgray]??? -blocks.powercapacity = Enerji Kapasitesi -blocks.powershot = Enerji/Atış -blocks.damage = Hasar -blocks.targetsair = Havayı Hedefler Mi -blocks.targetsground = Yeri Hedefler Mi -blocks.itemsmoved = Hareket Hızı -blocks.launchtime = Fırlatmalar Arasındaki Süre -blocks.shootrange = Menzil -blocks.size = Boyut -blocks.displaysize = Display Size -blocks.liquidcapacity = Sıvı Kapasitesi -blocks.powerrange = Enerji Menzili -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = BaÄŸlantı sayısı -blocks.poweruse = Enerji Kullanımı -blocks.powerdamage = Enerji/Hasar -blocks.itemcapacity = EÅŸya Kapasitesi -blocks.basepowergeneration = Temel Enerji Üretimi -blocks.productiontime = Üretim Süresi -blocks.repairtime = Tamir Tamir Edilme Süresi -blocks.speedincrease = Hız Artışı -blocks.range = Menzil -blocks.drilltier = Kazılabilenler -blocks.drillspeed = Temel Matkap Hızı -blocks.boosteffect = Hızlandırma Efekti -blocks.maxunits = Maksimum Aktif Birim -blocks.health = Can -blocks.buildtime = İnÅŸaat Süresi -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = İnÅŸaat Fiyatı -blocks.inaccuracy = İskalama Oranı -blocks.shots = Atışlar -blocks.reload = Atışlar/Sn -blocks.ammo = Mermi -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.input = GiriÅŸ +stat.output = Çıkış +stat.booster = Güçlendirici +stat.tiles = Gereken Kare +stat.affinities = Yakınlıklar +stat.powercapacity = Enerji Kapasitesi +stat.powershot = Enerji/Atış +stat.damage = Hasar +stat.targetsair = Havayı Hedefler Mi +stat.targetsground = Yeri Hedefler Mi +stat.itemsmoved = Hareket Hızı +stat.launchtime = Fırlatmalar Arasındaki Süre +stat.shootrange = Menzil +stat.size = Boyut +stat.displaysize = Gösterim Boyutu +stat.liquidcapacity = Sıvı Kapasitesi +stat.powerrange = Enerji Menzili +stat.linkrange = BaÄŸlantı Menzili +stat.instructions = Talimatlar +stat.powerconnections = BaÄŸlantı Sayısı +stat.poweruse = Enerji Kullanımı +stat.powerdamage = Enerji/Hasar +stat.itemcapacity = EÅŸya Kapasitesi +stat.memorycapacity = Bellek Kapasitesi +stat.basepowergeneration = Temel Enerji Üretimi +stat.productiontime = Üretim Süresi +stat.repairtime = Tamir Tamir Edilme Süresi +stat.speedincrease = Hız Artışı +stat.range = Menzil +stat.drilltier = Kazılabilenler +stat.drillspeed = Temel Matkap Hızı +stat.boosteffect = Hızlandırma Efekti +stat.maxunits = Maksimum Aktif Birim +stat.health = Can +stat.buildtime = İnÅŸaat Süresi +stat.maxconsecutive = Art Arda En Fazla +stat.buildcost = İnÅŸaat Fiyatı +stat.inaccuracy = İskalama Oranı +stat.shots = Atışlar +stat.reload = Atışlar/Sn +stat.ammo = Mermi +stat.shieldhealth = Kalkan Canı +stat.cooldowntime = SoÄŸuma Süresi +stat.explosiveness = Patlayıcılık +stat.basedeflectchance = Mermi Sekme Åžansı +stat.lightningchance = Yıldırım Çarpma Åžansı +stat.lightningdamage = Yıldırım Hasarı +stat.flammability = Yanıcılık +stat.radioactivity = Radyoaktivite +stat.heatcapacity = Isı Kapasitesi +stat.viscosity = Viskosite +stat.temperature = Sıcaklık +stat.speed = Hız +stat.buildspeed = İnÅŸa Hızı +stat.minespeed = Kazı Hızı +stat.minetier = Kazı Seviyesi +stat.payloadcapacity = Yük Kapasitesi +stat.commandlimit = Komut Limiti +stat.abilities = Kabiliyetler + +ability.forcefield = Güç Kalkanı +ability.repairfield = Onarma Alanı +ability.statusfield = Hızlandırma Alanı +ability.unitspawn = {0} BirliÄŸi Fabrikası +ability.shieldregenfield = Kalkan Yenileme Alanı bar.drilltierreq = Daha İyi Matkap Gerekli -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Eksik Kaynaklar +bar.corereq = Çekirdek Tabanı Gerekli bar.drillspeed = Matkap Hızı: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = Pompa Hızı: {0}/s bar.efficiency = Verim: {0}% bar.powerbalance = Enerji: {0}/sn bar.powerstored = Depolanan: {0}/{1} bar.poweramount = Enerji: {0} bar.poweroutput = Enerji Üretimi: {0} +bar.powerlines = BaÄŸlantılar: {0}/{1} bar.items = EÅŸyalar: {0} bar.capacity = Kapasite: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[birlik engellendi] bar.liquid = Sıvı bar.heat = Isı bar.power = Enerji -bar.progress = Build Progress +bar.progress = İnÅŸa İlerlemesi bar.input = Girdi bar.output = Çıktı -bullet.damage = [stat]{0}[lightgray] hasar -bullet.splashdamage = [stat]{0}[lightgray] alan hasarı ~[stat] {1}[lightgray] kare +units.processorcontrol = [lightgray]İşlemci Kontrolünde + +bullet.damage = [stat]{0} [lightgray]hasar +bullet.splashdamage = [stat]{0} [lightgray]alan hasarı ~[stat] {1} [lightgray]kare bullet.incendiary = [stat]yakıcı bullet.homing = [stat]güdümlü bullet.shock = [stat]ÅŸoklayıcı bullet.frag = [stat]parça tesirli -bullet.knockback = [stat]{0}[lightgray] savurma +bullet.knockback = [stat]{0} [lightgray]savurma +bullet.pierce = [stat]{0}[lightgray]x delme +bullet.infinitepierce = [stat]delme bullet.freezing = [stat]dondurucu bullet.tarred = [stat]katranlı bullet.multiplier = [stat]{0}[lightgray]x mermi çarpanı bullet.reload = [stat]{0}[lightgray]x atış hızı -unit.blocks = bloklar +unit.blocks = blok +unit.blockssquared = blok² unit.powersecond = enerji birimi/saniye unit.liquidsecond = sıvı birimi/saniye unit.itemssecond = eÅŸya/saniye @@ -655,12 +702,12 @@ unit.liquidunits = sıvı birimi unit.powerunits = enerji birimi unit.degrees = derece unit.seconds = saniye -unit.minutes = mins +unit.minutes = dakika unit.persecond = /sn -unit.perminute = /min +unit.perminute = /dk unit.timesspeed = x hız unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = kalkan canı unit.items = eÅŸya unit.thousands = k unit.millions = mil @@ -670,20 +717,19 @@ category.power = Enerji category.liquids = Sıvılar category.items = EÅŸyalar category.crafting = Üretim -category.shooting = Silahlar +category.function = Fonksiyon category.optional = İsteÄŸe BaÄŸlı GeliÅŸtirmeler setting.landscape.name = Yatayda sabitle setting.shadows.name = Gölgeler setting.blockreplace.name = Otomatik Blok önerileri setting.linear.name = Lineer Filtreleme setting.hints.name = İpuçları -setting.flow.name = Display Resource Flow Rate[scarlet] (experimental) +setting.flow.name = Kaynak GeçiÅŸ Hızını Göster[scarlet] (deneysel) setting.buildautopause.name = İnÅŸa etmeyi otomatik olarak durdur -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animasyonlu Su setting.animatedshields.name = Animasyonlu Kalkanlar -setting.antialias.name = DüzgÄŸnleÅŸtirme[lightgray] (yeniden açmak gerekebilir)[] -setting.playerindicators.name = Player Indicators +setting.antialias.name = DüzgünleÅŸtirme [lightgray](yeniden baÅŸlatma gerekebilir)[] +setting.playerindicators.name = Oyuncu Belirteçleri setting.indicators.name = Düşman/Müttefik Belirteçleri setting.autotarget.name = Otomatik Hedef Alma setting.keyboard.name = Fare+Klavye Kontrolleri @@ -691,7 +737,7 @@ setting.touchscreen.name = Dokunmatik Ekran Kontrolleri setting.fpscap.name = Maksimum FPS setting.fpscap.none = Limitsiz setting.fpscap.text = {0} FPS -setting.uiscale.name = UI ÖlçeÄŸi[lightgray] (yeniden açmak gerekebilir)[] +setting.uiscale.name = Arayüz ÖlçeÄŸi [lightgray](yeniden baÅŸlatma gerekebilir)[] setting.swapdiagonal.name = Her Zaman Çapraz YerleÅŸtirme setting.difficulty.training = EÄŸitim setting.difficulty.easy = Kolay @@ -702,25 +748,24 @@ setting.difficulty.name = Zorluk: setting.screenshake.name = Ekranı Salla setting.effects.name = Efektleri Görüntüle setting.destroyedblocks.name = Kırılmış Blokları Göster -setting.blockstatus.name = Display Block Status +setting.blockstatus.name = Blok Durumunu Göster setting.conveyorpathfinding.name = Konveyör Yol Bulma setting.sensitivity.name = Kontrolcü Hassasiyeti setting.saveinterval.name = Kayıt Aralığı setting.seconds = {0} Saniye -setting.blockselecttimeout.name = Block Select Timeout +setting.blockselecttimeout.name = Blok Seçme Zaman Aşımı setting.milliseconds = {0} milisaniye setting.fullscreen.name = Tam Ekran -setting.borderlesswindow.name = Kenarsız Pencere[lightgray] (yeniden açmak gerekebilir) +setting.borderlesswindow.name = Kenarsız Pencere [lightgray](yeniden açmak gerekebilir) setting.fps.name = FPS Göster -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = Blok seçim tüşlarını göster +setting.smoothcamera.name = YumuÅŸak GeçiÅŸli Kamera setting.vsync.name = VSync -setting.pixelate.name = PixelleÅŸtir[lightgray] (animasyonları kapatır) +setting.pixelate.name = PixelleÅŸtir [lightgray](animasyonları kapatır) setting.minimap.name = Haritayı Göster -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Çekirdekteki EÅŸyaları Göster [lightgray](üzerinde çalışılıyor) setting.position.name = Oyuncu Noktasını Göster setting.musicvol.name = Müzik -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = Gezegen Atmosferini Göster setting.ambientvol.name = Çevresel Ses setting.mutemusic.name = MüziÄŸi Kapat setting.sfxvol.name = Oyun Sesi @@ -728,14 +773,14 @@ setting.mutesound.name = Sesi Kapat setting.crashreport.name = Anonim Çökme Raporları Gönder setting.savecreate.name = Otomatik Kayıt OluÅŸtur setting.publichost.name = Halka Açık Oyunlar -setting.playerlimit.name = Player Limit +setting.playerlimit.name = Oyuncu Limiti setting.chatopacity.name = MesajlaÅŸma Opaklığı setting.lasersopacity.name = Enerji Lazeri Opaklığı -setting.bridgeopacity.name = Bridge Opacity +setting.bridgeopacity.name = Köprü Opaklığı setting.playerchat.name = Oyun-içi KonuÅŸmayı Göster public.confirm = Oyununuzu halka açık yapmak ister misiniz?\n[accent]Oyunlarınıza herkes katılabilecektir.\n[lightgray]Bu seçenek daha sonra Ayarlar->Oyun->Halka Açık Oyunlar'dan deÄŸiÅŸtirilebilir. public.beta = Oyunun beta sürümlerinin halka açık lobiler yapamayacağını unutmayın. -uiscale.reset = UI ölçeÄŸi deÄŸiÅŸtirildi.\nBu ölçeÄŸi onaylamak için "OK" butonuna basın.\n[accent] {0}[] [scarlet]saniye içinde eski ayarlara geri dönülüp oyundan çıkılıyor…[] +uiscale.reset = Arayüz ölçeÄŸi deÄŸiÅŸtirildi.\nBu ölçeÄŸi onaylamak için "Tamam" butonuna basın.\n[accent] {0}[] [scarlet]saniye içinde eski ayarlara geri dönülüp oyundan çıkılıyor…[] uiscale.cancel = İptal Et ve Çık setting.bloom.name = KamaÅŸma keybind.title = TuÅŸları Yeniden Ata @@ -743,25 +788,25 @@ keybinds.mobile = [scarlet]Buradaki çoÄŸu tuÅŸ ataması mobilde geçerli deÄŸil category.general.name = Genel category.view.name = Görünüm category.multiplayer.name = Çok Oyunculu -category.blocks.name = Block Select +category.blocks.name = Blok Seçimi command.attack = Saldır command.rally = Toplan command.retreat = Geri Çekil -command.idle = Idle +command.idle = BoÅŸta placement.blockselectkeys = \n[lightgray]TuÅŸ: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit +keybind.respawn.name = Yeniden DoÄŸ +keybind.control.name = BirliÄŸi Kontrol Et keybind.clear_building.name = Binayı Temizle keybind.press = Bir tuÅŸa basın... keybind.press.axis = Bir tuÅŸa ya da yöne basın... keybind.screenshot.name = Harita Ekran Görüntüsü -keybind.toggle_power_lines.name = Enerji lazerlerini aç/kapa -keybind.toggle_block_status.name = Toggle Block Statuses +keybind.toggle_power_lines.name = Enerji Lazerlerini Aç/Kapa +keybind.toggle_block_status.name = Blok İstatistiklerini Aç/Kapa keybind.move_x.name = x Ekseninde Hareket keybind.move_y.name = y Ekseninde Hareket keybind.mouse_move.name = Fareyi Takip Et -keybind.pan.name = Pan View -keybind.boost.name = Boost +keybind.pan.name = Yatay Kaydırma Görünümü +keybind.boost.name = Yükselt keybind.schematic_select.name = Bölge Seç keybind.schematic_menu.name = Åžema Menüsü keybind.schematic_flip_x.name = Åžemayı X ekseninde Döndür @@ -788,15 +833,15 @@ keybind.diagonal_placement.name = Çapraz YerleÅŸtirme keybind.pick.name = Blok Seç keybind.break_block.name = Blok Kır keybind.deselect.name = Seçimleri Kaldır -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = Kargoyu Al +keybind.dropCargo.name = Kargoyu Bırak +keybind.command.name = Komut keybind.shoot.name = AteÅŸ Et keybind.zoom.name = YakınlaÅŸtırma/UzaklaÅŸtırma keybind.menu.name = Menü keybind.pause.name = Durdur keybind.pause_building.name = İnÅŸaatı Duraklat/İnÅŸaata Devam Et -keybind.minimap.name = Mini Harita +keybind.minimap.name = Harita keybind.chat.name = KonuÅŸ keybind.player_list.name = Oyuncu Listesi keybind.console.name = Konsol @@ -807,7 +852,7 @@ keybind.chat_history_prev.name = Sohbet geçmiÅŸi önceki keybind.chat_history_next.name = Sohbet geçmiÅŸi sonraki keybind.chat_scroll.name = Sohbet Kaydırma keybind.drop_unit.name = Birlik Düşürme -keybind.zoom_minimap.name = Mini Haritada YakınlaÅŸtırma/UzaklaÅŸtırma +keybind.zoom_minimap.name = Haritada YakınlaÅŸtırma/UzaklaÅŸtırma mode.help.title = Modların açıklamaları mode.survival.name = Hayatta Kalma mode.survival.description = Normal oyun oyun modu. Kaynak sınırlı ve dalgalar otomatik olarak gönderilir.\n[gray]Oynamak için haritada düşman doÄŸma noktaları olması gerekir. @@ -822,42 +867,45 @@ mode.custom = Özel Kurallar rules.infiniteresources = Sınırsız Kaynaklar rules.reactorexplosions = Reaktör Patlamaları +rules.schematic = Schematics Allowed rules.wavetimer = Dalga Zamanlayıcısı rules.waves = Dalgalar rules.attack = Saldırı Modu -rules.buildai = AI Building +rules.buildai = Yapay Zeka İnÅŸası rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.blockhealthmultiplier = Blok Canı Çarpanı -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = Blok Hasarı Çarpanı rules.unitbuildspeedmultiplier = Birim Üretim Hızı Çarpanı rules.unithealthmultiplier = Birim Canı Çarpanı rules.unitdamagemultiplier = Birim Hasarı Çapanı -rules.enemycorebuildradius = Düşman ÇekirdeÄŸi İnÅŸa Yasağı Yarıçapı:[lightgray] (kare) -rules.wavespacing = Dalga Aralığı:[lightgray] (sec) -rules.buildcostmultiplier = İnÅŸa ücreti Çarpanı +rules.enemycorebuildradius = Düşman ÇekirdeÄŸi İnÅŸa Yasağı Yarıçapı: [lightgray](kare) +rules.wavespacing = Dalga Aralığı: [lightgray](sn) +rules.buildcostmultiplier = İnÅŸa Ücreti Çarpanı rules.buildspeedmultiplier = İnÅŸa Hızı Çarpanı -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier +rules.deconstructrefundmultiplier = Yıkım İade Çarpanı rules.waitForWaveToEnd = Dalgalar Düşmanı Bekler -rules.dropzoneradius = İniÅŸ Noktası Yarıçapı:[lightgray] (kare) -rules.unitammo = Units Require Ammo +rules.dropzoneradius = İniÅŸ Noktası Yarıçapı: [lightgray](kare) +rules.unitammo = Birlikler Mermi Gerektiriyor rules.title.waves = Dalgalar rules.title.resourcesbuilding = Kaynaklar & İnÅŸa rules.title.enemy = Düşmanlar rules.title.unit = Birlikler rules.title.experimental = Deneysel -rules.title.environment = Environment +rules.title.environment = Çevre rules.lighting = Işıklandırma -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Enemy Lights +rules.fire = AteÅŸ +rules.explosions = Blok/Birlik Patlama Hasarı rules.ambientlight = Ortam Işığı -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Hava +rules.weather.frequency = Sıklık: +rules.weather.duration = Süreklilik: content.item.name = EÅŸyalar content.liquid.name = Sıvılar content.unit.name = Birimler content.block.name = Bloklar + item.copper.name = Bakır item.lead.name = KurÅŸun item.coal.name = Kömür @@ -879,23 +927,6 @@ liquid.slag.name = Cüruf liquid.oil.name = Petrol liquid.cryofluid.name = Kriyosıvı -item.explosiveness = [lightgray]Patlama: {0}% -item.flammability = [lightgray]Yanıcılık: {0}% -item.radioactivity = [lightgray]Radyoaktivite: {0}% - -unit.health = [lightgray]Can: {0} -unit.speed = [lightgray]Hız: {0} -unit.weapon = [lightgray]Weapon: {0} -unit.itemcapacity = [lightgray]Item Capacity: {0} -unit.minespeed = [lightgray]Mining Speed: {0}% -unit.minepower = [lightgray]Mining Power: {0} -unit.ability = [lightgray]Ability: {0} -unit.buildspeed = [lightgray]Building Speed: {0}% - -liquid.heatcapacity = [lightgray]Isı Kapasitesi: {0} -liquid.viscosity = [lightgray]Vizkosite: {0} -liquid.temperature = [lightgray]Sıcaklık: {0} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -932,26 +963,27 @@ unit.corvus.name = Corvus block.resupply-point.name = Resupply Point block.parallax.name = Parallax -block.cliff.name = Cliff -block.sand-boulder.name = Kum Kaya Parçaları +block.cliff.name = Uçurum +block.sand-boulder.name = Kumlu Kaya Parçaları block.grass.name = Çimen -block.slag.name = Slag +block.slag.name = Cüruf +block.space.name = Uzay block.salt.name = Tuz -block.salt-wall.name = Salt Wall +block.salt-wall.name = Tuz Duvar block.pebbles.name = Çakıl TaÅŸları block.tendrils.name = Tendriller -block.sand-wall.name = Sand Wall +block.sand-wall.name = Kum Duvar block.spore-pine.name = Spor Çamı -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = Spor Duvar +block.boulder.name = Kaya Parçaları +block.snow-boulder.name = Karlı Kaya PArçaları block.snow-pine.name = Karlı Çam block.shale.name = Åžist block.shale-boulder.name = Åžist Kayası block.moss.name = Yosun block.shrubs.name = Çalılık -block.spore-moss.name = Liken -block.shale-wall.name = Shale Wall +block.spore-moss.name = Spor Yosunu +block.shale-wall.name = Åžist Duvar block.scrap-wall.name = Hurda Duvar block.scrap-wall-large.name = Büyük Hurda Duvar block.scrap-wall-huge.name = Dev Hurda Duvar @@ -979,17 +1011,18 @@ block.craters.name = Krater block.sand-water.name = Kumlu Su block.darksand-water.name = Kara Kumlu Su block.char.name = Kömür -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = Dakit +block.dacite-wall.name = Dakit Duvar +block.dacite-boulder.name = Dakit Kaya Parçaları block.ice-snow.name = Buzlu Kar -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = TaÅŸ Duvar +block.ice-wall.name = Buz Duvar +block.snow-wall.name = Kar Duvar +block.dune-wall.name = Kara Kum Duvar block.pine.name = Çam -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = Toprak +block.dirt-wall.name = Toprak Duvar +block.mud.name = Çamur block.white-tree-dead.name = Ölü Beyaz AÄŸaç block.white-tree.name = Beyaz AÄŸaç block.spore-cluster.name = Spor Kümesi @@ -1005,15 +1038,15 @@ block.dark-panel-4.name = Kara Panel 4 block.dark-panel-5.name = Kara Panel 5 block.dark-panel-6.name = Kara Panel 6 block.dark-metal.name = Kara Metal -block.basalt.name = Basalt +block.basalt.name = Bazalt block.hotrock.name = Sıcak Kaya block.magmarock.name = Magma Kayası block.copper-wall.name = Bakır Duvar block.copper-wall-large.name = Büyük Bakır Duvar block.titanium-wall.name = Titanyum Duvar block.titanium-wall-large.name = Büyük Titanyum Duvar -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.plastanium-wall.name = Plastanyum Duvar +block.plastanium-wall-large.name = Büyük Plastanyum Duvar block.phase-wall.name = Faz Duvar block.phase-wall-large.name = Büyük Faz Duvar block.thorium-wall.name = Toryum Duvar @@ -1027,7 +1060,7 @@ block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Konveyör block.titanium-conveyor.name = Titanyum Konveyör -block.plastanium-conveyor.name = Plastanium Conveyor +block.plastanium-conveyor.name = Plastanyum Konveyör block.armored-conveyor.name = Zırhlı Konveyör block.armored-conveyor.description = Materyalleri titanyum konveyörlerle aynı hızda taşır ama daha fazla zırha sahiptir. DiÄŸer konveyörler dışında yan taraflardan materyal kabul etmez. block.junction.name = KavÅŸak @@ -1036,10 +1069,10 @@ block.distributor.name = Dağıtıcı block.sorter.name = Ayıklayıcı block.inverted-sorter.name = Ters Ayıklayıcı block.message.name = Mesaj -block.illuminator.name = Illuminator -block.illuminator.description = A small, compact, configurable light source. Requires power to function. -block.overflow-gate.name = TaÅŸma Geçiti -block.underflow-gate.name = Underflow Gate +block.illuminator.name = Aydınlatıcı +block.illuminator.description = Küçük, kompakt, yapılandırılabilir bir ışık kaynağı. Çalışması için enerji gerekir. +block.overflow-gate.name = TaÅŸma Geçidi +block.underflow-gate.name = Yana TaÅŸma Geçidi block.silicon-smelter.name = Silikon Fırını block.phase-weaver.name = Faz Örücü block.pulverizer.name = Pulverizatör @@ -1052,7 +1085,7 @@ block.coal-centrifuge.name = Kömür Santrifüjü block.power-node.name = Enerji Noktası block.power-node-large.name = Büyük Enerji Noktası block.surge-tower.name = Akı Kulesi -block.diode.name = Battery Diode +block.diode.name = Batarya Diyotu block.battery.name = Batarya block.battery-large.name = Büyük Batarya block.combustion-generator.name = Termik Jeneratör @@ -1069,12 +1102,13 @@ block.mechanical-pump.name = Mekanik Pompa block.item-source.name = Sonsuz EÅŸya Kaynağı block.item-void.name = EÅŸya Yokedici block.liquid-source.name = Sonsuz Sıvı Kaynağı -block.liquid-void.name = Liquid Void +block.liquid-void.name = Sıvı Yokedici block.power-void.name = Enerji Yokedici block.power-source.name = Sonsuz Enerji Kaynağı block.unloader.name = BoÅŸaltıcı block.vault.name = Depo block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1088,13 +1122,13 @@ block.solar-panel-large.name = Büyük GüneÅŸ Paneli block.oil-extractor.name = Petrol Çıkarıcı block.repair-point.name = Tamir Noktası block.pulse-conduit.name = Dalga Borusu -block.plated-conduit.name = Plated Conduit +block.plated-conduit.name = Kaplı Boru block.phase-conduit.name = Faz Borusu block.liquid-router.name = Sıvı Yönlendiricisi block.liquid-tank.name = Sıvı Tankı block.liquid-junction.name = Sıvı KavÅŸağı block.bridge-conduit.name = Köprülü Boru -block.rotary-pump.name = Rotary Pompa +block.rotary-pump.name = Döner Pompa block.thorium-reactor.name = Toryum Reaktörü block.mass-driver.name = Kütle Sürücüsü block.blast-drill.name = Hava Patlamalı Matkap @@ -1108,49 +1142,51 @@ block.surge-wall-large.name = Büyük Akı Duvarı block.cyclone.name = Cyclone block.fuse.name = Fuse block.shock-mine.name = Åžok Mayını -block.overdrive-projector.name = Aşırı Yükleme Projektörü +block.overdrive-projector.name = Hızlandırma Projektörü block.force-projector.name = Kalkan Projektörü block.arc.name = Arc block.rtg-generator.name = RTG Jeneratörü block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Konteyner block.launch-pad.name = Kalkış Pisti block.launch-pad-large.name = Büyük Kalkış Pisti block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.command-center.name = Komuta Merkezi +block.ground-factory.name = Yer Birimi Fabrikası +block.air-factory.name = Hava Birimi Fabrikası +block.naval-factory.name = Deniz Birimi Fabrikası +block.additive-reconstructor.name = Eklemeli Yeniden Yapılandırıcı +block.multiplicative-reconstructor.name = Çarpmalı Yeniden Yapılandırıcı +block.exponential-reconstructor.name = Üstel Yeniden Yapılandırıcı +block.tetrative-reconstructor.name = Dörtlü Yeniden Yapılandırıcı +block.payload-conveyor.name = Yük Konveyörü +block.payload-router.name = Yük Yönlendirici +block.disassembler.name = Sökücü +block.silicon-crucible.name = Büyük Silikon Fırını +block.overdrive-dome.name = Hızlandırma Kubbesi -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = Düğme +block.micro-processor.name = Mikro İşlemci +block.logic-processor.name = İşlemci +block.hyper-processor.name = Hiper İşlemci +block.logic-display.name = Ekran +block.large-logic-display.name = Büyük Ekran +block.memory-cell.name = Bellek Hücresi +block.memory-bank.name = Bellek Bankası team.blue.name = mavi -team.crux.name = kırmızı -team.sharded.name = turuncu +team.crux.name = öz +team.sharded.name = parçalanmış team.orange.name = turuncu -team.derelict.name = derelict +team.derelict.name = sahipsiz team.green.name = yeÅŸil team.purple.name = mor tutorial.next = [lightgray] tutorial.intro = [scarlet]Mindustry öğreticisine hoÅŸ geldiniz.[]\n[accent]Bakır kazarak[] baÅŸlayın. Bunu yapmak için merkezinize yakın bir bakır madenine dokunun.\n\n[accent]{0}/{1} bakır -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro.mobile = [scarlet]Mindustry öğreticisine hoÅŸ geldiniz.[]\nHareket etmek için ekranı kaydırın.\nYakınlaÅŸtırmak ve uzaklaÅŸtırmak için [accent]iki parmakla kıstırın[].\n[accent]Bakır kazarak[] baÅŸlayın. Bunu yapmak için merkezinize yakın bir bakır madenine dokunun.\n\n[accent]{0}/{1} bakır tutorial.drill = Manuel olarak kazmak verimsizdir.\n[accent]Matkaplar []otomatikman kazabilir.\nSaÄŸ alttaki matkap sekmesine tıklayınız.\n[accent]Mekanik matkabı[] seçiniz. Tıklayarak bir bakır madenine yerleÅŸtirin.\n Yapımı durdurmak için [accent]saÄŸ tıklayın[] ve yakınlaÅŸtırmak ve uzaklaÅŸtırmak için [accent]CTRL basılı tutarak tekerleÄŸi kaydırın[]. tutorial.drill.mobile = Manuel olarak kazmak verimsizdir.\n[accent]Matkaplar []otomatik olarak kazabilir.\nSaÄŸ alttaki matkap sekmesine dokunun.\n[accent]Mekanik matkabı[] seçin. \nDokunarak bir bakır madenine yerleÅŸtirin, sonra seçiminizi onaylamak için alttaki [accent] tik düğmesine[] basın.\nYerleÅŸtirmenizi iptal etmek için [accent] X butonuna[] basın. tutorial.blockinfo = Her bloÄŸun farklı istatistikleri vardır. Her matkap sadece belirli madenleri kazabilir.\nBir bloÄŸun bilgi ve istatistiklerine bakmak için,[accent] yapım menüsünde seçerken "?" tuÅŸuna dokunun.[]\n\n[accent]Åžimdi mekanik matkabın istatistiklerine eriÅŸin.[] @@ -1213,17 +1249,17 @@ block.power-source.description = Sonsuz enerji verir. Sadece Yaratıcı Modda. block.item-source.description = Seçilen eÅŸyadan sonsuz verir. Sadece Yaratıcı Modda. block.item-void.description = Verilen eÅŸyaları yok eder. Sadece Yaratıcı Modda. block.liquid-source.description = Seçilen sıvıyı sonsuz verir. Sadece Yaratıcı Modda. -block.liquid-void.description = Removes any liquids. Sandbox only. +block.liquid-void.description = Verilen sıvıları yok eder. Sadece Yaratıcı Modda. block.copper-wall.description = Ucuz bir savunma bloÄŸu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır. block.copper-wall-large.description = Ucuz bir savunma bloÄŸu.\nİlk birkaç dalgada merkezi ve taretleri korumak için kullanışlıdır.\nBirçok blok alan kaplar. block.titanium-wall.description = Orta derecede güçlü savunma bloÄŸu.\nDüşmanlardan orta derecede koruma saÄŸlar. block.titanium-wall-large.description = Orta derecede güçlü savunma bloÄŸu.\nDüşmanlardan orta derecede koruma saÄŸlar.\nBirçok blok alan kaplar. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Elektrik arklarını emen ve otomatik enerji noktası baÄŸlantılarını engelleyen özel bir duvar türü. +block.plastanium-wall-large.description = Elektrik arklarını emen ve otomatik enerji noktası baÄŸlantılarını engelleyen özel bir duvar türü.\nBirçok blok alan kaplar. block.thorium-wall.description = Güçlü bir savunma bloÄŸu.\nDüşmanlardan iyi korunma saÄŸlar. block.thorium-wall-large.description = Güçlü bir savunma bloÄŸu.\nDüşmanlardan iyi korunma saÄŸlar.\nBirçok blok alan kaplar. -block.phase-wall.description = Özel faz örgüsü bazlı yansıtıcı materyal ile kaplanmış bir duvar. ÇoÄŸu mermi çarpma anında saptırır. -block.phase-wall-large.description = Özel faz bazlı yansıtıcı bileÅŸik ile kaplanmış bir duvar. ÇoÄŸu mermi çarpma anında saptırır.\nBirçok blok alan kaplar. +block.phase-wall.description = Özel faz örgüsü bazlı yansıtıcı materyal ile kaplanmış bir duvar. ÇoÄŸu mermi çarpma anında geri sektirir. +block.phase-wall-large.description = Özel faz bazlı yansıtıcı bileÅŸik ile kaplanmış bir duvar. ÇoÄŸu mermi çarpma anında geri sektirir.\nBirçok blok alan kaplar. block.surge-wall.description = Son derece dayanıklı bir savunma bloÄŸu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır. block.surge-wall-large.description = Son derece dayanıklı bir savunma bloÄŸu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır.\nBirçok blok alan kaplar. block.door.description = Küçük bir kapı. Dokunarak açılabilir veya kapatılabilir. @@ -1235,23 +1271,23 @@ block.force-projector.description = Kendi etrafında altıgen güç alanı oluÅŸ block.shock-mine.description = Mayına basan düşmanlara hasar verir. Düşmana neredeyse görünmezdir. block.conveyor.description = Temel materyal taşıma bloÄŸu. Materyalleri ileri taşır ve onları diÄŸer bloklara otomatik olarak yerleÅŸtirir. Çevrilebilir. block.titanium-conveyor.description = GeliÅŸmiÅŸ materyal taşıma bloÄŸu. Materyalleri standart konveyörlerden daha hızlı taşır. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. -block.junction.description = Çakışan iki konveyör hattı arasında bir köprü görevi görür. İki farklı konveyörÄŸn farklı hedeflere farklı materyalleri taşıdığı durumlarda kullanışlıdır. +block.plastanium-conveyor.description = Materyalleri gruplar halinde taşır.\nArkadan eÅŸyaları kabul eder ve öndeki üç yöne boÅŸaltır. +block.junction.description = Çakışan iki konveyör hattı arasında bir köprü görevi görür. İki farklı konveyörün farklı hedeflere farklı materyalleri taşıdığı durumlarda kullanışlıdır. block.bridge-conveyor.description = GeliÅŸmiÅŸ materyal taşıma bloÄŸu. Materyalleri her türlü arazi veya binanın üzerinden üç bloÄŸa kadar uzaÄŸa taşıyabilir. block.phase-conveyor.description = GeliÅŸmiÅŸ materyal taşıma bloÄŸu. Materyalleri kendisine baÄŸlı bir baÅŸka faz konveyörüne ışınlamak için enerji kullanır. block.sorter.description = Materyalleri ayıklar. EÄŸer materyal seçilen ile eÅŸleÅŸiyorsa geçmesine izin verilir. Yoksa materyal saÄŸa ya da sola atılır. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Materyalleri sıradan bir ayıklayıcı gibi iÅŸler, ancak seçili öğeleri önden deÄŸil yanlardan geçirir. block.router.description = Materyalleri bir yönden alıp diÄŸer üç yöne eÅŸit olarak dağıtır. Materyalleri bir kaynaktan birden fazla hedefe iletmek için kullanılır.\n\n[scarlet]Asla üretim yapan binaların dibine yerleÅŸtirmeyin, yoksa istenmeyen materyaller tarafından tıkanabilir.[] block.distributor.description = GeliÅŸmiÅŸ bir yönlendirici. Materyalleri yedi farklı yöne dağıtabilir. block.overflow-gate.description = Ayırıcı ve yönlendiricinin bir karışımı. Materyalleri sadece ön kısım kapalı olduÄŸunda saÄŸa ve sola atar. -block.underflow-gate.description = The opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. +block.underflow-gate.description = TaÅŸma geçidinin zıttıdır. Sol ve saÄŸ taraf kapalıysa materyalleri ön tarafa atar. block.mass-driver.description = En geliÅŸmiÅŸ materyal taşıma bloÄŸu. bir miktar materyalı alır ve onları uzak mesafedeki bir baÅŸka kütle sürücüsüne ateÅŸler. Çalışması için enerji gerekir. block.mechanical-pump.description = Hiç enerji harcamayan, düşük çıktılı, ucuz bir pompa. block.rotary-pump.description = Daha geliÅŸmiÅŸ bir pompa. Daha fazla sıvı depolar ama çalışması için enerji gerekir. block.thermal-pump.description = En iyi pompa. block.conduit.description = Temel sıvı taşıma bloÄŸu. Sıvıları ileri taşır. Pompalar ve diÄŸer borularla birlikte kullanılır. block.pulse-conduit.description = GeliÅŸmiÅŸ bir sıvı taşıma bloÄŸu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. +block.plated-conduit.description = Sıvıları dalga borusuyla aynı güçte taşır ancak daha fazla zırha sahiptir. Borular dışında baÅŸka bir ÅŸekilde yandan sıvı kabul etmez.\nDaha az sızıntı yapar. block.liquid-router.description = Sıvıları bir yönden alıp diÄŸer üç yöne eÅŸit olarak dağıtır. Ayrıca kendisi de bir miktar sıvı depolayabilir. Sıvıları bir kaynaktan birden fazla hedefe iletmek için kullanılır. block.liquid-tank.description = Çok miktarda sıvıyı depolar. İhtiyaçları devamlı olmayan sıvıları yedek olarak saklamakta ya da önemli blokların devamlı olarak soÄŸutulmasında kullanılabilir. block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır. @@ -1260,7 +1296,7 @@ block.phase-conduit.description = GeliÅŸmiÅŸ sıvı taşıma bloÄŸu. Sıvıları block.power-node.description = BaÄŸlı düğümlere enerji saÄŸlar. Ayrıca dibindeki bloklardan da enerji alıp onlara enerji verebilir. block.power-node-large.description = Daha fazla menzil ve baÄŸlantıya sahip daha geliÅŸmiÅŸ bir güç düğümü block.surge-tower.description = Daha az baÄŸlantı sayısına sahip oldukça uzun menzilli bir güç düğümü. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. +block.diode.description = Pil gücü, bu bloktan yalnızca diÄŸer tarafta daha az güç depolandığında sadece tek bir yöne akabilir. block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açığında sakladığı enerjiyi salar. block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar. block.combustion-generator.description = Kömür gibi yanıcı materyalleri yakarak enerji üretir. @@ -1302,4 +1338,4 @@ block.cyclone.description = Büyük bir anti hava ve anti kara tareti. Yakının block.spectre.description = Dev bir çift namlulu top. Hava ve kara birimlerine iri, zırh delici mermiler atar. block.meltdown.description = Dev bir lazer topu. Yüklenip yakındaki düşmanlara uzun süreli lazer ışınları yollar. Çalışması için soÄŸutucu gerekir. block.repair-point.description = Kendisine en yakın hasarlı birimi tamir eder. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Gelen mermilere zarar verir ve onları yok eder. Lazer mermilere etki etmez. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index df5bfc1db1..062421a05c 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1,4 +1,4 @@ -credits.text = Створив [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nЄ ігрові Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ помилки в перекладі?\nЗавітайте до офіційного Discord-Ñервера Mindustry\nв канал #українÑький.\nПереклав українÑькою: [blue]Prosta4ok_ua[green]#[yellow]6336 +credits.text = Створив [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nМаєте Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð° грою або знайшли помилки в перекладі?\nДолучайтеÑÑ Ð´Ð¾ офіційного Ñервера Mindustry у Discord\nв канал #українÑька.\nУкраїнÑький перекладач — Prosta4ok_ua#6336. credits = Творці contributors = Перекладачі та помічники discord = Офіційний Ñервер Mindustry в Discord @@ -17,12 +17,13 @@ linkfail = Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ за поÑиланнÑм!\nURL-а screenshot = ЗнÑток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не виÑтачає пам’Ñті Ð´Ð»Ñ Ð·Ð½Ñтку мапи. gameover = Гра завершена +gameover.disconnect = Від’єднатиÑÑ gameover.pvp = [accent]{0}[] команда перемогла! +gameover.waiting = [accent]Очікуємо наÑтупно мапу… highscore = [accent]Ðовий рекорд! copied = Скопійовано. -indev.popup = Ðаразі [accent]6.0[] знаходитьÑÑ Ñƒ Ñтадії [accent]альфа[].\n[lightgray]Це означає наÑтупне:[]\n- Ðе виÑтачає Ð½Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð³Ñ€Ð¸;\n- БільшіÑть [scarlet]ШІ бойових одиниць[] не працює належним чином;\n- Багато одиниць [scarlet]відÑутні[] або незавершені;\n- ÐšÐ°Ð¼Ð¿Ð°Ð½Ñ–Ñ Ð¿Ð¾Ð²Ð½Ñ–Ñтю не Ñ” завершеною;\n- УÑе, що ви бачите, може змінитиÑÑ Ð°Ð±Ð¾ видалитиÑÑ.\n\nПовідомлÑйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord. -indev.notready = Ð¦Ñ Ñ‡Ð°Ñтина гри ще не готова - +indev.notready = Ð¦Ñ Ñ‡Ð°Ñтина гри ще не готова. +indev.campaign = [accent]ВітаннÑ! Ви доÑÑгли ÐºÑ–Ð½Ñ†Ñ ÐºÐ°Ð¼Ð¿Ð°Ð½Ñ–Ñ—![]\n\nÐаразі це вÑе, що може запропонувати вам гра. Міжпланетні подорожі зʼÑвлÑтьÑÑ Ð² наÑтупних оновленнÑÑ…. load.sound = Звуки load.map = Мапи load.image = Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ @@ -30,14 +31,12 @@ load.content = ЗміÑÑ‚ load.system = СиÑтема load.mod = Модифікації load.scripts = Скрипти - be.update = ДоÑтупна нова збірка Bleeding Edge: be.update.confirm = Завантажити та перезавантажити зараз? be.updating = ОновленнÑ… be.ignore = Ігнорувати be.noupdates = Оновлень не знайдено. be.check = Перевірити на наÑвніÑть оновлень - schematic = Схема schematic.add = Зберегти Ñхему… schematics = Схеми @@ -54,8 +53,19 @@ schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути Ñхему schematic.saved = Схема збережена. schematic.delete.confirm = Ви Ñправді хочете видалити цю Ñхему? schematic.rename = Перейменувати Ñхему -schematic.info = {0}x{1}, {2} блоків +schematic.info = {0}x{1}, блоків: {2} +schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволÑєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати Ñхеми на цій [accent]мапі[] чи [accent]Ñервері. +mod.featured.title = ПереглÑдач модифікацій +mods.browser = ПереглÑдач модифікацій +mods.browser.selected = Обрана Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ +mods.browser.add = УÑтановити +mods.browser.reinstall = ПеревÑтановити +mods.github.open = Відкрити +mods.browser.sortdate = Сортувати за давніÑтю +mods.browser.sortstars = Сортувати за кількоÑтю зірок + +stats = СтатиÑтика stat.wave = Хвиль відбито:[accent] {0} stat.enemiesDestroyed = Противників знищено:[accent] {0} stat.built = Будівель збудовано:[accent] {0} @@ -64,8 +74,7 @@ stat.deconstructed = Будівель деконÑтруйовано:[accent] {0 stat.delivered = РеÑурÑів запущено: stat.playtime = Ð§Ð°Ñ Ñƒ грі:[accent] {0} stat.rank = Фінальний рахунок:[accent] {0} - -globalitems = [accent]Глобальні предмети +globalitems = [accent]УÑього предметів map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»? level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи @@ -79,6 +88,7 @@ joingame = Мережева гра customgame = КориÑтувацька гра newgame = Ðова гра none = <нічого> +none.found = [lightgray]<нічого не знайдено> minimap = Мінімапа position = МіÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ close = Закрити @@ -98,24 +108,25 @@ uploadingpreviewfile = Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ попередньо committingchanges = ЗдійÑÐ½ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ done = Зроблено feature.unsupported = Ваш приÑтрій не підтримує цю функцію - -mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, Ñ– [scarlet]можуть бути дуже неÑправними[].\nПовідомте про будь-Ñкі проблеми, Ñкі ви знайдете до Mindustry Github або Discord. -mods.alpha = [accent](Ðльфа) +mods.initfailed = [red]âš [] Попереднього разу не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Mindustry. Це, ймовірно, було Ñпричинено неправильними поведінкою модифікацій.\n\nÐ”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð½ÐµÑкінченним аварійним циклам [red]треба вимкнути вÑÑ– модифікації.[]\n\nÐ”Ð»Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— функції перейдіть до [accent]ÐалаштуваннÑ→Гра→Вимикати модифікації піÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ запуÑку[]. mods = Модифікації mods.none = [lightgray]Модифікацій не знайдено! mods.guide = ПоÑібник із модифікацій mods.report = Повідомити про ваду mods.openfolder = Відкрити теку +mods.viewcontent = ПодивитиÑÑ Ð²Ð¼Ñ–ÑÑ‚ mods.reload = Перезавантажити mods.reloadexit = Гра зараз закриєтьÑÑ, щоби перезавантажити модифікації +mod.installed = [[УÑтановлено] mod.display = [gray]МодифікаціÑ:[orange] {0} mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено +mod.multiplayer.compatable = [gray]ДоÑтупна в мережевій грі mod.disable = Вимкнути mod.content = ЗміÑÑ‚: mod.delete.error = Ðеможливо видалити модифікацію. Файл, можливо, викориÑтовуєтьÑÑ. mod.requiresversion = [scarlet]Ðеобхідна мінімальна верÑÑ–Ñ Ð³Ñ€Ð¸: [accent]{0} -mod.outdated = [scarlet]Ðе ÑуміÑна з V6 (немає мінімальної верÑÑ– гри (англ. min-game-version): 105) +mod.outdated = [scarlet]Ðе ÑуміÑна з V6 mod.missingdependencies = [scarlet]ВідÑутні залежноÑті: {0} mod.erroredcontent = [scarlet]Помилки під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ mod.errors = Виникли помилки під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту. @@ -135,7 +146,6 @@ mod.missing = Це Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ñтить модифікації, mod.preview.missing = До публікації цієї модифікації в МайÑтерні, ви муÑите додати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду.\nПоміÑтіть Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð· назвою [accent] preview.png[] у теку з модифікаціÑми та Ñпробуйте знову. mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в МайÑтерні.\nЩоб перетворити будь-Ñку модифікацію в теку, проÑто розархівуйте цей файл у теку та видаліть Ñтарий архів, Ñ– потім перезапуÑтіть гру або перезавантажте ваші модифікації. mod.scripts.disable = Ваш приÑтрій не підтримує модифікації зі Ñкриптами. Вимкніть модифікацію Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку гри. - about.button = Про гру name = Ім’Ñ: noname = Спочатку придумайте[accent] Ñобі ім’Ñ[]. @@ -143,8 +153,12 @@ planetmap = Планетна мапа launchcore = ЗапуÑтити Ñдро filename = Ðазва файлу: unlocked = ДоÑтупний новий вміÑÑ‚! +available = Ðове доÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾Ñтупно! completed = [accent]Завершено techtree = Дерево технологій +research.legacy = Були знайдені доÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ð· [accent]5.0[].\nЧи бажаєте ви [accent]завантажити ці дані[] або [accent]ви хочете відмовитиÑÑ Ð²Ñ–Ð´ цього[] Ñ– почати доÑліджувати із Ñамого початку в новій кампанії (рекомендовано)? +research.load = Завантажити +research.discard = ВідмовитиÑÑ research.list = [lightgray]ДоÑлідженнÑ: research = ДоÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ researched = [lightgray]{0} доÑліджено. @@ -171,7 +185,7 @@ server.kicked.customClient = Цей Ñервер не підтримує кор server.kicked.gameover = Гру завершено! server.kicked.serverRestarting = Сервер перезавантажуєтьÑÑ server.versions = Ваша верÑÑ–Ñ:[accent] {0}[]\nВерÑÑ–Ñ Ð½Ð° Ñервері:[accent] {1}[] -host.info = Кнопка [accent]Сервер[] розміщує Ñервер на порті [scarlet]6567[]. \nКориÑтувачі, Ñкі перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш Ñервер у Ñвоєму ÑпиÑку Ñерверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватиÑÑ Ð· будь-Ñкої точки планети через IP, то потрібно зробити[accent] переадреÑÐ°Ñ†Ñ–Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ[].\n\n[lightgray]Примітка. Якщо у Ð²Ð°Ñ Ð²Ð¸Ð½Ð¸ÐºÐ»Ð¸ проблеми з приєднаннÑм до вашої локальної гри, переконайтеÑÑ, що ви надали Mindustry доÑтуп до вашої локальної мережі в налаштуваннÑÑ… брандмауера. Зауважте, що публічні мережі іноді не дають змогу виÑвити Ñервер. +host.info = Кнопка [accent]Сервер[] розміщує Ñервер на порті [scarlet]6567[].\nКориÑтувачі, Ñкі перебувають у тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш Ñервер у Ñвоєму ÑпиÑку Ñерверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватиÑÑ Ð· будь-Ñкої точки планети через IP, то потрібно зробити[accent] переадреÑÐ°Ñ†Ñ–Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ[].\n\n[lightgray]Примітка. Якщо у Ð²Ð°Ñ Ð²Ð¸Ð½Ð¸ÐºÐ»Ð¸ проблеми з приєднаннÑм до вашої локальної гри, переконайтеÑÑ, що ви надали Mindustry доÑтуп до вашої локальної мережі в налаштуваннÑÑ… брандмауера. Зауважте, що публічні мережі іноді не дають змогу виÑвити Ñервер. join.info = Тут ви можете ввеÑти [accent]IP Ñервера[] Ð´Ð»Ñ Ð¿Ñ–Ð´â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ знайти Ñервери у [accent]локальній[] чи [accent]глобальній мережі[] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ них.\nПідтримуєтьÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð° мережа(LAN) Ñ– широкоÑмугова мережа(WAN).\n\n[lightgray] Примітка. Це не Ñ” автоматичним глобальним ÑпиÑком Ñерверів; Ñкщо ви хочете приєднатиÑÑ Ð´Ð¾ когоÑÑŒ через IP, вам доведетьÑÑ Ð¿Ð¾Ð¿Ñ€Ð¾Ñити влаÑника Ñервера дати Ñвій ip. hostserver = ЗапуÑтити багатокориÑтувацький Ñервер invitefriends = ЗапроÑити друзів @@ -184,17 +198,22 @@ hosts.discovering.any = Пошук ігор server.refreshing = ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñервера hosts.none = [lightgray]Локальних ігор не знайдено host.invalid = [scarlet]Ðе вдалоÑÑ Ð¿Ñ–Ð´â€™Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ Ñервера. - servers.local = Локальні Ñервери servers.remote = Віддалені Ñервери servers.global = Глобальні Ñервери +servers.disclaimer = Сервери Ñпільноли [accent]не[] належать чи контролюютьÑÑ Ð²Ð»Ð°Ñником.\n\nСервери можуть міÑтити кориÑтувацький вміÑÑ‚, Ñкий не підходить Ð´Ð»Ñ ÑкогоÑÑŒ віку. +servers.showhidden = Показати приховані Ñервери +server.shown = Показано +server.hidden = Приховано trace = Стежити за гравцем trace.playername = Ð†Ð¼â€™Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Унікальний ідентифікатор: [accent]{0} +trace.id = Ідентифікатор: [accent]{0} trace.mobile = Мобільний клієнт: [accent]{0} trace.modclient = КориÑтувацький клієнт: [accent]{0} +trace.times.joined = КількіÑть приєднань: [accent]{0} +trace.times.kicked = КількіÑть вигнань: [accent]{0} invalidid = Ðевірний ідентифікатор клієнта! Ðадішліть звіт про помилку. server.bans = Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ server.bans.none = Заблокованих гравців немає! @@ -222,6 +241,7 @@ disconnect.timeout = Ð§Ð°Ñ Ð²Ð¸Ð¹ÑˆÐ¾Ð². disconnect.data = Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñвітові дані! cantconnect = Ðе вдалоÑÑ Ð¿Ñ–Ð´â€™Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ гри ([accent]{0}[]). connecting = [accent]ПриєднаннÑ… +reconnecting = [accent]Повторне зʼєднаннÑ… connecting.data = [accent]Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñвіту… server.port = Порт: server.addressinuse = Ð¦Ñ Ð°Ð´Ñ€ÐµÑа вже викориÑтовуєтьÑÑ! @@ -267,6 +287,10 @@ cancel = СкаÑувати openlink = Перейти за поÑиланнÑм copylink = Скопіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ back = Ðазад +max = МакÑ. +crash.export = ЕкÑпортувати аварійні звіти +crash.none = Ðварійних звітів не знайдено +crash.exported = Ðварійні звіти екÑпортовано data.export = Вивантажити дані data.import = Завантажити дані data.openfolder = Відчинити теку з даними @@ -274,22 +298,29 @@ data.exported = Дані вивантажено. data.invalid = Це не дійÑні ігрові дані. data.import.confirm = Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо ÑкаÑувати![]\n\nЯк тільки дані імпортуютьÑÑ, гра негайно закриєтьÑÑ. quit.confirm = Ви дійÑно хочете вийти? -quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nÐÐ°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° пройти наново[accent] ÐалаштуваннÑ->Гра->Пройти Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ñ‰Ðµ раз.[] +quit.confirm.tutorial = Ви впевнені, що знаєте, що робите?\nÐÐ°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° пройти наново[accent] ÐалаштуваннÑ->Гра->Пройти Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ñ‰Ðµ раз.[] loading = [accent]ЗавантаженнÑ… reloading = [accent]ÐŸÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ð¹â€¦ saving = [accent]ЗбереженнÑ… respawn = [accent][[{0}][], щоби відродитиÑÑ Ð² Ñдрі -cancelbuilding = [accent][[{0}][], щоб очиÑтити план +cancelbuilding = [accent][[{0}][] Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð»Ð°Ð½Ñƒ selectschematic = [accent][[{0}][], щоби вибрати та Ñкопіювати -pausebuilding = [accent][[{0}][], щоби призупинити Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -resumebuilding = [scarlet][[{0}][], щоби продовжити Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +pausebuilding = [accent][[{0}][] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +resumebuilding = [scarlet][[{0}][] Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +enablebuilding = [scarlet][[{0}][] Ð´Ð»Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +showui = КориÑтувацький Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¾.\nÐатиÑніть [accent][[{0}][], щоби показати його знову. wave = [accent]Ð¥Ð²Ð¸Ð»Ñ {0} +wave.cap = [accent]Ð¥Ð²Ð¸Ð»Ñ {0}/{1} wave.waiting = [lightgray]ÐаÑтупна хвилÑ\nчерез {0} wave.waveInProgress = [lightgray]Ð¥Ð²Ð¸Ð»Ñ Ñ‚Ñ€Ð¸Ð²Ð°Ñ” waiting = [lightgray]ОчікуваннÑ… waiting.players = ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ–Ð²â€¦ wave.enemies = ЗалишилоÑÑ\n[lightgray]{0} противник. +wave.enemycores = Ворожих Ñдер: [accent]{0}[lightgray] +wave.enemycore = [accent]{0}[lightgray] вороже Ñдро wave.enemy = ЗалишивÑÑ\n[lightgray]{0} противник +wave.guardianwarn = Хвиль до поÑви Вартового: [accent]{0}[]. +wave.guardianwarn.one = Вартовий з’ÑвитьÑÑ Ñ‡ÐµÑ€ÐµÐ· [accent]{0}[] хвилю. loadimage = Завантажити Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ saveimage = Зберегти Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ unknown = Ðевідомо @@ -313,7 +344,6 @@ publishing = [accent]ПублікаціÑ… publish.confirm = Ви дійÑно хочете опублікувати це?\n\n[lightgray]ПереконайтеÑÑ, що ви Ñпочатку погоджуєтеÑÑ Ð· EULA МайÑтерні, або ваші предмети не з’ÑвлÑтьÑÑ! publish.error = Виникла помилка під Ñ‡Ð°Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— предмета: {0} steam.error = Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑервіÑи Steam.\nПомилка: {0} - editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ñ€ÑƒÐ´ @@ -328,10 +358,10 @@ editor.generation = ГенераціÑ: editor.ingame = Редагувати в грі editor.publish.workshop = Опублікувати в МайÑтерні Steam editor.newmap = Ðова мапа +editor.center = Центрувати workshop = МайÑÑ‚ÐµÑ€Ð½Ñ waves.title = Хвилі waves.remove = Видалити -waves.never = <ніколи> waves.every = кожен waves.waves = хвилÑ(Ñ–) waves.perspawn = за поÑву @@ -345,11 +375,9 @@ waves.load = Завантажити з буфера обміну waves.invalid = ÐедійÑні хвилі в буфері обміну. waves.copied = Хвилі Ñкопійовані. waves.none = Противники не були вÑтановлені.\nЗазначимо, що пуÑті хвилі будуть автоматично замінені звичайною хвилею. - wavemode.counts = кількіÑть wavemode.totals = уÑього wavemode.health = Ð·Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ - editor.default = [lightgray]<За замовчуваннÑм> details = Подробиці… edit = Редагувати… @@ -359,7 +387,7 @@ editor.removeunit = Видалити бойову одиницю editor.teams = Команди editor.errorload = Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ. editor.errorsave = Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ. -editor.errorimage = Це зображеннÑ, а не мапа.\n\nЯкщо ви хочете імпортувати заÑтарілу мапу, то викориÑтовуйте кнопку «Імпортувати заÑтарілу мапу» в редакторі. +editor.errorimage = Це зображеннÑ, а не мапа. editor.errorlegacy = Ð¦Ñ Ð¼Ð°Ð¿Ð° занадто Ñтара Ñ– викориÑтовує попередній формат мапи, Ñкий більше не підтримуєтьÑÑ. editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійÑний або пошкоджений. @@ -396,7 +424,6 @@ editor.overwrite = [accent]ПопередженнÑ!\nЦе перезапиÑу editor.overwrite.confirm = [scarlet]ПопередженнÑ![] Мапа з такою назвою вже Ñ”. Ви впевнені, що хочете перепиÑати Ñ—Ñ—?\n«[accent]{0}[]» editor.exists = Мапа з такою назвою вже Ñ”. editor.selectmap = Виберіть мапу Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ: - toolmode.replace = Замінити toolmode.replace.description = Малює тільки\nна Ñуцільних блоках. toolmode.replaceall = Замінити вÑе @@ -411,11 +438,11 @@ toolmode.fillteams = Змінити блок у команді toolmode.fillteams.description = Змінює належніÑть\nблоків до команди. toolmode.drawteams = Змінити команду блока toolmode.drawteams.description = Змінює належніÑть\nблока до команди. - filters.empty = [lightgray]Ðемає фільтрів! Додайте хоча б один за допомогою кнопки нижче. filter.distort = Ð¡Ð¿Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ filter.noise = Шум filter.enemyspawn = Вибір точки поÑви противників +filter.spawnpath = ШлÑÑ… до точки поÑви filter.corespawn = Вибір Ñдра filter.median = Медіана filter.oremedian = Рудна медіана @@ -440,13 +467,13 @@ filter.option.amount = КількіÑть filter.option.block = Блок filter.option.floor = ÐŸÐ¾Ð²ÐµÑ€Ñ…Ð½Ñ filter.option.flooronto = Цільова Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ñ +filter.option.target = Ціль filter.option.wall = Стіна filter.option.ore = Руда filter.option.floor2 = Друга Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ñ filter.option.threshold2 = Вторинний граничний поріг filter.option.radius = Ð Ð°Ð´Ñ–ÑƒÑ filter.option.percentile = Спад - width = Ширина: height = ВиÑота: menu = Меню @@ -456,47 +483,37 @@ load = Завантажити save = Зберегти fps = FPS: {0} ping = Затримка: {0} Ð¼Ñ -language.restart = Будь лаÑка, перезапуÑтіть Ñвою гру, щоби Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð²Ð¸ набули чинноÑті. +memory = Mem: {0}мб +memory2 = Mem:\n {0}мб +\n {1}мб +language.restart = ПерезапуÑтіть Ñвою гру, щоби Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð²Ð¸ набули чинноÑті. settings = ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ tutorial = ÐÐ°Ð²Ñ‡Ð°Ð½Ð½Ñ tutorial.retake = Пройти Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ñ‰Ðµ раз editor = Редактор mapeditor = Редактор мап - abandon = Покинути abandon.text = Ð¦Ñ Ð·Ð¾Ð½Ð° Ñ– вÑÑ– Ñ—Ñ— реÑурÑи будуть утрачені. locked = Заблоковано complete = [lightgray]Ðеобхідно: requirement.wave = ДоÑÑгніть хвилі {0} у зоні «{1}» requirement.core = Знищте вороже Ñдро в зоні «{0}» -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = Відновити зону:\n[lightgray]{0} -bestwave = [lightgray]Ðайкраща хвилÑ: {0} -launch = < ЗÐПУСК > +requirement.research = ДоÑлідіть {0} +requirement.produce = Виробіть {0} +requirement.capture = Захопіть {0} launch.text = ЗапуÑк -launch.title = ЗапуÑк вдалий -launch.next = [lightgray]наÑтупна можливіÑть буде на {0}-тій хвилі -launch.unable2 = [scarlet]ЗÐПУСК неможливий.[] -launch.confirm = Це видалить уÑÑ– реÑурÑи у вашому Ñдрі.\nВи не зможете повернутиÑÑ Ð´Ð¾ цієї бази. -launch.skip.confirm = Якщо ви пропуÑтите зараз, ви не зможете не запуÑкати до більш пізніх хвиль. +research.multiplayer = Лише влаÑник Ñервера має змогу доÑліджувати предмети. +map.multiplayer = Лише влаÑник може переглÑдати Ñектори. uncover = Розкрити configure = Ðалаштувати Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ loadout = Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ -resources = РеÑурÑи +resources = РеÑурÑи bannedblocks = Заборонені блоки addall = Додати вÑе -launch.destination = Destination: {0} +launch.from = ЗапуÑк з [accent]{0} +launch.destination = Пункт призначеннÑ: {0} configure.invalid = КількіÑть має бути чиÑлом між 0 та {0}. -zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. -zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} -zone.resources = [lightgray]ВиÑвлені реÑурÑи: -zone.objective = [lightgray]Мета: [accent]{0} -zone.objective.survival = вижити -zone.objective.attack = знищити вороже Ñдро add = Додати… -boss.health = Ð—Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ Ð±Ð¾Ñу - +boss.health = Ð—Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ Ð’Ð°Ñ€Ñ‚Ð¾Ð²Ð¾Ð³Ð¾ connectfail = [crimson]Помилка з’єднаннÑ:\n\n[accent]{0} error.unreachable = Сервер не Ñ” доÑтупним.\nЧи правильно напиÑана адреÑа? error.invalidaddress = Ðекоректна адреÑа. @@ -507,21 +524,44 @@ error.mapnotfound = Файл мапи не знайдено! error.io = Мережева помилка введеннÑ-виведеннÑ. error.any = Ðевідома мережева помилка error.bloom = Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑвітіннÑ.\nВаш приÑтрій, мабуть, не підтримує це. - weather.rain.name = Дощ weather.snow.name = Сніг weather.sandstorm.name = Піщана Ð±ÑƒÑ€Ñ weather.sporestorm.name = Спорова Ð±ÑƒÑ€Ñ - +weather.fog.name = Туман sectors.unexplored = [lightgray]Ðе доÑліджено sectors.resources = РеÑурÑи: sectors.production = Виробництво: +sectors.export = ЕкÑпортуваннÑ: +sectors.time = ЧаÑ: +sectors.threat = Загроза: +sectors.wave = ХвилÑ: sectors.stored = Зберігає: sectors.resume = Продовжити -sectors.launch = ЗапуÑк -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) - +sectors.launch = ЗапуÑтити +sectors.select = Вибрати +sectors.nonelaunch = [lightgray]нічого (Ñонце) +sectors.rename = ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñектору +sectors.enemybase = [scarlet]Ворожа база +sectors.vulnerable = [scarlet]Уразливий +sectors.underattack = [scarlet]Ðтаковано! [accent]{0}% пошкоджено +sectors.survives = [accent]ПротримайтеÑÑ {0} хвиль +sectors.go = Перейти +sector.curcapture = Сектор захоплено +sector.curlost = Сектор втрачено +sector.missingresources = [scarlet]ÐедоÑтатньо реÑурÑів у Ñдрі +sector.attacked = Сектор [accent]{0}[white] під атакою! +sector.lost = Сектор [accent]{0}[white] втрачено! +sector.captured = Сектор [accent]{0}[white]захоплено! +threat.low = низька +threat.medium = ÑÐµÑ€ÐµÐ´Ð½Ñ +threat.high = виÑока +threat.extreme = екÑтремальна +threat.eradication = викорінювальна +planets = Планети +planet.serpulo.name = Cерпуло +planet.sun.name = Сонце +sector.impact0078.name = Ðварійне Ð¿Ñ€Ð¸Ð·ÐµÐ¼Ð»ÐµÐ½Ð½Ñ 0078 sector.groundZero.name = Відправний пункт sector.craters.name = Кратери sector.frozenForest.name = Крижаний Ð»Ñ–Ñ @@ -533,18 +573,39 @@ sector.overgrowth.name = ЗароÑті sector.tarFields.name = Дьогтьові Ð¿Ð¾Ð»Ñ sector.saltFlats.name = СолÑні рівнини sector.fungalPass.name = Грибний перевал - -sector.groundZero.description = Оптимальне міÑце Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¸Ñ… ігор. Ðизька ворожа загроза. Мало реÑурÑів.\nЗбирайте Ñкомога більше Ñвинцю та міді.\nÐе затримуйтеÑÑŒ Ñ– йдіть далі. -sector.frozenForest.description = Спори поширилиÑÑ Ð½Ð°Ð²Ñ–Ñ‚ÑŒ тут, ближче до гір. Холодна температура не може Ñтримувати Ñ—Ñ… завжди.\n\nЗважтеÑÑŒ Ñтворити енергію. Побудуйте генератори внутрішнього згораннÑ. ÐавчітьÑÑ ÐºÐ¾Ñ€Ð¸ÑтуватиÑÑ Ñ€ÐµÐ³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Ð¼Ð¸. -sector.saltFlats.description = Ðа околицÑÑ… пуÑтелі лежать СолÑні рівнини. У цьому міÑці можна знайти небагато реÑурÑів.\n\nСаме тут противники Ñпорудили ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ Ñховищ реÑурÑів. Викорініть їхнє Ñдро. Ðе залишайте нічого цінного. -sector.craters.description = У цьому кратері накопичилаÑÑ Ð²Ð¾Ð´Ð°, пережиток Ñтарих воєн. Відновіть міÑцевіÑть. Зберіть піÑок. Виплавте метаÑкло. Качайте воду, щоб охолодити турелі та бури. -sector.ruinousShores.description = Саме берегова Ð»Ñ–Ð½Ñ–Ñ Ñ” минулим цих відходів. КолиÑÑŒ у цьому міÑці розташувавÑÑ Ð±ÐµÑ€ÐµÐ³Ð¾Ð²Ð¸Ð¹ оборонний маÑив. Проте залишилоÑÑ Ð½Ðµ так багато чого. Тільки оÑновні оборонні Ñпоруди залишилиÑÑ Ð½ÐµÑƒÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð¸Ð¼Ð¸, а вÑе інше перетворилоÑÑ Ð½Ð° брухт.\nПродовжуйте екÑпанÑÑ–ÑŽ назовні. Повторно розкрийте технології. -sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, Ñкі ще не заражені Ñпорами.\nВидобудьте надлишковий титан у цій міÑцевоÑті. ДізнайтеÑÑ, Ñк викориÑтовувати його.\n\nÐа жаль, тут більше противників ніж в інших міÑцевоÑÑ‚ÑÑ…. Ðе дайте їм чаÑу надіÑлати Ñвої найÑильніші одиниці. -sector.overgrowth.description = Ближче до джерела Ñпор Ñ” територіÑ, що зароÑла.\nÐе дивуйтеÑÑ, що противник вÑтановив тут Ñвій форпоÑÑ‚. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте Ñ—Ñ—. Поверніть те, що колиÑÑŒ належало нам. -sector.tarFields.description = Між горами та пуÑтелею проÑÑ‚ÑгаєтьÑÑ Ð¾ÐºÑ€Ð°Ñ—Ð½Ð° зони видобутку нафти. Це один із небагатьох районів із кориÑними Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð°Ñами Ñмоли.\nÐе зважаючи на те, що Ñ‚ÐµÑ€Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Ð¿Ð¾ÐºÐ¸Ð½ÑƒÑ‚Ð°, вона має поблизу небезпечні Ñили противника. Ðе варто Ñ—Ñ… недооцінювати.\n\n[lightgray]Якщо можливо, доÑлідіть технологію Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñ„Ñ‚Ð¸. -sector.desolateRift.description = Ðадзвичайно небезпечна зона. Багато реÑурÑів, але мало міÑцÑ. ВиÑокий ризик знищеннÑ. ЕвакуюватиÑÑ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾ Ñкомога швидше. Ðе розÑлаблÑйтеÑÑ Ð¼Ñ–Ð¶ ворожими атаками та знайдіть ахіллеÑову п’Ñту Ñупротивника. +sector.biomassFacility.name = Центр доÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ñинтезу біомаÑи +sector.windsweptIslands.name = ВітрÑні оÑтрови +sector.extractionOutpost.name = Видобувна заÑтава +sector.planetaryTerminal.name = Термінал планетарного запуÑку +sector.groundZero.description = Оптимальне міÑце Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¸Ñ… ігор. Ðизька ворожа загроза. Мало реÑурÑів.\nЗберіть Ñкомога більше Ñвинцю та міді.\nÐе затримуйтеÑÑŒ Ñ– йдіть далі. +sector.frozenForest.description = Ðавіть тут, ближче до гір, уже поширилиÑÑ Ñпори. Холодна температура не змогла Ñтримати Ñ—Ñ… назавжди.\n\nЗважтеÑÑŒ Ñтворити енергію. Побудуйте генератори внутрішнього згораннÑ. ÐавчітьÑÑ ÐºÐ¾Ñ€Ð¸ÑтуватиÑÑ Ñ€ÐµÐ³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Ð¼Ð¸. +sector.saltFlats.description = Ðа околицÑÑ… пуÑтелі лежать СолÑні рівнини. У цьому міÑці небагато реÑурÑів.\n\nСаме тут противники Ñпорудили ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ Ð·Ñ– Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑів. Викорініть їхнє Ñдро. Ðе лишайте нічого цінного. +sector.craters.description = У цьому кратері накопичилаÑÑ Ð²Ð¾Ð´Ð° — пережиток Ñтарих воєн. Відновіть міÑцевіÑть. Видобудьте піÑок. Виплавте метаÑкло. Качайте воду, щоб охолоджувати башти та бури. +sector.ruinousShores.description = Повз пуÑток — берегова лініÑ. КолиÑÑŒ у цьому міÑці розташувавÑÑ Ð±ÐµÑ€ÐµÐ³Ð¾Ð²Ð¸Ð¹ оборонний маÑив. Проте з тих давніх залишилоÑÑ Ð½Ðµ дуже й багато чого. Тільки оÑновні оборонні Ñпоруди лишилиÑÑ Ð½ÐµÑƒÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð¸Ð¼Ð¸, а вÑе інше перетворилоÑÑ Ð½Ð° брухт.\nПродовжуйте екÑпанÑÑ–ÑŽ назовні. ДоÑлідіть повторно забуті технології. +sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, що ще не заражені Ñпорами.\nВидобудьте надлишковий титан у цій міÑцевоÑті й дізнайтеÑÑ Ñк викориÑтовувати його.\n\nВорожа приÑутніÑть у цій міÑцевоÑті значно більша. Ðе дайте ворогам чаÑу надіÑлати Ñвої найÑильніші одиниці. +sector.overgrowth.description = Ближче до джерела Ñпор Ñ” територіÑ, що зароÑла.\nПротивник уÑтановив тут Ñвій форпоÑÑ‚. Побудуйте Титанів. Зруйнуйте укріпленнÑ. +sector.tarFields.description = Між горами та пуÑтелею проÑÑ‚ÑгаєтьÑÑ ÐºÑ€Ð°Ð¹ зони видобутку нафти. Це один із небагатьох районів із кориÑними Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð°Ñами дьогтю.\nÐе зважаючи на те, що Ñ†Ñ Ñ‚ÐµÑ€Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Ð¿Ð¾ÐºÐ¸Ð½ÑƒÑ‚Ð°, вона має поблизу небезпечні Ñили противника. Ðе варто Ñ—Ñ… недооцінювати.\n\n[lightgray]За можливіÑтю доÑлідіть технологію Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñ„Ñ‚Ð¸. +sector.desolateRift.description = Ðадзвичайно небезпечна зона. Багато реÑурÑів, але мало міÑцÑ. ВиÑокий ризик знищеннÑ. ЕвакуюватиÑÑ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾ Ñкомога швидше. Ðе розÑлаблÑйтеÑÑ Ð¼Ñ–Ð¶ ворожими атаками та знайдіть ахіллеÑову п’Ñту ворога. sector.nuclearComplex.description = Колишній об’єкт Ð´Ð»Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° та Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€Ñ–ÑŽ було зведено до руїн.\n[lightgray]ДоÑлідіть торій та його неÑкінченну кількіÑть заÑтоÑувань.\n\n Противник, Ñкий поÑтійно шукає нападників, приÑутній тут у великій кількоÑті, тому не барітьÑÑ Ð· евакуацією. -sector.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. +sector.fungalPass.description = Перехідна зона між виÑокими й низькими горами, що заповнені Ñпорами. Тут розташована невелика розвідувальна база противника.\nЗнищте Ñ—Ñ—.\nВикориÑтовуйте Кинджалів Ñ– Плазунів. Зруйнуйте два Ñдра. +sector.biomassFacility.description = Батьківщина Ñпор. Це Ñаме той обʼєкт, у Ñкому вони вперше були доÑліджені та виготовлені.\nДоÑлідіть технологію, що міÑтитьÑÑ Ð²Ñередині. Вирощуйте Ñпори Ð´Ð»Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° палива та плаÑтмаÑ. \n\n[lightgray]ПіÑÐ»Ñ Ñ€ÑƒÐ¹Ð½Ð°Ñ†Ñ–Ñ— цього обʼєкта Ñпори Ñтали вільними. Ðіщо в міÑцевій екоÑиÑтемі не змогло ÑклаÑти конкуренцію такому загарбницькому організму. +sector.windsweptIslands.description = Далі, за береговою лінією, розташовуєтьÑÑ Ñ†ÐµÐ¹ віддалений ланцюжок оÑтровів. ЗапиÑи чітко вказують на те, що колиÑÑŒ вони мали Ñтруктури, що вироблÑли [accent]плаÑтаній[] \n\nВідбивайтеÑÑŒ від морÑьких підрозділів противника. Створіть базу на оÑтровах. ДоÑлідіть ці заводи. +sector.extractionOutpost.description = Віддалений форпоÑÑ‚, побудований ворогом Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку реÑурÑів в інші Ñектори. \n\nМіжÑекторна транÑпортна Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ñ–Ñ Ð¼Ð°Ñ” важливе Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑŒÑˆÐ¾Ð³Ð¾ завоюваннÑ. Знищте базу. ДоÑлідіть їхні пуÑкові майданчики. +sector.impact0078.description = Тут лежать залишки міжзорÑного транÑпортного Ñудна, Ñке вперше потрапило в цю ÑиÑтему. \n\nВилучіть Ñкомога більше кориÑного з уламків. ДоÑлідіть будь-Ñку вцілілу технологію. +sector.planetaryTerminal.description = Кінцева мета.\n\nÐ¦Ñ Ð¿Ñ€Ð¸Ð±ÐµÑ€ÐµÐ¶Ð½Ð° база міÑтить Ñтруктуру, здатну запуÑкати Ñдра на навколишні планети. Ðадзвичайно добре охоронÑєтьÑÑ.\n\nВироблÑÑ” війÑьково-морÑькі підрозділи. УÑуньте ворога Ñкомога швидше. ДоÑлідіть Ñтруктуру запуÑку. + +status.burning.name = Палає +status.freezing.name = Замерзає +status.wet.name = Вологий +status.muddy.name = Забризканий грÑззю +status.melting.name = ПлавитьÑÑ +status.sapped.name = ВиÑнажений +status.spore-slowed.name = Сповільнений Ñпорами +status.tarred.name = Покритий нафтою +status.overclock.name = ПриÑкорений +status.shocked.name = Шокований +status.blasted.name = Підірваний +status.unmoving.name = Ðезворушний settings.language = Мова settings.data = Ігрові дані @@ -557,97 +618,142 @@ settings.sound = Звук settings.graphics = Графіка settings.cleardata = ОчиÑтити дані… settings.clear.confirm = Ви дійÑно хочете очиÑтити ці дані?\nЦю дію не можна ÑкаÑувати! -settings.clearall.confirm = [scarlet]УВÐГÐ![]\nЦе очиÑтить уÑÑ– дані, включно із збереженнÑми, мапами, розблокованим та налаштуваннÑми керуваннÑ.\nПіÑÐ»Ñ Ð½Ð°Ñ‚Ð¸ÑÐºÐ°Ð½Ð½Ñ Â«Ð“Ð°Ñ€Ð°Ð·Ð´Â» гра видалить уÑÑ– дані та автоматично закриєтьÑÑ. +settings.clearall.confirm = [scarlet]УВÐГÐ![]\nЦе очиÑтить уÑÑ– дані, включно зі збереженнÑми, мапами, розблокованим та налаштуваннÑми керуваннÑ.\nПіÑÐ»Ñ Ð½Ð°Ñ‚Ð¸ÑÐºÐ°Ð½Ð½Ñ Â«Ð“Ð°Ñ€Ð°Ð·Ð´Â» гра видалить уÑÑ– дані та автоматично закриєтьÑÑ. settings.clearsaves.confirm = Ви Ñправді хочете видалити вÑÑ– ваші збереженнÑ? settings.clearsaves = ОчиÑтити Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ -paused = [accent]< Пауза> +settings.clearresearch = ОчиÑтити доÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ +settings.clearresearch.confirm = Ви Ñправді хочете очиÑтити доÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ°Ð¼Ð¿Ð°Ð½Ñ–Ñ—? +settings.clearcampaignsaves = ОчиÑтити Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð² кампанії +settings.clearcampaignsaves.confirm = Ви Ñправді хочете очиÑтити вÑÑ– збереженні в кампанії? +paused = [accent]< Пауза > clear = ОчиÑтити banned = [scarlet]Заблоковано -unplaceable.sectorcaptured = [scarlet]Вимагає захопленого Ñектору yes = Так no = ÐÑ– info.title = Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ error.title = [crimson]Виникла помилка error.crashtitle = Виникла помилка unit.nobuild = [scarlet]Ð¦Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð½Ðµ може будувати -blocks.input = Ввід -blocks.output = Вивід -blocks.booster = ПриÑкорювач -blocks.tiles = Ðеобхідні плитки -blocks.affinities = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті +lastaccessed = [lightgray]ОÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð° від {0} block.unknown = [lightgray]??? -blocks.powercapacity = МіÑткіÑть енергії -blocks.powershot = Ð•Ð½ÐµÑ€Ð³Ñ–Ñ Ð·Ð° поÑтріл -blocks.damage = Шкода -blocks.targetsair = ПовітрÑні противники -blocks.targetsground = Ðаземні противники -blocks.itemsmoved = ШвидкіÑть Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ -blocks.launchtime = Ð§Ð°Ñ Ð¼Ñ–Ð¶ запуÑками -blocks.shootrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— -blocks.size = Розмір -blocks.displaysize = Розмір диÑплею -blocks.liquidcapacity = Рідинна міÑткіÑть -blocks.powerrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– енергії -blocks.linkrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ -blocks.instructions = ІнÑтрукції -blocks.powerconnections = МакÑимальна кількіÑть з’єднань -blocks.poweruse = Енергії викориÑтовує -blocks.powerdamage = Енергії за од. шкоди -blocks.itemcapacity = МіÑткіÑть предметів -blocks.basepowergeneration = Базова Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ— -blocks.productiontime = Ð§Ð°Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° -blocks.repairtime = Ð§Ð°Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ -blocks.speedincrease = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті -blocks.range = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— -blocks.drilltier = Видобуває -blocks.drillspeed = Базова швидкіÑть Ð±ÑƒÑ€Ñ–Ð½Ð½Ñ -blocks.boosteffect = ПриÑкорювальний ефект -blocks.maxunits = МакÑимальна кількіÑть активних одиниць -blocks.health = Ð—Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ -blocks.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -blocks.maxconsecutive = МакÑимальна поÑлідовніÑть -blocks.buildcost = ВартіÑть Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -blocks.inaccuracy = Розкид -blocks.shots = ПоÑтріли -blocks.reload = ПоÑтріли/Ñекунду -blocks.ammo = БоєприпаÑи -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time +stat.description = ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ +stat.input = Ввід +stat.output = Вивід +stat.booster = ПриÑкорювач +stat.tiles = Ðеобхідні плитки +stat.affinities = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті +stat.opposites = Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ ÐµÑ„ÐµÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті +stat.powercapacity = МіÑткіÑть енергії +stat.powershot = Ð•Ð½ÐµÑ€Ð³Ñ–Ñ Ð·Ð° поÑтріл +stat.damage = Шкода +stat.targetsair = ПовітрÑні противники +stat.targetsground = Ðаземні противники +stat.itemsmoved = ШвидкіÑть Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ +stat.launchtime = Ð§Ð°Ñ Ð¼Ñ–Ð¶ запуÑками +stat.shootrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— +stat.size = Розмір +stat.displaysize = Розмір диÑплею +stat.liquidcapacity = Рідинна міÑткіÑть +stat.powerrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– енергії +stat.linkrange = Ð Ð°Ð´Ñ–ÑƒÑ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ +stat.instructions = Операції +stat.powerconnections = МакÑимальна кількіÑть з’єднань +stat.poweruse = Енергії викориÑтовує +stat.powerdamage = Енергії за од. шкоди +stat.itemcapacity = МіÑткіÑть предметів +stat.memorycapacity = ЄмніÑть пам’Ñті +stat.basepowergeneration = Базова Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ— +stat.productiontime = Ð§Ð°Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° +stat.repairtime = Ð§Ð°Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ +stat.weapons = Ð—Ð±Ñ€Ð¾Ñ +stat.bullet = Кулі +stat.speedincrease = Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті +stat.range = Ð Ð°Ð´Ñ–ÑƒÑ Ð´Ñ–Ñ— +stat.drilltier = Видобуває +stat.drillspeed = Базова швидкіÑть Ð±ÑƒÑ€Ñ–Ð½Ð½Ñ +stat.boosteffect = ПриÑкорювальний ефект +stat.maxunits = МакÑимальна кількіÑть активних одиниць +stat.health = Ð—Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ +stat.armor = Ð‘Ñ€Ð¾Ð½Ñ +stat.buildtime = Ð§Ð°Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +stat.maxconsecutive = МакÑимальна поÑлідовніÑть +stat.buildcost = ВартіÑть Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +stat.inaccuracy = Розкид +stat.shots = ПоÑтріли +stat.reload = ПоÑтріли за Ñек. +stat.ammo = БоєприпаÑи +stat.shieldhealth = МіцніÑть щита +stat.cooldowntime = ТриваліÑть Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ +stat.explosiveness = ВибухонебезпечніÑть +stat.basedeflectchance = Базовий ÑˆÐ°Ð½Ñ Ð²Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ +stat.lightningchance = Ð¨Ð°Ð½Ñ ÑƒÐ´Ð°Ñ€Ñƒ блиÑкавки +stat.lightningdamage = Шкода від удару блиÑкавки +stat.flammability = ЗаймиÑтіÑть +stat.radioactivity = РадіоактивніÑть +stat.charge = ЗарÑд +stat.heatcapacity = ТепломіÑткіÑть +stat.viscosity = В’ÑзкіÑть +stat.temperature = Температура +stat.speed = ШвидкіÑть +stat.buildspeed = ШвидкіÑть Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +stat.minespeed = ШвидкіÑть видобутку +stat.minetier = Рівень видобутку +stat.payloadcapacity = ВантажніÑть +stat.commandlimit = МакÑимум у загоні +stat.abilities = ЗдібноÑті +stat.canboost = Можна приÑкорити +stat.flying = Літає +stat.ammouse = Патронів викориÑтовує +stat.damagemultiplier = Множник шкоди +stat.healthmultiplier = Множник Ð·Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ +stat.speedmultiplier = Множник швидкоÑті +stat.reloadmultiplier = Множник перезарÑдки +stat.buildspeedmultiplier = Множник швидкоÑті Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +stat.reactive = Реактивний +ability.forcefield = Щитове поле +ability.repairfield = Ремонтувальне поле +ability.statusfield = Поле підÑÐ¸Ð»ÐµÐ½Ð½Ñ +ability.unitspawn = Завод одиниць «{0}» +ability.shieldregenfield = Поле, що відновлює щити +ability.movelightning = БлиÑкавки під Ñ‡Ð°Ñ Ñ€ÑƒÑ…Ñƒ bar.drilltierreq = ПотребуєтьÑÑ ÐºÑ€Ð°Ñ‰Ð¸Ð¹ бур bar.noresources = Бракує реÑурÑів bar.corereq = Ðеобхідне оÑновне Ñдро bar.drillspeed = ШвидкіÑть буріннÑ: {0} за Ñ. bar.pumpspeed = ШвидкіÑть викачуваннÑ: {0} за Ñ. bar.efficiency = ЕфективніÑть: {0}% +bar.boost = ПідÑиленнÑ: {0}% bar.powerbalance = ЕнергіÑ: {0} за Ñ. bar.powerstored = Зберігає: {0}/{1} bar.poweramount = ЕнергіÑ: {0} bar.poweroutput = Вихідна енергіÑ: {0} +bar.powerlines = З’єднань: {0}/{1} bar.items = Предмети: {0} bar.capacity = МіÑткіÑть: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð°] bar.liquid = Рідина bar.heat = ÐÐ°Ð³Ñ€Ñ–Ð²Ð°Ð½Ð½Ñ bar.power = Ð•Ð½ÐµÑ€Ð³Ñ–Ñ bar.progress = Хід Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ bar.input = Ввід bar.output = Вивід - +units.processorcontrol = [lightgray]КеруєтьÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑором bullet.damage = [stat]{0}[lightgray] шкода bullet.splashdamage = [stat]{0}[lightgray] шкода по ділÑнці ~[stat] {1}[lightgray] плиток bullet.incendiary = [stat]запальний bullet.homing = [stat]ÑÐ°Ð¼Ð¾Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð½Ñ -bullet.shock = [stat]шок bullet.frag = [stat]шкода по ділÑнці +bullet.lightning = [stat]{0}[lightgray]x блиÑкавки ~ [stat]{1}[lightgray] шкоди +bullet.buildingdamage = [stat]{0}%[lightgray] шкода по будівлÑм bullet.knockback = [stat]{0}[lightgray] Ð²Ñ–Ð´ÐºÐ¸Ð´Ð°Ð½Ð½Ñ -bullet.freezing = [stat]Ð·Ð°Ð¼Ð¾Ñ€Ð¾Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ -bullet.tarred = [stat]дьогтьовий +bullet.pierce = [stat]{0}[lightgray]x Ð¿Ñ€Ð¾Ð±Ð¸Ñ‚Ñ‚Ñ +bullet.infinitepierce = [stat]Ð¿Ñ€Ð¾Ð±Ð¸Ñ‚Ñ‚Ñ +bullet.healpercent = [stat]{0}[lightgray]% Ð»Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ bullet.multiplier = [stat]{0}[lightgray]x патронів bullet.reload = [stat]{0}[lightgray]x швидкіÑть перезарÑÐ´Ð¶Ð°Ð½Ð½Ñ - unit.blocks = блоки +unit.blockssquared = блоків² unit.powersecond = одиниць енергії за Ñекунду unit.liquidsecond = одиниць рідини за Ñекунду unit.itemssecond = предметів за Ñекунду @@ -660,17 +766,19 @@ unit.persecond = за Ñекунду unit.perminute = за хвилину unit.timesspeed = x швидкіÑть unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = міцніÑть щита unit.items = предм. unit.thousands = Ñ‚Ð¸Ñ unit.millions = млн unit.billions = млрд +unit.pershot = за поÑтріл +category.purpose = ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ category.general = Загальне category.power = Ð•Ð½ÐµÑ€Ð³Ñ–Ñ category.liquids = Рідини category.items = Предмети category.crafting = Виробництво -category.shooting = Стрільба +category.function = Стрільба category.optional = Додаткові Ð¿Ð¾Ð»Ñ–Ð¿ÑˆÐµÐ½Ð½Ñ setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.shadows.name = Тіні @@ -678,20 +786,22 @@ setting.blockreplace.name = ÐŸÑ€Ð¾Ð¿Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ автоматич setting.linear.name = Лінійна Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ–Ñ setting.hints.name = Підказки setting.flow.name = Показувати темп швидкоÑті реÑурÑів +setting.backgroundpause.name = Пауза в разі згортанні setting.buildautopause.name = Ðвтоматичне Ð¿Ñ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -setting.mapcenter.name = Ðвтоматичне Ñ†ÐµÐ½Ñ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ð¿Ð¸ на Ð³Ñ€Ð°Ð²Ñ†Ñ +setting.doubletapmine.name = Подвійне Ñ‚Ð¾Ñ€ÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ +setting.modcrashdisable.name = Вимикати модифікації піÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ запуÑку setting.animatedwater.name = Ðнімаційні рідини setting.animatedshields.name = Ðнімаційні щити setting.antialias.name = ЗгладжуваннÑ[lightgray] (потребує перезапуÑку)[] setting.playerindicators.name = Позначки гравців setting.indicators.name = Позначки противників setting.autotarget.name = ÐвтоÑтрільба -setting.keyboard.name = Миш+ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð· клавіатури +setting.keyboard.name = Миш + ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð· клавіатури setting.touchscreen.name = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑенÑорним екраном setting.fpscap.name = МакÑимальний FPS setting.fpscap.none = Жодне setting.fpscap.text = {0} FPS -setting.uiscale.name = МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацького інтерфейÑу[lightgray] (потребує перезапуÑк)[] +setting.uiscale.name = МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацького інтерфейÑу[lightgray] (потребує перезапуÑку)[] setting.swapdiagonal.name = Завжди діагональне Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ setting.difficulty.training = ÐÐ°Ð²Ñ‡Ð°Ð½Ð½Ñ setting.difficulty.easy = Легка @@ -707,17 +817,15 @@ setting.conveyorpathfinding.name = Пошук шлÑху Ð´Ð»Ñ Ð²Ñтановл setting.sensitivity.name = ЧутливіÑть контролера setting.saveinterval.name = Інтервал Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ setting.seconds = {0} Ñекунд -setting.blockselecttimeout.name = Ð§Ð°Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ блока setting.milliseconds = {0} міліÑекунд setting.fullscreen.name = Повноекранний режим setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуÑку) setting.fps.name = Показувати FPS Ñ– затримку до Ñервера setting.smoothcamera.name = Гладка камера -setting.blockselectkeys.name = Показувати клавіші вибору блока setting.vsync.name = Вертикальна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ setting.pixelate.name = ПікÑÐµÐ»Ñ–Ð·Ð°Ñ†Ñ–Ñ setting.minimap.name = Показувати мінімапу -setting.coreitems.name = Показувати предмети в Ñдрі (дороблюєтьÑÑ) +setting.coreitems.name = Показувати предмети в Ñдрі setting.position.name = Показувати координати Ð³Ñ€Ð°Ð²Ñ†Ñ setting.musicvol.name = ГучніÑть музики setting.atmosphere.name = Показувати планетарну атмоÑферу @@ -734,9 +842,10 @@ setting.lasersopacity.name = ÐепрозоріÑть лазерів енерг setting.bridgeopacity.name = ÐепрозоріÑть моÑтів setting.playerchat.name = Показувати хмару чата над гравцÑми public.confirm = Ви хочете зробити цю гру загальнодоÑтупною?\n[accent]Будь-хто може приєднатиÑÑ Ð´Ð¾ вашої гри.\n[lightgray]Це можна змінити в ÐалаштуваннÑ->Гра->ЗагальнодоÑтупніÑть гри. +public.confirm.really = Якщо ви хочете грати з друзÑми, викориÑтовуйте [green]ЗапроÑити друзів[] заміÑть [scarlet]Публічного Ñерверу[]!\nВи Ñправді хочете зробити Ñвою гру [scarlet]публічною[]? public.beta = Зауважте, що в бета-верÑÑ–Ñ— гри ви не можете робити публічні ігри. uiscale.reset = МаÑштаб кориÑтувацького інтерфейÑу було змінено.\nÐатиÑніть «Гаразд» Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ маÑштабу.\n[scarlet]ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ Ñ– вихід через[accent] {0}[] Ñекунд… -uiscale.cancel = СкаÑувати & Вийти +uiscale.cancel = СкаÑувати Ñ– вийти setting.bloom.name = Ð¡Ð²Ñ–Ñ‚Ñ–Ð½Ð½Ñ keybind.title = ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ keybinds.mobile = [scarlet]БільшіÑть прив’Ñзаних клавіш не функціональні Ð´Ð»Ñ Ð¼Ð¾Ð±Ñ–Ð»ÑŒÐ½Ð¸Ñ… приÑтроїв. ПідтримуєтьÑÑ Ð»Ð¸ÑˆÐµ базовий рух. @@ -747,8 +856,8 @@ category.blocks.name = Вибір блока command.attack = Ðтака command.rally = Точка збору command.retreat = ВідÑтупити -command.idle = БездіÑти -placement.blockselectkeys = \n[lightgray]Ключ: [{0}, +command.idle = БездіÑльніÑть +placement.blockselectkeys = \n[lightgray]Клавіші: [{0}, keybind.respawn.name = Ð’Ñ–Ð´Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ keybind.control.name = ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ– keybind.clear_building.name = ОчиÑтити план Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ @@ -757,15 +866,15 @@ keybind.press.axis = ÐатиÑніть клавішу… keybind.screenshot.name = ЗнÑток мапи keybind.toggle_power_lines.name = Показувати лазери енергопоÑÑ‚Ð°Ñ‡Ð°Ð½Ð½Ñ keybind.toggle_block_status.name = Показувати Ñтан блоків -keybind.move_x.name = Рух по оÑÑ– X -keybind.move_y.name = Рух по оÑÑ– Y +keybind.move_x.name = Рух за віÑÑÑŽ X +keybind.move_y.name = Рух за віÑÑÑŽ Y keybind.mouse_move.name = РухатиÑÑ Ð·Ð° мишею keybind.pan.name = Політ камери за мишею keybind.boost.name = ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ keybind.schematic_select.name = Вибрати ділÑнку keybind.schematic_menu.name = Меню Ñхем -keybind.schematic_flip_x.name = Віддзеркалити по оÑÑ– X -keybind.schematic_flip_y.name = Віддзеркалити по оÑÑ– Y +keybind.schematic_flip_x.name = Віддзеркалити за віÑÑÑŽ X +keybind.schematic_flip_y.name = Віддзеркалити за віÑÑÑŽ Y keybind.category_prev.name = ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ keybind.category_next.name = ÐаÑтупна ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ keybind.block_select_left.name = Вибрати блок ліворуч @@ -788,15 +897,17 @@ keybind.diagonal_placement.name = Діагональне Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ keybind.pick.name = Вибрати блок keybind.break_block.name = Зламати блок keybind.deselect.name = СкаÑувати -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = ВзÑти вантаж +keybind.dropCargo.name = Скинути вантаж +keybind.command.name = ВзÑти ÐºÐ¾Ð¼Ð°Ð½Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð´ одиницÑми keybind.shoot.name = ПоÑтріл keybind.zoom.name = Ðаблизити keybind.menu.name = Меню keybind.pause.name = Пауза -keybind.pause_building.name = Призупинити/Продовжити Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ +keybind.pause_building.name = Призупинити/продовжити Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ keybind.minimap.name = Мінімапа +keybind.planet_map.name = Планетна мапа +keybind.research.name = ДоÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ keybind.chat.name = Чат keybind.player_list.name = СпиÑок гравців keybind.console.name = КонÑоль @@ -806,6 +917,7 @@ keybind.toggle_menus.name = Меню Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ keybind.chat_history_prev.name = ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñ–ÑÑ‚Ð¾Ñ€Ñ–Ñ Ñ‡Ð°Ñ‚Ñƒ keybind.chat_history_next.name = ÐаÑтупна Ñ–ÑÑ‚Ð¾Ñ€Ñ–Ñ Ñ‡Ð°Ñ‚Ñƒ keybind.chat_scroll.name = Прокрутка чату +keybind.chat_mode.name = Змінити режим чату keybind.drop_unit.name = Скинути бойову одиницю keybind.zoom_minimap.name = Збільшити мінімапу mode.help.title = ÐžÐ¿Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñ–Ð² гри @@ -819,9 +931,10 @@ mode.pvp.description = БорітьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¸ інших гравців.\n[ mode.attack.name = Ðтака mode.attack.description = Зруйнуйте ворожу базу. \n[gray]Потрібно червоне Ñдро на мапі Ð´Ð»Ñ Ð³Ñ€Ð¸. mode.custom = КориÑтувацькі правила - rules.infiniteresources = ÐеÑкінченні реÑурÑи rules.reactorexplosions = Вибухи реактора +rules.coreincinerates = Ядро Ñпалює надлишкові предмети +rules.schematic = ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñхем дозволено rules.wavetimer = Таймер Ð´Ð»Ñ Ñ…Ð²Ð¸Ð»ÑŒ rules.waves = Хвилі rules.attack = Режим атаки @@ -832,11 +945,14 @@ rules.blockdamagemultiplier = Множник шкоди блоків rules.unitbuildspeedmultiplier = Множник швидкоÑті виробництва бойових одиниць rules.unithealthmultiplier = Множник Ð·Ð´Ð¾Ñ€Ð¾Ð²â€™Ñ Ð±Ð¾Ð¹Ð¾Ð²Ð¸Ñ… одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць +rules.unitcapvariable = Ядра збільшують Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° кількіÑть одиниць +rules.unitcap = Початкове Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†ÑŒ + rules.enemycorebuildradius = Ð Ð°Ð´Ñ–ÑƒÑ Ð¾Ð±Ð¾Ñ€Ð¾Ð½Ð¸ Ð´Ð»Ñ Ð²Ð¾Ñ€Ð¾Ð¶Ð¾Ð³Ð¾ Ñдра:[lightgray] (плитки) rules.wavespacing = Інтервал хвиль:[lightgray] (Ñекунди) rules.buildcostmultiplier = Множник затрат на Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ rules.buildspeedmultiplier = Множник швидкоÑті Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ -rules.deconstructrefundmultiplier = Множник Ð²Ñ–Ð´ÑˆÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ разі демонтажу +rules.deconstructrefundmultiplier = Множник Ð²Ñ–Ð´ÑˆÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð² разі демонтажу rules.waitForWaveToEnd = Хвилі чекають на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ñ— rules.dropzoneradius = Ð Ð°Ð´Ñ–ÑƒÑ Ð·Ð¾Ð½Ð¸ виÑадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпаÑів @@ -847,17 +963,19 @@ rules.title.unit = Бойові одиниці rules.title.experimental = ЕкÑпериментальне rules.title.environment = Середовище rules.lighting = Світлотінь +rules.enemyLights = Ворожі вогні rules.fire = Вогонь rules.explosions = Шкода від вибухів блоків Ñ– одиниць rules.ambientlight = Ðавколишнє Ñвітло rules.weather = Погода rules.weather.frequency = ПовторюваніÑть: rules.weather.duration = ТриваліÑть: - content.item.name = Предмети content.liquid.name = Рідини content.unit.name = Бойові одиниці content.block.name = Блоки +content.status.name = Ефекти Ñтану +content.sector.name = Cектори item.copper.name = Мідь item.lead.name = Свинець item.coal.name = Ð’ÑƒÐ³Ñ–Ð»Ð»Ñ @@ -871,31 +989,13 @@ item.surge-alloy.name = Кінетичний Ñплав item.spore-pod.name = Споровий Ñтручок item.sand.name = ПіÑок item.blast-compound.name = Вибухова Ñуміш -item.pyratite.name = Піротит +item.pyratite.name = Пиротит item.metaglass.name = МетаÑкло item.scrap.name = Брухт liquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Ðафта liquid.cryofluid.name = Кріогенна рідина - -item.explosiveness = [lightgray]ВибухонебезпечніÑть: {0} % -item.flammability = [lightgray]ВогненебезпечніÑть: {0} % -item.radioactivity = [lightgray]РадіоактивніÑть: {0} % - -unit.health = [lightgray]Здоров’Ñ: {0} -unit.speed = [lightgray]ШвидкіÑть: {0} -unit.weapon = [lightgray]ЗброÑ: {0} -unit.itemcapacity = [lightgray]МіÑткіÑть елементів: {0} -unit.minespeed = [lightgray]ШвидкіÑть видобутку: {0} % -unit.minepower = [lightgray]ПотужніÑть видобутку: {0} -unit.ability = [lightgray]ЗдібніÑть: {0} -unit.buildspeed = [lightgray]ШвидкіÑть будуваннÑ: {0} % - -liquid.heatcapacity = [lightgray]ТеплоємніÑть: {0} -liquid.viscosity = [lightgray]В’ÑзкіÑть: {0} -liquid.temperature = [lightgray]Температура: {0} - unit.dagger.name = Кинджал unit.mace.name = Булава unit.fortress.name = Ð¤Ð¾Ñ€Ñ‚ÐµÑ†Ñ @@ -907,35 +1007,36 @@ unit.atrax.name = ÐÑ‚Ñ€Ð°ÐºÑ unit.spiroct.name = Павучник unit.arkyid.name = Ðркиїд unit.toxopid.name = Отруйник -unit.flare.name = Фальшфеєр +unit.flare.name = Фальшфейєр unit.horizon.name = Горизонт unit.zenith.name = Зеніт unit.antumbra.name = Тіньовик unit.eclipse.name = Затьмарник -unit.mono.name = Єдинак -unit.poly.name = Багацько +unit.mono.name = Моно +unit.poly.name = Полі unit.mega.name = Мега -unit.quad.name = Quad -unit.oct.name = Oct +unit.quad.name = Квад +unit.oct.name = Окт unit.risso.name = Ð“Ñ€Ð°Ð¼Ð¿ÑƒÑ -unit.minke.name = Смугач малий -unit.bryde.name = Смугач Брайда -unit.sei.name = Sei -unit.omura.name = Omura +unit.minke.name = Смугач +unit.bryde.name = Брайд +unit.sei.name = Сейвал +unit.omura.name = Омура unit.alpha.name = Ðльфа unit.beta.name = Бета unit.gamma.name = Гамма unit.scepter.name = Верховна влада unit.reign.name = Верховний ПорÑдок -unit.vela.name = Vela -unit.corvus.name = Corvus - +unit.vela.name = ПульÑар Вітрил +unit.corvus.name = Òава block.resupply-point.name = Пункт поÑÑ‚Ð°Ñ‡Ð°Ð½Ð½Ñ block.parallax.name = ÐŸÐ°Ñ€Ð°Ð»Ð°ÐºÑ block.cliff.name = Ð¡ÐºÐµÐ»Ñ block.sand-boulder.name = ПіÑочний валун +block.basalt-boulder.name = Базальтовий валун block.grass.name = Трава block.slag.name = Шлак +block.space.name = КоÑÐ¼Ð¾Ñ block.salt.name = Сіль block.salt-wall.name = СолÑна Ñтіна block.pebbles.name = Галька @@ -960,7 +1061,7 @@ block.thruster.name = Штовхач block.kiln.name = Піч block.graphite-press.name = Графітний Ð¿Ñ€ÐµÑ block.multi-press.name = ÐœÑƒÐ»ÑŒÑ‚Ð¸Ð¿Ñ€ÐµÑ -block.constructing = {0}\n[lightgray](Ð’ процеÑÑ–) +block.constructing = {0}\n[lightgray](У процеÑÑ–) block.spawn.name = МіÑце поÑви противника block.core-shard.name = Ядро «Уламок» block.core-foundation.name = Ядро «Штаб» @@ -981,6 +1082,7 @@ block.darksand-water.name = Темний піÑок із водою block.char.name = Випалена Ð·ÐµÐ¼Ð»Ñ block.dacite.name = Дацит block.dacite-wall.name = Дацитова Ñтіна +block.dacite-boulder.name = Дацитовий валун block.ice-snow.name = Крижаний Ñніг block.stone-wall.name = Кам’Ñна Ñтіна block.ice-wall.name = Крижана Ñтіна @@ -989,7 +1091,7 @@ block.dune-wall.name = Дюнова Ñтіна block.pine.name = СоÑна block.dirt.name = Òрунт block.dirt-wall.name = Òрунтова Ñтіна -block.mud.name = Mud +block.mud.name = Багно block.white-tree-dead.name = Мертве біле дерево block.white-tree.name = Біле дерево block.spore-cluster.name = Ð¡ÐºÑƒÐ¿Ñ‡ÐµÐ½Ð½Ñ Ñпор @@ -1029,7 +1131,6 @@ block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр block.plastanium-conveyor.name = ПлаÑтанієвий конвеєр block.armored-conveyor.name = Броньований конвеєр -block.armored-conveyor.description = Переміщує предмети з тією ж швидкіÑтю, що й титанові конвеєри, але має більше міцноÑті. Ðе приймає Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð· боків ні з чого, крім інших конвеєрних Ñтрічок. block.junction.name = ПерехреÑÑ‚Ñ block.router.name = Маршрутизатор block.distributor.name = Розподілювач @@ -1037,7 +1138,6 @@ block.sorter.name = Сортувальник block.inverted-sorter.name = Зворотній Ñортувальник block.message.name = ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ block.illuminator.name = ОÑвітлювач -block.illuminator.description = Ðевелике, компактне, джерело Ñвітла, Ñку можна налаштувати. Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потребує енергії. block.overflow-gate.name = Ðадмірний затвор block.underflow-gate.name = ÐедоÑтатній затвор block.silicon-smelter.name = Кремнієвий плавильний завод @@ -1062,7 +1162,7 @@ block.impact-reactor.name = ІмпульÑний реактор block.mechanical-drill.name = Механічний бур block.pneumatic-drill.name = Пневматичний бур block.laser-drill.name = Лазерний бур -block.water-extractor.name = КонденÑатор води +block.water-extractor.name = ЕкÑтрактор води block.cultivator.name = Культиватор block.conduit.name = Трубопровід block.mechanical-pump.name = Механічна помпа @@ -1073,15 +1173,16 @@ block.liquid-void.name = Рідинний вакуум block.power-void.name = Енергетичний вакуум block.power-source.name = ÐеÑкінченне джерело енергії block.unloader.name = Розвантажувач -block.vault.name = ВміÑтилище +block.vault.name = Склад block.wave.name = Ð¥Ð²Ð¸Ð»Ñ +block.tsunami.name = Цунамі block.swarmer.name = Роєвик block.salvo.name = Залп block.ripple.name = РÑб block.phase-conveyor.name = Фазовий конвеєр block.bridge-conveyor.name = МоÑтовий конвеєр block.plastanium-compressor.name = ПлаÑтанієвий компреÑор -block.pyratite-mixer.name = Змішувач піротита +block.pyratite-mixer.name = Змішувач пиротита block.blast-mixer.name = Змішувач вибухонебезпечного Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ block.solar-panel.name = СонÑчна панель block.solar-panel-large.name = Велика ÑонÑчна панель @@ -1114,9 +1215,10 @@ block.arc.name = Дуга block.rtg-generator.name = Радіоізотопний термоелектричний генератор block.spectre.name = Спектр block.meltdown.name = Розплавлювач +block.foreshadow.name = ПередвіÑник block.container.name = Сховище -block.launch-pad.name = Стартовий майданчик -block.launch-pad-large.name = Великий Ñтартовий майданчик +block.launch-pad.name = ПуÑковий майданчик +block.launch-pad-large.name = Великий пуÑковий майданчик block.segment.name = Сегмент block.command-center.name = Командний центр block.ground-factory.name = Ðаземний завод @@ -1130,8 +1232,11 @@ block.payload-conveyor.name = Вантажний конвеєр block.payload-router.name = Розвантажувальний маршрутизатор block.disassembler.name = Розбирач block.silicon-crucible.name = Кремнієвий тигель -block.overdrive-dome.name = Overdrive Dome - +block.overdrive-dome.name = Великий приÑкорювач +block.block-forge.name = Блок-ÐºÑƒÐ·Ð½Ñ +block.block-loader.name = Блок-завантажувач +block.block-unloader.name = Блок-вивантажувач +block.interplanetary-accelerator.name = Міжпланетний приÑкорювач block.switch.name = Перемикач block.micro-processor.name = МікропроцеÑор block.logic-processor.name = Логічний процеÑор @@ -1139,167 +1244,395 @@ block.hyper-processor.name = ГіперпроцеÑор block.logic-display.name = Логічний диÑплей block.large-logic-display.name = Великий логічний диÑплей block.memory-cell.name = Комірка пам’Ñті - +block.memory-bank.name = Блок пам’Ñті team.blue.name = Ð¡Ð¸Ð½Ñ team.crux.name = Червона team.sharded.name = Помаранчева team.orange.name = Помаранчева -team.derelict.name = Залишена +team.derelict.name = Знедолена team.green.name = Зелена team.purple.name = Фіолетова +hint.skip = ПропуÑтити +hint.desktopMove = ВикориÑтовуйте [accent][[WASD][], щоби рухатиÑÑ. +hint.zoom = [accent]Прокручуйте коліщатком миші[], щоби збільшити чи зменшити маÑштаб мапи. +hint.mine = ÐаблизьтеÑÑŒ до  мідної руди Ñ– [accent]торкнітьÑÑ[] Ñ—Ñ—, щоби видобувати вручну. +hint.desktopShoot = [accent][[ЛКМ][] Ð´Ð»Ñ Ñтрільби. +hint.depositItems = Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– предметів проÑто перетÑгніть із ÐºÐ¾Ñ€Ð°Ð±Ð»Ñ Ð² Ñдро. +hint.respawn = Ð”Ð»Ñ Ð²Ñ–Ð´Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¼ натиÑніть [accent][[V][]. +hint.respawn.mobile = Ви контролюєте одиницю чи Ñтруктуру. Щоби відродитиÑÑ Ñк корабель, [accent]торкнітьÑÑ Ñвого аватара вгорі ліворуч.[] +hint.desktopPause = ÐатиÑніть [accent][[Пробіл][], щоби зупинити чи продовжити гру. +hint.placeDrill = Виберіть у меню внизу праворуч вкладку  [accent]Бур[], потім виберіть ï¡° [accent]Механічний бур[] та натиÑніть на мідний клаптик Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ розміщеннÑ. +hint.placeDrill.mobile = Виберіть у меню внизу праворуч вкладку  [accent]Бур[], потім виберіть ï¡° [accent]Механічний бур[] та натиÑніть на мідний клаптик Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ розміщеннÑ.\n\nÐатиÑніть внизу праворуч î € [accent]галку[] Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ. +hint.placeConveyor = Конвеєри переміщують предмети з бурів до інших блоків. Виберіть  [accent]конвеєр[] з вкладки î ” [accent]ТранÑпортуваннÑ[].\n\nÐатиÑніть Ñ– Ñ‚Ñгніть, щоби розміÑтити декілька конвеєрів.\n[accent]Прокручуйте коліщатком миші[], щоб обертати Ñ—Ñ…. +hint.placeConveyor.mobile = Конвеєри переміщують предмети з бурів до інших блоків. Виберіть  [accent]конвеєр[] з вкладки î ” [accent]ТранÑпортуваннÑ[].\n\nУтримуйте палець протÑгом Ñекунди Ñ– протÑгніть, щоби розміÑтити декілька конвеєрів. +hint.placeTurret = РозміÑтіть ï¡¡ [accent]башти[], щоби захиÑтити базу від ворогів.\n\nБашти потребують боєприпаÑів. У цьому випадку \uf838мідь.\nÐ”Ð»Ñ Ñ—Ñ— подачі викориÑтовуйте конвеєри та бури. +hhint.breaking = ÐатиÑніть [accent]ПКМ[] Ñ– Ñ‚Ñгніть, щоби зруйнувати блоки. +hint.breaking.mobile = Ðктивуйте î — [accent]молот[] внизу праворуч Ñ– торкнітьÑÑ Ð±Ð»Ð¾ÐºÑ–Ð², щоби Ñ—Ñ… розібрати.\n\nУтримуйте палець протÑгом Ñекунди Ñ– протÑгніть, щоби розібрати виділене. +hint.research = ВикориÑтовуйте кнопку  [accent]ДоÑлідженнÑ[] Ð´Ð»Ñ Ð´Ð¾ÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ— технології. +hint.research.mobile = ВикориÑтовуйте  [accent]ДоÑлідженнÑ[] в  [accent]меню[] Ð´Ð»Ñ Ð´Ð¾ÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ— технології. +hint.unitControl = Утримуйте [accent][[лівий Ctrl][] Ñ– [accent]натиÑніть[] на одиницю чи башту, щоби контролювати Ñ—Ñ—. +hint.unitControl.mobile = [accent][ТоркнітьÑÑ Ð´Ð²Ñ–Ñ‡Ñ–[], щоби контролювати Ñоюзні одиниці чи башти. +hint.launch = Як тільки буде зібрано доÑтатньо реÑурÑів, ви зможете зробити [accent]ЗапуÑк[] за допомогою вибору найближчих Ñекторів î § [accent]мапи[] внизу праворуч. +hint.launch.mobile = Як тільки буде зібрано доÑтатньо реÑурÑів, ви зможете зробити [accent]ЗапуÑк[] за допомогою вибору найближчих Ñекторів з î § [accent]мапи[] у  [accent]меню[]. +hint.schematicSelect = Утримуйте [accent][[F][] Ñ– Ñ‚Ñгніть, щоби вибрати блоки Ð´Ð»Ñ Ñ—Ñ…Ð½ÑŒÐ¾Ð³Ð¾ подальшого ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– вÑтавленнÑ.\n\nÐатиÑніть [accent][[СКМ][], щоби Ñкопіювати певний тип блоку. +hint.conveyorPathfind = Утримуйте [accent][[лівий Ctrl][], коли Ñ‚Ñгнете конвеєри, щоб автоматично проклаÑти шлÑÑ…. +hint.conveyorPathfind.mobile = Увімкніть î¡„ [accent]діагональний режим[] Ñ– Ñ‚Ñгніть конвеєри, щоб автоматично проклаÑти шлÑÑ…. +hint.boost = Утримуйте [accent][[лівий Shift][], щоби літати над перешкодами поточною одиницею.\n\nЛише декілька наземних одиниць мають цю перевагу. +hint.command = ÐатиÑніть [accent][[G][], щоб узÑти ÐºÐ¾Ð¼Ð°Ð½Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð´ найближчими одиницÑми [accent]Ñхожого типу[] Ñ– Ñформувати загін.\n\nЩоб командувати наземними одиницÑми, ви муÑите Ñпершу взÑти контроль над іншою наземною одиницею. +hint.command.mobile = [accent][[ТоркнітьÑÑ Ð´Ð²Ñ–Ñ‡Ñ–][] Ñвоєї одиниці, щоб узÑти ÐºÐ¾Ð¼Ð°Ð½Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð´ найближчими Ñоюзними одиницÑми Ñ– Ñформувати загін. +hint.payloadPickup = ÐатиÑніть [accent][[[], щоби підібрати невеличкі блоки чи одиниці. +hint.payloadPickup.mobile = [accent]ТоркнітьÑÑ Ð¹ утримуйте[] невеличкий блок чи одиницю, щоби підібрати Ñ—Ñ…. +hint.payloadDrop = ÐатиÑніть [accent]][], щоби вивантажити вантаж. +hint.payloadDrop.mobile = [accent]ТоркнітьÑÑ[] вільного міÑÑ†Ñ Ð¹ [accent]утримуйте[], щоби вивантажити туди вантаж. +hint.waveFire = Башта [accent]ХвилÑ[] з водою буде автоматично гаÑити найближчі пожежі. +hint.generator =  [accent]Генератори внутрішнього згораннÑ[] Ñпалюють Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ Ñ– передають енергію прилеглим блокам.\n\nÐ Ð°Ð´Ñ–ÑƒÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– енергії можна збільшити за допомогою ï¡¿ [accent]Ñилових вузлів[]. +hint.guardian = [accent]Вартові[] одиниці броньовані. Слабкі боєприпаÑи, Ñк-от [accent]мідь[] чи [accent]Ñвинець[], [scarlet]не Ñ” ефективними[].\n\nВикориÑтовуйте башти вищого рангу чи ï µ [accent]графітові боєприпаÑи[] Ð´Ð»Ñ ÐŸÐ¾Ð´Ð²Ñ–Ð¹Ð½Ð¾Ñ— башти чиЗалпу, щоб убити Вартових. +hint.coreUpgrade = Ядро можна покращити, Ñкщо [accent]розміÑтити поверх нього Ñдро вищого рівнÑ[].\n\nРозміÑтіть  Ñдро [accent]«Штаб»[] поверх ï¡© Ñдра [accent]«Уламок»[]. ПереконайтеÑÑŒ, що поблизу Ñдер немає перешкод (зайвих блоків). +hint.presetLaunch = Сірі [accent]Ñектори зони поÑадки[], Ñк-от [accent]Крижаний ліÑ[], можна запуÑтити з будь-Ñкого міÑцÑ. Вони не вимагають Ð·Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ ÑуÑідньої території.\n\n[accent]Ðумеровані Ñектори[], Ñк цей, [accent]необовʼÑзкові[]. +hint.coreIncinerate = ПіÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк Ñдро наповнитьÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð¼, будь-Ñкі додаткові предмети того ж типу, Ñкі воно отримує, будуть [accent]Ñпалені[]. -tutorial.next = [lightgray]<ÐатиÑніть Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ> -tutorial.intro = Ви розпочали[scarlet] Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð· Mindustry.[]\nВикориÑтовуйте[accent] [[WASD][] Ð´Ð»Ñ Ñ€ÑƒÑ…Ñƒ.\n[accent]Прокручуйте миш[] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð¶ÐµÐ½Ð½Ñ Ñ– віддаленнÑ.\nРозпочніть з [accent]Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð´Ñ–[]. ÐаблизьтеÑÑŒ до мідної жили Ð±Ñ–Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ñдра, а потім натиÑніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді -tutorial.intro.mobile = Ви розпочали[scarlet] Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð· Mindustry.[]\nПроведіть по екрану Ð´Ð»Ñ Ñ€ÑƒÑ…Ñƒ.\n[accent] Зведіть або розведіть 2 пальцÑ[] Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð¶ÐµÐ½Ð½Ñ Ñ– Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾.\nРозпочніть з [accent]Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð´Ñ–[]. ÐаблизьтеÑÑŒ до мідної жили Ð±Ñ–Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ñдра, а потім натиÑніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді -tutorial.drill = Ð”Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ не Ñ” ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nÐатиÑніть на вкладку із зображеннÑм Ñвердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. РозміÑтіть його на мідній жилі натиÑканнÑм.\nВи також можете вибрати бур, натиÑнувши [accent][[2][], а потім швидко натиÑнувши [accent][[1][], незалежно від розгорнутої вкладки.\n[accent]ÐатиÑніть ПКМ[], щоби зупинити будуваннÑ. -tutorial.drill.mobile = Ð”Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ не Ñ” ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nÐатиÑніть на вкладку із зображеннÑм Ñвердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозміÑтіть його на мідній жилі натиÑканнÑм, потім натиÑніть на [accent]галочку[] нижче, щоби підтвердити розміщеннÑ.\nÐатиÑніть [accent]кнопку X[], щоби ÑкаÑувати розміщеннÑ. -tutorial.blockinfo = Кожний блок має різні характериÑтики. Кожний бур може видобувати тільки певні руди.\nЩоб переглÑнути інформацію та характериÑтики блока,[accent] натиÑніть на кнопку «?», коли ви вибрали блок у меню будуваннÑ.[]\n\n[accent]ПереглÑньте характериÑтику Механічного бура негайно.[] -tutorial.conveyor = [accent]Конвеєри[] викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ–Ð² до Ñдра.\nПобудуйте лінію конвеєрів від бура до Ñдра.\n[accent]Утримуйте миш Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² лінію.[]\nУтримуйте[accent] CTRL[] під Ñ‡Ð°Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ лінії Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ діагоналі.\nПрокручуйте, щоб обертати блоки до Ñ—Ñ… уÑтановленнÑ.\n[accent]РозміÑтіть 2 конвеєри в лінію, а потім доÑтавте предмет у Ñдро. -tutorial.conveyor.mobile = [accent]Конвеєри[] викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ–Ð² до Ñдра.\nПобудуйте лінію конвеєрів від бура до Ñдра.\n[accent] РозміÑтить у лінію, утримуючи палець кілька Ñекунд[] Ñ– Ñ‚Ñгніть у напрÑмку, Ñкий Ви обрали.\n\n[accent]РозміÑтіть 2 конвеєри в лінію, а потім доÑтавте предмет у Ñдро. -tutorial.turret = Щойно предмет потрапить до Ñдра, він може бути викориÑтаний у будівництві.\nМайте на увазі, не вÑÑ– предмети придатні Ð´Ð»Ñ Ð±ÑƒÐ´Ñ–Ð²Ð½Ð¸Ñ†Ñ‚Ð²Ð°.\nПредмети що не викориÑтовуютьÑÑ Ð² будівництві, такі Ñк[accent] вугіллÑ[] чи[accent] брухт[], не можуть потрапити до Ñдра.\nОборонні Ñпоруди мають бути побудовані Ð´Ð»Ñ Ð²Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] Ð±Ñ–Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— бази. -tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаÑи[] Ð´Ð»Ñ Ñтрільби.\nРозміÑтіть бур Ð±Ñ–Ð»Ñ Ð±Ð°ÑˆÑ‚Ð¸.\nПроведіть конвеєри до башти, щоби заповнити Ñ—Ñ— боєприпаÑами.\n\n [accent]ДоÑтавлено боєприпаÑів: 0/1 -tutorial.pause = Під Ñ‡Ð°Ñ Ð³Ñ€Ð¸ ви можете[accent] поÑтавити на паузу.[]\nВи можете зробити чергу на Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°ÑƒÐ·Ð¸.\n\n [accent]ÐатиÑніть пробіл Ð´Ð»Ñ Ð¿Ð°ÑƒÐ·Ð¸. -tutorial.pause.mobile = Під Ñ‡Ð°Ñ Ð³Ñ€Ð¸ ви можете[accent] поÑтавити на паузу.[]\nВи можете зробити чергу на Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°ÑƒÐ·Ð¸.\n\n[accent]ÐатиÑніть кнопку вгорі ліворуч Ð´Ð»Ñ Ð¿Ð°ÑƒÐ·Ð¸. -tutorial.unpause = Призупиніть гру, натиÑнувши на пробіл. -tutorial.unpause.mobile = Тепер натиÑніть туди ще раз, щоби знÑти паузу. -tutorial.breaking = Блоки чаÑто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите вÑÑ– виділені блоки.[]\n\n[accent]Ðеобхідно знищити вÑÑ– Ñтіни з брухту ліворуч від вашого Ñдра викориÑтовуючи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð² зоні. -tutorial.breaking.mobile = Блоки чаÑто треба знищувати.\n[accent]Виберіть режим руйнуваннÑ[], потім натиÑніть на блок, щоби зламати його.\nВидаліть ділÑнку, утримуючи палець упродовж декількох Ñекунд [] Ñ– потÑгнувши в потрібному напрÑмку.\nÐатиÑніть кнопку галочки, щоби підтвердити руйнуваннÑ.\n\n[accent]Ðеобхідно знищити вÑÑ– Ñтіни з брухту ліворуч від вашого Ñдра викориÑтовуючи Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð² зоні. -tutorial.withdraw = У деÑких ÑитуаціÑÑ… потрібно брати предмети безпоÑередньо з блоків.\nЩоб зробити це, [accent]натиÑніть на блок[] з предметами, Ñ– потім [accent]натиÑніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натиÑкаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з Ñдра.[] -tutorial.deposit = Покладіть предмети в блок, перетÑгнувши з вашого ÐºÐ¾Ñ€Ð°Ð±Ð»Ñ Ð² потрібний блок.\n\n[accent]Покладіть мідь назад у Ñдро.[] -tutorial.waves = [lightgray]Противник[] з’ÑвивÑÑ.\n\nЗахиÑтіть Ñдро від двох хвиль.[accent] ÐатиÑніть ЛКМ[], щоби ÑтрілÑти.\nПобудуйте більше башт Ñ– бурів. Добудьте більше міді. -tutorial.waves.mobile = [lightgray]Противник[] з’ÑвивÑÑ.\n\nЗахиÑтіть Ñдро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт Ñ– бурів. Добудьте більше міді. -tutorial.launch = Як тільки ви доÑÑгнете певної хвилі, ви зможете[accent] запуÑтити Ñдро[], залишивши Ñвою базу позаду, та [accent]отримати вÑÑ– реÑурÑи у вашому Ñдрі.[]\nЦі отримані реÑурÑи можуть бути викориÑтані Ð´Ð»Ñ Ð´Ð¾ÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… технологій.\n\n[accent]ÐатиÑніть кнопку запуÑку. - -item.copper.description = Початковий будівельний матеріал. Широко викориÑтовуєтьÑÑ Ñƒ вÑÑ–Ñ… типах блоків. -item.lead.description = ОÑновний початковий матеріал. Широко заÑтоÑовуєтьÑÑ Ð² електроніці та в транÑпортуванні рідин. -item.metaglass.description = Дуже жорÑткий Ñклад Ñкла. Широко заÑтоÑовуєтьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ð¾Ð´Ñ–Ð»Ñƒ та Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸. -item.graphite.description = Мінералізований вуглець, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð±Ð¾Ñ”Ð¿Ñ€Ð¸Ð¿Ð°Ñів та Ñк електричний компонент. -item.sand.description = Поширений матеріал, Ñкий широко викориÑтовуєтьÑÑ Ñƒ виплавці, Ñк під Ñ‡Ð°Ñ ÑплавленнÑ, так Ñ– в ÑкоÑті відходів. -item.coal.description = Скам’Ñнілі роÑлинні речовини, що утворилиÑÑ Ð·Ð°Ð´Ð¾Ð²Ð³Ð¾ до поÑіву. Широко викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° пального та реÑурÑів. -item.titanium.description = РідкіÑний надлегкий метал, Ñкий широко викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸, бурів Ñ– літаків. -item.thorium.description = Щільний радіоактивний метал, що викориÑтовуєтьÑÑ Ð² ÑкоÑті конÑтрукційної опори та Ñдерного палива. -item.scrap.description = Залишки Ñтарих Ñпоруд та підрозділів. МіÑтить мікроелементи багатьох різних металів. -item.silicon.description = Ðадзвичайно кориÑний напівпровідник. Має заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð² ÑонÑчних батареÑÑ…, Ñкладній електроніці та боєприпаÑах Ð´Ð»Ñ Ð±Ð°ÑˆÑ‚. -item.plastanium.description = Легкий плаÑтичний матеріал, що викориÑтовуєтьÑÑ Ð² ÑучаÑних літальних апаратах та у фрагментованих боєприпаÑах. -item.phase-fabric.description = Майже невагома речовина, що заÑтоÑовуєтьÑÑ Ð² передовій електроніці та в технології ÑамовідновленнÑ. -item.surge-alloy.description = УдоÑконалений Ñплав з унікальними електричними влаÑтивоÑÑ‚Ñми. -item.spore-pod.description = Струмок Ñинтетичних Ñпор, Ñинтезований з атмоÑферних концентрацій Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ð¸Ñлових цілей. ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð° нафту, вибухівку та паливо. -item.blast-compound.description = ÐеÑтабільна Ñполука, Ñка викориÑтовуєтьÑÑ Ð² бомбах Ñ– вибухівках. СинтезуєтьÑÑ Ð·Ñ– Ñпорових Ñтручків та інших летких речовин. ВикориÑтовувати Ñк паливо не рекомендуєтьÑÑ. -item.pyratite.description = Ðадзвичайно легкозаймиÑта речовина, що викориÑтовуєтьÑÑ Ð² запальній зброї. -liquid.water.description = ÐайкориÑніша рідина. Зазвичай викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°ÑˆÐ¸Ð½ та Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñ…Ð¾Ð´Ñ–Ð². -liquid.slag.description = Різні види розплавленого металу змішуютьÑÑ Ð¼Ñ–Ð¶ Ñобою. Може бути відокремлений від Ñкладових кориÑних копалин або розпорошений на ворожі чаÑтини Ñк зброÑ. -liquid.oil.description = Рідина, Ñка викориÑтовуєтьÑÑ Ñƒ виробництві ÑучаÑних матеріалів. Може бути перетворена у Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ Ð² ÑкоÑті палива або викориÑтана Ñк кулÑ. -liquid.cryofluid.description = Інертна рідина, що Ñтворена з води та титану. Має здатніÑть надзвичайно виÑокою пропуÑкною ÑпроможніÑтю. Широко викориÑтовуєтьÑÑ Ð² ÑкоÑті рідини, що охолоджує. - -block.message.description = Зберігає повідомленнÑ. ВикориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼ÑƒÐ½Ñ–ÐºÐ°Ñ†Ñ–Ñ— між Ñоюзниками. -block.graphite-press.description = СтиÑкає шматки Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ Ð² чиÑті аркуші графіту. -block.multi-press.description = Модернізована верÑÑ–Ñ Ð³Ñ€Ð°Ñ„Ñ–Ñ‚Ð¾Ð²Ð¾Ð³Ð¾ преÑа. ВикориÑтовує воду та енергію Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð³Ð¾ та ефективного Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ. -block.silicon-smelter.description = Змішує піÑок із чиÑтим вугіллÑм. ВироблÑÑ” кремній. -block.kiln.description = ВиплавлÑÑ” піÑок та Ñвинець у Ñполуку, відому Ñк метаÑкло. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑку потрібна невелика кількіÑть енергії. -block.plastanium-compressor.description = ВироблÑÑ” плаÑтаній із нафти та титану. -block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піÑку. Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потрібна велика кількіÑть енергії. +item.copper.description = ВикориÑтовуєтьÑÑ Ñƒ вÑÑ–Ñ… типах блоків Ñ– боєприпаÑах. +item.copper.details = Мідь. Ðапрочуд багато жил цієї руди на Серпуло. За Ñвоєю Ñтруктурою Ñлабка, Ñкщо не зміцнена. +item.lead.description = Широко викориÑтовуєтьÑÑ Ð² електроніці та в транÑпортуванні рідин. +item.lead.details = Сплав. Інертний. Широко викориÑтовуєтьÑÑ Ð² акумулÑторах.\nПримітка. Мабуть, токÑичний Ð´Ð»Ñ Ð±Ñ–Ð¾Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¸Ñ… форм життÑ. Ðе те щоби тут залишилоÑÑ Ð±Ð°Ð³Ð°Ñ‚Ð¾â€¦ +item.metaglass.description = ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ð¾Ð´Ñ–Ð»Ñƒ чи Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸. +item.graphite.description = ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð±Ð¾Ñ”Ð¿Ñ€Ð¸Ð¿Ð°Ñів та електричних компонентів. +item.sand.description = ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° інших удоÑконалених матеріалів. +item.coal.description = ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸Ñ†Ñ‚Ð²Ð° палива Ñ– вдоÑконалених матеріалів. +item.coal.details = ВиглÑдає Ñкам’Ñнілою роÑлинною речовиною, утвореною задовго до Сівби. +item.titanium.description = ВикориÑтовуєтьÑÑ Ð² транÑпортуванні рідин, бурів та авіації. +item.thorium.description = ВикориÑтовуєтьÑÑ Ð² міцних конÑтрукціÑÑ… Ñ– Ñк Ñдерне паливо. +item.scrap.description = ВикориÑтовуєтьÑÑ Ð² ПлавильнÑÑ… Ñ– Подрібнювачах Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÐµÐ½Ð½Ñ Ð² інші матеріали в інші матеріали. +item.scrap.details = Залишки Ñтарих Ñпоруд та підрозділів. +item.silicon.description = ВикориÑтовуєтьÑÑ Ð² ÑонÑчних панелÑÑ…, Ñкладній електроніці та боєприпаÑах ÑÐ°Ð¼Ð¾Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð±Ð°ÑˆÑ‚. +item.plastanium.description = ВикориÑтовуєтьÑÑ Ð² передових одиницÑÑ… та у фрагментованих боєприпаÑах. +item.phase-fabric.description = ВикориÑтовуєтьÑÑ Ð² передовій електроніці й технології ÑамовідновленнÑ. +item.surge-alloy.description = ВикориÑтовуєтьÑÑ Ð² передовій зброї та реактивних захиÑних конÑтрукціÑÑ…. +item.spore-pod.description = ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð° нафту, вибухівку та паливо. +item.spore-pod.details = Спори. Ðайімовірніше, Ñинтетична форма життÑ. ВиділÑють гази, токÑичні Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ біологічного життÑ. Ðадзвичайно загарбницька поведінка. ЛегкозаймиÑті при певних умовах. +item.blast-compound.description = ВикориÑтовуєтьÑÑ Ð² бомбах та в розривних боєприпаÑах. +item.pyratite.description = ВикориÑтовуєтьÑÑ Ð² запальній зброї Ñ– твердопаливних генераторах. +liquid.water.description = ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°ÑˆÐ¸Ð½ та Ð¿ÐµÑ€ÐµÑ€Ð¾Ð±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñ…Ð¾Ð´Ñ–Ð². +liquid.slag.description = ПерероблÑєтьÑÑ Ñƒ відокремлювачах у Ñкладові метали або розпорошуєтьÑÑ Ð½Ð° ворогів Ñк зброÑ. +liquid.oil.description = ВикориÑтовуєтьÑÑ Ñƒ виробництві передових матеріалів Ñ– Ñк запальні боєприпаÑи. +liquid.cryofluid.description = ВикориÑтовуєтьÑÑ Ñк теплоноÑій у реакторах, баштах Ñ– заводах. +block.resupply-point.description = Поповнює найближчі одиниці мідними боєприпаÑами. ÐеÑуміÑний з одиницÑми, що потребують зарÑду акумулÑтора. +block.armored-conveyor.description = Переміщує предмети вперед. Ðе приймає Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð· боків ні з чого, крім інших конвеєрних Ñтрічок. +block.illuminator.description = Випромінює Ñвітло. +block.message.description = Зберігає Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼ÑƒÐ½Ñ–ÐºÐ°Ñ†Ñ–Ñ— між Ñоюзниками. +block.graphite-press.description = СтиÑкає Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ Ð² графіт. +block.multi-press.description = СтиÑкає Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ Ð² графіт. Потребує воду Ð´Ð»Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ. +block.silicon-smelter.description = Синтезує піÑок із вугіллÑм Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÑ€ÐµÐ¼Ð½Ñ–ÑŽ. +block.kiln.description = ВиплавлÑÑ” піÑок та Ñвинець у метаÑкло. +block.plastanium-compressor.description = ВироблÑÑ” плаÑтаній із нафти й титану. +block.phase-weaver.description = Синтезує фазову тканину з торію та піÑку. block.alloy-smelter.description = Поєднує титан, Ñвинець, кремній Ñ– мідь Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÑ–Ð½ÐµÑ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ñплаву. -block.cryofluid-mixer.description = Змішує воду Ñ– дрібний порошок титану в кріогенну рідину. ОÑновне викориÑÑ‚Ð°Ð½Ð½Ñ Ð² торієвому реактору. -block.blast-mixer.description = Подрібнює Ñ– змішує ÑÐºÑƒÐ¿Ñ‡ÐµÐ½Ð½Ñ Ñпор із піротитом Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð±ÑƒÑ…Ð¾Ð²Ð¾Ñ— Ñуміші. -block.pyratite-mixer.description = Змішує вугіллÑ, Ñвинець та піÑок у легкозаймиÑтий піротит. -block.melter.description = РозплавлÑÑ” брухт у шлак Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑŒÑˆÐ¾Ð³Ð¾ перероблюваннÑ, або викориÑÑ‚Ð°Ð½Ð½Ñ Ð² баштах «ХвилÑ». -block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали. -block.spore-press.description = СтиÑкає Ñпорові Ñтручки під Ñильним тиÑком Ð´Ð»Ñ Ñинтезу нафти. +block.cryofluid-mixer.description = Змішує воду й подрібнений титан, щоби виробити кріогенну рідину. +block.blast-mixer.description = ВироблÑÑ” вибухову Ñуміш із піратиту Ñ– Ñпорових Ñтручків. +block.pyratite-mixer.description = Змішує вугіллÑ, Ñвинець та піÑок у легкозаймиÑтий пиротит. +block.melter.description = РозплавлÑÑ” брухт у шлак. +block.separator.description = Відокремлює шлак на його мінеральні компоненти. +block.spore-press.description = СтиÑкає Ñпорові Ñтручки Ð´Ð»Ñ ÑÐ¸Ð½Ñ‚ÐµÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñ„Ñ‚Ð¸. block.pulverizer.description = Подрібнює брухт у дрібний піÑок. -block.coal-centrifuge.description = Ðафта перетворюєтьÑÑ Ð² шматки вугіллÑ. -block.incinerator.description = Випаровує будь-Ñкий зайвий предмет або рідину, Ñкі він отримує. -block.power-void.description = Знищує будь-Ñку енергію, до Ñкої він під’єднаний. Тільки піÑочницÑ. -block.power-source.description = ПоÑтійно Ñтворює енергію. Тільки піÑочницÑ. +block.coal-centrifuge.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.liquid-void.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.plastanium-wall.description = ОÑобливий тип Ñтіни, Ñкий поглинає електричні дуги Ñ– блокує автоматичні Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÐµÐ½ÐµÑ€Ð³ÐµÑ‚Ð¸Ñ‡Ð½Ð¸Ñ… вузлів. -block.plastanium-wall-large.description = ОÑобливий тип Ñтіни, Ñкий поглинає електричні дуги Ñ– блокує автоматичні Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÐµÐ½ÐµÑ€Ð³ÐµÑ‚Ð¸Ñ‡Ð½Ð¸Ñ… вузлів.\nЗаймає декілька плиток. -block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників. -block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток. -block.phase-wall.description = Стіна має Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñпеціальним Ñкладом, що відбиває Ñвітло Ñ– Ñкий базуєтьÑÑ Ð½Ð° фазовій тканині. Здебільшого відбиває кулі у разі удару. -block.phase-wall-large.description = Стіна має Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñпеціальним Ñкладом, що відбиває Ñвітло Ñ– Ñкий базуєтьÑÑ Ð½Ð° фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток. -block.surge-wall.description = Ðадзвичайно міцний оборонний блок.\nЗбільшує зарÑд, Ñкщо контактуватиме з кулÑми, вивільнÑючи його випадковим чином. -block.surge-wall-large.description = Ðадзвичайно міцний оборонний блок.\nЗбільшує зарÑд, Ñкщо контактуватиме з кулÑми, вивільнÑючи його випадковим чином.\nЗаймає декілька плиток. -block.door.description = Ðевеликі двері. Можна відчинити або зачинити, натиÑнувши на них. -block.door-large.description = Великі двері. Можна відчинити та зачинити, натиÑнувши на них.\nЗаймає декілька плиток. -block.mender.description = Періодично ремонтує блоки в його радіуÑÑ– дії. Боронить башти та Ñтіни.\nЗа бажаннÑм, можна викориÑтати кремній Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñті та ефективноÑті. -block.mend-projector.description = Покращена верÑÑ–Ñ Â«Ð ÐµÐ³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Â». Періодично ремонтує блоки в його радіуÑÑ– дії.\nЗа бажаннÑм, можна викориÑтати фазову тканину Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñті та ефективноÑті. -block.overdrive-projector.description = Збільшує швидкіÑть найближчих будівель.\nЗа бажаннÑм, можна викориÑтати фазову тканину Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð°Ð»ÑŒÐ½Ð¾Ñті та ефективноÑті. -block.force-projector.description = Створює навколо Ñебе шеÑтикутне Ñилове поле, боронÑчи будівлі та блоки вÑередині від пошкоджень.\nПерегріваєтьÑÑ, Ñкщо завдано занадто великої шкоди. За бажаннÑм, можна викориÑтати теплоноÑій Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ñ€Ñ–Ð²Ñƒ. Ð”Ð»Ñ Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ щита можна викориÑтовувати фазову тканину. -block.shock-mine.description = ÐаноÑить шкоду противникам, коли вони наÑтупають на міну. Майже невидима Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð½Ð¸ÐºÐ°. -block.conveyor.description = Базовий транÑпортний блок. Переміщує елементи вперед Ñ– автоматично перетворює Ñ—Ñ… у блоки. Можна обертати. -block.titanium-conveyor.description = Покращений блок транÑпорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри. -block.plastanium-conveyor.description = Переміщує предмети партіÑми.\nПриймає елементи на задній чаÑтині та вивантажує Ñ—Ñ… у трьох напрÑмках Ñпереду.\nПотребує кілька точок Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° Ñ€Ð¾Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ð°ÐºÑимальної пропуÑкної здатноÑті. -block.junction.description = Діє Ñк міÑÑ‚ Ð´Ð»Ñ Ð´Ð²Ð¾Ñ… перехреÑних конвеєрних Ñтрічок. КориÑно в ÑитуаціÑÑ…, коли два різних конвеєри перевозÑть різні матеріали в різні міÑцÑ. -block.bridge-conveyor.description = Покращений блок транÑпорту елементів. Дає змогу транÑпортувати предмети до 3-ох плиток із будь-Ñкої міÑцевоÑті чи будівлі. -block.phase-conveyor.description = Покращений блок транÑпорту елементів. ВикориÑтовує енергію Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð² на під’єднаний фазовий конвеєр через кілька плиток. -block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. Ð’ іншому випадку елемент виводитьÑÑ Ð·Ð»Ñ–Ð²Ð° та/чи Ñправа. -block.inverted-sorter.description = ОброблÑÑ” елементи, Ñк звичайний Ñортувальник, але виводить обрані елементи на Ñторони. -block.router.description = Приймає елементи з одного напрÑмку та виводить Ñ—Ñ… до трьох інших напрÑмків порівну. КориÑно Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ–Ð»Ñƒ матеріалів від одного джерела до кількох цілей.\n\n[scarlet]Ðіколи не викориÑтовуйте поруч із входами до механізмів, оÑкільки вони будуть забиті вихідними предметами.[] -block.distributor.description = Поліпшений маршрутизатор. РозділÑÑ” предмети до 7 інших напрÑмків порівну. -block.overflow-gate.description = Вивантажує лише вліво та/або вправо, Ñкщо передній шлÑÑ… заблокований. -block.underflow-gate.description = Повна протилежніÑть надмірному затвору. Виводить предмет прÑмо, Ñкщо лівий та/або правий шлÑÑ… заблоковано. +block.item-void.description = Руйнує будь-Ñкі предмети. Тільки піÑочницÑ. +block.liquid-source.description = ПоÑтійно вироблÑÑ” рідини. Тільки піÑочницÑ. +block.liquid-void.description = Випаровує будь-Ñкі рідини. Тільки піÑочницÑ. +block.copper-wall.description = Захищає Ñпоруди від ворожих ÑнарÑдів. +block.copper-wall-large.description = Захищає Ñпоруди від ворожих ÑнарÑдів. +block.titanium-wall.description = Захищає Ñпоруди від ворожих ÑнарÑдів. +block.titanium-wall-large.description = Захищає Ñпоруди від ворожих ÑнарÑдів. +block.plastanium-wall.description = Захищає Ñпоруди від ворожих ÑнарÑдів. Поглинає електричні дуги й лазери. Блокує автоматичні Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÐµÐ½ÐµÑ€Ð³ÐµÑ‚Ð¸Ñ‡Ð½Ð¸Ñ… вузлів. +block.plastanium-wall-large.description = Захищає Ñпоруди від ворожих ÑнарÑдів. Поглинає електричні дуги й лазери. Блокує автоматичні Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÐµÐ½ÐµÑ€Ð³ÐµÑ‚Ð¸Ñ‡Ð½Ð¸Ñ… вузлів. +block.thorium-wall.description = Захищає Ñпоруди від ворожих ÑнарÑдів. +block.thorium-wall-large.description = Захищає Ñпоруди від ворожих ÑнарÑдів. +block.phase-wall.description = Захищає Ñпоруди від ворожих ÑнарÑдів, відбиває більшіÑть куль у разі зіткненні. +block.phase-wall-large.description = Захищає Ñпоруди від ворожих ÑнарÑдів, відбиває більшіÑть куль у разі зіткненні. +block.surge-wall.description = Захищає Ñпоруди від ворожих ÑнарÑдів, періодично випуÑкає електричні дуги в разі зіткненні. +block.surge-wall-large.description = Захищає Ñпоруди від ворожих ÑнарÑдів, періодично випуÑкає електричні дуги в разі зіткненні. +block.door.description = Стіна, Ñку можна відчинити й зачинити. +block.door-large.description = Стіна, Ñку можна відчинити й зачинити. +block.mender.description = Періодично ремонтує блоки у Ñвоєму радіуÑÑ– дії.\nЗа бажаннÑм можна викориÑтати кремній Ð·Ð°Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ€Ð°Ð´Ñ–ÑƒÑу дії й ефективноÑті. +block.mend-projector.description = Ремонтує блоки у Ñвоєму радіуÑÑ– дії.\nЗа бажаннÑм можна викориÑтати фазову тканину Ð·Ð°Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ€Ð°Ð´Ñ–ÑƒÑу дії й ефективноÑті. +block.overdrive-projector.description = Збільшує швидкіÑть найближчих будівель.\nЗа бажаннÑм можна викориÑтати фазову тканину Ð·Ð°Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ€Ð°Ð´Ñ–ÑƒÑу дії й ефективноÑті. +block.force-projector.description = Створює навколо Ñебе шеÑтикутне Ñилове поле, захищаючи будівлі та блоки вÑередині від пошкоджень.\nПерегріваєтьÑÑ, Ñкщо завдано занадто великої шкоди. За бажаннÑм можна викориÑтати теплоноÑій Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ñ€Ñ–Ð²Ñƒ. Ð”Ð»Ñ Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ щита можна викориÑтовувати фазову тканину. +block.shock-mine.description = ВипуÑкає електричні дуги в разі контакту з ворогом. +block.conveyor.description = Переміщує елементи вперед. +block.titanium-conveyor.description = Переміщує предмети швидше, ніж звичайний конвеєр. +block.plastanium-conveyor.description = Переміщує предмети партіÑми. Приймає елементи на задній чаÑтині та вивантажує Ñ—Ñ… у трьох напрÑмках Ñпереду. Потребує кілька точок Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° Ñ€Ð¾Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ð°ÐºÑимальної пропуÑкної здатноÑті. +block.junction.description = Діє Ñк міÑÑ‚ Ð´Ð»Ñ Ð´Ð²Ð¾Ñ… перехреÑних конвеєрних Ñтрічок. +block.bridge-conveyor.description = ТранÑпортує предмети через будівлі або міÑцевіÑть +block.phase-conveyor.description = Миттєво транÑпортує предмети через міÑцевоÑті або будівлі. Більший діапазон, ніж у моÑтового конвеєра, але потребує енергії. +block.sorter.description = Якщо елемент відповідає вибраному, його можна передати. Ð’ іншому випадку елемент виводитьÑÑ Ð»Ñ–Ð²Ð¾Ñ€ÑƒÑ‡ та праворуч. +block.inverted-sorter.description = Схожий на звичайний Ñортувальник, але виводить обрані елементи на бокові Ñторони. +block.router.description = РозподілÑÑ” елементи, що надходÑть, порівну на 3 різні напрÑмки. +block.router.details = Ðеобхідне зло. Ðе викориÑтовуйте поруч із входами до механізмів, оÑкільки вони, входи, будуть забиті вихідними предметами. +block.distributor.description = РозділÑÑ” предмети до 7 інших напрÑмків порівну. +block.overflow-gate.description = Вивантажує лише ліворуч Ñ– праворуч, Ñкщо передній шлÑÑ… заблокований. +block.underflow-gate.description = Повна протилежніÑть надмірному затвору. Виводить предмет прÑмо, Ñкщо лівий Ñ– правий шлÑÑ… заблоковано. block.mass-driver.description = Ðайкращий блок Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ–Ð². Збирає кілька предметів, а потім виÑтрілює Ñ—Ñ… до іншої електромагнітної катапульти на велику відÑтань. Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потребує енергіÑ. block.mechanical-pump.description = Дешевий наÑÐ¾Ñ Ñ–Ð· повільним виходом, але не потребує енергоÑпоживаннÑ. block.rotary-pump.description = УдоÑконалений наÑоÑ. ÐаÑоÑи більше викачують, але потребують енергію. block.thermal-pump.description = Ðайкращий наÑоÑ. -block.conduit.description = ОÑновний блок транÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸. ПереÑуває рідини вперед. ЗаÑтоÑовуєтьÑÑ Ñпільно з наÑоÑами та іншими трубопроводами. -block.pulse-conduit.description = УдоÑконалений блок транÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸. Швидше транÑпортує й більше зберігає рідини, ніж Ñтандартні трубопроводи. -block.plated-conduit.description = Переміщує рідини з тією ж швидкіÑтю, що й імпульÑні трубопроводи, але має більше міцноÑті. Ðе приймає рідин із боків окрім інших трубопроводів.\nПротікає менше. -block.liquid-router.description = Приймає рідини з одного напрÑмку та виводить Ñ—Ñ… до трьох інших напрÑмків порівну. Також можна зберігати певну кількіÑть рідини. КориÑно Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ‰ÐµÐ¿Ð»ÐµÐ½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½ від одного джерела до кількох мішеней. -block.liquid-tank.description = Зберігає велику кількіÑть рідини. ВикориÑтовуйте Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ñ–Ð² у ÑитуаціÑÑ… із непоÑтійним попитом на матеріали або Ñк гарантію Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ”Ð²Ð¾ важливих блоків. -block.liquid-junction.description = Діє Ñк міÑÑ‚ Ð´Ð»Ñ Ð´Ð²Ð¾Ñ… каналів, що перетинаютьÑÑ. КориÑно в ÑитуаціÑÑ…, коли два різні трубопроводи транÑпортують різні рідини в різні міÑцÑ. -block.bridge-conduit.description = УдоÑконалений блок транÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸. Ðадає можливіÑть транÑпортувати рідину до 3 плиток будь-Ñкої міÑцевоÑті чи будівлі. -block.phase-conduit.description = УдоÑконалений блок транÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½Ð¸. ВикориÑтовує енергію Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð´Ð¸Ð½ до приєднаного фазового каналу через декілька плиток. +block.conduit.description = ПереÑуває рідини вперед. ЗаÑтоÑовуєтьÑÑ Ñпільно з наÑоÑами та іншими трубопроводами. +block.pulse-conduit.description = ПереÑуває рідини вперед. Швидше транÑпортує Ñ– зберігає більше рідини, ніж Ñтандартні трубопроводи. +block.plated-conduit.description = ПереÑуває рідини вперед. Ðе приймає рідин із боків окрім інших трубопроводів. Ðе протікає. +block.liquid-router.description = Приймає рідини з одного напрÑмку та виводить Ñ—Ñ… до трьох інших напрÑмків порівну. Також може зберігати певну кількіÑть рідини. +block.liquid-tank.description = Зберігає велику кількіÑть рідини. Виводить воду на вÑÑ– Ñторони, через це Ñхожий на рідинний маршрутизатор. +block.liquid-junction.description = Діє Ñк міÑÑ‚ Ð´Ð»Ñ Ð´Ð²Ð¾Ñ… трубопроводів. +block.bridge-conduit.description = ТранÑпортує рідину через міÑцевіÑть Ñ– будівлі. +block.phase-conduit.description = ТранÑпортує рідину через міÑцевіÑть Ñ– будівлі. Діапазон дії більший ніж у моÑтового трубопроводу block.power-node.description = Передає Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° приєднані вузли. Вузол буде отримувати Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ будь-Ñких ÑуÑідніх блоків або подавати Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ них. -block.power-node-large.description = Поліпшений вузол Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð· більшим радіуÑом дії. +block.power-node-large.description = Передовий вузол Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð· більшим радіуÑом дії. block.surge-tower.description = Вузол Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð· меншою кількіÑтю доÑтупних з’єднань Ñ– з найбільшим радіуÑом дії. block.diode.description = Ð–Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð°ÐºÑƒÐ¼ÑƒÐ»Ñтора може протікати через цей блок лише в одному напрÑмку, але лише в тому випадку, Ñкщо інша Ñторона має менше енергії. block.battery.description = Зберігає енергію Ñк буфер у чаÑи надлишкової енергії. Виводить енергію в періоди дефіциту. -block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулÑтор. -block.combustion-generator.description = ВироблÑÑ” енергію, Ñпалюючи легкозаймиÑті матеріали, такі Ñк вугіллÑ. -block.thermal-generator.description = Генерує енергію у разі Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² Ñпекотних міÑцÑÑ…. -block.steam-generator.description = УдоÑконалений генератор згорÑннÑ. Більш ефективний, але потребує додаткової води Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¸. -block.differential-generator.description = УдоÑконалений генератор згорÑннÑ. ВикориÑтовує різницю температур між кріогенною рідиною й піротитом, що горить. -block.rtg-generator.description = ПроÑтий Ñ– надійний генератор. ВикориÑтовує тепло радіоактивних Ñполук, Ñкі розкладаютьÑÑ, Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ— з повільною швидкіÑтю. +block.battery-large.description = Зберігає енергію Ñк буфер у чаÑи надлишкової енергії. Виводить енергію в періоди дефіциту. Більша ємніÑть ніж у звичайного акумулÑтора. +block.combustion-generator.description = ВироблÑÑ” енергію, Ñпалюючи легкозаймиÑті матеріали, Ñк-от вугіллÑ. +block.thermal-generator.description = ВироблÑÑ” енергію в разі Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² гарÑчих міÑцÑÑ…. +block.steam-generator.description = ВироблÑÑ” енергію, Ñпалюючи легкозаймиÑті матеріали й перетворює воду в пару. +block.differential-generator.description = ВироблÑÑ” велику кількіÑть енергії. ВикориÑтовує різницю температур між кріогенною рідиною й пиротитом, що горить. +block.rtg-generator.description = ВикориÑтовує тепло радіоактивних Ñполук, Ñкі розкладаютьÑÑ, Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ— з повільною швидкіÑтю. block.solar-panel.description = Забезпечує невелику кількіÑть енергії від ÑонцÑ. -block.solar-panel-large.description = Значно ефективніша ніж Ñтандартна ÑонÑчна панель. -block.thorium-reactor.description = ВироблÑÑ” значну кількіÑть енергії з торію. Вимагає поÑтійного охолодженнÑ. Сильно вибухне, Ñкщо подаватиметьÑÑ Ð½ÐµÐ´Ð¾ÑÑ‚Ð°Ñ‚Ð½Ñ ÐºÑ–Ð»ÑŒÐºÑ–Ñть теплоноÑÑ–Ñ. Вихідна потужніÑть залежить від заповненоÑті, базова потужніÑть генеруєтьÑÑ Ð½Ð° повній міÑткоÑті. -block.impact-reactor.description = УдоÑконалений генератор, здатний Ñтворювати величезну кількіÑть енергії за макÑимальною ефективноÑті. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑку процеÑу потрібно значні обÑÑги енергії. -block.mechanical-drill.description = Ðедорогий бур. Якщо розміÑтити на доречних плитках, то виводитиме предмети поÑтійно, але повільно. Придатний лише Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¸Ñ… реÑурÑів. +block.solar-panel-large.description = Забезпечує невелику кількіÑть енергії від ÑонцÑ. Значно ефективніша ніж Ñтандартна ÑонÑчна панель. +block.thorium-reactor.description = ВироблÑÑ” значну кількіÑть енергії з торію. Потребує поÑтійного охолодженнÑ. Сильно вибухне, Ñкщо подаватиметьÑÑ Ð½ÐµÐ´Ð¾ÑÑ‚Ð°Ñ‚Ð½Ñ ÐºÑ–Ð»ÑŒÐºÑ–Ñть теплоноÑÑ–Ñ. +block.impact-reactor.description = Здатний Ñтворювати величезну кількіÑть енергії за макÑимальної ефективноÑті. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑку процеÑу потрібно значні обÑÑги енергії. +block.mechanical-drill.description = Якщо розміÑтити на доречних плитках, то виводитиме предмети поÑтійно, але повільно. Придатний лише Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¸Ñ… реÑурÑів. block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур. -block.laser-drill.description = Дає змогу виконувати Ð±ÑƒÑ€Ñ–Ð½Ð½Ñ Ñ‰Ðµ швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. -block.blast-drill.description = Ðайкращий бур. Потрібна велика кількіÑть енергії. -block.water-extractor.description = Видобуває підземні води. ВикориÑтовуєтьÑÑ Ð² міÑцÑÑ…, де немає поверхневої води. -block.cultivator.description = Культивує невеликі концентрації Ñпор в атмоÑфері на готові до промиÑловоÑті Ñтручки. -block.oil-extractor.description = Ð”Ð»Ñ Ð²Ð¸Ð´Ð¾Ð±ÑƒÑ‚ÐºÑƒ нафти викориÑтовуєтьÑÑ Ð²ÐµÐ»Ð¸ÐºÐ° кількіÑть енергії, піÑку та води. -block.core-shard.description = Ðайперша верÑÑ–Ñ ÐºÐ°Ð¿Ñули Ñдра. ПіÑÐ»Ñ Ð¹Ð¾Ð³Ð¾ Ð·Ð½Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²ÑÑ– контакти з регіоном втрачаютьÑÑ. Ðе допуÑтіть цього. -block.core-foundation.description = Друга верÑÑ–Ñ Ñдра. Краще броньована. Зберігає більше реÑурÑів. -block.core-nucleus.description = Ð¢Ñ€ÐµÑ‚Ñ Ð¹ оÑÑ‚Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ ÐºÐ°Ð¿Ñули Ñдра. Ðадзвичайно добре броньована. Зберігає величезні обÑÑги реÑурÑів. +block.laser-drill.description = Дає змогу видобувати ще швидше за допомогою лазерної технології, але потребує енергії. Здатний видобувати торій. +block.blast-drill.description = Ðайкращий бур. Потребує великої кількоÑті енергії. +block.water-extractor.description = Викачує підземні води. ВикориÑтовуєтьÑÑ Ð² міÑцÑÑ…, де немає поверхневої води. +block.cultivator.description = Культивує невеликі концентрації Ñпор у Ñтручки. +block.cultivator.details = Відновлена технологіÑ. ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸Ñ‡ÐµÐ·Ð½Ð¾Ñ— кількоÑті біомаÑи Ñкомога ефективніше. Ймовірно, початковий інкубатор Ñпор, що зараз покриває Серпуло. +block.oil-extractor.description = ВикориÑтовуєтьÑÑ Ð²ÐµÐ»Ð¸ÐºÐ° кількіÑть енергії, піÑку та води Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½Ð°Ñ„Ñ‚Ð¸. +block.core-shard.description = Ядро бази. ПіÑÐ»Ñ Ð·Ð½Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñектор втрачаєтьÑÑ. Ðайперша верÑÑ–Ñ ÐºÐ°Ð¿Ñули Ñдра. ПіÑÐ»Ñ Ð¹Ð¾Ð³Ð¾ Ð·Ð½Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²ÑÑ– контакти з регіоном втрачаютьÑÑ. Ðе допуÑтіть цього. +block.core-shard.details = Ðайперша верÑÑ–Ñ ÐºÐ°Ð¿Ñули Ñдра. Компактне. Самовідтворюванне. ОÑнащене одноразовими пуÑковими рушіÑми. Ðе призначено Ð´Ð»Ñ Ð¼Ñ–Ð¶Ð¿Ð»Ð°Ð½ÐµÑ‚Ð½Ð¸Ñ… подорожей. +block.core-foundation.description = Ядро бази. Добре броньоване. Зберігає більше реÑурÑів. +block.core-foundation.details = Друга верÑÑ–Ñ Ñдра. +block.core-nucleus.description = Ядро бази. Ðапрочуд добре броньовано. Зберігає величезну кількіÑть реÑурÑів. +block.core-nucleus.details = Ð¢Ñ€ÐµÑ‚Ñ Ñ– фінальна верÑÑ–Ñ Ñдра. block.vault.description = Зберігає велику кількіÑть предметів кожного типу. Блок розвантажувача може викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ–Ð² зі Ñховища. block.container.description = Зберігає малу кількіÑть предметів кожного типу. Блок розвантажувача може викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ–Ð² зі Ñховища. -block.unloader.description = Вивантажує предмети з блока, Ñкий не переміщує предмети, на конвеєр або безпоÑередньо в ÑуÑідній блок. Тип предмета Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° змінити, натиÑнувши на блок. -block.launch-pad.description = ЗапуÑкає партії предметів без необхідноÑті запуÑку Ñдра. Стартовий майданчик надає можливіÑть вам запуÑкати реÑурÑи кожні n Ñекунд без необхідноÑті завершувати гру. ПроÑто подайте в нього реÑурÑи та забезпечте енергією. -block.launch-pad-large.description = Поліпшена верÑÑ–Ñ Ñтартового майданчика. Зберігає більше предметів. ЗапуÑкаєтьÑÑ Ñ‡Ð°Ñтіше. -block.duo.description = Мала й дешева башта. КориÑна проти наземних одиниць. -block.scatter.description = ОÑновна протиповітрÑна башта. ВиÑтрілює грудочки Ñвинцю, брухту чи метаÑкла в противників. +block.unloader.description = Вивантажує предмети з найближчих блоків +block.launch-pad.description = ЗапуÑкає партії предметів без необхідноÑті запуÑку Ñдра. +block.duo.description = ВиÑтрілює чергами куль у ворогів. +block.scatter.description = ВиÑтрілює ÑкупченнÑм Ñвинцю, брухту чи метаÑкла в повітрÑних противників. block.scorch.description = Підпалює будь-Ñких наземних противників поблизу. ВиÑокоефективна на близькій відÑтані. -block.hail.description = Ðевелика артилерійÑька башта з далеким радіуÑом дії. -block.wave.description = Башта Ñереднього розміру. ВипуÑкає потоками рідини в противників. Ðвтоматично гаÑить пожежі при поÑтачанні води. -block.lancer.description = Лазерна башта Ñереднього розміру, Ñка атакує наземних противників. ЗарÑджає Ñ– виÑтрілює потужні пучки енергії. -block.arc.description = Ðевелика електрична башта з малим радіуÑом дії. СтрілÑÑ” дугами електрики в противників. -block.swarmer.description = Ракетна башта Ñереднього розміру. Ðтакує Ñк повітрÑних, так Ñ– наземних противників. ЗапуÑкає ракети, Ñкі летÑть у противників ÑамоÑтійно. -block.salvo.description = Більш велика, вдоÑконалена верÑÑ–Ñ Ð±Ð°ÑˆÑ‚Ð¸ «Подвійна». ВиÑтрілює швидкий залп куль у противника. -block.fuse.description = Велика енергетична башта з малим радіуÑом дії. СтрілÑÑ” трьома пронизливими променÑми на найближчих противників. -block.ripple.description = Ðадзвичайно потужна артилерійÑька башта. Ðа великі відÑтані ÑтрілÑÑ” ÑкупченнÑми ÑнарÑдів у противників. -block.cyclone.description = Велика протиповітрÑна та протиназемна башта. Підпалює вибухонебезпечними грудками ÑÐºÑƒÐ¿Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð½Ð¸ÐºÑ–Ð². -block.spectre.description = МаÑивна двоÑтвольна гармата. СтрілÑÑ” великими бронебійними кулÑми в повітрÑні та наземні цілі. -block.meltdown.description = МаÑивна лазерна гармата. ЗарÑджає Ñ– ÑтрілÑÑ” лазерним променем у найближчих противників. Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потрібен теплоноÑій. -block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю. +block.hail.description = ВиÑтрілює невеликі ÑнарÑди в наземних ворогів на великі відÑтані. +block.wave.description = ВиÑтрілює потоки рідин у ворогів. Ðвтоматично гаÑить пожежі в разі поÑÑ‚Ð°Ñ‡Ð°Ð½Ð½Ñ Ð²Ð¾Ð´Ð¸. +block.lancer.description = ЗарÑджає Ñ– виÑтрілює потужні пучки енергії в наземних противників. +block.arc.description = ВиÑтрілює дугами електрики в наземних противників. +block.swarmer.description = ЗапуÑкає ракети, що автоматично наводÑтьÑÑ Ð² противників. +block.salvo.description = ВиÑтрілює швидкий залп куль у противника. +block.fuse.description = ВиÑтрілює трьома променÑми, що пронизують броню, у малому радіуÑÑ– в противників. +block.ripple.description = ВиÑтрілює ÑкупченнÑм ÑнарÑдів у противників. +block.cyclone.description = Підпалює вибухові грудки ÑÐºÑƒÐ¿Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð½Ð¸ÐºÑ–Ð². +block.spectre.description = ВиÑтрілює великі бронебійні кулі в повітрÑні та наземні цілі. +block.meltdown.description = ЗарÑджає Ñ– виÑтрілює лазерним променем у найближчих противників. Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потрібен теплоноÑій. +block.foreshadow.description = ВиÑтрілює великим болтом в одну ціль на велику диÑтанцію. +block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у Ñвоєму радіуÑÑ– дії. Пріоритетні вороги з вищим макÑимальним здоров’Ñм. block.segment.description = Пошкоджує та руйнує вхідні ÑнарÑди. Окрім лазерних. +block.parallax.description = ПритÑгає ворожі повітрÑні одиниці, пошкоджуючи Ñ—Ñ… у процеÑÑ–. +block.tsunami.description = ВиÑтрілює потужними потоками рідини у ворогів. Ðвтоматично гаÑить пожежі в разі поÑÑ‚Ð°Ñ‡Ð°Ð½Ð½Ñ Ð²Ð¾Ð´Ð¸. +block.silicon-crucible.description = Очищає кремній від піÑку та вугіллÑ, викориÑтовуючи пиратит Ñк додаткове джерело тепла. Більш ефективний у жарких міÑцÑÑ…. +block.disassembler.description = ПоділÑÑ” шлак на незначні кількоÑті екзотичних мінеральних компонентів за низькою ефективноÑті. Може вироблÑти торій. +block.overdrive-dome.description = Збільшує швидкіÑть найближчих будівель. Потребує фазову тканину Ñ– кремній. +block.payload-conveyor.description = Переміщує великі вантажі, Ñк-от одиниці з заводів. +block.payload-router.description = РозділÑÑ” вантажі, що надходÑть, у 3 різні Ñторони. +block.command-center.description = Контролює поведінку одиниць за допомогою декількох різних команд. +block.ground-factory.description = ВироблÑÑ” наземних одиниць. Вивід одиниць можна здійÑнити безпоÑередньо на міÑцевіÑть, або ÑпрÑмувати до реконÑтрукторів Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ð¿ÑˆÐµÐ½Ð½Ñ. +block.air-factory.description = ВироблÑÑ” повітрÑних одиниць. Вивід одиниць можна здійÑнити безпоÑередньо на міÑцевіÑть, або ÑпрÑмувати до реконÑтрукторів Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ð¿ÑˆÐµÐ½Ð½Ñ. +block.naval-factory.description = ВироблÑÑ” одиниць. Вивід одиниць можна здійÑнити безпоÑередньо на міÑцевіÑть, або ÑпрÑмувати до реконÑтрукторів Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ð¿ÑˆÐµÐ½Ð½Ñ. +block.additive-reconstructor.description = Поліпшує введених одиниць до другого рівнÑ. +block.multiplicative-reconstructor.description = Поліпшує введених одиниць до третього рівнÑ. +block.exponential-reconstructor.description = Поліпшує введених одиниць до четвертого рівнÑ. +block.tetrative-reconstructor.description = Поліпшує введених одиниць до п’Ñтого Ñ– фінального рівнÑ. +block.switch.description = Перемикач. Стан можна читати й контролювати за допомогою логічних процеÑорів. +block.micro-processor.description = ЗапуÑкає поÑлідовніÑть логічних вказівок (операцій) у неÑкінченному циклі. Може викориÑтовуватиÑÑ Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑ–Ð² та будівель. +block.logic-processor.description = ЗапуÑкає поÑлідовніÑть логічних вказівок (операцій) у неÑкінченному циклі. Може викориÑтовуватиÑÑ Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑ–Ð² та будівель. Швидше ніж МікропроцеÑор. +block.hyper-processor.description = ЗапуÑкає поÑлідовніÑть логічних вказівок (операцій) у неÑкінченному циклі. Може викориÑтовуватиÑÑ Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑ–Ð² та будівель. Швидше ніж Логічний процеÑор +block.memory-cell.description = Зберігає інформацію Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ процеÑора. +block.memory-bank.description = Зберігає інформацію Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ процеÑора. ВиÑока міÑткіÑть. +block.logic-display.description = Показує довільну графіку з логічного процеÑора. +block.large-logic-display.description = Показує довільну графіку з логічного процеÑора. +block.interplanetary-accelerator.description = Велика електромагнітна башта-рейкотрон. ПриÑкорює Ñдра, щоби подолати планетне Ñ‚ÑÐ¶Ñ–Ð½Ð½Ñ Ð´Ð»Ñ Ð¼Ñ–Ð¶Ð¿Ð»Ð°Ð½ÐµÑ‚Ð½Ð¾Ð³Ð¾ розгортаннÑ. +unit.dagger.description = ВиÑтрілює Ñтандартними кулÑми в найближчих ворогах. +unit.mace.description = ВиÑтрілює потоками Ð¿Ð¾Ð»ÑƒÐ¼â€™Ñ Ð² найближчих ворогів. +unit.fortress.description = ВиÑтрілює з дальнобійної артилерії в наземних цілей. +unit.scepter.description = ВиÑтрілює шквалом зарÑджених куль у найближчих ворогів. +unit.reign.description = ВиÑтрілює шквалом маÑивних пронизливих куль у найближчих ворогів. +unit.nova.description = ВиÑтрілює лазерними болтами, Ñкі пошкоджують ворогів та відновлюють Ñоюзні Ñпоруди. Здатний до польоту. +unit.pulsar.description = ВипуÑкає дуги електрики, Ñкі завдають шкоди ворогам та відновлюють Ñоюзні Ñпоруди. Здатний до польоту. +unit.quasar.description = ВиÑтрілює пробивними лазерними промені, Ñкі пошкоджують ворогів та відновлюють Ñпоріднені конÑтрукції. Здатний до польоту. Захищений. +unit.vela.description = ВиÑтрілює маÑивним безперервним лазерним променем, Ñкий завдає шкоди ворогам, ÑпричинÑÑ” пожежі та відновлює Ñоюзні Ñпоруди. Здатний до польоту. +unit.corvus.description = СпричинÑÑ” маÑивний лазерний вибух, Ñкий завдає шкоди ворогам та відновлює Ñпоріднені Ñпоруди. Може переÑтупати через більшіÑть міÑцевоÑті. +unit.crawler.description = Біжить до ворогів Ñ– ÑамознищуєтьÑÑ, викликаючи великий вибух. +unit.atrax.description = Випалює виÑнажливі шари шлаку в наземних цілÑÑ…. Може переÑтупити більшіÑть міÑцевоÑті. +unit.spiroct.description = ВиÑтрілює виÑнажливими лазерними променÑми у ворогів, відновлюючиÑÑŒ водночаÑ. Може переÑтупати через більшіÑть міÑцевоÑті. +unit.arkyid.description = ВиÑтрілює у ворогів великими виÑнажливими лазерними променÑми, відновлюючиÑÑŒ при цьому. +unit.toxopid.description = ВиÑтрілює у ворогів великими електричними каÑетними ÑнарÑдами та пробивними лазерами. Може переÑтупати через більшіÑть міÑцевоÑті. +unit.flare.description = ВиÑтрілює Ñтандартними кулÑми в найближчі цілі. +unit.horizon.description = Кидає купу бомб на наземні цілі. +unit.zenith.description = ВиÑтрілює залпи ракет у вÑÑ–Ñ… найближчих ворогів. +unit.antumbra.description = ВиÑтрілює шквал куль у вÑÑ–Ñ… найближчих ворогів. +unit.eclipse.description = ВиÑтрілює двома пронизливими лазерами та шквалом куль у вÑÑ–Ñ… найближчих ворогів. +unit.mono.description = Ðвтоматично видобуває мідь Ñ– Ñвинець Ñ– кладе Ñ—Ñ… у Ñдро. +unit.poly.description = Ðвтоматично перебудовує зруйновані Ñпоруди та допомагає іншим одиницÑм у будівництві. +unit.mega.description = Ðвтоматично відновлює пошкоджені конÑтрукції. Здатний неÑти блоки та невеликі наземні блоки. +unit.quad.description = Кидає великі бомби на наземні цілі, відновлюючи Ñоюзні Ñпоруди та завдаючи шкоди ворогам. Здатний неÑти Ñередні наземні одиниці. +unit.oct.description = Захищає найближчих Ñоюзників Ñвоїм відновлювальним щитом. Здатний неÑти більшіÑть наземних одиниць. +unit.risso.description = ВиÑтрілює шквалом ракет Ñ– куль по вÑÑ–Ñ… найближчих ворогах. +unit.minke.description = ВиÑтрілює запальними ÑнарÑдами та Ñтандартними кулÑми по найближчих наземних цілÑÑ…. +unit.bryde.description = ВиÑтрілює у ворогів артилерійÑькими ÑнарÑдами та ракетами великої дальноÑті. +unit.sei.description = ВиÑтрілює у ворогів шквалом ракет Ñ– бронебійних куль. +unit.omura.description = ВиÑтрілює у ворогів далекобійним болтом, що пробиває броню. ВироблÑÑ” повітрÑних Фальшфеєрів. +unit.alpha.description = Захищає Ñдро «Уламок» від противників. Будує Ñпоруди. +unit.beta.description = Захищає Ñдро «Штаб» від противників. Будує Ñпоруди. +unit.gamma.description = Захищає Ñдро «Ðтом» від противників. Будує Ñпоруди. + +lst.read = Зчитує чиÑло із з’єднаної комірки пам’Ñті. +lst.write = ЗапиÑує чиÑлу у з’єднану комірки пам’Ñті. +lst.print = Додайте текÑÑ‚ до буфера друку.\nÐічого не відображає, поки [accent]Print Flush[] викориÑтовуєтьÑÑ. +lst.draw = Додає операцію до буфера риÑунка.\nÐічого не відображає, поки [accent]Draw Flush[] викориÑтовуєтьÑÑ. +lst.drawflush = Скидає буфер операцій [accent]Draw[] на диÑплей. +lst.printflush = Скидає буфер операцій [accent]Print[] у блок «ПовідомленнÑ». +lst.getlink = Отримати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° процеÑор за допомогою індекÑа. ПочинаєтьÑÑ Ð· 0. +lst.control = Контролює будівлю. +lst.radar = Ð—Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†ÑŒ навколо будівлі у радіуÑÑ– дії. +lst.sensor = Отримати дані з певної будівлі чи одиниці. +lst.set = УÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—. +lst.operation = Виконує операцію над 1-2 змінними. +lst.end = Перейти до верхньої чаÑтини Ñтеку операцій. +lst.jump = Умовне Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ іншої операції. +lst.unitbind = Прив’Ñзка до одиниці певного типу та його Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² [accent]@unit[]. +lst.unitcontrol = Контролювати поточну прив’Ñзану одиницю. +lst.unitradar = Знайти одиницю Ð±Ñ–Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— прив’Ñзаної одиниці. +lst.unitlocate = ВиÑвлÑÑ” позицію чи будівлю певного типу де завгодно на мапі.\nПотрібна прив’Ñзана одиницÑ. + +logic.nounitbuild = [red]Ð‘ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° допомогою процеÑорів заборено. + +lenum.type = Тип будівлі чи одиниці.\nÐаприклад, Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкого маршрутизатора (англ. router), Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²ÐµÑ€Ñ‚Ð°Ñ‚Ð¸Ð¼Ðµ [accent]@router[].\nÐе Ñ” Ñ€Ñдком. +lenum.shoot = СтрілÑти в зазначену позицію. +lenum.shootp = СтрілÑти в одиницю чи будівлю із передбаченнÑм швидкоÑті. +lenum.configure = ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ñ–Ð²Ð»Ñ–, Ñк-от в Ñортувальника. +lenum.enabled = Чи блок увімкнено. + +laccess.color = Колір оÑвітлювача. +laccess.controller = Керувач одиницÑми. Якщо процеÑор керує одиницею, повертає процеÑор.\nЯкщо у формуванні, повертаєтьÑÑ Ð»Ñ–Ð´ÐµÑ€.\nІнакше повертає Ñаму одиницю. +laccess.dead = Чи Ñ” Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð°Ð±Ð¾ Ð±ÑƒÐ´Ñ–Ð²Ð»Ñ Ð¼ÐµÑ€Ñ‚Ð²Ð¾ÑŽ або недійÑною. +laccess.controlled = Повертає \n[accent]@ctrlProcessor[] Ñкщо Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŽÑ”Ñ‚ÑŒÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑором;\n[accent]@ctrlPlayer[] Ñкщо Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ñ‡Ð¸ Ð±ÑƒÐ´Ñ–Ð²Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŽÑ”Ñ‚ÑŒ гравцем\n[accent]@ctrlFormation[] Ñкщо Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ñƒ загоні (формуванні)\nІнакше — 0. +laccess.commanded = [red]ЗаÑтаріле. Буде видалено![]\nВикориÑтовуйте натоміÑть [accent]controlled[]. + +graphicstype.clear = Залити диÑплей вказаним кольором. +graphicstype.color = УÑтановити колір Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑŒÑˆÐ¾Ñ— операції малюваннÑ. +graphicstype.stroke = УÑтановити ширину ліній. +graphicstype.line = ÐакреÑлити відрізок лінії. +graphicstype.rect = Залити кольором прÑмокутник. +graphicstype.linerect = Ðамалювати контур прÑмокутника. +graphicstype.poly = Залити кольором правильний багатокутник. +graphicstype.linepoly = Ðамалювати контур правильного багатокутника. +graphicstype.triangle = Залити кольором трикутник. +graphicstype.image = Ðамалювати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–Ð· деÑким вміÑтом.\nÐаприклад: [accent]@router[] чи [accent]@dagger[]. + +lenum.always = Завжди Ñ–Ñтинне. +lenum.idiv = Ціле діленнÑ. +lenum.div = ДіленнÑ.\nПовертає [accent]null[] при діленні на нуль. +lenum.mod = Залишок від діленнÑ. +lenum.equal = Рівно. ПримуÑове Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð².\nÐе-null об’єкти порівнÑно з чиÑлами Ñтають 1, інакше — 0. +lenum.notequal = Ðе рівно. ПримуÑове Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð². +lenum.strictequal = Сувора рівніÑть. ПримуÑового Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð² немає.\nМожна викориÑтати Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ на [accent]null[]. +lenum.shl = ЗÑув бітів ліворуч. +lenum.shr = ЗÑув бітів праворуч. +lenum.or = Побітове ÐБО (OR). +lenum.land = Побітове логічне І. +lenum.and = Побітове І. +lenum.not = Побітове запереченнÑ. +lenum.xor = Виключне ÐБО (XOR). + +lenum.min = Мінімум з двух чиÑел. +lenum.max = МакÑимум з двух чиÑел. +lenum.angle = Кут вектора у градуÑах. +lenum.len = Довжина вектора. +lenum.sin = СинуÑ, у градуÑах. +lenum.cos = КоÑинуÑ, у градуÑах. +lenum.tan = ТангенÑ, у градуÑах. +#це не одруківка, пошукайте 'Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ' +lenum.rand = Випадкове деÑÑткове чиÑло у діапазоні [0, значеннÑ). +lenum.log = Ðатуральний логарифм (ln). +lenum.log10 = ДеÑÑтковий логарифм. +lenum.noise = Двовимірний ÑимлекÑ-шум. +lenum.abs = ÐбÑолютне значеннÑ. +lenum.sqrt = Квадратний корінь. + +lenum.any = Будь-Ñка одиницÑ. +lenum.ally = Союзна одиницÑ. +lenum.attacker = ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ð·Ñ– зброєю. +lenum.enemy = Ворожа одиницÑ. +lenum.boss = ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Â«Ð’Ð°Ñ€Ñ‚Ð¾Ð²Ð¸Ð¹Â». +lenum.flying = ОдиницÑ, що літає. +lenum.ground = Ðаземна одиницÑ. +lenum.player = ОдиницÑ, керована гравцем. + +lenum.ore = Родовище руди. +lenum.damaged = Пошкоджені Ñоюзні будівлі. +lenum.spawn = Точка поÑви ворогів.\nМоже бути Ñдром чи позицією. +lenum.building = Ð‘ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÐ²Ð½Ð¾Ñ— групи. + +lenum.core = Будь-Ñке Ñдро. +lenum.storage = СкладÑьке приміщеннÑ, Ñк-от Сховище. +lenum.generator = Будівлі, що вироблÑють енергію. +lenum.factory = Будівлі, що видозмінюють реÑурÑи. +lenum.repair = Ремонтні пункти. +lenum.rally = Командний центр. +lenum.battery = Будь-Ñкий акумулÑтор. +lenum.resupply = Пункти поÑтачаннÑ.\nДоречні лише коли кор. правило [accent]«Бойові одиниці потребують боєприпаÑів»[] увімкнено. +lenum.reactor = ІмпульÑний чи Торієвий реактор. +lenum.turret = Будь-Ñка башта. + +sensor.in = Ð‘ÑƒÐ´Ñ–Ð²Ð»Ñ Ñ‡Ð¸ Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ. + +radar.from = Від Ñкої будівлі треба розпізнавати.\nÐ Ð°Ð´Ñ–ÑƒÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾ радіуÑом будівництва. +radar.target = Фільтр Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†ÑŒ. +radar.and = Додаткові фільтри. +radar.order = ПорÑдок ÑортуваннÑ. 0 — ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ зворотньому порÑдку. +radar.sort = Показник Ð´Ð»Ñ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð². +radar.output = Змінна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñув вихідної одиниці. + +unitradar.target = Фільтр Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†ÑŒ. +unitradar.and = Додаткові фільтри. +unitradar.order = ПорÑдок ÑортуваннÑ. 0 — ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ зворотньому порÑдку. +unitradar.sort = Показник Ð´Ð»Ñ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð². +unitradar.output = Змінна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñув вихідної одиниці. + +control.of = Ð‘ÑƒÐ´Ñ–Ð²Ð»Ñ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŽÐ²Ð°Ð½Ð½Ñ. +control.unit = ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ñ‡Ð¸ Ð±ÑƒÐ´Ñ–Ð²Ð»Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ†Ñ–Ð»ÑŽÐ²Ð°Ð½Ð½Ñ. +control.shoot = Чи ÑтрілÑÑ”. + +unitlocate.enemy = Чи знаходити ворожі будівлі. +unitlocate.found = Чи був об’єкт знайдений. +unitlocate.building = Змінна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу знайденої будівлі +unitlocate.outx = Виводить координату X. +unitlocate.outy = Виводить координату Y. +unitlocate.group = Група будівль Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ. + +lenum.idle = ЗупинÑти рух, проте продовжути будувати чи видобувати.\nСтан за замовчуваннÑм. +lenum.stop = Зупинити або рух, або видобуток, або будівництво. +lenum.move = ПереміÑтити в точне положеннÑ. +lenum.approach = ÐÐ°Ð±Ð»Ð¸Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ позиції із зазначеним радіуÑом. +lenum.pathfind = Ð—Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ñ ÑˆÐ»Ñху до точки поÑви ворогів. +lenum.target = Стрільба в задану позицію. +lenum.targetp = СтрілÑти в ціль із передбаченнÑм швидкоÑті. +lenum.itemdrop = Викинути предмет. +lenum.itemtake = ВзÑти предмет з будівлі. +lenum.paydrop = Скинути поточний вантаж. +lenum.paytake = Підібрати вантаж у поточному міÑцерозташуванні. +lenum.flag = ЧиÑловий флаг одиниці. +lenum.mine = Видобувати у заданій позиції. +lenum.build = Побудувати будівлю. +lenum.getblock = Ð Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÐ° та його типа за координатами.\nÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° знаходитиÑÑ Ð² межах доÑÑжноÑті.\nСуцільні не-будівлі матимуть тип [accent]@solid[]. +lenum.within = Чи знаходитьÑÑ Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð±Ñ–Ð»Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ—. +lenum.boost = Почати чи зупинити політ. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties new file mode 100644 index 0000000000..aae2419fc1 --- /dev/null +++ b/core/assets/bundles/bundle_vi.properties @@ -0,0 +1,1656 @@ +credits.text = ÄÆ°á»£c tạo ra bởi [royal]Anuken[] - [sky]anukendev@gmail.com[] +credits = Danh đỠ+contributors = Ngưá»i dịch và đóng góp +discord = Tham gia Mindustry Discord! +link.discord.description = Mindustry Discord chính thức +link.reddit.description = Mindustry subreddit +link.github.description = Mã nguồn trò chÆ¡i +link.changelog.description = Danh sách các thay đổi. +link.dev-builds.description = Các bản dá»±ng phát triển không ổn định +link.trello.description = Official Trello board cho các tính năng được lên kế hoạch +link.itch.io.description = itch.io page vá»›i bản tải xuống cho PC +link.google-play.description = Google Play store listing +link.f-droid.description = F-Droid listing +link.wiki.description = Mindustry wiki chính thức +link.suggestions.description = Äá» xuất các tính năng má»›i +link.bug.description = Tìm thấy lá»—i? Báo cáo nó ở đây +linkfail = Không mở được liên kết!\nURL đã được sao chép vào bá»™ nhá»› tạm. +screenshot = Ảnh chụp màn hình được lưu vào {0} +screenshot.invalid = Bản đồ quá lá»›n, có khả năng không đủ bá»™ nhá»› để chụp ảnh màn hình. +gameover = Trò chÆ¡i kết thúc +gameover.disconnect = Ngắt kết nối +gameover.pvp = Äá»™i[accent] {0}[] chiến thắng! +gameover.waiting = [accent]Äang đợi bản đồ tiếp theo... +highscore = [accent]Äiểm cao má»›i! +copied = Äã sao chép. +indev.notready = Phần này cá»§a trò chÆ¡i chưa sẵn sàng +indev.campaign = [accent]Bạn đã đến cuối chiến dịch![]\n\nDu hành liên hành tinh sẽ được bổ sung trong các bản cập nhật tương lai. + +load.sound = Âm thanh +load.map = Bản đồ +load.image = Hình ảnh +load.content = Ná»™i dung +load.system = Hệ thống +load.mod = Mods +load.scripts = Scripts + +be.update = Äã tìm thấy bản cập nhật má»›i: +be.update.confirm = Tải xuống và khởi động lại ngay bây giá»? +be.updating = Äang cập nhật... +be.ignore = Bá» qua +be.noupdates = Không tìm thấy bản cập nhật má»›i. +be.check = Kiểm tra các bản cập nhật. + +mods.browser = Duyệt mod +mods.browser.selected = Mod Äã chá»n +mods.browser.add = Cài đặt +mods.browser.reinstall = Cài đặt lại +mods.github.open = Repo +mods.browser.sortdate = Sắp xếp theo gần đây +mods.browser.sortstars = Sắp xếp theo sao + +schematic = Bản thiết kế +schematic.add = Lưu bản thiết kế... +schematics = Các bản thiết kế +schematic.replace = Bản thiết kế có tên đó đã tồn tại. Thay thế nó? +schematic.exists = Bản thiết kế có tên đó đã tồn tại. +schematic.import = Nhập Bản thiết kế... +schematic.exportfile = Xuất tệp +schematic.importfile = Nhập tệp +schematic.browseworkshop = Duyệt qua Workshop +schematic.copy = Sao chép vào bá»™ nhá»› tạm +schematic.copy.import = Thêm từ bá»™ nhá»› tạm +schematic.shareworkshop = Chia sẻ từ Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật bản thiết kế +schematic.saved = Äã lưu bản thiết kế. +schematic.delete.confirm = Bản thiết kế này sẽ bị xóa hoàn toàn. +schematic.rename = Äổi tên bản thiết kế +schematic.info = {0}x{1}, {2} khối +schematic.disabled = [scarlet]Tính năng bản thiết kế đã bị tắt[]\nBạn không được sá»­ dụng bản thiết kế trong [accent]bản đồ[] hoặc [accent]máy chá»§. + +stats = Thống kê +stat.wave = Äợt đã vượt qua:[accent] {0} +stat.enemiesDestroyed = Kẻ thù bị tiêu diệt:[accent] {0} +stat.built = Số công trình đã xây dá»±ng:[accent] {0} +stat.destroyed = Số công trình đã bị phá:[accent] {0} +stat.deconstructed = Số công trình được xây dá»±ng lại:[accent] {0} +stat.delivered = Lượng tài nguyên được phóng: +stat.playtime = Thá»i gian chÆ¡i:[accent] {0} +stat.rank = Xếp hạng: [accent]{0} + +globalitems = [accent]Toàn bá»™ vật phẩm +map.delete = Bạn có chắc chắn muốn xóa bản đồ "[accent]{0}[]"? +level.highscore = Äiểm cao nhất: [accent]{0} +level.select = Chá»n cấp độ +level.mode = Chế độ: +coreattack = < Căn cứ Ä‘ang bị tấn công! > +nearpoint = [[ [scarlet]RỜI KHỎI KHU Vá»°C ÄÃP NGAY LẬP TỨC[] ]\nsá»± há»§y diệt sắp xảy ra +database = CÆ¡ sở dữ liệu +savegame = Lưu trò chÆ¡i +loadgame = Tải lại màn chÆ¡i +joingame = Tham gia trò chÆ¡i +customgame = Tùy chỉnh +newgame = Trò chÆ¡i má»›i +none = +none.found = [lightgray] +minimap = Bản đồ nhá» +position = Vị trí +close = Äóng +website = Website +quit = Thoát +save.quit = Lưu & Thoát +maps = Bản đồ +maps.browse = Chá»n bản đồ +continue = Tiếp tục +maps.none = [lightgray]Không tìm thấy bản đồ! +invalid = Không hợp lệ +pickcolor = Chá»n màu +preparingconfig = Äang chuẩn bị cấu hình +preparingcontent = Äang chuẩn bị ná»™i dung +uploadingcontent = Äang tải lên ná»™i dung +uploadingpreviewfile = Äang tải lên tệp xem trước +committingchanges = Äang cập nhật các thay đổi +done = Hoàn tất +feature.unsupported = Thiết bị cá»§a bạn không há»— trợ tính năng này. + +mods.initfailed = [red]âš [] Mindustry không khởi chạy được. Äiá»u này có thể do các mod bị lá»—i.\n\nÄể tránh gặp sá»± cố liên tiếp, [red]tất cả các mod đã bị tắt.[]\n\nÄể tắt tính năng này, vào [accent]Cài đặt->Trò chÆ¡i->Tắt các mod khi gặp sá»± cố trong khởi động[]. +mods = Mods +mods.none = [lightgray]Không tìm thấy mod! +mods.guide = Hướng dẫn mod +mods.report = Báo lá»—i +mods.openfolder = Mở thư mục +mods.viewcontent = Xem ná»™i dung +mods.reload = Tải lại +mods.reloadexit = Trò chÆ¡i sẽ đóng để mod được tải. +mod.installed = [[Äã cài đặt] +mod.display = [gray]Mod:[orange] {0} +mod.enabled = [lightgray]Äã Bật +mod.disabled = [scarlet]Äã Tắt +mod.disable = Tắt +mod.content = Ná»™i dung: +mod.delete.error = Không thể xóa mod. Tệp có thể Ä‘ang được sá»­ dụng. +mod.requiresversion = [scarlet]Cần phiên bản tối thiểu: [accent]{0} +mod.outdated = [scarlet]Không tương thích vá»›i V6 (no minGameVersion: 105) +mod.missingdependencies = [scarlet]Thiếu phụ thuá»™c: {0} +mod.erroredcontent = [scarlet]Lá»—i ná»™i dung +mod.errors = Äã xảy ra lá»—i khi tải ná»™i dung. +mod.noerrorplay = [scarlet]Bạn có mod bị lá»—i.[]Tắt các mod bị lá»—i hoặc sá»­a các lá»—i trước khi chÆ¡i. +mod.nowdisabled = [scarlet]Mod '{0}' cần mod này để chạy:[accent] {1}\n[lightgray]Trước tiên bạn cần tải các mod này xuống.\nBản mod này sẽ tá»± động tắt. +mod.enable = Bật +mod.requiresrestart = Trò chÆ¡i sẽ đóng để áp dụng các thay đổi cá»§a mod. +mod.reloadrequired = [scarlet]Yêu cầu khởi động lại +mod.import = Thêm Mod +mod.import.file = Thêm từ tệp +mod.import.github = Thêm từ GitHub +mod.jarwarn = [scarlet]Các JAR mod vốn dÄ© không an toàn.[]\nÄảm bảo rằng bạn Ä‘ang thêm mod này từ má»™t nguồn đáng tin cậy! +mod.item.remove = Mục này là má»™t phần cá»§a[accent] '{0}'[] mod. Äể xóa nó, hãy gỡ cài đặt mod này. +mod.remove.confirm = Mod này sẽ bị xóa. +mod.author = [lightgray]Tác giả:[] {0} +mod.missing = Bản lưu này chứa các mod mà bạn đã cập nhật gần đây hoặc không được cài đặt. Có thể gây ra lá»—i khi mở. Bạn có chắc muốn mở nó?\n[lightgray]Mods:\n{0} +mod.preview.missing = Trước khi đăng bản mod này lên workshop, bạn phải thêm hình ảnh xem trước.\nÄặt má»™t hình ảnh có tên[accent] preview.png[] vào thư mục cá»§a mod và thá»­ lại. +mod.folder.missing = Chỉ có thể đăng các mod ở dạng thư mục lên workshop.\nÄể chuyển đổi bất kỳ mod nào thành má»™t thư mục, chỉ cần giải nén tệp cá»§a nó vào má»™t thư mục và xóa tệp nén cÅ©, sau đó khởi động lại trò chÆ¡i cá»§a bạn hoặc tải lại các bản mod cá»§a bạn. +mod.scripts.disable = Thiết bị cá»§a bạn không hổ trợ mod chứa scripts này. Bạn phải tắt các mod này để chÆ¡i trò chÆ¡i. + +about.button = Thông tin +name = Tên: +noname = Hãy nhập[accent] tên[] trước. +planetmap = Bản đồ hành tinh +launchcore = Phóng căn cứ +filename = Tên tệp: +unlocked = Äã mở khóa ná»™i dung má»›i! +available = Äã có mục nghiên cứu má»›i! +completed = [accent]Hoàn tất +techtree = Tiến trình +research.legacy = Dữ liệu nghiên cứu từ phiên bản[accent]5.0[] được tìm thấy.\nBạn có muốn [accent]tải dữ liệu này[], hoặc [accent]bá» qua[] và bắt đầu nghiên cứu lại trong chiến dịch má»›i (khuyến nghị)? +research.load = Tải +research.discard = Bá» qua +research.list = [lightgray]Nghiên cứu: +research = Nghiên cứu +researched = [lightgray]{0} đã nghiên cứu. +research.progress = {0}% hoàn thành +players = {0} ngưá»i chÆ¡i +players.single = {0} ngưá»i chÆ¡i +players.search = tìm kiếm +players.notfound = [gray]không tìm thấy ngưá»i chÆ¡i +server.closing = [accent]Äang đóng máy chá»§... +server.kicked.kick = Bạn đã bị kick khá»i máy chá»§! +server.kicked.whitelist = Bạn không nằm trong danh sách được vào máy chá»§ này. +server.kicked.serverClose = Máy chá»§ đã đóng. +server.kicked.vote = Bạn đã bị vote-kick. Tạm biệt. +server.kicked.clientOutdated = Phiên bản máy chá»§ này má»›i hÆ¡n phiên bản trò chÆ¡i! Hãy cập nhật trò chÆ¡i cá»§a bạn! +server.kicked.serverOutdated = Phiên bản máy chá»§ đã cÅ©! Hãy yêu cầu máy chá»§ đó cập nhật! +server.kicked.banned = Bạn đã bị cấm trên máy chá»§ này. +server.kicked.typeMismatch = Máy chá»§ này không tương thích vá»›i phiên bản cá»§a bạn. +server.kicked.playerLimit = Máy chá»§ đã đầy. Hãy chá» má»™t chá»— trống. +server.kicked.recentKick = Bạn đã bị kick gần đây.\nHãy chá» má»™t lúc sau đó kết nối lại. +server.kicked.nameInUse = Có ai đó vá»›i cái tên này\nđã ở trong máy chá»§. +server.kicked.nameEmpty = Tên bạn đã chá»n không hợp lệ. +server.kicked.idInUse = Bạn đã ở trên máy chá»§ này! Bạn không được phép kết nối vá»›i hai tài khoản. +server.kicked.customClient = Máy chá»§ này không hổ trợ phiên bản tùy chỉnh. Hãy tải phiên bản chính thức. +server.kicked.gameover = Trò chÆ¡i kết thúc! +server.kicked.serverRestarting = Máy chá»§ Ä‘ang khởi động lại. +server.versions = Phiên bản cá»§a bạn:[accent] {0}[]\nPhiên bản máy chá»§:[accent] {1}[] +host.info = Nút [accent]Mở máy chá»§[] mở máy chá»§ trên cổng [scarlet]6567[]. \nBất kỳ ai trên cùng [lightgray]wifi hoặc mạng cục bá»™[] sẽ có thể thấy máy chá»§ cá»§a bạn trong danh sách máy chá»§ cá»§a há».\n\nNếu bạn muốn má»i ngưá»i có thể kết nối từ má»i nÆ¡i bằng IP, [accent]port forwarding[] là bắt buá»™c.\n\n[lightgray]Lưu ý: Nếu ai đó Ä‘ang gặp sá»± cố khi kết nối vá»›i máy chá»§ trong mạng LAN cá»§a bạn, đảm bảo rằng bạn đã cho phép Mindustry truy cập vào mạng cục bá»™ cá»§a mình trong cài đặt tưá»ng lá»­a. Lưu ý rằng các mạng công cá»™ng đôi khi không cho phép khám phá máy chá»§. +join.info = Tại đây, bạn có thể nhập [accent]IP máy chá»§[] kết nối , hoặc khám phá [accent]mạng cục bá»™[] hay kết nối đến máy chá»§ [accent]toàn cầu[].\nCả mạng LAN và WAN Ä‘á»u được há»— trợ.\n\n[lightgray]Nếu bạn muốn kết nối vá»›i ai đó bằng IP, bạn sẽ cần phải há»i IP cá»§a há», có thể được tìm thấy bằng cách kiểm tra IP thiết bị cá»§a há». +hostserver = Mở máy chá»§. +invitefriends = Má»i bạn bè +hostserver.mobile = Mở máy chá»§ +host = Mở máy chá»§ +hosting = [accent]Äang mở máy chá»§... +hosts.refresh = Làm má»›i +hosts.discovering = Äang tìm máy chá»§ trong mạng LAN +hosts.discovering.any = Äang tìm máy chá»§ +server.refreshing = Làm má»›i máy chá»§ +hosts.none = [lightgray]Không có máy chá»§ cục bá»™ nào được tìm thấy! +host.invalid = [scarlet]Không thể kết nối đến máy chá»§. + +servers.local = Máy chá»§ cục bá»™ +servers.remote = Máy chá»§ tùy chỉnh +servers.global = Máy chá»§ từ cá»™ng đồng + +servers.disclaimer = Nhà phát triển [accent]không[] sở hữu và kiểm soát máy chá»§ cá»™ng đồng.\n\nMáy chá»§ có thể chứa ná»™i dung do ngưá»i dùng tạo và không phù hợp vá»›i má»i lứa tuổi. +servers.showhidden = Hiển thị Máy chá»§ Ẩn +server.shown = Hiện +server.hidden = Ẩn + +trace = Tìm ngưá»i chÆ¡i +trace.playername = Tên ngưá»i chÆ¡i: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = Unique ID: [accent]{0} +trace.mobile = Mobile Client: [accent]{0} +trace.modclient = Custom Client: [accent]{0} +invalidid = Client ID không hợp lệ! Vui lòng gá»­i báo cáo lá»—i. +server.bans = Cấm +server.bans.none = Không có ngưá»i chÆ¡i nào bị cấm! +server.admins = Quản trị viên +server.admins.none = Không có quản trị viên nào được tìm thấy! +server.add = Thêm máy chá»§ +server.delete = Bạn có chắc chắn muốn xóa máy chá»§ này không? +server.edit = Chỉnh sá»­a máy chá»§ +server.outdated = [scarlet]Máy chá»§ lá»—i thá»i![] +server.outdated.client = [scarlet]Trò chÆ¡i lá»—i thá»i![] +server.version = [gray]v{0} {1} +server.custombuild = [accent]Phiên bản tùy chỉnh +confirmban = Bạn có chắc chắn muốn cấm "{0}[white]"? +confirmkick = Bạn có chắc chắn muốn kick "{0}[white]"? +confirmvotekick = Bạn có chắc chắn muốn vote-kick "{0}[white]"? +confirmunban = Bạn có chắc chắn muốn gỡ cấm ngưá»i chÆ¡i này? +confirmadmin = Bạn có chắc chắn muốn thêm "{0}[white]" làm quản trị viên? +confirmunadmin = Bạn có chắc chắn muốn xóa quyá»n quản trị viên cá»§a "{0}[white]" ? +joingame.title = Tham gia trò chÆ¡i +joingame.ip = Äịa chỉ: +disconnect = Ngắt kết nối. +disconnect.error = Lá»—i kết nối. +disconnect.closed = Kết nối đã bị đóng. +disconnect.timeout = Hết thá»i gian chá». +disconnect.data = Không tải được dữ liệu thế giá»›i! +cantconnect = Không thể tham gia trò chÆ¡i ([accent]{0}[]). +connecting = [accent]Äang kết nối... +reconnecting = [accent]Äang kết nối lại... +connecting.data = [accent]Äang tải dữ liệu thế giá»›i... +server.port = Cổng: +server.addressinuse = Äịa chỉ Ä‘ang được sá»­ dụng! +server.invalidport = Cổng không hợp lệ! +server.error = [scarlet]Lá»—i máy chá»§. +save.new = Bản lưu má»›i +save.overwrite = Bạn có chắc muốn ghi đè\nbản lưu này? +overwrite = Ghi đè +save.none = Không có bản lưu nào được tìm thấy! +savefail = Không thể lưu trò chÆ¡i này! +save.delete.confirm = Bạn có chắc chắn muốn xóa bản lưu này không? +save.delete = Xóa +save.export = Xuất bản lưu +save.import.invalid = [accent]Bản lưu này không hợp lệ! +save.import.fail = [scarlet]Không thể nhập bản lưu: [accent]{0} +save.export.fail = [scarlet]Không thể xuất bản lưu: [accent]{0} +save.import = Nhập bản lưu +save.newslot = Tên bản lưu: +save.rename = Äổi tên +save.rename.text = Tên má»›i: +selectslot = Hãy chá»n má»™t bản lưu. +slot = [accent]Vị trí {0} +editmessage = Chỉnh sá»­a lá»i nhắn +save.corrupted = Tệp bản lưu bị há»ng hoặc không hợp lệ! +empty = +on = Bật +off = Tắt +save.autosave = Tá»± động lưu: {0} +save.map = Bản đồ: {0} +save.wave = Äợt {0} +save.mode = Chế độ: {0} +save.date = Lưu lần cuối: {0} +save.playtime = Thá»i gian chÆ¡i: {0} +warning = Cảnh báo. +confirm = Xác nhận +delete = Xóa +view.workshop = Xem trong Workshop +workshop.listing = Chỉnh sá»­a danh sách Workshop +ok = OK +open = Mở +customize = Luật tùy chỉnh +cancel = Há»§y +openlink = Mở link +copylink = Sao chép link +back = Quay lại +max = Tối Ä‘a +crash.export = Xuất Crash Logs +crash.none = Không có Crash Logs nào được tìm thấy. +crash.exported = Crash logs đã được xuất. +data.export = Xuất dữ liệu +data.import = Nhập dữ liệu +data.openfolder = Mở thư mục dữ liệu +data.exported = Dữ liệu đã được xuất. +data.invalid = Äây không phải dữ liệu trò chÆ¡i hợp lệ. +data.import.confirm = Nhập dữ liệu bên ngoài sẽ ghi đè[scarlet] tất cả[] dữ liệu trò chÆ¡i hiện tại.\n[accent]Äiá»u này không thể hoàn tác![]\n\nSau khi dữ liệu được nhập, trò chÆ¡i cá»§a bạn sẽ thoát ngay lập tức. +quit.confirm = Bạn có chắc muốn thoát? +quit.confirm.tutorial = Bạn có chắc chắn biết mình Ä‘ang làm gì không?\nHướng dẫn có thể được thá»±c hiện lại trong[accent] Cài đặt->Trò chÆ¡i>Thá»±c hiện lại hướng dẫn.[] +loading = [accent]Äang tải... +reloading = [accent]Äang tải lại Mods... +saving = [accent]Äang lưu... +respawn = [accent][[{0}][] để hồi sinh tại căn cứ +cancelbuilding = [accent][[{0}][] để há»§y xây +selectschematic = [accent][[{0}][] to để chá»n+sao chép +pausebuilding = [accent][[{0}][] để tạm dừng xây dá»±ng +resumebuilding = [scarlet][[{0}][] để tiếp tục xây dá»±ng +enablebuilding = [scarlet][[{0}][] để bật xây dá»±ng +showui = UI hidden.\nPress [accent][[{0}][] để hiện UI. +wave = [accent]Äợt {0} +wave.cap = [accent]Äợt {0}/{1} +wave.waiting = [lightgray]Kẻ địch xuất hiện sau {0} +wave.waveInProgress = [lightgray]Äịch Ä‘ang xuất hiện. +waiting = [lightgray]Chá»... +waiting.players = Äang chá» thêm ngưá»i chÆ¡i... +wave.enemies = [lightgray]{0} Kẻ địch còn lại +wave.enemycores = [accent]{0}[lightgray] Căn cứ địch +wave.enemycore = [accent]{0}[lightgray] Căn cứ địch +wave.enemy = [lightgray]{0} Kẻ địch còn lại +wave.guardianwarn = Boss sẽ xuất hiện sau [accent]{0}[] đợt. +wave.guardianwarn.one = Boss sẽ xuất hiện sau [accent]{0}[] đợt. +loadimage = Tải hình ảnh +saveimage = Lưu hình ảnh +unknown = Không xác định +custom = Tùy chỉnh +builtin = Xây trong +map.delete.confirm = Bạn có chắc chắn muốn xóa bản đồ này không? Hành động này không thể hoàn tác! +map.random = [accent]Bản đồ ngẫu nhiên +map.nospawn = Bản đồ này không có bất kỳ căn cứ nào để ngưá»i chÆ¡i hồi sinh! Thêm má»™t căn cứ [accent] cam[] vào bản đồ ở trình chỉnh sá»­a. +map.nospawn.pvp = Bản đồ này không có bất kỳ căn cứ kẻ thù nào để ngưá»i chÆ¡i hồi sinh! Thêm má»™t căn cứ khác màu [scarlet]cam [] vào bản đồ ở trình chỉnh sá»­a. +map.nospawn.attack = Bản đồ này không có bất kỳ căn cứ kẻ thù nào để ngưá»i chÆ¡i tấn công! Thêm má»™t căn cứ màu[scarlet] Ä‘á»[] vào bản đồ ở trình chỉnh sá»­a. +map.invalid = Lá»—i khi tải bản đồ: tệp bản đồ bị há»ng hoặc không hợp lệ. +workshop.update = Cập nhật mục +workshop.error = Lá»—i khi tìm nạp thông tin chi tiết ở workshop: {0} +map.publish.confirm = Bạn có chắc chắn muốn xuất bản bản đồ này không?\n\n[lightgray]Äảm bảo rằng bạn đồng ý vá»›i Workshop EULA trước, hoặc bản đồ cá»§a bạn sẽ không hiển thị! +workshop.menu = Chá»n những gì bạn muốn làm vá»›i mục này. +workshop.info = Thông tin mục +changelog = Danh sách các thay đổi (không bắt buá»™c): +eula = Steam EULA +missing = Mục này đã bị xóa hoặc di chuyển.\n[lightgray]Danh sách workshop hiện đã được tá»± động há»§y liên kết. +publishing = [accent]Äang xuất bản... +publish.confirm = Bạn có chắc chắn muốn xuất bản không?\n\n[lightgray]Äảm bảo rằng bạn đồng ý vá»›i Workshop EULA trước, hoặc mục cá»§a bạn sẽ không hiển thị! +publish.error = Lá»—i khi xuất bản: {0} +steam.error = Không thể khởi chạy dịch vụ Steam.\nLá»—i: {0} + +editor.brush = Kích thước +editor.openin = Mở trong trình chỉnh sá»­a +editor.oregen = Cấu trúc quặng +editor.oregen.info = Cấu trúc quặng: +editor.mapinfo = Thông tin bản đồ +editor.author = Tác giả: +editor.description = Mô tả: +editor.nodescription = Bản đồ phải có mô tả ít nhất 4 ký tá»± trước khi được xuất bản. +editor.waves = Lượt: +editor.rules = Luật: +editor.generation = Cấu trúc: +editor.ingame = Chỉnh sá»­a trong trò chÆ¡i +editor.publish.workshop = Xuất bản lên Workshop +editor.newmap = Bản đồ má»›i +editor.center = Trung tâm +workshop = Workshop +waves.title = Äợt +waves.remove = Xóa +waves.every = má»—i +waves.waves = đợt +waves.perspawn = má»—i lần xuất hiện +waves.shields = khiên/đợt +waves.to = đến +waves.guardian = Boss +waves.preview = Xem trước +waves.edit = Chỉnh sá»­a... +waves.copy = Sao chép vào bá»™ nhá»› tạm +waves.load = Lấy từ bá»™ nhá»› tạm +waves.invalid = Lượt không hợp lệ trong bá»™ nhá»› tạm. +waves.copied = Äã sao chép lượt. +waves.none = Không có kẻ thù được xác định.\nLưu ý rằng bố cục má»—i đợt trống sẽ tá»± động được thay thế bằng bố cục mặc định. + +#these are intentionally in lower case +wavemode.counts = số lượng +wavemode.totals = tổng số +wavemode.health = máu + +editor.default = [lightgray] +details = Chi tiết... +edit = Chỉnh sá»­a... +editor.name = Tên: +editor.spawn = Thêm kẻ địch +editor.removeunit = Xóa kẻ địch +editor.teams = Äá»™i +editor.errorload = Lá»—i khi tải tệp. +editor.errorsave = Lá»—i khi lưu tệp. +editor.errorimage = Äó là má»™t hình ảnh, không phải bản đồ. +editor.errorlegacy = Bản đồ này quá cÅ©, và sá»­ dụng định dạng bản đồ cÅ© không còn được há»— trợ. +editor.errornot = Äây không phải là tệp bản đồ. +editor.errorheader = Tệp bản đồ này không hợp lệ hoặc bị há»ng. +editor.errorname = Bản đồ không có tên được xác định. Bạn Ä‘ang cố gắng tải má»™t bản lưu? +editor.update = Cập nhật +editor.randomize = Ngẫu nhiên +editor.apply = Ãp dụng +editor.generate = Tạo ra +editor.resize = Thay đổi kích thước +editor.loadmap = Mở bản đồ +editor.savemap = Lưu bản đồ +editor.saved = Äã lưu! +editor.save.noname = Bản đồ cá»§a bạn không có tên! Hãy đặt má»™t cái tên trong 'Thông tin bản đồ'. +editor.save.overwrite = Bản đồ cá»§a bạn ghi đè lên má»™t bản đồ đã có sẵn! Hãy chá»n má»™t cái tên khác trong 'Thông tin bản đồ'. +editor.import.exists = [scarlet]Không thể nhập:[] má»™t bản đồ có sẵn có tên '{0}' đã tồn tại! +editor.import = Nhập... +editor.importmap = Nhập bản đồ +editor.importmap.description = Nhập má»™t bản đồ đã có +editor.importfile = Nhập tệp +editor.importfile.description = Nhập tệp bản đồ bên ngoài +editor.importimage = Nhập tệp hình ảnh +editor.importimage.description = Nhập tệp hình ảnh bản đồ bên ngoài +editor.export = Xuất... +editor.exportfile = Xuất tệp +editor.exportfile.description = Xuất tệp bản đồ +editor.exportimage = Xuất hình ảnh địa hình +editor.exportimage.description = Xuất tệp hình ảnh chỉ chứa địa hình cÆ¡ bản +editor.loadimage = Nhập địa hình +editor.saveimage = Xuất địa hình +editor.unsaved = Bạn có chắc chắn muốn thoát?\n[scarlet]Má»i thay đổi chưa được lưu sẽ bị mất. +editor.resizemap = Thay đổi kích thước bản đồ +editor.mapname = Tên bản đồ: +editor.overwrite = [accent]Cảnh báo!\nÄiá»u này có thể ghi đè lên má»™t bản đồ hiện có. +editor.overwrite.confirm = [scarlet]Cảnh báo![] Bản đồ có tên này đã tồn tại. Bạn có chắc chắn muốn ghi đè lên nó không?\n"[accent]{0}[]" +editor.exists = Bản đồ có tên này đã tồn tại. +editor.selectmap = Chá»n bản đồ cần mở: + +toolmode.replace = Thay thế +toolmode.replace.description = Chỉ vẽ trên các khối rắn. +toolmode.replaceall = Thay thế tất cả +toolmode.replaceall.description = Thay thế tất cả các khối trong bản đồ. +toolmode.orthogonal = Trá»±c giao +toolmode.orthogonal.description = Chỉ vẽ các đưá»ng trá»±c giao. +toolmode.square = Vuông +toolmode.square.description = Cá» vẽ vuông. +toolmode.eraseores = Xóa quặng +toolmode.eraseores.description = Chỉ xóa quặng. +toolmode.fillteams = Fill Teams +toolmode.fillteams.description = Fill teams instead of blocks. +toolmode.drawteams = Draw Teams +toolmode.drawteams.description = Draw teams instead of blocks. + +filters.empty = [lightgray]Không có bá»™ lá»c! Thêm má»™t cái bằng nút bên dưới. +filter.distort = Cong vẹo +filter.noise = Nhiá»…u +filter.enemyspawn = Khu vá»±c xuất hiện cá»§a kẻ thù +filter.spawnpath = Khu tạo ra +filter.corespawn = Chá»n Căn cứ +filter.median = Trung bình +filter.oremedian = Quặng Trung bình +filter.blend = Trá»™n +filter.defaultores = Quặng mặc định +filter.ore = Quặng +filter.rivernoise = Nhiá»…u sông +filter.mirror = Äối xứng +filter.clear = Xóa +filter.option.ignore = Bá» qua +filter.scatter = Phân tán +filter.terrain = Äịa hình +filter.option.scale = Kích thước +filter.option.chance = Tá»· lệ +filter.option.mag = Äá»™ lá»›n +filter.option.threshold = Ngưỡng +filter.option.circle-scale = Äá»™ lá»›n vòng tròn +filter.option.octaves = Octaves +filter.option.falloff = Falloff +filter.option.angle = Góc +filter.option.amount = Số lượng +filter.option.block = Khối +filter.option.floor = Ná»n +filter.option.flooronto = Ná»n thay thế +filter.option.target = Mục tiêu +filter.option.wall = Tưá»ng +filter.option.ore = Quặng +filter.option.floor2 = Ná»n phụ +filter.option.threshold2 = Ngưỡng phụ +filter.option.radius = Bán kính +filter.option.percentile = Phần trăm + +width = Chiá»u rá»™ng: +height = Chiá»u cao: +menu = Menu +play = ChÆ¡i +campaign = Chiến dịch +load = Tải +save = Lưu +fps = FPS: {0} +ping = Ping: {0}ms +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb +language.restart = Khởi động lại trò chÆ¡i cá»§a bạn để cài đặt ngôn ngữ có hiệu lá»±c. +settings = Cài đặt +tutorial = Hướng dẫn +tutorial.retake = Thá»±c hiện lại Hướng dẫn +editor = Chỉnh sá»­a +mapeditor = Trình chỉnh sá»­a bản đồ + +abandon = Bá» +abandon.text = Khu vá»±c này và tất cả tài nguyên cá»§a nó sẽ bị mất vào tay kẻ địch. +locked = Äã khóa +complete = [lightgray]Hoàn thành: +requirement.wave = Äạt đến đợt {0} ở {1} +requirement.core = Phá há»§y căn cứ địch ở {0} +requirement.research = Nghiên cứu {0} +requirement.produce = Sản lượng {0} +requirement.capture = Chiếm {0} +launch.text = Phóng +research.multiplayer = Chỉ máy chá»§ má»›i có thể nghiên cứu các mục. +map.multiplayer = Chỉ máy chá»§ má»›i có thể xem các khu vá»±c. +uncover = Khám phá +configure = Tùy chỉnh vật phẩm + +loadout = Vật phẩm +resources = Tài nguyên +bannedblocks = Khối bị cấm +addall = Thêm tất cả +launch.from = Äang phóng từ: [accent]{0} +launch.destination = Äích đến: {0} +configure.invalid = Số lượng phải là số trong khoảng 0 đến {0}. +add = Thêm... +boss.health = Máu Boss + +connectfail = [scarlet]Lá»—i kết nối:\n\n[accent]{0} +error.unreachable = Không thể truy cập máy chá»§.\nKiểm tra lại xem địa chỉ có đúng không? +error.invalidaddress = Äịa chỉ không hợp lệ. +error.timedout = Hết thá»i gian chá»!\nÄảm bảo máy chá»§ đã thiết lập port forwarding, và địa chỉ đó là chính xác! +error.mismatch = Lá»—i packet:\nphiên bản máy khách / máy chá»§ có thể không khá»›p.\nÄảm bảo bạn và máy chá»§ có phiên bản Mindustry má»›i nhất! +error.alreadyconnected = Äã kết nối. +error.mapnotfound = Không tìm thấy tệp bản đồ! +error.io = Lá»—i Network I/O. +error.any = Lá»—i mạng không xác định. +error.bloom = Không khởi tạo được hiệu ứng phát sáng.\nThiết bị cá»§a bạn có thể không há»— trợ. + +weather.rain.name = Mưa +weather.snow.name = Tuyết +weather.sandstorm.name = Bão cát +weather.sporestorm.name = Bão bào tá»­ +weather.fog.name = Sương mù + +sectors.unexplored = [lightgray]Chưa được khám phá +sectors.resources = Tài nguyên: +sectors.production = Sản lượng: +sectors.export = Xuất: +sectors.time = Thá»i gian: +sectors.threat = Mối Ä‘e dá»a: +sectors.wave = Äợt: +sectors.stored = Lưu trữ: +sectors.resume = Tiếp tục +sectors.launch = Phóng +sectors.select = Lá»±a chá»n +sectors.nonelaunch = [lightgray]trống (mặt trá»i) +sectors.rename = Äổi tên khu vá»±c +sectors.enemybase = [scarlet]Căn cứ địch +sectors.vulnerable = [scarlet]Dá»… bị tổn thất +sectors.underattack = [scarlet]Äang bị tấn công! [accent]{0}% tổn thất +sectors.survives = [accent]Vượt qua {0} đợt +sectors.go = Äi +sector.curcapture = Khu vá»±c đã chiếm +sector.curlost = Khu vá»±c đã mất +sector.missingresources = [scarlet]Không đủ tài nguyên căn cứ +sector.attacked = Khu vá»±c [accent]{0}[white] Ä‘ang bị tấn công! +sector.lost = Khu vá»±c [accent]{0}[white] đã mất! +#note: the missing space in the line below is intentional +sector.captured = Khu vá»±c [accent]{0}[white]đã chiếm! + +threat.low = Thấp +threat.medium = Trung bình +threat.high = Cao +threat.extreme = Cá»±c cao +threat.eradication = Há»§y diệt + +planets = Hành tinh + +planet.serpulo.name = Serpulo +planet.sun.name = Mặt trá»i + +#Why we should translate this ?? +sector.impact0078.name = Impact 0078 +sector.groundZero.name = Ground Zero +sector.craters.name = The Craters +sector.frozenForest.name = Frozen Forest +sector.ruinousShores.name = Ruinous Shores +sector.stainedMountains.name = Stained Mountains +sector.desolateRift.name = Desolate Rift +sector.nuclearComplex.name = Nuclear Production Complex +sector.overgrowth.name = Overgrowth +sector.tarFields.name = Tar Fields +sector.saltFlats.name = Salt Flats +sector.fungalPass.name = Fungal Pass +sector.biomassFacility.name = Biomass Synthesis Facility +sector.windsweptIslands.name = Windswept Islands +sector.extractionOutpost.name = Extraction Outpost +sector.planetaryTerminal.name = Planetary Launch Terminal + +#TODO: The Last +sector.groundZero.description = Vị trí tối ưu để bắt đầu má»™t lần nữa. Mối Ä‘e dá»a cá»§a kẻ thù thấp. Ãt tài nguyên.\nThu thập càng nhiá»u chì và đồng càng tốt.\nTiến lên. +sector.frozenForest.description = Ngay cả ở đây, gần núi hÆ¡n, các bào tá»­ đã phát tán. Nhiệt độ lạnh giá không thể chứa chúng mãi mãi.\n\nBắt đầu tham gia vào quyá»n lá»±c. Chế tạo máy phát Ä‘iện đốt. Há»c cách sá»­ dụng Máy sá»­a chữa. +sector.saltFlats.description = Ở vùng ngoại ô cá»§a sa mạc Salt Flats. Có thể tìm thấy ít tài nguyên ở khu vá»±c này.\n\nKẻ thù đã dá»±ng lên má»™t khu phức hợp lưu trữ tài nguyên ở đây. Loại bá» căn cứ cá»§a há». Không để lại gì. +sector.craters.description = Nước đã tích tụ trong miệng núi lá»­a này, di tích cá»§a các cuá»™c chiến tranh cÅ©. Hãy chiếm lại khu vá»±c. Thu gom cát, metaglass . BÆ¡m nước để làm mát súng và mÅ©i khoan. +sector.ruinousShores.description = Qua những chất thải, là bá» biển. Má»™t thá»i, vị trí này là nÆ¡i đặt má»™t hệ thống phòng thá»§ ven biển. Không còn lại nhiá»u. Chỉ những công trình phòng thá»§ cÆ¡ bản nhất vẫn không bị tổn thương, má»i thứ khác Ä‘á»u trở thành đống sắt vụn.\nTiếp tục mở rá»™ng ra bên ngoài. Khám phá lại công nghệ. +sector.stainedMountains.description = Xa hÆ¡n trong đất liá»n là những ngá»n núi, chưa bị bào tá»­ xâm hại.\nKhai thác titan dồi dào trong khu vá»±c này. Tìm hiểu làm thế nào để sá»­ dụng nó.\n\nSá»± hiện diện cá»§a kẻ thù ở đây lá»›n hÆ¡n. Äừng cho há» thá»i gian để có quân lính mạnh nhất cá»§a há». +sector.overgrowth.description = Khu vá»±c này cây cối má»c um tùm, gần nguồn bào tá»­ hÆ¡n.\nÄịch đã lập tiá»n đồn ở đây. Chế tạo Mace. Phá há»§y nó. Äòi lại thứ đã mất. +sector.tarFields.description = Vùng ngoại ô cá»§a khu sản xuất dầu, giữa núi và sa mạc. Má»™t trong số ít khu vá»±c có trữ lượng dầu có thể sá»­ dụng được.\nMặc dù bị bá» hoang, khu vá»±c này có má»™t số lá»±c lượng địch nguy hiểm gần đó. Äừng đánh giá thấp chúng.\n\n[lightgray]Nghiên cứu công nghệ chế biến dầu nếu có thể. +sector.desolateRift.description = Má»™t vùng cá»±c kỳ nguy hiểm. Tài nguyên dồi dào, nhưng ít không gian. Nguy cÆ¡ phá há»§y cao. Hãy rá»i Ä‘i càng sá»›m càng tốt. Äừng để bị lừa bởi khoảng cách dài giữa các cuá»™c tấn công cá»§a kẻ thù. +sector.nuclearComplex.description = Má»™t cÆ¡ sở trước đây để sản xuất và chế biến thorium, đã biến thành đống đổ nát.\n[lightgray]Nghiên cứu thorium và nhiá»u công dụng cá»§a nó.\n\nKẻ thù có mặt ở đây vá»›i số lượng rất lá»›n, liên tục lùng sục những kẻ tấn công. +sector.fungalPass.description = Khu vá»±c chuyển tiếp giữa vùng núi cao và vùng đất thấp hÆ¡n, đầy bào tá»­. Má»™t căn cứ trinh sát nhá» cá»§a địch được đặt tại đây.\nPhá há»§y nó.\nSá»­ dụng quân lính Dagger và Crawler. Phá há»§y hai căn cứ cá»§a địch. +sector.biomassFacility.description = Nguồn gốc cá»§a bào tá»­. Äây là cÆ¡ sở mà chúng được nghiên cứu và sản xuất ban đầu.\nNghiên cứu công nghệ có bên trong. Nuôi cấy bào tá»­ để sản xuất nhiên liệu và chất dẻo.\n\n[lightgray]Khi cÆ¡ sở này sụp đổ, các bào tá»­ đã được giải phóng. Không có gì trong hệ sinh thái địa phương có thể cạnh tranh vá»›i má»™t sinh vật xâm lấn như vậy. +sector.windsweptIslands.description = Xa hÆ¡n đưá»ng bá» biển là chuá»—i đảo xa xôi này. Hồ sÆ¡ cho thấy hỠđã từng có công trình sản xuất [accent]Plastanium[] .\n\nChống lại các lá»±c lượng hải quân cá»§a kẻ thù. Thiết lập căn cứ trên quần đảo. Nghiên cứu các nhà máy này. +sector.extractionOutpost.description = Má»™t tiá»n đồn xa, được kẻ thù xây dá»±ng vá»›i mục đích phóng nguồn lá»±c sang các khu vá»±c khác.\n\nCông nghệ vận tải xuyên ngành là Ä‘iá»u cần thiết để chinh phục hÆ¡n nữa. Phá há»§y căn cứ. Nghiên cứu bệ phóng cá»§a há». +sector.impact0078.description = Äây là tàn tích cá»§a tàu vận chuyển giữa các vì sao lần đầu tiên Ä‘i vào hệ thống này.\n\nLấy càng nhiá»u càng tốt từ đống đổ nát. Nghiên cứu bất kỳ công nghệ nguyên vẹn nào. +sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa má»™t cấu trúc có khả năng phóng căn cứ tá»›i các hành tinh địa phương. Nó được bảo vệ cá»±c kỳ cẩn thận.\n\nSản xuất quân lính hải quân. Loại bá» kẻ thù càng nhanh càng tốt. Nghiên cứu cấu trúc phóng. + +settings.language = Ngôn ngữ +settings.data = Dữ liệu trò chÆ¡i +settings.reset = Khôi phục vá» mặc định +settings.rebind = Sá»­a +settings.resetKey = Äặt lại +settings.controls = Äiá»u khiển +settings.game = Trò chÆ¡i +settings.sound = Âm thanh +settings.graphics = Äồ há»a +settings.cleardata = Xóa dữ liệu trò chÆ¡i... +settings.clear.confirm = Bạn có chắc chắn muốn xóa dữ liệu này không?\nHành động này không thể hoàn tác! +settings.clearall.confirm = [scarlet]CẢNH BÃO![]\nThao tác này sẽ xóa tất cả dữ liệu, bao gồm bản đồ và các cài đặt.\nSau khi bạn nhấn vào 'ok' trò chÆ¡i sẽ xóa tất cả dữ liệu và tá»± động thoát. +settings.clearsaves.confirm = Bạn có chắc muốn xóa tất cả bản lưu? +settings.clearsaves = Xóa bản lưu +settings.clearresearch = Xóa dữ liệu nghiên cứu +settings.clearresearch.confirm = Bạn có chắc muốn xóa tất cả dữ liệu nghiên cứu từ Chiến dịch? +settings.clearcampaignsaves = Xóa dữ liệu Chiến dịch +settings.clearcampaignsaves.confirm = Bạn có chắc muốn xóa toàn bá»™ dữ liệu Chiến dịch? +paused = [accent]< Tạm dừng > +clear = Xóa +banned = [scarlet]Cấm +yes = Có +no = Không +info.title = Thông tin +error.title = [scarlet]Äã xảy ra lá»—i +error.crashtitle = Äã xảy ra lá»—i +unit.nobuild = [scarlet]Quân lính/Công trình không thể xây dá»±ng +lastaccessed = [lightgray]Truy cập lần cuối: {0} +block.unknown = [lightgray]??? + +stat.description = Mô tả +stat.input = Äầu vào +stat.output = Sản phẩm +stat.booster = Tăng cưá»ng +stat.tiles = Yêu cầu khu vá»±c +stat.affinities = Phù hợp +stat.powercapacity = Dung lượng pin +stat.powershot = Năng lượng/Phát bắn +stat.damage = Sát thương +stat.targetsair = Mục tiêu trên không +stat.targetsground = Mục tiêu mặt đất +stat.itemsmoved = Tốc độ dịch chuyển +stat.launchtime = Thá»i gian giữa các lần phóng. +stat.shootrange = Phạm vi +stat.size = Kích thước +stat.displaysize = Kích thước màn hình +stat.liquidcapacity = Dung tích chất lá»ng +stat.powerrange = Phạm vi năng lượng +stat.linkrange = Phạm vi kết nối +stat.instructions = Hướng dẫn +stat.powerconnections = Số lượng kết nối tối Ä‘a +stat.poweruse = Năng lượng sá»­ dụng +stat.powerdamage = Năng lượng/Sát thương +stat.itemcapacity = Sức chứa vật phẩm +stat.memorycapacity = Dung lượng bá»™ nhá»› +stat.basepowergeneration = Năng lượng tạo ra (cÆ¡ bản) +stat.productiontime = Thá»i gian sản xuất +stat.repairtime = Thá»i gian sá»­a +stat.weapons = VÅ© khí +stat.bullet = Äạn +stat.speedincrease = Tăng tốc +stat.range = Phạm vi +stat.drilltier = Khoang được +stat.drillspeed = Tốc độ khoang cÆ¡ bản +stat.boosteffect = Hiệu ứng tăng cưá»ng +stat.maxunits = Số quân lính hoạt động tối Ä‘a +stat.health = Äá»™ bá»n +stat.armor = Giáp +stat.buildtime = Thá»i gian xây +stat.maxconsecutive = Äầu ra tối Ä‘a +stat.buildcost = Yêu cầu +stat.inaccuracy = Äá»™ lệch +stat.shots = Phát bắn +stat.reload = Phát bắn/Giây +stat.ammo = Äạn +stat.shieldhealth = Äá»™ bá»n khiên +stat.cooldowntime = Thá»i gian chá» +stat.explosiveness = Gây nổ +stat.basedeflectchance = Tá»· lệ phản đạn +stat.lightningchance = Tá»· lệ phóng Ä‘iện +stat.lightningdamage = Sát thương tia Ä‘iện +stat.flammability = Dá»… cháy +stat.radioactivity = Phóng xạ +stat.charge = Phóng Ä‘iện +stat.heatcapacity = Nhiệt dung +stat.viscosity = Äá»™ nhá»›t +stat.temperature = Nhiệt độ +stat.speed = Vận tốc +stat.buildspeed = Tốc độ xây +stat.minespeed = Tốc độ đào +stat.minetier = Cấp độ đào +stat.payloadcapacity = Sức chứa khối hàng +stat.commandlimit = Giá»›i hạn lệnh +stat.abilities = Khả năng +stat.canboost = Nâng cấp +stat.flying = Bay +stat.ammouse = Sá»­ dụng đạn + +ability.forcefield = Tạo khiên +ability.repairfield = Sá»­a chữa/Xây dá»±ng +ability.statusfield = Status Field +ability.unitspawn = Sản xuất {0} +ability.shieldregenfield = Tạo khiên nhá» +ability.movelightning = Movement Lightning + +bar.drilltierreq = Cần máy khoan tốt hÆ¡n +bar.noresources = Thiếu tài nguyên +bar.corereq = Yêu cầu căn cứ +bar.drillspeed = Tốc độ khoan: {0}/giây +bar.pumpspeed = Tốc độ bÆ¡m: {0}/giây +bar.efficiency = Hiệu suất: {0}% +bar.boost = Tăng tốc: {0}% +bar.powerbalance = Năng lượng: {0}/giây +bar.powerstored = Lưu trữ: {0}/{1} +bar.poweramount = Năng lượng: {0} +bar.poweroutput = Năng lượng tạo ra: {0} +bar.powerlines = Số lượng kết nối: {0}/{1} +bar.items = Vật phẩm: {0} +bar.capacity = Sức chứa: {0} +bar.unitcap = {0} {1}/{2} +bar.liquid = Chất lá»ng +bar.heat = Nhiệt độ +bar.power = Năng lượng +bar.progress = Äang xây dá»±ng +bar.input = Äầu vào +bar.output = Sản phẩm + +units.processorcontrol = [lightgray]Äiá»u khiển bởi bá»™ xá»­ lý + +bullet.damage = [stat]{0}[lightgray] sát thương +bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rá»™ng ~[stat] {1}[lightgray] ô +bullet.incendiary = [stat]cháy +bullet.sapping = [stat]sapping +bullet.homing = [stat]truy Ä‘uổi +bullet.shock = [stat]sốc +bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối +bullet.frag = [stat]phá mảnh +bullet.knockback = [stat]{0}[lightgray] bật lùi +bullet.pierce = [stat]{0}[lightgray]x xuyên giáp +bullet.infinitepierce = [stat]xuyên thấu +bullet.healpercent = [stat]{0}[lightgray]% sá»­a chá»­a +bullet.freezing = [stat]đóng băng +bullet.tarred = [stat]tarred +bullet.multiplier = [stat]{0}[lightgray]x lượng đạn +bullet.reload = [stat]{0}[lightgray]x tốc độ bắn + +unit.blocks = Khối +unit.blockssquared = Khối² +unit.powersecond = đơn vị năng lượng/giây +unit.liquidsecond = đơn vị chất lá»ng/giây +unit.itemssecond = vật phẩm/giây +unit.liquidunits = đơn vị chất lá»ng +unit.powerunits = đơn vị năng lượng +unit.degrees = độ +unit.seconds = giây +unit.minutes = phút +unit.persecond = /giây +unit.perminute = /phút +unit.timesspeed = x tốc độ +unit.percent = % +unit.shieldhealth = độ bá»n khiên +unit.items = vật phẩm +unit.thousands = k +unit.millions = mil +unit.billions = b +unit.pershot = /shot +category.purpose = Mô tả +category.general = Chung +category.power = Năng lượng +category.liquids = Chất lá»ng +category.items = Vật phẩm +category.crafting = Vào/Sản phẩm +category.function = Chức năng +category.optional = Cải tiến +setting.landscape.name = Khóa ngang +setting.shadows.name = Bóng đổ +setting.blockreplace.name = Tá»± động đỠxuất khối +setting.linear.name = Lá»c tuyến tính +setting.hints.name = Gợi ý +setting.flow.name = Hiện thị tốc độ chuyá»n tài nguyên +setting.backgroundpause.name = Tạm dừng trong ná»n +setting.buildautopause.name = Tá»± động dừng xây dá»±ng +setting.modcrashdisable.name = Tắt các mod khi gặp sá»± cố trong khởi động +setting.animatedwater.name = Hiệu ứng nước +setting.animatedshields.name = Hiệu ứng khiên +setting.antialias.name = Khá»­ răng cưa[lightgray] (yêu cầu khởi động lại)[] +setting.playerindicators.name = Hướng ngưá»i chÆ¡i +setting.indicators.name = Hướng kẻ địch +setting.autotarget.name = Tá»± động nhắm mục tiêu +setting.keyboard.name = Äiá»u khiển bằng chuá»™t + bàn phím +setting.touchscreen.name = Äiá»u khiển bằng màn hình cảm ứng +setting.fpscap.name = FPS tối Ä‘a +setting.fpscap.none = Không giá»›i hạn +setting.fpscap.text = {0} FPS +setting.uiscale.name = Kích thước UI[lightgray] (yêu cầu khởi động lại)[] +setting.swapdiagonal.name = Äặt luôn theo đưá»ng chéo +setting.difficulty.training = Luyện tập +setting.difficulty.easy = Dá»… +setting.difficulty.normal = Vừa +setting.difficulty.hard = Khó +setting.difficulty.insane = Rất khó +setting.difficulty.name = Äá»™ khó: +setting.screenshake.name = Rung chuyển khung hình +setting.effects.name = Hiển thị hiệu ứng +setting.destroyedblocks.name = Hiển thị khối bị phá +setting.blockstatus.name = Hiển thị trạng thái khối +setting.conveyorpathfinding.name = Tìm đưá»ng dẫn băng chuyá»n +setting.sensitivity.name = Äá»™ nhạy Ä‘iá»u khiển +setting.saveinterval.name = Khoảng thá»i gian lưu +setting.seconds = {0} giây +setting.milliseconds = {0} mili giây +setting.fullscreen.name = Toàn màn hình +setting.borderlesswindow.name = Không viá»n[lightgray] (yêu cầu khởi động lại) +setting.fps.name = Hiển thị FPS & Ping +setting.smoothcamera.name = Chế độ mượt mà +setting.vsync.name = VSync +setting.pixelate.name = Äồ há»a pixel +setting.minimap.name = Hiển thị bản đồ mini +setting.coreitems.name = Hiển thị vật phẩm trong căn cứ +setting.position.name = Hiển thị vị trí ngưá»i chÆ¡i +setting.musicvol.name = Âm lượng nhạc +setting.atmosphere.name = Hiển thị bầu khí quyển hành tinh +setting.ambientvol.name = Âm lượng tổng +setting.mutemusic.name = Tắt nhạc +setting.sfxvol.name = Âm lượng SFX +setting.mutesound.name = Tắt tiếng +setting.crashreport.name = Gá»­i báo cáo sá»± cố +setting.savecreate.name = Tá»± động lưu +setting.publichost.name = Hiển thị trò chÆ¡i công khai +setting.playerlimit.name = Giá»›i hạn ngưá»i chÆ¡i +setting.chatopacity.name = Äá»™ má» trò chuyện +setting.lasersopacity.name = Äá»™ má» kết nối năng lượng +setting.bridgeopacity.name = Äá»™ má» cầu +setting.playerchat.name = Hiển thị bong bóng trò chuyện cá»§a ngưá»i chÆ¡i +setting.showweather.name = Hiển thị đồ há»a thá»i tiết +public.confirm = Bạn có muốn công khai trò chÆ¡i cá»§a mình không?\n[accent]Bất kỳ ai cÅ©ng có thể tham gia trò chÆ¡i cá»§a bạn.\n[lightgray]Äiá»u này có thể được thay đổi sau trong Cài đặt-> Trò chÆ¡i-> Hiển thị trò chÆ¡i công khai. +public.confirm.really = Nếu bạn muốn chÆ¡i vá»›i bạn bè, sá»­ dụng [green]Invite Friend[] thay vì [scarlet]Public server[]!\nBạn có chắc chắn muốn làm trò chÆ¡i cá»§a mình [scarlet]công khai[]? +public.beta = Lưu ý rằng phiên bản beta cá»§a trò chÆ¡i không thể tạo sảnh công khai. +uiscale.reset = Kích thước UI đã được thay đổi.\nNhấn "OK" để xác nhận.\n[scarlet]Hoàn lại và thoát trong[accent] {0}[] giây... +uiscale.cancel = Há»§y & Thoát +setting.bloom.name = Hiệu ứng phát sáng +keybind.title = Sá»­a phím +keybinds.mobile = [scarlet]Hầu hết phím ở đây không hoạt động trên thiết bị di động. Chỉ há»— trợ di chuyển cÆ¡ bản. +category.general.name = Chung +category.view.name = Xem +category.multiplayer.name = Nhiá»u ngưá»i chÆ¡i +category.blocks.name = Chá»n khối +command.attack = Tấn công +command.rally = Tập hợp +command.retreat = Rút lui +command.idle = Không hoạt động +placement.blockselectkeys = \n[lightgray]Phím: [{0}, +keybind.respawn.name = Hồi sinh +keybind.control.name = Äiá»u khiển quân lính +keybind.clear_building.name = Xóa công trình +keybind.press = Nhấn má»™t phím... +keybind.press.axis = Nhấn má»™t tổ hợp phím hoặc má»™t phím... +keybind.screenshot.name = Chụp ảnh bản đồ +keybind.toggle_power_lines.name = Ẩn/Hiện đưá»ng truyá»n năng lượng +keybind.toggle_block_status.name = Ẩn/Hiện trạng thái khối +keybind.move_x.name = Di chuyển X +keybind.move_y.name = Di chuyển Y +keybind.mouse_move.name = Theo chuá»™t +keybind.pan.name = Di chuyển góc nhìn +keybind.boost.name = Tăng tốc +keybind.schematic_select.name = Chá»n khu vá»±c +keybind.schematic_menu.name = Menu bản thiết kế +keybind.schematic_flip_x.name = Lật bản thiết kế X +keybind.schematic_flip_y.name = Lật bản thiết kế Y +keybind.category_prev.name = Danh mục trước +keybind.category_next.name = Danh mục tiếp theo +keybind.block_select_left.name = Chá»n khối trái +keybind.block_select_right.name = Chá»n khối phải +keybind.block_select_up.name = Chá»n khối trên +keybind.block_select_down.name = Chá»n khối dưới +keybind.block_select_01.name = Danh mục/Khối 1 +keybind.block_select_02.name = Danh mục/Khối 2 +keybind.block_select_03.name = Danh mục/Khối 3 +keybind.block_select_04.name = Danh mục/Khối 4 +keybind.block_select_05.name = Danh mục/Khối 5 +keybind.block_select_06.name = Danh mục/Khối 6 +keybind.block_select_07.name = Danh mục/Khối 7 +keybind.block_select_08.name = Danh mục/Khối 8 +keybind.block_select_09.name = Danh mục/Khối 9 +keybind.block_select_10.name = Danh mục/Khối 10 +keybind.fullscreen.name = Chế độ toàn màn hình +keybind.select.name = Chá»n/Bắn +keybind.diagonal_placement.name = Äặt chéo +keybind.pick.name = Chá»n khối +keybind.break_block.name = Phá khối +keybind.deselect.name = Bá» chá»n +keybind.pickupCargo.name = Nhặt hàng +keybind.dropCargo.name = Thả hàng +keybind.command.name = Lệnh +keybind.shoot.name = Bắn +keybind.zoom.name = Thu phóng +keybind.menu.name = Menu +keybind.pause.name = Tạm dừng +keybind.pause_building.name = Tạm dừng/Tiếp tục Xây +keybind.minimap.name = Bản đồ mini +keybind.planet_map.name = Bản đồ hành tinh +keybind.research.name = Nghiên cứu +keybind.chat.name = Trò chuyện +keybind.player_list.name = Danh sách ngưá»i chÆ¡i +keybind.console.name = Bảng Ä‘iá»u khiển +keybind.rotate.name = Xoay +keybind.rotateplaced.name = Xoay khối (Giữ) +keybind.toggle_menus.name = Ẩn/Hiện Menus +keybind.chat_history_prev.name = Lịch sá»­ trò chuyện trước +keybind.chat_history_next.name = Lịch sá»­ trò chuyện sau +keybind.chat_scroll.name = Cuá»™n trò chuyện +keybind.chat_mode.name = Thay đổi chế độ trò chuyện +keybind.drop_unit.name = Thả quân +keybind.zoom_minimap.name = Thu phóng bản đồ mini +mode.help.title = Mô tả chế độ +mode.survival.name = Sinh tồn +mode.survival.description = Chế độ bình thưá»ng. Tài nguyên hạn chế và lượt đến tá»± động.\n[gray]Yêu cầu nÆ¡i xuất hiện kẻ địch trong bản đồ để chÆ¡i. +mode.sandbox.name = Tá»± do +mode.sandbox.description = Tài nguyên vô hạn và không có thá»i gian chá» giữa các đợt. +mode.editor.name = Chỉnh sá»­a +mode.pvp.name = PvP +mode.pvp.description = Chiến đấu vá»›i những ngưá»i chÆ¡i khác trên cùng má»™t bản đồ.\n[gray]Cần ít nhất hai căn cứ có màu khác nhau để chÆ¡i. +mode.attack.name = Tấn công +mode.attack.description = Phá há»§y căn cứ cá»§a kẻ địch. \n[gray]Cần căn cứ màu đỠtrong bản đồ để chÆ¡i. +mode.custom = Tùy chỉnh luật + +rules.infiniteresources = Tài nguyên vô hạn +rules.reactorexplosions = Nổ lò phản ứng +rules.coreincinerates = Há»§y vật phẩm khi căn cứ đầy +rules.schematic = Cho phép dùng bản thiết kế +rules.wavetimer = Äếm ngược đợt +rules.waves = Äợt +rules.attack = Chế độ tấn công +rules.buildai = AI Xây dá»±ng +rules.enemyCheat = Tài nguyên vô hạn (kẻ địch) +rules.blockhealthmultiplier = Hệ số độ bá»n khối +rules.blockdamagemultiplier = Hệ số sát thương cá»§a khối +rules.unitbuildspeedmultiplier = Hệ số tốc độ sản xuất lính +rules.unithealthmultiplier = Hệ số máu cá»§a quân lính +rules.unitdamagemultiplier = Hệ số sát thương cá»§a quân lính +rules.unitcapvariable = Căn cứ tăng giá»›i hạn quân lính +rules.unitcap = Giá»›i hạn quân lính +rules.enemycorebuildradius = Bán kính không xây dá»±ng trong căn cứ cá»§a kẻ địch:[lightgray] (ô) +rules.wavespacing = Thá»i gian giữa các đợt:[lightgray] (giây) +rules.buildcostmultiplier = Hệ số chi phí xây dá»±ng +rules.buildspeedmultiplier = Hệ số tốc độ xây dá»±ng +rules.deconstructrefundmultiplier = Hệ số số vật phẩm hoàn lại khi phá công trình +rules.waitForWaveToEnd = Äợt chá» hết kẻ địch +rules.dropzoneradius = Bán kính vùng thả:[lightgray] (ô) +rules.unitammo = Quân lính cần đạn +rules.title.waves = Äợt +rules.title.resourcesbuilding = Tài nguyên & Xây dá»±ng +rules.title.enemy = Kẻ địch +rules.title.unit = Quân lính +rules.title.experimental = Thá»±c nghiệm +rules.title.environment = Môi trưá»ng +rules.lighting = Ãnh sáng +rules.enemyLights = Äèn địch +rules.fire = Lá»­a +rules.explosions = Sát thương nổ cá»§a Khối/Quân lính +rules.ambientlight = Ãnh sáng môi trưá»ng +rules.weather = Thá»i tiết +rules.weather.frequency = Tần suất: +rules.weather.always = Luôn luôn +rules.weather.duration = Thá»i gian: + +content.item.name = Vật phẩm +content.liquid.name = Chất lá»ng +content.unit.name = Quân lính +content.block.name = Khối +content.sector.name = Khu vực + +item.copper.name = Äồng +item.lead.name = Chì +item.coal.name = Than +item.graphite.name = Than chì +item.titanium.name = Titan +item.thorium.name = Thorium +item.silicon.name = Silicon +item.plastanium.name = Nhá»±a +item.phase-fabric.name = Phase Fabric +item.surge-alloy.name = Hợp kim +item.spore-pod.name = Vá» bào tá»­ +item.sand.name = Cát +item.blast-compound.name = Chất nổ +item.pyratite.name = Nhiệt thạch +item.metaglass.name = Thuá»· tinh +item.scrap.name = Phế liệu +liquid.water.name = Nước +liquid.slag.name = Xỉ nóng chảy +liquid.oil.name = Dầu +liquid.cryofluid.name = Chất làm lạnh + +#Why we should translate this ??? +unit.dagger.name = Dagger +unit.mace.name = Mace +unit.fortress.name = Fortress +unit.nova.name = Nova +unit.pulsar.name = Pulsar +unit.quasar.name = Quasar +unit.crawler.name = Crawler +unit.atrax.name = Atrax +unit.spiroct.name = Spiroct +unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid +unit.flare.name = Flare +unit.horizon.name = Horizon +unit.zenith.name = Zenith +unit.antumbra.name = Antumbra +unit.eclipse.name = Eclipse +unit.mono.name = Mono +unit.poly.name = Poly +unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct +unit.risso.name = Risso +unit.minke.name = Minke +unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura +unit.alpha.name = Alpha +unit.beta.name = Beta +unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus + +block.resupply-point.name = Äiểm tiếp tế +block.parallax.name = Parallax +block.cliff.name = Vách đá +block.sand-boulder.name = Tưá»ng cát +block.basalt-boulder.name = Tưá»ng đá basalt +block.grass.name = Cá» +block.slag.name = Xỉ nóng chảy +block.space.name = Không gian +block.salt.name = Muối +block.salt-wall.name = Tưá»ng muối +block.pebbles.name = Äá cuá»™i +block.tendrils.name = Tua +block.sand-wall.name = Tưá»ng cát +block.spore-pine.name = Cây thông bào tá»­ +block.spore-wall.name = Tưá»ng bào tá»­ +block.boulder.name = Tảng đá +block.snow-boulder.name = Tảng băng +block.snow-pine.name = Cây thông tuyết +block.shale.name = Äá phiến sét +block.shale-boulder.name = Tảng đá phiến sét +block.moss.name = Rêu +block.shrubs.name = Bụi cây +block.spore-moss.name = Rêu bào tá»­ +block.shale-wall.name = Tưá»ng đá phiến sét +block.scrap-wall.name = Tưá»ng phế liệu +block.scrap-wall-large.name = Tưá»ng phế liệu lá»›n +block.scrap-wall-huge.name = Tưá»ng phế liệu khổng lồ +block.scrap-wall-gigantic.name = Tưá»ng phế liệu siêu khổng lồ +block.thruster.name = Thruster +block.kiln.name = Lò nung +block.graphite-press.name = Máy nén than chì +block.multi-press.name = Máy nén than chì lá»›n +block.constructing = {0} [lightgray](Äang xây dá»±ng) +block.spawn.name = Khu vá»±c tạo ra kẻ địch +block.core-shard.name = Căn cứ: CÆ¡ sở +block.core-foundation.name = Căn cứ: Trụ sở +block.core-nucleus.name = Căn cứ: Trung tâm +block.deepwater.name = Nước sâu +block.water.name = Nước +block.tainted-water.name = Nước nhiểm bẩn +block.darksand-tainted-water.name = Nước nhiá»…m bẩn cát Ä‘en +block.tar.name = Dầu +block.stone.name = Äá +block.sand.name = Cát +block.darksand.name = Cát Ä‘en +block.ice.name = Băng +block.snow.name = Tuyết +block.craters.name = Miệng núi lá»­a +block.sand-water.name = Nước cát +block.darksand-water.name = Nước cát Ä‘en +block.char.name = Char +block.dacite.name = Äá Dacit +block.dacite-wall.name = Tưá»ng Dacit +block.dacite-boulder.name = Tảng đá Dacit +block.ice-snow.name = Băng tuyết +block.stone-wall.name = Tưá»ng đá +block.ice-wall.name = Tưá»ng băng +block.snow-wall.name = Tưá»ng tuyết +block.dune-wall.name = Dune Wall +block.pine.name = Cây thông +block.dirt.name = Äất +block.dirt-wall.name = Tưá»ng đất +block.mud.name = Bùn +block.white-tree-dead.name = Cây trắng đã héo +block.white-tree.name = Cây trắng +block.spore-cluster.name = Cụm bào tá»­ +block.metal-floor.name = Ná»n kim loại 1 +block.metal-floor-2.name = Ná»n kim loại 2 +block.metal-floor-3.name = Ná»n kim loại 3 +block.metal-floor-5.name = Ná»n kim loại 4 +block.metal-floor-damaged.name = Ná»n kim loại bị hư há»ng +block.dark-panel-1.name = Ná»n tối 1 +block.dark-panel-2.name = Ná»n tối 2 +block.dark-panel-3.name = Ná»n tối 3 +block.dark-panel-4.name = Ná»n tối 4 +block.dark-panel-5.name = Ná»n tối 5 +block.dark-panel-6.name = Ná»n tối 6 +block.dark-metal.name = Kim loại Ä‘en +block.basalt.name = Äá bazan +block.hotrock.name = Äá nóng +block.magmarock.name = Äá Magma +block.copper-wall.name = Tưá»ng đồng +block.copper-wall-large.name = Tưá»ng đồng lá»›n +block.titanium-wall.name = Tưá»ng titan +block.titanium-wall-large.name = Tưá»ng titan lá»›n +block.plastanium-wall.name = Tưá»ng Nhá»±a +block.plastanium-wall-large.name = Tưá»ng Nhá»±a lá»›n +block.phase-wall.name = Tưá»ng Phase +block.phase-wall-large.name = Tưá»ng Phase lá»›n +block.thorium-wall.name = Tưá»ng Thorium +block.thorium-wall-large.name = Tưá»ng Thorium lá»›n +block.door.name = Cá»­a +block.door-large.name = Cá»­a lá»›n +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Băng chuyá»n +block.titanium-conveyor.name = Băng chuyá»n titan +block.plastanium-conveyor.name = Băng chuyá»n nhá»±a +block.armored-conveyor.name = Băng chuyá»n bá»c giáp +block.junction.name = Giao Ä‘iểm +block.router.name = Bá»™ phân phát +block.distributor.name = Bá»™ phân phát lá»›n +block.sorter.name = Bá»™ lá»c +block.inverted-sorter.name = Bá»™ lá»c ngược +block.message.name = Thông Ä‘iệp +block.illuminator.name = Äèn +block.overflow-gate.name = Cổng tràn +block.underflow-gate.name = Cổng tràn ngược +block.silicon-smelter.name = Máy nấu silicon +block.phase-weaver.name = Máy tạo Phase +block.pulverizer.name = Máy nghiá»n +block.cryofluid-mixer.name = Máy sản xuất chất làm lạnh +block.melter.name = Lò nung chảy +block.incinerator.name = Máy phân há»§y +block.spore-press.name = Máy nén bào tá»­ +block.separator.name = Máy phân tách +block.coal-centrifuge.name = Máy tạo than +block.power-node.name = Chốt Ä‘iện +block.power-node-large.name = Chốt Ä‘iện lá»›n +block.surge-tower.name = Tháp Ä‘iện +block.diode.name = Diode pin +block.battery.name = Pin +block.battery-large.name = Pin lá»›n +block.combustion-generator.name = Máy phát Ä‘iện đốt cháy +block.steam-generator.name = Máy phát Ä‘iện hÆ¡i nước +block.differential-generator.name = Máy phát Ä‘iện vi sai +block.impact-reactor.name = Lò phản ứng nhiệt hạch +block.mechanical-drill.name = Máy khoan cÆ¡ khí +block.pneumatic-drill.name = Máy khoan khí nén +block.laser-drill.name = Máy khoan laser +block.water-extractor.name = Máy khoan nước +block.cultivator.name = Máy nuôi cấy bào tá»­ +block.conduit.name = á»ng dẫn +block.mechanical-pump.name = BÆ¡m cÆ¡ khí +block.item-source.name = Nguồn vật phẩm +block.item-void.name = Há»§y vật phẩm +block.liquid-source.name = Nguồn chất lá»ng +block.liquid-void.name = Há»§y chất lá»ng +block.power-void.name = Há»§y năng lượng +block.power-source.name = Nguồn năng lượng +block.unloader.name = Äiểm dỡ hàng +block.vault.name = Nhà kho +block.wave.name = Wave +block.tsunami.name = Tsunami +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Phase Conveyor +block.bridge-conveyor.name = Cầu dẫn +block.plastanium-compressor.name = Máy sản xuất nhá»±a +block.pyratite-mixer.name = Máy trá»™n nhiệt thạch +block.blast-mixer.name = Máy trá»™n chất nổ +block.solar-panel.name = Pin mặt trá»i +block.solar-panel-large.name = Pin mặt trá»i lá»›n +block.oil-extractor.name = Máy khoan dầu +block.repair-point.name = Äiểm sá»­a chữa +block.pulse-conduit.name = á»ng dẫn titan +block.plated-conduit.name = á»ng dẫn bá»c giáp +block.phase-conduit.name = á»ng dẫn Phase +block.liquid-router.name = Bá»™ phân phát chất lá»ng +block.liquid-tank.name = Thùng chất lá»ng +block.liquid-junction.name = Giao Ä‘iểm chất lá»ng +block.bridge-conduit.name = Cầu dẫn chất lá»ng +block.rotary-pump.name = BÆ¡m Ä‘iện +block.thorium-reactor.name = Lò phản ứng Thorium +block.mass-driver.name = Máy phóng Ä‘iện từ +block.blast-drill.name = Máy khoan thá»§y lá»±c +block.thermal-pump.name = BÆ¡m nhiệt +block.thermal-generator.name = Máy phát nhiệt Ä‘iện +block.alloy-smelter.name = Lò luyện hợp kim +block.mender.name = Máy sá»­a chữa +block.mend-projector.name = Máy sá»­a lá»›n +block.surge-wall.name = Tưá»ng hợp kim +block.surge-wall-large.name = Tưá»ng hợp kim lá»›n +block.cyclone.name = Cyclone +block.fuse.name = Fuse +block.shock-mine.name = Mìn gây sốc +block.overdrive-projector.name = Máy tăng tốc +block.force-projector.name = Máy chiếu trưá»ng lá»±c (Khiên) +block.arc.name = Arc +block.rtg-generator.name = Máy phát Ä‘iện RTG +block.spectre.name = Spectre +block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow +block.container.name = Container +block.launch-pad.name = Bệ phóng +block.launch-pad-large.name = Bệ phóng lá»›n +block.segment.name = Segment +block.command-center.name = Trung tâm chỉ huy +block.ground-factory.name = Nhà máy bá»™ binh +block.air-factory.name = Nhà máy Không quân +block.naval-factory.name = Nhà máy Hải quân +block.additive-reconstructor.name = Máy nâng cấp quân đội cấp 2 +block.multiplicative-reconstructor.name = Máy nâng cấp quân đội cấp 3 +block.exponential-reconstructor.name = Máy nâng cấp quân đội cấp 4 +block.tetrative-reconstructor.name = Máy nâng cấp quân đội cấp 5 +block.payload-conveyor.name = Băng chuyá»n khối hàng +block.payload-router.name = Bá»™ định tuyến khối hàng +block.disassembler.name = Máy phân tách lá»›n +block.silicon-crucible.name = Máy nấu Silicon lá»›n +block.overdrive-dome.name = Máy tăng tốc lá»›n +#experimental, may be removed +block.block-forge.name = Block Forge +block.block-loader.name = Block Loader +block.block-unloader.name = Äiểm dỡ hàng +block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh + +block.switch.name = Công tắc +block.micro-processor.name = Bá»™ xá»­ lí nhá» +block.logic-processor.name = Bá»™ xá»­ lý +block.hyper-processor.name = Bá»™ xá»­ lý lá»›n +block.logic-display.name = Màn hình +block.large-logic-display.name = Màn hình lá»›n +block.memory-cell.name = Bá»™ nhá»› +block.memory-bank.name = Bá»™ nhá»› lá»›n + +team.blue.name = Xanh dương +team.crux.name = Äá» +team.sharded.name = Cam +team.orange.name = Cam +team.derelict.name = không xác định +team.green.name = Xanh lá cây +team.purple.name = Tím + +hint.skip = Bá» qua +hint.desktopMove = Sá»­ dụng [accent][[WASD][] để di chuyển. +hint.zoom = [accent]Cuá»™n[] để phóng to hoặc thu nhá». +hint.mine = Di chuyển đến gần \uf8c4 khu vá»±c quặng đồng và [accent]nhấn[] vào để khai thác thá»§ công. +hint.desktopShoot = [accent][[chuá»™t trái][] để bắn. +hint.depositItems = Äể di chuyển các vật phẩm, hãy kéo từ tàu cá»§a bạn đến căn cứ. +hint.respawn = Äể hồi sinh như tàu cá»§a bạn, nhấn [accent][[V][]. +hint.respawn.mobile = Bạn đã chuyển Ä‘iá»u khiển má»™t quân lính/cấu trúc. Äể hồi sinh như má»™t con tàu, [accent]nhấn vào hình đại diện ở phía trên cùng bên trái.[] +hint.desktopPause = Nhấn [accent][[Space][] để tạm dừng và tiếp tục trò chÆ¡i. +hint.placeDrill = Chá»n mục \ue85e [accent]Máy khoan[] trong menu ở dưới cùng bên phải, sau đó chá»n má»™t \uf870 [accent]Máy khoan[] và nhấp vào quặng đồng để đặt nó. +hint.placeDrill.mobile = Chá»n mục \ue85e[accent]Máy khoan[] trong menu ở dưới cùng bên phải, sau đó chá»n má»™t \uf870 [accent]Máy khoan[] và chạm vào quặng đồng để đặt nó.\n\nNhấn nút \ue800 [accent]Xác nhận[] ở phía dưới cùng bên phải để xác nhận. +hint.placeConveyor = Băng chuyá»n di chuyển các mặt hàng từ các mÅ©i khoan sang các khối khác. Chá»n má»™t \uf896 [accent]Băng chuyá»n[] từ mục \ue814 [accent]Phân phối[].\n\nNhấp và kéo để đặt nhiá»u băng chuyá»n.\n[accent]Cuá»™n[] để xoay. +hint.placeConveyor.mobile = Băng chuyá»n di chuyển các vật phẩm từ khoan sang các khối khác. Chá»n má»™t \uf896 [accent]Băng chuyá»n[] từ mục \ue814 [accent]Phân phối[].\n\nGiữ ngón tay cá»§a bạn trong má»™t giây và kéo để đặt nhiá»u băng chuyá»n. +hint.placeTurret = Äặt \uf861 [accent]Súng[] để bảo vệ căn cứ cá»§a bạn khá»i kẻ thù.\n\nSúng cần đạn - trong trưá»ng hợp này sá»­ dụng \uf838Äồng.\nSá»­ dụng băng chuyá»n và máy khoan để cung cấp cho chúng. +hint.breaking = [accent]Chuá»™t phải[] và kéo để phá vỡ các khối. +hint.breaking.mobile = Kích hoạt \ue817 [accent]Cây búa[] ở phía dưới cùng bên phải và nhấn để phá vỡ các khối.\n\nGiữ ngón tay cá»§a bạn trong má»™t giây và kéo để phá khối trong vùng được chá»n. +hint.research = Sá»­ dụng nút \ue875 [accent]Nghiên cứu[] để nghiên cứu công nghệ má»›i. +hint.research.mobile = Sá»­ dụng nút \ue875 [accent]Nghiên cứu[] trong \ue88c [accent]Menu[] để nghiên cứu công nghệ má»›i. +hint.unitControl = Giữ [accent][[L-ctrl][] và [accent]click[] để Ä‘iá»u khiển quân lính cá»§a bạn hoặc súng. +hint.unitControl.mobile = [accent][Double-tap[] để Ä‘iá»u khiển quân lính cá»§a bạn hoặc súng. +hint.launch = Sau khi thu thập đủ tài nguyên, bạn có thể [accent]Phóng[] bằng cách chá»n các khu vá»±c lân cận từ \ue827 [accent]Bản đồ[] ở phía dưới cùng bên phải. +hint.launch.mobile = Sau khi thu thập đủ tài nguyên, bạn có thể [accent]Phóng[] bằng cách chá»n các khu vá»±c lân cận từ \ue827 [accent]Bản đồ[] trong \ue88c [accent]Menu[]. +hint.schematicSelect = Giữ [accent][[F][] và kéo để chá»n các khối để sao chép và dán.\n\n[accent][[Middle Click][] để sao chép má»™t khối. +hint.conveyorPathfind = Giữ [accent][[L-Ctrl][] trong khi kéo băng chuyá»n để tá»± động tạo đưá»ng dẫn. +hint.conveyorPathfind.mobile = Mở \ue844 [accent]chế độ đưá»ng chéo[] và kéo băng chuyá»n để tá»± động tạo đưá»ng dẫn. +hint.boost = Giữ [accent][[L-Shift][] bay qua các chướng ngại vật vá»›i quân lính hiện tại cá»§a bạn.\n\nChỉ má»™t số quân lính mặt đất có thể bay được. +hint.command = Nhấn [accent][[G][] để chỉ huy quân lính lân cận hoặc [accent]loại tương tá»±[].\n\nÄể chỉ huy các quân lính mặt đất, trước tiên bạn phải Ä‘iá»u khiển má»™t quân lính mặt đất khác. +hint.command.mobile = [accent][[Nhấn đúp][] quân lính cá»§a bạn để chỉ huy các quân lính lân cận thành đội. +hint.payloadPickup = Nhấn [accent][[[] để nhặt má»™t khối nhá» hoặc má»™t quân lính. +hint.payloadPickup.mobile = [accent]Nhấn và giữ[] má»™t khối nhá» hoặc má»™t quân lính để nhặt nó. +hint.payloadDrop = Nhấn [accent]][] để thả má»™t vật phẩm. +hint.payloadDrop.mobile = [accent]Nhấn và giữ[] tại má»™t khu vá»±c trống để thả vật phẩm. +hint.waveFire = [accent]Wave[] súng có nước làm đạn dược sẽ tá»± động dập tắt các đám cháy gần đó. +hint.generator = \uf879 [accent]Máy phát Ä‘iện đốt cháy[] đốt than và truyá»n năng lượng cho các khối liá»n ká».\n\nPhạm vi truyá»n tải năng lượng có thể được mở rá»™ng vá»›i \uf87f [accent]Chốt Ä‘iện[]. +hint.guardian = [accent]Boss[] được bá»c giáp. Sá»­ dụng loại đạn yếu chẳng hạn như [accent]Äồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSá»­ dụng súng tiên tiến hÆ¡n hoặc sá»­ dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss. +hint.coreUpgrade = Các căn cứ có thể được nâng cấp bằng cách [accent]đặt căn cứ cấp cao hÆ¡n trên chúng[].\n\nÄặt má»™t căn cứ  [accent]Trụ sở[] trên căn cứ ï¡© [accent]CÆ¡ sở[]. Äảm bảo không có vật cản gần đó. +hint.presetLaunch = Khác khu vá»±c đáp [accent] xám[], như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các khu vá»±c lân cận.\n\n[accent]Các khu vá»±c được đánh số[], chẳng hạn như cái này, là [accent]không bắt buá»™c[]. +hint.coopCampaign = Khi chÆ¡i chiến dịch[accent]co-op[], các vật phẩm được sản xuất trong bản đồ hiện tại cÅ©ng sẽ được gá»­i [accent]đến các khu vá»±c cá»§a bạn[].\n\nBất kỳ nghiên cứu má»›i nào được thá»±c hiện Ä‘á»u được lưu lại. + +item.copper.description = Dùng trong tất cả các khu xây dá»±ng và các loại đạn dược. +item.copper.details = Äồng, là kim loại phổ biến trên Serpulo. Có cấu trúc yếu trừ khi được tôi luyện. +item.lead.description = Dùng trong vận chuyển chất lá»ng và cấu trúc liên quan đến Ä‘iện. +item.lead.details = Äặc, trÆ¡. Dùng nhiá»u trong pin.\nLưu ý: Có thể độc hại đối vá»›i các dạng sống sinh há»c. Không phải vì nó còn nhiá»u ở xung quanh đây. +item.metaglass.description = Dùng trong cấu trúc phân phối/lưu trữ chất lá»ng. +item.graphite.description = Dùng trong các bá»™ phận Ä‘iện và đạn dược. +item.sand.description = Dùng để sản xuất các vật liệu tinh chế khác. +item.coal.description = Dùng để sản xuất nhiên liệu và nguyên liệu sản xuất vật liệu tinh chế. +item.coal.details = Có vẻ là vật chất hóa thạch cá»§a thá»±c vật, hình thành từ rất lâu trước khi được khai thác. +item.titanium.description = Dùng trong cấu trúc vận chuyển chất lá»ng, máy khoan và máy bay. +item.thorium.description = Dùng trong các công trình bá»n vững và có thể dùng làm nhiên liệu hạt nhân. +item.scrap.description = Dùng làm nguyên liệu cho Máy nung phế liệu và Máy nghiá»n để tinh luyện thành các vật liệu khác. +item.scrap.details = Tàn tích còn lại cá»§a các công trình và robot cÅ©. +item.silicon.description = Dùng trong các tấm pin mặt trá»i, thiết bị Ä‘iện tá»­ phức tạp và má»™t số loại đạn dược. +item.plastanium.description = Dùng trong các robot tiên tiến, các cấu trúc cách Ä‘iện và đạn tá»± phân mảnh. +item.phase-fabric.description = Dùng trong các thiết bị Ä‘iện tá»­ tiên tiến và các cấu trúc tá»± sá»­a chữa. +item.surge-alloy.description = Dùng trong các vÅ© khí tiên tiến và các cấu trúc phòng thá»§ phản ứng. +item.spore-pod.description = Dùng để chuyển đổi thành dầu, chất nổ và nhiên liệu. +item.spore-pod.details = Bào tá»­. Có thể là má»™t dạng sống tổng hợp. Phát thải khí độc đối vá»›i sinh vật khác. Cá»±c kỳ xâm lấn. Rất dá»… cháy trong má»™t số trưá»ng hợp nhất định. +item.blast-compound.description = Dùng trong bom hoặc đạn nổ. +item.pyratite.description = Dùng trong vÅ© khí gây cháy và máy phát Ä‘iện chạy bằng nhiên liệu đốt. + +liquid.water.description = Dùng để làm mát máy móc và xá»­ lý chất thải. +liquid.slag.description = Dùng để tách các kim loại, hoặc phun vào kẻ thù như má»™t loại vÅ© khí. +liquid.oil.description = Dùng trong sản xuất vật liệu tiên tiến và làm đạn gây cháy. +liquid.cryofluid.description = Dùng làm chất làm mát trong lò phản ứng, súng và nhà máy. + +block.resupply-point.description = Cung cấp đạn đồng cho các quân lính ở gần. Không tương thích vá»›i quân lính sá»­ dụng Ä‘iện. +block.armored-conveyor.description = Vận chuyển vật phẩm vá» phía. Không nhận đầu vào từ phía bên. +block.illuminator.description = Phát sáng. +block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội. +block.graphite-press.description = Nén than thành than chì. +block.multi-press.description = Nén than thành than chì. Cần nước làm mát. +block.silicon-smelter.description = Tinh chế silicon từ cát và than. +block.kiln.description = Nấu chảy cát và chì thành thuá»· tinh. +block.plastanium-compressor.description = Sản xuất nhá»±a từ dầu và titan. +block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát. +block.alloy-smelter.description = Trá»™n titan, chì, silicon và đồng thành hợp kim. +block.cryofluid-mixer.description = Trá»™n nước và bá»™t titan để sản xuất chất làm mát. +block.blast-mixer.description = Tạo ra hợp chất nổ từ nhiệt thạch và vá» bào tá»­. +block.pyratite-mixer.description = Trá»™n than, chì và cát thành nhiệt thạch. +block.melter.description = Nung phế liệu thành xỉ. +block.separator.description = Tách xỉ thành các thành phần khoáng cá»§a nó. +block.spore-press.description = Nén vá» bào tá»­ thành dầu. +block.pulverizer.description = Nghiá»n phế liệu thành cát. +block.coal-centrifuge.description = Biến dầu thành than. +block.incinerator.description = Tiêu há»§y bất kỳ vật phẩm hoặc chất lá»ng nào mà nó nhận được. +block.power-void.description = Há»§y tất cả năng lượng nhận được. Chỉ có trong chế độ tá»± do. +block.power-source.description = Tạo ra năng lượng mãi mãi. Chỉ có trong chế độ tá»± do. +block.item-source.description = Tạo ra vật phẩm mãi mãi. Chỉ có trong chế độ tá»± do. +block.item-void.description = Há»§y má»i vật phẩm. Chỉ có trong chế độ tá»± do. +block.liquid-source.description = Tạo ra chất lá»ng mãi mãi. Chỉ có trong chế độ tá»± do. +block.liquid-void.description = Loại bá» má»i chất lá»ng. Chỉ có trong chế độ tá»± do. +block.copper-wall.description = Bảo vệ các công trình khá»i đạn cá»§a kẻ thù. +block.copper-wall-large.description = Bảo vệ nhiá»u công trình khá»i đạn cá»§a kẻ thù. +block.titanium-wall.description = Bảo vệ các công trình khá»i đạn cá»§a kẻ thù. +block.titanium-wall-large.description = Bảo vệ nhiá»u công trình khá»i đạn cá»§a kẻ thù. +block.plastanium-wall.description = Bảo vệ công trình khá»i đạn cá»§a kẻ thù. Hấp thụ tia laser và tia Ä‘iện. Chặn kết nối Ä‘iện tá»± động. +block.plastanium-wall-large.description = Bảo vệ nhiá»u công trình khá»i đạn cá»§a kẻ thù. Hấp thụ tia laser và tia Ä‘iện. Chặn kết nối Ä‘iện tá»± động. +block.thorium-wall.description = Bảo vệ công trình khá»i đạn cá»§a kẻ thù. +block.thorium-wall-large.description = Bảo vệ nhiá»u công trình khá»i đạn cá»§a kẻ thù. +block.phase-wall.description = Bảo vệ công trình khá»i đạn cá»§a kẻ thù, phản hầu hết đạn khi va chạm. +block.phase-wall-large.description = Bảo vệ nhiá»u công trình khá»i đạn cá»§a kẻ thù, phản hầu hết đạn khi va chạm. +block.surge-wall.description = Bảo vệ công trình khá»i đạn cá»§a kẻ thù, đôi khi tạo ra tia Ä‘iện khi bị bắn. +block.surge-wall-large.description = Bảo vệ nhiá»u công trình khá»i đạn cá»§a kẻ thù, đôi khi tạo ra tia Ä‘iện khi bị bắn. +block.door.description = Má»™t bức tưá»ng có thể đóng mở. +block.door-large.description = Má»™t bức tưá»ng có thể đóng mở. +block.mender.description = Sá»­a chữa định kỳ các khối trong vùng lân cận.\nSá»­ dụng Phase Fabric để tăng phạm vi và hiệu quả. +block.mend-projector.description = Sá»­a chữa các khối lân cận.\nSá»­ dụng Phase Fabric để tăng phạm vi và hiệu quả. +block.overdrive-projector.description = Tăng tốc độ làm việc cá»§a các công trình lân cận.\nSá»­ dụng phase fabric để tăng phạm vi và hiệu quả. +block.force-projector.description = Tạo ra má»™t trưá»ng lá»±c lục giác xung quanh nó, bảo vệ các công trình và quân lính bên trong khá»i bị hư hại.\nQuá nóng nếu chịu quá nhiá»u sát thương. Sá»­ dụng chất làm mát để giảm nhiệt độ. Sá»­ dụng Phase fabric để tăng kích thước lá chắn. +block.shock-mine.description = Giải phóng tia Ä‘iện khi tiếp xúc vá»›i quân lính đối phương. +block.conveyor.description = Vận chuyển vật phẩm vá» phía trước. +block.titanium-conveyor.description = Vận chuyển vật phẩm vá» phía trước. Nhanh hÆ¡n băng chuyá»n tiêu chuẩn. +block.plastanium-conveyor.description = Vận chuyển vật phẩm vá» phía trước theo lô. Nhận các vật phẩm ở phía sau và dỡ chúng theo ba hướng ở phía trước. Yêu cầu nhiá»u Ä‘iểm tải và dỡ hàng để có hiệu quả cao nhất. +block.junction.description = Hoạt động như má»™t cầu nối cho hai băng chuyá»n băng qua. +block.bridge-conveyor.description = Vận chuyển vật phẩm qua nhiá»u loại địa hình hoặc công trình. +block.phase-conveyor.description = Vận chuyển tức thá»i vật phẩm qua địa hình hoặc công trình. Phạm vi dài hÆ¡n cầu nối, nhưng cần năng lượng. +block.sorter.description = Nếu vật phẩm giống vật được chá»n sẽ được chuyển đến trước, nếu không sẽ được chuyển qua trái hoặc phải. +block.inverted-sorter.description = Giống như máy phân loại, nhưng vật được chá»n sẽ được chuyển qua trái hoặc phải. +block.router.description = Phân phối các vật phẩm đầu vào thành 3 hướng đầu ra như nhau. +block.router.details = Không khuyên dùng cạnh đầu vào dây chuyá»n vì sẽ bị kẹt bởi đầu ra. +block.distributor.description = Phân phối các vật phẩm đầu vào thành 7 hướng đầu ra như nhau. +block.overflow-gate.description = Chỉ đưa vật phẩm ra 2 phía nếu phía trước bị chặn. +block.underflow-gate.description = Ngược vá»›i cổng tràn, chỉ đưa vật phẩm đến trước khi hai bên bị chặn. +block.mass-driver.description = Cấu trúc vận chuyển vật phẩm tầm xa. Thu thập các lô vật phẩm và bắn chúng cho các máy phóng Ä‘iện từ khác. +block.mechanical-pump.description = BÆ¡m chất lá»ng, không yêu cầu năng lượng. +block.rotary-pump.description = BÆ¡m chất lá»ng, yêu cầu năng lượng. +block.thermal-pump.description = BÆ¡m chất lá»ng. +block.conduit.description = Äẩy chất lá»ng đến trước, dùng vá»›i bÆ¡m và các ống dẫn khác. +block.pulse-conduit.description = Äẩy chất lá»ng đến trước, vận chuyển nhanh và trữ nhiá»u hÆ¡n so vá»›i ống tiêu chuẩn. +block.plated-conduit.description = Äẩy chất lá»ng đến trước, không nhận đầu vào ở bên, không bị rò rỉ. +block.liquid-router.description = Nhận chất lá»ng từ má»™t phía và đưa Ä‘á»u ra ba phía còn lại. Có thể trữ má»™t lượng chất lá»ng nhất định. +block.liquid-tank.description = Trữ được nhiá»u chất lá»ng. ÄÆ°a Ä‘á»u ra má»i phía như bá»™ phân nhánh chất lá»ng. +block.liquid-junction.description = Chức năng như cầu cho hai ống nước băng chéo nhau. +block.bridge-conduit.description = Vận chuyển chất lá»ng qua nhiá»u loại địa hình hoặc công trình. +block.phase-conduit.description = Vận chuyển chất lá»ng qua địa hình hoặc công trình. Phạm vi dài hÆ¡n cầu nối, nhưng cần năng lượng. +block.power-node.description = Truyá»n năng lượng cho các chốt được kết nối. Chốt sẽ nhận năng lượng hoặc cấp năng lượng cho bất kỳ khối nào liá»n ká». +block.power-node-large.description = Má»™t chốt Ä‘iện vá»›i phạm vi lá»›n hÆ¡n. +block.surge-tower.description = Má»™t chốt Ä‘iện tầm xa vá»›i ít kết nối khả dụng hÆ¡n. +block.diode.description = Di chuyển năng lượng trong pin theo má»™t hướng, nhưng chỉ khi phía bên kia có ít năng lượng được lưu trữ hÆ¡n. +block.battery.description = Tích trữ năng lượng khi dư thừa. Xuất năng lượng khi thiếu hụt. +block.battery-large.description = Tích trữ năng lượng khi dư thừa. Xuất năng lượng khi thiếu hụt. Dung lượng cao hÆ¡n pin thông thưá»ng. +block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dá»… cháy như than. +block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nÆ¡i nóng. +block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dá»… cháy và chuyển nước thành hÆ¡i nước. +block.differential-generator.description = Tạo ra má»™t lượng lá»›n năng lượng. Sá»­ dụng sá»± chênh lệch nhiệt độ giữa chất làm lạnh và nhiệt thạch Ä‘ang cháy. +block.rtg-generator.description = Sá»­ dụng nhiệt cá»§a các hợp chất phóng xạ Ä‘ang phân há»§y để tạo ra năng lượng vá»›i tốc độ chậm. +block.solar-panel.description = Cung cấp má»™t lượng nhá» năng lượng từ mặt trá»i. +block.solar-panel-large.description = Cung cấp má»™t lượng nhá» năng lượng từ mặt trá»i. Hiệu quả hÆ¡n pin mặt trá»i tiêu chuẩn. +block.thorium-reactor.description = Tạo ra lượng năng lượng lá»›n từ thorium. Yêu cầu làm mát liên tục. Sẽ phát nổ dữ dá»™i nếu không cung cấp đủ chất làm mát. +block.impact-reactor.description = Tạo ra lượng năng lượng khổng lồ khi đạt hiệu quả cao nhất. Yêu cầu nguồn năng lượng lá»›n để bắt đầu quá trình. +block.mechanical-drill.description = Khi đặt trên quặng, xuất các vật phẩm vá»›i tốc độ chậm. Chỉ có khả năng khai thác các tài nguyên cÆ¡ bản. +block.pneumatic-drill.description = Máy khoan cải tiến, có khả năng khai thác titan. Khai thác vá»›i tốc độ nhanh hÆ¡n máy khoan cÆ¡ khí. +block.laser-drill.description = Cho phép khoan nhanh hÆ¡n nhá» công nghệ laser, nhưng đòi há»i năng lượng. Có khả năng khai thác thorium. +block.blast-drill.description = Máy khoan siêu cấp. Yêu cầu lượng năng lượng lá»›n. +block.water-extractor.description = Khai thác nước ngầm. ÄÆ°á»£c sá»­ dụng ở những nÆ¡i không có sẵn nước. +block.cultivator.description = Lá»c bào tá»­ có trong không khí và nuôi cấy thành vá» bào tá»­. +block.cultivator.details = Công nghệ được phục hồi. ÄÆ°á»£c sá»­ dụng để sản xuất má»™t lượng lá»›n bào tá»­. Có thể là nÆ¡i á»§ ban đầu cá»§a các bào tá»­ hiện Ä‘ang bao phá»§ Serpulo. +block.oil-extractor.description = Sá»­ dụng lượng năng lượng năng lá»›n, sá»­ dụng cát và nước để khoan dầu. +block.core-shard.description = Trung tâm cá»§a căn cứ. Sau khi bị phá há»§y, khu vá»±c này sẽ bị mất. +block.core-shard.details = Lần thá»­ đầu tiên. Gá»n nhẹ. Tá»± thay thế. ÄÆ°á»£c trang bị tên lá»­a đẩy dùng má»™t lần. Không được thiết kế để di chuyển giữa các hành tinh. +block.core-foundation.description = Trung tâm cá»§a căn cứ. ÄÆ°á»£c bá»c giáp. Chứa được nhiá»u tài nguyên hÆ¡n Căn cứ: CÆ¡ sá». +block.core-foundation.details = Căn cứ cấp 2. +block.core-nucleus.description = Lõi cá»§a căn cứ. Bá»c giáp chắc chắn. Lưu trữ lượng lá»›n tài nguyên. +block.core-nucleus.details = Căn cứ cấp 3 và cÅ©ng là cấp cao nhất. +block.vault.description = Lưu trữ lượng lá»›n vật phẩm má»—i loại. Ná»™i dung có thể được lấy ra vá»›i Ä‘iểm dỡ hàng. +block.container.description = Lưu trữ lượng lá»›n vật phẩm má»—i loại. Ná»™i dung có thể được lấy ra vá»›i Ä‘iểm dỡ hàng. +block.unloader.description = Lấy các vật phẩm được chá»n từ các ô gần đó. +block.launch-pad.description = Phóng lô vật phẩm vào phân vùng. +block.duo.description = Bắn xen kẽ đạn vào kẻ địch. +block.scatter.description = Bắn chì, phế liệu hoặc thuá»· tinh vào kẻ địch trên không. +block.scorch.description = Äốt má»i kẻ địch trên mặt đất. Hiệu quả cao ở tầm gần. +block.hail.description = Phóng đạn nhá» vào kẻ địch trên mặt đất ở tầm xa. +block.wave.description = Phóng má»™t tia chất lá»ng vào kẻ địch. Tá»± chữa cháy nếu được cung cấp nước. +block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất. +block.arc.description = Phóng tia Ä‘iện vào kẻ địch trên mặt đất. +block.swarmer.description = Bắn tên lá»­a truy Ä‘uổi vào kẻ địch. +block.salvo.description = Bắn loạt đạn vào kẻ địch. +block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch. +block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa. +block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần. +block.spectre.description = Bắn đạn xuyên giáp lá»›n ở kẻ địch trên không và trên mặt đất. +block.meltdown.description = Nạp và bắn má»™t tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động. +block.foreshadow.description = Bắn viên má»™t viên đạn tỉa lá»›n ở tầm xa. +block.repair-point.description = Liên tục sá»­a chữa robot ở trong phạm vi hoạt động. +block.segment.description = Gây hư hại và phá há»§y đạn đến. Ngoại trừ tia laser. +block.parallax.description = Bắn má»™t tia kéo máy bay địch và làm hư há»ng nó trong quá trình kéo. +block.tsunami.description = Phóng má»™t tia chất lá»ng mạnh vào kẻ địch. Tá»± chữa cháy nếu được cung cấp nước hoặc chất làm mát. +block.silicon-crucible.description = Tinh chế silicon từ cát và than, sá»­ dụng tiá»n chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hÆ¡n khi ở nÆ¡i nóng. +block.disassembler.description = Tách xỉ thành các kim loại khác nhau vá»›i hiệu suất thấp. Có thể sản xuất thorium. +block.overdrive-dome.description = Tăng tốc độ làm việc cá»§a các công trình lân cận. Sá»­ dụng phase fabric and silicon để hoạt động. +block.payload-conveyor.description = Di chuyển những khối hàng lá»›n, chẳng hạn như các quân lính từ nhà máy. +block.payload-router.description = Tách những khối hàng đầu vào thành 3 hướng đầu ra. +block.command-center.description = Kiểm soát hoạt động cá»§a cá»§a quân lính bằng má»™t số lệnh khác nhau. +block.ground-factory.description = Sản xuất binh lính bá»™ binh. Các quân lính đầu ra có thể được sá»­ dụng trá»±c tiếp, hoặc Ä‘em nâng cấp. +block.air-factory.description = Sản xuất binh lính không quân. Các quân lính đầu ra có thể được sá»­ dụng trá»±c tiếp, hoặc Ä‘em nâng cấp. +block.naval-factory.description = Sản xuất binh lính hải quân. Các quân lính đầu ra có thể được sá»­ dụng trá»±c tiếp, hoặc Ä‘em nâng cấp. +block.additive-reconstructor.description = Nâng cấp quân cá»§a bạn lên cấp hai. +block.multiplicative-reconstructor.description = Nâng cấp quân cá»§a bạn lên cấp ba. +block.exponential-reconstructor.description = Nâng cấp quân cá»§a bạn lên cấp bốn. +block.tetrative-reconstructor.description = Nâng cấp quân cá»§a bạn nên cấp năm (cuối cùng). +block.switch.description = Công tắc, trạng thái có thể được Ä‘á»c và Ä‘iá»u khiển vá»›i vi xá»­ lí logic. +block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong má»™t vòng lặp, có thể dùng để Ä‘iá»u khiển robot và công trình. +block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong má»™t vòng lặp, có thể dùng để Ä‘iá»u khiển robot và công trình. Nhanh hÆ¡n bá»™ xá»­ lí nhá». +block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong má»™t vòng lặp, có thể dùng để Ä‘iá»u khiển robot và công trình. Nhanh hÆ¡n bá»™ xá»­ lí. +block.memory-cell.description = Lưu trữ thông tin cho bá»™ xá»­ lí. +block.memory-bank.description = Lưu trữ thông tin cho bá»™ xá»­ lí. Dung lượng cao. +block.logic-display.description = Hiển thị đồ há»a tùy ý từ bá»™ xá»­ lí. +block.large-logic-display.description = Hiển thị đồ há»a tùy ý từ bá»™ xá»­ lí. +block.interplanetary-accelerator.description = Tòa súng từ trưá»ng cỡ lá»›n. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh. + +unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh. +unit.mace.description = Phun lá»­a vào tất cả kẻ địch xung quanh. +unit.fortress.description = Bắn pháo tầm xa lên kẻ địch trên mặt đất. +unit.scepter.description = Bắn má»™t chùm đạn vào kẻ địch ở gần. +unit.reign.description = Bắn má»™t chùm đạn xuyên giáp vào kẻ địch ở gần. +unit.nova.description = Bắn tia laser làm tổn hại kẻ địch và sá»­a chữa các tòa nhà. Có khả năng bay. +unit.pulsar.description = Bắn tia Ä‘iện làm tổn hại kẻ địch và sá»­a chữa các tòa nhà. Có khả năng bay. +unit.quasar.description = Bắn tia laser xuyên giáp làm tổn hại kẻ địch và sá»­a chữa các tòa nhà. Có khả năng bay. ÄÆ°á»£c bá»c giáp. +unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sá»­a chữa các tòa nhà. Có khả năng bay. +unit.corvus.description = Bắn Ä‘ia laser đánh bật kẻ địch và sá»­a chữa các tòa nhà. Có thể Ä‘i qua Ä‘a số địa hình. +unit.crawler.description = Chạy đến kẻ địch và nổ. +unit.atrax.description = Phun xỉ nóng chảy vào kẻ địch trên mặt đất. Có thể Ä‘i qua Ä‘a số địa hình. +unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tá»± sá»­a chữa nó. Có thể Ä‘i qua Ä‘a số địa hình. +unit.arkyid.description = Bắn tia laser lá»›n vào kẻ địch trên mặt đất và tá»± sá»­a chữa chính nó. Có thể Ä‘i qua Ä‘a số địa hình. +unit.toxopid.description = Bắn chùm đạn Ä‘iện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tá»± sá»­a chữa chính nó. Có thể Ä‘i qua Ä‘a số địa hình. +unit.flare.description = Bắn đạn thưá»ng vào kẻ địch tầm gần trên mặt đất. +unit.horizon.description = Thả chùm bom lên kẻ địch trên mặt đất. +unit.zenith.description = Bắn chùm tên lá»­a vào má»i kẻ địch tầm gần. +unit.antumbra.description = Bắn chùm đạn vào má»i kẻ địch tầm gần. +unit.eclipse.description = Bắn hai tia laser xuyên giáp và chùm flak vào má»i kẻ địch tầm gần. +unit.mono.description = Tá»± động khai thác đồng và chì, và vận chuyển vào căn cứ. +unit.poly.description = Tá»± động xây dá»±ng lại các công trình bị há»ng và há»— trợ các quân lính khác thi công. +unit.mega.description = Tá»± động sá»­a chữa các công trình bị há»ng. Có khả năng mang bá»™ binh nhá». +unit.quad.description = Thả bom to lên kẻ địch, sá»­a chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bá»™ binh vừa. +unit.oct.description = Bảo vệ đồng minh vá»›i giáp. Có khả năng mang Ä‘a số bá»™ binh. +unit.risso.description = Bắn chùm tên lá»­a và đạn lên kẻ địch tầm gần. +unit.minke.description = Bắn đạn và đạn thưá»ng lên kẻ địch tầm gần trên mặt đất. +unit.bryde.description = Bắn đạn tầm xa và tên lá»­a vào kẻ địch. +unit.sei.description = Bắn chùm tên lá»­a và đạn xuyên giáp vào kẻ địch. +unit.omura.description = Bắn đạn từ trưá»ng xuyên giáp tầm xa vào kẻ địch. Tạo nên Flare. +unit.alpha.description = Bảo vệ căn cứ cÆ¡ sở khá»i kẻ thù. Có thể xây dá»±ng. +unit.beta.description = Bảo vệ căn cứ trụ sở khá»i kẻ thù. Có thể xây dá»±ng. +unit.gamma.description = Bảo vệ căn cứ trung tâm khá»i kẻ thù. Có thể xây dá»±ng. + +lst.read = Äá»c má»™t số từ bá»™ nhá»› được liên kết. +lst.write = Ghi má»™t số vào bá»™ nhá»› được liên kết. +lst.print = Thêm văn bản vào bá»™ nhá»› in.\nKhông hiển thị gì cho đến khi sá»­ dụng [accent]Print Flush[]. +lst.draw = Thêm má»™t thao tác vào bá»™ nhá»› vẽ.\nKhông hiển thị gì cho đến khi sá»­ dụng [accent]Draw Flush[]. +lst.drawflush = Chuyển các thao tác [accent]Draw[] đến màng hình. +lst.printflush = Chuyển các thao tác [accent]Print[] đến khối tin nhắn. +lst.getlink = Nhận liên kết bá»™ xá»­ lý theo thứ tá»±. Bắt đầu từ 0. +lst.control = Äiá»u khiển má»™t khối. +lst.radar = Äịnh vị các quân lính trong phạm vi xung quanh má»™t khối. +lst.sensor = Lấy dữ liệu từ má»™t khối hoặc quân lính. +lst.set = Äặt má»™t biến. +lst.operation = Thá»±c hiện thao tác trên 1-2 biến. +lst.end = Chuyển đến lệnh đầu tiên. +lst.jump = Chuyển qua lệnh khác nếu Ä‘iá»u kiện đúng. +lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. +lst.unitcontrol = Control the currently bound unit. +lst.unitradar = Locate units around the currently bound unit. +lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. + +lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. +lenum.shoot = Bắn vào vị trí xác định. +lenum.shootp = Shoot at a unit/building with velocity prediction. +lenum.configure = Building configuration, e.g. sorter item. +lenum.enabled = Bất cứ khi nào khối hoạt động. + +laccess.color = Màu đèn chiếu sáng. + +graphicstype.clear = Tô màu cho màn hình. +graphicstype.color = Äặt màu cho thao tác vẽ tiếp theo. +graphicstype.stroke = Äặt chiá»u rá»™ng Ä‘oạn thẳng. +graphicstype.line = Vẽ Ä‘oạn thẳng. +graphicstype.rect = Tô má»™t hình chữ nhật. +graphicstype.linerect = Vẽ đưá»ng viá»n hình chữ nhật. +graphicstype.poly = Tô vào Ä‘a giác Ä‘á»u. +graphicstype.linepoly = Vẽ đưá»ng viá»n Ä‘a giác Ä‘á»u. +graphicstype.triangle = Tô má»™t hình tam giác. +graphicstype.image = Vẽ hình ảnh má»™t số ná»™i dung.\nVd: [accent]@router[] hoặc [accent]@dagger[]. + +lenum.always = Luôn đúng. +lenum.idiv = Chia lấy phần nguyên. +lenum.div = Phép chia.\nTrả vá» [accent]null[] khi chia cho 0. +lenum.mod = Chia lấy phần dư. +lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0. +lenum.notequal = Not equal. Coerces types. +lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[]. +lenum.shl = Bit-shift left. +lenum.shr = Bit-shift right. +lenum.or = Bitwise OR. +lenum.land = Logical AND. +lenum.and = Bitwise AND. +lenum.not = Bitwise flip. +lenum.xor = Bitwise XOR. + +lenum.min = Số nhá» nhất giữa hai số. +lenum.max = Số lá»›n nhất giữa hai số. +lenum.angle = Góc cá»§a vectÆ¡ tính bằng độ. +lenum.len = Chiá»u dài cá»§a vectÆ¡. +lenum.sin = Sin, tính bằng độ. +lenum.cos = Cos, tính bằng độ. +lenum.tan = Tan, tính bằng độ. +#not a typo, look up 'range notation' +lenum.rand = Số ngẫu nhiên trong phạm vi [0, giá trị). +lenum.log = Lôgarit tá»± nhiên (ln). +lenum.log10 = Lôgarit cÆ¡ số 10. +lenum.noise = 2D simplex noise. +lenum.abs = Giá trị tuyệt đối. +lenum.sqrt = Căn bậc hai. + +lenum.any = Bất kì quân lính. +lenum.ally = Quân lính cùng đội. +lenum.attacker = Quân lính vá»›i vÅ© khí. +lenum.enemy = Quân lính địch. +lenum.boss = Boss. +lenum.flying = Không quân. +lenum.ground = Bá»™ binh. +lenum.player = Quân lính do ngưá»i chÆ¡i Ä‘iá»u khiển. + +lenum.ore = Ore deposit. +lenum.damaged = Damaged ally building. +lenum.spawn = Enemy spawn point.\nMay be a core or a position. +lenum.building = Building in a specific group. + +lenum.core = Bất kì căn cứ. +lenum.storage = Khối lưu trữ, Ví dụ Nhà kho. +lenum.generator = Khối có thể tạo ra năng lượng. +lenum.factory = Khối có thể biến đổi vật phẩm. +lenum.repair = Äiểm sá»­a chữa. +lenum.rally = Trung tâm chỉ huy. +lenum.battery = Bất kì pin. +lenum.resupply = Äiểm tiếp tế.\nChỉ phù hợp khi [accent]"Quân lính cần đạn"[] được bật. +lenum.reactor = Lò phản ứng Thorium\Nhiệt hạch. +lenum.turret = Bất kì súng. + +sensor.in = The building/unit to sense. + +radar.from = Building to sense from.\nSensor range is limited by building range. +radar.target = Filter for units to sense. +radar.and = Additional filters. +radar.order = Sorting order. 0 to reverse. +radar.sort = Metric to sort results by. +radar.output = Variable to write output unit to. + +unitradar.target = Filter for units to sense. +unitradar.and = Additional filters. +unitradar.order = Sorting order. 0 to reverse. +unitradar.sort = Metric to sort results by. +unitradar.output = Variable to write output unit to. + +control.of = Building to control. +control.unit = Unit/building to aim at. +control.shoot = Whether to shoot. + +unitlocate.enemy = Whether to locate enemy buildings. +unitlocate.found = Whether the object was found. +unitlocate.building = Output variable for located building. +unitlocate.outx = Output X coordinate. +unitlocate.outy = Output Y coordinate. +unitlocate.group = Building group to look for. + +lenum.stop = Dừng di chuyển/Äào/Xây dá»±ng. +lenum.move = Di chuyển đến vị trí xác định. +lenum.approach = Approach a position with a radius. +lenum.pathfind = Tìm đưá»ng đến nÆ¡i tạo ra kẻ địch. +lenum.target = Bắn vào vị trí xác định. +lenum.targetp = Shoot a target with velocity prediction. +lenum.itemdrop = Thả vật phẩm. +lenum.itemtake = Lấy vật phẩm từ khối. +lenum.paydrop = Thả khối hàng hiện tại. +lenum.paytake = Nhất khối hàng tại vị trí hiện tại. +lenum.flag = Numeric unit flag. +lenum.mine = Äào tại vị trí. +lenum.build = Xây công trình. +lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[]. +lenum.within = Kiểm tra xem quân lính có gần vị trí không. +lenum.boost = Start/stop boosting. \ No newline at end of file diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 506a29aa99..e94bf8c026 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -13,15 +13,18 @@ link.google-play.description = Google Play é¡µé¢ link.f-droid.description = F-Droid é¡µé¢ link.wiki.description = Mindustry 官方 Wiki link.suggestions.description = æå‡ºæ–°ç‰¹æ€§çš„建议 +link.bug.description = å‘现了 Bug ?在这里报告 linkfail = 打开链接失败ï¼\n网å€å·²å¤åˆ¶åˆ°æ‚¨çš„剪贴æ¿ã€‚ screenshot = å±å¹•截图已ä¿å­˜åˆ° {0} screenshot.invalid = 地图太大,å¯èƒ½æ²¡æœ‰è¶³å¤Ÿçš„内存用于截图。 gameover = 游æˆç»“æŸ +gameover.disconnect = 断开连接 gameover.pvp = [accent] {0}[]é˜ŸèŽ·èƒœï¼ +gameover.waiting = [accent]正在更æ¢ä¸‹ä¸€å¼ åœ°å›¾... highscore = [accent]æ–°çºªå½•ï¼ -copied = å·²å¤åˆ¶ã€‚ -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +copied = å·²å¤åˆ¶ +indev.notready = 这部分玩法还未开å‘完æˆã€‚ +indev.campaign = [accent]æ­å–œï¼æ‚¨å·²ç»åˆ°è¾¾æˆ˜å½¹æ¨¡å¼çš„结尾ï¼[]\n\n这是目å‰å†…容的全部。 未æ¥çš„æ›´æ–°ä¸­å°†æ·»åŠ è¡Œæ˜Ÿé™…æ—…è¡Œã€‚ load.sound = 音ä¹åŠ è½½ä¸­ load.map = 地图加载中 @@ -38,6 +41,11 @@ be.ignore = 忽略 be.noupdates = 未å‘现更新。 be.check = 检测更新 +mod.featured.dialog.title = 模组æµè§ˆå™¨ (尚未完æˆ) +mods.browser.selected = 已选模组 +mods.browser.add=安装 +mods.github.open=查看 + schematic = è“图 schematic.add = ä¿å­˜è“图… schematics = è“图 @@ -55,7 +63,9 @@ schematic.saved = è“图已ä¿å­˜ã€‚ schematic.delete.confirm = 确认删除è“图? schematic.rename = é‡å‘½åè“图 schematic.info = {0}x{1},{2} ä¸ªæ–¹å— +schematic.disabled = [scarlet]è“图已ç¦ç”¨ï¼[]\n您ä¸èƒ½åœ¨æ­¤[accent]地图[]或[accent]æœåС噍[]上使用è“图. +stats = 统计资料 stat.wave = 防守波数:[accent]{0} stat.enemiesDestroyed = æ¶ˆç­æ•Œäººï¼š[accent]{0} stat.built = 建造建筑:[accent]{0} @@ -65,7 +75,7 @@ stat.delivered = 装è¿èµ„æºï¼š stat.playtime = 游玩时间:[accent] {0} stat.rank = 最终评级:[accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]å…¨å±€ç‰©å“ map.delete = 确定è¦åˆ é™¤â€œ[accent]{0}[]â€åœ°å›¾å—? level.highscore = 最高分:[accent]{0} level.select = é€‰æ‹©å…³å¡ @@ -79,6 +89,7 @@ joingame = åŠ å…¥æ¸¸æˆ customgame = è‡ªå®šä¹‰æ¸¸æˆ newgame = æ–°æ¸¸æˆ none = <æ— > +none.found = [lightgray]<未找到> minimap = å°åœ°å›¾ position = ä½ç½® close = 关闭 @@ -99,15 +110,14 @@ committingchanges = 正在æäº¤æ›´æ”¹ done = å·²å®Œæˆ feature.unsupported = æ‚¨çš„è®¾å¤‡ä¸æ”¯æŒæ­¤åŠŸèƒ½ã€‚ -mods.alphainfo = 请注æ„,测试版本(alpha)中的模组[scarlet]很容易存在缺陷[]。\n在 Mindustry çš„ GitHub 或 Discord 上报告你å‘现的问题。 -mods.alpha = [accent](Alpha) +mods.alphainfo = 请注æ„,测试版本中的模组[scarlet]很容易存在缺陷[]。\n在 Mindustry çš„ GitHub 或 Discord 上报告你å‘现的问题。 mods = 模组 mods.none = [lightgray]æ²¡æœ‰æ‰¾åˆ°æ¨¡ç»„ï¼ mods.guide = 模组制作教程 mods.report = 报告 Bug mods.openfolder = 打开模组文件夹 mods.reload = é‡è½½ -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = 游æˆå°†é€€å‡ºä»¥é‡è½½æ¨¡ç»„。 mod.display = [gray]模组:[orange] {0} mod.enabled = [lightgray]å·²å¯ç”¨ mod.disabled = [scarlet]å·²ç¦ç”¨ @@ -115,7 +125,7 @@ mod.disable = ç¦ç”¨ mod.content = 内容: mod.delete.error = 无法删除模组。å¯èƒ½æ–‡ä»¶è¢«å ç”¨ã€‚ mod.requiresversion = [scarlet]所需的游æˆç‰ˆæœ¬ï¼š[accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) +mod.outdated = [scarlet]该模组å¯èƒ½ä¸èƒ½åœ¨6.0上正确地è¿è¡Œ(缺失 minGameVersion: 105) mod.missingdependencies = [scarlet]缺少å‰ç½®æ¨¡ç»„:{0} mod.erroredcontent = [scarlet]内容错误 mod.errors = 读å–内容时å‘生错误. @@ -127,52 +137,56 @@ mod.reloadrequired = [scarlet]需è¦é‡å¯ mod.import = 导入模组 mod.import.file = 导入文件 mod.import.github = 从 GitHub 导入模组 -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR模组注定存在å±é™©æ€§ã€‚[]\nè¯·ç¡®ä¿æ­¤æ¨¡ç»„æ¥æºå®‰å…¨å¯é ï¼ mod.item.remove = è¿™ä¸ªç‰©å“æ˜¯[accent] '{0}'[]模组的一部分. 删除物å“需è¦å…ˆå¸è½½æ­¤æ¨¡ç»„. mod.remove.confirm = 此模组将被删除。 mod.author = [lightgray]作者:[] {0} mod.missing = æ­¤å­˜æ¡£åŒ…å«æ‚¨æœ€è¿‘已更新或者现在未安装的模组。存档å¯èƒ½ä¼šæŸå。确定è¦åŠ è½½å®ƒå—?\n[lightgray]模组:\n{0} mod.preview.missing = 在创æ„å·¥åŠä¸­å‘布此模组å‰ï¼Œæ‚¨å¿…须添加一则预览图åƒã€‚\n请将å为[accent] preview.png[] çš„å›¾åƒæ”¾å…¥æ¨¡ç»„文件夹,然åŽé‡è¯•。 mod.folder.missing = åªæœ‰æ–‡ä»¶å¤¹å½¢å¼çš„æ¨¡ç»„能在创æ„å·¥åŠä¸Šå‘布。\nè‹¥è¦å°†ä»»ä½•模组转æ¢ä¸ºæ–‡ä»¶å¤¹ï¼Œåªéœ€å°†å…¶æ–‡ä»¶è§£åŽ‹ç¼©åˆ°æ–‡ä»¶å¤¹ä¸­å¹¶åˆ é™¤æ—§åŽ‹ç¼©åŒ…ï¼Œç„¶åŽé‡æ–°å¯åŠ¨æ¸¸æˆæˆ–釿–°åŠ è½½æ¨¡ç»„ã€‚ -mod.scripts.disable = ä½ çš„è®¾å¤‡ä¸æ”¯æŒå«æœ‰è„šæœ¬çš„æ¨¡ç»„ã€‚å¿…é¡»ç¦ç”¨ç›¸å…³æ¨¡ç»„以进入游æˆã€‚ +mod.scripts.disable = æ‚¨çš„è®¾å¤‡ä¸æ”¯æŒå«æœ‰è„šæœ¬çš„æ¨¡ç»„ã€‚å¿…é¡»ç¦ç”¨ç›¸å…³æ¨¡ç»„以进入游æˆã€‚ about.button = 关于 name = å字: noname = å…ˆå–一个[accent]玩家å[]。 -planetmap = Planet Map -launchcore = Launch Core +planetmap = 行星地图 +launchcore = å‘射核心 filename = 文件å: unlocked = è§£é”äº†æ–°å†…å®¹ï¼ +available = å¯ç ”ç©¶æ–°ç§‘æŠ€ï¼ completed = [accent]己研究 techtree = 科技树 +research.legacy = å‘现了 [accent]5.0[] 的研究数æ®ã€‚\n您想è¦[accent]加载数æ®[],还是[accent]丢弃数æ®[]å¹¶åœ¨æ–°æˆ˜å½¹ä¸­é‡æ–°ç ”究(建议)? +research.load = 加载 +research.discard = 丢弃 research.list = [lightgray]研究: research = 研究 researched = [lightgray]{0}己研究。 -research.progress = {0}% complete +research.progress = {0}% 完æˆåº¦ players = {0} ä½çŽ©å®¶åœ¨çº¿ players.single = {0} ä½çŽ©å®¶åœ¨çº¿ -players.search = search +players.search = 研究 players.notfound = [gray]没有找到玩家。 server.closing = [accent]æœåŠ¡å™¨å…³é—­â€¦ server.kicked.kick = 你被踢出了æœåŠ¡å™¨ã€‚ -server.kicked.whitelist = 你并没有å—邀请在此æœåŠ¡å™¨ä¸Šæ¸¸çŽ©ã€‚ï¼ˆä¸åœ¨ç™½åå•中) +server.kicked.whitelist = ä½ ä¸åœ¨æœåŠ¡å™¨ç™½åå•中。 server.kicked.serverClose = æœåŠ¡å™¨å·²å…³é—­ã€‚ -server.kicked.vote = 你被投票踢出了æœåŠ¡å™¨ã€‚ +server.kicked.vote = 您被投票踢出了æœåŠ¡å™¨ã€‚ server.kicked.clientOutdated = 客户端过旧,请更新你的游æˆã€‚ server.kicked.serverOutdated = æœåŠ¡å™¨è¿‡æ—§ï¼Œè¯·è”ç³»æœåŠ¡å™¨ç®¡ç†å‘˜å‡çº§æœåŠ¡å™¨ã€‚ -server.kicked.banned = 你在这个æœåŠ¡å™¨ä¸Šè¢«å°ç¦äº†ã€‚ +server.kicked.banned = 您在这个æœåŠ¡å™¨ä¸Šè¢«å°ç¦äº†ã€‚ server.kicked.typeMismatch = æ­¤æœåŠ¡å™¨ä¸Žä½ çš„ä¸ç¨³å®šæµ‹è¯•版ä¸å…¼å®¹ã€‚ server.kicked.playerLimit = æœåŠ¡å™¨å·²æ»¡ï¼Œè¯·ç­‰å¾…ä¸€ä¸ªç©ºä½ã€‚ server.kicked.recentKick = 你刚刚被踢出æœåŠ¡å™¨ã€‚\n请ç¨åŽé‡æ–°è¿žæŽ¥ï¼ -server.kicked.nameInUse = ä½ çš„å字与æœåŠ¡å™¨ä¸­çš„ä¸€ä¸ªäººé‡å¤äº†ã€‚ +server.kicked.nameInUse = 您的å字与æœåŠ¡å™¨ä¸­çš„ä¸€ä¸ªäººé‡å¤äº†ã€‚ server.kicked.nameEmpty = 无效的åå­—ï¼ -server.kicked.idInUse = ä½ å·²ç»è¿žæŽ¥äº†è¿™ä¸ªæœåС噍ï¼ä¸å…许在一å°ç”µè„‘上用两个客户端连接。 +server.kicked.idInUse = 您已ç»è¿žæŽ¥äº†è¿™ä¸ªæœåС噍ï¼ä¸å…许在一å°è®¾å¤‡ä¸Šç”¨ä¸¤ä¸ªå®¢æˆ·ç«¯è¿žæŽ¥ã€‚ server.kicked.customClient = 这个æœåС噍䏿”¯æŒè‡ªå®šä¹‰å®¢æˆ·ç«¯ã€‚请下载官方版本。 server.kicked.gameover = 游æˆç»“æŸï¼ server.kicked.serverRestarting = æœåŠ¡å™¨æ­£åœ¨é‡å¯. server.versions = 客户端版本:[accent] {0}[]\næœåŠ¡å™¨ç‰ˆæœ¬ï¼š[accent] {1}[] host.info = [accent]创建局域网游æˆ[]按钮会在[scarlet] 6567 []端å£è¿è¡Œä¸€ä¸ªæœåŠ¡å™¨ã€‚[]\n任何在åŒä¸€ä¸ª[lightgray] Wi-Fi 或本地网络[]下的人应该都å¯ä»¥åœ¨æœåŠ¡å™¨åˆ—è¡¨ä¸­çœ‹åˆ°ä½ çš„æœåŠ¡å™¨ã€‚\n\n如果你想让别人在任何地方都能通过 IP 地å€è¿žæŽ¥ï¼Œä½ éœ€è¦è®¾å®š[accent]端å£è½¬å‘[]。\n\n[lightgray]注æ„:如果æŸäººæ— æ³•连接到你的局域网游æˆï¼Œè¯·ç¡®ä¿ä½ åœ¨é˜²ç«å¢™è®¾ç½®é‡Œå…许了 Mindustry 访问本地网络。 -join.info = 您å¯ä»¥è¾“å…¥[accent]æœåŠ¡å™¨çš„ IP 地å€[]æ¥è¿žæŽ¥ï¼Œæˆ–寻找[accent]本地网络[]中的æœåС噍æ¥è¿žæŽ¥ã€‚\n支æŒå±€åŸŸç½‘或广域网的多人游æˆã€‚\n\n[lightgray]注æ„ï¼šæ²¡æœ‰å…¨çƒæœåŠ¡å™¨åˆ—è¡¨ï¼›å¦‚æžœä½ æƒ³é€šè¿‡ IP 地å€è¿žæŽ¥æŸä¸ªæœåŠ¡å™¨ï¼Œä½ éœ€è¦å‘房主询问 IP 地å€ã€‚ +join.info = 您å¯ä»¥è¾“å…¥[accent]æœåŠ¡å™¨çš„ IP 地å€[]æ¥è¿žæŽ¥ï¼Œæˆ–寻找[accent]本地网络[]中的æœåС噍æ¥è¿žæŽ¥ã€‚\n支æŒå±€åŸŸç½‘或广域网的多人游æˆã€‚\n\n[lightgray]注æ„ï¼šæ²¡æœ‰å…¨çƒæœåŠ¡å™¨åˆ—è¡¨ï¼›å¦‚æžœä½ æƒ³é€šè¿‡ IP 地å€è¿žæŽ¥æŸä¸ªæœåŠ¡å™¨ï¼Œä½ éœ€è¦å‘æœä¸»è¯¢é—® IP 地å€ã€‚ hostserver = 创建æœåС噍 invitefriends = é‚€è¯·æœ‹å‹ hostserver.mobile = 创建\næœåС噍 @@ -189,6 +203,11 @@ servers.local = 本地æœåС噍 servers.remote = 远程æœåС噍 servers.global = å…¨çƒæœåС噍 +servers.disclaimer=社区æœåС噍[accent]䏿˜¯[]由开å‘者拥有或管ç†ã€‚\n\næœåС噍䏭å¯èƒ½æœ‰å…¶ä»–玩家制作的ä¸é€‚当的内容。 +servers.showhidden = 显示éšè—çš„æœåС噍 +server.shown = 显示 +server.hidden = éšè— + trace = 跟踪玩家 trace.playername = 玩家å称:[accent]{0} trace.ip = IP 地å€ï¼š[accent]{0} @@ -201,7 +220,7 @@ server.bans.none = 没有被å°ç¦çš„çŽ©å®¶ï¼ server.admins = 管ç†å‘˜ server.admins.none = 该æœåŠ¡å™¨æ²¡æœ‰ç®¡ç†å‘˜ï¼ server.add = 添加æœåС噍 -server.delete = 你确定è¦åˆ é™¤è¿™ä¸ªæœåС噍å—? +server.delete = 您确定è¦åˆ é™¤è¿™ä¸ªæœåС噍å—? server.edit = 编辑æœåС噍 server.outdated = [crimson]æœåŠ¡å™¨è¿‡æ—§ï¼[] server.outdated.client = [crimson]客户端过旧ï¼[] @@ -222,17 +241,18 @@ disconnect.timeout = 连接超时。 disconnect.data = è¯»å–æœåŠ¡å™¨æ•°æ®å¤±è´¥ï¼ cantconnect = 无法加入([accent]{0}[])。 connecting = [accent]连接中… +reconnecting = [accent]釿–°è¿žæŽ¥ä¸­â€¦ connecting.data = [accent]加载中… server.port = 端å£ï¼š server.addressinuse = 地å€å·²åœ¨ä½¿ç”¨ï¼ server.invalidport = 无效的端å£ï¼ server.error = [crimson]创建æœåŠ¡å™¨é”™è¯¯ï¼š[accent]{0} save.new = 新存档 -save.overwrite = 你确定你è¦è¦†ç›–这个存档å—? +save.overwrite = 您确定è¦è¦†ç›–这个存档å—? overwrite = 覆盖 save.none = æ²¡æœ‰æ‰¾åˆ°å­˜æ¡£ï¼ savefail = ä¿å­˜å¤±è´¥ï¼ -save.delete.confirm = 你确定你è¦åˆ é™¤è¿™ä¸ªå­˜æ¡£å—? +save.delete.confirm = 您确定è¦åˆ é™¤è¿™ä¸ªå­˜æ¡£å—? save.delete = 删除 save.export = 导出存档 save.import.invalid = [accent]æ­¤å­˜æ¡£æ— æ•ˆï¼ @@ -245,7 +265,7 @@ save.rename.text = æ–°å称: selectslot = 选择一个存档。 slot = [accent]å­˜æ¡£ä½ {0} editmessage = ç¼–è¾‘æ¶ˆæ¯ -save.corrupted = [accent]存档æŸå或无效ï¼\n如果你刚刚å‡çº§äº†æ¸¸æˆï¼Œé‚£ä¹ˆè¿™å¯èƒ½æ˜¯å› ä¸ºå­˜æ¡£æ ¼å¼æ”¹å˜äº†ï¼Œè€Œ[scarlet]䏿˜¯[] bug 。 +save.corrupted = [accent]存档æŸå或无效ï¼\n如果您刚刚å‡çº§äº†æ¸¸æˆï¼Œé‚£ä¹ˆè¿™å¯èƒ½æ˜¯å› ä¸ºå­˜æ¡£æ ¼å¼æ”¹å˜äº†ï¼Œè€Œ[scarlet]䏿˜¯[] bug 。 empty = < 空 > on = å¼€ off = å…³ @@ -267,6 +287,9 @@ cancel = å–æ¶ˆ openlink = 打开链接 copylink = å¤åˆ¶é“¾æŽ¥ back = 返回 +crash.export = 导出崩溃日志 +crash.none = 找ä¸åˆ°å´©æºƒæ—¥å¿—。 +crash.exported = 崩溃日志已导出。 data.export = å¯¼å‡ºæ•°æ® data.import = å¯¼å…¥æ•°æ® data.openfolder = æ‰“å¼€æ•°æ®æ–‡ä»¶å¤¹ @@ -278,24 +301,30 @@ quit.confirm.tutorial = 确定è¦è·³è¿‡æ•™ç¨‹ï¼Ÿ\n您å¯ä»¥é€šè¿‡[accent]设置- loading = [accent]加载中… reloading = [accent]é‡è½½æ¨¡ç»„中… saving = [accent]ä¿å­˜ä¸­â€¦ -respawn = [accent][[{0}][] to respawn in core +respawn = [accent][[{0}][]æ¥é‡ç”Ÿ cancelbuilding = [accent][[{0}][]æ¥æ¸…除规划 selectschematic = [accent][[{0}][]æ¥é€‰æ‹©å¤åˆ¶ pausebuilding = [accent][[{0}][]æ¥æš‚åœå»ºé€  resumebuilding = [scarlet][[{0}][]æ¥æ¢å¤å»ºé€  +showui = UIå·²éšè—\n按[accent][[{0}][]显示UI wave = [accent]第{0}æ³¢ +wave.cap = [accent]波次 {0}/{1} wave.waiting = [lightgray]下一波倒计时:{0}ç§’ wave.waveInProgress = [lightgray]æ³¢æ¬¡è¢­æ¥ waiting = [lightgray]等待中… waiting.players = 等待玩家中… wave.enemies = [lightgray]剩余 {0} 个敌人 +wave.enemycores = [accent]{0}[lightgray] 敌人核心 +wave.enemycore = [accent]{0}[lightgray] 敌人核心 wave.enemy = [lightgray]剩余 {0} 个敌人 +wave.guardianwarn = Boss 将在[accent]{0}[]æ³¢åŽåˆ°æ¥ã€‚ +wave.guardianwarn.one = Boss 将在[accent]{0}[]æ³¢åŽåˆ°æ¥ã€‚ loadimage = 加载图片 saveimage = ä¿å­˜å›¾ç‰‡ unknown = 未知 custom = 自定义 -builtin = 内建的 -map.delete.confirm = 你确定你想è¦åˆ é™¤è¿™å¼ åœ°å›¾å—?这个æ“ä½œæ— æ³•æ’¤é”€ï¼ +builtin = 内置的 +map.delete.confirm = 您确定你想è¦åˆ é™¤è¿™å¼ åœ°å›¾å—?这个æ“ä½œæ— æ³•æ’¤é”€ï¼ map.random = [accent]éšæœºåœ°å›¾ map.nospawn = 这个地图没有核心ï¼è¯·åœ¨ç¼–辑器中添加一个[royal]己方[]的核心。 map.nospawn.pvp = 这个地图没有敌人的核心ï¼è¯·åœ¨ç¼–辑器中添加一个[royal]敌人[]的核心。 @@ -328,6 +357,7 @@ editor.generation = 筛选器: editor.ingame = 游æˆå†…编辑 editor.publish.workshop = 上传到创æ„å·¥åŠ editor.newmap = 新地图 +editor.center = 居中 workshop = 创æ„å·¥åŠ waves.title = 波数 waves.remove = 移除 @@ -335,9 +365,9 @@ waves.never = < æ— é™ > waves.every = æ¯ waves.waves = æ³¢ waves.perspawn = æ¯æ¬¡ç”Ÿæˆ -waves.shields = shields/wave +waves.shields = 护盾/æ³¢ waves.to = 至 -waves.guardian = Guardian +waves.guardian = Boss waves.preview = 预览 waves.edit = 编辑… waves.copy = å¤åˆ¶åˆ°å‰ªè´´æ¿ @@ -346,9 +376,10 @@ waves.invalid = 剪贴æ¿ä¸­çš„æ³¢æ¬¡ä¿¡æ¯æ— æ•ˆã€‚ waves.copied = 波次信æ¯å·²å¤åˆ¶ã€‚ waves.none = 没有定义敌人。\n请注æ„,这将自动替æ¢ä¸ºé»˜è®¤çš„æ•Œäººåˆ—表。 -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#these are intentionally in lower case +wavemode.counts = æ•°ç›® +wavemode.totals = 总和 +wavemode.health = 生命值 editor.default = [lightgray]<默认> details = 详情… @@ -359,7 +390,7 @@ editor.removeunit = 移除å•ä½ editor.teams = é˜Ÿä¼ editor.errorload = è¯»å–æ–‡ä»¶å‡ºé”™ï¼š\n[accent]{0} editor.errorsave = ä¿å­˜æ–‡ä»¶å‡ºé”™ï¼š\n[accent]{0} -editor.errorimage = è¿™æ˜¯ä¸€å¹…å›¾ç‰‡ï¼Œä¸æ˜¯åœ°å›¾ã€‚请ä¸è¦æ›´æ”¹æ–‡ä»¶çš„æ‰©å±•åæ¥å¯¼å…¥ã€‚\n\nå¦‚æžœä½ æƒ³å¯¼å…¥åœ°å›¾ï¼Œè¯·åœ¨ç¼–è¾‘å™¨ä¸­ä½¿ç”¨â€œå¯¼å…¥åœ°å›¾â€æŒ‰é’®ã€‚ +editor.errorimage = è¿™æ˜¯ä¸€å¹…å›¾ç‰‡ï¼Œä¸æ˜¯åœ°å›¾ã€‚请ä¸è¦æ›´æ”¹æ–‡ä»¶çš„æ‰©å±•åæ¥å¯¼å…¥ã€‚\n\nå¦‚æžœæ‚¨æƒ³å¯¼å…¥åœ°å›¾ï¼Œè¯·åœ¨ç¼–è¾‘å™¨ä¸­ä½¿ç”¨â€œå¯¼å…¥åœ°å›¾â€æŒ‰é’®ã€‚ editor.errorlegacy = 此地图太旧了,旧的地图格å¼å·²ä¸å†æ”¯æŒã€‚ editor.errornot = è¿™ä¸æ˜¯åœ°å›¾æ–‡ä»¶ã€‚ editor.errorheader = 此地图文件无效或已æŸå。 @@ -372,8 +403,8 @@ editor.resize = è°ƒæ•´å¤§å° editor.loadmap = 载入地图 editor.savemap = ä¿å­˜åœ°å›¾ editor.saved = å·²ä¿å­˜ï¼ -editor.save.noname = 你的地图没有åå­—ï¼åœ¨â€œåœ°å›¾ä¿¡æ¯â€èœå•里设置一个。 -editor.save.overwrite = 你的地图覆盖了一个内置的地图ï¼åœ¨â€œåœ°å›¾ä¿¡æ¯â€èœå•é‡Œé‡æ–°è®¾ç½®ä¸€ä¸ªä¸åŒçš„å称。 +editor.save.noname = 您的地图没有åå­—ï¼åœ¨â€œåœ°å›¾ä¿¡æ¯â€èœå•里设置一个。 +editor.save.overwrite = 您的地图覆盖了一个内置的地图ï¼åœ¨â€œåœ°å›¾ä¿¡æ¯â€èœå•é‡Œé‡æ–°è®¾ç½®ä¸€ä¸ªä¸åŒçš„å称。 editor.import.exists = [scarlet]无法导入:[]存在å为“{0}â€çš„å†…ç½®åœ°å›¾ï¼ editor.import = 导入… editor.importmap = 导入地图 @@ -415,8 +446,9 @@ toolmode.drawteams.description = ç»˜åˆ¶å›¢é˜Ÿè€Œä¸æ˜¯æ–¹å—。 filters.empty = [lightgray]没有过滤æ¡ä»¶ï¼ç”¨ä¸‹æ–¹çš„æŒ‰é’®æ·»åŠ ã€‚ filter.distort = 扭曲程度 filter.noise = 波动程度 -filter.enemyspawn = Enemy Spawn Select -filter.corespawn = Core Select +filter.enemyspawn = 敌人生æˆç‚¹é€‰æ‹© +filter.spawnpath = 敌人生æˆé€”径 +filter.corespawn = 核心é™è½ç‚¹é€‰æ‹© filter.median = 平凿•° filter.oremedian = çŸ¿çŸ³å¹³å‡æ•° filter.blend = æ··åˆç¨‹åº¦ @@ -440,6 +472,7 @@ filter.option.amount = æ•°é‡ filter.option.block = æ–¹å— filter.option.floor = åœ°é¢ filter.option.flooronto = 地é¢ç›®æ ‡ +filter.option.target = 目标 filter.option.wall = 墙 filter.option.ore = 矿石 filter.option.floor2 = 二é‡åœ°é¢ @@ -456,6 +489,8 @@ load = è½½å…¥æ¸¸æˆ save = ä¿å­˜ fps = 帧数:{0} ping = 延迟:{0}毫秒 +memory = 内存: {0}mb +memory2 = 内存:\n {0}mb +\n {1}mb language.restart = 为了使语言设置生效请é‡å¯æ¸¸æˆã€‚ settings = 设置 tutorial = 教程 @@ -469,33 +504,24 @@ locked = å·²é”定 complete = [lightgray]完æˆï¼š requirement.wave = {1}中的第{0}波次 requirement.core = 在{0}ä¸­æ‘§æ¯æ•Œæ–¹æ ¸å¿ƒ -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = æš‚åœï¼š\n[lightgray]{0} -bestwave = [lightgray]最高波次:{0} -launch = < å‘å°„ > -launch.text = Launch -launch.title = å‘å°„æˆåŠŸ -launch.next = [lightgray]下个å‘射窗å£åœ¨ç¬¬{0}æ³¢ -launch.unable2 = [scarlet]无法å‘å°„[] -launch.confirm = 您将装载并å‘射核心中的所有资æºã€‚\n此地图将é‡ç½®ï¼Œæ— æ³•回到此基地。 -launch.skip.confirm = 如果现在跳过,在下一个å‘射窗å£åˆ°æ¥å‰ï¼Œæ‚¨éƒ½æ— æ³•å‘射。 +requirement.research = 研究 {0} +requirement.produce = 生产 {0} +requirement.capture = å é¢† {0} +launch.text = å‘å°„ +research.multiplayer = 仅有æœä¸»å¯ç ”究物å“。 +map.multiplayer = 仅有æœä¸»å¯æŸ¥çœ‹åŒºåŸŸã€‚ uncover = è§£é” configure = 设定装è¿çš„æ•°é‡ -loadout = Loadout -resources = Resources + +loadout = è£…è¿ +resources = èµ„æº bannedblocks = ç¦ç”¨å»ºç­‘ addall = 添加所有 -launch.destination = Destination: {0} +launch.from = å‘射地: [accent]{0} +launch.destination = 目的地: {0} configure.invalid = æ•°é‡å¿…须是0到{0}之间的数字。 -zone.unlocked = [lightgray]{0} 已解é”。 -zone.requirement.complete = 完æˆ{0}。\n已达æˆè§£é”{1}çš„è¦æ±‚。 -zone.resources = 地图中的资æºï¼š -zone.objective = [lightgray]目标:[accent]{0} -zone.objective.survival = 生存 -zone.objective.attack = æ‘§æ¯æ•Œæ–¹æ ¸å¿ƒ add = 添加… -boss.health = BOSS 生命值 +boss.health = Boss 生命值 connectfail = [crimson]æœåŠ¡å™¨è¿žæŽ¥å¤±è´¥ï¼š[accent]{0} error.unreachable = 无法访问æœåŠ¡å™¨ã€‚\n确定输对地å€äº†å—? @@ -508,43 +534,82 @@ error.io = 网络 I/O 错误。 error.any = 未知网络错误。 error.bloom = 未能åˆå§‹åŒ–特效。\n您的设备å¯èƒ½ä¸æ”¯æŒã€‚ -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = é™é›¨ +weather.snow.name = é™é›ª +weather.sandstorm.name = 沙尘暴 +weather.sporestorm.name = å­¢å­é›¾ +weather.fog.name = 雾 -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]未探索 +sectors.resources = 资æº: +sectors.production = 产出: +sectors.export = 输出: +sectors.time = æ—¶é—´: +sectors.threat = å¨èƒ +sectors.wave = 进攻波: +sectors.stored = 贮存: +sectors.resume = ç»§ç»­ +sectors.launch = å‘å°„ +sectors.select = 选择 +sectors.nonelaunch = [lightgray]æ—  (太阳) +sectors.rename = é‡å‘½ååŒºå— +sectors.enemybase = [scarlet]敌人基地 +sectors.vulnerable = [scarlet]脆弱的 +sectors.underattack = [scarlet]é­åˆ°æ”»å‡»ï¼[accent]{0}% æŸæ¯åº¦ +sectors.survives = [accent]存活{0}æ³¢ +sectors.go = 进入 +sector.curcapture = 区å—å·²å é¢† +sector.curlost = 区å—已丢失 +sector.missingresources = [scarlet]核心资æºä¸è¶³ +sector.attacked = 区å—[accent]{0}[white]å—到攻击! +sector.lost = 区å—[accent]{0}[white]已丢失! +#note: the missing space in the line below is intentional +sector.captured = 区å—[accent]{0}[white]å·²å é¢†! -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = 低度 +threat.medium = 中度 +threat.high = 高度 +threat.extreme = æžé«˜ +threat.eradication = æ‰«è¡ -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +planets = 行星 + +planet.serpulo.name = 塞普罗 +planet.sun.name = 太阳 + +sector.impact0078.name = 冲击区0078 +sector.groundZero.name = é›¶å·åœ°åŒº +sector.craters.name = 陨石带 +sector.frozenForest.name = 冰冻森林 +sector.ruinousShores.name = é—迹海岸 +sector.stainedMountains.name = 绵延群山 +sector.desolateRift.name = è’芜裂谷 +sector.nuclearComplex.name = 核裂阵 +sector.overgrowth.name = 增生区 +sector.tarFields.name = 焦油田 +sector.saltFlats.name = ç›ç¢±è’滩 +sector.fungalPass.name = 真èŒé€šé“ +sector.biomassFacility.name = ç”Ÿç‰©è´¨åˆæˆåŒº +sector.windsweptIslands.name = 风å¹ç¾¤å²› +sector.extractionOutpost.name = èƒå–å‰å“¨ +sector.planetaryTerminal.name = 行星å‘射终端 + +sector.groundZero.description = è¸ä¸Šæ—…程的最佳ä½ç½®ã€‚这儿的敌人å¨èƒå¾ˆå°ï¼Œä½†èµ„æºä¹Ÿå°‘。\n收集尽å¯èƒ½å¤šçš„铅和铜。\n出å‘å§ï¼ +sector.frozenForest.description = å³ä½¿æ˜¯é è¿‘山脉的这里,孢å­ä¹Ÿå·²ç»æ‰©æ•£ã€‚他们ä¸èƒ½é•¿æœŸåœç•™åœ¨å¯’冷的温度中。\n\n开始è¿ç”¨ç”µåŠ›ã€‚å»ºé€ ç«åŠ›å‘电机并学会使用修ç†è€…。 +sector.saltFlats.description = åœ¨æ²™æ¼ çš„éƒŠåŒºæœ‰ç›æ»©ã€‚在这个地方几乎找ä¸åˆ°èµ„æºã€‚\n\n敌人在这里建立了一个资æºå­˜å‚¨åŒºã€‚æ‘§æ¯ä»–们的核心。ä¸è¦ç•™ä¸‹ä»»ä½•东西。 +sector.craters.description = 水在这个ç«å±±å£ç§¯èšï¼Œè¿™æ˜¯æ—§æˆ˜äº‰çš„é—è¿¹ã€‚å¤ºä¸‹è¯¥åŒºåŸŸã€‚æ”¶é›†æ²™å­æ¥å†¶ç‚¼çŽ»ç’ƒã€‚ç”¨æ°´æ³µæŠ½æ°´æ¥åŠ é€Ÿç‚®å¡”å’Œé’»å¤´ã€‚ +sector.ruinousShores.description = 穿过è’地,就是海岸线。这个地方曾ç»å»ºé€ äº†ä¸€ä¸ªæµ·å²¸é˜²å¾¡çº¿ã€‚ä½†çŽ°åœ¨æ‰€å‰©æ— å‡ ï¼Œåªæœ‰æœ€åŸºæœ¬çš„防御结构ä»ç„¶æ¯«å‘æ— æŸï¼Œå…¶ä»–一切都被摧æ¯äº†ã€‚\nç»§ç»­å‘外扩展。继续研究科技。 +sector.stainedMountains.description = åœ¨æ›´è¿œçš„å†…é™†åœ°åŒºæ˜¯å±±è„‰ï¼Œä½†è¿™é‡Œæ²¡æœ‰è¢«å­¢å­æ±¡æŸ“。\n这一地区分布ç€ä¸°å¯Œçš„钛,学习如何使用它。\n\n这里的敌人势力更大,ä¸è¦ç»™ä»–们时间派出最强的部队。 +sector.overgrowth.description = 这个地区é è¿‘å­¢å­çš„æ¥æºï¼Œå› æ­¤ç”Ÿé•¿è¿‡åº¦ã€‚\n敌人在这里建立了一个å‰å“¨ç«™ã€‚建造尖刀å•使¥æ‘§æ¯å®ƒå¹¶æ‰¾å›žä¸¢å¤±çš„东西。 +sector.tarFields.description = 产油区边缘,ä½äºŽå±±è„‰å’Œæ²™æ¼ ä¹‹é—´ã€‚它少数几个有石油储é‡çš„地区之一。\nå°½ç®¡è¢«åºŸå¼ƒï¼Œè¿™é™„è¿‘ä»æœ‰ä¸€äº›å±é™©çš„æ•Œæ–¹å•ä½ã€‚ä¸è¦ä½Žä¼°ä»–们。\n\n[lightgray]如果å¯èƒ½ï¼Œç ”究石油加工技术。 +sector.desolateRift.description = éžå¸¸å±é™©çš„区域。这儿的资æºä¸°å¯Œä½†ç©ºé—´å¾ˆå°ã€‚敌人å分å±é™©ã€‚尽快离开,ä¸è¦è¢«æ•Œäººçš„æ”»å‡»é—´éš”太长所愚弄。 +sector.nuclearComplex.description = 以å‰ç”Ÿäº§å’ŒåŠ å·¥é’çš„è®¾æ–½å·²å˜æˆåºŸå¢Ÿã€‚\n[lightgray]研究é’åŠå…¶å¤šç§ç”¨é€”。\n\n敌人在这里大é‡å­˜åœ¨ï¼Œä¸æ–­æ¶ˆç­å…¥ä¾µè€…。 +sector.fungalPass.description = 介于高山和低矮孢å­ä¸›ç”Ÿçš„土地之间的过渡地带。这里有一个å°åž‹çš„æ•Œæ–¹ä¾¦å¯ŸåŸºåœ°ã€‚\n侦察它。\n使用尖刀和爬行者å•使¥æ‘§æ¯ä¸¤ä¸ªæ ¸å¿ƒã€‚ +sector.biomassFacility.description = å­¢å­çš„呿ºåœ°ã€‚这里有最åˆç ”究和生产孢å­çš„设施。\nç ”ç©¶è¿™é‡Œçš„ç§‘æŠ€ï¼ŒåŸ¹å…»å­¢å­æ¥åˆ¶é€ ç‡ƒæ–™å’Œèšåˆç‰©ã€‚\n\n[lightgray]è®¾æ–½æŸæ¯åŽï¼Œå­¢å­æ•£æ’­äº†å‡ºåŽ»ï¼ŒåŽŸç”Ÿç”Ÿæ€ç³»ç»Ÿæ— æ³•抵挡这ç§å¤–æ¥ç‰©ç§ã€‚ +sector.windsweptIslands.description = 海岸线之外åè½ç€è¿™ä¸€ä¸²ç¾¤å²›ã€‚æ®è®°è½½è¿™é‡Œæ›¾æœ‰ç”Ÿäº§[accent]å¡‘é’¢[]的建筑。\n\n抵御敌人的海军,在岛上建立基地,研究这些工厂。 +sector.extractionOutpost.description = 一座é¥è¿œçš„å‰å“¨ï¼Œæ•Œäººä¸ºäº†å‘其他区域å‘射资æºè€Œå»ºç«‹ã€‚\n\n跨区域è¿è¾“æŠ€æœ¯æ˜¯å¾æœè¿™ä¸ªæ˜Ÿçƒä¸å¯æˆ–ç¼ºçš„æŠ€æœ¯ã€‚æ‘§æ¯æ•ŒäººåŸºåœ°ï¼Œç ”ç©¶å‘å°„å°ã€‚ +sector.impact0078.description = 这里有最åˆè¿›å…¥è¿™ä¸ªæ˜Ÿç³»çš„æ˜Ÿé™…è¿è¾“船的é—迹。\n\n回收å¯ä»¥åˆ©ç”¨çš„资æºï¼Œç ”究科技。 +sector.planetaryTerminal.description = 最终目标。\n\n这座滨海基地有一个å¯ä»¥å°†æ ¸å¿ƒå‘å°„åˆ°å…¶ä»–è¡Œæ˜Ÿçš„å»ºç­‘ï¼Œé˜²å«æ£®ä¸¥ã€‚\n\n制造海军å•ä½ï¼Œå°½å¿«æ¶ˆç­æ•Œäººï¼Œç ”ç©¶å‘射建筑。 settings.language = 语言 settings.data = æ¸¸æˆæ•°æ® @@ -558,65 +623,100 @@ settings.graphics = å›¾åƒ settings.cleardata = æ¸…é™¤æ¸¸æˆæ•°æ®â€¦ settings.clear.confirm = æ‚¨ç¡®å®šè¦æ¸…除此数æ®ï¼Ÿ\næ­¤æ“ä½œæ— æ³•æ’¤é”€ï¼ settings.clearall.confirm = [scarlet]警告ï¼[]\n这将清除所有数æ®ï¼ŒåŒ…括存档ã€åœ°å›¾ã€è§£é”和按键绑定。\n按「是ã€åŽï¼Œæ¸¸æˆå°†åˆ é™¤æ‰€æœ‰æ•°æ®å¹¶è‡ªåŠ¨é€€å‡ºã€‚ -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves +settings.clearsaves.confirm = æ‚¨ç¡®å®šè¦æ¸…除存档? +settings.clearsaves = 清除存档 +settings.clearresearch = 清除研究进度 +settings.clearresearch.confirm = æ‚¨ç¡®å®šè¦æ¸…除战役研究进度? +settings.clearcampaignsaves = 清除战役进度 +settings.clearcampaignsaves.confirm = æ‚¨ç¡®å®šè¦æ¸…除战役进度? paused = [accent]< æš‚åœ > clear = 清除 banned = [scarlet]å·²ç¦æ­¢ -unplaceable.sectorcaptured = [scarlet]Requires captured sector yes = 是 no = å¦ info.title = [accent]详情 error.title = [crimson]å‘生了一个错误 error.crashtitle = å‘生了一个错误 unit.nobuild = [scarlet]å•使œªèƒ½å»ºé€  -blocks.input = 输入 -blocks.output = 输出 -blocks.booster = 增强物å“/液体 -blocks.tiles = 所需地型 -blocks.affinities = 相关 +lastaccessed = [lightgray]上次æ“作: {0} block.unknown = [lightgray]??? -blocks.powercapacity = 能é‡å®¹é‡ -blocks.powershot = 能é‡/å‘å°„ -blocks.damage = 伤害 -blocks.targetsair = 攻击空中å•ä½ -blocks.targetsground = 攻击地é¢å•ä½ -blocks.itemsmoved = 移动速度 -blocks.launchtime = å‘射间隔时间 -blocks.shootrange = 范围 -blocks.size = 尺寸 -blocks.displaysize = Display Size -blocks.liquidcapacity = æ¶²ä½“å®¹é‡ -blocks.powerrange = 能é‡èŒƒå›´ -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 最多连接 -blocks.poweruse = ä½¿ç”¨èƒ½é‡ -blocks.powerdamage = 功率/æŸä¼¤ -blocks.itemcapacity = 物å“å®¹é‡ -blocks.basepowergeneration = 基础能æºè¾“出 -blocks.productiontime = 生产时间 -blocks.repairtime = å»ºç­‘å®Œå…¨ä¿®å¤æ—¶é—´ -blocks.speedincrease = æé€Ÿ -blocks.range = 范围 -blocks.drilltier = å¯é’»æŽ¢çŸ¿ç‰© -blocks.drillspeed = 基础钻探速度 -blocks.boosteffect = 增强效果 -blocks.maxunits = 最大å•使•°é‡ -blocks.health = 生命值 -blocks.buildtime = 建造时间 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = 建造花费 -blocks.inaccuracy = 误差 -blocks.shots = å‘å°„æ•° -blocks.reload = æ¯ç§’å‘å°„æ•° -blocks.ammo = å¼¹è¯ -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time -bar.drilltierreq = éœ€è¦æ›´å¥½çš„钻头 -bar.noresources = Missing Resources -bar.corereq = Core Base Required +stat.description = ä»‹ç» +stat.input = 输入 +stat.output = 输出 +stat.booster = 增强物å“/液体 +stat.tiles = 所需地型 +stat.affinities = 相关 +stat.powercapacity = 能é‡å®¹é‡ +stat.powershot = 能é‡/å‘å°„ +stat.damage = 伤害 +stat.targetsair = 攻击空中å•ä½ +stat.targetsground = 攻击地é¢å•ä½ +stat.itemsmoved = 移动速度 +stat.launchtime = å‘射间隔时间 +stat.shootrange = 范围 +stat.size = 尺寸 +stat.displaysize = 显示尺寸 +stat.liquidcapacity = æ¶²ä½“å®¹é‡ +stat.powerrange = 能é‡èŒƒå›´ +stat.linkrange = 连接范围 +stat.instructions = æŒ‡ä»¤æ•°é‡ +stat.powerconnections = 最多连接 +stat.poweruse = ä½¿ç”¨èƒ½é‡ +stat.powerdamage = 功率/æŸä¼¤ +stat.itemcapacity = 物å“å®¹é‡ +stat.memorycapacity = å†…å­˜å®¹é‡ +stat.basepowergeneration = 基础能æºè¾“出 +stat.productiontime = 生产时间 +stat.repairtime = å»ºç­‘å®Œå…¨ä¿®å¤æ—¶é—´ +stat.weapons = 武器 +stat.bullet = å­å¼¹ +stat.speedincrease = æé€Ÿ +stat.range = 范围 +stat.drilltier = å¯é’»æŽ¢çŸ¿ç‰© +stat.drillspeed = 基础钻探速度 +stat.boosteffect = 增强效果 +stat.maxunits = 最大å•使•°é‡ +stat.health = 生命值 +stat.buildtime = 建造时间 +stat.maxconsecutive = 最大连续 +stat.buildcost = 建造花费 +stat.inaccuracy = 误差 +stat.shots = å‘å°„æ•° +stat.reload = æ¯ç§’å‘å°„æ•° +stat.ammo = å¼¹è¯ +stat.shieldhealth = 盾容 +stat.cooldowntime = 冷崿—¶é—´ +stat.explosiveness = 爆炸性 +stat.basedeflectchance = 基础å射几率 +stat.lightningchance = æ¿€å‘闪电几率 +stat.lightningdamage = æ¿€å‘闪电伤害 +stat.flammability = 燃烧性 +stat.radioactivity = 放射性 +stat.heatcapacity = çƒ­å®¹é‡ +stat.viscosity = 粘度 +stat.temperature = 温度 +stat.speed = 速度 +stat.buildspeed = 建造速度 +stat.minespeed = 采矿速度 +stat.minetier = 采矿等级 +stat.payloadcapacity = è½½è´§å®¹é‡ +stat.commandlimit = æŒ‡æŒ¥ä¸Šé™ +stat.abilities = 能力 +stat.canboost = å¯åŠ©æŽ¨ +stat.flying = å¯é£žè¡Œ +stat.ammouse = å¼¹è¯æ¶ˆè€— + +ability.forcefield = 力墙场 +ability.repairfield = ä¿®å¤åœº +ability.statusfield = 状æ€åœº +ability.unitspawn = {0} å•ä½å·¥åŽ‚ +ability.shieldregenfield = 护盾å†ç”Ÿåœº +ability.movelightning = 闪电助推器 + +bar.drilltierreq = éœ€è¦æ›´é«˜çº§çš„钻头 +bar.noresources = ç¼ºå¤±èµ„æº +bar.corereq = 缺失核心基座 bar.drillspeed = 挖掘速度:{0}/ç§’ bar.pumpspeed = 泵压速度:{0}/ç§’ bar.efficiency = 效率:{0}% @@ -624,10 +724,10 @@ bar.powerbalance = 能é‡ï¼š{0}/ç§’ bar.powerstored = 储能:{0}/{1} bar.poweramount = 能é‡ï¼š{0} bar.poweroutput = 能é‡è¾“出:{0} +bar.powerlines = 链接: {0}/{1} bar.items = 物å“:{0} bar.capacity = 容é‡ï¼š{0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = 液体 bar.heat = çƒ­é‡ bar.power = 电力 @@ -635,19 +735,27 @@ bar.progress = 制造进度 bar.input = 输入 bar.output = 输出 +units.processorcontrol = [lightgray]由处ç†å™¨æŽ§åˆ¶ + bullet.damage = [stat]{0}[lightgray] 伤害 bullet.splashdamage = [stat]{0}[lightgray] 范围伤害 ~[stat] {1}[lightgray] æ ¼ bullet.incendiary = [stat] 燃烧 +bullet.sapping = [stat] 削弱 bullet.homing = [stat] 追踪 -bullet.shock = [stat] 击晕 +bullet.shock = [stat] 电击 bullet.frag = [stat] 分裂 +bullet.buildingdamage = [stat]{0}%[lightgray] 对建筑伤害 bullet.knockback = [stat]{0}[lightgray] 击退 +bullet.pierce = [stat]{0}[lightgray]x ç©¿é€ +bullet.infinitepierce = [stat] ç©¿é€ +bullet.healpercent = [stat]{0}[lightgray]% ä¿®å¤ bullet.freezing = [stat] 冰冻 bullet.tarred = [stat] å‡é€Ÿ bullet.multiplier = [stat]{0}[lightgray]x è£…å¼¹æ•°é‡ bullet.reload = [stat]{0}[lightgray]x 装弹速度 unit.blocks = æ–¹å— +unit.blockssquared = 方嗲 unit.powersecond = 能é‡/ç§’ unit.liquidsecond = 液体/ç§’ unit.itemssecond = 物å“/ç§’ @@ -655,31 +763,34 @@ unit.liquidunits = 液体 unit.powerunits = èƒ½é‡ unit.degrees = 度 unit.seconds = ç§’ -unit.minutes = mins +unit.minutes = 分 unit.persecond = /ç§’ -unit.perminute = /min +unit.perminute = /分 unit.timesspeed = å€ é€Ÿåº¦ unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = 盾容 unit.items = ç‰©å“ -unit.thousands = k -unit.millions = mil -unit.billions = b +unit.thousands = K +unit.millions = M +unit.billions = B +unit.pershot = /å‘ +category.purpose = ä»‹ç» category.general = 普通 category.power = èƒ½é‡ category.liquids = 液体 category.items = ç‰©å“ category.crafting = 制造 -category.shooting = å‘å°„ +category.function = 功能 category.optional = å¯é€‰çš„增强 setting.landscape.name = é”å®šæ¨ªå± setting.shadows.name = å½±å­ setting.blockreplace.name = 自动推èåˆé€‚的建筑 setting.linear.name = 抗锯齿 setting.hints.name = æç¤º -setting.flow.name = 显示资æºä¼ é€é€Ÿåº¦[scarlet] (实验性) +setting.logichints.name = é€»è¾‘ä»£ç æç¤º +setting.flow.name = 显示资æºä¼ é€é€Ÿåº¦[scarlet] +setting.backgroundpause.name = åœ¨èƒŒæ™¯ä¸­æš‚åœ setting.buildautopause.name = 自动暂åœå»ºé€  -setting.mapcenter.name = 地图自动居中 setting.animatedwater.name = æµåŠ¨çš„æ°´ setting.animatedshields.name = 动æ€ç”»é¢ setting.antialias.name = 抗锯齿 @@ -707,24 +818,22 @@ setting.conveyorpathfinding.name = ä¼ é€å¸¦è‡ªåŠ¨å¯»è·¯ setting.sensitivity.name = æŽ§åˆ¶å™¨çµæ•度 setting.saveinterval.name = 自动ä¿å­˜é—´éš” setting.seconds = {0} ç§’ -setting.blockselecttimeout.name = 建筑选择超时 setting.milliseconds = {0} 毫秒 setting.fullscreen.name = å…¨å± setting.borderlesswindow.name = 无边界窗å£[lightgray](å¯èƒ½éœ€è¦é‡å¯ï¼‰ setting.fps.name = 显示 FPS 和网络延迟 setting.smoothcamera.name = 镜头平滑 -setting.blockselectkeys.name = 显示建筑选择按键 setting.vsync.name = åž‚ç›´åŒæ­¥ -setting.pixelate.name = åƒç´ ç”»é¢ [lightgray](ç¦ç”¨åŠ¨ç”»ï¼‰ +setting.pixelate.name = åƒç´ ç”»é¢ [lightgray] setting.minimap.name = 显示å°åœ°å›¾ -setting.coreitems.name = 显示核心 (å¼€å‘中) +setting.coreitems.name = 显示核心物资 setting.position.name = æ˜¾ç¤ºçŽ©å®¶åæ ‡ setting.musicvol.name = 音ä¹éŸ³é‡ -setting.atmosphere.name = Show Planet Atmosphere +setting.atmosphere.name = 显示行星大气层 setting.ambientvol.name = çŽ¯å¢ƒéŸ³é‡ -setting.mutemusic.name = æ— éŸ³ä¹ +setting.mutemusic.name = ç¦ç”¨éŸ³ä¹ setting.sfxvol.name = éŸ³æ•ˆéŸ³é‡ -setting.mutesound.name = 无音效 +setting.mutesound.name = ç¦ç”¨éŸ³æ•ˆ setting.crashreport.name = å‘é€åŒ¿å的崩溃报告 setting.savecreate.name = 自动创建存档 setting.publichost.name = 游æˆå…¬å¼€å¯è§ @@ -733,7 +842,9 @@ setting.chatopacity.name = èŠå¤©ç•Œé¢ä¸é€æ˜Žåº¦ setting.lasersopacity.name = èƒ½é‡æ¿€å…‰ä¸é€æ˜Žåº¦ setting.bridgeopacity.name = æ¡¥æ¢ä¸é€æ˜Žåº¦ setting.playerchat.name = 显示玩家èŠå¤©æ°”泡 +setting.showweather.name = 显示天气效果 public.confirm = 确定使您的游æˆå…¬å¼€å¯è§ï¼Ÿ\n[accent]其他人将å¯ä»¥åŠ å…¥åˆ°æ‚¨çš„æ¸¸æˆã€‚\n[lightgray]您之åŽå¯ä»¥åœ¨ 设置->游æˆ->游æˆå…¬å¼€å¯è§ 更改。 +public.confirm.really = å¦‚æžœæ‚¨æƒ³ä¸Žæœ‹å‹æ¸¸çŽ©ï¼Œå¯ä»¥ä½¿ç”¨[green]邀请朋å‹[]è€Œä¸æ˜¯[scarlet]公开游æˆ[]ï¼\n您确定è¦ä½¿æ¸¸æˆ[scarlet]公开å¯è§[]å—? public.beta = 请注æ„,测试版的游æˆä¸èƒ½å…¬å¼€å¯è§ã€‚ uiscale.reset = UI 缩放比例已更改。\næŒ‰ä¸‹â€œç¡®å®šâ€æ¥æ‰§è¡Œç¼©æ”¾æ¯”例的更改。\n[accent]{0}[]ç§’åŽ[scarlet]将自动退出并还原设置。 uiscale.cancel = å–æ¶ˆå¹¶é€€å‡º @@ -743,25 +854,25 @@ keybinds.mobile = [scarlet]这里的大多数按键绑定在移动设备上都 category.general.name = 常规 category.view.name = 视图 category.multiplayer.name = 多人 -category.blocks.name = Block Select +category.blocks.name = é€‰æ‹©æ–¹å— command.attack = 攻击 command.rally = é›†åˆ command.retreat = 撤退 -command.idle = Idle +command.idle = 闲置 placement.blockselectkeys = \n[lightgray]按键:[{0}, keybind.respawn.name = é‡ç”Ÿ -keybind.control.name = Control Unit +keybind.control.name = 控制å•ä½ keybind.clear_building.name = 清除建筑 keybind.press = 请按一个键… keybind.press.axis = 请按一个轴或键… keybind.screenshot.name = 地图截图 -keybind.toggle_power_lines.name = 显éšèƒ½é‡æ ‡è¯†çº¿ -keybind.toggle_block_status.name = æ˜¾éšæ–¹å—çŠ¶æ€ +keybind.toggle_power_lines.name = 显示/éšè—èƒ½é‡æ ‡è¯†çº¿ +keybind.toggle_block_status.name = 显示/éšè—æ–¹å—çŠ¶æ€ keybind.move_x.name = 水平移动 keybind.move_y.name = 竖直移动 keybind.mouse_move.name = è·Ÿéšé¼ æ ‡ -keybind.pan.name = Pan View -keybind.boost.name = æŽ¨é€ +keybind.pan.name = 平移视图 +keybind.boost.name = 推进 keybind.schematic_select.name = 选择区域 keybind.schematic_menu.name = è“图目录 keybind.schematic_flip_x.name = 水平翻转 @@ -788,15 +899,17 @@ keybind.diagonal_placement.name = 斜线建造 keybind.pick.name = 选择建筑 keybind.break_block.name = ç ´å建筑 keybind.deselect.name = å–æ¶ˆé€‰æ‹© -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = 拾å–货物 +keybind.dropCargo.name = 释放货物 +keybind.command.name = 指挥 keybind.shoot.name = 射击 keybind.zoom.name = 缩放 keybind.menu.name = èœå• keybind.pause.name = æš‚åœ keybind.pause_building.name = æš‚åœ/继续建造 keybind.minimap.name = å°åœ°å›¾ +keybind.planet_map.name = 行星地图 +keybind.research.name = 研究 keybind.chat.name = èŠå¤© keybind.player_list.name = 玩家列表 keybind.console.name = æŽ§åˆ¶å° @@ -806,6 +919,7 @@ keybind.toggle_menus.name = 显éšé€‰é¡¹ keybind.chat_history_prev.name = èŠå¤©è®°å½•å‘å‰ keybind.chat_history_next.name = èŠå¤©è®°å½•å‘åŽ keybind.chat_scroll.name = èŠå¤©è®°å½•滚动 +keybind.chat_mode.name = 切æ¢èŠå¤©æ¨¡å¼ keybind.drop_unit.name = æ¾å¼€å•ä½ keybind.zoom_minimap.name = å°åœ°å›¾ç¼©æ”¾ mode.help.title = 模å¼è¯´æ˜Ž @@ -822,13 +936,14 @@ mode.custom = è‡ªå®šä¹‰æ¨¡å¼ rules.infiniteresources = æ— é™èµ„æº rules.reactorexplosions = å应堆爆炸 +rules.schematic = å¯ç”¨è“图 rules.wavetimer = 波次计时器 rules.waves = 波次 rules.attack = æ”»å‡»æ¨¡å¼ -rules.buildai = AI Building +rules.buildai = AI建造 rules.enemyCheat = 敌人(红队)无é™èµ„æº rules.blockhealthmultiplier = å»ºç­‘ç”Ÿå‘½å€æ•° -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = å»ºç­‘ä¼¤å®³å€æ•° rules.unitbuildspeedmultiplier = å•ä½ç”Ÿäº§é€Ÿåº¦å€æ•° rules.unithealthmultiplier = å•ä½ç”Ÿå‘½å€æ•° rules.unitdamagemultiplier = å•ä½ä¼¤å®³å€æ•° @@ -839,34 +954,38 @@ rules.buildspeedmultiplier = å»ºè®¾æ—¶é—´å€æ•° rules.deconstructrefundmultiplier = æ‹†é™¤è¿”è¿˜å€æ•° rules.waitForWaveToEnd = 等待敌人时间 rules.dropzoneradius = 敌人出生点ç¦åŒºå¤§å°ï¼š[lightgray](格) -rules.unitammo = Units Require Ammo +rules.unitammo = å•使¶ˆè€—å­å¼¹ rules.title.waves = 波次 rules.title.resourcesbuilding = 资æºå’Œå»ºé€  rules.title.enemy = 敌人 rules.title.unit = å•ä½ rules.title.experimental = 实验性 -rules.title.environment = Environment +rules.title.environment = 环境性 rules.lighting = 光照 -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = å•ä½å…‰ç…§ +rules.fire = ç«ç„° +rules.explosions = 建筑/å•ä½çˆ†ç‚¸ä¼¤å®³ rules.ambientlight = 环境光 -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = 气候 +rules.weather.frequency = 频率: +rules.weather.always = æŒç»­ +rules.weather.duration = æ—¶é•¿: content.item.name = ç‰©å“ content.liquid.name = 液体 content.unit.name = 部队 content.block.name = å— +content.sector.name = 区域 + item.copper.name = 铜 item.lead.name = é“… -item.coal.name = ç…¤ +item.coal.name = 煤炭 item.graphite.name = 石墨 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 = æ²™ @@ -879,79 +998,64 @@ liquid.slag.name = 矿渣 liquid.oil.name = 石油 liquid.cryofluid.name = 冷冻液 -item.explosiveness = [lightgray]爆炸性:{0}% -item.flammability = [lightgray]易燃性:{0}% -item.radioactivity = [lightgray]放射性:{0}% - -unit.health = [lightgray]生命值:{0} -unit.speed = [lightgray]速度:{0} -unit.weapon = [lightgray]武器{0} -unit.itemcapacity = [lightgray]物å“容é‡ï¼š{0} -unit.minespeed = [lightgray]采矿速度:{0}% -unit.minepower = [lightgray]采矿力é‡ï¼š{0} -unit.ability = [lightgray]能力:{0} -unit.buildspeed = [lightgray]建造速度:{0}% - -liquid.heatcapacity = [lightgray]热容é‡ï¼š{0} -liquid.viscosity = [lightgray]粘度:{0} -liquid.temperature = [lightgray]温度:{0} - unit.dagger.name = 尖刀 -unit.mace.name = Mace +unit.mace.name = 战锤 unit.fortress.name = å ¡åž’ -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = 爬行者 -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.nova.name = 新星 +unit.pulsar.name = æ’æ˜Ÿ +unit.quasar.name = 耀星 +unit.crawler.name = 爬虫 +unit.atrax.name = 毒蛛 +unit.spiroct.name = 血蛭 +unit.arkyid.name = 毒蛊 +unit.toxopid.name = å¤©èŽ +unit.flare.name = 星辉 +unit.horizon.name = 天垠 +unit.zenith.name = è‹ç©¹ +unit.antumbra.name = 月影 +unit.eclipse.name = 日蚀 +unit.mono.name = 独影 +unit.poly.name = 幻型 +unit.mega.name = å·¨åƒ +unit.quad.name = 雷霆 +unit.oct.name = è¦å¡ž +unit.risso.name = 梭鱼 +unit.minke.name = 飞鲨 +unit.bryde.name = 戟鲸 +unit.sei.name = 蛟龙 +unit.omura.name = 海神 +unit.alpha.name = 阿尔法 +unit.beta.name = è´å¡” +unit.gamma.name = 伽马 +unit.scepter.name = æƒæ– +unit.reign.name = 王座 +unit.vela.name = ç¾æ˜Ÿ +unit.corvus.name = 死星 -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax +block.resupply-point.name = 补给点 +block.parallax.name = å·®æ‰°å…‰æŸ block.cliff.name = 悬崖 -block.sand-boulder.name = 沙砂巨石 +block.sand-boulder.name = 砂岩 +block.basalt-boulder.name = 玄武岩巨石 block.grass.name = è‰åœ° block.slag.name = 矿渣 +block.space.name = 太空 block.salt.name = ç›ç¢±åœ° -block.salt-wall.name = Salt Wall +block.salt-wall.name = ç›å¢™ block.pebbles.name = é¹…åµçŸ³ block.tendrils.name = å·é¡» -block.sand-wall.name = Sand Wall +block.sand-wall.name = 沙墙 block.spore-pine.name = 孢孿 ‘ -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = å­¢å­å¢™ +block.boulder.name = 巨石 +block.snow-boulder.name = 雪石 block.snow-pine.name = 雪树 block.shale.name = 页岩地 block.shale-boulder.name = 页岩巨石 block.moss.name = 苔藓地 block.shrubs.name = çŒæœ¨ä¸› block.spore-moss.name = å­¢å­è‹”藓地 -block.shale-wall.name = Shale Wall +block.shale-wall.name = 页岩墙 block.scrap-wall.name = 废墙 block.scrap-wall-large.name = 大型废墙 block.scrap-wall-huge.name = 巨型废墙 @@ -962,9 +1066,9 @@ block.graphite-press.name = 石墨压缩机 block.multi-press.name = 多é‡åŽ‹ç¼©æœº block.constructing = {0}\n[lightgray](建造中) block.spawn.name = 敌人出生点 -block.core-shard.name = å°åž‹æ ¸å¿ƒ -block.core-foundation.name = 中型核心 -block.core-nucleus.name = 大型核心 +block.core-shard.name = åˆä»£æ ¸å¿ƒ +block.core-foundation.name = 次代核心 +block.core-nucleus.name = 终代核心 block.deepwater.name = 深水 block.water.name = æ°´ block.tainted-water.name = 污水 @@ -979,17 +1083,18 @@ block.craters.name = é™¨çŸ³å‘ block.sand-water.name = æ²™ æ°´ block.darksand-water.name = æš—æ²™ æ°´ block.char.name = 焦土 -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = 英安岩 +block.dacite-wall.name = 英安岩墙 +block.dacite-boulder.name = 英安巨岩 block.ice-snow.name = 冰雪地 -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = 石墙 +block.ice-wall.name = 冰墙 +block.snow-wall.name = 雪墙 +block.dune-wall.name = 沙丘岩 block.pine.name = æ¾æ ‘ -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = 泥土 +block.dirt-wall.name = 泥土墙 +block.mud.name = 泥巴 block.white-tree-dead.name = 枯èŽçš„白树 block.white-tree.name = 白树 block.spore-cluster.name = å­¢å­ç°‡ @@ -1005,7 +1110,7 @@ block.dark-panel-4.name = æš—é¢æ¿4 block.dark-panel-5.name = æš—é¢æ¿5 block.dark-panel-6.name = æš—é¢æ¿6 block.dark-metal.name = 暗金属 -block.basalt.name = Basalt +block.basalt.name = 玄武岩 block.hotrock.name = 热石头 block.magmarock.name = 岩浆石头 block.copper-wall.name = 铜墙 @@ -1014,8 +1119,8 @@ block.titanium-wall.name = 钛墙 block.titanium-wall-large.name = 大型钛墙 block.plastanium-wall.name = 塑钢墙 block.plastanium-wall-large.name = 大型塑钢墙 -block.phase-wall.name = 相织布墙 -block.phase-wall-large.name = 大型相织物墙 +block.phase-wall.name = 相ä½ç‰©å¢™ +block.phase-wall-large.name = 大型相ä½ç‰©å¢™ block.thorium-wall.name = é’墙 block.thorium-wall-large.name = 大型é’墙 block.door.name = é—¨ @@ -1029,7 +1134,6 @@ block.conveyor.name = ä¼ é€å¸¦ block.titanium-conveyor.name = 钛传é€å¸¦ block.plastanium-conveyor.name = 塑钢传é€å¸¦ block.armored-conveyor.name = 装甲传é€å¸¦ -block.armored-conveyor.description = è¿é€ç‰©å“,与钛传é€å¸¦ä¸€æ ·çš„速度,但有更强的装甲。除其他传é€å¸¦ï¼Œä¸æŽ¥å—任何边的输入。 block.junction.name = 连接器 block.router.name = 路由器 block.distributor.name = 分é…器 @@ -1037,11 +1141,10 @@ block.sorter.name = 分类器 block.inverted-sorter.name = åå‘分类器 block.message.name = ä¿¡æ¯æ¿ block.illuminator.name = 照明器 -block.illuminator.description = å°åž‹ã€ç´§å‡‘ã€å¯é…置的光æºã€‚需è¦èƒ½é‡è¿è¡Œã€‚ block.overflow-gate.name = 溢æµé—¨ block.underflow-gate.name = å呿º¢æµé—¨ block.silicon-smelter.name = 硅冶炼厂 -block.phase-weaver.name = 相织物编织器 +block.phase-weaver.name = 相ä½ç‰©ç¼–织器 block.pulverizer.name = 粉碎机 block.cryofluid-mixer.name = 冷冻液混åˆå™¨ block.melter.name = 熔炉 @@ -1075,21 +1178,22 @@ block.power-source.name = æ— é™èƒ½æº block.unloader.name = 装å¸å™¨ block.vault.name = 仓库 block.wave.name = 波浪 +block.tsunami.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.pyratite-mixer.name = ç¡«æ··åˆå™¨ -block.blast-mixer.name = 爆炸混åˆå™¨ +block.pyratite-mixer.name = 硫化物混åˆå™¨ +block.blast-mixer.name = 爆炸物混åˆå™¨ block.solar-panel.name = å¤ªé˜³èƒ½æ¿ block.solar-panel-large.name = å¤§åž‹å¤ªé˜³èƒ½æ¿ block.oil-extractor.name = 石油钻井 block.repair-point.name = 维修点 block.pulse-conduit.name = 脉冲导管 block.plated-conduit.name = 电镀导管 -block.phase-conduit.name = 相织物导管桥 +block.phase-conduit.name = 相ä½ç‰©å¯¼ç®¡æ¡¥ block.liquid-router.name = 液体路由器 block.liquid-tank.name = å‚¨æ¶²ç½ block.liquid-junction.name = 液体交å‰å™¨ @@ -1101,12 +1205,12 @@ block.blast-drill.name = 爆破钻头 block.thermal-pump.name = 热能泵 block.thermal-generator.name = 热能å‘电机 block.alloy-smelter.name = åˆé‡‘冶炼厂 -block.mender.name = ä¿®ç†è€… +block.mender.name = ä¿®å¤å™¨ block.mend-projector.name = ä¿®ç†æŠ•å½±å™¨ block.surge-wall.name = 波动墙 block.surge-wall-large.name = 大型波动墙 -block.cyclone.name = 气旋炮 -block.fuse.name = 雷光炮 +block.cyclone.name = 气旋 +block.fuse.name = é›·å…‰ block.shock-mine.name = 脉冲地雷 block.overdrive-projector.name = 超速投影器 block.force-projector.name = 力墙投影器 @@ -1114,31 +1218,38 @@ block.arc.name = 电弧 block.rtg-generator.name = RTG å‘电机 block.spectre.name = å¹½çµ block.meltdown.name = ç†”æ¯ +block.foreshadow.name = 厄兆 block.container.name = 容器 block.launch-pad.name = å‘å°„å° block.launch-pad-large.name = 大型å‘å°„å° -block.segment.name = 分割机 -block.command-center.name = Command Center -block.ground-factory.name = 地é¢å·¥åŽ‚ -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.segment.name = è£‚è§£å…‰æŸ +block.command-center.name = 指挥中心 +block.ground-factory.name = 陆军工厂 +block.air-factory.name = 空军工厂 +block.naval-factory.name = 海军工厂 +block.additive-reconstructor.name = 数增级å•ä½é‡æž„工厂 +block.multiplicative-reconstructor.name = å€ä¹˜çº§å•ä½é‡æž„工厂 +block.exponential-reconstructor.name = 多幂级å•ä½é‡æž„工厂 +block.tetrative-reconstructor.name = æ— é‡çº§å•ä½é‡æž„工厂 +block.payload-conveyor.name = è½½è·ä¼ é€å¸¦ +block.payload-router.name = è½½è·è·¯ç”±å™¨ +block.disassembler.name = 解离机 +block.silicon-crucible.name = 热能å©åŸš +block.overdrive-dome.name = 超速穹顶投射器 +#experimental, may be removed +block.block-forge.name = æ–¹å—熔炉 +block.block-loader.name = æ–¹å—装载机 +block.block-unloader.name = æ–¹å—å¸è½½æœº +block.interplanetary-accelerator.name = 行星际加速器 -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = 开关 +block.micro-processor.name = 微型处ç†å™¨ +block.logic-processor.name = 逻辑处ç†å™¨ +block.hyper-processor.name = 超核处ç†å™¨ +block.logic-display.name = é€»è¾‘æ˜¾ç¤ºå± +block.large-logic-display.name = å¤§åž‹é€»è¾‘æ˜¾ç¤ºå± +block.memory-cell.name = 内存元 +block.memory-bank.name = 内存库 team.blue.name = è“ team.crux.name = 红 @@ -1148,158 +1259,390 @@ team.derelict.name = ç° team.green.name = 绿 team.purple.name = ç´« -tutorial.next = [lightgray]<点击以继续> -tutorial.intro = 您已进入[scarlet] Mindustry 教程[]。[]\n使用[accent][[WASD][]键移动机甲和视角。\n[accent]按ä½[[Ctrl]并转动鼠标滚轮[]缩放视野。\n让我们从[accent]采集铜矿[]开始。先移动到铜矿æ—边,然åŽç‚¹æŒ‰çŸ¿è„‰é™„è¿‘æ•£è½çš„矿物。\n\n[accent]{0}/{1} 铜 -tutorial.intro.mobile = 您已进入[scarlet] Mindustry 教程[]。\n在å±å¹•上滑动æ¥ç»§ç»­ã€‚\n[accent]åŒæŒ‡æåˆ[] æ¥ç¼©å°å’Œæ”¾å¤§ã€‚\n让我们从[accent]采集铜矿[]开始。先移动到铜矿æ—边,然åŽç‚¹æŒ‰çŸ¿è„‰é™„è¿‘æ•£è½çš„矿物。\n\n[accent]铜 {0}/{1} -tutorial.drill = 手动采矿效率ä¸é«˜ã€‚\n[accent]钻头[]å¯ä»¥è‡ªåŠ¨é‡‡çŸ¿ã€‚\n让我们在在铜矿上放一个。\n点击å³ä¸‹è§’的钻头èœå•。\n选择[accent]机械钻头[]。\nå•击将其放置在铜矿上。\n[accent]å³é”®å•击[]æ¥åœæ­¢ã€‚ -tutorial.drill.mobile = 手动采矿效率ä¸é«˜ã€‚\n[accent]钻头[]å¯ä»¥è‡ªåŠ¨é‡‡çŸ¿ã€‚\n点å³ä¸‹è§’的钻头èœå•。\n选择[accent]机械钻头[]。\n点一下将其放在铜矿上,点[accent]对å·[]æ¥ç¡®å®šã€‚\n点[accent]å‰å·[]æ¥å–消。 -tutorial.blockinfo = æ¯ç§é’»å¤´éƒ½æœ‰å…¶ç‹¬ç‰¹çš„æ•°æ®ã€‚æ¯ä¸ªé’»å¤´åªèƒ½å¼€é‡‡éƒ¨åˆ†çŸ¿çŸ³ã€‚\nè‹¥è¦æŸ¥çœ‹å»ºç­‘的详细信æ¯ï¼Œ[accent]在èœå•中点击问å·ã€‚[]\n\n[accent]现在查看机械钻头的数æ®å§ã€‚[] -tutorial.conveyor = [accent]ä¼ é€å¸¦[]å¯ä»¥æŠŠç‰©èµ„ä¼ é€åˆ°æ ¸å¿ƒã€‚\n请在钻头到核心间建造一æ¡ä¼ é€å¸¦ã€‚ -tutorial.conveyor.mobile = [accent]ä¼ é€å¸¦[]å¯ä»¥æŠŠç‰©èµ„ä¼ é€åˆ°æ ¸å¿ƒã€‚\n请在钻头到核心间建造一æ¡ä¼ é€å¸¦ã€‚\n[accent]长按数秒[]å¹¶å‘ä¸€ä¸ªæ–¹å‘æ‹–动æ¥ç›´çº¿æ”¾ç½®ã€‚\n\n[accent]{0}/{1} æ¡ä¼ é€å¸¦\n[accent]0/1 ç‰©å“ -tutorial.turret = 必须建造防御建筑æ¥å‡»é€€[lightgray]敌人[]。\n请在核心附近造一个åŒç®¡ç‚®ã€‚ -tutorial.drillturret = åŒç®¡ç‚®éœ€è¦[accent]铜[]ä½œå¼¹è¯æ¥å°„击。\nå¯ä»¥æ”¾ä¸€ä¸ªé’»å¤´åœ¨ç‚®å¡”附近供应铜。 -tutorial.pause = 在战斗中,您å¯ä»¥[accent]æš‚åœæ¸¸æˆ[]。\næš‚åœæ—¶æ‚¨å¯ä»¥è§„划建筑物。\n\n按[accent]空格[]æš‚åœã€‚ -tutorial.pause.mobile = 在战斗中,您å¯ä»¥[accent]æš‚åœæ¸¸æˆ[]。\næš‚åœæ—¶æ‚¨å¯ä»¥è§„划建筑物。\n\n[accent]点击左上角的按钮以暂åœã€‚ -tutorial.unpause = çŽ°åœ¨å†æ¬¡æŒ‰ç©ºæ ¼ä»¥ç»§ç»­ã€‚ -tutorial.unpause.mobile = çŽ°åœ¨å†æ¬¡ç‚¹æŒ‰ä»¥ç»§ç»­ã€‚ -tutorial.breaking = 建筑ç»å¸¸éœ€è¦æ‹†é™¤ã€‚\n[accent]按ä½é¼ æ ‡å³é”®[]æ¥æ‹†é™¤é€‰ä¸­çš„建筑。[]\n\n[accent]ä½¿ç”¨èŒƒå›´æ‹†é™¤æ¥æ‹†é™¤æ ¸å¿ƒå·¦ä¾§çš„废墙。 -tutorial.breaking.mobile = 建筑ç»å¸¸éœ€è¦æ‹†é™¤ã€‚\n[accent]选择拆除模å¼[],点击建筑以拆除。\n[accent]长按几秒[]并拖动æ¥èŒƒå›´æ‹†é™¤ã€‚\nç‚¹å‡»å¯¹å·æ¥ç¡®å®šã€‚\n\n[accent]ä½¿ç”¨èŒƒå›´æ‹†é™¤æ¥æ‹†é™¤æ ¸å¿ƒå·¦ä¾§çš„废墙。 -tutorial.withdraw = 有时,从建筑中å–å‡ºç‰©å“æ˜¯å¿…è¦çš„。\n[accent]点击包å«ç‰©å“的建筑[],然åŽ[accent]点击在方框中的物å“[]。\nå¯ä»¥é€šè¿‡[accent]点击或长按[]æ¥å–出物å“。\n\n[accent]从核心中å–出一些铜[]。 -tutorial.deposit = 将物å“从机甲拖å‘å»ºç­‘æ¥æ”¾ä¸‹ç‰©å“。\n\n[accent]将铜放回核心[]。 -tutorial.waves = [lightgray]敌人[]æ¥äº†ã€‚\n\nä¿æŠ¤æ ¸å¿ƒï¼Œé˜²å¾¡ä¸¤æ³¢æ”»å‡»ã€‚é€ æ›´å¤šçš„ç‚®å¡”ã€‚[accent]点击[]以射击。\n建造更多的炮塔和钻头,并采更多的矿。 -tutorial.waves.mobile = [lightgray]敌人[]æ¥äº†ã€‚\n\nä¿æŠ¤æ ¸å¿ƒï¼Œé˜²å¾¡ä¸¤æ³¢æ”»å‡»ã€‚é€ æ›´å¤šçš„ç‚®å¡”ã€‚ä½ çš„æœºç”²å°†å¯¹æ•Œäººè‡ªåŠ¨å¼€ç«ã€‚\n建造更多的炮塔和钻头,并采更多的矿。 -tutorial.launch = 进入特定波次åŽï¼Œä½ å¯ä»¥[accent]å‘射核心(起飞)[],[accent]带走核心中的所有资æº[]并抛下所有的建筑。\n装è¿çš„资æºå¯ç”¨äºŽç ”究科技。\n\n[accent]点击å‘射按钮。 +hint.skip = 跳过 +hint.desktopMove = 使用[accent][[WASD][]æ¥ç§»åЍ. +hint.zoom = 滚动[accent]鼠标滚轮[]放大或缩å°. +hint.mine = 移动到\uf8c4 铜矿附近并[accent]点按[]进行手动开采. +hint.desktopShoot = [accent][[鼠标左键][]射击. +hint.depositItems = è¦è½¬ç§»ç‰©å“,请将其从飞船上拖到核心。 +hint.respawn = è¦äºŽæ ¸å¿ƒä¸­é‡ç”Ÿï¼Œè¯·æŒ‰[accent][[V][]. +hint.respawn.mobile = æ‚¨å·²åˆ‡æ¢æŽ§åˆ¶å•å…ƒ/结构. 如果è¦é‡ç”Ÿé£žèˆ¹ï¼Œè¯·[accent]点击左上方的图标(您的å•å…ƒ/结构图标).[] +hint.desktopPause = 按[accent][[Space][]æš‚åœå’Œå–æ¶ˆæš‚åœæ¸¸æˆ. +hint.placeDrill = 选择å³ä¸‹è§’èœå•中的\ue85e [accent]钻头[]分类,然åŽé€‰æ‹©ä¸€ä¸ª\uf870 [accent]钻头[]ç„¶åŽå•击铜矿将其放置. +hint.placeDrill.mobile = 选择å³ä¸‹è§’èœå•中的\ue85e [accent]钻头[]分类,然åŽé€‰æ‹©ä¸€ä¸ª\uf870 [accent]钻头[],然åŽç‚¹å‡»é“œçŸ¿å°†å…¶æ”¾ç½®.\n\n点击å³ä¸‹è§’\ue800 [accent]å¤é€‰æ ‡è®°[]以确认. +hint.placeConveyor = ä¼ é€å¸¦å°†ç‰©å“从钻头移到其他方å—中。从\ue814 [accent]布局[]分类选择\uf896 [accent]ä¼ é€å¸¦[].\n\nå•击并拖动以放置多个传é€å¸¦.\n[accent]滚动[]以旋转. +hint.placeConveyor.mobile = ä¼ é€å¸¦å°†ç‰©å“从钻头移到其他å—中。从\ue814 [accent]布局[]分类选择\uf896 [accent]ä¼ é€å¸¦[].\n\né•¿æŒ‰ä¸€ç§’é’Ÿï¼Œç„¶åŽæ‹–动以放置多个传é€å¸¦. +hint.placeTurret = 放置\uf861 [accent]炮塔[]以抵御敌人,ä¿å«ä½ çš„æ ¸å¿ƒ.\n\n炮塔需è¦å¼¹è¯-\uf838 铜.\n使用传é€å¸¦å’Œé’»å¤´ä¸ºå®ƒä»¬ä¾›å¼¹ã€‚ +hint.breaking = [accent]å³å‡»[]并拖动以拆除方å—. +hint.breaking.mobile = 点击在å³ä¸‹è§’çš„\ue817 [accent]锤å­[]点击以拆除方å—.\n\næŒ‰ä½æ‰‹æŒ‡ä¸€ç§’é’Ÿï¼Œç„¶åŽæ‹–动并选择. +hint.research = 点击\ue875 [accent]科技树[]按钮研究新技术. +hint.research.mobile = 点击在\ue88c [accent]èœå•[]中的\ue875 [accent]科技树[]按钮以研究新技术. +hint.unitControl = 按ä½[accent][[L-ctrl][]å¹¶[accent]点击[]å‹å†›å•使ˆ–炮塔æ¥è¿›è¡ŒæŽ§åˆ¶ã€‚ +hint.unitControl.mobile = [accent][åŒå‡»][]å‹å†›å•使ˆ–炮塔æ¥è¿›è¡ŒæŽ§åˆ¶ã€‚ +hint.launch = 一旦收集到足够的资æºï¼Œæ‚¨å°±å¯ä»¥é€šè¿‡ä»Žå³ä¸‹è§’çš„\ue827 [accent]地图[]选择附近的区域[accent]å‘å°„[]核心. +hint.launch.mobile = 一旦收集到足够的资æºï¼Œæ‚¨å°±å¯ä»¥é€šè¿‡åœ¨\ue88c [accent]èœå•[]çš„\ue827 [accent]地图[]选择附近的区域[accent]å‘å°„[]核心. +hint.schematicSelect = 按ä½[accent][[F][]并拖动以选择è¦å¤åˆ¶å’Œç²˜è´´çš„å—.\n\n[accent][鼠标中键][]å¤åˆ¶å•个å—类型. +hint.conveyorPathfind = 按ä½[accent][[L-Ctrl][]拖动传é€å¸¦å¹¶ä½¿å…¶è‡ªåŠ¨å¯»è·¯. +hint.conveyorPathfind.mobile = å¯ç”¨\ue844 [accent]ä¼ é€å¸¦è‡ªåŠ¨å¯»è·¯[]并拖动,传é€å¸¦ä¼šè‡ªåŠ¨ç”Ÿæˆè·¯å¾„. +hint.boost = 按ä½[accent][[L-Shift][]用当å‰å•ä½é£žè¶Šéšœç¢ç‰©.\n\nä½†åªæœ‰å°‘数地é¢å•使œ‰åŠ©æŽ¨å™¨. +hint.command = 按ä½[accent][[G][]指挥附近的å•ä½ç¼–队. +hint.command.mobile = [accent][[åŒå‡»][]您的部队指挥附近的部队编队. +hint.payloadPickup = 按[accent][[[]æ¡èµ·å°æ–¹å—或å•ä½. +hint.payloadPickup.mobile = [accent]é•¿æŒ‰ä¸€ä¸ªå°æ–¹å—或一个å•使¥æ¡èµ·æ¥. +hint.payloadDrop = 按[accent]][]放下有效载è·. +hint.payloadDrop.mobile = [accent]点ä½[]一个空的ä½ç½®å°†æœ‰æ•ˆè½½è·ä¸¢åˆ°é‚£é‡Œ. +hint.waveFire = [accent]波浪[]炮塔加水弹è¯ä¼šè‡ªåŠ¨æ‰‘ç­é™„è¿‘çš„ç«. +hint.generator = \uf879 [accent]燃烧å‘电机[]燃烧煤炭并将电力传输到相邻方å—.\n\n用\uf87f [accent]能é‡èŠ‚ç‚¹[]å¯ä»¥æ‰©å±•电力传输范围. +hint.guardian = [accent]Boss[]å•ä½è£…甲厚é‡.[accent]铜[]å’Œ[accent]é“…[]这类较弱的å­å¼¹å¯¹å…¶[scarlet]作用ä¸ä½³[].\n\n使用高级别炮塔或使用\uf835 [accent]石墨[]作为\uf861 åŒç®¡ç‚®åŠ\uf859 é½å°„ç‚®çš„å¼¹è¯æ¥æ¶ˆç­Boss. +hint.coreUpgrade = 核心å¯ä»¥é€šè¿‡[accent]在上é¢è¦†ç›–高等级核心[]è¿›è¡Œå‡çº§ã€‚\n\n在[accent]åˆä»£æ ¸å¿ƒ[]上放置一个[accent]次代核心[]。确ä¿å‘¨å›´æ²¡æœ‰éšœç¢ç‰©ã€‚ +hint.presetLaunch = ç°è‰²çš„[accent]é™è½åœ°åŒº[],如[accent]冰冻森林[],å¯ä»¥ä»Žä»»ä½•区域å‘射,ä¸éœ€è¦å é¢†é™„近的区å—。\n\n[accent]æ•°å­—ç¼–å·çš„区域[],如这个,是[accent]å¯é€‰çš„[]。 +hint.coreIncinerate = 核心存满一ç§ç‰©å“åŽï¼Œå†è¿›å…¥çš„åŒç§ç‰©å“会被[accent]æ‘§æ¯[]。 +hint.coopCampaign = 游玩[accent]åˆä½œæˆ˜å½¹[]时,当å‰åœ°å›¾ç”Ÿäº§çš„资æºä¹Ÿä¼šè¢«é€å…¥[accent]你本地的区域[]。\n\næ–°ç§‘æŠ€ä¹Ÿä¼šåŒæ­¥è§£é”。 -item.copper.description = ä¸€ç§æœ€åŸºæœ¬çš„çš„å»ºç­‘ææ–™ã€‚在å„ç§ç±»åž‹çš„建筑中被广泛使用。 -item.lead.description = 一ç§åŸºæœ¬çš„ç”µåŠ›ææ–™ã€‚广泛用于电å­è®¾å¤‡å’Œæ¶²ä½“è¾“é€æ¨¡å—。 -item.metaglass.description = 一ç§è‡´å¯†åšç¡¬çš„å¤åˆçŽ»ç’ƒã€‚å¹¿æ³›ç”¨äºŽæ¶²ä½“è¾“é€å’Œå­˜å‚¨ã€‚ -item.graphite.description = 一ç§é«˜å¯†åº¦çš„ç¢³ææ–™ï¼Œç”¨äºŽå¼¹è¯å’Œç”µå™¨å…ƒä»¶ã€‚ -item.sand.description = 一ç§å¸¸è§çš„ææ–™ï¼Œå¹¿æ³›ç”¨äºŽå†¶ç‚¼ï¼ŒåŒ…括制作åˆé‡‘和助熔剂。 -item.coal.description = 在农耕文明å‰å°±å½¢æˆçš„æ¤ç‰©åŒ–çŸ³ï¼Œå¸¸è§ä¸”容易获得,常用作燃料或其他资æºçš„生产。 -item.titanium.description = 一ç§ç½•è§çš„超轻金属,被广泛è¿ç”¨äºŽæ¶²ä½“è¿è¾“ã€é’»å¤´å’Œé£žæœºã€‚ -item.thorium.description = 一ç§è‡´å¯†çš„æ”¾å°„性金属,用作结构支撑和核燃料。 -item.scrap.description = 一ç§åºŸå¼ƒçš„建筑物åŠåºŸå¼ƒå•ä½çš„æ®‹éª¸ï¼Œå¯Œå«å¤šç§é‡‘属元素。 -item.silicon.description = 一ç§éžå¸¸æœ‰ç”¨çš„åŠå¯¼ä½“,被用于太阳能电池æ¿å’Œå¾ˆå¤šå¤æ‚的电å­è®¾å¤‡ã€‚ -item.plastanium.description = 一ç§è½»è´¨ã€å¯å»¶å±•çš„ææ–™ï¼Œç”¨äºŽé«˜çº§çš„飞机和碎片弹è¯ã€‚ -item.phase-fabric.description = 一ç§è¿‘乎无é‡é‡çš„ç‰©è´¨ï¼Œç”¨äºŽå…ˆè¿›çš„ç”µå­æŠ€æœ¯å’Œè‡ªæˆ‘ä¿®å¤æŠ€æœ¯ã€‚ -item.surge-alloy.description = 一ç§å…ˆè¿›çš„åˆé‡‘,具有独特的电气性能。 -item.spore-pod.description = 一ç§ç”¨äºŽåˆ¶é€ çŸ³æ²¹ã€ç‚¸è¯åŠç‡ƒæ–™çš„生物质。 -item.blast-compound.description = 一ç§ç”¨äºŽç‚¸å¼¹å’Œç‚¸è¯çš„æŒ¥å‘性混åˆç‰©ã€‚虽然它å¯ä»¥ä½œä¸ºç‡ƒæ–™ï¼Œä½†ä¸å»ºè®®è¿™æ ·åšã€‚ -item.pyratite.description = 一ç§åœ¨ç‡ƒçƒ§æ­¦å™¨ä¸­ä½¿ç”¨çš„æžæ˜“ç‡ƒç‰©è´¨ã€‚ -liquid.water.description = æœ€æœ‰ç”¨çš„æ¶²ä½“ã€‚å¸¸ç”¨äºŽå†·å´æœºå™¨å’ŒåºŸç‰©å¤„ç†ã€‚ -liquid.slag.description = å„ç§ä¸åŒç±»åž‹çš„熔èžé‡‘属混åˆåœ¨ä¸€èµ·çš„æ¶²ä½“。å¯ä»¥è¢«åˆ†è§£æˆå…¶çŸ¿ç‰©æˆåˆ†ï¼Œæˆ–ä½œä¸ºæ­¦å™¨å–·å‘æ•Œæ–¹å•ä½ã€‚ -liquid.oil.description = ç”¨äºŽå…ˆè¿›ææ–™ç”Ÿäº§çš„æ¶²ä½“。å¯ä»¥è½¬æ¢æˆç…¤ä½œä¸ºç‡ƒæ–™ï¼Œæˆ–作为武器喷射和放ç«ã€‚ -liquid.cryofluid.description = 一ç§ç”±æ°´å’Œé’›åˆ¶æˆçš„æƒ°æ€§ã€æ— è…蚀性的液体。具有æžé«˜çš„热容é‡ã€‚广泛用作冷å´å‰‚。 +item.copper.description = 用于所有类型的建筑和弹è¯ã€‚ +item.copper.details = 铜。在塞普罗上的异常丰富的金属。ä¸ç»åŠ å›ºï¼Œç»“æž„ä¼šè¾ƒè„†å¼±ã€‚ +item.lead.description = 用于液体输é€å’Œç”µæ°”结构。 +item.lead.details = 致密且呈惰性。广泛用于电池中。\n注æ„:å¯èƒ½å¯¹ç”Ÿç‰©ç”Ÿå‘½ä½“æœ‰æ¯’ã€‚è™½è¯´è¿™é‡Œå·²ç»æ²¡æœ‰å¤šå°‘生物了。 +item.metaglass.description = 用于液体传输/储存结构。 +item.graphite.description = 用于电å­å…ƒä»¶å’Œç‚®å¡”å¼¹è¯ã€‚ +item.sand.description = ç”¨äºŽç”Ÿäº§å…¶ä»–ç²¾ç‚¼ææ–™ã€‚ +item.coal.description = ç”¨äºŽç‡ƒæ–™å’Œç²¾ç‚¼ææ–™ç”Ÿäº§ã€‚ +item.coal.details = 似乎是æ¤ç‰©çš„化石,在孢å­èšå‡ºçްå‰å¾ˆä¹…就形æˆäº†ã€‚ +item.titanium.description = 用于液体è¿è¾“结构ã€é’»å¤´å’Œé£žè¡Œå™¨ã€‚ +item.thorium.description = 用于è€ç”¨ç»“构和核燃料。 +item.scrap.description = 用于熔炉和粉碎机æ¥ç²¾ç‚¼æˆå…¶ä»–ææ–™ã€‚ +item.scrap.details = 旧结构和å•ä½çš„æ®‹ä½™ç‰©ã€‚ +item.silicon.description = 用于太阳能æ¿ï¼Œå¤æ‚的电气元件和追踪性弹è¯ã€‚ +item.plastanium.description = 用于先进å•ä½ã€ç»ç¼˜å’Œåˆ†è£‚性弹è¯ã€‚ +item.phase-fabric.description = 用于高级电å­è®¾å¤‡å’Œè‡ªä¿®å¤ç»“构。 +item.surge-alloy.description = 用于先进武器和å应防御结构。 +item.spore-pod.description = 用于转化æˆçŸ³æ²¹ã€çˆ†ç‚¸ç‰©å’Œç‡ƒæ–™ã€‚ +item.spore-pod.details = å­¢å­ã€‚å¯èƒ½æ˜¯äººå·¥åˆæˆçš„生命形å¼ã€‚释放对其他生物有毒的气体。æžå…·ä¾µç•¥æ€§ã€‚在æŸäº›æ¡ä»¶ä¸‹é«˜åº¦æ˜“燃。 +item.blast-compound.description = 用于炸弹和爆炸性弹è¯ã€‚ +item.pyratite.description = 用于燃烧武器和燃烧燃料å‘电机。 +liquid.water.description = ç”¨äºŽå†·å´æœºå™¨å’ŒåºŸç‰©å¤„ç†ã€‚ +liquid.slag.description = 在分离器中æç‚¼æˆé‡‘属æˆåˆ†ï¼Œæˆ–作为武器弹è¯å–·å‘敌人。 +liquid.oil.description = ç”¨äºŽå…ˆè¿›ææ–™ç”Ÿäº§å’Œç‡ƒçƒ§å¼¹è¯ã€‚ +liquid.cryofluid.description = 用作å应堆ã€ç‚®å¡”和工厂的冷å´å‰‚。 + +block.resupply-point.description = 为附近的部队æä¾›é“œå¼¹è¯ã€‚与需è¦ç”µæ± ä¾›ç”µçš„设备ä¸å…¼å®¹ã€‚ +block.armored-conveyor.description = å‘剿–¹ç§»åŠ¨ç‰©å“ã€‚ä¸æŽ¥å—边上的输入。 +block.illuminator.description = 释放光æºã€‚ block.message.description = ä¿å­˜ä¸€æ¡æ–‡å­—ä¿¡æ¯ã€‚用于队å‹ä¹‹é—´è¿›è¡Œäº¤æµã€‚ -block.graphite-press.description = 将煤å—压缩æˆçº¯çŸ³å¢¨ç‰‡ææ–™ã€‚ -block.multi-press.description = 石墨压缩机的å‡çº§ç‰ˆã€‚利用水和电力快速高效地处ç†ç…¤ç‚­ã€‚ -block.silicon-smelter.description = 用高纯度的焦炭æ¥åŠ å·¥æ²™å­ä»¥ç”Ÿäº§ç¡…。 -block.kiln.description = 将铅和沙å­ç†”炼æˆé’¢åŒ–玻璃,需è¦å°‘é‡ç”µåŠ›ã€‚ +block.graphite-press.description = 将煤炭压缩为石墨。 +block.multi-press.description = å°†ç…¤ç‚­åŽ‹ç¼©ä¸ºçŸ³å¢¨ã€‚éœ€è¦æ°´è¿›è¡Œå†·å´ã€‚ +block.silicon-smelter.description = 将沙和煤炭精炼为硅。 +block.kiln.description = 将沙和铅熔炼为钢化玻璃。 block.plastanium-compressor.description = 用石油和钛生产塑钢。 -block.phase-weaver.description = 用放射性é’å’Œå¤§é‡æ²™å­ç”Ÿäº§ç›¸ç»‡ç‰©ã€‚ -block.alloy-smelter.description = 用钛ã€é“…ã€ç¡…和铜生产巨浪åˆé‡‘。 -block.cryofluid-mixer.description = 将水和细的钛粉混æˆå†·å´æ¶²ã€‚é’å应堆的必备之物。 -block.blast-mixer.description = ç”¨æ²¹æ–™å°†ç¡«è½¬åŒ–ä¸ºä¸æ˜“燃但更具爆炸性的爆炸化åˆç‰©ã€‚ -block.pyratite-mixer.description = 将煤ã€é“…å’Œæ²™å­æ··åˆæˆé«˜åº¦æ˜“燃的硫。 -block.melter.description = 将废料熔化æˆçŸ¿æ¸£ï¼Œä»¥ä¾¿è¿›ä¸€æ­¥åŠ å·¥æˆ–ç”¨äºŽç‚®å¡”å¼¹è¯ã€‚ -block.separator.description = 从矿渣中æå–有用的矿物。 -block.spore-press.description = 以æžé«˜åŽ‹åŠ›åŽ‹ç¼©å­¢å­èšåˆæˆæ²¹æ–™ã€‚ -block.pulverizer.description = å°†åºŸæ–™ç¢¾æˆæ²™ã€‚ -block.coal-centrifuge.description = 使石油å‡å›ºæˆç…¤å—。 -block.incinerator.description = ç”¨æ¥æŽ¥æ”¶å¹¶é™¤æŽ‰å¤šä½™çš„ç‰©å“æˆ–液体。 +block.phase-weaver.description = 从é’å’Œæ²™åˆæˆç›¸ä½ç‰©ã€‚ +block.alloy-smelter.description = 将钛ã€é“…ã€ç¡…å’Œé“œç†”åˆæˆå·¨æµªåˆé‡‘。 +block.cryofluid-mixer.description = 将水和细钛粉混åˆåˆ¶æˆå†·å†»æ¶²ã€‚ +block.blast-mixer.description = 从硫化物和孢å­èšä¸­äº§ç”Ÿçˆ†ç‚¸åŒ–åˆç‰©ã€‚ +block.pyratite-mixer.description = 把煤ã€é“…å’Œæ²™å­æ··å’Œä¸ºç¡«åŒ–物。 +block.melter.description = 将废料熔化æˆçŸ¿æ¸£ã€‚ +block.separator.description = 将矿渣分离æˆçŸ¿ç‰©æˆåˆ†ã€‚ +block.spore-press.description = 将孢å­èšåŽ‹ç¼©æˆçŸ³æ²¹ã€‚ +block.pulverizer.description = 将废料粉碎æˆç»†æ²™ã€‚ +block.coal-centrifuge.description = æŠŠçŸ³æ²¹å˜æˆç…¤ã€‚ +block.incinerator.description = 熔èžå¹¶è’¸å‘å®ƒæŽ¥æ”¶åˆ°çš„ä»»ä½•ç‰©å“æˆ–液体。 block.power-void.description = 消耗输入的所有能é‡ã€‚仅陿²™ç›’。 block.power-source.description = æ— é™è¾“出能é‡ã€‚仅陿²™ç›’。 block.item-source.description = æ— é™è¾“出物å“ã€‚ä»…é™æ²™ç›’。 block.item-void.description = 销æ¯è¾“入的所有物å“ã€‚ä»…é™æ²™ç›’。 block.liquid-source.description = æ— é™è¾“å‡ºæ¶²ä½“ã€‚ä»…é™æ²™ç›’。 -block.liquid-void.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.plastanium-wall.description = 一ç§ç‰¹æ®Šçš„é˜²å¾¡å»ºç­‘ï¼Œèƒ½å¸æ”¶ç”µå¼§ã€è‡ªåŠ¨é˜»æŒ¡èƒ½é‡èŠ‚ç‚¹è¿žæŽ¥ã€‚ -block.plastanium-wall-large.description = 一ç§ç‰¹æ®Šçš„é˜²å¾¡å»ºç­‘ï¼Œèƒ½å¸æ”¶ç”µå¼§ã€è‡ªåŠ¨é˜»æŒ¡èƒ½é‡èŠ‚ç‚¹è¿žæŽ¥ã€‚\nå å¤šä¸ªæ–¹æ ¼ã€‚ -block.thorium-wall.description = 强大的防御建筑。\nå¯ä»¥å¾ˆå¥½çš„防御敌人。 -block.thorium-wall-large.description = 强大的防御建筑。\n很好地防御敌人。\nå å¤šä¸ªæ–¹æ ¼ã€‚ -block.phase-wall.description = 没有é’墙那样åšå›ºï¼Œä½†æ˜¯å®ƒå¯ä»¥ä½¿ä¸å¤ªå¼ºçš„å¼¹è¯å‘生å转。 -block.phase-wall-large.description = 没有é’墙那样åšå›ºï¼Œä½†æ˜¯å®ƒå¯ä»¥ä½¿ä¸å¤ªå¼ºçš„å¼¹è¯å‘生å转。\nå å¤šä¸ªæ–¹æ ¼ã€‚ -block.surge-wall.description = 强大的防御建筑。\n被攻击时有很å°çš„æœºä¼šå‘攻击者å‘射闪电。 -block.surge-wall-large.description = 强大的防御建筑。\n被攻击时有很å°çš„æœºä¼šå‘攻击者å‘射闪电。\nå å¤šä¸ªæ–¹æ ¼ã€‚ -block.door.description = 一扇门。点按切æ¢å®ƒçš„æ‰“å¼€/关闭状æ€ã€‚ -block.door-large.description = 一扇大型门。点按切æ¢å®ƒçš„æ‰“å¼€/关闭状æ€ã€‚\nå å¤šä¸ªæ–¹æ ¼ã€‚ -block.mender.description = 定期修ç†é™„近的建筑,使防御系统在波次之间得到修å¤ã€‚\nå¯é€‰ä½¿ç”¨ç¡…æ¥æé«˜ä¿®å¤èŒƒå›´å’Œä¿®å¤æ•ˆçŽ‡ã€‚ -block.mend-projector.description = ä¿®ç†è€…çš„å‡çº§ç‰ˆï¼Œå®šæœŸä¿®å¤é™„近的建筑物。 -block.overdrive-projector.description = æé«˜é™„近建筑物的速度,如钻头和传é€å¸¦ã€‚ -block.force-projector.description = 在自身周围创建一个六角形力场,使里é¢çš„建筑物和å•ä½å…å—伤害。\næŒç»­æ‰¿å—高伤害会导致过热,å¯ä»¥ä½¿ç”¨å†·å´æ¶²é™æ¸©ã€‚相织物å¯ç”¨äºŽå¢žåŠ å±éšœå¤§å°ã€‚ -block.shock-mine.description = 对踩到它的敌人造æˆä¼¤å®³ã€‚敌人几乎看ä¸åˆ°å®ƒã€‚ -block.conveyor.description = åˆçº§ç‰©å“ä¼ é€å¸¦ã€‚将物å“å‘å‰è¾“é€å¹¶åœ¨å¯èƒ½æ—¶è¿å…¥å»ºç­‘ã€‚å¯æ—‹è½¬æ–¹å‘。 -block.titanium-conveyor.description = 高级物å“ä¼ é€å¸¦ã€‚è¿é€ç‰©å“的速度快于åˆçº§ä¼ é€å¸¦ã€‚ -block.plastanium-conveyor.description = 打包物å“进行è¿è¾“。\nåœ¨åŽæ–¹è¾“入物å“ï¼Œåœ¨å‰æ–¹ä¸‰ä¸ªæ–¹å‘输出物å“。 -block.junction.description = 两æ¡äº¤å‰ä¼ é€å¸¦çš„æ¡¥æ¢ã€‚用于连接两æ¡ä¸åŒçš„传输线路使其互ä¸å½±å“。 -block.bridge-conveyor.description = 先进的物å“è¿è¾“æ–¹å—。å…许跨越任æ„地形或建筑物è¿è¾“物å“,最多跨越3格。 -block.phase-conveyor.description = 先进的传é€å¸¦ï¼Œä½¿ç”¨ç”µåŠ›å°†ç‰©å“ä¼ é€åˆ°è·ç¦»å‡ ä¸ªæ–¹å—的相ä½ä¼ é€å¸¦ä¸Šã€‚ -block.sorter.description = 对物å“进行分类,如果物å“与所选ç§ç±»ç›¸åŒï¼Œåˆ™å…许其通过。å¦åˆ™ï¼Œç‰©å“将从左边和å³è¾¹è¾“出。 +block.liquid-void.description = ç§»é™¤è¾“å…¥çš„æ‰€æœ‰æ¶²ä½“ã€‚ä»…é™æ²™ç›’。 +block.copper-wall.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚ +block.copper-wall-large.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚ +block.titanium-wall.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚ +block.titanium-wall-large.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚ +block.plastanium-wall.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚å¸æ”¶æ¿€å…‰å’Œç”µå¼§ã€‚阻止电力节点自动连接。 +block.plastanium-wall-large.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚å¸æ”¶æ¿€å…‰å’Œç”µå¼§ã€‚阻止电力节点自动连接。 +block.thorium-wall.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚ +block.thorium-wall-large.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚ +block.phase-wall.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚åœ¨å—æ”»å‡»æ—¶å射大多数å­å¼¹ã€‚ +block.phase-wall-large.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚åœ¨å—æ”»å‡»æ—¶å射大多数å­å¼¹ã€‚ +block.surge-wall.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚å—æ”»å‡»æ—¶å®šæœŸé‡Šæ”¾ç”µå¼§ã€‚ +block.surge-wall-large.description = ä¿æŠ¤å·±æ–¹ç»“æž„ï¼ŒæŒ¡ä¸‹æ•Œæ–¹ç‚®å¼¹ã€‚å—æ”»å‡»æ—¶å®šæœŸé‡Šæ”¾ç”µå¼§ã€‚ +block.door.description = å¯ä»¥å¼€å…³çš„墙。 +block.door-large.description = å¯ä»¥å¼€å…³çš„墙。 +block.mender.description = 定期修å¤é™„近的区å—。\nå¯ä½¿ç”¨ç¡…æ¥æé«˜èŒƒå›´å’Œæ•ˆçŽ‡ã€‚ +block.mend-projector.description = ä¿®å¤å…¶é™„近的区å—。\nå¯ä½¿ç”¨ç›¸ä½ç‰©æ¥æé«˜å°„程和效率。 +block.overdrive-projector.description = æé«˜é™„近建筑物的速度。\nå¯ä½¿ç”¨ç›¸ä½ç‰©æ¥æé«˜å°„程和效率。 +block.force-projector.description = 在自身周围创建一个六角形力场,使里é¢çš„建筑物和å•ä½å…å—伤害。\næŒç»­æ‰¿å—高伤害会导致过热,å¯ä»¥ä½¿ç”¨å†·å´æ¶²é™æ¸©ã€‚相ä½ç‰©å¯ç”¨äºŽå¢žåŠ æŠ¤ç›¾å¤§å°ã€‚ +block.shock-mine.description = 对踩到它的敌人释放电弧进行攻击。 +block.conveyor.description = 将物å“å‘å‰è¾“é€ã€‚ +block.titanium-conveyor.description = 将物å“å‘å‰è¾“é€ã€‚快于åˆçº§ä¼ é€å¸¦ã€‚ +block.plastanium-conveyor.description = 打包物å“进行è¿è¾“。\nåœ¨åŽæ–¹è¾“入物å“ï¼Œåœ¨å‰æ–¹ä¸‰ä¸ªæ–¹å‘输出物å“。需è¦å¤šä¸ªè£…载和å¸è½½ç‚¹æ‰èƒ½è¾¾åˆ°å³°å€¼è½½é‡ã€‚ +block.junction.description = 两æ¡äº¤å‰ä¼ é€å¸¦çš„æ¡¥æ¢ã€‚ +block.bridge-conveyor.description = 跨越任æ„地形或建筑物è¿è¾“物å“。 +block.phase-conveyor.description = 跨越任æ„åœ°å½¢æˆ–å»ºç­‘ç‰©å³æ—¶è¿è¾“物å“。比传é€å¸¦æ¡¥èŒƒå›´æ›´å¤§ï¼Œä½†éœ€è¦ç”µåŠ›ã€‚ +block.sorter.description = 如果物å“与所选ç§ç±»ç›¸åŒï¼Œåˆ™å…许其通过。å¦åˆ™ï¼Œç‰©å“将从左边和å³è¾¹è¾“出。 block.inverted-sorter.description = åƒåˆ†ç±»å™¨ä¸€æ ·å¤„ç†ç‰©å“ï¼Œä½†å´æ˜¯å‘两侧输出选定的物å“。 -block.router.description = ä»Žä¸€ä¸ªæ–¹å‘æŽ¥å—物å“,并将它们平å‡è¾“出到其他3个方å‘。å¯ä»¥å°†ææ–™åˆ†æˆå¤šä»½\n\n[scarlet]永远ä¸è¦æŠŠå®ƒä¸Žç”Ÿäº§å»ºç­‘相连,因为它会被产出的产å“阻塞[]。 -block.distributor.description = 大型路由器,å¯å°†ç‰©å“输出到周围的最多7个其他方å‘。 +block.router.description = 将物å“å¹³å‡åˆ†é…到其他3个方å‘。 +block.router.details = 这是个好东西,也å¯ä»¥å¸¦æ¥éº»çƒ¦ã€‚ä¸å»ºè®®åœ¨å·¥åŽ‚æ—边使用,因为它们会被产出堵塞。 +block.distributor.description = 将物å“å¹³å‡åˆ†é…到其他7个方å‘。 block.overflow-gate.description = 当剿–¹è¢«é˜»å¡žæ—¶æ‰ä¼šå‘左和å³è¾“出,用于处ç†å¤šä½™çš„物å“。 block.underflow-gate.description = 与溢æµé—¨ç›¸å。 当左å³å‡å µå¡žæ—¶æ‰å‘剿–¹è¿è¾“。 -block.mass-driver.description = 终æžç‰©å“传输器,收集若干物å“åŽå°†å…¶å°„到远处的å¦ä¸€ä¸ªè´¨é‡é©±åŠ¨å™¨ã€‚ -block.mechanical-pump.description = 一ç§å»‰ä»·æ¶²ä½“泵,输出速度慢,但无需能é‡ã€‚ -block.rotary-pump.description = å…ˆè¿›æ¶²æ³µã€‚æ³µé€æ›´å¤šæ¶²ä½“,但需è¦èƒ½é‡ã€‚ -block.thermal-pump.description = 终级液泵。 -block.conduit.description = 基本液体传输管é“。åƒä¼ é€å¸¦ä¸€æ ·å·¥ä½œï¼Œä½†ä»…适用于液体。用于从泵或其他导管中æå–液体。 -block.pulse-conduit.description = 高级液体传输管é“ã€‚æ¯”æ™®é€šå¯¼ç®¡æ›´å¿«åœ°è¾“é€æ¶²ä½“且能储存更多液体。 -block.plated-conduit.description = 转移液体的速度与脉冲导管相åŒï¼Œä½†æŠ¤ç”²æ›´å¼ºã€‚ä¸¤ä¾§åªæŽ¥å—通过导管传入液体。\nå‘ç”Ÿæ³„æ¼æ—¶æ³„æ¼è¾ƒå°‘。 -block.liquid-router.description = 接å—一个方å‘的液体并将它们平å‡è¾“出到其他3个方å‘ã€‚åŒæ—¶å¯ä»¥å‚¨å­˜ä¸€å®šé‡çš„æ¶²ä½“。用于将液体从一个æºåˆ†å¾€å¤šä¸ªç›®æ ‡ã€‚ -block.liquid-tank.description = å­˜å‚¨å¤§é‡æ¶²ä½“,å¯åœ¨ææ–™éœ€æ±‚䏿’å®šæ—¶ä½œä¸ºç¼“å†²åŒºï¼Œæˆ–ä½œä¸ºä¾›ç»™å†·å´æ¶²ä½“çš„ä¿éšœè®¾æ–½ã€‚ -block.liquid-junction.description = 两æ¡äº¤å‰ç®¡é“的桥æ¢ã€‚适用连接两æ¡ä¸åŒæ–¹å‘的导管线路。 -block.bridge-conduit.description = 先进的液体传输建筑。å¯ä»¥è·¨è¶Šä»»ä½•地形或建筑物,最多跨越3æ ¼æ¥ä¼ è¾“液体。 -block.phase-conduit.description = 先进的液体传输建筑。使用电力将液体传é€åˆ°å¤šä¸ªæ–¹å—上的连接管é“。 -block.power-node.description = 将电æºä¼ è¾“到连接的节点上。节点将接收æ¥è‡ªä»»ä½•æ–¹å—çš„èƒ½é‡æˆ–å‘任何方å—供给能é‡ã€‚ -block.power-node-large.description = æ›´å¤§èŒƒå›´ã€æ›´å¤šè¿žæŽ¥ç‚¹çš„高级能é‡èŠ‚ç‚¹ã€‚ -block.surge-tower.description = 连接数低但范围很远的能é‡èŠ‚ç‚¹ã€‚ -block.diode.description = 此方å—上的电能åªèƒ½å•呿µåŠ¨ï¼Œä»…å½“å¦ä¸€ä¾§çš„电池储能更低时输é€ç”µåŠ›ã€‚ -block.battery.description = 存储能é‡ä½œä¸ºç¼“冲,在å‘电é‡ä¸è¶³æ—¶æä¾›ä¿éšœã€‚ -block.battery-large.description = æ¯”æ™®é€šç”µæ± å®¹é‡æ›´å¤§ã€‚ -block.combustion-generator.description = ç‡ƒçƒ§ç…¤ç­‰ææ–™å‘电。 +block.mass-driver.description = é•¿è·ç¦»ç‰©å“传输结构,收集若干物å“åŽå°†å…¶å°„到远处的å¦ä¸€ä¸ªè´¨é‡é©±åŠ¨å™¨ã€‚ +block.mechanical-pump.description = æ³µé€æ¶²ä½“,ä¸éœ€è¦èƒ½é‡ã€‚ +block.rotary-pump.description = æ³µé€æ¶²ä½“,需è¦èƒ½é‡ã€‚ +block.thermal-pump.description = æ³µé€æ¶²ä½“。 +block.conduit.description = å‘å‰ä¼ è¾“液体。用于从泵或其他导管中æå–液体。 +block.pulse-conduit.description = å‘å‰ä¼ è¾“æ¶²ä½“ã€‚æ¯”æ™®é€šå¯¼ç®¡æ›´å¿«åœ°è¾“é€æ¶²ä½“且能储存更多液体。 +block.plated-conduit.description = å‘å‰ä¼ è¾“æ¶²ä½“ã€‚ä¸æŽ¥å—侧边输入。ä¸ä¼šå‘生泄露。 +block.liquid-router.description = 接å—一个方å‘的液体并将它们平å‡è¾“出到其他3个方å‘ã€‚åŒæ—¶å¯ä»¥å‚¨å­˜ä¸€å®šé‡çš„æ¶²ä½“。 +block.liquid-tank.description = å‚¨å­˜å¤§é‡æ¶²ä½“ã€‚åƒæ¶²ä½“路由器å‘å„个方å‘输出液体。 +block.liquid-junction.description = 两æ¡äº¤å‰é“管的桥æ¢ã€‚ +block.bridge-conduit.description = 跨越任æ„地形或建筑物è¿è¾“液体。 +block.phase-conduit.description = 跨越任æ„地形或建筑物è¿è¾“液体。比导管桥范围更大,但需è¦ç”µåŠ›ã€‚ +block.power-node.description = å‘è¿žæŽ¥çš„èŠ‚ç‚¹ä¼ è¾“ç”µåŠ›ã€‚è¯¥èŠ‚ç‚¹å°†ä»Žä»»ä½•ç›¸é‚»çš„å—æŽ¥æ”¶ç”µåŠ›æˆ–å‘其供电。 +block.power-node-large.description = 具有更大范围的高级电æºèŠ‚ç‚¹ã€‚ +block.surge-tower.description = å¯ç”¨è¿žæŽ¥è¾ƒå°‘的远程电æºèŠ‚ç‚¹ã€‚ +block.diode.description = 仅当一侧存储的电é‡è¾ƒå°‘æ—¶å‘å¦ä¸€ä¾§ä¼ è¾“电池电é‡ã€‚ +block.battery.description = 储存电网多余电力,并在电网供电ä¸è¶³æ—¶æ”¾ç”µã€‚ +block.battery-large.description = 储存电网多余电力,并在电网供电ä¸è¶³æ—¶æ”¾ç”µã€‚æ¯”æ™®é€šç”µæ± å®¹é‡æ›´é«˜ã€‚ +block.combustion-generator.description = 燃烧煤等å¯ç‡ƒææ–™å‘电。 block.thermal-generator.description = 放置在炽热的地形上能够å‘电。 -block.steam-generator.description = 先进的ç«åŠ›å‘ç”µæœºï¼Œæ•ˆçŽ‡æ›´é«˜ï¼Œä½†éœ€è¦æ°´æ¥äº§ç”Ÿè’¸æ±½ã€‚ +block.steam-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.rtg-generator.description = 利用放射物的衰å˜äº§ç”Ÿçš„热é‡ä»¥ç¼“慢的速度产生能é‡ã€‚ +block.solar-panel.description = æä¾›å°‘é‡å¤ªé˜³èƒ½ã€‚ +block.solar-panel-large.description = æä¾›å°‘é‡å¤ªé˜³èƒ½ã€‚æ¯”æ ‡å‡†å¤ªé˜³èƒ½ç”µæ± æ¿æ›´é«˜æ•ˆã€‚ +block.thorium-reactor.description = 从放射性的é’中产生大é‡çš„能é‡ã€‚éœ€è¦æŒç»­å†·å´ã€‚å¦‚æžœå†·å´æ¶²ä¾›åº”ä¸è¶³ï¼Œä¼šå‰§çƒˆçˆ†ç‚¸ã€‚ +block.impact-reactor.description = 以最高效率产生大é‡çš„电力。但需è¦å¤§é‡çš„能é‡è¾“å…¥æ¥å¯åŠ¨ã€‚ +block.mechanical-drill.description = 放置在矿物上时,以缓慢的速度无é™è¾“出物å“。åªèƒ½å¼€é‡‡åŸºæœ¬èµ„æºã€‚ block.pneumatic-drill.description = ä¸€ç§æ”¹è¿›çš„钻头,能开采钛。采矿速度比机械钻头快。 block.laser-drill.description = 通过激光技术更快地开采,但需è¦èƒ½é‡ã€‚è¿™ç§é’»å¤´å¯ä»¥å¼€é‡‡æ”¾å°„性的é’。 block.blast-drill.description = 终æžé’»å¤´ï¼Œéœ€è¦å¤§é‡èƒ½é‡ã€‚ -block.water-extractor.description = 从地下æå–æ°´ã€‚å½“é™„è¿‘æ²¡æœ‰æ°´æºæ—¶ä½¿ç”¨å®ƒã€‚ -block.cultivator.description = 将微å°çš„å­¢å­åŸ¹å…»æˆå·¥ä¸šç”¨çš„å­¢å­èšã€‚ -block.oil-extractor.description = 使用大é‡èƒ½é‡ã€æ²™å­å’Œæ°´æç‚¼çŸ³æ²¹ã€‚ -block.core-shard.description = å°åž‹æ ¸å¿ƒã€‚一旦被摧æ¯ï¼Œä¸Žè¯¥åœ°åŒºçš„æ‰€æœ‰è¿žæŽ¥éƒ½å°†æ–­å¼€ã€‚ä¸è¦è®©å®ƒè¢«æ‘§æ¯ã€‚ -block.core-foundation.description = ä¸­åž‹æ ¸å¿ƒã€‚è¡€é‡æ›´é«˜ã€‚å¯ä»¥å­˜å‚¨æ›´å¤šèµ„æºã€‚ -block.core-nucleus.description = 大型核心,也是最强大的,血é‡éžå¸¸é«˜ã€‚能存储大é‡èµ„æºã€‚ -block.vault.description = 存储大é‡ç‰©å“ã€‚å½“å­˜åœ¨éžæ’å®šçš„ææ–™éœ€æ±‚时,使用它æ¥åˆ›å»ºç¼“冲区。[lightgray]å¸è½½å™¨[]å¯ä»Žä»“库中æå–物å“。 -block.container.description = 存储少é‡ç‰©å“ã€‚å½“å­˜åœ¨éžæ’å®šçš„ææ–™éœ€æ±‚时,使用它æ¥åˆ›å»ºç¼“冲区。[lightgray]å¸è½½å™¨[]å¯ä»Žå®¹å™¨ä¸­æå–物å“。 -block.unloader.description = 将物å“从容器ã€ä»“库或你的核心中æå–到传é€å¸¦æˆ–直接æå–到相邻的方å—。点击å¸è½½å™¨æœ¬èº«æ›´æ”¹æ‰€è¦å¸è½½çš„物å“类型。 -block.launch-pad.description = 定期å‘射一批物å“,而无需å‘射核心(离开地图)。 -block.launch-pad-large.description = å‘å°„å°çš„æ”¹è¿›ç‰ˆï¼Œå¯ä»¥å­˜å‚¨æ›´å¤šç‰©å“ï¼ŒåŒæ—¶å¯åŠ¨é¢‘çŽ‡æ›´é«˜ã€‚ -block.duo.description = å°è€Œä¾¿å®œçš„炮塔,对地很有效。 -block.scatter.description = 基本型防空炮塔。å‘空中敌人喷出一团铅,钢化玻璃或废料。 -block.scorch.description = å°åž‹ç‚®å¡”,点燃任何é è¿‘å®ƒçš„åœ°é¢æ•Œäººã€‚è¿‘è·ç¦»éžå¸¸æœ‰æ•ˆã€‚ -block.hail.description = å°åž‹è¿œç¨‹ç‚®å°ã€‚ -block.wave.description = ä¸­åž‹å¿«é€Ÿç‚®å¡”ï¼Œå°„å‡ºæ¶²ä½“æ³¡æ³¡ã€‚ä½¿ç”¨æ°´æˆ–è€…å†·å´æ¶²æ—¶èƒ½å¤Ÿè‡ªåЍç­ç«ã€‚ -block.lancer.description = 中型对地炮塔。会充能并å‘å°„å¼ºåŠ›çš„çš„èƒ½é‡æŸã€‚ -block.arc.description = å°åž‹ç‚®å¡”,å‘射电弧。电弧无法穿过塑钢墙。 -block.swarmer.description = 中型炮塔,对空对地,å‘射跟踪爆炸导弹。 -block.salvo.description = åŒç®¡ç‚®çš„å‡çº§ç‰ˆã€‚中型,快速射出一串å­å¼¹ã€‚ -block.fuse.description = 大型近程炮塔,å‘射三é“刺穿敌人的短程光æŸã€‚ -block.ripple.description = 大型远程炮å°ï¼Œéžå¸¸å¼ºåŠ›ï¼Œå‘远处的敌人投射一簇弹è¯ã€‚ -block.cyclone.description = 大型炮塔,对空对地,å‘射在敌人周围引爆的爆炸物。 -block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲弹è¯ã€‚ -block.meltdown.description = è¶…å¤§åž‹æ¿€å…‰ç‚®å¡”ï¼Œå……èƒ½ä¹‹åŽæŒç»­å‘å°„å…‰æŸï¼Œéœ€è¦å†·å´å‰‚。 -block.repair-point.description = æŒç»­æ²»ç–—其附近伤势最é‡çš„å•ä½ã€‚ -block.segment.description = 对行进中的导弹进行破å和摧æ¯, 除激光以外. +block.water-extractor.description = 从地下æå–水。用于当附近没有地表水时。 +block.cultivator.description = 将微尿µ“度的大气中的孢å­åŸ¹å…»æˆå­¢å­èšã€‚ +block.cultivator.details = æ¢å¤çš„æŠ€æœ¯ã€‚用于尽å¯èƒ½é«˜æ•ˆåœ°ç”Ÿäº§å¤§é‡çš„生物质。很å¯èƒ½æ˜¯çŽ°åœ¨è¦†ç›–äº†å¡žæ™®ç½—çš„æœ€åˆçš„å­¢å­åŸ¹å…»å™¨ã€‚ +block.oil-extractor.description = 使用大é‡èƒ½é‡ã€æ²™å­å’Œæ°´é’»å–石油。 +block.core-shard.description = 基地的核心。一旦被摧æ¯ï¼Œæ­¤åŒºå—就会丢失。 +block.core-shard.details = åˆä»£æ ¸å¿ƒã€‚åšå›ºä¸”å¯è‡ªæˆ‘å¤åˆ¶ã€‚ä¸å…·å¤‡æ˜Ÿé™…旅行的能力。 +block.core-foundation.description = 基地的核心。装甲优良。比åˆä»£æ ¸å¿ƒå®¹é‡æ›´å¤§ã€‚ +block.core-foundation.details = 次代核心。 +block.core-nucleus.description = 基地的核心。装甲æžä½³ã€‚容釿žå¤§ã€‚ +block.core-nucleus.details = 三代也是终代核心。 +block.vault.description = 存储æ¯ç§ç±»åž‹çš„大é‡ç‰©å“。å¯ä½¿ç”¨å¸è½½å™¨å¸è½½ç‰©å“。 +block.container.description = 存储æ¯ç§ç±»åž‹çš„å°‘é‡ç‰©å“。å¯ä½¿ç”¨å¸è½½å™¨å¸è½½ç‰©å“。 +block.unloader.description = 从周围方å—å¸è½½æŒ‡å®šç‰©å“。 +block.launch-pad.description = 将货物å‘射至指定区å—。 +block.duo.description = äº¤æ›¿å‘æ•Œäººå‘å°„å­å¼¹ã€‚ +block.scatter.description = 呿•Œæœºå‘å°„é“…ã€åºŸæ–™æˆ–钢化玻璃高射炮弹。 +block.scorch.description = 焚烧任何é è¿‘å®ƒçš„åœ°é¢æ•Œäººã€‚è¿‘è·ç¦»é«˜æ•ˆ +block.hail.description = å‘远è·ç¦»åœ°é¢æ•Œäººå‘å°„å°åž‹ç‚®å¼¹ã€‚ +block.wave.description = 呿•Œäººå°„出液体æµã€‚ä½¿ç”¨æ°´ä½œå¼¹è¯æ—¶èƒ½å¤Ÿè‡ªåЍç­ç«ã€‚ +block.lancer.description = 充能并å‘地é¢å•ä½å‘射强力的的波æŸã€‚ +block.arc.description = å‘地é¢å•ä½å‘射电弧。 +block.swarmer.description = 呿•Œäººå‘射追踪导弹。 +block.salvo.description = 呿•Œäººå¿«é€Ÿå°„击å­å¼¹ã€‚ +block.fuse.description = å‘附近的敌人å‘射三次近è·ç¦»ç©¿é€æ€§çˆ†ç‚¸å­å¼¹ã€‚ +block.ripple.description = å‘远è·ç¦»åœ°é¢æ•Œäººå‘射密集的炮弹。 +block.cyclone.description = å‘附近的敌人å‘射密集的高射炮弹。 +block.spectre.description = å‘空中和地é¢ç›®æ ‡å‘射大型穿甲å­å¼¹ã€‚ +block.meltdown.description = å‘附近的敌人å‘å°„æŒç»­çš„æ¿€å…‰æŸã€‚需è¦ä¾›å†·ã€‚ +block.foreshadow.description = å‘远è·ç¦»å•目标射击。 +block.repair-point.description = æŒç»­ä¿®å¤å…¶é™„è¿‘å—æŸæœ€ä¸¥é‡çš„å•ä½ã€‚ +block.segment.description = æ‘§æ¯è¢­æ¥çš„除激光以外的å­å¼¹æˆ–导弹。 +block.parallax.description = 通过牵引光æŸç‰µå¼•空中目标,并在这个过程中对其造æˆä¼¤å®³ã€‚ +block.tsunami.description = 呿•Œäººå°„出强力的液体æµã€‚ä½¿ç”¨æ°´ä½œå¼¹è¯æ—¶èƒ½å¤Ÿè‡ªåЍç­ç«ã€‚ +block.silicon-crucible.description = 从沙å­å’Œç…¤ä¸­æç‚¼ç¡…,用硫化物作为附加热æºã€‚在炙热地型上更高效。 +block.disassembler.description = 以低效率将矿渣分离æˆå¾®é‡çš„外æ¥çŸ¿ç‰©æˆåˆ†ã€‚能产生é’。 +block.overdrive-dome.description = æé«˜é™„近建筑物的速度。需è¦ç›¸ä½ç‰©å’Œç¡…æ¥å·¥ä½œã€‚ +block.payload-conveyor.description = 移动大型有效载è·ï¼Œä¾‹å¦‚从工厂生产的å•ä½ã€‚ +block.payload-router.description = 将输入的有效载è·å‘3个方å‘输出。 +block.command-center.description = 使用多个ä¸åŒçš„命令控制å•ä½ã€‚ +block.ground-factory.description = 产生陆军å•ä½ã€‚输出的å•ä½å¯ä»¥ç›´æŽ¥ä½¿ç”¨ï¼Œä¹Ÿå¯ä»¥ç§»å…¥é‡æž„厂进行å‡çº§ã€‚ +block.air-factory.description = 产生空军å•ä½ã€‚输出的å•ä½å¯ä»¥ç›´æŽ¥ä½¿ç”¨ï¼Œä¹Ÿå¯ä»¥ç§»å…¥é‡æž„厂进行å‡çº§ã€‚ +block.naval-factory.description = 产生海军å•ä½ã€‚输出的å•ä½å¯ä»¥ç›´æŽ¥ä½¿ç”¨ï¼Œä¹Ÿå¯ä»¥ç§»å…¥é‡æž„厂进行å‡çº§ã€‚ +block.additive-reconstructor.description = 将输入的å•ä½å‡çº§åˆ°ç¬¬äºŒçº§ã€‚ +block.multiplicative-reconstructor.description = 将输入的å•ä½å‡çº§åˆ°ç¬¬ä¸‰çº§ã€‚ +block.exponential-reconstructor.description = 将输入的å•ä½å‡çº§åˆ°ç¬¬å››çº§ã€‚ +block.tetrative-reconstructor.description = 将输入的å•ä½å‡çº§åˆ°ç¬¬äº”级,也是最终æžã€‚ +block.switch.description = å¯åˆ‡æ¢å¼€å…³ã€‚状æ€å¯ä»¥ç”¨é€»è¾‘处ç†å™¨è¯»å–和控制。 +block.micro-processor.description = 在循环中è¿è¡Œä¸€ç³»åˆ—逻辑指令。å¯ç”¨äºŽæŽ§åˆ¶å•元和建筑物。 +block.logic-processor.description = 在循环中è¿è¡Œä¸€ç³»åˆ—逻辑指令。å¯ç”¨äºŽæŽ§åˆ¶å•元和建筑物。比微型处ç†å™¨å¿«ã€‚ +block.hyper-processor.description = 在循环中è¿è¡Œä¸€ç³»åˆ—逻辑指令。å¯ç”¨äºŽæŽ§åˆ¶å•元和建筑物。å¯ç”¨äºŽæŽ§åˆ¶å•元和建筑物。比逻辑处ç†å™¨å¿«ã€‚ +block.memory-cell.description = 存储处ç†å™¨çš„ä¿¡æ¯ã€‚ +block.memory-bank.description = 存储处ç†å™¨çš„ä¿¡æ¯ã€‚å†…å­˜é‡æ›´å¤§ã€‚ +block.logic-display.description = 显示处ç†å™¨ä¸­çš„ä»»æ„图形。 +block.large-logic-display.description = 显示处ç†å™¨ä¸­çš„ä»»æ„图形。 +block.interplanetary-accelerator.description = 一个巨大的电ç£è½¨é“加速器。加速核心逃逸速度以进行星际部署。 + +unit.dagger.description = 攻击附近所有敌人。å‘射标准å­å¼¹ã€‚ +unit.mace.description = 攻击附近所有敌人。å‘å°„ç«ç„°ã€‚ +unit.fortress.description = æ”»å‡»åœ°é¢æ•Œäººã€‚å‘射远程ç«ç‚®ã€‚ +unit.scepter.description = 攻击附近所有敌人。å‘射充能弹。 +unit.reign.description = 攻击附近所有敌人。å‘å°„ç©¿é€æ€§å­å¼¹ã€‚ +unit.nova.description = å‘å°„æ¿€å…‰å¼¹æ¥æ”»å‡»æ•Œäººå¹¶ä¿®å¤ç›Ÿå†›å»ºç­‘。能够飞行。 +unit.pulsar.description = å‘å°„ç”µå¼§æ¥æ”»å‡»æ•Œäººå¹¶ä¿®å¤ç›Ÿå†›å»ºç­‘。能够飞行。 +unit.quasar.description = å‘å°„ç©¿é€æ€§æ¿€å…‰æŸæ¥æ”»å‡»æ•Œäººå¹¶ä¿®å¤ç›Ÿå†›å»ºç­‘。能够飞行。拥有护盾。 +unit.vela.description = å‘射巨大的æŒç»­æ¿€å…‰æŸæ”»å‡»æ•Œäººï¼Œå¼•èµ·ç«ç¾å¹¶ä¿®å¤ç›Ÿå†›å»ºç­‘。能够飞行。 +unit.corvus.description = å‘射巨大的激光爆破æŸï¼Œæ‘§æ¯æ•Œäººå¹¶ä¿®å¤ç›Ÿå†›å»ºç­‘。å¯ä»¥è·¨è¶Šå¤§å¤šæ•°åœ°å½¢ã€‚ +unit.crawler.description = 冲呿•Œäººå¹¶è‡ªæ¯ï¼Œé€ æˆå¤§çˆ†ç‚¸ã€‚ +unit.atrax.description = å‘地é¢ç›®æ ‡å‘射削弱性的矿渣çƒä½“。å¯ä»¥è·¨è¶Šå¤§å¤šæ•°åœ°å½¢ã€‚ +unit.spiroct.description = 呿•Œäººå‘射激光æŸï¼Œå¹¶åœ¨æ­¤è¿‡ç¨‹ä¸­è‡ªæˆ‘ä¿®å¤ã€‚å¯ä»¥è·¨è¶Šå¤§å¤šæ•°åœ°å½¢ã€‚ +unit.arkyid.description = 呿•Œäººå‘射大釿¿€å…‰æŸï¼Œå¹¶åœ¨æ­¤è¿‡ç¨‹ä¸­è‡ªæˆ‘ä¿®å¤ã€‚å¯ä»¥è·¨è¶Šå¤§å¤šæ•°åœ°å½¢ã€‚ +unit.toxopid.description = 呿•Œäººå‘射大型电能集æŸç‚®å¼¹å’Œç©¿é€æ¿€å…‰ã€‚å¯ä»¥è·¨è¶Šå¤§å¤šæ•°åœ°å½¢ã€‚ +unit.flare.description = æ”»å‡»åœ°é¢æ•Œäººã€‚å‘射标准å­å¼¹ã€‚ +unit.horizon.description = æ”»å‡»åœ°é¢æ•Œäººã€‚投下炸弹。 +unit.zenith.description = 攻击附近所有敌人。å‘射导弹群。 +unit.antumbra.description = 攻击附近所有敌人。å‘射密集的å­å¼¹ã€‚ +unit.eclipse.description = 攻击附近所有敌人。å‘å°„ç©¿é€æ€§æ¿€å…‰å’Œåˆ†è£‚弹。 +unit.mono.description = 自动开采铜和铅,并将其放入核心中。 +unit.poly.description = 自动é‡å»ºå—æŸç»“构,å助其他å•ä½å»ºé€ ã€‚ +unit.mega.description = 自动修å¤å—æŸç»“构。能够æºå¸¦æ–¹å—å’Œå°åž‹åœ°é¢éƒ¨é˜Ÿã€‚ +unit.quad.description = å‘地é¢ç›®æ ‡æŠ•掷大型炸弹,修å¤ç›Ÿå†›å»ºç­‘å¹¶æ‘§æ¯æ•Œäººã€‚能够æºå¸¦ä¸­åž‹åœ°é¢éƒ¨é˜Ÿã€‚ +unit.oct.description = 用它的å†ç”ŸæŠ¤ç›¾ä¿æŠ¤é™„近的盟å‹ã€‚能够æºå¸¦å¤§å¤šæ•°åœ°é¢éƒ¨é˜Ÿã€‚ +unit.risso.description = 攻击附近所有敌人。å‘射一连串的导弹和å­å¼¹ã€‚ +unit.minke.description = 攻击附近所有敌人。å‘射炮弹和标准å­å¼¹ã€‚ +unit.bryde.description = 攻击附近所有敌人。å‘å°„å‘射远程炮弹和导弹。 +unit.sei.description = 攻击附近所有敌人。å‘射一连串的导弹和穿甲弹。 +unit.omura.description = 攻击附近所有敌人。å‘射远程穿é€è½¨é“ç‚®ã€‚å¯æž„造星耀å•元。 +unit.alpha.description = ä¿æŠ¤åˆä»£æ ¸å¿ƒã€‚坿ž„建结构。 +unit.beta.description = ä¿æŠ¤æ¬¡ä»£æ ¸å¿ƒã€‚å¯æž„建结构。 +unit.gamma.description = ä¿æŠ¤ç»ˆä»£æ ¸å¿ƒã€‚å¯æž„建结构。 + +lst.read = ä»Žè¿žæŽ¥çš„å†…å­˜è¯»å–æ•°å­— +lst.write = 写入数字到连接的内存 +lst.print = 添加文字到打å°ç¼“å­˜\n用了[accent]Print Flush[]æ‰ä¼šæ˜¾ç¤º +lst.draw = 添加æ“作到绘图队列\n用了[accent]Draw Flush[]æ‰ä¼šæ˜¾ç¤º +lst.drawflush = 刷新列队的[accent]Draw[]æ“ä½œåˆ°æ˜¾ç¤ºå± +lst.printflush = 刷新[accent]Print[]ç¼“å­˜çš„æ–‡å­—åˆ°æ¶ˆæ¯æ¿ +lst.getlink = 获å–处ç†å™¨è¿žæŽ¥\n索引从0开始 +lst.control = 控制建筑 +lst.radar = 定ä½å»ºç­‘周边的å•ä½\n有范围é™åˆ¶ +lst.sensor = 从建筑或å•ä½å–å¾—æ•°æ® +lst.set = 设置å˜é‡ +lst.operation = æ“作一两个å˜é‡ +lst.end = 跳至指令栈顶\n(第一æ¡è¯­å¥ï¼‰ +lst.jump = 有æ¡ä»¶åœ°è·³åˆ°å¦ä¸€è¯­å¥ +lst.unitbind = 绑定下一个æŸåž‹å·å•ä½\n并存到[accent]@unit[] +lst.unitcontrol = 控制绑定的å•ä½ +lst.unitradar = 定ä½ç»‘定的å•ä½å‘¨å›´çš„å•ä½ +lst.unitlocate = å®šä½æŒ‡å®šç±»åž‹çš„建筑或ä½ç½®\n全图范围,需è¦ç»‘定å•ä½ + +logic.nounitbuild = [red]这儿ä¸å…许处ç†å™¨æŽ§åˆ¶å•ä½åŽ»å»ºè®¾ + +lenum.type = 建筑和å•ä½çš„ç±»åž‹ï¼Œä¸æ˜¯å­—串\n比如路由器返回[accent]@router[] +lenum.shoot = 瞄准/射击æŸä¸ªä½ç½® +lenum.shootp = 按æå‰é‡çž„准/射击目标 +lenum.configure = 建筑é…ç½®ï¼Œæ¯”å¦‚åˆ†æ‹£å™¨åˆ†æ‹£çš„ç‰©å“ +lenum.enabled = 建筑的å¯ç”¨çŠ¶æ€ + +laccess.color = 照明器å‘光的颜色 +laccess.controller = å•ä½æŽ§åˆ¶è€…\n如果是处ç†å™¨ï¼Œè¿”回处ç†å™¨\n如果在编队中,返回领队\n其他的,返回å•ä½è‡ªå·± +laccess.dead = å•使ˆ–å»ºç­‘æ˜¯ä¸æ˜¯æ­»äº†æˆ–无效了 +laccess.controlled = è‹¥å•ä½æŽ§åˆ¶è€…æ˜¯å¤„ç†å™¨ï¼Œè¿”回[accent]@ctrlProcessor[]\nè‹¥å•ä½/建筑由玩家控制,返回[accent]@ctrlPlayer[]\nè‹¥å•ä½åœ¨ç¼–队中,返回[accent]@ctrlFormation[]\n其他的,返回0 +laccess.commanded = [red]已弃用,将被移除ï¼[]\n应该使用[accent]controlled[] + +graphicstype.clear = ç”¨æŒ‡å®šé¢œè‰²å¡«æ»¡æ˜¾ç¤ºå± +graphicstype.color = 设置åŽç»­ç”»å›¾æ“作的颜色 +graphicstype.stroke = 设置线宽 +graphicstype.line = 画线段 +graphicstype.rect = 填充矩形 +graphicstype.linerect = 画矩形框 +graphicstype.poly = 填充正多边形 +graphicstype.linepoly = 画正多边形框 +graphicstype.triangle = 填充三角形 +graphicstype.image = 画出游æˆå†…容的图åƒ\n比如,[accent]@router[]å’Œ[accent]@dagger[] + +lenum.always = 总是跳转 +lenum.idiv = 整除 +lenum.div = 除法,除以0时返回[accent]null[] +lenum.mod = å–余数 +lenum.equal = 相等。有转æ¢\nnull比较数字时算作0,éžnull对象算作1 +lenum.notequal = ä¸ç›¸ç­‰ã€‚æœ‰è½¬æ¢ +lenum.strictequal = 严格相等。ä¸è½¬æ¢\nå¯ç”¨äºŽæ£€æŸ¥[accent]null[] +lenum.shl = å·¦ç§»ä½ +lenum.shr = å³ç§»ä½ +lenum.or = æŒ‰ä½æˆ– +lenum.land = 逻辑与 +lenum.and = 按ä½ä¸Ž +lenum.not = 按ä½éž +lenum.xor = 按ä½å¼‚或 + +lenum.min = å–å°çš„那个数 +lenum.max = å–大的那个数 +lenum.angle = æ–¹ä½è§’° +lenum.len = 原点到该点è·ç¦» +lenum.sin = 正弦°(对边:斜边) +lenum.cos = 余弦°(邻边:斜边) +lenum.tan = 正切°(对边:邻边) +lenum.rand = [0, 值) èŒƒå›´å†…éšæœºæ•° +lenum.log = 自然对数(ln) +lenum.log10 = 10底对数 +lenum.noise = 二维å•形噪声 +lenum.abs = ç»å¯¹å€¼ +lenum.sqrt = 二次方根 + +lenum.any = ä»»æ„å•ä½ +lenum.ally = 勿–¹å•ä½ +lenum.attacker = 有武器的å•ä½ +lenum.enemy = 敌方å•ä½ +lenum.boss = Bosså•ä½ +lenum.flying = 飞行å•ä½ +lenum.ground = 地é¢å•ä½ +lenum.player = 玩家控制的å•ä½ + +lenum.ore = 矿床 +lenum.damaged = å—æŸçš„勿–¹å»ºç­‘ +lenum.spawn = 敌人出生点\nå¯èƒ½æ˜¯æ ¸å¿ƒæˆ–地点 +lenum.building = 分组内的建筑 + +lenum.core = 核心 +lenum.storage = 容器/仓库 +lenum.generator = å‘电建筑 +lenum.factory = 工厂 +lenum.repair = 维修点 +lenum.rally = 指挥中心 +lenum.battery = 电池 +lenum.resupply = 补给点\n仅当å¯ç”¨[accent]“å•ä½å¼¹è¯â€[]时有用 +lenum.reactor = é’å应堆/冲击å应堆 +lenum.turret = 炮塔 + +sensor.in = è¦ä¼ æ„Ÿçš„建筑或å•ä½ + +radar.from = è¦å®žæ–½æŽ¢æµ‹çš„建筑\n探测è·ç¦»å—é™äºŽå»ºç­‘范围 +radar.target = ç­›é€‰è¦æŽ¢æµ‹çš„å•ä½ +radar.and = æ›´å¤šç­›å­ +radar.order = 排åºï¼š1(true)从å°åˆ°å¤§ 0(false)ååº +radar.sort = 排åºçš„é‡åº¦ +radar.output = 输出å•ä½çš„å˜é‡ + +unitradar.target = ç­›é€‰è¦æŽ¢æµ‹çš„å•ä½ +unitradar.and = æ›´å¤šç­›å­ +unitradar.order = 排åºï¼š1(true)从å°åˆ°å¤§ 0(false)ååº +unitradar.sort = 排åºçš„é‡åº¦ +unitradar.output = 输出å•ä½çš„å˜é‡ + +control.of = è¦æŽ§åˆ¶çš„å»ºç­‘ +control.unit = è¦çž„准的å•使ˆ–建筑 +control.shoot = 是å¦å°„击 + +unitlocate.enemy = å®šä½æ•Œæ–¹è¿˜æ˜¯æˆ‘方建筑 +unitlocate.found = 有没有找到 +unitlocate.building = 找到的建筑的输出å˜é‡ +unitlocate.outx = 输出Xåæ ‡ +unitlocate.outy = 输出Yåæ ‡ +unitlocate.group = è¦æ‰¾çš„建筑组 + +lenum.idle = ä¸ç§»åŠ¨ï¼Œä½†è¿›è¡Œé‡‡çŸ¿/修建\né»˜è®¤çŠ¶æ€ +lenum.stop = åœæ­¢ç§»åЍ/采矿/修建 +lenum.move = 移动到æŸä¸ªä½ç½® +lenum.approach = 接近到æŸä¸ªåœ†å½¢åŒºåŸŸ +lenum.pathfind = 找路去敌人出生点 +lenum.target = 瞄准/射击æŸä¸ªä½ç½® +lenum.targetp = 按æå‰é‡çž„准/射击目标 +lenum.itemdrop = 放物å“到建筑 +lenum.itemtake = ä»Žå»ºç­‘æ‹¿ç‰©å“ +lenum.paydrop = 放下当å‰è½½è· +lenum.paytake = ä»Žåœ°ä¸Šæ‹¿èµ·è½½è· +lenum.flag = 数字值的å•使——æ ‡ +lenum.mine = 采矿 +lenum.build = 修建结构 +lenum.getblock = èŽ·å–æŸå标的建筑和类型\nåæ ‡éœ€åœ¨å•ä½èŒƒå›´å†…\n或å•ä½åœ¨å»ºç­‘范围内\n地形物类型是[accent]@solid[]或[accent]@air[] +lenum.within = 检查å•ä½åœ¨ä¸åœ¨åŠå¾„内 +lenum.boost = 开始/åœæ­¢åŠ©æŽ¨ diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 85efa9a527..2c25a8d2fe 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -13,15 +13,18 @@ link.google-play.description = Google Play 商店é é¢ link.f-droid.description = F-Droid 目錄é é¢ link.wiki.description = 官方 Mindustry 維基 link.suggestions.description = 建議新功能 +link.bug.description = 找到臭蟲?在這裡回報 linkfail = 無法打開連çµï¼\n我們已將該網å€è¤‡è£½åˆ°æ‚¨çš„剪貼簿。 -screenshot = 截圖ä¿å­˜åˆ°{0} -screenshot.invalid = 地圖太大了,å¯èƒ½æ²’有足夠的內存用於截圖。 +screenshot = 截圖儲存到{0} +screenshot.invalid = 地圖太大了,å¯èƒ½æ²’有足夠的記憶體用於截圖。 gameover = éŠæˆ²çµæŸ +gameover.disconnect = æ–·ç·š gameover.pvp = [accent]{0}[]隊ç²å‹ï¼ +gameover.waiting = [accent]等待下一張地圖中…… highscore = [accent]新的高分紀錄! copied = 已複製。 -indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. -indev.notready = This part of the game isn't ready yet +indev.notready = é€™éƒ¨ä»½çš„éŠæˆ²å°šæœªå®Œæˆ +indev.campaign = [accent]æ­å–œä½ å®Œæˆæˆ°å½¹äº†ï¼[]\n\n這是截至目å‰çš„éŠæˆ²å…§å®¹ã€‚æ˜Ÿéš›æ—…è¡Œæœƒåœ¨æœªä¾†çš„æ›´æ–°åŠ å…¥éŠæˆ²~ load.sound = 音效載入中 load.map = 地圖載入中 @@ -38,12 +41,20 @@ be.ignore = 忽略 be.noupdates = 沒有新的更新。 be.check = æª¢æŸ¥æ˜¯å¦æœ‰æ–°çš„æ›´æ–° +mods.browser = 模組ç€è¦½å™¨ +mods.browser.selected = 已鏿¨¡çµ„ +mods.browser.add = å®‰è£ +mods.github.reinstall = 釿–°å®‰è£ +mods.github.open = 查看Github +mods.browser.sortdate = ä»¥æœ€è¿‘ç¯©é¸ +mods.browser.sortstars = ä»¥æ˜Ÿæ•¸ç¯©é¸ + schematic = è—圖 -schematic.add = 儲存è—圖... +schematic.add = 儲存è—圖…… schematics = è—圖 schematic.replace = 相åŒå稱的è—圖已經存在。是å¦å–代它? schematic.exists = 相åŒå稱的è—圖已經存在。 -schematic.import = 匯入è—圖... +schematic.import = 匯入è—圖…… schematic.exportfile = 匯出檔案 schematic.importfile = 匯入檔案 schematic.browseworkshop = ç€è¦½å·¥ä½œåŠ @@ -51,11 +62,13 @@ schematic.copy = 複製到剪貼簿 schematic.copy.import = 從剪貼簿匯入 schematic.shareworkshop = åˆ†äº«åˆ°å·¥ä½œåŠ schematic.flip = [accent][[{0}][]/[accent][[{1}][]:翻轉è—圖 -schematic.saved = è—圖已ä¿å­˜ã€‚ +schematic.saved = è—圖已儲存。 schematic.delete.confirm = 該è—圖將被完全清除。 schematic.rename = 釿–°å‘½åè—圖 schematic.info = {0}x{1}, {2}方塊 +schematic.disabled = [scarlet]è—圖被進用[]\nä½ ä¸èƒ½åœ¨é€™å€‹[accent]地圖[] 或 [accent]伺æœå™¨ä¸­ä½¿ç”¨è—圖. +stats = 統計 stat.wave = 打敗的波次:[accent]{0} stat.enemiesDestroyed = 摧毀的敵人:[accent]{0} stat.built = 建設的建築:[accent]{0} @@ -65,7 +78,7 @@ stat.delivered = 發射的核心資æºï¼š stat.playtime = éŠçŽ©æ™‚é–“ï¼š[accent] {0} stat.rank = 最終排å:[accent]{0} -globalitems = [accent]Global Items +globalitems = [accent]å…¨åŸŸç‰©å“ map.delete = 確èªè¦åˆªé™¤ã€Œ[accent]{0}[]ã€åœ°åœ–嗎? level.highscore = 最高分:[accent]{0} level.select = 鏿“‡é—œå¡ @@ -79,6 +92,7 @@ joingame = 多人連線 customgame = è‡ªè¨‚éŠæˆ² newgame = æ–°éŠæˆ² none = 〈沒有〉 +none.found = [lightgray]ã€ˆæŸ¥ç„¡çµæžœã€‰ minimap = å°åœ°åœ– position = ä½ç½® close = 關閉 @@ -91,97 +105,103 @@ continue = 繼續 maps.none = [lightgray]找ä¸åˆ°åœ°åœ–! invalid = 無效 pickcolor = 鏿“‡é¡è‰² -preparingconfig = é…置準備中 +preparingconfig = 設定準備中 preparingcontent = 內容準備中 uploadingcontent = 內容上傳中 uploadingpreviewfile = 上傳é è¦½æ–‡ä»¶ -committingchanges = æäº¤è®Šæ›´ +committingchanges = éžäº¤è®Šæ›´ done = å®Œæˆ -feature.unsupported = æ‚¨çš„è¨­å‚™ä¸æ”¯æŒæ­¤åŠŸèƒ½ã€‚ +feature.unsupported = 您的è£ç½®ä¸æ”¯æ´æ­¤åŠŸèƒ½ã€‚ -mods.alphainfo = 請記ä½ï¼Œæ¨¡çµ„ä»è™•æ–¼Alpha狀態,[scarlet]å¯èƒ½æœƒæœ‰å¾ˆå¤šBUG[].\nå‘Mindustry GitHub或Discord報告發ç¾çš„任何å•題。 -mods.alpha = [accent](Alpha) +mods.initfailed = [red]âš [] Mindustry 無法啟動。這å¯èƒ½æ˜¯å› æ¨¡çµ„造æˆã€‚\n\n為了é¿å…䏿–·é–ƒé€€ï¼Œ[red]所有的模組已被åœç”¨ã€‚[]\n\nè‹¥è¦å–消此設定,å¯åœ¨[accent]設定->éŠæˆ²->閃退後åœç”¨æ¨¡çµ„[]關閉設定. mods = 模組 mods.none = [lightgray]找ä¸åˆ°æ¨¡çµ„! mods.guide = æ¨¡çµ„æŒ‡å— mods.report = 回報錯誤 mods.openfolder = 開啟模組資料夾 +mods.viewcontent = 查看內容 mods.reload = 釿–°è¼‰å…¥ -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = éŠæˆ²å°‡æœƒçµæŸä»¥é‡æ–°è¼‰å…¥æ¨¡çµ„。 mod.display = [gray]模組:[orange]{0} +mod.installed = [[已安è£] mod.enabled = [lightgray]已啟用 mod.disabled = [scarlet]å·²ç¦ç”¨ +mod.multiplayer.compatible = [gray]與多人模å¼ç›¸å®¹ mod.disable = ç¦ç”¨ mod.content = 內容: mod.delete.error = 無法刪除模組,檔案å¯èƒ½åœ¨ä½¿ç”¨ä¸­ã€‚ mod.requiresversion = [scarlet]æœ€ä½ŽéŠæˆ²ç‰ˆæœ¬è¦æ±‚:[accent]{0} -mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) -mod.missingdependencies = [scarlet]缺少必須項目: {0} +mod.outdated = [scarlet]與 V6 ä¸ç›¸å®¹ï¼ˆç„¡ æœ€ä½ŽéŠæˆ²ç‰ˆæœ¬ï¼š105) +mod.missingdependencies = [scarlet]缺少ä¾è³´é—œä¿‚:{0} mod.erroredcontent = [scarlet]內容錯誤 mod.errors = 載入內容時發生錯誤 -mod.noerrorplay = [scarlet]你使用了有錯誤的模組。[] éŠæˆ²å‰è«‹å…ˆç¦ç”¨ç›¸é—œæ¨¡çµ„或修正錯誤。 -mod.nowdisabled = [scarlet]「{0}ã€æ¨¡çµ„缺少必須項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動ç¦ç”¨ã€‚ +mod.noerrorplay = [scarlet]你使用了有å•題的模組。[] éŠæˆ²å‰è«‹å…ˆåœç”¨ç›¸é—œæ¨¡çµ„或修正å•題。 +mod.nowdisabled = [scarlet]「{0}ã€æ¨¡çµ„缺少ä¾è³´é—œä¿‚:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動åœç”¨ã€‚ mod.enable = 啟用 mod.requiresrestart = éŠæˆ²å°‡ç«‹å³é—œé–‰ä»¥å¥—用模組變更。 mod.reloadrequired = [scarlet]需è¦é‡æ–°è¼‰å…¥ mod.import = 匯入模組 mod.import.file = 匯入檔案 mod.import.github = 匯入GitHub模組 -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR 模組本質上是ä¸å®‰å…¨çš„。[]\nè«‹ç¢ºä¿æ‚¨æ­£å¾žå¯ä¿¡çš„來æºåŒ¯å…¥é€™å€‹æ¨¡çµ„ï¼ mod.item.remove = æ­¤ç‰©å“æ˜¯[accent] '{0}'[]æ¨¡çµ„çš„ä¸€éƒ¨ä»½ã€‚è§£é™¤å®‰è£æ¨¡çµ„以移除此物å“。 mod.remove.confirm = 該模組將被刪除。 -mod.author = [lightgray]作者:[] {0} -mod.missing = æ­¤å­˜æª”å«æœ‰æ‚¨æœ€è¿‘更新或ä¸å†å®‰è£çš„æ¨¡çµ„。å¯èƒ½æœƒç™¼ç”Ÿå­˜æª”ææ¯€ã€‚您確定è¦è¼‰å…¥å—Žï¼Ÿ\n[lightgray]模組:\n{0} -mod.preview.missing = 在工作åŠç™¼ä½ˆé€™å€‹æ¨¡çµ„å‰ï¼Œæ‚¨å¿…須添加é è¦½åœ–。\n在該模組的資料夾中放置一個å為[accent] preview.png[]的圖片並é‡è©¦ã€‚ +mod.author = [lightgray]作者:[] {0} +mod.missing = æ­¤å­˜æª”å«æœ‰æ‚¨æœ€è¿‘更新或已解除安è£çš„æ¨¡çµ„。å¯èƒ½æœƒç™¼ç”Ÿå­˜æª”ææ¯€ã€‚您確定è¦è¼‰å…¥å—Žï¼Ÿ\n[lightgray]模組:\n{0} +mod.preview.missing = 在工作åŠç™¼ä½ˆé€™å€‹æ¨¡çµ„å‰ï¼Œæ‚¨å¿…須新增é è¦½åœ–。\n在該模組的資料夾中加入一個å為[accent] preview.png[]的圖片並é‡è©¦ã€‚ mod.folder.missing = åªæœ‰è³‡æ–™å¤¾å½¢å¼çš„æ¨¡çµ„å¯ä»¥åœ¨å·¥ä½œåŠä¸Šç™¼å¸ƒã€‚\nè¦å°‡æ¨¡çµ„轉æ›ç‚ºè³‡æ–™å¤¾ï¼Œåªéœ€å°‡å…¶æ–‡ä»¶è§£å£“縮到資料夾並刪除舊的.zipæª”ï¼Œç„¶å¾Œé‡æ–°å•Ÿå‹•éŠæˆ²æˆ–釿–°è¼‰å…¥æ¨¡çµ„。 -mod.scripts.disable = æ‚¨çš„è¨­å‚™ä¸æ”¯æŒåŒ…嫿Œ‡ä»¤æª”的模組。您必須關閉這些模組æ‰èƒ½é€²è¡ŒéŠæˆ²ã€‚ +mod.scripts.disable = 您的è£ç½®ä¸æ”¯æŒåŒ…嫿Œ‡ä»¤æª”的模組。您必須關閉這些模組æ‰èƒ½é€²è¡ŒéŠæˆ²ã€‚ about.button = 關於 name = å稱: noname = è«‹å…ˆé¸æ“‡ä¸€å€‹[accent]玩家å稱[]。 -planetmap = Planet Map -launchcore = Launch Core +planetmap = 星çƒåœ°åœ– +launchcore = 發射核心 filename = 檔案å稱︰ unlocked = å·²è§£éŽ–æ–°å…§å®¹ï¼ +available = å¯ç ”ç©¶æ–°ç§‘æŠ€ï¼ completed = [accent]å®Œæˆ techtree = 科技樹 +research.legacy = [accent]5.0[] 嵿¸¬åˆ°èˆŠæœ‰ç§‘技資料。\nè«‹å•è¦[accent]載入[]資料,還是[accent]放棄[]並é‡ç½®æ–°æˆ°å½¹çš„科技樹(建議)? +research.load = 載入 +research.discard = 放棄 research.list = [lightgray]研究︰ research = 研究 researched = [lightgray]{0}研究完æˆã€‚ -research.progress = {0}% complete +research.progress = {0}% å®Œæˆ players = {0}個線上玩家 players.single = {0}個線上玩家 players.search = æœå°‹ players.notfound = [gray]沒有找到玩家 -server.closing = [accent]正在關閉伺æœå™¨... +server.closing = [accent]正在關閉伺æœå™¨â€¦â€¦ server.kicked.kick = 您已被踢出伺æœå™¨ï¼ server.kicked.whitelist = 您ä¸åœ¨é€™è£¡çš„白å單內. server.kicked.serverClose = 伺æœå™¨å·²é—œé–‰ã€‚ server.kicked.vote = 您已被投票踢出伺æœå™¨ï¼Œå†è¦‹ã€‚ server.kicked.clientOutdated = 客戶端版本éŽèˆŠï¼è«‹æ›´æ–°éŠæˆ²ï¼ -server.kicked.serverOutdated = 伺æœå™¨ç‰ˆæœ¬éŽèˆŠï¼è«‹è¯çµ¡ä¼ºæœä¸»æ›´æ–°ä¼ºæœå™¨ï¼ -server.kicked.banned = 您已經在這個伺æœå™¨ä¸­è¢«å°ç¦ã€‚ +server.kicked.serverOutdated = 伺æœå™¨ç‰ˆæœ¬éŽèˆŠï¼è«‹è¯çµ¡ä¼ºæœå™¨ç®¡ç†å“¡æ›´æ–°ä¼ºæœå™¨ï¼ +server.kicked.banned = 您已經在這個伺æœå™¨ä¸­è¢«å°éŽ–ã€‚ server.kicked.typeMismatch = 該伺æœå™¨èˆ‡æ‚¨çš„版本ä¸ç›¸å®¹ã€‚ -server.kicked.playerLimit = 該伺æœå™¨å·²æ»¿ã€‚請等待一個空ä½ç½®ã€‚ +server.kicked.playerLimit = 該伺æœå™¨å·²æ»¿ã€‚請等待玩家離開。 server.kicked.recentKick = 您最近曾被踢出伺æœå™¨ã€‚\nè«‹ç¨å¾Œå†é€²è¡Œé€£ç·šã€‚ server.kicked.nameInUse = 伺æœå™¨ä¸­å·²ç¶“\n有人有相åŒçš„å稱了。 server.kicked.nameEmpty = ä½ çš„å稱必須至少包å«ä¸€å€‹å­—æ¯æˆ–數字。 server.kicked.idInUse = 你已經在伺æœå™¨ä¸­ï¼ä¸å…許使用兩個帳號。 -server.kicked.customClient = 這個伺æœå™¨ä¸æ”¯æŒè‡ªè¨‚客戶端,請下載官方版本。 +server.kicked.customClient = 這個伺æœå™¨ä¸æ”¯æ´è‡ªè¨‚的客戶端,請下載官方版本。 server.kicked.gameover = éŠæˆ²çµæŸï¼ server.kicked.serverRestarting = 伺æœå™¨æ­£åœ¨é‡æ–°å•Ÿå‹•。 server.versions = æ‚¨çš„éŠæˆ²ç‰ˆæœ¬:[accent] {0}[]\n伺æœå™¨éŠæˆ²ç‰ˆæœ¬:[accent] {1}[] -host.info = [accent]建立伺æœå™¨[]æŒ‰éµæœƒåœ¨é€£æŽ¥åŸ [scarlet]6567[]建立一個伺æœå™¨ã€‚\n所有跟您在åŒä¸€å€‹[lightgray]網路或å€åŸŸç¶²è·¯[]環境的玩家應該能在他們的伺æœå™¨æ¸…單中找到您的伺æœå™¨ã€‚\n\n如果您希望網際網路上的玩家é€éŽIP ä½å€é€£ç·šåˆ°æ‚¨çš„伺æœå™¨ï¼Œæ‚¨å¿…須設定[accent]連接埠轉發[]。\n\n[lightgray]注æ„:如果å€åŸŸç¶²è·¯å…§æœ‰çŽ©å®¶ç„¡æ³•é€£ç·šè‡³æ‚¨çš„ä¼ºæœå™¨ï¼Œè«‹å‹™å¿…ç¢ºèªæ‚¨å·²æ–¼é˜²ç«ç‰†è¨­å®šä¸­é–‹æ”¾Mindustryå­˜å–æ‚¨çš„å€åŸŸç¶²è·¯ã€‚請注æ„公共網路有時ä¸å…許æœå°‹ä¼ºæœå™¨ã€‚ -join.info = 您å¯ä»¥åœ¨æ­¤è¼¸å…¥æ¬²é€£ç·šçš„[accent]伺æœå™¨IPä½å€[],或尋找[accent]å€åŸŸç¶²è·¯[]/[accent]全域網路[]內的伺æœå™¨ã€‚ç›®å‰æ”¯æ´å€åŸŸç¶²è·¯èˆ‡ç¶²éš›ç¶²è·¯é€£ç·šã€‚\n\n[lightgray]如果您想é€éŽIPä½å€é€£ç·šåˆ°ä»–人的伺æœå™¨ï¼Œæ‚¨å¿…é ˆå‘他們詢å•IPä½å€ã€‚自己的IPä½ç½®å¯ä»¥å¾žgoogle上æœå°‹åˆ°ã€‚ +host.info = [accent]建立伺æœå™¨[]æŒ‰éµæœƒåœ¨é€£æŽ¥åŸ [scarlet]6567[]建立一個伺æœå™¨ã€‚\n所有跟您在åŒä¸€å€‹[lightgray]網路或å€åŸŸç¶²è·¯[]環境的玩家應該能在他們的伺æœå™¨æ¸…單中找到您的伺æœå™¨ã€‚\n\n如果您希望網際網路上的玩家é€éŽ IP ä½ç½®é€£ç·šåˆ°æ‚¨çš„伺æœå™¨ï¼Œæ‚¨å¿…須設定[accent]連接埠轉發[]。\n\n[lightgray]注æ„:如果å€åŸŸç¶²è·¯å…§æœ‰çŽ©å®¶ç„¡æ³•é€£ç·šè‡³æ‚¨çš„ä¼ºæœå™¨ï¼Œè«‹å‹™å¿…ç¢ºèªæ‚¨å·²æ–¼é˜²ç«ç‰†è¨­å®šä¸­é–‹æ”¾ Mindustry å­˜å–æ‚¨çš„å€åŸŸç¶²è·¯ã€‚請注æ„公用網路有時ä¸å…許æœå°‹ä¼ºæœå™¨ã€‚ +join.info = 您å¯ä»¥åœ¨æ­¤è¼¸å…¥æ¬²é€£ç·šçš„[accent]伺æœå™¨ IP ä½ç½®[],或尋找[accent]å€åŸŸç¶²è·¯[]ï¼[accent]網際網路[]內的伺æœå™¨ã€‚ç›®å‰æ”¯æ´å€åŸŸç¶²è·¯èˆ‡ç¶²éš›ç¶²è·¯é€£ç·šã€‚\n\n[lightgray]如果您想é€éŽ IP ä½ç½®é€£ç·šåˆ°ä»–人的伺æœå™¨ï¼Œæ‚¨å¿…é ˆå‘ä»–å€‘è©¢å• IP ä½ç½®ã€‚自己的 IP ä½ç½®å¯ä»¥å¾ž Google 上æœå°‹åˆ°ã€‚ hostserver = 建立伺æœå™¨ invitefriends = é‚€è«‹å¥½å‹ hostserver.mobile = 建立\n伺æœå™¨ host = 伺æœå™¨ -hosting = [accent]伺æœå™¨å•Ÿå‹•中... +hosting = [accent]伺æœå™¨å•Ÿå‹•中…… hosts.refresh = 刷新 hosts.discovering = æœå°‹å€åŸŸç¶²è·¯éŠæˆ² hosts.discovering.any = æœå°‹éŠæˆ² -server.refreshing = 伺æœå™¨åˆ·æ–°ä¸­ +server.refreshing = 伺æœå™¨é‡æ–°æ•´ç†ä¸­ hosts.none = [lightgray]找ä¸åˆ°å€åŸŸç¶²è·¯ä¼ºæœå™¨ï¼ host.invalid = [scarlet]無法連線至伺æœå™¨ã€‚ @@ -189,15 +209,22 @@ servers.local = å€åŸŸä¼ºæœå™¨ servers.remote = é ç«¯ä¼ºæœå™¨ servers.global = 社群伺æœå™¨ +servers.disclaimer = 社群伺æœå™¨[accent]䏿˜¯[]ç”±é–‹ç™¼è€…æ“æœ‰æˆ–管ç†ã€‚\n\n伺æœå™¨å¯èƒ½æœƒå‡ºç¾ç”±å…¶ä»–玩家製作的ä¸é©ç•¶å…§å®¹ã€‚ +servers.showhidden = 顯示被隱è—的伺æœå™¨ +server.shown = 已顯示 +server.hidden = å·²éš±è— + trace = 追蹤玩家 trace.playername = 玩家å稱:[accent]{0} trace.ip = IP:[accent]{0} trace.id = ID:[accent]{0} trace.mobile = 行動客戶端:[accent]{0} trace.modclient = 自訂客戶端:[accent]{0} -invalidid = 無效的客戶端 IDï¼è«‹æäº¤éŒ¯èª¤å ±å‘Šã€‚ -server.bans = å°ç¦ -server.bans.none = 沒有玩家被å°ç¦ï¼ +trace.times.joined = 加入次數:[accent]{0} +trace.times.kicked = 踢除次數:[accent]{0} +invalidid = 無效的客戶端 IDï¼è«‹éžäº¤éŒ¯èª¤å›žå ±ã€‚ +server.bans = å°éŽ– +server.bans.none = 沒有玩家被å°éŽ–ï¼ server.admins = 管ç†å“¡ server.admins.none = 找ä¸åˆ°ç®¡ç†å“¡ï¼ server.add = 新增伺æœå™¨ @@ -207,29 +234,30 @@ server.outdated = [crimson]伺æœå™¨ç‰ˆæœ¬éŽèˆŠï¼[] server.outdated.client = [crimson]客戶端版本éŽèˆŠï¼[] server.version = [gray]v{0} {1} server.custombuild = [accent]自訂客戶端 -confirmban = 您確定è¦å°ç¦ã€Œ[white]{0}[]ã€å—Žï¼Ÿ +confirmban = 您確定è¦å°éŽ–ã€Œ[white]{0}[]ã€å—Žï¼Ÿ confirmkick = 您確定è¦è¸¢å‡ºã€Œ[white]{0}[]ã€å—Žï¼Ÿ -confirmvotekick = æ‚¨ç¢ºå®šè¦æŠ•ç¥¨å‰”é™¤ã€Œ[white]{0}[]ã€å—Ž? -confirmunban = 您確定è¦è§£é™¤å°ç¦é€™å€‹çŽ©å®¶å—Žï¼Ÿ +confirmvotekick = æ‚¨ç¢ºå®šè¦æŠ•ç¥¨è¸¢å‡ºã€Œ[white]{0}[]ã€å—Ž? +confirmunban = 您確定è¦è§£é™¤å°éŽ–é€™å€‹çŽ©å®¶å—Žï¼Ÿ confirmadmin = æ‚¨ç¢ºå®šè¦æ™‰å‡ã€Œ[white]{0}[]ã€ç‚ºç®¡ç†å“¡å—Žï¼Ÿ confirmunadmin = 您確定è¦è§£é™¤ã€Œ[white]{0}[]ã€çš„管ç†å“¡å—Žï¼Ÿ joingame.title = åŠ å…¥éŠæˆ² -joingame.ip = IPä½å€ï¼š +joingame.ip = IP ä½ç½®ï¼š disconnect = 已中斷連線。 disconnect.error = 連線錯誤。 disconnect.closed = 連線關閉。 -disconnect.timeout = 連線超時。 +disconnect.timeout = 連線逾時。 disconnect.data = ç„¡æ³•è¼‰å…¥åœ°åœ–è³‡æ–™ï¼ cantconnect = ç„¡æ³•åŠ å…¥éŠæˆ² ([accent]{0}[]). -connecting = [accent]連線中... -connecting.data = [accent]地圖資料載入中... +connecting = [accent]連線中…… +reconnecting = [accent]釿–°é€£æŽ¥ä¸­â€¦â€¦ +connecting.data = [accent]地圖資料載入中…… server.port = 連接埠: -server.addressinuse = 該ä½å€å·²è¢«ä½¿ç”¨ï¼ +server.addressinuse = 該ä½ç½®å·²è¢«ä½¿ç”¨ï¼ server.invalidport = ç„¡æ•ˆçš„é€£æŽ¥åŸ ï¼ server.error = [crimson]建立伺æœå™¨æ™‚發生錯誤。 save.new = 新存檔 -save.overwrite = 您確定è¦è¦†è“‹å­˜æª”嗎? -overwrite = 覆蓋 +save.overwrite = 您確定è¦è¦†å¯«å­˜æª”嗎? +overwrite = 覆寫 save.none = 找ä¸åˆ°å­˜æª”ï¼ savefail = å­˜æª”å¤±æ•—ï¼ save.delete.confirm = 您確定è¦åˆªé™¤é€™å€‹å­˜æª”嗎? @@ -245,16 +273,16 @@ save.rename.text = æ–°å稱: selectslot = é¸å–一個存檔。 slot = [accent]存檔{0} editmessage = ç·¨è¼¯è¨Šæ¯ -save.corrupted = [accent]æ­¤å­˜æª”ç„¡æ•ˆæˆ–å·²ææ¯€ï¼\n如果你剛剛å‡ç´šäº†éŠæˆ²ï¼Œé‚£éº¼é€™å¯èƒ½æ˜¯å› ç‚ºå­˜æª”æ ¼å¼æ”¹è®Šäº†è€Œ[scarlet]䏿˜¯[]錯誤。 +save.corrupted = æ­¤å­˜æª”ç„¡æ•ˆæˆ–å·²ææ¯€ï¼ empty = 〈空白〉 on = 開啟 off = 關閉 save.autosave = 自動存檔:{0} save.map = 地圖:{0} save.wave = 波次:{0} -save.mode = éŠæˆ²æ¨¡å¼: {0} +save.mode = éŠæˆ²æ¨¡å¼ï¼š{0} save.date = 最後存檔時間:{0} -save.playtime = éŠçŽ©æ™‚é–“:{0} +save.playtime = éŠçŽ©æ™‚é–“ï¼š{0} warning = 警告。 confirm = ç¢ºèª delete = 刪除 @@ -267,102 +295,114 @@ cancel = å–æ¶ˆ openlink = é–‹å•Ÿé€£çµ copylink = è¤‡è£½é€£çµ back = 返回 +max = æœ€å¤§é‡ +crash.export = 匯出當機報告。 +crash.none = 無當機報告。 +crash.exported = 已匯出當機報告。 data.export = 匯出數據 data.import = 匯入數據 data.openfolder = 開啟檔案資料夾 -data.exported = 數據已匯出。 +data.exported = 資料已匯出。 data.invalid = 這䏿˜¯æœ‰æ•ˆçš„éŠæˆ²è³‡æ–™ã€‚ -data.import.confirm = 導入外部數據將覆蓋您當å‰[scarlet]所有的[]éŠæˆ²æ•¸æ“šï¼Œ\n[accent]這個動作ä¸èƒ½æ’¤éŠ·![]\n\nåŒ¯å…¥æ•¸æ“šå¾Œï¼Œæ‚¨çš„éŠæˆ²å°‡ç«‹å³é€€å‡ºã€‚ -quit.confirm = 您確定è¦é€€å‡ºå—Žï¼Ÿ -quit.confirm.tutorial = 您確定您知é“自己在åšä»€éº¼å—Ž?\n該教學å¯ä»¥åœ¨[accent] 設定->éŠæˆ²[] é¸é …中é‡ç½®æ•™å­¸ã€‚ -loading = [accent]載入中... -reloading = [accent]æ¨¡çµ„é‡æ–°è¼‰å…¥ä¸­... -saving = [accent]儲存中... +data.import.confirm = 導入外部資料將會覆寫您目å‰[scarlet]所有的[]éŠæˆ²è³‡æ–™ï¼Œ\n[accent]此動作無法復原ï¼[]\n\nåŒ¯å…¥è³‡æ–™å¾Œï¼Œæ‚¨çš„éŠæˆ²å°‡ç«‹åˆ»çµæŸã€‚ +quit.confirm = 您確定è¦çµæŸå—Žï¼Ÿ +quit.confirm.tutorial = 您確定您知é“自己在åšä»€éº¼å—Ž?\nå¯ä»¥åœ¨[accent] 設定-éŠæˆ²[] é¸é …中é‡è¨­æ•™å­¸ã€‚ +loading = [accent]載入中…… +reloading = [accent]æ¨¡çµ„é‡æ–°è¼‰å…¥ä¸­â€¦â€¦ +saving = [accent]儲存中…… respawn = [accent][[{0}][]é‡ç”Ÿ cancelbuilding = [accent][[{0}][]清除計畫 selectschematic = [accent][[{0}][]鏿“‡ä¸¦è¤‡è£½ pausebuilding = [accent][[{0}][]æš«åœå»ºé€  -resumebuilding = [scarlet][[{0}][]æ¢å¾©å»ºé€  +resumebuilding = [scarlet][[{0}][]繼續建造 +enablebuilding = [scarlet][[{0}][]啟用建造 +showui = 已隱è—介é¢ã€‚\n按[accent][[{0}][]顯示介é¢ã€‚ wave = [accent]第{0}æ³¢ +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]將於{0}ç§’å¾ŒæŠµé” wave.waveInProgress = [lightgray]波次進行中 -waiting = [lightgray]等待中... -waiting.players = 等待玩家中... +waiting = [lightgray]等待中…… +waiting.players = 等待玩家中…… wave.enemies = [lightgray]剩下{0}個敵人 +wave.enemycores = [accent]{0}[lightgray]個敵方核心 +wave.enemycore = [accent]{0}[lightgray]個敵方核心 wave.enemy = [lightgray]剩下{0}個敵人 -loadimage = è¼‰å…¥åœ–åƒ -saveimage = å„²å­˜åœ–åƒ +wave.guardianwarn = 頭目將在[accent]{0}[]波後抵é”。 +wave.guardianwarn.one = 頭目將在[accent]{0}[]波後抵é”。 +loadimage = 載入圖片 +saveimage = 儲存圖片 unknown = 未知 custom = 自訂 builtin = 内建 -map.delete.confirm = 確èªè¦åˆªé™¤åœ°åœ–嗎?此æ“ä½œç„¡æ³•æ’¤å›žï¼ +map.delete.confirm = 確èªè¦åˆªé™¤åœ°åœ–å—Žï¼Ÿæ­¤å‹•ä½œç„¡æ³•å¾©åŽŸï¼ map.random = [accent]隨機地圖 map.nospawn = 這個地圖沒有核心ï¼è«‹åœ¨ç·¨è¼¯å™¨ä¸­æ·»åР䏀個[accent]橘色[]的核心。 map.nospawn.pvp = é€™å€‹åœ°åœ–æ²’æœ‰æ•µå°æ ¸å¿ƒè®“玩家é‡ç”Ÿï¼è«‹åœ¨ç·¨è¼¯å™¨ä¸­æ·»åР䏀個[scarlet]䏿˜¯æ©˜è‰²[]的核心。 map.nospawn.attack = 這個地圖沒有敵人核心å¯ä»¥æ”»æ“Šï¼è«‹åœ¨ç·¨è¼¯å™¨ä¸­æ·»åР䏀個[scarlet]紅色[]的核心。 -map.invalid = 地圖載入錯誤:地圖å¯èƒ½å·²ç¶“æå£žã€‚ +map.invalid = 地圖載入錯誤:地圖å¯èƒ½å·²ç¶“ææ¯€ã€‚ workshop.update = æ›´æ–°é …ç›® -workshop.error = æå–工作åŠè©³ç´°ä¿¡æ¯æ™‚出錯: {0} -map.publish.confirm = 您確定è¦ç™¼å¸ƒæ­¤åœ°åœ–å—Ž?\n\n[lightgray]é¦–å…ˆè«‹å…ˆç¢ºå®šæ‚¨åŒæ„Steamå·¥åŠ EULAå”定,å¦å‰‡æ‚¨çš„åœ°åœ–å°‡ä¸æœƒé¡¯ç¤ºï¼ -workshop.menu = 鏿“‡æ‚¨è¦å°æ­¤é …目執行的æ“作。 -workshop.info = é …ç›®ä¿¡æ¯ -changelog = 變更日誌(å¯é¸): +workshop.error = æ“·å–工作åŠè©³ç´°è³‡è¨Šæ™‚出錯:{0} +map.publish.confirm = 您確定è¦ç™¼å¸ƒæ­¤åœ°åœ–å—Ž?\n\n[lightgray]é¦–å…ˆè«‹å…ˆç¢ºå®šæ‚¨åŒæ„ Steam 工作åŠçš„ EULA,å¦å‰‡æ‚¨çš„åœ°åœ–å°‡ä¸æœƒé¡¯ç¤ºï¼ +workshop.menu = 鏿“‡æ‚¨è¦å°æ­¤é …目執行的動作。 +workshop.info = 項目資訊 +changelog = è®Šå‹•ç´€éŒ„ï¼ˆé¸æ“‡æ€§ï¼‰ï¼š eula = Steam EULA -missing = 此項目已被刪除或移動。\n[lightgray]工作åŠåˆ—表ç¾åœ¨å·²è‡ªå‹•å–æ¶ˆéˆæŽ¥ã€‚ -publishing = [accent]發佈中... -publish.confirm = 您確定è¦ç™¼å¸ƒå—Žï¼Ÿ\n\n[lightgray]é¦–å…ˆç¢ºå®šæ‚¨åŒæ„Workshop EULA,å¦å‰‡æ‚¨çš„é …ç›®å°‡ä¸æœƒé¡¯ç¤ºï¼ -publish.error = 發佈項目時出錯: {0} -steam.error = Steam æœå‹™åˆå§‹åŒ–失敗.\n錯誤: {0} +missing = 此項目已被刪除或移動。\n[lightgray]工作åŠåˆ—表ç¾åœ¨å·²è‡ªå‹•å–æ¶ˆé€£çµã€‚ +publishing = [accent]發佈中…… +publish.confirm = 您確定è¦ç™¼å¸ƒå—Žï¼Ÿ\n\n[lightgray]é¦–å…ˆç¢ºå®šæ‚¨åŒæ„ Workshop EULA,å¦å‰‡æ‚¨çš„é …ç›®å°‡ä¸æœƒé¡¯ç¤ºï¼ +publish.error = 發佈項目時發生å•題:{0} +steam.error = Steam æœå‹™åˆå§‹åŒ–失敗。\n錯誤:{0} -editor.brush = 粉刷 +editor.brush = 筆刷 editor.openin = 在編輯器中開啟 editor.oregen = ç¤¦çŸ³ç”Ÿæˆ editor.oregen.info = 礦石生æˆï¼š editor.mapinfo = 地圖資訊 editor.author = 作者: editor.description = æè¿°ï¼š -editor.nodescription = 在地圖發佈å‰å¿…須有至少四個字以上的敘述。 +editor.nodescription = 在地圖發佈å‰å¿…須有至少四個字以上的æè¿°ã€‚ editor.waves = 波次: editor.rules = è¦å‰‡ï¼š -editor.generation = 篩é¸å™¨: +editor.generation = 自動生æˆï¼š editor.ingame = åœ¨éŠæˆ²ä¸­ç·¨è¼¯ editor.publish.workshop = 在工作åŠä¸Šç™¼ä½ˆ editor.newmap = 新地圖 +editor.center = 中心 workshop = å·¥ä½œåŠ waves.title = 波次 waves.remove = 移除 -waves.never = 〈永é ã€‰ waves.every = æ¯ waves.waves = 波次 waves.perspawn = æ¯æ¬¡ç”Ÿæˆ waves.shields = 護盾/波次 waves.to = 至 -waves.guardian = 守衛者 +waves.guardian = é ­ç›® waves.preview = é è¦½ -waves.edit = 編輯... -waves.copy = è¤‡è£½åˆ°å‰ªè²¼æ¿ -waves.load = 從剪貼æ¿åŠ è¼‰ -waves.invalid = 剪貼æ¿ä¸­çš„æ³¢æ¬¡ç„¡æ•ˆã€‚ -waves.copied = 波次已被複製。 -waves.none = 無自定義敵人.\n請注æ„,空佈局將自動替æ›ç‚ºé è¨­ä½ˆå±€ã€‚ +waves.edit = 編輯…… +waves.copy = 複製到剪貼簿 +waves.load = 從剪貼簿載入 +waves.invalid = 剪貼簿中的波次無效。 +waves.copied = 波次已複製。 +waves.none = 無自訂敵人。\n請注æ„,若沒有波次佈局將自動替æ›ç‚ºé è¨­ä½ˆå±€ã€‚ -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health +#校正用空行 +wavemode.counts = æ•¸é‡ +wavemode.totals = 總數 +wavemode.health = 生命值 -editor.default = [lightgray]〈默èªã€‰ -details = 詳情... -edit = 編輯... +editor.default = [lightgray](é è¨­ï¼‰ +details = 詳細資訊…… +edit = 編輯…… editor.name = å稱: editor.spawn = é‡ç”Ÿå–®ä½ editor.removeunit = ç§»é™¤å–®ä½ editor.teams = éšŠä¼ -editor.errorload = 加載文件時出錯:\n[accent]{0} -editor.errorsave = ä¿å­˜æ–‡ä»¶æ™‚出錯:\n[accent]{0} -editor.errorimage = é€™æ˜¯ä¸€å€‹åœ–åƒæª”ï¼Œè€Œä¸æ˜¯åœ°åœ–。ä¸è¦æ›´æ”¹å‰¯æª”å使它å¯ç”¨ã€‚\n\n如果è¦åŒ¯å…¥åœ°å½¢åœ–åƒæª”ï¼Œè«‹ä½¿ç”¨ç·¨è¼¯å™¨ä¸­çš„ã€ŒåŒ¯å…¥åœ°å½¢åœ–åƒæª”ã€æŒ‰éˆ•。 -editor.errorlegacy = æ­¤åœ°åœ–å¤ªèˆŠï¼Œä¸¦ä½¿ç”¨ä¸æ”¯æŒçš„舊地圖格å¼ã€‚ -editor.errornot = 這䏿˜¯ä¸€å€‹åœ°åœ–檔案。 -editor.errorheader = 此地圖檔案無效或已æå£žã€‚ +editor.errorload = 載入檔案時發生å•題。 +editor.errorsave = 儲存檔案時發生å•題。 +editor.errorimage = 這是圖片檔,而éžåœ°åœ–。 +editor.errorlegacy = æ­¤åœ°åœ–å¤ªèˆŠï¼Œä¸¦ä½¿ç”¨ä¸æ”¯æ´çš„舊地圖格å¼ã€‚ +editor.errornot = 這䏿˜¯åœ°åœ–檔。 +editor.errorheader = æ­¤åœ°åœ–æª”ç„¡æ•ˆæˆ–å·²ææ¯€ã€‚ editor.errorname = 地圖沒有定義å稱。 editor.update = æ›´æ–° editor.randomize = 隨機化 @@ -372,24 +412,24 @@ editor.resize = èª¿æ•´å¤§å° editor.loadmap = 載入地圖 editor.savemap = 儲存地圖 editor.saved = å·²å„²å­˜ï¼ -editor.save.noname = 您的地圖沒有å稱ï¼åœ¨ã€Œåœ°åœ–資訊ã€ç•«é¢è¨­ç½®ä¸€å€‹å稱。 -editor.save.overwrite = 您的地圖覆寫一個內建的地圖ï¼åœ¨ã€Œåœ°åœ–ä¿¡æ¯ã€ç•«é¢è¨­ç½®ä¸€å€‹ä¸åŒçš„å稱。 -editor.import.exists = [scarlet]匯入失敗:[]一個å«ã€Œ{0}ã€çš„å…§å»ºåœ°åœ–å·²å­˜åœ¨ï¼ -editor.import = 匯入... +editor.save.noname = 您的地圖沒有å稱ï¼åœ¨ã€Œåœ°åœ–資訊ã€ç•«é¢è¨­å®šä¸€å€‹å稱。 +editor.save.overwrite = 您的地圖覆寫了內建的地圖ï¼åœ¨ã€Œåœ°åœ–資訊ã€ç•«é¢è¨­å®šå…¶ä»–å稱。 +editor.import.exists = [scarlet]匯入失敗:[]å«ã€Œ{0}ã€çš„å…§å»ºåœ°åœ–å·²å­˜åœ¨ï¼ +editor.import = 匯入…… editor.importmap = 匯入地圖 -editor.importmap.description = 匯入一個已存在的地圖 +editor.importmap.description = 匯入已存在的地圖 editor.importfile = 匯入檔案 -editor.importfile.description = 匯入一個外部的地圖檔案 -editor.importimage = åŒ¯å…¥åœ°å½¢åœ–åƒæª” -editor.importimage.description = åŒ¯å…¥ä¸€å€‹å¤–éƒ¨çš„åœ°å½¢åœ–åƒæª” -editor.export = 匯出... +editor.importfile.description = 匯入外部的地圖檔案 +editor.importimage = 匯入地形圖片檔 +editor.importimage.description = 匯入外部的地形圖片檔 +editor.export = 匯出…… editor.exportfile = 匯出檔案 -editor.exportfile.description = 匯出一個地圖檔案 -editor.exportimage = åŒ¯å‡ºåœ°å½¢åœ–åƒæª” -editor.exportimage.description = åŒ¯å‡ºä¸€å€‹åœ°å½¢åœ–åƒæª” -editor.loadimage = è¼‰å…¥åœ–åƒ -editor.saveimage = å„²å­˜åœ–åƒ -editor.unsaved = [scarlet]尚未儲存變更ï¼[]\n您確定è¦é€€å‡ºå—Žï¼Ÿ +editor.exportfile.description = 匯出地圖檔 +editor.exportimage = 匯出地形圖片檔 +editor.exportimage.description = 匯出地形圖片檔 +editor.loadimage = 載入圖片 +editor.saveimage = 儲存圖片 +editor.unsaved = 您確定è¦é€€å‡ºå—Žï¼Ÿ\n[scarlet](å°‡éºå¤±æœªå„²å­˜çš„變更)[] editor.resizemap = èª¿æ•´åœ°åœ–å¤§å° editor.mapname = 地圖å稱: editor.overwrite = [accent]警告ï¼é€™å°‡æœƒè¦†è“‹ç¾æœ‰çš„地圖。 @@ -404,18 +444,19 @@ toolmode.replaceall.description = å–代地圖中的所有方塊。 toolmode.orthogonal = 垂直 toolmode.orthogonal.description = 僅繪製在垂直線上。 toolmode.square = 正方形 -toolmode.square.description = 正方形筆刷. +toolmode.square.description = 正方形筆刷。 toolmode.eraseores = 清除礦物 toolmode.eraseores.description = 僅清除礦物。 toolmode.fillteams = 填充團隊 -toolmode.fillteams.description = å¡«å……åœ˜éšŠè€Œä¸æ˜¯æ–¹å¡Šã€‚ +toolmode.fillteams.description = å¡«å……åœ˜éšŠè€Œéžæ–¹å¡Šã€‚ toolmode.drawteams = 繪製團隊 -toolmode.drawteams.description = ç¹ªè£½åœ˜éšŠè€Œä¸æ˜¯æ–¹å¡Šã€‚ +toolmode.drawteams.description = ç¹ªè£½åœ˜éšŠè€Œéžæ–¹å¡Šã€‚ -filters.empty = [lightgray]æ²’æœ‰éŽæ¿¾å™¨ï¼ä½¿ç”¨ä¸‹é¢çš„æŒ‰éˆ•添加一個。 +filters.empty = [lightgray]æ²’æœ‰éŽæ¿¾å™¨ï¼ä½¿ç”¨ä¸‹é¢çš„æŒ‰éˆ•新增一個。 filter.distort = 扭曲 filter.noise = 雜訊 filter.enemyspawn = 敵人é‡ç”Ÿé¸æ“‡ +filter.spawnpath = 生æˆè·¯å¾‘ filter.corespawn = æ ¸å¿ƒé¸æ“‡ filter.median = 平凿•¸ filter.oremedian = ç¤¦çŸ³å¹³å‡æ•¸ @@ -440,6 +481,7 @@ filter.option.amount = æ•¸é‡ filter.option.block = 方塊 filter.option.floor = åœ°æ¿ filter.option.flooronto = ç›®æ¨™åœ°æ¿ +filter.option.target = 目標 filter.option.wall = 牆 filter.option.ore = 礦石 filter.option.floor2 = 次è¦åœ°æ¿ @@ -455,179 +497,269 @@ campaign = 戰役 load = 載入 save = 儲存 fps = FPS:{0} -ping = å»¶é²ï¼š{0}ms +ping = å»¶é²ï¼š{0}毫秒 +memory = Mem: {0}mb +memory2 = Mem:\n {0}mb +\n {1}mb language.restart = è«‹é‡æ–°å•Ÿå‹•éŠæˆ²ä»¥ä½¿é¸å–的語言生效。 settings = 設定 tutorial = 教學 -tutorial.retake = é‡ç½®æ•™å­¸ +tutorial.retake = é‡è¨­æ•™å­¸ editor = 地圖編輯器 mapeditor = 地圖編輯器 abandon = 放棄 -abandon.text = æ­¤å€åŸŸåŠå…¶æ‰€æœ‰è³‡æºå°‡æœƒä¸Ÿå¤±çµ¦æ•µäººã€‚ +abandon.text = æ­¤å€åŸŸåŠå…¶æ‰€æœ‰è³‡æºå°‡æœƒæ”¾æ£„,並給敵人使用。 locked = 鎖定 complete = [lightgray]完æˆï¼š requirement.wave = 在{1}到é”第{0}æ³¢ requirement.core = 在{0}摧毀敵人核心 -requirement.research = Research {0} -requirement.capture = Capture {0} -resume = 繼續å€åŸŸï¼š\n[lightgray]{0} +requirement.research = 研究 {0} +requirement.produce = 生產 {0} +requirement.capture = æ•ç² {0} bestwave = [lightgray]最高波次:{0} -launch = < 發射 > -launch.text = Launch -launch.title = 發射æˆåŠŸ -launch.next = [lightgray]下次的機會於波次{0} -launch.unable2 = [scarlet]無法發射核心。[] -launch.confirm = 這將發射核心中的所有資æºã€‚\n你將無法返回這個基地。 -launch.skip.confirm = 如果您ç¾åœ¨è·³éŽï¼Œæ‚¨å°‡ç„¡æ³•發射核心直到下一次的å¯ç™¼å°„波數。 +launch.text = 發射 +research.multiplayer = åªæœ‰ç®¡ç†è€…å¯ä»¥ä½¿ç”¨é€™å€‹ç‰©å“ uncover = 探索 -configure = é…ç½®è£è¼‰ -loadout = Loadout -resources = Resources -bannedblocks = ç¦ç”¨æ–¹å¡Š +configure = 設定 + +loadout = è£è¼‰ +resources = è³‡æº +bannedblocks = åœç”¨æ–¹å¡Š addall = 全部加入 -launch.destination = Destination: {0} +launch.from = 發射來æºï¼š[accent]{0} +launch.destination = 目的地:{0} configure.invalid = 數值必須介於 0 到 {0}。 -zone.unlocked = [lightgray]{0}已解鎖。 -zone.requirement.complete = åˆ°é”æ³¢æ¬¡{0}:\n滿足{1}å€åŸŸè¦æ±‚。 -zone.resources = [lightgray]檢測到的資æºï¼š -zone.objective = [lightgray]目標: [accent]{0} -zone.objective.survival = 生存 -zone.objective.attack = 摧毀敵人核心 -add = 新增... +add = 新增…… boss.health = é ­ç›®è¡€é‡ -connectfail = [crimson]伺æœå™¨é€£ç·šéŒ¯èª¤ï¼š[accent]{0} -error.unreachable = 無法到é”伺æœå™¨ã€‚請確èªä½å€æ˜¯å¦æ­£ç¢ºï¼Ÿ -error.invalidaddress = 無效的ä½å€ã€‚ -error.timedout = 連線超時ï¼\n確ä¿ä¼ºæœå™¨è¨­ç½®äº†é€£æŽ¥åŸ è½‰ç™¼ï¼Œä¸¦ä¸”ä½å€æ­£ç¢ºï¼ -error.mismatch = å°åŒ…錯誤:\n客戶端/伺æœå™¨ç‰ˆæœ¬å¯èƒ½ä¸åŒ¹é…。\n確ä¿å®¢æˆ¶ç«¯å’Œä¼ºæœå™¨éƒ½æœ‰æœ€æ–°ç‰ˆæœ¬çš„Mindustryï¼ -error.alreadyconnected = 已連接。 +connectfail = [scarlet]伺æœå™¨é€£ç·šéŒ¯èª¤ï¼š\n\n[accent]{0} +error.unreachable = 無法連線到伺æœå™¨ã€‚è«‹ç¢ºèªæ‹¼å­—æ˜¯å¦æ­£ç¢ºï¼Ÿ +error.invalidaddress = 無效的網å€ã€‚ +error.timedout = 連線逾時ï¼\n確ä¿ä¼ºæœå™¨è¨­ç½®äº†é€£æŽ¥åŸ è½‰ç™¼ä¸”ç¶²å€æ­£ç¢ºï¼ +error.mismatch = å°åŒ…錯誤:\n客戶端/伺æœå™¨ç‰ˆæœ¬å¯èƒ½ä¸ç›¸ç¬¦ã€‚\n確ä¿å®¢æˆ¶ç«¯å’Œä¼ºæœå™¨éƒ½æœ‰æœ€æ–°ç‰ˆæœ¬çš„ Mindustryï¼ +error.alreadyconnected = 已連線。 error.mapnotfound = 找ä¸åˆ°åœ°åœ–ï¼ -error.io = 網絡輸出入錯誤。 -error.any = 未知網絡錯誤。 -error.bloom = åˆå§‹åŒ–特效失敗.\n您的設備å¯èƒ½ä¸æ”¯æ´å®ƒ +error.io = 網路錯誤。 +error.any = 未知網路錯誤。 +error.bloom = åˆå§‹åŒ–特效失敗。\n您的è£ç½®å¯èƒ½ä¸æ”¯æ´ -weather.rain.name = Rain -weather.snow.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm +weather.rain.name = 雨 +weather.snow.name = 雪 +weather.sandstorm.name = 沙塵暴 +weather.sporestorm.name = å­¢å­é¢¨æš´ +weather.fog.name = 霧 -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.nonelaunch = [lightgray]none (sun) +sectors.unexplored = [lightgray]未探索 +sectors.resources = 資æºï¼š +sectors.production = 生產: +sectors.export = 出å£ï¼š +sectors.time = 佔領時間: +sectors.threat = å±éšªæ€§ï¼š +sectors.wave = 波次: +sectors.stored = 儲存: +sectors.resume = 繼續 +sectors.launch = 發射 +sectors.select = é¸å– +sectors.nonelaunch = [lightgray]無(太陽) +sectors.rename = 釿–°å‘½åå€åŸŸ +sectors.enemybase = [scarlet]敵方基地 +sectors.vulnerable = [scarlet]æ˜“å—æ”»æ“Š +sectors.underattack = [scarlet]敵è»ä¾†è¥²ï¼ [accent]{0}% å—æ +sectors.survives = [accent]存活 {0} 波次 +sectors.go = 進入 +sector.curcapture = å·²ä½”é ˜åœ°å€ +sector.curlost = å·²å¤±åŽ»è©²åœ°å€ +sector.missingresources = [scarlet]核心資æºä¸è¶³ +sector.attacked = åœ°å€ [accent]{0}[white] é­å—æ”»æ“Šï¼ +sector.lost = åœ°å€ [accent]{0}[white] æˆ°æ•—ï¼ +#note: 校正用空行 +sector.captured = æˆåŠŸä½”é ˜åœ°å€[accent]{0}[white]ï¼ -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +threat.low = 低 +threat.medium = 中 +threat.high = 高 +threat.extreme = 極高 +threat.eradication = 毀滅性 -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. -sector.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. +planets = 行星 + +planet.serpulo.name = 蕈孢星 +planet.sun.name = 太陽 + +sector.impact0078.name = è¡æ“Š0078 +sector.groundZero.name = 原點 +sector.craters.name = éš•çŸ³å‘ +sector.frozenForest.name = 冰尿£®æž— +sector.ruinousShores.name = 廢墟海岸 +sector.stainedMountains.name = 多色山脈 +sector.desolateRift.name = è’è°· +sector.nuclearComplex.name = 核能電網 +sector.overgrowth.name = 雜è‰å¢ç”Ÿ +sector.tarFields.name = 油田 +sector.saltFlats.name = é¹½ç˜ +sector.fungalPass.name = 真èŒèµ°å»Š +sector.biomassFacility.name = ç”Ÿç‰©è³ªåˆæˆå·¥å»  +sector.windsweptIslands.name = 風之島 +sector.extractionOutpost.name = èƒå–哨站 +sector.planetaryTerminal.name = 星際發射站 + +sector.groundZero.description = 冿¬¡é–‹å§‹çš„æœ€ä½³ä½ç½®ã€‚敵人å¨è„…程度低。資æºå°‘。\n盡å¯èƒ½åœ°æŽ¡é›†é‰›èˆ‡éŠ…ã€‚\n繼續å‰é€²ã€‚ +sector.frozenForest.description = å³ä½¿æ˜¯åœ¨å¦‚æ­¤é è¿‘山脈的地方,孢å­ä¹Ÿå·²ç¶“擴散了。如此低溫也無法永é é止它們。\n\n開始冒險發電。建造ç«åŠ›ç™¼é›»æ©Ÿã€‚ä¸¦å­¸ç¿’ä½¿ç”¨ä¿®ç†å–®ä½ã€‚ +sector.saltFlats.description = é¹½ç˜åœ¨æ²™æ¼ çš„外åœã€‚此處資æºä¸å¤šã€‚\n\n敵人已在此建立了一座資æºå€‰åº«ã€‚剷除他們的核心。ä¸è¦ç•™ä¸‹ä»»ä½•æ±è¥¿ã€‚ +sector.craters.description = 在曾發生éŽå¤ä»£æˆ°çˆ­çš„ç«å±±å£ç©äº†å¾ˆå¤šæ°´ã€‚開墾這個å€åŸŸã€‚採集沙å­ã€‚煉製玻璃。抽水冷å»ç ²å¡”與鑽頭。 +sector.ruinousShores.description = è¶ŠéŽå»¢æ£„物就是海岸線。此處曾設有海岸防禦陣線。但剩下的ä¸å¤šã€‚åªæœ‰æœ€åŸºæœ¬çš„é˜²ç¦¦çµæ§‹æ²’æœ‰ææ¯€ï¼Œå…¶ä»–的一切都已然變為廢墟。\n繼續å‘å¤–æ“´å±•ã€‚é‡æ–°ç™¼ç¾æŠ€è¡“。 +sector.stainedMountains.description = 還未å—孢孿±¡æŸ“的山脈å‘內陸延伸。\n在此å€åŸŸé–‹æŽ¡éˆ¦é‡‘屬。學習如何使用它。\n\n這裡的敵人更為強大。ä¸è¦è®“他們有以最強大武力攻擊的機會。 +sector.overgrowth.description = æ­¤å€åŸŸé›œè‰å¢ç”Ÿï¼Œé›¢å­¢å­çš„æºé ­å¾ˆè¿‘ã€‚\n敵人在此建立了å‰å“¨ç«™ã€‚建造泰å¦å–®ä½ã€‚摧毀它。然後找回éºå¤±çš„æ±è¥¿ã€‚ +sector.tarFields.description = 產油å€çš„外åœï¼Œåœ¨å±±è„ˆèˆ‡æ²™æ¼ ä¹‹é–“。少數有油料儲備的地å€ã€‚\n雖然看似被廢棄,但此å€åŸŸé™„è¿‘ä»æœ‰ä¸€äº›å±éšªçš„æ•µè»ã€‚ä¸è¦å°çœ‹ä»–們。\n\n[lightgray]如果å¯ä»¥çš„話,請研究石油加工科技。 +sector.desolateRift.description = éžå¸¸å±éšªçš„å€åŸŸã€‚資æºè±å¯Œï¼Œä½†ç©ºé–“狹å°ã€‚有高破壞風險。盡快離開。ä¸è¦è¢«æ•µäººçš„æ”»æ“Šé–“è·å¤ªé•·è€Œè¢«æ„šå¼„。 +sector.nuclearComplex.description = 曾是釷的生產與加工設施,但ç¾åœ¨å·²æˆå»¢å¢Ÿã€‚\n[lightgray]研究釷åŠå…¶è¨±å¤šç”¨é€”。\n\n敵人éžå¸¸å¤šï¼Œä¸æ–·æœå°‹å¯æ”»æ“Šçš„å°è±¡ã€‚ +sector.fungalPass.description = 高山與滿是孢å­çš„ä½Žè°·é–“çš„éŽæ¸¡å€åŸŸã€‚這裡有敵人的å°åž‹åµå¯ŸåŸºåœ°ã€‚\n摧毀它。\n使用匕首機甲與爬行機甲。拿下兩個核心。 +sector.biomassFacility.description = 「孢å­ã€çš„發æºåœ°ã€‚這項設施是éŽåŽ»ç ”ç©¶å’Œç”Ÿç”¢è©²ç”Ÿç‰©è³ªçš„åœ°æ–¹ã€‚\n研究éºç•™æ–¼æ­¤çš„æŠ€è¡“。培養孢å­ä»¥åŠ å·¥æˆç‡ƒæ–™å’Œèšåˆç‰©ã€‚\n\n[lightgray]åœ¨è¨­æ–½ææ¯€å¾Œï¼Œå­¢å­æ•£æ’­äº†å‡ºåŽ»ã€‚é¢å°å¦‚此強勢的外來種,當地生態系中沒有任何物種能與之匹敵…… +sector.windsweptIslands.description = åè½æ–¼æµ·å²¸ç·šå¤–的一串群島。紀錄顯示此地éŽåŽ»æœ‰ç”Ÿç”¢[accent]塑鋼[]的建築物。抵禦敵方的海è»é€²æ”»ã€‚在島嶼上建造基地。研究這些工廠。 +sector.extractionOutpost.description = 由敵方建造的é ç«¯å“¨ç«™ï¼Œç”¨ä¾†ç™¼å°„資æºåˆ°å…¶ä»–地å€ã€‚\n\n跨地å€é‹è¼¸æ˜¯å¾æœæ˜Ÿçƒä¸å¯æˆ–缺的技術。摧毀該基地。研究他們的發射å°ã€‚ +sector.impact0078.description = 沉ç¡åœ¨æ­¤çš„æ˜¯ç¬¬ä¸€å€‹é€²å…¥æœ¬æ˜Ÿç³»çš„æ˜Ÿéš›é‹è¼¸èˆ¹ã€‚\n\n回收任何能利用的æ±è¥¿ã€‚ç ”ç©¶ä»»ä½•å«æœ‰çš„科技。 +sector.planetaryTerminal.description = 最終目標。\n\n這麼濱海基地具有能夠發射核心到其他行星的建築。 其防禦éžå¸¸åš´å¯†ã€‚\n\n生產海上單ä½ã€‚盡速摧毀敵人。研究該發射建築。 + +status.burning.name = 燃燒 +status.freezing.name = å‡çµ +status.wet.name = 浸濕 +status.muddy.name = 泥濘 +status.melting.name = èžåŒ– +status.sapped.name = 被å¸è¡€ +status.spore-slowed.name = å­¢å­ç·©é€Ÿ +status.tarred.name = 焦油 +status.overclock.name = 快轉 +status.shocked.name = 電擊 +status.blasted.name = 爆炸 +status.unmoving.name = 立定 settings.language = 語言 -settings.data = éŠæˆ²æ•¸æ“š +settings.data = éŠæˆ²è³‡æ–™ settings.reset = é‡è¨­ç‚ºé è¨­è¨­å®š settings.rebind = 釿–°ç¶å®š settings.resetKey = é‡è¨­æŒ‰éµ -settings.controls = æ“作 +settings.controls = 控制 settings.game = éŠæˆ² settings.sound = 音效 settings.graphics = 圖形 -settings.cleardata = æ¸…é™¤éŠæˆ²æ•¸æ“š... -settings.clear.confirm = æ‚¨ç¢ºå®šè¦æ¸…除數據嗎?\næ­¤æ“ä½œç„¡æ³•æ’¤å›žï¼ -settings.clearall.confirm = [scarlet]警告ï¼[]\n這將清除所有數據,包括存檔ã€åœ°åœ–ã€è§£éŽ–å’Œç†±éµç¶å®šã€‚\n按「是ã€å¾Œï¼ŒéŠæˆ²å°‡åˆªé™¤æ‰€æœ‰æ•¸æ“šä¸¦è‡ªå‹•退出。 -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves -paused = [accent]〈已暫åœã€‰ +settings.cleardata = æ¸…é™¤éŠæˆ²è³‡æ–™â€¦â€¦ +settings.clear.confirm = æ‚¨ç¢ºå®šè¦æ¸…除資料嗎?\næ­¤å‹•ä½œç„¡æ³•å¾©åŽŸï¼ +settings.clearall.confirm = [scarlet]警告ï¼[]\n這會清除所有資料,包括存檔ã€åœ°åœ–ã€è§£éŽ–é …ç›®å’Œå¿«æ·éµç¶å®šã€‚\n按「確定ã€å¾Œï¼ŒéŠæˆ²å°‡åˆªé™¤æ‰€æœ‰è³‡æ–™ä¸¦è‡ªå‹•çµæŸã€‚ +settings.clearsaves.confirm = æ‚¨ç¢ºå®šæ‚¨æƒ³è¦æ¸…除所有存檔嗎? +settings.clearsaves = 清除存檔 +settings.clearresearch = 清除研究 +settings.clearresearch.confirm = ä½ ç¢ºå®šè¦æ¸…除所有研究? +settings.clearcampaignsaves = 清除戰役紀錄 +settings.clearcampaignsaves.confirm = ä½ ç¢ºå®šè¦æ¸…除所有戰役紀錄? +paused = [accent](已暫åœï¼‰ clear = 清除 -banned = [scarlet]已被å°ç¦ -unplaceable.sectorcaptured = [scarlet]需è¦å·²å é ˜çš„åœ°å€ +banned = [scarlet]已被å°éŽ– yes = 是 no = å¦ info.title = 資訊 error.title = [crimson]發生錯誤 error.crashtitle = 發生錯誤 unit.nobuild = [scarlet]å–®ä½ä¸èƒ½å»ºé€  -blocks.input = 輸入 -blocks.output = 輸出 -blocks.booster = 強化 -blocks.tiles = 需求方塊 -blocks.affinities = 親和方塊 +lastaccessed = [lightgray]最後使用:{0} block.unknown = [lightgray]??? -blocks.powercapacity = è“„é›»é‡ -blocks.powershot = 能é‡/射擊 -blocks.damage = 傷害 -blocks.targetsair = 攻擊空中目標 -blocks.targetsground = 攻擊地é¢ç›®æ¨™ -blocks.itemsmoved = 移動速度 -blocks.launchtime = 發射間隔 -blocks.shootrange = ç¯„åœ -blocks.size = 尺寸 -blocks.displaysize = Display Size -blocks.liquidcapacity = æ¶²é«”å®¹é‡ -blocks.powerrange = è¼¸å‡ºç¯„åœ -blocks.linkrange = Link Range -blocks.instructions = Instructions -blocks.powerconnections = 最大連接數 -blocks.poweruse = 能é‡ä½¿ç”¨ -blocks.powerdamage = 能é‡/傷害 -blocks.itemcapacity = 物å“å®¹é‡ -blocks.basepowergeneration = 基礎能é‡ç”Ÿç”¢ -blocks.productiontime = 生產時間 -blocks.repairtime = 方塊完全修復時間 -blocks.speedincrease = 速度æå‡ -blocks.range = ç¯„åœ -blocks.drilltier = å¯é‘½å–礦物 -blocks.drillspeed = 基本鑽å–速度 -blocks.boosteffect = æå‡æ•ˆæ‡‰ -blocks.maxunits = 最大活èºå–®ä½ -blocks.health = è€ä¹…度 -blocks.buildtime = 建設時間 -blocks.maxconsecutive = Max Consecutive -blocks.buildcost = å»ºé€ æˆæœ¬ -blocks.inaccuracy = 誤差 -blocks.shots = 射擊數 -blocks.reload = 射擊次數/ç§’ -blocks.ammo = 彈藥 -blocks.shieldhealth = Shield Health -blocks.cooldowntime = Cooldown Time + +stat.description = 用途 +stat.input = 輸入 +stat.output = 輸出 +stat.booster = 強化 +stat.tiles = 需求方塊 +stat.affinities = 親和方塊 +stat.opposites = ç›¸å°æ–¹å¡Š +stat.powercapacity = è“„é›»é‡ +stat.powershot = 能é‡/射擊 +stat.damage = 傷害 +stat.targetsair = 攻擊空中目標 +stat.targetsground = 攻擊地é¢ç›®æ¨™ +stat.itemsmoved = 移動速度 +stat.launchtime = 發射間隔 +stat.shootrange = ç¯„åœ +stat.size = å¤§å° +stat.displaysize = é¡¯ç¤ºå¤§å° +stat.liquidcapacity = æ¶²é«”å®¹é‡ +stat.powerrange = è¼¸å‡ºç¯„åœ +stat.linkrange = 連çµç¯„åœ +stat.instructions = 指令 +stat.powerconnections = æœ€å¤§é€£çµæ•¸ +stat.poweruse = 能é‡ä½¿ç”¨ +stat.powerdamage = 能é‡/傷害 +stat.itemcapacity = 物å“å®¹é‡ +stat.memorycapacity = è¨˜æ†¶é«”å®¹é‡ +stat.basepowergeneration = 基礎能é‡ç”Ÿç”¢ +stat.productiontime = 生產時間 +stat.repairtime = 方塊完全修復時間 +stat.weapons = 武器 +stat.bullet = å­å½ˆ +stat.speedincrease = 速度æå‡ +stat.range = ç¯„åœ +stat.drilltier = å¯é‘½å–礦物 +stat.drillspeed = 基本鑽å–速度 +stat.boosteffect = 加速效果 +stat.maxunits = 最大活èºå–®ä½ +stat.health = è€ä¹…度 +stat.armor = è£ç”² +stat.buildtime = 建設時間 +stat.maxconsecutive = 最大連續 +stat.buildcost = å»ºé€ æˆæœ¬ +stat.inaccuracy = 誤差 +stat.shots = 射擊數 +stat.reload = 射擊次數/ç§’ +stat.ammo = 彈藥 +stat.shieldhealth = 護盾生命值 +stat.cooldowntime = 冷確時間 +stat.explosiveness = 爆炸性 +stat.basedeflectchance = 基礎åç§»é‡ +stat.lightningchance = 燃燒機率 +stat.lightningdamage = 燃燒傷害 +stat.flammability = 易燃性 +stat.radioactivity = 輻射性 +stat.charge = 蓄電力 +stat.heatcapacity = ç†±å®¹é‡ +stat.viscosity = é»åº¦ +stat.temperature = 溫度 +stat.speed = 速度 +stat.buildspeed = 建築速度 +stat.minespeed = 挖掘速度 +stat.minetier = 挖掘等級 +stat.payloadcapacity = è² è·é‡ +stat.commandlimit = 指令é™åˆ¶ +stat.abilities = 能力 +stat.canboost = å¯åŠ é€Ÿ +stat.flying = 飛行中 +stat.ammouse = 彈藥使用 +stat.damagemultiplier = å‚·å®³åŠ æˆ +stat.healthmultiplier = è¡€é‡åŠ æˆ +stat.speedmultiplier = é€Ÿåº¦åŠ æˆ +stat.reloadmultiplier = å°„é€ŸåŠ æˆ +stat.buildspeedmultiplier = å»ºé€ é€Ÿåº¦åŠ æˆ +stat.reactive = 具忇‰æ€§ + +ability.forcefield = 防護罩 +ability.repairfield = 維修力場 +ability.statusfield = 狀態力場 +ability.unitspawn = {0}工廠 +ability.shieldregenfield = 護盾充能力場 +ability.movelightning = 移動閃電 bar.drilltierreq = éœ€è¦æ›´å¥½çš„鑽頭 -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = ç¼ºå°‘è³‡æº +bar.corereq = 需由核心å‡ç´š bar.drillspeed = 鑽頭速度:{0}/ç§’ -bar.pumpspeed = 液體泵é€é€Ÿåº¦ï¼š{0}/s +bar.pumpspeed = 液體泵é€é€Ÿåº¦ï¼š{0}/ç§’ bar.efficiency = 效率:{0}% +bar.boost = 速度加æˆï¼š{0}% bar.powerbalance = 能é‡è®ŠåŒ–:{0} -bar.powerstored = 能é‡å­˜é‡: {0}/{1} +bar.powerstored = 能é‡å­˜é‡ï¼š{0}/{1} bar.poweramount = 能é‡ï¼š{0} bar.poweroutput = 能é‡è¼¸å‡ºï¼š{0} +bar.powerlines = 連線:{0}/{1} bar.items = 物å“:{0} -bar.capacity = 容é‡: {0} +bar.capacity = 容é‡ï¼š{0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet]î Š {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = 液體 bar.heat = 熱 bar.power = èƒ½é‡ @@ -635,19 +767,24 @@ bar.progress = 建造進度 bar.input = 輸入 bar.output = 輸出 +units.processorcontrol = [lightgray]由微處ç†å™¨æŽ§åˆ¶ + bullet.damage = [stat]{0}[lightgray]傷害 bullet.splashdamage = [stat]{0}[lightgray]範åœå‚·å®³ ~[stat] {1}[lightgray]æ ¼ bullet.incendiary = [stat]燃燒 -bullet.homing = [stat]追踪 -bullet.shock = [stat]電擊 +bullet.homing = [stat]追蹤 bullet.frag = [stat]破片彈 +bullet.lightning = [stat]{0}[lightgray]x 電弧 ~ [stat]{1}[lightgray] 傷害 +bullet.buildingdamage = [stat]{0}%[lightgray] 建築傷害 bullet.knockback = [stat]{0}[lightgray]擊退 -bullet.freezing = [stat]å†·å‡ -bullet.tarred = [stat]焦油 +bullet.pierce = [stat]{0}[lightgray]×穿刺 +bullet.infinitepierce = [stat]穿刺 +bullet.healpercent = [stat]{0}[lightgray]% 回復 bullet.multiplier = [stat]{0}[lightgray]Ã—å½ˆè—¥å€æ•¸ bullet.reload = [stat]{0}[lightgray]×射擊速率 unit.blocks = 方塊 +unit.blockssquared = 方塊² unit.powersecond = 能é‡å–®ä½/ç§’ unit.liquidsecond = 液體單ä½/ç§’ unit.itemssecond = 物å“/ç§’ @@ -655,43 +792,48 @@ unit.liquidunits = æ¶²é«”å–®ä½ unit.powerunits = 能é‡å–®ä½ unit.degrees = 度 unit.seconds = ç§’ -unit.minutes = mins +unit.minutes = 分 unit.persecond = /ç§’ -unit.perminute = /min +unit.perminute = /分 unit.timesspeed = ×速度 unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = 護盾生命值 unit.items = ç‰©å“ -unit.thousands = k -unit.millions = mil -unit.billions = b +unit.thousands = åƒ +unit.millions = ç™¾è¬ +unit.billions = åå„„ +unit.pershot = /發 +category.purpose = 用途 category.general = 一般 category.power = èƒ½é‡ category.liquids = 液體 category.items = ç‰©å“ category.crafting = 需求 -category.shooting = 射擊 +category.function = 方法 category.optional = å¯é¸çš„強化 setting.landscape.name = éŽ–å®šæ°´å¹³ç•«é¢ setting.shadows.name = é™°å½± setting.blockreplace.name = 方塊建造建議 setting.linear.name = ç·šæ€§éŽæ¿¾ setting.hints.name = æç¤º -setting.flow.name = 顯示資æºè¼¸é€é€Ÿåº¦[scarlet] +setting.logichints.name = é‚輯æç¤º +setting.flow.name = 顯示資æºè¼¸é€é€Ÿåº¦ +setting.backgroundpause.name = èƒŒæ™¯åŸ·è¡Œæ™‚æš«åœ setting.buildautopause.name = 自動暫åœå»ºç¯‰ -setting.mapcenter.name = Auto Center Map To Player +setting.doubletapmine.name = 連續點擊以挖礦 +setting.modcrashdisable.name = 閃退後åœç”¨æ¨¡çµ„ setting.animatedwater.name = 液體動畫 setting.animatedshields.name = 護盾動畫 -setting.antialias.name = 消除鋸齒[lightgray](需è¦é‡å•ŸéŠæˆ²ï¼‰[] -setting.playerindicators.name = ç›Ÿå‹æŒ‡ç¤ºæ¨™ -setting.indicators.name = 敵方指示標 +setting.antialias.name = 消除鋸齒[lightgray](需è¦é‡æ–°å•Ÿå‹•éŠæˆ²ï¼‰[] +setting.playerindicators.name = ç›Ÿå‹æ¨™ç¤º +setting.indicators.name = 敵方標示 setting.autotarget.name = 自動射擊 setting.keyboard.name = 滑鼠åŠéµç›¤æŽ§åˆ¶ setting.touchscreen.name = 觸控螢幕控制 setting.fpscap.name = 最大FPS setting.fpscap.none = ç„¡ setting.fpscap.text = {0}FPS -setting.uiscale.name = UI縮放[lightgray] (需è¦é‡å•ŸéŠæˆ²)[] +setting.uiscale.name = 使用者介é¢ç¸®æ”¾[lightgray](需è¦é‡æ–°å•Ÿå‹•éŠæˆ²ï¼‰[] setting.swapdiagonal.name = é è¨­å°è§’線放置 setting.difficulty.training = 訓練 setting.difficulty.easy = ç°¡å–® @@ -707,17 +849,15 @@ setting.conveyorpathfinding.name = 自動輸é€å¸¶æ”¾ç½®è¦åŠƒ setting.sensitivity.name = æŽ§åˆ¶å™¨éˆæ•度 setting.saveinterval.name = 自動存檔間隔 setting.seconds = {0}ç§’ -setting.blockselecttimeout.name = è·³éŽæ–¹å¡Šå»ºé€ æ™‚è· setting.milliseconds = {0}毫秒 setting.fullscreen.name = 全螢幕 -setting.borderlesswindow.name = 無邊框窗å£[lightgray](å¯èƒ½éœ€è¦é‡å•ŸéŠæˆ²ï¼‰ -setting.fps.name = 顯示FPS與Ping -setting.smoothcamera.name = Smooth Camera -setting.blockselectkeys.name = é¡¯ç¤ºæ–¹å¡Šé¸æ“‡å¿«æ·éµ +setting.borderlesswindow.name = 無邊框視窗[lightgray](å¯èƒ½éœ€è¦é‡æ–°å•Ÿå‹•éŠæˆ²ï¼‰ +setting.fps.name = 顯示FPSèˆ‡å»¶é² +setting.smoothcamera.name = 平滑æ”影機 setting.vsync.name = åž‚ç›´åŒæ­¥ setting.pixelate.name = åƒç´ åŒ– setting.minimap.name = 顯示å°åœ°åœ– -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = é¡¯ç¤ºæ ¸å¿ƒç‰©å“ setting.position.name = 顯示玩家ä½ç½® setting.musicvol.name = éŸ³æ¨‚éŸ³é‡ setting.atmosphere.name = 顯示星çƒå¤§æ°£å±¤ @@ -725,43 +865,45 @@ setting.ambientvol.name = ç’°å¢ƒéŸ³é‡ setting.mutemusic.name = éœéŸ³ setting.sfxvol.name = éŸ³æ•ˆéŸ³é‡ setting.mutesound.name = éœéŸ³ -setting.crashreport.name = 發é€åŒ¿å崩潰報告 +setting.crashreport.name = 傳é€åŒ¿å當機回報 setting.savecreate.name = 自動建立存檔 setting.publichost.name = å…¬é–‹éŠæˆ²å¯è¦‹åº¦ setting.playerlimit.name = 玩家數é™åˆ¶ setting.chatopacity.name = èŠå¤©æ¡†ä¸é€æ˜Žåº¦ -setting.lasersopacity.name = 激光ä¸é€æ˜Žåº¦ +setting.lasersopacity.name = é›·å°„ä¸é€æ˜Žåº¦ setting.bridgeopacity.name = æ©‹é€æ˜Žåº¦ -setting.playerchat.name = åœ¨éŠæˆ²ä¸­é¡¯ç¤ºèŠå¤©æ¡† -public.confirm = æ‚¨æƒ³å…¬é–‹éŠæˆ²å—Žï¼Ÿ\n[accent]任何人都å¯ä»¥åŠ å…¥æ‚¨çš„éŠæˆ²ã€‚\n[lightgray]以後å¯ä»¥åœ¨â€œè¨­ç½®â€->â€œéŠæˆ²â€->â€œå…¬é–‹éŠæˆ²å¯è¦‹åº¦â€ä¸­é€²è¡Œæ›´æ”¹ã€‚ +setting.playerchat.name = åœ¨éŠæˆ²ä¸­é¡¯ç¤ºèŠå¤©è¦–窗 +setting.showweather.name = 顯示天氣動畫 +public.confirm = æ‚¨æƒ³å…¬é–‹éŠæˆ²å—Žï¼Ÿ\n[accent]任何人都å¯ä»¥åŠ å…¥æ‚¨çš„éŠæˆ²ã€‚\n[lightgray]之後å¯ä»¥åœ¨ã€Œè¨­å®šã€â†’ã€ŒéŠæˆ²ã€â†’ã€Œå…¬é–‹éŠæˆ²å¯è¦‹åº¦ã€ä¸­é€²è¡Œæ›´æ”¹ã€‚ +public.confirm.really = 如果你想和朋å‹ä¸€èµ·éŠçŽ©ï¼Œå¯åˆ©ç”¨[green]邀請好å‹[]è€Œä¸æ˜¯[scarlet]公開伺æœå™¨[]ï¼\n你確定è¦å°‡ä¼ºæœè¨­ç‚º[scarlet]公開[]? public.beta = 請注æ„ï¼Œè©²éŠæˆ²çš„Betaç‰ˆæœ¬ç„¡æ³•å…¬é–‹éŠæˆ²å¤§å»³ã€‚ -uiscale.reset = UI縮放已變更\n按下"確定"確èªé€™å€‹æ¯”例\n[scarlet][accent] {0}[] 秒後...退出並還原設定 +uiscale.reset = 使用者介é¢ç¸®æ”¾å·²è®Šæ›´\n按下「確定ã€ç¢ºèªé€™å€‹æ¯”例\n[scarlet][accent] {0}[] 秒後退出並還原設定 uiscale.cancel = å–æ¶ˆä¸¦é€€å‡º setting.bloom.name = ç²’å­ç‰¹æ•ˆ keybind.title = 釿–°ç¶å®šæŒ‰éµ -keybinds.mobile = [scarlet]此處的大多數快æ·éµåœ¨ç§»å‹•設備上å‡ä¸èµ·ä½œç”¨ã€‚僅支æ´åŸºæœ¬ç§»å‹•。 +keybinds.mobile = [scarlet]此處的大多數快æ·éµåœ¨è¡Œå‹•è£ç½®ä¸Šå‡ç„¡æ³•é‹ä½œã€‚僅支æ´åŸºæœ¬ç§»å‹•。 category.general.name = 一般 category.view.name = 查看 category.multiplayer.name = 多人 -category.blocks.name = Block Select +category.blocks.name = é¸å–方塊 command.attack = 攻擊 command.rally = é›†çµ command.retreat = 撤退 -command.idle = Idle +command.idle = é–’ç½® placement.blockselectkeys = \n[lightgray]按éµï¼š[{0}, keybind.respawn.name = é‡ç”Ÿ keybind.control.name = æŽ§åˆ¶å–®ä½ keybind.clear_building.name = 清除建築指令 -keybind.press = 按一下按éµ... -keybind.press.axis = æŒ‰ä¸€ä¸‹è»¸å‘æˆ–按éµ... +keybind.press = 按一下按éµâ€¦â€¦ +keybind.press.axis = æŒ‰ä¸€ä¸‹è»¸å‘æˆ–按éµâ€¦â€¦ keybind.screenshot.name = 地圖截圖 -keybind.toggle_power_lines.name = é¡¯ç¤ºèƒ½é‡æ¿€å…‰ +keybind.toggle_power_lines.name = 顯示能é‡é›·å°„ keybind.toggle_block_status.name = 開啟方塊狀態顯示 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 keybind.mouse_move.name = 跟隨滑鼠 -keybind.pan.name = Pan View -keybind.boost.name = å™´å°„ +keybind.pan.name = 平移é¡é ­ +keybind.boost.name = 加速 keybind.schematic_select.name = 鏿“‡å€åŸŸ keybind.schematic_menu.name = è—圖目錄 keybind.schematic_flip_x.name = X軸翻轉 @@ -788,24 +930,27 @@ keybind.diagonal_placement.name = å°è§’線放置 keybind.pick.name = 鏿“‡æ–¹å¡Š keybind.break_block.name = 移除方塊 keybind.deselect.name = å–æ¶ˆé¸å– -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo -keybind.command.name = Command +keybind.pickupCargo.name = 撿起貨物 +keybind.dropCargo.name = 丟棄貨物 +keybind.command.name = 指令 keybind.shoot.name = 射擊 keybind.zoom.name = 縮放 keybind.menu.name = 主é¸å–® keybind.pause.name = æš«åœéŠæˆ² -keybind.pause_building.name = æš«åœ/æ¢å¾©å»ºé€  +keybind.pause_building.name = æš«åœï¼ç¹¼çºŒå»ºé€  keybind.minimap.name = å°åœ°åœ– +keybind.planet_map.name = 行星地圖 +keybind.research.name = 研究 keybind.chat.name = èŠå¤© keybind.player_list.name = 玩家列表 keybind.console.name = 終端機 keybind.rotate.name = 旋轉 -keybind.rotateplaced.name = æ—‹è½‰ç¾æœ‰(按ä½) +keybind.rotateplaced.name = æ—‹è½‰ç¾æœ‰ï¼ˆæŒ‰ä½ï¼‰ keybind.toggle_menus.name = 切æ›ç•«é¢ keybind.chat_history_prev.name = 之å‰çš„èŠå¤©è¨˜éŒ„ keybind.chat_history_next.name = 之後的èŠå¤©è¨˜éŒ„ -keybind.chat_scroll.name = èŠå¤©è¨˜éŒ„滾動 +keybind.chat_scroll.name = èŠå¤©è¨˜éŒ„æ²å‹• +keybind.chat_mode.name = 變更èŠå¤©æ¨¡å¼ keybind.drop_unit.name = æ”¾ä¸‹å–®ä½ keybind.zoom_minimap.name = 縮放å°åœ°åœ– mode.help.title = 模å¼èªªæ˜Ž @@ -822,24 +967,28 @@ mode.custom = 自訂è¦å‰‡ rules.infiniteresources = ç„¡é™è³‡æº rules.reactorexplosions = 忇‰çˆçˆ†ç‚¸ +rules.coreincinerates = æ ¸å¿ƒéŠ·æ¯€ç‰©å“ +rules.schematic = å…許使用è—圖 rules.wavetimer = 波次時間 rules.waves = 波次 rules.attack = æ”»æ“Šæ¨¡å¼ -rules.buildai = AI Building +rules.buildai = 電腦自動建築 rules.enemyCheat = 電腦無é™è³‡æº rules.blockhealthmultiplier = 建築物è€ä¹…åº¦å€æ•¸ -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = å»ºç¯‰ç‰©å‚·å®³å€æ•¸ rules.unitbuildspeedmultiplier = å–®ä½å»ºè¨­é€Ÿåº¦å€æ•¸ rules.unithealthmultiplier = å–®ä½ç”Ÿå‘½å€¼å€æ•¸ rules.unitdamagemultiplier = å–®ä½å‚·å®³å€æ•¸ +rules.unitcapvariable = 核心é™åˆ¶å–®ä½ä¸Šé™ +rules.unitcap = 基礎單ä½ä¸Šé™ rules.enemycorebuildradius = æ•µäººæ ¸å¿ƒç¦æ­¢å»ºè¨­åŠå¾‘︰[lightgray](格) rules.wavespacing = 波次間è·ï¸°[lightgray](秒) rules.buildcostmultiplier = å»ºè¨­æˆæœ¬å€æ•¸ rules.buildspeedmultiplier = å»ºè¨­é€Ÿåº¦å€æ•¸ rules.deconstructrefundmultiplier = 拆除資æºè¿”還比例 rules.waitForWaveToEnd = 等待所有敵人毀滅æ‰é–‹å§‹ä¸‹ä¸€æ³¢æ¬¡ -rules.dropzoneradius = 空é™å€åŠå¾‘:[lightgray](格) -rules.unitammo = Units Require Ammo +rules.dropzoneradius = 空é™å€åŠå¾‘:[lightgray](格) +rules.unitammo = å–®ä½éœ€è¦å½ˆè—¥ rules.title.waves = 波次 rules.title.resourcesbuilding = 資æºèˆ‡å»ºç¯‰ rules.title.enemy = 敵人 @@ -847,17 +996,22 @@ rules.title.unit = å–®ä½ rules.title.experimental = 實驗中 rules.title.environment = 環境 rules.lighting = 光照 -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = 敵方發光 +rules.fire = ç« +rules.explosions = 方塊ï¼å–®ä½çˆ†ç‚¸å‚·å®³ rules.ambientlight = 環境光照 -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = 天氣 +rules.weather.frequency = 頻率: +rules.weather.always = æ°¸é  +rules.weather.duration = æŒçºŒæ™‚間: content.item.name = ç‰©å“ content.liquid.name = 液體 content.unit.name = å–®ä½ content.block.name = 方塊 +content.status.name = 狀態效果 +content.sector.name = åœ°å€ + item.copper.name = 銅 item.lead.name = 鉛 item.coal.name = 煤炭 @@ -870,7 +1024,7 @@ item.phase-fabric.name = 相織布 item.surge-alloy.name = 波動åˆé‡‘ item.spore-pod.name = å­¢å­èŽ¢ item.sand.name = æ²™ -item.blast-compound.name = 爆炸混åˆç‰© +item.blast-compound.name = 爆炸化åˆç‰© item.pyratite.name = ç«ç„°å½ˆ item.metaglass.name = 鋼化玻璃 item.scrap.name = 廢料 @@ -879,79 +1033,64 @@ liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凿¶² -item.explosiveness = [lightgray]爆炸性:{0}% -item.flammability = [lightgray]易燃性:{0}% -item.radioactivity = [lightgray]放射性:{0}% - -unit.health = [lightgray]生命值:{0} -unit.speed = [lightgray]速度:{0} -unit.weapon = [lightgray]武器: {0} -unit.itemcapacity = [lightgray]物å“容é‡: {0} -unit.minespeed = [lightgray]採礦速度: {0}% -unit.minepower = [lightgray]採礦能力: {0} -unit.ability = [lightgray]能力: {0} -unit.buildspeed = [lightgray]建造速度: {0}% - -liquid.heatcapacity = [lightgray]熱容é‡ï¼š{0} -liquid.viscosity = [lightgray]粘性:{0} -liquid.temperature = [lightgray]溫度:{0} - unit.dagger.name = 匕首機甲 -unit.mace.name = Mace +unit.mace.name = ç”©æ£ unit.fortress.name = è¦å¡ž -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar +unit.nova.name = 超新星 +unit.pulsar.name = è„ˆè¡æ˜Ÿ +unit.quasar.name = 類星體 unit.crawler.name = 爬行機甲 -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.toxopid.name = Toxopid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.quad.name = Quad -unit.oct.name = Oct -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.sei.name = Sei -unit.omura.name = Omura -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma -unit.scepter.name = Scepter -unit.reign.name = Reign -unit.vela.name = Vela -unit.corvus.name = Corvus +unit.atrax.name = ç«æ¯’機甲 +unit.spiroct.name = 血魔機甲 +unit.arkyid.name = 魔毒蛛 +unit.toxopid.name = 鬼毒蛛 +unit.flare.name = 曳光戰機 +unit.horizon.name = 天際轟炸機 +unit.zenith.name = 穹頂飛彈艇 +unit.antumbra.name = ç’°è•æˆ°è‰¦ +unit.eclipse.name = å…¨è•æˆ°è‰¦ +unit.mono.name = 採礦無人機 +unit.poly.name = 建築衛機 +unit.mega.name = 修補é‹è¼¸æ©Ÿ +unit.quad.name = é‡åž‹é‹è¼¸è‰¦ +unit.oct.name = è­·ç›¾èˆªæ¯ +unit.risso.name = 海豚號 +unit.minke.name = 鬚鯨號 +unit.bryde.name = 鯷鯨號 +unit.sei.name = 塞鯨號 +unit.omura.name = 角島鯨號 +unit.alpha.name = 阿爾法 +unit.beta.name = è²å¡” +unit.gamma.name = 伽瑪 +unit.scepter.name = æ¬Šæ– +unit.reign.name = å¸çŽ‹ +unit.vela.name = 船帆座 +unit.corvus.name = çƒé´‰åº§ -block.resupply-point.name = Resupply Point -block.parallax.name = Parallax +block.resupply-point.name = 補給點 +block.parallax.name = 視差 block.cliff.name = å³­å£ -block.sand-boulder.name = 沙礫 +block.sand-boulder.name = 沙礫巨岩 +block.basalt-boulder.name = 玄武岩巨石 block.grass.name = è‰ block.slag.name = 熔渣 +block.space.name = 太空 block.salt.name = é¹½ -block.salt-wall.name = Salt Wall +block.salt-wall.name = 鹽牆 block.pebbles.name = åµçŸ³ block.tendrils.name = å·é¬š -block.sand-wall.name = Sand Wall +block.sand-wall.name = 沙牆 block.spore-pine.name = 孢孿¾ -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +block.spore-wall.name = å­¢å­ç‰† +block.boulder.name = 巨石 +block.snow-boulder.name = 雪巨石 block.snow-pine.name = é›ªæ¾ block.shale.name = é å²© block.shale-boulder.name = é å²©å·¨çŸ³ block.moss.name = 苔蘚 block.shrubs.name = çŒæœ¨ block.spore-moss.name = å­¢å­è‹”蘚 -block.shale-wall.name = Shale Wall +block.shale-wall.name = é å²©ç‰† block.scrap-wall.name = 廢牆 block.scrap-wall-large.name = 大型廢牆 block.scrap-wall-huge.name = 巨型廢牆 @@ -975,21 +1114,22 @@ block.sand.name = æ²™ block.darksand.name = 黑沙 block.ice.name = 冰 block.snow.name = 雪 -block.craters.name = éš•çŸ³å‘ +block.craters.name = å½ˆå‘ block.sand-water.name = 沙水 block.darksand-water.name = 黑沙水 block.char.name = 燒焦 -block.dacite.name = Dacite -block.dacite-wall.name = Dacite Wall +block.dacite.name = 英安岩 +block.dacite-wall.name = 英安岩牆 +block.dacite-boulder.name = 英安岩石塊 block.ice-snow.name = 冰雪 -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = 石牆 +block.ice-wall.name = 冰牆 +block.snow-wall.name = 雪牆 +block.dune-wall.name = 沙丘牆 block.pine.name = æ¾æ¨¹ -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud +block.dirt.name = 土 +block.dirt-wall.name = 土牆 +block.mud.name = æ³¥ block.white-tree-dead.name = 枯èŽç™½æ¨¹ block.white-tree.name = 白樹 block.spore-cluster.name = å­¢å­ç°‡ @@ -1005,7 +1145,7 @@ block.dark-panel-4.name = 黑颿¿ 4 block.dark-panel-5.name = 黑颿¿ 5 block.dark-panel-6.name = 黑颿¿ 6 block.dark-metal.name = 黑金屬 -block.basalt.name = Basalt +block.basalt.name = 玄武岩 block.hotrock.name = 熱岩 block.magmarock.name = 岩漿岩 block.copper-wall.name = 銅牆 @@ -1029,7 +1169,6 @@ block.conveyor.name = 輸é€å¸¶ block.titanium-conveyor.name = 鈦輸é€å¸¶ block.plastanium-conveyor.name = 塑鋼輸é€å¸¶ block.armored-conveyor.name = è£ç”²è¼¸é€å¸¶ -block.armored-conveyor.description = 以與鈦輸é€å¸¶ç›¸åŒçš„速度移動物å“ï¼Œä½†æ“æœ‰æ›´é«˜çš„防禦。除其他傳é€å¸¶å¤–ï¼Œä¸æŽ¥å—任何從å´é¢è¼¸å…¥çš„資æºã€‚ block.junction.name = æ¨žç´ block.router.name = 分é…器 block.distributor.name = 大型分é…器 @@ -1037,7 +1176,6 @@ block.sorter.name = 分類器 block.inverted-sorter.name = åå‘分類器 block.message.name = è¨Šæ¯æ¿ block.illuminator.name = 照明燈 -block.illuminator.description = å°ã€ç·Šæ¹Šè€Œä¸”å¯èª¿æ•´çš„å…‰æºã€‚需è¦èƒ½æºä¾†é‹ä½œã€‚ block.overflow-gate.name = 溢æµå™¨ block.underflow-gate.name = å呿º¢æµå™¨ block.silicon-smelter.name = 煉矽廠 @@ -1061,7 +1199,7 @@ block.differential-generator.name = 差動發電機 block.impact-reactor.name = è¡æ“Šå應堆 block.mechanical-drill.name = 機械鑽頭 block.pneumatic-drill.name = 氣動鑽頭 -block.laser-drill.name = 激光鑽頭 +block.laser-drill.name = 雷射鑽頭 block.water-extractor.name = æ°´æå–器 block.cultivator.name = 培養槽 block.conduit.name = 管線 @@ -1071,11 +1209,12 @@ block.item-void.name = 物å“虛空 block.liquid-source.name = æ¶²é«”æº block.liquid-void.name = 液體虛空 block.power-void.name = 能é‡è™›ç©º -block.power-source.name = ç„¡é™èƒ½é‡æº +block.power-source.name = èƒ½é‡æº block.unloader.name = è£å¸å™¨ -block.vault.name = 存儲庫 +block.vault.name = 儲存庫 block.wave.name = 波浪砲 -block.swarmer.name = 群集砲 +block.tsunami.name = 海嘯 +block.swarmer.name = 蜂æ“ç ² block.salvo.name = 齊射砲 block.ripple.name = 波紋砲 block.phase-conveyor.name = 相織傳é€å¸¶ @@ -1114,31 +1253,38 @@ block.arc.name = 電弧砲 block.rtg-generator.name = 放射性åŒä½ç´ ç†±ç™¼é›»æ©Ÿ block.spectre.name = 鬼影砲 block.meltdown.name = 熔毀砲 +block.foreshadow.name = 狙擊砲 block.container.name = 容器 block.launch-pad.name = å°åž‹ç™¼å°„å° block.launch-pad-large.name = å¤§åž‹ç™¼å°„å° -block.segment.name = Segment -block.command-center.name = Command Center -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.disassembler.name = Disassembler -block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome +block.segment.name = 片段 +block.command-center.name = 指æ®ä¸­å¿ƒ +block.ground-factory.name = 地é¢å·¥å»  +block.air-factory.name = 航空工廠 +block.naval-factory.name = æµ·è»å·¥å»  +block.additive-reconstructor.name = 二級é‡å¡‘者 +block.multiplicative-reconstructor.name = 三級é‡å¡‘者 +block.exponential-reconstructor.name = 四級é‡å¡‘者 +block.tetrative-reconstructor.name = 五級é‡å¡‘者 +block.payload-conveyor.name = 原料輸é€å¸¶ +block.payload-router.name = 原料分é…器 +block.disassembler.name = 還原機 +block.silicon-crucible.name = çŸ½çˆ +block.overdrive-dome.name = 高速拱頂 +#以下為實驗性建築,未來å¯èƒ½ç§»é™¤ experimental, may be removed +block.block-forge.name = æ–¹å¡Šé‘„é€ åŠ +block.block-loader.name = 方塊è£è¼‰å™¨ +block.block-unloader.name = 方塊å¸è¼‰å™¨ +block.interplanetary-accelerator.name = 星際加速站 -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell +block.switch.name = 按鈕 +block.micro-processor.name = 微處ç†å™¨ +block.logic-processor.name = é‚輯處ç†å™¨ +block.hyper-processor.name = 超級處ç†å™¨ +block.logic-display.name = 顯示器 +block.large-logic-display.name = 大型顯示器 +block.memory-cell.name = 記憶單元 +block.memory-bank.name = 記憶體 team.blue.name = è— team.crux.name = ç´… @@ -1148,57 +1294,84 @@ team.derelict.name = ç° team.green.name = ç¶  team.purple.name = ç´« -tutorial.next = [lightgray]<按下以繼續> -tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[WASDéµ]來移動.\n滾動滾輪來放大縮å°ç•«é¢.\n從[accent]開採銅礦[]é–‹å§‹å§é è¿‘它,然後在é è¿‘核心的ä½ç½®é»žæ“ŠéŠ…ç¤¦ã€‚\n\n[accent]{0}/{1}銅礦 -tutorial.intro.mobile = 您已進入[scarlet] Mindustry 教學。[]\n滑動螢幕å³å¯ç§»å‹•。\n[accent]用兩指æ[]來縮放畫é¢ã€‚\n從[accent]開採銅礦[]é–‹å§‹å§ã€‚é è¿‘它,然後在é è¿‘核心的ä½ç½®é»žæ“ŠéŠ…ç¤¦ã€‚\n\n[accent]{0}/{1}銅礦 -tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。\nä¸è«–在哪個é¸å–®ï¼Œæ‚¨ä¹Ÿå¯ä»¥ç”¨å¿«é€ŸæŒ‰ä¸‹æŒ‰éµ[accent][[2][]然後[accent][[1][]來鏿“‡é‘½é ­ã€‚\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製作一æ¢å¾žé‘½é ­é–‹å§‹åˆ°æ ¸å¿ƒçš„輸é€å¸¶ã€‚ -tutorial.conveyor.mobile = [accent]輸é€å¸¶[]能夠將物å“é‹è¼¸åˆ°æ ¸å¿ƒã€‚製作一æ¢å¾žé‘½é ­é–‹å§‹åˆ°æ ¸å¿ƒçš„輸é€å¸¶ã€‚\n[accent]長按數秒[]並å‘ä¸€å€‹æ–¹å‘æ‹–動來放置直線。\n\n[accent]{0}/{1} æ¢è¼¸é€å¸¶\n[accent]0/1 äº¤ä»˜çš„ç‰©å“ -tutorial.turret = 防禦建築是必須的以擊退[lightgray]敵人[]。\n於核心附近建造一個雙炮。 -tutorial.drillturret = 雙炮需è¦[accent]銅彈[]以射擊。\n在雙炮æ—邊放置一個鑽頭以供應銅。 -tutorial.pause = 在戰鬥中,你å¯ä»¥[accent]æš«åœéŠæˆ²ã€‚[]\n您å¯ä»¥åœ¨æš«åœæ™‚è¦åŠƒå»ºç¯‰ç‰©ä¸¦åŠ å…¥å»ºé€ åºåˆ—。\n\n[accent]æŒ‰ç©ºç™½éµæš«åœéŠæˆ²ã€‚ -tutorial.pause.mobile = 在戰鬥中,你å¯ä»¥[accent]æš«åœéŠæˆ²ã€‚[]\n您å¯ä»¥åœ¨æš«åœæ™‚è¦åŠƒå»ºç¯‰ç‰©ä¸¦åŠ å…¥å»ºé€ åºåˆ—。\n\n[accent]按左上角的此按鈕暫åœã€‚ -tutorial.unpause = ç¾åœ¨å†æ¬¡æŒ‰ç©ºæ ¼éµå³å¯å–消暫åœã€‚ -tutorial.unpause.mobile = ç¾åœ¨å†æ¬¡æŒ‰ç©ºæ ¼éµå³å¯å–消暫åœã€‚ -tutorial.breaking = 方塊經常需è¦è¢«æ‹†é™¤ã€‚\n[accent]按ä½å³éµ[]ç ´å£žé¸æ“‡å€åŸŸä¸­çš„æ‰€æœ‰æ–¹å¡Šã€‚[]\n\n[accent]使用å€åŸŸé¸æ“‡æ‹†é™¤æ ¸å¿ƒå·¦å´çš„æ‰€æœ‰å»¢æ–™æ–¹å¡Šã€‚ -tutorial.breaking.mobile = 方塊經常需è¦è¢«æ‹†é™¤ã€‚\n[accent]鏿“‡æ‹†é™¤æ¨¡å¼[],然後點擊一個方塊以破壞它。\n按ä½èž¢å¹•幾秒é˜ä¸¦å‘ä¸€å€‹æ–¹å‘æ‹–動以破壞一個範åœå…§çš„æ–¹å¡Š[]。\næŒ‰ä¸‹ç¢ºèªæ¨™è¨˜æŒ‰éˆ•ä»¥ç¢ºèªæ‹†é™¤ã€‚\n\n[accent]使用å€åŸŸé¸æ“‡æ‹†é™¤æ ¸å¿ƒå·¦å´çš„æ‰€æœ‰å»¢æ–™æ–¹å¡Šã€‚ -tutorial.withdraw = 在æŸäº›æƒ…æ³ä¸‹ï¼Œç›´æŽ¥å¾žæ–¹å¡Šä¸­å–å‡ºç‰©å“æ˜¯å¿…è¦çš„。\n[accent]點擊有物å“的方塊[],然後[accent]點擊在方框中的物å“[]以將其å–出。\nå¯ä»¥é€šéŽ[accent]點擊或長按[]來å–出物å“。\n\n[accent]從核心中å–出一些銅。[] -tutorial.deposit = 通éŽå°‡ç‰©å“å¾žèˆ¹ä¸Šæ‹–åˆ°ç›®æ¨™æ–¹å¡Šï¼Œå°‡ç‰©å“æ”¾å…¥æ–¹å¡Šä¸­ã€‚\n\n[accent]將您的銅放到核心中。[] -tutorial.waves = [lightgray]敵人[]來臨。\n\nä¿è­·æ ¸å¿ƒæŠµæŠ—兩波攻擊。\n建造更多的砲塔和鑽頭。開採更多的銅。 -tutorial.waves.mobile = [lightgray]敵人[]來臨。\n\nä¿è­·æ ¸å¿ƒæŠµæŠ—å…©æ³¢æ”»æ“Šã€‚æ‚¨çš„é£›èˆ¹æœƒè‡ªå‹•å‘æ•µäººé–‹ç«ã€‚\n建造更多的砲塔和鑽頭。開採更多的銅。 -tutorial.launch = 一旦您é”到特定的波數, 您就å¯ä»¥[accent] 發射核心[],放棄防禦並[accent]ç²å–核心中的所有資æºã€‚[]\n這些資æºå¯ä»¥ç”¨æ–¼ç ”究新科技。\n\n[accent]按下發射按鈕。 +hint.skip = è·³éŽ +hint.desktopMove = 使用[accent][[WASD][]來移動。 +hint.zoom = 滾動 [accent]滾輪[] 來放大縮å°ç•«é¢ã€‚ +hint.mine = é è¿‘並 [accent]點擊[] \uf8c4 銅礦以自行採礦。 +hint.desktopShoot = [accent][[點擊左éµ][]射擊。 +hint.depositItems = 從船身拖曳到核心以存放採完的礦物。 +hint.respawn = 按[accent][[V][]以é‡ç”Ÿã€‚ +hint.respawn.mobile = ä½ ç›®å‰åœ¨æŽ§åˆ¶å–®ä½/建築。[accent]點擊左上角的頭åƒ[]é‡ç”Ÿã€‚ +hint.desktopPause = 按[accent][[空白éµ][]æš«åœã€ç¹¼çºŒéŠæˆ²ã€‚ +hint.placeDrill = 點é¸å³ä¸‹ä»‹é¢çš„ \ue85e [accent]鑽頭[]é ã€‚鏿“‡ \uf870 [accent]鑽頭[]並點擊畫é¢å°‡é‘½é ­æ”¾åˆ°éŠ…ç¤¦ä¸Šã€‚ +hint.placeDrill.mobile = 點é¸å³ä¸‹ä»‹é¢çš„ \ue85e [accent]鑽頭[]é ã€‚鏿“‡ \uf870 [accent]鑽頭[]並點擊畫é¢å°‡é‘½é ­æ”¾åˆ°éŠ…ç¤¦ä¸Šã€‚\n\n按下 \ue800 [accent]勾勾[]來確èªå»ºé€ ã€‚ +hint.placeConveyor = [accent]輸é€å¸¶[]能夠將物å“é‹åˆ°å…¶ä»–地方。從 \ue814 [accent]é‹è¼¸[]é ä¸­é»žé¸ \uf896 [accent]輸é€å¸¶[]。\n\n按ä½ä¸¦æ‹–曳以建造多個輸é€å¸¶ã€‚\n[accent]滑動滾輪[]以旋轉。 +hint.placeConveyor.mobile = [accent]輸é€å¸¶[]能夠將物å“é‹åˆ°å…¶ä»–地方。從 \ue814 [accent]é‹è¼¸[]é ä¸­é»žé¸ \uf896 [accent]輸é€å¸¶[]。\n\n按ä½ç•«é¢è¶…éŽä¸€ç§’後拖曳以建造多個輸é€å¸¶ã€‚ +hint.placeTurret = 建造 \uf861 [accent]砲塔[]抵禦進犯的敵è»ã€‚\n\n砲塔需è¦å½ˆè—¥ï¼Œç¾åœ¨å‰‡æ˜¯éœ€è¦ \uf838銅。\n用輸é€å¸¶å’Œé‘½é ­ä¾›æ‡‰ç ²å¡”。 +hint.breaking = [accent]按ä½å³éµ[]並拖曳以破壞方塊。 +hint.breaking.mobile = 點亮å³ä¸‹è§’çš„ \ue817 [accent]éµéŽš[]圖案並點擊畫é¢å¯ç›´æŽ¥æ‹†é™¤æ–¹å¡Šã€‚\n\n按ä½ç•«é¢è¶…éŽä¸€ç§’後拖曳以連續摧毀多個方塊。 +hint.research = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。 +hint.research.mobile = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。 +hint.unitControl = 按ä½[accent][[L-ctrl][]並[accent]點擊[]以控制我方的機甲和砲å°ã€‚ +hint.unitControl.mobile = [accent][[點擊兩下][]以控制我方的機甲和砲å°ã€‚ +hint.launch = 一旦è’集到足夠的資æºï¼Œä½ å¯ä»¥é€éŽå³ä¸‹è§’çš„ \ue827 [accent]地圖[]來é¸å–ä½ è¦[accent]發射[]çš„å€åŸŸã€‚ +hint.launch.mobile = 一旦è’集到足夠的資æºï¼Œä½ å¯ä»¥é€éŽé¸å–®ä¸­çš„ \ue827 [accent]地圖[]來é¸å–ä½ è¦[accent]發射[]çš„å€åŸŸã€‚ +hint.schematicSelect = 按ä½[accent][[F][]並拖曳å¯ä»¥é¸å–方塊並貼上。\n\n按下[accent][[滑鼠中éµ][]å¯ä»¥è¤‡è£½å–®ä¸€æ–¹å¡Šã€‚ +hint.conveyorPathfind = 在建造輸é€å¸¶æ™‚按下[accent][[L-Ctrl][]å¯ä»¥è‡ªå‹•產生路徑。 +hint.conveyorPathfind.mobile = 啟用 \ue844 [accent]å°è§’線模å¼[]å¯ä»¥åœ¨å»ºé€ è¼¸é€å¸¶æ™‚自動產生路徑。 +hint.boost = 按ä½[accent][[L-Shift][]å¯ä»¥å¸¶è‘—你的機甲一起飛越障礙物\n\nåªæœ‰å°‘數陸行機甲有推進器。 +hint.command = 按下[accent][[G][]集çµé™„è¿‘[accent]相似類別[]的機甲進入編隊。\n\nä½ è¦å…ˆæŽ§åˆ¶ä¸€å°é™¸è¡Œæ©Ÿç”²æ‰èƒ½é›†çµå…¶ä»–陸行機甲。 +hint.command.mobile = [accent][[點擊兩下][]你的機甲使其他機甲進入編隊。 +hint.payloadPickup = 按下 [accent][[[] æ‹¾èµ·å°æ–¹å¡Šæˆ–機甲。 +hint.payloadPickup.mobile = [accent]長按[]一個方塊或單ä½å¯å°‡å…¶æ‹¾èµ·ã€‚ +hint.payloadDrop = 按下 [accent]][] å¯ä»¥æ”¾ä¸‹æŒæœ‰çš„æ–¹å¡Šæˆ–å–®ä½ã€‚ +hint.payloadDrop.mobile = [accent]長按[]任何空白處å¯ä»¥æ”¾ä¸‹æŒæœ‰çš„æ–¹å¡Šæˆ–å–®ä½ã€‚ +hint.waveFire = 以[accent]æ°´[]è£å¡«çš„[accent]波浪[]會自動撲滅附近ç«å‹¢ã€‚ +hint.generator = \uf879 [accent]燃燒發電機[]消耗煤炭產生能æºçµ¦ç›¸é„°çš„æ–¹å¡Šã€‚\n\n使用 \uf87f [accent]能é‡ç¯€é»ž[]增加電力涵蓋範åœã€‚ +hint.guardian = [accent]é ­ç›®[]æ“æœ‰åŽšå¯¦çš„è£ç”²ã€‚較弱的彈藥如[accent]銅[]å’Œ[accent]鉛[]並[scarlet]沒有效果[].\n\n使用更高等的砲臺或以\uf835 [accent]石墨[]é…åˆ\uf861雙砲ã€\uf859齊射砲摧毀頭目。 +hint.coreUpgrade = 核心å¯ä»¥é€éŽåœ¨ä¸Šé¢[accent]覆蓋一個更高等級的核心[]來å‡ç´šã€‚\n\n放置  [accent]核心:基地[] 到 ï¡© [accent]核心:碎片[] 上. ç¢ºä¿æ²’有其他障礙物。 +hint.presetLaunch = ç°è‰²çš„[accent]é™è½åœ°å€[],例如[accent]冰凿£®æž—[],å¯ç”±ä»»ä½•地å€ç™¼å°„。這類地å€ç„¡é ˆç”±ç›¸é„°åœ°å€é€²æ”»ã€‚\n\n[accent]數字編號地å€[]ï¼Œåƒæ˜¯é€™ä¸€å€‹ï¼Œå¯ä¸æ˜¯å®Œæˆæˆ°å½¹çš„å¿…è¦æ¢ä»¶ã€‚ +hint.coreIncinerate = 當任一物å“的核心庫存滿了後,後續進入的åŒç¨®è³‡æºæœƒè¢«[accent]銷毀[]。 +hint.coopCampaign = éŠçŽ©[accent]多人åˆä½œæˆ°å½¹[]時,åŒåœ°åœ–所生產的資æºçš†æœƒè¢«é€å…¥[accent]自己的地å€[]。\n\n任何新科技也會單å‘åŒæ­¥åˆ°è‡ªå·±çš„科技。 item.copper.description = æœ€åŸºæœ¬çš„çµæ§‹ææ–™ã€‚在å„種類型的方塊中廣泛使用。 +item.copper.details = 銅,蕈孢星上異常常見的金屬。加工å‰çµæ§‹è„†å¼±ã€‚ item.lead.description = ä¸€ç¨®åŸºæœ¬çš„èµ·å§‹ææ–™ã€‚被廣泛用於電å­è¨­å‚™å’Œæ¶²é«”é‹è¼¸æ–¹å¡Šã€‚ -item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分é…和存儲。 +item.lead.details = 密度高ã€ç©©å®šã€‚廣泛用於電池中。\n附記:å¯èƒ½å°ç”Ÿç‰©æœ‰æ¯’性。å³ä¾¿é€™è£¡ä¹Ÿæ²’剩多少。 +item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分é…和儲存。 item.graphite.description = 礦化的碳,用於彈藥和電氣元件。 item.sand.description = ä¸€ç¨®å¸¸è¦‹çš„ææ–™ï¼Œå»£æ³›ç”¨æ–¼å†¶ç…‰ï¼ŒåŒ…括製作åˆé‡‘和作為助熔劑。 item.coal.description = é åœ¨ã€Œæ’­ç¨®ã€äº‹ä»¶å‰å°±å½¢æˆçš„æ¤ç‰©åŒ–çŸ³ã€‚ä¸€ç¨®å¸¸è¦‹ä¸¦å®¹æ˜“ç²å¾—的燃料。 +item.coal.details = 看似æ¤ç‰©åŒ–çŸ³ï¼Œå½¢æˆæ™‚é–“é æ—©æ–¼ã€Œæ’­ç¨®ã€äº‹ä»¶ã€‚ item.titanium.description = 一種罕見的超輕金屬,被廣泛é‹ç”¨æ–¼é‹è¼¸æ¶²é«”ã€é‘½é ­å’Œé£›è¡Œè¼‰å…·ã€‚ item.thorium.description = ä¸€ç¨®é«˜å¯†åº¦çš„æ”¾å°„æ€§é‡‘å±¬ï¼Œç”¨ä½œçµæ§‹æ”¯æ’和核燃料。 item.scrap.description = èˆŠçµæ§‹å’Œå–®ä½çš„æ®˜éª¸ã€‚嫿œ‰å¾®é‡çš„å„種金屬。 +item.scrap.details = å¤è€å»ºç¯‰ã€å…µå™¨ç•™ä¸‹çš„æ®˜éª¸ã€‚ 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.spore-pod.description = åˆæˆçš„å­¢å­èŽ¢ã€‚åˆæˆå¤§æ°£æ¿ƒåº¦çš„å­¢å­åšç‚ºå·¥æ¥­ç”¨é€”。用於轉化為原油ã€çˆ†ç‚¸ç‰©å’Œç‡ƒæ–™ã€‚ +item.spore-pod.details = 充滿孢å­ã€‚很å¯èƒ½æ˜¯äººé€ ç”Ÿç‰©ã€‚會釋放å°å…¶ä»–生物有毒的氣體。極具侵略性。特定情æ³ä¸‹æ¥µç‚ºæ˜“燃。 +item.blast-compound.description = 用於炸彈和高爆彈的混åˆç‰©ã€‚ +item.pyratite.description = 用於至燃武器和燃燒型發電機的物質。 + liquid.water.description = æœ€æœ‰ç”¨çš„æ¶²é«”ã€‚å¸¸ç”¨æ–¼å†·å»æ©Ÿå™¨å’Œå»¢ç‰©è™•ç†ã€‚ liquid.slag.description = å„種ä¸åŒé¡žåž‹çš„熔èžé‡‘屬混åˆåœ¨ä¸€èµ·çš„æ¶²é«”。å¯ä»¥è¢«åˆ†è§£æˆå…¶æ‰€çµ„æˆä¹‹ç¤¦ç‰©ï¼Œæˆ–ä½œç‚ºæ­¦å™¨å‘æ•µæ–¹å–®ä½å™´ç‘。 liquid.oil.description = ç”¨æ–¼é€²éšŽææ–™è£½é€ çš„æ¶²é«”。å¯ä»¥è½‰åŒ–為煤炭作為燃料或噴ç‘呿•µæ–¹å–®ä½å¾Œé»žç‡ƒä½œç‚ºæ­¦å™¨ã€‚ liquid.cryofluid.description = 一種安定,無è…è•æ€§çš„æ¶²é«”,用水åŠéˆ¦æ··åˆæˆã€‚具有很高的比熱。廣泛的用作冷å»åŠ‘ã€‚ +block.resupply-point.description = 補給銅礦彈藥給附近的單ä½ã€‚無法用於需è¦é›»æ± é›»åŠ›çš„å–®ä½ã€‚ +block.armored-conveyor.description = 以與鈦輸é€å¸¶ç›¸åŒçš„速度移動物å“ï¼Œä½†æ“æœ‰æ›´é«˜çš„é˜²ç¦¦ã€‚ä¸æŽ¥å—任何從å´é¢è¼¸å…¥çš„資æºã€‚ +block.illuminator.description = å°è€Œç¾Žçš„å…‰æºã€‚ block.message.description = 儲存一æ¢è¨Šæ¯ã€‚用於盟å‹ä¹‹é–“çš„æºé€šã€‚ block.graphite-press.description = 將煤炭壓縮æˆçŸ³å¢¨ã€‚ block.multi-press.description = 石墨壓縮機的å‡ç´šç‰ˆã€‚利用水和電力快速高效地處ç†ç…¤ç‚­ã€‚ block.silicon-smelter.description = 使用高純度焦炭還原沙å­ä»¥ç”Ÿç”¢çŸ½ã€‚ block.kiln.description = 將沙å­å’Œé‰›ç†”ç…‰æˆé‹¼åŒ–玻璃。需è¦å°‘é‡èƒ½é‡ã€‚ block.plastanium-compressor.description = 將原油和鈦壓縮製造塑鋼。 -block.phase-weaver.description = 使用放射性的釷和大é‡çš„æ²™å­ç”Ÿç”¢ç›¸ç¹”布。需è¦å·¨é‡èƒ½é‡ã€‚ -block.alloy-smelter.description = 使用鈦ã€é‰›ã€çŸ½å’ŒéŠ…ä»¥ç”Ÿç”¢æ³¢å‹•åˆé‡‘。 +block.phase-weaver.description = 使用放射性的釷和大é‡çš„æ²™å­ç”Ÿç”¢ç›¸ç¹”布。 +block.alloy-smelter.description = 使用鈦ã€é‰›ã€çŸ½å’ŒéŠ…ä»¥ç”Ÿç”¢æ³¢å‹•åˆé‡‘。 block.cryofluid-mixer.description = æ··åˆæ°´å’Œç ”ç£¨çš„éˆ¦ç²‰è£½é€ å†·å»æ•ˆçŽ‡æ›´é«˜çš„å†·å‡æ¶²ã€‚å°é‡·å應堆是必è¦çš„。 block.blast-mixer.description = æ··åˆèƒžå­ç¢Žå¡Šå°‡ç«ç„°å½ˆè®Šæˆæ¯”è¼ƒä¸æ˜“燃但更具爆炸性的爆炸混åˆç‰©ã€‚ block.pyratite-mixer.description = æ··åˆç…¤ã€é‰›å’Œæ²™å­æ··åˆæˆç‚ºæ˜“燃的ç«ç„°å½ˆã€‚ @@ -1206,8 +1379,8 @@ block.melter.description = 將廢料加熱到很高的溫度產生熔渣,用 block.separator.description = 將熔渣分離æˆå„種礦物質。將其冷å»å¾Œè¼¸å‡ºã€‚ block.spore-press.description = 將孢å­èŽ¢å£“ç¸®æˆåŽŸæ²¹ã€‚ block.pulverizer.description = å°‡å»¢æ–™ç²‰ç¢Žæˆæ²™å­ã€‚當缺少天然沙時相當有用。 -block.coal-centrifuge.description = 將原油固化æˆç…¤ç¤¦ã€‚ -block.incinerator.description = éŠ·æ¯€å®ƒæŽ¥æ”¶åˆ°çš„ä»»ä½•å¤šé¤˜ç‰©å“æˆ–液體。 +block.coal-centrifuge.description = 將原油固化æˆç…¤ç‚­ã€‚ +block.incinerator.description = éŠ·æ¯€æ‰€æœ‰æŽ¥æ”¶çš„ç‰©å“æˆ–液體。 block.power-void.description = 銷毀所有輸入的能é‡ã€‚åƒ…é™æ²™ç›’。 block.power-source.description = ç„¡é™è¼¸å‡ºèƒ½é‡ã€‚åƒ…é™æ²™ç›’。 block.item-source.description = ç„¡é™è¼¸å‡ºç‰©å“ã€‚åƒ…é™æ²™ç›’。 @@ -1232,16 +1405,17 @@ block.mender.description = 定期修復附近的建築物。在æ¯ä¸€æ³¢ä¹‹é–“ block.mend-projector.description = é«˜ç´šçš„ä¿®ç†æ–¹å¡Šã€‚å¯é¸æ“‡ä½¿ç”¨ç›¸ç¹”布增加範åœå’Œæ•ˆçŽ‡ã€‚ block.overdrive-projector.description = æé«˜é™„近建築物的速度,如鑽頭和輸é€å¸¶ã€‚å¯é¸æ“‡ä½¿ç”¨ç›¸ç¹”布增加範åœå’Œæ•ˆçŽ‡ã€‚ block.force-projector.description = 在自身周åœå½¢æˆä¸€å€‹å…­è§’形能é‡åŠ›å ´è­·ç›¾ï¼Œä¿è­·å…§éƒ¨çš„建築物和單ä½å…å—傷害。承å—太多傷害時會éŽç†±ã€‚å¯é¸æ“‡ç”¨å†·å»æ¶²é¿å…éŽç†±ã€‚å¯ä»¥ä½¿ç”¨ç›¸ç¹”布增加護盾範åœã€‚ -block.shock-mine.description = 傷害踩到地雷的敵人。敵人幾乎看ä¸è¦‹ã€‚ -block.conveyor.description = 基本物å“傳輸方塊。將物å“å‘å‰ç§»å‹•並自動將它們放入砲塔或機器中。能夠旋轉方å‘。 +block.shock-mine.description = 傷害經éŽçš„æ•µäººã€‚æ•µäººç„¡æ³•æŒ‡å®šåœ°é›·æ”»æ“Šï¼Œä½†ä»æœƒè¢«æµå½ˆæ‘§æ¯€ã€‚ +block.conveyor.description = 基本物å“傳輸方塊。將物å“å‘å‰ç§»å‹•並自動將它們放入砲塔或機器中。 block.titanium-conveyor.description = 高級物å“傳輸方塊。比標準輸é€å¸¶æ›´å¿«åœ°ç§»å‹•物å“。 block.plastanium-conveyor.description = 批é‡è¼¸é€ç‰©å“。\n從後方接å—物å“,並å‘三個方å‘輸出。 block.junction.description = 作為兩個交å‰è¼¸é€å¸¶çš„æ©‹æ¨‘。é©ç”¨æ–¼å…©æ¢ä¸åŒè¼¸é€å¸¶å°‡ä¸åŒç‰©å“é‹é€åˆ°ä¸åŒä½ç½®çš„æƒ…æ³ã€‚ block.bridge-conveyor.description = 高級的物å“é‹è¼¸æ–¹å¡Šã€‚å…è¨±è·¨éŽæœ€å¤š3個任何地形或建築物的方塊é‹è¼¸ç‰©å“。 block.phase-conveyor.description = 高級物å“傳輸方塊。使用能é‡å°‡ç‰©å“傳é€åˆ°å¹¾å€‹æ–¹å¡Šå¤–連接的相織輸é€å¸¶ã€‚ -block.sorter.description = å°ç‰©å“進行分類。如果物å“與所é¸ç¨®é¡žåŒ¹é…,則å…許其通éŽã€‚å¦å‰‡ï¼Œç‰©å“將從左邊和å³é‚Šè¼¸å‡ºã€‚ -block.inverted-sorter.description = 處ç†ç‰©å“的方å¼é¡žä¼¼æ–¼åˆ†é¡žå™¨ï¼Œä½†å°‡æ‰€é¸æ“‡çš„物å“輸出到å´é¢ã€‚ +block.sorter.description = å°ç‰©å“進行分類。如果物å“與所é¸ç¨®é¡žåŒ¹é…,則å…許其通éŽã€‚å¦å‰‡ï¼Œç‰©å“將從兩å´è¼¸å‡ºã€‚ +block.inverted-sorter.description = 處ç†ç‰©å“的方å¼é¡žä¼¼æ–¼åˆ†é¡žå™¨ï¼Œä½†å°‡æ‰€é¸æ“‡çš„物å“輸出到å´é‚Šã€‚ block.router.description = 接å—來自一個方å‘的物å“並將它們平å‡è¼¸å‡ºåˆ°æœ€å¤š3個其他方å‘。用於將物å“從一個來æºåˆ†å‰²ç‚ºå¤šå€‹ç›®æ¨™ã€‚\n\n[[scarlet]ä¸å»ºè­°ç·Šè²¼åœ¨ç”Ÿç”¢åž‹æ–¹å¡Šæ—使用,å¯èƒ½å°Žè‡´å…¶è¢«ç”¢å‡ºå µå¡žã€‚[] +block.router.details = å¿…è¦ä¹‹æƒ¡ã€‚ä¸å»ºè­°æ”¾ç½®åœ¨ç”Ÿç”¢å»ºç¯‰æ—,ä¸ç„¶å¯èƒ½æœƒå› è¼¸å‡ºç‰©å“造æˆé˜»å¡žã€‚ block.distributor.description = 高級的分é…器,å¯å°‡ç‰©å“å‡åˆ†åˆ°æœ€å¤š7個其他方å‘。 block.overflow-gate.description = 如果å‰é¢è¢«é˜»æ“‹ï¼Œå‰‡å‘左邊和å³é‚Šè¼¸å‡ºç‰©å“。 block.underflow-gate.description = åå‘的溢æµå™¨ã€‚如果å´é¢è¢«é˜»æ“‹ï¼Œå‰‡å‘剿–¹è¼¸å‡ºç‰©å“。 @@ -1253,7 +1427,7 @@ block.conduit.description = 基本液體é‹è¼¸æ–¹å¡Šã€‚將液體往å‰è¼¸é€ã€‚ block.pulse-conduit.description = 高級的液體é‹è¼¸æ–¹å¡Šã€‚比標準管線更快地輸é€ä¸¦å„²å­˜æ›´å¤šæ¶²é«”。 block.plated-conduit.description = 用和脈è¡ç®¡ç·šç›¸åŒçš„速率é‹é€æ¶²é«”,但有更強的è£ç”²ã€‚é™¤äº†å…¶ä»–ç®¡ç·šä»¥å¤–ï¼Œä¸æœƒæŽ¥å—來自å´é¢çš„其他液體\næ¯”è¼ƒä¸æœƒæ¼æ¶²ã€‚ block.liquid-router.description = 接å—來自一個方å‘的液體並將它們平å‡è¼¸å‡ºåˆ°æœ€å¤š3個其他方å‘。å¯ä»¥å„²å­˜ä¸€å®šé‡çš„æ¶²é«”。用於將液體從一個來æºåˆ†æˆå¤šå€‹ç›®æ¨™ã€‚ -block.liquid-tank.description = å­˜å„²å¤§é‡æ¶²é«”ã€‚ç•¶æ¶²é«”éœ€æ±‚éžæ†å®šæ™‚ï¼Œä½¿ç”¨å®ƒä¾†å‰µå»ºç·©è¡æˆ–作為冷å»é‡è¦æ–¹å¡Šçš„ä¿éšœã€‚ +block.liquid-tank.description = å„²å­˜å¤§é‡æ¶²é«”ã€‚ç•¶æ¶²é«”éœ€æ±‚éžæ†å®šæ™‚ï¼Œä½¿ç”¨å®ƒä¾†å‰µå»ºç·©è¡æˆ–作為冷å»é‡è¦æ–¹å¡Šçš„ä¿éšœã€‚ block.liquid-junction.description = 作為兩個交å‰ç®¡ç·šçš„æ©‹æ¨‘。é©ç”¨æ–¼å…©æ¢ä¸åŒç®¡ç·šå°‡ä¸åŒæ¶²é«”é‹é€åˆ°ä¸åŒä½ç½®çš„æƒ…æ³ã€‚ block.bridge-conduit.description = 高級的液體é‹è¼¸æ–¹å¡Šã€‚å…è¨±è·¨éŽæœ€å¤š3個任何地形或建築物的方塊é‹è¼¸æ¶²é«”。 block.phase-conduit.description = 高級的液體é‹è¼¸æ–¹å¡Šã€‚使用能é‡å°‡æ¶²é«”傳é€åˆ°å¤šå€‹æ–¹å¡Šå¤–連接的相織管線。 @@ -1261,34 +1435,37 @@ block.power-node.description = 將能é‡å‚³è¼¸åˆ°ç›¸é€£çš„節點。該節點將 block.power-node-large.description = 具有更大範åœå’Œæ›´å¤šé€£æŽ¥çš„高級電æºç¯€é»žã€‚ block.surge-tower.description = 具有兩個å¯ç”¨é€£æŽ¥çš„è¶…é ç¨‹èƒ½é‡ç¯€é»žã€‚ block.diode.description = 電池中的電力在這個方塊中åªèƒ½æœ‰ä¸€å€‹å›ºå®šçš„æµå‘ï¼Œä¸¦ä¸”åªæœ‰åœ¨å¦ä¸€å´çš„能é‡è¼ƒå°‘æ™‚æ‰æœƒé€šéŽã€‚ -block.battery.description = 有能é‡å‰©é¤˜æ™‚存儲電力並在能é‡çŸ­ç¼ºæ™‚æä¾›èƒ½é‡ã€‚ -block.battery-large.description = 比普通電池存儲更多的能é‡ã€‚ +block.battery.description = 有能é‡å‰©é¤˜æ™‚儲存電力並在能é‡çŸ­ç¼ºæ™‚æä¾›èƒ½é‡ã€‚ +block.battery-large.description = 比普通電池儲存更多的能é‡ã€‚ block.combustion-generator.description = é€éŽç‡ƒç‡’原油或å¯ç‡ƒç‰©å“以產生能é‡ã€‚ block.thermal-generator.description = 放置在熱的ä½ç½®æ™‚會產生能é‡ã€‚ block.steam-generator.description = æ¯”ç‡ƒç‡’ç™¼é›»æ©Ÿæ›´æœ‰æ•ˆçŽ‡ï¼Œä½†éœ€è¦æ°´æ‰èƒ½é‹ä½œã€‚ block.differential-generator.description = åˆ©ç”¨å†·å»æ¶²å’Œç‡ƒç‡’ç«ç„°å½ˆä¹‹é–“的溫差產生大é‡çš„能é‡ã€‚ block.rtg-generator.description = 一種簡單ã€å¯é çš„發電機,使用放射性化åˆç‰©è¡°è®Šæ‰€ç”¢ç”Ÿçš„熱產生少é‡èƒ½é‡ã€‚ä¸éœ€è¦å†·å»ï¼Œä½†ç”¢ç”Ÿçš„èƒ½é‡æ¯”釷忇‰å †å°‘。 block.solar-panel.description = é€éŽå¤ªé™½ç”¢ç”Ÿå°‘é‡çš„能é‡ã€‚ -block.solar-panel-large.description = 比標準太陽能æ¿ç”¢ç”Ÿæ›´å¤šçš„能é‡ï¼Œä½†å»ºé€ èµ·ä¾†æ˜‚貴得多。 +block.solar-panel-large.description = é€éŽå¤ªé™½ç”¢ç”Ÿå°‘é‡çš„能é‡ã€‚效率較普通太陽能æ¿é«˜ã€‚ block.thorium-reactor.description = 從高度放射性釷產生大é‡èƒ½é‡ã€‚éœ€è¦æŒçºŒå†·å»ã€‚如果供應的冷å»åŠ‘ä¸è¶³ï¼ŒæœƒåŠ‡çƒˆçˆ†ç‚¸ã€‚ç”¢ç”Ÿçš„èƒ½é‡å–決於釷è£è¼‰é‡ï¼Œæ»¿è¼‰æ™‚會é”到基礎發電功率。 -block.impact-reactor.description = 先進的發電機,在尖峰值效率時能產生巨é‡èƒ½é‡ã€‚需è¦å¤§é‡çš„é›»æºè¼¸å…¥æ‰èƒ½å•Ÿå‹•該éŽç¨‹ã€‚ +block.impact-reactor.description = 先進的發電機,在最高效率時能產生大é‡èƒ½é‡ã€‚需è¦å…ˆæ¶ˆè€—大é‡çš„èƒ½æºæ‰èƒ½å•Ÿå‹•。 block.mechanical-drill.description = 一種便宜的鑽頭。當放置在é©ç•¶çš„æ–¹å¡Šä¸Šæ™‚ï¼Œä»¥ç·©æ…¢çš„é€Ÿåº¦ç„¡é™æœŸåœ°è¼¸å‡ºç‰©å“。åªèƒ½æŒ–掘基本的原料。 block.pneumatic-drill.description = 一種改進的鑽頭,å¯ä»¥æŒ–掘鈦。比機械鑽頭挖掘的更快。 -block.laser-drill.description = é€šéŽæ¿€å…‰æŠ€è¡“å¯ä»¥æ›´å¿«åœ°æŒ–掘,但需è¦èƒ½é‡ã€‚此外,這種鑽頭å¯ä»¥æŒ–掘放射性釷。 +block.laser-drill.description = 通éŽé›·å°„技術å¯ä»¥æ›´å¿«åœ°æŒ–掘,但需è¦èƒ½é‡ã€‚此外,這種鑽頭å¯ä»¥æŒ–掘放射性釷。 block.blast-drill.description = 終極的鑽頭。需è¦å¤§é‡èƒ½é‡ã€‚ -block.water-extractor.description = 從地下æå–水。當附近沒有湖泊時å¯ä»¥ä½¿ç”¨å®ƒã€‚ +block.water-extractor.description = 從地下æå–æ°´ã€‚é™„è¿‘æ²’æœ‰åœ°é¢æ°´æºæ™‚使用。 block.cultivator.description = å°‡å¤§æ°£ä¸­å¾®å°æ¿ƒåº¦çš„胞å­åŸ¹é¤Šæˆå·¥æ¥­ç­‰ç´šçš„å­¢å­èŽ¢ã€‚ +block.cultivator.details = 拾回的科技。用以極高效率生產大é‡çš„生物質。å¯èƒ½æ˜¯ç•¶åˆåŸ¹é¤Šç¾åœ¨è¦†è“‹æ•´å€‹è•ˆå­¢æ˜Ÿçš„å­¢å­çš„培養槽。 block.oil-extractor.description = 使用大é‡çš„能é‡ã€æ°´ä»¥åŠæ²™å­é‘½å–åŽŸæ²¹ã€‚ç•¶é™„è¿‘æ²’æœ‰ç›´æŽ¥çš„åŽŸæ²¹ä¾†æºæ™‚使用它。 -block.core-shard.description = åˆä»£çš„æ ¸å¿ƒè† å›Šã€‚一旦被摧毀,與該地å€çš„æ‰€æœ‰è¯ç¹«éƒ½å°‡å¤±åŽ»ã€‚ä¸è¦è®“這種情æ³ç™¼ç”Ÿã€‚ -block.core-foundation.description = 第二代核心。有更好的è£ç”²ã€‚å¯ä»¥å­˜å„²æ›´å¤šè³‡æºã€‚ -block.core-nucleus.description = 第三代核心,也是最後一代。è£ç”²éžå¸¸å¥½ã€‚å¯ä»¥å­˜å„²å¤§é‡è³‡æºã€‚ -block.vault.description = 存儲大é‡çš„æ¯ä¸€ç¨®ç‰©å“。當物å“éœ€æ±‚éžæ†å®šæ™‚,使用它來創建緩è¡ã€‚使用[lightgray]è£å¸å™¨[]以從存儲庫æå–物å“。 -block.container.description = 存儲少é‡çš„æ¯ä¸€ç¨®ç‰©å“。當物å“éœ€æ±‚éžæ†å®šæ™‚,使用它來創建緩è¡ã€‚使用[lightgray]è£å¸å™¨[]以從容器æå–物å“。 -block.unloader.description = 將物å“從容器ã€å­˜å„²åº«æˆ–核心å¸è¼‰åˆ°å‚³è¼¸å¸¶ä¸Šæˆ–直接å¸è¼‰åˆ°ç›¸é„°çš„æ–¹å¡Šä¸­ã€‚é€éŽé»žæ“Šå¸è¼‰å™¨ä¾†æ›´æ”¹è¦å¸è¼‰çš„物å“類型。 +block.core-shard.description = 基地的中樞。一旦被摧毀,會失去å°è©²åœ°å€çš„æŽ§åˆ¶æ¬Šã€‚ +block.core-shard.details = 第一代核心。輕巧ã€èƒ½è‡ªæˆ‘複製。é…備單次使用的推進器。ä¸é©åˆç”¨æ–¼æ˜Ÿé𛿗…行åˆä»£çš„æ ¸å¿ƒã€‚ +block.core-foundation.description = 基地的中樞。è£ç”²åŽšå¯¦ã€‚ç›¸è¼ƒæ–¼ç¢Žç‰‡æ ¸å¿ƒèƒ½å„²å­˜æ›´å¤šçš„è³‡æºã€‚第二代核心。 +block.core-foundation.details = 第二代核心。 +block.core-nucleus.description = 基地的中樞。è£ç”²éžå¸¸åŽšé‡ã€‚å¯ä»¥å„²å­˜æ¥µç‚ºçš„大é‡è³‡æºã€‚ +block.core-nucleus.details = 第三,也是最後一代核心。 +block.vault.description = 儲存大é‡çš„æ¯ä¸€ç¨®ç‰©å“。當物å“éœ€æ±‚éžæ†å®šæ™‚,使用它來創建緩è¡ã€‚使用[lightgray]è£å¸å™¨[]以從儲存庫æå–物å“。 +block.container.description = 儲存少é‡çš„æ¯ä¸€ç¨®ç‰©å“。當物å“éœ€æ±‚éžæ†å®šæ™‚,使用它來創建緩è¡ã€‚使用[lightgray]è£å¸å™¨[]以從容器æå–物å“。 +block.unloader.description = 將物å“從容器ã€å€‰åº«æˆ–核心å¸è¼‰åˆ°å‚³è¼¸å¸¶ä¸Šæˆ–直接å¸è²¨åˆ°ç›¸é„°çš„æ–¹å¡Šä¸­ã€‚é€éŽé»žæ“Šå¸è²¨å™¨ä¾†æ›´æ”¹è¦å¸è²¨çš„物å“類型。 block.launch-pad.description = 無需發射核心å³å¯ç›´æŽ¥ç™¼å°„物å“。 -block.launch-pad-large.description = 發射å°çš„進階版。å¯å­˜å„²æ›´å¤šç‰©å“。更快的發射速度。 block.duo.description = 一種å°è€Œä¾¿å®œçš„砲塔。 -block.scatter.description = ä¸å¯æˆ–ç¼ºçš„ä¸­åž‹é˜²ç©ºç ²å¡”ã€‚å‘æ•µæ–¹å–®ä½å™´å°„鉛塊ã€å»¢æ–™æˆ–是鋼化玻璃碎片。 +block.scatter.description = ä¸å¯æˆ–ç¼ºçš„ä¸­åž‹é˜²ç©ºç ²å¡”ã€‚å‘æ•µæ–¹å–®ä½å™´å°„鉛塊ã€å»¢æ–™æˆ–是鋼化玻璃彈片。 block.scorch.description = 燃燒所有é è¿‘å®ƒçš„åœ°é¢æ•µäººã€‚在近è·é›¢éžå¸¸æœ‰æ•ˆã€‚ block.hail.description = 一種å°åž‹çš„é•·è·é›¢è¿«æ“Šç ²ã€‚ block.wave.description = 一種å¯ä»¥å‘æ•µäººå™´ç‘æ¶²é«”æŸçš„中型砲塔。æä¾›æ°´æ™‚å¯ä»¥è‡ªå‹•æ»…ç«ã€‚ @@ -1300,6 +1477,208 @@ block.fuse.description = 一種近è·çš„大型能é‡ç ²å¡”ã€‚å‘æ•µäººç™¼å°„三 block.ripple.description = æ¥µç‚ºå¼·å¤§çš„è¿«æ“Šç‚®å¡”ã€‚ä¸€æ¬¡å‘æ•µäººç™¼å°„數發å­å½ˆã€‚ block.cyclone.description = 一種å°ç©ºå’Œå°åœ°çš„大型砲塔。å‘附近單ä½ç™¼å°„爆裂性的碎塊。 block.spectre.description = 一種雙炮管的巨型砲塔。å‘空中åŠåœ°é¢æ•µäººç™¼å°„大型的穿甲彈。 -block.meltdown.description = 一種巨型激光砲塔。充能並發射æŒçºŒæ€§çš„æ¿€å…‰å…‰æŸã€‚需è¦å†·å»æ¶²ä»¥é‹ä½œã€‚ +block.meltdown.description = 一種巨型雷射砲塔。充電並發射æŒçºŒæ€§çš„é›·å°„å…‰æŸã€‚需è¦å†·å»æ¶²ä»¥é‹ä½œã€‚ +block.foreshadow.description = åœ¨é æ–¹ç‹™æ“Šå–®ä¸€ç›®æ¨™ã€‚優先攻擊總血é‡è¼ƒé«˜çš„å–®ä½ã€‚ block.repair-point.description = æŒçºŒæ²»ç™‚é™„è¿‘æœ€è¿‘çš„å—æå–®ä½ã€‚ -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = 傷害並摧毀來襲的砲彈。無法將雷射武器的光æŸä½œç‚ºç›®æ¨™ã€‚ +block.parallax.description = 發射牽引光æŸï¼Œç‰½å¼•空中目標,並在此éŽç¨‹ä¸­æå£žå®ƒå€‘。 +block.tsunami.description = 呿•µäººç™¼å°„強大的液體。如果æä¾›æ°´æœƒè‡ªå‹•æ»…ç«ã€‚ +block.silicon-crucible.description = 使用ç«ç„°å½ˆä½œç‚ºé™„加熱æºï¼Œå¾žæ²™å­å’Œç…¤ç‚­ä¸­æç…‰çŸ½ã€‚åœ¨é«˜æº«åœ°å€æ•ˆçŽ‡æ›´é«˜ã€‚ +block.disassembler.description = 以低效率將熔渣分離æˆå°‘é‡çš„礦物æˆåˆ†ã€‚å¯ç”Ÿç”¢é‡·ã€‚ +block.overdrive-dome.description = 用相織布和矽增加附近建築物的速度。 +block.payload-conveyor.description = ç§»å‹•å¤§åž‹ç‰©é«”ï¼Œåƒæ˜¯å¾žå·¥å» å‡ºä¾†çš„æ©Ÿç”²ã€‚ +block.payload-router.description = 把大型物體分é…到三個方å‘。 +block.command-center.description = 用幾個ä¸åŒçš„æŒ‡ä»¤æŽ§åˆ¶æ©Ÿç”²çš„行為。 +block.ground-factory.description = 生產陸行機甲,造好的機甲å¯ä»¥ç›´æŽ¥ä½¿ç”¨æˆ–者是é€é€²é‡å¡‘機å‡ç´šã€‚ +block.air-factory.description = 生產空中機甲,造好的機甲å¯ä»¥ç›´æŽ¥ä½¿ç”¨æˆ–者是é€é€²é‡å¡‘機å‡ç´šã€‚ +block.naval-factory.description = 生產海上機甲,造好的機甲å¯ä»¥ç›´æŽ¥ä½¿ç”¨æˆ–者是é€é€²é‡å¡‘機å‡ç´šã€‚ +block.additive-reconstructor.description = 把é€é€²ä¾†çš„æ©Ÿç”²å‡åˆ°ç¬¬äºŒç´šã€‚ +block.multiplicative-reconstructor.description = 把é€é€²ä¾†çš„æ©Ÿç”²å‡åˆ°ç¬¬ä¸‰ç´šã€‚ +block.exponential-reconstructor.description = 把é€é€²ä¾†çš„æ©Ÿç”²å‡åˆ°ç¬¬å››ç´šã€‚ +block.tetrative-reconstructor.description = 把é€é€²ä¾†çš„æ©Ÿç”²å‡åˆ°ç¬¬äº”級。 +block.switch.description = 一個能開關的按鈕。狀態能由處ç†å™¨è®€å–和控制。 +block.micro-processor.description = å覆執行所有的é‚輯指令。能控制機甲和建築。 +block.logic-processor.description = å覆執行所有的é‚輯指令。能控制機甲和建築。速度較微處ç†å™¨å¿«ã€‚ +block.hyper-processor.description = å覆執行所有的é‚輯指令。能控制機甲和建築。速度較é‚輯處ç†å™¨å¿«ã€‚ +block.memory-cell.description = 為é‚輯處ç†å™¨å„²å­˜è³‡æ–™ã€‚ +block.memory-bank.description = 為é‚輯處ç†å™¨å„²å­˜è³‡æ–™ã€‚大容é‡ã€‚ +block.logic-display.description = 顯示由處ç†å™¨è¼¸å‡ºçš„ä»»æ„圖åƒã€‚ +block.large-logic-display.description = 顯示由處ç†å™¨è¼¸å‡ºçš„ä»»æ„圖åƒã€‚ +block.interplanetary-accelerator.description = 巨大的電ç£ç ²å¡”。將核心加速至脫離速度以在其他星çƒéƒ¨ç½²ã€‚ + +unit.dagger.description = 發射普通å­å½ˆæ”»æ“Šæ‰€æœ‰é™„近敵人。 +unit.mace.description = 噴發烈焰攻擊所有附近敵人。 +unit.fortress.description = 發射é ç¨‹è¿«ç ²æ”»æ“Šåœ°é¢ç›®æ¨™ã€‚ +unit.scepter.description = 發射大é‡çºŒèƒ½å­å½ˆæ‰“擊所有附近敵人。 +unit.reign.description = 發射大é‡ç©¿é€åž‹å­å½ˆæ‰“擊所有附近敵人。 +unit.nova.description = 發射雷射æ§å°æ•µäººé€ æˆå‚·å®³å’Œå›žå¾©å‹æ–¹å»ºç¯‰ã€‚具飛行能力。 +unit.pulsar.description = ç™¼å°„é›»å¼§å°æ•µäººé€ æˆå‚·å®³å’Œå›žå¾©å‹æ–¹å»ºç¯‰ã€‚具飛行能力。 +unit.quasar.description = 發射能穿é€çš„é›·å°„å…‰æŸå°æ•µäººé€ æˆå‚·å®³å’Œå›žå¾©å‹æ–¹å»ºç¯‰ã€‚具飛行能力。 具備護盾。 +unit.vela.description = 發射æŒçºŒæ•¸ç§’的強大雷射光æŸï¼Œèƒ½è‡³ç‡ƒæ•µæ–¹å»ºç¯‰å’Œå›žå¾©å‹æ–¹å»ºç¯‰ã€‚具飛行能力。 +unit.corvus.description = 發射è·é›¢æ¥µé çš„強大æ¢å¾©å…‰æŸï¼Œåœ¨ä¸€çž¬é–“摧毀敵方建築ã€å–®ä½æˆ–å›žå¾©å‹æ–¹å»ºç¯‰ã€‚能越éŽå¤§éƒ¨åˆ†åœ°å½¢é™åˆ¶ã€‚ +unit.crawler.description = è·‘å‘æ•µäººä¸¦è‡ªçˆ†ï¼Œé€ æˆå¤§ç¯„åœå‚·å®³çš„自殺機甲。 +unit.atrax.description = å°åœ°é¢ç›®æ¨™å™´å‡ºå¼±åŒ–敵人的熔渣。能越éŽå¤§éƒ¨åˆ†åœ°å½¢é™åˆ¶ã€‚ +unit.spiroct.description = å°æ•µäººç™¼å°„å¸è¡€å…‰æŸã€‚能越éŽå¤§éƒ¨åˆ†åœ°å½¢é™åˆ¶ã€‚ +unit.arkyid.description = å°æ•µäººç™¼å°„大é‡å¸è¡€å…‰æŸã€‚能越éŽå¤§éƒ¨åˆ†åœ°å½¢é™åˆ¶ã€‚ +unit.toxopid.description = 發射大型電爆彈和穿é€åž‹é›·å°„。能越éŽå¤§éƒ¨åˆ†åœ°å½¢é™åˆ¶çš„大型爬行機甲。 +unit.flare.description = 以普通å­å½ˆæ”»æ“Šæ•µäººçš„高速戰鬥機。 +unit.horizon.description = 投放多枚炸彈轟炸地é¢ç›®æ¨™ã€‚ +unit.zenith.description = 以飛彈攻擊附近敵人的戰機。 +unit.antumbra.description = å°æ•µäººç™¼å°„大é‡ç«ç ²çš„飛行戰艦。 +unit.eclipse.description = 具兩門穿é€åž‹é›·å°„砲和大é‡å½ˆå¹•的超級戰艦。 +unit.mono.description = 自動採集銅和鉛存入核心。 +unit.poly.description = 自動é‡å»ºè¢«æ‘§æ¯€çš„建築和å”助其他單ä½å»ºé€ ã€‚ +unit.mega.description = è‡ªå‹•å›žå¾©å—æçš„å»ºç¯‰ã€‚èƒ½æ‹¾èµ·æ–¹å¡Šå’Œå°åž‹åœ°é¢æ©Ÿç”²ã€‚ +unit.quad.description = 以大型炸彈轟炸地é¢ç›®æ¨™ï¼Œèƒ½å›žå¾©å‹æ–¹å»ºç¯‰ä¸¦å‚·å®³æ•µäººã€‚èƒ½æ‹¾èµ·ä¸­åž‹åœ°é¢æ©Ÿç”²ã€‚ +unit.oct.description = å…·ä¿è­·å’Œå›žå¾©é™„è¿‘å‹è»çš„è­·ç›¾ã€‚èƒ½æ‹¾èµ·çµ•å¤§éƒ¨åˆ†åœ°é¢æ©Ÿç”²ã€‚ +unit.risso.description = å°é™„近所有敵人發射大é‡é£›å½ˆå’Œå­å½ˆçš„迷你砲艇。 +unit.minke.description = å°é™„近陸上敵人發射大砲和普通å­å½ˆçš„å°åž‹è¿«ç ²è‰‡ã€‚ +unit.bryde.description = å°æ•µäººç™¼å°„é ç¨‹é«˜å°„砲彈以åŠé£›å½ˆçš„å·¡é‚艇。 +unit.sei.description = å°æ•µäººç™¼å°„大é‡é£›å½ˆå’Œç©¿ç”²å½ˆã€‚ +unit.omura.description = å°æ•µäººç™¼å°„é ç¨‹ç©¿é€åž‹ç ²å½ˆã€‚建造曳光戰機。 +unit.alpha.description = 抵禦敵è»å°æ ¸å¿ƒï¼šç¢Žç‰‡çš„æ”»æ“Šã€‚建造建築物。 +unit.beta.description = 抵禦敵è»å°æ ¸å¿ƒï¼šåŸºåœ°çš„æ”»æ“Šã€‚建造建築物。 +unit.gamma.description = 抵禦敵è»å°æ ¸å¿ƒï¼šæ ¸å­çš„æ”»æ“Šã€‚建造建築物。 + +lst.read = [accent]讀å–[]記憶體中的一項數值 +lst.write = [accent]寫入[]一項數值到記憶體中 +lst.print = 將文字加入輸出的暫存中,æ­é…[accent]Print Flush[]使用 +lst.draw = 將圖形加入顯示的暫存中,æ­é…[accent]Draw Flush[]使用 +lst.drawflush = 將所有暫存的[accent]Draw[]指令推到顯示器上 +lst.printflush = 將所有暫存的[accent]Print[]æŒ‡ä»¤æŽ¨åˆ°è¨Šæ¯æ¿ä¸Š +lst.getlink = 由連接順åºå›žå‚³é€£æŽ¥çš„建築,第一個從"0"é–‹å§‹ +lst.control = 控制一個建築 +lst.radar = 嵿¸¬å»ºç¯‰ç¯„åœå…§çš„å–®ä½ +lst.sensor = ç²å–該建築或單ä½çš„æ•¸æ“š +lst.set = 設一個變數 +lst.operation = 加減乘除和計算機概論 +lst.end = 跳到第一個é‡é ­é–‹å§‹åŸ·è¡Œ +lst.jump = æ¢ä»¶å¼è·³åˆ°å…¶ä»–指令執行 +lst.unitbind = ç¶å®šä¸‹ä¸€åŒç¨®å–®ä½ï¼Œå­˜å…¥[accent]@unit[]中. +lst.unitcontrol = 控制ç¾åœ¨ç¶å®šçš„å–®ä½ +lst.unitradar = 嵿¸¬ç¶å®šå–®ä½é™„è¿‘çš„å–®ä½ +lst.unitlocate = 尋找整個地圖上特定的ä½ç½®/建築\n需è¦ç¶å®šçš„å–®ä½ + +logic.nounitbuild = [red]å–®ä½å»ºé€ é‚è¼¯å·²è¢«ç¦æ­¢ã€‚ + +lenum.type = 建築/å–®ä½ç¨®é¡žã€‚\nä¾‹ï¼šæ“æŽ§å–®ä½å»ºé€ å…‰çŸ›ç ²æ‡‰ä½¿ç”¨[accent]@lancer[],而éžå­—串 +lenum.shoot = å°è©²ä½ç½®é–‹ç« +lenum.shootp = å°æŒ‡å®šå–®ä½/建築開ç«ï¼Œå…·è‡ªçž„功能 +lenum.configure = 建築設定,如分類器ã€å…µå™¨å·¥å»  +lenum.enabled = 確èªè©²å»ºç¯‰æ˜¯å¦å•Ÿç”¨ + +laacess.color = 設定照明燈的é¡è‰² +laccess.controller = å–®ä½çš„æŽ§åˆ¶è€…。å—處ç†å™¨æŽ§åˆ¶æ™‚回傳處ç†å™¨ã€‚\n在隊形中回傳領導的單ä½ã€‚\nå¦å‰‡å›žå‚³å–®ä½è‡ªå·±ã€‚ +laccess.dead = 單使ˆ–建築是å¦å·²æ­»äº¡æˆ–ä¸å­˜åœ¨ã€‚ +laccess.controlled = 將回傳:\n處ç†å™¨æŽ§åˆ¶ï¼š[accent]@ctrlProcessor[]\n玩家控制:[accent]@ctrlPlayer[]\n在隊形中:[accent]@ctrlFormation[]\n其他:[accent]0[]。 +laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. + +graphicstype.clear = é‡è£½ç‰ˆé¢ç‚ºæŒ‡å®šé¡è‰² +graphicstype.color = 為後續所有圖畫指令設定é¡è‰² +graphicstype.stroke = 為後續所有圖畫指令設定直線寬度 +graphicstype.line = 畫一直線 +graphicstype.rect = 畫實心長方形 +graphicstype.linerect = 畫空心長方形 +graphicstype.poly = 畫實心正多邊形 +graphicstype.linepoly = 畫空心正多邊形 +graphicstype.triangle = 畫實心三角形 +graphicstype.image = 繪製內建圖畫\n如: [accent]@router[]或[accent]@dagger[]. + +lenum.always = æ°¸é  true (直接跳). +lenum.idiv = 整數除法,無æ¢ä»¶æ¨åŽ». +lenum.div = 除法.\n除以零時回傳 [accent]null[] +lenum.mod = Modulo,求餘數 +lenum.equal = 是å¦ç›¸ç­‰ï¼Œä¸ç®¡è³‡æ–™åž‹æ…‹ã€‚\néžnull 物件和數值相比時回傳1 +lenum.notequal = ä¸ç›¸ç­‰ï¼Œä¸ç®¡è³‡æ–™åž‹æ…‹. +lenum.strictequal = 嚴格檢查是å¦ç›¸ç­‰ï¼Œæœƒçœ‹è³‡æ–™åž‹æ…‹ã€‚\nå¯ç”¨ä¾†æª¢æŸ¥[accent]null[] +lenum.shl = Bit-shift left. +lenum.shr = Bit-shift right. +lenum.or = Bitwise OR. +lenum.land = Logical AND. +lenum.and = Bitwise AND. +lenum.not = Bitwise flip. +lenum.xor = Bitwise XOR. + +lenum.min = 兩數å–å° +lenum.max = 兩數å–大 +lenum.angle = å‘é‡èˆ‡x軸夾角 +lenum.len = å‘é‡é•·åº¦ +lenum.sin = 度數Sin值 +lenum.cos = 度數Cos值 +lenum.tan = 度數Tan值 +#not a typo, look up 'range notation' +lenum.rand = 產生隨機數值: [0, 值). +lenum.log = è‡ªç„¶å°æ•¸(lnã€log_e). +lenum.log10 = 高中數學. +lenum.noise = 2D simplex noise. +lenum.abs = å–絕å°å€¼ +lenum.sqrt = 開根號 + +lenum.any = ä»»ä½•å–®ä½ +lenum.ally = 勿–¹å–®ä½ +lenum.attacker = å…·æ­¦å™¨çš„å–®ä½ +lenum.enemy = æ•µæ–¹å–®ä½ +lenum.boss = é ­ç›®å–®ä½ +lenum.flying = é£›è¡Œå–®ä½ +lenum.ground = é™¸ä¸Šå–®ä½ +lenum.player = çŽ©å®¶å–®ä½ + +lenum.ore = 尋找礦物 +lenum.damaged = å°‹æ‰¾å—æå‹æ–¹å»ºç¯‰ +lenum.spawn = 敵方é‡ç”Ÿé»ž\nå¯ä»¥æ˜¯æ ¸å¿ƒæˆ–一個ä½ç½® +lenum.building = 尋找特定建築 + +lenum.core = 任何核心 +lenum.storage = 儲è—建築 +lenum.generator = 會發電的建築 +lenum.factory = 生產加工資æºçš„建築,如煉矽場 +lenum.repair = 維修點 +lenum.rally = 指æ®ä¸­å¿ƒ +lenum.battery = 電池 +lenum.resupply = 補給點\nåªæœ‰åœ¨[accent]"å–®ä½éœ€è¦å½ˆè—¥"[]è¢«å•Ÿç”¨æ™‚æ‰æœ‰æ•ˆæžœ +lenum.reactor = è¡æ“Š/釷忇‰çˆ +lenum.turret = 任何砲塔 + +sensor.in = 想查閱的建築/å–®ä½ + +radar.from = 作為雷é”的建築\n嵿¸¬ç¯„åœåŒè©²å»ºç¯‰çš„ç¯„åœ +radar.target = æœç´¢æ¢ä»¶ +radar.and = é¡å¤–æ¢ä»¶ +radar.order = 輸出順åºï¼Œ1:è·é›¢æœ€è¿‘ã€è¡€é‡æœ€å¤§ +radar.sort = ç¯©é¸æ–¹å¼ +radar.output = 回傳該單ä½ç‚ºè®Šæ•¸ + +unitradar.target = æœç´¢æ¢ä»¶ +unitradar.and = é¡å¤–æ¢ä»¶ +unitradar.order = 輸出順åºï¼Œ1:è·é›¢æœ€è¿‘ã€è¡€é‡æœ€å¤§ +unitradar.sort = ç¯©é¸æ–¹å¼ +unitradar.output = 存該單ä½çš„變數 + +control.of = è¦æŽ§åˆ¶çš„å»ºç¯‰ +control.unit = 指定的建築/å–®ä½ +control.shoot = 是å¦é–‹ç« + +unitlocate.enemy = æœç´¢æ•µæ–¹æˆ–勿–¹å»ºç¯‰ +unitlocate.found = å›žå‚³æ˜¯å¦æ‰¾åˆ°å»ºç¯‰ +unitlocate.building = 回傳找到的建築為變數 +unitlocate.outx = 回傳 X 座標 +unitlocate.outy = 回傳 Y 座標 +unitlocate.group = æœç´¢å»ºç¯‰ç¨®é¡ž + +lenum.idle = é è¨­AI +lenum.stop = åœæ­¢ç§»å‹•/挖礦/建造 +lenum.move = 移動到指定ä½ç½® +lenum.approach = 移動到è·é›¢æŒ‡å®šä½ç½®ä¸€æ®µè·é›¢çš„地方 +lenum.pathfind = 由內建AIå‰å¾€æ•µæ–¹é‡ç”Ÿé»ž +lenum.target = 射擊指定å€åŸŸ +lenum.targetp = 帶自瞄射擊指定的目標 +lenum.itemdrop = æ”¾ä¸‹ç‰©å“ +lenum.itemtake = 從建築拿å–ç‰©å“ +lenum.paydrop = 放下拾å–的負載 +lenum.paytake = 拾å–船身下方的單ä½/建築 +lenum.flag = å–®ä½ç·¨è™Ÿ(å¯ç•°) +lenum.mine = 挖指定ä½ç½®çš„礦物 +lenum.build = 建造一個建築 +lenum.getblock = ç²å–指定ä½ç½®çš„建築種類和該建築\n必須在單ä½çš„範åœå…§\n實體障礙物,如高山會回傳[accent]@solid[] +lenum.within = 單使˜¯å¦åœ¨æŒ‡å®šç¯„åœå…§ +lenum.boost = 使用推進器 diff --git a/core/assets/contributors b/core/assets/contributors index 69de5a3d8e..4d11b2f5cb 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -7,7 +7,7 @@ Baltazár Radics Dexapnow Milinai 키ì—르 -Luxray5474 +skybldev Leone25 Gureumi VizardAlpha @@ -84,6 +84,7 @@ amrsoll ã­ã‚‰ã²ã‹ã  Draco Quezler +killall -q Alicila Daniel Dusek DeltaNedas @@ -93,5 +94,33 @@ sk7725 The Slaylord ThePlayerA YellOw139 +NgLamVN +JINODK PetrGasparik LeoDog896 +Summet +MEEP of Faith +jalastram (freesound.org) +newlocknew (freesound.org) +dsmolenaers (freesound.org) +Headphaze (freesound.org) +Nikolass +VolasYouKnow +Quick-Korx +Ãngel Rodríguez Aguilera +Catchears +younggam +simba-fs +RedRadiation +Marko Zajc +CPX MC +Phinner +BTA_Susideur +nilq +AsgerHB +AzCraft +foo +Skat +WilloIzCitron +SAMBUYYA +genNAowl diff --git a/core/assets/fonts/font.woff b/core/assets/fonts/font.woff index 4d8ed4b9f7..c031c478de 100644 Binary files a/core/assets/fonts/font.woff and b/core/assets/fonts/font.woff differ diff --git a/core/assets/fonts/icon.ttf b/core/assets/fonts/icon.ttf index 4b61658e65..badd3e3b66 100644 Binary files a/core/assets/fonts/icon.ttf and b/core/assets/fonts/icon.ttf differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index b07514ea1b..552da17570 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -1,315 +1,353 @@ -63743=spawn|block-spawn-medium -63742=deepwater|block-deepwater-medium -63741=water|block-water-medium -63740=tainted-water|block-tainted-water-medium -63739=darksand-tainted-water|block-darksand-tainted-water-medium -63738=sand-water|block-sand-water-medium -63737=darksand-water|block-darksand-water-medium -63736=tar|block-tar-medium -63735=stone|block-stone-medium -63734=craters|block-craters-medium -63733=char|block-char-medium -63732=ignarock|block-ignarock-medium -63731=hotrock|block-hotrock-medium -63730=magmarock|block-magmarock-medium -63729=sand|block-sand-medium -63728=darksand|block-darksand-medium -63727=holostone|block-holostone-medium -63726=grass|block-grass-medium -63725=salt|block-salt-medium -63724=snow|block-snow-medium -63723=ice|block-ice-medium -63722=ice-snow|block-ice-snow-medium -63721=cliffs|block-cliffs-medium -63718=rock|block-rock-medium -63717=snowrock|block-snowrock-medium -63711=spore-pine|block-spore-pine-medium -63710=snow-pine|block-snow-pine-medium -63709=pine|block-pine-medium -63708=shrubs|block-shrubs-medium -63707=white-tree-dead|block-white-tree-dead-medium -63706=white-tree|block-white-tree-medium -63705=spore-cluster|block-spore-cluster-medium -63704=shale|block-shale-medium -63702=shale-boulder|block-shale-boulder-medium -63701=sand-boulder|block-sand-boulder-medium -63700=moss|block-moss-medium -63699=spore-moss|block-spore-moss-medium -63698=metal-floor|block-metal-floor-medium -63697=metal-floor-damaged|block-metal-floor-damaged-medium -63696=metal-floor-2|block-metal-floor-2-medium -63695=metal-floor-3|block-metal-floor-3-medium -63694=metal-floor-5|block-metal-floor-5-medium -63693=dark-panel-1|block-dark-panel-1-medium -63692=dark-panel-2|block-dark-panel-2-medium -63691=dark-panel-3|block-dark-panel-3-medium -63690=dark-panel-4|block-dark-panel-4-medium -63689=dark-panel-5|block-dark-panel-5-medium -63688=dark-panel-6|block-dark-panel-6-medium -63687=dark-metal|block-dark-metal-medium -63686=pebbles|block-pebbles-medium -63685=tendrils|block-tendrils-medium -63684=ore-copper|block-ore-copper-medium -63683=ore-lead|block-ore-lead-medium -63682=ore-scrap|block-ore-scrap-medium -63681=ore-coal|block-ore-coal-medium -63680=ore-titanium|block-ore-titanium-medium -63679=ore-thorium|block-ore-thorium-medium -63678=graphite-press|block-graphite-press-medium -63677=multi-press|block-multi-press-medium -63676=silicon-smelter|block-silicon-smelter-medium -63675=kiln|block-kiln-medium -63674=plastanium-compressor|block-plastanium-compressor-medium -63673=phase-weaver|block-phase-weaver-medium -63672=alloy-smelter|block-alloy-smelter-medium -63671=cryofluid-mixer|block-cryofluid-mixer-medium -63670=blast-mixer|block-blast-mixer-medium -63669=pyratite-mixer|block-pyratite-mixer-medium -63668=melter|block-melter-medium -63667=separator|block-separator-medium -63666=spore-press|block-spore-press-medium -63665=pulverizer|block-pulverizer-medium -63664=coal-centrifuge|block-coal-centrifuge-medium -63663=incinerator|block-incinerator-medium -63662=copper-wall|block-copper-wall-medium -63661=copper-wall-large|block-copper-wall-large-medium -63660=titanium-wall|block-titanium-wall-medium -63659=titanium-wall-large|block-titanium-wall-large-medium -63658=plastanium-wall|block-plastanium-wall-medium -63657=plastanium-wall-large|block-plastanium-wall-large-medium -63656=thorium-wall|block-thorium-wall-medium -63655=thorium-wall-large|block-thorium-wall-large-medium -63654=phase-wall|block-phase-wall-medium -63653=phase-wall-large|block-phase-wall-large-medium -63652=surge-wall|block-surge-wall-medium -63651=surge-wall-large|block-surge-wall-large-medium -63650=door|block-door-medium -63649=door-large|block-door-large-medium -63648=scrap-wall|block-scrap-wall-medium -63647=scrap-wall-large|block-scrap-wall-large-medium -63646=scrap-wall-huge|block-scrap-wall-huge-medium -63645=scrap-wall-gigantic|block-scrap-wall-gigantic-medium -63644=thruster|block-thruster-medium -63643=mender|block-mender-medium -63642=mend-projector|block-mend-projector-medium -63641=overdrive-projector|block-overdrive-projector-medium -63640=force-projector|block-force-projector-medium -63639=shock-mine|block-shock-mine-medium -63638=conveyor|block-conveyor-medium -63637=titanium-conveyor|block-titanium-conveyor-medium -63636=armored-conveyor|block-armored-conveyor-medium -63635=junction|block-junction-medium -63634=bridge-conveyor|block-bridge-conveyor-medium -63633=phase-conveyor|block-phase-conveyor-medium -63632=sorter|block-sorter-medium -63631=inverted-sorter|block-inverted-sorter-medium -63630=router|block-router-medium -63629=distributor|block-distributor-medium -63628=overflow-gate|block-overflow-gate-medium -63627=mass-driver|block-mass-driver-medium -63626=mechanical-pump|block-mechanical-pump-medium -63625=rotary-pump|block-rotary-pump-medium -63624=thermal-pump|block-thermal-pump-medium -63623=conduit|block-conduit-medium -63622=pulse-conduit|block-pulse-conduit-medium -63621=plated-conduit|block-plated-conduit-medium -63620=liquid-router|block-liquid-router-medium -63619=liquid-tank|block-liquid-tank-medium -63618=liquid-junction|block-liquid-junction-medium -63617=bridge-conduit|block-bridge-conduit-medium -63616=phase-conduit|block-phase-conduit-medium -63615=power-node|block-power-node-medium -63614=power-node-large|block-power-node-large-medium -63613=surge-tower|block-surge-tower-medium -63612=diode|block-diode-medium -63611=battery|block-battery-medium -63610=battery-large|block-battery-large-medium -63609=combustion-generator|block-combustion-generator-medium -63608=thermal-generator|block-thermal-generator-medium -63607=steam-generator|block-steam-generator-medium -63606=differential-generator|block-differential-generator-medium -63605=rtg-generator|block-rtg-generator-medium -63604=solar-panel|block-solar-panel-medium -63603=solar-panel-large|block-solar-panel-large-medium -63602=thorium-reactor|block-thorium-reactor-medium -63601=impact-reactor|block-impact-reactor-medium -63600=mechanical-drill|block-mechanical-drill-medium -63599=pneumatic-drill|block-pneumatic-drill-medium -63598=laser-drill|block-laser-drill-medium -63597=blast-drill|block-blast-drill-medium -63596=water-extractor|block-water-extractor-medium -63595=cultivator|block-cultivator-medium -63594=oil-extractor|block-oil-extractor-medium -63593=core-shard|block-core-shard-medium -63592=core-foundation|block-core-foundation-medium -63591=core-nucleus|block-core-nucleus-medium -63590=vault|block-vault-medium -63589=container|block-container-medium -63588=unloader|block-unloader-medium -63587=launch-pad|block-launch-pad-medium -63586=launch-pad-large|block-launch-pad-large-medium -63585=duo|block-duo-medium -63584=scatter|block-scatter-medium -63583=scorch|block-scorch-medium -63582=hail|block-hail-medium -63581=wave|block-wave-medium -63580=lancer|block-lancer-medium -63579=arc|block-arc-medium -63578=swarmer|block-swarmer-medium -63577=salvo|block-salvo-medium -63576=fuse|block-fuse-medium -63575=ripple|block-ripple-medium -63574=cyclone|block-cyclone-medium -63573=spectre|block-spectre-medium -63572=meltdown|block-meltdown-medium -63571=draug-factory|block-draug-factory-medium -63570=spirit-factory|block-spirit-factory-medium -63569=phantom-factory|block-phantom-factory-medium -63568=command-center|block-command-center-medium -63567=wraith-factory|block-wraith-factory-medium -63566=ghoul-factory|block-ghoul-factory-medium -63565=revenant-factory|block-revenant-factory-medium -63564=dagger-factory|block-dagger-factory-medium -63563=crawler-factory|block-crawler-factory-medium -63562=titan-factory|block-titan-factory-medium -63561=fortress-factory|block-fortress-factory-medium -63560=repair-point|block-repair-point-medium -63559=dart-mech-pad|block-dart-mech-pad-medium -63558=delta-mech-pad|block-delta-mech-pad-medium -63557=tau-mech-pad|block-tau-mech-pad-medium -63556=omega-mech-pad|block-omega-mech-pad-medium -63555=javelin-ship-pad|block-javelin-ship-pad-medium -63554=trident-ship-pad|block-trident-ship-pad-medium -63553=glaive-ship-pad|block-glaive-ship-pad-medium -63552=power-source|block-power-source-medium -63551=power-void|block-power-void-medium -63550=item-source|block-item-source-medium -63549=item-void|block-item-void-medium -63548=liquid-source|block-liquid-source-medium -63547=liquid-void|block-liquid-void-medium -63546=message|block-message-medium -63545=illuminator|block-illuminator-medium -63544=copper|item-copper-icon -63543=lead|item-lead-icon -63542=metaglass|item-metaglass-icon -63541=graphite|item-graphite-icon -63540=sand|item-sand-icon -63539=coal|item-coal-icon -63538=titanium|item-titanium-icon -63537=thorium|item-thorium-icon -63536=scrap|item-scrap-icon -63535=silicon|item-silicon-icon -63534=plastanium|item-plastanium-icon -63533=phase-fabric|item-phase-fabric-icon -63532=surge-alloy|item-surge-alloy-icon -63531=spore-pod|item-spore-pod-icon -63530=blast-compound|item-blast-compound-icon -63529=pyratite|item-pyratite-icon -63528=water|liquid-water-icon -63527=slag|liquid-slag-icon -63526=oil|liquid-oil-icon -63525=cryofluid|liquid-cryofluid-icon -63524=underflow-gate|block-underflow-gate-medium -63523=dart-ship-pad|block-dart-ship-pad-medium -63522=alpha-mech-pad|block-alpha-mech-pad-medium -63521=cliff|block-cliff-medium -63520=legacy-mech-pad|block-legacy-mech-pad-medium -63519=ground-factory|block-ground-factory-medium -63518=legacy-unit-factory|block-legacy-unit-factory-medium -63517=mass-conveyor|block-mass-conveyor-medium -63516=legacy-command-center|block-legacy-command-center-medium -63515=block-forge|block-block-forge-medium -63514=block-launcher|block-block-launcher-medium -63513=plastanium-conveyor|block-plastanium-conveyor-medium +63743=spawn|block-spawn-ui +63742=deepwater|block-deepwater-ui +63741=water|block-water-ui +63740=tainted-water|block-tainted-water-ui +63739=darksand-tainted-water|block-darksand-tainted-water-ui +63738=sand-water|block-sand-water-ui +63737=darksand-water|block-darksand-water-ui +63736=tar|block-tar-ui +63735=stone|block-stone-ui +63734=craters|block-craters-ui +63733=char|block-char-ui +63732=ignarock|block-ignarock-ui +63731=hotrock|block-hotrock-ui +63730=magmarock|block-magmarock-ui +63729=sand|block-sand-ui +63728=darksand|block-darksand-ui +63726=grass|block-grass-ui +63725=salt|block-salt-ui +63724=snow|block-snow-ui +63723=ice|block-ice-ui +63722=ice-snow|block-ice-snow-ui +63721=cliffs|block-cliffs-ui +63718=rock|block-rock-ui +63717=snowrock|block-snowrock-ui +63711=spore-pine|block-spore-pine-ui +63710=snow-pine|block-snow-pine-ui +63709=pine|block-pine-ui +63708=shrubs|block-shrubs-ui +63707=white-tree-dead|block-white-tree-dead-ui +63706=white-tree|block-white-tree-ui +63705=spore-cluster|block-spore-cluster-ui +63704=shale|block-shale-ui +63702=shale-boulder|block-shale-boulder-ui +63701=sand-boulder|block-sand-boulder-ui +63700=moss|block-moss-ui +63699=spore-moss|block-spore-moss-ui +63698=metal-floor|block-metal-floor-ui +63697=metal-floor-damaged|block-metal-floor-damaged-ui +63696=metal-floor-2|block-metal-floor-2-ui +63695=metal-floor-3|block-metal-floor-3-ui +63694=metal-floor-5|block-metal-floor-5-ui +63693=dark-panel-1|block-dark-panel-1-ui +63692=dark-panel-2|block-dark-panel-2-ui +63691=dark-panel-3|block-dark-panel-3-ui +63690=dark-panel-4|block-dark-panel-4-ui +63689=dark-panel-5|block-dark-panel-5-ui +63688=dark-panel-6|block-dark-panel-6-ui +63687=dark-metal|block-dark-metal-ui +63686=pebbles|block-pebbles-ui +63685=tendrils|block-tendrils-ui +63684=ore-copper|block-ore-copper-ui +63683=ore-lead|block-ore-lead-ui +63682=ore-scrap|block-ore-scrap-ui +63681=ore-coal|block-ore-coal-ui +63680=ore-titanium|block-ore-titanium-ui +63679=ore-thorium|block-ore-thorium-ui +63678=graphite-press|block-graphite-press-ui +63677=multi-press|block-multi-press-ui +63676=silicon-smelter|block-silicon-smelter-ui +63675=kiln|block-kiln-ui +63674=plastanium-compressor|block-plastanium-compressor-ui +63673=phase-weaver|block-phase-weaver-ui +63672=alloy-smelter|block-alloy-smelter-ui +63671=cryofluid-mixer|block-cryofluid-mixer-ui +63670=blast-mixer|block-blast-mixer-ui +63669=pyratite-mixer|block-pyratite-mixer-ui +63668=melter|block-melter-ui +63667=separator|block-separator-ui +63666=spore-press|block-spore-press-ui +63665=pulverizer|block-pulverizer-ui +63664=coal-centrifuge|block-coal-centrifuge-ui +63663=incinerator|block-incinerator-ui +63662=copper-wall|block-copper-wall-ui +63661=copper-wall-large|block-copper-wall-large-ui +63660=titanium-wall|block-titanium-wall-ui +63659=titanium-wall-large|block-titanium-wall-large-ui +63658=plastanium-wall|block-plastanium-wall-ui +63657=plastanium-wall-large|block-plastanium-wall-large-ui +63656=thorium-wall|block-thorium-wall-ui +63655=thorium-wall-large|block-thorium-wall-large-ui +63654=phase-wall|block-phase-wall-ui +63653=phase-wall-large|block-phase-wall-large-ui +63652=surge-wall|block-surge-wall-ui +63651=surge-wall-large|block-surge-wall-large-ui +63650=door|block-door-ui +63649=door-large|block-door-large-ui +63648=scrap-wall|block-scrap-wall-ui +63647=scrap-wall-large|block-scrap-wall-large-ui +63646=scrap-wall-huge|block-scrap-wall-huge-ui +63645=scrap-wall-gigantic|block-scrap-wall-gigantic-ui +63644=thruster|block-thruster-ui +63643=mender|block-mender-ui +63642=mend-projector|block-mend-projector-ui +63641=overdrive-projector|block-overdrive-projector-ui +63640=force-projector|block-force-projector-ui +63639=shock-mine|block-shock-mine-ui +63638=conveyor|block-conveyor-ui +63637=titanium-conveyor|block-titanium-conveyor-ui +63636=armored-conveyor|block-armored-conveyor-ui +63635=junction|block-junction-ui +63634=bridge-conveyor|block-bridge-conveyor-ui +63633=phase-conveyor|block-phase-conveyor-ui +63632=sorter|block-sorter-ui +63631=inverted-sorter|block-inverted-sorter-ui +63630=router|block-router-ui +63629=distributor|block-distributor-ui +63628=overflow-gate|block-overflow-gate-ui +63627=mass-driver|block-mass-driver-ui +63626=mechanical-pump|block-mechanical-pump-ui +63625=rotary-pump|block-rotary-pump-ui +63624=thermal-pump|block-thermal-pump-ui +63623=conduit|block-conduit-ui +63622=pulse-conduit|block-pulse-conduit-ui +63621=plated-conduit|block-plated-conduit-ui +63620=liquid-router|block-liquid-router-ui +63619=liquid-tank|block-liquid-tank-ui +63618=liquid-junction|block-liquid-junction-ui +63617=bridge-conduit|block-bridge-conduit-ui +63616=phase-conduit|block-phase-conduit-ui +63615=power-node|block-power-node-ui +63614=power-node-large|block-power-node-large-ui +63613=surge-tower|block-surge-tower-ui +63612=diode|block-diode-ui +63611=battery|block-battery-ui +63610=battery-large|block-battery-large-ui +63609=combustion-generator|block-combustion-generator-ui +63608=thermal-generator|block-thermal-generator-ui +63607=steam-generator|block-steam-generator-ui +63606=differential-generator|block-differential-generator-ui +63605=rtg-generator|block-rtg-generator-ui +63604=solar-panel|block-solar-panel-ui +63603=solar-panel-large|block-solar-panel-large-ui +63602=thorium-reactor|block-thorium-reactor-ui +63601=impact-reactor|block-impact-reactor-ui +63600=mechanical-drill|block-mechanical-drill-ui +63599=pneumatic-drill|block-pneumatic-drill-ui +63598=laser-drill|block-laser-drill-ui +63597=blast-drill|block-blast-drill-ui +63596=water-extractor|block-water-extractor-ui +63595=cultivator|block-cultivator-ui +63594=oil-extractor|block-oil-extractor-ui +63593=core-shard|block-core-shard-ui +63592=core-foundation|block-core-foundation-ui +63591=core-nucleus|block-core-nucleus-ui +63590=vault|block-vault-ui +63589=container|block-container-ui +63588=unloader|block-unloader-ui +63587=launch-pad|block-launch-pad-ui +63586=launch-pad-large|block-launch-pad-large-ui +63585=duo|block-duo-ui +63584=scatter|block-scatter-ui +63583=scorch|block-scorch-ui +63582=hail|block-hail-ui +63581=wave|block-wave-ui +63580=lancer|block-lancer-ui +63579=arc|block-arc-ui +63578=swarmer|block-swarmer-ui +63577=salvo|block-salvo-ui +63576=fuse|block-fuse-ui +63575=ripple|block-ripple-ui +63574=cyclone|block-cyclone-ui +63573=spectre|block-spectre-ui +63572=meltdown|block-meltdown-ui +63571=draug-factory|block-draug-factory-ui +63570=spirit-factory|block-spirit-factory-ui +63569=phantom-factory|block-phantom-factory-ui +63568=command-center|block-command-center-ui +63567=wraith-factory|block-wraith-factory-ui +63566=ghoul-factory|block-ghoul-factory-ui +63565=revenant-factory|block-revenant-factory-ui +63564=dagger-factory|block-dagger-factory-ui +63563=crawler-factory|block-crawler-factory-ui +63562=titan-factory|block-titan-factory-ui +63561=fortress-factory|block-fortress-factory-ui +63560=repair-point|block-repair-point-ui +63559=dart-mech-pad|block-dart-mech-pad-ui +63558=delta-mech-pad|block-delta-mech-pad-ui +63557=tau-mech-pad|block-tau-mech-pad-ui +63556=omega-mech-pad|block-omega-mech-pad-ui +63555=javelin-ship-pad|block-javelin-ship-pad-ui +63554=trident-ship-pad|block-trident-ship-pad-ui +63553=glaive-ship-pad|block-glaive-ship-pad-ui +63552=power-source|block-power-source-ui +63551=power-void|block-power-void-ui +63550=item-source|block-item-source-ui +63549=item-void|block-item-void-ui +63548=liquid-source|block-liquid-source-ui +63547=liquid-void|block-liquid-void-ui +63546=message|block-message-ui +63545=illuminator|block-illuminator-ui +63544=copper|item-copper-ui +63543=lead|item-lead-ui +63542=metaglass|item-metaglass-ui +63541=graphite|item-graphite-ui +63540=sand|item-sand-ui +63539=coal|item-coal-ui +63538=titanium|item-titanium-ui +63537=thorium|item-thorium-ui +63536=scrap|item-scrap-ui +63535=silicon|item-silicon-ui +63534=plastanium|item-plastanium-ui +63533=phase-fabric|item-phase-fabric-ui +63532=surge-alloy|item-surge-alloy-ui +63531=spore-pod|item-spore-pod-ui +63530=blast-compound|item-blast-compound-ui +63529=pyratite|item-pyratite-ui +63528=water|liquid-water-ui +63527=slag|liquid-slag-ui +63526=oil|liquid-oil-ui +63525=cryofluid|liquid-cryofluid-ui +63524=underflow-gate|block-underflow-gate-ui +63523=dart-ship-pad|block-dart-ship-pad-ui +63522=alpha-mech-pad|block-alpha-mech-pad-ui +63521=cliff|block-cliff-ui +63520=legacy-mech-pad|block-legacy-mech-pad-ui +63519=ground-factory|block-ground-factory-ui +63518=legacy-unit-factory|block-legacy-unit-factory-ui +63517=mass-conveyor|block-mass-conveyor-ui +63516=legacy-command-center|block-legacy-command-center-ui +63515=block-forge|block-block-forge-ui +63514=block-launcher|block-block-launcher-ui +63513=plastanium-conveyor|block-plastanium-conveyor-ui 63512=crater|crater -63511=naval-factory|block-naval-factory-medium -63510=air-factory|block-air-factory-medium -63509=basic-reconstructor|block-basic-reconstructor-medium -63508=block-loader|block-block-loader-medium -63507=block-unloader|block-block-unloader-medium -63506=core-silo|block-core-silo-medium -63505=data-processor|block-data-processor-medium -63504=payload-router|block-payload-router-medium -63503=silicon-crucible|block-silicon-crucible-medium -63502=segment|block-segment-medium -63501=large-overdrive-projector|block-large-overdrive-projector-medium -63500=disassembler|block-disassembler-medium -63499=advanced-reconstructor|block-advanced-reconstructor-medium -63498=reconstructor-basis|block-reconstructor-basis-medium -63497=reconstructor-morphism|block-reconstructor-morphism-medium -63496=reconstructor-functor|block-reconstructor-functor-medium -63495=reconstructor-prime|block-reconstructor-prime-medium -63494=additive-reconstructor|block-additive-reconstructor-medium -63493=multiplicative-reconstructor|block-multiplicative-reconstructor-medium -63492=exponential-reconstructor|block-exponential-reconstructor-medium -63491=tetrative-reconstructor|block-tetrative-reconstructor-medium -63490=resupply-point|block-resupply-point-medium -63489=parallax|block-parallax-medium -63488=dagger|unit-dagger-medium -63487=mace|unit-mace-medium -63486=fortress|unit-fortress-medium -63485=nova|unit-nova-medium -63484=pulsar|unit-pulsar-medium -63483=quasar|unit-quasar-medium -63482=crawler|unit-crawler-medium -63481=atrax|unit-atrax-medium -63480=spiroct|unit-spiroct-medium -63479=arkyid|unit-arkyid-medium -63478=flare|unit-flare-medium -63477=horizon|unit-horizon-medium -63476=zenith|unit-zenith-medium -63475=antumbra|unit-antumbra-medium -63474=eclipse|unit-eclipse-medium -63473=mono|unit-mono-medium -63472=poly|unit-poly-medium -63471=mega|unit-mega-medium -63470=risse|unit-risse-medium -63469=minke|unit-minke-medium -63468=bryde|unit-bryde-medium -63467=alpha|unit-alpha-medium -63466=beta|unit-beta-medium -63465=gamma|unit-gamma-medium -63464=block|unit-block-medium -63463=risso|unit-risso-medium -63462=overdrive-dome|block-overdrive-dome-medium -63461=logic-processor|block-logic-processor-medium -63460=micro-processor|block-micro-processor-medium -63459=logic-display|block-logic-display-medium -63458=switch|block-switch-medium -63457=memory-cell|block-memory-cell-medium -63456=payload-conveyor|block-payload-conveyor-medium -63455=hyper-processor|block-hyper-processor-medium -63454=toxopid|unit-toxopid-medium -63453=vestige|unit-vestige-medium -63452=cataclyst|unit-cataclyst-medium -63451=scepter|unit-scepter-medium -63450=reign|unit-reign-medium -63449=dirt|block-dirt-medium -63448=dirtwall|block-dirtwall-medium -63447=stone-wall|block-stone-wall-medium -63446=spore-wall|block-spore-wall-medium -63445=ice-wall|block-ice-wall-medium -63444=snow-wall|block-snow-wall-medium -63443=dune-wall|block-dune-wall-medium -63442=sand-wall|block-sand-wall-medium -63441=salt-wall|block-salt-wall-medium -63440=shale-wall|block-shale-wall-medium -63439=dirt-wall|block-dirt-wall-medium -63438=holostone-wall|block-holostone-wall-medium -63437=basalt|block-basalt-medium -63436=dacite|block-dacite-medium -63435=boulder|block-boulder-medium -63434=snow-boulder|block-snow-boulder-medium -63433=dacite-wall|block-dacite-wall-medium -63432=dacite-boulder|block-dacite-boulder-medium -63431=large-logic-display|block-large-logic-display-medium -63430=omura|unit-omura-medium -63429=mud|block-mud-medium -63428=sei|unit-sei-medium -63427=quad|unit-quad-medium -63426=oct|unit-oct-medium -63425=vela|unit-vela-medium -63424=corvus|unit-corvus-medium -63423=memory-bank|block-memory-bank-medium -63422=foreshadow|block-foreshadow-medium -63421=tsunami|block-tsunami-medium +63511=naval-factory|block-naval-factory-ui +63510=air-factory|block-air-factory-ui +63509=basic-reconstructor|block-basic-reconstructor-ui +63508=block-loader|block-block-loader-ui +63507=block-unloader|block-block-unloader-ui +63506=core-silo|block-core-silo-ui +63505=data-processor|block-data-processor-ui +63504=payload-router|block-payload-router-ui +63503=silicon-crucible|block-silicon-crucible-ui +63502=segment|block-segment-ui +63501=large-overdrive-projector|block-large-overdrive-projector-ui +63500=disassembler|block-disassembler-ui +63499=advanced-reconstructor|block-advanced-reconstructor-ui +63498=reconstructor-basis|block-reconstructor-basis-ui +63497=reconstructor-morphism|block-reconstructor-morphism-ui +63496=reconstructor-functor|block-reconstructor-functor-ui +63495=reconstructor-prime|block-reconstructor-prime-ui +63494=additive-reconstructor|block-additive-reconstructor-ui +63493=multiplicative-reconstructor|block-multiplicative-reconstructor-ui +63492=exponential-reconstructor|block-exponential-reconstructor-ui +63491=tetrative-reconstructor|block-tetrative-reconstructor-ui +63490=resupply-point|block-resupply-point-ui +63489=parallax|block-parallax-ui +63488=dagger|unit-dagger-ui +63487=mace|unit-mace-ui +63486=fortress|unit-fortress-ui +63485=nova|unit-nova-ui +63484=pulsar|unit-pulsar-ui +63483=quasar|unit-quasar-ui +63482=crawler|unit-crawler-ui +63481=atrax|unit-atrax-ui +63480=spiroct|unit-spiroct-ui +63479=arkyid|unit-arkyid-ui +63478=flare|unit-flare-ui +63477=horizon|unit-horizon-ui +63476=zenith|unit-zenith-ui +63475=antumbra|unit-antumbra-ui +63474=eclipse|unit-eclipse-ui +63473=mono|unit-mono-ui +63472=poly|unit-poly-ui +63471=mega|unit-mega-ui +63470=risse|unit-risse-ui +63469=minke|unit-minke-ui +63468=bryde|unit-bryde-ui +63467=alpha|unit-alpha-ui +63466=beta|unit-beta-ui +63465=gamma|unit-gamma-ui +63464=block|unit-block-ui +63463=risso|unit-risso-ui +63462=overdrive-dome|block-overdrive-dome-ui +63461=logic-processor|block-logic-processor-ui +63460=micro-processor|block-micro-processor-ui +63459=logic-display|block-logic-display-ui +63458=switch|block-switch-ui +63457=memory-cell|block-memory-cell-ui +63456=payload-conveyor|block-payload-conveyor-ui +63455=hyper-processor|block-hyper-processor-ui +63454=toxopid|unit-toxopid-ui +63453=vestige|unit-vestige-ui +63452=cataclyst|unit-cataclyst-ui +63451=scepter|unit-scepter-ui +63450=reign|unit-reign-ui +63449=dirt|block-dirt-ui +63447=stone-wall|block-stone-wall-ui +63446=spore-wall|block-spore-wall-ui +63445=ice-wall|block-ice-wall-ui +63444=snow-wall|block-snow-wall-ui +63443=dune-wall|block-dune-wall-ui +63442=sand-wall|block-sand-wall-ui +63441=salt-wall|block-salt-wall-ui +63440=shale-wall|block-shale-wall-ui +63439=dirt-wall|block-dirt-wall-ui +63437=basalt|block-basalt-ui +63436=dacite|block-dacite-ui +63435=boulder|block-boulder-ui +63434=snow-boulder|block-snow-boulder-ui +63433=dacite-wall|block-dacite-wall-ui +63432=dacite-boulder|block-dacite-boulder-ui +63431=large-logic-display|block-large-logic-display-ui +63430=omura|unit-omura-ui +63429=mud|block-mud-ui +63428=sei|unit-sei-ui +63427=quad|unit-quad-ui +63426=oct|unit-oct-ui +63425=vela|unit-vela-ui +63424=corvus|unit-corvus-ui +63423=memory-bank|block-memory-bank-ui +63422=foreshadow|block-foreshadow-ui +63421=tsunami|block-tsunami-ui +63420=space|block-space-ui +63419=legacy-unit-factory-air|block-legacy-unit-factory-air-ui +63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-ui +63417=interplanetary-accelerator|block-interplanetary-accelerator-ui +63416=basalt-boulder|block-basalt-boulder-ui +63415=none|status-none-ui +63414=burning|status-burning-ui +63413=freezing|status-freezing-ui +63412=unmoving|status-unmoving-ui +63411=slow|status-slow-ui +63410=wet|status-wet-ui +63409=muddy|status-muddy-ui +63408=melting|status-melting-ui +63407=sapped|status-sapped-ui +63406=spore-slowed|status-spore-slowed-ui +63405=tarred|status-tarred-ui +63404=overdrive|status-overdrive-ui +63403=overclock|status-overclock-ui +63402=shielded|status-shielded-ui +63401=boss|status-boss-ui +63400=shocked|status-shocked-ui +63399=blasted|status-blasted-ui +63398=corroded|status-corroded-ui +63397=disarmed|status-disarmed-ui +63385=duct|block-duct-ui +63376=repair-turret|block-repair-turret-ui +63375=payload-propulsion-tower|block-payload-propulsion-tower-ui +63374=payload-incinerator|block-payload-incinerator-ui +63373=payload-void|block-payload-void-ui +63372=payload-source|block-payload-source-ui +63368=retusa|unit-retusa-ui +63367=directional-item-bridge|block-directional-item-bridge-ui +63366=duct-router|block-duct-router-ui +63365=duct-bridge|block-duct-bridge-ui +63364=oxynoe|unit-oxynoe-ui +63363=cyerce|unit-cyerce-ui +63362=aegires|unit-aegires-ui +63361=electrified|status-electrified-ui +63360=navanax|unit-navanax-ui +63354=payload-launch-pad|block-payload-launch-pad-ui +63353=silicon-arc-furnace|block-silicon-arc-furnace-ui diff --git a/core/assets/maps/archipelago.msav b/core/assets/maps/archipelago.msav new file mode 100644 index 0000000000..24764ccf20 Binary files /dev/null and b/core/assets/maps/archipelago.msav differ diff --git a/core/assets/maps/biomassFacility.msav b/core/assets/maps/biomassFacility.msav new file mode 100644 index 0000000000..738d890f70 Binary files /dev/null and b/core/assets/maps/biomassFacility.msav differ diff --git a/core/assets/maps/caldera.msav b/core/assets/maps/caldera.msav index 4ed0889f5e..57bb5c382f 100644 Binary files a/core/assets/maps/caldera.msav and b/core/assets/maps/caldera.msav differ diff --git a/core/assets/maps/crags.msav b/core/assets/maps/crags.msav deleted file mode 100644 index 1fb64c01e7..0000000000 Binary files a/core/assets/maps/crags.msav and /dev/null differ diff --git a/core/assets/maps/craters.msav b/core/assets/maps/craters.msav index b879701ae6..c52303c3a1 100644 Binary files a/core/assets/maps/craters.msav and b/core/assets/maps/craters.msav differ diff --git a/core/assets/maps/debrisField.msav b/core/assets/maps/debrisField.msav new file mode 100644 index 0000000000..956a7d5b49 Binary files /dev/null and b/core/assets/maps/debrisField.msav differ diff --git a/core/assets/maps/desolateRift.msav b/core/assets/maps/desolateRift.msav index ca3181301a..71c433d81a 100644 Binary files a/core/assets/maps/desolateRift.msav and b/core/assets/maps/desolateRift.msav differ diff --git a/core/assets/maps/extractionOutpost.msav b/core/assets/maps/extractionOutpost.msav new file mode 100644 index 0000000000..7ce6a6904e Binary files /dev/null and b/core/assets/maps/extractionOutpost.msav differ diff --git a/core/assets/maps/fork.msav b/core/assets/maps/fork.msav index 0a6a82d226..2fd62bd91b 100644 Binary files a/core/assets/maps/fork.msav and b/core/assets/maps/fork.msav differ diff --git a/core/assets/maps/fortress.msav b/core/assets/maps/fortress.msav index c5f58e0380..db60a0490d 100644 Binary files a/core/assets/maps/fortress.msav and b/core/assets/maps/fortress.msav differ diff --git a/core/assets/maps/frozenForest.msav b/core/assets/maps/frozenForest.msav index a2a1f52354..09f7e2a546 100644 Binary files a/core/assets/maps/frozenForest.msav and b/core/assets/maps/frozenForest.msav differ diff --git a/core/assets/maps/fungalPass.msav b/core/assets/maps/fungalPass.msav index c154c2e4db..2b593a2482 100644 Binary files a/core/assets/maps/fungalPass.msav and b/core/assets/maps/fungalPass.msav differ diff --git a/core/assets/maps/glacier.msav b/core/assets/maps/glacier.msav index 1494079697..73796f7643 100644 Binary files a/core/assets/maps/glacier.msav and b/core/assets/maps/glacier.msav differ diff --git a/core/assets/maps/groundZero.msav b/core/assets/maps/groundZero.msav index 1f1500439b..bb169dbbc7 100644 Binary files a/core/assets/maps/groundZero.msav and b/core/assets/maps/groundZero.msav differ diff --git a/core/assets/maps/impact0078.msav b/core/assets/maps/impact0078.msav index 03bcfe8be2..08a71a5673 100644 Binary files a/core/assets/maps/impact0078.msav and b/core/assets/maps/impact0078.msav differ diff --git a/core/assets/maps/islands.msav b/core/assets/maps/islands.msav index 48e13f8b6f..90159d57e0 100644 Binary files a/core/assets/maps/islands.msav and b/core/assets/maps/islands.msav differ diff --git a/core/assets/maps/labyrinth.msav b/core/assets/maps/labyrinth.msav index 7501a592ad..9087a6da89 100644 Binary files a/core/assets/maps/labyrinth.msav and b/core/assets/maps/labyrinth.msav differ diff --git a/core/assets/maps/maze.msav b/core/assets/maps/maze.msav index ea34efa876..25386f23c4 100644 Binary files a/core/assets/maps/maze.msav and b/core/assets/maps/maze.msav differ diff --git a/core/assets/maps/moltenLake.msav b/core/assets/maps/moltenLake.msav new file mode 100644 index 0000000000..a409307c6f Binary files /dev/null and b/core/assets/maps/moltenLake.msav differ diff --git a/core/assets/maps/mudFlats.msav b/core/assets/maps/mudFlats.msav new file mode 100644 index 0000000000..adca422b83 Binary files /dev/null and b/core/assets/maps/mudFlats.msav differ diff --git a/core/assets/maps/nuclearComplex.msav b/core/assets/maps/nuclearComplex.msav index fe8b36e26a..1b15a5878b 100644 Binary files a/core/assets/maps/nuclearComplex.msav and b/core/assets/maps/nuclearComplex.msav differ diff --git a/core/assets/maps/overgrowth.msav b/core/assets/maps/overgrowth.msav index b65b8e4818..a51978cb0f 100644 Binary files a/core/assets/maps/overgrowth.msav and b/core/assets/maps/overgrowth.msav differ diff --git a/core/assets/maps/planetaryTerminal.msav b/core/assets/maps/planetaryTerminal.msav new file mode 100644 index 0000000000..7c45ebfca2 Binary files /dev/null and b/core/assets/maps/planetaryTerminal.msav differ diff --git a/core/assets/maps/ruinousShores.msav b/core/assets/maps/ruinousShores.msav index a0ef267a99..441fb2044d 100644 Binary files a/core/assets/maps/ruinousShores.msav and b/core/assets/maps/ruinousShores.msav differ diff --git a/core/assets/maps/saltFlats.msav b/core/assets/maps/saltFlats.msav index 9a70ba342a..f4979da57b 100644 Binary files a/core/assets/maps/saltFlats.msav and b/core/assets/maps/saltFlats.msav differ diff --git a/core/assets/maps/shattered.msav b/core/assets/maps/shattered.msav index cad5016e9d..549e42cab7 100644 Binary files a/core/assets/maps/shattered.msav and b/core/assets/maps/shattered.msav differ diff --git a/core/assets/maps/shoreline.msav b/core/assets/maps/shoreline.msav deleted file mode 100644 index b0320b4350..0000000000 Binary files a/core/assets/maps/shoreline.msav and /dev/null differ diff --git a/core/assets/maps/stainedMountains.msav b/core/assets/maps/stainedMountains.msav index c627b0917e..6e00f916b1 100644 Binary files a/core/assets/maps/stainedMountains.msav and b/core/assets/maps/stainedMountains.msav differ diff --git a/core/assets/maps/tarFields.msav b/core/assets/maps/tarFields.msav index 06eaed164d..c2967456f3 100644 Binary files a/core/assets/maps/tarFields.msav and b/core/assets/maps/tarFields.msav differ diff --git a/core/assets/maps/tendrils.msav b/core/assets/maps/tendrils.msav index 178c11a03e..825437d6c5 100644 Binary files a/core/assets/maps/tendrils.msav and b/core/assets/maps/tendrils.msav differ diff --git a/core/assets/maps/triad.msav b/core/assets/maps/triad.msav index a693b02cba..fd25effa9c 100644 Binary files a/core/assets/maps/triad.msav and b/core/assets/maps/triad.msav differ diff --git a/core/assets/maps/veins.msav b/core/assets/maps/veins.msav index 6ad97e728a..3273feb74b 100644 Binary files a/core/assets/maps/veins.msav and b/core/assets/maps/veins.msav differ diff --git a/core/assets/maps/wasteland.msav b/core/assets/maps/wasteland.msav index f7bb73595e..b00e76fd12 100644 Binary files a/core/assets/maps/wasteland.msav and b/core/assets/maps/wasteland.msav differ diff --git a/core/assets/maps/windsweptIslands.msav b/core/assets/maps/windsweptIslands.msav new file mode 100644 index 0000000000..690a924716 Binary files /dev/null and b/core/assets/maps/windsweptIslands.msav differ diff --git a/core/assets/music/boss1.mp3 b/core/assets/music/boss1.mp3 new file mode 100644 index 0000000000..4a54f750c9 Binary files /dev/null and b/core/assets/music/boss1.mp3 differ diff --git a/core/assets/music/boss2.mp3 b/core/assets/music/boss2.mp3 new file mode 100644 index 0000000000..cd9eaf1b25 Binary files /dev/null and b/core/assets/music/boss2.mp3 differ diff --git a/core/assets/music/editor.mp3 b/core/assets/music/editor.mp3 new file mode 100644 index 0000000000..0b3a8e6182 Binary files /dev/null and b/core/assets/music/editor.mp3 differ diff --git a/core/assets/music/editor.ogg b/core/assets/music/editor.ogg deleted file mode 100644 index 61348f1b75..0000000000 Binary files a/core/assets/music/editor.ogg and /dev/null differ diff --git a/core/assets/music/game1.mp3 b/core/assets/music/game1.mp3 new file mode 100644 index 0000000000..bfb9b3d468 Binary files /dev/null and b/core/assets/music/game1.mp3 differ diff --git a/core/assets/music/game1.ogg b/core/assets/music/game1.ogg deleted file mode 100644 index d69bb0e931..0000000000 Binary files a/core/assets/music/game1.ogg and /dev/null differ diff --git a/core/assets/music/game2.mp3 b/core/assets/music/game2.mp3 new file mode 100644 index 0000000000..baeddf2914 Binary files /dev/null and b/core/assets/music/game2.mp3 differ diff --git a/core/assets/music/game2.ogg b/core/assets/music/game2.ogg deleted file mode 100644 index 9cf7898026..0000000000 Binary files a/core/assets/music/game2.ogg and /dev/null differ diff --git a/core/assets/music/game3.mp3 b/core/assets/music/game3.mp3 new file mode 100644 index 0000000000..e7f8e34f75 Binary files /dev/null and b/core/assets/music/game3.mp3 differ diff --git a/core/assets/music/game3.ogg b/core/assets/music/game3.ogg deleted file mode 100644 index 657848a0da..0000000000 Binary files a/core/assets/music/game3.ogg and /dev/null differ diff --git a/core/assets/music/game4.mp3 b/core/assets/music/game4.mp3 new file mode 100644 index 0000000000..c21cf226f0 Binary files /dev/null and b/core/assets/music/game4.mp3 differ diff --git a/core/assets/music/game4.ogg b/core/assets/music/game4.ogg deleted file mode 100644 index 051c414540..0000000000 Binary files a/core/assets/music/game4.ogg and /dev/null differ diff --git a/core/assets/music/game5.mp3 b/core/assets/music/game5.mp3 new file mode 100644 index 0000000000..2bcc7e7a94 Binary files /dev/null and b/core/assets/music/game5.mp3 differ diff --git a/core/assets/music/game5.ogg b/core/assets/music/game5.ogg deleted file mode 100644 index d988882f7a..0000000000 Binary files a/core/assets/music/game5.ogg and /dev/null differ diff --git a/core/assets/music/game6.mp3 b/core/assets/music/game6.mp3 new file mode 100644 index 0000000000..9e0cfc97d6 Binary files /dev/null and b/core/assets/music/game6.mp3 differ diff --git a/core/assets/music/game6.ogg b/core/assets/music/game6.ogg deleted file mode 100644 index 45b063ae9c..0000000000 Binary files a/core/assets/music/game6.ogg and /dev/null differ diff --git a/core/assets/music/game7.mp3 b/core/assets/music/game7.mp3 new file mode 100644 index 0000000000..4a8d5187b8 Binary files /dev/null and b/core/assets/music/game7.mp3 differ diff --git a/core/assets/music/game7.ogg b/core/assets/music/game7.ogg deleted file mode 100644 index 6a1011657c..0000000000 Binary files a/core/assets/music/game7.ogg and /dev/null differ diff --git a/core/assets/music/game8.mp3 b/core/assets/music/game8.mp3 new file mode 100644 index 0000000000..a2cebbc465 Binary files /dev/null and b/core/assets/music/game8.mp3 differ diff --git a/core/assets/music/game9.mp3 b/core/assets/music/game9.mp3 new file mode 100644 index 0000000000..a852b4c4c9 Binary files /dev/null and b/core/assets/music/game9.mp3 differ diff --git a/core/assets/music/land.mp3 b/core/assets/music/land.mp3 new file mode 100644 index 0000000000..80720c478c Binary files /dev/null and b/core/assets/music/land.mp3 differ diff --git a/core/assets/music/land.ogg b/core/assets/music/land.ogg deleted file mode 100644 index 800b253656..0000000000 Binary files a/core/assets/music/land.ogg and /dev/null differ diff --git a/core/assets/music/launch.mp3 b/core/assets/music/launch.mp3 new file mode 100644 index 0000000000..7aeb2a3340 Binary files /dev/null and b/core/assets/music/launch.mp3 differ diff --git a/core/assets/music/launch.ogg b/core/assets/music/launch.ogg deleted file mode 100644 index 1da1a065c6..0000000000 Binary files a/core/assets/music/launch.ogg and /dev/null differ diff --git a/core/assets/music/menu.mp3 b/core/assets/music/menu.mp3 new file mode 100644 index 0000000000..6423eba4b2 Binary files /dev/null and b/core/assets/music/menu.mp3 differ diff --git a/core/assets/music/menu.ogg b/core/assets/music/menu.ogg deleted file mode 100644 index c23fe679fb..0000000000 Binary files a/core/assets/music/menu.ogg and /dev/null differ diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index c6d7be846b..d97e6aa8f2 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -1,28 +1,22 @@ "use strict"; -const log = function(context, obj){ - Vars.mods.getScripts().log(context, String(obj)) -} +let scriptName = "base.js" +let modName = "none" -const readString = path => Vars.mods.getScripts().readString(path) -const readBytes = path => Vars.mods.getScripts().readBytes(path) -const loadMusic = path => Vars.mods.getScripts().loadMusic(path) -const loadSound = path => Vars.mods.getScripts().loadSound(path) +const log = (context, obj) => Vars.mods.scripts.log(context, String(obj)) +const print = text => log(modName + "/" + scriptName, text) +const readString = path => Vars.mods.scripts.readString(path) +const readBytes = path => Vars.mods.scripts.readBytes(path) +const loadMusic = path => Vars.mods.scripts.loadMusic(path) +const loadSound = path => Vars.mods.scripts.loadSound(path) -var scriptName = "base.js" -var modName = "none" +const readFile = (purpose, ext, cons) => Vars.mods.scripts.readFile(purpose, ext, cons); +const readBinFile = (purpose, ext, cons) => Vars.mods.scripts.readBinFile(purpose, ext, cons); +const writeFile = (purpose, ext, str) => Vars.mods.scripts.writeFile(purpose, ext, str); +const writeBinFile = (purpose, ext, bytes) => Vars.mods.scripts.writeBinFile(purpose, ext, bytes); +const newFloats = cap => Vars.mods.getScripts().newFloats(cap); -const print = text => log(modName + "/" + scriptName, text); - -const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, name) -} - -const extend = function(classType, params){ - return new JavaAdapter(classType, params) -} - -//these are not sctrictly necessary, but are kept for edge cases +//these are not strictly necessary, but are kept for edge cases const run = method => new java.lang.Runnable(){run: method} const boolf = method => new Boolf(){get: method} const boolp = method => new Boolp(){get: method} @@ -32,5 +26,26 @@ const cons = method => new Cons(){get: method} const prov = method => new Prov(){get: method} const func = method => new Func(){get: method} -const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) +const newEffect = (lifetime, renderer) => new Effect.Effect(lifetime, new Effect.EffectRenderer({render: renderer})) Call = Packages.mindustry.gen.Call + +//js 'extend(Base, ..., {})' = java 'new Base(...) {}' +function extend(/*Base, ..., def*/){ + const Base = arguments[0] + const def = arguments[arguments.length - 1] + //swap order from Base, def, ... to Base, ..., def + const args = [Base, def].concat(Array.from(arguments).splice(1, arguments.length - 2)) + + //forward constructor arguments to new JavaAdapter + const instance = JavaAdapter.apply(null, args) + //JavaAdapter only overrides functions; set fields too + for(var i in def){ + if(typeof(def[i]) != "function"){ + instance[i] = def[i] + } + } + return instance +} + +//For backwards compatibility, use extend instead +const extendContent = extend; diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 81a07f2bef..2c40cc4466 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -2,29 +2,23 @@ "use strict"; -const log = function(context, obj){ - Vars.mods.getScripts().log(context, String(obj)) -} +let scriptName = "base.js" +let modName = "none" -const readString = path => Vars.mods.getScripts().readString(path) -const readBytes = path => Vars.mods.getScripts().readBytes(path) -const loadMusic = path => Vars.mods.getScripts().loadMusic(path) -const loadSound = path => Vars.mods.getScripts().loadSound(path) +const log = (context, obj) => Vars.mods.scripts.log(context, String(obj)) +const print = text => log(modName + "/" + scriptName, text) +const readString = path => Vars.mods.scripts.readString(path) +const readBytes = path => Vars.mods.scripts.readBytes(path) +const loadMusic = path => Vars.mods.scripts.loadMusic(path) +const loadSound = path => Vars.mods.scripts.loadSound(path) -var scriptName = "base.js" -var modName = "none" +const readFile = (purpose, ext, cons) => Vars.mods.scripts.readFile(purpose, ext, cons); +const readBinFile = (purpose, ext, cons) => Vars.mods.scripts.readBinFile(purpose, ext, cons); +const writeFile = (purpose, ext, str) => Vars.mods.scripts.writeFile(purpose, ext, str); +const writeBinFile = (purpose, ext, bytes) => Vars.mods.scripts.writeBinFile(purpose, ext, bytes); +const newFloats = cap => Vars.mods.getScripts().newFloats(cap); -const print = text => log(modName + "/" + scriptName, text); - -const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, name) -} - -const extend = function(classType, params){ - return new JavaAdapter(classType, params) -} - -//these are not sctrictly necessary, but are kept for edge cases +//these are not strictly necessary, but are kept for edge cases const run = method => new java.lang.Runnable(){run: method} const boolf = method => new Boolf(){get: method} const boolp = method => new Boolp(){get: method} @@ -34,14 +28,37 @@ const cons = method => new Cons(){get: method} const prov = method => new Prov(){get: method} const func = method => new Func(){get: method} -const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) +const newEffect = (lifetime, renderer) => new Effect.Effect(lifetime, new Effect.EffectRenderer({render: renderer})) Call = Packages.mindustry.gen.Call +//js 'extend(Base, ..., {})' = java 'new Base(...) {}' +function extend(/*Base, ..., def*/){ + const Base = arguments[0] + const def = arguments[arguments.length - 1] + //swap order from Base, def, ... to Base, ..., def + const args = [Base, def].concat(Array.from(arguments).splice(1, arguments.length - 2)) + + //forward constructor arguments to new JavaAdapter + const instance = JavaAdapter.apply(null, args) + //JavaAdapter only overrides functions; set fields too + for(var i in def){ + if(typeof(def[i]) != "function"){ + instance[i] = def[i] + } + } + return instance +} + +//For backwards compatibility, use extend instead +const extendContent = extend; + importPackage(Packages.arc) +importPackage(Packages.arc.audio) importPackage(Packages.arc.func) importPackage(Packages.arc.graphics) importPackage(Packages.arc.graphics.g2d) importPackage(Packages.arc.graphics.gl) +importPackage(Packages.arc.input) importPackage(Packages.arc.math) importPackage(Packages.arc.math.geom) importPackage(Packages.arc.scene) @@ -53,6 +70,12 @@ importPackage(Packages.arc.scene.ui.layout) importPackage(Packages.arc.scene.utils) importPackage(Packages.arc.struct) importPackage(Packages.arc.util) +importPackage(Packages.arc.util.async) +importPackage(Packages.arc.util.io) +importPackage(Packages.arc.util.noise) +importPackage(Packages.arc.util.pooling) +importPackage(Packages.arc.util.serialization) +importPackage(Packages.arc.util.viewport) importPackage(Packages.mindustry) importPackage(Packages.mindustry.ai) importPackage(Packages.mindustry.ai.formations) @@ -68,6 +91,7 @@ importPackage(Packages.mindustry.entities) importPackage(Packages.mindustry.entities.abilities) importPackage(Packages.mindustry.entities.bullet) importPackage(Packages.mindustry.entities.comp) +importPackage(Packages.mindustry.entities.effect) importPackage(Packages.mindustry.entities.units) importPackage(Packages.mindustry.game) importPackage(Packages.mindustry.gen) @@ -81,7 +105,10 @@ importPackage(Packages.mindustry.maps.filters) importPackage(Packages.mindustry.maps.generators) importPackage(Packages.mindustry.maps.planet) importPackage(Packages.mindustry.net) +importPackage(Packages.mindustry.service) importPackage(Packages.mindustry.type) +importPackage(Packages.mindustry.type.weapons) +importPackage(Packages.mindustry.type.weather) importPackage(Packages.mindustry.ui) importPackage(Packages.mindustry.ui.dialogs) importPackage(Packages.mindustry.ui.fragments) @@ -106,7 +133,6 @@ importPackage(Packages.mindustry.world.blocks.units) importPackage(Packages.mindustry.world.consumers) importPackage(Packages.mindustry.world.draw) importPackage(Packages.mindustry.world.meta) -importPackage(Packages.mindustry.world.meta.values) importPackage(Packages.mindustry.world.modules) const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent @@ -115,7 +141,10 @@ const PlayerBanEvent = Packages.mindustry.game.EventType.PlayerBanEvent const PlayerLeave = Packages.mindustry.game.EventType.PlayerLeave const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin +const ConnectPacketEvent = Packages.mindustry.game.EventType.ConnectPacketEvent +const ConnectionEvent = Packages.mindustry.game.EventType.ConnectionEvent const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent +const UnitUnloadEvent = Packages.mindustry.game.EventType.UnitUnloadEvent const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent @@ -127,7 +156,10 @@ const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent +const TilePreChangeEvent = Packages.mindustry.game.EventType.TilePreChangeEvent const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent +const UnitControlEvent = Packages.mindustry.game.EventType.UnitControlEvent +const PickupEvent = Packages.mindustry.game.EventType.PickupEvent const TapEvent = Packages.mindustry.game.EventType.TapEvent const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent const DepositEvent = Packages.mindustry.game.EventType.DepositEvent @@ -136,10 +168,15 @@ const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent +const SchematicCreateEvent = Packages.mindustry.game.EventType.SchematicCreateEvent +const SectorLaunchEvent = Packages.mindustry.game.EventType.SectorLaunchEvent const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent +const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent +const FileTreeInitEvent = Packages.mindustry.game.EventType.FileTreeInitEvent const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent +const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent const CoreItemDeliverEvent = Packages.mindustry.game.EventType.CoreItemDeliverEvent const TurretAmmoDeliverEvent = Packages.mindustry.game.EventType.TurretAmmoDeliverEvent diff --git a/core/assets/shaders/atmosphere.frag b/core/assets/shaders/atmosphere.frag index cbb7c4ea21..1c8c4966df 100644 --- a/core/assets/shaders/atmosphere.frag +++ b/core/assets/shaders/atmosphere.frag @@ -1,3 +1,5 @@ +#define HIGHP + const float PI = 3.14159265359; const float MAX = 10000.0; @@ -27,12 +29,12 @@ uniform vec3 u_rcampos; uniform mat4 u_invproj; uniform vec3 u_light; -vec2 rayIntersection(vec3 p, vec3 dir, float radius) { +vec2 rayIntersection(vec3 p, vec3 dir, float radius){ float b = dot(p, dir); float c = dot(p, p) - radius * radius; float d = b * b - c; - if (d < 0.0) { + if(d < 0.0){ return vec2(MAX, -MAX); } d = sqrt(d); @@ -43,7 +45,7 @@ vec2 rayIntersection(vec3 p, vec3 dir, float radius) { return vec2(near, far); } -float miePhase(float g, float c, float cc) { +float miePhase(float g, float c, float cc){ float gg = g * g; float a = (1.0 - gg) * (1.0 + cc); @@ -55,20 +57,20 @@ float miePhase(float g, float c, float cc) { return 1.5 * a / b; } -float rayleighPhase(float cc) { +float rayleighPhase(float cc){ return 0.75 * (1.0 + cc); } -float density(vec3 p) { +float density(vec3 p){ return exp(-(length(p) - u_innerRadius) * (4.0 / (u_outerRadius - u_innerRadius))); } -float optic(vec3 p, vec3 q) { +float optic(vec3 p, vec3 q){ vec3 step = (q - p) / fNumOutScatter; vec3 v = p + step * 0.5; float sum = 0.0; - for (int i = 0; i < numOutScatter; i++) { + for(int i = 0; i < numOutScatter; i++){ sum += density(v); v += step; } @@ -76,7 +78,7 @@ float optic(vec3 p, vec3 q) { return sum; } -vec3 inScatter(vec3 o, vec3 dir, vec2 e, vec3 l) { +vec3 inScatter(vec3 o, vec3 dir, vec2 e, vec3 l){ float len = (e.y - e.x) / fNumInScatter; vec3 step = dir * len; vec3 p = o + dir * e.x; @@ -115,4 +117,4 @@ void main(){ vec3 result = inScatter(eye, dir, e, l); gl_FragColor = vec4(result, 1.0); -} \ No newline at end of file +} diff --git a/core/assets/shaders/atmosphere.vert b/core/assets/shaders/atmosphere.vert index 6899e0f0f4..05081108d0 100644 --- a/core/assets/shaders/atmosphere.vert +++ b/core/assets/shaders/atmosphere.vert @@ -10,4 +10,4 @@ void main(){ v_position = a_position; v_model = u_model; gl_Position = u_projection*u_model*a_position; -} \ No newline at end of file +} diff --git a/core/assets/shaders/blockbuild.frag b/core/assets/shaders/blockbuild.frag index c2fb1b4044..6009ea6e27 100644 --- a/core/assets/shaders/blockbuild.frag +++ b/core/assets/shaders/blockbuild.frag @@ -1,6 +1,7 @@ +#define HIGHP + uniform sampler2D u_texture; -uniform vec4 u_color; uniform vec2 u_texsize; uniform vec2 u_uv; uniform vec2 u_uv2; @@ -24,7 +25,7 @@ bool cont(vec2 T, vec2 v){ id(T + vec2(step, 0) * v, base) || id(T + vec2(-step, 0) * v, base)); } -void main() { +void main(){ vec2 t = v_texCoords.xy; @@ -38,11 +39,11 @@ void main() { float dst = (abs(center.x - coords.x) + abs(center.y - coords.y))/2.0; if((mod(u_time / 1.5 + value, 20.0) < 15.0 && cont(t, v))){ - gl_FragColor = u_color; + gl_FragColor = v_color; }else if(dst > (1.0-u_progress) * (center.x)){ gl_FragColor = color; - }else if((dst + 1.0 > (1.0-u_progress) * (center.x)) && color.a > 0.1){ - gl_FragColor = u_color; + }else if((dst + 1.0 > (1.0-u_progress) * (center.x)) && color.a > 0.1){ + gl_FragColor = v_color; }else{ gl_FragColor = vec4(0.0); } diff --git a/core/assets/shaders/buildbeam.frag b/core/assets/shaders/buildbeam.frag new file mode 100644 index 0000000000..10801e5b18 --- /dev/null +++ b/core/assets/shaders/buildbeam.frag @@ -0,0 +1,18 @@ +#define HIGHP + +uniform sampler2D u_texture; +uniform vec2 u_texsize; +uniform vec2 u_invsize; +uniform float u_time; +uniform float u_dp; +uniform vec2 u_offset; +varying vec2 v_texCoords; + +void main(){ + vec2 T = v_texCoords.xy; + vec2 coords = (T * u_texsize) + u_offset; + vec4 color = texture2D(u_texture, T); + + color.a *= (0.37 + abs(sin(u_time / 15.0)) * .05 + 0.2 * (step(mod(coords.x / u_dp + coords.y / u_dp + u_time / 4.0, 10.0), 3.0))); + gl_FragColor = color; +} diff --git a/core/assets/shaders/caustics.frag b/core/assets/shaders/caustics.frag new file mode 100644 index 0000000000..ddc4b80bbc --- /dev/null +++ b/core/assets/shaders/caustics.frag @@ -0,0 +1,24 @@ +#define HIGHP + +#define NSCALE 200.0 / 1.8 + +uniform sampler2D u_texture; +uniform sampler2D u_noise; + +uniform vec2 u_campos; +uniform vec2 u_resolution; +uniform float u_time; + +varying vec2 v_texCoords; + +void main(){ + vec2 c = v_texCoords.xy; + vec2 coords = vec2(c.x * u_resolution.x + u_campos.x, c.y * u_resolution.y + u_campos.y); + + float btime = u_time / 3400.0; + vec4 noise1 = texture2D(u_noise, (coords) / NSCALE + vec2(btime) * vec2(-0.9, 0.8)); + vec4 noise2 = texture2D(u_noise, (coords) / NSCALE + vec2(btime * 1.1) * vec2(0.8, -1.0)); + //vec4 noise3 = texture2D(u_noise, (coords) / (NSCALE * 2.0) + vec2(btime * 0.9) * vec2(0.8, 1.0)); + + gl_FragColor = vec4(vec3(min(noise1.r, noise2.r)), 0.2); +} diff --git a/core/assets/shaders/cubemap.frag b/core/assets/shaders/cubemap.frag index 3f9a760e94..d6567508e9 100644 --- a/core/assets/shaders/cubemap.frag +++ b/core/assets/shaders/cubemap.frag @@ -5,4 +5,4 @@ uniform samplerCube u_cubemap; void main(){ gl_FragColor = textureCube(u_cubemap, v_texCoords); -} \ No newline at end of file +} diff --git a/core/assets/shaders/cubemap.vert b/core/assets/shaders/cubemap.vert index 546cec8f46..1d5d04f518 100644 --- a/core/assets/shaders/cubemap.vert +++ b/core/assets/shaders/cubemap.vert @@ -9,4 +9,4 @@ const float SCALE = 50.0; void main(){ v_texCoords = a_position; gl_Position = u_proj * vec4(a_position * SCALE, 1.0); -} \ No newline at end of file +} diff --git a/core/assets/shaders/default.frag b/core/assets/shaders/default.frag new file mode 100644 index 0000000000..1f67c593ea --- /dev/null +++ b/core/assets/shaders/default.frag @@ -0,0 +1,9 @@ +varying lowp vec4 v_color; +varying lowp vec4 v_mix_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; + +void main(){ + vec4 c = texture2D(u_texture, v_texCoords); + gl_FragColor = v_color * mix(c, vec4(v_mix_color.rgb, c.a), v_mix_color.a); +} diff --git a/core/assets/shaders/planet.vert b/core/assets/shaders/planet.vert index f500af0ecf..182fe68972 100755 --- a/core/assets/shaders/planet.vert +++ b/core/assets/shaders/planet.vert @@ -10,16 +10,16 @@ uniform vec3 u_ambientColor; varying vec4 v_col; -const vec3 diffuse = vec3(0); +const vec3 diffuse = vec3(0.01); const float shinefalloff = 4.0; const float shinelen = 0.2; void main(){ vec3 norc = u_ambientColor * (diffuse + vec3(clamp((dot(a_normal, u_lightdir) + 1.0) / 2.0, 0.0, 1.0))); float shinedot = max((-dot(u_camdir, a_normal) - (1.0 - shinelen)) / shinelen, 0.0); - float shinyness = (1.0 - a_color.a) * pow(shinedot, shinefalloff); + float albedo = (1.0 - a_color.a) * pow(shinedot, shinefalloff); vec4 baseCol = vec4(a_color.rgb, 1.0); - v_col = mix(baseCol * vec4(norc, 1.0), vec4(1.0), shinyness * norc.r); + v_col = mix(baseCol * vec4(norc, 1.0), vec4(1.0), albedo * norc.r); gl_Position = u_proj * u_trans * a_position; } diff --git a/core/assets/shaders/planetgrid.vert b/core/assets/shaders/planetgrid.vert index 5dd54ffebc..9eca283160 100644 --- a/core/assets/shaders/planetgrid.vert +++ b/core/assets/shaders/planetgrid.vert @@ -7,7 +7,7 @@ uniform mat4 u_trans; varying vec4 v_col; varying vec4 v_position; -void main() { +void main(){ gl_Position = u_proj * u_trans * a_position; v_col = a_color; v_position = a_position; diff --git a/core/assets/shaders/slag.frag b/core/assets/shaders/slag.frag index f904d48dbf..c038baf292 100755 --- a/core/assets/shaders/slag.frag +++ b/core/assets/shaders/slag.frag @@ -29,4 +29,4 @@ void main(){ } gl_FragColor = color; -} \ No newline at end of file +} diff --git a/core/assets/shaders/space.frag b/core/assets/shaders/space.frag new file mode 100755 index 0000000000..73045aa54b --- /dev/null +++ b/core/assets/shaders/space.frag @@ -0,0 +1,23 @@ +#define HIGHP +#define NSCALE 2700.0 +#define CAMSCALE (NSCALE*10.0) + +uniform sampler2D u_texture; +uniform sampler2D u_stars; + +uniform vec2 u_campos; +uniform vec2 u_ccampos; +uniform vec2 u_resolution; +uniform float u_time; + +varying vec2 v_texCoords; + +void main(){ + vec2 c = v_texCoords.xy; + vec2 coords = vec2(c.x * u_resolution.x, c.y * u_resolution.y); + + vec4 color = texture2D(u_texture, c); + color.rgb = texture2D(u_stars, coords/NSCALE + vec2(-0.1, -0.1) + u_ccampos / CAMSCALE).rgb; + + gl_FragColor = color; +} diff --git a/core/assets/shaders/tar.frag b/core/assets/shaders/tar.frag index ea2a3b3f1d..228eb15718 100644 --- a/core/assets/shaders/tar.frag +++ b/core/assets/shaders/tar.frag @@ -24,4 +24,4 @@ void main(){ } gl_FragColor = color; -} \ No newline at end of file +} diff --git a/core/assets/shaders/unitbuild.frag b/core/assets/shaders/unitbuild.frag index 147b27106f..d4657060da 100644 --- a/core/assets/shaders/unitbuild.frag +++ b/core/assets/shaders/unitbuild.frag @@ -30,7 +30,7 @@ bool cont(vec2 T, vec2 v){ id(T + vec2(step, -step) * v, base) || id(T + vec2(-step, step) * v, base)); } -void main() { +void main(){ vec2 coords = (v_texCoords.xy - u_uv) / (u_uv2 - u_uv); vec2 t = v_texCoords.xy; vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); diff --git a/core/assets/shaders/water.frag b/core/assets/shaders/water.frag index f0c41ccd24..51c56f26a1 100644 --- a/core/assets/shaders/water.frag +++ b/core/assets/shaders/water.frag @@ -14,7 +14,6 @@ const float mth = 7.0; void main(){ vec2 c = v_texCoords; - vec2 v = vec2(1.0/u_resolution.x, 1.0/u_resolution.y); vec2 coords = vec2(c.x / v.x + u_campos.x, c.y / v.y + u_campos.y); @@ -34,4 +33,4 @@ void main(){ } gl_FragColor = vec4(color.rgb, 1.0); -} \ No newline at end of file +} diff --git a/core/assets/sounds/artillery.ogg b/core/assets/sounds/artillery.ogg index e3651f5ce1..d9f8b74d75 100644 Binary files a/core/assets/sounds/artillery.ogg and b/core/assets/sounds/artillery.ogg differ diff --git a/core/assets/sounds/bang.ogg b/core/assets/sounds/bang.ogg index afbd099e6f..29cde62552 100644 Binary files a/core/assets/sounds/bang.ogg and b/core/assets/sounds/bang.ogg differ diff --git a/core/assets/sounds/boom.ogg b/core/assets/sounds/boom.ogg index 4cce577fe9..19f41d80b2 100644 Binary files a/core/assets/sounds/boom.ogg and b/core/assets/sounds/boom.ogg differ diff --git a/core/assets/sounds/combustion.ogg b/core/assets/sounds/combustion.ogg new file mode 100644 index 0000000000..6aab153a47 Binary files /dev/null and b/core/assets/sounds/combustion.ogg differ diff --git a/core/assets/sounds/conveyor.ogg b/core/assets/sounds/conveyor.ogg index 9f989d70d0..67576b44a4 100644 Binary files a/core/assets/sounds/conveyor.ogg and b/core/assets/sounds/conveyor.ogg differ diff --git a/core/assets/sounds/cutter.ogg b/core/assets/sounds/cutter.ogg new file mode 100644 index 0000000000..313159006e Binary files /dev/null and b/core/assets/sounds/cutter.ogg differ diff --git a/core/assets/sounds/drill.ogg b/core/assets/sounds/drill.ogg index 6aab153a47..f21898b646 100644 Binary files a/core/assets/sounds/drill.ogg and b/core/assets/sounds/drill.ogg differ diff --git a/core/assets/sounds/empty.ogg b/core/assets/sounds/empty.ogg deleted file mode 100644 index 6c7ecbe8e0..0000000000 Binary files a/core/assets/sounds/empty.ogg and /dev/null differ diff --git a/core/assets/sounds/fire.ogg b/core/assets/sounds/fire.ogg index 0201ee8ea4..eb5ea8a770 100644 Binary files a/core/assets/sounds/fire.ogg and b/core/assets/sounds/fire.ogg differ diff --git a/core/assets/sounds/grinding.ogg b/core/assets/sounds/grinding.ogg new file mode 100644 index 0000000000..f78d2c4e67 Binary files /dev/null and b/core/assets/sounds/grinding.ogg differ diff --git a/core/assets/sounds/hum.ogg b/core/assets/sounds/hum.ogg new file mode 100644 index 0000000000..184504f3dd Binary files /dev/null and b/core/assets/sounds/hum.ogg differ diff --git a/core/assets/sounds/laserblast.ogg b/core/assets/sounds/laserblast.ogg new file mode 100644 index 0000000000..6df3b14284 Binary files /dev/null and b/core/assets/sounds/laserblast.ogg differ diff --git a/core/assets/sounds/lasercharge.ogg b/core/assets/sounds/lasercharge.ogg new file mode 100644 index 0000000000..7e50df3661 Binary files /dev/null and b/core/assets/sounds/lasercharge.ogg differ diff --git a/core/assets/sounds/lasercharge2.ogg b/core/assets/sounds/lasercharge2.ogg new file mode 100644 index 0000000000..2a737e5f63 Binary files /dev/null and b/core/assets/sounds/lasercharge2.ogg differ diff --git a/core/assets/sounds/lasershoot.ogg b/core/assets/sounds/lasershoot.ogg new file mode 100644 index 0000000000..d25c17a4cb Binary files /dev/null and b/core/assets/sounds/lasershoot.ogg differ diff --git a/core/assets/sounds/minebeam.ogg b/core/assets/sounds/minebeam.ogg new file mode 100644 index 0000000000..27f75a8531 Binary files /dev/null and b/core/assets/sounds/minebeam.ogg differ diff --git a/core/assets/sounds/mud.ogg b/core/assets/sounds/mud.ogg new file mode 100644 index 0000000000..8eb75cb67e Binary files /dev/null and b/core/assets/sounds/mud.ogg differ diff --git a/core/assets/sounds/noammo.ogg b/core/assets/sounds/noammo.ogg new file mode 100644 index 0000000000..4472dab237 Binary files /dev/null and b/core/assets/sounds/noammo.ogg differ diff --git a/core/assets/sounds/pew.ogg b/core/assets/sounds/pew.ogg index 0c1df7f711..6a15b963e3 100644 Binary files a/core/assets/sounds/pew.ogg and b/core/assets/sounds/pew.ogg differ diff --git a/core/assets/sounds/place.ogg b/core/assets/sounds/place.ogg index ff1d05c211..29bcec7a9b 100644 Binary files a/core/assets/sounds/place.ogg and b/core/assets/sounds/place.ogg differ diff --git a/core/assets/sounds/plasmaboom.ogg b/core/assets/sounds/plasmaboom.ogg new file mode 100644 index 0000000000..fab2f3471d Binary files /dev/null and b/core/assets/sounds/plasmaboom.ogg differ diff --git a/core/assets/sounds/plasmadrop.ogg b/core/assets/sounds/plasmadrop.ogg new file mode 100644 index 0000000000..57bd0b8e27 Binary files /dev/null and b/core/assets/sounds/plasmadrop.ogg differ diff --git a/core/assets/sounds/pulse.ogg b/core/assets/sounds/pulse.ogg new file mode 100644 index 0000000000..6c135c8a07 Binary files /dev/null and b/core/assets/sounds/pulse.ogg differ diff --git a/core/assets/sounds/railgun.ogg b/core/assets/sounds/railgun.ogg new file mode 100644 index 0000000000..d8de298916 Binary files /dev/null and b/core/assets/sounds/railgun.ogg differ diff --git a/core/assets/sounds/rain.ogg b/core/assets/sounds/rain.ogg new file mode 100644 index 0000000000..ecf90ea73d Binary files /dev/null and b/core/assets/sounds/rain.ogg differ diff --git a/core/assets/sounds/sap.ogg b/core/assets/sounds/sap.ogg new file mode 100644 index 0000000000..9e73a8d516 Binary files /dev/null and b/core/assets/sounds/sap.ogg differ diff --git a/core/assets/sounds/shield.ogg b/core/assets/sounds/shield.ogg new file mode 100644 index 0000000000..b427a07286 Binary files /dev/null and b/core/assets/sounds/shield.ogg differ diff --git a/core/assets/sounds/shootSnap.ogg b/core/assets/sounds/shootSnap.ogg index fc692486a0..17826bb5c0 100644 Binary files a/core/assets/sounds/shootSnap.ogg and b/core/assets/sounds/shootSnap.ogg differ diff --git a/core/assets/sounds/smelter.ogg b/core/assets/sounds/smelter.ogg new file mode 100644 index 0000000000..86bbaf63de Binary files /dev/null and b/core/assets/sounds/smelter.ogg differ diff --git a/core/assets/sounds/spark.ogg b/core/assets/sounds/spark.ogg index ac61a476de..352e98c743 100644 Binary files a/core/assets/sounds/spark.ogg and b/core/assets/sounds/spark.ogg differ diff --git a/core/assets/sounds/splash.ogg b/core/assets/sounds/splash.ogg index 4b6e5eec53..59a77836c4 100644 Binary files a/core/assets/sounds/splash.ogg and b/core/assets/sounds/splash.ogg differ diff --git a/core/assets/sounds/spray.ogg b/core/assets/sounds/spray.ogg index 7bddeb6685..50a2049596 100644 Binary files a/core/assets/sounds/spray.ogg and b/core/assets/sounds/spray.ogg differ diff --git a/core/assets/sounds/steam.ogg b/core/assets/sounds/steam.ogg new file mode 100644 index 0000000000..9b65bac938 Binary files /dev/null and b/core/assets/sounds/steam.ogg differ diff --git a/core/assets/sounds/swish.ogg b/core/assets/sounds/swish.ogg new file mode 100644 index 0000000000..4b6e5eec53 Binary files /dev/null and b/core/assets/sounds/swish.ogg differ diff --git a/core/assets/sounds/techloop.ogg b/core/assets/sounds/techloop.ogg new file mode 100644 index 0000000000..125ac36718 Binary files /dev/null and b/core/assets/sounds/techloop.ogg differ diff --git a/core/assets/sounds/tractorbeam.ogg b/core/assets/sounds/tractorbeam.ogg new file mode 100644 index 0000000000..4c307c4e08 Binary files /dev/null and b/core/assets/sounds/tractorbeam.ogg differ diff --git a/core/assets/sounds/back.ogg b/core/assets/sounds/ui/back.ogg similarity index 100% rename from core/assets/sounds/back.ogg rename to core/assets/sounds/ui/back.ogg diff --git a/core/assets/sounds/message.ogg b/core/assets/sounds/ui/message.ogg similarity index 100% rename from core/assets/sounds/message.ogg rename to core/assets/sounds/ui/message.ogg diff --git a/core/assets/sounds/press.ogg b/core/assets/sounds/ui/press.ogg similarity index 100% rename from core/assets/sounds/press.ogg rename to core/assets/sounds/ui/press.ogg diff --git a/core/assets/sounds/unlock.ogg b/core/assets/sounds/ui/unlock.ogg similarity index 100% rename from core/assets/sounds/unlock.ogg rename to core/assets/sounds/ui/unlock.ogg diff --git a/core/assets/sounds/wind.ogg b/core/assets/sounds/wind.ogg new file mode 100644 index 0000000000..aeabe4802b Binary files /dev/null and b/core/assets/sounds/wind.ogg differ diff --git a/core/assets/sounds/wind2.ogg b/core/assets/sounds/wind2.ogg new file mode 100644 index 0000000000..3900ba35a1 Binary files /dev/null and b/core/assets/sounds/wind2.ogg differ diff --git a/core/assets/sounds/windhowl.ogg b/core/assets/sounds/windhowl.ogg new file mode 100644 index 0000000000..de7526a616 Binary files /dev/null and b/core/assets/sounds/windhowl.ogg differ diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png deleted file mode 100644 index ccbd6ed7e2..0000000000 Binary files a/core/assets/sprites/block_colors.png and /dev/null differ diff --git a/core/assets/sprites/clouds.png b/core/assets/sprites/clouds.png new file mode 100644 index 0000000000..93a8684689 Binary files /dev/null and b/core/assets/sprites/clouds.png differ diff --git a/core/assets/sprites/fallback/sprites.atlas b/core/assets/sprites/fallback/sprites.atlas deleted file mode 100644 index 13e8478d73..0000000000 --- a/core/assets/sprites/fallback/sprites.atlas +++ /dev/null @@ -1,20957 +0,0 @@ - -sprites.png -size: 2048,2048 -format: rgba8888 -filter: nearest,nearest -repeat: none -white-tree - rotate: false - xy: 1127, 1273 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-dead - rotate: false - xy: 1127, 951 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-dead-shadow - rotate: false - xy: 403, 843 - size: 353, 348 - orig: 353, 348 - offset: 0, 0 - index: -1 -white-tree-shadow - rotate: false - xy: 403, 843 - size: 353, 348 - orig: 353, 348 - offset: 0, 0 - index: -1 -factory-in-9 - rotate: false - xy: 1015, 371 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -factory-out-9 - rotate: false - xy: 725, 81 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -tetrative-reconstructor - rotate: false - xy: 1015, 81 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -tetrative-reconstructor-top - rotate: false - xy: 1338, 515 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-full - rotate: false - xy: 1449, 1385 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-0 - rotate: false - xy: 1449, 1095 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-1 - rotate: false - xy: 1449, 805 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-2 - rotate: false - xy: 1739, 1385 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-3 - rotate: false - xy: 1739, 1095 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-4 - rotate: false - xy: 1739, 805 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-5 - rotate: false - xy: 758, 661 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-6 - rotate: false - xy: 1048, 661 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-7 - rotate: false - xy: 725, 371 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -eclipse-outline - rotate: false - xy: 1, 67 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck0 - rotate: false - xy: 403, 521 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck1 - rotate: false - xy: 1529, 1675 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck2 - rotate: false - xy: 403, 199 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -oct-outline - rotate: false - xy: 403, 1595 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-wreck0 - rotate: false - xy: 1, 791 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-wreck1 - rotate: false - xy: 403, 1193 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-wreck2 - rotate: false - xy: 805, 1595 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -omura-outline - rotate: false - xy: 1587, 1 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -unit-eclipse-full - rotate: false - xy: 805, 951 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -unit-oct-full - rotate: false - xy: 1, 389 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -eclipse - rotate: false - xy: 805, 1273 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-cell - rotate: false - xy: 1207, 1675 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -oct - rotate: false - xy: 1, 1595 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-cell - rotate: false - xy: 1, 1193 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -omura - rotate: false - xy: 1305, 113 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-cell - rotate: false - xy: 1628, 403 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 - -sprites2.png -size: 2048,2048 -format: rgba8888 -filter: nearest,nearest -repeat: none -large-logic-display - rotate: false - xy: 1567, 102 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -exponential-reconstructor - rotate: false - xy: 767, 1071 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -exponential-reconstructor-top - rotate: false - xy: 993, 1313 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-in-7 - rotate: false - xy: 993, 1087 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-out-7 - rotate: false - xy: 1219, 1313 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -circle-shadow - rotate: false - xy: 1620, 684 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -antumbra-outline - rotate: false - xy: 719, 143 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck0 - rotate: false - xy: 941, 385 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck1 - rotate: false - xy: 937, 143 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck2 - rotate: false - xy: 1667, 1313 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-full - rotate: false - xy: 1823, 1797 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -corvus-outline - rotate: false - xy: 933, 1 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-wreck0 - rotate: false - xy: 993, 945 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-wreck1 - rotate: false - xy: 985, 803 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-wreck2 - rotate: false - xy: 969, 661 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -cracks-6-0 - rotate: false - xy: 1367, 494 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-1 - rotate: false - xy: 1561, 490 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-2 - rotate: false - xy: 1755, 490 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-3 - rotate: false - xy: 1823, 693 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-4 - rotate: false - xy: 1373, 296 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-5 - rotate: false - xy: 1567, 296 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-6 - rotate: false - xy: 1761, 296 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-7 - rotate: false - xy: 1373, 102 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-7-0 - rotate: false - xy: 1823, 1571 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-1 - rotate: false - xy: 807, 1539 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-2 - rotate: false - xy: 1033, 1539 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-3 - rotate: false - xy: 541, 1297 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-4 - rotate: false - xy: 541, 1071 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-5 - rotate: false - xy: 1259, 1539 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-6 - rotate: false - xy: 1485, 1555 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-7 - rotate: false - xy: 767, 1297 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-8-0 - rotate: false - xy: 565, 1765 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 1, 559 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 283, 1297 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 823, 1765 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 1, 301 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 283, 1039 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 1081, 1765 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 1, 43 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -omura-wreck0 - rotate: false - xy: 1, 1621 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck1 - rotate: false - xy: 1, 1219 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck2 - rotate: false - xy: 283, 1621 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -quad-outline - rotate: false - xy: 541, 849 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-wreck0 - rotate: false - xy: 763, 849 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-wreck1 - rotate: false - xy: 525, 627 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-wreck2 - rotate: false - xy: 747, 627 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -reign-outline - rotate: false - xy: 1661, 1171 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck0 - rotate: false - xy: 1441, 1033 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck1 - rotate: false - xy: 1657, 1029 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck2 - rotate: false - xy: 1219, 949 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -sei-outline - rotate: false - xy: 283, 797 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck0 - rotate: false - xy: 259, 555 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck1 - rotate: false - xy: 259, 313 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck2 - rotate: false - xy: 259, 71 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -toxopid-cannon-outline - rotate: false - xy: 1209, 727 - size: 206, 220 - orig: 206, 220 - offset: 0, 0 - index: -1 -toxopid-leg-base - rotate: false - xy: 283, 1555 - size: 270, 64 - orig: 270, 64 - offset: 0, 0 - index: -1 -unit-antumbra-full - rotate: false - xy: 1155, 143 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -unit-corvus-full - rotate: false - xy: 1435, 891 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -unit-omura-full - rotate: false - xy: 1, 817 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -unit-quad-full - rotate: false - xy: 501, 405 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -unit-reign-full - rotate: false - xy: 1651, 887 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -unit-sei-full - rotate: false - xy: 565, 1523 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -circle - rotate: false - xy: 1417, 688 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -antumbra - rotate: false - xy: 501, 163 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-cell - rotate: false - xy: 723, 385 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -corvus - rotate: false - xy: 501, 21 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-cell - rotate: false - xy: 717, 1 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-weapon-heat - rotate: false - xy: 1149, 1 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -quad - rotate: false - xy: 1219, 1091 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-cell - rotate: false - xy: 1445, 1317 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -reign - rotate: false - xy: 1445, 1175 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -sei - rotate: false - xy: 1339, 1781 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-cell - rotate: false - xy: 1581, 1781 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -toxopid-cannon - rotate: false - xy: 1159, 439 - size: 206, 220 - orig: 206, 220 - offset: 0, 0 - index: -1 -omura-cannon - rotate: false - xy: 1761, 17 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 - -sprites3.png -size: 2048,2048 -format: rgba8888 -filter: nearest,nearest -repeat: none -launch-pad - rotate: false - xy: 813, 99 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large - rotate: false - xy: 725, 1041 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -launch-pad-light - rotate: false - xy: 813, 1 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector - rotate: false - xy: 1527, 1221 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector-top - rotate: false - xy: 1625, 1193 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome - rotate: false - xy: 1589, 1095 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-top - rotate: false - xy: 1687, 1095 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-loader - rotate: false - xy: 1267, 529 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader - rotate: false - xy: 1231, 235 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mass-driver-base - rotate: false - xy: 1009, 5 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor - rotate: false - xy: 1785, 1095 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-edge - rotate: false - xy: 1589, 997 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-top - rotate: false - xy: 1687, 997 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-top - rotate: false - xy: 1687, 997 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router - rotate: false - xy: 1785, 997 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-edge - rotate: false - xy: 1883, 1095 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-over - rotate: false - xy: 1883, 997 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 335, 1233 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 335, 1103 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 465, 1233 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 335, 973 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -laser-drill - rotate: false - xy: 1491, 1025 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rim - rotate: false - xy: 813, 295 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rotator - rotate: false - xy: 911, 295 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-top - rotate: false - xy: 813, 197 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor - rotate: false - xy: 1205, 137 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-liquid - rotate: false - xy: 1205, 39 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-rotator - rotate: false - xy: 1303, 137 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-top - rotate: false - xy: 1303, 39 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -place-arrow - rotate: false - xy: 1919, 1193 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-bottom - rotate: false - xy: 911, 197 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-liquid - rotate: false - xy: 911, 99 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-top - rotate: false - xy: 911, 1 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 1365, 847 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hyper-processor - rotate: false - xy: 1491, 1123 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-display - rotate: false - xy: 1009, 201 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large - rotate: false - xy: 1169, 921 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large-top - rotate: false - xy: 1169, 823 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator - rotate: false - xy: 1445, 1319 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-liquid - rotate: false - xy: 1543, 1319 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-top - rotate: false - xy: 1641, 1389 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -impact-reactor - rotate: false - xy: 595, 583 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 595, 453 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 585, 323 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 585, 193 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 585, 63 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 725, 1301 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 725, 1171 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 1883, 899 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 1365, 749 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-lights - rotate: false - xy: 1365, 651 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-top - rotate: false - xy: 1365, 553 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter - rotate: false - xy: 1071, 725 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-top - rotate: false - xy: 1071, 627 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 1267, 725 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler - rotate: false - xy: 1739, 1389 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-liquid - rotate: false - xy: 1837, 1389 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-spinner - rotate: false - xy: 1641, 1291 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 1107, 137 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible - rotate: false - xy: 1687, 899 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible-top - rotate: false - xy: 1785, 899 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 465, 583 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 335, 453 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus - rotate: false - xy: 1, 11 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team - rotate: false - xy: 1421, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard - rotate: false - xy: 1331, 1141 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team - rotate: false - xy: 1295, 1039 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 1463, 535 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team - rotate: false - xy: 1561, 801 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-3 - rotate: false - xy: 1169, 725 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 465, 1103 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -foreshadow-heat - rotate: false - xy: 595, 713 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 725, 781 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple-heat - rotate: false - xy: 1401, 39 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tsunami-liquid - rotate: false - xy: 1463, 731 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tsunami-top - rotate: false - xy: 1463, 633 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor - rotate: false - xy: 1099, 1019 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor-top - rotate: false - xy: 1071, 921 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory - rotate: false - xy: 1071, 823 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-3 - rotate: false - xy: 1739, 1291 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-5 - rotate: false - xy: 163, 170 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-out-3 - rotate: false - xy: 1837, 1291 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-out-5 - rotate: false - xy: 163, 8 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-top-3 - rotate: false - xy: 1429, 1221 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ground-factory - rotate: false - xy: 1821, 1193 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor - rotate: false - xy: 389, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 551, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory - rotate: false - xy: 1107, 39 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 985, 1313 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge2 - rotate: false - xy: 1491, 927 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge3 - rotate: false - xy: 1589, 899 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 985, 1183 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -circle-end - rotate: false - xy: 969, 852 - size: 100, 199 - orig: 100, 199 - offset: 0, 0 - index: -1 -large-bomb - rotate: false - xy: 1245, 1341 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -large-bomb-back - rotate: false - xy: 855, 495 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -laser-end - rotate: false - xy: 1945, 1543 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -minelaser-end - rotate: false - xy: 1951, 325 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -parallax-laser-end - rotate: false - xy: 1609, 303 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -arkyid-foot - rotate: false - xy: 1757, 319 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-joint-base - rotate: false - xy: 1829, 319 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-leg-base - rotate: false - xy: 725, 455 - size: 104, 64 - orig: 104, 64 - offset: 0, 0 - index: -1 -arkyid-outline - rotate: false - xy: 1067, 1443 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck0 - rotate: false - xy: 1197, 1443 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 357, 1363 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 487, 1363 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -artillery-mount-outline - rotate: false - xy: 1755, 247 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -atrax-outline - rotate: false - xy: 1519, 245 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 1499, 179 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 1499, 113 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 1499, 47 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beam-weapon-outline - rotate: false - xy: 1827, 555 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 1169, 627 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 1197, 1019 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 335, 843 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 465, 973 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1, 335 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-core-shard-full - rotate: false - xy: 1267, 921 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 1267, 823 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-foreshadow-full - rotate: false - xy: 335, 713 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 1267, 627 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 1035, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 465, 843 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 1071, 529 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 1169, 529 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 1133, 431 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 335, 583 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-full - rotate: false - xy: 1, 173 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-naval-factory-full - rotate: false - xy: 1231, 431 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 1329, 431 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 1133, 333 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 1133, 333 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 1231, 333 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 1231, 333 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 1329, 333 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 1035, 299 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 1035, 299 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 465, 713 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-tsunami-full - rotate: false - xy: 1133, 235 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-vault-full - rotate: false - xy: 1329, 235 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -bryde-outline - rotate: false - xy: 675, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 817, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 959, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 1101, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 465, 453 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 325, 323 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 1583, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 1745, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-team-crux - rotate: false - xy: 1393, 1043 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 1357, 1515 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -corvus-foot - rotate: false - xy: 1427, 289 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -corvus-joint-base - rotate: false - xy: 1827, 247 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -toxopid-joint-base - rotate: false - xy: 1827, 247 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 1455, 1515 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 1553, 1515 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 1651, 1487 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 1749, 1487 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 1847, 1487 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 1347, 1417 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 1347, 1319 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 1445, 1417 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 325, 193 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 455, 323 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 325, 63 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 455, 193 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 455, 63 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 595, 1233 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 595, 1103 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 595, 973 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 195, 1466 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 173, 1304 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 173, 1142 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 173, 980 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 173, 818 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 173, 656 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 173, 494 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 163, 332 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cyclone - rotate: false - xy: 1543, 1417 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -foreshadow - rotate: false - xy: 595, 843 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -fortress-leg - rotate: false - xy: 325, 1 - size: 80, 60 - orig: 80, 60 - offset: 0, 0 - index: -1 -fortress-outline - rotate: false - xy: 969, 606 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 1357, 1613 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 1459, 1613 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 1561, 1613 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 1723, 1193 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -gamma-outline - rotate: false - xy: 1967, 105 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 1967, 35 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -horizon-outline - rotate: false - xy: 1837, 1687 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 1911, 1691 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 1867, 1613 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 1941, 1617 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -large-bullet-mount-outline - rotate: false - xy: 1679, 55 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount-outline - rotate: false - xy: 715, 65 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount-outline - rotate: false - xy: 1823, 148 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 1009, 103 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mega-outline - rotate: false - xy: 1245, 1239 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck0 - rotate: false - xy: 1229, 1137 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck1 - rotate: false - xy: 831, 393 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck2 - rotate: false - xy: 933, 393 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 725, 911 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-outline - rotate: false - xy: 1589, 142 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 1589, 39 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 1935, 1384 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 1757, 719 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -omura-cannon-outline - rotate: false - xy: 195, 1770 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -quasar-leg - rotate: false - xy: 1937, 735 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-outline - rotate: false - xy: 1705, 481 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 1705, 399 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 1787, 473 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 1869, 473 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign-leg - rotate: false - xy: 357, 1493 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-weapon-outline - rotate: false - xy: 1742, 579 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 1401, 137 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-outline - rotate: false - xy: 1823, 68 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 1895, 167 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 1895, 87 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 1895, 7 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -scepter-leg - rotate: false - xy: 855, 1183 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-leg - rotate: false - xy: 855, 1183 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-outline - rotate: false - xy: 195, 1628 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck0 - rotate: false - xy: 389, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck1 - rotate: false - xy: 1, 1207 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck2 - rotate: false - xy: 561, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -sei-launcher-outline - rotate: false - xy: 1869, 391 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 855, 1053 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-outline - rotate: false - xy: 1757, 822 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 1561, 549 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 1853, 822 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 1427, 458 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid-foot - rotate: false - xy: 1523, 443 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -toxopid-leg - rotate: false - xy: 1685, 1687 - size: 150, 72 - orig: 150, 72 - offset: 0, 0 - index: -1 -toxopid-outline - rotate: false - xy: 875, 1715 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 1037, 1715 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 1199, 1715 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 1361, 1695 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -tsunami - rotate: false - xy: 1463, 829 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 1115, 1313 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 1935, 1318 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 665, 1431 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 1115, 1117 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 1683, 325 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -unit-mega-full - rotate: false - xy: 957, 495 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -unit-minke-full - rotate: false - xy: 1847, 719 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 1951, 473 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 1967, 245 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -unit-scepter-full - rotate: false - xy: 1, 1065 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-spiroct-full - rotate: false - xy: 1427, 381 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-toxopid-full - rotate: false - xy: 1523, 1695 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-vela-full - rotate: false - xy: 733, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-zenith-full - rotate: false - xy: 1243, 1601 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -vault-team-crux - rotate: false - xy: 1561, 703 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team-sharded - rotate: false - xy: 1659, 801 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vela-outline - rotate: false - xy: 1, 781 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-wreck0 - rotate: false - xy: 1, 639 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-wreck1 - rotate: false - xy: 1249, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-wreck2 - rotate: false - xy: 1, 497 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -zenith-outline - rotate: false - xy: 1115, 1199 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 855, 825 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 855, 711 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 855, 597 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -arkyid - rotate: false - xy: 807, 1443 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 937, 1443 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -atrax - rotate: false - xy: 1523, 377 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-cell - rotate: false - xy: 1519, 311 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -bryde - rotate: false - xy: 1907, 1907 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-cell - rotate: false - xy: 1907, 1765 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -corvus-base - rotate: false - xy: 1685, 1761 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -fortress - rotate: false - xy: 969, 770 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-cell - rotate: false - xy: 969, 688 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -gamma - rotate: false - xy: 1967, 175 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -horizon - rotate: false - xy: 1347, 1245 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-cell - rotate: false - xy: 1951, 399 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -mega - rotate: false - xy: 1663, 1585 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-cell - rotate: false - xy: 1765, 1585 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -minke - rotate: false - xy: 1615, 446 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-cell - rotate: false - xy: 725, 651 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -omura-cannon-heat - rotate: false - xy: 1, 1770 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -quasar - rotate: false - xy: 1909, 637 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-base - rotate: false - xy: 1909, 555 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-cell - rotate: false - xy: 1949, 817 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign-base - rotate: false - xy: 367, 1619 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-cell - rotate: false - xy: 521, 1619 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -risso - rotate: false - xy: 1751, 68 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-cell - rotate: false - xy: 1393, 945 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scepter - rotate: false - xy: 1, 1349 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-base - rotate: false - xy: 725, 521 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-base - rotate: false - xy: 725, 521 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-cell - rotate: false - xy: 855, 1313 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct - rotate: false - xy: 1561, 626 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-cell - rotate: false - xy: 1659, 724 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid - rotate: false - xy: 713, 1715 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-cell - rotate: false - xy: 511, 1493 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -vela - rotate: false - xy: 1, 923 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-cell - rotate: false - xy: 905, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-weapon-heat - rotate: false - xy: 1077, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -artillery-mount - rotate: false - xy: 1683, 253 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -beam-weapon - rotate: false - xy: 1827, 637 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -large-bullet-mount - rotate: false - xy: 1679, 154 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount - rotate: false - xy: 715, 259 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount - rotate: false - xy: 1751, 148 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -omura-cannon-heat - rotate: false - xy: 1, 1491 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -reign-weapon - rotate: false - xy: 1657, 563 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -sei-launcher - rotate: false - xy: 1787, 391 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -zenith - rotate: false - xy: 855, 939 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-cell - rotate: false - xy: 985, 1069 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 - -sprites4.png -size: 2048,1024 -format: rgba8888 -filter: nearest,nearest -repeat: none -launchpod - rotate: false - xy: 1201, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector - rotate: false - xy: 339, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-top - rotate: false - xy: 405, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender - rotate: false - xy: 785, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-top - rotate: false - xy: 785, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overdrive-projector - rotate: false - xy: 471, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-top - rotate: false - xy: 537, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shock-mine - rotate: false - xy: 819, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-arrow - rotate: false - xy: 425, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 445, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-bridge - rotate: false - xy: 445, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-end - rotate: false - xy: 462, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -center - rotate: false - xy: 462, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 133, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 133, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 133, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 133, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 167, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 190, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 190, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 187, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 187, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 187, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 201, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 224, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 224, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 221, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 221, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 221, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 235, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 258, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 258, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 255, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 255, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 493, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 493, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 507, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-0 - rotate: false - xy: 513, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-1 - rotate: false - xy: 513, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-2 - rotate: false - xy: 513, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-3 - rotate: false - xy: 513, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-0 - rotate: false - xy: 513, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-1 - rotate: false - xy: 530, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-2 - rotate: false - xy: 530, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-3 - rotate: false - xy: 527, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-0 - rotate: false - xy: 527, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-1 - rotate: false - xy: 527, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-2 - rotate: false - xy: 541, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-3 - rotate: false - xy: 547, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-0 - rotate: false - xy: 547, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-1 - rotate: false - xy: 547, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-2 - rotate: false - xy: 547, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-3 - rotate: false - xy: 547, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor - rotate: false - xy: 847, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-0 - rotate: false - xy: 881, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-1 - rotate: false - xy: 915, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-2 - rotate: false - xy: 813, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-edge - rotate: false - xy: 847, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-stack - rotate: false - xy: 881, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-1 - rotate: false - xy: 938, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-2 - rotate: false - xy: 938, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-3 - rotate: false - xy: 935, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-0 - rotate: false - xy: 935, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-1 - rotate: false - xy: 955, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-2 - rotate: false - xy: 955, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-3 - rotate: false - xy: 955, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-0 - rotate: false - xy: 955, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-1 - rotate: false - xy: 955, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-2 - rotate: false - xy: 171, 709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-3 - rotate: false - xy: 171, 675 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-0 - rotate: false - xy: 171, 641 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-1 - rotate: false - xy: 171, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-2 - rotate: false - xy: 171, 573 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-3 - rotate: false - xy: 205, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-0 - rotate: false - xy: 205, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-1 - rotate: false - xy: 205, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-2 - rotate: false - xy: 205, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-3 - rotate: false - xy: 205, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cross - rotate: false - xy: 581, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 541, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -inverted-sorter - rotate: false - xy: 615, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction - rotate: false - xy: 717, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overflow-gate - rotate: false - xy: 847, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor - rotate: false - xy: 881, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-arrow - rotate: false - xy: 915, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-bridge - rotate: false - xy: 881, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-end - rotate: false - xy: 915, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router - rotate: false - xy: 836, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter - rotate: false - xy: 819, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -underflow-gate - rotate: false - xy: 273, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 739, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-liquid - rotate: false - xy: 739, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill - rotate: false - xy: 1861, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 1927, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 207, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill - rotate: false - xy: 1131, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 1197, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 1263, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor - rotate: false - xy: 1923, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 67, 697 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 67, 631 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 67, 565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 241, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 323, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 391, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 479, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit - rotate: false - xy: 439, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 445, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 445, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 445, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 445, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 459, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 473, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 479, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 479, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 479, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 479, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 479, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 479, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 496, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 496, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 496, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 493, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction - rotate: false - xy: 731, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate - rotate: false - xy: 745, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate-top - rotate: false - xy: 751, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-bottom - rotate: false - xy: 751, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-liquid - rotate: false - xy: 751, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-top - rotate: false - xy: 751, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump - rotate: false - xy: 779, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-liquid - rotate: false - xy: 813, 617 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump-liquid - rotate: false - xy: 813, 617 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-pump-liquid - rotate: false - xy: 813, 617 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit - rotate: false - xy: 813, 549 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-arrow - rotate: false - xy: 847, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-bridge - rotate: false - xy: 813, 515 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-end - rotate: false - xy: 847, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-cap - rotate: false - xy: 813, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-0 - rotate: false - xy: 847, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-1 - rotate: false - xy: 813, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-2 - rotate: false - xy: 881, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-3 - rotate: false - xy: 915, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-4 - rotate: false - xy: 847, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-0 - rotate: false - xy: 847, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-1 - rotate: false - xy: 881, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-2 - rotate: false - xy: 915, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-4 - rotate: false - xy: 802, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 1659, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -logic-processor - rotate: false - xy: 1267, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-bank - rotate: false - xy: 273, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell - rotate: false - xy: 785, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message - rotate: false - xy: 785, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor - rotate: false - xy: 813, 583 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch - rotate: false - xy: 921, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch-on - rotate: false - xy: 921, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 255, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-top - rotate: false - xy: 241, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 459, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 459, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -diode - rotate: false - xy: 581, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -diode-arrow - rotate: false - xy: 598, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator - rotate: false - xy: 609, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-top - rotate: false - xy: 615, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node - rotate: false - xy: 881, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 1329, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source - rotate: false - xy: 915, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void - rotate: false - xy: 813, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 1725, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator-top - rotate: false - xy: 833, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel - rotate: false - xy: 819, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -steam-generator - rotate: false - xy: 1131, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-cap - rotate: false - xy: 1197, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-top - rotate: false - xy: 1263, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine0 - rotate: false - xy: 1329, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine1 - rotate: false - xy: 1395, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 1461, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 1659, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -blast-mixer - rotate: false - xy: 1, 697 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -coal-centrifuge - rotate: false - xy: 1, 103 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluid-mixer-bottom - rotate: false - xy: 1927, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluid-mixer-liquid - rotate: false - xy: 211, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluid-mixer-top - rotate: false - xy: 277, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 343, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 409, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 475, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 871, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -incinerator - rotate: false - xy: 615, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source - rotate: false - xy: 700, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void - rotate: false - xy: 717, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 937, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 1003, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 1003, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-source - rotate: false - xy: 768, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-void - rotate: false - xy: 765, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter - rotate: false - xy: 785, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-weaver - rotate: false - xy: 735, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 801, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 867, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 933, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 999, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulverizer - rotate: false - xy: 802, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-rotator - rotate: false - xy: 799, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 1461, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 471, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-liquid - rotate: false - xy: 537, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-spinner - rotate: false - xy: 603, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter - rotate: false - xy: 669, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press - rotate: false - xy: 735, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame0 - rotate: false - xy: 801, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame1 - rotate: false - xy: 867, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame2 - rotate: false - xy: 933, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 999, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 1065, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -boulder1 - rotate: false - xy: 1527, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -boulder2 - rotate: false - xy: 1577, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder1 - rotate: false - xy: 697, 651 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder2 - rotate: false - xy: 747, 651 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-boulder1 - rotate: false - xy: 870, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-boulder2 - rotate: false - xy: 904, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder1 - rotate: false - xy: 867, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder2 - rotate: false - xy: 901, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-boulder1 - rotate: false - xy: 1547, 509 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-boulder2 - rotate: false - xy: 1597, 509 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 1317, 509 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 1359, 509 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 1401, 509 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -container - rotate: false - xy: 1069, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team - rotate: false - xy: 1135, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unloader - rotate: false - xy: 239, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-center - rotate: false - xy: 273, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arc-heat - rotate: false - xy: 133, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 241, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 71, 767 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -hail-heat - rotate: false - xy: 1945, 407 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -lancer-heat - rotate: false - xy: 1135, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-heat - rotate: false - xy: 1857, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-heat - rotate: false - xy: 904, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 67, 433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-top - rotate: false - xy: 67, 367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 871, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center-team - rotate: false - xy: 1, 37 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rally-point - rotate: false - xy: 1527, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-base - rotate: false - xy: 836, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 1593, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall - rotate: false - xy: 564, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 1333, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door - rotate: false - xy: 598, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 607, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 673, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-open - rotate: false - xy: 595, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall - rotate: false - xy: 813, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 669, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall - rotate: false - xy: 915, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 1065, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large1 - rotate: false - xy: 141, 771 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 207, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 273, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 339, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall2 - rotate: false - xy: 867, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall3 - rotate: false - xy: 901, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall4 - rotate: false - xy: 833, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall5 - rotate: false - xy: 833, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall - rotate: false - xy: 921, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 1527, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall - rotate: false - xy: 921, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 1725, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titanium-wall - rotate: false - xy: 239, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 1791, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 1993, 969 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 821, 705 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -casing - rotate: false - xy: 1987, 473 - size: 8, 16 - orig: 8, 16 - offset: 0, 0 - index: -1 -circle-mid - rotate: false - xy: 975, 244 - size: 1, 199 - orig: 1, 199 - offset: 0, 0 - index: -1 -error - rotate: false - xy: 1147, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -laser - rotate: false - xy: 1977, 709 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -minelaser - rotate: false - xy: 1983, 709 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -missile - rotate: false - xy: 133, 677 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 133, 639 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -parallax-laser - rotate: false - xy: 975, 445 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -particle - rotate: false - xy: 1275, 509 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -scale_marker - rotate: false - xy: 1191, 603 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -shell - rotate: false - xy: 133, 601 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 133, 563 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -transfer - rotate: false - xy: 981, 449 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -transfer-arrow - rotate: false - xy: 239, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white - rotate: false - xy: 1197, 704 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -alpha-outline - rotate: false - xy: 1027, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 1077, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 1127, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 1177, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -arc - rotate: false - xy: 133, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arkyid-leg - rotate: false - xy: 67, 132 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -artillery-outline - rotate: false - xy: 1277, 701 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -atrax-foot - rotate: false - xy: 1945, 449 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -atrax-joint - rotate: false - xy: 175, 743 - size: 26, 26 - orig: 26, 26 - offset: 0, 0 - index: -1 -atrax-leg - rotate: false - xy: 137, 743 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-leg-base - rotate: false - xy: 133, 715 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -beta-outline - rotate: false - xy: 67, 20 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 1989, 835 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 1989, 779 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 1989, 723 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 241, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-full - rotate: false - xy: 241, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-boulder-full - rotate: false - xy: 1377, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 269, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-full - rotate: false - xy: 141, 837 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 275, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-full - rotate: false - xy: 277, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 275, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 275, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 275, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-full - rotate: false - xy: 1, 631 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 343, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-dacite-boulder-full - rotate: false - xy: 1427, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-full - rotate: false - xy: 275, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-full - rotate: false - xy: 275, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 292, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 292, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-full - rotate: false - xy: 289, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-full - rotate: false - xy: 289, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-full - rotate: false - xy: 289, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 303, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 309, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 309, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 309, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 309, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 309, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-full - rotate: false - xy: 326, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 1, 565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 326, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 323, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 409, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 323, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 337, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-full - rotate: false - xy: 343, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 343, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 343, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 343, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 343, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 360, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 360, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 1, 499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 357, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 475, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 357, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 1, 433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 357, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 371, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 377, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-full - rotate: false - xy: 377, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 541, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 377, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 377, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-full - rotate: false - xy: 377, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 1, 367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 394, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 394, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 394, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 607, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 1, 301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 391, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 391, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-full - rotate: false - xy: 405, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 411, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-full - rotate: false - xy: 1477, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 411, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-full - rotate: false - xy: 411, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 1987, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 411, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 673, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-spore-wall-full - rotate: false - xy: 411, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-full - rotate: false - xy: 1, 235 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 428, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-full - rotate: false - xy: 428, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 739, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 425, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 425, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 425, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 1, 169 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 805, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center-team-crux - rotate: false - xy: 937, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center-team-sharded - rotate: false - xy: 1003, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team-crux - rotate: false - xy: 1201, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team-sharded - rotate: false - xy: 1267, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -corvus-joint - rotate: false - xy: 67, 240 - size: 60, 60 - orig: 60, 60 - offset: 0, 0 - index: -1 -corvus-leg - rotate: false - xy: 949, 495 - size: 30, 68 - orig: 30, 68 - offset: 0, 0 - index: -1 -corvus-leg-base - rotate: false - xy: 307, 635 - size: 30, 64 - orig: 30, 64 - offset: 0, 0 - index: -1 -cracks-1-0 - rotate: false - xy: 564, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 561, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 561, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 561, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 575, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 581, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 581, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 581, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 1399, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 1465, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 1531, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 1597, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 1663, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 1729, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 1795, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 1861, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -crawler-leg - rotate: false - xy: 1777, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-outline - rotate: false - xy: 1827, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 1877, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 1927, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 647, 653 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 897, 657 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-outline - rotate: false - xy: 947, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 997, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 1047, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 1097, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 595, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -eruption-outline - rotate: false - xy: 1247, 643 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flamethrower-outline - rotate: false - xy: 1397, 651 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flare-outline - rotate: false - xy: 1497, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 1547, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 1597, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 1647, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 1, 953 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1, 883 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 595, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -heal-shotgun-weapon-outline - rotate: false - xy: 875, 707 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -heal-weapon-mount-outline - rotate: false - xy: 1797, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-outline - rotate: false - xy: 1847, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 1987, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 615, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 1993, 891 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 2029, 455 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1897, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 1797, 417 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 632, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 133, 401 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 1923, 425 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1947, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 1839, 417 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 629, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 2019, 891 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 1275, 575 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1997, 673 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 1881, 401 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 643, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 159, 401 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 417, 683 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1997, 623 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 897, 565 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 649, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 273, 607 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 949, 347 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1297, 601 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 939, 565 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 649, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 949, 469 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 1085, 507 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1347, 601 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 981, 567 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 666, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 981, 499 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 2029, 437 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 1397, 601 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 1023, 567 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 663, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 339, 675 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 1923, 407 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 1447, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 1065, 567 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 663, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 949, 443 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 1275, 557 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 1497, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 1107, 567 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 683, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 1007, 499 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 417, 665 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 1547, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 1149, 567 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 683, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 339, 649 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 435, 683 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 1597, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 1191, 551 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 683, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 365, 675 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 949, 329 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 1647, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 1233, 551 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 697, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 949, 417 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 1103, 507 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 1697, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 981, 525 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 697, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 949, 391 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 2029, 419 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 1747, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 1023, 525 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 717, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 1033, 499 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 435, 665 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 1797, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 1065, 525 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 717, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 365, 649 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 453, 683 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 1847, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 1069, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-artillery-outline - rotate: false - xy: 1947, 591 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-weapon-outline - rotate: false - xy: 1447, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 1107, 525 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 734, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 391, 675 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 1121, 507 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 1497, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 1149, 525 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 731, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 949, 365 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 2029, 401 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 1547, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 1191, 509 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 768, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 1059, 499 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 453, 665 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 1597, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 1233, 509 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 765, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 391, 649 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 471, 683 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 1647, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 1531, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-outline - rotate: false - xy: 1597, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 1663, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 1729, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 1795, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -missiles-mount-outline - rotate: false - xy: 1797, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-outline - rotate: false - xy: 1947, 541 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 1997, 523 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 847, 605 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 897, 607 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon-outline - rotate: false - xy: 997, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon-outline - rotate: false - xy: 1097, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 1197, 593 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-outline - rotate: false - xy: 125, 70 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 125, 12 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 183, 128 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 183, 70 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 603, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-outline - rotate: false - xy: 241, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 299, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 357, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 415, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-leg - rotate: false - xy: 1395, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulsar-outline - rotate: false - xy: 1, 823 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 71, 903 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 141, 963 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 1, 763 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 799, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 1791, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 1923, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scepter-weapon-outline - rotate: false - xy: 589, 655 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 870, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 405, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -small-basic-weapon-outline - rotate: false - xy: 1347, 551 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon-outline - rotate: false - xy: 1447, 509 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-foot - rotate: false - xy: 1897, 443 - size: 46, 46 - orig: 46, 46 - offset: 0, 0 - index: -1 -spiroct-joint - rotate: false - xy: 819, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spiroct-leg - rotate: false - xy: 1, 1 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-leg-base - rotate: false - xy: 1647, 523 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-weapon-outline - rotate: false - xy: 1747, 501 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 819, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 853, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 887, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 921, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 853, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 887, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 853, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 887, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 853, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 887, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 887, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 853, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 1593, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 1797, 509 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 647, 703 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 1847, 509 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 1647, 473 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 1897, 491 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 71, 833 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 1857, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 1947, 491 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 705, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 763, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 141, 903 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 67, 499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-missiles-outline - rotate: false - xy: 1847, 459 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 615, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 632, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 629, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 629, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 649, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 649, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 649, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 666, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 663, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 677, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 683, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 683, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 700, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 697, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 711, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 717, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 734, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 731, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 751, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 765, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 799, 296 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 67, 302 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 927, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 977, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -atrax-base - rotate: false - xy: 211, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -beta - rotate: false - xy: 67, 76 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-cell - rotate: false - xy: 1327, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler - rotate: false - xy: 1627, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 1677, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 1727, 709 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 797, 651 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 847, 655 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare - rotate: false - xy: 1447, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-base - rotate: false - xy: 805, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 129, 244 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mace - rotate: false - xy: 1333, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 1399, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 1465, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mono - rotate: false - xy: 1847, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-cell - rotate: false - xy: 1897, 541 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 129, 186 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 1147, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 125, 128 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 183, 12 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 132, 309 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 473, 701 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 71, 963 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 1247, 593 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 67, 190 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -vanguard - rotate: false - xy: 1997, 473 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -vanguard-cell - rotate: false - xy: 1697, 451 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -artillery - rotate: false - xy: 1227, 701 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -eruption - rotate: false - xy: 1197, 643 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 1297, 651 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 1347, 651 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 1993, 917 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 1697, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 1747, 659 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 1897, 591 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-weapon - rotate: false - xy: 1997, 573 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles - rotate: false - xy: 1697, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles-mount - rotate: false - xy: 1747, 559 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon - rotate: false - xy: 947, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 1047, 609 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scepter-weapon - rotate: false - xy: 531, 655 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -small-basic-weapon - rotate: false - xy: 1297, 551 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 1397, 551 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 1497, 509 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 1697, 501 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 1747, 451 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 1797, 459 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 - -sprites5.png -size: 2048,1024 -format: rgba8888 -filter: nearest,nearest -repeat: none -rubble-1-0 - rotate: false - xy: 1933, 723 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-1-1 - rotate: false - xy: 839, 363 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-2-0 - rotate: false - xy: 1335, 191 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-2-1 - rotate: false - xy: 1401, 191 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-3-0 - rotate: false - xy: 1237, 189 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rubble-4-0 - rotate: false - xy: 1827, 115 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -rubble-5-0 - rotate: false - xy: 1887, 387 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -rubble-6-0 - rotate: false - xy: 1043, 33 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -rubble-7-0 - rotate: false - xy: 817, 1 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -rubble-8-0 - rotate: false - xy: 1611, 463 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -scorch-0-0 - rotate: false - xy: 675, 347 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -scorch-0-1 - rotate: false - xy: 757, 347 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -scorch-0-2 - rotate: false - xy: 1957, 163 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -scorch-1-0 - rotate: false - xy: 1933, 901 - size: 110, 110 - orig: 110, 110 - offset: 0, 0 - index: -1 -scorch-1-1 - rotate: false - xy: 1933, 789 - size: 110, 110 - orig: 110, 110 - offset: 0, 0 - index: -1 -scorch-1-2 - rotate: false - xy: 1237, 33 - size: 110, 110 - orig: 110, 110 - offset: 0, 0 - index: -1 -scorch-2-0 - rotate: false - xy: 1887, 245 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -scorch-2-1 - rotate: false - xy: 1543, 145 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -scorch-2-2 - rotate: false - xy: 1685, 145 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -scorch-3-0 - rotate: false - xy: 1543, 287 - size: 170, 170 - orig: 170, 170 - offset: 0, 0 - index: -1 -scorch-3-1 - rotate: false - xy: 1715, 291 - size: 170, 170 - orig: 170, 170 - offset: 0, 0 - index: -1 -scorch-3-2 - rotate: false - xy: 1869, 549 - size: 170, 170 - orig: 170, 170 - offset: 0, 0 - index: -1 -scorch-4-0 - rotate: false - xy: 1139, 489 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -scorch-4-1 - rotate: false - xy: 1139, 287 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -scorch-4-2 - rotate: false - xy: 1341, 257 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -scorch-5-0 - rotate: false - xy: 675, 429 - size: 230, 230 - orig: 230, 230 - offset: 0, 0 - index: -1 -scorch-5-1 - rotate: false - xy: 907, 459 - size: 230, 230 - orig: 230, 230 - offset: 0, 0 - index: -1 -scorch-5-2 - rotate: false - xy: 907, 227 - size: 230, 230 - orig: 230, 230 - offset: 0, 0 - index: -1 -scorch-6-0 - rotate: false - xy: 293, 47 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -scorch-6-1 - rotate: false - xy: 555, 77 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -scorch-6-2 - rotate: false - xy: 1349, 459 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -scorch-7-0 - rotate: false - xy: 1, 17 - size: 290, 290 - orig: 290, 290 - offset: 0, 0 - index: -1 -scorch-7-1 - rotate: false - xy: 1349, 721 - size: 290, 290 - orig: 290, 290 - offset: 0, 0 - index: -1 -scorch-7-2 - rotate: false - xy: 1641, 721 - size: 290, 290 - orig: 290, 290 - offset: 0, 0 - index: -1 -scorch-8-0 - rotate: false - xy: 353, 339 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -scorch-8-1 - rotate: false - xy: 705, 691 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -scorch-8-2 - rotate: false - xy: 1027, 691 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -scorch-9-0 - rotate: false - xy: 1, 661 - size: 350, 350 - orig: 350, 350 - offset: 0, 0 - index: -1 -scorch-9-1 - rotate: false - xy: 1, 309 - size: 350, 350 - orig: 350, 350 - offset: 0, 0 - index: -1 -scorch-9-2 - rotate: false - xy: 353, 661 - size: 350, 350 - orig: 350, 350 - offset: 0, 0 - index: -1 - -sprites6.png -size: 2048,512 -format: rgba8888 -filter: nearest,nearest -repeat: none -basalt-edge - rotate: false - xy: 1, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -basalt1 - rotate: false - xy: 1561, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt2 - rotate: false - xy: 1595, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt3 - rotate: false - xy: 1629, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char1 - rotate: false - xy: 1663, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char2 - rotate: false - xy: 1697, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char3 - rotate: false - xy: 1731, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliff - rotate: false - xy: 1765, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal1 - rotate: false - xy: 1799, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal2 - rotate: false - xy: 1833, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal3 - rotate: false - xy: 1867, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper1 - rotate: false - xy: 1901, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper2 - rotate: false - xy: 1935, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper3 - rotate: false - xy: 1969, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters1 - rotate: false - xy: 2003, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters2 - rotate: false - xy: 491, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters3 - rotate: false - xy: 557, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters4 - rotate: false - xy: 655, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters5 - rotate: false - xy: 753, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters6 - rotate: false - xy: 851, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-edge - rotate: false - xy: 1, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dacite-wall-large - rotate: false - xy: 491, 35 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dacite-wall1 - rotate: false - xy: 851, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-wall2 - rotate: false - xy: 1411, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite1 - rotate: false - xy: 525, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite2 - rotate: false - xy: 655, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite3 - rotate: false - xy: 753, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-large - rotate: false - xy: 589, 133 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dark-metal1 - rotate: false - xy: 1445, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal2 - rotate: false - xy: 1479, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1 - rotate: false - xy: 1513, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-edge - rotate: false - xy: 99, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-2 - rotate: false - xy: 1561, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-edge - rotate: false - xy: 1, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-3 - rotate: false - xy: 1595, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-edge - rotate: false - xy: 99, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-4 - rotate: false - xy: 1629, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-edge - rotate: false - xy: 197, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-5 - rotate: false - xy: 1663, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-edge - rotate: false - xy: 1, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-6 - rotate: false - xy: 1697, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-edge - rotate: false - xy: 99, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-edge - rotate: false - xy: 197, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water - rotate: false - xy: 1833, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-edge - rotate: false - xy: 295, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water1 - rotate: false - xy: 1867, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water2 - rotate: false - xy: 1901, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water3 - rotate: false - xy: 1935, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water - rotate: false - xy: 1969, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-edge - rotate: false - xy: 1, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-water1 - rotate: false - xy: 2003, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water2 - rotate: false - xy: 591, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water3 - rotate: false - xy: 591, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand1 - rotate: false - xy: 1731, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand2 - rotate: false - xy: 1765, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand3 - rotate: false - xy: 1799, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater - rotate: false - xy: 625, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-edge - rotate: false - xy: 99, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dirt-edge - rotate: false - xy: 197, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dirt-wall-large - rotate: false - xy: 687, 231 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dirt-wall1 - rotate: false - xy: 787, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-wall2 - rotate: false - xy: 787, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt1 - rotate: false - xy: 625, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt2 - rotate: false - xy: 659, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt3 - rotate: false - xy: 659, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dune-wall-large - rotate: false - xy: 785, 329 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dune-wall1 - rotate: false - xy: 787, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dune-wall2 - rotate: false - xy: 821, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -edge - rotate: false - xy: 821, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -edge-stencil - rotate: false - xy: 295, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -edgier - rotate: false - xy: 821, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-edge - rotate: false - xy: 393, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -grass1 - rotate: false - xy: 855, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass2 - rotate: false - xy: 855, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass3 - rotate: false - xy: 855, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock1 - rotate: false - xy: 1547, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock2 - rotate: false - xy: 1581, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock3 - rotate: false - xy: 1615, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-edge - rotate: false - xy: 99, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow-edge - rotate: false - xy: 197, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow1 - rotate: false - xy: 1751, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow2 - rotate: false - xy: 1785, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow3 - rotate: false - xy: 1819, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-wall-large - rotate: false - xy: 883, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ice-wall1 - rotate: false - xy: 1853, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-wall2 - rotate: false - xy: 1887, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice1 - rotate: false - xy: 1649, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice2 - rotate: false - xy: 1683, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice3 - rotate: false - xy: 1717, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead1 - rotate: false - xy: 1921, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead2 - rotate: false - xy: 1955, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead3 - rotate: false - xy: 1989, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock1 - rotate: false - xy: 689, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock2 - rotate: false - xy: 689, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock3 - rotate: false - xy: 723, 195 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor - rotate: false - xy: 723, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2 - rotate: false - xy: 757, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-edge - rotate: false - xy: 295, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-3 - rotate: false - xy: 757, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-edge - rotate: false - xy: 393, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-5 - rotate: false - xy: 791, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-edge - rotate: false - xy: 491, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged-edge - rotate: false - xy: 197, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged1 - rotate: false - xy: 825, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged2 - rotate: false - xy: 791, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged3 - rotate: false - xy: 825, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-edge - rotate: false - xy: 295, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss-edge - rotate: false - xy: 393, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss1 - rotate: false - xy: 859, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss2 - rotate: false - xy: 859, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss3 - rotate: false - xy: 885, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud-edge - rotate: false - xy: 491, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mud1 - rotate: false - xy: 885, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud2 - rotate: false - xy: 919, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud3 - rotate: false - xy: 953, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal1 - rotate: false - xy: 919, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal2 - rotate: false - xy: 987, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal3 - rotate: false - xy: 953, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper1 - rotate: false - xy: 1021, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper2 - rotate: false - xy: 987, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper3 - rotate: false - xy: 1055, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead1 - rotate: false - xy: 1021, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead2 - rotate: false - xy: 1089, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead3 - rotate: false - xy: 1055, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap1 - rotate: false - xy: 1123, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap2 - rotate: false - xy: 1089, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap3 - rotate: false - xy: 1157, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium1 - rotate: false - xy: 1123, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium2 - rotate: false - xy: 1191, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium3 - rotate: false - xy: 1157, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium1 - rotate: false - xy: 1225, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium2 - rotate: false - xy: 1191, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium3 - rotate: false - xy: 1259, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles1 - rotate: false - xy: 1225, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles2 - rotate: false - xy: 1293, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles3 - rotate: false - xy: 1259, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pine - rotate: false - xy: 1411, 443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -salt - rotate: false - xy: 1327, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-edge - rotate: false - xy: 589, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salt-wall-large - rotate: false - xy: 949, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salt-wall1 - rotate: false - xy: 1293, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-wall2 - rotate: false - xy: 1361, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-edge - rotate: false - xy: 295, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sand-wall-large - rotate: false - xy: 1015, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-wall1 - rotate: false - xy: 1429, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-wall2 - rotate: false - xy: 1463, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water - rotate: false - xy: 1497, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-edge - rotate: false - xy: 393, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sand-water1 - rotate: false - xy: 1395, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water2 - rotate: false - xy: 1429, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water3 - rotate: false - xy: 1463, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand1 - rotate: false - xy: 1327, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand2 - rotate: false - xy: 1361, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand3 - rotate: false - xy: 1395, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap1 - rotate: false - xy: 1497, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap2 - rotate: false - xy: 1531, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap3 - rotate: false - xy: 1565, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-edge - rotate: false - xy: 491, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -shale-wall-large - rotate: false - xy: 1081, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-wall1 - rotate: false - xy: 1701, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-wall2 - rotate: false - xy: 1735, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale1 - rotate: false - xy: 1599, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale2 - rotate: false - xy: 1633, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale3 - rotate: false - xy: 1667, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-large - rotate: false - xy: 1147, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shrubs1 - rotate: false - xy: 1769, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs2 - rotate: false - xy: 1803, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag - rotate: false - xy: 1837, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-edge - rotate: false - xy: 589, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -snow-edge - rotate: false - xy: 687, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -snow-pine - rotate: false - xy: 1461, 443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-wall-large - rotate: false - xy: 1213, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snow-wall1 - rotate: false - xy: 1973, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-wall2 - rotate: false - xy: 1531, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow1 - rotate: false - xy: 1871, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow2 - rotate: false - xy: 1905, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow3 - rotate: false - xy: 1939, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn - rotate: false - xy: 1565, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-edge - rotate: false - xy: 393, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -spore-moss1 - rotate: false - xy: 1599, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss2 - rotate: false - xy: 1633, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss3 - rotate: false - xy: 1667, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-pine - rotate: false - xy: 1511, 443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-wall-large - rotate: false - xy: 1279, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-wall1 - rotate: false - xy: 1701, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-wall2 - rotate: false - xy: 1735, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-edge - rotate: false - xy: 491, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -stone-wall-large - rotate: false - xy: 1345, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -stone-wall1 - rotate: false - xy: 1871, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-wall2 - rotate: false - xy: 1905, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone1 - rotate: false - xy: 1769, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone2 - rotate: false - xy: 1803, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone3 - rotate: false - xy: 1837, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water - rotate: false - xy: 1939, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-edge - rotate: false - xy: 589, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tar - rotate: false - xy: 1973, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-edge - rotate: false - xy: 687, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tendrils1 - rotate: false - xy: 2007, 357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils2 - rotate: false - xy: 2007, 323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils3 - rotate: false - xy: 889, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium1 - rotate: false - xy: 923, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium2 - rotate: false - xy: 889, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium3 - rotate: false - xy: 957, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium1 - rotate: false - xy: 889, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium2 - rotate: false - xy: 923, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium3 - rotate: false - xy: 991, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water - rotate: false - xy: 923, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-edge - rotate: false - xy: 785, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 - -sprites7.png -size: 2048,1024 -format: rgba8888 -filter: nearest,nearest -repeat: none -additive-reconstructor-icon-editor - rotate: false - xy: 613, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory-icon-editor - rotate: false - xy: 1847, 925 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-icon-editor - rotate: false - xy: 711, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-icon-editor - rotate: false - xy: 1667, 627 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-icon-editor - rotate: false - xy: 423, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt-icon-editor - rotate: false - xy: 423, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt1 - rotate: false - xy: 423, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-icon-editor - rotate: false - xy: 423, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large-icon-editor - rotate: false - xy: 1945, 925 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill-icon-editor - rotate: false - xy: 1, 23 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-mixer-icon-editor - rotate: false - xy: 1397, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border-editor - rotate: false - xy: 423, 273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-forge-icon-editor - rotate: false - xy: 809, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-loader-icon-editor - rotate: false - xy: 227, 281 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader-icon-editor - rotate: false - xy: 227, 183 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -boulder-icon-editor - rotate: false - xy: 1793, 843 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -bridge-conduit-icon-editor - rotate: false - xy: 423, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-icon-editor - rotate: false - xy: 327, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char-icon-editor - rotate: false - xy: 361, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char1 - rotate: false - xy: 361, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear-editor - rotate: false - xy: 2043, 1020 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -cliff-icon-editor - rotate: false - xy: 1009, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-editor - rotate: false - xy: 1463, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -combustion-generator-icon-editor - rotate: false - xy: 1043, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -command-center-icon-editor - rotate: false - xy: 1529, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conduit-icon-editor - rotate: false - xy: 1077, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -container-icon-editor - rotate: false - xy: 1595, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conveyor-icon-editor - rotate: false - xy: 1111, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-icon-editor - rotate: false - xy: 1145, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large-icon-editor - rotate: false - xy: 1661, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation-icon-editor - rotate: false - xy: 323, 409 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-icon-editor - rotate: false - xy: 613, 861 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-icon-editor - rotate: false - xy: 517, 635 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -craters-icon-editor - rotate: false - xy: 1179, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters1 - rotate: false - xy: 1179, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cryofluid-mixer-icon-editor - rotate: false - xy: 1727, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-icon-editor - rotate: false - xy: 943, 501 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cyclone-icon-editor - rotate: false - xy: 131, 55 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dacite-boulder-icon-editor - rotate: false - xy: 1667, 711 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-icon-editor - rotate: false - xy: 1213, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite1 - rotate: false - xy: 1213, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-wall-icon-editor - rotate: false - xy: 1247, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-icon-editor - rotate: false - xy: 1281, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-icon-editor - rotate: false - xy: 1315, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-1 - rotate: false - xy: 1315, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-icon-editor - rotate: false - xy: 1349, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-2 - rotate: false - xy: 1349, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-icon-editor - rotate: false - xy: 649, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-3 - rotate: false - xy: 649, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-icon-editor - rotate: false - xy: 683, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-4 - rotate: false - xy: 683, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-icon-editor - rotate: false - xy: 717, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-5 - rotate: false - xy: 717, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-icon-editor - rotate: false - xy: 751, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-6 - rotate: false - xy: 751, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-icon-editor - rotate: false - xy: 785, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand1 - rotate: false - xy: 785, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-editor - rotate: false - xy: 819, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-icon-editor - rotate: false - xy: 853, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-icon-editor - rotate: false - xy: 887, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-deepwater - rotate: false - xy: 887, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator-icon-editor - rotate: false - xy: 517, 537 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -diode-icon-editor - rotate: false - xy: 395, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-icon-editor - rotate: false - xy: 1383, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt1 - rotate: false - xy: 1383, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-wall-icon-editor - rotate: false - xy: 1793, 809 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -disassembler-icon-editor - rotate: false - xy: 325, 311 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -distributor-icon-editor - rotate: false - xy: 1007, 729 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-icon-editor - rotate: false - xy: 1783, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large-icon-editor - rotate: false - xy: 1007, 663 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dune-wall-icon-editor - rotate: false - xy: 1717, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -duo-icon-editor - rotate: false - xy: 1717, 693 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt2 - rotate: false - xy: 1717, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt3 - rotate: false - xy: 1701, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char2 - rotate: false - xy: 1735, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char3 - rotate: false - xy: 985, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters2 - rotate: false - xy: 1019, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters3 - rotate: false - xy: 1053, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite2 - rotate: false - xy: 1087, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite3 - rotate: false - xy: 1121, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water1 - rotate: false - xy: 1223, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water2 - rotate: false - xy: 1257, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water3 - rotate: false - xy: 1291, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water1 - rotate: false - xy: 1325, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water2 - rotate: false - xy: 1359, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water3 - rotate: false - xy: 1393, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand2 - rotate: false - xy: 1155, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand3 - rotate: false - xy: 1189, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt2 - rotate: false - xy: 1817, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt3 - rotate: false - xy: 1851, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass1 - rotate: false - xy: 1885, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-icon-editor - rotate: false - xy: 1885, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass2 - rotate: false - xy: 1919, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass3 - rotate: false - xy: 1953, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock1 - rotate: false - xy: 1987, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-editor - rotate: false - xy: 1987, 793 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock2 - rotate: false - xy: 1851, 759 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock3 - rotate: false - xy: 1885, 759 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow1 - rotate: false - xy: 425, 205 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-editor - rotate: false - xy: 425, 205 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow2 - rotate: false - xy: 425, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow3 - rotate: false - xy: 425, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice1 - rotate: false - xy: 1919, 759 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-editor - rotate: false - xy: 1919, 759 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice2 - rotate: false - xy: 1953, 759 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice3 - rotate: false - xy: 1987, 759 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock1 - rotate: false - xy: 429, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock-icon-editor - rotate: false - xy: 429, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock2 - rotate: false - xy: 429, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock3 - rotate: false - xy: 231, 51 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor - rotate: false - xy: 265, 51 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-editor - rotate: false - xy: 265, 51 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-2 - rotate: false - xy: 231, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-icon-editor - rotate: false - xy: 231, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-3 - rotate: false - xy: 265, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-editor - rotate: false - xy: 265, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-5 - rotate: false - xy: 299, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-editor - rotate: false - xy: 299, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged1 - rotate: false - xy: 333, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-editor - rotate: false - xy: 333, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged2 - rotate: false - xy: 367, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged3 - rotate: false - xy: 299, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss1 - rotate: false - xy: 333, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-editor - rotate: false - xy: 333, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss2 - rotate: false - xy: 367, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss3 - rotate: false - xy: 401, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud1 - rotate: false - xy: 435, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud-icon-editor - rotate: false - xy: 435, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud2 - rotate: false - xy: 401, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud3 - rotate: false - xy: 435, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal1 - rotate: false - xy: 985, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal2 - rotate: false - xy: 1019, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal3 - rotate: false - xy: 1053, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper1 - rotate: false - xy: 1087, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper2 - rotate: false - xy: 1121, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper3 - rotate: false - xy: 1155, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead1 - rotate: false - xy: 1189, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead2 - rotate: false - xy: 1223, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead3 - rotate: false - xy: 1257, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap1 - rotate: false - xy: 1291, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap2 - rotate: false - xy: 1325, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap3 - rotate: false - xy: 1359, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium1 - rotate: false - xy: 1393, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium2 - rotate: false - xy: 457, 405 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium3 - rotate: false - xy: 491, 405 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium1 - rotate: false - xy: 457, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium2 - rotate: false - xy: 525, 405 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium3 - rotate: false - xy: 457, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles1 - rotate: false - xy: 491, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles2 - rotate: false - xy: 559, 405 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles3 - rotate: false - xy: 457, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-salt - rotate: false - xy: 491, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-editor - rotate: false - xy: 491, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water1 - rotate: false - xy: 491, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water2 - rotate: false - xy: 525, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water3 - rotate: false - xy: 559, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand1 - rotate: false - xy: 525, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-editor - rotate: false - xy: 525, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand2 - rotate: false - xy: 593, 405 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand3 - rotate: false - xy: 457, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale1 - rotate: false - xy: 491, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-editor - rotate: false - xy: 491, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale2 - rotate: false - xy: 525, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale3 - rotate: false - xy: 559, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-slag - rotate: false - xy: 593, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-icon-editor - rotate: false - xy: 593, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow1 - rotate: false - xy: 525, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow2 - rotate: false - xy: 559, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow3 - rotate: false - xy: 593, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spawn - rotate: false - xy: 559, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss1 - rotate: false - xy: 593, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-icon-editor - rotate: false - xy: 593, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss2 - rotate: false - xy: 593, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss3 - rotate: false - xy: 627, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone1 - rotate: false - xy: 627, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-icon-editor - rotate: false - xy: 627, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone2 - rotate: false - xy: 661, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone3 - rotate: false - xy: 627, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tainted-water - rotate: false - xy: 661, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-icon-editor - rotate: false - xy: 661, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tar - rotate: false - xy: 695, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-icon-editor - rotate: false - xy: 695, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils1 - rotate: false - xy: 627, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils2 - rotate: false - xy: 661, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils3 - rotate: false - xy: 695, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-water - rotate: false - xy: 729, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-icon-editor - rotate: false - xy: 729, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -exponential-reconstructor-icon-editor - rotate: false - xy: 1, 153 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -force-projector-icon-editor - rotate: false - xy: 325, 213 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -foreshadow-icon-editor - rotate: false - xy: 937, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -fuse-icon-editor - rotate: false - xy: 615, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press-icon-editor - rotate: false - xy: 1073, 729 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ground-factory-icon-editor - rotate: false - xy: 615, 567 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hail-icon-editor - rotate: false - xy: 661, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hyper-processor-icon-editor - rotate: false - xy: 713, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-wall-icon-editor - rotate: false - xy: 695, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-icon-editor - rotate: false - xy: 729, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-editor - rotate: false - xy: 1067, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -incinerator-icon-editor - rotate: false - xy: 763, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -inverted-sorter-icon-editor - rotate: false - xy: 695, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-editor - rotate: false - xy: 729, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-editor - rotate: false - xy: 763, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-editor - rotate: false - xy: 797, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln-icon-editor - rotate: false - xy: 1007, 597 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -lancer-icon-editor - rotate: false - xy: 1073, 663 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-logic-display-icon-editor - rotate: false - xy: 323, 539 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -laser-drill-icon-editor - rotate: false - xy: 713, 567 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-icon-editor - rotate: false - xy: 811, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large-icon-editor - rotate: false - xy: 1197, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -liquid-junction-icon-editor - rotate: false - xy: 729, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-icon-editor - rotate: false - xy: 763, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-source-icon-editor - rotate: false - xy: 797, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-icon-editor - rotate: false - xy: 811, 567 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-void-icon-editor - rotate: false - xy: 831, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-display-icon-editor - rotate: false - xy: 229, 85 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor-icon-editor - rotate: false - xy: 1139, 729 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver-icon-editor - rotate: false - xy: 327, 115 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill-icon-editor - rotate: false - xy: 1073, 597 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-pump-icon-editor - rotate: false - xy: 763, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -meltdown-icon-editor - rotate: false - xy: 1327, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -melter-icon-editor - rotate: false - xy: 797, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -memory-bank-icon-editor - rotate: false - xy: 1139, 663 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell-icon-editor - rotate: false - xy: 831, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mend-projector-icon-editor - rotate: false - xy: 1205, 729 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender-icon-editor - rotate: false - xy: 865, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message-icon-editor - rotate: false - xy: 797, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor-icon-editor - rotate: false - xy: 831, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press-icon-editor - rotate: false - xy: 453, 439 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-icon-editor - rotate: false - xy: 775, 861 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory-icon-editor - rotate: false - xy: 551, 439 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-icon-editor - rotate: false - xy: 649, 469 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-icon-editor - rotate: false - xy: 747, 469 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector-icon-editor - rotate: false - xy: 1139, 597 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overflow-gate-icon-editor - rotate: false - xy: 865, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -parallax-icon-editor - rotate: false - xy: 1205, 663 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -payload-conveyor-icon-editor - rotate: false - xy: 845, 469 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon-editor - rotate: false - xy: 1847, 827 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pebbles-icon-editor - rotate: false - xy: 831, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-icon-editor - rotate: false - xy: 865, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-icon-editor - rotate: false - xy: 865, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-icon-editor - rotate: false - xy: 627, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large-icon-editor - rotate: false - xy: 1271, 729 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-icon-editor - rotate: false - xy: 1205, 597 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pine-icon-editor - rotate: false - xy: 1733, 777 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-editor - rotate: false - xy: 1271, 663 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-conveyor-icon-editor - rotate: false - xy: 661, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-icon-editor - rotate: false - xy: 695, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large-icon-editor - rotate: false - xy: 1271, 597 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plated-conduit-icon-editor - rotate: false - xy: 729, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-editor - rotate: false - xy: 1337, 729 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-node-icon-editor - rotate: false - xy: 763, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large-icon-editor - rotate: false - xy: 1337, 663 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source-icon-editor - rotate: false - xy: 797, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void-icon-editor - rotate: false - xy: 831, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-icon-editor - rotate: false - xy: 865, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-icon-editor - rotate: false - xy: 899, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-editor - rotate: false - xy: 1337, 597 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-icon-editor - rotate: false - xy: 899, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point-icon-editor - rotate: false - xy: 1009, 531 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ripple-icon-editor - rotate: false - xy: 1945, 827 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rotary-pump-icon-editor - rotate: false - xy: 1075, 531 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -router-icon-editor - rotate: false - xy: 899, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator-icon-editor - rotate: false - xy: 1141, 531 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salt-wall-icon-editor - rotate: false - xy: 899, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo-icon-editor - rotate: false - xy: 1207, 531 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-boulder-icon-editor - rotate: false - xy: 899, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-wall-icon-editor - rotate: false - xy: 459, 235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-editor - rotate: false - xy: 459, 201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scatter-icon-editor - rotate: false - xy: 1273, 531 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-icon-editor - rotate: false - xy: 493, 235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-editor - rotate: false - xy: 1457, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-editor - rotate: false - xy: 907, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-icon-editor - rotate: false - xy: 459, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-editor - rotate: false - xy: 1339, 531 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -segment-icon-editor - rotate: false - xy: 1403, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-icon-editor - rotate: false - xy: 1403, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-boulder-icon-editor - rotate: false - xy: 493, 201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-wall-icon-editor - rotate: false - xy: 527, 235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shock-mine-icon-editor - rotate: false - xy: 493, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-icon-editor - rotate: false - xy: 527, 201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -silicon-crucible-icon-editor - rotate: false - xy: 909, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter-icon-editor - rotate: false - xy: 1469, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snow-boulder-icon-editor - rotate: false - xy: 1667, 661 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-icon-editor - rotate: false - xy: 561, 235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-pine-icon-editor - rotate: false - xy: 131, 5 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-wall-icon-editor - rotate: false - xy: 527, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-icon-editor - rotate: false - xy: 561, 201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large-icon-editor - rotate: false - xy: 909, 567 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sorter-icon-editor - rotate: false - xy: 561, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn-icon-editor - rotate: false - xy: 463, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spectre-icon-editor - rotate: false - xy: 1587, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spore-cluster-icon-editor - rotate: false - xy: 943, 459 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-pine-icon-editor - rotate: false - xy: 181, 5 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-press-icon-editor - rotate: false - xy: 1403, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-wall-icon-editor - rotate: false - xy: 463, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -steam-generator-icon-editor - rotate: false - xy: 1469, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -stone-wall-icon-editor - rotate: false - xy: 497, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-tower-icon-editor - rotate: false - xy: 1535, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-icon-editor - rotate: false - xy: 497, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large-icon-editor - rotate: false - xy: 1469, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -swarmer-icon-editor - rotate: false - xy: 1535, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -switch-icon-editor - rotate: false - xy: 531, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils-icon-editor - rotate: false - xy: 531, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tetrative-reconstructor-icon-editor - rotate: false - xy: 323, 733 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -thermal-generator-icon-editor - rotate: false - xy: 1601, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump-icon-editor - rotate: false - xy: 1005, 795 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-icon-editor - rotate: false - xy: 1103, 795 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-wall-icon-editor - rotate: false - xy: 565, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-editor - rotate: false - xy: 1535, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster-icon-editor - rotate: false - xy: 1717, 893 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-editor - rotate: false - xy: 565, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-icon-editor - rotate: false - xy: 469, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-editor - rotate: false - xy: 1601, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -tsunami-icon-editor - rotate: false - xy: 1201, 795 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -underflow-gate-icon-editor - rotate: false - xy: 469, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-icon-editor - rotate: false - xy: 503, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault-icon-editor - rotate: false - xy: 1299, 795 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -water-extractor-icon-editor - rotate: false - xy: 1667, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-icon-editor - rotate: false - xy: 1601, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -white-tree-dead-icon-editor - rotate: false - xy: 1, 701 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-icon-editor - rotate: false - xy: 1, 379 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 - -sprites8.png -size: 2048,1024 -format: rgba8888 -filter: nearest,nearest -repeat: none -alpha-bg - rotate: false - xy: 1, 528 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -bar - rotate: false - xy: 1048, 560 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 1455, 483 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -block-additive-reconstructor-large - rotate: false - xy: 2007, 983 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-additive-reconstructor-medium - rotate: false - xy: 1627, 618 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-additive-reconstructor-small - rotate: false - xy: 1013, 359 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-additive-reconstructor-tiny - rotate: false - xy: 327, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-additive-reconstructor-xlarge - rotate: false - xy: 1, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-air-factory-large - rotate: false - xy: 2007, 941 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-air-factory-medium - rotate: false - xy: 1665, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-air-factory-small - rotate: false - xy: 2023, 881 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-air-factory-tiny - rotate: false - xy: 881, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-air-factory-xlarge - rotate: false - xy: 131, 608 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-alloy-smelter-large - rotate: false - xy: 651, 274 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-alloy-smelter-medium - rotate: false - xy: 1699, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-alloy-smelter-small - rotate: false - xy: 2023, 855 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 899, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-alloy-smelter-xlarge - rotate: false - xy: 771, 928 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-large - rotate: false - xy: 551, 141 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-arc-medium - rotate: false - xy: 2014, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-arc-small - rotate: false - xy: 2023, 829 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 917, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-arc-xlarge - rotate: false - xy: 259, 819 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-armored-conveyor-large - rotate: false - xy: 451, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-armored-conveyor-medium - rotate: false - xy: 1909, 689 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-small - rotate: false - xy: 2023, 803 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 935, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-armored-conveyor-xlarge - rotate: false - xy: 1, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-basalt-large - rotate: false - xy: 646, 232 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-basalt-medium - rotate: false - xy: 1989, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-small - rotate: false - xy: 781, 690 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-basalt-tiny - rotate: false - xy: 953, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-basalt-xlarge - rotate: false - xy: 51, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-large - rotate: false - xy: 401, 34 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 443, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 1661, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-large-small - rotate: false - xy: 1251, 427 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 971, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-large-xlarge - rotate: false - xy: 131, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-medium - rotate: false - xy: 1695, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 1420, 461 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 989, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-xlarge - rotate: false - xy: 181, 608 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-drill-large - rotate: false - xy: 501, 100 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 351, 6 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 1277, 427 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 1007, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-drill-xlarge - rotate: false - xy: 259, 769 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-mixer-large - rotate: false - xy: 543, 99 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 881, 563 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 1303, 427 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 1025, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 1, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-forge-large - rotate: false - xy: 593, 133 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 915, 563 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 1329, 427 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-tiny - rotate: false - xy: 1043, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-forge-xlarge - rotate: false - xy: 51, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-loader-large - rotate: false - xy: 585, 91 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-loader-medium - rotate: false - xy: 877, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-loader-small - rotate: false - xy: 1484, 489 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-loader-tiny - rotate: false - xy: 1061, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-loader-xlarge - rotate: false - xy: 181, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-unloader-large - rotate: false - xy: 493, 58 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-unloader-medium - rotate: false - xy: 877, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-unloader-small - rotate: false - xy: 1510, 489 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-unloader-tiny - rotate: false - xy: 1079, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-unloader-xlarge - rotate: false - xy: 259, 719 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-boulder-large - rotate: false - xy: 535, 57 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-boulder-medium - rotate: false - xy: 911, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-boulder-small - rotate: false - xy: 1355, 433 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-boulder-tiny - rotate: false - xy: 1097, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-boulder-xlarge - rotate: false - xy: 1, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conduit-large - rotate: false - xy: 577, 49 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 877, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 1115, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 331, 598 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conduit-xlarge - rotate: false - xy: 51, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conveyor-large - rotate: false - xy: 485, 16 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 911, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1081, 375 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 1096, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conveyor-xlarge - rotate: false - xy: 259, 669 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-large - rotate: false - xy: 527, 15 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 877, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 1076, 349 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 464, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-char-xlarge - rotate: false - xy: 1, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliff-large - rotate: false - xy: 569, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliff-medium - rotate: false - xy: 911, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliff-small - rotate: false - xy: 1446, 457 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliff-tiny - rotate: false - xy: 309, 672 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliff-xlarge - rotate: false - xy: 51, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-coal-centrifuge-large - rotate: false - xy: 751, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 877, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 1472, 457 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 1534, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-coal-centrifuge-xlarge - rotate: false - xy: 1, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-combustion-generator-large - rotate: false - xy: 751, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 911, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1498, 463 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 1552, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-combustion-generator-xlarge - rotate: false - xy: 51, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-command-center-large - rotate: false - xy: 793, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 911, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 1524, 463 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 331, 580 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-command-center-xlarge - rotate: false - xy: 1, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conduit-large - rotate: false - xy: 751, 452 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 877, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 1107, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 1510, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conduit-xlarge - rotate: false - xy: 51, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-container-large - rotate: false - xy: 793, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 911, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 1102, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 1563, 495 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-container-xlarge - rotate: false - xy: 1, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conveyor-large - rotate: false - xy: 835, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 872, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 1102, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 1570, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conveyor-xlarge - rotate: false - xy: 51, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-large - rotate: false - xy: 751, 410 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 793, 452 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 906, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 1102, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 1534, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-large-xlarge - rotate: false - xy: 1, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-medium - rotate: false - xy: 869, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1102, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 1552, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-xlarge - rotate: false - xy: 51, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-foundation-large - rotate: false - xy: 835, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 903, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1096, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 1570, 198 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-foundation-xlarge - rotate: false - xy: 1, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-nucleus-large - rotate: false - xy: 793, 410 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 1133, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 1096, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 1588, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-nucleus-xlarge - rotate: false - xy: 51, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-shard-large - rotate: false - xy: 835, 452 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 1167, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1141, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 1588, 198 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-shard-xlarge - rotate: false - xy: 51, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-craters-large - rotate: false - xy: 835, 410 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 1201, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 1133, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 1510, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-craters-xlarge - rotate: false - xy: 857, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-large - rotate: false - xy: 751, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-medium - rotate: false - xy: 1235, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-small - rotate: false - xy: 1128, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-tiny - rotate: false - xy: 1528, 185 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-xlarge - rotate: false - xy: 907, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 793, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 1269, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 1128, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 1546, 185 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cultivator-xlarge - rotate: false - xy: 957, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cyclone-large - rotate: false - xy: 835, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 1303, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 1128, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 1528, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cyclone-xlarge - rotate: false - xy: 1007, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-boulder-large - rotate: false - xy: 746, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-boulder-medium - rotate: false - xy: 1337, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-boulder-small - rotate: false - xy: 1128, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-boulder-tiny - rotate: false - xy: 1546, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-boulder-xlarge - rotate: false - xy: 1057, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-large - rotate: false - xy: 788, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-medium - rotate: false - xy: 1371, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-small - rotate: false - xy: 1122, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-tiny - rotate: false - xy: 1564, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-wall-large - rotate: false - xy: 830, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-wall-medium - rotate: false - xy: 1405, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-small - rotate: false - xy: 1122, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-wall-tiny - rotate: false - xy: 1582, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-wall-xlarge - rotate: false - xy: 1107, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-xlarge - rotate: false - xy: 1157, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-metal-large - rotate: false - xy: 701, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 1439, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 1167, 395 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1564, 162 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-metal-xlarge - rotate: false - xy: 1207, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-1-large - rotate: false - xy: 743, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 1473, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 1193, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1582, 162 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-1-xlarge - rotate: false - xy: 1257, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-2-large - rotate: false - xy: 785, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 1507, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 1219, 399 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 1600, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-2-xlarge - rotate: false - xy: 1307, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-3-large - rotate: false - xy: 827, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 1541, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 1159, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 1600, 162 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge - rotate: false - xy: 1357, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-4-large - rotate: false - xy: 635, 133 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 1575, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 1154, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 1330, 205 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-4-xlarge - rotate: false - xy: 1407, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-5-large - rotate: false - xy: 627, 91 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 1943, 681 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 1154, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 1348, 205 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-5-xlarge - rotate: false - xy: 1457, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-6-large - rotate: false - xy: 619, 49 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 949, 563 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 1154, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 1408, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-6-xlarge - rotate: false - xy: 1507, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-large - rotate: false - xy: 611, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 945, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 1154, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 669, 91 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 945, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 1148, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 1426, 205 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-xlarge - rotate: false - xy: 1557, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-tiny - rotate: false - xy: 1536, 495 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 661, 49 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 945, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 1148, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 1550, 477 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-xlarge - rotate: false - xy: 1607, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-xlarge - rotate: false - xy: 1657, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-deepwater-large - rotate: false - xy: 653, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 945, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 1581, 524 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 1568, 477 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-deepwater-xlarge - rotate: false - xy: 1707, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-differential-generator-large - rotate: false - xy: 703, 49 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 945, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 1607, 524 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 1586, 480 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-differential-generator-xlarge - rotate: false - xy: 1757, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-diode-large - rotate: false - xy: 695, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 945, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 1633, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 1604, 480 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-diode-xlarge - rotate: false - xy: 1807, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dirt-large - rotate: false - xy: 737, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-medium - rotate: false - xy: 940, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-small - rotate: false - xy: 1659, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-tiny - rotate: false - xy: 1563, 459 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dirt-wall-large - rotate: false - xy: 646, 190 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-wall-medium - rotate: false - xy: 937, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-small - rotate: false - xy: 1685, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-wall-tiny - rotate: false - xy: 1563, 441 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dirt-wall-xlarge - rotate: false - xy: 1857, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dirt-xlarge - rotate: false - xy: 1907, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-disassembler-large - rotate: false - xy: 821, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 1609, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 1711, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 1563, 423 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-disassembler-xlarge - rotate: false - xy: 1957, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-distributor-large - rotate: false - xy: 863, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 1643, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 1737, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 1563, 405 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-distributor-xlarge - rotate: false - xy: 345, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-large - rotate: false - xy: 905, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 947, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 1677, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 1763, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 1563, 387 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-large-xlarge - rotate: false - xy: 395, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-medium - rotate: false - xy: 1711, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 1789, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 1581, 459 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-xlarge - rotate: false - xy: 445, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dune-wall-large - rotate: false - xy: 989, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dune-wall-medium - rotate: false - xy: 1729, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-small - rotate: false - xy: 1815, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dune-wall-tiny - rotate: false - xy: 1581, 441 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dune-wall-xlarge - rotate: false - xy: 495, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-duo-large - rotate: false - xy: 1031, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 1733, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 1841, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 1581, 423 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge - rotate: false - xy: 545, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-large - rotate: false - xy: 1073, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-medium - rotate: false - xy: 1745, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-small - rotate: false - xy: 1867, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-tiny - rotate: false - xy: 1581, 405 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-xlarge - rotate: false - xy: 595, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-force-projector-large - rotate: false - xy: 1115, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 1763, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 1893, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 1581, 387 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-force-projector-xlarge - rotate: false - xy: 645, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-foreshadow-large - rotate: false - xy: 1157, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-foreshadow-medium - rotate: false - xy: 1767, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-foreshadow-small - rotate: false - xy: 1919, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-foreshadow-tiny - rotate: false - xy: 1575, 369 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-foreshadow-xlarge - rotate: false - xy: 695, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fuse-large - rotate: false - xy: 1199, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 1779, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 1945, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 1575, 351 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 101, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 1241, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1797, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 1971, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 1575, 333 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 101, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 1283, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 1801, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1997, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 1575, 315 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 101, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ground-factory-large - rotate: false - xy: 1325, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ground-factory-medium - rotate: false - xy: 1813, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-small - rotate: false - xy: 2023, 519 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ground-factory-tiny - rotate: false - xy: 1599, 462 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ground-factory-xlarge - rotate: false - xy: 101, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 1367, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 1831, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 1581, 498 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 1599, 444 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 101, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 1409, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 1835, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 1607, 498 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 1599, 426 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 101, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hyper-processor-large - rotate: false - xy: 1451, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hyper-processor-medium - rotate: false - xy: 1847, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hyper-processor-small - rotate: false - xy: 1633, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hyper-processor-tiny - rotate: false - xy: 1599, 408 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hyper-processor-xlarge - rotate: false - xy: 101, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 1493, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 1865, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 1659, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 1535, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1869, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1685, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1599, 390 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 101, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1593, 369 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-large - rotate: false - xy: 1577, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-wall-medium - rotate: false - xy: 1903, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-small - rotate: false - xy: 1711, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-wall-tiny - rotate: false - xy: 1593, 351 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-xlarge - rotate: false - xy: 101, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 101, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-illuminator-large - rotate: false - xy: 1619, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 1937, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 1737, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 1593, 333 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge - rotate: false - xy: 231, 608 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 1661, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 1881, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 1763, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 1593, 315 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 231, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 1703, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 1899, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 1789, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1596, 297 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 745, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 1745, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1933, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 1815, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1596, 279 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 151, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 1787, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1915, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 1841, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1596, 261 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 151, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 1829, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 1949, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 1867, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 1596, 243 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 201, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 1871, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 1967, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 1893, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 1617, 462 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 151, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 1913, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 1971, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 1919, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 1617, 444 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 201, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 1955, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 1977, 681 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 1945, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 1617, 426 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 151, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-large-logic-display-large - rotate: false - xy: 845, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-large-logic-display-medium - rotate: false - xy: 1983, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-large-logic-display-small - rotate: false - xy: 1971, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-large-logic-display-tiny - rotate: false - xy: 1617, 408 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-large-logic-display-xlarge - rotate: false - xy: 201, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 887, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 2001, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 1997, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1617, 390 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 151, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 929, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 971, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 2005, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 2023, 493 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 1611, 372 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 201, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1989, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 1355, 407 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1611, 354 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 151, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 1013, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1988, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 1381, 433 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 1611, 336 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 201, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 1055, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 1987, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 1381, 407 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1611, 318 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 151, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 1097, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 1986, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 1407, 434 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1614, 300 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 201, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 1139, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 869, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 1407, 408 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1614, 282 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 151, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-void-large - rotate: false - xy: 1181, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 903, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-void-small - rotate: false - xy: 1433, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-void-tiny - rotate: false - xy: 1614, 264 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-void-xlarge - rotate: false - xy: 201, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-display-large - rotate: false - xy: 1223, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 937, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-display-small - rotate: false - xy: 1459, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-display-tiny - rotate: false - xy: 1614, 246 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-display-xlarge - rotate: false - xy: 151, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-processor-large - rotate: false - xy: 1265, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-processor-medium - rotate: false - xy: 1091, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-processor-small - rotate: false - xy: 1433, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-processor-tiny - rotate: false - xy: 1629, 372 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-processor-xlarge - rotate: false - xy: 201, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 1307, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1125, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1459, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1629, 354 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 151, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 1349, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 1159, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 1485, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1629, 336 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 201, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 1391, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 1193, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 1485, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1629, 318 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 201, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 1433, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 1227, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 1511, 437 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1632, 300 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 251, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 1475, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 1261, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 1511, 411 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1632, 282 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 251, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 1517, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 1295, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 1537, 437 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1632, 264 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 251, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-bank-large - rotate: false - xy: 1559, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-bank-medium - rotate: false - xy: 1329, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-bank-small - rotate: false - xy: 1537, 411 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-bank-tiny - rotate: false - xy: 1632, 246 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-bank-xlarge - rotate: false - xy: 251, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-cell-large - rotate: false - xy: 1601, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-cell-medium - rotate: false - xy: 1363, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-cell-small - rotate: false - xy: 1185, 369 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-cell-tiny - rotate: false - xy: 1635, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-cell-xlarge - rotate: false - xy: 251, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 1643, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 1397, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 1174, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1635, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 251, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 1685, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 1431, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 1174, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1653, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 251, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 1727, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 1465, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 1245, 399 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1635, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 251, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 1769, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 1499, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 1271, 401 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1653, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 251, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 1811, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 1533, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 1297, 401 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1671, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 251, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 1853, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 1567, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 1323, 401 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1635, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 151, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 1895, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 1601, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 1511, 385 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1653, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 201, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 1937, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 1635, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 1537, 385 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1671, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 251, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-micro-processor-large - rotate: false - xy: 859, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-micro-processor-medium - rotate: false - xy: 1669, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-micro-processor-small - rotate: false - xy: 1180, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-micro-processor-tiny - rotate: false - xy: 1689, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-micro-processor-xlarge - rotate: false - xy: 281, 619 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 859, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 1703, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 1180, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1635, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 281, 569 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mud-large - rotate: false - xy: 901, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mud-medium - rotate: false - xy: 1737, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-small - rotate: false - xy: 1180, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mud-tiny - rotate: false - xy: 1653, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mud-xlarge - rotate: false - xy: 301, 519 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 859, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 1771, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 1180, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1671, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 301, 469 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-large - rotate: false - xy: 901, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-medium - rotate: false - xy: 1805, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-small - rotate: false - xy: 1200, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-tiny - rotate: false - xy: 1689, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-xlarge - rotate: false - xy: 301, 419 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-naval-factory-large - rotate: false - xy: 943, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-naval-factory-medium - rotate: false - xy: 1839, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-naval-factory-small - rotate: false - xy: 1200, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-naval-factory-tiny - rotate: false - xy: 1707, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-naval-factory-xlarge - rotate: false - xy: 301, 369 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 859, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 1873, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 1211, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 1653, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 301, 319 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-coal-large - rotate: false - xy: 901, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-coal-medium - rotate: false - xy: 1907, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-small - rotate: false - xy: 1237, 373 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-coal-tiny - rotate: false - xy: 1671, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-coal-xlarge - rotate: false - xy: 301, 269 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-copper-large - rotate: false - xy: 943, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-copper-medium - rotate: false - xy: 1941, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-small - rotate: false - xy: 1263, 373 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-copper-tiny - rotate: false - xy: 1689, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-copper-xlarge - rotate: false - xy: 301, 219 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-lead-large - rotate: false - xy: 985, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-lead-medium - rotate: false - xy: 1975, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-small - rotate: false - xy: 1289, 375 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-lead-tiny - rotate: false - xy: 1707, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-lead-xlarge - rotate: false - xy: 301, 169 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-scrap-large - rotate: false - xy: 859, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-scrap-medium - rotate: false - xy: 2009, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-small - rotate: false - xy: 1315, 375 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-scrap-tiny - rotate: false - xy: 1725, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-scrap-xlarge - rotate: false - xy: 301, 119 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-thorium-large - rotate: false - xy: 901, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-thorium-medium - rotate: false - xy: 974, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-small - rotate: false - xy: 1341, 375 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-thorium-tiny - rotate: false - xy: 1671, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-thorium-xlarge - rotate: false - xy: 301, 69 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-titanium-large - rotate: false - xy: 943, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-titanium-medium - rotate: false - xy: 971, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-small - rotate: false - xy: 1367, 381 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-titanium-tiny - rotate: false - xy: 1689, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-titanium-xlarge - rotate: false - xy: 301, 19 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-dome-large - rotate: false - xy: 985, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-dome-medium - rotate: false - xy: 971, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-dome-small - rotate: false - xy: 1393, 381 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-dome-tiny - rotate: false - xy: 1707, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-dome-xlarge - rotate: false - xy: 795, 878 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 1027, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 688, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 1419, 379 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1725, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 309, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 901, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 688, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 1445, 379 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1743, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 309, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-parallax-large - rotate: false - xy: 943, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-parallax-medium - rotate: false - xy: 722, 250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-small - rotate: false - xy: 1471, 379 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-parallax-tiny - rotate: false - xy: 1689, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-parallax-xlarge - rotate: false - xy: 359, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-conveyor-large - rotate: false - xy: 985, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-conveyor-medium - rotate: false - xy: 756, 250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-conveyor-small - rotate: false - xy: 1367, 355 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-conveyor-tiny - rotate: false - xy: 1707, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-conveyor-xlarge - rotate: false - xy: 309, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-router-large - rotate: false - xy: 1027, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-router-medium - rotate: false - xy: 722, 216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-router-small - rotate: false - xy: 1393, 355 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-router-tiny - rotate: false - xy: 1725, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-router-xlarge - rotate: false - xy: 359, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 1069, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 790, 250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 1419, 353 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1743, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 409, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 943, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 756, 216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 1445, 353 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 1761, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 359, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 985, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 824, 250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 1471, 353 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1707, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 409, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 1027, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 1069, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 790, 216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 1497, 359 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1725, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 459, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 824, 216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 1523, 359 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1743, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 409, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 1111, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 858, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 1549, 359 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1761, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 459, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 985, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 892, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 1497, 333 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 1779, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 509, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 1027, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 926, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 1523, 333 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1725, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 459, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-large - rotate: false - xy: 1069, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-medium - rotate: false - xy: 960, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-small - rotate: false - xy: 1549, 333 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-tiny - rotate: false - xy: 1743, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-xlarge - rotate: false - xy: 509, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 1111, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 1153, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 688, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 1119, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 1761, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 559, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 722, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 1119, 159 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1779, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 509, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large - rotate: false - xy: 1027, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 756, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-small - rotate: false - xy: 1145, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plated-conduit-tiny - rotate: false - xy: 1797, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plated-conduit-xlarge - rotate: false - xy: 559, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 1069, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 790, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 1119, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 1743, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 609, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 1111, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 1153, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 824, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 1145, 159 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 1761, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 559, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 858, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 1171, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1779, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 609, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 1195, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 892, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 1119, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 1797, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 659, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 1069, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 926, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 1145, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 1815, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 609, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 1111, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 960, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 1171, 159 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 1761, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 659, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 1153, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 677, 138 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 1197, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 1779, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 709, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 1195, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 994, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 1119, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1797, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 659, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1237, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 994, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 1145, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1815, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 709, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-resupply-point-large - rotate: false - xy: 1111, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-resupply-point-medium - rotate: false - xy: 711, 138 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-resupply-point-small - rotate: false - xy: 1171, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-resupply-point-tiny - rotate: false - xy: 1833, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-resupply-point-xlarge - rotate: false - xy: 709, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1153, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 711, 104 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 1197, 159 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 1779, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 759, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 1195, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 745, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 1119, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 1797, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 759, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 1237, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 779, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 1145, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 1815, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 759, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 1279, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 745, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 1171, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 1833, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 809, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 1153, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 779, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 1197, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 1851, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-large - rotate: false - xy: 1195, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-wall-medium - rotate: false - xy: 813, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-small - rotate: false - xy: 1119, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-wall-tiny - rotate: false - xy: 1797, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-xlarge - rotate: false - xy: 809, 778 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 809, 728 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 1237, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 813, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 1145, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 1815, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 809, 678 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 1279, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 745, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 1171, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 1833, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 331, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 1321, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 779, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 1197, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 1851, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-large - rotate: false - xy: 1195, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-wall-medium - rotate: false - xy: 813, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-small - rotate: false - xy: 1145, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-wall-tiny - rotate: false - xy: 1869, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-xlarge - rotate: false - xy: 331, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 1237, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 847, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 1171, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 1815, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 381, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 381, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 1279, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 847, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1197, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 1833, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 431, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 1321, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 847, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 1171, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 1851, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 431, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 1363, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 881, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 1197, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 1869, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 481, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 1237, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 881, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 1197, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 1887, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 481, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 1279, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 1321, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 915, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 1119, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 1833, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 531, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 881, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1145, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1851, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 531, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large - rotate: false - xy: 1363, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-segment-medium - rotate: false - xy: 915, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-segment-small - rotate: false - xy: 1171, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-segment-tiny - rotate: false - xy: 1869, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-segment-xlarge - rotate: false - xy: 581, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1405, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 949, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1197, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1887, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 581, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1279, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 915, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1206, 343 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 1905, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 631, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 1321, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 949, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 1206, 317 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 1851, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-large - rotate: false - xy: 1363, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-wall-medium - rotate: false - xy: 983, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-small - rotate: false - xy: 1206, 291 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-wall-tiny - rotate: false - xy: 1869, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-xlarge - rotate: false - xy: 631, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 681, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 1405, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 949, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 1206, 265 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 1887, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 681, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 1447, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 983, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 1226, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 1905, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 731, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-crucible-large - rotate: false - xy: 1321, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-crucible-medium - rotate: false - xy: 983, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-crucible-small - rotate: false - xy: 1226, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-crucible-tiny - rotate: false - xy: 1923, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-crucible-xlarge - rotate: false - xy: 731, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 1363, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 1017, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 1223, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 1869, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 781, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-slag-large - rotate: false - xy: 1405, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 1017, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 1223, 159 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 1887, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge - rotate: false - xy: 831, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-boulder-large - rotate: false - xy: 1447, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-boulder-medium - rotate: false - xy: 1017, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-small - rotate: false - xy: 1223, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-boulder-tiny - rotate: false - xy: 1905, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-boulder-xlarge - rotate: false - xy: 781, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 1489, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 881, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 1363, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 915, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1223, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1923, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 831, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 1223, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1941, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-large - rotate: false - xy: 1405, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-wall-medium - rotate: false - xy: 949, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-small - rotate: false - xy: 1223, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-wall-tiny - rotate: false - xy: 1887, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-xlarge - rotate: false - xy: 351, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 351, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 1447, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 1489, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 983, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 1223, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 1905, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 401, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1017, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1223, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1923, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 351, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 1531, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 979, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1289, 349 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1941, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 401, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 1405, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 979, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 1315, 349 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 1959, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 451, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 1447, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 979, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 1341, 349 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 1905, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 351, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 1489, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 979, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 1367, 329 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 1923, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 401, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 1531, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 979, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 1393, 329 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 1941, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 451, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 1573, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 979, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 1419, 327 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 1959, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 501, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 1447, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 1008, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 1445, 327 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 1977, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 351, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-wall-large - rotate: false - xy: 1489, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-wall-medium - rotate: false - xy: 1005, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-wall-small - rotate: false - xy: 1471, 327 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-wall-tiny - rotate: false - xy: 1923, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-wall-xlarge - rotate: false - xy: 401, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-steam-generator-large - rotate: false - xy: 1531, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-steam-generator-medium - rotate: false - xy: 1005, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-small - rotate: false - xy: 1497, 307 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-steam-generator-tiny - rotate: false - xy: 1941, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-steam-generator-xlarge - rotate: false - xy: 451, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 1573, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1028, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 1523, 307 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 1959, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-large - rotate: false - xy: 1615, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-wall-medium - rotate: false - xy: 1028, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-small - rotate: false - xy: 1549, 307 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-wall-tiny - rotate: false - xy: 1977, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-xlarge - rotate: false - xy: 501, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 551, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 1489, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1051, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1232, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1995, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 351, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 1531, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 1573, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1051, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 1232, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 1941, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 401, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1051, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1232, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1959, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 451, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 1615, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 1051, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 1232, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 1977, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 501, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-switch-large - rotate: false - xy: 1657, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-switch-medium - rotate: false - xy: 2011, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-switch-small - rotate: false - xy: 1258, 347 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-switch-tiny - rotate: false - xy: 1995, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-switch-xlarge - rotate: false - xy: 551, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 1531, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 779, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 1258, 321 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 2013, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 601, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 1573, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 779, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 1258, 295 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 2031, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 351, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 1615, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 813, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 1258, 269 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 1959, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 401, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-large - rotate: false - xy: 1657, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-medium - rotate: false - xy: 847, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-small - rotate: false - xy: 1284, 323 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-tiny - rotate: false - xy: 1977, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-xlarge - rotate: false - xy: 451, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 1699, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 813, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 1310, 323 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 1995, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 501, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 1573, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 847, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 1284, 297 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 2013, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 551, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 1615, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 881, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1336, 323 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 2031, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 601, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 1657, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 1699, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 915, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 1284, 271 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 1977, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 651, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 949, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1310, 297 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 1995, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 351, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 1741, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 983, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 1310, 271 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 2013, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 401, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 1615, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1017, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 1336, 297 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 2031, 439 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 451, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 1657, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 1699, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1051, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 1336, 271 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 1995, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 501, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1039, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 1362, 303 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 2013, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 551, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tsunami-large - rotate: false - xy: 1741, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tsunami-medium - rotate: false - xy: 1039, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tsunami-small - rotate: false - xy: 1388, 303 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tsunami-tiny - rotate: false - xy: 2031, 421 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tsunami-xlarge - rotate: false - xy: 601, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-underflow-gate-large - rotate: false - xy: 1783, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-underflow-gate-medium - rotate: false - xy: 1062, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-underflow-gate-small - rotate: false - xy: 1362, 277 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-underflow-gate-tiny - rotate: false - xy: 2013, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-underflow-gate-xlarge - rotate: false - xy: 651, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 1657, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1062, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 1388, 277 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 2031, 403 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 701, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 1699, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 1085, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 1414, 301 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 1647, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 351, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 1741, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1085, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 1440, 301 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 1647, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 401, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 1783, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 1085, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 1466, 301 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 1665, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 451, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 1825, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1085, 53 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1414, 275 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 1647, 349 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 501, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 1699, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 1085, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 1440, 275 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 1665, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 551, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 1741, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 983, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 1466, 275 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 1683, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 601, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 1437, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 1133, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 1133, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 1171, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 1171, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 1209, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 1209, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-disabled - rotate: false - xy: 1209, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-over-4 - rotate: false - xy: 1247, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 1247, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 1285, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 1323, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 1285, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 1323, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1492, 281 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 1399, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 1361, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 1361, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 1399, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 1013, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 1013, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1013, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 1013, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 1013, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1047, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 795, 866 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -crater - rotate: false - xy: 131, 538 - size: 18, 18 - orig: 18, 18 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 1937, 683 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -discord-banner - rotate: false - xy: 771, 978 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -flat-down-base - rotate: false - xy: 1437, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -info-banner - rotate: false - xy: 259, 869 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -inventory - rotate: false - xy: 1518, 265 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -item-blast-compound-icon - rotate: false - xy: 1047, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-icon - rotate: false - xy: 1047, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-icon - rotate: false - xy: 1047, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-icon - rotate: false - xy: 1047, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-icon - rotate: false - xy: 1042, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-icon - rotate: false - xy: 1081, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-icon - rotate: false - xy: 1081, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-icon - rotate: false - xy: 1081, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-icon - rotate: false - xy: 1081, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-icon - rotate: false - xy: 1081, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-icon - rotate: false - xy: 1115, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-icon - rotate: false - xy: 1149, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-icon - rotate: false - xy: 1115, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-icon - rotate: false - xy: 1183, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-icon - rotate: false - xy: 1149, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-icon - rotate: false - xy: 1115, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-icon - rotate: false - xy: 1217, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-icon - rotate: false - xy: 1183, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-icon - rotate: false - xy: 1149, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-icon - rotate: false - xy: 1115, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-node - rotate: false - xy: 1251, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logo - rotate: false - xy: 1, 916 - size: 768, 107 - orig: 768, 107 - offset: 0, 0 - index: -1 -nomap - rotate: false - xy: 1, 658 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -pane - rotate: false - xy: 1475, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 1475, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 1492, 244 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 43, 2 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 1, 2 - size: 40, 24 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 1544, 265 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -scroll-knob-vertical-thin - rotate: false - xy: 1249, 171 - size: 12, 40 - orig: 12, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 1611, 315 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 1039, 375 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 1017, 565 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 1489, 515 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 1520, 515 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 1183, 421 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 1589, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 1513, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 1513, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 1551, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-white - rotate: false - xy: 1551, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -unit-alpha-large - rotate: false - xy: 1783, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-alpha-medium - rotate: false - xy: 1217, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-alpha-small - rotate: false - xy: 1518, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-alpha-tiny - rotate: false - xy: 1647, 331 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-alpha-xlarge - rotate: false - xy: 651, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-antumbra-large - rotate: false - xy: 1951, 849 - size: 36, 40 - orig: 36, 40 - offset: 0, 0 - index: -1 -unit-antumbra-medium - rotate: false - xy: 751, 582 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-antumbra-small - rotate: false - xy: 418, 8 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-antumbra-tiny - rotate: false - xy: 1444, 205 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-antumbra-xlarge - rotate: false - xy: 601, 225 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-arkyid-large - rotate: false - xy: 1825, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-arkyid-medium - rotate: false - xy: 1183, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-arkyid-small - rotate: false - xy: 1544, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-arkyid-tiny - rotate: false - xy: 1665, 349 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-arkyid-xlarge - rotate: false - xy: 701, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-atrax-large - rotate: false - xy: 1867, 860 - size: 40, 29 - orig: 40, 29 - offset: 0, 0 - index: -1 -unit-atrax-medium - rotate: false - xy: 745, 55 - size: 32, 23 - orig: 32, 23 - offset: 0, 0 - index: -1 -unit-atrax-small - rotate: false - xy: 1075, 330 - size: 24, 17 - orig: 24, 17 - offset: 0, 0 - index: -1 -unit-atrax-tiny - rotate: false - xy: 711, 91 - size: 16, 11 - orig: 16, 11 - offset: 0, 0 - index: -1 -unit-atrax-xlarge - rotate: false - xy: 351, 130 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -unit-beta-large - rotate: false - xy: 1741, 683 - size: 40, 38 - orig: 40, 38 - offset: 0, 0 - index: -1 -unit-beta-medium - rotate: false - xy: 1149, 421 - size: 32, 30 - orig: 32, 30 - offset: 0, 0 - index: -1 -unit-beta-small - rotate: false - xy: 1362, 252 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 -unit-beta-tiny - rotate: false - xy: 1683, 368 - size: 16, 15 - orig: 16, 15 - offset: 0, 0 - index: -1 -unit-beta-xlarge - rotate: false - xy: 401, 168 - size: 48, 46 - orig: 48, 46 - offset: 0, 0 - index: -1 -unit-bryde-large - rotate: false - xy: 1783, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-bryde-medium - rotate: false - xy: 1285, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-bryde-small - rotate: false - xy: 1388, 251 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-bryde-tiny - rotate: false - xy: 1701, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-bryde-xlarge - rotate: false - xy: 451, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-corvus-large - rotate: false - xy: 1825, 779 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-corvus-medium - rotate: false - xy: 1042, 329 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-corvus-small - rotate: false - xy: 1867, 681 - size: 24, 15 - orig: 24, 15 - offset: 0, 0 - index: -1 -unit-corvus-tiny - rotate: false - xy: 771, 916 - size: 15, 10 - orig: 15, 10 - offset: 0, 0 - index: -1 -unit-corvus-xlarge - rotate: false - xy: 501, 283 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-crawler-large - rotate: false - xy: 1867, 818 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-crawler-medium - rotate: false - xy: 1251, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-crawler-small - rotate: false - xy: 1414, 249 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-crawler-tiny - rotate: false - xy: 1665, 331 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-crawler-xlarge - rotate: false - xy: 551, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-large - rotate: false - xy: 1909, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-dagger-medium - rotate: false - xy: 1217, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-dagger-small - rotate: false - xy: 1440, 249 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-dagger-tiny - rotate: false - xy: 1683, 350 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-dagger-xlarge - rotate: false - xy: 601, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-large - rotate: false - xy: 1825, 737 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-eclipse-medium - rotate: false - xy: 1319, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-eclipse-small - rotate: false - xy: 1466, 249 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-eclipse-tiny - rotate: false - xy: 1701, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-eclipse-xlarge - rotate: false - xy: 651, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-large - rotate: false - xy: 1867, 776 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-flare-medium - rotate: false - xy: 1285, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-flare-small - rotate: false - xy: 1570, 281 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-flare-tiny - rotate: false - xy: 1719, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-flare-xlarge - rotate: false - xy: 701, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-large - rotate: false - xy: 1783, 689 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-fortress-medium - rotate: false - xy: 80, 1 - size: 32, 25 - orig: 32, 25 - offset: 0, 0 - index: -1 -unit-fortress-small - rotate: false - xy: 1570, 260 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-fortress-tiny - rotate: false - xy: 965, 597 - size: 16, 12 - orig: 16, 12 - offset: 0, 0 - index: -1 -unit-fortress-xlarge - rotate: false - xy: 351, 90 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-gamma-large - rotate: false - xy: 1909, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-gamma-medium - rotate: false - xy: 1251, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-gamma-small - rotate: false - xy: 1570, 234 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-gamma-tiny - rotate: false - xy: 1683, 332 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-gamma-xlarge - rotate: false - xy: 401, 118 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-horizon-large - rotate: false - xy: 1825, 695 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-horizon-medium - rotate: false - xy: 1353, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-horizon-small - rotate: false - xy: 1252, 242 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-horizon-tiny - rotate: false - xy: 1701, 349 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-horizon-xlarge - rotate: false - xy: 451, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mace-large - rotate: false - xy: 1867, 734 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mace-medium - rotate: false - xy: 1319, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mace-small - rotate: false - xy: 1252, 216 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mace-tiny - rotate: false - xy: 1719, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mace-xlarge - rotate: false - xy: 501, 233 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mega-large - rotate: false - xy: 1909, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mega-medium - rotate: false - xy: 1285, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mega-small - rotate: false - xy: 1278, 243 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mega-tiny - rotate: false - xy: 1737, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mega-xlarge - rotate: false - xy: 551, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-minke-large - rotate: false - xy: 1951, 765 - size: 34, 40 - orig: 34, 40 - offset: 0, 0 - index: -1 -unit-minke-medium - rotate: false - xy: 2020, 721 - size: 27, 32 - orig: 27, 32 - offset: 0, 0 - index: -1 -unit-minke-small - rotate: false - xy: 309, 690 - size: 20, 24 - orig: 20, 24 - offset: 0, 0 - index: -1 -unit-minke-tiny - rotate: false - xy: 1773, 349 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-minke-xlarge - rotate: false - xy: 601, 175 - size: 41, 48 - orig: 41, 48 - offset: 0, 0 - index: -1 -unit-mono-large - rotate: false - xy: 881, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mono-medium - rotate: false - xy: 1387, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mono-small - rotate: false - xy: 1278, 217 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mono-tiny - rotate: false - xy: 1719, 349 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mono-xlarge - rotate: false - xy: 601, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-large - rotate: false - xy: 881, 597 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-nova-medium - rotate: false - xy: 1353, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-nova-small - rotate: false - xy: 1304, 245 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-nova-tiny - rotate: false - xy: 1737, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-nova-xlarge - rotate: false - xy: 651, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-oct-large - rotate: false - xy: 923, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-oct-medium - rotate: false - xy: 1319, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-oct-small - rotate: false - xy: 1330, 245 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-oct-tiny - rotate: false - xy: 1755, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-oct-xlarge - rotate: false - xy: 701, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-omura-large - rotate: false - xy: 1551, 513 - size: 28, 40 - orig: 28, 40 - offset: 0, 0 - index: -1 -unit-omura-medium - rotate: false - xy: 1486, 189 - size: 22, 32 - orig: 22, 32 - offset: 0, 0 - index: -1 -unit-omura-small - rotate: false - xy: 1737, 341 - size: 16, 24 - orig: 16, 24 - offset: 0, 0 - index: -1 -unit-omura-tiny - rotate: false - xy: 1077, 580 - size: 11, 16 - orig: 11, 16 - offset: 0, 0 - index: -1 -unit-omura-xlarge - rotate: false - xy: 1951, 715 - size: 33, 48 - orig: 33, 48 - offset: 0, 0 - index: -1 -unit-poly-large - rotate: false - xy: 923, 597 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-poly-medium - rotate: false - xy: 1421, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-poly-small - rotate: false - xy: 1304, 219 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-poly-tiny - rotate: false - xy: 1755, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-poly-xlarge - rotate: false - xy: 351, 40 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-pulsar-large - rotate: false - xy: 1867, 698 - size: 40, 34 - orig: 40, 34 - offset: 0, 0 - index: -1 -unit-pulsar-medium - rotate: false - xy: 1183, 424 - size: 32, 27 - orig: 32, 27 - offset: 0, 0 - index: -1 -unit-pulsar-small - rotate: false - xy: 1330, 223 - size: 24, 20 - orig: 24, 20 - offset: 0, 0 - index: -1 -unit-pulsar-tiny - rotate: false - xy: 644, 175 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-pulsar-xlarge - rotate: false - xy: 401, 76 - size: 48, 40 - orig: 48, 40 - offset: 0, 0 - index: -1 -unit-quad-large - rotate: false - xy: 1909, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quad-medium - rotate: false - xy: 385, 1 - size: 31, 31 - orig: 31, 31 - offset: 0, 0 - index: -1 -unit-quad-small - rotate: false - xy: 1356, 226 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quad-tiny - rotate: false - xy: 1701, 332 - size: 15, 15 - orig: 15, 15 - offset: 0, 0 - index: -1 -unit-quad-xlarge - rotate: false - xy: 451, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-quasar-large - rotate: false - xy: 965, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quasar-medium - rotate: false - xy: 1387, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-quasar-small - rotate: false - xy: 1382, 225 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quasar-tiny - rotate: false - xy: 1773, 385 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-quasar-xlarge - rotate: false - xy: 501, 183 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-reign-large - rotate: false - xy: 965, 611 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-reign-medium - rotate: false - xy: 114, 6 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-reign-small - rotate: false - xy: 301, 2 - size: 24, 15 - orig: 24, 15 - offset: 0, 0 - index: -1 -unit-reign-tiny - rotate: false - xy: 781, 678 - size: 15, 10 - orig: 15, 10 - offset: 0, 0 - index: -1 -unit-reign-xlarge - rotate: false - xy: 551, 233 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-risso-large - rotate: false - xy: 1951, 807 - size: 35, 40 - orig: 35, 40 - offset: 0, 0 - index: -1 -unit-risso-medium - rotate: false - xy: 2017, 579 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-risso-small - rotate: false - xy: 441, 6 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-risso-tiny - rotate: false - xy: 1791, 385 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-risso-xlarge - rotate: false - xy: 701, 326 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-scepter-large - rotate: false - xy: 1007, 647 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-scepter-medium - rotate: false - xy: 1353, 459 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-scepter-small - rotate: false - xy: 1408, 228 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-scepter-tiny - rotate: false - xy: 662, 175 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-scepter-xlarge - rotate: false - xy: 601, 275 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-sei-large - rotate: false - xy: 1007, 605 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-sei-medium - rotate: false - xy: 1455, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-sei-small - rotate: false - xy: 1434, 223 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-sei-tiny - rotate: false - xy: 1755, 349 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-sei-xlarge - rotate: false - xy: 651, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-spiroct-large - rotate: false - xy: 1049, 648 - size: 40, 31 - orig: 40, 31 - offset: 0, 0 - index: -1 -unit-spiroct-medium - rotate: false - xy: 1387, 460 - size: 31, 25 - orig: 31, 25 - offset: 0, 0 - index: -1 -unit-spiroct-small - rotate: false - xy: 1460, 228 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-spiroct-tiny - rotate: false - xy: 2022, 789 - size: 15, 12 - orig: 15, 12 - offset: 0, 0 - index: -1 -unit-spiroct-xlarge - rotate: false - xy: 701, 376 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-toxopid-large - rotate: false - xy: 1979, 891 - size: 33, 40 - orig: 33, 40 - offset: 0, 0 - index: -1 -unit-toxopid-medium - rotate: false - xy: 2021, 755 - size: 26, 32 - orig: 26, 32 - offset: 0, 0 - index: -1 -unit-toxopid-small - rotate: false - xy: 1512, 213 - size: 20, 24 - orig: 20, 24 - offset: 0, 0 - index: -1 -unit-toxopid-tiny - rotate: false - xy: 1791, 367 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-toxopid-xlarge - rotate: false - xy: 1049, 598 - size: 40, 48 - orig: 40, 48 - offset: 0, 0 - index: -1 -unit-vela-large - rotate: false - xy: 1091, 647 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-vela-medium - rotate: false - xy: 1217, 425 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-vela-small - rotate: false - xy: 1486, 223 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-vela-tiny - rotate: false - xy: 482, 1 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-vela-xlarge - rotate: false - xy: 501, 142 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-zenith-large - rotate: false - xy: 1091, 605 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-zenith-medium - rotate: false - xy: 1421, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-zenith-small - rotate: false - xy: 1460, 202 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-zenith-tiny - rotate: false - xy: 1773, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-zenith-xlarge - rotate: false - xy: 551, 183 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wavepane - rotate: false - xy: 1589, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -white-pane - rotate: false - xy: 1627, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 746, 371 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 1073, 266 - size: 27, 61 - split: 4, 4, 2, 2 - orig: 27, 61 - offset: 0, 0 - index: -1 diff --git a/core/assets/sprites/fallback/sprites.png b/core/assets/sprites/fallback/sprites.png deleted file mode 100644 index 4f9c0dffcc..0000000000 Binary files a/core/assets/sprites/fallback/sprites.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites2.png b/core/assets/sprites/fallback/sprites2.png deleted file mode 100644 index aa17fbbe89..0000000000 Binary files a/core/assets/sprites/fallback/sprites2.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites3.png b/core/assets/sprites/fallback/sprites3.png deleted file mode 100644 index 05f78947ea..0000000000 Binary files a/core/assets/sprites/fallback/sprites3.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites4.png b/core/assets/sprites/fallback/sprites4.png deleted file mode 100644 index a54ba96e8b..0000000000 Binary files a/core/assets/sprites/fallback/sprites4.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites5.png b/core/assets/sprites/fallback/sprites5.png deleted file mode 100644 index ffc65a7f9d..0000000000 Binary files a/core/assets/sprites/fallback/sprites5.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites6.png b/core/assets/sprites/fallback/sprites6.png deleted file mode 100644 index 43330a0028..0000000000 Binary files a/core/assets/sprites/fallback/sprites6.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites7.png b/core/assets/sprites/fallback/sprites7.png deleted file mode 100644 index 8ba18e157c..0000000000 Binary files a/core/assets/sprites/fallback/sprites7.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites8.png b/core/assets/sprites/fallback/sprites8.png deleted file mode 100644 index 4cb8e05377..0000000000 Binary files a/core/assets/sprites/fallback/sprites8.png and /dev/null differ diff --git a/core/assets/sprites/fog.png b/core/assets/sprites/fog.png new file mode 100644 index 0000000000..5121693e58 Binary files /dev/null and b/core/assets/sprites/fog.png differ diff --git a/core/assets/sprites/space.png b/core/assets/sprites/space.png new file mode 100644 index 0000000000..188e9e40ae Binary files /dev/null and b/core/assets/sprites/space.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas deleted file mode 100644 index 303a643a31..0000000000 --- a/core/assets/sprites/sprites.atlas +++ /dev/null @@ -1,20939 +0,0 @@ - -sprites.png -size: 4096,4096 -format: rgba8888 -filter: nearest,nearest -repeat: none -launch-pad - rotate: false - xy: 1951, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large - rotate: false - xy: 1703, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -launch-pad-light - rotate: false - xy: 2245, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launchpod - rotate: false - xy: 2013, 1618 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -force-projector - rotate: false - xy: 2918, 2757 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector-top - rotate: false - xy: 1657, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mend-projector - rotate: false - xy: 2029, 760 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-top - rotate: false - xy: 2091, 1156 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender - rotate: false - xy: 3323, 2187 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-top - rotate: false - xy: 2439, 812 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overdrive-dome - rotate: false - xy: 2245, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-top - rotate: false - xy: 2343, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector - rotate: false - xy: 2095, 1090 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-top - rotate: false - xy: 2095, 1024 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shock-mine - rotate: false - xy: 3585, 2319 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-loader - rotate: false - xy: 1899, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader - rotate: false - xy: 1644, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -bridge-arrow - rotate: false - xy: 2361, 1746 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 2361, 1576 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-bridge - rotate: false - xy: 2361, 1542 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-end - rotate: false - xy: 2279, 718 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -center - rotate: false - xy: 2279, 684 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 1981, 1518 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 1981, 1518 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 1053, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 2319, 1160 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 2277, 1076 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 1113, 2285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 4005, 3587 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 1087, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 2319, 1126 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 2277, 1042 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 1113, 2251 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 4039, 3587 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 1121, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 2277, 1008 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 1155, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 2277, 974 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 1189, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 2277, 940 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 2277, 906 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 1654, 3015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 3559, 2622 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 2347, 642 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 2313, 608 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 2347, 608 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-0 - rotate: false - xy: 2313, 574 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-1 - rotate: false - xy: 2347, 574 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-2 - rotate: false - xy: 2313, 540 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-3 - rotate: false - xy: 2347, 540 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-0 - rotate: false - xy: 2313, 506 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-1 - rotate: false - xy: 2347, 506 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-2 - rotate: false - xy: 2313, 472 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-3 - rotate: false - xy: 2347, 472 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-0 - rotate: false - xy: 2313, 438 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-1 - rotate: false - xy: 2347, 438 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-2 - rotate: false - xy: 2317, 404 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-3 - rotate: false - xy: 2351, 404 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-0 - rotate: false - xy: 2381, 710 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-1 - rotate: false - xy: 2381, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-2 - rotate: false - xy: 2381, 642 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-3 - rotate: false - xy: 2381, 608 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor - rotate: false - xy: 3347, 2337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-0 - rotate: false - xy: 3347, 2303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-1 - rotate: false - xy: 3381, 2337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-2 - rotate: false - xy: 3381, 2303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-edge - rotate: false - xy: 3415, 2337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-stack - rotate: false - xy: 3415, 2303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-1 - rotate: false - xy: 2511, 2109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-2 - rotate: false - xy: 2395, 2075 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-3 - rotate: false - xy: 2395, 2041 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-0 - rotate: false - xy: 2429, 2075 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-1 - rotate: false - xy: 2395, 2007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-2 - rotate: false - xy: 2463, 2075 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-3 - rotate: false - xy: 2429, 2041 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-0 - rotate: false - xy: 2395, 1973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-1 - rotate: false - xy: 2497, 2075 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-2 - rotate: false - xy: 2463, 2041 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-3 - rotate: false - xy: 2429, 2007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-0 - rotate: false - xy: 2395, 1939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-1 - rotate: false - xy: 2497, 2041 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-2 - rotate: false - xy: 2463, 2007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-3 - rotate: false - xy: 2429, 1973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-0 - rotate: false - xy: 2395, 1905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-1 - rotate: false - xy: 2497, 2007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-2 - rotate: false - xy: 2463, 1973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-3 - rotate: false - xy: 2429, 1939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cross - rotate: false - xy: 3085, 2227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 2845, 2331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -inverted-sorter - rotate: false - xy: 3245, 2357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction - rotate: false - xy: 3211, 2283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mass-driver-base - rotate: false - xy: 2343, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overflow-gate - rotate: false - xy: 2449, 710 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -payload-conveyor - rotate: false - xy: 2441, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-edge - rotate: false - xy: 2539, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-top - rotate: false - xy: 2637, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-top - rotate: false - xy: 2637, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router - rotate: false - xy: 2637, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-edge - rotate: false - xy: 2637, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-over - rotate: false - xy: 2735, 2647 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -phase-conveyor - rotate: false - xy: 2449, 540 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-arrow - rotate: false - xy: 2449, 506 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-bridge - rotate: false - xy: 2449, 472 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-end - rotate: false - xy: 2449, 438 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router - rotate: false - xy: 3493, 2201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter - rotate: false - xy: 3527, 2253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -underflow-gate - rotate: false - xy: 2463, 1939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 1805, 1148 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 3263, 3099 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 3393, 3099 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 1899, 1018 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 2911, 2265 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-liquid - rotate: false - xy: 2911, 2265 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -laser-drill - rotate: false - xy: 1657, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rim - rotate: false - xy: 1951, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rotator - rotate: false - xy: 2049, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-top - rotate: false - xy: 2147, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill - rotate: false - xy: 2029, 1024 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 2029, 958 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 2029, 892 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -oil-extractor - rotate: false - xy: 2539, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-liquid - rotate: false - xy: 1951, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-rotator - rotate: false - xy: 2049, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-top - rotate: false - xy: 2147, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pneumatic-drill - rotate: false - xy: 2147, 430 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 2647, 2245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 2713, 2249 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor - rotate: false - xy: 2145, 1958 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 2145, 1892 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 2145, 1826 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 2145, 1760 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 2353, 1152 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 2379, 914 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 1524, 2635 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 2279, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -place-arrow - rotate: false - xy: 2735, 2549 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -bridge-conduit - rotate: false - xy: 2361, 1712 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 2361, 1678 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 2361, 1678 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 2361, 1644 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 2361, 1610 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 2279, 582 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 2279, 548 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 2279, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 2279, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 2279, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 2279, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 2313, 710 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 2347, 710 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 2313, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 2347, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 2347, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 2313, 642 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction - rotate: false - xy: 3313, 2289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate - rotate: false - xy: 3153, 2199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate-top - rotate: false - xy: 3187, 2249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-bottom - rotate: false - xy: 3187, 2215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-liquid - rotate: false - xy: 3221, 2249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-top - rotate: false - xy: 3221, 2215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-bottom - rotate: false - xy: 2049, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-liquid - rotate: false - xy: 2147, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-top - rotate: false - xy: 2343, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-pump - rotate: false - xy: 3187, 2181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-liquid - rotate: false - xy: 3221, 2181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump-liquid - rotate: false - xy: 3221, 2181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-pump-liquid - rotate: false - xy: 3221, 2181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit - rotate: false - xy: 2449, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-arrow - rotate: false - xy: 2449, 642 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-bridge - rotate: false - xy: 2449, 608 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-end - rotate: false - xy: 2449, 574 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-cap - rotate: false - xy: 3449, 2303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-0 - rotate: false - xy: 3483, 2337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-1 - rotate: false - xy: 3483, 2303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-2 - rotate: false - xy: 3357, 2269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-3 - rotate: false - xy: 3357, 2235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-4 - rotate: false - xy: 3391, 2269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-0 - rotate: false - xy: 3391, 2201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-1 - rotate: false - xy: 3425, 2235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-2 - rotate: false - xy: 3459, 2269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-4 - rotate: false - xy: 3425, 2201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 2079, 1882 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 3127, 2671 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hyper-processor - rotate: false - xy: 1853, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -large-logic-display - rotate: false - xy: 1307, 1646 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -logic-display - rotate: false - xy: 2245, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor - rotate: false - xy: 2013, 1552 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-bank - rotate: false - xy: 2029, 826 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell - rotate: false - xy: 3289, 2187 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message - rotate: false - xy: 2439, 778 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor - rotate: false - xy: 2439, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch - rotate: false - xy: 2409, 2109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch-on - rotate: false - xy: 2443, 2109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 3593, 2622 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large - rotate: false - xy: 1935, 1224 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large-top - rotate: false - xy: 3231, 2989 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-top - rotate: false - xy: 2291, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 2279, 650 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 2279, 616 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator - rotate: false - xy: 2330, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-liquid - rotate: false - xy: 2526, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-top - rotate: false - xy: 2428, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -diode - rotate: false - xy: 3085, 2193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -diode-arrow - rotate: false - xy: 3119, 2267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator - rotate: false - xy: 3279, 2391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-top - rotate: false - xy: 3313, 2391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor - rotate: false - xy: 3913, 3079 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 1817, 1908 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 1817, 1778 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 1817, 1648 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 1817, 1518 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 2143, 238 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 2143, 108 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -power-node - rotate: false - xy: 3357, 2201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 2779, 2249 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source - rotate: false - xy: 3391, 2235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void - rotate: false - xy: 3425, 2269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 2079, 1816 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator-top - rotate: false - xy: 3357, 2167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel - rotate: false - xy: 3527, 2287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 3029, 2671 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -steam-generator - rotate: false - xy: 2213, 562 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-cap - rotate: false - xy: 2213, 496 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-top - rotate: false - xy: 2213, 430 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine0 - rotate: false - xy: 2037, 2222 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine1 - rotate: false - xy: 2103, 2222 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 2027, 2156 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 2159, 2156 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 3029, 2573 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-lights - rotate: false - xy: 3029, 2475 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-top - rotate: false - xy: 3127, 2573 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter - rotate: false - xy: 1919, 1420 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-top - rotate: false - xy: 1935, 1322 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-mixer - rotate: false - xy: 1825, 2043 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 3281, 2695 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -coal-centrifuge - rotate: false - xy: 3874, 2651 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluid-mixer-bottom - rotate: false - xy: 3029, 2409 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluid-mixer-liquid - rotate: false - xy: 3095, 2409 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluid-mixer-top - rotate: false - xy: 3373, 2371 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 3439, 2371 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 2833, 2397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 2899, 2397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -disassembler - rotate: false - xy: 2526, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-liquid - rotate: false - xy: 2624, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-spinner - rotate: false - xy: 2624, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 2013, 1948 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -incinerator - rotate: false - xy: 3211, 2351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source - rotate: false - xy: 2415, 472 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void - rotate: false - xy: 3313, 2323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 2013, 1882 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 2013, 1816 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 2013, 1816 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-source - rotate: false - xy: 3289, 2255 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-void - rotate: false - xy: 3289, 2221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter - rotate: false - xy: 3255, 2187 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 2539, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -phase-weaver - rotate: false - xy: 2095, 826 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 2095, 760 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 2147, 694 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 2147, 628 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 2147, 562 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulverizer - rotate: false - xy: 3459, 2235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-rotator - rotate: false - xy: 3459, 2201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 2911, 2199 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 2099, 1222 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-liquid - rotate: false - xy: 2157, 1156 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-spinner - rotate: false - xy: 2161, 1090 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-crucible - rotate: false - xy: 2931, 2561 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible-top - rotate: false - xy: 2931, 2463 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter - rotate: false - xy: 2161, 1024 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press - rotate: false - xy: 2161, 958 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame0 - rotate: false - xy: 2161, 892 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame1 - rotate: false - xy: 2161, 826 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame2 - rotate: false - xy: 2161, 760 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 2213, 694 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 2213, 628 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -boulder1 - rotate: false - xy: 1604, 2999 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -boulder2 - rotate: false - xy: 3796, 2610 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder1 - rotate: false - xy: 2221, 2086 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder2 - rotate: false - xy: 2211, 2036 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-boulder1 - rotate: false - xy: 3391, 2167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-boulder2 - rotate: false - xy: 3425, 2167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder1 - rotate: false - xy: 3551, 2321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder2 - rotate: false - xy: 3585, 2353 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-boulder1 - rotate: false - xy: 2315, 1286 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-boulder2 - rotate: false - xy: 2357, 1486 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 1641, 6 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 2277, 1152 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 2277, 1110 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -white-tree - rotate: false - xy: 1, 1523 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-dead - rotate: false - xy: 2173, 3775 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-dead-shadow - rotate: false - xy: 403, 2943 - size: 353, 348 - orig: 353, 348 - offset: 0, 0 - index: -1 -white-tree-shadow - rotate: false - xy: 403, 2943 - size: 353, 348 - orig: 353, 348 - offset: 0, 0 - index: -1 -container - rotate: false - xy: 4022, 2709 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team - rotate: false - xy: 4006, 2643 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 2017, 628 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 2017, 498 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus - rotate: false - xy: 1401, 460 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team - rotate: false - xy: 1397, 298 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard - rotate: false - xy: 1840, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team - rotate: false - xy: 1742, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unloader - rotate: false - xy: 2429, 1905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-center - rotate: false - xy: 2395, 1837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 3323, 2511 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team - rotate: false - xy: 3421, 2511 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-heat - rotate: false - xy: 2820, 2855 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 2291, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 1895, 2212 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-3 - rotate: false - xy: 3329, 3001 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 1899, 888 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -foreshadow-heat - rotate: false - xy: 3783, 3079 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -hail-heat - rotate: false - xy: 781, 1 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -lancer-heat - rotate: false - xy: 2013, 1684 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 1963, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple-heat - rotate: false - xy: 2833, 2659 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo-heat - rotate: false - xy: 2079, 1684 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-heat - rotate: false - xy: 3493, 2167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tsunami-liquid - rotate: false - xy: 3225, 2597 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tsunami-top - rotate: false - xy: 3225, 2499 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 2145, 1628 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-top - rotate: false - xy: 2145, 1562 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -additive-reconstructor - rotate: false - xy: 2873, 3103 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor-top - rotate: false - xy: 1559, 2571 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory - rotate: false - xy: 1559, 2473 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 3961, 2775 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center-team - rotate: false - xy: 3956, 2709 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -exponential-reconstructor - rotate: false - xy: 1127, 3211 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -exponential-reconstructor-top - rotate: false - xy: 2531, 3307 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-in-3 - rotate: false - xy: 2722, 2843 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-5 - rotate: false - xy: 1563, 608 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-in-7 - rotate: false - xy: 831, 899 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-in-9 - rotate: false - xy: 3655, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -factory-out-3 - rotate: false - xy: 2722, 2745 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-out-5 - rotate: false - xy: 1563, 446 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-out-7 - rotate: false - xy: 831, 673 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-out-9 - rotate: false - xy: 403, 2331 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -factory-top-3 - rotate: false - xy: 2820, 2757 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ground-factory - rotate: false - xy: 1755, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor - rotate: false - xy: 1559, 284 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 1559, 122 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory - rotate: false - xy: 2441, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rally-point - rotate: false - xy: 2079, 2014 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-base - rotate: false - xy: 3493, 2235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 2079, 1948 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -tetrative-reconstructor - rotate: false - xy: 323, 2041 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -tetrative-reconstructor-top - rotate: false - xy: 323, 1751 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -copper-wall - rotate: false - xy: 2381, 574 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 2317, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door - rotate: false - xy: 3119, 2233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 2911, 2331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 2845, 2265 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-open - rotate: false - xy: 3119, 2199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall - rotate: false - xy: 2453, 404 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 2095, 892 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall - rotate: false - xy: 3449, 2337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 2147, 496 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 2613, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge2 - rotate: false - xy: 2833, 2463 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge3 - rotate: false - xy: 2931, 2659 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-large1 - rotate: false - xy: 2079, 1552 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 2083, 1486 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 2083, 1420 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 2099, 1354 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall2 - rotate: false - xy: 3517, 2355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall3 - rotate: false - xy: 3517, 2321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall4 - rotate: false - xy: 3551, 2355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall5 - rotate: false - xy: 3551, 2355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall - rotate: false - xy: 2375, 2109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 2093, 2156 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall - rotate: false - xy: 2477, 2109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 2155, 2090 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 2743, 2941 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-wall - rotate: false - xy: 2395, 1871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 2169, 2222 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 4043, 3285 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 4043, 3231 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -casing - rotate: false - xy: 3517, 2303 - size: 8, 16 - orig: 8, 16 - offset: 0, 0 - index: -1 -circle-end - rotate: false - xy: 1440, 2754 - size: 100, 199 - orig: 100, 199 - offset: 0, 0 - index: -1 -circle-mid - rotate: false - xy: 605, 1550 - size: 1, 199 - orig: 1, 199 - offset: 0, 0 - index: -1 -circle-shadow - rotate: false - xy: 1356, 2422 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -error - rotate: false - xy: 2211, 1636 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-bomb - rotate: false - xy: 2189, 6 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -large-bomb-back - rotate: false - xy: 2873, 2855 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -laser - rotate: false - xy: 567, 93 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -laser-end - rotate: false - xy: 3299, 2425 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -minelaser - rotate: false - xy: 2973, 3293 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -minelaser-end - rotate: false - xy: 3373, 2437 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -missile - rotate: false - xy: 1683, 10 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 1113, 2319 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -parallax-laser - rotate: false - xy: 2751, 3257 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -parallax-laser-end - rotate: false - xy: 3447, 2437 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -particle - rotate: false - xy: 1109, 2601 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -scale_marker - rotate: false - xy: 1501, 1088 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -shell - rotate: false - xy: 3967, 3583 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 2683, 2941 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -transfer - rotate: false - xy: 397, 2439 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -transfer-arrow - rotate: false - xy: 2497, 1973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white - rotate: false - xy: 3652, 2791 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -alpha-outline - rotate: false - xy: 3225, 2719 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 3323, 2645 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 2590, 2251 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 3035, 2245 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra-outline - rotate: false - xy: 935, 2357 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck0 - rotate: false - xy: 895, 2115 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck1 - rotate: false - xy: 895, 1873 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck2 - rotate: false - xy: 895, 1631 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -arc - rotate: false - xy: 1947, 1518 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arkyid-foot - rotate: false - xy: 3652, 2605 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-joint-base - rotate: false - xy: 3601, 2533 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-leg - rotate: false - xy: 1063, 3315 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -arkyid-leg-base - rotate: false - xy: 1479, 3709 - size: 104, 64 - orig: 104, 64 - offset: 0, 0 - index: -1 -arkyid-outline - rotate: false - xy: 3263, 3229 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck0 - rotate: false - xy: 3393, 3229 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 1397, 6 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 1805, 1278 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -artillery-mount-outline - rotate: false - xy: 3724, 2605 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -artillery-outline - rotate: false - xy: 4043, 3115 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -atrax-foot - rotate: false - xy: 1585, 3733 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -atrax-joint - rotate: false - xy: 1317, 3183 - size: 26, 26 - orig: 26, 26 - offset: 0, 0 - index: -1 -atrax-leg - rotate: false - xy: 1279, 3183 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-leg-base - rotate: false - xy: 1817, 1408 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-outline - rotate: false - xy: 1935, 1158 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 3907, 3013 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 691, 27 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 91, 7 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beam-weapon-outline - rotate: false - xy: 3477, 2611 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -beta-outline - rotate: false - xy: 2683, 2979 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 3016, 2799 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 3161, 2419 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 2965, 2407 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 3281, 2891 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 3281, 2793 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 2291, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-full - rotate: false - xy: 2357, 1186 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 1899, 758 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-boulder-full - rotate: false - xy: 1001, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 2353, 1118 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-full - rotate: false - xy: 1961, 2212 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 2391, 1186 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-full - rotate: false - xy: 1895, 2146 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 2387, 1152 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 2387, 1152 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 1887, 628 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1423, 784 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-core-shard-full - rotate: false - xy: 3379, 2903 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 2387, 1118 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-full - rotate: false - xy: 1961, 2146 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 1891, 2080 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 3379, 2805 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-dacite-boulder-full - rotate: false - xy: 3035, 2195 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-full - rotate: false - xy: 2319, 1092 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-full - rotate: false - xy: 2311, 1058 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 2311, 1024 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 2311, 990 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-full - rotate: false - xy: 2311, 956 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-full - rotate: false - xy: 2311, 922 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-full - rotate: false - xy: 2353, 1084 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 2387, 1084 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-full - rotate: false - xy: 2837, 3581 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -block-foreshadow-full - rotate: false - xy: 1887, 498 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 3379, 2707 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 2345, 1050 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 3379, 2609 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 2345, 1016 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 2379, 1050 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 2345, 982 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 2379, 1016 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-full - rotate: false - xy: 2345, 948 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 1887, 368 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 1957, 2080 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 1703, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 2379, 982 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 1801, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 2379, 948 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 1997, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 1947, 2014 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 1883, 238 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 2345, 914 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 2311, 888 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-full - rotate: false - xy: 2277, 872 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-full - rotate: false - xy: 1401, 622 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-naval-factory-full - rotate: false - xy: 2095, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 2193, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 2345, 880 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 2379, 880 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 2269, 838 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 2269, 804 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 2269, 770 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 2311, 854 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 1947, 1948 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 2291, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 2291, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 2389, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 2389, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 2345, 846 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 1947, 1882 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 2379, 846 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 1947, 1816 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 2303, 820 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 2303, 786 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 2337, 812 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 2487, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-salt-wall-full - rotate: false - xy: 2371, 812 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 1947, 1750 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 2337, 778 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 2371, 778 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-full - rotate: false - xy: 2303, 752 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 1947, 1684 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 2337, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 2371, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 2371, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 2585, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 2585, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 1947, 1618 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 1947, 1552 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 1638, 2965 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 2575, 2159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-full - rotate: false - xy: 2575, 2125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 2361, 2052 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-full - rotate: false - xy: 1554, 2999 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 2361, 2018 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-full - rotate: false - xy: 2361, 1984 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 1883, 108 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 1891, 2038 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 2361, 1950 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 3829, 2792 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-spore-wall-full - rotate: false - xy: 2361, 1916 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-full - rotate: false - xy: 3895, 2783 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 2361, 1882 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-full - rotate: false - xy: 2361, 1848 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 3824, 2726 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 2361, 1814 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-full - rotate: false - xy: 1, 1233 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 2361, 1780 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 2361, 1780 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tsunami-full - rotate: false - xy: 1644, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-vault-full - rotate: false - xy: 1742, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 3890, 2717 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 3808, 2660 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-outline - rotate: false - xy: 1663, 1124 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 1757, 982 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 1757, 840 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 2979, 3217 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -command-center-team-crux - rotate: false - xy: 3940, 2643 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center-team-sharded - rotate: false - xy: 4027, 2775 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team-crux - rotate: false - xy: 2185, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team-sharded - rotate: false - xy: 2251, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 2017, 368 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 2013, 238 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 1397, 136 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 1501, 2066 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-team-crux - rotate: false - xy: 1938, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 1840, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -corvus-foot - rotate: false - xy: 507, 1 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -corvus-joint - rotate: false - xy: 2147, 368 - size: 60, 60 - orig: 60, 60 - offset: 0, 0 - index: -1 -corvus-joint-base - rotate: false - xy: 3745, 2533 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -toxopid-joint-base - rotate: false - xy: 3745, 2533 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -corvus-leg - rotate: false - xy: 291, 1453 - size: 30, 68 - orig: 30, 68 - offset: 0, 0 - index: -1 -corvus-leg-base - rotate: false - xy: 573, 1283 - size: 30, 64 - orig: 30, 64 - offset: 0, 0 - index: -1 -corvus-outline - rotate: false - xy: 2757, 3201 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-wreck0 - rotate: false - xy: 1016, 2927 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-wreck1 - rotate: false - xy: 1016, 2785 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-wreck2 - rotate: false - xy: 983, 2643 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -cracks-1-0 - rotate: false - xy: 2381, 540 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 2381, 506 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 2381, 472 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 2381, 438 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 2385, 404 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 3587, 2421 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 3587, 2387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 3085, 2261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 2383, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 2449, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 2515, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 2581, 2301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 2647, 2311 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 3521, 2389 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 2713, 2315 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 2779, 2315 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 2036, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 1938, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 2134, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 2036, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 2232, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 2134, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 2330, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 2232, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 2013, 108 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 2973, 3087 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 3103, 3087 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 3523, 3209 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 3653, 3209 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 3783, 3209 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 3913, 3209 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 3523, 3079 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 1501, 1904 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 1501, 1742 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1501, 1580 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 1501, 1418 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 1501, 1256 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 1501, 1094 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 1595, 932 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 1585, 770 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-6-0 - rotate: false - xy: 1153, 2228 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-1 - rotate: false - xy: 1347, 2228 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-2 - rotate: false - xy: 1113, 2034 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-3 - rotate: false - xy: 1113, 1840 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-4 - rotate: false - xy: 1307, 2034 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-5 - rotate: false - xy: 1113, 1646 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-6 - rotate: false - xy: 1307, 1840 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-7 - rotate: false - xy: 1113, 1452 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-7-0 - rotate: false - xy: 3063, 3581 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-1 - rotate: false - xy: 3289, 3581 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-2 - rotate: false - xy: 3515, 3581 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-3 - rotate: false - xy: 3741, 3581 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-4 - rotate: false - xy: 1627, 3307 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-5 - rotate: false - xy: 1853, 3307 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-6 - rotate: false - xy: 2079, 3307 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-7 - rotate: false - xy: 2305, 3307 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-8-0 - rotate: false - xy: 573, 867 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 573, 609 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 573, 351 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 573, 93 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 1127, 3437 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 805, 3115 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 758, 2857 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 725, 2599 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-9-0 - rotate: false - xy: 2495, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-1 - rotate: false - xy: 1, 943 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-2 - rotate: false - xy: 2785, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-3 - rotate: false - xy: 1, 653 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-4 - rotate: false - xy: 3075, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-5 - rotate: false - xy: 1, 363 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-6 - rotate: false - xy: 3365, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-7 - rotate: false - xy: 1, 73 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -crawler-leg - rotate: false - xy: 2165, 1346 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-outline - rotate: false - xy: 2165, 1296 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 2165, 1246 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 2235, 2186 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 2225, 2136 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cyclone - rotate: false - xy: 2428, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 2211, 1886 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-outline - rotate: false - xy: 2211, 1836 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 2211, 1786 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 2211, 1736 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 2211, 1686 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 3211, 2385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -eclipse-outline - rotate: false - xy: 1, 2167 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck0 - rotate: false - xy: 403, 2621 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck1 - rotate: false - xy: 1529, 3775 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck2 - rotate: false - xy: 1, 1845 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eruption-outline - rotate: false - xy: 2267, 372 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flamethrower-outline - rotate: false - xy: 2273, 206 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flare-outline - rotate: false - xy: 2211, 1528 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 2207, 1478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 2285, 2186 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 2275, 2136 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -foreshadow - rotate: false - xy: 3653, 3079 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -fortress-leg - rotate: false - xy: 3829, 2940 - size: 80, 60 - orig: 80, 60 - offset: 0, 0 - index: -1 -fortress-outline - rotate: false - xy: 2649, 3225 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 1440, 2672 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 1985, 26 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 2087, 26 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 1657, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -gamma-outline - rotate: false - xy: 1817, 770 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 2617, 2377 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 1897, 2278 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1967, 2278 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 3245, 2391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -heal-shotgun-weapon-outline - rotate: false - xy: 2820, 2889 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -heal-weapon-mount-outline - rotate: false - xy: 2261, 1986 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-outline - rotate: false - xy: 2261, 1936 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -horizon-outline - rotate: false - xy: 323, 2341 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 3993, 2841 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 3734, 2682 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 3225, 2425 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 2273, 1236 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 3313, 2357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 693, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 3187, 2283 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 2261, 1886 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 758, 3251 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 2325, 88 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 1601, 3441 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 1569, 3307 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 2261, 1836 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 1016, 3073 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 2325, 20 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 691, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 1151, 2625 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 2261, 1786 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 983, 2601 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 2413, 1050 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 3347, 2399 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 1169, 2625 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 2261, 1736 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 1440, 2630 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 2413, 982 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 719, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 4079, 3061 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 2261, 1686 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 1063, 3215 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 2413, 914 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 1601, 3415 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 4079, 3043 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 2261, 1636 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 1554, 2957 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 2413, 846 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 717, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 4079, 3025 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 2261, 1586 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 2273, 114 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 2405, 778 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 3347, 2373 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 4079, 3007 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 2261, 1536 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 2273, 1194 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 2415, 710 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 745, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 1187, 2625 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 2335, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 2227, 850 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 2415, 642 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 1601, 3389 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 4079, 2989 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 2385, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 758, 3209 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 2415, 574 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 743, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 2279, 752 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 2435, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 1025, 2601 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 2415, 506 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 771, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 3151, 2351 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 2485, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 1482, 2630 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 2419, 404 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 1601, 3363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 693, 2603 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 2535, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 1596, 2957 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 3177, 2335 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 797, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 2595, 3547 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 3161, 2369 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 2315, 1194 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 3211, 2317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 1601, 3337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 983, 2839 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 2215, 1428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 2227, 808 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 3279, 2323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 823, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 1353, 3419 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 2215, 1378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 2013, 1750 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-artillery-outline - rotate: false - xy: 2215, 1242 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-bullet-mount-outline - rotate: false - xy: 1969, 2348 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount-outline - rotate: false - xy: 1853, 2449 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount-outline - rotate: false - xy: 2113, 2348 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-weapon-outline - rotate: false - xy: 2257, 1478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 758, 3167 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 3279, 2289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 849, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 1229, 876 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 2265, 1428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 1067, 2601 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 3153, 2233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 1601, 3311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 1401, 786 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 2265, 1378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 2227, 766 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 3255, 2221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 725, 2917 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 1663, 1106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 2265, 1328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 758, 3125 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 3323, 2221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 2495, 3781 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 3945, 3863 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 2265, 1278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 2033, 1354 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-outline - rotate: false - xy: 2033, 1288 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 2033, 1222 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 2025, 1156 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 2029, 1090 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 2441, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mega-outline - rotate: false - xy: 3179, 2871 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck0 - rotate: false - xy: 3077, 2769 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck1 - rotate: false - xy: 3179, 2769 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck2 - rotate: false - xy: 1542, 2853 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 1833, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-outline - rotate: false - xy: 3477, 2796 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 3567, 2899 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 3477, 2693 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 3567, 2796 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -missiles-mount-outline - rotate: false - xy: 2311, 2036 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-outline - rotate: false - xy: 2311, 1886 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 2311, 1836 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 2311, 1786 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 2311, 1736 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon-outline - rotate: false - xy: 2311, 1636 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon-outline - rotate: false - xy: 2311, 1536 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 2425, 2143 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-outline - rotate: false - xy: 1063, 3257 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 2358, 2243 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 2416, 2243 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 2474, 2243 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -oct-outline - rotate: false - xy: 403, 3695 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-wreck0 - rotate: false - xy: 1, 2891 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-wreck1 - rotate: false - xy: 403, 3293 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-wreck2 - rotate: false - xy: 805, 3695 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -omura-cannon-outline - rotate: false - xy: 1057, 894 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -omura-outline - rotate: false - xy: 291, 545 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck0 - rotate: false - xy: 291, 143 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck1 - rotate: false - xy: 613, 1929 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck2 - rotate: false - xy: 613, 1527 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 2095, 958 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-outline - rotate: false - xy: 1623, 3107 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 2149, 1504 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 2149, 1446 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 1565, 3049 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-leg - rotate: false - xy: 2845, 2199 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulsar-outline - rotate: false - xy: 2037, 2288 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 2107, 2288 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 1801, 2235 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 2687, 2387 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -quad-outline - rotate: false - xy: 831, 7 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-wreck0 - rotate: false - xy: 2757, 3343 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-wreck1 - rotate: false - xy: 2979, 3359 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-wreck2 - rotate: false - xy: 3201, 3359 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quasar-leg - rotate: false - xy: 1307, 12 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-outline - rotate: false - xy: 3519, 2529 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 3997, 2997 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 3993, 2915 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 3829, 2858 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign-leg - rotate: false - xy: 1663, 1534 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-outline - rotate: false - xy: 1353, 3183 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-weapon-outline - rotate: false - xy: 3657, 2759 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -reign-wreck0 - rotate: false - xy: 1569, 3165 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck1 - rotate: false - xy: 1785, 3165 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck2 - rotate: false - xy: 2001, 3165 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 3493, 2269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 2735, 2451 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-outline - rotate: false - xy: 2257, 2367 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 2329, 2367 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 2401, 2367 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 2473, 2367 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 2079, 1750 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 2079, 1618 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scepter-leg - rotate: false - xy: 2483, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-leg - rotate: false - xy: 2483, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-outline - rotate: false - xy: 1251, 946 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-weapon-outline - rotate: false - xy: 2977, 2199 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -scepter-wreck0 - rotate: false - xy: 1057, 610 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck1 - rotate: false - xy: 1053, 468 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck2 - rotate: false - xy: 1053, 326 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 3459, 2167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 2099, 1288 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sei-launcher-outline - rotate: false - xy: 3747, 2838 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -sei-outline - rotate: false - xy: 1627, 3533 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck0 - rotate: false - xy: 1869, 3533 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck1 - rotate: false - xy: 2111, 3533 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck2 - rotate: false - xy: 2353, 3533 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -small-basic-weapon-outline - rotate: false - xy: 2307, 1486 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon-outline - rotate: false - xy: 2315, 1386 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 2743, 3071 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-foot - rotate: false - xy: 1609, 2425 - size: 46, 46 - orig: 46, 46 - offset: 0, 0 - index: -1 -spiroct-joint - rotate: false - xy: 3527, 2219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spiroct-leg - rotate: false - xy: 3323, 2609 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-leg-base - rotate: false - xy: 4043, 3079 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-outline - rotate: false - xy: 1801, 2295 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-weapon-outline - rotate: false - xy: 2365, 1370 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 3523, 3002 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 3619, 3002 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 3715, 3002 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 3527, 2185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 3527, 2151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 3595, 2183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 3595, 2149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 3561, 2285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 3561, 2251 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 3561, 2217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 3561, 2183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 3561, 2149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 3595, 2285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 3595, 2251 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 3595, 2217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 2089, 2090 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -toxopid-cannon-outline - rotate: false - xy: 1232, 2625 - size: 206, 220 - orig: 206, 220 - offset: 0, 0 - index: -1 -toxopid-foot - rotate: false - xy: 599, 1 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -toxopid-leg - rotate: false - xy: 3945, 4023 - size: 150, 72 - orig: 150, 72 - offset: 0, 0 - index: -1 -toxopid-leg-base - rotate: false - xy: 1207, 3709 - size: 270, 64 - orig: 270, 64 - offset: 0, 0 - index: -1 -toxopid-outline - rotate: false - xy: 1725, 386 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 1721, 194 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 1721, 2 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 1541, 2230 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -tsunami - rotate: false - xy: 3127, 2475 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 2365, 1320 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-antumbra-full - rotate: false - xy: 895, 1389 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 2873, 2957 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 181, 7 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 3035, 2353 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 3121, 3217 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-corvus-full - rotate: false - xy: 2217, 3165 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 2365, 1270 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 2315, 1236 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-full - rotate: false - xy: 1851, 3775 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 2365, 1220 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 1542, 2771 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 2757, 2381 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 3521, 2455 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 2145, 2024 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mega-full - rotate: false - xy: 1542, 2669 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -unit-minke-full - rotate: false - xy: 3657, 2899 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 2227, 1142 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 3035, 2295 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-oct-full - rotate: false - xy: 1, 2489 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -unit-omura-full - rotate: false - xy: 605, 1125 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 3093, 2351 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 1825, 2175 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -unit-quad-full - rotate: false - xy: 3423, 3359 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 3742, 2756 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-reign-full - rotate: false - xy: 2433, 3165 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 2545, 2367 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -unit-scepter-full - rotate: false - xy: 1053, 184 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-sei-full - rotate: false - xy: 2595, 3565 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -unit-spiroct-full - rotate: false - xy: 3811, 3002 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-toxopid-full - rotate: false - xy: 1663, 2038 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-vela-full - rotate: false - xy: 1053, 42 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-zenith-full - rotate: false - xy: 1279, 3069 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -vault-team-crux - rotate: false - xy: 1703, 2349 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team-sharded - rotate: false - xy: 1703, 2251 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vela-outline - rotate: false - xy: 1229, 520 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-wreck0 - rotate: false - xy: 1225, 236 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-wreck1 - rotate: false - xy: 1225, 94 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-wreck2 - rotate: false - xy: 1423, 946 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 2145, 1694 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-missiles-outline - rotate: false - xy: 2227, 892 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-outline - rotate: false - xy: 3003, 2973 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 3117, 2973 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 1527, 8 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 1440, 2955 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 3279, 2357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 2315, 122 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 2325, 54 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 2590, 2217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 2413, 1016 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 2413, 948 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 2413, 880 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 2405, 812 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 2405, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 2415, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 2415, 608 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 2415, 540 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 2415, 438 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 3143, 2317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 3177, 2301 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 3245, 2323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 3245, 2289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 3153, 2267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 3255, 2255 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 3323, 2255 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 3734, 2756 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -circle - rotate: false - xy: 1153, 2422 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 2235, 2236 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 781, 43 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 1559, 2423 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra - rotate: false - xy: 3645, 3339 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-cell - rotate: false - xy: 3863, 3339 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -arkyid - rotate: false - xy: 3967, 3751 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 3967, 3621 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -atrax - rotate: false - xy: 1, 7 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-base - rotate: false - xy: 1825, 2109 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -atrax-cell - rotate: false - xy: 1001, 1181 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beta - rotate: false - xy: 1507, 3127 - size: 56, 54 - orig: 56, 54 - offset: 0, 0 - index: -1 -beta-cell - rotate: false - xy: 3093, 2301 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -bryde - rotate: false - xy: 1663, 1266 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-cell - rotate: false - xy: 3945, 3881 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -corvus - rotate: false - xy: 291, 1 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-base - rotate: false - xy: 1663, 1912 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -corvus-cell - rotate: false - xy: 887, 1247 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -corvus-weapon-heat - rotate: false - xy: 1063, 3069 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -crawler - rotate: false - xy: 3817, 2560 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 3817, 2510 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 2165, 1396 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 2211, 1986 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 2211, 1936 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -eclipse - rotate: false - xy: 805, 3373 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-cell - rotate: false - xy: 1207, 3775 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -flare - rotate: false - xy: 2273, 156 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress - rotate: false - xy: 1883, 26 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-base - rotate: false - xy: 2013, 2014 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -fortress-cell - rotate: false - xy: 1817, 1436 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -gamma - rotate: false - xy: 1747, 770 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 1507, 3069 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -horizon - rotate: false - xy: 323, 2415 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-cell - rotate: false - xy: 1641, 48 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -mace - rotate: false - xy: 2023, 2080 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 2017, 1486 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 2017, 1420 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mega - rotate: false - xy: 2975, 2855 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-cell - rotate: false - xy: 3077, 2871 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -minke - rotate: false - xy: 3477, 2899 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-cell - rotate: false - xy: 2093, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -mono - rotate: false - xy: 2311, 1986 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-cell - rotate: false - xy: 2311, 1936 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 2300, 2243 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 2375, 2143 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 2209, 372 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -oct - rotate: false - xy: 1, 3695 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -oct-cell - rotate: false - xy: 1, 3293 - size: 400, 400 - orig: 400, 400 - offset: 0, 0 - index: -1 -omura - rotate: false - xy: 323, 1349 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-cannon-heat - rotate: false - xy: 1113, 1173 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -omura-cell - rotate: false - xy: 291, 947 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 2532, 2243 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 1565, 3107 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 1623, 3049 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 2649, 3165 - size: 68, 58 - orig: 68, 58 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 2475, 2143 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 507, 93 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -quad - rotate: false - xy: 831, 451 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quad-cell - rotate: false - xy: 831, 229 - size: 220, 220 - orig: 220, 220 - offset: 0, 0 - index: -1 -quasar - rotate: false - xy: 3652, 2677 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-base - rotate: false - xy: 3911, 2931 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-cell - rotate: false - xy: 1225, 12 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign - rotate: false - xy: 1385, 3325 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-base - rotate: false - xy: 1663, 1786 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-cell - rotate: false - xy: 1663, 1660 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -risso - rotate: false - xy: 2185, 2367 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-cell - rotate: false - xy: 2833, 2561 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scepter - rotate: false - xy: 1057, 752 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-base - rotate: false - xy: 2223, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-base - rotate: false - xy: 2223, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-cell - rotate: false - xy: 2353, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -sei - rotate: false - xy: 693, 2357 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-cell - rotate: false - xy: 1385, 3467 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -spiroct - rotate: false - xy: 3427, 3022 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-cell - rotate: false - xy: 1801, 2372 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid - rotate: false - xy: 1725, 578 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-cannon - rotate: false - xy: 1232, 2847 - size: 206, 220 - orig: 206, 220 - offset: 0, 0 - index: -1 -toxopid-cell - rotate: false - xy: 1663, 1408 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -vanguard - rotate: false - xy: 2227, 1092 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -vanguard-cell - rotate: false - xy: 2227, 1042 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -vela - rotate: false - xy: 1251, 804 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-cell - rotate: false - xy: 1229, 662 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -vela-weapon-heat - rotate: false - xy: 1225, 378 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -artillery - rotate: false - xy: 4043, 3173 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -artillery-mount - rotate: false - xy: 3673, 2533 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -beam-weapon - rotate: false - xy: 3747, 2920 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -eruption - rotate: false - xy: 2211, 1578 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 2273, 322 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 2273, 264 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 1251, 1121 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 2271, 2086 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 2261, 2036 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 2215, 1310 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-bullet-mount - rotate: false - xy: 1897, 2348 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount - rotate: false - xy: 1755, 2449 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount - rotate: false - xy: 2041, 2348 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-weapon - rotate: false - xy: 2223, 1192 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles - rotate: false - xy: 2325, 2136 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles-mount - rotate: false - xy: 2321, 2086 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon - rotate: false - xy: 2311, 1686 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 2311, 1586 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -omura-cannon - rotate: false - xy: 1307, 1367 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -omura-cannon-heat - rotate: false - xy: 1307, 1088 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -reign-weapon - rotate: false - xy: 3567, 2656 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -scepter-weapon - rotate: false - xy: 2977, 2303 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -sei-launcher - rotate: false - xy: 3911, 2849 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -small-basic-weapon - rotate: false - xy: 2525, 2143 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 2315, 1436 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 2315, 1336 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 2365, 1428 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 2227, 992 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 2227, 942 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith - rotate: false - xy: 1393, 3069 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-cell - rotate: false - xy: 887, 1133 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 - -sprites2.png -size: 4096,512 -format: rgba8888 -filter: nearest,nearest -repeat: none -rubble-1-0 - rotate: false - xy: 2793, 39 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-1-1 - rotate: false - xy: 467, 77 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-2-0 - rotate: false - xy: 533, 77 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-2-1 - rotate: false - xy: 599, 77 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rubble-3-0 - rotate: false - xy: 2793, 105 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rubble-4-0 - rotate: false - xy: 143, 13 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -rubble-5-0 - rotate: false - xy: 1401, 11 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -rubble-6-0 - rotate: false - xy: 2427, 9 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -rubble-7-0 - rotate: false - xy: 3595, 7 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -rubble-8-0 - rotate: false - xy: 3685, 237 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -scorch-0-0 - rotate: false - xy: 1817, 91 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -scorch-0-1 - rotate: false - xy: 385, 61 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -scorch-0-2 - rotate: false - xy: 1899, 91 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -scorch-1-0 - rotate: false - xy: 3943, 241 - size: 110, 110 - orig: 110, 110 - offset: 0, 0 - index: -1 -scorch-1-1 - rotate: false - xy: 1705, 61 - size: 110, 110 - orig: 110, 110 - offset: 0, 0 - index: -1 -scorch-1-2 - rotate: false - xy: 273, 31 - size: 110, 110 - orig: 110, 110 - offset: 0, 0 - index: -1 -scorch-2-0 - rotate: false - xy: 3943, 353 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -scorch-2-1 - rotate: false - xy: 1, 1 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -scorch-2-2 - rotate: false - xy: 1563, 31 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -scorch-3-0 - rotate: false - xy: 2621, 31 - size: 170, 170 - orig: 170, 170 - offset: 0, 0 - index: -1 -scorch-3-1 - rotate: false - xy: 1057, 1 - size: 170, 170 - orig: 170, 170 - offset: 0, 0 - index: -1 -scorch-3-2 - rotate: false - xy: 1229, 1 - size: 170, 170 - orig: 170, 170 - offset: 0, 0 - index: -1 -scorch-4-0 - rotate: false - xy: 3821, 35 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -scorch-4-1 - rotate: false - xy: 2023, 1 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -scorch-4-2 - rotate: false - xy: 2225, 1 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -scorch-5-0 - rotate: false - xy: 2899, 1 - size: 230, 230 - orig: 230, 230 - offset: 0, 0 - index: -1 -scorch-5-1 - rotate: false - xy: 3131, 1 - size: 230, 230 - orig: 230, 230 - offset: 0, 0 - index: -1 -scorch-5-2 - rotate: false - xy: 3363, 1 - size: 230, 230 - orig: 230, 230 - offset: 0, 0 - index: -1 -scorch-6-0 - rotate: false - xy: 2899, 233 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -scorch-6-1 - rotate: false - xy: 3161, 233 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -scorch-6-2 - rotate: false - xy: 3423, 233 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -scorch-7-0 - rotate: false - xy: 2023, 203 - size: 290, 290 - orig: 290, 290 - offset: 0, 0 - index: -1 -scorch-7-1 - rotate: false - xy: 2315, 203 - size: 290, 290 - orig: 290, 290 - offset: 0, 0 - index: -1 -scorch-7-2 - rotate: false - xy: 2607, 203 - size: 290, 290 - orig: 290, 290 - offset: 0, 0 - index: -1 -scorch-8-0 - rotate: false - xy: 1057, 173 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -scorch-8-1 - rotate: false - xy: 1379, 173 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -scorch-8-2 - rotate: false - xy: 1701, 173 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -scorch-9-0 - rotate: false - xy: 1, 143 - size: 350, 350 - orig: 350, 350 - offset: 0, 0 - index: -1 -scorch-9-1 - rotate: false - xy: 353, 143 - size: 350, 350 - orig: 350, 350 - offset: 0, 0 - index: -1 -scorch-9-2 - rotate: false - xy: 705, 143 - size: 350, 350 - orig: 350, 350 - offset: 0, 0 - index: -1 - -sprites3.png -size: 4096,256 -format: rgba8888 -filter: nearest,nearest -repeat: none -basalt-edge - rotate: false - xy: 1, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -basalt1 - rotate: false - xy: 2541, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt2 - rotate: false - xy: 101, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt3 - rotate: false - xy: 2575, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char1 - rotate: false - xy: 135, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char2 - rotate: false - xy: 2609, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char3 - rotate: false - xy: 169, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliff - rotate: false - xy: 2643, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal1 - rotate: false - xy: 203, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal2 - rotate: false - xy: 2677, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal3 - rotate: false - xy: 237, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper1 - rotate: false - xy: 2711, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper2 - rotate: false - xy: 271, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper3 - rotate: false - xy: 2745, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters1 - rotate: false - xy: 305, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters2 - rotate: false - xy: 2779, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters3 - rotate: false - xy: 339, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters4 - rotate: false - xy: 2813, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters5 - rotate: false - xy: 373, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters6 - rotate: false - xy: 2847, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-edge - rotate: false - xy: 1, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dacite-wall-large - rotate: false - xy: 1667, 83 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dacite-wall1 - rotate: false - xy: 2915, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-wall2 - rotate: false - xy: 475, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite1 - rotate: false - xy: 407, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite2 - rotate: false - xy: 2881, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite3 - rotate: false - xy: 441, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-large - rotate: false - xy: 1765, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dark-metal1 - rotate: false - xy: 2949, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal2 - rotate: false - xy: 509, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1 - rotate: false - xy: 2983, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-edge - rotate: false - xy: 99, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-2 - rotate: false - xy: 543, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-edge - rotate: false - xy: 99, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-3 - rotate: false - xy: 3017, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-edge - rotate: false - xy: 197, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-4 - rotate: false - xy: 577, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-edge - rotate: false - xy: 197, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-5 - rotate: false - xy: 3051, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-edge - rotate: false - xy: 295, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-6 - rotate: false - xy: 611, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-edge - rotate: false - xy: 295, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-edge - rotate: false - xy: 393, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water - rotate: false - xy: 679, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-edge - rotate: false - xy: 393, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water1 - rotate: false - xy: 3153, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water2 - rotate: false - xy: 713, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water3 - rotate: false - xy: 3187, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water - rotate: false - xy: 747, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-edge - rotate: false - xy: 491, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-water1 - rotate: false - xy: 3221, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water2 - rotate: false - xy: 781, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water3 - rotate: false - xy: 3255, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand1 - rotate: false - xy: 3085, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand2 - rotate: false - xy: 645, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand3 - rotate: false - xy: 3119, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater - rotate: false - xy: 815, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-edge - rotate: false - xy: 491, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dirt-edge - rotate: false - xy: 589, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dirt-wall-large - rotate: false - xy: 1831, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dirt-wall1 - rotate: false - xy: 883, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-wall2 - rotate: false - xy: 3357, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt1 - rotate: false - xy: 3289, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt2 - rotate: false - xy: 849, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt3 - rotate: false - xy: 3323, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dune-wall-large - rotate: false - xy: 1897, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dune-wall1 - rotate: false - xy: 917, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dune-wall2 - rotate: false - xy: 3391, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -edge - rotate: false - xy: 951, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -edge-stencil - rotate: false - xy: 589, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -edgier - rotate: false - xy: 3425, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-edge - rotate: false - xy: 687, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -grass1 - rotate: false - xy: 985, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass2 - rotate: false - xy: 3459, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass3 - rotate: false - xy: 1019, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock1 - rotate: false - xy: 3493, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock2 - rotate: false - xy: 1053, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock3 - rotate: false - xy: 3527, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-edge - rotate: false - xy: 687, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow-edge - rotate: false - xy: 785, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow1 - rotate: false - xy: 3595, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow2 - rotate: false - xy: 1155, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow3 - rotate: false - xy: 3629, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-wall-large - rotate: false - xy: 1963, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ice-wall1 - rotate: false - xy: 1189, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-wall2 - rotate: false - xy: 3663, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice1 - rotate: false - xy: 1087, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice2 - rotate: false - xy: 3561, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice3 - rotate: false - xy: 1121, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead1 - rotate: false - xy: 1223, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead2 - rotate: false - xy: 3697, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead3 - rotate: false - xy: 1257, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock1 - rotate: false - xy: 3731, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock2 - rotate: false - xy: 1291, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock3 - rotate: false - xy: 3765, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor - rotate: false - xy: 1325, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2 - rotate: false - xy: 3799, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-edge - rotate: false - xy: 785, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-3 - rotate: false - xy: 1359, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-edge - rotate: false - xy: 883, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-5 - rotate: false - xy: 3833, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-edge - rotate: false - xy: 883, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged-edge - rotate: false - xy: 981, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged1 - rotate: false - xy: 1393, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged2 - rotate: false - xy: 3867, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged3 - rotate: false - xy: 1427, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-edge - rotate: false - xy: 981, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss-edge - rotate: false - xy: 1079, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss1 - rotate: false - xy: 3901, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss2 - rotate: false - xy: 1461, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss3 - rotate: false - xy: 3935, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud-edge - rotate: false - xy: 1079, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mud1 - rotate: false - xy: 1495, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud2 - rotate: false - xy: 3969, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud3 - rotate: false - xy: 1529, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal1 - rotate: false - xy: 4003, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal2 - rotate: false - xy: 1563, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal3 - rotate: false - xy: 4037, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper1 - rotate: false - xy: 1597, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper2 - rotate: false - xy: 1631, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper3 - rotate: false - xy: 1667, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead1 - rotate: false - xy: 1733, 115 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead2 - rotate: false - xy: 1701, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead3 - rotate: false - xy: 1665, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap1 - rotate: false - xy: 1699, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap2 - rotate: false - xy: 2491, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap3 - rotate: false - xy: 2541, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium1 - rotate: false - xy: 2575, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium2 - rotate: false - xy: 2609, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium3 - rotate: false - xy: 2643, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium1 - rotate: false - xy: 2677, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium2 - rotate: false - xy: 2711, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium3 - rotate: false - xy: 2745, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles1 - rotate: false - xy: 2779, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles2 - rotate: false - xy: 2813, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles3 - rotate: false - xy: 2847, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pine - rotate: false - xy: 1, 1 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -salt - rotate: false - xy: 2881, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-edge - rotate: false - xy: 1177, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salt-wall-large - rotate: false - xy: 2029, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salt-wall1 - rotate: false - xy: 2915, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-wall2 - rotate: false - xy: 2949, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-edge - rotate: false - xy: 1177, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sand-wall-large - rotate: false - xy: 2095, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-wall1 - rotate: false - xy: 3085, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-wall2 - rotate: false - xy: 3119, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water - rotate: false - xy: 3153, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-edge - rotate: false - xy: 1275, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sand-water1 - rotate: false - xy: 3187, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water2 - rotate: false - xy: 3221, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water3 - rotate: false - xy: 3255, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand1 - rotate: false - xy: 2983, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand2 - rotate: false - xy: 3017, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand3 - rotate: false - xy: 3051, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap1 - rotate: false - xy: 3289, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap2 - rotate: false - xy: 3323, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap3 - rotate: false - xy: 3357, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-edge - rotate: false - xy: 1275, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -shale-wall-large - rotate: false - xy: 2161, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-wall1 - rotate: false - xy: 3493, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-wall2 - rotate: false - xy: 3527, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale1 - rotate: false - xy: 3391, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale2 - rotate: false - xy: 3425, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale3 - rotate: false - xy: 3459, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-large - rotate: false - xy: 2227, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shrubs1 - rotate: false - xy: 3561, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs2 - rotate: false - xy: 3595, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag - rotate: false - xy: 3629, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-edge - rotate: false - xy: 1373, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -snow-edge - rotate: false - xy: 1373, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -snow-pine - rotate: false - xy: 2491, 197 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-wall-large - rotate: false - xy: 2293, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snow-wall1 - rotate: false - xy: 3765, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-wall2 - rotate: false - xy: 3799, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow1 - rotate: false - xy: 3663, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow2 - rotate: false - xy: 3697, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow3 - rotate: false - xy: 3731, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn - rotate: false - xy: 3833, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-edge - rotate: false - xy: 1471, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -spore-moss1 - rotate: false - xy: 3867, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss2 - rotate: false - xy: 3901, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss3 - rotate: false - xy: 3935, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-pine - rotate: false - xy: 51, 1 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-wall-large - rotate: false - xy: 2359, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-wall1 - rotate: false - xy: 3969, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-wall2 - rotate: false - xy: 4003, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-edge - rotate: false - xy: 1471, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -stone-wall-large - rotate: false - xy: 2425, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -stone-wall1 - rotate: false - xy: 1801, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-wall2 - rotate: false - xy: 1835, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone1 - rotate: false - xy: 4037, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone2 - rotate: false - xy: 1733, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone3 - rotate: false - xy: 1767, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water - rotate: false - xy: 1869, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-edge - rotate: false - xy: 1569, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tar - rotate: false - xy: 1903, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-edge - rotate: false - xy: 1569, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tendrils1 - rotate: false - xy: 1937, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils2 - rotate: false - xy: 1971, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils3 - rotate: false - xy: 2005, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium1 - rotate: false - xy: 2039, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium2 - rotate: false - xy: 2073, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium3 - rotate: false - xy: 2107, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium1 - rotate: false - xy: 2141, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium2 - rotate: false - xy: 2175, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium3 - rotate: false - xy: 2209, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water - rotate: false - xy: 2243, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-edge - rotate: false - xy: 1667, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 - -sprites4.png -size: 4096,512 -format: rgba8888 -filter: nearest,nearest -repeat: none -additive-reconstructor-icon-editor - rotate: false - xy: 2297, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory-icon-editor - rotate: false - xy: 2395, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-icon-editor - rotate: false - xy: 2493, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-icon-editor - rotate: false - xy: 4061, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-icon-editor - rotate: false - xy: 205, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt-icon-editor - rotate: false - xy: 4061, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt1 - rotate: false - xy: 4061, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-icon-editor - rotate: false - xy: 239, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large-icon-editor - rotate: false - xy: 2591, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill-icon-editor - rotate: false - xy: 163, 43 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-mixer-icon-editor - rotate: false - xy: 1749, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border-editor - rotate: false - xy: 273, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-forge-icon-editor - rotate: false - xy: 2689, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-loader-icon-editor - rotate: false - xy: 2787, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader-icon-editor - rotate: false - xy: 2885, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -boulder-icon-editor - rotate: false - xy: 1423, 185 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -bridge-conduit-icon-editor - rotate: false - xy: 307, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-icon-editor - rotate: false - xy: 341, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char-icon-editor - rotate: false - xy: 375, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char1 - rotate: false - xy: 375, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear-editor - rotate: false - xy: 645, 202 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -cliff-icon-editor - rotate: false - xy: 409, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-editor - rotate: false - xy: 1815, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -combustion-generator-icon-editor - rotate: false - xy: 443, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -command-center-icon-editor - rotate: false - xy: 1881, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conduit-icon-editor - rotate: false - xy: 477, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -container-icon-editor - rotate: false - xy: 1947, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conveyor-icon-editor - rotate: false - xy: 511, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-icon-editor - rotate: false - xy: 1423, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large-icon-editor - rotate: false - xy: 2013, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation-icon-editor - rotate: false - xy: 1517, 365 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-icon-editor - rotate: false - xy: 1, 11 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-icon-editor - rotate: false - xy: 2983, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -craters-icon-editor - rotate: false - xy: 1457, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters1 - rotate: false - xy: 1457, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cryofluid-mixer-icon-editor - rotate: false - xy: 2079, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-icon-editor - rotate: false - xy: 2145, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cyclone-icon-editor - rotate: false - xy: 3081, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dacite-boulder-icon-editor - rotate: false - xy: 1473, 185 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-icon-editor - rotate: false - xy: 1491, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite1 - rotate: false - xy: 1491, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-wall-icon-editor - rotate: false - xy: 1337, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-icon-editor - rotate: false - xy: 1371, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-icon-editor - rotate: false - xy: 2277, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-1 - rotate: false - xy: 2277, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-icon-editor - rotate: false - xy: 2311, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-2 - rotate: false - xy: 2311, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-icon-editor - rotate: false - xy: 2345, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-3 - rotate: false - xy: 2345, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-icon-editor - rotate: false - xy: 2379, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-4 - rotate: false - xy: 2379, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-icon-editor - rotate: false - xy: 2413, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-5 - rotate: false - xy: 2413, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-icon-editor - rotate: false - xy: 2447, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-6 - rotate: false - xy: 2447, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-icon-editor - rotate: false - xy: 2481, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand1 - rotate: false - xy: 2481, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-editor - rotate: false - xy: 2515, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-icon-editor - rotate: false - xy: 2549, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-icon-editor - rotate: false - xy: 2583, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-deepwater - rotate: false - xy: 2583, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator-icon-editor - rotate: false - xy: 3179, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -diode-icon-editor - rotate: false - xy: 2617, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-icon-editor - rotate: false - xy: 2651, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt1 - rotate: false - xy: 2651, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-wall-icon-editor - rotate: false - xy: 2685, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -disassembler-icon-editor - rotate: false - xy: 3277, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -distributor-icon-editor - rotate: false - xy: 2211, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-icon-editor - rotate: false - xy: 2719, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large-icon-editor - rotate: false - xy: 2297, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dune-wall-icon-editor - rotate: false - xy: 2753, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -duo-icon-editor - rotate: false - xy: 2787, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt2 - rotate: false - xy: 2821, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt3 - rotate: false - xy: 2855, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char2 - rotate: false - xy: 2889, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char3 - rotate: false - xy: 2923, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters2 - rotate: false - xy: 2957, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters3 - rotate: false - xy: 2991, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite2 - rotate: false - xy: 3025, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite3 - rotate: false - xy: 3059, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water1 - rotate: false - xy: 3161, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water2 - rotate: false - xy: 3195, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water3 - rotate: false - xy: 3229, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water1 - rotate: false - xy: 3263, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water2 - rotate: false - xy: 3297, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water3 - rotate: false - xy: 3331, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand2 - rotate: false - xy: 3093, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand3 - rotate: false - xy: 3127, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt2 - rotate: false - xy: 3365, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt3 - rotate: false - xy: 3399, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass1 - rotate: false - xy: 3433, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-icon-editor - rotate: false - xy: 3433, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass2 - rotate: false - xy: 3467, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass3 - rotate: false - xy: 3501, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock1 - rotate: false - xy: 3535, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-editor - rotate: false - xy: 3535, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock2 - rotate: false - xy: 3569, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock3 - rotate: false - xy: 3603, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow1 - rotate: false - xy: 3739, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-editor - rotate: false - xy: 3739, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow2 - rotate: false - xy: 3773, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow3 - rotate: false - xy: 3807, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice1 - rotate: false - xy: 3637, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-editor - rotate: false - xy: 3637, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice2 - rotate: false - xy: 3671, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice3 - rotate: false - xy: 3705, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock1 - rotate: false - xy: 3841, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock-icon-editor - rotate: false - xy: 3841, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock2 - rotate: false - xy: 3875, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock3 - rotate: false - xy: 3909, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor - rotate: false - xy: 3943, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-editor - rotate: false - xy: 3943, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-2 - rotate: false - xy: 3977, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-icon-editor - rotate: false - xy: 3977, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-3 - rotate: false - xy: 4011, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-editor - rotate: false - xy: 4011, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-5 - rotate: false - xy: 4045, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-editor - rotate: false - xy: 4045, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged1 - rotate: false - xy: 1339, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-editor - rotate: false - xy: 1339, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged2 - rotate: false - xy: 1339, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged3 - rotate: false - xy: 1373, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss1 - rotate: false - xy: 1373, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-editor - rotate: false - xy: 1373, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss2 - rotate: false - xy: 1339, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss3 - rotate: false - xy: 1373, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud1 - rotate: false - xy: 915, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud-icon-editor - rotate: false - xy: 915, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud2 - rotate: false - xy: 949, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud3 - rotate: false - xy: 983, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal1 - rotate: false - xy: 1017, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal2 - rotate: false - xy: 1051, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal3 - rotate: false - xy: 1085, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper1 - rotate: false - xy: 1753, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper2 - rotate: false - xy: 1753, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper3 - rotate: false - xy: 1787, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead1 - rotate: false - xy: 1787, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead2 - rotate: false - xy: 1821, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead3 - rotate: false - xy: 1821, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap1 - rotate: false - xy: 1855, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap2 - rotate: false - xy: 1855, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap3 - rotate: false - xy: 1889, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium1 - rotate: false - xy: 1889, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium2 - rotate: false - xy: 1923, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium3 - rotate: false - xy: 1923, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium1 - rotate: false - xy: 1957, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium2 - rotate: false - xy: 1957, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium3 - rotate: false - xy: 1991, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles1 - rotate: false - xy: 1991, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles2 - rotate: false - xy: 2025, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles3 - rotate: false - xy: 2025, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-salt - rotate: false - xy: 2059, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-editor - rotate: false - xy: 2059, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water1 - rotate: false - xy: 2127, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water2 - rotate: false - xy: 2127, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water3 - rotate: false - xy: 2161, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand1 - rotate: false - xy: 2059, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-editor - rotate: false - xy: 2059, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand2 - rotate: false - xy: 2093, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand3 - rotate: false - xy: 2093, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale1 - rotate: false - xy: 2161, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-editor - rotate: false - xy: 2161, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale2 - rotate: false - xy: 2195, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale3 - rotate: false - xy: 2195, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-slag - rotate: false - xy: 2229, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-icon-editor - rotate: false - xy: 2229, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow1 - rotate: false - xy: 2229, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow2 - rotate: false - xy: 2263, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow3 - rotate: false - xy: 2297, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spawn - rotate: false - xy: 2331, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss1 - rotate: false - xy: 2365, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-icon-editor - rotate: false - xy: 2365, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss2 - rotate: false - xy: 2399, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss3 - rotate: false - xy: 2433, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone1 - rotate: false - xy: 2467, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-icon-editor - rotate: false - xy: 2467, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone2 - rotate: false - xy: 2501, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone3 - rotate: false - xy: 2535, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tainted-water - rotate: false - xy: 2569, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-icon-editor - rotate: false - xy: 2569, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tar - rotate: false - xy: 2603, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-icon-editor - rotate: false - xy: 2603, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils1 - rotate: false - xy: 2637, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils2 - rotate: false - xy: 2671, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils3 - rotate: false - xy: 2705, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-water - rotate: false - xy: 2739, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-icon-editor - rotate: false - xy: 2739, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -exponential-reconstructor-icon-editor - rotate: false - xy: 935, 269 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -force-projector-icon-editor - rotate: false - xy: 3375, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -foreshadow-icon-editor - rotate: false - xy: 293, 43 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -fuse-icon-editor - rotate: false - xy: 3473, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press-icon-editor - rotate: false - xy: 2363, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ground-factory-icon-editor - rotate: false - xy: 3571, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hail-icon-editor - rotate: false - xy: 2773, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hyper-processor-icon-editor - rotate: false - xy: 3669, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-wall-icon-editor - rotate: false - xy: 2807, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-icon-editor - rotate: false - xy: 2841, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-editor - rotate: false - xy: 1647, 365 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -incinerator-icon-editor - rotate: false - xy: 2875, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -inverted-sorter-icon-editor - rotate: false - xy: 2909, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-editor - rotate: false - xy: 2943, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-editor - rotate: false - xy: 2977, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-editor - rotate: false - xy: 3011, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln-icon-editor - rotate: false - xy: 2429, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -lancer-icon-editor - rotate: false - xy: 2495, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-logic-display-icon-editor - rotate: false - xy: 1161, 301 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -laser-drill-icon-editor - rotate: false - xy: 3767, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-icon-editor - rotate: false - xy: 3865, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large-icon-editor - rotate: false - xy: 423, 43 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -liquid-junction-icon-editor - rotate: false - xy: 3045, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-icon-editor - rotate: false - xy: 3079, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-source-icon-editor - rotate: false - xy: 3113, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-icon-editor - rotate: false - xy: 3963, 397 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-void-icon-editor - rotate: false - xy: 3147, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-display-icon-editor - rotate: false - xy: 553, 75 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor-icon-editor - rotate: false - xy: 2561, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver-icon-editor - rotate: false - xy: 651, 107 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill-icon-editor - rotate: false - xy: 2627, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-pump-icon-editor - rotate: false - xy: 3181, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -meltdown-icon-editor - rotate: false - xy: 1777, 365 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -melter-icon-editor - rotate: false - xy: 3215, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -memory-bank-icon-editor - rotate: false - xy: 2693, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell-icon-editor - rotate: false - xy: 3249, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mend-projector-icon-editor - rotate: false - xy: 2759, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender-icon-editor - rotate: false - xy: 3283, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message-icon-editor - rotate: false - xy: 3317, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor-icon-editor - rotate: false - xy: 3351, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press-icon-editor - rotate: false - xy: 749, 107 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-icon-editor - rotate: false - xy: 1355, 333 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory-icon-editor - rotate: false - xy: 847, 107 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-icon-editor - rotate: false - xy: 945, 171 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-icon-editor - rotate: false - xy: 1043, 171 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector-icon-editor - rotate: false - xy: 2825, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overflow-gate-icon-editor - rotate: false - xy: 3385, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -parallax-icon-editor - rotate: false - xy: 2891, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -payload-conveyor-icon-editor - rotate: false - xy: 945, 73 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon-editor - rotate: false - xy: 1043, 73 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pebbles-icon-editor - rotate: false - xy: 3419, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-icon-editor - rotate: false - xy: 3453, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-icon-editor - rotate: false - xy: 3487, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-icon-editor - rotate: false - xy: 3521, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large-icon-editor - rotate: false - xy: 2957, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-icon-editor - rotate: false - xy: 3023, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pine-icon-editor - rotate: false - xy: 1553, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-editor - rotate: false - xy: 3089, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-conveyor-icon-editor - rotate: false - xy: 3555, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-icon-editor - rotate: false - xy: 3589, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large-icon-editor - rotate: false - xy: 3155, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plated-conduit-icon-editor - rotate: false - xy: 3623, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-editor - rotate: false - xy: 3221, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-node-icon-editor - rotate: false - xy: 3657, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large-icon-editor - rotate: false - xy: 3287, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source-icon-editor - rotate: false - xy: 3691, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void-icon-editor - rotate: false - xy: 3725, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-icon-editor - rotate: false - xy: 3759, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-icon-editor - rotate: false - xy: 3793, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-editor - rotate: false - xy: 3353, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-icon-editor - rotate: false - xy: 3827, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point-icon-editor - rotate: false - xy: 3419, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ripple-icon-editor - rotate: false - xy: 1161, 203 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rotary-pump-icon-editor - rotate: false - xy: 3485, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -router-icon-editor - rotate: false - xy: 3861, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator-icon-editor - rotate: false - xy: 3551, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salt-wall-icon-editor - rotate: false - xy: 3895, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo-icon-editor - rotate: false - xy: 3617, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-boulder-icon-editor - rotate: false - xy: 3929, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-wall-icon-editor - rotate: false - xy: 3963, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-editor - rotate: false - xy: 3997, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scatter-icon-editor - rotate: false - xy: 3683, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-icon-editor - rotate: false - xy: 4031, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-editor - rotate: false - xy: 1907, 365 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-editor - rotate: false - xy: 1259, 203 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-icon-editor - rotate: false - xy: 2263, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-editor - rotate: false - xy: 3749, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -segment-icon-editor - rotate: false - xy: 3815, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-icon-editor - rotate: false - xy: 3881, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-boulder-icon-editor - rotate: false - xy: 2297, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-wall-icon-editor - rotate: false - xy: 2331, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shock-mine-icon-editor - rotate: false - xy: 2365, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-icon-editor - rotate: false - xy: 2399, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -silicon-crucible-icon-editor - rotate: false - xy: 1141, 105 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter-icon-editor - rotate: false - xy: 3947, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snow-boulder-icon-editor - rotate: false - xy: 1603, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-icon-editor - rotate: false - xy: 2433, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-pine-icon-editor - rotate: false - xy: 1653, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-wall-icon-editor - rotate: false - xy: 2467, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-icon-editor - rotate: false - xy: 2501, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large-icon-editor - rotate: false - xy: 1239, 105 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sorter-icon-editor - rotate: false - xy: 2535, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn-icon-editor - rotate: false - xy: 2569, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spectre-icon-editor - rotate: false - xy: 2037, 365 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spore-cluster-icon-editor - rotate: false - xy: 163, 1 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-pine-icon-editor - rotate: false - xy: 1703, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-press-icon-editor - rotate: false - xy: 4013, 331 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-wall-icon-editor - rotate: false - xy: 2603, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -steam-generator-icon-editor - rotate: false - xy: 553, 9 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -stone-wall-icon-editor - rotate: false - xy: 2637, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-tower-icon-editor - rotate: false - xy: 651, 41 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-icon-editor - rotate: false - xy: 2671, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large-icon-editor - rotate: false - xy: 717, 41 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -swarmer-icon-editor - rotate: false - xy: 783, 41 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -switch-icon-editor - rotate: false - xy: 2705, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils-icon-editor - rotate: false - xy: 2739, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tetrative-reconstructor-icon-editor - rotate: false - xy: 645, 205 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -thermal-generator-icon-editor - rotate: false - xy: 849, 41 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump-icon-editor - rotate: false - xy: 1357, 235 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-icon-editor - rotate: false - xy: 1455, 235 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-wall-icon-editor - rotate: false - xy: 2773, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-editor - rotate: false - xy: 1141, 39 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster-icon-editor - rotate: false - xy: 2167, 365 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-editor - rotate: false - xy: 2807, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-icon-editor - rotate: false - xy: 2841, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-editor - rotate: false - xy: 1207, 39 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -tsunami-icon-editor - rotate: false - xy: 1553, 267 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -underflow-gate-icon-editor - rotate: false - xy: 2875, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-icon-editor - rotate: false - xy: 2909, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault-icon-editor - rotate: false - xy: 1651, 267 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -water-extractor-icon-editor - rotate: false - xy: 1273, 39 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-icon-editor - rotate: false - xy: 1357, 169 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -white-tree-dead-icon-editor - rotate: false - xy: 1, 173 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-icon-editor - rotate: false - xy: 323, 173 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 - -sprites5.png -size: 4096,512 -format: rgba8888 -filter: nearest,nearest -repeat: none -alpha-bg - rotate: false - xy: 1, 16 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -bar - rotate: false - xy: 1869, 1 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 1801, 1 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -block-additive-reconstructor-large - rotate: false - xy: 1078, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-additive-reconstructor-medium - rotate: false - xy: 881, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-additive-reconstructor-small - rotate: false - xy: 3682, 351 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-additive-reconstructor-tiny - rotate: false - xy: 3640, 395 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-additive-reconstructor-xlarge - rotate: false - xy: 131, 96 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-air-factory-large - rotate: false - xy: 1120, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-air-factory-medium - rotate: false - xy: 915, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-air-factory-small - rotate: false - xy: 1186, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-air-factory-tiny - rotate: false - xy: 3640, 377 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-air-factory-xlarge - rotate: false - xy: 771, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-alloy-smelter-large - rotate: false - xy: 1162, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-alloy-smelter-medium - rotate: false - xy: 3464, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-alloy-smelter-small - rotate: false - xy: 1898, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 1060, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-alloy-smelter-xlarge - rotate: false - xy: 259, 307 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-large - rotate: false - xy: 1204, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-arc-medium - rotate: false - xy: 3498, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-arc-small - rotate: false - xy: 1212, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 2287, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-arc-xlarge - rotate: false - xy: 131, 46 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-armored-conveyor-large - rotate: false - xy: 1246, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-armored-conveyor-medium - rotate: false - xy: 3532, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-small - rotate: false - xy: 1924, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 309, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-armored-conveyor-xlarge - rotate: false - xy: 181, 96 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-basalt-large - rotate: false - xy: 1288, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-basalt-medium - rotate: false - xy: 3566, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-small - rotate: false - xy: 1950, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-basalt-tiny - rotate: false - xy: 2305, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-basalt-xlarge - rotate: false - xy: 259, 257 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-large - rotate: false - xy: 1330, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 1372, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 3600, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-large-small - rotate: false - xy: 1976, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 2323, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-large-xlarge - rotate: false - xy: 181, 46 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-medium - rotate: false - xy: 2287, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 2002, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 2341, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-xlarge - rotate: false - xy: 259, 207 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-drill-large - rotate: false - xy: 1414, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 2321, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 2028, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 2359, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-drill-xlarge - rotate: false - xy: 259, 157 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-mixer-large - rotate: false - xy: 1456, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 938, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 2054, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 2594, 71 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 857, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-forge-large - rotate: false - xy: 1498, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 972, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 1830, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-tiny - rotate: false - xy: 2594, 53 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-forge-xlarge - rotate: false - xy: 907, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-loader-large - rotate: false - xy: 1540, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-loader-medium - rotate: false - xy: 1006, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-loader-small - rotate: false - xy: 3711, 192 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-loader-tiny - rotate: false - xy: 2594, 35 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-loader-xlarge - rotate: false - xy: 957, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-unloader-large - rotate: false - xy: 1582, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-unloader-medium - rotate: false - xy: 1040, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-unloader-small - rotate: false - xy: 1238, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-unloader-tiny - rotate: false - xy: 2491, 184 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-unloader-xlarge - rotate: false - xy: 1007, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-boulder-large - rotate: false - xy: 1624, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-boulder-medium - rotate: false - xy: 1074, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-boulder-small - rotate: false - xy: 1264, 16 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-boulder-tiny - rotate: false - xy: 3757, 345 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-boulder-xlarge - rotate: false - xy: 1057, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conduit-large - rotate: false - xy: 1666, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 1108, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 1290, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 3775, 345 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conduit-xlarge - rotate: false - xy: 1107, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conveyor-large - rotate: false - xy: 1708, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1142, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1316, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 2594, 17 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conveyor-xlarge - rotate: false - xy: 1157, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-large - rotate: false - xy: 1750, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 1176, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 1342, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 2568, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-char-xlarge - rotate: false - xy: 1207, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliff-large - rotate: false - xy: 1792, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliff-medium - rotate: false - xy: 1210, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliff-small - rotate: false - xy: 1368, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliff-tiny - rotate: false - xy: 3781, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliff-xlarge - rotate: false - xy: 1257, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-coal-centrifuge-large - rotate: false - xy: 1834, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 1244, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 1394, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 2330, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-coal-centrifuge-xlarge - rotate: false - xy: 1307, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-combustion-generator-large - rotate: false - xy: 1876, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1278, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1420, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 2330, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-combustion-generator-xlarge - rotate: false - xy: 1357, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-command-center-large - rotate: false - xy: 1918, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1312, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 1446, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 2348, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-command-center-xlarge - rotate: false - xy: 1407, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conduit-large - rotate: false - xy: 1960, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1346, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 1472, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 2348, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conduit-xlarge - rotate: false - xy: 1457, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-container-large - rotate: false - xy: 2002, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1380, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 1498, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 2366, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-container-xlarge - rotate: false - xy: 1507, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conveyor-large - rotate: false - xy: 2044, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 1414, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 1524, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 2366, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conveyor-xlarge - rotate: false - xy: 1557, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-large - rotate: false - xy: 2086, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 2128, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1448, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 1550, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 2384, 173 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-large-xlarge - rotate: false - xy: 1607, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-medium - rotate: false - xy: 1482, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1576, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 2402, 173 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-xlarge - rotate: false - xy: 1657, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-foundation-large - rotate: false - xy: 2170, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 1516, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1602, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 2420, 173 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-foundation-xlarge - rotate: false - xy: 1707, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-nucleus-large - rotate: false - xy: 2212, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 1550, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 1628, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 2384, 155 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-nucleus-xlarge - rotate: false - xy: 1757, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-shard-large - rotate: false - xy: 2254, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 1584, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1654, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 2402, 155 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-shard-xlarge - rotate: false - xy: 1807, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-craters-large - rotate: false - xy: 2296, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 1618, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 1680, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 2420, 155 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-craters-xlarge - rotate: false - xy: 1857, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-large - rotate: false - xy: 2338, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-medium - rotate: false - xy: 1652, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-small - rotate: false - xy: 1706, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-tiny - rotate: false - xy: 2509, 184 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluid-mixer-xlarge - rotate: false - xy: 1907, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 2380, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 1686, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 3708, 339 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 2527, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cultivator-xlarge - rotate: false - xy: 1957, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cyclone-large - rotate: false - xy: 2422, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 1720, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 3702, 313 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 2545, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cyclone-xlarge - rotate: false - xy: 2007, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-boulder-large - rotate: false - xy: 2464, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-boulder-medium - rotate: false - xy: 1754, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-boulder-small - rotate: false - xy: 2123, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-boulder-tiny - rotate: false - xy: 3781, 156 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-boulder-xlarge - rotate: false - xy: 2057, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-large - rotate: false - xy: 2506, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-medium - rotate: false - xy: 1788, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-small - rotate: false - xy: 2491, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-tiny - rotate: false - xy: 3757, 327 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-wall-large - rotate: false - xy: 2548, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-wall-medium - rotate: false - xy: 1822, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-small - rotate: false - xy: 2517, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-wall-tiny - rotate: false - xy: 3775, 327 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-wall-xlarge - rotate: false - xy: 2107, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-xlarge - rotate: false - xy: 2157, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-metal-large - rotate: false - xy: 2590, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 1856, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 2543, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 2080, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-metal-xlarge - rotate: false - xy: 2207, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-1-large - rotate: false - xy: 2632, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 1890, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 2569, 219 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 2098, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-1-xlarge - rotate: false - xy: 2257, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-2-large - rotate: false - xy: 2674, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 1924, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 2595, 219 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 2527, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-2-xlarge - rotate: false - xy: 2307, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-3-large - rotate: false - xy: 2716, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 1958, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 2491, 202 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 2545, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge - rotate: false - xy: 2357, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-4-large - rotate: false - xy: 2758, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 1992, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 2517, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 2563, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-4-xlarge - rotate: false - xy: 2407, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-5-large - rotate: false - xy: 2800, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 2026, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 2543, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 2581, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-5-xlarge - rotate: false - xy: 2457, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-6-large - rotate: false - xy: 2842, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 2060, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 2569, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 2599, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-6-xlarge - rotate: false - xy: 2507, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-large - rotate: false - xy: 2884, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 2094, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 2595, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 2926, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 2128, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 2621, 235 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 2563, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-xlarge - rotate: false - xy: 2557, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-tiny - rotate: false - xy: 2581, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 2968, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 2162, 180 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 2621, 209 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 2599, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-xlarge - rotate: false - xy: 2607, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-xlarge - rotate: false - xy: 2657, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-deepwater-large - rotate: false - xy: 3010, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 2623, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 2647, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 2617, 165 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-deepwater-xlarge - rotate: false - xy: 2707, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-differential-generator-large - rotate: false - xy: 3052, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 2657, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 2673, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 2617, 147 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-differential-generator-xlarge - rotate: false - xy: 2757, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-diode-large - rotate: false - xy: 3094, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 2355, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 2699, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 2612, 129 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-diode-xlarge - rotate: false - xy: 2807, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dirt-large - rotate: false - xy: 3136, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-medium - rotate: false - xy: 2389, 217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-small - rotate: false - xy: 2647, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-tiny - rotate: false - xy: 2612, 111 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dirt-wall-large - rotate: false - xy: 3178, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-wall-medium - rotate: false - xy: 2423, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-small - rotate: false - xy: 2673, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-wall-tiny - rotate: false - xy: 2610, 93 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dirt-wall-xlarge - rotate: false - xy: 2857, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dirt-xlarge - rotate: false - xy: 2907, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-disassembler-large - rotate: false - xy: 3220, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 2457, 220 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 2699, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 2612, 75 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-disassembler-xlarge - rotate: false - xy: 2957, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-distributor-large - rotate: false - xy: 3262, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 2691, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 2725, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 2612, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-distributor-xlarge - rotate: false - xy: 3007, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-large - rotate: false - xy: 3304, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 3346, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 2725, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 2751, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 2612, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-large-xlarge - rotate: false - xy: 3057, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-medium - rotate: false - xy: 2759, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 2777, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 2612, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-xlarge - rotate: false - xy: 3107, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dune-wall-large - rotate: false - xy: 3388, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dune-wall-medium - rotate: false - xy: 2793, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-small - rotate: false - xy: 2803, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dune-wall-tiny - rotate: false - xy: 2635, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dune-wall-xlarge - rotate: false - xy: 3157, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-duo-large - rotate: false - xy: 3430, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 2827, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 2829, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 2653, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge - rotate: false - xy: 3207, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-large - rotate: false - xy: 3472, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-medium - rotate: false - xy: 2861, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-small - rotate: false - xy: 2855, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-tiny - rotate: false - xy: 2671, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-xlarge - rotate: false - xy: 3257, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-force-projector-large - rotate: false - xy: 3514, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 2895, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 2881, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 2689, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-force-projector-xlarge - rotate: false - xy: 3307, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-foreshadow-large - rotate: false - xy: 3556, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-foreshadow-medium - rotate: false - xy: 2929, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-foreshadow-small - rotate: false - xy: 2907, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-foreshadow-tiny - rotate: false - xy: 2707, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-foreshadow-xlarge - rotate: false - xy: 3357, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fuse-large - rotate: false - xy: 3598, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 2963, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 2933, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 2635, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 3407, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 4009, 281 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 2997, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 2959, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 2653, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 3457, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 1078, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 3031, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 2985, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 2671, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 3507, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ground-factory-large - rotate: false - xy: 1120, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ground-factory-medium - rotate: false - xy: 3065, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-small - rotate: false - xy: 3011, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ground-factory-tiny - rotate: false - xy: 2689, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ground-factory-xlarge - rotate: false - xy: 3557, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 1162, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 3099, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 3037, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 2707, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 3607, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 1204, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 3133, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 3063, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 2725, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 3657, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hyper-processor-large - rotate: false - xy: 1246, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hyper-processor-medium - rotate: false - xy: 3167, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hyper-processor-small - rotate: false - xy: 3089, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hyper-processor-tiny - rotate: false - xy: 2743, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hyper-processor-xlarge - rotate: false - xy: 3707, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 1288, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 3201, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 3115, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 1330, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 3235, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 3141, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 2761, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 3757, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 2779, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-large - rotate: false - xy: 1372, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-wall-medium - rotate: false - xy: 3269, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-small - rotate: false - xy: 3167, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-wall-tiny - rotate: false - xy: 2797, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-xlarge - rotate: false - xy: 3807, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 3857, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-illuminator-large - rotate: false - xy: 1414, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 3303, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 3193, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 2815, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge - rotate: false - xy: 3907, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 1456, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 3337, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 3219, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 2833, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 3957, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 1498, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 3371, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 3245, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 2851, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 4007, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 1540, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 918, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 3271, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 2869, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 345, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 1582, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 917, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 3297, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 2887, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 395, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 1624, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 952, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 3323, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 2905, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 445, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 1666, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 951, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 3349, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 2923, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 495, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 1708, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 986, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 3375, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 2941, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 545, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 1750, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 985, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 2621, 183 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 2959, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 595, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-large-logic-display-large - rotate: false - xy: 1792, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-large-logic-display-medium - rotate: false - xy: 1020, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-large-logic-display-small - rotate: false - xy: 2647, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-large-logic-display-tiny - rotate: false - xy: 2977, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-large-logic-display-xlarge - rotate: false - xy: 645, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 1834, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1019, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 2673, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 2995, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 695, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 1876, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 1918, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1054, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 2699, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 3013, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 231, 96 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1053, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 2725, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 3031, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 231, 46 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 1960, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1088, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 2751, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 3049, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 745, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 2002, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 1122, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 2777, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 3067, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 281, 107 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 2044, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 1156, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 2803, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 3085, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 281, 57 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 2086, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 1190, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 2829, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 3103, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 795, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-void-large - rotate: false - xy: 2128, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 1224, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-void-small - rotate: false - xy: 2855, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-void-tiny - rotate: false - xy: 3121, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-void-xlarge - rotate: false - xy: 309, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-display-large - rotate: false - xy: 2170, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 1258, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-display-small - rotate: false - xy: 2881, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-display-tiny - rotate: false - xy: 3139, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-display-xlarge - rotate: false - xy: 309, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-processor-large - rotate: false - xy: 2212, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-processor-medium - rotate: false - xy: 1292, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-processor-small - rotate: false - xy: 2907, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-processor-tiny - rotate: false - xy: 3157, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-processor-xlarge - rotate: false - xy: 359, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 2254, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1326, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 2933, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 3175, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 309, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 2296, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 1360, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 2959, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 3193, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 359, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 2338, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 1394, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 2985, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 3211, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 409, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 2380, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 1428, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 3011, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 3229, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 359, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 2422, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 1462, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 3037, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 3247, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 409, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 2464, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 1496, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 3063, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 3265, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 459, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-bank-large - rotate: false - xy: 2506, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-bank-medium - rotate: false - xy: 1530, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-bank-small - rotate: false - xy: 3089, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-bank-tiny - rotate: false - xy: 3283, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-bank-xlarge - rotate: false - xy: 409, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-cell-large - rotate: false - xy: 2548, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-cell-medium - rotate: false - xy: 1564, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-cell-small - rotate: false - xy: 3115, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-cell-tiny - rotate: false - xy: 3301, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-cell-xlarge - rotate: false - xy: 459, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 2590, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 1598, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 3141, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 3319, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 509, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 2632, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 1632, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 3167, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 3337, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 459, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 2674, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 1666, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 3193, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 3355, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 509, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 2716, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 1700, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 3219, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 3373, 136 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 559, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 2758, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 1734, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 3245, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 2630, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 509, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 2800, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 1768, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 3271, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 2648, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 559, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 2842, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 1802, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 3297, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 2666, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 609, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 2884, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 1836, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 3323, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 2684, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 559, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-micro-processor-large - rotate: false - xy: 2926, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-micro-processor-medium - rotate: false - xy: 1870, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-micro-processor-small - rotate: false - xy: 3349, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-micro-processor-tiny - rotate: false - xy: 2702, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-micro-processor-xlarge - rotate: false - xy: 609, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 2968, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 1904, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 3375, 180 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 2630, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 659, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mud-large - rotate: false - xy: 3010, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mud-medium - rotate: false - xy: 1938, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-small - rotate: false - xy: 3401, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mud-tiny - rotate: false - xy: 2648, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mud-xlarge - rotate: false - xy: 609, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 3052, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 1972, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 3427, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 2666, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 659, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-large - rotate: false - xy: 3094, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-medium - rotate: false - xy: 2006, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-small - rotate: false - xy: 3401, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-tiny - rotate: false - xy: 2684, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-xlarge - rotate: false - xy: 709, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-naval-factory-large - rotate: false - xy: 3136, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-naval-factory-medium - rotate: false - xy: 2040, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-naval-factory-small - rotate: false - xy: 3427, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-naval-factory-tiny - rotate: false - xy: 2702, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-naval-factory-xlarge - rotate: false - xy: 659, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 3178, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 2074, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 2142, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 2720, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 709, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-coal-large - rotate: false - xy: 3220, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-coal-medium - rotate: false - xy: 2108, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-small - rotate: false - xy: 2168, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-coal-tiny - rotate: false - xy: 2738, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-coal-xlarge - rotate: false - xy: 709, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-copper-large - rotate: false - xy: 3262, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-copper-medium - rotate: false - xy: 2142, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-small - rotate: false - xy: 2194, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-copper-tiny - rotate: false - xy: 2756, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-copper-xlarge - rotate: false - xy: 759, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-lead-large - rotate: false - xy: 3304, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-lead-medium - rotate: false - xy: 2176, 146 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-small - rotate: false - xy: 2220, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-lead-tiny - rotate: false - xy: 2774, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-lead-xlarge - rotate: false - xy: 759, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-scrap-large - rotate: false - xy: 3346, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-scrap-medium - rotate: false - xy: 2196, 180 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-small - rotate: false - xy: 2246, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-scrap-tiny - rotate: false - xy: 2792, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-scrap-xlarge - rotate: false - xy: 759, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-thorium-large - rotate: false - xy: 3388, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-thorium-medium - rotate: false - xy: 2230, 183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-small - rotate: false - xy: 2152, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-thorium-tiny - rotate: false - xy: 2810, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-thorium-xlarge - rotate: false - xy: 809, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-titanium-large - rotate: false - xy: 3430, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-titanium-medium - rotate: false - xy: 2210, 146 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-small - rotate: false - xy: 2152, 31 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-titanium-tiny - rotate: false - xy: 2828, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-titanium-xlarge - rotate: false - xy: 809, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-dome-large - rotate: false - xy: 3472, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-dome-medium - rotate: false - xy: 2244, 149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-dome-small - rotate: false - xy: 2149, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-dome-tiny - rotate: false - xy: 2846, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-dome-xlarge - rotate: false - xy: 809, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 3514, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 2573, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 2178, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 2864, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 809, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 3556, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 2725, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 2178, 31 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 2882, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 281, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-parallax-large - rotate: false - xy: 3598, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-parallax-medium - rotate: false - xy: 2759, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-small - rotate: false - xy: 2175, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-parallax-tiny - rotate: false - xy: 2900, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-parallax-xlarge - rotate: false - xy: 331, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-conveyor-large - rotate: false - xy: 3640, 335 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-conveyor-medium - rotate: false - xy: 2793, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-conveyor-small - rotate: false - xy: 2204, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-conveyor-tiny - rotate: false - xy: 2918, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-conveyor-xlarge - rotate: false - xy: 331, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-router-large - rotate: false - xy: 4051, 281 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-router-medium - rotate: false - xy: 2827, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-router-small - rotate: false - xy: 2204, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-router-tiny - rotate: false - xy: 2936, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-router-xlarge - rotate: false - xy: 381, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 859, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 2861, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 2230, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 2954, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 331, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 901, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 2895, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 2230, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 2972, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 381, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 859, 279 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 2929, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 2256, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 2990, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 431, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 943, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 859, 237 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 2963, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 2256, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 3008, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 381, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 2997, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 2272, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 3026, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 431, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 901, 279 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 3031, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 2282, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 3044, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 481, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 985, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 3065, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 2282, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 3062, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 431, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 859, 195 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 3099, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 3677, 173 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 3080, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 481, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-large - rotate: false - xy: 901, 237 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-medium - rotate: false - xy: 3133, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-small - rotate: false - xy: 3703, 166 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-tiny - rotate: false - xy: 3098, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-xlarge - rotate: false - xy: 531, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 943, 279 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 1027, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 3167, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 3729, 166 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 3116, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 481, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 3201, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 3737, 192 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 3134, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 531, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large - rotate: false - xy: 901, 195 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 3235, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-small - rotate: false - xy: 3755, 166 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plated-conduit-tiny - rotate: false - xy: 3152, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plated-conduit-xlarge - rotate: false - xy: 581, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 943, 237 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 3269, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 3728, 313 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 3170, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 531, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 985, 279 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 943, 195 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 3303, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 3711, 287 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 3188, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 581, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 3337, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 3737, 287 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 3206, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 631, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 985, 237 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 3371, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 3740, 261 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 3224, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 581, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 1027, 279 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 3405, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 3740, 235 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 3242, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 631, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 985, 195 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 3439, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 2389, 191 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 3260, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 681, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 1027, 237 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 3473, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 2415, 191 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 3278, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 631, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 1027, 195 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 3507, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 2441, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 3296, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 681, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1069, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 3541, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 3453, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 3314, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 731, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-resupply-point-large - rotate: false - xy: 1111, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-resupply-point-medium - rotate: false - xy: 3575, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-resupply-point-small - rotate: false - xy: 3479, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-resupply-point-tiny - rotate: false - xy: 3332, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-resupply-point-xlarge - rotate: false - xy: 681, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1069, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 3609, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 3505, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 3350, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 731, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 1153, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 3405, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 3531, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 3368, 118 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 731, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 1069, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 3439, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 3557, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 2720, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 331, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 1111, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 3473, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 3583, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 2738, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 381, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 1195, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 3507, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 3609, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 2756, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-large - rotate: false - xy: 1111, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-wall-medium - rotate: false - xy: 3541, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-small - rotate: false - xy: 3635, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-wall-tiny - rotate: false - xy: 2774, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-xlarge - rotate: false - xy: 431, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 481, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 1153, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 3575, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 1733, 12 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 2792, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 531, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 1237, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 3609, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 1759, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 2810, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 581, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 1153, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 3634, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 2725, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 2828, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-large - rotate: false - xy: 1195, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-wall-medium - rotate: false - xy: 3643, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-small - rotate: false - xy: 2751, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-wall-tiny - rotate: false - xy: 2846, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-xlarge - rotate: false - xy: 631, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 1279, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 3643, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 2777, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 2864, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 681, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 731, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 1195, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 917, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 2803, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 2882, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 781, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 1237, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 951, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 2829, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 2900, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 781, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 1321, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 985, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 2855, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 2918, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 781, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 1237, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 1019, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 2881, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 2936, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 831, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 1279, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 1363, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 1053, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 2907, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 2954, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 831, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 949, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 2933, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 2972, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 831, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large - rotate: false - xy: 1279, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-segment-medium - rotate: false - xy: 983, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-segment-small - rotate: false - xy: 2959, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-segment-tiny - rotate: false - xy: 2990, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-segment-xlarge - rotate: false - xy: 859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1321, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 1017, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 2985, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 3008, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1405, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 1051, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 3011, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 3026, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 1321, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 1088, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 3037, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 3044, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-large - rotate: false - xy: 1363, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-wall-medium - rotate: false - xy: 1122, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-small - rotate: false - xy: 3063, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-wall-tiny - rotate: false - xy: 3062, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-xlarge - rotate: false - xy: 1009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 1059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 1447, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 1156, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 3089, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 3080, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 1109, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 1363, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 1190, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 3115, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 3098, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 1159, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-crucible-large - rotate: false - xy: 1405, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-crucible-medium - rotate: false - xy: 1224, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-crucible-small - rotate: false - xy: 3141, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-crucible-tiny - rotate: false - xy: 3116, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-crucible-xlarge - rotate: false - xy: 1209, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 1489, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 1258, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 3167, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 3134, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 1259, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-slag-large - rotate: false - xy: 1405, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 1292, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 3193, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 3152, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge - rotate: false - xy: 1309, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-boulder-large - rotate: false - xy: 1447, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-boulder-medium - rotate: false - xy: 1326, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-small - rotate: false - xy: 3219, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-boulder-tiny - rotate: false - xy: 3170, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-boulder-xlarge - rotate: false - xy: 1359, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 1531, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 1360, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 1447, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1394, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 3245, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 3188, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 1409, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 3271, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 3206, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-large - rotate: false - xy: 1489, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-wall-medium - rotate: false - xy: 1428, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-small - rotate: false - xy: 3297, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-wall-tiny - rotate: false - xy: 3224, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-xlarge - rotate: false - xy: 1459, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 1509, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 1573, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 1489, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1462, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 3323, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 3242, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 1559, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1496, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 3349, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 3260, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 1609, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 1531, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 1530, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 3375, 154 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 3278, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 1659, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 1615, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 1564, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 3401, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 3296, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 1709, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 1531, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1598, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 3427, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 3314, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 1759, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 1573, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 1632, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 3453, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 3332, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 1809, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 1657, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1666, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 3479, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 3350, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 1859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 1573, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 1700, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 3505, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 3368, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 1909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 1615, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 1734, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 3531, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 2630, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 1959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-wall-large - rotate: false - xy: 1699, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-wall-medium - rotate: false - xy: 1768, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-wall-small - rotate: false - xy: 3557, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-wall-tiny - rotate: false - xy: 2630, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-wall-xlarge - rotate: false - xy: 2009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-steam-generator-large - rotate: false - xy: 1615, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-steam-generator-medium - rotate: false - xy: 1802, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-small - rotate: false - xy: 3583, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-steam-generator-tiny - rotate: false - xy: 2648, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-steam-generator-xlarge - rotate: false - xy: 2059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 1657, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1836, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 3609, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 2630, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-large - rotate: false - xy: 1741, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-wall-medium - rotate: false - xy: 1870, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-small - rotate: false - xy: 3635, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-wall-tiny - rotate: false - xy: 2648, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-xlarge - rotate: false - xy: 2109, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 2159, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 1657, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1904, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 2278, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 2666, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 2209, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 1699, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 1783, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1938, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 2298, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 2630, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 2259, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1972, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 2304, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 2648, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 2309, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 1699, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 2006, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 2308, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 2666, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 2359, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-switch-large - rotate: false - xy: 1741, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-switch-medium - rotate: false - xy: 2040, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-switch-small - rotate: false - xy: 2308, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-switch-tiny - rotate: false - xy: 2684, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-switch-xlarge - rotate: false - xy: 2409, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 1825, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 2074, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 2324, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 2702, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 2459, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 1741, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 2108, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 2330, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 2648, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 2509, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 1783, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 2142, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 2334, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 2666, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 2559, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-large - rotate: false - xy: 1867, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-medium - rotate: false - xy: 2176, 112 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-small - rotate: false - xy: 2334, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-tiny - rotate: false - xy: 2684, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-xlarge - rotate: false - xy: 2609, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 1783, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 2210, 112 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 2350, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 2666, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 2659, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 1825, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 2244, 115 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 2356, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 2684, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 2709, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 1909, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1087, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 2360, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 2702, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 2759, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 1825, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 1867, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1121, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 2360, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 2720, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 2809, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 1155, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 2376, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 2684, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 2859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 1951, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 1189, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 2382, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 2702, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 2909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 1867, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1223, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 2386, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 2720, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 2959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 1909, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 1993, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1257, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 2386, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 2738, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 3009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1291, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 2402, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 2702, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 3059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tsunami-large - rotate: false - xy: 1909, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tsunami-medium - rotate: false - xy: 1325, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tsunami-small - rotate: false - xy: 2408, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tsunami-tiny - rotate: false - xy: 2720, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tsunami-xlarge - rotate: false - xy: 3109, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-underflow-gate-large - rotate: false - xy: 1951, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-underflow-gate-medium - rotate: false - xy: 1359, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-underflow-gate-small - rotate: false - xy: 2412, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-underflow-gate-tiny - rotate: false - xy: 2738, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-underflow-gate-xlarge - rotate: false - xy: 3159, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 2035, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1393, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 2412, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 2756, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 3209, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 1951, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 1427, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 2428, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 2738, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 3259, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 1993, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1461, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 2434, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 2756, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 3309, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 2077, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 1495, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 2438, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 2774, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 3359, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 1993, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1529, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 2438, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 2756, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 3409, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 2035, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 1563, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 2454, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 2774, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 3459, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 2119, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 1597, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 2460, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 2792, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 3509, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 3011, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 4057, 484 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 4059, 455 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 4059, 426 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 4059, 397 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 4059, 368 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 4059, 339 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-disabled - rotate: false - xy: 4059, 339 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-over-4 - rotate: false - xy: 2497, 258 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 2707, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 2535, 258 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 2821, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 2745, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 2783, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 2464, 63 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 2935, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 2859, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 2897, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 2973, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 1631, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 1665, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1699, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 1733, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 1767, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1801, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 795, 354 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -crater - rotate: false - xy: 3453, 199 - size: 18, 18 - orig: 18, 18 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 845, 366 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -discord-banner - rotate: false - xy: 771, 466 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -flat-down-base - rotate: false - xy: 3049, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -info-banner - rotate: false - xy: 259, 357 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -inventory - rotate: false - xy: 2278, 141 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -item-blast-compound-icon - rotate: false - xy: 1835, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-icon - rotate: false - xy: 1869, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-icon - rotate: false - xy: 1903, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-icon - rotate: false - xy: 1937, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-icon - rotate: false - xy: 1971, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-icon - rotate: false - xy: 2005, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-icon - rotate: false - xy: 2039, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-icon - rotate: false - xy: 2073, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-icon - rotate: false - xy: 3473, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-icon - rotate: false - xy: 3507, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-icon - rotate: false - xy: 3541, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-icon - rotate: false - xy: 3575, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-icon - rotate: false - xy: 3609, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-icon - rotate: false - xy: 3643, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-icon - rotate: false - xy: 3668, 301 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-icon - rotate: false - xy: 3677, 267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-icon - rotate: false - xy: 3677, 233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-icon - rotate: false - xy: 3677, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-icon - rotate: false - xy: 1087, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-icon - rotate: false - xy: 1121, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-node - rotate: false - xy: 1155, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logo - rotate: false - xy: 1, 404 - size: 768, 107 - orig: 768, 107 - offset: 0, 0 - index: -1 -nomap - rotate: false - xy: 1, 146 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -pane - rotate: false - xy: 3125, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 3087, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 2464, 26 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 901, 169 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 859, 169 - size: 40, 24 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 2304, 141 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -scroll-knob-vertical-thin - rotate: false - xy: 3766, 245 - size: 12, 40 - orig: 12, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 309, 354 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 3754, 329 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 1970, 27 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 2001, 27 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 2032, 27 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 2194, 83 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 3315, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 3163, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 3201, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 3239, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-white - rotate: false - xy: 3277, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -unit-alpha-large - rotate: false - xy: 2035, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-alpha-medium - rotate: false - xy: 1189, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-alpha-small - rotate: false - xy: 2480, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-alpha-tiny - rotate: false - xy: 2774, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-alpha-xlarge - rotate: false - xy: 3559, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-antumbra-large - rotate: false - xy: 821, 421 - size: 36, 40 - orig: 36, 40 - offset: 0, 0 - index: -1 -unit-antumbra-medium - rotate: false - xy: 2063, 33 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-antumbra-small - rotate: false - xy: 3734, 339 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-antumbra-tiny - rotate: false - xy: 2607, 261 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-antumbra-xlarge - rotate: false - xy: 945, 363 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-arkyid-large - rotate: false - xy: 2077, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-arkyid-medium - rotate: false - xy: 1223, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-arkyid-small - rotate: false - xy: 2486, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-arkyid-tiny - rotate: false - xy: 2792, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-arkyid-xlarge - rotate: false - xy: 3609, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-atrax-large - rotate: false - xy: 2161, 298 - size: 40, 29 - orig: 40, 29 - offset: 0, 0 - index: -1 -unit-atrax-medium - rotate: false - xy: 1257, 42 - size: 32, 23 - orig: 32, 23 - offset: 0, 0 - index: -1 -unit-atrax-small - rotate: false - xy: 982, 6 - size: 24, 17 - orig: 24, 17 - offset: 0, 0 - index: -1 -unit-atrax-tiny - rotate: false - xy: 2707, 287 - size: 16, 11 - orig: 16, 11 - offset: 0, 0 - index: -1 -unit-atrax-xlarge - rotate: false - xy: 3659, 427 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -unit-beta-large - rotate: false - xy: 2077, 205 - size: 40, 38 - orig: 40, 38 - offset: 0, 0 - index: -1 -unit-beta-medium - rotate: false - xy: 1085, 1 - size: 32, 30 - orig: 32, 30 - offset: 0, 0 - index: -1 -unit-beta-small - rotate: false - xy: 2201, 1 - size: 24, 23 - orig: 24, 23 - offset: 0, 0 - index: -1 -unit-beta-tiny - rotate: false - xy: 2810, 83 - size: 16, 15 - orig: 16, 15 - offset: 0, 0 - index: -1 -unit-beta-xlarge - rotate: false - xy: 3709, 415 - size: 48, 46 - orig: 48, 46 - offset: 0, 0 - index: -1 -unit-bryde-large - rotate: false - xy: 2119, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-bryde-medium - rotate: false - xy: 1291, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-bryde-small - rotate: false - xy: 2227, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-bryde-tiny - rotate: false - xy: 2792, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-bryde-xlarge - rotate: false - xy: 3759, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-corvus-large - rotate: false - xy: 2203, 301 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-corvus-medium - rotate: false - xy: 916, 37 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-corvus-small - rotate: false - xy: 3740, 218 - size: 24, 15 - orig: 24, 15 - offset: 0, 0 - index: -1 -unit-corvus-tiny - rotate: false - xy: 771, 404 - size: 15, 10 - orig: 15, 10 - offset: 0, 0 - index: -1 -unit-corvus-xlarge - rotate: false - xy: 3809, 430 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-crawler-large - rotate: false - xy: 2161, 256 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-crawler-medium - rotate: false - xy: 1325, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-crawler-small - rotate: false - xy: 3763, 192 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-crawler-tiny - rotate: false - xy: 2810, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-crawler-xlarge - rotate: false - xy: 3859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-large - rotate: false - xy: 2203, 259 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-dagger-medium - rotate: false - xy: 1359, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-dagger-small - rotate: false - xy: 2490, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-dagger-tiny - rotate: false - xy: 2828, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-dagger-xlarge - rotate: false - xy: 3909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-large - rotate: false - xy: 2245, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-eclipse-medium - rotate: false - xy: 1393, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-eclipse-small - rotate: false - xy: 2490, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-eclipse-tiny - rotate: false - xy: 2810, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-eclipse-xlarge - rotate: false - xy: 3959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-large - rotate: false - xy: 2287, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-flare-medium - rotate: false - xy: 1427, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-flare-small - rotate: false - xy: 2506, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-flare-tiny - rotate: false - xy: 2828, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-flare-xlarge - rotate: false - xy: 4009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-large - rotate: false - xy: 2119, 211 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-fortress-medium - rotate: false - xy: 1119, 6 - size: 32, 25 - orig: 32, 25 - offset: 0, 0 - index: -1 -unit-fortress-small - rotate: false - xy: 1008, 4 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-fortress-tiny - rotate: false - xy: 3754, 313 - size: 16, 12 - orig: 16, 12 - offset: 0, 0 - index: -1 -unit-fortress-xlarge - rotate: false - xy: 3809, 390 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-gamma-large - rotate: false - xy: 2161, 214 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-gamma-medium - rotate: false - xy: 1461, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-gamma-small - rotate: false - xy: 2512, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-gamma-tiny - rotate: false - xy: 2846, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-gamma-xlarge - rotate: false - xy: 3659, 377 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-horizon-large - rotate: false - xy: 2203, 217 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-horizon-medium - rotate: false - xy: 1495, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-horizon-small - rotate: false - xy: 2516, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-horizon-tiny - rotate: false - xy: 2846, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-horizon-xlarge - rotate: false - xy: 3709, 365 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mace-large - rotate: false - xy: 2245, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mace-medium - rotate: false - xy: 1529, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mace-small - rotate: false - xy: 2516, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mace-tiny - rotate: false - xy: 2864, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mace-xlarge - rotate: false - xy: 3759, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mega-large - rotate: false - xy: 2329, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mega-medium - rotate: false - xy: 1563, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mega-small - rotate: false - xy: 2532, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mega-tiny - rotate: false - xy: 2864, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mega-xlarge - rotate: false - xy: 3809, 340 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-minke-large - rotate: false - xy: 881, 85 - size: 34, 40 - orig: 34, 40 - offset: 0, 0 - index: -1 -unit-minke-medium - rotate: false - xy: 2123, 33 - size: 27, 32 - orig: 27, 32 - offset: 0, 0 - index: -1 -unit-minke-small - rotate: false - xy: 309, 178 - size: 20, 24 - orig: 20, 24 - offset: 0, 0 - index: -1 -unit-minke-tiny - rotate: false - xy: 1785, 15 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-minke-xlarge - rotate: false - xy: 1035, 363 - size: 41, 48 - orig: 41, 48 - offset: 0, 0 - index: -1 -unit-mono-large - rotate: false - xy: 2287, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mono-medium - rotate: false - xy: 1597, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mono-small - rotate: false - xy: 2538, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mono-tiny - rotate: false - xy: 2882, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mono-xlarge - rotate: false - xy: 3859, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-large - rotate: false - xy: 2371, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-nova-medium - rotate: false - xy: 1631, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-nova-small - rotate: false - xy: 2542, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-nova-tiny - rotate: false - xy: 2882, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-nova-xlarge - rotate: false - xy: 3909, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-oct-large - rotate: false - xy: 2329, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-oct-medium - rotate: false - xy: 1665, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-oct-small - rotate: false - xy: 2542, 37 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-oct-tiny - rotate: false - xy: 2900, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-oct-xlarge - rotate: false - xy: 3959, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-omura-large - rotate: false - xy: 2093, 25 - size: 28, 40 - orig: 28, 40 - offset: 0, 0 - index: -1 -unit-omura-medium - rotate: false - xy: 2467, 186 - size: 22, 32 - orig: 22, 32 - offset: 0, 0 - index: -1 -unit-omura-small - rotate: false - xy: 3763, 287 - size: 16, 24 - orig: 16, 24 - offset: 0, 0 - index: -1 -unit-omura-tiny - rotate: false - xy: 1856, 15 - size: 11, 16 - orig: 11, 16 - offset: 0, 0 - index: -1 -unit-omura-xlarge - rotate: false - xy: 881, 35 - size: 33, 48 - orig: 33, 48 - offset: 0, 0 - index: -1 -unit-poly-large - rotate: false - xy: 2413, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-poly-medium - rotate: false - xy: 1699, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-poly-small - rotate: false - xy: 2558, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-poly-tiny - rotate: false - xy: 2900, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-poly-xlarge - rotate: false - xy: 4009, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-pulsar-large - rotate: false - xy: 2371, 251 - size: 40, 34 - orig: 40, 34 - offset: 0, 0 - index: -1 -unit-pulsar-medium - rotate: false - xy: 1733, 38 - size: 32, 27 - orig: 32, 27 - offset: 0, 0 - index: -1 -unit-pulsar-small - rotate: false - xy: 1034, 3 - size: 24, 20 - orig: 24, 20 - offset: 0, 0 - index: -1 -unit-pulsar-tiny - rotate: false - xy: 1, 1 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-pulsar-xlarge - rotate: false - xy: 131, 4 - size: 48, 40 - orig: 48, 40 - offset: 0, 0 - index: -1 -unit-quad-large - rotate: false - xy: 2455, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quad-medium - rotate: false - xy: 1937, 34 - size: 31, 31 - orig: 31, 31 - offset: 0, 0 - index: -1 -unit-quad-small - rotate: false - xy: 2564, 115 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quad-tiny - rotate: false - xy: 2828, 47 - size: 15, 15 - orig: 15, 15 - offset: 0, 0 - index: -1 -unit-quad-xlarge - rotate: false - xy: 3859, 313 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-quasar-large - rotate: false - xy: 2497, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quasar-medium - rotate: false - xy: 1767, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-quasar-small - rotate: false - xy: 2568, 63 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quasar-tiny - rotate: false - xy: 2918, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-quasar-xlarge - rotate: false - xy: 3909, 313 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-reign-large - rotate: false - xy: 2245, 217 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-reign-medium - rotate: false - xy: 949, 3 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-reign-small - rotate: false - xy: 2568, 46 - size: 24, 15 - orig: 24, 15 - offset: 0, 0 - index: -1 -unit-reign-tiny - rotate: false - xy: 181, 1 - size: 15, 10 - orig: 15, 10 - offset: 0, 0 - index: -1 -unit-reign-xlarge - rotate: false - xy: 181, 13 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-risso-large - rotate: false - xy: 881, 127 - size: 35, 40 - orig: 35, 40 - offset: 0, 0 - index: -1 -unit-risso-medium - rotate: false - xy: 2107, 67 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-risso-small - rotate: false - xy: 2264, 191 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-risso-tiny - rotate: false - xy: 3661, 175 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-risso-xlarge - rotate: false - xy: 990, 363 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-scepter-large - rotate: false - xy: 2413, 253 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-scepter-medium - rotate: false - xy: 1801, 39 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-scepter-small - rotate: false - xy: 2490, 16 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-scepter-tiny - rotate: false - xy: 19, 1 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-scepter-xlarge - rotate: false - xy: 231, 5 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-sei-large - rotate: false - xy: 2539, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-sei-medium - rotate: false - xy: 1835, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-sei-small - rotate: false - xy: 2516, 11 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-sei-tiny - rotate: false - xy: 2918, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-sei-xlarge - rotate: false - xy: 3959, 313 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-spiroct-large - rotate: false - xy: 2455, 254 - size: 40, 31 - orig: 40, 31 - offset: 0, 0 - index: -1 -unit-spiroct-medium - rotate: false - xy: 1153, 6 - size: 31, 25 - orig: 31, 25 - offset: 0, 0 - index: -1 -unit-spiroct-small - rotate: false - xy: 2542, 16 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-spiroct-tiny - rotate: false - xy: 3772, 313 - size: 15, 12 - orig: 15, 12 - offset: 0, 0 - index: -1 -unit-spiroct-xlarge - rotate: false - xy: 4009, 323 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-toxopid-large - rotate: false - xy: 3429, 287 - size: 33, 40 - orig: 33, 40 - offset: 0, 0 - index: -1 -unit-toxopid-medium - rotate: false - xy: 781, 170 - size: 26, 32 - orig: 26, 32 - offset: 0, 0 - index: -1 -unit-toxopid-small - rotate: false - xy: 2590, 115 - size: 20, 24 - orig: 20, 24 - offset: 0, 0 - index: -1 -unit-toxopid-tiny - rotate: false - xy: 3793, 345 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-toxopid-xlarge - rotate: false - xy: 2581, 279 - size: 40, 48 - orig: 40, 48 - offset: 0, 0 - index: -1 -unit-vela-large - rotate: false - xy: 2623, 295 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-vela-medium - rotate: false - xy: 1869, 39 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-vela-small - rotate: false - xy: 2568, 25 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-vela-tiny - rotate: false - xy: 37, 1 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-vela-xlarge - rotate: false - xy: 845, 372 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-zenith-large - rotate: false - xy: 2665, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-zenith-medium - rotate: false - xy: 1903, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-zenith-small - rotate: false - xy: 2584, 89 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-zenith-tiny - rotate: false - xy: 2936, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-zenith-xlarge - rotate: false - xy: 895, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wavepane - rotate: false - xy: 3353, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -white-pane - rotate: false - xy: 3391, 300 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 821, 416 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 3711, 218 - size: 27, 61 - split: 4, 4, 2, 2 - orig: 27, 61 - offset: 0, 0 - index: -1 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png deleted file mode 100644 index 6a698b472a..0000000000 Binary files a/core/assets/sprites/sprites.png and /dev/null differ diff --git a/core/assets/sprites/sprites2.png b/core/assets/sprites/sprites2.png deleted file mode 100644 index dd7bbf01c6..0000000000 Binary files a/core/assets/sprites/sprites2.png and /dev/null differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png deleted file mode 100644 index 6e90118bff..0000000000 Binary files a/core/assets/sprites/sprites3.png and /dev/null differ diff --git a/core/assets/sprites/sprites4.png b/core/assets/sprites/sprites4.png deleted file mode 100644 index 1a7eeb2a5c..0000000000 Binary files a/core/assets/sprites/sprites4.png and /dev/null differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png deleted file mode 100644 index 9fb3b87450..0000000000 Binary files a/core/assets/sprites/sprites5.png and /dev/null differ diff --git a/core/build.gradle b/core/build.gradle index caba473d6c..f7f291ef1a 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1 +1,2 @@ sourceSets.main.java.srcDirs = ["src/", "$buildDir/generated/sources/annotationProcessor/java/main"] +sourceSets.main.kotlin.srcDirs = ["src/"] \ No newline at end of file diff --git a/core/src/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java index 553c4ce2cc..6042a38b19 100644 --- a/core/src/mindustry/ClientLauncher.java +++ b/core/src/mindustry/ClientLauncher.java @@ -9,6 +9,7 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; import arc.util.async.*; +import mindustry.ai.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.EventType.*; @@ -33,6 +34,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform @Override public void setup(){ + String dataDir = OS.env("MINDUSTRY_DATA_DIR"); + if(dataDir != null){ + Core.settings.setDataDirectory(files.absolute(dataDir)); + } + + checkLaunch(); loadLogger(); loader = new LoadRenderer(); @@ -40,12 +47,14 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform loadFileLogger(); platform = this; + maxTextureSize = Gl.getInt(Gl.maxTextureSize); beginTime = Time.millis(); //debug GL information Log.info("[GL] Version: @", graphics.getGLVersion()); - Log.info("[GL] Max texture size: @", Gl.getInt(Gl.maxTextureSize)); + Log.info("[GL] Max texture size: @", maxTextureSize); Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2"); + if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues."); Log.info("[JAVA] Version: @", System.getProperty("java.version")); Time.setDeltaProvider(() -> { @@ -74,11 +83,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Fonts.loadDefaultFont(); //load fallback atlas if max texture size is below 4096 - assets.load(new AssetDescriptor<>(Gl.getInt(Gl.maxTextureSize) >= 4096 ? "sprites/sprites.atlas" : "sprites/fallback/sprites.atlas", TextureAtlas.class)).loaded = t -> { - atlas = (TextureAtlas)t; - Fonts.mergeFontAtlas(atlas); - }; - + assets.load(new AssetDescriptor<>(maxTextureSize >= 4096 ? "sprites/sprites.aatls" : "sprites/fallback/sprites.aatls", TextureAtlas.class)).loaded = t -> atlas = (TextureAtlas)t; assets.loadRun("maps", Map.class, () -> maps.loadPreviews()); Musics.load(); @@ -92,6 +97,9 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform content.createModContent(); }); + assets.load(mods); + assets.loadRun("mergeUI", PixmapPacker.class, () -> {}, () -> Fonts.mergeFontAtlas(atlas)); + add(logic = new Logic()); add(control = new Control()); add(renderer = new Renderer()); @@ -99,10 +107,10 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform add(netServer = new NetServer()); add(netClient = new NetClient()); - assets.load(mods); assets.load(schematics); assets.loadRun("contentinit", ContentLoader.class, () -> content.init(), () -> content.load()); + assets.loadRun("baseparts", BaseRegistry.class, () -> {}, () -> bases.load()); } @Override @@ -110,8 +118,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform super.add(module); //autoload modules when necessary - if(module instanceof Loadable){ - assets.load((Loadable)module); + if(module instanceof Loadable l){ + assets.load(l); } } @@ -135,15 +143,21 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform if(assets.update(1000 / loadingFPS)){ loader.dispose(); loader = null; - Log.info("Total time to load: @", Time.timeSinceMillis(beginTime)); + Log.info("Total time to load: @ms", Time.timeSinceMillis(beginTime)); for(ApplicationListener listener : modules){ listener.init(); } mods.eachClass(Mod::init); finished = true; Events.fire(new ClientLoadEvent()); + clientLoaded = true; super.resize(graphics.getWidth(), graphics.getHeight()); - app.post(() -> app.post(() -> app.post(() -> app.post(() -> super.resize(graphics.getWidth(), graphics.getHeight()))))); + app.post(() -> app.post(() -> app.post(() -> app.post(() -> { + super.resize(graphics.getWidth(), graphics.getHeight()); + + //mark initialization as complete + finishLaunch(); + })))); } }else{ asyncCore.begin(); @@ -166,6 +180,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform lastTime = Time.nanos(); } + @Override + public void exit(){ + //on graceful exit, finish the launch normally. + Vars.finishLaunch(); + } + @Override public void init(){ setup(); @@ -180,6 +200,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform @Override public void pause(){ + //when the user tabs out on mobile, the exit() event doesn't fire reliably - in that case, just assume they're about to kill the app + //this isn't 100% reliable but it should work for most cases + if(mobile){ + Vars.finishLaunch(); + } if(finished){ super.pause(); } diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 99d5567fda..2c263508cf 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -10,19 +10,23 @@ import arc.util.*; import arc.util.Log.*; import mindustry.ai.*; import mindustry.async.*; -import mindustry.audio.*; import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.editor.*; import mindustry.entities.*; -import mindustry.game.*; import mindustry.game.EventType.*; +import mindustry.game.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.input.*; import mindustry.io.*; +import mindustry.logic.*; import mindustry.maps.Map; import mindustry.maps.*; import mindustry.mod.*; import mindustry.net.Net; import mindustry.net.*; +import mindustry.service.*; import mindustry.world.*; import java.io.*; @@ -32,10 +36,20 @@ import java.util.*; import static arc.Core.*; public class Vars implements Loadable{ + /** Whether the game failed to launch last time. */ + public static boolean failedToLaunch = false; /** Whether to load locales.*/ public static boolean loadLocales = true; /** Whether the logger is loaded. */ public static boolean loadedLogger = false, loadedFileLogger = false; + /** Whether to enable various experimental features (e.g. cliffs) */ + public static boolean experimental = false; + /** Name of current Steam player. */ + public static String steamPlayerName = ""; + /** Default accessible content types used for player-selectable icons. */ + public static final ContentType[] defaultContentIcons = {ContentType.item, ContentType.liquid, ContentType.block}; + /** Wall darkness radius. */ + public static final int darkRadius = 4; /** Maximum extra padding around deployment schematics. */ public static final int maxLoadoutSchematicPad = 5; /** Maximum schematic size.*/ @@ -48,24 +62,24 @@ public class Vars implements Loadable{ public static final Charset charset = Charset.forName("UTF-8"); /** main application name, capitalized */ public static final String appName = "Mindustry"; - /** URL for itch.io donations. */ - public static final String donationURL = "https://anuke.itch.io/mindustry/purchase"; + /** Github API URL. */ + public static final String ghApi = "https://api.github.com"; /** URL for discord invite. */ public static final String discordURL = "https://discord.gg/mindustry"; - /** URL for sending crash reports to */ + /** URL for sending crash reports to. Currently offline. */ public static final String crashReportURL = "http://192.99.169.18/report"; /** URL the links to the wiki's modding guide.*/ - public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/"; - /** URL to the JSON file containing all the global, public servers. Not queried in BE. */ - public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json"; + public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/"; /** URL to the JSON file containing all the BE servers. Only queried in BE. */ public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; - /** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */ - public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; + /** URL to the JSON file containing all the stable servers. */ + public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; /** URL of the github issue report template.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; /** list of built-in servers.*/ - public static final Seq defaultServers = Seq.with(); + public static final Seq defaultServers = Seq.with(); + /** maximum size of any block, do not change unless you know what you're doing */ + public static final int maxBlockSize = 16; /** maximum distance between mine and core that supports automatic transferring */ public static final float mineTransferRange = 220f; /** max chat message length */ @@ -75,17 +89,19 @@ public class Vars implements Loadable{ /** displayed item size when ingame. */ public static final float itemSize = 5f; /** units outside of this bound will die instantly */ - public static final float finalWorldBounds = 500; - /** mining range for manual miners */ - public static final float miningRange = 70f; + public static final float finalWorldBounds = 250; /** range for building */ public static final float buildingRange = 220f; /** range for moving items */ public static final float itemTransferRange = 220f; + /** range for moving items for logic units */ + public static final float logicItemTransferRange = 45f; /** duration of time between turns in ticks */ - public static final float turnDuration = 20 * Time.toMinutes; - /** turns needed to destroy a sector completely */ - public static final float sectorDestructionTurns = 3f; + public static final float turnDuration = 2 * Time.toMinutes; + /** chance of an invasion per turn, 1 = 100% */ + public static final float baseInvasionChance = 1f / 100f; + /** how many minutes have to pass before invasions in a *captured* sector start */ + public static final float invasionGracePeriod = 20; /** min armor fraction damage; e.g. 0.05 = at least 5% damage */ public static final float minArmorDamage = 0.1f; /** launch animation duration */ @@ -94,6 +110,8 @@ public class Vars implements Loadable{ public static final int tilesize = 8; /** size of one tile payload (^2) */ public static final float tilePayload = tilesize * tilesize; + /** icon sizes for UI */ + public static final float iconXLarge = 8*6f, iconLarge = 8*5f, iconMed = 8*4f, iconSmall = 8*3f; /** tile used in certain situations, instead of null */ public static Tile emptyTile; /** for map generator dialog */ @@ -123,6 +141,14 @@ public class Vars implements Loadable{ public static final int multicastPort = 20151; /** multicast group for discovery.*/ public static final String multicastGroup = "227.2.7.7"; + /** whether the graphical game client has loaded */ + public static boolean clientLoaded = false; + /** max GL texture size */ + public static int maxTextureSize = 2048; + /** Whether to show the core landing animation. */ + public static boolean showLandAnimation = true; + /** Whether to prompt the user to confirm exiting. */ + public static boolean confirmExit = true; /** if true, UI is not drawn */ public static boolean disableUI; /** if true, game is set up in mobile mode, even on desktop. used for debugging */ @@ -164,6 +190,8 @@ public class Vars implements Loadable{ public static Fi schematicDirectory; /** data subdirectory used for bleeding edge build versions */ public static Fi bebuildDirectory; + /** file used to store launch ID */ + public static Fi launchIDFile; /** empty map, indicates no current map */ public static Map emptyMap; /** map file extension */ @@ -181,15 +209,16 @@ public class Vars implements Loadable{ public static ContentLoader content; public static GameState state; public static EntityCollisions collisions; - public static DefaultWaves defaultWaves; - public static mindustry.audio.LoopControl loops; + public static Waves waves; public static Platform platform = new Platform(){}; public static Mods mods; public static Schematics schematics; public static BeControl becontrol; public static AsyncCore asyncCore; - public static TeamIndexProcess teamIndex; public static BaseRegistry bases; + public static GlobalConstants constants; + public static MapEditor editor; + public static GameService service = new GameService(); public static Universe universe; public static World world; @@ -230,9 +259,11 @@ public class Vars implements Loadable{ } Arrays.sort(locales, Structs.comparing(l -> l.getDisplayName(l), String.CASE_INSENSITIVE_ORDER)); + locales = Seq.with(locales).and(new Locale("router")).toArray(Locale.class); } Version.init(); + CacheLayer.init(); dataDirectory = settings.getDataDirectory(); screenshotDirectory = dataDirectory.child("screenshots/"); @@ -250,19 +281,20 @@ public class Vars implements Loadable{ if(mods == null) mods = new Mods(); content = new ContentLoader(); - loops = new LoopControl(); - defaultWaves = new DefaultWaves(); + waves = new Waves(); collisions = new EntityCollisions(); world = new World(); universe = new Universe(); becontrol = new BeControl(); asyncCore = new AsyncCore(); + if(!headless) editor = new MapEditor(); maps = new Maps(); spawner = new WaveSpawner(); indexer = new BlockIndexer(); pathfinder = new Pathfinder(); bases = new BaseRegistry(); + constants = new GlobalConstants(); state = new GameState(); @@ -276,14 +308,35 @@ public class Vars implements Loadable{ maps.load(); } + /** Checks if a launch failure occurred. + * If this is the case, failedToLaunch is set to true. */ + public static void checkLaunch(){ + settings.setAppName(appName); + launchIDFile = settings.getDataDirectory().child("launchid.dat"); + + if(launchIDFile.exists()){ + failedToLaunch = true; + }else{ + failedToLaunch = false; + launchIDFile.writeString("go away"); + } + } + + /** Cleans up after a successful launch. */ + public static void finishLaunch(){ + if(launchIDFile != null){ + launchIDFile.delete(); + } + } + public static void loadLogger(){ if(loadedLogger) return; String[] tags = {"[green][D][]", "[royal][I][]", "[yellow][W][]", "[scarlet][E][]", ""}; - String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + String[] stags = {"&lc&fb[D]", "&lb&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; Seq logBuffer = new Seq<>(); - Log.setLogger((level, text) -> { + Log.logger = (level, text) -> { String result = text; String rawText = Log.format(stags[level.ordinal()] + "&fr " + text); System.out.println(rawText); @@ -299,9 +352,9 @@ public class Vars implements Loadable{ } } - ui.scriptfrag.addMessage(Log.removeCodes(result)); + ui.scriptfrag.addMessage(Log.removeColors(result)); } - }); + }; Events.on(ClientLoadEvent.class, e -> logBuffer.each(ui.scriptfrag::addMessage)); @@ -313,25 +366,31 @@ public class Vars implements Loadable{ settings.setAppName(appName); - Writer writer = settings.getDataDirectory().child("last_log.txt").writer(false); - LogHandler log = Log.getLogger(); - Log.setLogger((level, text) -> { - log.log(level, text); + try{ + Writer writer = settings.getDataDirectory().child("last_log.txt").writer(false); + LogHandler log = Log.logger; + //ignore it + Log.logger = (level, text) -> { + log.log(level, text); - try{ - writer.write("[" + Character.toUpperCase(level.name().charAt(0)) +"] " + Log.removeCodes(text) + "\n"); - writer.flush(); - }catch(IOException e){ - e.printStackTrace(); - //ignore it - } - }); + try{ + writer.write("[" + Character.toUpperCase(level.name().charAt(0)) +"] " + Log.removeColors(text) + "\n"); + writer.flush(); + }catch(IOException e){ + e.printStackTrace(); + //ignore it + } + }; + }catch(Exception e){ + //handle log file not being found + Log.err(e); + } loadedFileLogger = true; } public static void loadSettings(){ - settings.setJson(JsonIO.json()); + settings.setJson(JsonIO.json); settings.setAppName(appName); if(steam || (Version.modifier != null && Version.modifier.contains("steam"))){ @@ -357,7 +416,7 @@ public class Vars implements Loadable{ 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.")); + Time.run(10f, () -> ui.showInfo("Note: You have successfully loaded an external translation bundle.\n[accent]" + handle.absolutePath())); } }catch(Throwable e){ //no external bundle found @@ -381,6 +440,11 @@ public class Vars implements Loadable{ Locale.setDefault(locale); Core.bundle = I18NBundle.createBundle(handle, locale); + + //router + if(locale.getDisplayName().equals("router")){ + bundle.debug("router"); + } } } } diff --git a/core/src/mindustry/ai/Astar.java b/core/src/mindustry/ai/Astar.java index c6f33e70f6..df50547d22 100644 --- a/core/src/mindustry/ai/Astar.java +++ b/core/src/mindustry/ai/Astar.java @@ -6,7 +6,7 @@ import arc.struct.*; import arc.util.*; import mindustry.world.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class Astar{ public static final DistanceHeuristic manhattan = (x1, y1, x2, y2) -> Math.abs(x1 - x2) + Math.abs(y1 - y2); diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index 83f393cc83..bebbdc1e8c 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -7,6 +7,7 @@ import arc.util.*; import mindustry.*; import mindustry.ai.BaseRegistry.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.game.*; import mindustry.game.Schematic.*; import mindustry.game.Teams.*; @@ -14,46 +15,130 @@ import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.defense.*; +import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.storage.*; +import mindustry.world.blocks.storage.CoreBlock.*; import static mindustry.Vars.*; public class BaseAI{ private static final Vec2 axis = new Vec2(), rotator = new Vec2(); private static final float correctPercent = 0.5f; - private static final float step = 5; - private static final int attempts = 5; + private static final int attempts = 4; private static final float emptyChance = 0.01f; - private static final int timerStep = 0, timerSpawn = 1; + private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2; + private static final int pathStep = 50; + private static final Seq tmpTiles = new Seq<>(); private static int correct = 0, incorrect = 0; private int lastX, lastY, lastW, lastH; - private boolean triedWalls; + private boolean triedWalls, foundPath; TeamData data; Interval timer = new Interval(4); + IntSet path = new IntSet(); + IntSet calcPath = new IntSet(); + @Nullable Tile calcTile; + boolean calculating, startedCalculating; + int calcCount = 0; + int totalCalcs = 0; + public BaseAI(TeamData data){ this.data = data; } public void update(){ - if(timer.get(timerSpawn, 60) && data.hasCore()){ + if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){ CoreBlock block = (CoreBlock)data.core().block; + int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType); - //create AI core unit - if(!Groups.unit.contains(u -> u.team() == data.team && u.type() == block.unitType)){ + //create AI core unit(s) + if(!state.isEditor() && coreUnits < data.cores.size){ Unit unit = block.unitType.create(data.team); - unit.set(data.core()); + unit.set(data.cores.random()); unit.add(); Fx.spawn.at(unit); } } + //refresh path + if(!calculating && (timer.get(timerRefreshPath, 3f * Time.toMinutes) || !startedCalculating) && data.hasCore()){ + calculating = true; + startedCalculating = true; + calcPath.clear(); + } + + //didn't find tile in time + if(calculating && calcCount >= world.width() * world.height()){ + calculating = false; + calcCount = 0; + calcPath.clear(); + totalCalcs ++; + } + + //calculate path for units so schematics are not placed on it + if(calculating){ + if(calcTile == null){ + Vars.spawner.eachGroundSpawn((x, y) -> calcTile = world.tile(x, y)); + if(calcTile == null){ + calculating = false; + } + }else{ + var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore); + + int[][] weights = field.weights; + for(int i = 0; i < pathStep; i++){ + int minCost = Integer.MAX_VALUE; + int cx = calcTile.x, cy = calcTile.y; + boolean foundAny = false; + for(Point2 p : Geometry.d4){ + int nx = cx + p.x, ny = cy + p.y; + + Tile other = world.tile(nx, ny); + if(other != null && weights[nx][ny] < minCost && weights[nx][ny] != -1){ + minCost = weights[nx][ny]; + calcTile = other; + foundAny = true; + } + } + + //didn't find anything, break out of loop, this will trigger a clear later + if(!foundAny){ + calcCount = Integer.MAX_VALUE; + break; + } + + calcPath.add(calcTile.pos()); + for(Point2 p : Geometry.d8){ + calcPath.add(Point2.pack(p.x + calcTile.x, p.y + calcTile.y)); + } + + //found the end. + if(calcTile.build instanceof CoreBuild b && b.team == state.rules.defaultTeam){ + //clean up calculations and flush results + calculating = false; + calcCount = 0; + path.clear(); + path.addAll(calcPath); + calcPath.clear(); + calcTile = null; + totalCalcs ++; + foundPath = true; + + break; + } + + calcCount ++; + } + } + } + //only schedule when there's something to build. - if(data.blocks.isEmpty() && timer.get(timerStep, step)){ + if(foundPath && data.blocks.isEmpty() && timer.get(timerStep, Mathf.lerp(20f, 4f, data.team.rules().aiTier))){ if(!triedWalls){ tryWalls(); triedWalls = true; @@ -68,9 +153,14 @@ public class BaseAI{ if(pos == null) return; Tmp.v1.rnd(Mathf.random(range)); - int wx = (int)(world.toTile(pos.getX()) + Tmp.v1.x), wy = (int)(world.toTile(pos.getY()) + Tmp.v1.y); + int wx = (int)(World.toTile(pos.getX()) + Tmp.v1.x), wy = (int)(World.toTile(pos.getY()) + Tmp.v1.y); Tile tile = world.tiles.getc(wx, wy); + //try not to block the spawn point + if(spawner.getSpawns().contains(t -> t.within(tile, tilesize * 40f))){ + continue; + } + Seq parts = null; //pick a completely random base part, and place it a random location @@ -111,26 +201,45 @@ public class BaseAI{ int cx = x - (int)rotator.x; int cy = y - (int)rotator.y; - //chekc valid placeability + //check valid placeability for(Stile tile : result.tiles){ int realX = tile.x + cx, realY = tile.y + cy; if(!Build.validPlace(tile.block, data.team, realX, realY, tile.rotation)){ return false; } + Tile wtile = world.tile(realX, realY); + + if(tile.block instanceof PayloadConveyor || tile.block instanceof PayloadBlock){ + //near a building + for(Point2 point : Edges.getEdges(tile.block.size)){ + var t = world.build(tile.x + point.x, tile.y + point.y); + if(t != null){ + return false; + } + } + } + + //may intersect AI path + tmpTiles.clear(); + if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){ + return false; + } } //make sure at least X% of resource requirements are met correct = incorrect = 0; + boolean anyDrills = false; if(part.required instanceof Item){ for(Stile tile : result.tiles){ if(tile.block instanceof Drill){ + anyDrills = true; tile.block.iterateTaken(tile.x + cx, tile.y + cy, (ex, ey) -> { Tile res = world.rawTile(ex, ey); if(res.drop() == part.required){ correct ++; - }else{ + }else if(res.drop() != null){ incorrect ++; } }); @@ -139,7 +248,7 @@ public class BaseAI{ } //fail if not enough fit requirements - if((float)correct / incorrect < correctPercent){ + if(anyDrills && (incorrect != 0 || correct == 0)){ return false; } @@ -166,6 +275,7 @@ public class BaseAI{ if(spawn == null) return; for(int wx = lastX; wx <= lastX + lastW; wx++){ + outer: for(int wy = lastY; wy <= lastY + lastH; wy++){ Tile tile = world.tile(wx, wy); @@ -179,13 +289,17 @@ public class BaseAI{ } Tile o = world.tile(tile.x + p.x, tile.y + p.y); + if(o != null && (o.block() instanceof PayloadBlock || o.block() instanceof PayloadConveyor)){ + continue outer; + } + if(o != null && o.team() == data.team && !(o.block() instanceof Wall)){ any = true; - break; } } - if(any && Build.validPlace(wall, data.team, tile.x, tile.y, 0)){ + tmpTiles.clear(); + if(any && Build.validPlace(wall, data.team, tile.x, tile.y, 0) && !tile.getLinkedTilesAs(wall, tmpTiles).contains(t -> path.contains(t.pos()))){ data.blocks.add(new BlockPlan(tile.x, tile.y, (short)0, wall.id, null)); } } diff --git a/core/src/mindustry/ai/BaseRegistry.java b/core/src/mindustry/ai/BaseRegistry.java index cb34095a3c..735e9162ef 100644 --- a/core/src/mindustry/ai/BaseRegistry.java +++ b/core/src/mindustry/ai/BaseRegistry.java @@ -3,13 +3,13 @@ package mindustry.ai; import arc.*; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.ctype.*; import mindustry.game.*; import mindustry.game.Schematic.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; import mindustry.world.blocks.storage.*; @@ -17,12 +17,16 @@ import mindustry.world.meta.*; import java.io.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class BaseRegistry{ + /** cores, sorted by tier */ public Seq cores = new Seq<>(); + /** parts with no requirement */ public Seq parts = new Seq<>(); public ObjectMap> reqParts = new ObjectMap<>(); + public ObjectMap ores = new ObjectMap<>(); + public ObjectMap oreFloors = new ObjectMap<>(); public Seq forResource(Content item){ return reqParts.get(item, Seq::new); @@ -33,6 +37,15 @@ public class BaseRegistry{ parts.clear(); reqParts.clear(); + //load ore types and corresponding items + for(Block block : content.blocks()){ + if(block instanceof OreBlock && block.asFloor().itemDrop != null){ + ores.put(block.asFloor().itemDrop, (OreBlock)block); + }else if(block.isFloor() && block.asFloor().itemDrop != null && !oreFloors.containsKey(block.asFloor().itemDrop)){ + oreFloors.put(block.asFloor().itemDrop, block.asFloor()); + } + } + String[] names = Core.files.internal("basepartnames").readString().split("\n"); for(String name : names){ @@ -69,7 +82,7 @@ public class BaseRegistry{ } schem.tiles.removeAll(s -> s.block.buildVisibility == BuildVisibility.sandboxOnly); - part.tier = schem.tiles.sumf(s -> Mathf.pow(s.block.buildCost / s.block.buildCostMultiplier, 1.2f)); + part.tier = schem.tiles.sumf(s -> Mathf.pow(s.block.buildCost / s.block.buildCostMultiplier, 1.4f)); if(part.core != null){ cores.add(part); @@ -86,7 +99,9 @@ public class BaseRegistry{ part.centerY = part.schematic.height/2; } - if(part.required != null) reqParts.get(part.required, Seq::new).add(part); + if(part.required != null && part.core == null){ + reqParts.get(part.required, Seq::new).add(part); + } }catch(IOException e){ throw new RuntimeException(e); diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 0f52311b88..6a232f426c 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -4,12 +4,12 @@ import arc.*; import arc.func.*; import arc.math.*; import arc.math.geom.*; -import arc.struct.EnumSet; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; @@ -23,16 +23,16 @@ import static mindustry.Vars.*; /** Class used for indexing special target blocks for AI. */ public class BlockIndexer{ /** Size of one quadrant. */ - private static final int quadrantSize = 16; + private static final int quadrantSize = 20; + private static final Rect rect = new Rect(); + private static boolean returnBool = false; - /** Set of all ores that are being scanned. */ - private final ObjectSet scanOres = new ObjectSet<>(); private final IntSet intSet = new IntSet(); - private final ObjectSet itemSet = new ObjectSet<>(); - /** Stores all ore quadtrants on the map. */ - private ObjectMap ores = new ObjectMap<>(); - /** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */ - private GridBits[] structQuadrants; + + private int quadWidth, quadHeight; + + /** Stores all ore quadrants on the map. Maps ID to qX to qY to a list of tiles with that ore. */ + private IntSeq[][][] ores; /** Stores all damaged tile entities by team. */ private ObjectSet[] damagedTiles = new ObjectSet[Team.all.length]; /** All ores available on this map. */ @@ -41,39 +41,27 @@ public class BlockIndexer{ private Seq activeTeams = new Seq<>(Team.class); /** Maps teams to a map of flagged tiles by flag. */ private TileArray[][] flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; - /** Max units by team. */ - private int[] unitCaps = new int[Team.all.length]; - /** Maps tile positions to their last known tile index data. */ - private IntMap typeMap = new IntMap<>(); + /** Empty set used for returning. */ private TileArray emptySet = new TileArray(); /** Array used for returning and reusing. */ private Seq returnArray = new Seq<>(); /** Array used for returning and reusing. */ - private Seq breturnArray = new Seq<>(); + private Seq breturnArray = new Seq<>(Building.class); public BlockIndexer(){ - Events.on(TileChangeEvent.class, event -> { - if(typeMap.get(event.tile.pos()) != null){ - TileIndex index = typeMap.get(event.tile.pos()); - for(BlockFlag flag : index.flags){ - getFlagged(index.team)[flag.ordinal()].remove(event.tile); - } - if(index.flags.contains(BlockFlag.unitModifier)){ - updateCap(index.team); - } - } - process(event.tile); - updateQuadrant(event.tile); + Events.on(TilePreChangeEvent.class, event -> { + removeIndex(event.tile); + }); + + Events.on(TileChangeEvent.class, event -> { + addIndex(event.tile); }); Events.on(WorldLoadEvent.class, event -> { - scanOres.clear(); - scanOres.addAll(Item.getAllOres()); damagedTiles = new ObjectSet[Team.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; - unitCaps = new int[Team.all.length]; activeTeams = new Seq<>(Team.class); for(int i = 0; i < flagMap.length; i++){ @@ -82,12 +70,10 @@ public class BlockIndexer{ } } - typeMap.clear(); allOres.clear(); - ores = null; - - //create bitset for each team type that contains each quadrant - structQuadrants = new GridBits[Team.all.length]; + ores = new IntSeq[content.items().size][][]; + quadWidth = Mathf.ceil(world.width() / (float)quadrantSize); + quadHeight = Mathf.ceil(world.height() / (float)quadrantSize); for(Tile tile : world.tiles){ process(tile); @@ -96,44 +82,83 @@ public class BlockIndexer{ notifyTileDamaged(tile.build); } - if(tile.drop() != null) allOres.add(tile.drop()); - } + var drop = tile.drop(); - for(int x = 0; x < quadWidth(); x++){ - for(int y = 0; y < quadHeight(); y++){ - updateQuadrant(world.tile(x * quadrantSize, y * quadrantSize)); + if(drop != null){ + allOres.add(drop); + + int qx = (tile.x / quadrantSize); + int qy = (tile.y / quadrantSize); + + //add position of quadrant to list + if(tile.block() == Blocks.air){ + if(ores[drop.id] == null){ + ores[drop.id] = new IntSeq[quadWidth][quadHeight]; + } + if(ores[drop.id][qx][qy] == null){ + ores[drop.id][qx][qy] = new IntSeq(false, 16); + } + ores[drop.id][qx][qy].add(tile.pos()); + } + } + } + }); + } + + public void removeIndex(Tile tile){ + var team = tile.team(); + if(team != Team.derelict && tile.isCenter()){ + var flags = tile.block().flags; + var data = team.data(); + + if(flags.size() > 0){ + for(BlockFlag flag : flags){ + getFlagged(team)[flag.ordinal()].remove(tile); } } - scanOres(); - }); + //update the unit cap when building is remove + data.unitCap -= tile.block().unitCapModifier; + + //unregister building from building quadtree + if(data.buildings != null){ + data.buildings.remove(tile.build); + } + } + } + + public void addIndex(Tile tile){ + process(tile); + + var drop = tile.drop(); + if(drop != null){ + int qx = tile.x / quadrantSize; + int qy = tile.y / quadrantSize; + + if(ores[drop.id] == null){ + ores[drop.id] = new IntSeq[quadWidth][quadHeight]; + } + if(ores[drop.id][qx][qy] == null){ + ores[drop.id][qx][qy] = new IntSeq(false, 16); + } + + int pos = tile.pos(); + var seq = ores[drop.id][qx][qy]; + + //when the drop can be mined, record the ore position + if(tile.block() == Blocks.air && !seq.contains(pos)){ + seq.add(pos); + }else{ + //otherwise, it likely became blocked, remove it (even if it wasn't there) + seq.removeValue(pos); + } + } } private TileArray[] getFlagged(Team team){ return flagMap[team.id]; } - private GridBits structQuadrant(Team t){ - if(structQuadrants[t.id] == null){ - structQuadrants[t.id] = new GridBits(Mathf.ceil(world.width() / (float)quadrantSize), Mathf.ceil(world.height() / (float)quadrantSize)); - } - return structQuadrants[t.id]; - } - - /** Updates all the structure quadrants for a newly activated team. */ - public void updateTeamIndex(Team team){ - if(structQuadrants == null) return; - - //go through every tile... ouch - for(Tile tile : world.tiles){ - if(tile.team() == team){ - int quadrantX = tile.x / quadrantSize; - int quadrantY = tile.y / quadrantSize; - structQuadrant(team).set(quadrantX, quadrantY); - } - } - } - /** @return whether this item is present on this map. */ public boolean hasOre(Item item){ return allOres.contains(item); @@ -175,38 +200,49 @@ public class BlockIndexer{ return eachBlock(team.team(), team.getX(), team.getY(), range, pred, cons); } - public boolean eachBlock(Team team, float wx, float wy, float range, Boolf pred, Cons cons){ - intSet.clear(); + public boolean eachBlock(@Nullable Team team, float wx, float wy, float range, Boolf pred, Cons cons){ + returnBool = false; - int tx = world.toTile(wx); - int ty = world.toTile(wy); - - int tileRange = (int)(range / tilesize + 1); - boolean any = false; - - for(int x = -tileRange + tx; x <= tileRange + tx; x++){ - for(int y = -tileRange + ty; y <= tileRange + ty; y++){ - if(!Mathf.within(x * tilesize, y * tilesize, wx, wy, range)) continue; - - Building other = world.build(x, y); - - if(other == null) continue; - - if(other.team == team && pred.get(other) && intSet.add(other.pos())){ - cons.get(other); - any = true; + if(team == null){ + allBuildings(wx, wy, range, b -> { + if(pred.get(b)){ + returnBool = true; + cons.get(b); } - } + }); + }else{ + var buildings = team.data().buildings; + if(buildings == null) return false; + buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> { + if(b.within(wx, wy, range + b.hitSize() / 2f) && pred.get(b)){ + returnBool = true; + cons.get(b); + } + }); } - return any; + return returnBool; } /** Get all enemy blocks with a flag. */ public Seq getEnemy(Team team, BlockFlag type){ returnArray.clear(); - for(Team enemy : team.enemies()){ - if(state.teams.isActive(enemy)){ + Seq data = state.teams.present; + //when team data is not initialized, scan through every team. this is terrible + if(data.isEmpty()){ + for(Team enemy : Team.all){ + if(enemy == team) continue; + TileArray set = getFlagged(enemy)[type.ordinal()]; + if(set != null){ + for(Tile tile : set){ + returnArray.add(tile); + } + } + } + }else{ + for(int i = 0; i < data.size; i++){ + Team enemy = data.items[i].team; + if(enemy == team) continue; TileArray set = getFlagged(enemy)[type.ordinal()]; if(set != null){ for(Tile tile : set){ @@ -215,6 +251,7 @@ public class BlockIndexer{ } } } + return returnArray; } @@ -226,11 +263,24 @@ public class BlockIndexer{ damagedTiles[entity.team.id].add(entity); } - public Building findEnemyTile(Team team, float x, float y, float range, Boolf pred){ + public void allBuildings(float x, float y, float range, Cons cons){ + for(int i = 0; i < activeTeams.size; i++){ + Team team = activeTeams.items[i]; + var buildings = team.data().buildings; + if(buildings == null) continue; + buildings.intersect(x - range, y - range, range*2f, range*2f, b -> { + if(b.within(x, y, range + b.hitSize()/2f)){ + cons.get(b); + } + }); + } + } + + public Building findEnemyTile(@Nullable Team team, float x, float y, float range, Boolf pred){ for(int i = 0; i < activeTeams.size; i++){ Team enemy = activeTeams.items[i]; - if(enemy == team) continue; + if(enemy == team || team == Team.derelict) continue; Building entity = indexer.findTile(enemy, x, y, range, pred, true); if(entity != null){ @@ -248,214 +298,96 @@ public class BlockIndexer{ public Building findTile(Team team, float x, float y, float range, Boolf pred, boolean usePriority){ Building closest = null; float dst = 0; - float range2 = range * range; + var buildings = team.data().buildings; + if(buildings == null) return null; - for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){ - for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){ + breturnArray.clear(); + buildings.intersect(rect.setCentered(x, y, range * 2f), breturnArray); - if(!getQuad(team, rx, ry)) continue; + for(int i = 0; i < breturnArray.size; i++){ + var next = breturnArray.items[i]; - for(int tx = rx * quadrantSize; tx < (rx + 1) * quadrantSize && tx < world.width(); tx++){ - for(int ty = ry * quadrantSize; ty < (ry + 1) * quadrantSize && ty < world.height(); ty++){ - Building e = world.build(tx, ty); + if(!pred.get(next) || !next.block.targetable) continue; - if(e == null) continue; - - if(e.team != team || !pred.get(e) || !e.block.targetable) - continue; - - float ndst = e.dst2(x, y); - if(ndst < range2 && (closest == null || - //this one is closer, and it is at least of equal priority - (ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) || - //priority is used, and new block has higher priority regardless of range - (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ - dst = ndst; - closest = e; - } - } - } + float bdst = next.dst(x, y) - next.hitSize() / 2f; + if(bdst < range && (closest == null || + //this one is closer, and it is at least of equal priority + (bdst < dst && (!usePriority || closest.block.priority.ordinal() <= next.block.priority.ordinal())) || + //priority is used, and new block has higher priority regardless of range + (usePriority && closest.block.priority.ordinal() < next.block.priority.ordinal()))){ + dst = bdst; + closest = next; } } return closest; } - /** - * Returns a set of tiles that have ores of the specified type nearby. - * While each tile in the set is not guaranteed to have an ore directly on it, - * each tile will at least have an ore within {@link #quadrantSize} / 2 blocks of it. - * Only specific ore types are scanned. See {@link #scanOres}. - */ - public TileArray getOrePositions(Item item){ - return ores.get(item, emptySet); - } - /** Find the closest ore block relative to a position. */ public Tile findClosestOre(float xp, float yp, Item item){ - Tile tile = Geometry.findClosest(xp, yp, getOrePositions(item)); - - if(tile == null) return null; - - for(int x = Math.max(0, tile.x - quadrantSize / 2); x < tile.x + quadrantSize / 2 && x < world.width(); x++){ - for(int y = Math.max(0, tile.y - quadrantSize / 2); y < tile.y + quadrantSize / 2 && y < world.height(); y++){ - Tile res = world.tile(x, y); - if(res.block() == Blocks.air && res.drop() == item){ - return res; + if(ores[item.id] != null){ + float minDst = 0f; + Tile closest = null; + for(int qx = 0; qx < quadWidth; qx++){ + for(int qy = 0; qy < quadHeight; qy++){ + var arr = ores[item.id][qx][qy]; + if(arr != null && arr.size > 0){ + Tile tile = world.tile(arr.first()); + float dst = Mathf.dst2(xp, yp, tile.worldx(), tile.worldy()); + if(closest == null || dst < minDst){ + closest = tile; + minDst = dst; + } + } } } + return closest; } return null; } - /** @return extra unit cap of a team. This is added onto the base value. */ - public int getExtraUnits(Team team){ - return unitCaps[team.id]; - } - - private void updateCap(Team team){ - TileArray capped = getFlagged(team)[BlockFlag.unitModifier.ordinal()]; - unitCaps[team.id] = 0; - for(Tile capper : capped){ - unitCaps[team.id] += capper.block().unitCapModifier; - } + /** Find the closest ore block relative to a position. */ + public Tile findClosestOre(Unit unit, Item item){ + return findClosestOre(unit.x, unit.y, item); } private void process(Tile tile){ - if(tile.block().flags.size() > 0 && tile.team() != Team.derelict && tile.isCenter()){ - TileArray[] map = getFlagged(tile.team()); + var team = tile.team(); + //only process entity changes with centered tiles + if(tile.isCenter() && team != Team.derelict){ + var data = team.data(); + if(tile.block().flags.size() > 0 && tile.isCenter()){ + TileArray[] map = getFlagged(team); - for(BlockFlag flag : tile.block().flags){ + for(BlockFlag flag : tile.block().flags){ - TileArray arr = map[flag.ordinal()]; + TileArray arr = map[flag.ordinal()]; - arr.add(tile); + arr.add(tile); - map[flag.ordinal()] = arr; - } - - if(tile.block().flags.contains(BlockFlag.unitModifier)){ - updateCap(tile.team()); - } - - typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.team())); - } - - if(!activeTeams.contains(tile.team())){ - activeTeams.add(tile.team()); - } - - if(ores == null) return; - - int quadrantX = tile.x / quadrantSize; - int quadrantY = tile.y / quadrantSize; - itemSet.clear(); - - Tile rounded = world.rawTile(Mathf.clamp(quadrantX * quadrantSize + quadrantSize / 2, 0, world.width() - 1), Mathf.clamp(quadrantY * quadrantSize + quadrantSize / 2, 0, world.height() - 1)); - - //find all items that this quadrant contains - for(int x = Math.max(0, rounded.x - quadrantSize / 2); x < rounded.x + quadrantSize / 2 && x < world.width(); x++){ - for(int y = Math.max(0, rounded.y - quadrantSize / 2); y < rounded.y + quadrantSize / 2 && y < world.height(); y++){ - Tile result = world.tile(x, y); - if(result == null || result.drop() == null || !scanOres.contains(result.drop()) || result.block() != Blocks.air) continue; - - itemSet.add(result.drop()); - } - } - - //update quadrant at this position - for(Item item : scanOres){ - TileArray set = ores.get(item); - - //update quadrant status depending on whether the item is in it - if(!itemSet.contains(item)){ - set.remove(rounded); - }else{ - set.add(rounded); - } - } - } - - private void updateQuadrant(Tile tile){ - if(structQuadrants == null) return; - - //this quadrant is now 'dirty', re-scan the whole thing - int quadrantX = tile.x / quadrantSize; - int quadrantY = tile.y / quadrantSize; - - for(Team team : activeTeams){ - GridBits bits = structQuadrant(team); - - //fast-set this quadrant to 'occupied' if the tile just placed is already of this team - if(tile.team() == team && tile.build != null && tile.block().targetable){ - bits.set(quadrantX, quadrantY); - continue; //no need to process futher - } - - bits.set(quadrantX, quadrantY, false); - - outer: - for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){ - for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){ - Building result = world.build(x, y); - //when a targetable block is found, mark this quadrant as occupied and stop searching - if(result != null && result.team == team){ - bits.set(quadrantX, quadrantY); - break outer; - } + map[flag.ordinal()] = arr; } } - } - } - private boolean getQuad(Team team, int quadrantX, int quadrantY){ - return structQuadrant(team).get(quadrantX, quadrantY); - } + //update the unit cap when new tile is registered + data.unitCap += tile.block().unitCapModifier; - private int quadWidth(){ - return Mathf.ceil(world.width() / (float)quadrantSize); - } - - private int quadHeight(){ - return Mathf.ceil(world.height() / (float)quadrantSize); - } - - private void scanOres(){ - ores = new ObjectMap<>(); - - //initialize ore map with empty sets - for(Item item : scanOres){ - ores.put(item, new TileArray()); - } - - for(Tile tile : world.tiles){ - int qx = (tile.x / quadrantSize); - int qy = (tile.y / quadrantSize); - - //add position of quadrant to list when an ore is found - if(tile.drop() != null && scanOres.contains(tile.drop()) && tile.block() == Blocks.air){ - ores.get(tile.drop()).add(world.tile( - //make sure to clamp quadrant middle position, since it might go off bounds - Mathf.clamp(qx * quadrantSize + quadrantSize / 2, 0, world.width() - 1), - Mathf.clamp(qy * quadrantSize + quadrantSize / 2, 0, world.height() - 1))); + if(!activeTeams.contains(team)){ + activeTeams.add(team); } - } - } - private static class TileIndex{ - public final EnumSet flags; - public final Team team; - - public TileIndex(EnumSet flags, Team team){ - this.flags = flags; - this.team = team; + //insert the new tile into the quadtree for targeting + if(data.buildings == null){ + data.buildings = new QuadTree<>(new Rect(0, 0, world.unitWidth(), world.unitHeight())); + } + data.buildings.insert(tile.build); } } public static class TileArray implements Iterable{ - private Seq tiles = new Seq<>(false, 16); - private IntSet contained = new IntSet(); + Seq tiles = new Seq<>(false, 16); + IntSet contained = new IntSet(); public void add(Tile tile){ if(contained.add(tile.pos())){ diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index e8199163ae..509ca0c03d 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -4,24 +4,25 @@ import arc.*; import arc.func.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.async.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.core.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.blocks.storage.*; import mindustry.world.meta.*; import static mindustry.Vars.*; public class Pathfinder implements Runnable{ - private static final long maxUpdate = Time.millisToNanos(6); + private static final long maxUpdate = Time.millisToNanos(7); private static final int updateFPS = 60; private static final int updateInterval = 1000 / updateFPS; private static final int impassable = -1; - private static final int fieldTimeout = 1000 * 60 * 2; public static final int fieldCore = 0, @@ -35,7 +36,7 @@ public class Pathfinder implements Runnable{ public static final int costGround = 0, costLegs = 1, - costWater = 2; + costNaval = 2; public static final Seq costTypes = Seq.with( //ground @@ -86,9 +87,13 @@ public class Pathfinder implements Runnable{ tiles[tile.x][tile.y] = packTile(tile); } - //special preset which may help speed things up; this is optional preloadPath(getField(state.rules.waveTeam, costGround, fieldCore)); + //preload water on naval maps + if(spawner.getSpawns().contains(t -> t.floor().isLiquid)){ + preloadPath(getField(state.rules.waveTeam, costNaval, fieldCore)); + } + start(); }); @@ -103,10 +108,10 @@ public class Pathfinder implements Runnable{ /** Packs a tile into its internal representation. */ private int packTile(Tile tile){ - boolean nearLiquid = false, nearSolid = false, nearGround = false; + boolean nearLiquid = false, nearSolid = false, nearGround = false, solid = tile.solid(); for(int i = 0; i < 4; i++){ - Tile other = tile.getNearby(i); + Tile other = tile.nearby(i); if(other != null){ if(other.floor().isLiquid) nearLiquid = true; if(other.solid()) nearSolid = true; @@ -115,11 +120,11 @@ public class Pathfinder implements Runnable{ } return PathTile.get( - tile.build == null ? 0 : Math.min((int)(tile.build.health / 40), 80), + tile.build == null || !solid || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80), tile.getTeamID(), - tile.solid(), + solid, tile.floor().isLiquid, - tile.staticDarkness() >= 2, + tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air), nearLiquid, nearGround, nearSolid, @@ -144,7 +149,7 @@ public class Pathfinder implements Runnable{ } /** Update a tile in the internal pathfinding grid. - * Causes a complete pathfinding reclaculation. Main thread only. */ + * Causes a complete pathfinding recalculation. Main thread only. */ public void updateTile(Tile tile){ if(net.client()) return; @@ -186,30 +191,6 @@ public class Pathfinder implements Runnable{ //total update time no longer than maxUpdate for(Flowfield data : threadList){ updateFrontier(data, maxUpdate / threadList.size); - - //remove flowfields that have 'timed out' so they can be garbage collected and no longer waste space - if(data.refreshRate > 0 && Time.timeSinceMillis(data.lastUpdateTime) > fieldTimeout){ - //make sure it doesn't get removed twice - data.lastUpdateTime = Time.millis(); - - Team team = data.team; - - Core.app.post(() -> { - //TODO ????? - //remove its used state - //if(fieldMap[team.id] != null){ - // fieldMap[team.id].remove(data.target); - // fieldMapUsed[team.id].remove(data.target); - //} - //remove from main thread list - mainList.remove(data); - }); - - queue.post(() -> { - //remove from this thread list with a delay - threadList.remove(data); - }); - } } } @@ -285,7 +266,7 @@ public class Pathfinder implements Runnable{ } } - if(current == null || tl == impassable) return tile; + if(current == null || tl == impassable || (path.cost == costTypes.items[costGround] && current.dangerous() && !tile.dangerous())) return tile; return current; } @@ -352,13 +333,7 @@ public class Pathfinder implements Runnable{ threadList.add(path); //add to main thread's list of paths - Core.app.post(() -> { - mainList.add(path); - //TODO - //if(fieldMap[team.id] != null){ - // fieldMap[team.id].put(target, path); - //} - }); + Core.app.post(() -> mainList.add(path)); //fill with impassables by default for(int x = 0; x < world.width(); x++){ @@ -444,16 +419,15 @@ public class Pathfinder implements Runnable{ @Override public void getPositions(IntSeq out){ - out.add(Point2.pack(world.toTile(position.getX()), world.toTile(position.getY()))); + out.add(Point2.pack(World.toTile(position.getX()), World.toTile(position.getY()))); } - } /** * Data for a flow field to some set of destinations. * Concrete subclasses must specify a way to fetch costs and destinations. - * */ - static abstract class Flowfield{ + */ + public static abstract class Flowfield{ /** Refresh rate in milliseconds. Return any number <= 0 to disable. */ protected int refreshRate; /** Team this path is for. Set before using. */ @@ -462,9 +436,9 @@ public class Pathfinder implements Runnable{ protected PathCost cost = costTypes.get(costGround); /** costs of getting to a specific tile */ - int[][] weights; + public int[][] weights; /** search IDs of each position - the highest, most recent search is prioritized and overwritten */ - int[][] searches; + public int[][] searches; /** search frontier, these are Pos objects */ IntQueue frontier = new IntQueue(); /** all target positions; these positions have a cost of 0, and must be synchronized on! */ @@ -491,7 +465,7 @@ public class Pathfinder implements Runnable{ protected abstract void getPositions(IntSeq out); } - interface PathCost{ + public interface PathCost{ int getCost(Team traversing, int tile); } diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 417909a92b..f5930ef7f2 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -8,6 +8,7 @@ import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -23,11 +24,21 @@ public class WaveSpawner{ private Seq spawns = new Seq<>(); private boolean spawning = false; private boolean any = false; + private Tile firstSpawn = null; public WaveSpawner(){ Events.on(WorldLoadEvent.class, e -> reset()); } + @Nullable + public Tile getFirstSpawn(){ + firstSpawn = null; + eachGroundSpawn((cx, cy) -> { + firstSpawn = world.tile(cx, cy); + }); + return firstSpawn; + } + public int countSpawns(){ return spawns.size; } @@ -38,16 +49,22 @@ public class WaveSpawner{ /** @return true if the player is near a ground spawn point. */ public boolean playerNear(){ - return !player.dead() && spawns.contains(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < state.rules.dropZoneRadius && player.team() != state.rules.waveTeam); + return state.hasSpawns() && !player.dead() && spawns.contains(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < state.rules.dropZoneRadius && player.team() != state.rules.waveTeam); } public void spawnEnemies(){ spawning = true; + eachGroundSpawn((spawnX, spawnY, doShockwave) -> { + if(doShockwave){ + doShockwave(spawnX, spawnY); + } + }); + for(SpawnGroup group : state.rules.spawns){ if(group.type == null) continue; - int spawned = group.getUnitsSpawned(state.wave - 1); + int spawned = group.getSpawned(state.wave - 1); if(group.type.flying){ float spread = margin / 1.5f; @@ -56,7 +73,7 @@ public class WaveSpawner{ for(int i = 0; i < spawned; i++){ Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1); unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread)); - unit.add(); + spawnEffect(unit); } }); }else{ @@ -69,25 +86,29 @@ public class WaveSpawner{ Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1); unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y); - Time.run(Math.min(i * 5, 60 * 2), () -> spawnEffect(unit)); + spawnEffect(unit); } }); } } - eachGroundSpawn((spawnX, spawnY, doShockwave) -> { - if(doShockwave){ - Time.run(20f, () -> Fx.spawnShockwave.at(spawnX, spawnY, state.rules.dropZoneRadius)); - Time.run(40f, () -> Damage.damage(state.rules.waveTeam, spawnX, spawnY, state.rules.dropZoneRadius, 99999999f, true)); - } - }); + Time.run(121f, () -> spawning = false); + } - Time.runTask(121f, () -> spawning = false); + public void doShockwave(float x, float y){ + Fx.spawnShockwave.at(x, y, state.rules.dropZoneRadius); + Damage.damage(state.rules.waveTeam, x, y, state.rules.dropZoneRadius, 99999999f, true); + } + + public void eachGroundSpawn(Intc2 cons){ + eachGroundSpawn((x, y, shock) -> cons.get(World.toTile(x), World.toTile(y))); } private void eachGroundSpawn(SpawnConsumer cons){ - for(Tile spawn : spawns){ - cons.accept(spawn.worldx(), spawn.worldy(), true); + if(state.hasSpawns()){ + for(Tile spawn : spawns){ + cons.accept(spawn.worldx(), spawn.worldy(), true); + } } if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ @@ -100,7 +121,7 @@ public class WaveSpawner{ //keep moving forward until the max step amount is reached while(steps++ < maxSteps){ - int tx = world.toTile(core.x + Tmp.v1.x), ty = world.toTile(core.y + Tmp.v1.y); + int tx = World.toTile(core.x + Tmp.v1.x), ty = World.toTile(core.y + Tmp.v1.y); any = false; Geometry.circle(tx, ty, world.width(), world.height(), 3, (x, y) -> { if(world.solid(x, y)){ @@ -127,8 +148,7 @@ public class WaveSpawner{ private void eachFlyerSpawn(Floatc2 cons){ for(Tile tile : spawns){ - float angle = Angles.angle(world.width() / 2, world.height() / 2, tile.x, tile.y); - + float angle = Angles.angle(world.width() / 2f, world.height() / 2f, tile.x, tile.y); float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize; float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(angle, trns), -margin, world.width() * tilesize + margin); float spawnY = Mathf.clamp(world.height() * tilesize / 2f + Angles.trnsy(angle, trns), -margin, world.height() * tilesize + margin); @@ -147,6 +167,7 @@ public class WaveSpawner{ } private void reset(){ + spawning = false; spawns.clear(); for(Tile tile : world.tiles){ @@ -157,8 +178,11 @@ public class WaveSpawner{ } private void spawnEffect(Unit unit){ - Call.spawnEffect(unit.x, unit.y, unit.type()); - Time.run(30f, unit::add); + unit.rotation = unit.angleTo(world.width()/2f * tilesize, world.height()/2f * tilesize); + unit.apply(StatusEffects.unmoving, 30f); + unit.add(); + + Call.spawnEffect(unit.x, unit.y, unit.rotation, unit.type); } private interface SpawnConsumer{ @@ -166,8 +190,8 @@ public class WaveSpawner{ } @Remote(called = Loc.server, unreliable = true) - public static void spawnEffect(float x, float y, UnitType type){ - Fx.unitSpawn.at(x, y, 0f, type); + public static void spawnEffect(float x, float y, float rotation, UnitType u){ + Fx.unitSpawn.at(x, y, rotation, u); Time.run(30f, () -> Fx.spawn.at(x, y)); } diff --git a/core/src/mindustry/ai/formations/Formation.java b/core/src/mindustry/ai/formations/Formation.java index 16db811b2f..db2ce02e14 100644 --- a/core/src/mindustry/ai/formations/Formation.java +++ b/core/src/mindustry/ai/formations/Formation.java @@ -17,10 +17,8 @@ import arc.struct.*; * @author davebaol */ public class Formation{ - /** A list of slots assignments. */ public Seq slotAssignments; - /** The anchor point of this formation. */ public Vec3 anchor; /** The formation pattern */ @@ -138,7 +136,6 @@ public class Formation{ * @return {@code false} if no more slots are available; {@code true} otherwise. */ public boolean addMember(FormationMember member){ - // Check if the pattern supports one more slot if(pattern.supportsSlots(slotAssignments.size + 1)){ // Add a new slot assignment diff --git a/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java b/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java index 35fd74f789..89e51054d2 100644 --- a/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java @@ -16,8 +16,9 @@ public class FreeSlotAssignmentStrategy implements SlotAssignmentStrategy{ public void updateSlotAssignments(Seq assignments){ // A very simple assignment algorithm: we simply go through // each assignment in the list and assign sequential slot numbers - for(int i = 0; i < assignments.size; i++) + for(int i = 0; i < assignments.size; i++){ assignments.get(i).slotNumber = i; + } } @Override diff --git a/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java b/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java index f3f3c09bed..59c933c205 100644 --- a/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java @@ -51,7 +51,6 @@ public class SoftRoleSlotAssignmentStrategy extends BoundedSlotAssignmentStrateg @Override public void updateSlotAssignments(Seq assignments){ - // Holds a list of member and slot data for each member. Seq memberData = new Seq<>(); @@ -125,7 +124,6 @@ public class SoftRoleSlotAssignmentStrategy extends BoundedSlotAssignmentStrateg // Some sensible action should be taken, such as reporting to the player. throw new ArcRuntimeException("SoftRoleSlotAssignmentStrategy cannot find valid slot assignment for member " + memberDatum.member); } - } static class CostAndSlot implements Comparable{ diff --git a/core/src/mindustry/ai/formations/patterns/CircleFormation.java b/core/src/mindustry/ai/formations/patterns/CircleFormation.java index 0988657adf..9636d97036 100644 --- a/core/src/mindustry/ai/formations/patterns/CircleFormation.java +++ b/core/src/mindustry/ai/formations/patterns/CircleFormation.java @@ -15,7 +15,7 @@ public class CircleFormation extends FormationPattern{ float radius = spacing / (float)Math.sin(180f / slots * Mathf.degRad); outLocation.set(Angles.trnsx(angle, radius), Angles.trnsy(angle, radius), angle); }else{ - outLocation.set(0, 0, 360f * slotNumber); + outLocation.set(0, spacing * 1.1f, 360f * slotNumber); } outLocation.z += angleOffset; diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index d7e7eafb11..5a3c5b00f8 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -1,7 +1,8 @@ package mindustry.ai.types; +import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.Teams.*; @@ -12,41 +13,72 @@ import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; public class BuilderAI extends AIController{ - float buildRadius = 1500; + public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f; + boolean found = false; - @Nullable Builderc following; + @Nullable Unit following; + @Nullable Teamc enemy; + float retreatTimer; @Override - public void updateUnit(){ - Builderc builder = (Builderc)unit; + public void updateMovement(){ - if(builder.moving()){ - builder.lookAt(builder.vel().angle()); + if(target != null && shouldShoot()){ + unit.lookAt(target); } - builder.updateBuilding(true); + unit.updateBuilding = true; if(following != null){ + retreatTimer = 0f; //try to follow and mimic someone //validate follower if(!following.isValid() || !following.activelyBuilding()){ following = null; - builder.plans().clear(); + unit.plans.clear(); return; } //set to follower's first build plan, whatever that is - builder.plans().clear(); - builder.plans().addFirst(following.buildPlan()); + unit.plans.clear(); + unit.plans.addFirst(following.buildPlan()); + }else if(unit.buildPlan() == null){ + //not following anyone or building + if(timer.get(timerTarget4, 40)){ + enemy = target(unit.x, unit.y, fleeRange, true, true); + } + + //fly away from enemy when not doing anything, but only after a delay + if((retreatTimer += Time.delta) >= retreatDelay){ + if(enemy != null){ + var core = unit.closestCore(); + if(core != null && !unit.within(core, retreatDst)){ + moveTo(core, retreatDst); + } + } + } } - if(builder.buildPlan() != null){ + if(unit.buildPlan() != null){ + retreatTimer = 0f; //approach request if building - BuildPlan req = builder.buildPlan(); + BuildPlan req = unit.buildPlan(); + + //clear break plan if another player is breaking something. + if(!req.breaking && timer.get(timerTarget2, 40f)){ + for(Player player : Groups.player){ + if(player.isBuilder() && player.unit().activelyBuilding() && player.unit().buildPlan().samePos(req) && player.unit().buildPlan().breaking){ + unit.plans.removeFirst(); + //remove from list of plans + unit.team.data().blocks.remove(p -> p.x == req.x && p.y == req.y); + return; + } + } + } boolean valid = - (req.tile().build instanceof ConstructBuild && req.tile().bc().cblock == req.block) || + (req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.current == req.block) || (req.breaking ? Build.validBreak(unit.team(), req.x, req.y) : Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation)); @@ -56,7 +88,7 @@ public class BuilderAI extends AIController{ moveTo(req.tile(), buildingRange - 20f); }else{ //discard invalid request - builder.plans().removeFirst(); + unit.plans.removeFirst(); } }else{ @@ -67,18 +99,16 @@ public class BuilderAI extends AIController{ Units.nearby(unit.team, unit.x, unit.y, buildRadius, u -> { if(found) return; - if(u instanceof Builderc && u != unit && ((Builderc)u).activelyBuilding()){ - Builderc b = (Builderc)u; - BuildPlan plan = b.buildPlan(); + if(u.canBuild() && u != unit && u.activelyBuilding()){ + BuildPlan plan = u.buildPlan(); Building build = world.build(plan.x, plan.y); - if(build instanceof ConstructBuild){ - ConstructBuild cons = (ConstructBuild)build; + if(build instanceof ConstructBuild cons){ float dist = Math.min(cons.dst(unit) - buildingRange, 0); //make sure you can reach the request in time - if(dist / unit.type().speed < cons.buildCost * 0.9f){ - following = b; + if(dist / unit.speed() < cons.buildCost * 0.9f){ + following = u; found = true; } } @@ -86,8 +116,10 @@ public class BuilderAI extends AIController{ }); } + float rebuildTime = (unit.team.rules().ai ? Mathf.lerp(15f, 2f, unit.team.rules().aiTier) : 2f) * 60f; + //find new request - if(!unit.team.data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){ + if(!unit.team.data().blocks.isEmpty() && following == null && timer.get(timerTarget3, rebuildTime)){ Queue blocks = unit.team.data().blocks; BlockPlan block = blocks.first(); @@ -96,14 +128,30 @@ public class BuilderAI extends AIController{ blocks.removeFirst(); }else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid. //add build request. - builder.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); + unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); + //shift build plan to tail so next unit builds something else. + blocks.addLast(blocks.removeFirst()); }else{ //shift head of queue to tail, try something else next time blocks.removeFirst(); blocks.addLast(block); } } - } } + + @Override + public AIController fallback(){ + return unit.type.flying ? new FlyingAI() : new GroundAI(); + } + + @Override + public boolean useFallback(){ + return state.rules.waves && unit.team == state.rules.waveTeam && !unit.team.rules().ai; + } + + @Override + public boolean shouldShoot(){ + return !unit.isBuilding(); + } } diff --git a/core/src/mindustry/ai/types/DefenderAI.java b/core/src/mindustry/ai/types/DefenderAI.java new file mode 100644 index 0000000000..93040727e0 --- /dev/null +++ b/core/src/mindustry/ai/types/DefenderAI.java @@ -0,0 +1,39 @@ +package mindustry.ai.types; + +import arc.math.*; +import mindustry.entities.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.meta.*; + +public class DefenderAI extends AIController{ + + @Override + public void updateMovement(){ + if(target != null){ + moveTo(target, (target instanceof Sized s ? s.hitSize()/2f * 1.1f : 0f) + unit.hitSize/2f + 15f, 50f); + unit.lookAt(target); + } + } + + @Override + protected void updateTargeting(){ + if(retarget()) target = findTarget(unit.x, unit.y, unit.range(), true, true); + } + + @Override + protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ + //find unit to follow if not in rally mode + if(command() != UnitCommand.rally){ + //Sort by max health and closer target. + var result = Units.closest(unit.team, x, y, Math.max(range, 400f), u -> !u.dead() && u.type != unit.type, (u, tx, ty) -> -u.maxHealth + Mathf.dst2(u.x, u.y, tx, ty) / 6400f); + if(result != null) return result; + } + + //find rally point + var block = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + if(block != null) return block; + //return core if found + return unit.closestCore(); + } +} diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index 0758f9016a..72d7eda4ff 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -12,11 +12,11 @@ public class FlyingAI extends AIController{ @Override public void updateMovement(){ if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){ - if(unit.type().weapons.first().rotate){ - moveTo(target, unit.range() * 0.8f); + if(!unit.type.circleTarget){ + moveTo(target, unit.type.range * 0.8f); unit.lookAt(target); }else{ - attack(100f); + attack(120f); } } @@ -34,30 +34,28 @@ public class FlyingAI extends AIController{ Teamc result = target(x, y, range, air, ground); if(result != null) return result; - if(ground) result = targetFlag(x, y, BlockFlag.producer, true); + if(ground) result = targetFlag(x, y, BlockFlag.generator, true); if(result != null) return result; - if(ground) result = targetFlag(x, y, BlockFlag.turret, true); + if(ground) result = targetFlag(x, y, BlockFlag.core, true); if(result != null) return result; return null; } - //TODO clean up - protected void attack(float circleLength){ vec.set(target).sub(unit); float ang = unit.angleTo(target); float diff = Angles.angleDist(ang, unit.rotation()); - if(diff > 100f && vec.len() < circleLength){ + if(diff > 70f && vec.len() < circleLength){ vec.setAngle(unit.vel().angle()); }else{ - vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f)); + vec.setAngle(Angles.moveToward(unit.vel().angle(), vec.angle(), 6f)); } - vec.setLength(unit.type().speed); + vec.setLength(unit.speed()); unit.moveAt(vec); } diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index e2680b4f2b..a08d9bb95c 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -2,11 +2,11 @@ package mindustry.ai.types; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.ai.formations.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.type.*; +import mindustry.world.blocks.storage.CoreBlock.*; public class FormationAI extends AIController implements FormationMember{ public Unit leader; @@ -26,36 +26,57 @@ public class FormationAI extends AIController implements FormationMember{ @Override public void updateUnit(){ - UnitType type = unit.type(); - if(leader.dead){ + if(leader == null || leader.dead){ unit.resetController(); return; } - if(unit.type().canBoost && unit.canPassOn()){ - unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); + if(unit.type.canBoost){ + unit.elevation = Mathf.approachDelta(unit.elevation, + unit.onSolid() ? 1f : //definitely cannot land + unit.isFlying() && !unit.canLand() ? unit.elevation : //try to maintain altitude + leader.type.canBoost ? leader.elevation : //follow leader + 0f, + unit.type.riseSpeed); } unit.controlWeapons(true, leader.isShooting); - // unit.moveAt(Tmp.v1.set(deltaX, deltaY).limit(unit.type().speed)); unit.aim(leader.aimX(), leader.aimY()); - if(unit.type().rotateShooting){ + if(unit.type.rotateShooting){ unit.lookAt(leader.aimX(), leader.aimY()); }else if(unit.moving()){ unit.lookAt(unit.vel.angle()); } - Vec2 realtarget = vec.set(target); + Vec2 realtarget = vec.set(target).add(leader.vel); - float margin = 3f; + float speed = unit.realSpeed() * Time.delta; + unit.approach(Mathf.arrive(unit.x, unit.y, realtarget.x, realtarget.y, unit.vel, speed, 0f, speed, 1f).scl(1f / Time.delta)); - if(unit.dst(realtarget) <= margin){ - unit.vel.approachDelta(Vec2.ZERO, type.speed * type.accel / 2f); - }else{ - unit.moveAt(realtarget.sub(unit).limit(type.speed)); + if(unit.canMine() && leader.canMine()){ + if(leader.mineTile != null && unit.validMine(leader.mineTile)){ + unit.mineTile(leader.mineTile); + + CoreBuild core = unit.team.core(); + + if(core != null && leader.mineTile.drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(leader.mineTile.drop())){ + if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){ + Call.transferItemTo(unit, unit.stack.item, unit.stack.amount, unit.x, unit.y, core); + + unit.clearItem(); + } + } + }else{ + unit.mineTile(null); + } + } + + if(unit.canBuild() && leader.canBuild() && leader.activelyBuilding()){ + unit.clearBuilding(); + unit.addBuild(leader.buildPlan()); } } @@ -69,11 +90,7 @@ public class FormationAI extends AIController implements FormationMember{ @Override public float formationSize(){ - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ - //TODO return formation size - //eturn ((Commanderc)unit).formation(). - } - return unit.hitSize * 1f; + return unit.hitSize * 1.3f; } @Override diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index bd6b13a25c..4ebdfe1595 100644 --- a/core/src/mindustry/ai/types/GroundAI.java +++ b/core/src/mindustry/ai/types/GroundAI.java @@ -8,25 +8,25 @@ import mindustry.gen.*; import mindustry.world.*; import mindustry.world.meta.*; -import java.util.*; - import static mindustry.Vars.*; public class GroundAI extends AIController{ - //static final float commandCooldown = 60f * 10; - //float commandTimer = 60*3; @Override public void updateMovement(){ Building core = unit.closestEnemyCore(); - if(core != null && unit.within(core, unit.range() / 1.1f + core.block.size * tilesize / 2f)){ + if(core != null && unit.within(core, unit.range() / 1.3f + core.block.size * tilesize / 2f)){ target = core; - Arrays.fill(targets, core); + for(var mount : unit.mounts){ + if(mount.weapon.controllable && mount.weapon.bullet.collidesGround){ + mount.target = core; + } + } } - if((core == null || !unit.within(core, unit.range() * 0.5f)) && command() == UnitCommand.attack){ + if((core == null || !unit.within(core, unit.type.range * 0.5f)) && command() == UnitCommand.attack){ boolean move = true; if(state.rules.waves && unit.team == state.rules.defaultTeam){ @@ -34,54 +34,28 @@ public class GroundAI extends AIController{ if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)) move = false; } - if(move) moveTo(Pathfinder.fieldCore); + if(move) pathfind(Pathfinder.fieldCore); } if(command() == UnitCommand.rally){ Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); if(target != null && !unit.within(target, 70f)){ - moveTo(Pathfinder.fieldRally); + pathfind(Pathfinder.fieldRally); } } - if(unit.type().canBoost && unit.tileOn() != null && !unit.tileOn().solid()){ - unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); + if(unit.type.canBoost && unit.elevation > 0.001f && !unit.onSolid()){ + unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed); } - if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type().rotateShooting){ - if(unit.type().hasWeapons()){ - unit.lookAt(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting){ + if(unit.type.hasWeapons()){ + unit.lookAt(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed)); } }else if(unit.moving()){ unit.lookAt(unit.vel().angle()); } - //auto-command works but it's very buggy - /* - if(unit instanceof Commanderc){ - Commanderc c = (Commanderc)unit; - //try to command when missing members - if(c.controlling().size <= unit.type().commandLimit/2){ - commandTimer -= Time.delta; - - if(commandTimer <= 0){ - c.commandNearby(new SquareFormation(), u -> !(u.controller() instanceof FormationAI) && !(u instanceof Commanderc)); - commandTimer = commandCooldown; - } - } - }*/ - } - - protected void moveTo(int pathTarget){ - int costType = unit.pathType(); - - Tile tile = unit.tileOn(); - if(tile == null) return; - Tile targetTile = pathfinder.getTargetTile(tile, pathfinder.getField(unit.team, costType, pathTarget)); - - if(tile == targetTile || (costType == Pathfinder.costWater && !targetTile.floor().isLiquid)) return; - - unit.moveAt(vec.trns(unit.angleTo(targetTile), unit.type().speed)); } } diff --git a/core/src/mindustry/ai/types/HugAI.java b/core/src/mindustry/ai/types/HugAI.java new file mode 100644 index 0000000000..76acdec8c8 --- /dev/null +++ b/core/src/mindustry/ai/types/HugAI.java @@ -0,0 +1,81 @@ +package mindustry.ai.types; + +import arc.math.*; +import arc.math.geom.*; +import mindustry.*; +import mindustry.ai.*; +import mindustry.entities.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class HugAI extends AIController{ + + @Override + public void updateMovement(){ + + Building core = unit.closestEnemyCore(); + + if(core != null && unit.within(core, unit.range() / 1.1f + core.block.size * tilesize / 2f)){ + target = core; + for(var mount : unit.mounts){ + if(mount.weapon.controllable && mount.weapon.bullet.collidesGround){ + mount.target = core; + } + } + } + + if(command() == UnitCommand.attack){ + boolean move = true; + + if(state.rules.waves && unit.team == state.rules.defaultTeam){ + Tile spawner = getClosestSpawner(); + if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)) move = false; + } + + //raycast for target + if(target != null && unit.within(target, unit.type.range) && !Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { + for(Point2 p : Geometry.d4c){ + if(!unit.canPass(x + p.x, y + p.y)){ + return true; + } + } + return false; + })){ + if(unit.within(target, (unit.hitSize + (target instanceof Sized s ? s.hitSize() : 1f)) * 0.6f)){ + //circle target + unit.moveAt(vec.set(target).sub(unit).rotate(90f).setLength(unit.speed())); + }else{ + //move toward target in a straight line + unit.moveAt(vec.set(target).sub(unit).limit(unit.speed())); + } + }else if(move){ + pathfind(Pathfinder.fieldCore); + } + } + + if(command() == UnitCommand.rally){ + Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + + if(target != null && !unit.within(target, 70f)){ + pathfind(Pathfinder.fieldRally); + } + } + + if(unit.type.canBoost && unit.elevation > 0.001f && !unit.onSolid()){ + unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed); + } + + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting){ + if(unit.type.hasWeapons()){ + unit.lookAt(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed)); + } + }else if(unit.moving()){ + unit.lookAt(unit.vel().angle()); + } + + } +} diff --git a/core/src/mindustry/ai/types/LogicAI.java b/core/src/mindustry/ai/types/LogicAI.java new file mode 100644 index 0000000000..8c1128c7e0 --- /dev/null +++ b/core/src/mindustry/ai/types/LogicAI.java @@ -0,0 +1,167 @@ +package mindustry.ai.types; + +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import mindustry.ai.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.logic.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class LogicAI extends AIController{ + /** Minimum delay between item transfers. */ + public static final float transferDelay = 60f * 2f; + /** Time after which the unit resets its controlled and reverts to a normal unit. */ + public static final float logicControlTimeout = 10f * 60f; + + public LUnitControl control = LUnitControl.idle; + public float moveX, moveY, moveRad; + public float itemTimer, payTimer, controlTimer = logicControlTimeout, targetTimer; + @Nullable + public Building controller; + public BuildPlan plan = new BuildPlan(); + + //special cache for instruction to store data + public ObjectMap execCache = new ObjectMap<>(); + + //type of aiming to use + public LUnitControl aimControl = LUnitControl.stop; + + //whether to use the boost (certain units only) + public boolean boost; + //main target set for shootP + public Teamc mainTarget; + //whether to shoot at all + public boolean shoot; + //target shoot positions for manual aiming + public PosTeam posTarget = PosTeam.create(); + + private ObjectSet radars = new ObjectSet<>(); + + @Override + protected void updateMovement(){ + if(itemTimer >= 0) itemTimer -= Time.delta; + if(payTimer >= 0) payTimer -= Time.delta; + + if(targetTimer > 0f){ + targetTimer -= Time.delta; + }else{ + radars.clear(); + targetTimer = 40f; + } + + //timeout when not controlled by logic for a while + if(controlTimer > 0 && controller != null && controller.isValid()){ + controlTimer -= Time.delta; + }else{ + unit.resetController(); + return; + } + + switch(control){ + case move -> { + moveTo(Tmp.v1.set(moveX, moveY), 1f, 30f); + } + case approach -> { + moveTo(Tmp.v1.set(moveX, moveY), moveRad - 7f, 7); + } + case pathfind -> { + Building core = unit.closestEnemyCore(); + + if((core == null || !unit.within(core, unit.range() * 0.5f)) && command() == UnitCommand.attack){ + boolean move = true; + + if(state.rules.waves && unit.team == state.rules.defaultTeam){ + Tile spawner = getClosestSpawner(); + if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)) move = false; + } + + if(move) pathfind(Pathfinder.fieldCore); + } + + if(command() == UnitCommand.rally){ + Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + + if(target != null && !unit.within(target, 70f)){ + pathfind(Pathfinder.fieldRally); + } + } + } + case stop -> { + unit.clearBuilding(); + } + } + + if(unit.type.canBoost && !unit.type.flying){ + unit.elevation = Mathf.approachDelta(unit.elevation, Mathf.num(boost || unit.onSolid() || (unit.isFlying() && !unit.canLand())), unit.type.riseSpeed); + } + + //look where moving if there's nothing to aim at + if(!shoot){ + unit.lookAt(unit.prefRotation()); + }else if(unit.hasWeapons() && unit.mounts.length > 0){ //if there is, look at the object + unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY); + } + } + + public boolean checkTargetTimer(Object radar){ + return radars.add(radar); + } + + @Override + protected void moveTo(Position target, float circleLength, float smooth){ + if(target == null) return; + + vec.set(target).sub(unit); + + float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); + + vec.setLength(unit.realSpeed() * length); + if(length < -0.5f){ + vec.rotate(180f); + }else if(length < 0){ + vec.setZero(); + } + + //do not move when infinite vectors are used. + if(vec.isNaN() || vec.isInfinite()) return; + + unit.approach(vec); + } + + @Override + protected boolean checkTarget(Teamc target, float x, float y, float range){ + return false; + } + + //always retarget + @Override + protected boolean retarget(){ + return true; + } + + @Override + protected boolean invalid(Teamc target){ + return false; + } + + @Override + protected boolean shouldShoot(){ + return shoot && !(unit.type.canBoost && boost); + } + + //always aim for the main target + @Override + protected Teamc target(float x, float y, float range, boolean air, boolean ground){ + return switch(aimControl){ + case target -> posTarget; + case targetp -> mainTarget; + default -> null; + }; + } +} diff --git a/core/src/mindustry/ai/types/MinerAI.java b/core/src/mindustry/ai/types/MinerAI.java index c4e654ce29..5e80c52779 100644 --- a/core/src/mindustry/ai/types/MinerAI.java +++ b/core/src/mindustry/ai/types/MinerAI.java @@ -17,37 +17,37 @@ public class MinerAI extends AIController{ protected void updateMovement(){ Building core = unit.closestCore(); - if(!(unit instanceof Minerc) || core == null) return; + if(!(unit.canMine()) || core == null) return; - Minerc miner = (Minerc)unit; - - if(miner.mineTile() != null && !miner.mineTile().within(unit, unit.type().range)){ - miner.mineTile(null); + if(unit.mineTile != null && !unit.mineTile.within(unit, unit.type.miningRange)){ + unit.mineTile(null); } if(mining){ - targetItem = unit.team.data().mineItems.min(i -> indexer.hasOre(i) && miner.canMine(i), i -> core.items.get(i)); + if(timer.get(timerTarget2, 60 * 4) || targetItem == null){ + targetItem = unit.team.data().mineItems.min(i -> indexer.hasOre(i) && unit.canMine(i), i -> core.items.get(i)); + } //core full of the target item, do nothing if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){ unit.clearItem(); - miner.mineTile(null); + unit.mineTile =null; return; } //if inventory is full, drop it off. - if(unit.stack.amount >= unit.type().itemCapacity || (targetItem != null && !unit.acceptsItem(targetItem))){ + if(unit.stack.amount >= unit.type.itemCapacity || (targetItem != null && !unit.acceptsItem(targetItem))){ mining = false; }else{ - if(retarget() && targetItem != null){ - ore = indexer.findClosestOre(unit.x, unit.y, targetItem); + if(timer.get(timerTarget, 60) && targetItem != null){ + ore = indexer.findClosestOre(unit, targetItem); } if(ore != null){ - moveTo(ore, unit.type().range / 2f); + moveTo(ore, unit.type.miningRange / 2f, 20f); - if(unit.within(ore, unit.type().range)){ - miner.mineTile(ore); + if(ore.block() == Blocks.air && unit.within(ore, unit.type.miningRange)){ + unit.mineTile = ore; } if(ore.block() != Blocks.air){ @@ -56,28 +56,27 @@ public class MinerAI extends AIController{ } } }else{ - miner.mineTile(null); + unit.mineTile = null; if(unit.stack.amount == 0){ mining = true; return; } - if(unit.within(core, unit.type().range)){ + if(unit.within(core, unit.type.range)){ if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){ - Call.transferItemTo(unit.stack.item, unit.stack.amount, unit.x, unit.y, core); + Call.transferItemTo(unit, unit.stack.item, unit.stack.amount, unit.x, unit.y, core); } unit.clearItem(); mining = true; } - circle(core, unit.type().range / 1.8f); + circle(core, unit.type.range / 1.8f); } } @Override protected void updateTargeting(){ } - } diff --git a/core/src/mindustry/ai/types/RepairAI.java b/core/src/mindustry/ai/types/RepairAI.java index 84baf1c555..23feb2a0eb 100644 --- a/core/src/mindustry/ai/types/RepairAI.java +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -1,34 +1,70 @@ package mindustry.ai.types; +import arc.util.*; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.gen.*; import mindustry.world.blocks.ConstructBlock.*; -//note that repair AI doesn't attack anything even if it theoretically can public class RepairAI extends AIController{ + public static float retreatDst = 160f, fleeRange = 310f, retreatDelay = Time.toSeconds * 3f; + + @Nullable Teamc avoid; + float retreatTimer; @Override protected void updateMovement(){ - boolean shoot = false; + if(target instanceof Building){ + boolean shoot = false; - if(target != null){ - if(!target.within(unit, unit.type().range * 0.8f)){ - moveTo(target, unit.type().range * 0.8f); - } - - if(target.within(unit, unit.type().range)){ + if(target.within(unit, unit.type.range)){ unit.aim(target); shoot = true; } + + unit.controlWeapons(shoot); + }else if(target == null){ + unit.controlWeapons(false); } - unit.controlWeapons(shoot); + if(target != null){ + if(!target.within(unit, unit.type.range * 0.65f) && target instanceof Building b && b.team == unit.team){ + moveTo(target, unit.type.range * 0.65f); + } + + unit.lookAt(target); + } + + //not repairing + if(!(target instanceof Building)){ + if(timer.get(timerTarget4, 40)){ + avoid = target(unit.x, unit.y, fleeRange, true, true); + } + + if((retreatTimer += Time.delta) >= retreatDelay){ + //fly away from enemy when not doing anything + if(avoid != null){ + var core = unit.closestCore(); + if(core != null && !unit.within(core, retreatDst)){ + moveTo(core, retreatDst); + } + } + } + }else{ + retreatTimer = 0f; + } } @Override protected void updateTargeting(){ - target = Units.findDamagedTile(unit.team, unit.x, unit.y); + Building target = Units.findDamagedTile(unit.team, unit.x, unit.y); if(target instanceof ConstructBuild) target = null; + + if(target == null){ + super.updateTargeting(); + }else{ + this.target = target; + } } } diff --git a/core/src/mindustry/ai/types/SuicideAI.java b/core/src/mindustry/ai/types/SuicideAI.java index 93ab98a7c0..8f2a04c2dc 100644 --- a/core/src/mindustry/ai/types/SuicideAI.java +++ b/core/src/mindustry/ai/types/SuicideAI.java @@ -1,65 +1,84 @@ package mindustry.ai.types; +import arc.math.geom.*; import mindustry.*; import mindustry.ai.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.liquid.*; +import mindustry.world.blocks.storage.*; import mindustry.world.meta.*; +import static mindustry.Vars.*; + public class SuicideAI extends GroundAI{ static boolean blockedByBlock; @Override public void updateUnit(){ - if(Units.invalidateTarget(target, unit.team(), unit.x(), unit.y(), Float.MAX_VALUE)){ + if(Units.invalidateTarget(target, unit.team, unit.x, unit.y, Float.MAX_VALUE)){ target = null; } if(retarget()){ - target = target(unit.x, unit.y, unit.range(), unit.type().targetAir, unit.type().targetGround); + target = target(unit.x, unit.y, unit.range(), unit.type.targetAir, unit.type.targetGround); } Building core = unit.closestEnemyCore(); boolean rotate = false, shoot = false, moveToTarget = false; - if(!Units.invalidateTarget(target, unit, unit.range())){ + if(target == null){ + target = core; + } + + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.hasWeapons()){ rotate = true; - shoot = unit.within(target, unit.type().weapons.first().bullet.range() + - (target instanceof Building ? ((Building)target).block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); + shoot = unit.within(target, unit.type.weapons.first().bullet.range() + + (target instanceof Building b ? b.block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); - if(unit.type().hasWeapons()){ - unit.aimLook(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); + if(unit.type.hasWeapons()){ + unit.aimLook(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed)); } - blockedByBlock = false; + //do not move toward walls or transport blocks + if(!(target instanceof Building build && !(build.block instanceof CoreBlock) && ( + build.block.group == BlockGroup.walls || + build.block.group == BlockGroup.liquids || + build.block.group == BlockGroup.transportation + ))){ + blockedByBlock = false; - //raycast for target - boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { - Tile tile = Vars.world.tile(x, y); - if(tile != null && tile.build == target) return false; - if(tile != null && tile.build != null && tile.build.team != unit.team()){ - blockedByBlock = true; - return true; - }else{ - return tile == null || tile.solid(); + //raycast for target + boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { + for(Point2 p : Geometry.d4c){ + Tile tile = Vars.world.tile(x + p.x, y + p.y); + if(tile != null && tile.build == target) return false; + if(tile != null && tile.build != null && tile.build.team != unit.team()){ + blockedByBlock = true; + return true; + }else{ + return tile == null || tile.solid(); + } + } + return false; + }); + + //shoot when there's an enemy block in the way + if(blockedByBlock){ + shoot = true; } - }); - //shoot when there's an enemy block in the way - if(blockedByBlock){ - shoot = true; + if(!blocked){ + moveToTarget = true; + //move towards target directly + unit.moveAt(vec.set(target).sub(unit).limit(unit.speed())); + } } - - if(!blocked){ - moveToTarget = true; - //move towards target directly - unit.moveAt(vec.set(target).sub(unit).limit(unit.type().speed)); - } - } if(!moveToTarget){ @@ -67,10 +86,22 @@ public class SuicideAI extends GroundAI{ Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); if(target != null && !unit.within(target, 70f)){ - moveTo(Pathfinder.fieldRally); + pathfind(Pathfinder.fieldRally); + } + }else if(command() == UnitCommand.attack){ + boolean move = true; + + //stop moving toward the drop zone if applicable + if(core == null && state.rules.waves && unit.team == state.rules.defaultTeam){ + Tile spawner = getClosestSpawner(); + if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)){ + move = false; + } + } + + if(move){ + pathfind(Pathfinder.fieldCore); } - }else if(command() == UnitCommand.attack && core != null){ - moveTo(Pathfinder.fieldCore); } if(unit.moving()) unit.lookAt(unit.vel().angle()); @@ -78,4 +109,10 @@ public class SuicideAI extends GroundAI{ unit.controlWeapons(rotate, shoot); } + + @Override + protected Teamc target(float x, float y, float range, boolean air, boolean ground){ + return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground && + !(t.block instanceof Conveyor || t.block instanceof Conduit)); //do not target conveyors/conduits + } } diff --git a/core/src/mindustry/async/AsyncCore.java b/core/src/mindustry/async/AsyncCore.java index a023afafcc..88272feb95 100644 --- a/core/src/mindustry/async/AsyncCore.java +++ b/core/src/mindustry/async/AsyncCore.java @@ -2,29 +2,22 @@ package mindustry.async; import arc.*; import arc.struct.*; -import mindustry.*; import mindustry.game.EventType.*; import java.util.concurrent.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; public class AsyncCore{ //all processes to be executed each frame - private final Seq processes = Seq.with( - new PhysicsProcess(), - Vars.teamIndex = new TeamIndexProcess() + public final Seq processes = Seq.with( + new PhysicsProcess() ); //futures to be awaited private final Seq> futures = new Seq<>(); - private final ExecutorService executor = Executors.newFixedThreadPool(processes.size, r -> { - Thread thread = new Thread(r, "AsyncLogic-Thread"); - thread.setDaemon(true); - thread.setUncaughtExceptionHandler((t, e) -> Core.app.post(() -> { throw new RuntimeException(e); })); - return thread; - }); + private ExecutorService executor; public AsyncCore(){ Events.on(WorldLoadEvent.class, e -> { @@ -51,6 +44,16 @@ public class AsyncCore{ futures.clear(); + //init executor with size of potentially-modified process list + if(executor == null){ + executor = Executors.newFixedThreadPool(processes.size, r -> { + Thread thread = new Thread(r, "AsyncLogic-Thread"); + thread.setDaemon(true); + thread.setUncaughtExceptionHandler((t, e) -> Core.app.post(() -> { throw new RuntimeException(e); })); + return thread; + }); + } + //submit all tasks for(AsyncProcess p : processes){ if(p.shouldProcess()){ diff --git a/core/src/mindustry/async/PhysicsProcess.java b/core/src/mindustry/async/PhysicsProcess.java index 9a075f8f40..9ad2064a7a 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -5,8 +5,8 @@ import arc.math.geom.*; import arc.math.geom.QuadTree.*; import arc.struct.*; import mindustry.*; -import mindustry.entities.*; import mindustry.async.PhysicsProcess.PhysicsWorld.*; +import mindustry.entities.*; import mindustry.gen.*; public class PhysicsProcess implements AsyncProcess{ @@ -37,8 +37,9 @@ public class PhysicsProcess implements AsyncProcess{ //find Unit without bodies and assign them for(Unit entity : group){ + if(entity.type == null) continue; - if(entity.physref() == null){ + if(entity.physref == null){ PhysicsBody body = new PhysicsBody(); body.x = entity.x(); body.y = entity.y(); @@ -48,16 +49,16 @@ public class PhysicsProcess implements AsyncProcess{ PhysicRef ref = new PhysicRef(entity, body); refs.add(ref); - entity.physref(ref); + entity.physref = ref; physics.add(body); } //save last position - PhysicRef ref = entity.physref(); + PhysicRef ref = entity.physref; ref.body.layer = - entity.type().allowLegStep ? layerLegs : + entity.type.allowLegStep ? layerLegs : entity.isGrounded() ? layerGround : layerFlying; ref.x = entity.x(); ref.y = entity.y(); diff --git a/core/src/mindustry/async/TeamIndexProcess.java b/core/src/mindustry/async/TeamIndexProcess.java deleted file mode 100644 index 13a234bbbc..0000000000 --- a/core/src/mindustry/async/TeamIndexProcess.java +++ /dev/null @@ -1,82 +0,0 @@ -package mindustry.async; - -import arc.math.geom.*; -import mindustry.*; -import mindustry.game.*; -import mindustry.gen.*; -import mindustry.type.*; -import mindustry.world.blocks.payloads.*; - -import java.util.*; - -/** Creates quadtrees per unit team. */ -public class TeamIndexProcess implements AsyncProcess{ - private QuadTree[] trees = new QuadTree[Team.all.length]; - private int[] counts = new int[Team.all.length]; - private int[][] typeCounts = new int[Team.all.length][0]; - - public QuadTree tree(Team team){ - if(trees[team.id] == null) trees[team.id] = new QuadTree<>(Vars.world.getQuadBounds(new Rect())); - - return trees[team.id]; - } - - public int count(Team team){ - return counts[team.id]; - } - - public int countType(Team team, UnitType type){ - return typeCounts[team.id].length <= type.id ? 0 : typeCounts[team.id][type.id]; - } - - public void updateCount(Team team, UnitType type, int amount){ - counts[team.id] += amount; - if(typeCounts[team.id].length <= type.id){ - typeCounts[team.id] = new int[Vars.content.units().size]; - } - typeCounts[team.id][type.id] += amount; - } - - private void count(Unit unit){ - updateCount(unit.team, unit.type(), 1); - - if(unit instanceof Payloadc){ - ((Payloadc)unit).payloads().each(p -> { - if(p instanceof UnitPayload){ - count(((UnitPayload)p).unit); - } - }); - } - } - - @Override - public void reset(){ - counts = new int[Team.all.length]; - trees = new QuadTree[Team.all.length]; - } - - @Override - public void begin(){ - - for(Team team : Team.all){ - if(trees[team.id] != null){ - trees[team.id].clear(); - } - - Arrays.fill(typeCounts[team.id], 0); - } - - Arrays.fill(counts, 0); - - for(Unit unit : Groups.unit){ - tree(unit.team).insert(unit); - - count(unit); - } - } - - @Override - public boolean shouldProcess(){ - return false; - } -} diff --git a/core/src/mindustry/audio/LoopControl.java b/core/src/mindustry/audio/LoopControl.java deleted file mode 100644 index 1b102ab0a4..0000000000 --- a/core/src/mindustry/audio/LoopControl.java +++ /dev/null @@ -1,61 +0,0 @@ -package mindustry.audio; - -import arc.*; -import arc.audio.*; -import arc.struct.*; -import arc.math.*; -import arc.math.geom.*; -import mindustry.*; - -public class LoopControl{ - private ObjectMap sounds = new ObjectMap<>(); - - public void play(Sound sound, Position pos, float volume){ - if(Vars.headless) return; - - float baseVol = sound.calcFalloff(pos.getX(), pos.getY()); - float vol = baseVol * volume; - - SoundData data = sounds.get(sound, SoundData::new); - data.volume += vol; - data.volume = Mathf.clamp(data.volume, 0f, 1f); - data.total += baseVol; - data.sum.add(pos.getX() * baseVol, pos.getY() * baseVol); - } - - public void update(){ - float avol = Core.settings.getInt("ambientvol", 100) / 100f; - - sounds.each((sound, data) -> { - data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); - - boolean play = data.curVolume > 0.01f; - float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); - if(data.soundID <= 0){ - if(play){ - data.soundID = sound.loop(data.curVolume, 1f, pan); - } - }else{ - if(data.curVolume <= 0.01f){ - sound.stop(); - data.soundID = -1; - return; - } - sound.setPan(data.soundID, pan, data.curVolume); - } - - data.volume = 0f; - data.total = 0f; - data.sum.setZero(); - }); - } - - private static class SoundData{ - float volume; - float total; - Vec2 sum = new Vec2(); - - int soundID; - float curVolume; - } -} diff --git a/core/src/mindustry/audio/MusicControl.java b/core/src/mindustry/audio/SoundControl.java similarity index 54% rename from core/src/mindustry/audio/MusicControl.java rename to core/src/mindustry/audio/SoundControl.java index 1b642bc7cd..a5c34814bb 100644 --- a/core/src/mindustry/audio/MusicControl.java +++ b/core/src/mindustry/audio/SoundControl.java @@ -2,46 +2,99 @@ package mindustry.audio; import arc.*; import arc.audio.*; +import arc.audio.Filters.*; +import arc.files.*; import arc.math.*; +import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; +import mindustry.*; +import mindustry.content.*; import mindustry.game.EventType.*; import mindustry.gen.*; import static mindustry.Vars.*; -/** Controls playback of multiple music tracks.*/ -public class MusicControl{ - protected static final float finTime = 120f, foutTime = 120f, musicInterval = 60 * 60 * 3f, musicChance = 0.6f, musicWaveChance = 0.5f; +/** Controls playback of multiple audio tracks.*/ +public class SoundControl{ + protected static final float finTime = 120f, foutTime = 120f, musicInterval = 60 * 60 * 3f, musicChance = 0.6f, musicWaveChance = 0.46f; /** normal, ambient music, plays at any time */ public Seq ambientMusic = Seq.with(); /** darker music, used in times of conflict */ public Seq darkMusic = Seq.with(); + /** music used explicitly after boss spawns */ + public Seq bossMusic = Seq.with(); protected Music lastRandomPlayed; - protected Interval timer = new Interval(); + protected Interval timer = new Interval(4); protected @Nullable Music current; protected float fade; protected boolean silenced; - public MusicControl(){ + protected AudioBus uiBus = new AudioBus(); + protected boolean wasPlaying; + protected AudioFilter filter = new BiquadFilter(){{ + set(0, 500, 1); + }}; + + protected ObjectMap sounds = new ObjectMap<>(); + + public SoundControl(){ Events.on(ClientLoadEvent.class, e -> reload()); //only run music 10 seconds after a wave spawns - Events.on(WaveEvent.class, e -> Time.run(60f * 10f, () -> { - if(Mathf.chance(musicWaveChance)){ + Events.on(WaveEvent.class, e -> Time.run(Mathf.random(8f, 15f) * 60f, () -> { + boolean boss = state.rules.spawns.contains(group -> group.getSpawned(state.wave - 2) > 0 && group.effect == StatusEffects.boss); + + if(boss){ + playOnce(bossMusic.random(lastRandomPlayed)); + }else if(Mathf.chance(musicWaveChance)){ playRandom(); } })); + + setupFilters(); + } + + protected void setupFilters(){ + Core.audio.soundBus.setFilter(0, filter); + Core.audio.soundBus.setFilterParam(0, Filters.paramWet, 0f); } protected void reload(){ current = null; fade = 0f; - ambientMusic = Seq.with(Musics.game1, Musics.game3, Musics.game4, Musics.game6); - darkMusic = Seq.with(Musics.game2, Musics.game5, Musics.game7); + ambientMusic = Seq.with(Musics.game1, Musics.game3, Musics.game6, Musics.game8, Musics.game9); + darkMusic = Seq.with(Musics.game2, Musics.game5, Musics.game7, Musics.game4); + bossMusic = Seq.with(Musics.boss1, Musics.boss2, Musics.game2, Musics.game5); + + //setup UI bus for all sounds that are in the UI folder + for(var sound : Core.assets.getAll(Sound.class, new Seq<>())){ + var file = Fi.get(Core.assets.getAssetFileName(sound)); + if(file.parent().name().equals("ui")){ + sound.setBus(uiBus); + } + } + } + + public void loop(Sound sound, float volume){ + if(Vars.headless) return; + + loop(sound, Core.camera.position, volume); + } + + public void loop(Sound sound, Position pos, float volume){ + if(Vars.headless) return; + + float baseVol = sound.calcFalloff(pos.getX(), pos.getY()); + float vol = baseVol * volume; + + SoundData data = sounds.get(sound, SoundData::new); + data.volume += vol; + data.volume = Mathf.clamp(data.volume, 0f, 1f); + data.total += baseVol; + data.sum.add(pos.getX() * baseVol, pos.getY() * baseVol); } public void stop(){ @@ -55,6 +108,34 @@ public class MusicControl{ /** Update and play the right music track.*/ public void update(){ + boolean paused = state.isGame() && Core.scene.hasDialog(); + boolean playing = state.isGame(); + + //check if current track is finished + if(current != null && !current.isPlaying()){ + current = null; + fade = 0f; + } + + //fade the lowpass filter in/out, poll every 30 ticks just in case performance is an issue + if(timer.get(1, 30f)){ + Core.audio.soundBus.fadeFilterParam(0, Filters.paramWet, paused ? 1f : 0f, 0.4f); + } + + //play/stop ordinary effects + if(playing != wasPlaying){ + wasPlaying = playing; + + if(playing){ + Core.audio.soundBus.play(); + setupFilters(); + }else{ + Core.audio.soundBus.replay(); + } + } + + Core.audio.setPaused(Core.audio.soundBus.id, state.isPaused()); + if(state.isMenu()){ silenced = false; if(ui.planet.isShown()){ @@ -79,10 +160,46 @@ public class MusicControl{ } } } + + updateLoops(); + } + + protected void updateLoops(){ + //clear loops when in menu + if(!state.isGame()){ + sounds.clear(); + return; + } + + float avol = Core.settings.getInt("ambientvol", 100) / 100f; + + sounds.each((sound, data) -> { + data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); + + boolean play = data.curVolume > 0.01f; + float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); + if(data.soundID <= 0 || !Core.audio.isPlaying(data.soundID)){ + if(play){ + data.soundID = sound.loop(data.curVolume, 1f, pan); + Core.audio.protect(data.soundID, true); + } + }else{ + if(data.curVolume <= 0.001f){ + sound.stop(); + data.soundID = -1; + return; + } + Core.audio.set(data.soundID, pan, data.curVolume); + } + + data.volume = 0f; + data.total = 0f; + data.sum.setZero(); + }); } /** Plays a random track.*/ - protected void playRandom(){ + public void playRandom(){ if(isDark()){ playOnce(darkMusic.random(lastRandomPlayed)); }else{ @@ -171,12 +288,6 @@ public class MusicControl{ current = music; current.setVolume(1f); current.setLooping(false); - current.setCompletionListener(m -> { - if(current == m){ - current = null; - fade = 0f; - } - }); current.play(); } @@ -188,4 +299,13 @@ public class MusicControl{ protected void silence(){ play(null); } + + protected static class SoundData{ + float volume; + float total; + Vec2 sum = new Vec2(); + + int soundID; + float curVolume; + } } diff --git a/core/src/mindustry/audio/SoundLoop.java b/core/src/mindustry/audio/SoundLoop.java index 99d6837251..d10eb02214 100644 --- a/core/src/mindustry/audio/SoundLoop.java +++ b/core/src/mindustry/audio/SoundLoop.java @@ -1,5 +1,6 @@ package mindustry.audio; +import arc.*; import arc.audio.*; import arc.math.*; import arc.util.*; @@ -18,7 +19,7 @@ public class SoundLoop{ } public void update(float x, float y, boolean play){ - if(baseVolume < 0) return; + if(baseVolume <= 0) return; if(id < 0){ if(play){ @@ -31,18 +32,19 @@ public class SoundLoop{ }else{ volume = Mathf.clamp(volume - fadeSpeed * Time.delta); if(volume <= 0.001f){ - sound.stop(id); + Core.audio.stop(id); id = -1; return; } } - sound.setPan(id, sound.calcPan(x, y), sound.calcVolume(x, y) * volume * baseVolume); + + Core.audio.set(id, sound.calcPan(x, y), sound.calcVolume(x, y) * volume * baseVolume); } } public void stop(){ if(id != -1){ - sound.stop(id); + Core.audio.stop(id); id = -1; volume = baseVolume = -1; } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index b3ff2389c2..0f1a658539 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1,8 +1,9 @@ package mindustry.content; -import arc.*; import arc.graphics.*; -import arc.graphics.g2d.*; +import arc.math.*; +import arc.struct.*; +import mindustry.*; import mindustry.ctype.*; import mindustry.entities.bullet.*; import mindustry.gen.*; @@ -19,6 +20,7 @@ import mindustry.world.blocks.experimental.*; import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.liquid.*; import mindustry.world.blocks.logic.*; +import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; @@ -34,10 +36,11 @@ public class Blocks implements ContentList{ public static Block //environment - air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, - dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, - iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, grass, salt, - metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, boulder, snowBoulder, saltWall, + air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space, + dacite, + stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, + iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt, + metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, pebbles, tendrils, @@ -49,7 +52,7 @@ public class Blocks implements ContentList{ melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge, //sandbox - powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, illuminator, + powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadVoid, payloadSource, illuminator, //defense copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, @@ -58,7 +61,8 @@ public class Blocks implements ContentList{ //transport conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, - overflowGate, underflowGate, massDriver, payloadConveyor, payloadRouter, + overflowGate, underflowGate, massDriver, + duct, ductRouter, ductBridge, //liquid mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, platedConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit, @@ -80,48 +84,28 @@ public class Blocks implements ContentList{ commandCenter, groundFactory, airFactory, navalFactory, additiveReconstructor, multiplicativeReconstructor, exponentialReconstructor, tetrativeReconstructor, - repairPoint, resupplyPoint, + repairPoint, repairTurret, resupplyPoint, + + //payloads + payloadConveyor, payloadRouter, payloadPropulsionTower, //logic message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, memoryBank, //campaign - launchPad, launchPadLarge, + launchPad, interplanetaryAccelerator, //misc experimental - blockForge, blockLoader, blockUnloader; + blockForge, blockLoader, blockUnloader + ; @Override public void load(){ //region environment - air = new Floor("air"){ - { - alwaysReplace = true; - hasShadow = false; - } + air = new AirBlock("air"); - @Override public void drawBase(Tile tile){} - @Override public void load(){} - @Override public void init(){} - @Override public boolean isHidden(){ return true; } - - @Override - public TextureRegion[] variantRegions(){ - if(variantRegions == null){ - variantRegions = new TextureRegion[]{Core.atlas.find("clear")}; - } - return variantRegions; - } - }; - - spawn = new OverlayFloor("spawn"){ - { - variants = 0; - } - @Override - public void drawBase(Tile tile){} - }; + spawn = new SpawnBlock("spawn"); cliff = new Cliff("cliff"){{ inEditor = false; @@ -130,7 +114,7 @@ public class Blocks implements ContentList{ //Registers build blocks //no reference is needed here since they can be looked up by name later - for(int i = 1; i <= ConstructBlock.maxSize; i++){ + for(int i = 1; i <= Vars.maxBlockSize; i++){ new ConstructBlock(i); } @@ -168,12 +152,14 @@ public class Blocks implements ContentList{ isLiquid = true; cacheLayer = CacheLayer.water; albedo = 0.5f; + attributes.set(Attribute.spores, 0.15f); }}; darksandTaintedWater = new ShallowLiquid("darksand-tainted-water"){{ speedMultiplier = 0.75f; statusDuration = 60f; albedo = 0.5f; + attributes.set(Attribute.spores, 0.1f); }}; sandWater = new ShallowLiquid("sand-water"){{ @@ -215,6 +201,13 @@ public class Blocks implements ContentList{ lightColor = Color.orange.cpy().a(0.38f); }}; + space = new Floor("space"){{ + cacheLayer = CacheLayer.space; + placeableOn = false; + solid = true; + variants = 0; + }}; + stone = new Floor("stone"); craters = new Floor("craters"){{ @@ -273,6 +266,10 @@ public class Blocks implements ContentList{ attributes.set(Attribute.water, 1f); cacheLayer = CacheLayer.mud; albedo = 0.35f; + walkSound = Sounds.mud; + walkSoundVolume = 0.08f; + walkSoundPitchMin = 0.4f; + walkSoundPitchMax = 0.5f; }}; ((ShallowLiquid)darksandTaintedWater).set(Blocks.taintedWater, Blocks.darksand); @@ -287,7 +284,7 @@ public class Blocks implements ContentList{ salt = new Floor("salt"){{ variants = 0; - attributes.set(Attribute.water, -0.25f); + attributes.set(Attribute.water, -0.3f); attributes.set(Attribute.oil, 0.3f); }}; @@ -307,6 +304,11 @@ public class Blocks implements ContentList{ attributes.set(Attribute.water, 0.3f); }}; + shale = new Floor("shale"){{ + variants = 3; + attributes.set(Attribute.oil, 1f); + }}; + stoneWall = new StaticWall("stone-wall"){{ variants = 2; }}; @@ -315,15 +317,6 @@ public class Blocks implements ContentList{ variants = 2; }}; - boulder = new Boulder("boulder"){{ - variants = 2; - }}; - - snowBoulder = new Boulder("snow-boulder"){{ - variants = 2; - snow.asFloor().decoration = ice.asFloor().decoration = iceSnow.asFloor().decoration = this; - }}; - dirtWall = new StaticWall("dirt-wall"){{ variants = 2; }}; @@ -348,11 +341,17 @@ public class Blocks implements ContentList{ sandWall = new StaticWall("sand-wall"){{ variants = 2; - sandWater.asFloor().wall = this; + sandWater.asFloor().wall = water.asFloor().wall = deepwater.asFloor().wall = this; }}; saltWall = new StaticWall("salt-wall"); + shrubs = new StaticWall("shrubs"); + + shaleWall = new StaticWall("shale-wall"){{ + variants = 2; + }}; + sporePine = new StaticTree("spore-pine"){{ variants = 0; }}; @@ -365,34 +364,41 @@ public class Blocks implements ContentList{ variants = 0; }}; - shrubs = new StaticWall("shrubs"); - whiteTreeDead = new TreeBlock("white-tree-dead"); whiteTree = new TreeBlock("white-tree"); - sporeCluster = new Boulder("spore-cluster"){{ + sporeCluster = new Prop("spore-cluster"){{ variants = 3; }}; - shale = new Floor("shale"){{ - variants = 3; - attributes.set(Attribute.oil, 1f); + //glowBlob = new Prop("glowblob"){{ + // variants = 1; + //}}; + + boulder = new Prop("boulder"){{ + variants = 2; + stone.asFloor().decoration = this; }}; - shaleWall = new StaticWall("shale-wall"){{ + snowBoulder = new Prop("snow-boulder"){{ + variants = 2; + snow.asFloor().decoration = ice.asFloor().decoration = iceSnow.asFloor().decoration = salt.asFloor().decoration = this; + }}; + + shaleBoulder = new Prop("shale-boulder"){{ variants = 2; }}; - shaleBoulder = new Boulder("shale-boulder"){{ + sandBoulder = new Prop("sand-boulder"){{ variants = 2; }}; - sandBoulder = new Boulder("sand-boulder"){{ + daciteBoulder = new Prop("dacite-boulder"){{ variants = 2; }}; - daciteBoulder = new Boulder("dacite-boulder"){{ + basaltBoulder = new Prop("basalt-boulder"){{ variants = 2; }}; @@ -497,6 +503,7 @@ public class Blocks implements ContentList{ craftEffect = Fx.pulverizeMedium; outputItem = new ItemStack(Items.graphite, 2); craftTime = 30f; + itemCapacity = 20; size = 3; hasItems = true; hasLiquids = true; @@ -507,7 +514,7 @@ public class Blocks implements ContentList{ consumes.liquid(Liquids.water, 0.1f); }}; - siliconSmelter = new GenericSmelter("silicon-smelter"){{ + siliconSmelter = new GenericCrafter("silicon-smelter"){{ requirements(Category.crafting, with(Items.copper, 30, Items.lead, 25)); craftEffect = Fx.smeltsmoke; outputItem = new ItemStack(Items.silicon, 1); @@ -515,13 +522,13 @@ public class Blocks implements ContentList{ size = 2; hasPower = true; hasLiquids = false; - flameColor = Color.valueOf("ffef99"); + drawer = new DrawSmelter(Color.valueOf("ffef99")); - consumes.items(new ItemStack(Items.coal, 1), new ItemStack(Items.sand, 2)); + consumes.items(with(Items.coal, 1, Items.sand, 2)); consumes.power(0.50f); }}; - siliconCrucible = new AttributeSmelter("silicon-crucible"){{ + siliconCrucible = new AttributeCrafter("silicon-crucible"){{ requirements(Category.crafting, with(Items.titanium, 120, Items.metaglass, 80, Items.plastanium, 35, Items.silicon, 60)); craftEffect = Fx.smeltsmoke; outputItem = new ItemStack(Items.silicon, 8); @@ -529,24 +536,24 @@ public class Blocks implements ContentList{ size = 3; hasPower = true; hasLiquids = false; - flameColor = Color.valueOf("ffef99"); itemCapacity = 30; boostScale = 0.15f; + drawer = new DrawSmelter(Color.valueOf("ffef99")); - consumes.items(new ItemStack(Items.coal, 4), new ItemStack(Items.sand, 6), new ItemStack(Items.pyratite, 1)); + consumes.items(with(Items.coal, 4, Items.sand, 6, Items.pyratite, 1)); consumes.power(4f); }}; - kiln = new GenericSmelter("kiln"){{ + kiln = new GenericCrafter("kiln"){{ requirements(Category.crafting, with(Items.copper, 60, Items.graphite, 30, Items.lead, 30)); craftEffect = Fx.smeltsmoke; outputItem = new ItemStack(Items.metaglass, 1); craftTime = 30f; size = 2; hasPower = hasItems = true; - flameColor = Color.valueOf("ffc099"); + drawer = new DrawSmelter(Color.valueOf("ffc099")); - consumes.items(new ItemStack(Items.lead, 1), new ItemStack(Items.sand, 1)); + consumes.items(with(Items.lead, 1, Items.sand, 1)); consumes.power(0.60f); }}; @@ -571,27 +578,32 @@ public class Blocks implements ContentList{ phaseWeaver = new GenericCrafter("phase-weaver"){{ requirements(Category.crafting, with(Items.silicon, 130, Items.lead, 120, Items.thorium, 75)); craftEffect = Fx.smeltsmoke; - outputItem = new ItemStack(Items.phasefabric, 1); + outputItem = new ItemStack(Items.phaseFabric, 1); craftTime = 120f; size = 2; hasPower = true; drawer = new DrawWeave(); - consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10)); + ambientSound = Sounds.techloop; + ambientSoundVolume = 0.02f; + + consumes.items(with(Items.thorium, 4, Items.sand, 10)); consumes.power(5f); itemCapacity = 20; }}; - surgeSmelter = new GenericSmelter("alloy-smelter"){{ + surgeSmelter = new GenericCrafter("alloy-smelter"){{ requirements(Category.crafting, with(Items.silicon, 80, Items.lead, 80, Items.thorium, 70)); craftEffect = Fx.smeltsmoke; - outputItem = new ItemStack(Items.surgealloy, 1); + outputItem = new ItemStack(Items.surgeAlloy, 1); craftTime = 75f; size = 3; hasPower = true; + itemCapacity = 20; + drawer = new DrawSmelter(); consumes.power(4f); - consumes.items(new ItemStack(Items.copper, 3), new ItemStack(Items.lead, 4), new ItemStack(Items.titanium, 2), new ItemStack(Items.silicon, 3)); + consumes.items(with(Items.copper, 3, Items.lead, 4, Items.titanium, 2, Items.silicon, 3)); }}; cryofluidMixer = new LiquidConverter("cryofluid-mixer"){{ @@ -612,20 +624,8 @@ public class Blocks implements ContentList{ consumes.liquid(Liquids.water, 0.2f); }}; - blastMixer = new GenericCrafter("blast-mixer"){{ - requirements(Category.crafting, with(Items.lead, 30, Items.titanium, 20)); - hasItems = true; - hasPower = true; - outputItem = new ItemStack(Items.blastCompound, 1); - size = 2; - - consumes.items(new ItemStack(Items.pyratite, 1), new ItemStack(Items.sporePod, 1)); - consumes.power(0.40f); - }}; - - pyratiteMixer = new GenericSmelter("pyratite-mixer"){{ + pyratiteMixer = new GenericCrafter("pyratite-mixer"){{ requirements(Category.crafting, with(Items.copper, 50, Items.lead, 25)); - flameColor = Color.clear; hasItems = true; hasPower = true; outputItem = new ItemStack(Items.pyratite, 1); @@ -633,7 +633,18 @@ public class Blocks implements ContentList{ size = 2; consumes.power(0.20f); - consumes.items(new ItemStack(Items.coal, 1), new ItemStack(Items.lead, 2), new ItemStack(Items.sand, 2)); + consumes.items(with(Items.coal, 1, Items.lead, 2, Items.sand, 2)); + }}; + + blastMixer = new GenericCrafter("blast-mixer"){{ + requirements(Category.crafting, with(Items.lead, 30, Items.titanium, 20)); + hasItems = true; + hasPower = true; + outputItem = new ItemStack(Items.blastCompound, 1); + size = 2; + + consumes.items(with(Items.pyratite, 1, Items.sporePod, 1)); + consumes.power(0.40f); }}; melter = new GenericCrafter("melter"){{ @@ -650,10 +661,10 @@ public class Blocks implements ContentList{ separator = new Separator("separator"){{ requirements(Category.crafting, with(Items.copper, 30, Items.titanium, 25)); results = with( - Items.copper, 5, - Items.lead, 3, - Items.graphite, 2, - Items.titanium, 2 + Items.copper, 5, + Items.lead, 3, + Items.graphite, 2, + Items.titanium, 2 ); hasPower = true; craftTime = 35f; @@ -664,12 +675,12 @@ public class Blocks implements ContentList{ }}; disassembler = new Separator("disassembler"){{ - requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgealloy, 70)); + requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgeAlloy, 70)); results = with( - Items.sand, 4, - Items.graphite, 2, - Items.titanium, 2, - Items.thorium, 1 + Items.sand, 4, + Items.graphite, 2, + Items.titanium, 2, + Items.thorium, 1 ); hasPower = true; craftTime = 15f; @@ -694,7 +705,7 @@ public class Blocks implements ContentList{ drawer = new DrawAnimation(); consumes.item(Items.sporePod, 1); - consumes.power(0.60f); + consumes.power(0.7f); }}; pulverizer = new GenericCrafter("pulverizer"){{ @@ -705,6 +716,8 @@ public class Blocks implements ContentList{ updateEffect = Fx.pulverizeSmall; hasItems = hasPower = true; drawer = new DrawRotator(); + ambientSound = Sounds.grinding; + ambientSoundVolume = 0.025f; consumes.item(Items.scrap, 1); consumes.power(0.50f); @@ -718,8 +731,8 @@ public class Blocks implements ContentList{ size = 2; hasPower = hasItems = hasLiquids = true; - consumes.liquid(Liquids.oil, 0.09f); - consumes.power(0.5f); + consumes.liquid(Liquids.oil, 0.1f); + consumes.power(0.7f); }}; incinerator = new Incinerator("incinerator"){{ @@ -757,17 +770,19 @@ public class Blocks implements ContentList{ plastaniumWall = new Wall("plastanium-wall"){{ requirements(Category.defense, with(Items.plastanium, 5, Items.metaglass, 2)); - health = 190 * wallHealthMultiplier; + health = 125 * wallHealthMultiplier; insulated = true; absorbLasers = true; + schematicPriority = 10; }}; plastaniumWallLarge = new Wall("plastanium-wall-large"){{ requirements(Category.defense, ItemStack.mult(plastaniumWall.requirements, 4)); - health = 190 * wallHealthMultiplier * 4; + health = 125 * wallHealthMultiplier * 4; size = 2; insulated = true; absorbLasers = true; + schematicPriority = 10; }}; thoriumWall = new Wall("thorium-wall"){{ @@ -782,20 +797,22 @@ public class Blocks implements ContentList{ }}; phaseWall = new Wall("phase-wall"){{ - requirements(Category.defense, with(Items.phasefabric, 6)); + requirements(Category.defense, with(Items.phaseFabric, 6)); health = 150 * wallHealthMultiplier; - flashHit = deflect = true; + chanceDeflect = 10f; + flashHit = true; }}; phaseWallLarge = new Wall("phase-wall-large"){{ requirements(Category.defense, ItemStack.mult(phaseWall.requirements, 4)); health = 150 * 4 * wallHealthMultiplier; size = 2; - flashHit = deflect = true; + chanceDeflect = 10f; + flashHit = true; }}; surgeWall = new Wall("surge-wall"){{ - requirements(Category.defense, with(Items.surgealloy, 6)); + requirements(Category.defense, with(Items.surgeAlloy, 6)); health = 230 * wallHealthMultiplier; lightningChance = 0.05f; }}; @@ -821,32 +838,32 @@ public class Blocks implements ContentList{ }}; scrapWall = new Wall("scrap-wall"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, with(Items.scrap, 6)); health = 60 * wallHealthMultiplier; variants = 5; }}; scrapWallLarge = new Wall("scrap-wall-large"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 4)); health = 60 * 4 * wallHealthMultiplier; size = 2; variants = 4; }}; scrapWallHuge = new Wall("scrap-wall-huge"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 9)); health = 60 * 9 * wallHealthMultiplier; size = 3; variants = 3; }}; scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 16)); health = 60 * 16 * wallHealthMultiplier; size = 4; }}; - thruster = new Wall("thruster"){{ + thruster = new Thruster("thruster"){{ health = 55 * 16 * wallHealthMultiplier; size = 4; }}; @@ -873,25 +890,25 @@ public class Blocks implements ContentList{ healPercent = 11f; phaseBoost = 15f; health = 80 * size * size; - consumes.item(Items.phasefabric).boost(); + consumes.item(Items.phaseFabric).boost(); }}; overdriveProjector = new OverdriveProjector("overdrive-projector"){{ requirements(Category.effect, with(Items.lead, 100, Items.titanium, 75, Items.silicon, 75, Items.plastanium, 30)); consumes.power(3.50f); size = 2; - consumes.item(Items.phasefabric).boost(); + consumes.item(Items.phaseFabric).boost(); }}; overdriveDome = new OverdriveProjector("overdrive-dome"){{ - requirements(Category.effect, with(Items.lead, 200, Items.titanium, 130, Items.silicon, 130, Items.plastanium, 80, Items.surgealloy, 120)); + requirements(Category.effect, with(Items.lead, 200, Items.titanium, 130, Items.silicon, 130, Items.plastanium, 80, Items.surgeAlloy, 120)); consumes.power(10f); size = 3; range = 200f; speedBoost = 2.5f; useTime = 300f; hasBoost = false; - consumes.items(with(Items.phasefabric, 1, Items.silicon, 1)); + consumes.items(with(Items.phaseFabric, 1, Items.silicon, 1)); }}; forceProjector = new ForceProjector("force-projector"){{ @@ -899,20 +916,20 @@ public class Blocks implements ContentList{ size = 3; phaseRadiusBoost = 80f; radius = 101.7f; - breakage = 750f; + shieldHealth = 750f; cooldownNormal = 1.5f; cooldownLiquid = 1.2f; cooldownBrokenBase = 0.35f; - consumes.item(Items.phasefabric).boost(); + consumes.item(Items.phaseFabric).boost(); consumes.power(4f); }}; shockMine = new ShockMine("shock-mine"){{ requirements(Category.effect, with(Items.lead, 25, Items.silicon, 12)); hasShadow = false; - health = 40; - damage = 23; + health = 50; + damage = 25; tileDamage = 7f; length = 10; tendrils = 4; @@ -947,28 +964,27 @@ public class Blocks implements ContentList{ requirements(Category.distribution, with(Items.plastanium, 1, Items.thorium, 1, Items.metaglass, 1)); health = 180; speed = 0.08f; - displayedSpeed = 10f; + displayedSpeed = 11f; }}; junction = new Junction("junction"){{ requirements(Category.distribution, with(Items.copper, 2), true); speed = 26; - capacity = 12; + capacity = 6; health = 30; buildCostMultiplier = 6f; }}; itemBridge = new BufferedItemBridge("bridge-conveyor"){{ - requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4)); + requirements(Category.distribution, with(Items.lead, 6, Items.copper, 6)); range = 4; - speed = 70f; + speed = 74f; bufferCapacity = 14; }}; phaseConveyor = new ItemBridge("phase-conveyor"){{ - requirements(Category.distribution, with(Items.phasefabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10)); + requirements(Category.distribution, with(Items.phaseFabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10)); range = 12; - canOverdrive = false; hasPower = true; consumes.power(0.30f); }}; @@ -986,7 +1002,7 @@ public class Blocks implements ContentList{ router = new Router("router"){{ requirements(Category.distribution, with(Items.copper, 3)); - buildCostMultiplier = 2f; + buildCostMultiplier = 4f; }}; distributor = new Router("distributor"){{ @@ -1014,14 +1030,20 @@ public class Blocks implements ContentList{ consumes.power(1.75f); }}; - payloadConveyor = new PayloadConveyor("payload-conveyor"){{ - requirements(Category.distribution, with(Items.graphite, 10, Items.copper, 20)); - canOverdrive = false; + //special transport blocks + + duct = new Duct("duct"){{ + requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.graphite, 5, Items.copper, 5)); + speed = 5f; }}; - payloadRouter = new PayloadRouter("payload-router"){{ - requirements(Category.distribution, with(Items.graphite, 15, Items.copper, 20)); - canOverdrive = false; + ductRouter = new DuctRouter("duct-router"){{ + requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.graphite, 10, Items.copper, 5)); + speed = 5f; + }}; + + ductBridge = new DuctBridge("duct-bridge"){{ + requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.graphite, 20, Items.copper, 15)); }}; //endregion @@ -1092,7 +1114,7 @@ public class Blocks implements ContentList{ }}; phaseConduit = new LiquidBridge("phase-conduit"){{ - requirements(Category.liquid, with(Items.phasefabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10)); + requirements(Category.liquid, with(Items.phaseFabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10)); range = 12; hasPower = true; canOverdrive = false; @@ -1116,10 +1138,11 @@ public class Blocks implements ContentList{ }}; surgeTower = new PowerNode("surge-tower"){{ - requirements(Category.power, with(Items.titanium, 7, Items.lead, 10, Items.silicon, 15, Items.surgealloy, 15)); + requirements(Category.power, with(Items.titanium, 7, Items.lead, 10, Items.silicon, 15, Items.surgeAlloy, 15)); size = 2; maxNodes = 2; - laserRange = 30f; + laserRange = 40f; + schematicPriority = -15; }}; diode = new PowerDiode("diode"){{ @@ -1127,7 +1150,7 @@ public class Blocks implements ContentList{ }}; battery = new Battery("battery"){{ - requirements(Category.power, with(Items.copper, 4, Items.lead, 20)); + requirements(Category.power, with(Items.copper, 5, Items.lead, 20)); consumes.powerBuffered(4000f); }}; @@ -1141,6 +1164,9 @@ public class Blocks implements ContentList{ requirements(Category.power, with(Items.copper, 25, Items.lead, 15)); powerProduction = 1f; itemDuration = 120f; + + ambientSound = Sounds.smelter; + ambientSoundVolume = 0.03f; }}; thermalGenerator = new ThermalGenerator("thermal-generator"){{ @@ -1149,6 +1175,8 @@ public class Blocks implements ContentList{ generateEffect = Fx.redgeneratespark; size = 2; floating = true; + ambientSound = Sounds.hum; + ambientSoundVolume = 0.06f; }}; steamGenerator = new BurnerGenerator("steam-generator"){{ @@ -1158,6 +1186,9 @@ public class Blocks implements ContentList{ consumes.liquid(Liquids.water, 0.1f); hasLiquids = true; size = 2; + + ambientSound = Sounds.smelter; + ambientSoundVolume = 0.06f; }}; differentialGenerator = new SingleTypeGenerator("differential-generator"){{ @@ -1167,31 +1198,35 @@ public class Blocks implements ContentList{ hasLiquids = true; hasItems = true; size = 3; + ambientSound = Sounds.steam; + ambientSoundVolume = 0.03f; consumes.item(Items.pyratite).optional(true, false); consumes.liquid(Liquids.cryofluid, 0.1f); }}; rtgGenerator = new DecayGenerator("rtg-generator"){{ - requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phasefabric, 25, Items.plastanium, 75, Items.thorium, 50)); + requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phaseFabric, 25, Items.plastanium, 75, Items.thorium, 50)); size = 2; powerProduction = 4.5f; - itemDuration = 60 * 15f; + itemDuration = 60 * 14f; }}; solarPanel = new SolarGenerator("solar-panel"){{ requirements(Category.power, with(Items.lead, 10, Items.silicon, 15)); - powerProduction = 0.07f; + powerProduction = 0.1f; }}; largeSolarPanel = new SolarGenerator("solar-panel-large"){{ - requirements(Category.power, with(Items.lead, 100, Items.silicon, 145, Items.phasefabric, 15)); + requirements(Category.power, with(Items.lead, 80, Items.silicon, 110, Items.phaseFabric, 15)); size = 3; - powerProduction = 0.95f; + powerProduction = 1.3f; }}; thoriumReactor = new NuclearReactor("thorium-reactor"){{ requirements(Category.power, with(Items.lead, 300, Items.silicon, 200, Items.graphite, 150, Items.thorium, 150, Items.metaglass, 50)); + ambientSound = Sounds.hum; + ambientSoundVolume = 0.24f; size = 3; health = 700; itemDuration = 360f; @@ -1202,11 +1237,14 @@ public class Blocks implements ContentList{ }}; impactReactor = new ImpactReactor("impact-reactor"){{ - requirements(Category.power, with(Items.lead, 500, Items.silicon, 300, Items.graphite, 400, Items.thorium, 100, Items.surgealloy, 250, Items.metaglass, 250)); + requirements(Category.power, with(Items.lead, 500, Items.silicon, 300, Items.graphite, 400, Items.thorium, 100, Items.surgeAlloy, 250, Items.metaglass, 250)); size = 4; health = 900; powerProduction = 130f; itemDuration = 140f; + ambientSound = Sounds.pulse; + ambientSoundVolume = 0.07f; + consumes.power(25f); consumes.item(Items.blastCompound); consumes.liquid(Liquids.cryofluid, 0.25f); @@ -1220,7 +1258,7 @@ public class Blocks implements ContentList{ tier = 2; drillTime = 600; size = 2; - drawMineItem = true; + consumes.liquid(Liquids.water, 0.05f).boost(); }}; @@ -1229,7 +1267,7 @@ public class Blocks implements ContentList{ tier = 3; drillTime = 400; size = 2; - drawMineItem = true; + consumes.liquid(Liquids.water, 0.06f).boost(); }}; @@ -1267,28 +1305,37 @@ public class Blocks implements ContentList{ }}; waterExtractor = new SolidPump("water-extractor"){{ - requirements(Category.production, with(Items.copper, 25, Items.graphite, 25, Items.lead, 20)); + requirements(Category.production, with(Items.metaglass, 30, Items.graphite, 30, Items.lead, 30)); result = Liquids.water; pumpAmount = 0.11f; size = 2; liquidCapacity = 30f; rotateSpeed = 1.4f; attribute = Attribute.water; + envRequired |= Env.groundWater; consumes.power(1.5f); }}; - cultivator = new Cultivator("cultivator"){{ - requirements(Category.production, with(Items.copper, 10, Items.lead, 25, Items.silicon, 10)); + cultivator = new AttributeCrafter("cultivator"){{ + requirements(Category.production, with(Items.copper, 25, Items.lead, 25, Items.silicon, 10)); outputItem = new ItemStack(Items.sporePod, 1); - craftTime = 140; + craftTime = 100; size = 2; hasLiquids = true; hasPower = true; hasItems = true; - consumes.power(0.80f); - consumes.liquid(Liquids.water, 0.2f); + craftEffect = Fx.none; + envRequired |= Env.spores; + attribute = Attribute.spores; + + legacyReadWarmup = true; + drawer = new DrawCultivator(); + maxBoost = 2f; + + consumes.power(80f / 60f); + consumes.liquid(Liquids.water, 20f / 60f); }}; oilExtractor = new Fracker("oil-extractor"){{ @@ -1313,7 +1360,7 @@ public class Blocks implements ContentList{ //region storage coreShard = new CoreBlock("core-shard"){{ - requirements(Category.effect, BuildVisibility.hidden, with(Items.copper, 2000, Items.lead, 1000)); + requirements(Category.effect, BuildVisibility.editorOnly, with(Items.copper, 1000, Items.lead, 800)); alwaysUnlocked = true; unitType = UnitTypes.alpha; @@ -1332,7 +1379,8 @@ public class Blocks implements ContentList{ itemCapacity = 9000; size = 4; - unitCapModifier = 14; + unitCapModifier = 16; + researchCostMultiplier = 0.07f; }}; coreNucleus = new CoreBlock("core-nucleus"){{ @@ -1343,26 +1391,27 @@ public class Blocks implements ContentList{ itemCapacity = 13000; size = 5; - unitCapModifier = 20; + unitCapModifier = 24; + researchCostMultiplier = 0.11f; }}; vault = new StorageBlock("vault"){{ requirements(Category.effect, with(Items.titanium, 250, Items.thorium, 125)); size = 3; itemCapacity = 1000; - group = BlockGroup.storage; + health = size * size * 55; }}; container = new StorageBlock("container"){{ requirements(Category.effect, with(Items.titanium, 100)); size = 2; itemCapacity = 300; - group = BlockGroup.storage; + health = size * size * 55; }}; unloader = new Unloader("unloader"){{ requirements(Category.effect, with(Items.titanium, 25, Items.silicon, 30)); - speed = 6f; + speed = 60f / 11f; group = BlockGroup.transportation; }}; @@ -1372,10 +1421,10 @@ public class Blocks implements ContentList{ duo = new ItemTurret("duo"){{ requirements(Category.turret, with(Items.copper, 35), true); ammo( - Items.copper, Bullets.standardCopper, - Items.graphite, Bullets.standardDense, - Items.pyratite, Bullets.standardIncendiary, - Items.silicon, Bullets.standardHoming + Items.copper, Bullets.standardCopper, + Items.graphite, Bullets.standardDense, + Items.pyratite, Bullets.standardIncendiary, + Items.silicon, Bullets.standardHoming ); spread = 4f; @@ -1383,23 +1432,25 @@ public class Blocks implements ContentList{ alternate = true; reloadTime = 20f; restitution = 0.03f; - range = 100; + range = 110; shootCone = 15f; - ammoUseEffect = Fx.shellEjectSmall; + ammoUseEffect = Fx.casing1; health = 250; inaccuracy = 2f; rotateSpeed = 10f; + + limitRange(); }}; scatter = new ItemTurret("scatter"){{ requirements(Category.turret, with(Items.copper, 85, Items.lead, 45)); ammo( - Items.scrap, Bullets.flakScrap, - Items.lead, Bullets.flakLead, - Items.metaglass, Bullets.flakGlass + Items.scrap, Bullets.flakScrap, + Items.lead, Bullets.flakLead, + Items.metaglass, Bullets.flakGlass ); reloadTime = 18f; - range = 160f; + range = 220f; size = 2; burstSpacing = 5f; shots = 2; @@ -1412,13 +1463,15 @@ public class Blocks implements ContentList{ health = 200 * size * size; shootSound = Sounds.shootSnap; + + limitRange(2); }}; scorch = new ItemTurret("scorch"){{ requirements(Category.turret, with(Items.copper, 25, Items.graphite, 22)); ammo( - Items.coal, Bullets.basicFlame, - Items.pyratite, Bullets.pyraFlame + Items.coal, Bullets.basicFlame, + Items.pyratite, Bullets.pyraFlame ); recoilAmount = 0f; reloadTime = 6f; @@ -1434,48 +1487,49 @@ public class Blocks implements ContentList{ hail = new ItemTurret("hail"){{ requirements(Category.turret, with(Items.copper, 40, Items.graphite, 17)); ammo( - Items.graphite, Bullets.artilleryDense, - Items.silicon, Bullets.artilleryHoming, - Items.pyratite, Bullets.artilleryIncendiary + Items.graphite, Bullets.artilleryDense, + Items.silicon, Bullets.artilleryHoming, + Items.pyratite, Bullets.artilleryIncendiary ); targetAir = false; reloadTime = 60f; recoilAmount = 2f; - range = 230f; + range = 235f; inaccuracy = 1f; shootCone = 10f; health = 260; - shootSound = Sounds.artillery; + shootSound = Sounds.bang; + limitRange(0f); }}; wave = new LiquidTurret("wave"){{ requirements(Category.turret, with(Items.metaglass, 45, Items.lead, 75)); ammo( - Liquids.water, Bullets.waterShot, - Liquids.slag, Bullets.slagShot, - Liquids.cryofluid, Bullets.cryoShot, - Liquids.oil, Bullets.oilShot + Liquids.water, Bullets.waterShot, + Liquids.slag, Bullets.slagShot, + Liquids.cryofluid, Bullets.cryoShot, + Liquids.oil, Bullets.oilShot ); size = 2; recoilAmount = 0f; - reloadTime = 2f; + reloadTime = 3f; inaccuracy = 5f; shootCone = 50f; liquidCapacity = 10f; shootEffect = Fx.shootLiquid; range = 110f; health = 250 * size * size; - shootSound = Sounds.splash; + flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher); }}; - lancer = new ChargeTurret("lancer"){{ - requirements(Category.turret, with(Items.copper, 25, Items.lead, 50, Items.silicon, 45)); - range = 155f; - chargeTime = 50f; + lancer = new PowerTurret("lancer"){{ + requirements(Category.turret, with(Items.copper, 60, Items.lead, 70, Items.silicon, 50)); + range = 165f; + chargeTime = 40f; chargeMaxDelay = 30f; chargeEffects = 7; recoilAmount = 2f; - reloadTime = 90f; + reloadTime = 80f; cooldown = 0.03f; powerUse = 6f; shootShake = 2f; @@ -1490,27 +1544,29 @@ public class Blocks implements ContentList{ shootSound = Sounds.laser; shootType = new LaserBulletType(140){{ - colors = new Color[]{Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white}; + colors = new Color[]{Pal.lancerLaser.cpy().a(0.4f), Pal.lancerLaser, Color.white}; hitEffect = Fx.hitLancer; - despawnEffect = Fx.none; hitSize = 4; lifetime = 16f; drawSize = 400f; collidesAir = false; + length = 173f; + ammoMultiplier = 1f; }}; }}; arc = new PowerTurret("arc"){{ - requirements(Category.turret, with(Items.copper, 35, Items.lead, 50)); + requirements(Category.turret, with(Items.copper, 50, Items.lead, 50)); shootType = new LightningBulletType(){{ damage = 20; lightningLength = 25; collidesAir = false; + ammoMultiplier = 1f; }}; reloadTime = 35f; shootCone = 40f; rotateSpeed = 8f; - powerUse = 3f; + powerUse = 3.3f; targetAir = false; range = 90f; shootEffect = Fx.lightningShoot; @@ -1526,10 +1582,10 @@ public class Blocks implements ContentList{ hasPower = true; size = 2; - force = 4.5f; - scaledForce = 5.5f; - range = 110f; - damage = 0.4f; + force = 12f; + scaledForce = 6f; + range = 240f; + damage = 0.3f; health = 160 * size * size; rotateSpeed = 10; @@ -1539,33 +1595,35 @@ public class Blocks implements ContentList{ swarmer = new ItemTurret("swarmer"){{ requirements(Category.turret, with(Items.graphite, 35, Items.titanium, 35, Items.plastanium, 45, Items.silicon, 30)); ammo( - Items.blastCompound, Bullets.missileExplosive, - Items.pyratite, Bullets.missileIncendiary, - Items.surgealloy, Bullets.missileSurge + Items.blastCompound, Bullets.missileExplosive, + Items.pyratite, Bullets.missileIncendiary, + Items.surgeAlloy, Bullets.missileSurge ); reloadTime = 30f; shots = 4; burstSpacing = 5; inaccuracy = 10f; - range = 190f; + range = 210f; xRand = 6f; size = 2; health = 300 * size * size; shootSound = Sounds.missile; + + limitRange(2f); }}; salvo = new ItemTurret("salvo"){{ - requirements(Category.turret, with(Items.copper, 105, Items.graphite, 95, Items.titanium, 60)); + requirements(Category.turret, with(Items.copper, 100, Items.graphite, 80, Items.titanium, 50)); ammo( - Items.copper, Bullets.standardCopper, - Items.graphite, Bullets.standardDense, - Items.pyratite, Bullets.standardIncendiary, - Items.silicon, Bullets.standardHoming, - Items.thorium, Bullets.standardThorium + Items.copper, Bullets.standardCopper, + Items.graphite, Bullets.standardDense, + Items.pyratite, Bullets.standardIncendiary, + Items.silicon, Bullets.standardHoming, + Items.thorium, Bullets.standardThorium ); size = 2; - range = 150f; + range = 180f; reloadTime = 38f; restitution = 0.03f; ammoEjectBack = 3f; @@ -1574,22 +1632,24 @@ public class Blocks implements ContentList{ shootShake = 1f; burstSpacing = 3f; shots = 4; - ammoUseEffect = Fx.shellEjectBig; + ammoUseEffect = Fx.casing2; health = 240 * size * size; shootSound = Sounds.shootBig; + + limitRange(); }}; segment = new PointDefenseTurret("segment"){{ - requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 40)); + requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phaseFabric, 40)); health = 250 * size * size; - range = 160f; + range = 180f; hasPower = true; consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null); size = 2; shootLength = 5f; - bulletDamage = 25f; - reloadTime = 9f; + bulletDamage = 30f; + reloadTime = 8f; }}; tsunami = new LiquidTurret("tsunami"){{ @@ -1601,8 +1661,7 @@ public class Blocks implements ContentList{ Liquids.oil, Bullets.heavyOilShot ); size = 3; - recoilAmount = 0f; - reloadTime = 2f; + reloadTime = 3f; shots = 2; velocityInaccuracy = 0.1f; inaccuracy = 4f; @@ -1613,7 +1672,7 @@ public class Blocks implements ContentList{ shootEffect = Fx.shootLiquid; range = 190f; health = 250 * size * size; - shootSound = Sounds.splash; + flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher); }}; fuse = new ItemTurret("fuse"){{ @@ -1634,21 +1693,32 @@ public class Blocks implements ContentList{ float brange = range + 10f; - ammo(Items.thorium, new ShrapnelBulletType(){{ - length = brange; - damage = 105f; - ammoMultiplier = 6f; - }}); + ammo( + Items.titanium, new ShrapnelBulletType(){{ + length = brange; + damage = 66f; + ammoMultiplier = 4f; + width = 17f; + reloadMultiplier = 1.3f; + }}, + Items.thorium, new ShrapnelBulletType(){{ + length = brange; + damage = 105f; + ammoMultiplier = 5f; + toColor = Pal.thoriumPink; + shootEffect = smokeEffect = Fx.thoriumShoot; + }} + ); }}; ripple = new ItemTurret("ripple"){{ requirements(Category.turret, with(Items.copper, 150, Items.graphite, 135, Items.titanium, 60)); ammo( - Items.graphite, Bullets.artilleryDense, - Items.silicon, Bullets.artilleryHoming, - Items.pyratite, Bullets.artilleryIncendiary, - Items.blastCompound, Bullets.artilleryExplosive, - Items.plastanium, Bullets.artilleryPlastic + Items.graphite, Bullets.artilleryDense, + Items.silicon, Bullets.artilleryHoming, + Items.pyratite, Bullets.artilleryIncendiary, + Items.blastCompound, Bullets.artilleryExplosive, + Items.plastanium, Bullets.artilleryPlastic ); targetAir = false; @@ -1657,7 +1727,7 @@ public class Blocks implements ContentList{ inaccuracy = 12f; reloadTime = 60f; ammoEjectBack = 5f; - ammoUseEffect = Fx.shellEjectBig; + ammoUseEffect = Fx.casing3Double; ammoPerShot = 2; cooldown = 0.03f; velocityInaccuracy = 0.2f; @@ -1674,10 +1744,10 @@ public class Blocks implements ContentList{ cyclone = new ItemTurret("cyclone"){{ requirements(Category.turret, with(Items.copper, 200, Items.titanium, 125, Items.plastanium, 80)); ammo( - Items.metaglass, Bullets.fragGlass, - Items.blastCompound, Bullets.fragExplosive, - Items.plastanium, Bullets.fragPlastic, - Items.surgealloy, Bullets.fragSurge + Items.metaglass, Bullets.fragGlass, + Items.blastCompound, Bullets.fragExplosive, + Items.plastanium, Bullets.fragPlastic, + Items.surgeAlloy, Bullets.fragSurge ); xRand = 4f; reloadTime = 8f; @@ -1690,32 +1760,34 @@ public class Blocks implements ContentList{ shootSound = Sounds.shootSnap; health = 145 * size * size; + limitRange(); }}; foreshadow = new ItemTurret("foreshadow"){{ float brange = range = 500f; - requirements(Category.turret, with(Items.copper, 1000, Items.metaglass, 600, Items.surgealloy, 300, Items.plastanium, 200, Items.silicon, 600)); + requirements(Category.turret, with(Items.copper, 1000, Items.metaglass, 600, Items.surgeAlloy, 300, Items.plastanium, 200, Items.silicon, 600)); ammo( - Items.surgealloy, new PointBulletType(){{ - shootEffect = Fx.instShoot; - hitEffect = Fx.instHit; - smokeEffect = Fx.smokeCloud; - trailEffect = Fx.instTrail; - despawnEffect = Fx.instBomb; - trailSpacing = 20f; - damage = 1350; - tileDamageMultiplier = 0.5f; - speed = brange; - hitShake = 6f; - ammoMultiplier = 1f; - }} + Items.surgeAlloy, new PointBulletType(){{ + shootEffect = Fx.instShoot; + hitEffect = Fx.instHit; + smokeEffect = Fx.smokeCloud; + trailEffect = Fx.instTrail; + despawnEffect = Fx.instBomb; + trailSpacing = 20f; + damage = 1350; + buildingDamageMultiplier = 0.25f; + speed = brange; + hitShake = 6f; + ammoMultiplier = 1f; + }} ); - rotateSpeed = 2.5f; + maxAmmo = 40; + ammoPerShot = 5; + rotateSpeed = 2f; reloadTime = 200f; - restitution = 0.2f; - ammoUseEffect = Fx.shellEjectBig; + ammoUseEffect = Fx.casing3Double; recoilAmount = 5f; restitution = 0.009f; cooldown = 0.009f; @@ -1723,29 +1795,29 @@ public class Blocks implements ContentList{ shots = 1; size = 4; shootCone = 2f; - shootSound = Sounds.shootBig; - unitSort = (u, x, y) -> -u.maxHealth; + shootSound = Sounds.railgun; + unitSort = (u, x, y) -> -u.maxHealth + Mathf.dst2(u.x, u.y, x, y) / 6400f; - coolantMultiplier = 0.09f; + coolantMultiplier = 0.4f; health = 150 * size * size; - consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 2f)).update(false).optional(true, true); + coolantUsage = 1f; - consumes.powerCond(10f, (TurretBuild entity) -> entity.target != null || (entity.logicControlled() && entity.logicShooting)); + consumes.powerCond(10f, TurretBuild::isActive); }}; spectre = new ItemTurret("spectre"){{ - requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); + requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgeAlloy, 250, Items.plastanium, 175, Items.thorium, 250)); ammo( - Items.graphite, Bullets.standardDenseBig, - Items.pyratite, Bullets.standardIncendiaryBig, - Items.thorium, Bullets.standardThoriumBig + Items.graphite, Bullets.standardDenseBig, + Items.pyratite, Bullets.standardIncendiaryBig, + Items.thorium, Bullets.standardThoriumBig ); - reloadTime = 6f; + reloadTime = 7f; coolantMultiplier = 0.5f; restitution = 0.1f; - ammoUseEffect = Fx.shellEjectBig; - range = 200f; + ammoUseEffect = Fx.casing3; + range = 260f; inaccuracy = 3f; recoilAmount = 3f; spread = 8f; @@ -1757,33 +1829,37 @@ public class Blocks implements ContentList{ shootSound = Sounds.shootBig; health = 160 * size * size; - consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 2f)).update(false).optional(true, true); + coolantUsage = 1f; + + limitRange(); }}; meltdown = new LaserTurret("meltdown"){{ - requirements(Category.turret, with(Items.copper, 1200, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325)); + requirements(Category.turret, with(Items.copper, 1200, Items.lead, 350, Items.graphite, 300, Items.surgeAlloy, 325, Items.silicon, 325)); shootEffect = Fx.shootBigSmoke2; shootCone = 40f; recoilAmount = 4f; size = 4; shootShake = 2f; - range = 190f; + range = 195f; reloadTime = 90f; firingMoveFract = 0.5f; shootDuration = 220f; powerUse = 17f; shootSound = Sounds.laserbig; - activeSound = Sounds.beam; - activeSoundVolume = 2f; + loopSound = Sounds.beam; + loopSoundVolume = 2f; shootType = new ContinuousLaserBulletType(70){{ length = 200f; hitEffect = Fx.hitMeltdown; + hitColor = Pal.meltdownHit; drawSize = 420f; incendChance = 0.4f; incendSpread = 5f; incendAmount = 1; + ammoMultiplier = 1f; }}; health = 200 * size * size; @@ -1801,30 +1877,31 @@ public class Blocks implements ContentList{ groundFactory = new UnitFactory("ground-factory"){{ requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 80)); - plans = new UnitPlan[]{ + plans = Seq.with( new UnitPlan(UnitTypes.dagger, 60f * 15, with(Items.silicon, 10, Items.lead, 10)), new UnitPlan(UnitTypes.crawler, 60f * 12, with(Items.silicon, 10, Items.coal, 20)), - new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20)), - }; + new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20)) + ); size = 3; consumes.power(1.2f); }}; airFactory = new UnitFactory("air-factory"){{ requirements(Category.units, with(Items.copper, 60, Items.lead, 70)); - plans = new UnitPlan[]{ + plans = Seq.with( new UnitPlan(UnitTypes.flare, 60f * 15, with(Items.silicon, 15)), - new UnitPlan(UnitTypes.mono, 60f * 35, with(Items.silicon, 30, Items.lead, 15)), - }; + new UnitPlan(UnitTypes.mono, 60f * 35, with(Items.silicon, 30, Items.lead, 15)) + ); size = 3; consumes.power(1.2f); }}; navalFactory = new UnitFactory("naval-factory"){{ requirements(Category.units, with(Items.copper, 150, Items.lead, 130, Items.metaglass, 120)); - plans = new UnitPlan[]{ + plans = Seq.with( new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)), - }; + new UnitPlan(UnitTypes.retusa, 60f * 60f, with(Items.silicon, 15, Items.metaglass, 25, Items.titanium, 20)) + ); size = 3; consumes.power(1.2f); floating = true; @@ -1839,14 +1916,15 @@ public class Blocks implements ContentList{ constructTime = 60f * 10f; - upgrades = new UnitType[][]{ - {UnitTypes.nova, UnitTypes.pulsar}, - {UnitTypes.dagger, UnitTypes.mace}, - {UnitTypes.crawler, UnitTypes.atrax}, - {UnitTypes.flare, UnitTypes.horizon}, - {UnitTypes.mono, UnitTypes.poly}, - {UnitTypes.risso, UnitTypes.minke}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.nova, UnitTypes.pulsar}, + new UnitType[]{UnitTypes.dagger, UnitTypes.mace}, + new UnitType[]{UnitTypes.crawler, UnitTypes.atrax}, + new UnitType[]{UnitTypes.flare, UnitTypes.horizon}, + new UnitType[]{UnitTypes.mono, UnitTypes.poly}, + new UnitType[]{UnitTypes.risso, UnitTypes.minke}, + new UnitType[]{UnitTypes.retusa, UnitTypes.oxynoe} + ); }}; multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{ @@ -1858,18 +1936,18 @@ public class Blocks implements ContentList{ constructTime = 60f * 30f; - upgrades = new UnitType[][]{ - {UnitTypes.horizon, UnitTypes.zenith}, - {UnitTypes.mace, UnitTypes.fortress}, - {UnitTypes.poly, UnitTypes.mega}, - {UnitTypes.minke, UnitTypes.bryde}, - {UnitTypes.pulsar, UnitTypes.quasar}, - {UnitTypes.atrax, UnitTypes.spiroct}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.horizon, UnitTypes.zenith}, + new UnitType[]{UnitTypes.mace, UnitTypes.fortress}, + new UnitType[]{UnitTypes.poly, UnitTypes.mega}, + new UnitType[]{UnitTypes.minke, UnitTypes.bryde}, + new UnitType[]{UnitTypes.pulsar, UnitTypes.quasar}, + new UnitType[]{UnitTypes.atrax, UnitTypes.spiroct} + ); }}; exponentialReconstructor = new Reconstructor("exponential-reconstructor"){{ - requirements(Category.units, with(Items.lead, 2000, Items.silicon, 1000, Items.titanium, 2000, Items.thorium, 750, Items.plastanium, 450, Items.phasefabric, 600)); + requirements(Category.units, with(Items.lead, 2000, Items.silicon, 1000, Items.titanium, 2000, Items.thorium, 750, Items.plastanium, 450, Items.phaseFabric, 600)); size = 7; consumes.power(13f); @@ -1879,42 +1957,58 @@ public class Blocks implements ContentList{ constructTime = 60f * 60f * 1.5f; liquidCapacity = 60f; - upgrades = new UnitType[][]{ - {UnitTypes.zenith, UnitTypes.antumbra}, - {UnitTypes.spiroct, UnitTypes.arkyid}, - {UnitTypes.fortress, UnitTypes.scepter}, - {UnitTypes.bryde, UnitTypes.sei}, - {UnitTypes.mega, UnitTypes.quad}, - {UnitTypes.quasar, UnitTypes.vela}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.zenith, UnitTypes.antumbra}, + new UnitType[]{UnitTypes.spiroct, UnitTypes.arkyid}, + new UnitType[]{UnitTypes.fortress, UnitTypes.scepter}, + new UnitType[]{UnitTypes.bryde, UnitTypes.sei}, + new UnitType[]{UnitTypes.mega, UnitTypes.quad}, + new UnitType[]{UnitTypes.quasar, UnitTypes.vela} + ); }}; tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{ - requirements(Category.units, with(Items.lead, 4000, Items.silicon, 3000, Items.thorium, 1000, Items.plastanium, 600, Items.phasefabric, 600, Items.surgealloy, 800)); + requirements(Category.units, with(Items.lead, 4000, Items.silicon, 3000, Items.thorium, 1000, Items.plastanium, 600, Items.phaseFabric, 600, Items.surgeAlloy, 800)); size = 9; consumes.power(25f); - consumes.items(with(Items.silicon, 1000, Items.plastanium, 600, Items.surgealloy, 500, Items.phasefabric, 350)); + consumes.items(with(Items.silicon, 1000, Items.plastanium, 600, Items.surgeAlloy, 500, Items.phaseFabric, 350)); consumes.liquid(Liquids.cryofluid, 3f); constructTime = 60f * 60f * 4; liquidCapacity = 180f; - upgrades = new UnitType[][]{ - {UnitTypes.antumbra, UnitTypes.eclipse}, - {UnitTypes.arkyid, UnitTypes.toxopid}, - {UnitTypes.scepter, UnitTypes.reign}, - {UnitTypes.sei, UnitTypes.omura}, - {UnitTypes.quad, UnitTypes.oct}, - {UnitTypes.vela, UnitTypes.corvus} - }; + upgrades.addAll( + new UnitType[]{UnitTypes.antumbra, UnitTypes.eclipse}, + new UnitType[]{UnitTypes.arkyid, UnitTypes.toxopid}, + new UnitType[]{UnitTypes.scepter, UnitTypes.reign}, + new UnitType[]{UnitTypes.sei, UnitTypes.omura}, + new UnitType[]{UnitTypes.quad, UnitTypes.oct}, + new UnitType[]{UnitTypes.vela, UnitTypes.corvus} + ); }}; repairPoint = new RepairPoint("repair-point"){{ - requirements(Category.units, with(Items.lead, 15, Items.copper, 15, Items.silicon, 15)); + requirements(Category.units, with(Items.lead, 20, Items.copper, 20, Items.silicon, 15)); repairSpeed = 0.5f; repairRadius = 65f; + beamWidth = 0.73f; powerUse = 1f; + pulseRadius = 5f; + }}; + + repairTurret = new RepairPoint("repair-turret"){{ + requirements(Category.units, with(Items.silicon, 70, Items.thorium, 60, Items.plastanium, 60)); + size = 2; + length = 6f; + repairSpeed = 5f; + repairRadius = 140f; + powerUse = 5f; + beamWidth = 1.1f; + pulseRadius = 6.1f; + coolantUse = 0.15f; + coolantMultiplier = 1.7f; + acceptCoolant = true; }}; resupplyPoint = new ResupplyPoint("resupply-point"){{ @@ -1928,11 +2022,34 @@ public class Blocks implements ContentList{ consumes.item(Items.copper, 1); }}; + //endregion + //region payloads + + payloadConveyor = new PayloadConveyor("payload-conveyor"){{ + requirements(Category.units, with(Items.graphite, 10, Items.copper, 20)); + canOverdrive = false; + }}; + + payloadRouter = new PayloadRouter("payload-router"){{ + requirements(Category.units, with(Items.graphite, 15, Items.copper, 20)); + canOverdrive = false; + }}; + + payloadPropulsionTower = new PayloadMassDriver("payload-propulsion-tower"){{ + requirements(Category.units, with(Items.thorium, 300, Items.silicon, 200, Items.plastanium, 200, Items.phaseFabric, 50)); + size = 5; + reloadTime = 150f; + chargeTime = 100f; + range = 300f; + consumes.power(10f); + }}; + //endregion //region sandbox powerSource = new PowerSource("power-source"){{ requirements(Category.power, BuildVisibility.sandboxOnly, with()); + powerProduction = 1000000f / 60f; alwaysUnlocked = true; }}; @@ -1961,11 +2078,22 @@ public class Blocks implements ContentList{ alwaysUnlocked = true; }}; + payloadVoid = new PayloadVoid("payload-void"){{ + requirements(Category.units, BuildVisibility.sandboxOnly, with()); + size = 5; + }}; + + payloadSource = new PayloadSource("payload-source"){{ + requirements(Category.units, BuildVisibility.sandboxOnly, with()); + size = 5; + }}; + + //TODO move illuminator = new LightBlock("illuminator"){{ requirements(Category.effect, BuildVisibility.lightingOnly, with(Items.graphite, 12, Items.silicon, 8)); - brightness = 0.67f; + brightness = 0.75f; radius = 140f; - consumes.power(0.06f); + consumes.power(0.05f); }}; //endregion @@ -1974,6 +2102,12 @@ public class Blocks implements ContentList{ //looked up by name, no ref needed new LegacyMechPad("legacy-mech-pad"); new LegacyUnitFactory("legacy-unit-factory"); + new LegacyUnitFactory("legacy-unit-factory-air"){{ + replacement = Blocks.airFactory; + }}; + new LegacyUnitFactory("legacy-unit-factory-ground"){{ + replacement = Blocks.groundFactory; + }}; //endregion //region campaign @@ -1987,14 +2121,14 @@ public class Blocks implements ContentList{ consumes.power(4f); }}; - //TODO remove - launchPadLarge = new LaunchPad("launch-pad-large"){{ - //requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75)); - size = 4; - itemCapacity = 300; - launchTime = 60f * 35; + interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 16000, Items.silicon, 11000, Items.thorium, 13000, Items.titanium, 12000, Items.surgeAlloy, 6000, Items.phaseFabric, 5000)); + researchCostMultiplier = 0.1f; + size = 7; hasPower = true; - consumes.power(6f); + consumes.power(10f); + buildCostMultiplier = 0.5f; + health = size * size * 80; }}; //endregion campaign @@ -2009,7 +2143,7 @@ public class Blocks implements ContentList{ }}; microProcessor = new LogicBlock("micro-processor"){{ - requirements(Category.logic, with(Items.copper, 80, Items.lead, 50, Items.silicon, 50)); + requirements(Category.logic, with(Items.copper, 90, Items.lead, 50, Items.silicon, 50)); instructionsPerTick = 2; @@ -2017,7 +2151,7 @@ public class Blocks implements ContentList{ }}; logicProcessor = new LogicBlock("logic-processor"){{ - requirements(Category.logic, with(Items.lead, 320, Items.silicon, 100, Items.graphite, 60, Items.thorium, 50)); + requirements(Category.logic, with(Items.lead, 320, Items.silicon, 80, Items.graphite, 60, Items.thorium, 50)); instructionsPerTick = 8; @@ -2027,7 +2161,7 @@ public class Blocks implements ContentList{ }}; hyperProcessor = new LogicBlock("hyper-processor"){{ - requirements(Category.logic, with(Items.lead, 450, Items.silicon, 150, Items.thorium, 75, Items.surgealloy, 50)); + requirements(Category.logic, with(Items.lead, 450, Items.silicon, 150, Items.thorium, 75, Items.surgeAlloy, 50)); consumes.liquid(Liquids.cryofluid, 0.08f); hasLiquids = true; @@ -2046,7 +2180,7 @@ public class Blocks implements ContentList{ }}; memoryBank = new MemoryBlock("memory-bank"){{ - requirements(Category.logic, with(Items.graphite, 80, Items.silicon, 80, Items.phasefabric, 30)); + requirements(Category.logic, with(Items.graphite, 80, Items.silicon, 80, Items.phaseFabric, 30)); memoryCapacity = 512; size = 2; @@ -2061,7 +2195,7 @@ public class Blocks implements ContentList{ }}; largeLogicDisplay = new LogicDisplay("large-logic-display"){{ - requirements(Category.logic, with(Items.lead, 200, Items.silicon, 150, Items.metaglass, 100, Items.phasefabric, 75)); + requirements(Category.logic, with(Items.lead, 200, Items.silicon, 150, Items.metaglass, 100, Items.phaseFabric, 75)); displaySize = 176; @@ -2072,21 +2206,21 @@ public class Blocks implements ContentList{ //region experimental blockForge = new BlockForge("block-forge"){{ - requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); + requirements(Category.units, BuildVisibility.debugOnly, with(Items.thorium, 100)); hasPower = true; consumes.power(2f); size = 3; }}; blockLoader = new BlockLoader("block-loader"){{ - requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); + requirements(Category.units, BuildVisibility.debugOnly, with(Items.thorium, 100)); hasPower = true; consumes.power(2f); size = 3; }}; blockUnloader = new BlockUnloader("block-unloader"){{ - requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); + requirements(Category.units, BuildVisibility.debugOnly, with(Items.thorium, 100)); hasPower = true; consumes.power(2f); size = 3; diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index 9b7e5f8805..e318d80f98 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -9,7 +9,6 @@ import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.io.*; import mindustry.world.*; import static mindustry.Vars.*; @@ -30,25 +29,39 @@ public class Bullets implements ContentList{ missileExplosive, missileIncendiary, missileSurge, //standard - standardCopper, standardDense, standardThorium, standardHoming, standardIncendiary, standardMechSmall, - standardGlaive, standardDenseBig, standardThoriumBig, standardIncendiaryBig, + standardCopper, standardDense, standardThorium, standardHoming, standardIncendiary, + standardDenseBig, standardThoriumBig, standardIncendiaryBig, //liquid waterShot, cryoShot, slagShot, oilShot, heavyWaterShot, heavyCryoShot, heavySlagShot, heavyOilShot, //environment, misc. - damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt, healBullet, healBulletBig, frag; + damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt; @Override public void load(){ + //lightning bullets need to be initialized first. + damageLightning = new BulletType(0.0001f, 0f){{ + lifetime = Fx.lightning.lifetime; + hitEffect = Fx.hitLancer; + despawnEffect = Fx.none; + status = StatusEffects.shocked; + statusDuration = 10f; + hittable = false; + }}; + + //this is just a copy of the damage lightning bullet that doesn't damage air units + damageLightningGround = damageLightning.copy(); + damageLightningGround.collidesAir = false; + artilleryDense = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 80f; width = height = 11f; collidesTiles = false; - splashDamageRadius = 25f; + splashDamageRadius = 25f * 0.75f; splashDamage = 33f; }}; @@ -69,7 +82,7 @@ public class Bullets implements ContentList{ lifetime = 80f; width = height = 13f; collidesTiles = false; - splashDamageRadius = 35f; + splashDamageRadius = 35f * 0.75f; splashDamage = 45f; fragBullet = artilleryPlasticFrag; fragBullets = 10; @@ -83,7 +96,7 @@ public class Bullets implements ContentList{ lifetime = 80f; width = height = 11f; collidesTiles = false; - splashDamageRadius = 25f; + splashDamageRadius = 25f * 0.75f; splashDamage = 33f; reloadMultiplier = 1.2f; ammoMultiplier = 3f; @@ -97,11 +110,12 @@ public class Bullets implements ContentList{ lifetime = 80f; width = height = 13f; collidesTiles = false; - splashDamageRadius = 25f; + splashDamageRadius = 25f * 0.75f; splashDamage = 35f; status = StatusEffects.burning; frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; + makeFire = true; trailEffect = Fx.incendTrail; }}; @@ -112,7 +126,7 @@ public class Bullets implements ContentList{ width = height = 14f; collidesTiles = false; ammoMultiplier = 4f; - splashDamageRadius = 45f; + splashDamageRadius = 45f * 0.75f; splashDamage = 50f; backColor = Pal.missileYellowBack; frontColor = Pal.missileYellow; @@ -139,7 +153,7 @@ public class Bullets implements ContentList{ width = 6f; height = 8f; hitEffect = Fx.flakExplosion; - splashDamage = 27f; + splashDamage = 27f * 1.5f; splashDamageRadius = 15f; }}; @@ -151,22 +165,22 @@ public class Bullets implements ContentList{ width = 6f; height = 8f; hitEffect = Fx.flakExplosion; - splashDamage = 22f; + splashDamage = 22f * 1.5f; splashDamageRadius = 24f; }}; flakGlass = new FlakBulletType(4f, 3){{ - lifetime = 70f; + lifetime = 60f; ammoMultiplier = 5f; shootEffect = Fx.shootSmall; reloadMultiplier = 0.8f; width = 6f; height = 8f; hitEffect = Fx.flakExplosion; - splashDamage = 22f; + splashDamage = 22f * 1.5f; splashDamageRadius = 20f; fragBullet = flakGlassFrag; - fragBullets = 5; + fragBullets = 6; }}; fragGlassFrag = new BasicBulletType(3f, 5, "bullet"){{ @@ -190,26 +204,25 @@ public class Bullets implements ContentList{ }}; fragGlass = new FlakBulletType(4f, 3){{ - lifetime = 70f; ammoMultiplier = 3f; shootEffect = Fx.shootSmall; reloadMultiplier = 0.8f; width = 6f; height = 8f; hitEffect = Fx.flakExplosion; - splashDamage = 18f; + splashDamage = 18f * 1.5f; splashDamageRadius = 16f; fragBullet = fragGlassFrag; - fragBullets = 3; + fragBullets = 4; explodeRange = 20f; collidesGround = true; }}; fragPlastic = new FlakBulletType(4f, 6){{ splashDamageRadius = 40f; - splashDamage = 25f; + splashDamage = 25f * 1.5f; fragBullet = fragPlasticFrag; - fragBullets = 5; + fragBullets = 6; hitEffect = Fx.plasticExplosion; frontColor = Pal.plastaniumFront; backColor = Pal.plastaniumBack; @@ -220,9 +233,9 @@ public class Bullets implements ContentList{ fragExplosive = new FlakBulletType(4f, 5){{ shootEffect = Fx.shootBig; - ammoMultiplier = 4f; - splashDamage = 18f; - splashDamageRadius = 55f; + ammoMultiplier = 5f; + splashDamage = 26f * 1.5f; + splashDamageRadius = 60f; collidesGround = true; status = StatusEffects.blasted; @@ -230,9 +243,9 @@ public class Bullets implements ContentList{ }}; fragSurge = new FlakBulletType(4.5f, 13){{ - ammoMultiplier = 4f; - splashDamage = 50f; - splashDamageRadius = 40f; + ammoMultiplier = 5f; + splashDamage = 50f * 1.5f; + splashDamageRadius = 38f; lightning = 2; lightningLength = 7; shootEffect = Fx.shootBig; @@ -246,8 +259,8 @@ public class Bullets implements ContentList{ shrinkY = 0f; drag = -0.01f; splashDamageRadius = 30f; - splashDamage = 30f; - ammoMultiplier = 4f; + splashDamage = 30f * 1.5f; + ammoMultiplier = 5f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; @@ -264,7 +277,9 @@ public class Bullets implements ContentList{ drag = -0.01f; homingPower = 0.08f; splashDamageRadius = 20f; - splashDamage = 20f; + splashDamage = 20f * 1.5f; + makeFire = true; + ammoMultiplier = 5f; hitEffect = Fx.blastExplosion; status = StatusEffects.burning; }}; @@ -275,9 +290,11 @@ public class Bullets implements ContentList{ shrinkY = 0f; drag = -0.01f; splashDamageRadius = 25f; - splashDamage = 25f; + splashDamage = 25f * 1.4f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; + ammoMultiplier = 4f; + lightningDamage = 10; lightning = 2; lightningLength = 10; }}; @@ -323,68 +340,40 @@ public class Bullets implements ContentList{ frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; status = StatusEffects.burning; + makeFire = true; inaccuracy = 3f; lifetime = 60f; }}; - standardGlaive = new BasicBulletType(4f, 7.5f, "bullet"){{ - width = 10f; - height = 12f; - frontColor = Color.valueOf("feb380"); - backColor = Color.valueOf("ea8878"); - status = StatusEffects.burning; - lifetime = 60f; - }}; - - standardMechSmall = new BasicBulletType(4f, 9, "bullet"){{ - width = 11f; - height = 14f; - lifetime = 40f; - inaccuracy = 5f; - despawnEffect = Fx.hitBulletSmall; - }}; - standardDenseBig = new BasicBulletType(7f, 55, "bullet"){{ + hitSize = 5; width = 15f; height = 21f; shootEffect = Fx.shootBig; }}; standardThoriumBig = new BasicBulletType(8f, 80, "bullet"){{ + hitSize = 5; width = 16f; height = 23f; shootEffect = Fx.shootBig; + pierceCap = 2; + pierceBuilding = true; + knockback = 0.7f; }}; standardIncendiaryBig = new BasicBulletType(7f, 60, "bullet"){{ + hitSize = 5; width = 16f; height = 21f; frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; status = StatusEffects.burning; shootEffect = Fx.shootBig; - }}; - - damageLightning = new BulletType(0.0001f, 0f){{ - lifetime = Fx.lightning.lifetime; - hitEffect = Fx.hitLancer; - despawnEffect = Fx.none; - status = StatusEffects.shocked; - statusDuration = 10f; - hittable = false; - }}; - - //this is just a copy of the damage lightning bullet that doesn't damage air units - damageLightningGround = new BulletType(0.0001f, 0f){}; - JsonIO.copy(damageLightning, damageLightningGround); - damageLightningGround.collidesAir = false; - - healBullet = new HealBulletType(5.2f, 13){{ - healPercent = 3f; - }}; - - healBulletBig = new HealBulletType(5.2f, 15){{ - healPercent = 5.5f; + makeFire = true; + pierceCap = 2; + pierceBuilding = true; + knockback = 0.7f; }}; fireball = new BulletType(1f, 4){ @@ -427,7 +416,7 @@ public class Bullets implements ContentList{ } }; - basicFlame = new BulletType(3.35f, 15f){{ + basicFlame = new BulletType(3.35f, 16f){{ ammoMultiplier = 3f; hitSize = 7f; lifetime = 18f; @@ -442,7 +431,7 @@ public class Bullets implements ContentList{ hittable = false; }}; - pyraFlame = new BulletType(3.35f, 22f){{ + pyraFlame = new BulletType(3.35f, 25f){{ ammoMultiplier = 4f; hitSize = 7f; lifetime = 18f; @@ -458,19 +447,20 @@ public class Bullets implements ContentList{ waterShot = new LiquidBulletType(Liquids.water){{ knockback = 0.7f; + drag = 0.01f; }}; cryoShot = new LiquidBulletType(Liquids.cryofluid){{ - + drag = 0.01f; }}; slagShot = new LiquidBulletType(Liquids.slag){{ damage = 4; - drag = 0.03f; + drag = 0.01f; }}; oilShot = new LiquidBulletType(Liquids.oil){{ - drag = 0.03f; + drag = 0.01f; }}; heavyWaterShot = new LiquidBulletType(Liquids.water){{ @@ -478,10 +468,11 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.7f; puddleSize = 8f; + orbSize = 4f; drag = 0.001f; - ammoMultiplier = 2f; + ammoMultiplier = 0.4f; statusDuration = 60f * 4f; - damage = 0.1f; + damage = 0.2f; }}; heavyCryoShot = new LiquidBulletType(Liquids.cryofluid){{ @@ -489,10 +480,11 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; + orbSize = 4f; drag = 0.001f; - ammoMultiplier = 2f; + ammoMultiplier = 0.4f; statusDuration = 60f * 4f; - damage = 0.1f; + damage = 0.2f; }}; heavySlagShot = new LiquidBulletType(Liquids.slag){{ @@ -500,9 +492,10 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; - damage = 6f; + orbSize = 4f; + damage = 4.75f; drag = 0.001f; - ammoMultiplier = 2f; + ammoMultiplier = 0.4f; statusDuration = 60f * 4f; }}; @@ -511,20 +504,13 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; + orbSize = 4f; drag = 0.001f; - ammoMultiplier = 2f; + ammoMultiplier = 0.4f; statusDuration = 60f * 4f; - damage = 0.1f; + damage = 0.2f; }}; driverBolt = new MassDriverBolt(); - - frag = new BasicBulletType(5f, 8, "bullet"){{ - width = 8f; - height = 9f; - shrinkY = 0.5f; - lifetime = 50f; - drag = 0.04f; - }}; } } diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 97d54ece50..f0bef945ce 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -12,32 +12,48 @@ import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; -import mindustry.ui.*; import static arc.graphics.g2d.Draw.rect; import static arc.graphics.g2d.Draw.*; import static arc.graphics.g2d.Lines.*; import static arc.math.Angles.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class Fx{ + private static final Rand rand = new Rand(); + private static final Vec2 v = new Vec2(); + public static final Effect none = new Effect(0, 0f, e -> {}), - unitSpawn = new Effect(30f, e -> { - if(!(e.data instanceof UnitType)) return; + trailFade = new Effect(400f, e -> { + if(!(e.data instanceof Trail trail)) return; + //lifetime is how many frames it takes to fade out the trail + e.lifetime = trail.length * 1.4f; - alpha(e.fin()); + trail.shorten(); + trail.drawCap(e.color, e.rotation); + trail.draw(e.color, e.rotation); + }), + + unitSpawn = new Effect(30f, e -> { + if(!(e.data instanceof UnitType unit)) return; float scl = 1f + e.fout() * 2f; - UnitType unit = e.data(); - TextureRegion region = unit.icon(Cicon.full); + TextureRegion region = unit.fullIcon; - rect(region, e.x, e.y, - region.width * Draw.scl * scl, region.height * Draw.scl * scl, 180f); + alpha(e.fout()); + mixcol(Color.white, e.fin()); + rect(region, e.x, e.y, 180f); + + reset(); + + alpha(e.fin()); + + rect(region, e.x, e.y, region.width * Draw.scl * scl, region.height * Draw.scl * scl, e.rotation - 90); }), unitCapKill = new Effect(80f, e -> { @@ -56,9 +72,9 @@ public class Fx{ mixcol(Pal.accent, 1f); alpha(e.fout()); - rect(block ? ((BlockUnitc)select).tile().block.icon(Cicon.full) : select.type().icon(Cicon.full), select.x, select.y, block ? 0f : select.rotation - 90f); + rect(block ? ((BlockUnitc)select).tile().block.fullIcon : select.type.fullIcon, select.x, select.y, block ? 0f : select.rotation - 90f); alpha(1f); - Lines.stroke(e.fslope() * 1f); + Lines.stroke(e.fslope()); Lines.square(select.x, select.y, e.fout() * select.hitSize * 2f, 45); Lines.stroke(e.fslope() * 2f); Lines.square(select.x, select.y, e.fout() * select.hitSize * 3f, 45f); @@ -66,7 +82,7 @@ public class Fx{ }), unitDespawn = new Effect(100f, e -> { - if(!(e.data instanceof Unit) || e.data().type() == null) return; + if(!(e.data instanceof Unit) || e.data().type == null) return; Unit select = e.data(); float scl = e.fout(Interp.pow2Out); @@ -74,7 +90,7 @@ public class Fx{ Draw.scl *= scl; mixcol(Pal.accent, 1f); - rect(select.type().icon(Cicon.full), select.x, select.y, select.rotation - 90f); + rect(select.type.fullIcon, select.x, select.y, select.rotation - 90f); reset(); Draw.scl = p; @@ -96,7 +112,7 @@ public class Fx{ x = Tmp.v1.x; y = Tmp.v1.y; - Fill.square(x, y, 1f * size, 45f); + Fill.square(x, y, size, 45f); }), itemTransfer = new Effect(12f, e -> { @@ -119,15 +135,15 @@ public class Fx{ Position pos = e.data(); - Draw.color(e.color); - Draw.alpha(e.fout()); + Draw.color(e.color, e.fout()); Lines.stroke(1.5f); Lines.line(e.x, e.y, pos.getX(), pos.getY()); + Drawf.light(null, e.x, e.y, pos.getX(), pos.getY(), 20f, e.color, 0.6f * e.fout()); }), pointHit = new Effect(8f, e -> { color(Color.white, e.color, e.fin()); - stroke(e.fout() * 1f + 0.2f); + stroke(e.fout() + 0.2f); Lines.circle(e.x, e.y, e.fin() * 6f); }), @@ -153,7 +169,7 @@ public class Fx{ commandSend = new Effect(28, e -> { color(Pal.command); stroke(e.fout() * 2f); - Lines.circle(e.x, e.y, 4f + e.finpow() * 120f); + Lines.circle(e.x, e.y, 4f + e.finpow() * e.rotation); }), upgradeCore = new Effect(120f, e -> { @@ -252,38 +268,46 @@ public class Fx{ Fill.circle(e.x + trnsx(ang, len), e.y + trnsy(ang, len), 2f * e.fout()); }), + breakProp = new Effect(23, e -> { + float scl = Math.max(e.rotation, 1); + color(Tmp.c1.set(e.color).mul(1.1f)); + randLenVectors(e.id, 6, 19f * e.finpow() * scl, (x, y) -> { + Fill.circle(e.x + x, e.y + y, e.fout() * 3.5f * scl + 0.3f); + }); + }).layer(Layer.debris), + unitDrop = new Effect(30, e -> { color(Pal.lightishGray); randLenVectors(e.id, 9, 3 + 20f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.4f); }); - }).ground(), + }).layer(Layer.debris), unitLand = new Effect(30, e -> { color(Tmp.c1.set(e.color).mul(1.1f)); randLenVectors(e.id, 6, 17f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.3f); }); - }).ground(), + }).layer(Layer.debris), unitLandSmall = new Effect(30, e -> { color(Tmp.c1.set(e.color).mul(1.1f)); randLenVectors(e.id, (int)(6 * e.rotation), 12f * e.finpow() * e.rotation, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.1f); }); - }).ground(), + }).layer(Layer.debris), unitPickup = new Effect(18, e -> { color(Pal.lightishGray); stroke(e.fin() * 2f); Lines.poly(e.x, e.y, 4, 13f * e.fout()); - }).ground(), + }).layer(Layer.debris), landShock = new Effect(12, e -> { color(Pal.lancerLaser); stroke(e.fout() * 3f); Lines.poly(e.x, e.y, 12, 20f * e.fout()); - }).ground(), + }).layer(Layer.debris), pickup = new Effect(18, e -> { color(Pal.lightishGray); @@ -294,7 +318,8 @@ public class Fx{ greenBomb = new Effect(40f, 100f, e -> { color(Pal.heal); stroke(e.fout() * 2f); - Lines.circle(e.x, e.y, 4f + e.finpow() * 65f); + float circleRad = 4f + e.finpow() * 65f; + Lines.circle(e.x, e.y, circleRad); color(Pal.heal); for(int i = 0; i < 4; i++){ @@ -305,6 +330,8 @@ public class Fx{ for(int i = 0; i < 4; i++){ Drawf.tri(e.x, e.y, 3f, 35f * e.fout(), i*90); } + + Drawf.light(e.x, e.y, circleRad * 1.6f, Pal.heal, e.fout()); }), greenLaserCharge = new Effect(80f, 100f, e -> { @@ -316,11 +343,13 @@ public class Fx{ randLenVectors(e.id, 20, 40f * e.fout(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fin() * 5f); + Drawf.light(e.x + x, e.y + y, e.fin() * 15f, Pal.heal, 0.7f); }); color(); Fill.circle(e.x, e.y, e.fin() * 10); + Drawf.light(e.x, e.y, e.fin() * 20f, Pal.heal, 0.7f); }), greenLaserChargeSmall = new Effect(40f, 100f, e -> { @@ -329,6 +358,13 @@ public class Fx{ Lines.circle(e.x, e.y, e.fout() * 50f); }), + greenCloud = new Effect(80f, e -> { + color(Pal.heal); + randLenVectors(e.id, e.fin(), 7, 9f, (x, y, fin, fout) -> { + Fill.circle(e.x + x, e.y + y, 5f * fout); + }); + }), + healWaveDynamic = new Effect(22, e -> { color(Pal.heal); stroke(e.fout() * 2f); @@ -347,14 +383,20 @@ public class Fx{ Lines.circle(e.x, e.y, 2f + e.finpow() * 7f); }), + healDenamic = new Effect(11, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 2f + e.finpow() * e.rotation); + }), + shieldWave = new Effect(22, e -> { - color(Pal.shield); + color(e.color, 0.7f); stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 60f); }), shieldApply = new Effect(11, e -> { - color(Pal.shield); + color(e.color, 0.7f); stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 2f + e.finpow() * 7f); }), @@ -373,6 +415,8 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); + + Drawf.light(e.x, e.y, 20f, Pal.lightOrange, 0.6f * e.fout()); }), hitFuse = new Effect(14, e -> { @@ -389,7 +433,6 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - }), hitBulletBig = new Effect(13, e -> { @@ -400,7 +443,6 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1.5f); }); - }), hitFlameSmall = new Effect(14, e -> { @@ -411,7 +453,16 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); + }), + hitFlamePlasma = new Effect(14, e -> { + color(Color.white, Pal.heal, e.fin()); + stroke(0.5f + e.fout()); + + randLenVectors(e.id, 2, e.fin() * 15f, e.rotation, 50f, (x, y) -> { + float ang = Mathf.angle(x, y); + lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); + }); }), hitLiquid = new Effect(16, e -> { @@ -420,40 +471,66 @@ public class Fx{ randLenVectors(e.id, 5, e.fin() * 15f, e.rotation, 60f, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 2f); }); + }), + + hitLaserBlast = new Effect(12, e -> { + color(e.color); + stroke(e.fout() * 1.5f); + randLenVectors(e.id, 8, e.finpow() * 17f, (x, y) -> { + float ang = Mathf.angle(x, y); + lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); + }); + }), + + hitEmpSpark = new Effect(40, e -> { + color(Pal.heal); + stroke(e.fout() * 1.6f); + + randLenVectors(e.id, 18, e.finpow() * 27f, e.rotation, 360f, (x, y) -> { + float ang = Mathf.angle(x, y); + lineAngle(e.x + x, e.y + y, ang, e.fout() * 6 + 1f); + }); }), hitLancer = new Effect(12, e -> { color(Color.white); stroke(e.fout() * 1.5f); - randLenVectors(e.id, 8, e.finpow() * 17f, e.rotation, 360f, (x, y) -> { + randLenVectors(e.id, 8, e.finpow() * 17f, (x, y) -> { float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); + }), + hitBeam = new Effect(12, e -> { + color(e.color); + stroke(e.fout() * 2f); + + randLenVectors(e.id, 6, e.finpow() * 18f, (x, y) -> { + float ang = Mathf.angle(x, y); + lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); + }); }), hitMeltdown = new Effect(12, e -> { color(Pal.meltdownHit); stroke(e.fout() * 2f); - randLenVectors(e.id, 6, e.finpow() * 18f, e.rotation, 360f, (x, y) -> { + randLenVectors(e.id, 6, e.finpow() * 18f, (x, y) -> { float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - }), hitMeltHeal = new Effect(12, e -> { color(Pal.heal); stroke(e.fout() * 2f); - randLenVectors(e.id, 6, e.finpow() * 18f, e.rotation, 360f, (x, y) -> { + randLenVectors(e.id, 6, e.finpow() * 18f, (x, y) -> { float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - }), instBomb = new Effect(15f, 100f, e -> { @@ -469,6 +546,8 @@ public class Fx{ for(int i = 0; i < 4; i++){ Drawf.tri(e.x, e.y, 3f, 30f * e.fout(), i*90 + 45); } + + Drawf.light(e.x, e.y, 150f, Pal.bulletYellowBack, 0.9f * e.fout()); }), instTrail = new Effect(30, e -> { @@ -482,6 +561,8 @@ public class Fx{ Drawf.tri(e.x, e.y, w, (30f + Mathf.randomSeedRange(e.id, 15f)) * m, rot); Drawf.tri(e.x, e.y, w, 10f * m, rot + 180f); } + + Drawf.light(e.x, e.y, 60f, Pal.bulletYellowBack, 0.6f * e.fout()); }), instShoot = new Effect(24f, e -> { @@ -497,6 +578,8 @@ public class Fx{ Drawf.tri(e.x, e.y, 13f * e.fout(), 85f, e.rotation + 90f * i); Drawf.tri(e.x, e.y, 13f * e.fout(), 50f, e.rotation + 20f * i); } + + Drawf.light(e.x, e.y, 180f, Pal.bulletYellowBack, 0.9f * e.fout()); }), instHit = new Effect(20f, 200f, e -> { @@ -533,6 +616,8 @@ public class Fx{ color(Color.white, Pal.heal, e.fin()); stroke(0.5f + e.fout()); Lines.circle(e.x, e.y, e.fin() * 5f); + + Drawf.light(e.x, e.y, 23f, Pal.heal, e.fout() * 0.7f); }), hitYellowLaser = new Effect(8, e -> { @@ -552,9 +637,15 @@ public class Fx{ }), - flakExplosion = new Effect(20, e -> { + airBubble = new Effect(100f, e -> { + randLenVectors(e.id, 1, e.fin() * 12f, (x, y) -> { + rect(renderer.bubbles[Math.min((int)(renderer.bubbles.length * Mathf.curveMargin(e.fin(), 0.11f, 0.06f)), renderer.bubbles.length - 1)], e.x + x, e.y + y); + }); + }).layer(Layer.flyingUnitLow + 1), + flakExplosion = new Effect(20, e -> { color(Pal.bulletYellow); + e.scaled(6, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 3f + i.fin() * 10f); @@ -567,17 +658,18 @@ public class Fx{ }); color(Pal.lighterOrange); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 4, 1f + 23f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); + Drawf.light(e.x, e.y, 50f, Pal.lighterOrange, 0.8f * e.fout()); }), plasticExplosion = new Effect(24, e -> { - color(Pal.plastaniumFront); + e.scaled(7, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 3f + i.fin() * 24f); @@ -590,17 +682,18 @@ public class Fx{ }); color(Pal.plastaniumBack); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 4, 1f + 25f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); + Drawf.light(e.x, e.y, 50f, Pal.plastaniumBack, 0.8f * e.fout()); }), plasticExplosionFlak = new Effect(28, e -> { - color(Pal.plastaniumFront); + e.scaled(7, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 3f + i.fin() * 34f); @@ -613,17 +706,16 @@ public class Fx{ }); color(Pal.plastaniumBack); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 4, 1f + 30f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - }), blastExplosion = new Effect(22, e -> { - color(Pal.missileYellow); + e.scaled(6, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 3f + i.fin() * 15f); @@ -636,17 +728,18 @@ public class Fx{ }); color(Pal.missileYellowBack); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 4, 1f + 23f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); + Drawf.light(e.x, e.y, 45f, Pal.missileYellowBack, 0.8f * e.fout()); }), sapExplosion = new Effect(25, e -> { - color(Pal.sapBullet); + e.scaled(6, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 3f + i.fin() * 80f); @@ -659,17 +752,18 @@ public class Fx{ }); color(Pal.sapBulletBack); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 8, 1f + 60f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); + Drawf.light(e.x, e.y, 90f, Pal.sapBulletBack, 0.8f * e.fout()); }), massiveExplosion = new Effect(30, e -> { - color(Pal.missileYellow); + e.scaled(7, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 4f + i.fin() * 30f); @@ -682,12 +776,13 @@ public class Fx{ }); color(Pal.missileYellowBack); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 6, 1f + 29f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 4f); }); + Drawf.light(e.x, e.y, 50f, Pal.missileYellowBack, 0.8f * e.fout()); }), artilleryTrail = new Effect(50, e -> { @@ -703,17 +798,30 @@ public class Fx{ missileTrail = new Effect(50, e -> { color(e.color); Fill.circle(e.x, e.y, e.rotation * e.fout()); - }), + }).layer(Layer.bullet - 0.001f), //below bullets absorb = new Effect(12, e -> { color(Pal.accent); stroke(2f * e.fout()); Lines.circle(e.x, e.y, 5f * e.fout()); }), + + forceShrink = new Effect(20, e -> { + color(e.color, e.fout()); + if(renderer.animateShields){ + Fill.poly(e.x, e.y, 6, e.rotation * e.fout()); + }else{ + stroke(1.5f); + Draw.alpha(0.09f); + Fill.poly(e.x, e.y, 6, e.rotation * e.fout()); + Draw.alpha(1f); + Lines.poly(e.x, e.y, 6, e.rotation * e.fout()); + } + }).layer(Layer.shields), flakExplosionBig = new Effect(30, e -> { - color(Pal.bulletYellowBack); + e.scaled(6, i -> { stroke(3f * i.fout()); Lines.circle(e.x, e.y, 3f + i.fin() * 25f); @@ -726,12 +834,13 @@ public class Fx{ }); color(Pal.bulletYellow); - stroke(1f * e.fout()); + stroke(e.fout()); randLenVectors(e.id + 1, 4, 1f + 23f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); + Drawf.light(e.x, e.y, 60f, Pal.bulletYellowBack, 0.7f * e.fout()); }), burning = new Effect(35f, e -> { @@ -740,7 +849,12 @@ public class Fx{ randLenVectors(e.id, 3, 2f + e.fin() * 7f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.1f + e.fout() * 1.4f); }); + }), + fireRemove = new Effect(70f, e -> { + if(Fire.regions[0] == null) return; + alpha(e.fout()); + rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y); }), fire = new Effect(50f, e -> { @@ -761,7 +875,6 @@ public class Fx{ randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f); }); - }), steam = new Effect(35f, e -> { @@ -770,7 +883,6 @@ public class Fx{ randLenVectors(e.id, 2, 2f + e.fin() * 7f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f); }); - }), fireballsmoke = new Effect(25f, e -> { @@ -779,7 +891,6 @@ public class Fx{ randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f); }); - }), ballfire = new Effect(25f, e -> { @@ -788,7 +899,6 @@ public class Fx{ randLenVectors(e.id, 2, 2f + e.fin() * 7f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f); }); - }), freezing = new Effect(40f, e -> { @@ -797,7 +907,6 @@ public class Fx{ randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 1.2f); }); - }), melting = new Effect(40f, e -> { @@ -806,21 +915,20 @@ public class Fx{ randLenVectors(e.id, 2, 1f + e.fin() * 3f, (x, y) -> { Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f); }); - }), wet = new Effect(80f, e -> { color(Liquids.water.color); alpha(Mathf.clamp(e.fin() * 2f)); - Fill.circle(e.x, e.y, e.fout() * 1f); + Fill.circle(e.x, e.y, e.fout()); }), - + muddy = new Effect(80f, e -> { color(Color.valueOf("432722")); alpha(Mathf.clamp(e.fin() * 2f)); - Fill.circle(e.x, e.y, e.fout() * 1f); + Fill.circle(e.x, e.y, e.fout()); }), sapped = new Effect(40f, e -> { @@ -829,7 +937,14 @@ public class Fx{ randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { Fill.square(e.x + x, e.y + y, e.fslope() * 1.1f, 45f); }); + }), + electrified = new Effect(40f, e -> { + color(Pal.heal); + + randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { + Fill.square(e.x + x, e.y + y, e.fslope() * 1.1f, 45f); + }); }), sporeSlowed = new Effect(40f, e -> { @@ -842,9 +957,8 @@ public class Fx{ color(Liquids.oil.color); randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { - Fill.circle(e.x + x, e.y + y, e.fout() * 1f); + Fill.circle(e.x + x, e.y + y, e.fout()); }); - }), overdriven = new Effect(20f, e -> { @@ -853,7 +967,6 @@ public class Fx{ randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f); }); - }), overclocked = new Effect(50f, e -> { @@ -866,7 +979,7 @@ public class Fx{ float length = 20f * e.finpow(); float size = 7f * e.fout(); - rect(((Item)e.data).icon(Cicon.medium), e.x + trnsx(e.rotation, length), e.y + trnsy(e.rotation, length), size, size); + rect(((Item)e.data).fullIcon, e.x + trnsx(e.rotation, length), e.y + trnsy(e.rotation, length), size, size); }), shockwave = new Effect(10f, 80f, e -> { @@ -909,7 +1022,7 @@ public class Fx{ randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f); - Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f); + Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout()); }); color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin()); @@ -920,26 +1033,82 @@ public class Fx{ }); }), - dynamicExplosion = new Effect(30, e -> { - float intensity = e.rotation; - - e.scaled(5 + intensity * 2, i -> { - stroke(3.1f * i.fout()); - Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity); - }); + dynamicExplosion = new Effect(30, 500f, b -> { + float intensity = b.rotation; + float baseLifetime = 26f + intensity * 15f; + b.lifetime = 43f + intensity * 35f; color(Color.gray); + //TODO awful borders with linear filtering here + alpha(0.9f); + for(int i = 0; i < 4; i++){ + rand.setSeed(b.id*2 + i); + float lenScl = rand.random(0.4f, 1f); + int fi = i; + b.scaled(b.lifetime * lenScl, e -> { + randLenVectors(e.id + fi - 1, e.fin(Interp.pow10Out), (int)(3f * intensity), 14f * intensity, (x, y, in, out) -> { + float fout = e.fout(Interp.pow5Out) * rand.random(0.5f, 1f); + Fill.circle(e.x + x, e.y + y, fout * ((2f + intensity) * 1.8f)); + }); + }); + } - randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f * intensity, (x, y, in, out) -> { - Fill.circle(e.x + x, e.y + y, out * (2f + intensity) * 3 + 0.5f); - Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3); + b.scaled(baseLifetime, e -> { + e.scaled(5 + intensity * 2.5f, i -> { + stroke((3.1f + intensity/5f) * i.fout()); + Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity); + Drawf.light(e.x, e.y, i.fin() * 14f * 2f * intensity, Color.white, 0.9f * e.fout()); + }); + + color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin()); + stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f)); + + Draw.z(Layer.effect + 0.001f); + randLenVectors(e.id + 1, e.finpow() + 0.001f, (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> { + lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f + intensity)); + Drawf.light(e.x + x, e.y + y, (out * 4 * (3f + intensity)) * 3.5f, Draw.getColor(), 0.8f); + }); }); + }), - color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin()); - stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f)); + reactorExplosion = new Effect(30, 500f, b -> { + float intensity = 6.8f; + float baseLifetime = 25f + intensity * 11f; + b.lifetime = 50f + intensity * 65f; - randLenVectors(e.id + 1, e.finpow(), (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> { - lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f + intensity)); + color(Pal.reactorPurple2); + alpha(0.7f); + for(int i = 0; i < 4; i++){ + rand.setSeed(b.id*2 + i); + float lenScl = rand.random(0.4f, 1f); + int fi = i; + b.scaled(b.lifetime * lenScl, e -> { + randLenVectors(e.id + fi - 1, e.fin(Interp.pow10Out), (int)(2.9f * intensity), 22f * intensity, (x, y, in, out) -> { + float fout = e.fout(Interp.pow5Out) * rand.random(0.5f, 1f); + float rad = fout * ((2f + intensity) * 2.35f); + + Fill.circle(e.x + x, e.y + y, rad); + Drawf.light(e.x + x, e.y + y, rad * 2.5f, Pal.reactorPurple, 0.5f); + }); + }); + } + + b.scaled(baseLifetime, e -> { + Draw.color(); + e.scaled(5 + intensity * 2f, i -> { + stroke((3.1f + intensity/5f) * i.fout()); + Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity); + Drawf.light(e.x, e.y, i.fin() * 14f * 2f * intensity, Color.white, 0.9f * e.fout()); + }); + + color(Pal.lighterOrange, Pal.reactorPurple, e.fin()); + stroke((2f * e.fout())); + + Draw.z(Layer.effect + 0.001f); + randLenVectors(e.id + 1, e.finpow() + 0.001f, (int)(8 * intensity), 28f * intensity, (x, y, in, out) -> { + lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (4f + intensity)); + Drawf.light(e.x + x, e.y + y, (out * 4 * (3f + intensity)) * 3.5f, Draw.getColor(), 0.8f); + }); }); }), @@ -953,7 +1122,7 @@ public class Fx{ randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f); - Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f); + Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout()); }); color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin()); @@ -962,7 +1131,6 @@ public class Fx{ randLenVectors(e.id + 1, 9, 1f + 23f * e.finpow(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - }), blockExplosionSmoke = new Effect(30, e -> { @@ -970,9 +1138,8 @@ public class Fx{ randLenVectors(e.id, 6, 4f + 30f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 3f); - Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f); + Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout()); }); - }), shootSmall = new Effect(8, e -> { @@ -1002,7 +1169,6 @@ public class Fx{ randLenVectors(e.id, 5, e.finpow() * 6f, e.rotation, 20f, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f); }); - }), shootBig = new Effect(9, e -> { @@ -1025,7 +1191,6 @@ public class Fx{ randLenVectors(e.id, 8, e.finpow() * 19f, e.rotation, 10f, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f); }); - }), shootBigSmoke2 = new Effect(18f, e -> { @@ -1034,7 +1199,19 @@ public class Fx{ randLenVectors(e.id, 9, e.finpow() * 23f, e.rotation, 20f, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f); }); + }), + shootPayloadDriver = new Effect(30f, e -> { + color(Pal.accent); + Lines.stroke(0.5f + 0.5f*e.fout()); + float spread = 9f; + + rand.setSeed(e.id); + for(int i = 0; i < 20; i++){ + float ang = e.rotation + rand.range(17f); + v.trns(ang, rand.random(e.fin() * 55f)); + Lines.lineAngle(e.x + v.x + rand.range(spread), e.y + v.y + rand.range(spread), ang, e.fout() * 5f * rand.random(1f) + 1f); + } }), shootSmallFlame = new Effect(32f, 80f, e -> { @@ -1043,7 +1220,6 @@ public class Fx{ randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f); }); - }), shootPyraFlame = new Effect(33f, 80f, e -> { @@ -1052,7 +1228,6 @@ public class Fx{ randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f); }); - }), shootLiquid = new Effect(40f, 80f, e -> { @@ -1061,69 +1236,104 @@ public class Fx{ randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f); }); - }), - shellEjectSmall = new Effect(30f, e -> { + casing1 = new Effect(30f, e -> { color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin()); + alpha(e.fout(0.3f)); float rot = Math.abs(e.rotation) + 90f; - - int i = Mathf.sign(e.rotation); + int i = -Mathf.sign(e.rotation); float len = (2f + e.finpow() * 6f) * i; float lr = rot + e.fin() * 30f * i; - Fill.rect(e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), - e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 1f, 2f, rot + e.fin() * 50f * i); + Fill.rect( + e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), + e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), + 1f, 2f, rot + e.fin() * 50f * i + ); - }).ground(400f), + }).layer(Layer.bullet), - shellEjectMedium = new Effect(34f, e -> { + casing2 = new Effect(34f, e -> { color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin()); - float rot = e.rotation + 90f; + alpha(e.fout(0.5f)); + float rot = Math.abs(e.rotation) + 90f; + int i = -Mathf.sign(e.rotation); + float len = (2f + e.finpow() * 10f) * i; + float lr = rot + e.fin() * 20f * i; + rect(Core.atlas.find("casing"), + e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), + e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), + 2f, 3f, rot + e.fin() * 50f * i + ); + }).layer(Layer.bullet), + + casing3 = new Effect(40f, e -> { + color(Pal.lightOrange, Pal.lightishGray, Pal.lightishGray, e.fin()); + alpha(e.fout(0.5f)); + float rot = Math.abs(e.rotation) + 90f; + int i = -Mathf.sign(e.rotation); + float len = (4f + e.finpow() * 9f) * i; + float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i; + + rect(Core.atlas.find("casing"), + e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), + e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), + 2.5f, 4f, + rot + e.fin() * 50f * i + ); + }).layer(Layer.bullet), + + casing4 = new Effect(45f, e -> { + color(Pal.lightOrange, Pal.lightishGray, Pal.lightishGray, e.fin()); + alpha(e.fout(0.5f)); + float rot = Math.abs(e.rotation) + 90f; + int i = -Mathf.sign(e.rotation); + float len = (4f + e.finpow() * 9f) * i; + float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i; + + rect(Core.atlas.find("casing"), + e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), + e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), + 3f, 6f, + rot + e.fin() * 50f * i + ); + }).layer(Layer.bullet), + + casing2Double = new Effect(34f, e -> { + color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin()); + alpha(e.fout(0.5f)); + float rot = Math.abs(e.rotation) + 90f; for(int i : Mathf.signs){ float len = (2f + e.finpow() * 10f) * i; float lr = rot + e.fin() * 20f * i; rect(Core.atlas.find("casing"), e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 2f, 3f, rot); + 2f, 3f, rot + e.fin() * 50f * i + ); } - color(Color.lightGray, Color.gray, e.fin()); + }).layer(Layer.bullet), + + casing3Double = new Effect(40f, e -> { + color(Pal.lightOrange, Pal.lightishGray, Pal.lightishGray, e.fin()); + alpha(e.fout(0.5f)); + float rot = Math.abs(e.rotation) + 90f; for(int i : Mathf.signs){ - float ex = e.x, ey = e.y, fout = e.fout(); - randLenVectors(e.id, 4, 1f + e.finpow() * 11f, e.rotation + 90f * i, 20f, (x, y) -> { - Fill.circle(ex + x, ey + y, fout * 1.5f); - }); - } - - }).ground(400f), - - shellEjectBig = new Effect(22f, e -> { - color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin()); - float rot = e.rotation + 90f; - for(int i : Mathf.signs){ - float len = (4f + e.finpow() * 8f) * i; + float len = (4f + e.finpow() * 9f) * i; float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i; + rect(Core.atlas.find("casing"), e.x + trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), 2.5f, 4f, - rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin())); + rot + e.fin() * 50f * i + ); } - color(Color.lightGray); - - for(int i : Mathf.signs){ - float ex = e.x, ey = e.y, fout = e.fout(); - randLenVectors(e.id, 4, -e.finpow() * 15f, e.rotation + 90f * i, 25f, (x, y) -> { - Fill.circle(ex + x, ey + y, fout * 2f); - }); - } - - }).ground(400f), + }).layer(Layer.bullet), railShoot = new Effect(24f, e -> { e.scaled(10f, b -> { @@ -1145,6 +1355,8 @@ public class Fx{ for(int i : Mathf.signs){ Drawf.tri(e.x, e.y, 10f * e.fout(), 24f, e.rotation + 90 + 90f * i); } + + Drawf.light(e.x, e.y, 60f * e.fout(), Pal.orangeSpark, 0.5f); }), railHit = new Effect(18f, 200f, e -> { @@ -1161,7 +1373,6 @@ public class Fx{ for(int i : Mathf.signs){ Drawf.tri(e.x, e.y, 4f * e.fout(), 29f, e.rotation + 90f * i); } - }), lancerLaserShootSmoke = new Effect(26f, e -> { @@ -1171,7 +1382,6 @@ public class Fx{ randLenVectors(e.id, 7, length, e.rotation, 0f, (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fout() * 9f); }); - }), lancerLaserCharge = new Effect(38f, e -> { @@ -1180,7 +1390,6 @@ public class Fx{ randLenVectors(e.id, 2, 1f + 20f * e.fout(), e.rotation, 120f, (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 3f + 1f); }); - }), lancerLaserChargeBegin = new Effect(60f, e -> { @@ -1197,7 +1406,6 @@ public class Fx{ randLenVectors(e.id, 2, 1f + 20f * e.fout(), e.rotation, 120f, (x, y) -> { Drawf.tri(e.x + x, e.y + y, e.fslope() * 3f + 1, e.fslope() * 3f + 1, Mathf.angle(x, y)); }); - }), sparkShoot = new Effect(12f, e -> { @@ -1207,7 +1415,6 @@ public class Fx{ randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 3f, (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 5f + 0.5f); }); - }), lightningShoot = new Effect(12f, e -> { @@ -1217,7 +1424,15 @@ public class Fx{ randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 50f, (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 5f + 2f); }); + }), + thoriumShoot = new Effect(12f, e -> { + color(Color.white, Pal.thoriumPink, e.fin()); + stroke(e.fout() * 1.2f + 0.5f); + + randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 50f, (x, y) -> { + lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 5f + 2f); + }); }), reactorsmoke = new Effect(17, e -> { @@ -1293,10 +1508,18 @@ public class Fx{ }); }), + coreBurn = new Effect(23, e -> { + randLenVectors(e.id, 5, e.fin() * 9f, (x, y) -> { + float len = e.fout() * 4f; + color(Pal.accent, Color.gray, e.fin()); + Fill.circle(e.x + x, e.y + y, len/2f); + }); + }), + plasticburn = new Effect(40, e -> { randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> { color(Color.valueOf("e9ead3"), Color.gray, e.fin()); - Fill.circle(e.x + x, e.y + y, e.fout() * 1f); + Fill.circle(e.x + x, e.y + y, e.fout()); }); }), @@ -1320,21 +1543,21 @@ public class Fx{ Fill.square(e.x + x, e.y + y, e.fout() * 2.5f + 0.5f, 45); }); }), - + pulverizeSmall = new Effect(30, e -> { randLenVectors(e.id, 3, e.fin() * 5f, (x, y) -> { color(Pal.stoneGray); - Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45); + Fill.square(e.x + x, e.y + y, e.fout() + 0.5f, 45); }); }), - + pulverizeMedium = new Effect(30, e -> { randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { color(Pal.stoneGray); - Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45); + Fill.square(e.x + x, e.y + y, e.fout() + 0.5f, 45); }); }), - + producesmoke = new Effect(12, e -> { randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> { color(Color.white, Pal.accent, e.fin()); @@ -1349,21 +1572,21 @@ public class Fx{ Fill.circle(e.x + x, e.y + y, 0.5f + fout * 4f); }); }), - + smeltsmoke = new Effect(15, e -> { randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> { color(Color.white, e.color, e.fin()); Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45); }); }), - + formsmoke = new Effect(40, e -> { randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> { color(Pal.plasticSmoke, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45); }); }), - + blastsmoke = new Effect(26, e -> { randLenVectors(e.id, 12, 1f + e.fin() * 23f, (x, y) -> { float size = 2f + e.fout() * 6f; @@ -1371,7 +1594,7 @@ public class Fx{ Fill.circle(e.x + x, e.y + y, size/2f); }); }), - + lava = new Effect(18, e -> { randLenVectors(e.id, 3, 1f + e.fin() * 10f, (x, y) -> { float size = e.fslope() * 4f; @@ -1379,69 +1602,93 @@ public class Fx{ Fill.circle(e.x + x, e.y + y, size/2f); }); }), - + dooropen = new Effect(10, e -> { stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize / 2f + e.fin() * 2f); }), - + doorclose = new Effect(10, e -> { stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize / 2f + e.fout() * 2f); }), + dooropenlarge = new Effect(10, e -> { stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize + e.fin() * 2f); }), + doorcloselarge = new Effect(10, e -> { stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize + e.fout() * 2f); }), + purify = new Effect(10, e -> { color(Color.royal, Color.gray, e.fin()); stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); }), + purifyoil = new Effect(10, e -> { color(Color.black, Color.gray, e.fin()); stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); }), + purifystone = new Effect(10, e -> { color(Color.orange, Color.gray, e.fin()); stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); }), + generate = new Effect(11, e -> { color(Color.orange, Color.yellow, e.fin()); stroke(1f); Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8); }), + + mineSmall = new Effect(30, e -> { + color(e.color, Color.lightGray, e.fin()); + randLenVectors(e.id, 3, e.fin() * 5f, (x, y) -> { + Fill.square(e.x + x, e.y + y, e.fout() + 0.5f, 45); + }); + }), + mine = new Effect(20, e -> { + color(e.color, Color.lightGray, e.fin()); randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> { - color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45); }); }), + mineBig = new Effect(30, e -> { + color(e.color, Color.lightGray, e.fin()); randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> { - color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45); }); }), mineHuge = new Effect(40, e -> { + color(e.color, Color.lightGray, e.fin()); randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> { - color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); }); }), + + payloadReceive = new Effect(30, e -> { + color(Color.white, Pal.accent, e.fin()); + randLenVectors(e.id, 12, 7f + e.fin() * 13f, (x, y) -> { + Fill.square(e.x + x, e.y + y, e.fout() * 2.1f + 0.5f, 45); + }); + }), + smelt = new Effect(20, e -> { + color(Color.white, e.color, e.fin()); randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> { - color(Color.white, e.color, e.fin()); Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45); }); }), + teleportActivate = new Effect(50, e -> { color(e.color); @@ -1455,8 +1702,8 @@ public class Fx{ randLenVectors(e.id, 30, 4f + 40f * e.fin(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f); }); - }), + teleport = new Effect(60, e -> { color(e.color); stroke(e.fin() * 2f); @@ -1465,8 +1712,8 @@ public class Fx{ randLenVectors(e.id, 20, 6f + 20f * e.fout(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f); }); - }), + teleportOut = new Effect(20, e -> { color(e.color); stroke(e.fout() * 2f); @@ -1475,7 +1722,6 @@ public class Fx{ randLenVectors(e.id, 20, 4f + 20f * e.fin(), (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 4f + 1f); }); - }), ripple = new Effect(30, e -> { @@ -1484,7 +1730,7 @@ public class Fx{ color(Tmp.c1.set(e.color).mul(1.5f)); stroke(e.fout() * 1.4f); Lines.circle(e.x, e.y, (2f + e.fin() * 4f) * e.rotation); - }).ground(), + }).layer(Layer.debris), bubble = new Effect(20, e -> { color(Tmp.c1.set(e.color).shiftValue(0.1f)); @@ -1524,7 +1770,7 @@ public class Fx{ overdriveWave = new Effect(50, e -> { color(e.color); - stroke(e.fout() * 1f); + stroke(e.fout()); Lines.circle(e.x, e.y, e.finpow() * e.rotation); }), @@ -1540,6 +1786,18 @@ public class Fx{ Fill.square(e.x, e.y, e.rotation * tilesize / 2f); }), + rotateBlock = new Effect(30, e -> { + color(Pal.accent); + alpha(e.fout() * 1); + Fill.square(e.x, e.y, e.rotation * tilesize / 2f); + }), + + lightBlock = new Effect(60, e -> { + color(e.color); + alpha(e.fout() * 1); + Fill.square(e.x, e.y, e.rotation * tilesize / 2f); + }), + overdriveBlockFull = new Effect(60, e -> { color(e.color); alpha(e.fslope() * 0.4f); @@ -1559,9 +1817,8 @@ public class Fx{ float radius = unit.hitSize() * 1.3f; - e.scaled(16f, c -> { - color(Pal.shield); + color(e.color, 0.9f); stroke(c.fout() * 2f + 0.1f); randLenVectors(e.id, (int)(radius * 1.2f), radius/2f + c.finpow() * radius*1.25f, (x, y) -> { @@ -1569,11 +1826,85 @@ public class Fx{ }); }); - color(Pal.shield, e.fout()); - stroke(1f * e.fout()); + color(e.color, e.fout() * 0.9f); + stroke(e.fout()); Lines.circle(e.x, e.y, radius); }), + chainLightning = new Effect(20f, 300f, e -> { + if(!(e.data instanceof Position p)) return; + float tx = p.getX(), ty = p.getY(), dst = Mathf.dst(e.x, e.y, tx, ty); + Tmp.v1.set(p).sub(e.x, e.y).nor(); + + float normx = Tmp.v1.x, normy = Tmp.v1.y; + float range = 6f; + int links = Mathf.ceil(dst / range); + float spacing = dst / links; + + Lines.stroke(2.5f * e.fout()); + Draw.color(Color.white, e.color, e.fin()); + + Lines.beginLine(); + + Lines.linePoint(e.x, e.y); + + rand.setSeed(e.id); + + for(int i = 0; i < links; i++){ + float nx, ny; + if(i == links - 1){ + nx = tx; + ny = ty; + }else{ + float len = (i + 1) * spacing; + Tmp.v1.setToRandomDirection(rand).scl(range/2f); + nx = e.x + normx * len + Tmp.v1.x; + ny = e.y + normy * len + Tmp.v1.y; + } + + Lines.linePoint(nx, ny); + } + + Lines.endLine(); + }).followParent(false), + + chainEmp = new Effect(30f, 300f, e -> { + if(!(e.data instanceof Position p)) return; + float tx = p.getX(), ty = p.getY(), dst = Mathf.dst(e.x, e.y, tx, ty); + Tmp.v1.set(p).sub(e.x, e.y).nor(); + + float normx = Tmp.v1.x, normy = Tmp.v1.y; + float range = 6f; + int links = Mathf.ceil(dst / range); + float spacing = dst / links; + + Lines.stroke(4f * e.fout()); + Draw.color(Color.white, e.color, e.fin()); + + Lines.beginLine(); + + Lines.linePoint(e.x, e.y); + + rand.setSeed(e.id); + + for(int i = 0; i < links; i++){ + float nx, ny; + if(i == links - 1){ + nx = tx; + ny = ty; + }else{ + float len = (i + 1) * spacing; + Tmp.v1.setToRandomDirection(rand).scl(range/2f); + nx = e.x + normx * len + Tmp.v1.x; + ny = e.y + normy * len + Tmp.v1.y; + } + + Lines.linePoint(nx, ny); + } + + Lines.endLine(); + }).followParent(false), + coreLand = new Effect(120f, e -> { }); } diff --git a/core/src/mindustry/content/Items.java b/core/src/mindustry/content/Items.java index e16784a61b..360a965c45 100644 --- a/core/src/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -5,8 +5,9 @@ import mindustry.ctype.*; import mindustry.type.*; public class Items implements ContentList{ - public static Item scrap, copper, lead, graphite, coal, titanium, thorium, silicon, plastanium, phasefabric, surgealloy, - sporePod, sand, blastCompound, pyratite, metaglass; + public static Item + scrap, copper, lead, graphite, coal, titanium, thorium, silicon, plastanium, + phaseFabric, surgeAlloy, sporePod, sand, blastCompound, pyratite, metaglass; @Override public void load(){ @@ -32,6 +33,7 @@ public class Items implements ContentList{ sand = new Item("sand", Color.valueOf("f7cba4")){{ alwaysUnlocked = true; + lowPriority = true; }}; coal = new Item("coal", Color.valueOf("272727")){{ @@ -66,12 +68,14 @@ public class Items implements ContentList{ cost = 1.3f; }}; - phasefabric = new Item("phase-fabric", Color.valueOf("f4ba6e")){{ + phaseFabric = new Item("phase-fabric", Color.valueOf("f4ba6e")){{ cost = 1.3f; radioactivity = 0.6f; }}; - surgealloy = new Item("surge-alloy", Color.valueOf("f3e979")){{ + surgeAlloy = new Item("surge-alloy", Color.valueOf("f3e979")){{ + cost = 1.2f; + charge = 0.75f; }}; sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{ diff --git a/core/src/mindustry/content/Liquids.java b/core/src/mindustry/content/Liquids.java index aaced53394..664a9362ba 100644 --- a/core/src/mindustry/content/Liquids.java +++ b/core/src/mindustry/content/Liquids.java @@ -1,8 +1,8 @@ package mindustry.content; -import arc.graphics.Color; -import mindustry.ctype.ContentList; -import mindustry.type.Liquid; +import arc.graphics.*; +import mindustry.ctype.*; +import mindustry.type.*; public class Liquids implements ContentList{ public static Liquid water, slag, oil, cryofluid; @@ -12,19 +12,19 @@ public class Liquids implements ContentList{ water = new Liquid("water", Color.valueOf("596ab8")){{ heatCapacity = 0.4f; - effect = StatusEffects.wet; alwaysUnlocked = true; + effect = StatusEffects.wet; }}; slag = new Liquid("slag", Color.valueOf("ffa166")){{ temperature = 1f; - viscosity = 0.8f; + viscosity = 0.7f; effect = StatusEffects.melting; lightColor = Color.valueOf("f0511d").a(0.4f); }}; oil = new Liquid("oil", Color.valueOf("313131")){{ - viscosity = 0.7f; + viscosity = 0.75f; flammability = 1.2f; explosiveness = 1.2f; heatCapacity = 0.7f; diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index 873ba1c054..7134a6ef28 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -15,8 +15,7 @@ public class Planets implements ContentList{ public void load(){ sun = new Planet("sun", null, 0, 2){{ bloom = true; - - //lightColor = Color.valueOf("f4ee8e"); + accessible = false; meshLoader = () -> new SunMesh( this, 4, @@ -35,7 +34,10 @@ public class Planets implements ContentList{ generator = new SerpuloPlanetGenerator(); meshLoader = () -> new HexMesh(this, 6); atmosphereColor = Color.valueOf("3c1b8f"); + atmosphereRadIn = 0.02f; + atmosphereRadOut = 0.3f; startSector = 15; + alwaysUnlocked = true; }}; } } diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 3b76795c1d..e66908e247 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -8,57 +8,96 @@ import static mindustry.content.Planets.*; public class SectorPresets implements ContentList{ public static SectorPreset groundZero, - craters, frozenForest, ruinousShores, stainedMountains, tarFields, fungalPass, - saltFlats, overgrowth, - desolateRift, nuclearComplex; + craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields, + fungalPass, extractionOutpost, saltFlats, overgrowth, + impact0078, desolateRift, nuclearComplex, planetaryTerminal; @Override public void load(){ + //region serpulo groundZero = new SectorPreset("groundZero", serpulo, 15){{ alwaysUnlocked = true; + addStartingItems = true; captureWave = 10; + difficulty = 1; + startWaveTimeMultiplier = 3f; }}; saltFlats = new SectorPreset("saltFlats", serpulo, 101){{ - + difficulty = 5; + useAI = false; }}; frozenForest = new SectorPreset("frozenForest", serpulo, 86){{ - captureWave = 40; + captureWave = 15; + difficulty = 2; + }}; + + biomassFacility = new SectorPreset("biomassFacility", serpulo, 81){{ + captureWave = 20; + difficulty = 3; }}; craters = new SectorPreset("craters", serpulo, 18){{ - captureWave = 40; + captureWave = 20; + difficulty = 2; }}; - ruinousShores = new SectorPreset("ruinousShores", serpulo, 19){{ - captureWave = 40; + ruinousShores = new SectorPreset("ruinousShores", serpulo, 213){{ + captureWave = 30; + difficulty = 3; + }}; + + windsweptIslands = new SectorPreset("windsweptIslands", serpulo, 246){{ + captureWave = 30; + difficulty = 4; }}; stainedMountains = new SectorPreset("stainedMountains", serpulo, 20){{ captureWave = 30; + difficulty = 3; + }}; + + extractionOutpost = new SectorPreset("extractionOutpost", serpulo, 165){{ + difficulty = 5; + useAI = false; }}; fungalPass = new SectorPreset("fungalPass", serpulo, 21){{ - + difficulty = 4; + useAI = false; }}; - overgrowth = new SectorPreset("overgrowth", serpulo, 22){{ - + overgrowth = new SectorPreset("overgrowth", serpulo, 134){{ + difficulty = 5; + useAI = false; }}; tarFields = new SectorPreset("tarFields", serpulo, 23){{ captureWave = 40; + difficulty = 5; + }}; + + impact0078 = new SectorPreset("impact0078", serpulo, 227){{ + captureWave = 45; + difficulty = 7; }}; desolateRift = new SectorPreset("desolateRift", serpulo, 123){{ - captureWave = 40; + captureWave = 18; + difficulty = 8; }}; - nuclearComplex = new SectorPreset("nuclearComplex", serpulo, 130){{ - captureWave = 60; + captureWave = 50; + difficulty = 7; }}; + + planetaryTerminal = new SectorPreset("planetaryTerminal", serpulo, 93){{ + difficulty = 10; + }}; + + //endregion } } diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 7dc957a344..2ea8af6c9d 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -2,14 +2,17 @@ package mindustry.content; import arc.*; import arc.graphics.*; -import arc.math.Mathf; -import mindustry.ctype.ContentList; +import arc.math.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; -import mindustry.type.StatusEffect; +import mindustry.type.*; +import mindustry.graphics.*; + + import static mindustry.Vars.*; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; + public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed, disarmed, electrified; @Override public void load(){ @@ -17,39 +20,45 @@ public class StatusEffects implements ContentList{ none = new StatusEffect("none"); burning = new StatusEffect("burning"){{ - damage = 0.12f; //over 8 seconds, this would be 60 damage + color = Color.valueOf("ffc455"); + damage = 0.12f; //over 8 seconds, this would be ~60 damage effect = Fx.burning; + transitionDamage = 8f; init(() -> { - opposite(wet,freezing); - trans(tarred, ((unit, time, newTime, result) -> { - unit.damagePierce(8f); - Fx.burning.at(unit.x() + Mathf.range(unit.bounds() / 2f), unit.y() + Mathf.range(unit.bounds() / 2f)); - result.set(this, Math.min(time + newTime, 300f)); + opposite(wet, freezing); + affinity(tarred, ((unit, result, time) -> { + unit.damagePierce(transitionDamage); + Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); + result.set(burning, Math.min(time + result.time, 300f)); })); }); }}; freezing = new StatusEffect("freezing"){{ + color = Color.valueOf("6ecdec"); speedMultiplier = 0.6f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; effect = Fx.freezing; + transitionDamage = 18f; init(() -> { opposite(melting, burning); - trans(blasted, ((unit, time, newTime, result) -> { - unit.damagePierce(18f); - result.set(this, time); + affinity(blasted, ((unit, result, time) -> { + unit.damagePierce(transitionDamage); + result.set(freezing, time); })); }); }}; unmoving = new StatusEffect("unmoving"){{ + color = Pal.gray; speedMultiplier = 0.001f; }}; slow = new StatusEffect("slow"){{ + color = Pal.lightishGray; speedMultiplier = 0.4f; }}; @@ -58,16 +67,17 @@ public class StatusEffects implements ContentList{ speedMultiplier = 0.94f; effect = Fx.wet; effectChance = 0.09f; + transitionDamage = 14; init(() -> { - trans(shocked, ((unit, time, newTime, result) -> { - unit.damagePierce(14f); - if(unit.team() == state.rules.waveTeam){ + affinity(shocked, ((unit, result, time) -> { + unit.damagePierce(transitionDamage); + if(unit.team == state.rules.waveTeam){ Events.fire(Trigger.shock); } - result.set(this, time); + result.set(wet, time); })); - opposite(burning); + opposite(burning, melting); }); }}; @@ -76,45 +86,63 @@ public class StatusEffects implements ContentList{ speedMultiplier = 0.94f; effect = Fx.muddy; effectChance = 0.09f; + show = false; }}; melting = new StatusEffect("melting"){{ + color = Color.valueOf("ffa166"); speedMultiplier = 0.8f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; damage = 0.3f; effect = Fx.melting; init(() -> { - trans(tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f)))); opposite(wet, freezing); + affinity(tarred, ((unit, result, time) -> { + unit.damagePierce(8f); + Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); + result.set(melting, Math.min(time + result.time, 200f)); + })); }); }}; sapped = new StatusEffect("sapped"){{ + color = Pal.sap; speedMultiplier = 0.7f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; effect = Fx.sapped; effectChance = 0.1f; }}; + electrified = new StatusEffect("electrified"){{ + color = Pal.heal; + speedMultiplier = 0.7f; + reloadMultiplier = 0.6f; + effect = Fx.electrified; + effectChance = 0.1f; + }}; + sporeSlowed = new StatusEffect("spore-slowed"){{ + color = Pal.spore; speedMultiplier = 0.8f; effect = Fx.sapped; effectChance = 0.04f; }}; tarred = new StatusEffect("tarred"){{ + color = Color.valueOf("313131"); speedMultiplier = 0.6f; effect = Fx.oily; init(() -> { - trans(melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); - trans(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + affinity(melting, ((unit, result, time) -> result.set(melting, result.time + time))); + affinity(burning, ((unit, result, time) -> result.set(burning, result.time + time))); }); }}; overdrive = new StatusEffect("overdrive"){{ - armorMultiplier = 0.95f; + color = Pal.accent; + healthMultiplier = 0.95f; speedMultiplier = 1.15f; damageMultiplier = 1.4f; damage = -0.01f; @@ -123,6 +151,7 @@ public class StatusEffects implements ContentList{ }}; overclock = new StatusEffect("overclock"){{ + color = Pal.accent; speedMultiplier = 1.15f; damageMultiplier = 1.15f; reloadMultiplier = 1.25f; @@ -131,21 +160,35 @@ public class StatusEffects implements ContentList{ }}; shielded = new StatusEffect("shielded"){{ - armorMultiplier = 3f; + color = Pal.accent; + healthMultiplier = 3f; }}; boss = new StatusEffect("boss"){{ + color = Pal.health; permanent = true; - damageMultiplier = 1.5f; - armorMultiplier = 1.5f; + damageMultiplier = 1.3f; + healthMultiplier = 1.5f; }}; - shocked = new StatusEffect("shocked"); + shocked = new StatusEffect("shocked"){{ + color = Pal.lancerLaser; + reactive = true; + }}; - blasted = new StatusEffect("blasted"); + blasted = new StatusEffect("blasted"){{ + color = Color.valueOf("ff795e"); + reactive = true; + }}; corroded = new StatusEffect("corroded"){{ + color = Pal.plastanium; damage = 0.1f; }}; + + disarmed = new StatusEffect("disarmed"){{ + color = Color.valueOf("e9ead3"); + disarm = true; + }}; } } diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index 0d7a66eec9..d642808c22 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -2,7 +2,7 @@ package mindustry.content; import arc.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.ctype.*; import mindustry.game.Objectives.*; import mindustry.type.*; @@ -11,10 +11,10 @@ import static mindustry.content.Blocks.*; import static mindustry.content.SectorPresets.craters; import static mindustry.content.SectorPresets.*; import static mindustry.content.UnitTypes.*; -import static mindustry.type.ItemStack.*; public class TechTree implements ContentList{ static ObjectMap map = new ObjectMap<>(); + static TechNode context = null; public static Seq all; public static TechNode root; @@ -29,7 +29,10 @@ public class TechTree implements ContentList{ node(junction, () -> { node(router, () -> { - node(launchPad, () -> { + node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { + node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { + + }); }); node(distributor); @@ -39,15 +42,15 @@ public class TechTree implements ContentList{ node(underflowGate); }); }); - node(container, () -> { + node(container, Seq.with(new SectorComplete(biomassFacility)), () -> { node(unloader); - node(vault, () -> { + node(vault, Seq.with(new SectorComplete(stainedMountains)), () -> { }); }); node(itemBridge, () -> { - node(titaniumConveyor, () -> { + node(titaniumConveyor, Seq.with(new SectorComplete(craters)), () -> { node(phaseConveyor, () -> { node(massDriver, () -> { @@ -87,7 +90,7 @@ public class TechTree implements ContentList{ node(bridgeConduit); - node(pulseConduit, () -> { + node(pulseConduit, Seq.with(new SectorComplete(windsweptIslands)), () -> { node(phaseConduit, () -> { }); @@ -95,11 +98,11 @@ public class TechTree implements ContentList{ node(platedConduit, () -> { }); - }); - node(rotaryPump, () -> { - node(thermalPump, () -> { + node(rotaryPump, () -> { + node(thermalPump, () -> { + }); }); }); }); @@ -107,186 +110,155 @@ public class TechTree implements ContentList{ }); }); - node(Items.coal, with(Items.lead, 3000), () -> { - node(Items.graphite, with(Items.coal, 1000), () -> { - node(illuminator, () -> { + node(graphitePress, () -> { + node(pneumaticDrill, Seq.with(new SectorComplete(frozenForest)), () -> { + node(cultivator, Seq.with(new SectorComplete(biomassFacility)), () -> { + }); - node(graphitePress, () -> { - node(Items.titanium, with(Items.graphite, 6000, Items.copper, 10000, Items.lead, 10000), () -> { - node(pneumaticDrill, () -> { - node(Items.sporePod, with(Items.coal, 5000, Items.graphite, 5000, Items.lead, 5000), () -> { - node(cultivator, () -> { + node(laserDrill, () -> { + node(blastDrill, Seq.with(new SectorComplete(nuclearComplex)), () -> { - }); - }); - - node(Items.thorium, with(Items.titanium, 10000, Items.lead, 15000, Items.copper, 30000), () -> { - node(laserDrill, () -> { - node(blastDrill, () -> { - - }); - - node(waterExtractor, () -> { - node(oilExtractor, () -> { - - }); - }); - }); - }); - }); }); - node(Items.pyratite, with(Items.coal, 6000, Items.lead, 10000, Items.sand, 5000), () -> { - node(pyratiteMixer, () -> { - node(Items.blastCompound, with(Items.pyratite, 3000, Items.sporePod, 3000), () -> { - node(blastMixer, () -> { + node(waterExtractor, Seq.with(new SectorComplete(saltFlats)), () -> { + node(oilExtractor, () -> { - }); - }); - }); - }); - - node(Items.silicon, with(Items.coal, 4000, Items.sand, 4000), () -> { - node(siliconSmelter, () -> { - - node(Liquids.oil, with(Items.coal, 8000, Items.pyratite, 6000, Items.sand, 20000), () -> { - node(sporePress, () -> { - node(coalCentrifuge, () -> { - node(multiPress, () -> { - node(siliconCrucible, () -> { - - }); - }); - }); - - node(Items.plastanium, with(Items.titanium, 10000, Items.silicon, 10000), () -> { - node(plastaniumCompressor, () -> { - node(Items.phasefabric, with(Items.thorium, 15000, Items.sand, 30000, Items.silicon, 5000), () -> { - node(phaseWeaver, () -> { - - }); - }); - }); - }); - }); - }); - - node(Items.metaglass, with(Items.sand, 6000, Items.lead, 10000), () -> { - node(kiln, () -> { - node(incinerator, () -> { - node(Items.scrap, with(Items.copper, 20000, Items.sand, 10000), () -> { - node(Liquids.slag, with(Items.scrap, 4000), () -> { - node(melter, () -> { - node(Items.surgealloy, with(Items.thorium, 20000, Items.silicon, 30000, Items.lead, 40000), () -> { - node(surgeSmelter, () -> { - - }); - }); - - node(separator, () -> { - node(pulverizer, () -> { - node(disassembler, () -> { - - }); - }); - }); - - node(Liquids.cryofluid, with(Items.titanium, 8000, Items.metaglass, 5000), () -> { - node(cryofluidMixer, () -> { - - }); - }); - }); - }); - }); - }); - }); - }); - - node(microProcessor, () -> { - node(switchBlock, () -> { - node(message, () -> { - node(logicDisplay, () -> { - node(largeLogicDisplay, () -> { - - }); - }); - - node(memoryCell, () -> { - node(memoryBank, () -> { - - }); - }); - }); - - node(logicProcessor, () -> { - node(hyperProcessor, () -> { - - }); - }); - }); - }); }); }); }); }); + node(pyratiteMixer, () -> { + node(blastMixer, () -> { - node(combustionGenerator, () -> { - node(powerNode, () -> { - node(powerNodeLarge, () -> { - node(diode, () -> { - node(surgeTower, () -> { + }); + }); + + node(siliconSmelter, () -> { + + node(sporePress, () -> { + node(coalCentrifuge, () -> { + node(multiPress, () -> { + node(siliconCrucible, () -> { }); }); }); - node(battery, () -> { - node(batteryLarge, () -> { + node(plastaniumCompressor, Seq.with(new SectorComplete(windsweptIslands)), () -> { + node(phaseWeaver, Seq.with(new SectorComplete(tarFields)), () -> { }); }); + }); - node(mender, () -> { - node(mendProjector, () -> { - node(forceProjector, () -> { - node(overdriveProjector, () -> { - node(overdriveDome, () -> { + node(kiln, Seq.with(new SectorComplete(craters)), () -> { + node(pulverizer, () -> { + node(incinerator, () -> { + node(melter, () -> { + node(surgeSmelter, () -> { + + }); + + node(separator, () -> { + node(disassembler, () -> { }); }); - }); - node(repairPoint, () -> { + node(cryofluidMixer, () -> { - }); - }); - }); - - node(steamGenerator, () -> { - node(thermalGenerator, () -> { - node(differentialGenerator, () -> { - node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { - node(impactReactor, () -> { - - }); - - node(rtgGenerator, () -> { - - }); }); }); }); }); + }); - node(solarPanel, () -> { - node(largeSolarPanel, () -> { + node(microProcessor, () -> { + node(switchBlock, () -> { + node(message, () -> { + node(logicDisplay, () -> { + node(largeLogicDisplay, () -> { + + }); + }); + + node(memoryCell, () -> { + node(memoryBank, () -> { + + }); + }); + }); + + node(logicProcessor, () -> { + node(hyperProcessor, () -> { + + }); + }); + }); + }); + + node(illuminator, () -> { + + }); + }); + }); + + + node(combustionGenerator, Seq.with(new Research(Items.coal)), () -> { + node(powerNode, () -> { + node(powerNodeLarge, () -> { + node(diode, () -> { + node(surgeTower, () -> { }); }); }); + + node(battery, () -> { + node(batteryLarge, () -> { + + }); + }); + + node(mender, () -> { + node(mendProjector, () -> { + node(forceProjector, Seq.with(new SectorComplete(impact0078)), () -> { + node(overdriveProjector, Seq.with(new SectorComplete(impact0078)), () -> { + node(overdriveDome, Seq.with(new SectorComplete(impact0078)), () -> { + + }); + }); + }); + + node(repairPoint, () -> { + + }); + }); + }); + + node(steamGenerator, Seq.with(new SectorComplete(craters)), () -> { + node(thermalGenerator, () -> { + node(differentialGenerator, () -> { + node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { + node(impactReactor, () -> { + + }); + + node(rtgGenerator, () -> { + + }); + }); + }); + }); + }); + + node(solarPanel, () -> { + node(largeSolarPanel, () -> { + + }); + }); }); }); }); @@ -319,12 +291,11 @@ public class TechTree implements ContentList{ }); node(scatter, () -> { - node(hail, () -> { - + node(hail, Seq.with(new SectorComplete(craters)), () -> { node(salvo, () -> { node(swarmer, () -> { node(cyclone, () -> { - node(spectre, () -> { + node(spectre, Seq.with(new SectorComplete(nuclearComplex)), () -> { }); }); @@ -354,8 +325,8 @@ public class TechTree implements ContentList{ }); node(lancer, () -> { - node(foreshadow, () -> { - node(meltdown, () -> { + node(meltdown, () -> { + node(foreshadow, () -> { }); }); @@ -434,7 +405,7 @@ public class TechTree implements ContentList{ }); }); - node(navalFactory, () -> { + node(navalFactory, Seq.with(new SectorComplete(ruinousShores)), () -> { node(risso, () -> { node(minke, () -> { node(bryde, () -> { @@ -449,10 +420,11 @@ public class TechTree implements ContentList{ }); }); - node(additiveReconstructor, () -> { + node(additiveReconstructor, Seq.with(new SectorComplete(biomassFacility)), () -> { node(multiplicativeReconstructor, () -> { - node(exponentialReconstructor, () -> { + node(exponentialReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> { node(tetrativeReconstructor, () -> { + }); }); }); @@ -473,34 +445,78 @@ public class TechTree implements ContentList{ node(ruinousShores, Seq.with( new SectorComplete(craters), new Research(graphitePress), - new Research(combustionGenerator), new Research(kiln), new Research(mechanicalPump) ), () -> { - - node(tarFields, Seq.with( + node(windsweptIslands, Seq.with( new SectorComplete(ruinousShores), - new Research(coalCentrifuge), - new Research(conduit), - new Research(wave) + new Research(pneumaticDrill), + new Research(hail), + new Research(siliconSmelter), + new Research(steamGenerator) ), () -> { - node(desolateRift, Seq.with( - new SectorComplete(tarFields), - new Research(thermalGenerator), - new Research(thoriumReactor) + node(tarFields, Seq.with( + new SectorComplete(windsweptIslands), + new Research(coalCentrifuge), + new Research(conduit), + new Research(wave) + ), () -> { + node(impact0078, Seq.with( + new SectorComplete(tarFields), + new Research(Items.thorium), + new Research(lancer), + new Research(salvo), + new Research(coreFoundation) + ), () -> { + node(desolateRift, Seq.with( + new SectorComplete(impact0078), + new Research(thermalGenerator), + new Research(thoriumReactor), + new Research(coreNucleus) + ), () -> { + node(planetaryTerminal, Seq.with( + new SectorComplete(desolateRift), + new SectorComplete(nuclearComplex), + new SectorComplete(overgrowth), + new SectorComplete(extractionOutpost), + new SectorComplete(saltFlats), + new Research(risso), + new Research(minke), + new Research(bryde), + new Research(spectre), + new Research(launchPad), + new Research(massDriver), + new Research(impactReactor), + new Research(additiveReconstructor), + new Research(exponentialReconstructor) + ), () -> { + + }); + }); + }); + }); + + node(extractionOutpost, Seq.with( + new SectorComplete(stainedMountains), + new SectorComplete(windsweptIslands), + new Research(groundFactory), + new Research(nova), + new Research(airFactory), + new Research(mono) ), () -> { }); - }); - node(saltFlats, Seq.with( - new SectorComplete(ruinousShores), - new Research(groundFactory), - new Research(airFactory), - new Research(door), - new Research(waterExtractor) - ), () -> { + node(saltFlats, Seq.with( + new SectorComplete(windsweptIslands), + new Research(commandCenter), + new Research(groundFactory), + new Research(additiveReconstructor), + new Research(airFactory), + new Research(door) + ), () -> { + }); }); }); @@ -509,6 +525,7 @@ public class TechTree implements ContentList{ new SectorComplete(fungalPass), new Research(cultivator), new Research(sporePress), + new Research(additiveReconstructor), new Research(UnitTypes.mace), new Research(UnitTypes.flare) ), () -> { @@ -516,23 +533,91 @@ public class TechTree implements ContentList{ }); }); - node(stainedMountains, Seq.with( + node(biomassFacility, Seq.with( new SectorComplete(frozenForest), - new Research(pneumaticDrill), new Research(powerNode), - new Research(steamGenerator) + new Research(steamGenerator), + new Research(scatter), + new Research(graphitePress) ), () -> { - node(fungalPass, Seq.with( - new SectorComplete(stainedMountains), - new Research(groundFactory), - new Research(door), + node(stainedMountains, Seq.with( + new SectorComplete(biomassFacility), + new Research(pneumaticDrill), new Research(siliconSmelter) ), () -> { - node(nuclearComplex, Seq.with( - new SectorComplete(fungalPass), - new Research(thermalGenerator), - new Research(laserDrill) + node(fungalPass, Seq.with( + new SectorComplete(stainedMountains), + new Research(groundFactory), + new Research(door) ), () -> { + node(nuclearComplex, Seq.with( + new SectorComplete(fungalPass), + new Research(thermalGenerator), + new Research(laserDrill), + new Research(Items.plastanium), + new Research(swarmer) + ), () -> { + + }); + }); + }); + }); + }); + }); + + nodeProduce(Items.copper, () -> { + nodeProduce(Liquids.water, () -> { + + }); + + nodeProduce(Items.lead, () -> { + nodeProduce(Items.titanium, () -> { + nodeProduce(Liquids.cryofluid, () -> { + + }); + + nodeProduce(Items.thorium, () -> { + nodeProduce(Items.surgeAlloy, () -> { + + }); + + nodeProduce(Items.phaseFabric, () -> { + + }); + }); + }); + + nodeProduce(Items.metaglass, () -> { + + }); + }); + + nodeProduce(Items.sand, () -> { + nodeProduce(Items.scrap, () -> { + nodeProduce(Liquids.slag, () -> { + + }); + }); + + nodeProduce(Items.coal, () -> { + nodeProduce(Items.graphite, () -> { + nodeProduce(Items.silicon, () -> { + + }); + }); + + nodeProduce(Items.pyratite, () -> { + nodeProduce(Items.blastCompound, () -> { + + }); + }); + + nodeProduce(Items.sporePod, () -> { + + }); + + nodeProduce(Liquids.oil, () -> { + nodeProduce(Items.plastanium, () -> { }); }); @@ -543,35 +628,54 @@ public class TechTree implements ContentList{ } public static void setup(){ - TechNode.context = null; + context = null; map = new ObjectMap<>(); all = new Seq<>(); } - public static TechNode node(UnlockableContent content, Runnable children){ + //all the "node" methods are hidden, because they are for internal context-dependent use only + //for custom research, just use the TechNode constructor + + static TechNode node(UnlockableContent content, Runnable children){ return node(content, content.researchRequirements(), children); } - public static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ - return new TechNode(content, requirements, children); + static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ + return node(content, requirements, null, children); } - public static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ - TechNode node = new TechNode(content, content.researchRequirements(), children); - node.objectives = objectives; + static TechNode node(UnlockableContent content, ItemStack[] requirements, Seq objectives, Runnable children){ + TechNode node = new TechNode(context, content, requirements); + if(objectives != null){ + node.objectives.addAll(objectives); + } + + TechNode prev = context; + context = node; + children.run(); + context = prev; + return node; } - public static TechNode node(UnlockableContent block){ + static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ + return node(content, content.researchRequirements(), objectives, children); + } + + static TechNode node(UnlockableContent block){ return node(block, () -> {}); } - public static TechNode create(UnlockableContent parent, UnlockableContent block){ - TechNode.context = all.find(t -> t.content == parent); - return node(block, () -> {}); + static TechNode nodeProduce(UnlockableContent content, Seq objectives, Runnable children){ + return node(content, content.researchRequirements(), objectives.and(new Produce(content)), children); } - public static @Nullable TechNode get(UnlockableContent content){ + static TechNode nodeProduce(UnlockableContent content, Runnable children){ + return nodeProduce(content, new Seq<>(), children); + } + + @Nullable + public static TechNode get(UnlockableContent content){ return map.get(content); } @@ -580,8 +684,6 @@ public class TechTree implements ContentList{ } public static class TechNode{ - static TechNode context; - /** Depth in tech tree. */ public int depth; /** Requirement node. */ @@ -594,19 +696,16 @@ public class TechTree implements ContentList{ public final ItemStack[] finishedRequirements; /** Extra objectives needed to research this. */ public Seq objectives = new Seq<>(); - /** Time required to research this content, in seconds. */ - public float time; /** Nodes that depend on this node. */ public final Seq children = new Seq<>(); - TechNode(@Nullable TechNode ccontext, UnlockableContent content, ItemStack[] requirements, Runnable children){ - if(ccontext != null) ccontext.children.add(this); + public TechNode(@Nullable TechNode parent, UnlockableContent content, ItemStack[] requirements){ + if(parent != null) parent.children.add(this); - this.parent = ccontext; + this.parent = parent; this.content = content; this.requirements = requirements; this.depth = parent == null ? 0 : parent.depth + 1; - this.time = Seq.with(requirements).mapFloat(i -> i.item.cost * i.amount).sum() * 10; this.finishedRequirements = new ItemStack[requirements.length]; //load up the requirements that have been finished if settings are available @@ -614,18 +713,33 @@ public class TechTree implements ContentList{ finishedRequirements[i] = new ItemStack(requirements[i].item, Core.settings == null ? 0 : Core.settings.getInt("req-" + content.name + "-" + requirements[i].item.name)); } + var used = new ObjectSet(); + //add dependencies as objectives. - content.getDependencies(d -> objectives.add(new Research(d))); + content.getDependencies(d -> { + if(used.add(d)){ + objectives.add(new Research(d)); + } + }); map.put(content, this); - context = this; - children.run(); - context = ccontext; all.add(this); } - TechNode(UnlockableContent content, ItemStack[] requirements, Runnable children){ - this(context, content, requirements, children); + /** Resets finished requirements and saves. */ + public void reset(){ + for(ItemStack stack : finishedRequirements){ + stack.amount = 0; + } + save(); + } + + /** Removes this node from the tech tree. */ + public void remove(){ + all.remove(this); + if(parent != null){ + parent.children.remove(this); + } } /** Flushes research progress to settings. */ diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 3fd037f208..d54f7cf46f 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1,62 +1,65 @@ package mindustry.content; import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; import arc.struct.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.ctype.*; +import mindustry.entities.*; import mindustry.entities.abilities.*; import mindustry.entities.bullet.*; +import mindustry.entities.effect.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.type.weapons.*; +import mindustry.world.meta.*; +import static arc.graphics.g2d.Draw.*; +import static arc.graphics.g2d.Lines.*; +import static arc.math.Angles.*; import static mindustry.Vars.*; public class UnitTypes implements ContentList{ //region definitions //mech - public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, scepter, reign; + public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, scepter, reign, vela; - //mech + builder + miner + commander - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType nova, pulsar, quasar; - - //mech + commander - public static @EntityDef({Unitc.class, Mechc.class, Commanderc.class}) UnitType vela; - - //legs + commander - public static @EntityDef({Unitc.class, Legsc.class, Commanderc.class}) UnitType corvus; + //mech, legacy + public static @EntityDef(value = {Unitc.class, Mechc.class}, legacy = true) UnitType nova, pulsar, quasar; //legs - public static @EntityDef({Unitc.class, Legsc.class}) UnitType atrax; + public static @EntityDef({Unitc.class, Legsc.class}) UnitType corvus, atrax; - //legs + building - public static @EntityDef({Unitc.class, Legsc.class, Builderc.class}) UnitType spiroct, arkyid, toxopid; + //legs, legacy + public static @EntityDef(value = {Unitc.class, Legsc.class}, legacy = true) UnitType spiroct, arkyid, toxopid; - //air (no special traits) + //air public static @EntityDef({Unitc.class}) UnitType flare, eclipse, horizon, zenith, antumbra; - //air + mining - public static @EntityDef({Unitc.class, Minerc.class}) UnitType mono; + //air, legacy + public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType mono; - //air + building + mining - public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType poly; + //air, legacy + public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType poly; - //air + building + mining + payload - public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Payloadc.class}) UnitType mega; + //air + payload + public static @EntityDef({Unitc.class, Payloadc.class}) UnitType mega; - //air + building + payload - public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class}) UnitType quad; + //air + payload, legacy + public static @EntityDef(value = {Unitc.class, Payloadc.class}, legacy = true) UnitType quad; - //air + building + payload + command - public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class, Commanderc.class, AmmoDistributec.class}) UnitType oct; + //air + payload + ammo distribution + public static @EntityDef({Unitc.class, Payloadc.class, AmmoDistributec.class}) UnitType oct; - //air + building + mining - public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType alpha, beta, gamma; + //air, legacy + public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType alpha, beta, gamma; - //water + commander - public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde, sei, omura; + //naval + public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType risso, minke, bryde, sei, omura, retusa, oxynoe, cyerce, aegires, navanax; //special block unit type public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block; @@ -70,21 +73,21 @@ public class UnitTypes implements ContentList{ dagger = new UnitType("dagger"){{ speed = 0.5f; hitSize = 8f; - health = 140; + health = 150; weapons.add(new Weapon("large-weapon"){{ - reload = 14f; + reload = 13f; x = 4f; y = 2f; top = false; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }}); }}; mace = new UnitType("mace"){{ - speed = 0.4f; - hitSize = 9f; - health = 500; + speed = 0.45f; + hitSize = 10f; + health = 530; armor = 4f; immunities.add(StatusEffects.burning); @@ -93,10 +96,10 @@ public class UnitTypes implements ContentList{ top = false; shootSound = Sounds.flame; shootY = 2f; - reload = 14f; + reload = 12f; recoil = 1f; ejectEffect = Fx.none; - bullet = new BulletType(3.9f, 30f){{ + bullet = new BulletType(4.1f, 32f){{ ammoMultiplier = 3f; hitSize = 7f; lifetime = 12f; @@ -113,11 +116,11 @@ public class UnitTypes implements ContentList{ }}; fortress = new UnitType("fortress"){{ - speed = 0.38f; + speed = 0.43f; hitSize = 13f; rotateSpeed = 3f; targetAir = false; - health = 790; + health = 820; armor = 9f; mechFrontSway = 0.55f; @@ -128,17 +131,17 @@ public class UnitTypes implements ContentList{ reload = 60f; recoil = 4f; shake = 2f; - ejectEffect = Fx.shellEjectMedium; + ejectEffect = Fx.casing2; shootSound = Sounds.artillery; bullet = new ArtilleryBulletType(2f, 8, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; - lifetime = 110f; + lifetime = 120f; width = height = 14f; collides = true; collidesTiles = true; - splashDamageRadius = 24f; - splashDamage = 38f; + splashDamageRadius = 30f; + splashDamage = 60f; backColor = Pal.bulletYellowBack; frontColor = Pal.bulletYellow; }}; @@ -147,10 +150,10 @@ public class UnitTypes implements ContentList{ scepter = new UnitType("scepter"){{ speed = 0.35f; - hitSize = 20f; + hitSize = 22f; rotateSpeed = 2.1f; health = 9000; - armor = 11f; + armor = 10f; canDrown = false; mechFrontSway = 1f; @@ -164,11 +167,11 @@ public class UnitTypes implements ContentList{ y = 1f; x = 16f; shootY = 8f; - reload = 50f; + reload = 45f; recoil = 5f; shake = 2f; - ejectEffect = Fx.shellEjectBig; - shootSound = Sounds.artillery; + ejectEffect = Fx.casing3; + shootSound = Sounds.bang; shots = 3; inaccuracy = 3f; shotDelay = 4f; @@ -182,7 +185,7 @@ public class UnitTypes implements ContentList{ lightningLength = 6; lightningColor = Pal.surge; //standard bullet damage is far too much for lightning - lightningDamage = 25; + lightningDamage = 19; }}; }}, @@ -191,7 +194,7 @@ public class UnitTypes implements ContentList{ x = 8.5f; y = 6f; rotate = true; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }}, new Weapon("mount-weapon"){{ @@ -199,7 +202,7 @@ public class UnitTypes implements ContentList{ x = 8.5f; y = -7f; rotate = true; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }} @@ -227,11 +230,12 @@ public class UnitTypes implements ContentList{ reload = 9f; recoil = 5f; shake = 2f; - ejectEffect = Fx.shellEjectBig; - shootSound = Sounds.artillery; + ejectEffect = Fx.casing4; + shootSound = Sounds.bang; - bullet = new BasicBulletType(13f, 55){{ + bullet = new BasicBulletType(13f, 65){{ pierce = true; + pierceCap = 10; width = 14f; height = 33f; lifetime = 15f; @@ -239,22 +243,24 @@ public class UnitTypes implements ContentList{ fragVelocityMin = 0.4f; hitEffect = Fx.blastExplosion; - splashDamage = 18f; - splashDamageRadius = 30f; + splashDamage = 16f; + splashDamageRadius = 13f; - fragBullets = 2; + fragBullets = 3; fragLifeMin = 0f; fragCone = 30f; - fragBullet = new BasicBulletType(9f, 15){{ + fragBullet = new BasicBulletType(9f, 18){{ width = 10f; height = 10f; pierce = true; + pierceBuilding = true; + pierceCap = 3; lifetime = 20f; hitEffect = Fx.flakExplosion; splashDamage = 15f; - splashDamageRadius = 15f; + splashDamageRadius = 10f; }}; }}; }} @@ -266,17 +272,16 @@ public class UnitTypes implements ContentList{ //region ground support nova = new UnitType("nova"){{ - itemCapacity = 60; canBoost = true; boostMultiplier = 1.5f; speed = 0.55f; hitSize = 8f; - health = 110f; + health = 120f; buildSpeed = 0.8f; armor = 1f; commandLimit = 8; - abilities.add(new HealFieldAbility(10f, 60f * 4, 60f)); + abilities.add(new RepairFieldAbility(10f, 60f * 4, 60f)); ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-weapon"){{ @@ -287,26 +292,33 @@ public class UnitTypes implements ContentList{ alternate = false; ejectEffect = Fx.none; recoil = 2f; - bullet = Bullets.healBullet; - shootSound = Sounds.pew; + shootSound = Sounds.lasershoot; + + bullet = new LaserBoltBulletType(5.2f, 13){{ + lifetime = 30f; + healPercent = 5f; + collidesTeam = true; + backColor = Pal.heal; + frontColor = Color.white; + }}; }}); }}; pulsar = new UnitType("pulsar"){{ - itemCapacity = 60; canBoost = true; - boostMultiplier = 1.5f; - speed = 0.65f; - hitSize = 10f; + boostMultiplier = 1.6f; + speed = 0.7f; + hitSize = 11f; health = 320f; buildSpeed = 0.9f; armor = 4f; + riseSpeed = 0.07f; mineTier = 2; mineSpeed = 5f; - commandLimit = 8; + commandLimit = 9; - abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 5, 60f)); + abilities.add(new ShieldRegenFieldAbility(20f, 40f, 60f * 5, 60f)); ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-shotgun-weapon"){{ @@ -314,48 +326,58 @@ public class UnitTypes implements ContentList{ x = 5f; shake = 2.2f; y = 0.5f; - shootY = 5f; - shootY = 2.5f; - reload = 38f; + + reload = 36f; shots = 3; inaccuracy = 35; shotDelay = 0.5f; spacing = 0f; ejectEffect = Fx.none; recoil = 2.5f; - shootSound = Sounds.pew; + shootSound = Sounds.spark; bullet = new LightningBulletType(){{ lightningColor = hitColor = Pal.heal; - damage = 15f; + damage = 12f; lightningLength = 7; lightningLengthRand = 7; shootEffect = Fx.shootHeal; + //Does not actually do anything; Just here to make stats work + healPercent = 2f; + + lightningType = new BulletType(0.0001f, 0f){{ + lifetime = Fx.lightning.lifetime; + hitEffect = Fx.hitLancer; + despawnEffect = Fx.none; + status = StatusEffects.shocked; + statusDuration = 10f; + hittable = false; + healPercent = 2f; + collidesTeam = true; + }}; }}; }}); }}; quasar = new UnitType("quasar"){{ - mineTier = 1; - hitSize = 12f; + mineTier = 3; boostMultiplier = 2f; - itemCapacity = 80; - health = 650f; + health = 640f; buildSpeed = 1.7f; canBoost = true; armor = 9f; landShake = 2f; + riseSpeed = 0.05f; commandLimit = 10; mechFrontSway = 0.55f; ammoType = AmmoTypes.power; speed = 0.4f; - hitSize = 10f; + hitSize = 13f; - mineTier = 2; - mineSpeed = 7f; + mineSpeed = 6f; drawShields = false; abilities.add(new ForceFieldAbility(60f, 0.3f, 400f, 60f * 6)); @@ -365,42 +387,48 @@ public class UnitTypes implements ContentList{ shake = 2f; shootY = 4f; x = 6.5f; - reload = 50f; + reload = 55f; recoil = 4f; shootSound = Sounds.laser; bullet = new LaserBulletType(){{ - damage = 40f; + damage = 45f; recoil = 1f; sideAngle = 45f; sideWidth = 1f; sideLength = 70f; + healPercent = 10f; + collidesTeam = true; + length = 135f; colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; }}; }}); }}; vela = new UnitType("vela"){{ - hitSize = 23f; + hitSize = 24f; rotateSpeed = 1.6f; canDrown = false; mechFrontSway = 1f; + buildSpeed = 3f; mechStepParticles = true; mechStepShake = 0.15f; ammoType = AmmoTypes.powerHigh; - speed = 0.35f; - boostMultiplier = 2.1f; + speed = 0.39f; + boostMultiplier = 2.2f; engineOffset = 12f; engineSize = 6f; lowAltitude = true; + riseSpeed = 0.02f; - health = 6500f; - armor = 7f; + health = 7500f; + armor = 9f; canBoost = true; landShake = 4f; + immunities = ObjectSet.with(StatusEffects.burning); commandLimit = 8; @@ -413,14 +441,16 @@ public class UnitTypes implements ContentList{ firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f; - reload = 320f; + reload = 155f; recoil = 0f; - shootSound = Sounds.laser; + chargeSound = Sounds.lasercharge2; + shootSound = Sounds.beam; continuous = true; cooldownTime = 200f; - bullet = new ContinuousLaserBulletType(20){{ - length = 150f; + bullet = new ContinuousLaserBulletType(){{ + damage = 30f; + length = 175f; hitEffect = Fx.hitMeltHeal; drawSize = 420f; lifetime = 160f; @@ -430,10 +460,14 @@ public class UnitTypes implements ContentList{ shootEffect = Fx.greenLaserChargeSmall; - incendChance = 0.05f; + incendChance = 0.1f; incendSpread = 5f; incendAmount = 1; + //constant healing + healPercent = 1f; + collidesTeam = true; + colors = new Color[]{Pal.heal.cpy().a(.2f), Pal.heal.cpy().a(.5f), Pal.heal.cpy().mul(1.2f), Color.white}; }}; @@ -443,11 +477,8 @@ public class UnitTypes implements ContentList{ }}; corvus = new UnitType("corvus"){{ - mineTier = 1; hitSize = 29f; - itemCapacity = 80; health = 18000f; - buildSpeed = 1.7f; armor = 9f; landShake = 1.5f; rotateSpeed = 1.5f; @@ -467,11 +498,12 @@ public class UnitTypes implements ContentList{ speed = 0.3f; - mineTier = 2; - mineSpeed = 7f; drawShields = false; weapons.add(new Weapon("corvus-weapon"){{ + shootSound = Sounds.laserblast; + chargeSound = Sounds.lasercharge; + soundPitchMin = 1f; top = false; mirror = false; shake = 14f; @@ -479,7 +511,6 @@ public class UnitTypes implements ContentList{ x = y = 0; reload = 350f; recoil = 0f; - shootSound = Sounds.laser; cooldownTime = 350f; @@ -489,7 +520,7 @@ public class UnitTypes implements ContentList{ bullet = new LaserBulletType(){{ length = 460f; - damage = 550f; + damage = 560f; width = 75f; lifetime = 65f; @@ -505,6 +536,9 @@ public class UnitTypes implements ContentList{ shootEffect = Fx.greenLaserCharge; + healPercent = 25f; + collidesTeam = true; + sideAngle = 15f; sideWidth = 0f; sideLength = 0f; @@ -519,24 +553,26 @@ public class UnitTypes implements ContentList{ crawler = new UnitType("crawler"){{ defaultController = SuicideAI::new; - speed = 0.85f; + speed = 1f; hitSize = 8f; - health = 180; + health = 200; mechSideSway = 0.25f; range = 40f; weapons.add(new Weapon(){{ - reload = 12f; + reload = 24f; shootCone = 180f; ejectEffect = Fx.none; shootSound = Sounds.explosion; + x = shootY = 0f; + mirror = false; bullet = new BombBulletType(0f, 0f, "clear"){{ hitEffect = Fx.pulverize; lifetime = 10f; speed = 1f; - splashDamageRadius = 55f; + splashDamageRadius = 60f; instantDisappear = true; - splashDamage = 55f; + splashDamage = 88f; killShooter = true; hittable = false; collidesAir = true; @@ -545,10 +581,9 @@ public class UnitTypes implements ContentList{ }}; atrax = new UnitType("atrax"){{ - itemCapacity = 80; speed = 0.5f; drag = 0.4f; - hitSize = 10f; + hitSize = 13f; rotateSpeed = 3f; targetAir = false; health = 600; @@ -568,7 +603,7 @@ public class UnitTypes implements ContentList{ weapons.add(new Weapon("eruption"){{ top = false; shootY = 3f; - reload = 10f; + reload = 9f; ejectEffect = Fx.none; recoil = 1f; x = 7f; @@ -586,11 +621,11 @@ public class UnitTypes implements ContentList{ }}; spiroct = new UnitType("spiroct"){{ - speed = 0.4f; + speed = 0.45f; drag = 0.4f; - hitSize = 12f; + hitSize = 15f; rotateSpeed = 3f; - health = 760; + health = 910; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); legCount = 6; legLength = 13f; @@ -609,19 +644,19 @@ public class UnitTypes implements ContentList{ weapons.add(new Weapon("spiroct-weapon"){{ shootY = 4f; - reload = 15f; + reload = 14f; ejectEffect = Fx.none; recoil = 2f; rotate = true; - shootSound = Sounds.flame; + shootSound = Sounds.sap; x = 8.5f; y = -1.5f; bullet = new SapBulletType(){{ - sapStrength = 0.3f; + sapStrength = 0.5f; length = 75f; - damage = 15; + damage = 20; shootEffect = Fx.shootSmall; hitColor = color = Color.valueOf("bf92f9"); despawnEffect = Fx.none; @@ -632,15 +667,16 @@ public class UnitTypes implements ContentList{ }}); weapons.add(new Weapon("mount-purple-weapon"){{ - reload = 20f; + reload = 18f; rotate = true; x = 4f; y = 3f; + shootSound = Sounds.sap; bullet = new SapBulletType(){{ - sapStrength = 0.65f; + sapStrength = 0.8f; length = 40f; - damage = 13; + damage = 16; shootEffect = Fx.shootSmall; hitColor = color = Color.valueOf("bf92f9"); despawnEffect = Fx.none; @@ -653,8 +689,8 @@ public class UnitTypes implements ContentList{ arkyid = new UnitType("arkyid"){{ drag = 0.1f; - speed = 0.5f; - hitSize = 21f; + speed = 0.6f; + hitSize = 23f; health = 8000; armor = 6f; @@ -667,11 +703,11 @@ public class UnitTypes implements ContentList{ legExtension = -15; legBaseOffset = 10f; landShake = 1f; - legSpeed = 0.1f; legLengthScl = 0.96f; rippleScale = 2f; legSpeed = 0.2f; ammoType = AmmoTypes.power; + buildSpeed = 1f; legSplashDamage = 32; legSplashRange = 30; @@ -682,9 +718,9 @@ public class UnitTypes implements ContentList{ groundLayer = Layer.legUnit; BulletType sapper = new SapBulletType(){{ - sapStrength = 0.83f; + sapStrength = 0.85f; length = 55f; - damage = 34; + damage = 37; shootEffect = Fx.shootSmall; hitColor = color = Color.valueOf("bf92f9"); despawnEffect = Fx.none; @@ -700,20 +736,23 @@ public class UnitTypes implements ContentList{ y = 8f; rotate = true; bullet = sapper; + shootSound = Sounds.sap; }}, new Weapon("spiroct-weapon"){{ - reload = 15f; + reload = 14f; x = 9f; y = 6f; rotate = true; bullet = sapper; + shootSound = Sounds.sap; }}, new Weapon("spiroct-weapon"){{ - reload = 23f; + reload = 22f; x = 14f; y = 0f; rotate = true; bullet = sapper; + shootSound = Sounds.sap; }}, new Weapon("large-purple-mount"){{ y = -7f; @@ -722,10 +761,10 @@ public class UnitTypes implements ContentList{ reload = 45; shake = 3f; rotateSpeed = 2f; - ejectEffect = Fx.shellEjectSmall; - shootSound = Sounds.shootBig; + ejectEffect = Fx.casing1; + shootSound = Sounds.artillery; rotate = true; - occlusion = 8f; + shadow = 8f; recoil = 3f; bullet = new ArtilleryBulletType(2f, 12){{ @@ -735,7 +774,7 @@ public class UnitTypes implements ContentList{ width = height = 19f; collidesTiles = true; ammoMultiplier = 4f; - splashDamageRadius = 95f; + splashDamageRadius = 70f; splashDamage = 65f; backColor = Pal.sapBulletBack; frontColor = lightningColor = Pal.sapBullet; @@ -753,9 +792,10 @@ public class UnitTypes implements ContentList{ toxopid = new UnitType("toxopid"){{ drag = 0.1f; speed = 0.5f; - hitSize = 21f; + hitSize = 26f; health = 22000; armor = 13f; + lightRadius = 140f; rotateSpeed = 1.9f; @@ -771,6 +811,7 @@ public class UnitTypes implements ContentList{ rippleScale = 3f; legSpeed = 0.19f; ammoType = AmmoTypes.powerHigh; + buildSpeed = 1f; legSplashDamage = 80; legSplashRange = 60; @@ -788,10 +829,10 @@ public class UnitTypes implements ContentList{ reload = 30; shake = 4f; rotateSpeed = 2f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; shootSound = Sounds.shootBig; rotate = true; - occlusion = 12f; + shadow = 12f; recoil = 3f; shots = 2; spacing = 17f; @@ -820,10 +861,10 @@ public class UnitTypes implements ContentList{ shake = 10f; recoil = 10f; rotateSpeed = 1f; - ejectEffect = Fx.shellEjectBig; - shootSound = Sounds.shootBig; + ejectEffect = Fx.casing3; + shootSound = Sounds.artillery; rotate = true; - occlusion = 30f; + shadow = 30f; bullet = new ArtilleryBulletType(3f, 50){{ hitEffect = Fx.sapExplosion; @@ -832,7 +873,7 @@ public class UnitTypes implements ContentList{ width = height = 25f; collidesTiles = collides = true; ammoMultiplier = 4f; - splashDamageRadius = 90f; + splashDamageRadius = 80f; splashDamage = 75f; backColor = Pal.sapBulletBack; frontColor = lightningColor = Pal.sapBullet; @@ -840,6 +881,9 @@ public class UnitTypes implements ContentList{ lightningLength = 20; smokeEffect = Fx.shootBigSmoke2; hitShake = 10f; + lightRadius = 40f; + lightColor = Pal.sap; + lightOpacity = 0.6f; status = StatusEffects.sapped; statusDuration = 60f * 10; @@ -853,7 +897,7 @@ public class UnitTypes implements ContentList{ lifetime = 90f; width = height = 20f; collidesTiles = false; - splashDamageRadius = 80f; + splashDamageRadius = 70f; splashDamage = 40f; backColor = Pal.sapBulletBack; frontColor = lightningColor = Pal.sapBullet; @@ -861,6 +905,9 @@ public class UnitTypes implements ContentList{ lightningLength = 5; smokeEffect = Fx.shootBigSmoke2; hitShake = 5f; + lightRadius = 30f; + lightColor = Pal.sap; + lightOpacity = 0.5f; status = StatusEffects.sapped; statusDuration = 60f * 10; @@ -878,23 +925,33 @@ public class UnitTypes implements ContentList{ drag = 0.01f; flying = true; health = 75; - faceTarget = false; engineOffset = 5.5f; range = 140f; + targetAir = false; + commandLimit = 4; + circleTarget = true; + hitSize = 7; weapons.add(new Weapon(){{ y = 0f; x = 2f; reload = 13f; - ejectEffect = Fx.shellEjectSmall; - bullet = Bullets.standardCopper; - shootSound = Sounds.shoot; + ejectEffect = Fx.casing1; + bullet = new BasicBulletType(2.5f, 9){{ + width = 7f; + height = 9f; + lifetime = 45f; + shootEffect = Fx.shootSmall; + smokeEffect = Fx.shootSmallSmoke; + ammoMultiplier = 2; + }}; + shootSound = Sounds.pew; }}); }}; horizon = new UnitType("horizon"){{ - health = 350; - speed = 2f; + health = 340; + speed = 1.65f; accel = 0.08f; drag = 0.016f; flying = true; @@ -903,19 +960,22 @@ public class UnitTypes implements ContentList{ engineOffset = 7.8f; range = 140f; faceTarget = false; - armor = 4f; + armor = 3f; + targetFlag = BlockFlag.factory; + commandLimit = 5; + circleTarget = true; weapons.add(new Weapon(){{ minShootVelocity = 0.75f; x = 3f; shootY = 0f; - reload = 11f; + reload = 12f; shootCone = 180f; ejectEffect = Fx.none; inaccuracy = 15f; ignoreRotation = true; shootSound = Sounds.none; - bullet = new BombBulletType(28f, 25f){{ + bullet = new BombBulletType(27f, 25f){{ width = 10f; height = 14f; hitEffect = Fx.flakExplosion; @@ -950,8 +1010,9 @@ public class UnitTypes implements ContentList{ shots = 2; inaccuracy = 5f; velocityRnd = 0.2f; + shootSound = Sounds.missile; - bullet = new MissileBulletType(3f, 12){{ + bullet = new MissileBulletType(3f, 14){{ width = 8f; height = 8f; shrinkY = 0f; @@ -959,8 +1020,8 @@ public class UnitTypes implements ContentList{ homingRange = 60f; keepVelocity = false; splashDamageRadius = 25f; - splashDamage = 10f; - lifetime = 60f; + splashDamage = 15f; + lifetime = 50f; trailColor = Pal.unitBack; backColor = Pal.unitBack; frontColor = Pal.unitFront; @@ -983,15 +1044,16 @@ public class UnitTypes implements ContentList{ armor = 9f; engineOffset = 21; engineSize = 5.3f; - hitSize = 56f; + hitSize = 46f; + targetFlag = BlockFlag.battery; - BulletType missiles = new MissileBulletType(2.7f, 10){{ + BulletType missiles = new MissileBulletType(2.7f, 14){{ width = 8f; height = 8f; shrinkY = 0f; drag = -0.01f; splashDamageRadius = 20f; - splashDamage = 30f; + splashDamage = 34f; ammoMultiplier = 4f; lifetime = 50f; hitEffect = Fx.blastExplosion; @@ -1006,23 +1068,23 @@ public class UnitTypes implements ContentList{ y = 8f; x = 17f; reload = 20f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; rotateSpeed = 8f; bullet = missiles; - shootSound = Sounds.shoot; + shootSound = Sounds.missile; rotate = true; - occlusion = 6f; + shadow = 6f; }}, new Weapon("missiles-mount"){{ y = -8f; x = 17f; reload = 35; rotateSpeed = 8f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = missiles; - shootSound = Sounds.shoot; + shootSound = Sounds.missile; rotate = true; - occlusion = 6f; + shadow = 6f; }}, new Weapon("large-bullet-mount"){{ y = 2f; @@ -1031,11 +1093,11 @@ public class UnitTypes implements ContentList{ reload = 12; shake = 1f; rotateSpeed = 2f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; shootSound = Sounds.shootBig; rotate = true; - occlusion = 8f; - bullet = new BasicBulletType(7f, 50){{ + shadow = 8f; + bullet = new BasicBulletType(7f, 55){{ width = 12f; height = 18f; lifetime = 25f; @@ -1052,17 +1114,18 @@ public class UnitTypes implements ContentList{ rotateSpeed = 1f; flying = true; lowAltitude = true; - health = 20000; + health = 21000; engineOffset = 38; engineSize = 7.3f; hitSize = 58f; destructibleWreck = false; armor = 13f; + targetFlag = BlockFlag.reactor; BulletType fragBullet = new FlakBulletType(4f, 5){{ shootEffect = Fx.shootBig; ammoMultiplier = 4f; - splashDamage = 42f; + splashDamage = 50f; splashDamageRadius = 25f; collidesGround = true; lifetime = 38f; @@ -1081,11 +1144,11 @@ public class UnitTypes implements ContentList{ reload = 45f; recoil = 4f; shootSound = Sounds.laser; - occlusion = 20f; + shadow = 20f; rotate = true; bullet = new LaserBulletType(){{ - damage = 90f; + damage = 100f; sideAngle = 20f; sideWidth = 1.5f; sideLength = 80f; @@ -1100,8 +1163,8 @@ public class UnitTypes implements ContentList{ y = 27f; rotateSpeed = 2f; reload = 9f; - shootSound = Sounds.flame; - occlusion = 7f; + shootSound = Sounds.shoot; + shadow = 7f; rotate = true; recoil = 0.5f; @@ -1111,12 +1174,12 @@ public class UnitTypes implements ContentList{ y = -13f; x = 20f; reload = 12f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; rotateSpeed = 7f; shake = 1f; shootSound = Sounds.shoot; rotate = true; - occlusion = 12f; + shadow = 12f; bullet = fragBullet; }}); }}; @@ -1130,11 +1193,10 @@ public class UnitTypes implements ContentList{ flying = true; drag = 0.06f; accel = 0.12f; - speed = 1.1f; + speed = 1.5f; health = 100; engineSize = 1.8f; engineOffset = 5.7f; - itemCapacity = 30; range = 50f; isCounted = false; @@ -1149,24 +1211,22 @@ public class UnitTypes implements ContentList{ flying = true; drag = 0.05f; - speed = 1.9f; + speed = 2.6f; rotateSpeed = 15f; accel = 0.1f; - range = 70f; - itemCapacity = 70; + range = 130f; health = 400; buildSpeed = 0.5f; engineOffset = 6.5f; - hitSize = 8f; + hitSize = 9f; lowAltitude = true; - isCounted = false; ammoType = AmmoTypes.power; mineTier = 2; mineSpeed = 3.5f; - abilities.add(new HealFieldAbility(5f, 60f * 5, 50f)); + abilities.add(new RepairFieldAbility(5f, 60f * 8, 50f)); weapons.add(new Weapon("heal-weapon-mount"){{ top = false; @@ -1175,7 +1235,7 @@ public class UnitTypes implements ContentList{ reload = 30f; ejectEffect = Fx.none; recoil = 2f; - shootSound = Sounds.pew; + shootSound = Sounds.missile; shots = 1; velocityRnd = 0.5f; inaccuracy = 15f; @@ -1185,12 +1245,16 @@ public class UnitTypes implements ContentList{ homingPower = 0.08f; weaveMag = 4; weaveScale = 4; - lifetime = 56f; + lifetime = 50f; keepVelocity = false; shootEffect = Fx.shootHeal; smokeEffect = Fx.hitLaser; + hitEffect = despawnEffect = Fx.hitLaser; frontColor = Color.white; + hitSound = Sounds.none; + healPercent = 5.5f; + collidesTeam = true; backColor = Pal.heal; trailColor = Pal.heal; }}; @@ -1200,58 +1264,76 @@ public class UnitTypes implements ContentList{ mega = new UnitType("mega"){{ defaultController = RepairAI::new; - mineTier = 2; - health = 500; - armor = 2f; - armor = 5f; - speed = 1.8f; + mineTier = 3; + mineSpeed = 4f; + health = 460; + armor = 3f; + speed = 2.5f; accel = 0.06f; drag = 0.017f; lowAltitude = true; flying = true; engineOffset = 10.5f; rotateShooting = false; - hitSize = 15f; + hitSize = 16.05f; engineSize = 3f; payloadCapacity = (2 * 2) * tilePayload; - buildSpeed = 2.5f; + buildSpeed = 2.6f; + isCounted = false; ammoType = AmmoTypes.power; weapons.add( new Weapon("heal-weapon-mount"){{ - reload = 25f; + shootSound = Sounds.lasershoot; + reload = 24f; x = 8f; y = -6f; rotate = true; - bullet = Bullets.healBulletBig; + bullet = new LaserBoltBulletType(5.2f, 10){{ + lifetime = 35f; + healPercent = 5.5f; + collidesTeam = true; + backColor = Pal.heal; + frontColor = Color.white; + }}; }}, new Weapon("heal-weapon-mount"){{ + shootSound = Sounds.lasershoot; reload = 15f; x = 4f; y = 5f; rotate = true; - bullet = Bullets.healBullet; + bullet = new LaserBoltBulletType(5.2f, 8){{ + lifetime = 35f; + healPercent = 3f; + collidesTeam = true; + backColor = Pal.heal; + frontColor = Color.white; + }}; }}); }}; quad = new UnitType("quad"){{ - armor = 4f; + armor = 8f; health = 6000; - speed = 1.2f; + speed = 1.4f; rotateSpeed = 2f; accel = 0.05f; drag = 0.017f; lowAltitude = false; flying = true; + circleTarget = true; engineOffset = 12f; engineSize = 6f; rotateShooting = false; - hitSize = 32f; + hitSize = 36f; payloadCapacity = (3 * 3) * tilePayload; buildSpeed = 2.5f; + buildBeamOffset = 23; range = 140f; targetAir = false; + targetFlag = BlockFlag.battery; ammoType = AmmoTypes.powerHigh; @@ -1259,24 +1341,28 @@ public class UnitTypes implements ContentList{ new Weapon(){{ x = y = 0f; mirror = false; - reload = 60f; + reload = 55f; minShootVelocity = 0.01f; + soundPitchMin = 1f; + shootSound = Sounds.plasmadrop; + bullet = new BasicBulletType(){{ sprite = "large-bomb"; width = height = 120/4f; - range = 30f; + maxRange = 30f; ignoreRotation = true; backColor = Pal.heal; frontColor = Color.white; mixColorTo = Color.white; + hitSound = Sounds.plasmaboom; + shootCone = 180f; ejectEffect = Fx.none; - shootSound = Sounds.none; - despawnShake = 4f; + hitShake = 4f; collidesAir = false; @@ -1292,16 +1378,19 @@ public class UnitTypes implements ContentList{ speed = 0.001f; collides = false; - splashDamage = 240f; - splashDamageRadius = 115f; + healPercent = 15f; + splashDamage = 220f; + splashDamageRadius = 80f; }}; }}); }}; oct = new UnitType("oct"){{ + defaultController = DefenderAI::new; + armor = 16f; health = 24000; - speed = 0.6f; + speed = 0.8f; rotateSpeed = 1f; accel = 0.04f; drag = 0.018f; @@ -1309,16 +1398,18 @@ public class UnitTypes implements ContentList{ engineOffset = 46f; engineSize = 7.8f; rotateShooting = false; - hitSize = 60f; + hitSize = 66f; payloadCapacity = (5.3f * 5.3f) * tilePayload; buildSpeed = 4f; drawShields = false; commandLimit = 6; + lowAltitude = true; + buildBeamOffset = 43; ammoCapacity = 1300; ammoResupplyAmount = 20; - abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new HealFieldAbility(130f, 60f * 2, 140f)); + abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new RepairFieldAbility(130f, 60f * 2, 140f)); }}; //endregion @@ -1327,7 +1418,7 @@ public class UnitTypes implements ContentList{ risso = new UnitType("risso"){{ speed = 1.1f; drag = 0.13f; - hitSize = 9f; + hitSize = 10f; health = 280; accel = 0.4f; rotateSpeed = 3.3f; @@ -1342,27 +1433,28 @@ public class UnitTypes implements ContentList{ shootY = 4f; y = 1.5f; rotate = true; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }}); weapons.add(new Weapon("missiles-mount"){{ mirror = false; - reload = 20f; + reload = 23f; x = 0f; y = -5f; rotate = true; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; + shootSound = Sounds.missile; bullet = new MissileBulletType(2.7f, 12, "missile"){{ + keepVelocity = true; width = 8f; height = 8f; shrinkY = 0f; drag = -0.003f; homingRange = 60f; - keepVelocity = false; splashDamageRadius = 25f; splashDamage = 10f; - lifetime = 80f; + lifetime = 65f; trailColor = Color.gray; backColor = Pal.bulletYellowBack; frontColor = Pal.bulletYellow; @@ -1378,7 +1470,7 @@ public class UnitTypes implements ContentList{ health = 600; speed = 0.9f; drag = 0.15f; - hitSize = 11f; + hitSize = 13f; armor = 4f; accel = 0.3f; rotateSpeed = 2.6f; @@ -1398,7 +1490,8 @@ public class UnitTypes implements ContentList{ rotate = true; rotateSpeed = 5f; inaccuracy = 10f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; + shootSound = Sounds.shoot; bullet = Bullets.flakLead; }}); @@ -1410,18 +1503,19 @@ public class UnitTypes implements ContentList{ inaccuracy = 2f; rotateSpeed = 2f; shake = 1.5f; - ejectEffect = Fx.shellEjectMedium; - bullet = Bullets.artilleryIncendiary; + ejectEffect = Fx.casing2; + shootSound = Sounds.bang; + bullet = Bullets.artilleryDense; }}); }}; bryde = new UnitType("bryde"){{ - health = 900; + health = 910; speed = 0.85f; accel = 0.2f; rotateSpeed = 1.8f; drag = 0.17f; - hitSize = 16f; + hitSize = 20f; armor = 7f; rotateShooting = false; @@ -1430,7 +1524,7 @@ public class UnitTypes implements ContentList{ trailY = -9f; trailScl = 1.5f; - abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 4, 60f)); + abilities.add(new ShieldRegenFieldAbility(20f, 40f, 60f * 4, 60f)); weapons.add(new Weapon("large-artillery"){{ reload = 65f; @@ -1442,23 +1536,24 @@ public class UnitTypes implements ContentList{ shootY = 7f; shake = 5f; recoil = 4f; - occlusion = 12f; + shadow = 12f; shots = 1; inaccuracy = 3f; - ejectEffect = Fx.shellEjectBig; + ejectEffect = Fx.casing3; + shootSound = Sounds.artillery; bullet = new ArtilleryBulletType(3.2f, 12){{ trailMult = 0.8f; hitEffect = Fx.massiveExplosion; knockback = 1.5f; - lifetime = 140f; + lifetime = 80f; height = 15.5f; width = 15f; collidesTiles = false; ammoMultiplier = 4f; - splashDamageRadius = 60f; - splashDamage = 85f; + splashDamageRadius = 40f; + splashDamage = 70f; backColor = Pal.missileYellowBack; frontColor = Pal.missileYellow; trailEffect = Fx.artilleryTrail; @@ -1477,7 +1572,7 @@ public class UnitTypes implements ContentList{ x = 8.5f; y = -9f; - occlusion = 6f; + shadow = 6f; rotateSpeed = 4f; rotate = true; @@ -1485,6 +1580,7 @@ public class UnitTypes implements ContentList{ shotDelay = 3f; inaccuracy = 5f; velocityRnd = 0.1f; + shootSound = Sounds.missile; ejectEffect = Fx.none; bullet = new MissileBulletType(2.7f, 12){{ @@ -1496,7 +1592,7 @@ public class UnitTypes implements ContentList{ keepVelocity = false; splashDamageRadius = 25f; splashDamage = 10f; - lifetime = 80f; + lifetime = 70f; trailColor = Color.gray; backColor = Pal.bulletYellowBack; frontColor = Pal.bulletYellow; @@ -1509,7 +1605,7 @@ public class UnitTypes implements ContentList{ }}; sei = new UnitType("sei"){{ - health = 10000; + health = 11000; armor = 12f; speed = 0.73f; @@ -1532,7 +1628,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 4f; mirror = false; - occlusion = 20f; + shadow = 20f; shootY = 2f; recoil = 4f; @@ -1543,11 +1639,11 @@ public class UnitTypes implements ContentList{ inaccuracy = 7f; ejectEffect = Fx.none; shake = 3f; - shootSound = Sounds.shootBig; + shootSound = Sounds.missile; xRand = 8f; shotDelay = 1f; - bullet = new MissileBulletType(4.2f, 25){{ + bullet = new MissileBulletType(4.2f, 42){{ homingPower = 0.12f; width = 8f; height = 8f; @@ -1555,9 +1651,9 @@ public class UnitTypes implements ContentList{ drag = -0.003f; homingRange = 80f; keepVelocity = false; - splashDamageRadius = 25f; - splashDamage = 25f; - lifetime = 56f; + splashDamageRadius = 35f; + splashDamage = 45f; + lifetime = 62f; trailColor = Pal.bulletYellowBack; backColor = Pal.bulletYellowBack; frontColor = Pal.bulletYellow; @@ -1569,7 +1665,7 @@ public class UnitTypes implements ContentList{ }}); weapons.add(new Weapon("large-bullet-mount"){{ - reload = 80f; + reload = 60f; cooldownTime = 90f; x = 70f/4f; y = -66f/4f; @@ -1578,17 +1674,18 @@ public class UnitTypes implements ContentList{ shootY = 7f; shake = 2f; recoil = 3f; - occlusion = 12f; - ejectEffect = Fx.shellEjectBig; + shadow = 12f; + ejectEffect = Fx.casing3; + shootSound = Sounds.shootBig; shots = 3; shotDelay = 4f; inaccuracy = 1f; - bullet = new BasicBulletType(7f, 50){{ + bullet = new BasicBulletType(7f, 57){{ width = 13f; height = 19f; shootEffect = Fx.shootBig; - lifetime = 30f; + lifetime = 35f; }}; }}); }}; @@ -1597,7 +1694,7 @@ public class UnitTypes implements ContentList{ health = 22000; speed = 0.62f; drag = 0.18f; - hitSize = 50f; + hitSize = 58f; armor = 16f; accel = 0.19f; rotateSpeed = 0.9f; @@ -1623,15 +1720,16 @@ public class UnitTypes implements ContentList{ shootY = 23f; shake = 6f; recoil = 10.5f; - occlusion = 50f; + shadow = 50f; + shootSound = Sounds.railgun; shots = 1; ejectEffect = Fx.none; bullet = new RailBulletType(){{ shootEffect = Fx.railShoot; - speed = 67f; - lifetime = 8f; + length = 500; + updateEffectSeg = 60f; pierceEffect = Fx.railHit; updateEffect = Fx.railTrail; hitEffect = Fx.massiveExplosion; @@ -1642,6 +1740,483 @@ public class UnitTypes implements ContentList{ }}); }}; + //endregion + //region naval support + retusa = new UnitType("retusa"){{ + defaultController = HugAI::new; + speed = 0.9f; + targetAir = false; + drag = 0.14f; + hitSize = 11f; + health = 270; + accel = 0.4f; + rotateSpeed = 5f; + trailLength = 20; + trailX = 5f; + trailScl = 1.3f; + rotateShooting = false; + range = 100f; + + armor = 3f; + + buildSpeed = 2f; + + weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{ + x = 0f; + y = -5.5f; + shootY = 6f; + beamWidth = 0.8f; + mirror = false; + repairSpeed = 0.7f; + + bullet = new BulletType(){{ + maxRange = 120f; + }}; + }}); + + weapons.add(new Weapon(){{ + mirror = false; + reload = 80f; + shots = 3; + shotDelay = 7f; + x = y = shootX = shootY = 0f; + + bullet = new BasicBulletType(){{ + sprite = "mine-bullet"; + width = height = 11f; + layer = Layer.scorch; + shootEffect = smokeEffect = Fx.none; + + maxRange = 50f; + ignoreRotation = true; + healPercent = 4f; + + backColor = Pal.heal; + frontColor = Color.white; + mixColorTo = Color.white; + + hitSound = Sounds.plasmaboom; + + shootCone = 360f; + ejectEffect = Fx.none; + hitSize = 22f; + + collidesAir = false; + + lifetime = 500f; + + hitEffect = new MultiEffect(Fx.blastExplosion, Fx.greenCloud); + keepVelocity = false; + + shrinkX = shrinkY = 0f; + + speed = 0.001f; + + splashDamage = 50f; + splashDamageRadius = 40f; + }}; + }}); + }}; + + oxynoe = new UnitType("oxynoe"){{ + health = 560; + speed = 0.83f; + drag = 0.14f; + hitSize = 14f; + armor = 4f; + accel = 0.4f; + rotateSpeed = 4f; + rotateShooting = false; + + trailLength = 22; + trailX = 5.5f; + trailY = -4f; + trailScl = 1.9f; + + buildSpeed = 2.5f; + + weapons.add(new Weapon("plasma-mount-weapon"){{ + + reload = 5f; + x = 4.5f; + y = 6.5f; + rotate = true; + rotateSpeed = 5f; + inaccuracy = 10f; + ejectEffect = Fx.casing1; + shootSound = Sounds.flame; + shootCone = 30f; + + bullet = new BulletType(3.4f, 23f){{ + healPercent = 1.5f; + collidesTeam = true; + ammoMultiplier = 3f; + hitSize = 7f; + lifetime = 18f; + pierce = true; + collidesAir = false; + statusDuration = 60f * 4; + hitEffect = Fx.hitFlamePlasma; + ejectEffect = Fx.none; + despawnEffect = Fx.none; + status = StatusEffects.burning; + keepVelocity = false; + hittable = false; + shootEffect = new Effect(32f, 80f, e -> { + color(Color.white, Pal.heal, Color.gray, e.fin()); + + randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f); + Drawf.light(e.x + x, e.y + y, 16f * e.fout(), Pal.heal, 0.6f); + }); + }); + }}; + }}); + + weapons.add(new PointDefenseWeapon("point-defense-mount"){{ + mirror = false; + x = 0f; + y = 1f; + reload = 9f; + targetInterval = 10f; + targetSwitchInterval = 15f; + + bullet = new BulletType(){{ + shootEffect = Fx.sparkShoot; + hitEffect = Fx.pointHit; + maxRange = 100f; + damage = 15f; + }}; + }}); + + }}; + + cyerce = new UnitType("cyerce"){{ + health = 870; + speed = 0.86f; + accel = 0.22f; + rotateSpeed = 2.6f; + drag = 0.16f; + hitSize = 20f; + armor = 6f; + rotateShooting = false; + + trailLength = 23; + trailX = 9f; + trailY = -9f; + trailScl = 2f; + + buildSpeed = 3f; + + weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{ + x = 11f; + y = -10f; + shootY = 6f; + beamWidth = 0.8f; + repairSpeed = 0.7f; + + bullet = new BulletType(){{ + maxRange = 130f; + }}; + }}); + + weapons.add(new Weapon("plasma-missile-mount"){{ + reload = 60f; + x = 9f; + y = 3f; + + shadow = 5f; + + rotateSpeed = 4f; + rotate = true; + inaccuracy = 1f; + velocityRnd = 0.1f; + shootSound = Sounds.missile; + + ejectEffect = Fx.none; + bullet = new FlakBulletType(2.5f, 25){{ + sprite = "missile-large"; + collides = false; + //for targeting + collidesGround = collidesAir = true; + explodeRange = 40f; + width = height = 12f; + shrinkY = 0f; + drag = -0.003f; + homingRange = 60f; + keepVelocity = false; + lightRadius = 60f; + lightOpacity = 0.7f; + lightColor = Pal.heal; + + splashDamageRadius = 30f; + splashDamage = 28f; + + lifetime = 90f; + backColor = Pal.heal; + frontColor = Color.white; + + hitEffect = new ExplosionEffect(){{ + lifetime = 28f; + waveStroke = 6f; + waveLife = 10f; + waveRadBase = 7f; + waveColor = Pal.heal; + waveRad = 30f; + smokes = 6; + smokeColor = Color.white; + sparkColor = Pal.heal; + sparks = 6; + sparkRad = 35f; + sparkStroke = 1.5f; + sparkLen = 4f; + }}; + + weaveScale = 8f; + weaveMag = 1f; + + trailColor = Pal.heal; + trailParam = 5f; + trailInterval = 3f; + + fragBullets = 7; + fragVelocityMin = 0.3f; + + fragBullet = new MissileBulletType(3.9f, 12){{ + homingPower = 0.2f; + weaveMag = 4; + weaveScale = 4; + lifetime = 70f; + shootEffect = Fx.shootHeal; + smokeEffect = Fx.hitLaser; + splashDamage = 13f; + splashDamageRadius = 20f; + frontColor = Color.white; + hitSound = Sounds.none; + + lightColor = Pal.heal; + lightRadius = 40f; + lightOpacity = 0.7f; + + trailInterval = 2f; + trailParam = 3f; + healPercent = 2.8f; + collidesTeam = true; + backColor = Pal.heal; + trailColor = Pal.heal; + + despawnEffect = Fx.none; + hitEffect = new ExplosionEffect(){{ + lifetime = 20f; + waveStroke = 2f; + waveColor = Pal.heal; + waveRad = 12f; + smokeSize = 0f; + smokeSizeBase = 0f; + sparkColor = Pal.heal; + sparks = 9; + sparkRad = 35f; + sparkLen = 4f; + sparkStroke = 1.5f; + }}; + }}; + }}; + }}); + }}; + + aegires = new UnitType("aegires"){{ + health = 12000; + armor = 12f; + + speed = 0.7f; + drag = 0.17f; + hitSize = 44f; + accel = 0.2f; + rotateSpeed = 1.4f; + rotateShooting = false; + + //clip size is massive due to energy field + clipSize = 250f; + + trailLength = 50; + trailX = 18f; + trailY = -17f; + trailScl = 3.2f; + + buildSpeed = 3.5f; + + abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{ + repair = 35f; + statusDuration = 60f * 6f; + maxTargets = 25; + }}); + + for(float mountY : new float[]{-18f, 14}){ + weapons.add(new PointDefenseWeapon("point-defense-mount"){{ + x = 12.5f; + y = mountY; + reload = 6f; + targetInterval = 8f; + targetSwitchInterval = 8f; + + bullet = new BulletType(){{ + shootEffect = Fx.sparkShoot; + hitEffect = Fx.pointHit; + maxRange = 180f; + damage = 24f; + }}; + }}); + } + }}; + + navanax = new UnitType("navanax"){{ + health = 20000; + speed = 0.65f; + drag = 0.17f; + hitSize = 58f; + armor = 16f; + accel = 0.2f; + rotateSpeed = 1.1f; + rotateShooting = false; + + trailLength = 70; + trailX = 23f; + trailY = -32f; + trailScl = 3.5f; + + buildSpeed = 3.8f; + + for(float mountY : new float[]{-117/4f, 50/4f}){ + for(float sign : Mathf.signs){ + weapons.add(new Weapon("plasma-laser-mount"){{ + shadow = 20f; + controllable = false; + autoTarget = true; + mirror = false; + shake = 3f; + shootY = 7f; + rotate = true; + x = 84f/4f * sign; + y = mountY; + + targetInterval = 20f; + targetSwitchInterval = 35f; + + rotateSpeed = 3.5f; + reload = 170f; + recoil = 1f; + shootSound = Sounds.beam; + continuous = true; + cooldownTime = reload; + immunities.add(StatusEffects.burning); + + bullet = new ContinuousLaserBulletType(){{ + maxRange = 90f; + damage = 25f; + length = 90f; + hitEffect = Fx.hitMeltHeal; + drawSize = 200f; + lifetime = 155f; + shake = 1f; + + shootEffect = Fx.shootHeal; + smokeEffect = Fx.none; + width = 4f; + largeHit = false; + + incendChance = 0.03f; + incendSpread = 5f; + incendAmount = 1; + + healPercent = 0.4f; + collidesTeam = true; + + colors = new Color[]{Pal.heal.cpy().a(.2f), Pal.heal.cpy().a(.5f), Pal.heal.cpy().mul(1.2f), Color.white}; + }}; + }}); + } + } + + weapons.add(new Weapon("emp-cannon-mount"){{ + rotate = true; + + x = 70f/4f; + y = -26f/4f; + + reload = 70f; + shake = 3f; + rotateSpeed = 2f; + shadow = 30f; + shootY = 7f; + recoil = 4f; + cooldownTime = reload - 10f; + + bullet = new EmpBulletType(){{ + float rad = 100f; + + lightOpacity = 0.7f; + unitDamageScl = 0.8f; + healPercent = 20f; + timeIncrease = 3f; + timeDuration = 60f * 20f; + powerDamageScl = 3f; + damage = 40; + hitColor = lightColor = Pal.heal; + lightRadius = 70f; + clipSize = 250f; + shootEffect = Fx.hitEmpSpark; + smokeEffect = Fx.shootBigSmoke2; + lifetime = 60f; + sprite = "circle-bullet"; + backColor = Pal.heal; + frontColor = Color.white; + width = height = 12f; + speed = 5f; + trailLength = 20; + trailWidth = 6f; + trailColor = Pal.heal; + trailInterval = 3f; + splashDamage = 40f; + splashDamageRadius = rad; + hitShake = 4f; + trailRotation = true; + status = StatusEffects.electrified; + + trailEffect = new Effect(16f, e -> { + color(Pal.heal); + for(int s : Mathf.signs){ + Drawf.tri(e.x, e.y, 4f, 30f * e.fslope(), e.rotation + 90f*s); + } + }); + + hitEffect = new Effect(50f, 100f, e -> { + e.scaled(7f, b -> { + color(Pal.heal, b.fout()); + Fill.circle(e.x, e.y, rad); + }); + + color(Pal.heal); + stroke(e.fout() * 3f); + Lines.circle(e.x, e.y, rad); + + int points = 10; + float offset = Mathf.randomSeed(e.id, 360f); + for(int i = 0; i < points; i++){ + float angle = i* 360f / points + offset; + //for(int s : Mathf.zeroOne){ + Drawf.tri(e.x + Angles.trnsx(angle, rad), e.y + Angles.trnsy(angle, rad), 6f, 50f * e.fout(), angle/* + s*180f*/); + //} + } + + Fill.circle(e.x, e.y, 12f * e.fout()); + color(); + Fill.circle(e.x, e.y, 6f * e.fout()); + Drawf.light(e.x, e.y, rad * 1.6f, Pal.heal, e.fout()); + }); + }}; + }}); + }}; + //endregion //region core @@ -1650,31 +2225,34 @@ public class UnitTypes implements ContentList{ isCounted = false; flying = true; - mineSpeed = 6f; + mineSpeed = 6.5f; mineTier = 1; buildSpeed = 0.5f; drag = 0.05f; - speed = 2.8f; + speed = 3f; rotateSpeed = 15f; accel = 0.1f; itemCapacity = 30; - health = 120f; + health = 150f; engineOffset = 6f; hitSize = 8f; + commandLimit = 3; + alwaysUnlocked = true; weapons.add(new Weapon("small-basic-weapon"){{ reload = 17f; x = 2.75f; y = 1f; top = false; + ejectEffect = Fx.casing1; - bullet = new BasicBulletType(2.5f, 9){{ + bullet = new BasicBulletType(2.5f, 11){{ width = 7f; height = 9f; lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.09f; + buildingDamageMultiplier = 0.01f; }}; }}); }}; @@ -1688,15 +2266,16 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.75f; drag = 0.05f; - speed = 3f; + speed = 3.3f; rotateSpeed = 17f; accel = 0.1f; itemCapacity = 50; - health = 150f; + health = 170f; engineOffset = 6f; hitSize = 9f; rotateShooting = false; lowAltitude = true; + commandLimit = 4; weapons.add(new Weapon("small-mount-weapon"){{ top = false; @@ -1707,14 +2286,15 @@ public class UnitTypes implements ContentList{ shots = 2; shotDelay = 4f; spacing = 0f; + ejectEffect = Fx.casing1; - bullet = new BasicBulletType(3f, 9){{ + bullet = new BasicBulletType(3f, 11){{ width = 7f; height = 9f; lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.1f; + buildingDamageMultiplier = 0.01f; }}; }}); }}; @@ -1728,13 +2308,14 @@ public class UnitTypes implements ContentList{ mineTier = 2; buildSpeed = 1f; drag = 0.05f; - speed = 3.5f; + speed = 3.55f; rotateSpeed = 19f; accel = 0.11f; itemCapacity = 70; - health = 190f; + health = 220f; engineOffset = 6f; - hitSize = 10f; + hitSize = 11f; + commandLimit = 5; weapons.add(new Weapon("small-mount-weapon"){{ top = false; @@ -1745,14 +2326,15 @@ public class UnitTypes implements ContentList{ spacing = 2f; inaccuracy = 3f; shotDelay = 3f; + ejectEffect = Fx.casing1; - bullet = new BasicBulletType(3.5f, 9){{ + bullet = new BasicBulletType(3.5f, 11){{ width = 6.5f; height = 11f; lifetime = 70f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.1f; + buildingDamageMultiplier = 0.01f; homingPower = 0.04f; }}; }}); @@ -1768,6 +2350,7 @@ public class UnitTypes implements ContentList{ health = 1; rotateSpeed = 360f; itemCapacity = 0; + commandLimit = 0; } @Override diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index a2ffbb098f..ee89e4f82c 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -1,339 +1,121 @@ package mindustry.content; -import arc.*; import arc.graphics.*; -import arc.graphics.Texture.*; -import arc.graphics.g2d.*; -import arc.math.*; import arc.util.*; import mindustry.ctype.*; import mindustry.gen.*; import mindustry.type.*; -import mindustry.world.*; +import mindustry.type.weather.*; import mindustry.world.meta.*; -import static mindustry.Vars.*; - public class Weathers implements ContentList{ public static Weather rain, snow, sandstorm, - sporestorm; + sporestorm, + fog, + suspendParticles; @Override public void load(){ - snow = new Weather("snow"){ - TextureRegion region; - float yspeed = 2f, xspeed = 0.25f, padding = 16f, size = 12f, density = 1200f; + snow = new ParticleWeather("snow"){{ + particleRegion = "particle"; + sizeMax = 13f; + sizeMin = 2.6f; + density = 1200f; + attrs.set(Attribute.light, -0.15f); - { - attrs.set(Attribute.light, -0.15f); - } + sound = Sounds.windhowl; + soundVol = 0f; + soundVolOscMag = 1.5f; + soundVolOscScl = 1100f; + soundVolMin = 0.02f; + }}; - @Override - public void load(){ - super.load(); + rain = new RainWeather("rain"){{ + attrs.set(Attribute.light, -0.2f); + attrs.set(Attribute.water, 0.2f); + status = StatusEffects.wet; + sound = Sounds.rain; + soundVol = 0.25f; + }}; - region = Core.atlas.find("circle-shadow"); - } + sandstorm = new ParticleWeather("sandstorm"){{ + color = noiseColor = Color.valueOf("f7cba4"); + particleRegion = "particle"; + drawNoise = true; + useWindVector = true; + sizeMax = 140f; + sizeMin = 70f; + minAlpha = 0f; + maxAlpha = 0.2f; + density = 1500f; + baseSpeed = 5.4f; + attrs.set(Attribute.light, -0.1f); + attrs.set(Attribute.water, -0.1f); + opacityMultiplier = 0.35f; + force = 0.1f; + sound = Sounds.wind; + soundVol = 0.8f; + duration = 7f * Time.toMinutes; + }}; - @Override - public void drawOver(WeatherState state){ - rand.setSeed(0); - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / density * state.intensity()); + sporestorm = new ParticleWeather("sporestorm"){{ + color = noiseColor = Color.valueOf("7457ce"); + particleRegion = "circle-small"; + drawNoise = true; + statusGround = false; + useWindVector = true; + sizeMax = 5f; + sizeMin = 2.5f; + minAlpha = 0.1f; + maxAlpha = 0.8f; + density = 2000f; + baseSpeed = 4.3f; + attrs.set(Attribute.spores, 1f); + attrs.set(Attribute.light, -0.15f); + status = StatusEffects.sporeSlowed; + opacityMultiplier = 0.5f; + force = 0.1f; + sound = Sounds.wind; + soundVol = 0.7f; + duration = 7f * Time.toMinutes; + }}; - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.2f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + fog = new ParticleWeather("fog"){{ + duration = 15f * Time.toMinutes; + noiseLayers = 3; + noiseLayerSclM = 0.8f; + noiseLayerAlphaM = 0.7f; + noiseLayerSpeedM = 2f; + noiseLayerSclM = 0.6f; + baseSpeed = 0.05f; + color = noiseColor = Color.grays(0.4f); + noiseScale = 1100f; + noisePath = "fog"; + drawParticles = false; + drawNoise = true; + useWindVector = false; + xspeed = 1f; + yspeed = 0.01f; + attrs.set(Attribute.light, -0.3f); + attrs.set(Attribute.water, 0.05f); + opacityMultiplier = 0.47f; + }}; - x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.rect(region, x, y, size * sscl, size * sscl); - } - } - } - }; - - rain = new Weather("rain"){ - float yspeed = 5f, xspeed = 1.5f, padding = 16f, size = 40f, density = 1200f; - TextureRegion[] splashes = new TextureRegion[12]; - - { - attrs.set(Attribute.light, -0.2f); - attrs.set(Attribute.water, 0.2f); - status = StatusEffects.wet; - } - - @Override - public void load(){ - super.load(); - - for(int i = 0; i < splashes.length; i++){ - splashes[i] = Core.atlas.find("splash-" + i); - } - } - - @Override - public void drawOver(WeatherState state){ - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / density * state.intensity()); - Lines.stroke(0.75f); - float alpha = Draw.getColor().a; - Draw.color(Color.royal, Color.white, 0.3f); - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.2f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); - float tint = rand.random(1f) * alpha; - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.alpha(tint); - Lines.lineAngle(x, y, Angles.angle(xspeed * scl2, - yspeed * scl), size*sscl/2f); - } - } - } - - @Override - public void drawUnder(WeatherState state){ - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / density * state.intensity()) / 2; - Lines.stroke(0.75f); - - float t = Time.time() / 22f; - - for(int i = 0; i < total; i++){ - float offset = rand.random(0f, 1f); - float time = t + offset; - - int pos = (int)((time)); - float life = time % 1f; - float x = (rand.random(0f, world.unitWidth()) + pos*953); - float y = (rand.random(0f, world.unitHeight()) - pos*453); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, life * 4f).overlaps(Tmp.r2)){ - Tile tile = world.tileWorld(x, y); - - if(tile != null && tile.floor().liquidDrop == Liquids.water){ - Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.5f).a(state.opacity())); - Draw.rect(splashes[(int)(life * (splashes.length - 1))], x, y); - }else{ - Draw.color(Color.royal, Color.white, 0.3f); - Draw.alpha(Mathf.slope(life) * state.opacity()); - - float space = 45f; - for(int j : new int[]{-1, 1}){ - Tmp.v1.trns(90f + j*space, 1f + 5f * life); - Lines.lineAngle(x + Tmp.v1.x, y + Tmp.v1.y, 90f + j*space, 3f * (1f - life)); - } - } - } - } - } - }; - - sandstorm = new Weather("sandstorm"){ - TextureRegion region; - float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; - float force = 0.4f * 0; - Color color = Color.valueOf("f7cba4"); - Texture noise; - - { - attrs.set(Attribute.light, -0.1f); - opacityMultiplier = 0.8f; - } - - @Override - public void load(){ - region = Core.atlas.find("circle-shadow"); - noise = new Texture("sprites/noiseAlpha.png"); - noise.setWrap(TextureWrap.repeat); - noise.setFilter(TextureFilter.linear); - } - - @Override - public void dispose(){ - noise.dispose(); - } - - @Override - public void update(WeatherState state){ - float speed = force * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - for(Unit unit : Groups.unit){ - unit.impulse(windx, windy); - } - } - - @Override - public void drawOver(WeatherState state){ - Draw.tint(color); - float speed = baseSpeed * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - float scale = 1f / 2000f; - float scroll = Time.time() * scale; - Tmp.tr1.texture = noise; - Core.camera.bounds(Tmp.r1); - Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-windx * scroll, windy * scroll); - Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); - - rand.setSeed(0); - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / invDensity * state.intensity()); - Draw.tint(color); - float baseAlpha = Draw.getColor().a; - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); - float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); - float alpha = rand.random(0.2f); - - x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.alpha(alpha * baseAlpha); - Draw.rect(region, x, y, size * sscl, size * sscl); - } - } - } - }; - - sporestorm = new Weather("sporestorm"){ - TextureRegion region; - float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f * 0; - Color color = Color.valueOf("7457ce"); - Texture noise; - - { - attrs.set(Attribute.spores, 1f); - attrs.set(Attribute.light, -0.15f); - status = StatusEffects.sporeSlowed; - statusGround = false; - opacityMultiplier = 0.85f; - } - - @Override - public void load(){ - region = Core.atlas.find("circle-shadow"); - noise = new Texture("sprites/noiseAlpha.png"); - noise.setWrap(TextureWrap.repeat); - noise.setFilter(TextureFilter.linear); - } - - @Override - public void update(WeatherState state){ - float speed = force * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - for(Unit unit : Groups.unit){ - unit.impulse(windx, windy); - } - } - - @Override - public void dispose(){ - noise.dispose(); - } - - @Override - public void drawOver(WeatherState state){ - Draw.alpha(state.opacity * 0.8f); - Draw.tint(color); - - float speed = baseSpeed * state.intensity; - float windx = state.windVector.x * speed, windy = state.windVector.y * speed; - - float scale = 1f / 2000f; - float scroll = Time.time() * scale; - Tmp.tr1.texture = noise; - Core.camera.bounds(Tmp.r1); - Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-windx * scroll, windy * scroll); - Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); - - rand.setSeed(0); - Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); - Tmp.r1.grow(padding); - Core.camera.bounds(Tmp.r2); - int total = (int)(Tmp.r1.area() / invDensity * state.intensity()); - Draw.tint(color); - float baseAlpha = state.opacity; - Draw.alpha(baseAlpha); - - for(int i = 0; i < total; i++){ - float scl = rand.random(0.5f, 1f); - float scl2 = rand.random(0.5f, 1f); - float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); - float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); - float alpha = rand.random(0.1f, 0.8f); - - x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); - - x -= Tmp.r1.x; - y -= Tmp.r1.y; - x = Mathf.mod(x, Tmp.r1.width); - y = Mathf.mod(y, Tmp.r1.height); - x += Tmp.r1.x; - y += Tmp.r1.y; - - if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ - Draw.alpha(alpha * baseAlpha); - Fill.circle(x, y, size * sscl / 2f); - } - } - } - }; + suspendParticles = new ParticleWeather("suspend-particles"){{ + color = noiseColor = Color.valueOf("a7c1fa"); + particleRegion = "particle"; + statusGround = false; + useWindVector = true; + sizeMax = 4f; + sizeMin = 1.4f; + minAlpha = 0.5f; + maxAlpha = 1f; + density = 10000f; + baseSpeed = 0.03f; + }}; } + } diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index 56e46d8be2..e00fec3061 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -1,20 +1,21 @@ package mindustry.core; +import arc.*; import arc.files.*; -import arc.struct.*; import arc.func.*; import arc.graphics.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; +import mindustry.game.EventType.*; import mindustry.entities.bullet.*; import mindustry.mod.Mods.*; import mindustry.type.*; import mindustry.world.*; -import static arc.Core.files; -import static mindustry.Vars.mods; +import static arc.Core.*; +import static mindustry.Vars.*; /** * Loads all game content. @@ -97,10 +98,13 @@ public class ContentLoader{ /** Calls Content#init() on everything. Use only after all modules have been created.*/ public void init(){ initialize(Content::init); + if(constants != null) constants.init(); + Events.fire(new ContentInitEvent()); } /** Calls Content#load() on everything. Use only after all modules have been created on the client.*/ public void load(){ + initialize(Content::loadIcon); initialize(Content::load); } @@ -129,9 +133,9 @@ public class ContentLoader{ /** Loads block colors. */ public void loadColors(){ Pixmap pixmap = new Pixmap(files.internal("sprites/block_colors.png")); - for(int i = 0; i < pixmap.getWidth(); i++){ + for(int i = 0; i < pixmap.width; i++){ if(blocks().size > i){ - int color = pixmap.getPixel(i, 0); + int color = pixmap.get(i, 0); if(color == 0 || color == 255) continue; @@ -161,8 +165,8 @@ public class ContentLoader{ public void removeLast(){ if(lastAdded != null && contentMap[lastAdded.getContentType().ordinal()].peek() == lastAdded){ contentMap[lastAdded.getContentType().ordinal()].pop(); - if(lastAdded instanceof MappableContent){ - contentNameMap[lastAdded.getContentType().ordinal()].remove(((MappableContent)lastAdded).name); + if(lastAdded instanceof MappableContent c){ + contentNameMap[lastAdded.getContentType().ordinal()].remove(c.name); } } } @@ -275,6 +279,10 @@ public class ContentLoader{ return getByID(ContentType.bullet, id); } + public Seq statusEffects(){ + return getBy(ContentType.status); + } + public Seq sectors(){ return getBy(ContentType.sector); } @@ -283,6 +291,10 @@ public class ContentLoader{ return getBy(ContentType.unit); } + public UnitType unit(int id){ + return getByID(ContentType.unit, id); + } + public Seq planets(){ return getBy(ContentType.planet); } diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 82cb6e3ad0..bb4c1082b1 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -6,16 +6,18 @@ import arc.audio.*; import arc.graphics.g2d.*; import arc.input.*; import arc.math.*; +import arc.scene.style.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.audio.*; import mindustry.content.*; +import mindustry.content.TechTree.*; import mindustry.core.GameState.*; import mindustry.entities.*; import mindustry.game.EventType.*; +import mindustry.game.Objectives.*; import mindustry.game.*; import mindustry.game.Saves.*; import mindustry.gen.*; @@ -23,10 +25,11 @@ import mindustry.input.*; import mindustry.io.*; import mindustry.io.SaveIO.*; import mindustry.maps.Map; +import mindustry.maps.*; +import mindustry.net.*; import mindustry.type.*; import mindustry.ui.dialogs.*; import mindustry.world.*; -import mindustry.world.blocks.storage.CoreBlock.*; import java.io.*; import java.text.*; @@ -38,14 +41,13 @@ import static mindustry.Vars.*; /** * Control module. - * Handles all input, saving, keybinds and keybinds. + * Handles all input, saving and keybinds. * Should not handle any logic-critical state. * This class is not created in the headless server. */ public class Control implements ApplicationListener, Loadable{ public Saves saves; - public MusicControl music; - public Tutorial tutorial; + public SoundControl sound; public InputHandler input; private Interval timer = new Interval(2); @@ -54,15 +56,20 @@ public class Control implements ApplicationListener, Loadable{ public Control(){ saves = new Saves(); - tutorial = new Tutorial(); - music = new MusicControl(); + sound = new SoundControl(); + + //show dialog saying that mod loading was skipped. + Events.on(ClientLoadEvent.class, e -> { + if(Vars.mods.skipModLoading() && Vars.mods.list().any()){ + Time.runTask(4f, () -> { + ui.showInfo("@mods.initfailed"); + }); + } + }); 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::updateRPC); - for(Sound sound : assets.getAll(Sound.class, new Seq<>())){ - sound.stop(); - } } }); @@ -75,7 +82,7 @@ public class Control implements ApplicationListener, Loadable{ Events.on(WorldLoadEvent.class, event -> { if(Mathf.zero(player.x) && Mathf.zero(player.y)){ - Building core = state.teams.closestCore(0, 0, player.team()); + Building core = player.bestCore(); if(core != null){ player.set(core); camera.position.set(core); @@ -91,7 +98,6 @@ public class Control implements ApplicationListener, Loadable{ Events.on(ResetEvent.class, event -> { player.reset(); - tutorial.reset(); hiscore = false; saves.resetSave(); @@ -116,6 +122,10 @@ public class Control implements ApplicationListener, Loadable{ //add player when world loads regardless Events.on(WorldLoadEvent.class, e -> { player.add(); + //make player admin on any load when hosting + if(net.active() && net.server()){ + player.admin = true; + } }); //autohost for pvp maps @@ -123,7 +133,7 @@ public class Control implements ApplicationListener, Loadable{ if(state.rules.pvp && !net.active()){ try{ net.host(port); - player.admin(true); + player.admin = true; }catch(IOException e){ ui.showException("@server.error", e); state.set(State.menu); @@ -131,7 +141,25 @@ public class Control implements ApplicationListener, Loadable{ } })); - Events.on(UnlockEvent.class, e -> ui.hudfrag.showUnlock(e.content)); + Events.on(UnlockEvent.class, e -> { + if(e.content.showUnlock()){ + ui.hudfrag.showUnlock(e.content); + } + + checkAutoUnlocks(); + + if(e.content instanceof SectorPreset){ + for(TechNode node : TechTree.all){ + if(!node.content.unlocked() && node.objectives.contains(o -> o instanceof SectorComplete sec && sec.preset == e.content) && !node.objectives.contains(o -> !o.complete())){ + ui.hudfrag.showToast(new TextureRegionDrawable(node.content.uiIcon), iconLarge, bundle.get("available")); + } + } + } + }); + + Events.on(SectorCaptureEvent.class, e -> { + checkAutoUnlocks(); + }); Events.on(BlockBuildEndEvent.class, e -> { if(e.team == player.team()){ @@ -159,34 +187,44 @@ public class Control implements ApplicationListener, Loadable{ Events.on(GameOverEvent.class, e -> { if(state.isCampaign() && !net.client() && !headless){ - //delete the save, it is gone. - if(saves.getCurrent() != null && !state.rules.tutorial){ - Sector sector = state.getSector(); - sector.save = null; - saves.getCurrent().delete(); + //save gameover sate immediately + if(saves.getCurrent() != null){ + saves.getCurrent().save(); } } }); Events.run(Trigger.newGame, () -> { - Building core = player.closestCore(); + Building core = player.bestCore(); if(core == null) return; - //TODO this sounds pretty bad due to conflict - if(settings.getInt("musicvol") > 0){ - Musics.land.stop(); - Musics.land.play(); - Musics.land.setVolume(settings.getInt("musicvol") / 100f); - } + camera.position.set(core); + player.set(core); - app.post(() -> ui.hudfrag.showLand()); - renderer.zoomIn(Fx.coreLand.lifetime); - app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block)); - Time.run(Fx.coreLand.lifetime, () -> { - Fx.launch.at(core); - Effect.shake(5f, 5f, core); - }); + if(showLandAnimation){ + //TODO this sounds pretty bad due to conflict + if(settings.getInt("musicvol") > 0){ + Musics.land.stop(); + Musics.land.play(); + Musics.land.setVolume(settings.getInt("musicvol") / 100f); + } + + app.post(() -> ui.hudfrag.showLand()); + renderer.zoomIn(Fx.coreLand.lifetime); + app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block)); + + Time.run(Fx.coreLand.lifetime, () -> { + Fx.launch.at(core); + Effect.shake(5f, 5f, core); + + if(state.isCampaign()){ + ui.announce("[accent]" + state.rules.sector.name() + "\n" + + (state.rules.sector.info.resources.any() ? "[lightgray]" + bundle.get("sectors.resources") + "[white] " + + state.rules.sector.info.resources.toString(" ", u -> u.emoji()) : ""), 5); + } + }); + } }); } @@ -209,6 +247,17 @@ public class Control implements ApplicationListener, Loadable{ saves.load(); } + /** Automatically unlocks things with no requirements. */ + void checkAutoUnlocks(){ + if(net.client()) return; + + for(TechNode node : TechTree.all){ + if(!node.content.unlocked() && node.requirements.length == 0 && !node.objectives.contains(o -> !o.complete())){ + node.content.unlock(); + } + } + } + void createPlayer(){ player = Player.create(); player.name = Core.settings.getString("name"); @@ -253,59 +302,96 @@ public class Control implements ApplicationListener, Loadable{ }); } - //TODO move - public void handleLaunch(CoreBuild tile){ - LaunchCorec ent = LaunchCore.create(); - ent.set(tile); - ent.block(Blocks.coreShard); - ent.lifetime(Vars.launchDuration); - ent.add(); - - //remove schematic requirements from core - tile.items.remove(universe.getLastLoadout().requirements()); - tile.items.remove(universe.getLaunchResources()); - } - public void playSector(Sector sector){ playSector(sector, sector); } public void playSector(@Nullable Sector origin, Sector sector){ + playSector(origin, sector, new WorldReloader()); + } + + void playSector(@Nullable Sector origin, Sector sector, WorldReloader reloader){ ui.loadAnd(() -> { + if(saves.getCurrent() != null && state.isGame()){ + control.saves.getCurrent().save(); + control.saves.resetSave(); + } + ui.planet.hide(); SaveSlot slot = sector.save; sector.planet.setLastSector(sector); if(slot != null && !clearSectors){ try{ - net.reset(); + reloader.begin(); slot.load(); slot.setAutosave(true); state.rules.sector = sector; //if there is no base, simulate a new game and place the right loadout at the spawn position - //TODO this is broken? if(state.rules.defaultTeam.cores().isEmpty()){ - //kill all friendly units, since they should be dead anwyay - for(Unit unit : Groups.unit){ - if(unit.team() == state.rules.defaultTeam){ - unit.remove(); - } + //no spawn set -> delete the sector save + if(sector.info.spawnPosition == 0){ + //delete old save + sector.save = null; + slot.delete(); + //play again + playSector(origin, sector, reloader); + return; } - Tile spawn = world.tile(sector.getSpawnPosition()); - //TODO PLACE CORRECT LOADOUT - Schematics.placeLoadout(universe.getLastLoadout(), spawn.x, spawn.y); + //set spawn for sector damage to use + Tile spawn = world.tile(sector.info.spawnPosition); + spawn.setBlock(Blocks.coreShard, state.rules.defaultTeam); + + //add extra damage. + SectorDamage.apply(1f); + + //reset wave so things are more fair + state.wave = 1; + //set up default wave time + state.wavetime = state.rules.waveSpacing * (sector.preset == null ? 2f : sector.preset.startWaveTimeMultiplier); + //reset captured state + sector.info.wasCaptured = false; + //re-enable waves + state.rules.waves = true; + + //reset win wave?? + state.rules.winWave = state.rules.attackMode ? -1 : sector.preset != null && sector.preset.captureWave > 0 ? sector.preset.captureWave : state.rules.winWave > state.wave ? state.rules.winWave : 30; + + //if there's still an enemy base left, fix it + if(state.rules.attackMode){ + //replace all broken blocks + for(var plan : state.rules.waveTeam.data().blocks){ + Tile tile = world.tile(plan.x, plan.y); + if(tile != null){ + tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation); + if(plan.config != null && tile.build != null){ + tile.build.configureAny(plan.config); + } + } + } + state.rules.waveTeam.data().blocks.clear(); + } + + //kill all units, since they should be dead anyway + Groups.unit.clear(); + Groups.fire.clear(); + Groups.puddle.clear(); + + Schematics.placeLaunchLoadout(spawn.x, spawn.y); //set up camera/player locations player.set(spawn.x * tilesize, spawn.y * tilesize); camera.position.set(player); + Events.fire(new SectorLaunchEvent(sector)); Events.fire(Trigger.newGame); } state.set(State.playing); + reloader.end(); }catch(SaveException e){ Log.err(e); @@ -316,78 +402,21 @@ public class Control implements ApplicationListener, Loadable{ } ui.planet.hide(); }else{ - net.reset(); - logic.reset(); + reloader.begin(); world.loadSector(sector); state.rules.sector = sector; //assign origin when launching - state.secinfo.origin = origin; - state.secinfo.destination = origin; + sector.info.origin = origin; + sector.info.destination = origin; logic.play(); control.saves.saveSector(sector); + Events.fire(new SectorLaunchEvent(sector)); Events.fire(Trigger.newGame); + reloader.end(); } }); } - public void playTutorial(){ - ui.showInfo("@indev.notready"); - //TODO implement - //ui.showInfo("death"); - /* - Zone zone = Zones.groundZero; - ui.loadAnd(() -> { - logic.reset(); - net.reset(); - - world.beginMapLoad(); - - world.resize(zone.generator.width, zone.generator.height); - zone.generator.generate(world.tiles); - - Tile coreb = null; - - out: - for(int x = 0; x < world.width(); x++){ - for(int y = 0; y < world.height(); y++){ - if(world.rawTile(x, y).block() instanceof CoreBlock){ - coreb = world.rawTile(x, y); - break out; - } - } - } - - Geometry.circle(coreb.x, coreb.y, 10, (cx, cy) -> { - Tile tile = world.ltile(cx, cy); - if(tile != null && tile.team() == state.rules.defaultTeam && !(tile.block() instanceof CoreBlock)){ - tile.remove(); - } - }); - - Geometry.circle(coreb.x, coreb.y, 5, (cx, cy) -> world.tile(cx, cy).clearOverlay()); - - world.endMapLoad(); - - zone.rules.get(state.rules); - //TODO assign zone!! - //state.rules.zone = zone; - for(Building core : state.teams.playerCores()){ - for(ItemStack stack : zone.getStartingItems()){ - core.items.add(stack.item, stack.amount); - } - } - Building core = state.teams.playerCores().first(); - core.items.clear(); - - logic.play(); - state.rules.waveTimer = false; - state.rules.waveSpacing = 60f * 30; - state.rules.buildCostMultiplier = 0.3f; - state.rules.tutorial = true; - Events.fire(Trigger.newGame); - });*/ - } - public boolean isHighScore(){ return hiscore; } @@ -399,27 +428,29 @@ public class Control implements ApplicationListener, Loadable{ try{ SaveIO.save(control.saves.getCurrent().file); Log.info("Saved on exit."); - }catch(Throwable e){ - e.printStackTrace(); + }catch(Throwable t){ + Log.err(t); } } - content.dispose(); + for(Music music : assets.getAll(Music.class, new Seq<>())){ + music.stop(); + } + net.dispose(); - Musics.dispose(); - Sounds.dispose(); - ui.editor.dispose(); } @Override public void pause(){ - wasPaused = state.is(State.paused); - if(state.is(State.playing)) state.set(State.paused); + if(settings.getBool("backgroundpause", true)){ + wasPaused = state.is(State.paused); + if(state.is(State.playing)) state.set(State.paused); + } } @Override public void resume(){ - if(state.is(State.paused) && !wasPaused){ + if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true)){ state.set(State.playing); } } @@ -428,19 +459,6 @@ public class Control implements ApplicationListener, Loadable{ public void init(){ platform.updateRPC(); - //just a regular reminder - if(!OS.prop("user.name").equals("anuke") && !OS.hasEnv("iknowwhatimdoing")){ - app.post(() -> app.post(() -> { - ui.showStartupInfo("@indev.popup"); - })); - } - - //play tutorial on start - //TODO no tutorial right now - if(!settings.getBool("playedtutorial", false)){ - //Core.app.post(() -> Core.app.post(this::playTutorial)); - } - //display UI scale changed dialog if(Core.settings.getBool("uiscalechanged", false)){ Core.app.post(() -> Core.app.post(() -> { @@ -473,15 +491,11 @@ public class Control implements ApplicationListener, Loadable{ dialog.show(); })); } - - if(android){ - Sounds.empty.loop(0f, 1f, 0f); - } } @Override public void update(){ - //TODO find out why this happens on Android + //this happens on Android and nobody knows why if(assets == null) return; saves.update(); @@ -494,8 +508,7 @@ public class Control implements ApplicationListener, Loadable{ input.updateState(); - music.update(); - loops.update(); + sound.update(); if(Core.input.keyTap(Binding.fullscreen)){ boolean full = settings.getBool("fullscreen"); @@ -507,18 +520,27 @@ public class Control implements ApplicationListener, Loadable{ settings.put("fullscreen", !full); } + if(Float.isNaN(Vars.player.x) || Float.isNaN(Vars.player.y)){ + player.set(0, 0); + if(!player.dead()) player.unit().kill(); + } + if(Float.isNaN(camera.position.x)) camera.position.x = world.unitWidth()/2f; + if(Float.isNaN(camera.position.y)) camera.position.y = world.unitHeight()/2f; + if(state.isGame()){ input.update(); - if(state.rules.tutorial){ - tutorial.update(); - } - //auto-update rpc every 5 seconds if(timer.get(0, 60 * 5)){ platform.updateRPC(); } + //unlock core items + var core = state.rules.defaultTeam.core(); + if(!net.client() && core != null && state.isCampaign()){ + core.items.each((i, a) -> i.unlock()); + } + if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.is(State.playing) ? State.paused : State.playing); } diff --git a/core/src/mindustry/core/FileTree.java b/core/src/mindustry/core/FileTree.java index f94c75eeb7..d9ca5694c1 100644 --- a/core/src/mindustry/core/FileTree.java +++ b/core/src/mindustry/core/FileTree.java @@ -2,8 +2,8 @@ package mindustry.core; import arc.*; import arc.assets.loaders.*; -import arc.struct.*; import arc.files.*; +import arc.struct.*; /** Handles files in a modded context. */ public class FileTree implements FileHandleResolver{ diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 833a4b7cc1..33050b996e 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -1,7 +1,7 @@ package mindustry.core; import arc.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; @@ -17,17 +17,17 @@ public class GameState{ /** Wave countdown in ticks. */ public float wavetime; /** Whether the game is in game over state. */ - public boolean gameOver = false, serverPaused = false, wasTimeout; + public boolean gameOver = false, serverPaused = false; + /** Server ticks/second. Only valid in multiplayer. */ + public int serverTps = -1; /** Map that is currently being played on. */ public Map map = emptyMap; /** The current game rules. */ public Rules rules = new Rules(); /** Statistics for this save/game. Displayed after game over. */ - public Stats stats = new Stats(); + public GameStats stats = new GameStats(); /** Global attributes of the environment, calculated by weather. */ public Attributes envAttrs = new Attributes(); - /** Sector information. Only valid in the campaign. */ - public SectorInfo secinfo = new SectorInfo(); /** Team data. Gets reset every new game. */ public Teams teams = new Teams(); /** Number of enemies in the game; only used clientside in servers. */ @@ -35,16 +35,23 @@ public class GameState{ /** Current game state. */ private State state = State.menu; - //TODO optimize + @Nullable public Unit boss(){ - return Groups.unit.find(u -> u.isBoss() && u.team == rules.waveTeam); + return teams.bosses.firstOpt(); } public void set(State astate){ + //cannot pause when in multiplayer + if(astate == State.paused && net.active()) return; + Events.fire(new StateChangeEvent(state, astate)); state = astate; } + public boolean hasSpawns(){ + return rules.waves && !(isCampaign() && rules.attackMode); + } + /** Note that being in a campaign does not necessarily mean having a sector. */ public boolean isCampaign(){ return rules.sector != null; @@ -64,11 +71,11 @@ public class GameState{ } public boolean isPaused(){ - return (is(State.paused) && !net.active()) || (gameOver && !net.active()) || (serverPaused && !isMenu()); + return (is(State.paused) && !net.active()) || (gameOver && (!net.active() || isCampaign())) || (serverPaused && !isMenu()); } public boolean isPlaying(){ - return state == State.playing; + return (state == State.playing) || (state == State.paused && !isPaused()); } /** @return whether the current state is *not* the menu. */ diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index e03771843a..cd9c86810b 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -5,6 +5,7 @@ import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.core.GameState.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; @@ -13,8 +14,6 @@ import mindustry.maps.*; import mindustry.type.*; import mindustry.type.Weather.*; import mindustry.world.*; -import mindustry.world.blocks.*; -import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.storage.CoreBlock.*; import java.util.*; @@ -36,36 +35,10 @@ public class Logic implements ApplicationListener{ Events.on(BlockDestroyEvent.class, event -> { //blocks that get broken are appended to the team's broken block queue Tile tile = event.tile; - Block block = tile.block(); - //skip null entities or un-rebuildables, for obvious reasons; also skip client since they can't modify these requests - if(tile.build == null || !tile.block().rebuildable || net.client()) return; + //skip null entities or un-rebuildables, for obvious reasons + if(tile.build == null || !tile.block().rebuildable) return; - if(block instanceof ConstructBlock){ - - ConstructBuild entity = tile.bc(); - - //update block to reflect the fact that something was being constructed - if(entity.cblock != null && entity.cblock.synthetic()){ - block = entity.cblock; - }else{ - //otherwise this was a deconstruction that was interrupted, don't want to rebuild that - return; - } - } - - TeamData data = state.teams.get(tile.team()); - - //remove existing blocks that have been placed here. - //painful O(n) iteration + copy - for(int i = 0; i < data.blocks.size; i++){ - BlockPlan b = data.blocks.get(i); - if(b.x == tile.x && b.y == tile.y){ - data.blocks.removeIndex(i); - break; - } - } - - data.blocks.addFirst(new BlockPlan(tile.x, tile.y, (short)tile.build.rotation, block.id, tile.build.config())); + tile.build.addPlan(true); }); Events.on(BlockBuildEndEvent.class, event -> { @@ -82,51 +55,113 @@ public class Logic implements ApplicationListener{ } }); - Events.on(LaunchItemEvent.class, e -> state.secinfo.handleItemExport(e.stack)); - //when loading a 'damaged' sector, propagate the damage - Events.on(WorldLoadEvent.class, e -> { + Events.on(SaveLoadEvent.class, e -> { if(state.isCampaign()){ - long seconds = state.rules.sector.getSecondsPassed(); - CoreBuild core = state.rules.defaultTeam.core(); + state.rules.coreIncinerates = true; - //apply fractional damage based on how many turns have passed for this sector - float turnsPassed = seconds / (turnDuration / 60f); + SectorInfo info = state.rules.sector.info; + info.write(); - if(state.rules.sector.hasWaves() && turnsPassed > 0 && state.rules.sector.hasBase()){ - SectorDamage.apply(turnsPassed / sectorDestructionTurns); + //how much wave time has passed + int wavesPassed = info.wavesPassed; + + //wave has passed, remove all enemies, they are assumed to be dead + if(wavesPassed > 0){ + Groups.unit.each(u -> { + if(u.team == state.rules.waveTeam){ + u.remove(); + } + }); } - //add resources based on turns passed - if(state.rules.sector.save != null && core != null){ - //update correct storage capacity - state.rules.sector.save.meta.secinfo.storageCapacity = core.storageCapacity; + //simulate passing of waves + if(wavesPassed > 0){ + //simulate wave counter moving forward + state.wave += wavesPassed; + state.wavetime = state.rules.waveSpacing; - //add new items received - state.rules.sector.calculateReceivedItems().each((item, amount) -> core.items.add(item, amount)); - - //clear received items - state.rules.sector.setExtraItems(new ItemSeq()); - - //validation - for(Item item : content.items()){ - //ensure positive items - if(core.items.get(item) < 0) core.items.set(item, 0); - //cap the items - if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity); - } + SectorDamage.applyCalculatedDamage(); } - state.rules.sector.setSecondsPassed(0); + //reset values + info.damage = 0f; + info.wavesPassed = 0; + info.hasCore = true; + info.secondsPassed = 0; + + state.rules.sector.saveInfo(); } + }); + Events.on(WorldLoadEvent.class, e -> { //enable infinite ammo for wave team by default state.rules.waveTeam.rules().infiniteAmmo = true; + if(state.isCampaign()){ + //enable building AI on campaign unless the preset disables it + if(!(state.getSector().preset != null && !state.getSector().preset.useAI)){ + state.rules.waveTeam.rules().ai = true; + } + state.rules.coreIncinerates = true; + state.rules.waveTeam.rules().aiTier = state.getSector().threat * 0.8f; + state.rules.waveTeam.rules().infiniteResources = true; + + //fill enemy cores by default. + for(var core : state.rules.waveTeam.cores()){ + for(Item item : content.items()){ + core.items.set(item, core.block.itemCapacity); + } + } + } + //save settings Core.settings.manualSave(); }); + //sync research + Events.on(UnlockEvent.class, e -> { + if(net.server()){ + Call.researched(e.content); + } + }); + + Events.on(SectorCaptureEvent.class, e -> { + if(!net.client() && e.sector == state.getSector() && e.sector.isBeingPlayed()){ + for(Tile tile : world.tiles){ + //convert all blocks to neutral, randomly killing them + if(tile.isCenter() && tile.build != null && tile.build.team == state.rules.waveTeam){ + Building b = tile.build; + Call.setTeam(b, Team.derelict); + Time.run(Mathf.random(0f, 60f * 6f), () -> { + if(Mathf.chance(0.25)){ + b.kill(); + } + }); + } + } + + //kill all units + Groups.unit.each(u -> { + if(u.team == state.rules.waveTeam){ + Time.run(Mathf.random(0f, 60f * 5f), u::kill); + } + }); + } + }); + + //send out items to each client + Events.on(TurnEvent.class, e -> { + if(net.server() && state.isCampaign()){ + int[] out = new int[content.items().size]; + state.getSector().info.production.each((item, stat) -> { + out[item.id] = Math.max(0, (int)(stat.mean * turnDuration / 60)); + }); + + Call.sectorProduced(out); + } + }); + } /** Adds starting items, resets wave time, and sets state to playing. */ @@ -140,10 +175,11 @@ public class Logic implements ApplicationListener{ if(!state.isCampaign()){ for(TeamData team : state.teams.getActive()){ if(team.hasCore()){ - Building entity = team.core(); + CoreBuild entity = team.core(); entity.items.clear(); for(ItemStack stack : state.rules.loadout){ - entity.items.add(stack.item, stack.amount); + //make sure to cap storage + entity.items.add(stack.item, Math.min(stack.amount, entity.storageCapacity - entity.items.get(stack.item))); } } } @@ -166,12 +202,7 @@ public class Logic implements ApplicationListener{ } public void skipWave(){ - if(state.isCampaign()){ - //warp time spent forward because the wave was just skipped. - state.secinfo.internalTimeSpent += state.wavetime; - } - - state.wavetime = 0; + runWave(); } public void runWave(){ @@ -198,36 +229,23 @@ public class Logic implements ApplicationListener{ } //if there's a "win" wave and no enemies are present, win automatically - if(state.rules.waves && state.enemies == 0 && state.rules.winWave > 0 && state.wave >= state.rules.winWave && !spawner.isSpawning()){ - //the sector has been conquered - waves get disabled - state.rules.waves = false; + if(state.rules.waves && (state.enemies == 0 && state.rules.winWave > 0 && state.wave >= state.rules.winWave && !spawner.isSpawning()) || + (state.rules.attackMode && state.rules.waveTeam.cores().isEmpty())){ - //fire capture event - Events.fire(new SectorCaptureEvent(state.rules.sector)); - - //save, just in case - if(!headless){ - control.saves.saveSector(state.rules.sector); - } + Call.sectorCapture(); } }else{ if(!state.rules.attackMode && state.teams.playerCores().size == 0 && !state.gameOver){ state.gameOver = true; Events.fire(new GameOverEvent(state.rules.waveTeam)); }else if(state.rules.attackMode){ - Team alive = null; + //count # of teams alive + int countAlive = state.teams.getActive().count(TeamData::hasCore); - for(TeamData team : state.teams.getActive()){ - if(team.hasCore()){ - if(alive != null){ - return; - } - alive = team.team; - } - } - - if(alive != null && !state.gameOver){ - Events.fire(new GameOverEvent(alive)); + if((countAlive <= 1 || (!state.rules.pvp && state.rules.defaultTeam.core() == null)) && !state.gameOver){ + //find team that won + TeamData left = state.teams.getActive().find(TeamData::hasCore); + Events.fire(new GameOverEvent(left == null ? Team.derelict : left.team)); state.gameOver = true; } } @@ -235,14 +253,15 @@ public class Logic implements ApplicationListener{ } private void updateWeather(){ + state.rules.weather.removeAll(w -> w.weather == null); for(WeatherEntry entry : state.rules.weather){ //update cooldown entry.cooldown -= Time.delta; //create new event when not active - if(entry.cooldown < 0 && !entry.weather.isActive()){ - float duration = Mathf.random(entry.minDuration, entry.maxDuration); + if((entry.cooldown < 0 || entry.always) && !entry.weather.isActive()){ + float duration = entry.always ? Float.POSITIVE_INFINITY : Mathf.random(entry.minDuration, entry.maxDuration); entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency); Tmp.v1.setToRandomDirection(); Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y); @@ -250,6 +269,31 @@ public class Logic implements ApplicationListener{ } } + @Remote(called = Loc.server) + public static void sectorCapture(){ + //the sector has been conquered - waves get disabled + state.rules.waves = false; + + if(state.rules.sector == null){ + //disable attack mode + state.rules.attackMode = false; + return; + } + + state.rules.sector.info.wasCaptured = true; + + //fire capture event + Events.fire(new SectorCaptureEvent(state.rules.sector)); + + //disable attack mode + state.rules.attackMode = false; + + //save, just in case + if(!headless && !net.client()){ + control.saves.saveSector(state.rules.sector); + } + } + @Remote(called = Loc.both) public static void updateGameOver(Team winner){ state.gameOver = true; @@ -262,6 +306,53 @@ public class Logic implements ApplicationListener{ netClient.setQuiet(); } + //called when the remote server researches something + @Remote + public static void researched(Content content){ + if(!(content instanceof UnlockableContent u)) return; + + var node = u.node(); + + //unlock all direct dependencies on client, permanently + while(node != null){ + node.content.unlock(); + node = node.parent; + } + + state.rules.researched.add(u.name); + } + + //called when the remote server runs a turn and produces something + @Remote + public static void sectorProduced(int[] amounts){ + if(!state.isCampaign()) return; + Planet planet = state.rules.sector.planet; + boolean any = false; + + for(Item item : content.items()){ + int am = amounts[item.id]; + if(am > 0){ + int sumMissing = planet.sectors.sum(s -> s.hasBase() ? s.info.storageCapacity - s.info.items.get(item) : 0); + if(sumMissing == 0) continue; + //how much % to add + double percent = Math.min((double)am / sumMissing, 1); + for(Sector sec : planet.sectors){ + if(sec.hasBase()){ + int added = (int)Math.ceil(((sec.info.storageCapacity - sec.info.items.get(item)) * percent)); + sec.info.items.add(item, added); + any = true; + } + } + } + } + + if(any){ + for(Sector sec : planet.sectors){ + sec.saveInfo(); + } + } + } + @Override public void dispose(){ //save the settings before quitting @@ -279,12 +370,14 @@ public class Logic implements ApplicationListener{ if(state.isGame()){ if(!net.client()){ - state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.type().isCounted); + state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.isCounted()); } if(!state.isPaused()){ + state.teams.updateTeamStats(); + if(state.isCampaign()){ - state.secinfo.update(); + state.rules.sector.info.update(); } if(state.isCampaign()){ @@ -293,7 +386,7 @@ public class Logic implements ApplicationListener{ Time.update(); //weather is serverside - if(!net.client()){ + if(!net.client() && !state.isEditor()){ updateWeather(); for(TeamData data : state.teams.getActive()){ @@ -315,6 +408,7 @@ public class Logic implements ApplicationListener{ //apply weather attributes state.envAttrs.clear(); + state.envAttrs.add(state.rules.attributes); Groups.weather.each(w -> state.envAttrs.add(w.weather.attrs, w.opacity)); Groups.update(); @@ -330,5 +424,4 @@ public class Logic implements ApplicationListener{ public boolean isWaitingWave(){ return (state.rules.waitEnemies || (state.wave >= state.rules.winWave && state.rules.winWave > 0)) && state.enemies > 0; } - } diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index ae8c7d9a7c..e1ac7f97f1 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -16,23 +16,25 @@ import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.net.Administration.*; -import mindustry.net.Net.*; import mindustry.net.*; import mindustry.net.Packets.*; +import mindustry.ui.*; import mindustry.world.*; import mindustry.world.modules.*; import java.io.*; +import java.util.*; import java.util.zip.*; import static mindustry.Vars.*; public class NetClient implements ApplicationListener{ - private static final float dataTimeout = 60 * 18; - private static final float playerSyncTime = 2; - public final static float viewScale = 2f; + private static final float dataTimeout = 60 * 20; + private static final float playerSyncTime = 5; + private static final Reads dataReads = new Reads(null); private long ping; private Interval timer = new Interval(5); @@ -40,7 +42,7 @@ public class NetClient implements ApplicationListener{ private boolean connecting = false; /** If true, no message will be shown on disconnect. */ private boolean quiet = false; - /** Whether to supress disconnect events completely.*/ + /** Whether to suppress disconnect events completely.*/ private boolean quietReset = false; /** Counter for data timeout. */ private float timeoutTime = 0f; @@ -60,10 +62,17 @@ public class NetClient implements ApplicationListener{ net.handleClient(Connect.class, packet -> { Log.info("Connecting to server: @", packet.addressTCP); - player.admin(false); + player.admin = false; reset(); + //connection after reset + if(!net.client()){ + Log.info("Connection canceled."); + disconnectQuietly(); + return; + } + ui.loadfrag.hide(); ui.loadfrag.show("@connecting.data"); @@ -72,12 +81,18 @@ public class NetClient implements ApplicationListener{ disconnectQuietly(); }); - ConnectPacket c = new ConnectPacket(); + String locale = Core.settings.getString("locale"); + if(locale.equals("default")){ + locale = Locale.getDefault().toString(); + } + + var c = new ConnectPacket(); c.name = player.name; + c.locale = locale; c.mods = mods.getModStrings(); c.mobile = mobile; c.versionType = Version.type; - c.color = player.color().rgba(); + c.color = player.color.rgba(); c.usid = getUsid(packet.addressTCP); c.uuid = platform.getUUID(); @@ -88,7 +103,7 @@ public class NetClient implements ApplicationListener{ return; } - net.send(c, SendMode.tcp); + net.send(c, true); }); net.handleClient(Disconnect.class, packet -> { @@ -97,19 +112,19 @@ public class NetClient implements ApplicationListener{ connecting = false; logic.reset(); platform.updateRPC(); - player.name(Core.settings.getString("name")); - player.color().set(Core.settings.getInt("color-0")); + player.name = Core.settings.getString("name"); + player.color.set(Core.settings.getInt("color-0")); if(quiet) return; Time.runTask(3f, ui.loadfrag::hide); if(packet.reason != null){ - switch(packet.reason){ - case "closed" -> ui.showSmall("@disconnect", "@disconnect.closed"); - case "timeout" -> ui.showSmall("@disconnect", "@disconnect.timeout"); - case "error" -> ui.showSmall("@disconnect", "@disconnect.error"); - } + ui.showSmall(switch(packet.reason){ + case "closed" -> "@disconnect.closed"; + case "timeout" -> "@disconnect.timeout"; + default -> "@disconnect.error"; + }, "@disconnect.closed"); }else{ ui.showErrorMessage("@disconnect"); } @@ -121,10 +136,6 @@ public class NetClient implements ApplicationListener{ finishConnecting(); }); - - net.handleClient(InvokePacket.class, packet -> { - RemoteReadClient.readPacket(packet.reader(), packet.type); - }); } public void addPacketHandler(String type, Cons handler){ @@ -173,35 +184,43 @@ public class NetClient implements ApplicationListener{ //called when a server receives a chat message from a player @Remote(called = Loc.server, targets = Loc.client) public static void sendChatMessage(Player player, String message){ + + //do not receive chat messages from clients that are too young or not registered + if(net.server() && player != null && player.con != null && (Time.timeSinceMillis(player.con.connectTime) < 500 || !player.con.hasConnected || !player.isAdded())) return; + if(message.length() > maxTextLength){ throw new ValidateException(player, "Player has sent a message above the text limit."); } Events.fire(new PlayerChatEvent(player, message)); + //log commands before they are handled + if(message.startsWith(netServer.clientCommands.getPrefix())){ + //log with brackets + Log.info("<&fi@: @&fr>", "&lk" + player.name, "&lw" + message); + } + //check if it's a command CommandResponse response = netServer.clientCommands.handleMessage(message, player); if(response.type == ResponseType.noCommand){ //no command to handle message = netServer.admins.filterMessage(player, message); - //supress chat message if it's filtered out + //suppress chat message if it's filtered out if(message == null){ return; } //special case; graphical server needs to see its message if(!headless){ - sendMessage(message, colorizeName(player.id(), player.name), player); + sendMessage(message, colorizeName(player.id, player.name), player); } //server console logging - Log.info("&y@: &lb@", player.name, message); + Log.info("&fi@: @", "&lc" + player.name, "&lw" + 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); }else{ - //log command to console but with brackets - Log.info("<&y@: &lm@&lg>", player.name, message); //a command was sent, now get the output if(response.type != ResponseType.valid){ @@ -213,7 +232,22 @@ public class NetClient implements ApplicationListener{ }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]."; + int minDst = 0; + Command closest = null; + + for(Command command : netServer.clientCommands.getCommandList()){ + int dst = Strings.levenshtein(command.text, response.runCommand); + if(dst < 3 && (closest == null || dst < minDst)){ + minDst = dst; + closest = command; + } + } + + if(closest != null){ + text = "[scarlet]Unknown command. Did you mean \"[lightgray]" + closest.text + "[]\"?"; + }else{ + text = "[scarlet]Unknown command. Check [lightgray]/help[scarlet]."; + } } player.sendMessage(text); @@ -234,7 +268,7 @@ public class NetClient implements ApplicationListener{ ui.join.connect(ip, port); } - + @Remote(targets = Loc.client) public static void ping(Player player, long time){ Call.pingResponse(player.con, time); @@ -257,6 +291,11 @@ public class NetClient implements ApplicationListener{ netClient.disconnectQuietly(); logic.reset(); + if(reason == KickReason.serverRestarting){ + ui.join.reconnect(); + return; + } + if(!reason.quiet){ if(reason.extraText() != null){ ui.showText(reason.toString(), reason.extraText()); @@ -293,6 +332,13 @@ public class NetClient implements ApplicationListener{ setHudText(message); } + @Remote(variants = Variant.both) + public static void announce(String message){ + if(message == null) return; + + ui.announce(message); + } + @Remote(variants = Variant.both) public static void infoMessage(String message){ if(message == null) return; @@ -315,15 +361,15 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.both, unreliable = true) - public static void onEffect(Effect effect, float x, float y, float rotation, Color color){ + public static void effect(Effect effect, float x, float y, float rotation, Color color){ if(effect == null) return; effect.at(x, y, rotation, color); } @Remote(variants = Variant.both) - public static void onEffectReliable(Effect effect, float x, float y, float rotation, Color color){ - onEffect(effect, x, y, rotation, color); + public static void effectReliable(Effect effect, float x, float y, float rotation, Color color){ + effect(effect, x, y, rotation, color); } @Remote(variants = Variant.both) @@ -333,6 +379,13 @@ public class NetClient implements ApplicationListener{ ui.showInfoToast(message, duration); } + @Remote(variants = Variant.both) + public static void warningToast(int unicode, String text){ + if(text == null || Fonts.icon.getData().getGlyph((char)unicode) == null) return; + + ui.hudfrag.showToast(Fonts.getGlyph(Fonts.icon, (char)unicode), text); + } + @Remote(variants = Variant.both) public static void setRules(Rules rules){ state.rules = rules; @@ -371,12 +424,11 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void entitySnapshot(short amount, short dataLen, byte[] data){ + public static void entitySnapshot(short amount, byte[] data){ try{ - netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen)); + netClient.byteStream.setBytes(data); DataInputStream input = netClient.dataStream; - //go through each entity for(int j = 0; j < amount; j++){ int id = input.readInt(); byte typeID = input.readByte(); @@ -418,27 +470,32 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.both, priority = PacketPriority.low, unreliable = true) - public static void blockSnapshot(short amount, short dataLen, byte[] data){ + public static void blockSnapshot(short amount, byte[] data){ try{ - netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen)); + netClient.byteStream.setBytes(data); DataInputStream input = netClient.dataStream; for(int i = 0; i < amount; i++){ int pos = input.readInt(); + short block = input.readShort(); Tile tile = world.tile(pos); if(tile == null || tile.build == null){ Log.warn("Missing entity at @. Skipping block snapshot.", tile); break; } + if(tile.build.block.id != block){ + Log.warn("Block ID mismatch at @: @ != @. Skipping block snapshot.", tile, tile.build.block.id, block); + break; + } tile.build.readAll(Reads.get(input), tile.build.version()); } }catch(Exception e){ - e.printStackTrace(); + Log.err(e); } } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, int timeData, short coreDataLen, byte[] coreData){ + public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, int timeData, byte tps, byte[] coreData){ try{ if(wave > state.wave){ state.wave = wave; @@ -450,21 +507,22 @@ public class NetClient implements ApplicationListener{ state.wave = wave; state.enemies = enemies; state.serverPaused = paused; + state.serverTps = tps & 0xff; universe.updateNetSeconds(timeData); - netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen)); + netClient.byteStream.setBytes(coreData); DataInputStream input = netClient.dataStream; + dataReads.input = input; - byte cores = input.readByte(); - for(int i = 0; i < cores; i++){ - int pos = input.readInt(); - Tile tile = world.tile(pos); - - if(tile != null && tile.build != null){ - tile.build.items.read(Reads.get(input)); + int teams = input.readUnsignedByte(); + for(int i = 0; i < teams; i++){ + int team = input.readUnsignedByte(); + TeamData data = state.teams.get(Team.all[team]); + if(data.cores.any()){ + data.cores.first().items.read(dataReads); }else{ - new ItemModule().read(Reads.get(input)); + new ItemModule().read(dataReads); } } @@ -564,19 +622,19 @@ public class NetClient implements ApplicationListener{ BuildPlan[] requests = null; if(player.isBuilder()){ //limit to 10 to prevent buffer overflows - int usedRequests = Math.min(player.builder().plans().size, 10); + int usedRequests = Math.min(player.unit().plans().size, 10); int totalLength = 0; //prevent buffer overflow by checking config length for(int i = 0; i < usedRequests; i++){ - BuildPlan plan = player.builder().plans().get(i); - if(plan.config instanceof byte[]){ - int length = ((byte[])plan.config).length; + BuildPlan plan = player.unit().plans().get(i); + if(plan.config instanceof byte[] b){ + int length = b.length; totalLength += length; } - if(totalLength > 2048){ + if(totalLength > 1024){ usedRequests = i + 1; break; } @@ -584,7 +642,7 @@ public class NetClient implements ApplicationListener{ requests = new BuildPlan[usedRequests]; for(int i = 0; i < usedRequests; i++){ - requests[i] = player.builder().plans().get(i); + requests[i] = player.unit().plans().get(i); } } @@ -595,16 +653,16 @@ public class NetClient implements ApplicationListener{ lastSent++, uid, player.dead(), - unit.x, unit.y, + player.dead() ? player.x : unit.x, player.dead() ? player.y : unit.y, player.unit().aimX(), player.unit().aimY(), unit.rotation, - unit instanceof Mechc ? ((Mechc)unit).baseRotation() : 0, + unit instanceof Mechc m ? m.baseRotation() : 0, unit.vel.x, unit.vel.y, - player.miner().mineTile(), + player.unit().mineTile, player.boosting, player.shooting, ui.chatfrag.shown(), control.input.isBuilding, requests, Core.camera.position.x, Core.camera.position.y, - Core.camera.width * viewScale, Core.camera.height * viewScale + Core.camera.width, Core.camera.height ); } diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 9b298f9924..dbdb804e75 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -7,7 +7,6 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.CommandHandler.*; import arc.util.io.*; import arc.util.serialization.*; @@ -19,11 +18,11 @@ import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.net.*; import mindustry.net.Administration.*; import mindustry.net.Packets.*; import mindustry.world.*; -import mindustry.world.blocks.storage.CoreBlock.*; import java.io.*; import java.net.*; @@ -35,13 +34,13 @@ import static mindustry.Vars.*; public class NetServer implements ApplicationListener{ /** note that snapshots are compressed, so the max snapshot size here is above the typical UDP safe limit */ - private static final int maxSnapshotSize = 800, timerBlockSync = 0; - private static final float serverSyncTime = 12, blockSyncTime = 60 * 6; + private static final int maxSnapshotSize = 800, timerBlockSync = 0, serverSyncTime = 200; + private static final float blockSyncTime = 60 * 6; private static final FloatBuffer fbuffer = FloatBuffer.allocate(20); + private static final Writes dataWrites = new Writes(null); private static final Vec2 vector = new Vec2(); - private static final Rect viewport = new Rect(); /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ - private static final float correctDist = 16f; + private static final float correctDist = tilesize * 14f; public final Administration admins = new Administration(); public final CommandHandler clientCommands = new CommandHandler("/"); @@ -81,6 +80,8 @@ public class NetServer implements ApplicationListener{ public NetServer(){ net.handleServer(Connect.class, (con, connect) -> { + Events.fire(new ConnectionEvent(con)); + if(admins.isIPBanned(connect.addressTCP) || admins.isSubnetBanned(connect.addressTCP)){ con.kick(KickReason.banned); } @@ -93,18 +94,23 @@ public class NetServer implements ApplicationListener{ }); net.handleServer(ConnectPacket.class, (con, packet) -> { + if(con.kicked) return; + if(con.address.startsWith("steam:")){ packet.uuid = con.address.substring("steam:".length()); } + Events.fire(new ConnectPacketEvent(con, packet)); + + con.connectTime = Time.millis(); + String uuid = packet.uuid; byte[] buuid = Base64Coder.decode(uuid); CRC32 crc = new CRC32(); crc.update(buuid, 0, 8); ByteBuffer buff = ByteBuffer.allocate(8); buff.put(buuid, 8, 8); - buff.position(0); - if(crc.getValue() != buff.getLong()){ + if(crc.getValue() != buff.getLong(0)){ con.kick(KickReason.clientOutdated); return; } @@ -155,7 +161,7 @@ public class NetServer implements ApplicationListener{ if(!extraMods.isEmpty()){ result.append("Unnecessary mods:[lightgray]\n").append("> ").append(extraMods.toString("\n> ")); } - con.kick(result.toString()); + con.kick(result.toString(), 0); } if(!admins.isWhitelisted(packet.uuid, packet.usid)){ @@ -164,7 +170,7 @@ public class NetServer implements ApplicationListener{ info.id = packet.uuid; admins.save(); Call.infoMessage(con, "You are not whitelisted here."); - Log.info("&lcDo &lywhitelist-add @&lc to whitelist the player &lb'@'", packet.uuid, packet.name); + info("&lcDo &lywhitelist-add @&lc to whitelist the player &lb'@'", packet.uuid, packet.name); con.kick(KickReason.whitelist); return; } @@ -177,7 +183,7 @@ public class NetServer implements ApplicationListener{ boolean preventDuplicates = headless && netServer.admins.isStrict(); if(preventDuplicates){ - if(Groups.player.contains(p -> p.name.trim().equalsIgnoreCase(packet.name.trim()))){ + if(Groups.player.contains(p -> Strings.stripColors(p.name).trim().equalsIgnoreCase(Strings.stripColors(packet.name).trim()))){ con.kick(KickReason.nameInUse); return; } @@ -195,6 +201,10 @@ public class NetServer implements ApplicationListener{ return; } + if(packet.locale == null){ + packet.locale = "en"; + } + String ip = con.address; admins.updatePlayerJoined(uuid, ip, packet.name); @@ -215,6 +225,7 @@ public class NetServer implements ApplicationListener{ player.con.uuid = uuid; player.con.mobile = packet.mobile; player.name = packet.name; + player.locale = packet.locale; player.color.set(packet.color).a(1f); //save admin ID but don't overwrite it @@ -226,8 +237,8 @@ public class NetServer implements ApplicationListener{ writeBuffer.reset(); player.write(outputBuffer); }catch(Throwable t){ - t.printStackTrace(); con.kick(KickReason.nameEmpty); + err(t); return; } @@ -243,22 +254,6 @@ public class NetServer implements ApplicationListener{ Events.fire(new PlayerConnect(player)); }); - net.handleServer(InvokePacket.class, (con, packet) -> { - if(con.player == null) return; - try{ - RemoteReadServer.readPacket(packet.reader(), packet.type, con.player); - }catch(ValidateException e){ - Log.debug("Validation failed for '@': @", e.player, e.getMessage()); - }catch(RuntimeException e){ - if(e.getCause() instanceof ValidateException){ - ValidateException v = (ValidateException)e.getCause(); - Log.debug("Validation failed for '@': @", v.player, v.getMessage()); - }else{ - throw e; - } - } - }); - registerCommands(); } @@ -285,7 +280,7 @@ public class NetServer implements ApplicationListener{ } StringBuilder result = new StringBuilder(); - result.append(Strings.format("[orange]-- Commands Page[lightgray] @[gray]/[lightgray]@[orange] --\n\n", (page+1), pages)); + result.append(Strings.format("[orange]-- Commands Page[lightgray] @[gray]/[lightgray]@[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); @@ -301,6 +296,15 @@ public class NetServer implements ApplicationListener{ } }); + clientCommands.register("a", "", "Send a message only to admins.", (args, player) -> { + if(!player.admin){ + player.sendMessage("[scarlet]You must be admin to use this command."); + return; + } + + Groups.player.each(Player::admin, a -> a.sendMessage(args[0], player, "[#" + Pal.adminChat.toString() + "]" + NetClient.colorizeName(player.id, player.name))); + }); + //duration of a a kick in seconds int kickDuration = 60 * 60; //voting round duration in seconds @@ -331,16 +335,16 @@ public class NetServer implements ApplicationListener{ votes += d; voted.addAll(player.uuid(), admins.getInfo(player.uuid()).lastIP); - Call.sendMessage(Strings.format("[lightgray]A player has voted on kicking[orange] @[].[accent] (@/@)\n[lightgray]Type[orange] /vote [] to agree.", - target.name, votes, votesRequired())); + Call.sendMessage(Strings.format("[lightgray]@[lightgray] has voted on kicking[orange] @[].[accent] (@/@)\n[lightgray]Type[orange] /vote [] to agree.", + player.name, target.name, votes, votesRequired())); checkPass(); } boolean checkPass(){ if(votes >= votesRequired()){ - Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration/60))); - target.getInfo().lastKicked = Time.millis() + kickDuration*1000; + Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60))); + target.getInfo().lastKicked = Time.millis() + kickDuration * 1000; Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote)); map[0] = null; task.cancel(); @@ -410,11 +414,11 @@ public class NetServer implements ApplicationListener{ VoteSession session = new VoteSession(currentlyKicking, found); session.vote(player, 1); - vtime.reset(); + vtime.reset(); currentlyKicking[0] = session; } }else{ - player.sendMessage("[scarlet]No player[orange]'" + args[0] + "'[scarlet] found."); + player.sendMessage("[scarlet]No player [orange]'" + args[0] + "'[scarlet] found."); } } }); @@ -424,7 +428,7 @@ public class NetServer implements ApplicationListener{ player.sendMessage("[scarlet]Nobody is being voted on."); }else{ if(player.isLocal()){ - player.sendMessage("Local players can't vote. Kick the player yourself instead."); + player.sendMessage("[scarlet]Local players can't vote. Kick the player yourself instead."); return; } @@ -439,12 +443,22 @@ public class NetServer implements ApplicationListener{ return; } - if(!arg[0].toLowerCase().equals("y") && !arg[0].toLowerCase().equals("n")){ + if(currentlyKicking[0].target.team() != player.team()){ + player.sendMessage("[scarlet]You can't vote for other teams."); + return; + } + + int sign = switch(arg[0].toLowerCase()){ + case "y", "yes" -> 1; + case "n", "no" -> -1; + default -> 0; + }; + + if(sign == 0){ player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no)."); return; } - int sign = arg[0].toLowerCase().equals("y") ? 1 : -1; currentlyKicking[0].vote(player, sign); } }); @@ -485,7 +499,7 @@ public class NetServer implements ApplicationListener{ data.stream = new ByteArrayInputStream(stream.toByteArray()); player.con.sendStream(data); - Log.debug("Packed @ bytes of world data.", stream.size()); + debug("Packed @ bytes of world data.", stream.size()); } public void addPacketHandler(String type, Cons2 handler){ @@ -497,7 +511,7 @@ public class NetServer implements ApplicationListener{ } public static void onDisconnect(Player player, String reason){ - //singleplayer multiplayer wierdness + //singleplayer multiplayer weirdness if(player.con == null){ player.remove(); return; @@ -510,7 +524,8 @@ public class NetServer implements ApplicationListener{ Call.playerDisconnect(player.id()); } - if(Config.showConnectMessages.bool()) Log.info("&lm[@] &lc@ has disconnected. &lg&fi(@)", player.uuid(), player.name, reason); + String message = Strings.format("&lb@&fi&lk has disconnected. &fi&lk[&lb@&fi&lk] (@)", player.name, player.uuid(), reason); + if(Config.showConnectMessages.bool()) info(message); } player.remove(); @@ -530,7 +545,7 @@ public class NetServer implements ApplicationListener{ public static void serverPacketUnreliable(Player player, String type, String contents){ serverPacketReliable(player, type, contents); } - + private static boolean invalid(float f){ return Float.isInfinite(f) || Float.isNaN(f); } @@ -577,7 +592,7 @@ public class NetServer implements ApplicationListener{ shooting = false; } - if(!player.dead() && (player.unit().type().flying || !player.unit().type().canBoost)){ + if(!player.dead() && (player.unit().type.flying || !player.unit().type.canBoost)){ boosting = false; } @@ -591,8 +606,8 @@ public class NetServer implements ApplicationListener{ player.unit().aim(pointerX, pointerY); if(player.isBuilder()){ - player.builder().clearBuilding(); - player.builder().updateBuilding(building); + player.unit().clearBuilding(); + player.unit().updateBuilding(building); if(requests != null){ for(BuildPlan req : requests){ @@ -616,27 +631,22 @@ public class NetServer implements ApplicationListener{ con.rejectedRequests.add(req); continue; } - player.builder().plans().addLast(req); + player.unit().plans().addLast(req); } } } - if(player.isMiner()){ - player.miner().mineTile(mining); - } + player.unit().mineTile = mining; con.rejectedRequests.clear(); if(!player.dead()){ Unit unit = player.unit(); - long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime); - float maxSpeed = ((player.unit().type().canBoost && player.unit().isFlying()) ? player.unit().type().boostMultiplier : 1f) * player.unit().type().speed; - if(unit.isGrounded()){ - maxSpeed *= unit.floorSpeedMultiplier(); - } + long elapsed = Math.min(Time.timeSinceMillis(con.lastReceivedClientTime), 1500); + float maxSpeed = unit.realSpeed(); - float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.1f; + float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.2f; //ignore the position if the player thinks they're dead, or the unit is wrong boolean ignorePosition = dead || unit.id != unitID; @@ -693,15 +703,14 @@ public class NetServer implements ApplicationListener{ @Remote(targets = Loc.client, called = Loc.server) public static void adminRequest(Player player, Player other, AdminAction action){ - - if(!player.admin){ - Log.warn("ACCESS DENIED: Player @ / @ attempted to perform admin action '@' on '@' without proper security access.", - player.name, player.con.address, action.name(), other == null ? null : other.name); + if(!player.admin && !player.isLocal()){ + warn("ACCESS DENIED: Player @ / @ attempted to perform admin action '@' on '@' without proper security access.", + player.name, player.con == null ? "null" : player.con.address, action.name(), other == null ? null : other.name); return; } if(other == null || ((other.admin && !player.isLocal()) && other != player)){ - Log.warn("@ attempted to perform admin action on nonexistant or admin player.", player.name); + warn("@ attempted to perform admin action on nonexistant or admin player.", player.name); return; } @@ -709,27 +718,31 @@ public class NetServer implements ApplicationListener{ //no verification is done, so admins can hypothetically spam waves //not a real issue, because server owners may want to do just that logic.skipWave(); + info("&lc@ has skipped the wave.", player.name); }else if(action == AdminAction.ban){ - netServer.admins.banPlayerIP(other.con.address); netServer.admins.banPlayerID(other.con.uuid); + netServer.admins.banPlayerIP(other.con.address); other.kick(KickReason.banned); - Log.info("&lc@ has banned @.", player.name, other.name); + info("&lc@ has banned @.", player.name, other.name); }else if(action == AdminAction.kick){ other.kick(KickReason.kick); - Log.info("&lc@ has kicked @.", player.name, other.name); + info("&lc@ has kicked @.", player.name, other.name); }else if(action == AdminAction.trace){ - TraceInfo info = new TraceInfo(other.con.address, other.uuid(), other.con.modclient, other.con.mobile); + PlayerInfo stats = netServer.admins.getInfo(other.uuid()); + TraceInfo info = new TraceInfo(other.con.address, other.uuid(), other.con.modclient, other.con.mobile, stats.timesJoined, stats.timesKicked); if(player.con != null){ Call.traceInfo(player.con, other, info); }else{ NetClient.traceInfo(other, info); } - Log.info("&lc@ has requested trace info of @.", player.name, other.name); + info("&lc@ has requested trace info of @.", player.name, other.name); } } @Remote(targets = Loc.client) public static void connectConfirm(Player player){ + if(player.con.kicked) return; + player.add(); if(player.con == null || player.con.hasConnected) return; @@ -738,7 +751,8 @@ public class NetServer implements ApplicationListener{ if(Config.showConnectMessages.bool()){ Call.sendMessage("[accent]" + player.name + "[accent] has connected."); - Log.info("&lm[@] &y@ has connected.", player.uuid(), player.name); + String message = Strings.format("&lb@&fi&lk has connected. &fi&lk[&lb@&fi&lk]", player.name, player.uuid()); + info(message); } if(!Config.motd.string().equalsIgnoreCase("off")){ @@ -763,7 +777,6 @@ public class NetServer implements ApplicationListener{ @Override public void update(){ - if(!headless && !closing && net.server() && state.isMenu()){ closing = true; ui.loadfrag.show("@server.closing"); @@ -787,9 +800,9 @@ public class NetServer implements ApplicationListener{ public void openServer(){ try{ net.host(Config.port.num()); - info("&lcOpened a server on port @.", Config.port.num()); + info("Opened a server on port @.", Config.port.num()); }catch(BindException e){ - Log.err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network."); + err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network."); state.set(State.menu); }catch(IOException e){ err(e); @@ -813,12 +826,12 @@ public class NetServer implements ApplicationListener{ sent ++; dataStream.writeInt(entity.pos()); + dataStream.writeShort(entity.block.id); entity.writeAll(Writes.get(dataStream)); if(syncStream.size() > maxSnapshotSize){ dataStream.close(); - byte[] stateBytes = syncStream.toByteArray(); - Call.blockSnapshot(sent, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + Call.blockSnapshot(sent, syncStream.toByteArray()); sent = 0; syncStream.reset(); } @@ -826,29 +839,30 @@ public class NetServer implements ApplicationListener{ if(sent > 0){ dataStream.close(); - byte[] stateBytes = syncStream.toByteArray(); - Call.blockSnapshot(sent, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + Call.blockSnapshot(sent, syncStream.toByteArray()); } } public void writeEntitySnapshot(Player player) throws IOException{ + byte tps = (byte)Math.min(Core.graphics.getFramesPerSecond(), 255); syncStream.reset(); - Seq cores = state.teams.cores(player.team()); + int activeTeams = (byte)state.teams.present.count(t -> t.cores.size > 0); - dataStream.writeByte(cores.size); + dataStream.writeByte(activeTeams); + dataWrites.output = dataStream; - for(CoreBuild entity : cores){ - dataStream.writeInt(entity.tile.pos()); - entity.items.write(Writes.get(dataStream)); + //block data isn't important, just send the items for each team, they're synced across cores + for(TeamData data : state.teams.present){ + if(data.cores.size > 0){ + dataStream.writeByte(data.team.id); + data.cores.first().items.write(dataWrites); + } } dataStream.close(); - byte[] stateBytes = syncStream.toByteArray(); //write basic state data. - Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, universe.seconds(), (short)stateBytes.length, net.compressSnapshot(stateBytes)); - - viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY); + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, universe.seconds(), tps, syncStream.toByteArray()); syncStream.reset(); @@ -864,8 +878,7 @@ public class NetServer implements ApplicationListener{ if(syncStream.size() > maxSnapshotSize){ dataStream.close(); - byte[] syncBytes = syncStream.toByteArray(); - Call.entitySnapshot(player.con, (short)sent, (short)syncBytes.length, net.compressSnapshot(syncBytes)); + Call.entitySnapshot(player.con, (short)sent, syncStream.toByteArray()); sent = 0; syncStream.reset(); } @@ -874,8 +887,7 @@ public class NetServer implements ApplicationListener{ if(sent > 0){ dataStream.close(); - byte[] syncBytes = syncStream.toByteArray(); - Call.entitySnapshot(player.con, (short)sent, (short)syncBytes.length, net.compressSnapshot(syncBytes)); + Call.entitySnapshot(player.con, (short)sent, syncStream.toByteArray()); } } @@ -905,7 +917,6 @@ public class NetServer implements ApplicationListener{ } String checkColor(String str){ - for(int i = 1; i < str.length(); i++){ if(str.charAt(i) == ']'){ String color = str.substring(1, i); @@ -931,7 +942,6 @@ public class NetServer implements ApplicationListener{ } void sync(){ - try{ Groups.player.each(p -> !p.isLocal(), player -> { if(player.con == null || !player.con.isConnected()){ @@ -939,9 +949,11 @@ public class NetServer implements ApplicationListener{ return; } - NetConnection connection = player.con; + var connection = player.con; - if(!player.timer(0, serverSyncTime) || !connection.hasConnected) return; + if(Time.timeSinceMillis(connection.syncTime) < serverSyncTime || !connection.hasConnected) return; + + connection.syncTime = Time.millis(); try{ writeEntitySnapshot(player); @@ -955,7 +967,7 @@ public class NetServer implements ApplicationListener{ } }catch(IOException e){ - e.printStackTrace(); + Log.err(e); } } diff --git a/core/src/mindustry/core/Platform.java b/core/src/mindustry/core/Platform.java index 7eae8136c0..2adf5dc790 100644 --- a/core/src/mindustry/core/Platform.java +++ b/core/src/mindustry/core/Platform.java @@ -20,10 +20,9 @@ import static mindustry.Vars.*; public interface Platform{ - /** Dynamically loads a jar file. */ - default Class loadJar(Fi jar, String mainClass) throws Exception{ - URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - return classLoader.loadClass(mainClass); + /** Dynamically creates a class loader for a jar file. */ + default ClassLoader loadJar(Fi jar, ClassLoader parent) throws Exception{ + return new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, parent); } /** Steam: Update lobby visibility.*/ @@ -60,6 +59,15 @@ public interface Platform{ } default Context getScriptContext(){ + ContextFactory.getGlobalSetter().setContextFactoryGlobal(new ContextFactory(){ + @Override + protected Context makeContext(){ + Context ctx = super.makeContext(); + ctx.setClassShutter(Scripts::allowClass); + return ctx; + } + }); + Context c = Context.enter(); c.setOptimizationLevel(9); return c; @@ -117,9 +125,10 @@ public interface Platform{ * @param cons Selection listener * @param open Whether to open or save files * @param extension File extension to filter + * @param title The title of the native dialog */ - default void showFileChooser(boolean open, String extension, Cons cons){ - new FileChooser(open ? "@open" : "@save", file -> file.extEquals(extension), open, file -> { + default void showFileChooser(boolean open, String title, String extension, Cons cons){ + new FileChooser(title, file -> file.extEquals(extension), open, file -> { if(!open){ cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); }else{ @@ -128,6 +137,10 @@ public interface Platform{ }).show(); } + default void showFileChooser(boolean open, String extension, Cons cons){ + showFileChooser(open, open ? "@open": "@save", extension, cons); + } + /** * Show a file chooser for multiple file types. * @param cons Selection listener diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index ad7806267c..83f32408a8 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -2,24 +2,29 @@ package mindustry.core; import arc.*; import arc.files.*; -import arc.fx.*; import arc.graphics.*; +import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; import arc.math.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; +import arc.util.async.*; import mindustry.content.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.graphics.g3d.*; -import mindustry.ui.*; +import mindustry.world.blocks.storage.CoreBlock.*; import static arc.Core.*; import static mindustry.Vars.*; public class Renderer implements ApplicationListener{ + /** These are global variables, for headless access. Cached. */ + public static float laserOpacity = 0.5f, bridgeOpacity = 0.75f; + public final BlockRenderer blocks = new BlockRenderer(); public final MinimapRenderer minimap = new MinimapRenderer(); public final OverlayRenderer overlays = new OverlayRenderer(); @@ -27,16 +32,17 @@ public class Renderer implements ApplicationListener{ public final Pixelator pixelator = new Pixelator(); public PlanetRenderer planets; + public @Nullable Bloom bloom; public FrameBuffer effectBuffer = new FrameBuffer(); - public float laserOpacity = 1f; + public boolean animateShields, drawWeather = true, drawStatus; + /** minZoom = zooming out, maxZoom = zooming in */ + public float minZoom = 1.5f, maxZoom = 6f; + public Seq envRenderers = new Seq<>(); + public TextureRegion[] bubbles = new TextureRegion[16], splashes = new TextureRegion[12]; - private Bloom bloom; - private FxProcessor fx = new FxProcessor(); + private @Nullable CoreBuild landCore; private Color clearColor = new Color(0f, 0f, 0f, 1f); - private float targetscale = Scl.scl(4); - private float camerascale = targetscale; - private float landscale = 0f, landTime, weatherAlpha; - private float minZoomScl = Scl.scl(0.01f); + private float targetscale = Scl.scl(4), camerascale = targetscale, landscale, landTime, weatherAlpha, minZoomScl = Scl.scl(0.01f); private float shakeIntensity, shaketime; public Renderer(){ @@ -49,25 +55,48 @@ public class Renderer implements ApplicationListener{ shaketime = Math.max(shaketime, duration); } + public void addEnvRenderer(int mask, Runnable render){ + envRenderers.add(new EnvRenderer(mask, render)); + } + @Override public void init(){ planets = new PlanetRenderer(); - if(settings.getBool("bloom")){ + if(settings.getBool("bloom", !ios)){ setupBloom(); } + + Events.run(Trigger.newGame, () -> { + landCore = player.bestCore(); + }); + + EnvRenderers.init(); + for(int i = 0; i < bubbles.length; i++) bubbles[i] = atlas.find("bubble-" + i); + for(int i = 0; i < splashes.length; i++) splashes[i] = atlas.find("splash-" + i); + + assets.load("sprites/clouds.png", Texture.class).loaded = t -> { + ((Texture)t).setWrap(TextureWrap.repeat); + ((Texture)t).setFilter(TextureFilter.linear); + }; } @Override public void update(){ Color.white.set(1f, 1f, 1f, 1f); - Gl.clear(Gl.stencilBufferBit); - camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f); - laserOpacity = Core.settings.getInt("lasersopacity") / 100f; + float dest = Mathf.round(targetscale, 0.5f); + camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); + if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest; + laserOpacity = settings.getInt("lasersopacity") / 100f; + bridgeOpacity = settings.getInt("bridgeopacity") / 100f; + animateShields = settings.getBool("animatedshields"); + drawStatus = Core.settings.getBool("blockstatus"); if(landTime > 0){ - landTime -= Time.delta; + if(!state.isPaused()){ + landTime -= Time.delta; + } landscale = Interp.pow5In.apply(minZoomScl, Scl.scl(4f), 1f - landTime / Fx.coreLand.lifetime); camerascale = landscale; weatherAlpha = 0f; @@ -105,26 +134,9 @@ public class Renderer implements ApplicationListener{ @Override public void dispose(){ - minimap.dispose(); - effectBuffer.dispose(); - blocks.dispose(); - planets.dispose(); - if(bloom != null){ - bloom.dispose(); - bloom = null; - } Events.fire(new DisposeEvent()); } - @Override - public void resize(int width, int height){ - if(settings.getBool("bloom")){ - setupBloom(); - } - - fx.resize(width, height); - } - @Override public void resume(){ if(settings.getBool("bloom") && bloom != null){ @@ -140,9 +152,9 @@ public class Renderer implements ApplicationListener{ } bloom = new Bloom(true); }catch(Throwable e){ - e.printStackTrace(); settings.put("bloom", false); ui.showErrorMessage("@error.bloom"); + Log.err(e); } } @@ -159,23 +171,6 @@ public class Renderer implements ApplicationListener{ } } - void beginFx(){ - if(!fx.hasEnabledEffects()) return; - - Draw.flush(); - fx.clear(); - fx.begin(); - } - - void endFx(){ - if(!fx.hasEnabledEffects()) return; - - Draw.flush(); - fx.end(); - fx.applyEffects(); - fx.render(0, 0, fx.getWidth(), fx.getHeight()); - } - void updateShake(float scale){ if(shaketime > 0){ float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * scale; @@ -200,7 +195,7 @@ public class Renderer implements ApplicationListener{ graphics.clear(clearColor); Draw.reset(); - if(Core.settings.getBool("animatedwater") || Core.settings.getBool("animatedshields")){ + if(Core.settings.getBool("animatedwater") || animateShields){ effectBuffer.resize(graphics.getWidth(), graphics.getHeight()); } @@ -217,12 +212,10 @@ public class Renderer implements ApplicationListener{ pixelator.register(); } - //TODO fx - Draw.draw(Layer.background, this::drawBackground); Draw.draw(Layer.floor, blocks.floor::drawFloor); Draw.draw(Layer.block - 1, blocks::drawShadows); - Draw.draw(Layer.block, () -> { + Draw.draw(Layer.block - 0.09f, () -> { blocks.floor.beginDraw(); blocks.floor.drawLayer(CacheLayer.walls); blocks.floor.endDraw(); @@ -230,6 +223,13 @@ public class Renderer implements ApplicationListener{ Draw.drawRange(Layer.blockBuilding, () -> Draw.shader(Shaders.blockbuild, true), Draw::shader); + //render all matching environments + for(var renderer : envRenderers){ + if((renderer.env & state.rules.environment) == renderer.env){ + renderer.renderer.run(); + } + } + if(state.rules.lighting){ Draw.draw(Layer.light, lights::draw); } @@ -239,17 +239,23 @@ public class Renderer implements ApplicationListener{ } if(bloom != null){ - Draw.draw(Layer.bullet - 0.01f, bloom::capture); - Draw.draw(Layer.effect + 0.01f, bloom::render); + bloom.resize(graphics.getWidth() / 4, graphics.getHeight() / 4); + Draw.draw(Layer.bullet - 0.02f, bloom::capture); + Draw.draw(Layer.effect + 0.02f, bloom::render); } Draw.draw(Layer.plans, overlays::drawBottom); - if(settings.getBool("animatedshields") && Shaders.shield != null){ + if(animateShields && Shaders.shield != null){ Draw.drawRange(Layer.shields, 1f, () -> effectBuffer.begin(Color.clear), () -> { effectBuffer.end(); effectBuffer.blit(Shaders.shield); }); + + Draw.drawRange(Layer.buildBeam, 1f, () -> effectBuffer.begin(Color.clear), () -> { + effectBuffer.end(); + effectBuffer.blit(Shaders.buildBeam); + }); } Draw.draw(Layer.overlayUI, overlays::drawTop); @@ -271,25 +277,39 @@ public class Renderer implements ApplicationListener{ } private void drawLanding(){ - if(landTime > 0 && player.closestCore() != null){ - float fract = landTime / Fx.coreLand.lifetime; - Building entity = player.closestCore(); + CoreBuild entity = landCore == null ? player.bestCore() : landCore; + //var clouds = assets.get("sprites/clouds.png", Texture.class); + if(landTime > 0 && entity != null){ + float fout = landTime / Fx.coreLand.lifetime; - TextureRegion reg = entity.block.icon(Cicon.full); + //TODO clouds + /* + float scaling = 10000f; + float sscl = 1f + fout*1.5f; + float offset = -0.38f; + + Tmp.tr1.set(clouds); + Tmp.tr1.set((camera.position.x - camera.width/2f * sscl) / scaling, (camera.position.y - camera.height/2f * sscl) / scaling, (camera.position.x + camera.width/2f * sscl) / scaling, (camera.position.y + camera.height/2f * sscl) / scaling); + Draw.alpha(Mathf.slope(Mathf.clamp(((1f - fout) + offset)/(1f + offset)))); + Draw.mixcol(Pal.spore, 0.5f); + Draw.rect(Tmp.tr1, camera.position.x, camera.position.y, camera.width, camera.height); + Draw.reset();*/ + + TextureRegion reg = entity.block.fullIcon; float scl = Scl.scl(4f) / camerascale; - float s = reg.width * Draw.scl * scl * 4f * fract; + float s = reg.width * Draw.scl * scl * 4f * fout; Draw.color(Pal.lightTrail); - Draw.rect("circle-shadow", entity.getX(), entity.getY(), s, s); + Draw.rect("circle-shadow", entity.x, entity.y, s, s); - Angles.randLenVectors(1, (1f- fract), 100, 1000f * scl * (1f-fract), (x, y, fin, fout) -> { - Lines.stroke(scl * fin); - Lines.lineAngle(entity.getX() + x, entity.getY() + y, Mathf.angle(x, y), (fin * 20 + 1f) * scl); + Angles.randLenVectors(1, (1f- fout), 100, 1000f * scl * (1f-fout), (x, y, ffin, ffout) -> { + Lines.stroke(scl * ffin); + Lines.lineAngle(entity.x + x, entity.y + y, Mathf.angle(x, y), (ffin * 20 + 1f) * scl); }); Draw.color(); - Draw.mixcol(Color.white, fract); - Draw.rect(reg, entity.getX(), entity.getY(), reg.width * Draw.scl * scl, reg.height * Draw.scl * scl, fract * 135f); + Draw.mixcol(Color.white, fout); + Draw.rect(reg, entity.x, entity.y, reg.width * Draw.scl * scl, reg.height * Draw.scl * scl, fout * 135f); Draw.reset(); } @@ -301,12 +321,19 @@ public class Renderer implements ApplicationListener{ } public void clampScale(){ - float s = Scl.scl(1f); - targetscale = Mathf.clamp(targetscale, minScale(), Math.round(s * 6)); + targetscale = Mathf.clamp(targetscale, minScale(), maxScale()); + } + + public float getDisplayScale(){ + return camerascale; } public float minScale(){ - return Scl.scl(1.5f); + return Scl.scl(minZoom); + } + + public float maxScale(){ + return Mathf.round(Scl.scl(maxZoom)); } public float getScale(){ @@ -327,13 +354,14 @@ public class Renderer implements ApplicationListener{ int w = world.width() * tilesize, h = world.height() * tilesize; int memory = w * h * 4 / 1024 / 1024; - if(memory >= 65){ + if(memory >= (mobile ? 65 : 120)){ ui.showInfo("@screenshot.invalid"); return; } FrameBuffer buffer = new FrameBuffer(w, h); + drawWeather = false; float vpW = camera.width, vpH = camera.height, px = camera.position.x, py = camera.position.y; disableUI = true; camera.width = w; @@ -342,25 +370,39 @@ public class Renderer implements ApplicationListener{ camera.position.y = h / 2f + tilesize / 2f; buffer.begin(); draw(); + Draw.flush(); + byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true); buffer.end(); disableUI = false; camera.width = vpW; camera.height = vpH; camera.position.set(px, py); - buffer.begin(); - byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true); - for(int i = 0; i < lines.length; i += 4){ - lines[i + 3] = (byte)255; - } - buffer.end(); - Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.rgba8888); - Buffers.copy(lines, 0, fullPixmap.getPixels(), lines.length); - Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); - PixmapIO.writePNG(file, fullPixmap); - fullPixmap.dispose(); - ui.showInfoFade(Core.bundle.format("screenshot", file.toString())); - + drawWeather = true; buffer.dispose(); + + Threads.thread(() -> { + for(int i = 0; i < lines.length; i += 4){ + lines[i + 3] = (byte)255; + } + Pixmap fullPixmap = new Pixmap(w, h); + Buffers.copy(lines, 0, fullPixmap.getPixels(), lines.length); + Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); + PixmapIO.writePng(file, fullPixmap); + fullPixmap.dispose(); + app.post(() -> ui.showInfoFade(Core.bundle.format("screenshot", file.toString()))); + }); + } + + public static class EnvRenderer{ + /** Environment bitmask; must match env exactly when and-ed. */ + public final int env; + /** Rendering callback. */ + public final Runnable renderer; + + public EnvRenderer(int env, Runnable renderer){ + this.env = env; + this.renderer = renderer; + } } } diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 536e89a9b2..44d4008dba 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -24,7 +24,7 @@ import mindustry.editor.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.logic.LogicDialog; +import mindustry.logic.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.ui.fragments.*; @@ -33,6 +33,8 @@ import static arc.scene.actions.Actions.*; import static mindustry.Vars.*; public class UI implements ApplicationListener, Loadable{ + private static String billions, millions, thousands; + public static PixmapPacker packer; public MenuFragment menufrag; @@ -42,6 +44,7 @@ public class UI implements ApplicationListener, Loadable{ public MinimapFragment minimapfrag; public PlayerListFragment listfrag; public LoadingFragment loadfrag; + public HintsFragment hints; public WidgetGroup menuGroup, hudGroup; @@ -55,7 +58,7 @@ public class UI implements ApplicationListener, Loadable{ public HostDialog host; public PausedDialog paused; public SettingsMenuDialog settings; - public ControlsDialog controls; + public KeybindDialog controls; public MapEditorDialog editor; public LanguageDialog language; public BansDialog bans; @@ -91,6 +94,12 @@ public class UI implements ApplicationListener, Loadable{ Core.scene = new Scene(); Core.input.addProcessor(Core.scene); + int[] insets = Core.graphics.getSafeInsets(); + Core.scene.marginLeft = insets[0]; + Core.scene.marginRight = insets[1]; + Core.scene.marginTop = insets[2]; + Core.scene.marginBottom = insets[3]; + Tex.load(); Icon.load(); Styles.load(); @@ -101,10 +110,10 @@ public class UI implements ApplicationListener, Loadable{ Dialog.setHideAction(() -> sequence(fadeOut(0.1f))); Tooltips.getInstance().animations = false; - Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black5).margin(4f).add(text)); + Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black6).margin(4f).add(text)); Core.settings.setErrorHandler(e -> { - e.printStackTrace(); + Log.err(e); Core.app.post(() -> showErrorMessage("Failed to access local storage.\nSettings will not be saved.")); }); @@ -140,22 +149,21 @@ public class UI implements ApplicationListener, Loadable{ } } - //draw overlay for buttons - if(state.rules.tutorial){ - control.tutorial.draw(); - Draw.flush(); - } - Events.fire(Trigger.uiDrawEnd); } @Override public void init(){ + billions = Core.bundle.get("unit.billions"); + millions = Core.bundle.get("unit.millions"); + thousands = Core.bundle.get("unit.thousands"); + menuGroup = new WidgetGroup(); hudGroup = new WidgetGroup(); menufrag = new MenuFragment(); hudfrag = new HudFragment(); + hints = new HintsFragment(); chatfrag = new ChatFragment(); minimapfrag = new MinimapFragment(); listfrag = new PlayerListFragment(); @@ -164,7 +172,7 @@ public class UI implements ApplicationListener, Loadable{ picker = new ColorPicker(); editor = new MapEditorDialog(); - controls = new ControlsDialog(); + controls = new KeybindDialog(); restart = new GameOverDialog(); join = new JoinDialog(); discord = new DiscordDialog(); @@ -212,18 +220,17 @@ public class UI implements ApplicationListener, Loadable{ @Override public void resize(int width, int height){ if(Core.scene == null) return; + + int[] insets = Core.graphics.getSafeInsets(); + Core.scene.marginLeft = insets[0]; + Core.scene.marginRight = insets[1]; + Core.scene.marginTop = insets[2]; + Core.scene.marginBottom = insets[3]; + Core.scene.resize(width, height); Events.fire(new ResizeEvent()); } - @Override - public void dispose(){ - if(packer != null){ - packer.dispose(); - packer = null; - } - } - public TextureRegionDrawable getIcon(String name){ if(Icon.icons.containsKey(name)) return Icon.icons.get(name); return Core.atlas.getDrawable("error"); @@ -262,11 +269,11 @@ public class UI implements ApplicationListener, Loadable{ TextField field = cont.field(def, t -> {}).size(330f, 50f).get(); field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c)); buttons.defaults().size(120, 54).pad(4); + buttons.button("@cancel", this::hide); buttons.button("@ok", () -> { confirmed.get(field.getText()); hide(); }).disabled(b -> field.getText().isEmpty()); - buttons.button("@cancel", this::hide); keyDown(KeyCode.enter, () -> { String text = field.getText(); if(!text.isEmpty()){ @@ -328,34 +335,40 @@ public class UI implements ApplicationListener, Loadable{ /** Shows a label in the world. This label is behind everything. Does not fade. */ public void showLabel(String info, float duration, float worldx, float worldy){ - Table table = new Table(); - table.setFillParent(true); + var table = new Table(Styles.black3).margin(4); table.touchable = Touchable.disabled; table.update(() -> { if(state.isMenu()) table.remove(); + Vec2 v = Core.camera.project(worldx, worldy); + table.setPosition(v.x, v.y, Align.center); }); table.actions(Actions.delay(duration), Actions.remove()); - table.align(Align.center).table(Styles.black3, t -> t.margin(4).add(info).style(Styles.outlineLabel)).update(t -> { - Vec2 v = Core.camera.project(worldx, worldy); - t.setPosition(v.x, v.y, Align.center); - }); + table.add(info).style(Styles.outlineLabel); + table.pack(); table.act(0f); //make sure it's at the back Core.scene.root.addChildAt(0, table); + + table.getChildren().first().act(0f); } public void showInfo(String info){ - showInfo(info, () -> {}); - } - - public void showInfo(String info, Runnable listener){ new Dialog(""){{ getCell(cont).growX(); cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center); - buttons.button("@ok", () -> { - hide(); - listener.run(); - }).size(110, 50).pad(4); + buttons.button("@ok", this::hide).size(110, 50).pad(4); + keyDown(KeyCode.enter, this::hide); + closeOnBack(); + }}.show(); + } + + public void showInfoOnHidden(String info, Runnable listener){ + new Dialog(""){{ + getCell(cont).growX(); + cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center); + buttons.button("@ok", this::hide).size(110, 50).pad(4); + hidden(listener); + closeOnBack(); }}.show(); } @@ -364,6 +377,7 @@ public class UI implements ApplicationListener, Loadable{ getCell(cont).growX(); cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.left); buttons.button("@ok", this::hide).size(110, 50).pad(4); + closeOnBack(); }}.show(); } @@ -378,6 +392,7 @@ public class UI implements ApplicationListener, Loadable{ cont.add(text).pad(2f).growX().wrap().get().setAlignment(Align.center); cont.row(); cont.button("@ok", this::hide).size(120, 50).pad(4); + closeOnBack(); }}.show(); } @@ -388,7 +403,7 @@ public class UI implements ApplicationListener, Loadable{ public void showException(String text, Throwable exc){ loadfrag.hide(); new Dialog(""){{ - String message = Strings.getFinalMesage(exc); + String message = Strings.getFinalMessage(exc); setFillParent(true); cont.margin(15); @@ -405,6 +420,7 @@ public class UI implements ApplicationListener, Loadable{ cont.button("@ok", this::hide).size(110, 50).fillX().left(); cont.row(); cont.add(col).colspan(2).pad(2); + closeOnBack(); }}.show(); } @@ -420,6 +436,7 @@ public class UI implements ApplicationListener, Loadable{ cont.add(text).width(400f).wrap().get().setAlignment(align, align); cont.row(); buttons.button("@ok", this::hide).size(110, 50).pad(4); + closeOnBack(); }}.show(); } @@ -427,6 +444,7 @@ public class UI implements ApplicationListener, Loadable{ new Dialog(titleText){{ cont.margin(15).add(text).width(400f).wrap().left().get().setAlignment(Align.left, Align.left); buttons.button("@ok", this::hide).size(110, 50).pad(4); + closeOnBack(); }}.show(); } @@ -436,9 +454,14 @@ public class UI implements ApplicationListener, Loadable{ titleTable.row(); titleTable.image().color(Pal.accent).height(3f).growX().pad(2f); buttons.button("@ok", this::hide).size(110, 50).pad(4); + closeOnBack(); }}.show(); } + public void showConfirm(String text, Runnable confirmed){ + showConfirm("@confirm", text, null, confirmed); + } + public void showConfirm(String title, String text, Runnable confirmed){ showConfirm(title, text, null, confirmed); } @@ -487,13 +510,20 @@ public class UI implements ApplicationListener, Loadable{ dialog.show(); } + /** Display text in the middle of the screen, then fade out. */ public void announce(String text){ - Table t = new Table(); + announce(text, 3); + } + + /** Display text in the middle of the screen, then fade out. */ + public void announce(String text, float duration){ + Table t = new Table(Styles.black3); t.touchable = Touchable.disabled; - t.background(Styles.black3).margin(8f) - .add(text).style(Styles.outlineLabel).labelAlign(Align.center); + t.margin(8f).add(text).style(Styles.outlineLabel).labelAlign(Align.center); t.update(() -> t.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Align.center)); - t.actions(Actions.fadeOut(3, Interp.pow4In), Actions.remove()); + t.actions(Actions.fadeOut(duration, Interp.pow4In), Actions.remove()); + t.pack(); + t.act(0.1f); Core.scene.add(t); } @@ -509,17 +539,27 @@ public class UI implements ApplicationListener, Loadable{ dialog.show(); } - //TODO move? + public static String formatTime(float ticks){ + int time = (int)(ticks / 60); + if(time < 60) return "0:" + (time < 10 ? "0" : "") + time; + int mod = time % 60; + return (time / 60) + ":" + (mod < 10 ? "0" : "") + mod; + } public static String formatAmount(long number){ - if(number >= 1_000_000_000){ - return Strings.fixed(number / 1_000_000_000f, 1) + "[gray]" + Core.bundle.get("unit.billions") + "[]"; - }else if(number >= 1_000_000){ - return Strings.fixed(number / 1_000_000f, 1) + "[gray]" + Core.bundle.get("unit.millions") + "[]"; - }else if(number >= 10_000){ - return number / 1000 + "[gray]" + Core.bundle.get("unit.thousands") + "[]"; - }else if(number >= 1000){ - return Strings.fixed(number / 1000f, 1) + "[gray]" + Core.bundle.get("unit.thousands") + "[]"; + //prevent overflow + if(number == Long.MIN_VALUE) number ++; + + long mag = Math.abs(number); + String sign = number < 0 ? "-" : ""; + if(mag >= 1_000_000_000){ + return sign + Strings.fixed(mag / 1_000_000_000f, 1) + "[gray]" + billions+ "[]"; + }else if(mag >= 1_000_000){ + return sign + Strings.fixed(mag / 1_000_000f, 1) + "[gray]" +millions + "[]"; + }else if(mag >= 10_000){ + return number / 1000 + "[gray]" + thousands + "[]"; + }else if(mag >= 1000){ + return sign + Strings.fixed(mag / 1000f, 1) + "[gray]" + thousands + "[]"; }else{ return number + ""; } diff --git a/core/src/mindustry/core/Version.java b/core/src/mindustry/core/Version.java index bef40c5e87..f5b3d2fd6b 100644 --- a/core/src/mindustry/core/Version.java +++ b/core/src/mindustry/core/Version.java @@ -2,8 +2,8 @@ package mindustry.core; import arc.*; import arc.Files.*; -import arc.struct.*; import arc.files.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; @@ -46,6 +46,23 @@ public class Version{ } } + /** @return whether the version is greater than the specified version string, e.g. "120.1"*/ + public static boolean isAtLeast(String str){ + if(build <= 0 || str == null || str.isEmpty()) return true; + + int dot = str.indexOf('.'); + if(dot != -1){ + int major = Strings.parseInt(str.substring(0, dot), 0), minor = Strings.parseInt(str.substring(dot + 1), 0); + return build > major || (build == major && revision >= minor); + }else{ + return build >= Strings.parseInt(str, 0); + } + } + + public static String buildString(){ + return build < 0 ? "custom" : build + (revision == 0 ? "" : "." + revision); + } + /** get menu version without colors */ public static String combined(){ if(build == -1){ diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 23d366b09a..38a4954792 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -4,9 +4,9 @@ import arc.*; import arc.func.*; import arc.math.*; import arc.math.geom.*; +import arc.math.geom.Geometry.*; import arc.struct.*; import arc.struct.ObjectIntMap.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.content.*; @@ -66,6 +66,11 @@ public class World{ return tile == null || tile.block().solid; } + public boolean wallSolidFull(int x, int y){ + Tile tile = tile(x, y); + return tile == null || (tile.block().solid && tile.block().fillsTile); + } + public boolean isAccessible(int x, int y){ return !wallSolid(x, y - 1) || !wallSolid(x, y + 1) || !wallSolid(x - 1, y) || !wallSolid(x + 1, y); } @@ -144,7 +149,17 @@ public class World{ return build(Math.round(x / tilesize), Math.round(y / tilesize)); } - public int toTile(float coord){ + /** Convert from world to logic tile coordinates. Whole numbers are at centers of tiles. */ + public static float conv(float coord){ + return coord / tilesize; + } + + /** Convert from tile to world coordinates. */ + public static float unconv(float coord){ + return coord * tilesize; + } + + public static int toTile(float coord){ return Math.round(coord / tilesize); } @@ -172,22 +187,22 @@ public class World{ /** * Call to signify the beginning of map loading. - * BuildinghangeEvents will not be fired until endMapLoad(). + * TileEvents will not be fired until endMapLoad(). */ public void beginMapLoad(){ generating = true; } /** - * Call to signify the end of map loading. Updates tile occlusions and sets up physics for the world. + * Call to signify the end of map loading. Updates tile proximities and sets up physics for the world. * A WorldLoadEvent will be fire. */ public void endMapLoad(){ for(Tile tile : tiles){ //remove legacy blocks; they need to stop existing - if(tile.block() instanceof LegacyBlock){ - tile.remove(); + if(tile.block() instanceof LegacyBlock l){ + l.removeSelf(tile); continue; } @@ -249,22 +264,20 @@ public class World{ setSectorRules(sector); if(state.rules.defaultTeam.core() != null){ - sector.setSpawnPosition(state.rules.defaultTeam.core().pos()); + sector.info.spawnPosition = state.rules.defaultTeam.core().pos(); } } private void setSectorRules(Sector sector){ - state.map = new Map(StringMap.of("name", sector.planet.localizedName + "; Sector " + sector.id)); + state.map = new Map(StringMap.of("name", sector.preset == null ? sector.planet.localizedName + "; Sector " + sector.id : sector.preset.localizedName)); state.rules.sector = sector; - state.rules.weather.clear(); - //apply weather based on terrain - ObjectIntMap floorc = new ObjectIntMap<>(); + sector.planet.generator.addWeather(sector, state.rules); + ObjectSet content = new ObjectSet<>(); - float waterFloors = 0, totalFloors = 0; - + //TODO duplicate code? for(Tile tile : world.tiles){ if(world.getDarkness(tile.x, tile.y) >= 3){ continue; @@ -274,57 +287,11 @@ public class World{ if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop); if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop); if(liquid != null) content.add(liquid); - - if(!tile.block().isStatic()){ - totalFloors ++; - if(liquid == Liquids.water){ - waterFloors += tile.floor().isDeep() ? 1f : 0.7f; - } - floorc.increment(tile.floor()); - if(tile.overlay() != Blocks.air){ - floorc.increment(tile.overlay()); - } - } } - //sort counts in descending order - Seq> entries = floorc.entries().toArray(); - entries.sort(e -> -e.value); - //remove all blocks occuring < 30 times - unimportant - entries.removeAll(e -> e.value < 30); - - Block[] floors = new Block[entries.size]; - int[] floorCounts = new int[entries.size]; - for(int i = 0; i < entries.size; i++){ - floorCounts[i] = entries.get(i).value; - floors[i] = entries.get(i).key; - } - - //TODO bad code - boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow"); - boolean hasRain = !hasSnow && floors[0].name.contains("water"); - boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand"); - boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted"); - - if(hasSnow){ - state.rules.weather.add(new WeatherEntry(Weathers.snow)); - } - - if(hasRain){ - state.rules.weather.add(new WeatherEntry(Weathers.rain)); - } - - if(hasDesert){ - state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); - } - - if(hasSpores){ - state.rules.weather.add(new WeatherEntry(Weathers.sporestorm)); - } - - state.secinfo.resources = content.asArray(); - state.secinfo.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))); - + sector.info.resources = content.asArray(); + sector.info.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))); + sector.saveInfo(); } public Context filterContext(Map map){ @@ -385,12 +352,6 @@ public class World{ if(invalidMap) Core.app.post(() -> state.set(State.menu)); } - public void notifyChanged(Tile tile){ - if(!generating){ - Core.app.post(() -> Events.fire(new TileChangeEvent(tile))); - } - } - public void raycastEachWorld(float x0, float y0, float x1, float y1, Raycaster cons){ raycastEach(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons); } @@ -436,7 +397,6 @@ public class World{ int err = dx - dy; int e2; while(true){ - if(cons.accept(x0, y0)) return true; if(x0 == x1 && y0 == y1) return false; @@ -457,7 +417,7 @@ public class World{ byte[] dark = new byte[tiles.width * tiles.height]; byte[] writeBuffer = new byte[tiles.width * tiles.height]; - byte darkIterations = 4; + byte darkIterations = darkRadius; for(int i = 0; i < dark.length; i++){ Tile tile = tiles.geti(i); @@ -491,7 +451,7 @@ public class World{ tile.data = dark[idx]; } - if(dark[idx] == 4){ + if(dark[idx] == darkRadius){ boolean full = true; for(Point2 p : Geometry.d4){ int px = p.x + tile.x, py = p.y + tile.y; @@ -502,11 +462,28 @@ public class World{ } } - if(full) tile.data = 5; + if(full) tile.data = darkRadius + 1; } } } + public byte getWallDarkness(Tile tile){ + if(tile.isDarkened()){ + int minDst = darkRadius + 1; + for(int cx = tile.x - darkRadius; cx <= tile.x + darkRadius; cx++){ + for(int cy = tile.y - darkRadius; cy <= tile.y + darkRadius; cy++){ + if(tiles.in(cx, cy) && !rawTile(cx, cy).isDarkened()){ + minDst = Math.min(minDst, Math.abs(cx - tile.x) + Math.abs(cy - tile.y)); + } + } + } + + return (byte)Math.max((minDst - 1), 0); + } + return 0; + } + + //TODO optimize; this is very slow and called too often! public float getDarkness(int x, int y){ int edgeBlend = 2; @@ -536,7 +513,7 @@ public class World{ int circleDst = (int)(rawDst - (length - circleBlend)); if(circleDst > 0){ - dark = Math.max(circleDst / 1f, dark); + dark = Math.max(circleDst, dark); } } @@ -548,10 +525,6 @@ public class World{ return dark; } - public interface Raycaster{ - boolean accept(int x, int y); - } - private class Context implements WorldContext{ Context(){ @@ -607,6 +580,7 @@ public class World{ GenerateInput input = new GenerateInput(); for(GenerateFilter filter : filters){ + filter.randomize(); input.begin(filter, width(), height(), (x, y) -> tiles.getn(x, y)); filter.apply(tiles, input); } diff --git a/core/src/mindustry/ctype/Content.java b/core/src/mindustry/ctype/Content.java index ad6c3401ee..4103f4899e 100644 --- a/core/src/mindustry/ctype/Content.java +++ b/core/src/mindustry/ctype/Content.java @@ -2,13 +2,12 @@ package mindustry.ctype; import arc.files.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.mod.Mods.*; /** Base class for a content type that is loaded in {@link mindustry.core.ContentLoader}. */ public abstract class Content implements Comparable, Disposable{ - public final short id; + public short id; /** Info on which mod this content was loaded from. */ public ModContentInfo minfo = new ModContentInfo(); @@ -32,7 +31,10 @@ public abstract class Content implements Comparable, Disposable{ */ public void load(){} - /** @return whether an error ocurred during mod loading. */ + /** Called right after load(). */ + public void loadIcon(){} + + /** @return whether an error occurred during mod loading. */ public boolean hasErrored(){ return minfo.error != null; } diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index 9c4b147214..c28496bb81 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -3,26 +3,36 @@ package mindustry.ctype; import arc.*; import arc.func.*; import arc.graphics.g2d.*; -import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.content.TechTree.*; import mindustry.game.EventType.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; /** Base interface for an unlockable content type. */ public abstract class UnlockableContent extends MappableContent{ + /** Stat storage for this content. Initialized on demand. */ + public Stats stats = new Stats(); /** Localized, formal name. Never null. Set to internal name if not found in bundle. */ public String localizedName; - /** Localized description. May be null. */ - public @Nullable String description; + /** Localized description & details. May be null. */ + public @Nullable String description, details; /** Whether this content is always unlocked in the tech tree. */ public boolean alwaysUnlocked = false; - /** Icons by Cicon ID.*/ - protected TextureRegion[] cicons = new TextureRegion[mindustry.ui.Cicon.all.length]; + /** Whether to show the description in the research dialog preview. */ + public boolean inlineDescription = true; + /** Special logic icon ID. */ + public int iconId = 0; + /** Icon of the content to use in UI. */ + public TextureRegion uiIcon; + /** Icon of the full content. Unscaled.*/ + public TextureRegion fullIcon; /** Unlock state. Loaded from settings. Do not modify outside of the constructor. */ protected boolean unlocked; @@ -31,14 +41,53 @@ public abstract class UnlockableContent extends MappableContent{ this.localizedName = Core.bundle.get(getContentType() + "." + this.name + ".name", this.name); this.description = Core.bundle.getOrNull(getContentType() + "." + this.name + ".description"); + this.details = Core.bundle.getOrNull(getContentType() + "." + this.name + ".details"); this.unlocked = Core.settings != null && Core.settings.getBool(this.name + "-unlocked", false); } + @Override + public void loadIcon(){ + fullIcon = + Core.atlas.find(getContentType().name() + "-" + name + "-full", + Core.atlas.find(name + "-full", + Core.atlas.find(name, + Core.atlas.find(getContentType().name() + "-" + name, + Core.atlas.find(name + "1"))))); + + uiIcon = Core.atlas.find(getContentType().name() + "-" + name + "-ui", fullIcon); + } + + /** @return the tech node for this content. may be null. */ + public @Nullable TechNode node(){ + return TechTree.get(this); + } + + /** Use fullIcon / uiIcon instead! This will be removed. */ + @Deprecated + public TextureRegion icon(Cicon icon){ + return icon == Cicon.full ? fullIcon : uiIcon; + } + public String displayDescription(){ return minfo.mod == null ? description : description + "\n" + Core.bundle.format("mod.display", minfo.mod.meta.displayName()); } - /** Generate any special icons for this content. Called asynchronously.*/ + /** Checks stat initialization state. Call before displaying stats. */ + public void checkStats(){ + if(!stats.intialized){ + setStats(); + stats.intialized = true; + } + } + + /** Initializes stats on demand. Should only be called once. Only called before something is displayed. */ + public void setStats(){ + } + + /** + * Generate any special icons for this content. Called synchronously. + * No regions are loaded at this point; grab pixmaps from the packer. + * */ @CallSuper public void createIcons(MultiPacker packer){ @@ -53,17 +102,8 @@ public abstract class UnlockableContent extends MappableContent{ return Fonts.getUnicodeStr(name); } - /** Returns a specific content icon, or the region {contentType}-{name} if not found.*/ - public TextureRegion icon(Cicon icon){ - if(cicons[icon.ordinal()] == null){ - cicons[icon.ordinal()] = - Core.atlas.find(getContentType().name() + "-" + name + "-" + icon.name(), - Core.atlas.find(getContentType().name() + "-" + name + "-full", - Core.atlas.find(name, - Core.atlas.find(getContentType().name() + "-" + name, - Core.atlas.find(name + "1"))))); - } - return cicons[icon.ordinal()]; + public boolean hasEmoji(){ + return Fonts.hasUnicodeStr(name); } /** Iterates through any implicit dependencies of this content. @@ -72,9 +112,6 @@ public abstract class UnlockableContent extends MappableContent{ } - /** This should show all necessary info about this content in the specified table. */ - public abstract void displayInfo(Table table); - /** Called when this content is unlocked. Use this to unlock other related content. */ public void onUnlock(){ } @@ -84,9 +121,14 @@ public abstract class UnlockableContent extends MappableContent{ return false; } + /** @return whether to show a notification toast when this is unlocked */ + public boolean showUnlock(){ + return true; + } + /** Makes this piece of content unlocked; if it already unlocked, nothing happens. */ public void unlock(){ - if(!unlocked()){ + if(!unlocked && !alwaysUnlocked){ unlocked = true; Core.settings.put(name + "-unlocked", true); @@ -95,16 +137,33 @@ public abstract class UnlockableContent extends MappableContent{ } } - public final boolean unlocked(){ + /** Unlocks this content, but does not fire any events. */ + public void quietUnlock(){ + if(!unlocked()){ + unlocked = true; + Core.settings.put(name + "-unlocked", true); + } + } + + public boolean unlocked(){ + if(net != null && net.client()) return alwaysUnlocked || state.rules.researched.contains(name); return unlocked || alwaysUnlocked; } - /** @return whether this content is unlocked, or the player is in a custom (non-campaign) game. */ - public final boolean unlockedNow(){ - return unlocked || alwaysUnlocked || !state.isCampaign(); + /** Locks this content again. */ + public void clearUnlock(){ + if(unlocked){ + unlocked = false; + Core.settings.put(name + "-unlocked", false); + } } - public final boolean locked(){ + /** @return whether this content is unlocked, or the player is in a custom (non-campaign) game. */ + public boolean unlockedNow(){ + return unlocked() || !state.isCampaign(); + } + + public boolean locked(){ return !unlocked(); } } diff --git a/core/src/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java index e63c2f3a6b..8681c679ff 100755 --- a/core/src/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -1,23 +1,17 @@ package mindustry.editor; +import arc.struct.*; import mindustry.annotations.Annotations.*; -import arc.struct.LongSeq; -import mindustry.game.Team; -import mindustry.gen.TileOp; -import mindustry.world.Block; -import mindustry.world.Tile; -import mindustry.world.blocks.environment.Floor; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.blocks.environment.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class DrawOperation{ - private MapEditor editor; private LongSeq array = new LongSeq(); - public DrawOperation(MapEditor editor) { - this.editor = editor; - } - public boolean isEmpty(){ return array.isEmpty(); } @@ -38,7 +32,7 @@ public class DrawOperation{ } } - private void updateTile(int i) { + private void updateTile(int i){ long l = array.get(i); array.set(i, TileOp.get(TileOp.x(l), TileOp.y(l), TileOp.type(l), getTile(editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l)))); setTile(editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l), TileOp.value(l)); diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index bc09f3c110..69b00f3495 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -1,7 +1,6 @@ package mindustry.editor; import arc.func.*; -import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.editor.DrawOperation.*; import mindustry.game.*; @@ -27,7 +26,7 @@ public class EditorTile extends Tile{ if(type instanceof OverlayFloor){ //don't place on liquids - if(!floor.isLiquid){ + if(floor.hasSurface() || !type.needsSurface){ setOverlayID(type.id); } return; @@ -51,9 +50,19 @@ public class EditorTile extends Tile{ return; } - op(OpType.block, block.id); - if(rotation != 0) op(OpType.rotation, (byte)rotation); - if(team != Team.derelict) op(OpType.team, (byte)team.id); + if(!isCenter()){ + EditorTile cen = (EditorTile)build.tile; + cen.op(OpType.rotation, (byte)build.rotation); + cen.op(OpType.team, (byte)build.team.id); + cen.op(OpType.block, block.id); + update(); + }else{ + if(build != null) op(OpType.rotation, (byte)build.rotation); + if(build != null) op(OpType.team, (byte)build.team.id); + op(OpType.block, block.id); + + } + super.setBlock(type, team, rotation); } @@ -67,6 +76,8 @@ public class EditorTile extends Tile{ if(getTeamID() == team.id) return; op(OpType.team, (byte)getTeamID()); super.setTeam(team); + + getLinkedTiles(t -> editor.renderer.updatePoint(t.x, t.y)); } @Override @@ -76,7 +87,7 @@ public class EditorTile extends Tile{ return; } - if(floor.isLiquid) return; + if(!floor.hasSurface() && overlay.asFloor().needsSurface) return; if(overlay() == overlay) return; op(OpType.overlay, this.overlay.id); super.setOverlay(overlay); @@ -97,11 +108,18 @@ public class EditorTile extends Tile{ super.recache(); } } - + @Override - protected void changeEntity(Team team, Prov entityprov, int rotation){ + protected void changed(){ + if(state.isGame()){ + super.changed(); + } + } + + @Override + protected void changeBuild(Team team, Prov entityprov, int rotation){ if(skip()){ - super.changeEntity(team, entityprov, rotation); + super.changeBuild(team, entityprov, rotation); return; } @@ -122,14 +140,14 @@ public class EditorTile extends Tile{ } private void update(){ - ui.editor.editor.renderer.updatePoint(x, y); + editor.renderer.updatePoint(x, y); } private boolean skip(){ - return state.isGame() || ui.editor.editor.isLoading(); + return state.isGame() || editor.isLoading(); } private void op(OpType type, short value){ - ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value)); + editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value)); } } diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 2dff5e9f46..b560d56e5b 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -9,11 +9,12 @@ import arc.util.*; import mindustry.content.*; import mindustry.game.*; import mindustry.world.*; +import static mindustry.Vars.*; public enum EditorTool{ zoom(KeyCode.v), pick(KeyCode.i){ - public void touched(MapEditor editor, int x, int y){ + public void touched(int x, int y){ if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; Tile tile = editor.tile(x, y); @@ -23,7 +24,7 @@ public enum EditorTool{ line(KeyCode.l, "replace", "orthogonal"){ @Override - public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){ + public void touchedLine(int x1, int y1, int x2, int y2){ //straight if(mode == 1){ if(Math.abs(x2 - x1) > Math.abs(y2 - y1)){ @@ -51,7 +52,7 @@ public enum EditorTool{ } @Override - public void touched(MapEditor editor, int x, int y){ + public void touched(int x, int y){ if(mode == -1){ //normal mode editor.drawBlocks(x, y); @@ -75,7 +76,7 @@ public enum EditorTool{ } @Override - public void touched(MapEditor editor, int x, int y){ + public void touched(int x, int y){ editor.drawCircle(x, y, tile -> { if(mode == -1){ //erase block @@ -95,13 +96,13 @@ public enum EditorTool{ IntSeq stack = new IntSeq(); @Override - public void touched(MapEditor editor, int x, int y){ + public void touched(int x, int y){ if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; Tile tile = editor.tile(x, y); if(editor.drawBlock.isMultiblock()){ //don't fill multiblocks, thanks - pencil.touched(editor, x, y); + pencil.touched(x, y); return; } @@ -118,7 +119,7 @@ public enum EditorTool{ if(editor.drawBlock.isOverlay()){ Block dest = tile.overlay(); if(dest == editor.drawBlock) return; - tester = t -> t.overlay() == dest && !t.floor().isLiquid; + tester = t -> t.overlay() == dest && (t.floor().hasSurface() || !t.floor().needsSurface); setter = t -> t.setOverlay(editor.drawBlock); }else if(editor.drawBlock.isFloor()){ Block dest = tile.floor(); @@ -133,19 +134,19 @@ public enum EditorTool{ } //replace only when the mode is 0 using the specified functions - fill(editor, x, y, mode == 0, tester, setter); + fill(x, y, mode == 0, tester, setter); }else if(mode == 1){ //mode 1 is team fill //only fill synthetic blocks, it's meaningless otherwise if(tile.synthetic()){ Team dest = tile.team(); if(dest == editor.drawTeam) return; - fill(editor, x, y, false, t -> t.getTeamID() == dest.id && t.synthetic(), t -> t.setTeam(editor.drawTeam)); + fill(x, y, false, t -> t.getTeamID() == dest.id && t.synthetic(), t -> t.setTeam(editor.drawTeam)); } } } - void fill(MapEditor editor, int x, int y, boolean replace, Boolf tester, Cons filler){ + void fill(int x, int y, boolean replace, Boolf tester, Cons filler){ int width = editor.width(), height = editor.height(); if(replace){ @@ -215,7 +216,7 @@ public enum EditorTool{ } @Override - public void touched(MapEditor editor, int x, int y){ + public void touched(int x, int y){ //floor spray if(editor.drawBlock.isFloor()){ @@ -263,7 +264,7 @@ public enum EditorTool{ this.key = code; } - public void touched(MapEditor editor, int x, int y){} + public void touched(int x, int y){} - public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){} + public void touchedLine(int x1, int y1, int x2, int y2){} } diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index 49d174779b..b603182e43 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -4,9 +4,11 @@ import arc.files.*; import arc.func.*; import arc.graphics.*; import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import mindustry.content.*; import mindustry.editor.DrawOperation.*; +import mindustry.entities.units.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.io.*; @@ -19,7 +21,7 @@ public class MapEditor{ public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; public StringMap tags = new StringMap(); - public MapRenderer renderer = new MapRenderer(this); + public MapRenderer renderer = new MapRenderer(); private final Context context = new Context(); private OperationStack stack = new OperationStack(); @@ -60,7 +62,7 @@ public class MapEditor{ public void beginEdit(Pixmap pixmap){ reset(); - createTiles(pixmap.getWidth(), pixmap.getHeight()); + createTiles(pixmap.width, pixmap.height); load(() -> MapIO.readImage(pixmap, tiles())); renderer.resize(width(), height()); } @@ -136,7 +138,7 @@ public class MapEditor{ if(isFloor){ tile.setFloor(drawBlock.asFloor()); - }else{ + }else if(!(tile.block().isMultiblock() && !drawBlock.isMultiblock())){ if(drawBlock.rotate && tile.build != null && tile.build.rotation != rotation){ addTileOp(TileOp.get(tile.x, tile.y, (byte)OpType.rotation.ordinal(), (byte)rotation)); } @@ -156,7 +158,7 @@ public class MapEditor{ boolean hasOverlap(int x, int y){ Tile tile = world.tile(x, y); //allow direct replacement of blocks of the same size - if(tile != null && tile.isCenter() && tile.block() != drawBlock && tile.block().size == drawBlock.size){ + if(tile != null && tile.isCenter() && tile.block() != drawBlock && tile.block().size == drawBlock.size && tile.x == x && tile.y == y){ return false; } @@ -167,12 +169,10 @@ public class MapEditor{ for(int dy = 0; dy < drawBlock.size; dy++){ int worldx = dx + offsetx + x; int worldy = dy + offsety + y; - if(!(worldx == x && worldy == y)){ - Tile other = world.tile(worldx, worldy); + Tile other = world.tile(worldx, worldy); - if(other != null && other.block().isMultiblock()){ - return true; - } + if(other != null && other.block().isMultiblock()){ + return true; } } } @@ -180,6 +180,52 @@ public class MapEditor{ return false; } + public void addCliffs(){ + for(Tile tile : world.tiles){ + if(!tile.block().isStatic() || tile.block() == Blocks.cliff) continue; + + int rotation = 0; + for(int i = 0; i < 8; i++){ + Tile other = world.tiles.get(tile.x + Geometry.d8[i].x, tile.y + Geometry.d8[i].y); + if(other != null && !other.block().isStatic()){ + rotation |= (1 << i); + } + } + + if(rotation != 0){ + tile.setBlock(Blocks.cliff); + } + + tile.data = (byte)rotation; + } + + for(Tile tile : world.tiles){ + if(tile.block() != Blocks.cliff && tile.block().isStatic()){ + tile.setBlock(Blocks.air); + } + } + } + + public void addFloorCliffs(){ + for(Tile tile : world.tiles){ + if(!tile.floor().hasSurface() || tile.block() == Blocks.cliff) continue; + + int rotation = 0; + for(int i = 0; i < 8; i++){ + Tile other = world.tiles.get(tile.x + Geometry.d8[i].x, tile.y + Geometry.d8[i].y); + if(other != null && !other.floor().hasSurface()){ + rotation |= (1 << i); + } + } + + if(rotation != 0){ + tile.setBlock(Blocks.cliff); + } + + tile.data = (byte)rotation; + } + } + public void drawCircle(int x, int y, Cons drawer){ for(int rx = -brushSize; rx <= brushSize; rx++){ for(int ry = -brushSize; ry <= brushSize; ry++){ @@ -214,7 +260,7 @@ public class MapEditor{ clearOp(); Tiles previous = world.tiles; - int offsetX = -(width - width()) / 2, offsetY = -(height - height()) / 2; + int offsetX = (width() - width) / 2, offsetY = (height() - height) / 2; loading = true; Tiles tiles = world.resize(width, height); @@ -230,7 +276,17 @@ public class MapEditor{ if(tile.build != null && tile.isCenter()){ tile.build.x = x * tilesize + tile.block().offset; tile.build.y = y * tilesize + tile.block().offset; + + //shift links to account for map resize + Object config = tile.build.config(); + if(config != null){ + Object out = BuildPlan.pointConfig(tile.block(), config, p -> p.sub(offsetX, offsetY)); + if(out != config){ + tile.build.configureAny(out); + } + } } + }else{ tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0)); } @@ -274,7 +330,7 @@ public class MapEditor{ public void addTileOp(long data){ if(loading) return; - if(currentOp == null) currentOp = new DrawOperation(this); + if(currentOp == null) currentOp = new DrawOperation(); currentOp.addOperation(data); renderer.updatePoint(TileOp.x(data), TileOp.y(data)); diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 25733da92e..ac7631cff3 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -1,7 +1,6 @@ package mindustry.editor; import arc.*; -import arc.struct.*; import arc.files.*; import arc.func.*; import arc.graphics.*; @@ -14,8 +13,8 @@ import arc.scene.event.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.content.*; import mindustry.core.GameState.*; @@ -34,8 +33,6 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class MapEditorDialog extends Dialog implements Disposable{ - public final MapEditor editor; - private MapView view; private MapInfoDialog infoDialog; private MapLoadDialog loadDialog; @@ -43,6 +40,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ private MapGenerateDialog generateDialog; private ScrollPane pane; private BaseDialog menu; + private Table blockSelection; private Rules lastSavedRules; private boolean saved = false; private boolean shownWithMap = false; @@ -53,10 +51,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ background(Styles.black); - editor = new MapEditor(); - view = new MapView(editor); - infoDialog = new MapInfoDialog(editor); - generateDialog = new MapGenerateDialog(editor, true); + view = new MapView(); + infoDialog = new MapInfoDialog(); + generateDialog = new MapGenerateDialog(true); menu = new BaseDialog("@menu"); menu.addCloseButton(); @@ -120,7 +117,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ "@editor.exportimage", "@editor.exportimage.description", Icon.fileImage, (Runnable)() -> platform.export(editor.tags.get("name", "unknown"), "png", file -> { Pixmap out = MapIO.writeImage(editor.tiles()); - file.writePNG(out); + file.writePng(out); out.dispose(); }))); }); @@ -156,7 +153,10 @@ public class MapEditorDialog extends Dialog implements Disposable{ } platform.publish(map); - }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.tags.containsKey("steamid") ? editor.tags.get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); + }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> + b.setText(editor.tags.containsKey("steamid") ? + editor.tags.get("author", "").equals(steamPlayerName) ? "@workshop.listing" : "@view.workshop" : + "@editor.publish.workshop")); menu.cont.row(); } @@ -170,7 +170,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ menu.hide(); }).size(swidth * 2f + 10, 60f); - resizeDialog = new MapResizeDialog(editor, (x, y) -> { + resizeDialog = new MapResizeDialog((x, y) -> { if(!(editor.width() == x && editor.height() == y)){ ui.loadAnd(() -> { editor.resize(x, y); @@ -258,7 +258,15 @@ public class MapEditorDialog extends Dialog implements Disposable{ player.clearUnit(); Groups.unit.clear(); Groups.build.clear(); + Groups.weather.clear(); logic.play(); + + if(player.team().core() == null){ + player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); + var unit = UnitTypes.alpha.spawn(player.team(), player.x, player.y); + unit.spawnedByCore = true; + player.unit(unit); + } }); } @@ -386,7 +394,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ } public void build(){ - float size = 60f; + float size = 58f; clearChildren(); table(cont -> { @@ -558,6 +566,21 @@ public class MapEditorDialog extends Dialog implements Disposable{ t.add(slider).width(size * 3f - 20).padTop(4f); }).padTop(5).growX().top(); + mid.row(); + + if(!mobile){ + mid.table(t -> { + t.button("@editor.center", Icon.move, Styles.cleart, view::center).growX().margin(9f); + }).growX().top(); + } + + if(experimental){ + mid.row(); + + mid.table(t -> { + t.button("Cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f); + }).growX().top(); + } }).margin(0).left().growY(); @@ -613,7 +636,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ Tile tile = editor.tile(x, y); - if(tile.block().breakable && tile.block() instanceof Boulder){ + if(tile.block().breakable && tile.block() instanceof Prop){ tile.setBlock(Blocks.air); editor.renderer.updatePoint(x, y); } @@ -646,9 +669,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ ui.showConfirm("@confirm", "@editor.unsaved", this::hide); } - private void addBlockSelection(Table table){ - Table content = new Table(); - pane = new ScrollPane(content); + private void addBlockSelection(Table cont){ + blockSelection = new Table(); + pane = new ScrollPane(blockSelection); pane.setFadeScrollBars(false); pane.setOverscroll(true, false); pane.exited(() -> { @@ -656,9 +679,22 @@ public class MapEditorDialog extends Dialog implements Disposable{ Core.scene.setScrollFocus(view); } }); - ButtonGroup group = new ButtonGroup<>(); - int i = 0; + cont.table(search -> { + search.image(Icon.zoom).padRight(8); + search.field("", this::rebuildBlockSelection) + .name("editor/search").maxTextLength(maxNameLength).get().setMessageText("@players.search"); + }).pad(-2); + cont.row(); + cont.table(Tex.underline, extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX(); + cont.row(); + cont.add(pane).expandY().top().left(); + + rebuildBlockSelection(""); + } + + private void rebuildBlockSelection(String searchText){ + blockSelection.clear(); blocksOut.clear(); blocksOut.addAll(Vars.content.blocks()); @@ -672,28 +708,32 @@ public class MapEditorDialog extends Dialog implements Disposable{ return Integer.compare(b1.id, b2.id); }); - for(Block block : blocksOut){ - TextureRegion region = block.icon(Cicon.medium); + int i = 0; - if(!Core.atlas.isFound(region) || !block.inEditor || (block.buildVisibility == BuildVisibility.debugOnly)) continue; + for(Block block : blocksOut){ + TextureRegion region = block.uiIcon; + + if(!Core.atlas.isFound(region) || !block.inEditor + || block.buildVisibility == BuildVisibility.debugOnly + || (!searchText.isEmpty() && !block.localizedName.toLowerCase().contains(searchText.toLowerCase())) + ) continue; ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglei); button.getStyle().imageUp = new TextureRegionDrawable(region); button.clicked(() -> editor.drawBlock = block); button.resizeImage(8 * 4f); button.update(() -> button.setChecked(editor.drawBlock == block)); - group.add(button); - content.add(button).size(50f); + blockSelection.add(button).size(50f).tooltip(block.localizedName); + + if(i == 0) editor.drawBlock = block; if(++i % 4 == 0){ - content.row(); + blockSelection.row(); } } - group.getButtons().get(2).setChecked(true); - - table.table(Tex.underline, extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX(); - table.row(); - table.add(pane).growY().fillX(); + if(i == 0){ + blockSelection.add("@none").color(Color.lightGray).padLeft(80f).padTop(10f); + } } } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index a4a4c0c181..71f4f60264 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -26,66 +26,114 @@ import static mindustry.Vars.*; @SuppressWarnings("unchecked") public class MapGenerateDialog extends BaseDialog{ - private final Prov[] filterTypes = new Prov[]{ + final Prov[] filterTypes = new Prov[]{ NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new, RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new, - BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new, EnemySpawnFilter::new + BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new, + EnemySpawnFilter::new, SpawnPathFilter::new }; - private final MapEditor editor; - private final boolean applied; + final boolean applied; - private Pixmap pixmap; - private Texture texture; - private GenerateInput input = new GenerateInput(); + Pixmap pixmap; + Texture texture; + GenerateInput input = new GenerateInput(); Seq filters = new Seq<>(); - private int scaling = mobile ? 3 : 1; - private Table filterTable; + int scaling = mobile ? 3 : 1; + Table filterTable; - private AsyncExecutor executor = new AsyncExecutor(1); - private AsyncResult result; + AsyncExecutor executor = new AsyncExecutor(1); + AsyncResult result; boolean generating; - private GenTile returnTile = new GenTile(); - private GenTile[][] buffer1, buffer2; - private Cons> applier; + long[] buffer1, buffer2; + Cons> applier; CachedTile ctile = new CachedTile(){ //nothing. @Override - protected void changeEntity(Team team, Prov entityprov, int rotation){ + protected void changeBuild(Team team, Prov entityprov, int rotation){ } + + @Override + public void setBlock(Block type, Team team, int rotation, Prov entityprov){ + this.block = type; + } }; /** @param applied whether or not to use the applied in-game mode. */ - public MapGenerateDialog(MapEditor editor, boolean applied){ + public MapGenerateDialog(boolean applied){ super("@editor.generate"); - this.editor = editor; this.applied = applied; shown(this::setup); - addCloseButton(); + addCloseListener(); + + var style = Styles.cleart; + + buttons.defaults().size(180f, 64f).pad(2f); + buttons.button("@back", Icon.left, this::hide); + if(applied){ - buttons.button("@editor.apply", () -> { + buttons.button("@editor.apply", Icon.ok, () -> { ui.loadAnd(() -> { apply(); hide(); }); - }).size(160f, 64f); - }else{ - buttons.button("@settings.reset", () -> { - filters.set(maps.readFilters("")); - rebuildFilters(); - update(); - }).size(160f, 64f); + }); } - buttons.button("@editor.randomize", () -> { + + buttons.button("@editor.randomize", Icon.refresh, () -> { for(GenerateFilter filter : filters){ filter.randomize(); } update(); - }).size(160f, 64f); + }); - buttons.button("@add", Icon.add, this::showAdd).height(64f).width(140f); + buttons.button("@edit", Icon.edit, () -> { + BaseDialog dialog = new BaseDialog("@editor.export"); + dialog.cont.pane(p -> { + p.margin(10f); + p.table(Tex.button, in -> { + in.defaults().size(280f, 60f).left(); + + in.button("@waves.copy", Icon.copy, style, () -> { + dialog.hide(); + + Core.app.setClipboardText(JsonIO.write(filters)); + }).marginLeft(12f).row(); + in.button("@waves.load", Icon.download, style, () -> { + dialog.hide(); + try{ + filters.set(JsonIO.read(Seq.class, Core.app.getClipboardText())); + + rebuildFilters(); + update(); + }catch(Throwable e){ + ui.showException(e); + } + }).marginLeft(12f).disabled(b -> Core.app.getClipboardText() == null).row(); + in.button("@clear", Icon.none, style, () -> { + dialog.hide(); + filters.clear(); + rebuildFilters(); + update(); + }).marginLeft(12f).row(); + if(!applied){ + in.button("@settings.reset", Icon.refresh, style, () -> { + dialog.hide(); + filters.set(maps.readFilters("")); + rebuildFilters(); + update(); + }).marginLeft(12f).row(); + } + }); + }); + + dialog.addCloseButton(); + dialog.show(); + }); + + buttons.button("@add", Icon.add, this::showAdd); if(!applied){ hidden(this::apply); @@ -107,38 +155,36 @@ public class MapGenerateDialog extends BaseDialog{ /** Applies the specified filters to the editor. */ public void applyToEditor(Seq filters){ //writeback buffer - GenTile[][] writeTiles = new GenTile[editor.width()][editor.height()]; - - for(int x = 0; x < editor.width(); x++){ - for(int y = 0; y < editor.height(); y++){ - writeTiles[x][y] = new GenTile(); - } - } + long[] writeTiles = new long[editor.width() * editor.height()]; for(GenerateFilter filter : filters){ input.begin(filter, editor.width(), editor.height(), editor::tile); + //write to buffer for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ Tile tile = editor.tile(x, y); - input.apply(x, y, tile.floor(), tile.block(), tile.overlay()); + input.apply(x, y, tile.block(), tile.floor(), tile.overlay()); filter.apply(input); - writeTiles[x][y].set(input.floor, input.block, input.ore, tile.team()); + writeTiles[x + y*world.width()] = PackTile.get(input.block.id, input.floor.id, input.overlay.id); } } editor.load(() -> { //read from buffer back into tiles - for(int x = 0; x < editor.width(); x++){ - for(int y = 0; y < editor.height(); y++){ - Tile tile = editor.tile(x, y); - GenTile write = writeTiles[x][y]; + for(int i = 0; i < editor.width() * editor.height(); i++){ + Tile tile = world.tiles.geti(i); + long write = writeTiles[i]; - tile.setFloor((Floor)content.block(write.floor)); - tile.setBlock(content.block(write.block)); - tile.setTeam(Team.get(write.team)); - tile.setOverlay(content.block(write.ore)); + Block block = content.block(PackTile.block(write)), floor = content.block(PackTile.floor(write)), overlay = content.block(PackTile.overlay(write)); + + //don't mess up synthetic stuff. + if(!tile.synthetic() && !block.synthetic()){ + tile.setBlock(block); } + + tile.setFloor((Floor)floor); + tile.setOverlay(overlay); } }); } @@ -170,7 +216,7 @@ public class MapGenerateDialog extends BaseDialog{ @Override public void draw(){ super.draw(); - for(GenerateFilter filter : filters){ + for(var filter : filters){ filter.draw(this); } } @@ -201,15 +247,8 @@ public class MapGenerateDialog extends BaseDialog{ rebuildFilters(); } - GenTile[][] create(){ - GenTile[][] out = new GenTile[editor.width() / scaling][editor.height() / scaling]; - - for(int x = 0; x < out.length; x++){ - for(int y = 0; y < out[0].length; y++){ - out[x][y] = new GenTile(); - } - } - return out; + long[] create(){ + return new long[(editor.width() / scaling) * (editor.height() / scaling)]; } void rebuildFilters(){ @@ -218,7 +257,7 @@ public class MapGenerateDialog extends BaseDialog{ filterTable.top().left(); int i = 0; - for(GenerateFilter filter : filters){ + for(var filter : filters){ //main container filterTable.table(Tex.pane, c -> { @@ -288,38 +327,48 @@ public class MapGenerateDialog extends BaseDialog{ } void showAdd(){ - BaseDialog selection = new BaseDialog("@add"); - selection.setFillParent(false); - selection.cont.defaults().size(210f, 60f); - int i = 0; - for(Prov gen : filterTypes){ - GenerateFilter filter = gen.get(); + var selection = new BaseDialog("@add"); + selection.cont.pane(p -> { + p.background(Tex.button); + p.marginRight(14); + p.defaults().size(195f, 56f); + int i = 0; + for(var gen : filterTypes){ + var filter = gen.get(); + var icon = filter.icon(); - if((!applied && filter.isBuffered()) || (filter.isPost() && applied)) continue; + if(filter.isPost() && applied) continue; - selection.cont.button(filter.name(), () -> { - filters.add(filter); + p.button((icon == '\0' ? "" : icon + " ") + filter.name(), Styles.cleart, () -> { + filters.add(filter); + rebuildFilters(); + update(); + selection.hide(); + }).with(Table::left).get().getLabelCell().growX().left().padLeft(5).labelAlign(Align.left); + if(++i % 3 == 0) p.row(); + } + + p.button(Iconc.refresh + " " + Core.bundle.get("filter.defaultores"), Styles.cleart, () -> { + maps.addDefaultOres(filters); rebuildFilters(); update(); selection.hide(); - }); - if(++i % 2 == 0) selection.cont.row(); - } - - selection.cont.button("@filter.defaultores", () -> { - maps.addDefaultOres(filters); - rebuildFilters(); - update(); - selection.hide(); - }); + }).with(Table::left).get().getLabelCell().growX().left().padLeft(5).labelAlign(Align.left); + }).get().setScrollingDisabled(true, false); selection.addCloseButton(); selection.show(); } - GenTile dset(Tile tile){ - returnTile.set(tile); - return returnTile; + long pack(Tile tile){ + return PackTile.get(tile.blockID(), tile.floorID(), tile.overlayID()); + } + + Tile unpack(long tile){ + ctile.setFloor((Floor)content.block(PackTile.floor(tile))); + ctile.setBlock(content.block(PackTile.block(tile))); + ctile.setOverlay(content.block(PackTile.overlay(tile))); + return ctile; } void apply(){ @@ -346,49 +395,50 @@ public class MapGenerateDialog extends BaseDialog{ return; } - Seq copy = new Seq<>(filters); + var copy = filters.copy(); result = executor.submit(() -> { try{ + int w = pixmap.width; world.setGenerating(true); generating = true; if(!filters.isEmpty()){ //write to buffer1 for reading - for(int px = 0; px < pixmap.getWidth(); px++){ - for(int py = 0; py < pixmap.getHeight(); py++){ - buffer1[px][py].set(editor.tile(px * scaling, py * scaling)); + for(int px = 0; px < pixmap.width; px++){ + for(int py = 0; py < pixmap.height; py++){ + buffer1[px + py*w] = pack(editor.tile(px * scaling, py * scaling)); } } } - for(GenerateFilter filter : copy){ - input.begin(filter, editor.width(), editor.height(), (x, y) -> buffer1[Mathf.clamp(x / scaling, 0, pixmap.getWidth()-1)][Mathf.clamp(y / scaling, 0, pixmap.getHeight()-1)].tile()); + for(var filter : copy){ + input.begin(filter, editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.width -1) + w* Mathf.clamp(y / scaling, 0, pixmap.height -1)])); //read from buffer1 and write to buffer2 pixmap.each((px, py) -> { int x = px * scaling, y = py * scaling; - GenTile tile = buffer1[px][py]; - input.apply(x, y, content.block(tile.floor), content.block(tile.block), content.block(tile.ore)); + long tile = buffer1[px + py * w]; + input.apply(x, y, content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile))); filter.apply(input); - buffer2[px][py].set(input.floor, input.block, input.ore, Team.get(tile.team)); + buffer2[px + py * w] = PackTile.get(input.block.id, input.floor.id, input.overlay.id); }); - pixmap.each((px, py) -> buffer1[px][py].set(buffer2[px][py])); + pixmap.each((px, py) -> buffer1[px + py*w] = buffer2[px + py*w]); } - for(int px = 0; px < pixmap.getWidth(); px++){ - for(int py = 0; py < pixmap.getHeight(); py++){ + for(int px = 0; px < pixmap.width; px++){ + for(int py = 0; py < pixmap.height; py++){ int color; //get result from buffer1 if there's filters left, otherwise get from editor directly if(filters.isEmpty()){ Tile tile = editor.tile(px * scaling, py * scaling); - color = MapIO.colorFor(tile.floor(), tile.block(), tile.overlay(), Team.derelict); + color = MapIO.colorFor(tile.block(), tile.floor(), tile.overlay(), Team.derelict); }else{ - GenTile tile = buffer1[px][py]; - color = MapIO.colorFor(content.block(tile.floor), content.block(tile.block), content.block(tile.ore), Team.derelict); + long tile = buffer1[px + py*w]; + color = MapIO.colorFor(content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile)), Team.derelict); } - pixmap.draw(px, pixmap.getHeight() - 1 - py, color); + pixmap.set(px, pixmap.height - 1 - py, color); } } @@ -401,44 +451,9 @@ public class MapGenerateDialog extends BaseDialog{ }); }catch(Exception e){ generating = false; - e.printStackTrace(); + Log.err(e); } world.setGenerating(false); }); } - - private class GenTile{ - public byte team; - public short block, floor, ore; - - GenTile(){ - } - - public void set(Block floor, Block wall, Block ore, Team team){ - this.floor = floor.id; - this.block = wall.id; - this.ore = floor.asFloor().isLiquid ? 0 : ore.id; - this.team = (byte)team.id; - } - - public void set(GenTile other){ - this.floor = other.floor; - this.block = other.block; - this.ore = other.ore; - this.team = other.team; - } - - public GenTile set(Tile other){ - set(other.floor(), other.block(), other.overlay(), other.team()); - return this; - } - - Tile tile(){ - ctile.setFloor((Floor)content.block(floor)); - ctile.setBlock(content.block(block)); - ctile.setOverlay(content.block(ore)); - ctile.setTeam(Team.get(team)); - return ctile; - } - } } diff --git a/core/src/mindustry/editor/MapInfoDialog.java b/core/src/mindustry/editor/MapInfoDialog.java index c46e06f36d..a18828f1f0 100644 --- a/core/src/mindustry/editor/MapInfoDialog.java +++ b/core/src/mindustry/editor/MapInfoDialog.java @@ -1,25 +1,25 @@ package mindustry.editor; import arc.*; -import arc.struct.*; import arc.scene.ui.*; +import arc.struct.*; import mindustry.*; import mindustry.game.*; import mindustry.io.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; +import static mindustry.Vars.*; + public class MapInfoDialog extends BaseDialog{ - private final MapEditor editor; private final WaveInfoDialog waveInfo; private final MapGenerateDialog generate; private final CustomRulesDialog ruleInfo = new CustomRulesDialog(); - public MapInfoDialog(MapEditor editor){ + public MapInfoDialog(){ super("@editor.mapinfo"); - this.editor = editor; - this.waveInfo = new WaveInfoDialog(editor); - this.generate = new MapGenerateDialog(editor, false); + this.waveInfo = new WaveInfoDialog(); + this.generate = new MapGenerateDialog(false); addCloseButton(); diff --git a/core/src/mindustry/editor/MapLoadDialog.java b/core/src/mindustry/editor/MapLoadDialog.java index 53673ae9d2..4ed63a1a7f 100644 --- a/core/src/mindustry/editor/MapLoadDialog.java +++ b/core/src/mindustry/editor/MapLoadDialog.java @@ -8,7 +8,7 @@ import mindustry.maps.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; -import static mindustry.Vars.maps; +import static mindustry.Vars.*; public class MapLoadDialog extends BaseDialog{ private Map selected = null; diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index 919c534128..abbd4baa1a 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -18,14 +18,7 @@ public class MapRenderer implements Disposable{ private IndexedRenderer[][] chunks; private IntSet updates = new IntSet(); private IntSet delayedUpdates = new IntSet(); - private MapEditor editor; private int width, height; - private Texture texture; - - public MapRenderer(MapEditor editor){ - this.editor = editor; - this.texture = Core.atlas.find("clear-editor").texture; - } public void resize(int width, int height){ updates.clear(); @@ -64,6 +57,8 @@ public class MapRenderer implements Disposable{ return; } + var texture = Core.atlas.find("clear-editor").texture; + for(int x = 0; x < chunks.length; x++){ for(int y = 0; y < chunks[0].length; y++){ IndexedRenderer mesh = chunks[x][y]; diff --git a/core/src/mindustry/editor/MapResizeDialog.java b/core/src/mindustry/editor/MapResizeDialog.java index b3e190b020..f95edff43f 100644 --- a/core/src/mindustry/editor/MapResizeDialog.java +++ b/core/src/mindustry/editor/MapResizeDialog.java @@ -6,12 +6,14 @@ import arc.scene.ui.TextField.*; import arc.scene.ui.layout.*; import arc.util.*; import mindustry.ui.dialogs.*; +import static mindustry.Vars.*; public class MapResizeDialog extends BaseDialog{ - private static final int minSize = 50, maxSize = 500, increment = 50; + public static int minSize = 50, maxSize = 500, increment = 50; + int width, height; - public MapResizeDialog(MapEditor editor, Intc2 cons){ + public MapResizeDialog(Intc2 cons){ super("@editor.resizemap"); shown(() -> { cont.clear(); diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 21e659ae1b..fce417ecad 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -1,27 +1,24 @@ package mindustry.editor; -import arc.Core; -import arc.graphics.Color; +import arc.*; +import arc.graphics.*; import arc.graphics.g2d.*; -import arc.input.GestureDetector; -import arc.input.GestureDetector.GestureListener; -import arc.input.KeyCode; -import arc.math.Mathf; +import arc.input.*; +import arc.input.GestureDetector.*; +import arc.math.*; import arc.math.geom.*; -import arc.scene.Element; +import arc.scene.*; import arc.scene.event.*; -import arc.scene.ui.TextField; -import arc.scene.ui.layout.Scl; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; import arc.util.*; -import mindustry.graphics.Pal; -import mindustry.input.Binding; -import mindustry.ui.GridImage; +import mindustry.graphics.*; +import mindustry.input.*; +import mindustry.ui.*; -import static mindustry.Vars.mobile; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class MapView extends Element implements GestureListener{ - private MapEditor editor; EditorTool tool = EditorTool.pencil; private float offsetx, offsety; private float zoom = 1f; @@ -37,8 +34,7 @@ public class MapView extends Element implements GestureListener{ float mousex, mousey; EditorTool lastTool; - public MapView(MapEditor editor){ - this.editor = editor; + public MapView(){ for(int i = 0; i < MapEditor.brushSizes.length; i++){ float size = MapEditor.brushSizes[i]; @@ -94,7 +90,7 @@ public class MapView extends Element implements GestureListener{ lasty = p.y; startx = p.x; starty = p.y; - tool.touched(editor, p.x, p.y); + tool.touched(p.x, p.y); firstTouch.set(p); if(tool.edit){ @@ -117,7 +113,7 @@ public class MapView extends Element implements GestureListener{ if(tool == EditorTool.line){ ui.editor.resetSaved(); - tool.touchedLine(editor, startx, starty, p.x, p.y); + tool.touchedLine(startx, starty, p.x, p.y); } editor.flushOp(); @@ -138,7 +134,7 @@ public class MapView extends Element implements GestureListener{ if(drawing && tool.draggable && !(p.x == lastx && p.y == lasty)){ ui.editor.resetSaved(); - Bresenham2.line(lastx, lasty, p.x, p.y, (cx, cy) -> tool.touched(editor, cx, cy)); + Bresenham2.line(lastx, lasty, p.x, p.y, (cx, cy) -> tool.touched(cx, cy)); } if(tool == EditorTool.line && tool.mode == 1){ @@ -173,6 +169,10 @@ public class MapView extends Element implements GestureListener{ this.grid = grid; } + public void center(){ + offsetx = offsety = 0; + } + @Override public void act(float delta){ super.act(delta); @@ -241,14 +241,14 @@ public class MapView extends Element implements GestureListener{ image.setImageSize(editor.width(), editor.height()); - if(!ScissorStack.push(rect.set(x, y, width, height))){ + if(!ScissorStack.push(rect.set(x, y + Core.scene.marginBottom, width, height))){ return; } Draw.color(Pal.remove); Lines.stroke(2f); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); - editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); + editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2 + Core.scene.marginBottom, sclwidth, sclheight); Draw.reset(); if(grid){ @@ -319,7 +319,7 @@ public class MapView extends Element implements GestureListener{ } private boolean active(){ - return Core.scene.getKeyboardFocus() != null + return Core.scene != null && Core.scene.getKeyboardFocus() != null && Core.scene.getKeyboardFocus().isDescendantOf(ui.editor) && ui.editor.isShown() && tool == EditorTool.zoom && Core.scene.hit(Core.input.mouse().x, Core.input.mouse().y, true) == this; diff --git a/core/src/mindustry/editor/OperationStack.java b/core/src/mindustry/editor/OperationStack.java index 0558de14bc..91bb183457 100755 --- a/core/src/mindustry/editor/OperationStack.java +++ b/core/src/mindustry/editor/OperationStack.java @@ -1,6 +1,6 @@ package mindustry.editor; -import arc.struct.Seq; +import arc.struct.*; public class OperationStack{ private static final int maxSize = 10; diff --git a/core/src/mindustry/editor/WaveGraph.java b/core/src/mindustry/editor/WaveGraph.java index 14b2416085..cc36f22620 100644 --- a/core/src/mindustry/editor/WaveGraph.java +++ b/core/src/mindustry/editor/WaveGraph.java @@ -17,7 +17,7 @@ import mindustry.ui.*; public class WaveGraph extends Table{ public Seq groups = new Seq<>(); - public int from, to = 20; + public int from = 0, to = 20; private Mode mode = Mode.counts; private int[][] values; @@ -81,7 +81,7 @@ public class WaveGraph extends Table{ for(int i = 0; i < values.length; i++){ float sum = 0; for(UnitType type : used.orderedItems()){ - sum += type.health * values[i][type.id]; + sum += (type.health) * values[i][type.id]; } float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxHealth; @@ -114,7 +114,7 @@ public class WaveGraph extends Table{ Lines.line(cx, cy, cx, cy + len); if(i == values.length/2){ - font.draw("" + (i + from), cx, cy - 2f, Align.center); + font.draw("" + (i + from + 1), cx, cy - 2f, Align.center); } } font.setColor(Color.white); @@ -154,13 +154,13 @@ public class WaveGraph extends Table{ int sum = 0; for(SpawnGroup spawn : groups){ - int spawned = spawn.getUnitsSpawned(i); + int spawned = spawn.getSpawned(i); values[index][spawn.type.id] += spawned; if(spawned > 0){ used.add(spawn.type); } max = Math.max(max, values[index][spawn.type.id]); - healthsum += spawned * spawn.type.health; + healthsum += spawned * (spawn.type.health); sum += spawned; } maxTotal = Math.max(maxTotal, sum); @@ -177,7 +177,7 @@ public class WaveGraph extends Table{ t.button(b -> { Color tcolor = color(type).cpy(); b.image().size(32f).update(i -> i.setColor(b.isChecked() ? Tmp.c1.set(tcolor).mul(0.5f) : tcolor)).get().act(1); - b.image(type.icon(Cicon.medium)).padRight(20).update(i -> i.setColor(b.isChecked() ? Color.gray : Color.white)).get().act(1); + b.image(type.uiIcon).size(32f).padRight(20).update(i -> i.setColor(b.isChecked() ? Color.gray : Color.white)).get().act(1); b.margin(0f); }, Styles.fullTogglet, () -> { if(!hidden.add(type)){ diff --git a/core/src/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java index d5b957e143..d83fa11f3e 100644 --- a/core/src/mindustry/editor/WaveInfoDialog.java +++ b/core/src/mindustry/editor/WaveInfoDialog.java @@ -1,7 +1,6 @@ package mindustry.editor; import arc.*; -import arc.input.*; import arc.math.*; import arc.scene.event.*; import arc.scene.ui.*; @@ -31,19 +30,13 @@ public class WaveInfoDialog extends BaseDialog{ private float updateTimer, updatePeriod = 1f; private WaveGraph graph = new WaveGraph(); - public WaveInfoDialog(MapEditor editor){ + public WaveInfoDialog(){ super("@waves.title"); shown(this::setup); - hidden(() -> { - state.rules.spawns = groups; - }); + hidden(() -> state.rules.spawns = groups); - keyDown(key -> { - if(key == KeyCode.escape || key == KeyCode.back){ - Core.app.post(this::hide); - } - }); + addCloseListener(); onResize(this::setup); addCloseButton(); @@ -71,7 +64,7 @@ public class WaveInfoDialog extends BaseDialog{ }).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()); dialog.cont.row(); dialog.cont.button("@settings.reset", () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> { - groups = JsonIO.copy(defaultWaves.get()); + groups = JsonIO.copy(waves.get()); buildGroups(); dialog.hide(); })); @@ -101,6 +94,14 @@ public class WaveInfoDialog extends BaseDialog{ view(1); } }); + + if(experimental){ + buttons.button("Random", Icon.refresh, () -> { + groups.clear(); + groups = Waves.generate(1f / 10f); + updateWaves(); + }).width(200f); + } } void view(int amount){ @@ -124,7 +125,7 @@ public class WaveInfoDialog extends BaseDialog{ } void setup(){ - groups = JsonIO.copy(state.rules.spawns.isEmpty() ? defaultWaves.get() : state.rules.spawns); + groups = JsonIO.copy(state.rules.spawns.isEmpty() ? waves.get() : state.rules.spawns); cont.clear(); cont.stack(new Table(Tex.clear, main -> { @@ -159,7 +160,7 @@ public class WaveInfoDialog extends BaseDialog{ t.margin(0).defaults().pad(3).padLeft(5f).growX().left(); t.button(b -> { b.left(); - b.image(group.type.icon(mindustry.ui.Cicon.medium)).size(32f).padRight(3); + b.image(group.type.uiIcon).size(32f).padRight(3).scaling(Scaling.fit); b.add(group.type.localizedName).color(Pal.accent); b.add().growX(); @@ -189,7 +190,7 @@ public class WaveInfoDialog extends BaseDialog{ group.end = never; updateWaves(); } - }).width(100f).get().setMessageText(Core.bundle.get("waves.never")); + }).width(100f).get().setMessageText("∞"); }); t.row(); t.table(p -> { @@ -262,7 +263,7 @@ public class WaveInfoDialog extends BaseDialog{ if(type.isHidden()) continue; p.button(t -> { t.left(); - t.image(type.icon(Cicon.medium)).size(40f).padRight(2f); + t.image(type.uiIcon).size(8 * 4).scaling(Scaling.fit).padRight(2f); t.add(type.localizedName); }, () -> { lastType = type; diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index e22891eba5..beb1e2b6c3 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -2,13 +2,12 @@ package mindustry.entities; import arc.*; import arc.func.*; -import arc.graphics.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; -import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; @@ -23,31 +22,38 @@ public class Damage{ private static Tile furthest; private static Rect rect = new Rect(); private static Rect hitrect = new Rect(); - private static Vec2 tr = new Vec2(); - private static GridBits bits = new GridBits(30, 30); - private static IntQueue propagation = new IntQueue(); + private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2(); + private static Seq units = new Seq<>(); private static IntSet collidedBlocks = new IntSet(); private static Building tmpBuilding; private static Unit tmpUnit; + private static IntFloatMap damages = new IntFloatMap(); /** Creates a dynamic explosion based on specified parameters. */ - public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color, boolean damage){ + public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){ + dynamicExplosion(x, y, flammability, explosiveness, power, radius, damage, true, null); + } + + /** Creates a dynamic explosion based on specified parameters. */ + public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam){ if(damage){ - for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){ - int branches = 5 + Mathf.clamp((int)(power / 30), 1, 20); - Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2))); + for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){ + int length = 5 + Mathf.clamp((int)(power / 500), 1, 20); + Time.run(i * 0.8f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), length + Mathf.range(2))); } - for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ - Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), Bullets.fireball.damage, 1, 1)); + if(fire){ + for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ + Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), Bullets.fireball.damage, 1, 1)); + } } - int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30); + int waves = explosiveness <= 2 ? 0 : Mathf.clamp((int)(explosiveness / 11), 1, 25); for(int i = 0; i < waves; i++){ int f = i; Time.run(i * 2f, () -> { - Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f); + damage(ignoreTeam, x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f, false); Fx.blockExplosionSmoke.at(x + Mathf.range(radius), y + Mathf.range(radius)); }); } @@ -77,12 +83,21 @@ public class Damage{ } } + public static @Nullable Building findAbsorber(Team team, float x1, float y1, float x2, float y2){ + tmpBuilding = null; + + boolean found = world.raycast(World.toTile(x1), World.toTile(y1), World.toTile(x2), World.toTile(y2), + (x, y) -> (tmpBuilding = world.build(x, y)) != null && tmpBuilding.team != team && tmpBuilding.block.absorbLasers); + + return found ? tmpBuilding : null; + } + public static float findLaserLength(Bullet b, float length){ - Tmp.v1.trns(b.rotation(), length); + Tmp.v1.trnsExact(b.rotation(), length); furthest = null; - boolean found = world.raycast(b.tileX(), b.tileY(), world.toTile(b.x + Tmp.v1.x), world.toTile(b.y + Tmp.v1.y), + boolean found = world.raycast(b.tileX(), b.tileY(), World.toTile(b.x + Tmp.v1.x), World.toTile(b.y + Tmp.v1.y), (x, y) -> (furthest = world.tile(x, y)) != null && furthest.team() != b.team && furthest.block().absorbLasers); return found && furthest != null ? Math.max(6f, b.dst(furthest.worldx(), furthest.worldy())) : length; @@ -108,24 +123,47 @@ public class Damage{ * Only enemies of the specified team are damaged. */ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ - length = findLaserLength(hitter, length); + collideLine(hitter, team, effect, x, y, angle, length, large, true); + } + + /** + * Damages entities in a line. + * Only enemies of the specified team are damaged. + */ + public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large, boolean laser){ + if(laser) length = findLaserLength(hitter, length); collidedBlocks.clear(); - tr.trns(angle, length); + tr.trnsExact(angle, length); + Intc2 collider = (cx, cy) -> { Building tile = world.build(cx, cy); - if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.team != team && tile.collide(hitter)){ - tile.collision(hitter); - collidedBlocks.add(tile.pos()); - hitter.type.hit(hitter, tile.x, tile.y); + boolean collide = tile != null && collidedBlocks.add(tile.pos()); + + if(hitter.damage > 0){ + float health = !collide ? 0 : tile.health; + + if(collide && tile.team != team && tile.collide(hitter)){ + tile.collision(hitter); + hitter.type.hit(hitter, tile.x, tile.y); + } + + //try to heal the tile + if(collide && hitter.type.testCollision(hitter, tile)){ + hitter.type.hitTile(hitter, tile, health, false); + } } }; if(hitter.type.collidesGround){ - world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> { + seg1.set(x, y); + seg2.set(seg1).add(tr); + world.raycastEachWorld(x, y, seg2.x, seg2.y, (cx, cy) -> { collider.get(cx, cy); - if(large){ - for(Point2 p : Geometry.d4){ + + for(Point2 p : Geometry.d4){ + Tile other = world.tile(p.x + cx, p.y + cy); + if(other != null && (large || Intersector.intersectSegmentRectangle(seg1, seg2, other.getBounds(Tmp.r1)))){ collider.get(cx + p.x, cy + p.y); } } @@ -154,20 +192,27 @@ public class Damage{ rect.height += expand * 2; Cons cons = e -> { - if(!e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return; - e.hitbox(hitrect); Vec2 vec = Geometry.raycastRect(x, y, x2, y2, hitrect.grow(expand * 2)); - if(vec != null){ + if(vec != null && hitter.damage > 0){ effect.at(vec.x, vec.y); e.collision(hitter, vec.x, vec.y); hitter.collision(e, vec.x, vec.y); } }; - Units.nearbyEnemies(team, rect, cons); + units.clear(); + + Units.nearbyEnemies(team, rect, u -> { + if(u.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)){ + units.add(u); + } + }); + + units.sort(u -> u.dst2(hitter)); + units.each(cons); } /** @@ -176,10 +221,10 @@ public class Damage{ */ public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){ tr.trns(angle, length); + + tmpBuilding = null; if(hitter.type.collidesGround){ - tmpBuilding = null; - world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> { Building tile = world.build(cx, cy); if(tile != null && tile.team != hitter.team){ @@ -188,8 +233,6 @@ public class Damage{ } return false; }); - - if(tmpBuilding != null) return tmpBuilding; } rect.setPosition(x, y).setSize(tr.x, tr.y); @@ -214,7 +257,7 @@ public class Damage{ tmpUnit = null; - Cons cons = e -> { + Units.nearbyEnemies(hitter.team, rect, e -> { if((tmpUnit != null && e.dst2(x, y) > tmpUnit.dst2(x, y)) || !e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return; e.hitbox(hitrect); @@ -229,9 +272,15 @@ public class Damage{ if(vec != null){ tmpUnit = e; } - }; + }); - Units.nearbyEnemies(hitter.team, rect, cons); + if(tmpBuilding != null && tmpUnit != null){ + if(Mathf.dst2(x, y, tmpBuilding.getX(), tmpBuilding.getY()) <= Mathf.dst2(x, y, tmpUnit.getX(), tmpUnit.getY())){ + return tmpBuilding; + } + }else if(tmpBuilding != null){ + return tmpBuilding; + } return tmpUnit; } @@ -321,64 +370,84 @@ public class Damage{ if(ground){ if(!complete){ - int trad = (int)(radius / tilesize); - Tile tile = world.tileWorld(x, y); - if(tile != null){ - tileDamage(team, tile.x, tile.y, trad, damage); - } + tileDamage(team, World.toTile(x), World.toTile(y), radius / tilesize, damage); }else{ completeDamage(team, x, y, radius, damage); } } } - public static void tileDamage(Team team, int startx, int starty, int baseRadius, float baseDamage){ - //tile damage is posted, so that destroying a block that causes a chain explosion will run in the next frame - //this prevents recursive damage calls from messing up temporary variables + public static void tileDamage(Team team, int x, int y, float baseRadius, float damage){ + Core.app.post(() -> { - bits.clear(); - propagation.clear(); - int bitOffset = bits.width() / 2; + var in = world.build(x, y); + //spawned inside a multiblock. this means that damage needs to be dealt directly. + //why? because otherwise the building would absorb everything in one cell, which means much less damage than a nearby explosion. + //this needs to be compensated + if(in != null && in.team != team && in.block.size > 1 && in.health > damage){ + //deal the damage of an entire side, to be equivalent with maximum 'standard' damage + in.damage(team, damage * Math.min((in.block.size), baseRadius * 0.4f)); + //no need to continue with the explosion + return; + } - propagation.addFirst(PropCell.get((byte)0, (byte)0, (short)baseDamage)); - //clamp radius to fit bits - int radius = Math.min(baseRadius, bits.width() / 2); + //cap radius to prevent lag + float radius = Math.min(baseRadius, 30), rad2 = radius * radius; + int rays = Mathf.ceil(radius * 2 * Mathf.pi); + double spacing = Math.PI * 2.0 / rays; + damages.clear(); - while(!propagation.isEmpty()){ - int prop = propagation.removeLast(); - int x = PropCell.x(prop); - int y = PropCell.y(prop); - int damage = PropCell.damage(prop); - //manhattan distance used for calculating falloff, results in a diamond pattern - int dst = Math.abs(x) + Math.abs(y); + //raycast from each angle + for(int i = 0; i <= rays; i++){ + float dealt = 0f; + int startX = x; + int startY = y; + int endX = x + (int)(Math.cos(spacing * i) * radius), endY = y + (int)(Math.sin(spacing * i) * radius); - int scaledDamage = (int)(damage * (1f - (float)dst / radius)); + int xDist = Math.abs(endX - startX); + int yDist = -Math.abs(endY - startY); + int xStep = (startX < endX ? +1 : -1); + int yStep = (startY < endY ? +1 : -1); + int error = xDist + yDist; - bits.set(bitOffset + x, bitOffset + y); - Tile tile = world.tile(startx + x, starty + y); + while(startX != endX || startY != endY){ + var build = world.build(startX, startY); + if(build != null && build.team != team){ + //damage dealt at circle edge + float edgeScale = 0.6f; + float mult = (1f-(Mathf.dst2(startX, startY, x, y) / rad2) + edgeScale) / (1f + edgeScale); + float next = damage * mult - dealt; + //register damage dealt + int p = Point2.pack(startX, startY); + damages.put(p, Math.max(damages.get(p), next)); + //register as hit + dealt += build.health; - if(scaledDamage <= 0 || tile == null) continue; - - //apply damage to entity if needed - if(tile.build != null && tile.team() != team){ - int health = (int)tile.build.health(); - if(tile.build.health() > 0){ - tile.build.damage(scaledDamage); - scaledDamage -= health; - - if(scaledDamage <= 0) continue; + if(next - dealt <= 0){ + break; + } } - } - for(Point2 p : Geometry.d4){ - if(!bits.get(bitOffset + x + p.x, bitOffset + y + p.y)){ - propagation.addFirst(PropCell.get((byte)(x + p.x), (byte)(y + p.y), (short)scaledDamage)); + if(2 * error - yDist > xDist - 2 * error){ + error += yDist; + startX += xStep; + }else{ + error += xDist; + startY += yStep; } } } - }); + //apply damage + for(var e : damages){ + int cx = Point2.x(e.key), cy = Point2.y(e.key); + var build = world.build(cx, cy); + if(build != null){ + build.damage(team, e.value); + } + } + }); } private static void completeDamage(Team team, float x, float y, float radius, float damage){ @@ -399,12 +468,4 @@ public class Damage{ float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff); return damage * scaled; } - - @Struct - static - class PropCellStruct{ - byte x; - byte y; - short damage; - } } diff --git a/core/src/mindustry/entities/Effect.java b/core/src/mindustry/entities/Effect.java index fd82f109e9..7b72ecdc01 100644 --- a/core/src/mindustry/entities/Effect.java +++ b/core/src/mindustry/entities/Effect.java @@ -8,7 +8,6 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.content.*; import mindustry.gen.*; @@ -22,35 +21,53 @@ public class Effect{ private static final EffectContainer container = new EffectContainer(); private static final Seq all = new Seq<>(); - public final int id; - public final Cons renderer; - public final float lifetime; - /** Clip size. */ - public float size; + private boolean initialized; - public boolean ground; - public float groundDuration; + public final int id; + + public Cons renderer = e -> {}; + public float lifetime = 50f; + /** Clip size. */ + public float clip; + /** If true, parent unit is data are followed. */ + public boolean followParent; + + public float layer = Layer.effect; + public float layerDuration; public Effect(float life, float clipsize, Cons renderer){ this.id = all.size; this.lifetime = life; this.renderer = renderer; - this.size = clipsize; + this.clip = clipsize; all.add(this); } public Effect(float life, Cons renderer){ - this(life,50f, renderer); + this(life, 50f, renderer); } - public Effect ground(){ - ground = true; + //for custom implementations + public Effect(){ + this.id = all.size; + all.add(this); + } + + public void init(){} + + public Effect followParent(boolean follow){ + followParent = follow; return this; } - public Effect ground(float duration){ - ground = true; - this.groundDuration = duration; + public Effect layer(float l){ + layer = l; + return this; + } + + public Effect layer(float l, float duration){ + layer = l; + this.layerDuration = duration; return this; } @@ -88,14 +105,18 @@ public class Effect{ public float render(int id, Color color, float life, float lifetime, float rotation, float x, float y, Object data){ container.set(id, color, life, lifetime, rotation, x, y, data); - Draw.z(ground ? Layer.debris : Layer.effect); + Draw.z(layer); Draw.reset(); - renderer.get(container); + render(container); Draw.reset(); return container.lifetime; } + public void render(EffectContainer e){ + renderer.get(e); + } + public static @Nullable Effect get(int id){ return id >= all.size || id < 0 ? null : all.get(id); } @@ -123,17 +144,22 @@ public class Effect{ if(headless || effect == Fx.none) return; if(Core.settings.getBool("effects")){ Rect view = Core.camera.bounds(Tmp.r1); - Rect pos = Tmp.r2.setSize(effect.size).setCenter(x, y); + Rect pos = Tmp.r2.setSize(effect.clip).setCenter(x, y); if(view.overlaps(pos)){ + if(!effect.initialized){ + effect.initialized = true; + effect.init(); + } + EffectState entity = EffectState.create(); entity.effect = effect; entity.rotation = rotation; - entity.data = (data); - entity.lifetime = (effect.lifetime); + entity.data = data; + entity.lifetime = effect.lifetime; entity.set(x, y); entity.color.set(color); - if(data instanceof Posc) entity.parent = ((Posc)data); + if(effect.followParent && data instanceof Posc) entity.parent = ((Posc)data); entity.add(); } } @@ -147,7 +173,7 @@ public class Effect{ if(headless || region == null || !Core.atlas.isFound(region)) return; Tile tile = world.tileWorld(x, y); - if(tile == null || tile.floor().isLiquid) return; + if(tile == null || !tile.floor().hasSurface()) return; Decal decal = Decal.create(); decal.set(x, y); @@ -210,4 +236,4 @@ public class Effect{ } } -} \ No newline at end of file +} diff --git a/core/src/mindustry/entities/EntityCollisions.java b/core/src/mindustry/entities/EntityCollisions.java index 2d8402e92c..ce492bc95d 100644 --- a/core/src/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -3,6 +3,7 @@ package mindustry.entities; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import mindustry.content.*; import mindustry.gen.*; import mindustry.world.*; @@ -115,7 +116,6 @@ public class EntityCollisions{ @SuppressWarnings("unchecked") public void updatePhysics(EntityGroup group){ - QuadTree tree = group.tree(); tree.clear(); @@ -127,7 +127,7 @@ public class EntityCollisions{ public static boolean legsSolid(int x, int y){ Tile tile = world.tile(x, y); - return tile == null || tile.staticDarkness() >= 2; + return tile == null || tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air); } public static boolean waterSolid(int x, int y){ @@ -141,7 +141,6 @@ public class EntityCollisions{ } private void checkCollide(Hitboxc a, Hitboxc b){ - a.hitbox(this.r1); b.hitbox(this.r2); @@ -192,14 +191,10 @@ public class EntityCollisions{ yInvExit = y2 - (y1 + h1); } - float xEntry, yEntry; - float xExit, yExit; - - xEntry = xInvEntry / vx1; - xExit = xInvExit / vx1; - - yEntry = yInvEntry / vy1; - yExit = yInvExit / vy1; + float xEntry = xInvEntry / vx1; + float xExit = xInvExit / vx1; + float yEntry = yInvEntry / vy1; + float yExit = yInvExit / vy1; float entryTime = Math.max(xEntry, yEntry); float exitTime = Math.min(xExit, yExit); @@ -218,7 +213,6 @@ public class EntityCollisions{ @SuppressWarnings("unchecked") public void collide(EntityGroup groupa){ - groupa.each(solid -> { solid.hitbox(r1); r1.x += (solid.lastX() - solid.getX()); diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index 1157b83ff9..39ff8ee901 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -4,11 +4,12 @@ import arc.*; import arc.func.*; import arc.math.geom.*; import arc.struct.*; +import arc.util.*; import mindustry.gen.*; import java.util.*; -import static mindustry.Vars.collisions; +import static mindustry.Vars.*; /** Represents a group of a certain type of entity.*/ @SuppressWarnings("unchecked") @@ -54,11 +55,14 @@ public class EntityGroup implements Iterable{ } public void update(){ - each(Entityc::update); + for(index = 0; index < array.size; index++){ + array.items[index].update(); + } } - public void copy(Seq arr){ + public Seq copy(Seq arr){ arr.addAll(array); + return arr; } public void each(Cons cons){ @@ -92,6 +96,7 @@ public class EntityGroup implements Iterable{ return map != null; } + @Nullable public T getByID(int id){ if(map == null) throw new RuntimeException("Mapping is not enabled for group " + id + "!"); return map.get(id); @@ -182,16 +187,21 @@ public class EntityGroup implements Iterable{ array.each(Entityc::remove); array.clear(); - if(map != null) - map.clear(); + if(map != null) map.clear(); clearing = false; } + @Nullable public T find(Boolf pred){ return array.find(pred); } + @Nullable + public T first(){ + return array.first(); + } + @Override public Iterator iterator(){ return array.iterator(); diff --git a/core/src/mindustry/entities/Fires.java b/core/src/mindustry/entities/Fires.java index 2906b4e7d7..2ae2253356 100644 --- a/core/src/mindustry/entities/Fires.java +++ b/core/src/mindustry/entities/Fires.java @@ -15,7 +15,7 @@ public class Fires{ private static final float baseLifetime = 1000f; private static final IntMap map = new IntMap<>(); - /** Start a fire on the tile. If there already is a file there, refreshes its lifetime. */ + /** Start a fire on the tile. If there already is a fire there, refreshes its lifetime. */ public static void create(Tile tile){ if(net.client() || tile == null || !state.rules.fire) return; //not clientside. @@ -23,14 +23,14 @@ public class Fires{ if(fire == null){ fire = Fire.create(); - fire.tile(tile); - fire.lifetime(baseLifetime); + fire.tile = tile; + fire.lifetime = baseLifetime; fire.set(tile.worldx(), tile.worldy()); fire.add(); map.put(tile.pos(), fire); }else{ - fire.lifetime(baseLifetime); - fire.time(0f); + fire.lifetime = baseLifetime; + fire.time = 0f; } } diff --git a/core/src/mindustry/entities/GroupDefs.java b/core/src/mindustry/entities/GroupDefs.java index 60bdbb5fd3..8f98a69442 100644 --- a/core/src/mindustry/entities/GroupDefs.java +++ b/core/src/mindustry/entities/GroupDefs.java @@ -11,5 +11,7 @@ class GroupDefs{ @GroupDef(value = Buildingc.class) G build; @GroupDef(value = Syncc.class, mapping = true) G sync; @GroupDef(value = Drawc.class) G draw; + @GroupDef(value = Firec.class) G fire; + @GroupDef(value = Puddlec.class) G puddle; @GroupDef(value = WeatherStatec.class) G weather; } diff --git a/core/src/mindustry/entities/Lightning.java b/core/src/mindustry/entities/Lightning.java index b693239061..6ba1dcc240 100644 --- a/core/src/mindustry/entities/Lightning.java +++ b/core/src/mindustry/entities/Lightning.java @@ -4,7 +4,9 @@ import arc.graphics.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.util.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.entities.bullet.*; import mindustry.game.*; import mindustry.gen.*; @@ -32,31 +34,29 @@ public class Lightning{ createLightningInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); } - //TODO remote method - //@Remote(called = Loc.server, unreliable = true) - private static void createLightningInternal(Bullet hitter, int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ + private static void createLightningInternal(@Nullable Bullet hitter, int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ random.setSeed(seed); hit.clear(); - BulletType bulletType = hitter != null && !hitter.type.collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; + BulletType hitCreate = hitter == null || hitter.type.lightningType == null ? Bullets.damageLightning : hitter.type.lightningType; Seq lines = new Seq<>(); bhit = false; for(int i = 0; i < length / 2; i++){ - bulletType.create(null, team, x, y, 0f, damage, 1f, 1f, hitter); + hitCreate.create(null, team, x, y, rotation, damage, 1f, 1f, hitter); lines.add(new Vec2(x + Mathf.range(3f), y + Mathf.range(3f))); if(lines.size > 1){ bhit = false; Vec2 from = lines.get(lines.size - 2); Vec2 to = lines.get(lines.size - 1); - world.raycastEach(world.toTile(from.getX()), world.toTile(from.getY()), world.toTile(to.getX()), world.toTile(to.getY()), (wx, wy) -> { + world.raycastEach(World.toTile(from.getX()), World.toTile(from.getY()), World.toTile(to.getX()), World.toTile(to.getY()), (wx, wy) -> { Tile tile = world.tile(wx, wy); - if(tile != null && tile.block().insulated){ + if(tile != null && tile.block().insulated && tile.team() != team){ bhit = true; //snap it instead of removing - lines.get(lines.size -1).set(wx * tilesize, wy * tilesize); + lines.get(lines.size - 1).set(wx * tilesize, wy * tilesize); return true; } return false; diff --git a/core/src/mindustry/entities/Predict.java b/core/src/mindustry/entities/Predict.java index 03c41e5778..3f8aca60cd 100644 --- a/core/src/mindustry/entities/Predict.java +++ b/core/src/mindustry/entities/Predict.java @@ -53,13 +53,13 @@ public class Predict{ public static Vec2 intercept(Position src, Position dst, float v){ float ddx = 0, ddy = 0; - if(dst instanceof Hitboxc){ - ddx += ((Hitboxc)dst).deltaX(); - ddy += ((Hitboxc)dst).deltaY(); + if(dst instanceof Hitboxc h){ + ddx += h.deltaX(); + ddy += h.deltaY(); } - if(src instanceof Hitboxc){ - ddx -= ((Hitboxc)src).deltaX()/(Time.delta); - ddy -= ((Hitboxc)src).deltaY()/(Time.delta); + if(src instanceof Hitboxc h){ + ddx -= h.deltaX(); + ddy -= h.deltaY(); } return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), ddx, ddy, v); } diff --git a/core/src/mindustry/entities/Puddles.java b/core/src/mindustry/entities/Puddles.java index 461e486001..2811c28d01 100644 --- a/core/src/mindustry/entities/Puddles.java +++ b/core/src/mindustry/entities/Puddles.java @@ -14,12 +14,12 @@ public class Puddles{ public static final float maxLiquid = 70f; - /** Deposists a Puddle between tile and source. */ + /** Deposits a Puddle between tile and source. */ public static void deposit(Tile tile, Tile source, Liquid liquid, float amount){ deposit(tile, source, liquid, amount, 0); } - /** Deposists a Puddle at a tile. */ + /** Deposits a Puddle at a tile. */ public static void deposit(Tile tile, Liquid liquid, float amount){ deposit(tile, tile, liquid, amount, 0); } @@ -38,13 +38,17 @@ public class Puddles{ Puddle p = map.get(tile.pos()); - if(generation == 0 && p != null && p.lastRipple() <= Time.time() - 40f){ + if(generation == 0 && p != null && p.lastRipple <= Time.time - 40f){ Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, tile.floor().liquidDrop.color); - p.lastRipple(Time.time()); + p.lastRipple = Time.time; } return; } + if(tile.floor().solid){ + return; + } + Puddle p = map.get(tile.pos()); if(p == null){ Puddle puddle = Puddle.create(); @@ -58,9 +62,9 @@ public class Puddles{ }else if(p.liquid() == liquid){ p.accepting(Math.max(amount, p.accepting())); - if(generation == 0 && p.lastRipple() <= Time.time() - 40f && p.amount() >= maxLiquid / 2f){ + if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount() >= maxLiquid / 2f){ Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid().color); - p.lastRipple(Time.time()); + p.lastRipple = Time.time; } }else{ p.amount(p.amount() + reactPuddle(p.liquid(), liquid, amount, p.tile(), (p.x() + source.worldx())/2f, (p.y() + source.worldy())/2f)); diff --git a/core/src/mindustry/entities/Sized.java b/core/src/mindustry/entities/Sized.java new file mode 100644 index 0000000000..d33778e3aa --- /dev/null +++ b/core/src/mindustry/entities/Sized.java @@ -0,0 +1,7 @@ +package mindustry.entities; + +import arc.math.geom.*; + +public interface Sized extends Position{ + float hitSize(); +} diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index 85761795e5..d0fd94a63c 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -3,9 +3,12 @@ package mindustry.entities; import arc.*; import arc.func.*; import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; @@ -18,6 +21,7 @@ public class Units{ private static Unit result; private static float cdist; private static boolean boolResult; + private static int intResult; @Remote(called = Loc.server) public static void unitCapDeath(Unit unit){ @@ -65,7 +69,7 @@ public class Units{ /** @return whether a new instance of a unit of this team can be created. */ public static boolean canCreate(Team team, UnitType type){ - return teamIndex.countType(team, type) < getCap(team); + return team.data().countType(type) < getCap(team); } public static int getCap(Team team){ @@ -73,7 +77,7 @@ public class Units{ if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){ return Integer.MAX_VALUE; } - return state.rules.unitCap + indexer.getExtraUnits(team); + return Math.max(0, state.rules.unitCapVariable ? state.rules.unitCap + team.data().unitCap : state.rules.unitCap); } /** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/ @@ -91,7 +95,7 @@ public class Units{ * @return whether the target is invalid */ public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){ - return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range)) || (target instanceof Teamc && ((Teamc)target).team() == team) || (target instanceof Healthc && !((Healthc)target).isValid()); + return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range + (target instanceof Sized hb ? hb.hitSize()/2f : 0f))) || (target instanceof Teamc t && t.team() == team) || (target instanceof Healthc h && !h.isValid()); } /** See {@link #invalidateTarget(Posc, Team, float, float, float)} */ @@ -124,8 +128,8 @@ public class Units{ nearby(x, y, width, height, unit -> { if(boolResult) return; - if((unit.isGrounded() && !unit.type().hovering) == ground){ - unit.hitbox(hitrect); + if((unit.isGrounded() && !unit.type.hovering) == ground){ + unit.hitboxTile(hitrect); if(hitrect.overlaps(x, y, width, height)){ boolResult = true; @@ -136,23 +140,28 @@ public class Units{ return boolResult; } - /** Returns the neareset damaged tile. */ + /** Returns the nearest damaged tile. */ public static Building findDamagedTile(Team team, float x, float y){ return Geometry.findClosest(x, y, indexer.getDamaged(team)); } - /** Returns the neareset ally tile in a range. */ + /** Returns the nearest ally tile in a range. */ public static Building findAllyTile(Team team, float x, float y, float range, Boolf pred){ return indexer.findTile(team, x, y, range, pred); } - /** Returns the neareset enemy tile in a range. */ + /** Returns the nearest enemy tile in a range. */ public static Building findEnemyTile(Team team, float x, float y, float range, Boolf pred){ if(team == Team.derelict) return null; return indexer.findEnemyTile(team, x, y, range, pred); } + /** Iterates through all buildings in a range. */ + public static void nearbyBuildings(float x, float y, float range, Cons cons){ + indexer.allBuildings(x, y, range, cons); + } + /** Returns the closest target enemy. First, units are checked, then tile entities. */ public static Teamc closestTarget(Team team, float x, float y, float range){ return closestTarget(team, x, y, range, Unit::isValid); @@ -195,9 +204,9 @@ public class Units{ cdist = 0f; nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { - if(e.dead() || !predicate.get(e)) return; + if(e.dead() || !predicate.get(e) || e.team == Team.derelict) return; - float dst2 = e.dst2(x, y); + float dst2 = e.dst2(x, y) - (e.hitSize * e.hitSize); if(dst2 < range*range && (result == null || dst2 < cdist)){ result = e; cdist = dst2; @@ -215,7 +224,7 @@ public class Units{ cdist = 0f; nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { - if(e.dead() || !predicate.get(e) || !e.within(x, y, range)) return; + if(e.dead() || !predicate.get(e) || e.team == Team.derelict || !e.within(x, y, range + e.hitSize/2f)) return; float cost = sort.cost(e, x, y); if(result == null || cost < cdist){ @@ -245,7 +254,7 @@ public class Units{ return result; } - /** Returns the closest ally of this team. Filter by predicate. */ + /** Returns the closest ally of this team in a range. Filter by predicate. */ public static Unit closest(Team team, float x, float y, float range, Boolf predicate){ result = null; cdist = 0f; @@ -263,6 +272,24 @@ public class Units{ return result; } + /** Returns the closest ally of this team in a range. Filter by predicate. */ + public static Unit closest(Team team, float x, float y, float range, Boolf predicate, Sortf sort){ + result = null; + cdist = 0f; + + nearby(team, x, y, range, e -> { + if(!predicate.get(e)) return; + + float dist = sort.cost(e, x, y); + if(result == null || dist < cdist){ + result = e; + cdist = dist; + } + }); + + return result; + } + /** Returns the closest ally of this team. Filter by predicate. * Unlike the closest() function, this only guarantees that unit hitboxes overlap the range. */ public static Unit closestOverlap(Team team, float x, float y, float range, Boolf predicate){ @@ -282,15 +309,42 @@ public class Units{ return result; } + /** @return whether any units exist in this square (centered) */ + public static int count(float x, float y, float size, Boolf filter){ + return count(x - size/2f, y - size/2f, size, size, filter); + } + + /** @return whether any units exist in this rectangle */ + public static int count(float x, float y, float width, float height, Boolf filter){ + intResult = 0; + Groups.unit.intersect(x, y, width, height, v -> { + if(filter.get(v)){ + intResult ++; + } + }); + return intResult; + } + + /** @return whether any units exist in this rectangle */ + public static boolean any(float x, float y, float width, float height, Boolf filter){ + return count(x, y, width, height, filter) > 0; + } + /** Iterates over all units in a rectangle. */ - public static void nearby(Team team, float x, float y, float width, float height, Cons cons){ - teamIndex.tree(team).intersect(x, y, width, height, cons); + public static void nearby(@Nullable Team team, float x, float y, float width, float height, Cons cons){ + if(team != null){ + team.data().tree().intersect(x, y, width, height, cons); + }else{ + for(var other : state.teams.getActive()){ + other.tree().intersect(x, y, width, height, cons); + } + } } /** Iterates over all units in a circle around this position. */ - public static void nearby(Team team, float x, float y, float radius, Cons cons){ + public static void nearby(@Nullable Team team, float x, float y, float radius, Cons cons){ nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> { - if(unit.within(x, y, radius)){ + if(unit.within(x, y, radius + unit.hitSize/2f)){ cons.get(unit); } }); @@ -308,20 +362,21 @@ public class Units{ /** Iterates over all units that are enemies of this team. */ public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons cons){ - if(team.active()){ - for(Team enemy : state.teams.enemiesOf(team)){ - nearby(enemy, x, y, width, height, cons); - } - }else{ - //inactive teams have no cache, check everything - //TODO cache all teams with units OR blocks - for(Team other : Team.all){ - if(other != team && teamIndex.count(other) > 0){ - nearby(other, x, y, width, height, cons); - } + Seq data = state.teams.present; + for(int i = 0; i < data.size; i++){ + if(data.items[i].team != team){ + nearby(data.items[i].team, x, y, width, height, cons); } } + } + /** Iterates over all units that are enemies of this team. */ + public static void nearbyEnemies(Team team, float x, float y, float radius, Cons cons){ + nearbyEnemies(team, x - radius, y - radius, radius * 2f, radius * 2f, u -> { + if(u.within(x, y, radius + u.hitSize/2f)){ + cons.get(u); + } + }); } /** Iterates over all units that are enemies of this team. */ diff --git a/core/src/mindustry/entities/abilities/Ability.java b/core/src/mindustry/entities/abilities/Ability.java index 466bfc1980..c11c393602 100644 --- a/core/src/mindustry/entities/abilities/Ability.java +++ b/core/src/mindustry/entities/abilities/Ability.java @@ -1,5 +1,7 @@ package mindustry.entities.abilities; +import arc.*; +import arc.scene.ui.layout.*; import mindustry.gen.*; public abstract class Ability implements Cloneable{ @@ -14,4 +16,13 @@ public abstract class Ability implements Cloneable{ throw new RuntimeException("java sucks", e); } } + + public void displayBars(Unit unit, Table bars){ + + } + + /** @return localized ability name; mods should override this. */ + public String localized(){ + return Core.bundle.get("ability." + getClass().getSimpleName().replace("Ability", "").toLowerCase()); + } } diff --git a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java new file mode 100644 index 0000000000..587fff2bdc --- /dev/null +++ b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java @@ -0,0 +1,145 @@ +package mindustry.entities.abilities; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; + +public class EnergyFieldAbility extends Ability{ + private static final Seq all = new Seq<>(); + + public float damage = 1, repair = 20f, reload = 100, range = 60; + public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning; + public StatusEffect status = StatusEffects.electrified; + public float statusDuration = 60f * 6f; + public float x, y; + public boolean hitBuildings = true; + public int maxTargets = 25; + public float healPercent = 3f; + + public float layer = Layer.bullet - 0.001f, blinkScl = 20f; + public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f; + public int sectors = 5; + public Color color = Pal.heal; + + protected float timer, curStroke; + protected boolean anyNearby = false; + + EnergyFieldAbility(){} + + public EnergyFieldAbility(float damage, float reload, float range){ + this.damage = damage; + this.reload = reload; + this.range = range; + } + + @Override + public String localized(){ + return Core.bundle.format("ability.energyfield", damage, range / Vars.tilesize, maxTargets); + } + + @Override + public void draw(Unit unit){ + super.draw(unit); + + Draw.z(layer); + Draw.color(color); + Tmp.v1.trns(unit.rotation - 90, x, y).add(unit.x, unit.y); + float rx = Tmp.v1.x, ry = Tmp.v1.y; + float orbRadius = effectRadius * (1f + Mathf.absin(blinkScl, 0.1f)); + + Fill.circle(rx, ry, orbRadius); + Draw.color(); + Fill.circle(rx, ry, orbRadius / 2f); + + Lines.stroke((0.7f + Mathf.absin(blinkScl, 0.7f)), color); + + for(int i = 0; i < sectors; i++){ + float rot = unit.rotation + i * 360f/sectors - Time.time * rotateSpeed; + Lines.swirl(rx, ry, orbRadius + 3f, sectorRad, rot); + } + + Lines.stroke(Lines.getStroke() * curStroke); + + if(curStroke > 0){ + for(int i = 0; i < sectors; i++){ + float rot = unit.rotation + i * 360f/sectors + Time.time * rotateSpeed; + Lines.swirl(rx, ry, range, sectorRad, rot); + } + } + + Drawf.light(rx, ry, range * 1.5f, color, curStroke * 0.8f); + + Draw.reset(); + } + + @Override + public void update(Unit unit){ + + curStroke = Mathf.lerpDelta(curStroke, anyNearby ? 1 : 0, 0.09f); + + if((timer += Time.delta) >= reload){ + + Tmp.v1.trns(unit.rotation - 90, x, y).add(unit.x, unit.y); + float rx = Tmp.v1.x, ry = Tmp.v1.y; + anyNearby = false; + + all.clear(); + + Units.nearby(null, rx, ry, range, other -> { + if(other != unit){ + all.add(other); + } + }); + + if(hitBuildings){ + Units.nearbyBuildings(rx, ry, range, all::add); + } + + all.sort(h -> h.dst2(rx, ry)); + int len = Math.min(all.size, maxTargets); + for(int i = 0; i < len; i++){ + Healthc other = all.get(i); + + //lightning gets absorbed by plastanium + var absorber = Damage.findAbsorber(unit.team, rx, ry, other.getX(), other.getY()); + if(absorber != null){ + other = absorber; + } + + if(((Teamc)other).team() == unit.team){ + if(other.damaged()){ + anyNearby = true; + other.heal(healPercent / 100f * other.maxHealth()); + healEffect.at(other); + damageEffect.at(rx, ry, 0f, color, other); + hitEffect.at(rx, ry, unit.angleTo(other), color); + + if(other instanceof Building b){ + Fx.healBlockFull.at(b.x, b.y, b.block.size, color); + } + } + }else{ + anyNearby = true; + other.damage(damage); + if(other instanceof Statusc s){ + s.apply(status, statusDuration); + } + hitEffect.at(other.x(), other.y(), unit.angleTo(other), color); + damageEffect.at(rx, ry, 0f, color, other); + hitEffect.at(rx, ry, unit.angleTo(other), color); + } + } + + timer = 0f; + } + } +} diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index fa9fa5e2c8..38961a6433 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -6,10 +6,12 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.util.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.ui.*; public class ForceFieldAbility extends Ability{ /** Shield radius. */ @@ -94,7 +96,12 @@ public class ForceFieldAbility extends Ability{ } } - private void checkRadius(Unit unit){ + @Override + public void displayBars(Unit unit, Table bars){ + bars.add(new Bar("stat.shieldhealth", Pal.accent, () -> unit.shield / max)).row(); + } + + public void checkRadius(Unit unit){ //timer2 is used to store radius scale as an effect realRad = radiusScale * radius; } diff --git a/core/src/mindustry/entities/abilities/MoveLightningAbility.java b/core/src/mindustry/entities/abilities/MoveLightningAbility.java new file mode 100644 index 0000000000..4cc62b7172 --- /dev/null +++ b/core/src/mindustry/entities/abilities/MoveLightningAbility.java @@ -0,0 +1,91 @@ +package mindustry.entities.abilities; + +import arc.*; +import arc.audio.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.gen.*; + +public class MoveLightningAbility extends Ability{ + /** Lightning damage */ + public float damage = 35f; + /** Chance of firing every tick. Set >= 1 to always fire lightning every tick at max speed. */ + public float chance = 0.15f; + /** Length of the lightning. <= 0 to disable */ + public int length = 12; + /** Speeds for when to start lightninging and when to stop getting faster */ + public float minSpeed = 0.8f, maxSpeed = 1.2f; + /** Lightning color */ + public Color color = Color.valueOf("a9d8ff"); + /** Shifts where the lightning spawns along the Y axis */ + public float offset = 0f; + /** Jittering heat sprite like the shield on v5 Javelin */ + public String heatRegion = "error"; + /** Bullet type that is fired. Can be null */ + public @Nullable BulletType bullet; + /** Bullet angle parameters */ + public float bulletAngle = 0f, bulletSpread = 0f; + + public Effect shootEffect = Fx.sparkShoot; + public Sound shootSound = Sounds.spark; + + MoveLightningAbility(){} + + public MoveLightningAbility(float damage, int length, float chance, float offset, float minSpeed, float maxSpeed, Color color, String heatRegion){ + this.damage = damage; + this.length = length; + this.chance = chance; + this.offset = offset; + this.minSpeed = minSpeed; + this.maxSpeed = maxSpeed; + this.color = color; + this.heatRegion = heatRegion; + } + + public MoveLightningAbility(float damage, int length, float chance, float offset, float minSpeed, float maxSpeed, Color color){ + this.damage = damage; + this.length = length; + this.chance = chance; + this.offset = offset; + this.minSpeed = minSpeed; + this.maxSpeed = maxSpeed; + this.color = color; + } + + @Override + public void update(Unit unit){ + float scl = Mathf.clamp((unit.vel().len() - minSpeed) / (maxSpeed - minSpeed)); + if(Mathf.chance(Time.delta * chance * scl)){ + float x = unit.x + Angles.trnsx(unit.rotation, offset, 0), y = unit.y + Angles.trnsy(unit.rotation, offset, 0); + + shootEffect.at(x, y, unit.rotation, color); + shootSound.at(unit); + + if(length > 0){ + Lightning.create(unit.team, color, damage, x + unit.vel.x, y + unit.vel.y, unit.rotation, length); + } + + if(bullet != null){ + bullet.create(unit, unit.team, x, y, unit.rotation + bulletAngle + Mathf.range(bulletSpread)); + } + } + } + + @Override + public void draw(Unit unit){ + float scl = Mathf.clamp((unit.vel().len() - minSpeed) / (maxSpeed - minSpeed)); + TextureRegion region = Core.atlas.find(heatRegion); + if(Core.atlas.isFound(region) && scl > 0.00001f){ + Draw.color(color); + Draw.alpha(scl / 2f); + Draw.blend(Blending.additive); + Draw.rect(region, unit.x + Mathf.range(scl / 2f), unit.y + Mathf.range(scl / 2f), unit.rotation - 90); + Draw.blend(); + } + } +} diff --git a/core/src/mindustry/entities/abilities/HealFieldAbility.java b/core/src/mindustry/entities/abilities/RepairFieldAbility.java similarity index 83% rename from core/src/mindustry/entities/abilities/HealFieldAbility.java rename to core/src/mindustry/entities/abilities/RepairFieldAbility.java index 90f800ec84..9e2890589a 100644 --- a/core/src/mindustry/entities/abilities/HealFieldAbility.java +++ b/core/src/mindustry/entities/abilities/RepairFieldAbility.java @@ -5,7 +5,7 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -public class HealFieldAbility extends Ability{ +public class RepairFieldAbility extends Ability{ public float amount = 1, reload = 100, range = 60; public Effect healEffect = Fx.heal; public Effect activeEffect = Fx.healWaveDynamic; @@ -13,9 +13,9 @@ public class HealFieldAbility extends Ability{ protected float timer; protected boolean wasHealed = false; - HealFieldAbility(){} + RepairFieldAbility(){} - public HealFieldAbility(float amount, float reload, float range){ + public RepairFieldAbility(float amount, float reload, float range){ this.amount = amount; this.reload = reload; this.range = range; @@ -30,7 +30,7 @@ public class HealFieldAbility extends Ability{ Units.nearby(unit.team, unit.x, unit.y, range, other -> { if(other.damaged()){ - healEffect.at(unit); + healEffect.at(other); wasHealed = true; } other.heal(amount); diff --git a/core/src/mindustry/entities/abilities/ShieldFieldAbility.java b/core/src/mindustry/entities/abilities/ShieldRegenFieldAbility.java similarity index 77% rename from core/src/mindustry/entities/abilities/ShieldFieldAbility.java rename to core/src/mindustry/entities/abilities/ShieldRegenFieldAbility.java index 739751f6c1..7eea17b8d1 100644 --- a/core/src/mindustry/entities/abilities/ShieldFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ShieldRegenFieldAbility.java @@ -5,7 +5,7 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -public class ShieldFieldAbility extends Ability{ +public class ShieldRegenFieldAbility extends Ability{ public float amount = 1, max = 100f, reload = 100, range = 60; public Effect applyEffect = Fx.shieldApply; public Effect activeEffect = Fx.shieldWave; @@ -13,9 +13,9 @@ public class ShieldFieldAbility extends Ability{ protected float timer; protected boolean applied = false; - ShieldFieldAbility(){} + ShieldRegenFieldAbility(){} - public ShieldFieldAbility(float amount, float max, float reload, float range){ + public ShieldRegenFieldAbility(float amount, float max, float reload, float range){ this.amount = amount; this.max = max; this.reload = reload; @@ -33,13 +33,13 @@ public class ShieldFieldAbility extends Ability{ if(other.shield < max){ other.shield = Math.max(other.shield + amount, max); other.shieldAlpha = 1f; //TODO may not be necessary - applyEffect.at(unit); + applyEffect.at(unit.x, unit.y, unit.team.color); applied = true; } }); if(applied){ - activeEffect.at(unit); + activeEffect.at(unit.x, unit.y, unit.team.color); } timer = 0f; diff --git a/core/src/mindustry/entities/abilities/StatusFieldAbility.java b/core/src/mindustry/entities/abilities/StatusFieldAbility.java index cb72ad353d..b41df1b851 100644 --- a/core/src/mindustry/entities/abilities/StatusFieldAbility.java +++ b/core/src/mindustry/entities/abilities/StatusFieldAbility.java @@ -1,6 +1,6 @@ package mindustry.entities.abilities; -import arc.util.ArcAnnotate.*; +import arc.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; @@ -24,12 +24,16 @@ public class StatusFieldAbility extends Ability{ this.effect = effect; } + @Override + public String localized(){ + return Core.bundle.format("ability.statusfield", effect.emoji()); + } + @Override public void update(Unit unit){ timer += Time.delta; if(timer >= reload){ - Units.nearby(unit.team, unit.x, unit.y, range, other -> { other.apply(effect, duration); }); diff --git a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java index 74140114d9..92d26e59cc 100644 --- a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java +++ b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java @@ -1,5 +1,6 @@ package mindustry.entities.abilities; +import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; @@ -11,15 +12,17 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; +import static mindustry.Vars.*; + public class UnitSpawnAbility extends Ability{ - public UnitType type; + public UnitType unit; public float spawnTime = 60f, spawnX, spawnY; public Effect spawnEffect = Fx.spawn; protected float timer; - public UnitSpawnAbility(UnitType type, float spawnTime, float spawnX, float spawnY){ - this.type = type; + public UnitSpawnAbility(UnitType unit, float spawnTime, float spawnX, float spawnY){ + this.unit = unit; this.spawnTime = spawnTime; this.spawnX = spawnX; this.spawnY = spawnY; @@ -30,13 +33,12 @@ public class UnitSpawnAbility extends Ability{ @Override public void update(Unit unit){ - timer += Time.delta; - - if(timer >= spawnTime && Units.canCreate(unit.team, type)){ + timer += Time.delta * state.rules.unitBuildSpeedMultiplier; + if(timer >= spawnTime && Units.canCreate(unit.team, this.unit)){ float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); spawnEffect.at(x, y); - Unit u = type.create(unit.team); + Unit u = this.unit.create(unit.team); u.set(x, y); u.rotation = unit.rotation; if(!Vars.net.client()){ @@ -49,11 +51,16 @@ public class UnitSpawnAbility extends Ability{ @Override public void draw(Unit unit){ - if(Units.canCreate(unit.team, type)){ + if(Units.canCreate(unit.team, this.unit)){ Draw.draw(Draw.z(), () -> { float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); - Drawf.construct(x, y, type.icon(Cicon.full), unit.rotation - 90, timer / spawnTime, 1f, timer); + Drawf.construct(x, y, this.unit.fullIcon, unit.rotation - 90, timer / spawnTime, 1f, timer); }); } } + + @Override + public String localized(){ + return Core.bundle.format("ability.unitspawn", unit.localizedName); + } } diff --git a/core/src/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/mindustry/entities/bullet/ArtilleryBulletType.java index a35c670316..1b9c76a7f4 100644 --- a/core/src/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/mindustry/entities/bullet/ArtilleryBulletType.java @@ -18,6 +18,24 @@ public class ArtilleryBulletType extends BasicBulletType{ hitSound = Sounds.explosion; shootEffect = Fx.shootBig; trailEffect = Fx.artilleryTrail; + + //default settings: + shrinkX = 0.15f; + shrinkY = 0.63f; + + //for trail: + + /* + trailLength = 27; + trailWidth = 3.5f; + trailEffect = Fx.none; + trailColor = Pal.bulletYellowBack; + + trailInterp = Interp.slope; + + shrinkX = 0.8f; + shrinkY = 0.3f; + */ } public ArtilleryBulletType(float speed, float damage){ @@ -39,15 +57,13 @@ public class ArtilleryBulletType extends BasicBulletType{ @Override public void draw(Bullet b){ - float baseScale = 0.7f; - float scale = (baseScale + b.fslope() * (1f - baseScale)); - - float height = this.height * ((1f - shrinkY) + shrinkY * b.fout()); + drawTrail(b); + float xscale = (1f - shrinkX + b.fslope() * (shrinkX)), yscale = (1f - shrinkY + b.fslope() * (shrinkY)), rot = b.rotation(); Draw.color(backColor); - Draw.rect(backRegion, b.x, b.y, width * scale, height * scale, b.rotation() - 90); + Draw.rect(backRegion, b.x, b.y, width * xscale, height * yscale, rot - 90); Draw.color(frontColor); - Draw.rect(frontRegion, b.x, b.y, width * scale, height * scale, b.rotation() - 90); + Draw.rect(frontRegion, b.x, b.y, width * xscale, height * yscale, rot - 90); Draw.color(); } } diff --git a/core/src/mindustry/entities/bullet/BasicBulletType.java b/core/src/mindustry/entities/bullet/BasicBulletType.java index ac33c28868..84cbca0e0a 100644 --- a/core/src/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/mindustry/entities/bullet/BasicBulletType.java @@ -42,6 +42,7 @@ public class BasicBulletType extends BulletType{ @Override public void draw(Bullet b){ + super.draw(b); float height = this.height * ((1f - shrinkY) + shrinkY * b.fout()); float width = this.width * ((1f - shrinkX) + shrinkX * b.fout()); float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360f) + b.time * spin : 0f); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index e748310b8a..40a09a37f3 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -1,38 +1,64 @@ package mindustry.entities.bullet; +import arc.*; import arc.audio.*; import arc.graphics.*; +import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; +import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.entities.*; +import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.defense.Wall.*; import static mindustry.Vars.*; -public abstract class BulletType extends Content{ +public class BulletType extends Content implements Cloneable{ + /** Lifetime in ticks. */ public float lifetime = 40f; - public float speed; - public float damage; + /** Speed in units/tick. */ + public float speed = 1f; + /** Direct damage dealt on hit. */ + public float damage = 1f; + /** Hitbox size. */ public float hitSize = 4; + /** Clipping hitbox. */ public float drawSize = 40f; + /** Drag as fraction of velocity. */ public float drag = 0f; - public boolean pierce, pierceBuilding; - public Effect hitEffect, despawnEffect; - + /** Whether to pierce units. */ + public boolean pierce; + /** Whether to pierce buildings. */ + public boolean pierceBuilding; + /** Maximum # of pierced objects. */ + public int pierceCap = -1; + /** Z layer to drawn on. */ + public float layer = Layer.bullet; + /** Effect shown on direct hit. */ + public Effect hitEffect = Fx.hitBulletSmall; + /** Effect shown when bullet despawns. */ + public Effect despawnEffect = Fx.hitBulletSmall; /** Effect created when shooting. */ public Effect shootEffect = Fx.shootSmall; /** Extra smoke effect created when shooting. */ public Effect smokeEffect = Fx.shootSmallSmoke; /** Sound made when hitting something or getting removed.*/ public Sound hitSound = Sounds.none; + /** Sound made when hitting something or getting removed.*/ + public Sound despawnSound = Sounds.none; + /** Pitch of the sound made when hitting something*/ + public float hitSoundPitch = 1; + /** Volume of the sound made when hitting something*/ + public float hitSoundVolume = 1; /** Extra inaccuracy when firing. */ public float inaccuracy = 0f; /** How many bullets get created per ammo item/liquid. */ @@ -40,7 +66,7 @@ public abstract class BulletType extends Content{ /** Multiplied by turret reload speed to get final shoot speed. */ public float reloadMultiplier = 1f; /** Multiplier of how much base damage is done to tiles. */ - public float tileDamageMultiplier = 1f; + public float buildingDamageMultiplier = 1f; /** Recoil from shooter entities. */ public float recoil; /** Whether to kill the shooter when this is shot. For suicide bombers. */ @@ -51,6 +77,8 @@ public abstract class BulletType extends Content{ public float splashDamage = 0f; /** Knockback in velocity. */ public float knockback; + /** Should knockback follow the bullet's direction */ + public boolean impact; /** Status effect applied on hit. */ public StatusEffect status = StatusEffects.none; /** Intensity of applied status effect in terms of duration. */ @@ -73,11 +101,17 @@ public abstract class BulletType extends Content{ public boolean reflectable = true; /** Whether this projectile can be absorbed by shields. */ public boolean absorbable = true; - /** Whether to move the bullet back depending on delta to fix some delta-time realted issues. + /** Whether to move the bullet back depending on delta to fix some delta-time related issues. * Do not change unless you know what you're doing. */ public boolean backMove = true; /** Bullet range override. */ - public float range = -1f; + public float maxRange = -1f; + /** % of block health healed **/ + public float healPercent = 0f; + /** Whether to make fire on impact */ + public boolean makeFire = false; + /** Whether to create hit effects on despawn. Forced to true if this bullet has any special effects like splash damage. */ + public boolean despawnHit = false; //additional effects @@ -90,8 +124,14 @@ public abstract class BulletType extends Content{ public Color trailColor = Pal.missileYellowBack; public float trailChance = -0.0001f; + public float trailInterval = 0f; public Effect trailEffect = Fx.missileTrail; public float trailParam = 2f; + public boolean trailRotation = false; + public Interp trailInterp = Interp.one; + /** Any value <= 0 disables the trail. */ + public int trailLength = -1; + public float trailWidth = 2f; /** Use a negative value to disable splash damage. */ public float splashDamageRadius = -1f; @@ -101,6 +141,8 @@ public abstract class BulletType extends Content{ public float incendChance = 1f; public float homingPower = 0f; public float homingRange = 50f; + /** Use a negative value to disable homing delay. */ + public float homingDelay = -1f; public Color lightningColor = Pal.surge; public int lightning; @@ -109,6 +151,8 @@ public abstract class BulletType extends Content{ public float lightningDamage = -1; public float lightningCone = 360f; public float lightningAngle = 0f; + /** The bullet created at lightning points. */ + public @Nullable BulletType lightningType = null; public float weaveScale = 1f; public float weaveMag = -1f; @@ -119,36 +163,83 @@ public abstract class BulletType extends Content{ public float puddleAmount = 5f; public Liquid puddleLiquid = Liquids.water; - public float lightRadius = 16f; + public float lightRadius = -1f; public float lightOpacity = 0.3f; public Color lightColor = Pal.powerLight; public BulletType(float speed, float damage){ this.speed = speed; this.damage = damage; - hitEffect = Fx.hitBulletSmall; - despawnEffect = Fx.hitBulletSmall; } public BulletType(){ - this(1f, 1f); + } + + public BulletType copy(){ + try{ + BulletType copy = (BulletType)clone(); + copy.id = (short)Vars.content.getBy(getContentType()).size; + Vars.content.handleContent(copy); + return copy; + }catch(Exception e){ + throw new RuntimeException("death to checked exceptions", e); + } + } + + /** @return estimated damage per shot. this can be very inaccurate. */ + public float estimateDPS(){ + float sum = damage + splashDamage*0.75f; + if(fragBullet != null && fragBullet != this){ + sum += fragBullet.estimateDPS() * fragBullets / 2f; + } + return sum; } /** Returns maximum distance the bullet this bullet type has can travel. */ public float range(){ - return Math.max(speed * lifetime * (1f - drag), range); + return Math.max(speed * lifetime * (1f - drag), maxRange); } - public boolean collides(Bullet bullet, Building tile){ - return true; + /** @return continuous damage in damage/sec, or -1 if not continuous. */ + public float continuousDamage(){ + return -1f; } - public void hitTile(Bullet b, Building tile, float initialHealth){ - hit(b); + public boolean testCollision(Bullet bullet, Building tile){ + return healPercent <= 0.001f || tile.team != bullet.team || tile.healthf() < 1f; } - public void hitEntity(Bullet b, Hitboxc other, float initialHealth){ + /** If direct is false, this is an indirect hit and the tile was already damaged. + * TODO this is a mess. */ + public void hitTile(Bullet b, Building build, float initialHealth, boolean direct){ + if(makeFire && build.team != b.team){ + Fires.create(build.tile); + } + if(healPercent > 0f && build.team == b.team && !(build.block instanceof ConstructBlock)){ + Fx.healBlockFull.at(build.x, build.y, build.block.size, Pal.heal); + build.heal(healPercent / 100f * build.maxHealth); + }else if(build.team != b.team && direct){ + hit(b); + } + } + + public void hitEntity(Bullet b, Hitboxc entity, float health){ + if(entity instanceof Healthc h){ + h.damage(b.damage); + } + + if(entity instanceof Unit unit){ + Tmp.v3.set(unit).sub(b.x, b.y).nor().scl(knockback * 80f); + if(impact) Tmp.v3.setAngle(b.rotation()); + unit.impulse(Tmp.v3); + unit.apply(status, statusDuration); + } + + //for achievements + if(b.owner instanceof WallBuild && player != null && b.team == player.team() && entity instanceof Unit unit && unit.dead){ + Events.fire(Trigger.phaseDeflectHit); + } } public void hit(Bullet b){ @@ -157,7 +248,7 @@ public abstract class BulletType extends Content{ public void hit(Bullet b, float x, float y){ hitEffect.at(x, y, b.rotation(), hitColor); - hitSound.at(b); + hitSound.at(x, y, hitSoundPitch, hitSoundVolume); Effect.shake(hitShake, hitShake, b); @@ -176,16 +267,27 @@ public abstract class BulletType extends Content{ } } - if(Mathf.chance(incendChance)){ + if(incendChance > 0 && Mathf.chance(incendChance)){ Damage.createIncend(x, y, incendSpread, incendAmount); } - if(splashDamageRadius > 0){ + if(splashDamageRadius > 0 && !b.absorbed){ Damage.damage(b.team, x, y, splashDamageRadius, splashDamage * b.damageMultiplier(), collidesAir, collidesGround); if(status != StatusEffects.none){ Damage.status(b.team, x, y, splashDamageRadius, status, statusDuration, collidesAir, collidesGround); } + + if(healPercent > 0f){ + indexer.eachBlock(b.team, x, y, splashDamageRadius, Building::damaged, other -> { + Fx.healBlockFull.at(other.x, other.y, other.block.size, Pal.heal); + other.heal(healPercent / 100f * other.maxHealth()); + }); + } + + if(makeFire){ + indexer.eachBlock(null, x, y, splashDamageRadius, other -> other.team != b.team, other -> Fires.create(other.tile)); + } } for(int i = 0; i < lightning; i++){ @@ -193,51 +295,115 @@ public abstract class BulletType extends Content{ } } + /** Called when the bullet reaches the end of its lifetime of is destroyed by something external. */ public void despawned(Bullet b){ + if(despawnHit){ + hit(b); + } despawnEffect.at(b.x, b.y, b.rotation(), hitColor); - hitSound.at(b); + despawnSound.at(b); Effect.shake(despawnShake, despawnShake, b); + } - if(fragBullet != null || splashDamageRadius > 0 || lightning > 0){ - hit(b); + /** Called when the bullet is removed for any reason. */ + public void removed(Bullet b){ + if(trailLength > 0 && b.trail != null && b.trail.size() > 0){ + Fx.trailFade.at(b.x, b.y, trailWidth, trailColor, b.trail.copy()); } } public void draw(Bullet b){ + drawTrail(b); + } + + public void drawTrail(Bullet b){ + if(trailLength > 0 && b.trail != null){ + //draw below bullets? TODO + float z = Draw.z(); + Draw.z(z - 0.0001f); + b.trail.draw(trailColor, trailWidth); + Draw.z(z); + } } public void drawLight(Bullet b){ + if(lightOpacity <= 0f || lightRadius <= 0f) return; Drawf.light(b.team, b, lightRadius, lightColor, lightOpacity); } public void init(Bullet b){ - if(killShooter && b.owner() instanceof Healthc){ - ((Healthc)b.owner()).kill(); + + if(killShooter && b.owner() instanceof Healthc h){ + h.kill(); } if(instantDisappear){ b.time = lifetime; } + + if(fragBullet != null || splashDamageRadius > 0 || lightning > 0){ + despawnHit = true; + } + + if(lightRadius == -1){ + lightRadius = Math.max(18, hitSize * 5f); + } + drawSize = Math.max(drawSize, trailLength * speed * 2f); } public void update(Bullet b){ - if(homingPower > 0.0001f){ - Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround); + if(!headless && trailLength > 0){ + if(b.trail == null){ + b.trail = new Trail(trailLength); + } + b.trail.length = trailLength; + b.trail.update(b.x, b.y, trailInterp.apply(b.fin())); + } + + if(homingPower > 0.0001f && b.time >= homingDelay){ + Teamc target; + //home in on allies if possible + if(healPercent > 0){ + target = Units.closestTarget(null, b.x, b.y, homingRange, + e -> e.checkTarget(collidesAir, collidesGround) && e.team != b.team, + t -> collidesGround && (t.team != b.team || t.damaged())); + }else{ + target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> e.checkTarget(collidesAir, collidesGround), t -> collidesGround); + } + if(target != null){ - b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), homingPower)); + b.vel.setAngle(Angles.moveToward(b.rotation(), b.angleTo(target), homingPower * Time.delta * 50f)); } } if(weaveMag > 0){ - b.vel.rotate(Mathf.sin(Mathf.randomSeed(b.id, 10f) + b.time, weaveScale, weaveMag) * Time.delta); + b.vel.rotate(Mathf.sin(b.time + Mathf.PI * weaveScale/2f, weaveScale, weaveMag * (Mathf.randomSeed(b.id, 0, 1) == 1 ? -1 : 1)) * Time.delta); } if(trailChance > 0){ if(Mathf.chanceDelta(trailChance)){ - trailEffect.at(b.x, b.y, trailParam, trailColor); + trailEffect.at(b.x, b.y, trailRotation ? b.rotation() : trailParam, trailColor); } } + + if(trailInterval > 0f){ + if(b.timer(0, trailInterval)){ + trailEffect.at(b.x, b.y, trailRotation ? b.rotation() : trailParam, trailColor); + } + } + } + + @Override + public void init(){ + if(pierceCap >= 1){ + pierce = true; + //pierceBuilding is not enabled by default, because a bullet may want to *not* pierce buildings + } + + if(lightningType == null){ + lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; + } } @Override @@ -262,11 +428,11 @@ public abstract class BulletType extends Content{ } public Bullet create(Bullet parent, float x, float y, float angle){ - return create(parent.owner(), parent.team, x, y, angle); + return create(parent.owner, parent.team, x, y, angle); } public Bullet create(Bullet parent, float x, float y, float angle, float velocityScl, float lifeScale){ - return create(parent.owner(), parent.team, x, y, angle, velocityScl, lifeScale); + return create(parent.owner, parent.team, x, y, angle, velocityScl, lifeScale); } public Bullet create(Bullet parent, float x, float y, float angle, float velocityScl){ @@ -278,6 +444,7 @@ public abstract class BulletType extends Content{ bullet.type = this; bullet.owner = owner; bullet.team = team; + bullet.time = 0f; bullet.vel.trns(angle, speed * velocityScl); if(backMove){ bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); @@ -288,10 +455,14 @@ public abstract class BulletType extends Content{ bullet.data = data; bullet.drag = drag; bullet.hitSize = hitSize; - bullet.damage = damage < 0 ? this.damage : damage; + bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier(); + //reset trail + if(bullet.trail != null){ + bullet.trail.clear(); + } bullet.add(); - if(keepVelocity && owner instanceof Velc) bullet.vel.add(((Velc)owner).vel().x, ((Velc)owner).vel().y); + if(keepVelocity && owner instanceof Velc v) bullet.vel.add(v.vel().x, v.vel().y); return bullet; } @@ -301,6 +472,7 @@ public abstract class BulletType extends Content{ @Remote(called = Loc.server, unreliable = true) public static void createBullet(BulletType type, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl){ + if(type == null) return; type.create(null, team, x, y, angle, damage, velocityScl, lifetimeScl, null); } } diff --git a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java index e146fd7a54..f1c57dcee8 100644 --- a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java +++ b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java @@ -13,6 +13,8 @@ public class ContinuousLaserBulletType extends BulletType{ public float length = 220f; public float shake = 1f; public float fadeTime = 16f; + public float lightStroke = 40f; + public float spaceMag = 35f; public Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white}; public float[] tscales = {1f, 0.7f, 0.5f, 0.2f}; public float[] strokes = {2f, 1.5f, 1f, 0.3f}; @@ -23,20 +25,21 @@ public class ContinuousLaserBulletType extends BulletType{ public ContinuousLaserBulletType(float damage){ super(0.001f, damage); - hitEffect = Fx.hitMeltdown; + hitEffect = Fx.hitBeam; despawnEffect = Fx.none; hitSize = 4; drawSize = 420f; lifetime = 16f; - keepVelocity = false; - pierce = true; - hittable = false; hitColor = colors[2]; - collidesTiles = false; incendAmount = 1; incendSpread = 5; incendChance = 0.4f; lightColor = Color.orange; + impact = true; + keepVelocity = false; + collides = false; + pierce = true; + hittable = false; absorbable = false; } @@ -44,9 +47,21 @@ public class ContinuousLaserBulletType extends BulletType{ this(0); } + @Override + public float continuousDamage(){ + return damage / 5f * 60f; + } + + @Override + public float estimateDPS(){ + //assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method + //assume it pierces 3 blocks/units + return damage * 100f / 5f * 3f; + } + @Override public float range(){ - return length; + return Math.max(length, maxRange); } @Override @@ -58,7 +73,6 @@ public class ContinuousLaserBulletType extends BulletType{ @Override public void update(Bullet b){ - //TODO possible laser absorption from blocks //damage every 5 ticks if(b.timer(1, 5f)){ @@ -78,17 +92,17 @@ public class ContinuousLaserBulletType extends BulletType{ Lines.lineAngle(b.x, b.y, b.rotation(), baseLen); for(int s = 0; s < colors.length; s++){ - Draw.color(Tmp.c1.set(colors[s]).mul(1f + Mathf.absin(Time.time(), 1f, 0.1f))); + Draw.color(Tmp.c1.set(colors[s]).mul(1f + Mathf.absin(Time.time, 1f, 0.1f))); for(int i = 0; i < tscales.length; i++){ - Tmp.v1.trns(b.rotation() + 180f, (lenscales[i] - 1f) * 35f); - Lines.stroke((width + Mathf.absin(Time.time(), oscScl, oscMag)) * fout * strokes[s] * tscales[i]); + Tmp.v1.trns(b.rotation() + 180f, (lenscales[i] - 1f) * spaceMag); + Lines.stroke((width + Mathf.absin(Time.time, oscScl, oscMag)) * fout * strokes[s] * tscales[i]); Lines.lineAngle(b.x + Tmp.v1.x, b.y + Tmp.v1.y, b.rotation(), baseLen * lenscales[i], false); } } Tmp.v1.trns(b.rotation(), baseLen * 1.1f); - Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 40, lightColor, 0.7f); + Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, lightStroke, lightColor, 0.7f); Draw.reset(); } diff --git a/core/src/mindustry/entities/bullet/EmpBulletType.java b/core/src/mindustry/entities/bullet/EmpBulletType.java new file mode 100644 index 0000000000..7e281e3b08 --- /dev/null +++ b/core/src/mindustry/entities/bullet/EmpBulletType.java @@ -0,0 +1,70 @@ +package mindustry.entities.bullet; + +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; + +public class EmpBulletType extends BasicBulletType{ + public float radius = 100f; + public float timeIncrease = 2.5f, timeDuration = 60f * 10f; + public float powerDamageScl = 2f, powerSclDecrease = 0.2f; + public Effect hitPowerEffect = Fx.hitEmpSpark, chainEffect = Fx.chainEmp, applyEffect = Fx.heal; + public boolean hitUnits = true; + public float unitDamageScl = 0.7f; + + @Override + public void hit(Bullet b, float x, float y){ + super.hit(b, x, y); + + if(!b.absorbed){ + Vars.indexer.allBuildings(x, y, radius, other -> { + if(other.team == b.team){ + if(other.block.hasPower && other.block.canOverdrive && other.timeScale < timeIncrease){ + if(timeIncrease >= other.timeScale){ + other.timeScale = Math.max(other.timeScale, timeIncrease); + } + other.timeScaleDuration = Math.max(other.timeScaleDuration, timeDuration); + chainEffect.at(x, y, 0, hitColor, other); + applyEffect.at(other, other.block.size * 7f); + } + + if(other.block.hasPower && other.damaged()){ + other.heal(healPercent / 100f * other.maxHealth()); + Fx.healBlockFull.at(other.x, other.y, other.block.size, hitColor); + applyEffect.at(other, other.block.size * 7f); + } + }else if(other.power != null){ + var absorber = Damage.findAbsorber(b.team, x, y, other.x, other.y); + if(absorber != null){ + other = absorber; + } + + if(other.power != null && other.power.graph.getLastPowerProduced() > 0f){ + other.timeScale = Math.min(other.timeScale, powerSclDecrease); + other.timeScaleDuration = timeDuration; + other.damage(damage * powerDamageScl); + hitPowerEffect.at(other.x, other.y, b.angleTo(other), hitColor); + chainEffect.at(x, y, 0, hitColor, other); + } + } + }); + + if(hitUnits){ + Units.nearbyEnemies(b.team, x, y, radius, other -> { + if(other.team != b.team){ + var absorber = Damage.findAbsorber(b.team, x, y, other.x, other.y); + if(absorber != null){ + return; + } + + hitPowerEffect.at(other.x, other.y, b.angleTo(other), hitColor); + chainEffect.at(x, y, 0, hitColor, other); + other.damage(damage * unitDamageScl); + other.apply(status, statusDuration); + } + }); + } + } + } +} diff --git a/core/src/mindustry/entities/bullet/FlakBulletType.java b/core/src/mindustry/entities/bullet/FlakBulletType.java index ad5f8be7fa..a1ae9c2ee8 100644 --- a/core/src/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/mindustry/entities/bullet/FlakBulletType.java @@ -6,7 +6,7 @@ import mindustry.entities.*; import mindustry.gen.*; public class FlakBulletType extends BasicBulletType{ - public float explodeRange = 30f; + public float explodeRange = 30f, explodeDelay = 5f; public FlakBulletType(float speed, float damage){ super(speed, damage, "shell"); @@ -25,17 +25,21 @@ public class FlakBulletType extends BasicBulletType{ @Override public void update(Bullet b){ super.update(b); - if(b.data() instanceof Integer) return; + //don't check for targets if primed to explode + if(b.fdata < 0f) return; if(b.timer(2, 6)){ Units.nearbyEnemies(b.team, Tmp.r1.setSize(explodeRange * 2f).setCenter(b.x, b.y), unit -> { - if(b.data() instanceof Float || !unit.checkTarget(collidesAir, collidesGround)) return; + //fadata < 0 means it's primed to explode + if(b.fdata < 0f || !unit.checkTarget(collidesAir, collidesGround)) return; - if(unit.dst(b) < explodeRange){ - b.data(0); - Time.run(5f, () -> { - if(b.data() instanceof Integer){ - b.time(b.lifetime()); + if(unit.within(b, explodeRange)){ + //mark as primed + b.fdata = -1f; + Time.run(explodeDelay, () -> { + //explode + if(b.fdata < 0){ + b.time = b.lifetime; } }); } diff --git a/core/src/mindustry/entities/bullet/HealBulletType.java b/core/src/mindustry/entities/bullet/HealBulletType.java deleted file mode 100644 index b811790000..0000000000 --- a/core/src/mindustry/entities/bullet/HealBulletType.java +++ /dev/null @@ -1,55 +0,0 @@ -package mindustry.entities.bullet; - -import arc.graphics.*; -import arc.graphics.g2d.*; -import mindustry.content.*; -import mindustry.gen.*; -import mindustry.graphics.*; -import mindustry.world.blocks.*; - -public class HealBulletType extends BulletType{ - protected float healPercent = 3f; - protected float height = 7f, width = 2f; - protected Color backColor = Pal.heal, frontColor = Color.white; - - public HealBulletType(float speed, float damage){ - super(speed, damage); - - shootEffect = Fx.shootHeal; - smokeEffect = Fx.hitLaser; - hitEffect = Fx.hitLaser; - despawnEffect = Fx.hitLaser; - collidesTeam = true; - hittable = false; - reflectable = false; - } - - public HealBulletType(){ - this(1f, 1f); - } - - @Override - public boolean collides(Bullet b, Building tile){ - return tile.team != b.team || tile.healthf() < 1f; - } - - @Override - public void draw(Bullet b){ - Draw.color(backColor); - Lines.stroke(width); - Lines.lineAngleCenter(b.x, b.y, b.rotation(), height); - Draw.color(frontColor); - Lines.lineAngleCenter(b.x, b.y, b.rotation(), height / 2f); - Draw.reset(); - } - - @Override - public void hitTile(Bullet b, Building tile, float initialHealth){ - super.hit(b); - - if(tile.team == b.team && !(tile.block instanceof ConstructBlock)){ - Fx.healBlockFull.at(tile.x, tile.y, tile.block.size, Pal.heal); - tile.heal(healPercent / 100f * tile.maxHealth()); - } - } -} diff --git a/core/src/mindustry/entities/bullet/LaserBoltBulletType.java b/core/src/mindustry/entities/bullet/LaserBoltBulletType.java new file mode 100644 index 0000000000..beff118b7a --- /dev/null +++ b/core/src/mindustry/entities/bullet/LaserBoltBulletType.java @@ -0,0 +1,37 @@ +package mindustry.entities.bullet; + +import arc.graphics.g2d.*; +import mindustry.gen.*; +import mindustry.content.*; +import mindustry.graphics.*; + +public class LaserBoltBulletType extends BasicBulletType{ + public float width = 2f, height = 7f; + + public LaserBoltBulletType(float speed, float damage){ + super(speed, damage); + + smokeEffect = Fx.hitLaser; + hitEffect = Fx.hitLaser; + despawnEffect = Fx.hitLaser; + hittable = false; + reflectable = false; + lightColor = Pal.heal; + lightOpacity = 0.6f; + } + + public LaserBoltBulletType(){ + this(1f, 1f); + } + + @Override + public void draw(Bullet b){ + super.draw(b); + Draw.color(backColor); + Lines.stroke(width); + Lines.lineAngleCenter(b.x, b.y, b.rotation(), height); + Draw.color(frontColor); + Lines.lineAngleCenter(b.x, b.y, b.rotation(), height / 2f); + Draw.reset(); + } +} diff --git a/core/src/mindustry/entities/bullet/LaserBulletType.java b/core/src/mindustry/entities/bullet/LaserBulletType.java index ad5965f3b8..0961a91e8c 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -23,22 +23,31 @@ public class LaserBulletType extends BulletType{ public LaserBulletType(float damage){ super(0.01f, damage); - keepVelocity = false; - hitEffect = Fx.hitLancer; + hitEffect = Fx.hitLaserBlast; + hitColor = colors[2]; despawnEffect = Fx.none; shootEffect = Fx.hitLancer; smokeEffect = Fx.none; - collides = false; hitSize = 4; lifetime = 16f; + impact = true; + keepVelocity = false; + collides = false; pierce = true; hittable = false; + absorbable = false; } public LaserBulletType(){ this(1f); } + //assume it pierces at least 3 blocks + @Override + public float estimateDPS(){ + return super.estimateDPS() * 3f; + } + @Override public void init(){ super.init(); @@ -48,7 +57,7 @@ public class LaserBulletType extends BulletType{ @Override public float range(){ - return length; + return Math.max(length, maxRange); } @Override diff --git a/core/src/mindustry/entities/bullet/LightningBulletType.java b/core/src/mindustry/entities/bullet/LightningBulletType.java index dbfbcc0301..578f055bae 100644 --- a/core/src/mindustry/entities/bullet/LightningBulletType.java +++ b/core/src/mindustry/entities/bullet/LightningBulletType.java @@ -8,8 +8,8 @@ import mindustry.gen.*; import mindustry.graphics.*; public class LightningBulletType extends BulletType{ - protected Color lightningColor = Pal.lancerLaser; - protected int lightningLength = 25, lightningLengthRand = 0; + public Color lightningColor = Pal.lancerLaser; + public int lightningLength = 25, lightningLengthRand = 0; public LightningBulletType(){ super(0.0001f, 1f); @@ -19,6 +19,8 @@ public class LightningBulletType extends BulletType{ hitEffect = Fx.hitLancer; keepVelocity = false; hittable = false; + //for stats + status = StatusEffects.shocked; } @Override @@ -26,6 +28,11 @@ public class LightningBulletType extends BulletType{ return (lightningLength + lightningLengthRand/2f) * 6f; } + @Override + public float estimateDPS(){ + return super.estimateDPS() * Math.max(lightningLength / 10f, 1); + } + @Override public void draw(Bullet b){ } diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 85f62216ae..24c91fd209 100644 --- a/core/src/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/mindustry/entities/bullet/LiquidBulletType.java @@ -3,7 +3,7 @@ package mindustry.entities.bullet; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; @@ -15,6 +15,7 @@ import static mindustry.Vars.*; public class LiquidBulletType extends BulletType{ public Liquid liquid; public float puddleSize = 6f; + public float orbSize = 3f; public LiquidBulletType(@Nullable Liquid liquid){ super(3.5f, 0); @@ -22,6 +23,8 @@ public class LiquidBulletType extends BulletType{ if(liquid != null){ this.liquid = liquid; this.status = liquid.effect; + lightColor = liquid.lightColor; + lightOpacity = liquid.lightColor.a; } ammoMultiplier = 1f; @@ -60,9 +63,10 @@ public class LiquidBulletType extends BulletType{ @Override public void draw(Bullet b){ + super.draw(b); Draw.color(liquid.color, Color.white, b.fout() / 100f); - - Fill.circle(b.x, b.y, puddleSize / 2); + Fill.circle(b.x, b.y, orbSize); + Draw.reset(); } @Override diff --git a/core/src/mindustry/entities/bullet/MassDriverBolt.java b/core/src/mindustry/entities/bullet/MassDriverBolt.java index 70d3c6de9b..91dae839a8 100644 --- a/core/src/mindustry/entities/bullet/MassDriverBolt.java +++ b/core/src/mindustry/entities/bullet/MassDriverBolt.java @@ -1,15 +1,14 @@ package mindustry.entities.bullet; -import arc.graphics.Color; -import arc.graphics.g2d.Draw; -import arc.math.Angles; -import arc.math.Mathf; -import mindustry.content.Fx; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.content.*; import mindustry.gen.*; -import mindustry.graphics.Pal; -import mindustry.world.blocks.distribution.MassDriver.DriverBulletData; +import mindustry.graphics.*; +import mindustry.world.blocks.distribution.MassDriver.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class MassDriverBolt extends BulletType{ @@ -37,15 +36,13 @@ public class MassDriverBolt extends BulletType{ @Override public void update(Bullet b){ //data MUST be an instance of DriverBulletData - if(!(b.data() instanceof DriverBulletData)){ + if(!(b.data() instanceof DriverBulletData data)){ hit(b); return; } float hitDst = 7f; - DriverBulletData data = (DriverBulletData)b.data(); - //if the target is dead, just keep flying until the bullet explodes if(data.to.dead()){ return; @@ -84,9 +81,7 @@ public class MassDriverBolt extends BulletType{ public void despawned(Bullet b){ super.despawned(b); - if(!(b.data() instanceof DriverBulletData)) return; - - DriverBulletData data = (DriverBulletData)b.data(); + if(!(b.data() instanceof DriverBulletData data)) return; for(int i = 0; i < data.items.length; i++){ int amountDropped = Mathf.random(0, data.items[i]); diff --git a/core/src/mindustry/entities/bullet/MissileBulletType.java b/core/src/mindustry/entities/bullet/MissileBulletType.java index 274a806f5e..7d8cf7b8a3 100644 --- a/core/src/mindustry/entities/bullet/MissileBulletType.java +++ b/core/src/mindustry/entities/bullet/MissileBulletType.java @@ -15,7 +15,7 @@ public class MissileBulletType extends BasicBulletType{ height = 8f; hitSound = Sounds.explosion; trailChance = 0.2f; - lifetime = 49f; + lifetime = 52f; } public MissileBulletType(float speed, float damage){ diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java index 8265f35e8b..d141c69998 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -1,60 +1,81 @@ package mindustry.entities.bullet; +import arc.math.geom.*; +import arc.util.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -//TODO this class is bad for multiple reasons, remove/replace it. -//- effects unreliable -//- not really hitscan but works like it -//- buggy trails -//- looks bad -//- generally unreliable public class RailBulletType extends BulletType{ public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none; /** Multiplier of damage decreased per health pierced. */ public float pierceDamageFactor = 1f; + public float length = 100f; + + public float updateEffectSeg = 20f; + public RailBulletType(){ pierceBuilding = true; pierce = true; reflectable = false; hitEffect = Fx.none; despawnEffect = Fx.none; + collides = false; + lifetime = 1f; + speed = 0.01f; + } + + @Override + public float range(){ + return length; } void handle(Bullet b, Posc pos, float initialHealth){ - float sub = initialHealth*pierceDamageFactor; + float sub = Math.max(initialHealth*pierceDamageFactor, 0); - if(sub >= b.damage){ - //cause a despawn - b.remove(); + if(b.damage <= 0){ + b.fdata = Math.min(b.fdata, b.dst(pos)); + return; + } + + if(b.damage > 0){ + pierceEffect.at(pos.getX(), pos.getY(), b.rotation()); + + hitEffect.at(pos.getX(), pos.getY()); } //subtract health from each consecutive pierce b.damage -= Math.min(b.damage, sub); - - if(b.damage > 0){ - pierceEffect.at(pos.getX(), pos.getY(), b.rotation()); - } - - hitEffect.at(pos.getX(), pos.getY()); } @Override - public void update(Bullet b){ - if(b.timer(1, 0.9f)){ - updateEffect.at(b.x, b.y, b.rotation()); + public void init(Bullet b){ + super.init(b); + + b.fdata = length; + Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false); + float resultLen = b.fdata; + + Vec2 nor = Tmp.v1.set(b.vel).nor(); + for(float i = 0; i <= resultLen; i += updateEffectSeg){ + updateEffect.at(b.x + nor.x * i, b.y + nor.y * i, b.rotation()); } } @Override - public void hitEntity(Bullet b, Hitboxc entity, float initialHealth){ - handle(b, entity, initialHealth); + public boolean testCollision(Bullet bullet, Building tile){ + return bullet.team != tile.team; } @Override - public void hitTile(Bullet b, Building tile, float initialHealth){ - handle(b, tile, initialHealth); + public void hitEntity(Bullet b, Hitboxc entity, float health){ + handle(b, entity, health); + super.hitEntity(b, entity, health); + } + + @Override + public void hitTile(Bullet b, Building build, float initialHealth, boolean direct){ + handle(b, build, initialHealth); } } diff --git a/core/src/mindustry/entities/bullet/SapBulletType.java b/core/src/mindustry/entities/bullet/SapBulletType.java index 549485c3e2..ee3cd6699c 100644 --- a/core/src/mindustry/entities/bullet/SapBulletType.java +++ b/core/src/mindustry/entities/bullet/SapBulletType.java @@ -20,17 +20,20 @@ public class SapBulletType extends BulletType{ speed = 0.0001f; despawnEffect = Fx.none; pierce = true; + collides = false; hitSize = 0f; hittable = false; hitEffect = Fx.hitLiquid; status = StatusEffects.sapped; + lightColor = Pal.sap; + lightOpacity = 0.6f; statusDuration = 60f * 3f; + impact = true; } @Override public void draw(Bullet b){ - if(b.data instanceof Position){ - Position data = (Position)b.data; + if(b.data instanceof Position data){ Tmp.v1.set(data).lerp(b, b.fin()); Draw.color(color); @@ -39,7 +42,7 @@ public class SapBulletType extends BulletType{ Draw.reset(); - Drawf.light(b.team, b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f); + Drawf.light(b.team, b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * b.fout(), lightColor, lightOpacity); } } @@ -50,7 +53,7 @@ public class SapBulletType extends BulletType{ @Override public float range(){ - return length; + return Math.max(length, maxRange); } @Override @@ -61,21 +64,17 @@ public class SapBulletType extends BulletType{ b.data = target; if(target != null){ - float result = Math.min(target.health(), damage); + float result = Math.max(Math.min(target.health(), damage), 0); - if(b.owner instanceof Healthc){ - ((Healthc)b.owner).heal(result * sapStrength); + if(b.owner instanceof Healthc h){ + h.heal(result * sapStrength); } } - if(target instanceof Hitboxc){ - Hitboxc hit = (Hitboxc)target; - + if(target instanceof Hitboxc hit){ hit.collision(b, hit.x(), hit.y()); b.collision(hit, hit.x(), hit.y()); - }else if(target instanceof Building){ - Building tile = (Building)target; - + }else if(target instanceof Building tile){ if(tile.collide(b)){ tile.collision(b); hit(b, tile.x, tile.y); diff --git a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java index 01a7ad2d7e..ccc5532e7d 100644 --- a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java +++ b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java @@ -24,13 +24,18 @@ public class ShrapnelBulletType extends BulletType{ shootEffect = smokeEffect = Fx.lightningShoot; lifetime = 10f; despawnEffect = Fx.none; - pierce = true; keepVelocity = false; + collides = false; + pierce = true; hittable = false; + absorbable = false; + lightOpacity = 0.6f; } @Override public void init(Bullet b){ + super.init(b); + Damage.collideLaser(b, length, hitLarge); } @@ -43,16 +48,16 @@ public class ShrapnelBulletType extends BulletType{ @Override public float range(){ - return length; + return Math.max(length, maxRange); } @Override public void draw(Bullet b){ - float realLength = b.fdata; + float realLength = b.fdata, rot = b.rotation(); Draw.color(fromColor, toColor, b.fin()); for(int i = 0; i < (int)(serrations * realLength / length); i++){ - Tmp.v1.trns(b.rotation(), i * serrationSpacing); + Tmp.v1.trns(rot, i * serrationSpacing); float sl = Mathf.clamp(b.fout() - serrationFadeOffset) * (serrationSpaceOffset - i * serrationLenScl); Drawf.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, serrationWidth, sl, b.rotation() + 90); Drawf.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, serrationWidth, sl, b.rotation() - 90); @@ -60,5 +65,7 @@ public class ShrapnelBulletType extends BulletType{ Drawf.tri(b.x, b.y, width * b.fout(), (realLength + 50), b.rotation()); Drawf.tri(b.x, b.y, width * b.fout(), 10f, b.rotation() + 180f); Draw.reset(); + + Drawf.light(b.team, b.x, b.y, b.x + Angles.trnsx(rot, realLength), b.y + Angles.trnsy(rot, realLength), width * 2.5f * b.fout(), toColor, lightOpacity); } } diff --git a/core/src/mindustry/entities/comp/BlockUnitComp.java b/core/src/mindustry/entities/comp/BlockUnitComp.java index d0ec5b9a32..a0b1fdebcd 100644 --- a/core/src/mindustry/entities/comp/BlockUnitComp.java +++ b/core/src/mindustry/entities/comp/BlockUnitComp.java @@ -4,7 +4,6 @@ import arc.graphics.g2d.*; import mindustry.annotations.Annotations.*; import mindustry.game.*; import mindustry.gen.*; -import mindustry.ui.*; import static mindustry.Vars.*; @@ -34,7 +33,7 @@ abstract class BlockUnitComp implements Unitc{ @Replace @Override public TextureRegion icon(){ - return tile.block.icon(Cicon.full); + return tile.block.fullIcon; } @Override diff --git a/core/src/mindustry/entities/comp/BoundedComp.java b/core/src/mindustry/entities/comp/BoundedComp.java index c266ae3e51..9976ed31c8 100644 --- a/core/src/mindustry/entities/comp/BoundedComp.java +++ b/core/src/mindustry/entities/comp/BoundedComp.java @@ -9,18 +9,25 @@ import static mindustry.Vars.*; @Component abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{ - static final float warpDst = 180f; + static final float warpDst = 40f; @Import float x, y; @Import Vec2 vel; @Override public void update(){ - //repel unit out of bounds - if(x < 0) vel.x += (-x/warpDst); - if(y < 0) vel.y += (-y/warpDst); - if(x > world.unitWidth()) vel.x -= (x - world.unitWidth())/warpDst; - if(y > world.unitHeight()) vel.y -= (y - world.unitHeight())/warpDst; + if(!net.client() || isLocal()){ + + float dx = 0f, dy = 0f; + + //repel unit out of bounds + if(x < 0) dx += (-x/warpDst); + if(y < 0) dy += (-y/warpDst); + if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst; + if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst; + + velAddNet(dx, dy); + } //clamp position if not flying if(isGrounded()){ diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 36f9661931..9b456e5602 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -1,42 +1,64 @@ package mindustry.entities.comp; import arc.*; +import arc.func.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.Queue; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.blocks.ConstructBlock.*; +import mindustry.world.blocks.storage.CoreBlock.*; import java.util.*; import static mindustry.Vars.*; @Component -abstract class BuilderComp implements Unitc{ +abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{ static final Vec2[] vecs = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()}; - @Import float x, y, rotation; + @Import float x, y, rotation, buildSpeedMultiplier; + @Import UnitType type; + @Import Team team; - @SyncLocal Queue plans = new Queue<>(); - @SyncLocal transient boolean updateBuilding = true; + @SyncLocal Queue plans = new Queue<>(1); + @SyncLocal boolean updateBuilding = true; + + private transient BuildPlan lastActive; + private transient int lastSize; + private transient float buildAlpha = 0f; + + public boolean canBuild(){ + return type.buildSpeed > 0 && buildSpeedMultiplier > 0; + } @Override public void update(){ - if(!updateBuilding) return; + if(!headless){ + //visual activity update + if(lastActive != null && buildAlpha <= 0.01f){ + lastActive = null; + } + + buildAlpha = Mathf.lerpDelta(buildAlpha, activelyBuilding() ? 1f : 0f, 0.15f); + } + + if(!updateBuilding || !canBuild()) return; float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange; - boolean infinite = state.rules.infiniteResources || team().rules().infiniteResources; Iterator it = plans.iterator(); @@ -48,7 +70,7 @@ abstract class BuilderComp implements Unitc{ } } - Building core = core(); + var core = core(); //nothing to build. if(buildPlan() == null) return; @@ -57,7 +79,7 @@ abstract class BuilderComp implements Unitc{ if(plans.size > 1){ int total = 0; BuildPlan req; - while((dst((req = buildPlan()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < plans.size){ + while((!within((req = buildPlan()).tile(), finalPlaceDst) || shouldSkip(req, core)) && total < plans.size){ plans.removeFirst(); plans.addLast(req); total++; @@ -65,82 +87,99 @@ abstract class BuilderComp implements Unitc{ } BuildPlan current = buildPlan(); + Tile tile = current.tile(); - if(!within(current.tile(), finalPlaceDst)) return; + lastActive = current; + buildAlpha = 1f; + if(current.breaking) lastSize = tile.block().size; - Tile tile = world.tile(current.x, current.y); + if(!within(tile, finalPlaceDst)) return; - if(within(tile, finalPlaceDst)){ - lookAt(angleTo(tile)); - } - - if(!(tile.block() instanceof ConstructBlock)){ - if(!current.initialized && !current.breaking && Build.validPlace(current.block, team(), current.x, current.y, current.rotation)){ - boolean hasAll = infinite || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item)); + if(!(tile.build instanceof ConstructBuild cb)){ + if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){ + boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item)); if(hasAll){ - Call.beginPlace(current.block, team(), current.x, current.y, current.rotation); + Call.beginPlace(self(), current.block, team, current.x, current.y, current.rotation); }else{ current.stuck = true; } - }else if(!current.initialized && current.breaking && Build.validBreak(team(), current.x, current.y)){ - Call.beginBreak(team(), current.x, current.y); + }else if(!current.initialized && current.breaking && Build.validBreak(team, current.x, current.y)){ + Call.beginBreak(self(), team, current.x, current.y); }else{ plans.removeFirst(); return; } - }else if(tile.team() != team()){ + }else if((tile.team() != team && tile.team() != Team.derelict) || (!current.breaking && (cb.current != current.block || cb.tile != current.tile()))){ plans.removeFirst(); return; } if(tile.build instanceof ConstructBuild && !current.initialized){ - Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, team(), (Builderc)this, current.breaking))); + Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, team, self(), current.breaking))); current.initialized = true; } //if there is no core to build with or no build entity, stop building! - if((core == null && !infinite) || !(tile.build instanceof ConstructBuild)){ + if((core == null && !infinite) || !(tile.build instanceof ConstructBuild entity)){ return; } //otherwise, update it. - ConstructBuild entity = tile.bc(); - if(current.breaking){ - entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier); + entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * buildSpeedMultiplier * state.rules.buildSpeedMultiplier); }else{ - entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier, current.config); + entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * buildSpeedMultiplier * state.rules.buildSpeedMultiplier, current.config); } current.stuck = Mathf.equal(current.progress, entity.progress); current.progress = entity.progress; } + /** Draw all current build plans. Does not draw the beam effect, only the positions. */ + void drawBuildPlans(){ + Boolf skip = plan -> plan.progress > 0.01f || (buildPlan() == plan && plan.initialized && (within(plan.x * tilesize, plan.y * tilesize, buildingRange) || state.isEditor())); - /** Draw all current build requests. Does not draw the beam effect, only the positions. */ - void drawBuildRequests(){ - - for(BuildPlan request : plans){ - if(request.progress > 0.01f || (buildPlan() == request && request.initialized && (dst(request.x * tilesize, request.y * tilesize) <= buildingRange || state.isEditor()))) continue; - - request.animScale = 1f; - if(request.breaking){ - control.input.drawBreaking(request); - }else{ - request.block.drawRequest(request, control.input.allRequests(), - Build.validPlace(request.block, team(), request.x, request.y, request.rotation) || control.input.requestMatches(request)); + for(int i = 0; i < 2; i++){ + for(BuildPlan plan : plans){ + if(skip.get(plan)) continue; + if(i == 0){ + drawPlan(plan, 1f); + }else{ + drawPlanTop(plan, 1f); + } } } Draw.reset(); } + void drawPlan(BuildPlan request, float alpha){ + request.animScale = 1f; + if(request.breaking){ + control.input.drawBreaking(request); + }else{ + request.block.drawPlan(request, control.input.allRequests(), + Build.validPlace(request.block, team, request.x, request.y, request.rotation) || control.input.requestMatches(request), + alpha); + } + } + + void drawPlanTop(BuildPlan request, float alpha){ + if(!request.breaking){ + Draw.reset(); + Draw.mixcol(Color.white, 0.24f + Mathf.absin(Time.globalTime, 6f, 0.28f)); + Draw.alpha(alpha); + request.block.drawRequestConfigTop(request, plans); + } + } + /** @return whether this request should be skipped, in favor of the next one. */ boolean shouldSkip(BuildPlan request, @Nullable Building core){ //requests that you have at least *started* are considered - if(state.rules.infiniteResources || team().rules().infiniteResources || request.breaking || core == null) return false; - return (request.stuck && !core.items.has(request.block.requirements)) || (Structs.contains(request.block.requirements, i -> !core.items.has(i.item)) && !request.initialized); + if(state.rules.infiniteResources || team.rules().infiniteResources || request.breaking || core == null || request.isRotation(team)) return false; + + return (request.stuck && !core.items.has(request.block.requirements)) || (Structs.contains(request.block.requirements, i -> !core.items.has(i.item) && Mathf.round(i.amount * state.rules.buildCostMultiplier) > 0) && !request.initialized); } void removeBuild(int x, int y, boolean breaking){ @@ -168,6 +207,8 @@ abstract class BuilderComp implements Unitc{ /** Add another build requests to the queue, if it doesn't exist there yet. */ void addBuild(BuildPlan place, boolean tail){ + if(!canBuild()) return; + BuildPlan replace = null; for(BuildPlan request : plans){ if(request.x == place.x && request.y == place.y){ @@ -179,8 +220,8 @@ abstract class BuilderComp implements Unitc{ plans.remove(replace); } Tile tile = world.tile(place.x, place.y); - if(tile != null && tile.build instanceof ConstructBuild){ - place.progress = tile.bc().progress; + if(tile != null && tile.build instanceof ConstructBuild cons){ + place.progress = cons.progress; } if(tail){ plans.addLast(place); @@ -190,6 +231,12 @@ abstract class BuilderComp implements Unitc{ } boolean activelyBuilding(){ + //not actively building when not near the build plan + if(isBuilding()){ + if(!state.isEditor() && !within(buildPlan(), state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange)){ + return false; + } + } return isBuilding() && updateBuilding; } @@ -199,25 +246,33 @@ abstract class BuilderComp implements Unitc{ return plans.size == 0 ? null : plans.first(); } - @Override public void draw(){ - if(!isBuilding() || !updateBuilding) return; + boolean active = activelyBuilding(); + if(!active && lastActive == null) return; - //TODO check correctness Draw.z(Layer.flyingUnit); - BuildPlan plan = buildPlan(); + BuildPlan plan = active ? buildPlan() : lastActive; Tile tile = world.tile(plan.x, plan.y); + var core = team.core(); - if(dst(tile) > buildingRange && !state.isEditor()){ + if(tile == null || !within(plan, state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange)){ return; } - int size = plan.breaking ? tile.block().size : plan.block.size; + //draw remote plans. + if(core != null && active && !isLocal() && !(tile.block() instanceof ConstructBlock)){ + Draw.z(Layer.plans - 1f); + drawPlan(plan, 0.5f); + drawPlanTop(plan, 0.5f); + Draw.z(Layer.flyingUnit); + } + + int size = plan.breaking ? active ? tile.block().size : lastSize : plan.block.size; float tx = plan.drawx(), ty = plan.drawy(); - Lines.stroke(1f, Pal.accent); - float focusLen = 3.8f + Mathf.absin(Time.time(), 1.1f, 0.6f); + Lines.stroke(1f, plan.breaking ? Pal.remove : Pal.accent); + float focusLen = type.buildBeamOffset + Mathf.absin(Time.time, 3f, 0.6f); float px = x + Angles.trnsx(rotation, focusLen); float py = y + Angles.trnsy(rotation, focusLen); @@ -231,16 +286,35 @@ abstract class BuilderComp implements Unitc{ Arrays.sort(vecs, Structs.comparingFloat(vec -> -Angles.angleDist(angleTo(vec), ang))); + Vec2 close = Geometry.findClosest(x, y, vecs); + float x1 = vecs[0].x, y1 = vecs[0].y, + x2 = close.x, y2 = close.y, x3 = vecs[1].x, y3 = vecs[1].y; - Draw.alpha(1f); + Draw.z(Layer.buildBeam); - Lines.line(px, py, x1, y1); - Lines.line(px, py, x3, y3); + Draw.alpha(buildAlpha); - Fill.circle(px, py, 1.6f + Mathf.absin(Time.time(), 0.8f, 1.5f)); + if(!active && !(tile.build instanceof ConstructBuild)){ + Fill.square(plan.drawx(), plan.drawy(), size * tilesize/2f); + } - Draw.color(); + if(renderer.animateShields){ + if(close != vecs[0] && close != vecs[1]){ + Fill.tri(px, py, x1, y1, x2, y2); + Fill.tri(px, py, x3, y3, x2, y2); + }else{ + Fill.tri(px, py, x1, y1, x3, y3); + } + }else{ + Lines.line(px, py, x1, y1); + Lines.line(px, py, x3, y3); + } + + Fill.square(px, py, 1.8f + Mathf.absin(Time.time, 2.2f, 1.1f), rotation + 45); + + Draw.reset(); + Draw.z(Layer.flyingUnit); } } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index bf4236ce53..34cb209fc6 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -13,22 +13,27 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; +import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.audio.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.logic.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.ConstructBlock.*; +import mindustry.world.blocks.*; import mindustry.world.blocks.environment.*; +import mindustry.world.blocks.logic.LogicBlock.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.power.*; import mindustry.world.consumers.*; @@ -39,25 +44,25 @@ import static mindustry.Vars.*; @EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false) @Component(base = true) -abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable{ +abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable, Sized{ //region vars and initialization static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6; static final ObjectSet tmpTiles = new ObjectSet<>(); - static final Seq tempTileEnts = new Seq<>(); - static final Seq tempTiles = new Seq<>(); + static final Seq tempBuilds = new Seq<>(); static int sleepingEntities = 0; - @Import float x, y, health; + @Import float x, y, health, maxHealth; @Import Team team; transient Tile tile; transient Block block; - transient Seq proximity = new Seq<>(8); + transient Seq proximity = new Seq<>(6); transient boolean updateFlow; - transient byte dump; + transient byte cdump; transient int rotation; transient boolean enabled = true; transient float enabledControlTime; + transient String lastAccessed; PowerModule power; ItemModule items; @@ -65,6 +70,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, ConsumeModule cons; private transient float timeScale = 1f, timeScaleDuration; + private transient float dumpAccum; private transient @Nullable SoundLoop sound; @@ -78,11 +84,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, create(tile.block(), team); }else{ if(block.hasPower){ + power.init = false; //reinit power graph - power.graph = new PowerGraph(); - power.graph.add(self()); + new PowerGraph().add(self()); } } + proximity.clear(); this.rotation = rotation; this.tile = tile; @@ -103,8 +110,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, this.block = block; this.team = team; - if(block.activeSound != Sounds.none){ - sound = new SoundLoop(block.activeSound, block.activeSoundVolume); + if(block.loopSound != Sounds.none){ + sound = new SoundLoop(block.loopSound, block.loopSoundVolume); } health = block.health; @@ -143,7 +150,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, write.f(health); write.b(rotation | 0b10000000); write.b(team.id); - write.b(0); //extra padding for later use + write.b(1); //version + write.b(enabled ? 1 : 0); if(items != null) items.write(write); if(power != null) power.write(write); if(liquids != null) liquids.write(write); @@ -158,7 +166,14 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, rotation = rot & 0b01111111; boolean legacy = true; if((rot & 0b10000000) != 0){ - read.b(); //padding + byte ver = read.b(); //version of entity save + if(ver == 1){ + byte on = read.b(); + this.enabled = on == 1; + if(!this.enabled){ + enabledControlTime = timeToUncontrol; + } + } legacy = false; } @@ -191,6 +206,39 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //endregion //region utility methods + public void addPlan(boolean checkPrevious){ + if(!block.rebuildable || (team == state.rules.defaultTeam && state.isCampaign() && !block.isVisible())) return; + + Object overrideConfig = null; + + if(self() instanceof ConstructBuild entity){ + //update block to reflect the fact that something was being constructed + if(entity.current != null && entity.current.synthetic() && entity.wasConstructing){ + block = entity.current; + overrideConfig = entity.lastConfig; + }else{ + //otherwise this was a deconstruction that was interrupted, don't want to rebuild that + return; + } + } + + TeamData data = state.teams.get(team); + + if(checkPrevious){ + //remove existing blocks that have been placed here. + //painful O(n) iteration + copy + for(int i = 0; i < data.blocks.size; i++){ + BlockPlan b = data.blocks.get(i); + if(b.x == tile.x && b.y == tile.y){ + data.blocks.removeIndex(i); + break; + } + } + } + + data.blocks.addFirst(new BlockPlan(tile.x, tile.y, (short)rotation, block.id, overrideConfig == null ? config() : overrideConfig)); + } + /** Configure with the current, local player. */ public void configure(Object value){ //save last used config @@ -216,9 +264,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return true; } - public void applyBoost(float intensity, float duration){ + public void applyBoost(float intensity, float duration){ + //do not refresh time scale when getting a weaker intensity + if(intensity >= this.timeScale){ + timeScaleDuration = Math.max(timeScaleDuration, duration); + } timeScale = Math.max(timeScale, intensity); - timeScaleDuration = Math.max(timeScaleDuration, duration); } public Building nearby(int dx, int dy){ @@ -318,6 +369,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return power != null && (block.consumes.has(ConsumeType.power) && !block.consumes.getPower().buffered) ? power.status : 1f; } + public BlockStatus status(){ + return cons.status(); + } + /** Call when nothing is happening to the entity. This increments the internal sleep timer. */ public void sleep(){ sleepTime += Time.delta; @@ -346,6 +401,38 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //endregion //region handler methods + /** @return whether the player can select (but not actually control) this building. */ + public boolean canControlSelect(Player player){ + return false; + } + + /** Called when a player control-selects this building - not called for ControlBlock subclasses. */ + public void onControlSelect(Player player){ + + } + + public void acceptPlayerPayload(Player player, Cons grabber){ + Fx.spawn.at(player); + var unit = player.unit(); + player.clearUnit(); + //player.deathTimer = Player.deathDelay + 1f; //for instant respawn + unit.remove(); + grabber.get(new UnitPayload(unit)); + Fx.unitDrop.at(unit); + if(Vars.net.client()){ + Vars.netClient.clearRemovedEntity(unit.id); + } + } + + public boolean canUnload(){ + return block.unloadable; + } + + /** Called when an unloader takes an item. */ + public void itemTaken(Item item){ + + } + /** Called when this block is dropped as a payload. */ public void dropped(){ @@ -393,7 +480,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } /** Handle a stack input. */ - public void handleStack(Item item, int amount, Teamc source){ + public void handleStack(Item item, int amount, @Nullable Teamc source){ noSleep(); items.add(item, amount); } @@ -403,10 +490,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } - public void onProximityUpdate(){ - noSleep(); - } - public boolean acceptPayload(Building source, Payload payload){ return false; } @@ -423,7 +506,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, */ public boolean movePayload(Payload todump){ int trns = block.size/2 + 1; - Tile next = tile.getNearby(Geometry.d4(rotation).x * trns, Geometry.d4(rotation).y * trns); + Tile next = tile.nearby(Geometry.d4(rotation).x * trns, Geometry.d4(rotation).y * trns); if(next != null && next.build != null && next.build.team == team && next.build.acceptPayload(self(), todump)){ next.build.handlePayload(self(), todump); @@ -441,7 +524,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public boolean dumpPayload(Payload todump){ if(proximity.size == 0) return false; - int dump = this.dump; + int dump = this.cdump; for(int i = 0; i < proximity.size; i++){ Building other = proximity.get((i + dump) % proximity.size); @@ -466,8 +549,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return block.consumes.itemFilters.get(item.id) && items.get(item) < getMaximumAccepted(item); } - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return block.hasLiquids && liquids.get(liquid) + amount < block.liquidCapacity && block.consumes.liquidfilters.get(liquid.id); + public boolean acceptLiquid(Building source, Liquid liquid){ + return block.hasLiquids && block.consumes.liquidfilters.get(liquid.id); } public void handleLiquid(Building source, Liquid liquid, float amount){ @@ -475,7 +558,15 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void dumpLiquid(Liquid liquid){ - int dump = this.dump; + dumpLiquid(liquid, 2f); + } + + public void dumpLiquid(Liquid liquid, float scaling){ + int dump = this.cdump; + + if(liquids.get(liquid) <= 0.0001f) return; + + if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock(); for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); @@ -486,10 +577,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, float ofract = other.liquids.get(liquid) / other.block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity; - if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / 2f, liquid); + if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid); } } - } public boolean canDumpLiquid(Building to, Liquid liquid){ @@ -497,23 +587,23 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void transferLiquid(Building next, float amount, Liquid liquid){ - float flow = Math.min(next.block.liquidCapacity - next.liquids.get(liquid) - 0.001f, amount); + float flow = Math.min(next.block.liquidCapacity - next.liquids.get(liquid), amount); - if(next.acceptLiquid(self(), liquid, flow)){ + if(next.acceptLiquid(self(), liquid)){ next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); } } - public float moveLiquidForward(float leakResistance, Liquid liquid){ - Tile next = tile.getNearby(rotation); + public float moveLiquidForward(boolean leaks, Liquid liquid){ + Tile next = tile.nearby(rotation); if(next == null) return 0; if(next.build != null){ return moveLiquid(next.build, liquid); - }else if(leakResistance != 100f && !next.block().solid && !next.block().hasLiquids){ - float leakAmount = liquids.get(liquid) / leakResistance; + }else if(leaks && !next.block().solid && !next.block().hasLiquids){ + float leakAmount = liquids.get(liquid) / 1.5f; Puddles.deposit(next, tile, liquid, leakAmount); liquids.remove(liquid, leakAmount); } @@ -528,10 +618,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(next.team == team && next.block.hasLiquids && liquids.get(liquid) > 0f){ float ofract = next.liquids.get(liquid) / next.block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity * block.liquidPressure; - float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids.get(liquid)); - flow = Math.min(flow, next.block.liquidCapacity - next.liquids.get(liquid) - 0.001f); + float flow = Math.min(Mathf.clamp((fract - ofract)) * (block.liquidCapacity), liquids.get(liquid)); + flow = Math.min(flow, next.block.liquidCapacity - next.liquids.get(liquid)); - if(flow > 0f && ofract <= fract && next.acceptLiquid(self(), liquid, flow)){ + if(flow > 0f && ofract <= fract && next.acceptLiquid(self(), liquid)){ next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); return flow; @@ -575,7 +665,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * containers, it gets added to the block's inventory. */ public void offload(Item item){ - int dump = this.dump; + produced(item, 1); + int dump = this.cdump; + if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) item.unlock(); for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); @@ -593,7 +685,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * Tries to put this item into a nearby container. Returns success. Unlike #offload(), this method does not change the block inventory. */ public boolean put(Item item){ - int dump = this.dump; + int dump = this.cdump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); @@ -607,19 +699,41 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return false; } - /** Try dumping any item near the */ + public void produced(Item item){ + produced(item, 1); + } + + public void produced(Item item, int amount){ + if(Vars.state.rules.sector != null && team == state.rules.defaultTeam) Vars.state.rules.sector.info.handleProduction(item, amount); + } + + /** Dumps any item with an accumulator. May dump multiple times per frame. Use with care. */ + public void dumpAccumulate(){ + dumpAccumulate(null); + } + + /** Dumps any item with an accumulator. May dump multiple times per frame. Use with care. */ + public void dumpAccumulate(Item item){ + dumpAccum += delta(); + while(dumpAccum >= 1f){ + dump(item); + dumpAccum -=1f; + } + } + + /** Try dumping any item near the building. */ public boolean dump(){ return dump(null); } /** - * Try dumping a specific item near the + * Try dumping a specific item near the building. * @param todump Item to dump. Can be null to dump anything. */ public boolean dump(Item todump){ if(!block.hasItems || items.total() == 0 || (todump != null && !items.has(todump))) return false; - int dump = this.dump; + int dump = this.cdump; if(proximity.size == 0) return false; @@ -654,7 +768,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void incrementDump(int prox){ - dump = (byte)((dump + 1) % prox); + cdump = (byte)((cdump + 1) % prox); } /** Used for dumping items. */ @@ -672,19 +786,27 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return false; } + /** Called shortly before this building is removed. */ public void onProximityRemoved(){ if(power != null){ powerGraphRemoved(); } } + /** Called after this building is created in the world. May be called multiple times, or when adjacent buildings change. */ public void onProximityAdded(){ - if(block.hasPower) updatePowerGraph(); + if(power != null){ + updatePowerGraph(); + } + } + + /** Called when anything adjacent to this building is placed/removed, including itself. */ + public void onProximityUpdate(){ + noSleep(); } public void updatePowerGraph(){ - - for(Building other : getPowerConnections(tempTileEnts)){ + for(Building other : getPowerConnections(tempBuilds)){ if(other.power != null){ other.power.graph.addGraph(power.graph); } @@ -692,9 +814,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void powerGraphRemoved(){ - if(power == null){ - return; - } + if(power == null) return; power.graph.remove(self()); for(int i = 0; i < power.links.size; i++){ @@ -705,6 +825,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } power.links.clear(); } + + public boolean conductsTo(Building other){ + return !block.insulated; + } public Seq getPowerConnections(Seq out){ out.clear(); @@ -712,15 +836,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(Building other : proximity){ if(other != null && other.power != null + && other.team == team && !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower) - && !power.links.contains(other.pos())){ + && conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){ out.add(other); } } for(int i = 0; i < power.links.size; i++){ Tile link = world.tile(power.links.get(i)); - if(link != null && link.build != null && link.build.power != null) out.add(link.build); + if(link != null && link.build != null && link.build.power != null && link.build.team == team) out.add(link.build); } return out; } @@ -739,28 +864,29 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } /** @return whether this block should play its idle sound.*/ - public boolean shouldIdleSound(){ + public boolean shouldAmbientSound(){ return shouldConsume(); } public void drawStatus(){ if(block.enableDrawStatus && block.consumes.any()){ - float brcx = tile.drawx() + (block.size * tilesize / 2f) - (tilesize / 2f); - float brcy = tile.drawy() - (block.size * tilesize / 2f) + (tilesize / 2f); + float multiplier = block.size > 1 ? 1 : 0.64f; + float brcx = x + (block.size * tilesize / 2f) - (tilesize * multiplier / 2f); + float brcy = y - (block.size * tilesize / 2f) + (tilesize * multiplier / 2f); Draw.z(Layer.power + 1); Draw.color(Pal.gray); - Fill.square(brcx, brcy, 2.5f, 45); - Draw.color(cons.status().color); - Fill.square(brcx, brcy, 1.5f, 45); + Fill.square(brcx, brcy, 2.5f * multiplier, 45); + Draw.color(status().color); + Fill.square(brcx, brcy, 1.5f * multiplier, 45); Draw.color(); } } public void drawCracks(){ - if(!damaged() || block.size > Block.maxCrackSize) return; + if(!damaged() || block.size > BlockRenderer.maxCrackSize) return; int id = pos(); - TextureRegion region = Block.cracks[block.size - 1][Mathf.clamp((int)((1f - healthf()) * Block.crackRegions), 0, Block.crackRegions-1)]; + TextureRegion region = renderer.blocks.cracks[block.size - 1][Mathf.clamp((int)((1f - healthf()) * BlockRenderer.crackRegions), 0, BlockRenderer.crackRegions-1)]; Draw.colorl(0.2f, 0.1f + (1f - healthf())* 0.6f); Draw.rect(region, x, y, (id%4)*90); Draw.color(); @@ -828,24 +954,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void placed(){ if(net.client()) return; - if((block.consumesPower && !block.outputsPower) || (!block.consumesPower && block.outputsPower)){ - int range = 10; - tempTiles.clear(); - Geometry.circle(tileX(), tileY(), range, (x, y) -> { - Building other = world.build(x, y); - if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, self()) && !PowerNode.insulated(other, self()) - && !other.proximity().contains(this.self()) && - !(block.outputsPower && proximity.contains(p -> p.power != null && p.power.graph == other.power.graph))){ - tempTiles.add(other.tile); + if((block.consumesPower || block.outputsPower) && block.hasPower){ + PowerNode.getNodeLinks(tile, block, team, other -> { + if(!other.power.links.contains(pos())){ + other.configureAny(pos()); } }); - tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); - if(!tempTiles.isEmpty()){ - Tile toLink = tempTiles.first(); - if(!toLink.build.power.links.contains(pos())){ - toLink.build.configureAny(pos()); - } - } } } @@ -872,8 +986,22 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //null is of type void.class; anonymous classes use their superclass. Class type = value == null ? void.class : value.getClass().isAnonymousClass() ? value.getClass().getSuperclass() : value.getClass(); + if(value instanceof Item) type = Item.class; + if(value instanceof Block) type = Block.class; + if(value instanceof Liquid) type = Liquid.class; + + if(builder != null && builder.isPlayer()){ + lastAccessed = builder.getPlayer().name; + } + if(block.configurations.containsKey(type)){ block.configurations.get(type).get(this, value); + }else if(value instanceof Building build){ + //copy config of another building + var conf = build.config(); + if(conf != null && !(conf instanceof Building)){ + configured(builder, conf); + } } } @@ -882,7 +1010,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } - /** Called when the block is destroyed. */ + /** Called *after* the tile has been removed. */ + public void afterDestroyed(){ + + } + + /** Called when the block is destroyed. The tile is still intact at this stage. */ public void onDestroyed(){ float explosiveness = block.baseExplosiveness; float flammability = 0f; @@ -893,12 +1026,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, int amount = items.get(item); explosiveness += item.explosiveness * amount; flammability += item.flammability * amount; + power += item.charge * amount * 100f; } } if(block.hasLiquids){ - flammability += liquids.sum((liquid, amount) -> liquid.explosiveness * amount / 2f); - explosiveness += liquids.sum((liquid, amount) -> liquid.flammability * amount / 2f); + flammability += liquids.sum((liquid, amount) -> liquid.flammability * amount / 2f); + explosiveness += liquids.sum((liquid, amount) -> liquid.explosiveness * amount / 2f); } if(block.consumes.hasPower() && block.consumes.getPower().buffered){ @@ -921,40 +1055,19 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, }); } - Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, Pal.darkFlame, state.rules.damageExplosions); + Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, state.rules.damageExplosions); if(!floor().solid && !floor().isLiquid){ Effect.rubble(x, y, block.size); } } - /** - * Returns the flammability of the Used for fire calculations. - * Takes flammability of floor liquid into account. - */ - public float getFlammability(){ - if(!block.hasItems){ - if(floor().isLiquid && !block.solid){ - return floor().liquidDrop.flammability; - } - return 0; - }else{ - float result = items.sum((item, amount) -> item.flammability * amount); - - if(block.hasLiquids){ - result += liquids.sum((liquid, amount) -> liquid.flammability * amount / 3f); - } - - return result; - } - } - public String getDisplayName(){ return block.localizedName; } public TextureRegion getDisplayIcon(){ - return block.icon(Cicon.medium); + return block.uiIcon; } @Override @@ -995,7 +1108,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, l.left(); for(Item item : content.items()){ if(items.hasFlowItem(item)){ - l.image(item.icon(Cicon.small)).padRight(3f); + l.image(item.uiIcon).padRight(3f); l.label(() -> items.getFlowRate(item) < 0 ? "..." : Strings.fixed(items.getFlowRate(item), 1) + ps).color(Color.lightGray); l.row(); } @@ -1022,7 +1135,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, Runnable rebuild = () -> { l.clearChildren(); l.left(); - l.image(() -> liquids.current().icon(Cicon.small)).padRight(3f); + l.image(() -> liquids.current().uiIcon).padRight(3f); l.label(() -> liquids.getFlowRate() < 0 ? "..." : Strings.fixed(liquids.getFlowRate(), 2) + ps).color(Color.lightGray); }; @@ -1036,6 +1149,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + if(net.active() && lastAccessed != null){ + table.row(); + table.add(Core.bundle.format("lastaccessed", lastAccessed)).growX().wrap().left(); + } + table.marginBottom(-5); } } @@ -1050,8 +1168,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void displayBars(Table table){ for(Func bar : block.bars.list()){ - table.add(bar.get(self())).growX(); - table.row(); + //TODO fix conclusively + try{ + table.add(bar.get(self())).growX(); + table.row(); + }catch(ClassCastException e){ + break; + } } } @@ -1068,7 +1191,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Returns whether or not a hand cursor should be shown over this block. */ public Cursor getCursor(){ - return block.configurable ? SystemCursor.hand : SystemCursor.arrow; + return block.configurable && interactable(player.team()) ? SystemCursor.hand : SystemCursor.arrow; } /** @@ -1100,7 +1223,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return false; } - public float handleDamage(float amount){ return amount; } @@ -1112,15 +1234,31 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Handle a bullet collision. * @return whether the bullet should be removed. */ public boolean collision(Bullet other){ - damage(other.damage() * other.type().tileDamageMultiplier); + damage(other.team, other.damage() * other.type().buildingDamageMultiplier); return true; } + /** Used to handle damage from splash damage for certain types of blocks. */ + public void damage(@Nullable Team source, float damage){ + damage(damage); + } + + /** Changes this building's team in a safe manner. */ + public void changeTeam(Team next){ + indexer.removeIndex(tile); + this.team = next; + indexer.addIndex(tile); + } + public boolean canPickup(){ return true; } + public void pickedUp(){ + + } + public void removeFromProximity(){ onProximityRemoved(); tmpTiles.clear(); @@ -1138,6 +1276,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, other.proximity.remove(self(), true); other.onProximityUpdate(); } + proximity.clear(); } public void updateProximity(){ @@ -1163,10 +1302,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, proximity.add(tile); } - for(Building other : tmpTiles){ - other.onProximityUpdate(); - } - onProximityAdded(); onProximityUpdate(); @@ -1179,6 +1314,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } + /** @return ambient sound volume scale. */ + public float ambientVolume(){ + return efficiency(); + } + //endregion //region overrides @@ -1194,6 +1334,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return tile.build == self() && !dead(); } + @Override + public float hitSize(){ + return tile.block().size * tilesize; + } + @Replace @Override public void kill(){ @@ -1221,24 +1366,31 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @Override public double sense(LAccess sensor){ return switch(sensor){ - case x -> x; - case y -> y; + case x -> World.conv(x); + case y -> World.conv(y); + case dead -> !isValid() ? 1 : 0; case team -> team.id; case health -> health; - case maxHealth -> maxHealth(); + case maxHealth -> maxHealth; case efficiency -> efficiency(); + case timescale -> timeScale; + case range -> this instanceof Ranged r ? r.range() / tilesize : 0; case rotation -> rotation; case totalItems -> items == null ? 0 : items.total(); case totalLiquids -> liquids == null ? 0 : liquids.total(); case totalPower -> power == null || !block.consumes.hasPower() ? 0 : power.status * (block.consumes.getPower().buffered ? block.consumes.getPower().capacity : 1f); - case itemCapacity -> block.itemCapacity; - case liquidCapacity -> block.liquidCapacity; + case itemCapacity -> block.hasItems ? block.itemCapacity : 0; + case liquidCapacity -> block.hasLiquids ? block.liquidCapacity : 0; case powerCapacity -> block.consumes.hasPower() ? block.consumes.getPower().capacity : 0f; case powerNetIn -> power == null ? 0 : power.graph.getLastScaledPowerIn() * 60; case powerNetOut -> power == null ? 0 : power.graph.getLastScaledPowerOut() * 60; case powerNetStored -> power == null ? 0 : power.graph.getLastPowerStored(); case powerNetCapacity -> power == null ? 0 : power.graph.getLastCapacity(); - default -> 0; + case enabled -> enabled ? 1 : 0; + case controlled -> this instanceof ControlBlock c && c.isControlled() ? GlobalConstants.ctrlPlayer : 0; + case payloadCount -> getPayload() != null ? 1 : 0; + case size -> block.size; + default -> Float.NaN; //gets converted to null in logic }; } @@ -1246,16 +1398,18 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public Object senseObject(LAccess sensor){ return switch(sensor){ case type -> block; + case firstItem -> items == null ? null : items.first(); + case config -> block.configurations.containsKey(Item.class) || block.configurations.containsKey(Liquid.class) ? config() : null; + case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null; default -> noSensed; }; - } @Override public double sense(Content content){ - if(content instanceof Item && items != null) return items.get((Item)content); - if(content instanceof Liquid && liquids != null) return liquids.get((Liquid)content); - return 0; + if(content instanceof Item i && items != null) return items.get(i); + if(content instanceof Liquid l && liquids != null) return liquids.get(l); + return Float.NaN; //invalid sense } @Override @@ -1266,6 +1420,15 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + @Override + public void control(LAccess type, Object p1, double p2, double p3, double p4){ + //don't execute configure instructions that copy logic building configures; this can cause extreme lag + if(type == LAccess.config && block.logicConfigurable && !(p1 instanceof LogicBuild)){ + //change config only if it's new + configured(null, p1); + } + } + @Override public void remove(){ if(sound != null){ @@ -1280,17 +1443,21 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, onDestroyed(); tile.remove(); remove(); + afterDestroyed(); } @Final @Override public void update(){ + if(state.isEditor()) return; + timeScaleDuration -= Time.delta; if(timeScaleDuration <= 0f || !block.canOverdrive){ timeScale = 1f; } - if(block.autoResetEnabled){ + if(!enabled && block.autoResetEnabled){ + noSleep(); enabledControlTime -= Time.delta; if(enabledControlTime <= 0){ @@ -1298,12 +1465,18 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } - if(sound != null){ - sound.update(x, y, shouldActiveSound()); + if(team == Team.derelict || !block.supportsEnv(state.rules.environment)){ + enabled = false; } - if(block.idleSound != Sounds.none && shouldIdleSound()){ - loops.play(block.idleSound, self(), block.idleSoundVolume); + if(!headless){ + if(sound != null){ + sound.update(x, y, shouldActiveSound()); + } + + if(block.ambientSound != Sounds.none && shouldAmbientSound()){ + control.sound.loop(block.ambientSound, self(), block.ambientSoundVolume * ambientVolume()); + } } if(enabled || !block.noUpdateDisabled){ diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index 5ef68ac2e1..f9fe116008 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -7,8 +7,10 @@ import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.core.*; import mindustry.entities.bullet.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -19,34 +21,25 @@ import static mindustry.Vars.*; abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Drawc, Shielderc, Ownerc, Velc, Bulletc, Timerc{ @Import Team team; @Import Entityc owner; - @Import float x,y; + @Import float x, y, damage; IntSeq collided = new IntSeq(6); Object data; BulletType type; - float damage; float fdata; + transient boolean absorbed, hit; + transient @Nullable Trail trail; @Override public void getCollisions(Cons consumer){ - if(team.active()){ - for(Team team : team.enemies()){ - consumer.get(teamIndex.tree(team)); - } - }else{ - for(Team other : Team.all){ - if(other != team && teamIndex.count(other) > 0){ - consumer.get(teamIndex.tree(other)); - } + Seq data = state.teams.present; + for(int i = 0; i < data.size; i++){ + if(data.items[i].team != team){ + consumer.get(data.items[i].tree()); } } } - @Override - public void drawBullets(){ - type.draw(self()); - } - @Override public void add(){ type.init(self()); @@ -54,13 +47,17 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Override public void remove(){ - type.despawned(self()); + //'despawned' only counts when the bullet is killed externally or reaches the end of life + if(!hit){ + type.despawned(self()); + } + type.removed(self()); collided.clear(); } @Override public float damageMultiplier(){ - if(owner instanceof Unit) return ((Unit)owner).damageMultiplier() * state.rules.unitDamageMultiplier; + if(owner instanceof Unit u) return u.damageMultiplier() * state.rules.unitDamageMultiplier; if(owner instanceof Building) return state.rules.blockDamageMultiplier; return 1f; @@ -68,6 +65,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Override public void absorb(){ + absorbed = true; remove(); } @@ -76,16 +74,11 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw return type.drawSize; } - @Override - public float damage(){ - return damage * damageMultiplier(); - } - @Replace @Override public boolean collides(Hitboxc other){ - return type.collides && (other instanceof Teamc && ((Teamc)other).team() != team) - && !(other instanceof Flyingc && !((Flyingc)other).checkTarget(type.collidesAir, type.collidesGround)) + return type.collides && (other instanceof Teamc t && t.team() != team) + && !(other instanceof Flyingc f && !f.checkTarget(type.collidesAir, type.collidesGround)) && !(type.pierce && collided.contains(other.id())); //prevent multiple collisions } @@ -93,28 +86,16 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Override public void collision(Hitboxc other, float x, float y){ type.hit(self(), x, y); - float health = 0f; - - if(other instanceof Healthc){ - Healthc h = (Healthc)other; - health = h.health(); - h.damage(damage); - } - - if(other instanceof Unit){ - Unit unit = (Unit)other; - unit.impulse(Tmp.v3.set(unit).sub(this.x, this.y).nor().scl(type.knockback * 80f)); - unit.apply(type.status, type.statusDuration); - } //must be last. if(!type.pierce){ + hit = true; remove(); }else{ collided.add(other.id()); } - type.hitEntity(self(), other, health); + type.hitEntity(self(), other, other instanceof Healthc h ? h.health() : 0f); } @Override @@ -122,12 +103,12 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw type.update(self()); if(type.collidesTiles && type.collides && type.collidesGround){ - world.raycastEach(world.toTile(lastX()), world.toTile(lastY()), tileX(), tileY(), (x, y) -> { + world.raycastEach(World.toTile(lastX()), World.toTile(lastY()), tileX(), tileY(), (x, y) -> { Building tile = world.build(x, y); if(tile == null || !isAdded()) return false; - if(tile.collide(self()) && type.collides(self(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team) && !(type.pierceBuilding && collided.contains(tile.id))){ + if(tile.collide(self()) && type.testCollision(self(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team) && !(type.pierceBuilding && collided.contains(tile.id))){ boolean remove = false; float health = tile.health; @@ -138,13 +119,14 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw if(remove || type.collidesTeam){ if(!type.pierceBuilding){ + hit = true; remove(); }else{ collided.add(tile.id); } } - type.hitTile(self(), tile, health); + type.hitTile(self(), tile, health, true); return !type.pierceBuilding; } @@ -152,11 +134,16 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw return false; }); } + + if(type.pierceCap != -1 && collided.size >= type.pierceCap){ + hit = true; + remove(); + } } @Override public void draw(){ - Draw.z(Layer.bullet); + Draw.z(type.layer); type.draw(self()); type.drawLight(self()); diff --git a/core/src/mindustry/entities/comp/ChildComp.java b/core/src/mindustry/entities/comp/ChildComp.java index be8fafb0aa..dae0c98814 100644 --- a/core/src/mindustry/entities/comp/ChildComp.java +++ b/core/src/mindustry/entities/comp/ChildComp.java @@ -1,6 +1,6 @@ package mindustry.entities.comp; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; diff --git a/core/src/mindustry/entities/comp/CommanderComp.java b/core/src/mindustry/entities/comp/CommanderComp.java index 99bca89cf9..4e10af62e1 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -3,47 +3,53 @@ package mindustry.entities.comp; import arc.func.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.*; import mindustry.ai.formations.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.game.*; import mindustry.gen.*; +import mindustry.type.*; /** A unit that can command other units. */ @Component -abstract class CommanderComp implements Unitc{ +abstract class CommanderComp implements Entityc, Posc{ private static final Seq members = new Seq<>(); private static final Seq units = new Seq<>(); - @Import float x, y, rotation; + @Import float x, y, rotation, hitSize; + @Import Team team; + @Import UnitType type; transient @Nullable Formation formation; - transient Seq controlling = new Seq<>(); + transient Seq controlling = new Seq<>(10); /** minimum speed of any unit in the formation. */ transient float minFormationSpeed; - @Override public void update(){ + if(controlling.isEmpty() && !Vars.net.client()){ + formation = null; + } + if(formation != null){ - formation.anchor.set(x, y, /*rotation*/ 0); //TODO rotation set to 0 because rotating is pointless + formation.anchor.set(x, y, 0); formation.updateSlots(); + controlling.removeAll(u -> u.dead || !(u.controller() instanceof FormationAI ai && ai.leader == self())); } } - @Override public void remove(){ clearCommand(); } - @Override public void killed(){ clearCommand(); } //make sure to reset command state when the controller is switched - @Override public void controller(UnitController next){ clearCommand(); } @@ -58,30 +64,34 @@ abstract class CommanderComp implements Unitc{ units.clear(); - Units.nearby(team(), x, y, 200f, u -> { - if(u.isAI() && include.get(u) && u != self()){ + Units.nearby(team, x, y, type.commandRadius, u -> { + if(u.isAI() && include.get(u) && u != self() && u.type.flying == type.flying && u.hitSize <= hitSize * 1.1f){ units.add(u); } }); - units.sort(u -> u.dst2(this)); - units.truncate(type().commandLimit); + if(units.isEmpty()) return; + + //sort by hitbox size, then by distance + units.sort(Structs.comps(Structs.comparingFloat(u -> -u.hitSize), Structs.comparingFloat(u -> u.dst2(this)))); + units.truncate(type.commandLimit); command(formation, units); } void command(Formation formation, Seq units){ clearCommand(); + units.shuffle(); - float spacing = hitSize() * 0.65f; - minFormationSpeed = type().speed; + float spacing = hitSize * 0.9f; + minFormationSpeed = type.speed; controlling.addAll(units); for(Unit unit : units){ FormationAI ai; unit.controller(ai = new FormationAI(self(), formation)); spacing = Math.max(spacing, ai.formationSize()); - minFormationSpeed = Math.min(minFormationSpeed, unit.type().speed); + minFormationSpeed = Math.min(minFormationSpeed, unit.type.speed); } this.formation = formation; @@ -105,7 +115,7 @@ abstract class CommanderComp implements Unitc{ //reset controlled units for(Unit unit : controlling){ if(unit.controller().isBeingControlled(self())){ - unit.controller(unit.type().createController()); + unit.controller(unit.type.createController()); } } diff --git a/core/src/mindustry/entities/comp/DamageComp.java b/core/src/mindustry/entities/comp/DamageComp.java index e46a7ec87c..d9b6105352 100644 --- a/core/src/mindustry/entities/comp/DamageComp.java +++ b/core/src/mindustry/entities/comp/DamageComp.java @@ -4,5 +4,5 @@ import mindustry.annotations.Annotations.*; @Component abstract class DamageComp{ - abstract float damage(); + float damage; } diff --git a/core/src/mindustry/entities/comp/EffectStateComp.java b/core/src/mindustry/entities/comp/EffectStateComp.java index 776a696049..7238ea0728 100644 --- a/core/src/mindustry/entities/comp/EffectStateComp.java +++ b/core/src/mindustry/entities/comp/EffectStateComp.java @@ -22,6 +22,6 @@ abstract class EffectStateComp implements Posc, Drawc, Timedc, Rotc, Childc{ @Replace public float clipSize(){ - return effect.size; + return effect.clip; } } diff --git a/core/src/mindustry/entities/comp/EntityComp.java b/core/src/mindustry/entities/comp/EntityComp.java index 2b20e908b2..d44e5481b4 100644 --- a/core/src/mindustry/entities/comp/EntityComp.java +++ b/core/src/mindustry/entities/comp/EntityComp.java @@ -6,7 +6,7 @@ import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.gen.*; -import static mindustry.Vars.player; +import static mindustry.Vars.*; @Component @BaseComponent @@ -29,17 +29,18 @@ abstract class EntityComp{ } boolean isLocal(){ - return ((Object)this) == player || ((Object)this) instanceof Unitc && ((Unitc)((Object)this)).controller() == player; + return ((Object)this) == player || ((Object)this) instanceof Unitc u && u.controller() == player; } boolean isRemote(){ - return ((Object)this) instanceof Unitc && ((Unitc)((Object)this)).isPlayer() && !isLocal(); + return ((Object)this) instanceof Unitc u && u.isPlayer() && !isLocal(); } boolean isNull(){ return false; } + /** Replaced with `this` after code generation. */ T self(){ return (T)this; } @@ -48,11 +49,6 @@ abstract class EntityComp{ return (T)this; } - T with(Cons cons){ - cons.get((T)this); - return (T)this; - } - @InternalImpl abstract int classId(); diff --git a/core/src/mindustry/entities/comp/FireComp.java b/core/src/mindustry/entities/comp/FireComp.java index ea67ca9e19..7439af97c9 100644 --- a/core/src/mindustry/entities/comp/FireComp.java +++ b/core/src/mindustry/entities/comp/FireComp.java @@ -1,5 +1,7 @@ package mindustry.entities.comp; +import arc.*; +import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.util.*; @@ -9,42 +11,52 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.world.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @EntityDef(value = {Firec.class}, pooled = true) @Component(base = true) -abstract class FireComp implements Timedc, Posc, Firec, Syncc{ - private static final float spreadChance = 0.05f, fireballChance = 0.07f; +abstract class FireComp implements Timedc, Posc, Syncc, Drawc{ + public static final int frames = 40, duration = 90; + + private static final float spreadDelay = 22f, fireballDelay = 40f, + ticksPerFrame = (float)duration / frames, warmupDuration = 20f, damageDelay = 40f, tileDamage = 1.8f, unitDamage = 3f; + + public static final TextureRegion[] regions = new TextureRegion[frames]; @Import float time, lifetime, x, y; Tile tile; private transient Block block; - private transient float baseFlammability = -1, puddleFlammability; + private transient float + baseFlammability = -1, puddleFlammability, damageTimer = Mathf.random(40f), + spreadTimer = Mathf.random(spreadDelay), fireballTimer = Mathf.random(fireballDelay), + warmup = 0f, + animation = Mathf.random(frames); @Override public void update(){ - if(Mathf.chance(0.1 * Time.delta)){ - Fx.fire.at(x + Mathf.range(4f), y + Mathf.range(4f)); + + animation += Time.delta / ticksPerFrame; + warmup += Time.delta; + animation %= frames; + + if(!headless){ + control.sound.loop(Sounds.fire, this, 0.07f); } - if(Mathf.chance(0.05 * Time.delta)){ - Fx.fireSmoke.at(x + Mathf.range(4f), y + Mathf.range(4f)); - } - - if(Mathf.chance(0.001 * Time.delta)){ - Sounds.fire.at(this); - } - - time = Mathf.clamp(time + Time.delta, 0, lifetime()); + //faster updates -> disappears more quickly + float speedMultiplier = 1f + Math.max(state.envAttrs.get(Attribute.water) * 10f, 0); + time = Mathf.clamp(time + Time.delta * speedMultiplier, 0, lifetime); if(Vars.net.client()){ return; } - if(time >= lifetime() || tile == null){ + if(time >= lifetime || tile == null){ remove(); return; } @@ -52,46 +64,71 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{ Building entity = tile.build; boolean damage = entity != null; + if(baseFlammability < 0 || block != tile.block()){ + baseFlammability = tile.getFlammability(); + block = tile.block(); + } + float flammability = baseFlammability + puddleFlammability; if(!damage && flammability <= 0){ time += Time.delta * 8; } - if(baseFlammability < 0 || block != tile.block()){ - baseFlammability = tile.build == null ? 0 : tile.build.getFlammability(); - block = tile.block(); - } - if(damage){ lifetime += Mathf.clamp(flammability / 8f, 0f, 0.6f) * Time.delta; } - if(flammability > 1f && Mathf.chance(spreadChance * Time.delta * Mathf.clamp(flammability / 5f, 0.3f, 2f))){ + if(flammability > 1f && (spreadTimer += Time.delta * Mathf.clamp(flammability / 5f, 0.3f, 2f)) >= spreadDelay){ + spreadTimer = 0f; Point2 p = Geometry.d4[Mathf.random(3)]; Tile other = world.tile(tile.x + p.x, tile.y + p.y); Fires.create(other); - - if(Mathf.chance(fireballChance * Time.delta * Mathf.clamp(flammability / 10f))){ - Bullets.fireball.createNet(Team.derelict, x, y, Mathf.random(360f), -1f, 1, 1); - } } - if(Mathf.chance(0.1 * Time.delta)){ + if(flammability > 0 && (fireballTimer += Time.delta * Mathf.clamp(flammability / 10f, 0f, 0.5f)) >= fireballDelay){ + fireballTimer = 0f; + Bullets.fireball.createNet(Team.derelict, x, y, Mathf.random(360f), -1f, 1, 1); + } + + //apply damage to nearby units & building + if((damageTimer += Time.delta) >= damageDelay){ + damageTimer = 0f; Puddlec p = Puddles.get(tile); puddleFlammability = p != null ? p.getFlammability() / 3f : 0; if(damage){ - entity.damage(0.4f); + entity.damage(tileDamage); } - Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f, + Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, unitDamage, unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning), unit -> unit.apply(StatusEffects.burning, 60 * 5)); } } + @Override + public void draw(){ + if(regions[0] == null){ + for(int i = 0; i < frames; i++){ + regions[i] = Core.atlas.find("fire" + i); + } + } + + Draw.alpha(Mathf.clamp(warmup / warmupDuration)); + Draw.z(Layer.effect); + Draw.rect(regions[(int)animation], x, y); + Draw.reset(); + } + + @Replace + @Override + public float clipSize(){ + return 25; + } + @Override public void remove(){ + Fx.fireRemove.at(x, y, animation); Fires.remove(tile); } diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index 83c16d3525..94db2f6a63 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -10,7 +10,7 @@ import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.net; +import static mindustry.Vars.*; @Component abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ @@ -46,13 +46,13 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ } void wobble(){ - x += Mathf.sin(Time.time() + id() * 99, 25f, 0.05f) * Time.delta * elevation; - y += Mathf.cos(Time.time() + id() * 99, 25f, 0.05f) * Time.delta * elevation; + x += Mathf.sin(Time.time + (id() % 10) * 12, 25f, 0.05f) * Time.delta * elevation; + y += Mathf.cos(Time.time + (id() % 10) * 12, 25f, 0.05f) * Time.delta * elevation; } void moveAt(Vec2 vector, float acceleration){ - Vec2 t = tmp1.set(vector).scl(floorSpeedMultiplier()); //target vector - tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta); //delta vector + Vec2 t = tmp1.set(vector); //target vector + tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta * floorSpeedMultiplier()); //delta vector vel.add(tmp2); } @@ -68,22 +68,26 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ if(isFlying() != wasFlying){ if(wasFlying){ if(tileOn() != null){ - Fx.unitLand.at(x, y, floorOn().isLiquid ? 1f : 0.5f, floorOn().mapColor); + Fx.unitLand.at(x, y, floorOn().isLiquid ? 1f : 0.5f, tileOn().floor().mapColor); } } wasFlying = isFlying(); } - if(!hovering && isGrounded() && floor.isLiquid){ + if(!hovering && isGrounded()){ if((splashTimer += Mathf.dst(deltaX(), deltaY())) >= (7f + hitSize()/8f)){ floor.walkEffect.at(x, y, hitSize() / 8f, floor.mapColor); splashTimer = 0f; + + if(!(this instanceof WaterMovec)){ + floor.walkSound.at(x, y, Mathf.random(floor.walkSoundPitchMin, floor.walkSoundPitchMax), floor.walkSoundVolume); + } } } if(canDrown() && floor.isLiquid && floor.drownTime > 0){ - drownTime += Time.delta * 1f / floor.drownTime; + drownTime += Time.delta / floor.drownTime; drownTime = Mathf.clamp(drownTime); if(Mathf.chanceDelta(0.05f)){ floor.drownUpdateEffect.at(x, y, 1f, floor.mapColor); diff --git a/core/src/mindustry/entities/comp/HealthComp.java b/core/src/mindustry/entities/comp/HealthComp.java index ca65ea8115..85d0a37105 100644 --- a/core/src/mindustry/entities/comp/HealthComp.java +++ b/core/src/mindustry/entities/comp/HealthComp.java @@ -51,11 +51,7 @@ abstract class HealthComp implements Entityc, Posc{ /** Damage and pierce armor. */ void damagePierce(float amount, boolean withEffect){ - if(this instanceof Shieldc){ - damage(amount + ((Shieldc)this).armor(), withEffect); - }else{ - damage(amount, withEffect); - } + damage(amount, withEffect); } /** Damage and pierce armor. */ diff --git a/core/src/mindustry/entities/comp/HitboxComp.java b/core/src/mindustry/entities/comp/HitboxComp.java index 9473dfbca3..6fdab58a3e 100644 --- a/core/src/mindustry/entities/comp/HitboxComp.java +++ b/core/src/mindustry/entities/comp/HitboxComp.java @@ -2,13 +2,14 @@ package mindustry.entities.comp; import arc.func.*; import arc.math.*; -import arc.math.geom.QuadTree.*; import arc.math.geom.*; +import arc.math.geom.QuadTree.*; import mindustry.annotations.Annotations.*; +import mindustry.entities.*; import mindustry.gen.*; @Component -abstract class HitboxComp implements Posc, QuadTreeObject{ +abstract class HitboxComp implements Posc, Sized, QuadTreeObject{ @Import float x, y; transient float lastX, lastY, deltaX, deltaY, hitSize; @@ -28,6 +29,11 @@ abstract class HitboxComp implements Posc, QuadTreeObject{ updateLastPosition(); } + @Override + public float hitSize(){ + return hitSize; + } + void getCollisions(Cons consumer){ } diff --git a/core/src/mindustry/entities/comp/LaunchCoreComp.java b/core/src/mindustry/entities/comp/LaunchCoreComp.java index 7283a9e220..e91e3749fc 100644 --- a/core/src/mindustry/entities/comp/LaunchCoreComp.java +++ b/core/src/mindustry/entities/comp/LaunchCoreComp.java @@ -43,7 +43,7 @@ abstract class LaunchCoreComp implements Drawc, Timedc{ Draw.z(Layer.weather - 1); - TextureRegion region = block.icon(Cicon.full); + TextureRegion region = block.fullIcon; float rw = region.width * Draw.scl * scale, rh = region.height * Draw.scl * scale; Draw.alpha(alpha); @@ -73,4 +73,4 @@ abstract class LaunchCoreComp implements Drawc, Timedc{ Fx.rocketSmokeLarge.at(cx() + Mathf.range(r), cy() + Mathf.range(r), fin()); } } -} \ No newline at end of file +} diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index e6022ed91e..8ddb4793e4 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -112,6 +112,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ Floor floor = Vars.world.floorWorld(l.base.x, l.base.y); if(floor.isLiquid){ floor.walkEffect.at(l.base.x, l.base.y, type.rippleScale, floor.mapColor); + floor.walkSound.at(x, y, 1f, floor.walkSoundVolume); }else{ Fx.unitLandSmall.at(l.base.x, l.base.y, type.rippleScale, floor.mapColor); } diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index 94bb380c96..e8ed72974d 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -39,7 +39,7 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati float lastExtend = walkExtension; - if(extendScl < lastExtend && base % 2f > 1f){ + if(extendScl < lastExtend && base % 2f > 1f && !isFlying()){ int side = -Mathf.sign(extend); float width = hitSize / 2f * side, length = type.mechStride * 1.35f; @@ -78,8 +78,16 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati @Override public void moveAt(Vec2 vector, float acceleration){ + //mark walking state when moving in a controlled manner if(!vector.isZero()){ - //mark walking state when moving in a controlled manner + walked = true; + } + } + + @Override + public void approach(Vec2 vector){ + //mark walking state when moving in a controlled manner + if(!vector.isZero(0.001f)){ walked = true; } } diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index 7049617b73..11f9b1af47 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -5,7 +5,6 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.gen.*; @@ -17,8 +16,8 @@ import mindustry.world.*; import static mindustry.Vars.*; @Component -abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ - @Import float x, y, rotation; +abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{ + @Import float x, y, rotation, hitSize; @Import UnitType type; transient float mineTimer; @@ -29,11 +28,24 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } public boolean offloadImmediately(){ - return isPlayer(); + return this.self().isPlayer(); } boolean mining(){ - return mineTile != null && !(((Object)this) instanceof Builderc && ((Builderc)(Object)this).activelyBuilding()); + return mineTile != null && !this.self().activelyBuilding(); + } + + public boolean validMine(Tile tile, boolean checkDst){ + return !(tile == null || tile.block() != Blocks.air || (!within(tile.worldx(), tile.worldy(), type.miningRange) && checkDst) + || tile.drop() == null || !canMine(tile.drop())); + } + + public boolean validMine(Tile tile){ + return validMine(tile, true); + } + + public boolean canMine(){ + return type.mineSpeed > 0 && type.mineTier >= 0; } @Override @@ -43,31 +55,33 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ if(core != null && mineTile != null && mineTile.drop() != null && !acceptsItem(mineTile.drop()) && within(core, mineTransferRange) && !offloadImmediately()){ int accepted = core.acceptStack(item(), stack().amount, this); if(accepted > 0){ - Call.transferItemTo(item(), accepted, + Call.transferItemTo(self(), item(), accepted, mineTile.worldx() + Mathf.range(tilesize / 2f), mineTile.worldy() + Mathf.range(tilesize / 2f), core); clearItem(); } } - if(mineTile == null || core == null || mineTile.block() != Blocks.air || dst(mineTile.worldx(), mineTile.worldy()) > miningRange - || mineTile.drop() == null || !canMine(mineTile.drop())){ + if((!net.client() || isLocal()) && !validMine(mineTile)){ mineTile = null; mineTimer = 0f; }else if(mining()){ Item item = mineTile.drop(); - lookAt(angleTo(mineTile.worldx(), mineTile.worldy())); mineTimer += Time.delta *type.mineSpeed; if(Mathf.chance(0.06 * Time.delta)){ Fx.pulverizeSmall.at(mineTile.worldx() + Mathf.range(tilesize / 2f), mineTile.worldy() + Mathf.range(tilesize / 2f), 0f, item.color); } - if(mineTimer >= 50f + item.hardness*10f){ + if(mineTimer >= 50f + item.hardness*15f){ mineTimer = 0; - if(within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){ - Call.transferItemTo(item, 1, + if(state.rules.sector != null && team() == state.rules.defaultTeam) state.rules.sector.info.handleProduction(item, 1); + + if(core != null && within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){ + //add item to inventory before it is transferred + if(item() == item && !net.client()) addItem(item); + Call.transferItemTo(self(), item, 1, mineTile.worldx() + Mathf.range(tilesize / 2f), mineTile.worldy() + Mathf.range(tilesize / 2f), core); }else if(acceptsItem(item)){ @@ -82,33 +96,34 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } } - + if(!headless){ + control.sound.loop(type.mineSound, this, type.mineSoundVolume); + } } } @Override public void draw(){ if(!mining()) return; - float focusLen = 4f + Mathf.absin(Time.time(), 1.1f, 0.5f); + float focusLen = hitSize / 2f + Mathf.absin(Time.time, 1.1f, 0.5f); float swingScl = 12f, swingMag = tilesize / 8f; float flashScl = 0.3f; float px = x + Angles.trnsx(rotation, focusLen); float py = y + Angles.trnsy(rotation, focusLen); - float ex = mineTile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag); - float ey = mineTile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag); + float ex = mineTile.worldx() + Mathf.sin(Time.time + 48, swingScl, swingMag); + float ey = mineTile.worldy() + Mathf.sin(Time.time + 48, swingScl + 2f, swingMag); Draw.z(Layer.flyingUnit + 0.1f); - Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl)); + Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time, 0.5f, flashScl)); Drawf.laser(team(), Core.atlas.find("minelaser"), Core.atlas.find("minelaser-end"), px, py, ex, ey, 0.75f); - //TODO hack? if(isLocal()){ Lines.stroke(1f, Pal.accent); - Lines.poly(mineTile.worldx(), mineTile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time()); + Lines.poly(mineTile.worldx(), mineTile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time); } Draw.color(); diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index 75bc07c21e..0f02434a92 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -1,14 +1,19 @@ package mindustry.entities.comp; +import arc.*; import arc.math.*; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.entities.*; +import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.payloads.*; @@ -25,11 +30,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ } boolean canPickup(Unit unit){ - return payloadUsed() + unit.hitSize * unit.hitSize <= type.payloadCapacity + 0.001f; + return payloadUsed() + unit.hitSize * unit.hitSize <= type.payloadCapacity + 0.001f && unit.team == team() && unit.isAI(); } boolean canPickup(Building build){ - return payloadUsed() + build.block.size * build.block.size * Vars.tilesize * Vars.tilesize <= type.payloadCapacity + 0.001f; + return payloadUsed() + build.block.size * build.block.size * Vars.tilesize * Vars.tilesize <= type.payloadCapacity + 0.001f && build.canPickup(); } boolean canPickupPayload(Payload pay){ @@ -51,12 +56,15 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ if(Vars.net.client()){ Vars.netClient.clearRemovedEntity(unit.id); } + Events.fire(new PickupEvent(self(), unit)); } void pickup(Building tile){ + tile.pickedUp(); tile.tile.remove(); - payloads.add(new BlockPayload(tile)); + payloads.add(new BuildPayload(tile)); Fx.unitPickup.at(tile); + Events.fire(new PickupEvent(self(), tile)); } boolean dropLastPayload(){ @@ -75,8 +83,8 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ Tile on = tileOn(); //clear removed state of unit so it can be synced - if(Vars.net.client() && payload instanceof UnitPayload){ - Vars.netClient.clearRemovedEntity(((UnitPayload)payload).unit.id); + if(Vars.net.client() && payload instanceof UnitPayload u){ + Vars.netClient.clearRemovedEntity(u.unit.id); } //drop off payload on an acceptor if possible @@ -86,10 +94,10 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ return true; } - if(payload instanceof BlockPayload){ - return dropBlock((BlockPayload)payload); - }else if(payload instanceof UnitPayload){ - return dropUnit((UnitPayload)payload); + if(payload instanceof BuildPayload b){ + return dropBlock(b); + }else if(payload instanceof UnitPayload p){ + return dropUnit(p); } return false; } @@ -98,7 +106,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ Unit u = payload.unit; //can't drop ground units - if(!u.canPass(tileX(), tileY())){ + if(!u.canPass(tileX(), tileY()) || Units.count(x, y, u.physicSize(), o -> o.isGrounded()) > 1){ return false; } @@ -112,20 +120,26 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ u.rotation(rotation); //reset the ID to a new value to make sure it's synced u.id = EntityGroup.nextId(); + //decrement count to prevent double increment + if(!u.isAdded()) u.team.data().updateCount(u.type, -1); u.add(); return true; } /** @return whether the tile has been successfully placed. */ - boolean dropBlock(BlockPayload payload){ - Building tile = payload.entity; - int tx = Vars.world.toTile(x - tile.block.offset), ty = Vars.world.toTile(y - tile.block.offset); + boolean dropBlock(BuildPayload payload){ + Building tile = payload.build; + int tx = World.toTile(x - tile.block.offset), ty = World.toTile(y - tile.block.offset); Tile on = Vars.world.tile(tx, ty); if(on != null && Build.validPlace(tile.block, tile.team, tx, ty, tile.rotation, false)){ int rot = (int)((rotation + 45f) / 90f) % 4; payload.place(on, rot); + if(getControllerName() != null){ + payload.build.lastAccessed = getControllerName(); + } + Fx.unitDrop.at(tile); Fx.placeBlock.at(on.drawx(), on.drawy(), on.block().size); return true; @@ -133,4 +147,19 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ return false; } + + void contentInfo(Table table, float itemSize, float width){ + table.clear(); + table.top().left(); + + float pad = 0; + float items = payloads.size; + if(itemSize * items + pad * items > width){ + pad = (width - (itemSize) * items) / items; + } + + for(Payload p : payloads){ + table.image(p.icon()).size(itemSize).padRight(pad); + } + } } diff --git a/core/src/mindustry/entities/comp/PhysicsComp.java b/core/src/mindustry/entities/comp/PhysicsComp.java index 12972935ee..1924de8eb9 100644 --- a/core/src/mindustry/entities/comp/PhysicsComp.java +++ b/core/src/mindustry/entities/comp/PhysicsComp.java @@ -11,7 +11,7 @@ import mindustry.gen.*; * Has mass.*/ @Component abstract class PhysicsComp implements Velc, Hitboxc, Flyingc{ - @Import float hitSize; + @Import float hitSize, x, y; @Import Vec2 vel; transient PhysicRef physref; @@ -29,4 +29,15 @@ abstract class PhysicsComp implements Velc, Hitboxc, Flyingc{ void impulse(Vec2 v){ impulse(v.x, v.y); } + + void impulseNet(Vec2 v){ + impulse(v.x, v.y); + + //manually move units to simulate velocity for remote players + if(isRemote()){ + float mass = mass(); + move(v.x / mass, v.y / mass); + } + + } } diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index dc99d75fb9..0323906021 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -6,7 +6,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -20,7 +19,6 @@ import mindustry.net.Administration.*; import mindustry.net.*; import mindustry.net.Packets.*; import mindustry.ui.*; -import mindustry.world.*; import mindustry.world.blocks.storage.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -29,44 +27,48 @@ import static mindustry.Vars.*; @EntityDef(value = {Playerc.class}, serialize = false) @Component(base = true) abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Drawc{ - static final float deathDelay = 30f; + static final float deathDelay = 60f; @Import float x, y; @ReadOnly Unit unit = Nulls.unit; - transient private Unit lastReadUnit = Nulls.unit; transient @Nullable NetConnection con; - @ReadOnly Team team = Team.sharded; @SyncLocal boolean typing, shooting, boosting; - boolean admin; @SyncLocal float mouseX, mouseY; - String name = "noname"; + boolean admin; + String name = "frog"; Color color = new Color(); - + //locale should not be synced. + transient String locale = "en"; transient float deathTimer; transient String lastText = ""; transient float textFadeTime; + transient private Unit lastReadUnit = Nulls.unit; public boolean isBuilder(){ - return unit instanceof Builderc; + return unit.canBuild(); } - public boolean isMiner(){ - return unit instanceof Minerc; - } - - public @Nullable CoreBuild closestCore(){ + public @Nullable + CoreBuild closestCore(){ return state.teams.closestCore(x, y, team); } - public @Nullable CoreBuild core(){ + public @Nullable + CoreBuild core(){ return team.core(); } + /** @return largest/closest core, with largest cores getting priority */ + @Nullable + public CoreBuild bestCore(){ + return team.cores().min(Structs.comps(Structs.comparingInt(c -> -c.block.size), Structs.comparingFloat(c -> c.dst(x, y)))); + } + public TextureRegion icon(){ //display default icon for dead players - if(dead()) return core() == null ? UnitTypes.alpha.icon(Cicon.full) : ((CoreBlock)core().block).unitType.icon(Cicon.full); + if(dead()) return core() == null ? UnitTypes.alpha.fullIcon : ((CoreBlock)core().block).unitType.fullIcon; return unit.icon(); } @@ -79,8 +81,9 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra team = state.rules.defaultTeam; admin = typing = false; textFadeTime = 0f; + x = y = 0f; if(!dead()){ - unit.controller(unit.type().createController()); + unit.controller(unit.type.createController()); unit = Nulls.unit; } } @@ -92,7 +95,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Replace public float clipSize(){ - return unit.isNull() ? 20 : unit.type().hitSize * 2f; + return unit.isNull() ? 20 : unit.type.hitSize * 2f; } @Override @@ -106,8 +109,12 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra unit.aim(mouseX, mouseY); //this is only necessary when the thing being controlled isn't synced unit.controlWeapons(shooting, shooting); + //save previous formation to prevent reset + var formation = unit.formation; //extra precaution, necessary for non-synced things unit.controller(this); + //keep previous formation + unit.formation = formation; } @Override @@ -116,7 +123,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra clearUnit(); } - CoreBuild core = closestCore(); + CoreBuild core; if(!dead()){ set(unit); @@ -124,13 +131,12 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra deathTimer = 0; //update some basic state to sync things - if(unit.type().canBoost){ - Tile tile = unit.tileOn(); - unit.elevation = Mathf.approachDelta(unit.elevation, (tile != null && tile.solid()) || boosting ? 1f : 0f, 0.08f); + if(unit.type.canBoost){ + unit.elevation = Mathf.approachDelta(unit.elevation, unit.onSolid() || boosting || (unit.isFlying() && !unit.canLand()) ? 1f : 0f, unit.type.riseSpeed); } - }else if(core != null){ + }else if((core = bestCore()) != null){ //have a small delay before death to prevent the camera from jumping around too quickly - //(this is not for balance) + //(this is not for balance, it just looks better this way) deathTimer += Time.delta; if(deathTimer >= deathDelay){ //request spawn - this happens serverside only @@ -164,21 +170,13 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return unit; } - public Minerc miner(){ - return !(unit instanceof Minerc) ? Nulls.miner : (Minerc)unit; - } - - public Builderc builder(){ - return !(unit instanceof Builderc) ? Nulls.builder : (Builderc)unit; - } - public void unit(Unit unit){ if(unit == null) throw new IllegalArgumentException("Unit cannot be null. Use clearUnit() instead."); if(this.unit == unit) return; if(this.unit != Nulls.unit){ //un-control the old unit - this.unit.controller(this.unit.type().createController()); + this.unit.controller(this.unit.type.createController()); } this.unit = unit; if(unit != Nulls.unit){ @@ -189,6 +187,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra if(unit.isRemote()){ unit.snapInterpolation(); } + + //reset selected block when switching units + if(!headless && isLocal()){ + control.input.block = null; + } } Events.fire(new UnitChangeEvent(self(), unit)); @@ -198,6 +201,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return unit.isNull() || !unit.isValid(); } + String ip(){ + return con == null ? "localhost" : con.address; + } + String uuid(){ return con == null ? "[LOCAL]" : con.uuid; } @@ -214,7 +221,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra con.kick(reason); } - void kick(String reason, int duration){ + void kick(String reason, long duration){ con.kick(reason, duration); } @@ -250,16 +257,16 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra } if(Core.settings.getBool("playerchat") && ((textFadeTime > 0 && lastText != null) || typing)){ - String text = textFadeTime <= 0 || lastText == null ? "[lightgray]" + Strings.animated(Time.time(), 4, 15f, ".") : lastText; + String text = textFadeTime <= 0 || lastText == null ? "[lightgray]" + Strings.animated(Time.time, 4, 15f, ".") : lastText; float width = 100f; float visualFadeTime = 1f - Mathf.curve(1f - textFadeTime, 0.9f); font.setColor(1f, 1f, 1f, textFadeTime <= 0 || lastText == null ? 1f : visualFadeTime); layout.setText(font, text, Color.white, width, Align.bottom, true); - Draw.color(0f, 0f, 0f, 0.3f * (textFadeTime <= 0 || lastText == null ? 1f : visualFadeTime)); - Fill.rect(unit.x, unit.y + textHeight + layout.height - layout.height/2f, layout.width + 2, layout.height + 3); - font.draw(text, unit.x - width/2f, unit.y + textHeight + layout.height, width, Align.center, true); + Draw.color(0f, 0f, 0f, 0.3f * (textFadeTime <= 0 || lastText == null ? 1f : visualFadeTime)); + Fill.rect(unit.x, unit.y + textHeight + layout.height - layout.height / 2f, layout.width + 2, layout.height + 3); + font.draw(text, unit.x - width / 2f, unit.y + textHeight + layout.height, width, Align.center, true); } Draw.reset(); @@ -285,7 +292,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra sendMessage(text, from, NetClient.colorizeName(from.id(), from.name)); } - void sendMessage(String text, Player from, String fromName){ + void sendMessage(String text, Player from, String fromName){ if(isLocal()){ if(ui != null){ ui.chatfrag.addMessage(text, fromName); diff --git a/core/src/mindustry/entities/comp/PosComp.java b/core/src/mindustry/entities/comp/PosComp.java index d43d097bac..6446c0f91f 100644 --- a/core/src/mindustry/entities/comp/PosComp.java +++ b/core/src/mindustry/entities/comp/PosComp.java @@ -1,14 +1,14 @@ package mindustry.entities.comp; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; -import mindustry.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; @Component abstract class PosComp implements Position{ @@ -32,11 +32,11 @@ abstract class PosComp implements Position{ } int tileX(){ - return Vars.world.toTile(x); + return World.toTile(x); } int tileY(){ - return Vars.world.toTile(y); + return World.toTile(y); } /** Returns air if this unit is on a non-air top block. */ @@ -52,10 +52,11 @@ abstract class PosComp implements Position{ boolean onSolid(){ Tile tile = tileOn(); - return tile != null && tile.solid(); + return tile == null || tile.solid(); } - @Nullable Tile tileOn(){ + @Nullable + Tile tileOn(){ return world.tileWorld(x, y); } diff --git a/core/src/mindustry/entities/comp/PosTeamDef.java b/core/src/mindustry/entities/comp/PosTeamDef.java new file mode 100644 index 0000000000..0157200d66 --- /dev/null +++ b/core/src/mindustry/entities/comp/PosTeamDef.java @@ -0,0 +1,9 @@ +package mindustry.entities.comp; + +import mindustry.annotations.Annotations.*; +import mindustry.gen.*; + +//dummy target definition +@EntityDef(value = Teamc.class, genio = false, isFinal = false) +public class PosTeamDef{ +} diff --git a/core/src/mindustry/entities/comp/PuddleComp.java b/core/src/mindustry/entities/comp/PuddleComp.java index 669ee7e1f2..12f56fbaa4 100644 --- a/core/src/mindustry/entities/comp/PuddleComp.java +++ b/core/src/mindustry/entities/comp/PuddleComp.java @@ -21,11 +21,10 @@ import static mindustry.entities.Puddles.*; @Component(base = true) abstract class PuddleComp implements Posc, Puddlec, Drawc{ private static final int maxGeneration = 2; - private static final Color tmp = new Color(); - private static final Rect rect = new Rect(); - private static final Rect rect2 = new Rect(); + private static final Rect rect = new Rect(), rect2 = new Rect(); private static int seeds; + @Import int id; @Import float x, y; transient float accepting, updateTime, lastRipple; @@ -44,7 +43,6 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ float addSpeed = accepting > 0 ? 3f : 0f; amount -= Time.delta * (1f - liquid.viscosity) / (5f + addSpeed); - amount += accepting; accepting = 0f; @@ -54,7 +52,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ Tile other = world.tile(tile.x + point.x, tile.y + point.y); if(other != null && other.block() == Blocks.air){ Puddles.deposit(other, tile, liquid, deposited, generation + 1); - amount -= deposited / 2f; //tweak to speed up/slow down Puddlec propagation + amount -= deposited / 2f; //tweak to speed up/slow down Puddle propagation } } } @@ -74,7 +72,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ unit.apply(liquid.effect, 60 * 2); if(unit.vel.len() > 0.1){ - Fx.ripple.at(unit.x, unit.y, unit.type().rippleScale, liquid.color); + Fx.ripple.at(unit.x, unit.y, unit.type.rippleScale, liquid.color); } } } @@ -94,17 +92,17 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ public void draw(){ Draw.z(Layer.debris - 1); - seeds = id(); + seeds = id; boolean onLiquid = tile.floor().isLiquid; float f = Mathf.clamp(amount / (maxLiquid / 1.5f)); float smag = onLiquid ? 0.8f : 0f; - float sscl = 20f; + float sscl = 25f; - Draw.color(tmp.set(liquid.color).shiftValue(-0.05f)); - Fill.circle(x + Mathf.sin(Time.time() + seeds * 532, sscl, smag), y + Mathf.sin(Time.time() + seeds * 53, sscl, smag), f * 8f); + Draw.color(Tmp.c1.set(liquid.color).shiftValue(-0.05f)); + Fill.circle(x + Mathf.sin(Time.time + seeds * 532, sscl, smag), y + Mathf.sin(Time.time + seeds * 53, sscl, smag), f * 8f); Angles.randLenVectors(id(), 3, f * 6f, (ex, ey) -> { - Fill.circle(x + ex + Mathf.sin(Time.time() + seeds * 532, sscl, smag), - y + ey + Mathf.sin(Time.time() + seeds * 53, sscl, smag), f * 5f); + Fill.circle(x + ex + Mathf.sin(Time.time + seeds * 532, sscl, smag), + y + ey + Mathf.sin(Time.time + seeds * 53, sscl, smag), f * 5f); seeds++; }); Draw.color(); diff --git a/core/src/mindustry/entities/comp/ShieldComp.java b/core/src/mindustry/entities/comp/ShieldComp.java index c0fb68d78a..d1d3b50a87 100644 --- a/core/src/mindustry/entities/comp/ShieldComp.java +++ b/core/src/mindustry/entities/comp/ShieldComp.java @@ -3,18 +3,20 @@ package mindustry.entities.comp; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.game.*; import mindustry.gen.*; -import static mindustry.Vars.minArmorDamage; +import static mindustry.Vars.*; @Component abstract class ShieldComp implements Healthc, Posc{ - @Import float health, hitTime, x, y; + @Import float health, hitTime, x, y, healthMultiplier; @Import boolean dead; + @Import Team team; /** Absorbs health damage. */ float shield; - /** Absorbs percentage of damage. */ + /** Subtracts an amount from damage. */ float armor; /** Shield opacity. */ transient float shieldAlpha = 0f; @@ -24,9 +26,24 @@ abstract class ShieldComp implements Healthc, Posc{ public void damage(float amount){ //apply armor amount = Math.max(amount - armor, minArmorDamage * amount); + amount /= healthMultiplier; - hitTime = 1f; + rawDamage(amount); + } + @Replace + @Override + public void damagePierce(float amount, boolean withEffect){ + float pre = hitTime; + + rawDamage(amount); + + if(!withEffect){ + hitTime = pre; + } + } + + private void rawDamage(float amount){ boolean hadShields = shield > 0.0001f; if(hadShields){ @@ -35,6 +52,7 @@ abstract class ShieldComp implements Healthc, Posc{ float shieldDamage = Math.min(Math.max(shield, 0), amount); shield -= shieldDamage; + hitTime = 1f; amount -= shieldDamage; if(amount > 0){ @@ -44,7 +62,7 @@ abstract class ShieldComp implements Healthc, Posc{ } if(hadShields && shield <= 0.0001f){ - Fx.unitShieldBreak.at(x, y, 0, this); + Fx.unitShieldBreak.at(x, y, 0, team.color, this); } } } diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index 3a31b13b95..70d1e38dcb 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -19,7 +19,9 @@ abstract class StatusComp implements Posc, Flyingc{ private Seq statuses = new Seq<>(); private transient Bits applied = new Bits(content.getBy(ContentType.status).size); - @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, armorMultiplier = 1, reloadMultiplier = 1; + //these are considered read-only + transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1, buildSpeedMultiplier = 1, dragMultiplier = 1; + transient boolean disarmed = false; @Import UnitType type; @@ -32,6 +34,11 @@ abstract class StatusComp implements Posc, Flyingc{ void apply(StatusEffect effect, float duration){ if(effect == StatusEffects.none || effect == null || isImmune(effect)) return; //don't apply empty or immune effects + //unlock status effects regardless of whether they were applied to friendly units + if(state.isCampaign()){ + effect.unlock(); + } + if(statuses.size > 0){ //check for opposite effects for(int i = 0; i < statuses.size; i ++){ @@ -40,25 +47,29 @@ abstract class StatusComp implements Posc, Flyingc{ if(entry.effect == effect){ entry.time = Math.max(entry.time, duration); return; - }else if(entry.effect.reactsWith(effect)){ //find opposite - StatusEntry.tmp.effect = entry.effect; - entry.effect.getTransition(self(), effect, entry.time, duration, StatusEntry.tmp); - entry.time = StatusEntry.tmp.time; - - if(StatusEntry.tmp.effect != entry.effect){ - entry.effect = StatusEntry.tmp.effect; - } - + }else if(entry.effect.applyTransition(self(), effect, entry, duration)){ //find reaction + //TODO effect may react with multiple other effects //stop looking when one is found return; } } } - //otherwise, no opposites found, add direct effect - StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); - entry.set(effect, duration); - statuses.add(entry); + if(!effect.reactive){ + //otherwise, no opposites found, add direct effect + StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); + entry.set(effect, duration); + statuses.add(entry); + } + } + + float getDuration(StatusEffect effect){ + var entry = statuses.find(e -> e.effect == effect); + return entry == null ? 0 : entry.time; + } + + void clearStatuses(){ + statuses.clear(); } /** Removes a status effect. */ @@ -104,7 +115,8 @@ abstract class StatusComp implements Posc, Flyingc{ } applied.clear(); - speedMultiplier = damageMultiplier = armorMultiplier = reloadMultiplier = 1f; + speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = buildSpeedMultiplier = dragMultiplier = 1f; + disarmed = false; if(statuses.isEmpty()) return; @@ -114,22 +126,32 @@ abstract class StatusComp implements Posc, Flyingc{ StatusEntry entry = statuses.get(index++); entry.time = Math.max(entry.time - Time.delta, 0); - applied.set(entry.effect.id); - if(entry.time <= 0 && !entry.effect.permanent){ + if(entry.effect == null || (entry.time <= 0 && !entry.effect.permanent)){ Pools.free(entry); index --; statuses.remove(index); }else{ + applied.set(entry.effect.id); + speedMultiplier *= entry.effect.speedMultiplier; - armorMultiplier *= entry.effect.armorMultiplier; + healthMultiplier *= entry.effect.healthMultiplier; damageMultiplier *= entry.effect.damageMultiplier; reloadMultiplier *= entry.effect.reloadMultiplier; + buildSpeedMultiplier *= entry.effect.buildSpeedMultiplier; + dragMultiplier *= entry.effect.dragMultiplier; + + disarmed |= entry.effect.disarm; + entry.effect.update(self(), entry.time); } } } + public Bits statusBits(){ + return applied; + } + public void draw(){ for(StatusEntry e : statuses){ e.effect.draw(self()); diff --git a/core/src/mindustry/entities/comp/TeamComp.java b/core/src/mindustry/entities/comp/TeamComp.java index ed03caca5c..b222229619 100644 --- a/core/src/mindustry/entities/comp/TeamComp.java +++ b/core/src/mindustry/entities/comp/TeamComp.java @@ -1,11 +1,12 @@ package mindustry.entities.comp; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.world.blocks.storage.CoreBlock.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; @Component abstract class TeamComp implements Posc{ @@ -17,15 +18,18 @@ abstract class TeamComp implements Posc{ return team.rules().cheat; } - public @Nullable Building core(){ + @Nullable + public CoreBuild core(){ return team.core(); } - public @Nullable Building closestCore(){ + @Nullable + public CoreBuild closestCore(){ return state.teams.closestCore(x, y, team); } - public @Nullable Building closestEnemyCore(){ + @Nullable + public CoreBuild closestEnemyCore(){ return state.teams.closestEnemyCore(x, y, team); } } diff --git a/core/src/mindustry/entities/comp/TimerComp.java b/core/src/mindustry/entities/comp/TimerComp.java index 26c76646d0..8fec3b8896 100644 --- a/core/src/mindustry/entities/comp/TimerComp.java +++ b/core/src/mindustry/entities/comp/TimerComp.java @@ -8,6 +8,7 @@ abstract class TimerComp{ transient Interval timer = new Interval(6); public boolean timer(int index, float time){ + if(Float.isInfinite(time)) return false; return timer.get(index, time); } } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index cb88d312ca..47a10d113c 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -1,16 +1,18 @@ package mindustry.entities.comp; import arc.*; +import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.ai.*; +import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.abilities.*; @@ -18,34 +20,45 @@ import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; -import mindustry.graphics.*; import mindustry.logic.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; +import mindustry.world.blocks.payloads.*; import static mindustry.Vars.*; +import static mindustry.logic.GlobalConstants.*; @Component(base = true) -abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Displayable, Senseable{ +abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc, Builderc{ - @Import boolean hovering, dead; - @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo; + @Import boolean hovering, dead, disarmed; + @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed, dragMultiplier; @Import Team team; @Import int id; + @Import @Nullable Tile mineTile; + @Import Vec2 vel; private UnitController controller; - private UnitType type; + UnitType type; boolean spawnedByCore; + double flag; transient Seq abilities = new Seq<>(0); + transient float healTime; private transient float resupplyTime = Mathf.random(10f); + private transient boolean wasPlayer; + private transient float lastHealth; public void moveAt(Vec2 vector){ moveAt(vector, type.accel); } + public void approach(Vec2 vector){ + vel.approachDelta(vector, type.accel * realSpeed()); + } + public void aimLook(Position pos){ aim(pos); lookAt(pos); @@ -56,6 +69,16 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I lookAt(x, y); } + /** @return approx. square size of the physical hitbox for physics */ + public float physicSize(){ + return hitSize * 0.7f; + } + + /** @return whether there is solid, un-occupied ground under this unit. */ + public boolean canLand(){ + return !onSolid() && Units.count(x, y, physicSize(), f -> f != self() && f.isGrounded()) == 0; + } + public boolean inRange(Position other){ return within(other, type.range); } @@ -64,29 +87,80 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return type.hasWeapons(); } + public float speed(){ + float strafePenalty = isGrounded() || !isPlayer() ? 1f : Mathf.lerp(1f, type.strafePenalty, Angles.angleDist(vel().angle(), rotation) / 180f); + //limit speed to minimum formation speed to preserve formation + return (isCommanding() ? minFormationSpeed * 0.98f : type.speed) * strafePenalty; + } + + /** @return speed with boost multipliers factored in. */ + public float realSpeed(){ + return Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, elevation) * speed() * floorSpeedMultiplier(); + } + + /** Iterates through this unit and everything it is controlling. */ + public void eachGroup(Cons cons){ + cons.get(self()); + controlling().each(cons); + } + + /** @return where the unit wants to look at. */ + public float prefRotation(){ + if(activelyBuilding()){ + return angleTo(buildPlan()); + }else if(mineTile != null){ + return angleTo(mineTile); + }else if(moving() && type.omniMovement){ + return vel().angle(); + } + return rotation; + } + + @Override public float range(){ - return type.range; + return type.maxRange; } @Replace public float clipSize(){ - return Math.max(type.region.width * 2f, type.clipSize); + if(isBuilding()){ + return state.rules.infiniteResources ? Float.MAX_VALUE : Math.max(type.clipSize, type.region.width) + buildingRange + tilesize*4f; + } + return type.clipSize; } @Override public double sense(LAccess sensor){ return switch(sensor){ case totalItems -> stack().amount; + case itemCapacity -> type.itemCapacity; case rotation -> rotation; case health -> health; case maxHealth -> maxHealth; - case x -> x; - case y -> y; + case ammo -> !state.rules.unitAmmo ? type.ammoCapacity : ammo; + case ammoCapacity -> type.ammoCapacity; + case x -> World.conv(x); + case y -> World.conv(y); + case dead -> dead || !isAdded() ? 1 : 0; case team -> team.id; case shooting -> isShooting() ? 1 : 0; - case shootX -> aimX(); - case shootY -> aimY(); - default -> 0; + case boosting -> type.canBoost && isFlying() ? 1 : 0; + case range -> range() / tilesize; + case shootX -> World.conv(aimX()); + case shootY -> World.conv(aimY()); + case mining -> mining() ? 1 : 0; + case mineX -> mining() ? mineTile.x : -1; + case mineY -> mining() ? mineTile.y : -1; + case flag -> flag; + case controlled -> !isValid() ? 0 : + controller instanceof LogicAI ? ctrlProcessor : + controller instanceof Player ? ctrlPlayer : + controller instanceof FormationAI ? ctrlFormation : + 0; + case commanded -> controller instanceof FormationAI && isValid() ? 1 : 0; + case payloadCount -> ((Object)this) instanceof Payloadc pay ? pay.payloads().size : 0; + case size -> hitSize / tilesize; + default -> Float.NaN; }; } @@ -94,15 +168,21 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I public Object senseObject(LAccess sensor){ return switch(sensor){ case type -> type; + case name -> controller instanceof Player p ? p.name : null; + case firstItem -> stack().amount == 0 ? null : item(); + case controller -> !isValid() ? null : controller instanceof LogicAI log ? log.controller : controller instanceof FormationAI form ? form.leader : this; + case payloadType -> ((Object)this) instanceof Payloadc pay ? + (pay.payloads().isEmpty() ? null : + pay.payloads().peek() instanceof UnitPayload p1 ? p1.unit.type : + pay.payloads().peek() instanceof BuildPayload p2 ? p2.block() : null) : null; default -> noSensed; }; - } @Override public double sense(Content content){ if(content == stack().item) return stack().amount; - return 0; + return Float.NaN; } @Override @@ -115,7 +195,11 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Replace public boolean canShoot(){ //cannot shoot while boosting - return !(type.canBoost && isFlying()); + return !disarmed && !(type.canBoost && isFlying()); + } + + public boolean isCounted(){ + return type.isCounted; } @Override @@ -145,22 +229,12 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void set(UnitType def, UnitController controller){ - type(type); + if(this.type != def){ + setType(def); + } controller(controller); } - @Override - public void type(UnitType type){ - if(this.type == type) return; - - setStats(type); - } - - @Override - public UnitType type(){ - return type; - } - /** @return pathfinder path type for calculating costs */ public int pathType(){ return Pathfinder.costGround; @@ -183,14 +257,14 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } public int count(){ - return teamIndex.countType(team, type); + return team.data().countType(type); } public int cap(){ return Units.getCap(team); } - public void setStats(UnitType type){ + public void setType(UnitType type){ this.type = type; this.maxHealth = type.health; this.drag = type.drag; @@ -208,7 +282,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void afterSync(){ //set up type info after reading - setStats(this.type); + setType(this.type); controller.unit(self()); } @@ -221,17 +295,19 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void add(){ + team.data().updateCount(type, 1); //check if over unit cap - if(count() > cap() && !spawnedByCore && !dead){ + if(count() > cap() && !spawnedByCore && !dead && !state.rules.editor){ Call.unitCapDeath(self()); - teamIndex.updateCount(team, type, -1); + team.data().updateCount(type, -1); } + } @Override public void remove(){ - teamIndex.updateCount(team, type, -1); + team.data().updateCount(type, -1); controller.removed(self()); } @@ -249,6 +325,18 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I type.update(self()); + if(health > lastHealth && lastHealth > 0 && healTime <= -1f){ + healTime = 1f; + } + healTime -= Time.delta / 20f; + lastHealth = health; + + //check if environment is unsupported + if(!type.supportsEnv(state.rules.environment) && !dead){ + Call.unitCapDeath(self()); + team.data().updateCount(type, -1); + } + if(state.rules.unitAmmo && ammo < type.ammoCapacity - 0.0001f){ resupplyTime += Time.delta; @@ -265,14 +353,14 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } } - drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); + drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f) * dragMultiplier; //apply knockback based on spawns - if(team != state.rules.waveTeam){ + if(team != state.rules.waveTeam && state.hasSpawns() && (!net.client() || isLocal())){ float relativeSize = state.rules.dropZoneRadius + hitSize/2f + 1f; for(Tile spawn : spawner.getSpawns()){ if(within(spawn.worldx(), spawn.worldy(), relativeSize)){ - vel().add(Tmp.v1.set(this).sub(spawn.worldx(), spawn.worldy()).setLength(0.1f + 1f - dst(spawn) / relativeSize).scl(0.45f * Time.delta)); + velAddNet(Tmp.v1.set(this).sub(spawn.worldx(), spawn.worldy()).setLength(0.1f + 1f - dst(spawn) / relativeSize).scl(0.45f * Time.delta)); } } } @@ -284,13 +372,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I //standard fall smoke if(Mathf.chanceDelta(0.1)){ - Tmp.v1.setToRandomDirection().scl(hitSize); + Tmp.v1.rnd(Mathf.range(hitSize)); type.fallEffect.at(x + Tmp.v1.x, y + Tmp.v1.y); } //thruster fall trail if(Mathf.chanceDelta(0.2)){ - float offset = type.engineOffset/2f + type.engineOffset/2f*elevation; + float offset = type.engineOffset/2f + type.engineOffset/2f * elevation; float range = Mathf.range(type.engineSize); type.fallThrusterEffect.at( x + Angles.trnsx(rotation + 180, offset) + Mathf.range(range), @@ -303,7 +391,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I elevation -= type.fallSpeed * Time.delta; if(isGrounded()){ - destroy(); + Call.unitDestroy(id); } } @@ -343,21 +431,27 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } //remove units spawned by the core - if(spawnedByCore && !isPlayer()){ + if(spawnedByCore && !isPlayer() && !dead){ Call.unitDespawn(self()); } } /** @return a preview icon for this unit. */ public TextureRegion icon(){ - return type.icon(Cicon.full); + return type.fullIcon; } /** Actually destroys the unit, removing it and creating explosions. **/ public void destroy(){ - float explosiveness = 2f + item().explosiveness * stack().amount / 2f; - float flammability = item().flammability * stack().amount / 2f; - Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, Pal.darkFlame, state.rules.damageExplosions); + if(!isAdded()) return; + + float explosiveness = 2f + item().explosiveness * stack().amount * 1.53f; + float flammability = item().flammability * stack().amount / 1.9f; + float power = item().charge * stack().amount * 150f; + + if(!spawnedByCore){ + Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team); + } float shake = hitSize / 3f; @@ -368,12 +462,12 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I Events.fire(new UnitDestroyEvent(self())); - if(explosiveness > 7f && isLocal()){ + if(explosiveness > 7f && (isLocal() || wasPlayer)){ Events.fire(Trigger.suicideBomb); } //if this unit crash landed (was flying), damage stuff in a radius - if(type.flying){ + if(type.flying && !spawnedByCore){ Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true); } @@ -390,6 +484,15 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I remove(); } + /** @return name of direct or indirect player controller. */ + @Override + public @Nullable String getControllerName(){ + if(isPlayer()) return getPlayer().name; + if(controller instanceof LogicAI ai && ai.controller != null) return ai.controller.lastAccessed; + if(controller instanceof FormationAI ai && ai.leader != null && ai.leader.isPlayer()) return ai.leader.getPlayer().name; + return null; + } + @Override public void display(Table table){ type.display(self(), table); @@ -417,6 +520,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void killed(){ + wasPlayer = isLocal(); health = 0; dead = true; diff --git a/core/src/mindustry/entities/comp/VelComp.java b/core/src/mindustry/entities/comp/VelComp.java index deec6756d1..3e79b04e17 100644 --- a/core/src/mindustry/entities/comp/VelComp.java +++ b/core/src/mindustry/entities/comp/VelComp.java @@ -3,7 +3,6 @@ package mindustry.entities.comp; import arc.math.*; import arc.math.geom.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; @@ -22,8 +21,12 @@ abstract class VelComp implements Posc{ @MethodPriority(-1) @Override public void update(){ + float px = x, py = y; move(vel.x * Time.delta, vel.y * Time.delta); - vel.scl(Mathf.clamp(1f - drag * Time.delta)); + if(Mathf.equal(px, x)) vel.x = 0; + if(Mathf.equal(py, y)) vel.y = 0; + + vel.scl(Math.max(1f - drag * Time.delta, 0)); } /** @return function to use for check solid state. if null, no checking is done. */ @@ -47,6 +50,10 @@ abstract class VelComp implements Posc{ return !vel.isZero(0.01f); } + void move(Vec2 v){ + move(v.x, v.y); + } + void move(float cx, float cy){ SolidPred check = solidity(); @@ -57,4 +64,20 @@ abstract class VelComp implements Posc{ y += cy; } } + + void velAddNet(Vec2 v){ + vel.add(v); + if(isRemote()){ + x += v.x; + y += v.y; + } + } + + void velAddNet(float vx, float vy){ + vel.add(vx, vy); + if(isRemote()){ + x += vx; + y += vy; + } + } } diff --git a/core/src/mindustry/entities/comp/WaterMoveComp.java b/core/src/mindustry/entities/comp/WaterMoveComp.java index f87679efdb..69d178f41d 100644 --- a/core/src/mindustry/entities/comp/WaterMoveComp.java +++ b/core/src/mindustry/entities/comp/WaterMoveComp.java @@ -39,7 +39,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @Override @Replace public int pathType(){ - return Pathfinder.costWater; + return Pathfinder.costNaval; } @Override diff --git a/core/src/mindustry/entities/comp/WeaponsComp.java b/core/src/mindustry/entities/comp/WeaponsComp.java index d826ba555f..bc0b0c85c5 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -1,30 +1,22 @@ package mindustry.entities.comp; -import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; -import mindustry.entities.*; -import mindustry.entities.bullet.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; -import static mindustry.Vars.*; - @Component abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ - @Import float x, y, rotation, reloadMultiplier; - @Import Vec2 vel; + @Import float x, y; + @Import boolean disarmed; @Import UnitType type; - /** temporary weapon sequence number */ - static int sequenceNum = 0; - /** weapon mount array, never null */ @SyncLocal WeaponMount[] mounts = {}; - @ReadOnly transient float aimX, aimY; @ReadOnly transient boolean isRotate; + transient float aimX, aimY; boolean isShooting; float ammo; @@ -41,7 +33,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ void setupWeapons(UnitType def){ mounts = new WeaponMount[def.weapons.size]; for(int i = 0; i < mounts.length; i++){ - mounts[i] = new WeaponMount(def.weapons.get(i)); + mounts[i] = def.weapons.get(i).mountType.get(def.weapons.get(i)); } } @@ -51,8 +43,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ void controlWeapons(boolean rotate, boolean shoot){ for(WeaponMount mount : mounts){ - mount.rotate = rotate; - mount.shoot = shoot; + if(mount.weapon.controllable){ + mount.rotate = rotate; + mount.shoot = shoot; + } } isRotate = rotate; isShooting = shoot; @@ -71,8 +65,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ y = Tmp.v1.y + this.y; for(WeaponMount mount : mounts){ - mount.aimX = x; - mount.aimY = y; + if(mount.weapon.controllable){ + mount.aimX = x; + mount.aimY = y; + } } aimX = x; @@ -80,139 +76,28 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ } boolean canShoot(){ - return true; + return !disarmed; } @Override public void remove(){ for(WeaponMount mount : mounts){ - if(mount.bullet != null){ + if(mount.bullet != null && mount.bullet.owner == self()){ mount.bullet.time = mount.bullet.lifetime - 10f; mount.bullet = null; } + + if(mount.sound != null){ + mount.sound.stop(); + } } } /** Update shooting and rotation for this unit. */ @Override public void update(){ - boolean can = canShoot(); - for(WeaponMount mount : mounts){ - Weapon weapon = mount.weapon; - mount.reload = Math.max(mount.reload - Time.delta * reloadMultiplier, 0); - - float weaponRotation = this.rotation - 90 + (weapon.rotate ? mount.rotation : 0); - float mountX = this.x + Angles.trnsx(this.rotation - 90, weapon.x, weapon.y), - mountY = this.y + Angles.trnsy(this.rotation - 90, weapon.x, weapon.y); - float shootX = mountX + Angles.trnsx(weaponRotation, weapon.shootX, weapon.shootY), - shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX, weapon.shootY); - float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY) + (this.rotation - angleTo(mount.aimX, mount.aimY)); - - //update continuous state - if(weapon.continuous && mount.bullet != null){ - if(!mount.bullet.isAdded() || mount.bullet.time >= mount.bullet.lifetime){ - mount.bullet = null; - }else{ - mount.bullet.rotation(weaponRotation + 90); - mount.bullet.set(shootX, shootY); - vel.add(Tmp.v1.trns(rotation + 180f, mount.bullet.type.recoil)); - } - }else{ - //heat decreases when not firing - mount.heat = Math.max(mount.heat - Time.delta * reloadMultiplier / mount.weapon.cooldownTime, 0); - } - - //flip weapon shoot side for alternating weapons at half reload - if(weapon.otherSide != -1 && weapon.alternate && mount.side == weapon.flipSprite && - mount.reload + Time.delta > weapon.reload/2f && mount.reload <= weapon.reload/2f){ - mounts[weapon.otherSide].side = !mounts[weapon.otherSide].side; - mount.side = !mount.side; - } - - //rotate if applicable - if(weapon.rotate && (mount.rotate || mount.shoot) && can){ - float axisX = this.x + Angles.trnsx(this.rotation - 90, weapon.x, weapon.y), - axisY = this.y + Angles.trnsy(this.rotation - 90, weapon.x, weapon.y); - - mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - this.rotation; - mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, weapon.rotateSpeed * Time.delta); - }else if(!weapon.rotate){ - mount.rotation = 0; - mount.targetRotation = angleTo(mount.aimX, mount.aimY); - } - - //shoot if applicable - if(mount.shoot && //must be shooting - can && //must be able to shoot - (ammo > 0 || !state.rules.unitAmmo || team().rules().infiniteAmmo) && //check ammo - (!weapon.alternate || mount.side == weapon.flipSprite) && - //TODO checking for velocity this way isn't entirely correct - (vel.len() >= mount.weapon.minShootVelocity || (net.active() && !isLocal())) && //check velocity requirements - mount.reload <= 0.0001f && //reload has to be 0 - Angles.within(weapon.rotate ? mount.rotation : this.rotation, mount.targetRotation, mount.weapon.shootCone) //has to be within the cone - ){ - shoot(mount, shootX, shootY, mount.aimX, mount.aimY, shootAngle, Mathf.sign(weapon.x)); - - mount.reload = weapon.reload; - - ammo--; - if(ammo < 0) ammo = 0; - } + mount.weapon.update(self(), mount); } } - - private void shoot(WeaponMount mount, float x, float y, float aimX, float aimY, float rotation, int side){ - Weapon weapon = mount.weapon; - - float baseX = this.x, baseY = this.y; - - weapon.shootSound.at(x, y, Mathf.random(0.8f, 1.0f)); - - BulletType ammo = weapon.bullet; - float lifeScl = ammo.scaleVelocity ? Mathf.clamp(Mathf.dst(x, y, aimX, aimY) / ammo.range()) : 1f; - - sequenceNum = 0; - if(weapon.shotDelay + weapon.firstShotDelay > 0.01f){ - Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> { - Time.run(sequenceNum * weapon.shotDelay + weapon.firstShotDelay, () -> { - if(!isAdded()) return; - mount.bullet = bullet(weapon, x + this.x - baseX, y + this.y - baseY, f + Mathf.range(weapon.inaccuracy), lifeScl); - }); - sequenceNum++; - }); - }else{ - Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> mount.bullet = bullet(weapon, x, y, f + Mathf.range(weapon.inaccuracy), lifeScl)); - } - - boolean parentize = ammo.keepVelocity; - - if(weapon.firstShotDelay > 0){ - Time.run(weapon.firstShotDelay, () -> { - if(!isAdded()) return; - - vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); - Effect.shake(weapon.shake, weapon.shake, x, y); - mount.heat = 1f; - }); - }else{ - vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); - Effect.shake(weapon.shake, weapon.shake, x, y); - mount.heat = 1f; - } - - weapon.ejectEffect.at(x, y, rotation * side); - ammo.shootEffect.at(x, y, rotation, parentize ? this : null); - ammo.smokeEffect.at(x, y, rotation, parentize ? this : null); - apply(weapon.shootStatus, weapon.shootStatusDuration); - } - - private Bullet bullet(Weapon weapon, float x, float y, float angle, float lifescl){ - float xr = Mathf.range(weapon.xRand); - - return weapon.bullet.create(this, team(), - x + Angles.trnsx(angle, 0, xr), - y + Angles.trnsy(angle, 0, xr), - angle, (1f - weapon.velocityRnd) + Mathf.random(weapon.velocityRnd), lifescl); - } } diff --git a/core/src/mindustry/entities/effect/ExplosionEffect.java b/core/src/mindustry/entities/effect/ExplosionEffect.java new file mode 100644 index 0000000000..352e676f9c --- /dev/null +++ b/core/src/mindustry/entities/effect/ExplosionEffect.java @@ -0,0 +1,47 @@ +package mindustry.entities.effect; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.entities.*; +import mindustry.graphics.*; + +import static arc.graphics.g2d.Draw.*; +import static arc.graphics.g2d.Lines.*; +import static arc.math.Angles.*; + +public class ExplosionEffect extends Effect{ + public Color waveColor = Pal.missileYellow, smokeColor = Color.gray, sparkColor = Pal.missileYellowBack; + public float waveLife = 6f, waveStroke = 3f, waveRad = 15f, waveRadBase = 2f, sparkStroke = 1f, sparkRad = 23f, sparkLen = 3f, smokeSize = 4f, smokeSizeBase = 0.5f, smokeRad = 23f; + public int smokes = 5, sparks = 4; + + public ExplosionEffect(){ + clip = 100f; + lifetime = 22; + + renderer = e -> { + color(waveColor); + + e.scaled(waveLife, i -> { + stroke(waveStroke * i.fout()); + Lines.circle(e.x, e.y, waveRadBase + i.fin() * waveRad); + }); + + color(smokeColor); + + if(smokeSize > 0){ + randLenVectors(e.id, smokes, 2f + smokeRad * e.finpow(), (x, y) -> { + Fill.circle(e.x + x, e.y + y, e.fout() * smokeSize + smokeSizeBase); + }); + } + + color(sparkColor); + stroke(e.fout() * sparkStroke); + + randLenVectors(e.id + 1, sparks, 1f + sparkRad * e.finpow(), (x, y) -> { + lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * sparkLen); + Drawf.light(e.x + x, e.y + y, e.fout() * sparkLen * 4f, sparkColor, 0.7f); + }); + }; + } +} diff --git a/core/src/mindustry/entities/effect/MultiEffect.java b/core/src/mindustry/entities/effect/MultiEffect.java new file mode 100644 index 0000000000..a93c3bd276 --- /dev/null +++ b/core/src/mindustry/entities/effect/MultiEffect.java @@ -0,0 +1,38 @@ +package mindustry.entities.effect; + +import mindustry.entities.*; + +/** Renders multiple particle effects at once. */ +public class MultiEffect extends Effect{ + public Effect[] effects = {}; + + public MultiEffect(){ + clip = 100f; + } + + public MultiEffect(Effect... effects){ + this(); + this.effects = effects; + } + + @Override + public void init(){ + for(Effect f : effects){ + clip = Math.max(clip, f.clip); + lifetime = Math.max(lifetime, f.lifetime); + } + } + + @Override + public void render(EffectContainer e){ + int index = 0; + for(Effect f : effects){ + int i = ++index; + e.scaled(f.lifetime, cont -> { + cont.id = e.id + i; + f.render(cont); + }); + clip = Math.max(clip, f.clip); + } + } +} diff --git a/core/src/mindustry/entities/effect/ParticleEffect.java b/core/src/mindustry/entities/effect/ParticleEffect.java new file mode 100644 index 0000000000..a6e5df24a8 --- /dev/null +++ b/core/src/mindustry/entities/effect/ParticleEffect.java @@ -0,0 +1,71 @@ +package mindustry.entities.effect; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.entities.*; +import mindustry.graphics.*; + +/** The most essential effect class. Can create particles in various shapes. */ +public class ParticleEffect extends Effect{ + public Color colorFrom = Color.white.cpy(), colorTo = Color.white.cpy(); + public int particles = 6; + public float cone = 180f, length = 20f, baseLength = 0f; + /** Particle size/length/radius interpolation. */ + public Interp interp = Interp.linear; + public float offsetX, offsetY; + public float lightScl = 2f, lightOpacity = 0.6f; + public @Nullable Color lightColor; + + //region only + + /** Spin in degrees per tick. */ + public float spin = 0f; + /** Controls the initial and final sprite sizes. */ + public float sizeFrom = 2f, sizeTo = 0f; + /** Rotation offset. */ + public float offset = 0; + /** Sprite to draw. */ + public String region = "circle"; + + //line only + public boolean line; + public float strokeFrom = 2f, strokeTo = 0f, lenFrom = 4f, lenTo = 2f; + + private @Nullable TextureRegion tex; + + @Override + public void init(){ + clip = Math.max(clip, length + Math.max(sizeFrom, sizeTo)); + } + + @Override + public void render(EffectContainer e){ + if(tex == null) tex = Core.atlas.find(region); + + float rawfin = e.fin(); + float fin = e.fin(interp); + float rad = interp.apply(sizeFrom, sizeTo, rawfin) * 2; + float ox = e.x + Angles.trnsx(e.rotation, offsetX, offsetY), oy = e.y + Angles.trnsy(e.rotation, offsetX, offsetY); + + Draw.color(colorFrom, colorTo, fin); + Color lightColor = this.lightColor == null ? Draw.getColor() : this.lightColor; + + if(line){ + Lines.stroke(interp.apply(strokeFrom, strokeTo, rawfin)); + float len = interp.apply(lenFrom, lenTo, rawfin); + + Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { + Lines.lineAngle(ox + x, oy + y, Mathf.angle(x, y), len); + Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity); + }); + }else{ + Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { + Draw.rect(tex, ox + x, oy + y, rad, rad, e.rotation + offset + e.time * spin); + Drawf.light(ox + x, oy + y, rad * lightScl, lightColor, lightOpacity); + }); + } + } +} diff --git a/core/src/mindustry/entities/effect/WaveEffect.java b/core/src/mindustry/entities/effect/WaveEffect.java new file mode 100644 index 0000000000..7aaddd95b3 --- /dev/null +++ b/core/src/mindustry/entities/effect/WaveEffect.java @@ -0,0 +1,41 @@ +package mindustry.entities.effect; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.entities.*; +import mindustry.graphics.*; + +/** Effect that renders a basic shockwave. */ +public class WaveEffect extends Effect{ + public Color colorFrom = Color.white.cpy(), colorTo = Color.white.cpy(); + public @Nullable Color lightColor; + public float sizeFrom = 0f, sizeTo = 100f, lightScl = 3f, lightOpacity = 0.8f; + public int sides = -1; + public float rotation = 0f; + public float strokeFrom = 2f, strokeTo = 0f; + public Interp interp = Interp.linear; + public Interp lightInterp = Interp.reverse; + public float offsetX, offsetY; + + @Override + public void init(){ + clip = Math.max(clip, Math.max(sizeFrom, sizeTo) + Math.max(strokeFrom, strokeTo)); + } + + @Override + public void render(EffectContainer e){ + float fin = e.fin(); + float ifin = e.fin(interp); + float ox = e.x + Angles.trnsx(e.rotation, offsetX, offsetY), oy = e.y + Angles.trnsy(e.rotation, offsetX, offsetY); + + Draw.color(colorFrom, colorTo, ifin); + Lines.stroke(interp.apply(strokeFrom, strokeTo, fin)); + + float rad = interp.apply(sizeFrom, sizeTo, fin); + Lines.poly(ox, oy, sides <= 0 ? Lines.circleVertices(rad) : sides, rad, rotation + e.rotation); + + Drawf.light(ox, oy, rad * lightScl, lightColor == null ? Draw.getColor() : lightColor, lightOpacity * e.fin(lightInterp)); + } +} diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index 03d9daf8b4..e0c3231309 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -2,9 +2,9 @@ package mindustry.entities.units; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; +import mindustry.ai.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.type.*; @@ -15,17 +15,14 @@ import static mindustry.Vars.*; public class AIController implements UnitController{ protected static final Vec2 vec = new Vec2(); - protected static final int timerTarget = 0; - protected static final int timerTarget2 = 1; - protected static final int timerTarget3 = 2; + protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2, timerTarget4 = 3; protected Unit unit; protected Interval timer = new Interval(4); + protected AIController fallback; /** main target that is being faced */ protected Teamc target; - /** targets for each weapon */ - protected Teamc[] targets = {}; { timer.reset(0, Mathf.random(40f)); @@ -34,23 +31,36 @@ public class AIController implements UnitController{ @Override public void updateUnit(){ + //use fallback AI when possible + if(useFallback() && (fallback != null || (fallback = fallback()) != null)){ + if(fallback.unit != unit) fallback.unit(unit); + fallback.updateUnit(); + return; + } + updateVisuals(); updateTargeting(); updateMovement(); } + @Nullable + protected AIController fallback(){ + return null; + } + + protected boolean useFallback(){ + return false; + } + protected UnitCommand command(){ return unit.team.data().command; } protected void updateVisuals(){ - if(unit.isFlying()){ unit.wobble(); - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } + unit.lookAt(unit.prefRotation()); } } @@ -64,56 +74,85 @@ public class AIController implements UnitController{ } } - protected void updateWeapons(){ - if(targets.length != unit.mounts.length) targets = new Teamc[unit.mounts.length]; + protected boolean invalid(Teamc target){ + return Units.invalidateTarget(target, unit.team, unit.x, unit.y); + } + + protected void pathfind(int pathTarget){ + int costType = unit.pathType(); + + Tile tile = unit.tileOn(); + if(tile == null) return; + Tile targetTile = pathfinder.getTargetTile(tile, pathfinder.getField(unit.team, costType, pathTarget)); + + if(tile == targetTile || (costType == Pathfinder.costNaval && !targetTile.floor().isLiquid)) return; + + unit.moveAt(vec.trns(unit.angleTo(targetTile.worldx(), targetTile.worldy()), unit.speed())); + } + + protected void updateWeapons(){ float rotation = unit.rotation - 90; boolean ret = retarget(); if(ret){ - target = findTarget(unit.x, unit.y, unit.range(), unit.type().targetAir, unit.type().targetGround); + target = findTarget(unit.x, unit.y, unit.range(), unit.type.targetAir, unit.type.targetGround); } - if(Units.invalidateTarget(target, unit.team, unit.x, unit.y)){ + if(invalid(target)){ target = null; } - for(int i = 0; i < targets.length; i++){ - WeaponMount mount = unit.mounts[i]; + unit.isShooting = false; + + for(var mount : unit.mounts){ Weapon weapon = mount.weapon; + //let uncontrollable weapons do their own thing + if(!weapon.controllable) continue; + float mountX = unit.x + Angles.trnsx(rotation, weapon.x, weapon.y), mountY = unit.y + Angles.trnsy(rotation, weapon.x, weapon.y); - if(unit.type().singleTarget){ - targets[i] = target; + if(unit.type.singleTarget){ + mount.target = target; }else{ if(ret){ - targets[i] = findTarget(mountX, mountY, weapon.bullet.range(), weapon.bullet.collidesAir, weapon.bullet.collidesGround); + mount.target = findTarget(mountX, mountY, weapon.bullet.range(), weapon.bullet.collidesAir, weapon.bullet.collidesGround); } - if(Units.invalidateTarget(targets[i], unit.team, mountX, mountY, weapon.bullet.range())){ - targets[i] = null; + if(checkTarget(mount.target, mountX, mountY, weapon.bullet.range())){ + mount.target = null; } } boolean shoot = false; - if(targets[i] != null){ - shoot = targets[i].within(mountX, mountY, weapon.bullet.range()); + if(mount.target != null){ + shoot = mount.target.within(mountX, mountY, weapon.bullet.range() + (mount.target instanceof Sized s ? s.hitSize()/2f : 0f)) && shouldShoot(); - if(shoot){ - Vec2 to = Predict.intercept(unit, targets[i], weapon.bullet.speed); - mount.aimX = to.x; - mount.aimY = to.y; - } + Vec2 to = Predict.intercept(unit, mount.target, weapon.bullet.speed); + mount.aimX = to.x; + mount.aimY = to.y; } - mount.shoot = shoot; - mount.rotate = shoot; + unit.isShooting |= (mount.shoot = mount.rotate = shoot); + + if(shoot){ + unit.aimX = mount.aimX; + unit.aimY = mount.aimY; + } } } + protected boolean checkTarget(Teamc target, float x, float y, float range){ + return Units.invalidateTarget(target, unit.team, x, y, range); + } + + protected boolean shouldShoot(){ + return true; + } + protected Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){ Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag)); return target == null ? null : target.build; @@ -124,7 +163,7 @@ public class AIController implements UnitController{ } protected boolean retarget(){ - return timer.get(timerTarget, 30); + return timer.get(timerTarget, target == null ? 40 : 90); } protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ @@ -140,7 +179,7 @@ public class AIController implements UnitController{ } protected void circle(Position target, float circleLength){ - circle(target, circleLength, unit.type().speed); + circle(target, circleLength, unit.speed()); } protected void circle(Position target, float circleLength, float speed){ @@ -158,13 +197,17 @@ public class AIController implements UnitController{ } protected void moveTo(Position target, float circleLength){ + moveTo(target, circleLength, 100f); + } + + protected void moveTo(Position target, float circleLength, float smooth){ if(target == null) return; vec.set(target).sub(unit); - float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / 100f, -1f, 1f); + float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); - vec.setLength(unit.type().speed * length); + vec.setLength(unit.realSpeed() * length); if(length < -0.5f){ vec.rotate(180f); }else if(length < 0){ diff --git a/core/src/mindustry/entities/units/BuildPlan.java b/core/src/mindustry/entities/units/BuildPlan.java index fb4a7a2816..053d12651d 100644 --- a/core/src/mindustry/entities/units/BuildPlan.java +++ b/core/src/mindustry/entities/units/BuildPlan.java @@ -2,14 +2,15 @@ package mindustry.entities.units; import arc.func.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.world.*; import static mindustry.Vars.*; /** Class for storing build requests. Can be either a place or remove request. */ -public class BuildPlan{ +public class BuildPlan implements Position{ /** Position and rotation of this request. */ public int x, y, rotation; /** Block being placed. If null, this is a breaking request.*/ @@ -61,6 +62,20 @@ public class BuildPlan{ } + public boolean placeable(Team team){ + return Build.validPlace(block, team, x, y, rotation); + } + + public boolean isRotation(Team team){ + if(breaking) return false; + Tile tile = tile(); + return tile != null && tile.team() == team && tile.block() == block && tile.build != null && tile.build.rotation != rotation; + } + + public boolean samePos(BuildPlan other){ + return x == other.x && y == other.y; + } + /** Transforms the internal position of this config using the specified function, and return the result. */ public static Object pointConfig(Block block, Object config, Cons cons){ if(config instanceof Point2){ @@ -127,11 +142,11 @@ public class BuildPlan{ } public float drawx(){ - return x*tilesize + block.offset; + return x*tilesize + (block == null ? 0 : block.offset); } public float drawy(){ - return y*tilesize + block.offset; + return y*tilesize + (block == null ? 0 : block.offset); } public @Nullable Tile tile(){ @@ -142,16 +157,27 @@ public class BuildPlan{ return world.build(x, y); } + @Override + public float getX(){ + return drawx(); + } + + @Override + public float getY(){ + return drawy(); + } + @Override public String toString(){ - return "BuildRequest{" + + return "BuildPlan{" + "x=" + x + ", y=" + y + ", rotation=" + rotation + - ", recipe=" + block + + ", block=" + block + ", breaking=" + breaking + ", progress=" + progress + ", initialized=" + initialized + + ", config=" + config + '}'; } } diff --git a/core/src/mindustry/entities/units/StatusEntry.java b/core/src/mindustry/entities/units/StatusEntry.java index 1c1f07f9b7..b733457772 100644 --- a/core/src/mindustry/entities/units/StatusEntry.java +++ b/core/src/mindustry/entities/units/StatusEntry.java @@ -3,8 +3,6 @@ package mindustry.entities.units; import mindustry.type.*; public class StatusEntry{ - public static final StatusEntry tmp = new StatusEntry(); - public StatusEffect effect; public float time; diff --git a/core/src/mindustry/entities/units/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index f5aa45c4ea..8254c8ca2f 100644 --- a/core/src/mindustry/entities/units/WeaponMount.java +++ b/core/src/mindustry/entities/units/WeaponMount.java @@ -1,6 +1,7 @@ package mindustry.entities.units; -import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.audio.*; import mindustry.gen.*; import mindustry.type.*; @@ -25,6 +26,12 @@ public class WeaponMount{ public boolean side; /** current bullet for continuous weapons */ public @Nullable Bullet bullet; + /** sound loop for continuous weapons */ + public @Nullable SoundLoop sound; + /** current target; used for autonomous weapons and AI */ + public @Nullable Teamc target; + /** retarget counter */ + public float retarget = 0f; public WeaponMount(Weapon weapon){ this.weapon = weapon; diff --git a/core/src/mindustry/game/DefaultWaves.java b/core/src/mindustry/game/DefaultWaves.java deleted file mode 100644 index a889f9d4ba..0000000000 --- a/core/src/mindustry/game/DefaultWaves.java +++ /dev/null @@ -1,273 +0,0 @@ -package mindustry.game; - -import arc.math.*; -import arc.struct.*; -import arc.util.*; -import mindustry.content.*; -import mindustry.type.*; - -import static mindustry.content.UnitTypes.*; - -public class DefaultWaves{ - private Seq spawns; - - public Seq get(){ - if(spawns == null && dagger != null){ - spawns = Seq.with( - new SpawnGroup(dagger){{ - end = 10; - unitScaling = 2f; - }}, - - new SpawnGroup(crawler){{ - begin = 4; - end = 13; - unitAmount = 2; - unitScaling = 1.5f; - }}, - - new SpawnGroup(flare){{ - begin = 12; - end = 16; - unitScaling = 1f; - }}, - - new SpawnGroup(dagger){{ - begin = 11; - unitScaling = 1.7f; - spacing = 2; - max = 4; - }}, - - new SpawnGroup(pulsar){{ - begin = 13; - spacing = 3; - unitScaling = 0.5f; - }}, - - new SpawnGroup(mace){{ - begin = 7; - spacing = 3; - unitScaling = 2; - - end = 30; - }}, - - new SpawnGroup(dagger){{ - begin = 8; - unitScaling = 1; - unitAmount = 4; - spacing = 2; - }}, - - new SpawnGroup(mace){{ - begin = 28; - spacing = 3; - unitScaling = 1; - end = 40; - }}, - - new SpawnGroup(mace){{ - begin = 45; - spacing = 3; - unitScaling = 2; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(mace){{ - begin = 120; - spacing = 2; - unitScaling = 3; - unitAmount = 5; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(flare){{ - begin = 16; - unitScaling = 1; - spacing = 2; - }}, - - new SpawnGroup(dagger){{ - begin = 82; - spacing = 3; - unitAmount = 4; - unitScaling = 3; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(dagger){{ - begin = 41; - spacing = 5; - unitAmount = 1; - unitScaling = 3; - effect = StatusEffects.shielded; - }}, - - new SpawnGroup(fortress){{ - begin = 40; - spacing = 5; - unitAmount = 2; - unitScaling = 2; - max = 20; - }}, - - new SpawnGroup(dagger){{ - begin = 35; - spacing = 3; - unitAmount = 4; - effect = StatusEffects.overdrive; - items = new ItemStack(Items.blastCompound, 60); - end = 60; - }}, - - new SpawnGroup(dagger){{ - begin = 42; - spacing = 3; - unitAmount = 4; - effect = StatusEffects.overdrive; - items = new ItemStack(Items.pyratite, 100); - end = 130; - }}, - - new SpawnGroup(horizon){{ - begin = 40; - unitAmount = 2; - spacing = 2; - unitScaling = 2; - }}, - - new SpawnGroup(flare){{ - begin = 50; - unitAmount = 4; - unitScaling = 3; - spacing = 5; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(zenith){{ - begin = 50; - unitAmount = 2; - unitScaling = 3; - spacing = 5; - max = 16; - }}, - - new SpawnGroup(horizon){{ - begin = 53; - unitAmount = 2; - unitScaling = 3; - spacing = 4; - }}, - - new SpawnGroup(atrax){{ - begin = 31; - unitAmount = 4; - unitScaling = 1; - spacing = 3; - }}, - - new SpawnGroup(scepter){{ - begin = 41; - unitAmount = 1; - unitScaling = 1; - spacing = 30; - }}, - - new SpawnGroup(reign){{ - begin = 81; - unitAmount = 1; - unitScaling = 1; - spacing = 40; - }}, - - new SpawnGroup(antumbra){{ - begin = 131; - unitAmount = 1; - unitScaling = 1; - spacing = 40; - }}, - - new SpawnGroup(horizon){{ - begin = 90; - unitAmount = 2; - unitScaling = 3; - spacing = 4; - }} - ); - } - return spawns == null ? new Seq<>() : spawns; - } - - //TODO move elsewhere - public static Seq generate(){ - UnitType[][] species = { - {dagger, mace, fortress, scepter, reign}, - {nova, pulsar, quasar, vela, corvus}, - {crawler, atrax, spiroct, arkyid, toxopid}, - //{risso, minke, bryde, sei, omura}, //questionable choices - //{mono, poly, mega, quad, oct}, //do not attack - {flare, horizon, zenith, antumbra, eclipse} - }; - - //required progression: - //- extra periodic patterns - - Seq out = new Seq<>(); - - //max reasonable wave, after which everything gets boring - int cap = 400; - - //main sequence - float shieldStart = 30, shieldsPerWave = 12; - UnitType[] curSpecies = Structs.random(species); - int curTier = 0; - - for(int i = 0; i < cap;){ - int f = i; - int next = Mathf.random(15, 25); - - float shieldAmount = Math.max((i - shieldStart) * shieldsPerWave, 0); - - //main progression - out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ - unitAmount = f == 0 ? 1 : 10; - begin = f; - end = f + next >= cap ? never : f + next; - max = 16; - unitScaling = Mathf.random(1f, 2f); - shields = shieldAmount; - shieldScaling = shieldsPerWave; - }}); - - //extra progression that tails out, blends in - out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ - unitAmount = 6; - begin = f + next; - end = f + next + Mathf.random(8, 12); - max = 10; - unitScaling = Mathf.random(2f); - spacing = Mathf.random(2, 3); - shields = shieldAmount; - shieldScaling = shieldsPerWave; - }}); - - i += next; - if(curTier < 3 || Mathf.chance(0.2)){ - curTier ++; - } - - //do not spawn bosses - curTier = Math.min(curTier, 3); - - //small chance to switch species - if(Mathf.chance(0.2)){ - curSpecies = Structs.random(species); - } - } - - - - return out; - } -} diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index fbfa0ab032..61faeaffd0 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -1,11 +1,12 @@ package mindustry.game; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.core.GameState.*; import mindustry.ctype.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.net.*; +import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.world.*; @@ -17,14 +18,13 @@ public class EventType{ phaseDeflectHit, impactPower, thoriumReactorOverheat, - itemLaunch, fireExtinguish, + acceleratorUse, newGame, tutorialComplete, flameAmmo, turretCool, enablePixelation, - drown, exclusionDeath, suicideBomb, openWiki, @@ -35,7 +35,13 @@ public class EventType{ preDraw, postDraw, uiDrawBegin, - uiDrawEnd + uiDrawEnd, + //before/after bloom used, skybox or planets drawn + universeDrawBegin, + //skybox drawn and bloom is enabled - use Vars.renderer.planets + universeDraw, + //planets drawn and bloom disabled + universeDrawEnd } public static class WinEvent{} @@ -59,8 +65,12 @@ public class EventType{ public static class CoreItemDeliverEvent{} /** Called when the player opens info for a specific block.*/ public static class BlockInfoEvent{} + /** Called *after* all content has been initialized. */ + public static class ContentInitEvent{} /** Called when the client game is first loaded. */ public static class ClientLoadEvent{} + /** Called *after* all the modded files have been added into Vars.tree */ + public static class FileTreeInitEvent{} /** Called when a game begins and the world is loaded. */ public static class WorldLoadEvent{} @@ -73,6 +83,15 @@ public class EventType{ } } + /** Called when a sector is destroyed by waves when you're not there. */ + public static class SectorInvasionEvent{ + public final Sector sector; + + public SectorInvasionEvent(Sector sector){ + this.sector = sector; + } + } + public static class LaunchItemEvent{ public final ItemStack stack; @@ -81,6 +100,22 @@ public class EventType{ } } + public static class SectorLaunchEvent{ + public final Sector sector; + + public SectorLaunchEvent(Sector sector){ + this.sector = sector; + } + } + + public static class SchematicCreateEvent{ + public final Schematic schematic; + + public SchematicCreateEvent(Schematic schematic){ + this.schematic = schematic; + } + } + public static class CommandIssueEvent{ public final Building tile; public final UnitCommand command; @@ -172,6 +207,34 @@ public class EventType{ } } + public static class PickupEvent{ + public final Unit carrier; + public final @Nullable Unit unit; + public final @Nullable Building build; + + public PickupEvent(Unit carrier, Unit unit){ + this.carrier = carrier; + this.unit = unit; + this.build = null; + } + + public PickupEvent(Unit carrier, Building build){ + this.carrier = carrier; + this.build = build; + this.unit = null; + } + } + + public static class UnitControlEvent{ + public final Player player; + public final @Nullable Unit unit; + + public UnitControlEvent(Player player, @Nullable Unit unit){ + this.player = player; + this.unit = unit; + } + } + public static class GameOverEvent{ public final Team winner; @@ -180,11 +243,31 @@ public class EventType{ } } - public static class TileChangeEvent{ - public final Tile tile; + /** + * Called *before* a tile has changed. + * WARNING! This event is special: its instance is reused! Do not cache or use with a timer. + * Do not modify any tiles inside listeners that use this tile. + * */ + public static class TilePreChangeEvent{ + public Tile tile; - public TileChangeEvent(Tile tile){ + public TilePreChangeEvent set(Tile tile){ this.tile = tile; + return this; + } + } + + /** + * Called *after* a tile has changed. + * WARNING! This event is special: its instance is reused! Do not cache or use with a timer. + * Do not modify any tiles inside listeners that use this tile. + * */ + public static class TileChangeEvent{ + public Tile tile; + + public TileChangeEvent set(Tile tile){ + this.tile = tile; + return this; } } @@ -214,17 +297,19 @@ public class EventType{ } /** - * Called when block building begins by placing down the BuildBlock. - * The tile's block will nearly always be a BuildBlock. + * Called when block building begins by placing down the ConstructBlock. + * The tile's block will nearly always be a ConstructBlock. */ public static class BlockBuildBeginEvent{ public final Tile tile; public final Team team; + public final @Nullable Unit unit; public final boolean breaking; - public BlockBuildBeginEvent(Tile tile, Team team, boolean breaking){ + public BlockBuildBeginEvent(Tile tile, Team team, Unit unit, boolean breaking){ this.tile = tile; this.team = team; + this.unit = unit; this.breaking = breaking; } } @@ -247,15 +332,15 @@ public class EventType{ /** * Called when a player or drone begins building something. - * This does not necessarily happen when a new BuildBlock is created. + * This does not necessarily happen when a new ConstructBlock is created. */ public static class BuildSelectEvent{ public final Tile tile; public final Team team; - public final Builderc builder; + public final Unit builder; public final boolean breaking; - public BuildSelectEvent(Tile tile, Team team, Builderc builder, boolean breaking){ + public BuildSelectEvent(Tile tile, Team team, Unit builder, boolean breaking){ this.tile = tile; this.team = team; this.builder = builder; @@ -289,10 +374,22 @@ public class EventType{ } } + /** Called when a unit is created in a reconstructor or factory. */ public static class UnitCreateEvent{ public final Unit unit; + public final Building spawner; - public UnitCreateEvent(Unit unit){ + public UnitCreateEvent(Unit unit, Building spawner){ + this.unit = unit; + this.spawner = spawner; + } + } + + /** Called when a unit is dumped from any payload block. */ + public static class UnitUnloadEvent{ + public final Unit unit; + + public UnitUnloadEvent(Unit unit){ this.unit = unit; } } @@ -307,6 +404,26 @@ public class EventType{ } } + /** Called when a connection is established to a client. */ + public static class ConnectionEvent{ + public final NetConnection connection; + + public ConnectionEvent(NetConnection connection){ + this.connection = connection; + } + } + + /** Called when a player sends a connection packet. */ + public static class ConnectPacketEvent{ + public final NetConnection connection; + public final ConnectPacket packet; + + public ConnectPacketEvent(NetConnection connection, ConnectPacket packet){ + this.connection = connection; + this.packet = packet; + } + } + /** Called after connecting; when a player receives world data and is ready to play.*/ public static class PlayerJoin{ public final Player player; @@ -334,18 +451,24 @@ public class EventType{ } public static class PlayerBanEvent{ + @Nullable public final Player player; + public final String uuid; - public PlayerBanEvent(Player player){ + public PlayerBanEvent(Player player, String uuid){ this.player = player; + this.uuid = uuid; } } public static class PlayerUnbanEvent{ + @Nullable public final Player player; + public final String uuid; - public PlayerUnbanEvent(Player player){ + public PlayerUnbanEvent(Player player, String uuid){ this.player = player; + this.uuid = uuid; } } diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/GameStats.java similarity index 52% rename from core/src/mindustry/game/Stats.java rename to core/src/mindustry/game/GameStats.java index 1d175607ba..19d404c802 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/GameStats.java @@ -6,7 +6,7 @@ import mindustry.type.*; //TODO more stats: //- units constructed -public class Stats{ +public class GameStats{ /** Total items delivered to global resoure counter. Campaign only. */ public ObjectIntMap itemsDelivered = new ObjectIntMap<>(); /** Enemy (red team) units destroyed. */ @@ -22,37 +22,12 @@ public class Stats{ /** Friendly buildings destroyed. */ public int buildingsDestroyed; - //TODO fix - public RankResult calculateRank(Sector zone, boolean launched){ + //unused + public RankResult calculateRank(Sector sector){ float score = 0; - //TODO implement wave/attack mode based score - /* - if(launched && zone.getRules().attackMode){ - score += 3f; - }else if(wavesLasted >= zone.conditionWave){ - //each new launch period adds onto the rank 'points' - score += (float)((wavesLasted - zone.conditionWave) / zone.launchPeriod + 1) * 1.2f; - }*/ - - //TODO implement - int capacity = 3000;//zone.loadout.findCore().itemCapacity; - - //weigh used fractions - float frac = 0f; - Seq obtainable = zone.save == null ? new Seq<>() : zone.save.meta.secinfo.resources.select(i -> i instanceof Item).as(); - for(Item item : obtainable){ - frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; - } - - score += frac * 1.6f; - - if(!launched){ - score *= 0.5f; - } - - int rankIndex = Mathf.clamp((int)(score), 0, Rank.values().length - 1); - Rank rank = Rank.values()[rankIndex]; + int rankIndex = Mathf.clamp((int)score, 0, Rank.all.length - 1); + Rank rank = Rank.all[rankIndex]; String sign = Math.abs((rankIndex + 0.5f) - score) < 0.2f || rank.name().contains("S") ? "" : (rankIndex + 0.5f) < score ? "-" : "+"; return new RankResult(rank, sign); @@ -70,6 +45,8 @@ public class Stats{ } public enum Rank{ - F, D, C, B, A, S, SS + F, D, C, B, A, S, SS; + + public static final Rank[] all = values(); } } diff --git a/core/src/mindustry/game/Gamemode.java b/core/src/mindustry/game/Gamemode.java index 9de5e71052..a83fcd3e8d 100644 --- a/core/src/mindustry/game/Gamemode.java +++ b/core/src/mindustry/game/Gamemode.java @@ -2,6 +2,7 @@ package mindustry.game; import arc.*; import arc.func.*; +import arc.util.*; import mindustry.maps.*; import static mindustry.Vars.*; @@ -22,8 +23,7 @@ public enum Gamemode{ rules.waves = true; rules.waveTimer = true; - rules.waveSpacing /= 2f; - rules.teams.get(rules.waveTeam).ai = true; + rules.waveSpacing = 60f * Time.toMinutes; rules.teams.get(rules.waveTeam).infiniteResources = true; }, map -> map.teams.contains(state.rules.waveTeam.id)), pvp(rules -> { @@ -32,7 +32,6 @@ public enum Gamemode{ rules.buildCostMultiplier = 1f; rules.buildSpeedMultiplier = 1f; rules.unitBuildSpeedMultiplier = 2f; - rules.unitHealthMultiplier = 3f; rules.attackMode = true; }, map -> map.teams.size > 1), editor(true, rules -> { diff --git a/core/src/mindustry/game/Objectives.java b/core/src/mindustry/game/Objectives.java index 535f1d3e13..31fc92e1b3 100644 --- a/core/src/mindustry/game/Objectives.java +++ b/core/src/mindustry/game/Objectives.java @@ -28,7 +28,28 @@ public class Objectives{ } } - public static class SectorComplete extends SectorObjective{ + public static class Produce implements Objective{ + public UnlockableContent content; + + public Produce(UnlockableContent content){ + this.content = content; + } + + protected Produce(){} + + @Override + public boolean complete(){ + return content.unlocked(); + } + + @Override + public String display(){ + return Core.bundle.format("requirement.produce", content.emoji() + " " + content.localizedName); + } + } + + public static class SectorComplete implements Objective{ + public SectorPreset preset; public SectorComplete(SectorPreset zone){ this.preset = zone; @@ -38,7 +59,7 @@ public class Objectives{ @Override public boolean complete(){ - return preset.sector.isCaptured(); + return preset.sector.save != null && (!preset.sector.isAttacked() || preset.sector.info.wasCaptured) && preset.sector.hasBase(); } @Override @@ -47,11 +68,6 @@ public class Objectives{ } } - //TODO merge - public abstract static class SectorObjective implements Objective{ - public SectorPreset preset; - } - /** Defines a specific objective for a game. */ public interface Objective{ @@ -66,9 +82,5 @@ public class Objectives{ default void build(Table table){ } - - default SectorPreset zone(){ - return this instanceof SectorObjective ? ((SectorObjective)this).preset : null; - } } } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index ac302a9754..093a09f722 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -2,7 +2,7 @@ package mindustry.game; import arc.graphics.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.serialization.*; import arc.util.serialization.Json.*; import mindustry.content.*; @@ -10,6 +10,8 @@ import mindustry.io.*; import mindustry.type.*; import mindustry.type.Weather.*; import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; /** * Defines current rules on how the game should function. @@ -28,17 +30,17 @@ public class Rules{ public boolean pvp; /** Whether to pause the wave timer until all enemies are destroyed. */ public boolean waitEnemies = false; - /** Determinates if gamemode is attack mode */ + /** Determinates if gamemode is attack mode. */ public boolean attackMode = false; /** Whether this is the editor gamemode. */ public boolean editor = false; - /** Whether the tutorial is enabled. False by default. */ - public boolean tutorial = false; /** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */ public boolean canGameOver = true; + /** Whether cores change teams when they are destroyed. */ + public boolean coreCapture = false; /** Whether reactors can explode and damage other blocks. */ public boolean reactorExplosions = true; - /** Whether schematics are allowed */ + /** Whether schematics are allowed. */ public boolean schematicsAllowed = true; /** Whether friendly explosions can occur and set fire/damage other blocks. */ public boolean damageExplosions = true; @@ -46,12 +48,14 @@ public class Rules{ public boolean fire = true; /** Whether units use and require ammo. */ public boolean unitAmmo = false; + /** Whether cores add to unit limit */ + public boolean unitCapVariable = true; /** How fast unit pads build units. */ public float unitBuildSpeedMultiplier = 1f; - /** How much health units start with. */ - public float unitHealthMultiplier = 1f; /** How much damage any other units deal. */ public float unitDamageMultiplier = 1f; + /** Whether to allow units to build with logic. */ + public boolean logicUnitBuild = true; /** How much health blocks start with. */ public float blockHealthMultiplier = 1f; /** How much damage blocks (turrets) deal. */ @@ -60,28 +64,36 @@ public class Rules{ public float buildCostMultiplier = 1f; /** Multiplier for building speed. */ public float buildSpeedMultiplier = 1f; - /** Multiplier for percentage of materials refunded when deconstructing */ + /** Multiplier for percentage of materials refunded when deconstructing. */ public float deconstructRefundMultiplier = 0.5f; /** No-build zone around enemy core radius. */ public float enemyCoreBuildRadius = 400f; /** Radius around enemy wave drop zones.*/ public float dropZoneRadius = 300f; /** Time between waves in ticks. */ - public float waveSpacing = 60 * 60 * 2; + public float waveSpacing = 2 * Time.toMinutes; /** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */ public int winWave = 0; /** Base unit cap. Can still be increased by blocks. */ public int unitCap = 0; - /** Sector for saves that have them.*/ + /** Environmental flags that dictate visuals & how blocks function. */ + public int environment = Env.terrestrial | Env.spores | Env.groundOil | Env.groundWater; + /** Attributes of the environment. */ + public Attributes attributes = new Attributes(); + /** Sector for saves that have them. */ public @Nullable Sector sector; /** Spawn layout. */ public Seq spawns = new Seq<>(); - /** Starting items put in cores */ + /** Starting items put in cores. */ public Seq loadout = ItemStack.list(Items.copper, 100); /** Weather events that occur here. */ public Seq weather = new Seq<>(1); /** Blocks that cannot be placed. */ public ObjectSet bannedBlocks = new ObjectSet<>(); + /** Reveals blocks normally hidden by build visibility. */ + public ObjectSet revealedBlocks = new ObjectSet<>(); + /** Unlocked content names. Only used in multiplayer when the campaign is enabled. */ + public ObjectSet researched = new ObjectSet<>(); /** Whether ambient lighting is enabled. */ public boolean lighting = false; /** Whether enemy lighting is visible. @@ -89,21 +101,25 @@ public class Rules{ public boolean enemyLights = true; /** Ambient light color, used when lighting is enabled. */ public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f); - /** team of the player by default */ + /** team of the player by default. */ public Team defaultTeam = Team.sharded; - /** team of the enemy in waves/sectors */ + /** team of the enemy in waves/sectors. */ public Team waveTeam = Team.crux; /** name of the custom mode that this ruleset describes, or null. */ public @Nullable String modeName; - /** special tags for additional info */ + /** Whether cores incinerate items when full, just like in the campaign. */ + public boolean coreIncinerates = false; + /** special tags for additional info. */ public StringMap tags = new StringMap(); /** A team-specific ruleset. */ public static class TeamRule{ /** Whether to use building AI. */ public boolean ai; - /** TODO Tier of blocks/designs that the AI uses for building. [0, 1]*/ - public float aiTier = 0f; + /** TODO Tier of blocks/designs that the AI uses for building. [0, 1] */ + public float aiTier = 1f; + /** Whether, when AI is enabled, ships should be spawned from the core. */ + public boolean aiCoreSpawn = true; /** If true, blocks don't require power or resources. */ public boolean cheat; /** If true, resources are not consumed when building. */ @@ -117,7 +133,7 @@ public class Rules{ return JsonIO.copy(this); } - /** Returns the gamemode that best fits these rules.*/ + /** Returns the gamemode that best fits these rules. */ public Gamemode mode(){ if(pvp){ return Gamemode.pvp; @@ -133,7 +149,7 @@ public class Rules{ } /** A simple map for storing TeamRules in an efficient way without hashing. */ - public static class TeamRules implements Serializable{ + public static class TeamRules implements JsonSerializable{ final TeamRule[] values = new TeamRule[Team.all.length]; public TeamRule get(Team team){ diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 0f7908aa63..b385e38884 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -2,11 +2,10 @@ package mindustry.game; import arc.*; import arc.assets.*; -import arc.struct.*; import arc.files.*; import arc.graphics.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.async.*; import mindustry.*; import mindustry.core.GameState.*; @@ -78,7 +77,6 @@ public class Saves{ } public void update(){ - if(current != null && state.isGame() && !(state.isPaused() && Core.scene.hasDialog())){ if(lastTimestamp != 0){ @@ -87,15 +85,15 @@ public class Saves{ lastTimestamp = Time.millis(); } - if(state.isGame() && !state.gameOver && current != null && current.isAutosave() && !state.rules.tutorial){ + if(state.isGame() && !state.gameOver && current != null && current.isAutosave()){ time += Time.delta; if(time > Core.settings.getInt("saveinterval") * 60){ saving = true; try{ current.save(); - }catch(Throwable e){ - e.printStackTrace(); + }catch(Throwable t){ + Log.err(t); } Time.runTask(3f, () -> saving = false); @@ -216,10 +214,10 @@ public class Saves{ } previewExecutor.submit(() -> { try{ - previewFile().writePNG(renderer.minimap.getPixmap()); + previewFile().writePng(renderer.minimap.getPixmap()); requestedPreview = false; }catch(Throwable t){ - t.printStackTrace(); + Log.err(t); } }); } @@ -336,6 +334,9 @@ public class Saves{ } public void delete(){ + if(SaveIO.backupFileFor(file).exists()){ + SaveIO.backupFileFor(file).delete(); + } file.delete(); saves.remove(this, true); if(this == current){ diff --git a/core/src/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java index 5024ecb132..89556e5881 100644 --- a/core/src/mindustry/game/Schematic.java +++ b/core/src/mindustry/game/Schematic.java @@ -2,7 +2,7 @@ package mindustry.game; import arc.files.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.mod.Mods.*; import mindustry.type.*; @@ -15,6 +15,9 @@ import static mindustry.Vars.*; public class Schematic implements Publishable, Comparable{ public final Seq tiles; + /** These are used for the schematic tag UI. */ + public Seq labels = new Seq<>(); + /** Internal meta tags. */ public StringMap tags; public int width, height; public @Nullable Fi file; @@ -29,7 +32,7 @@ public class Schematic implements Publishable, Comparable{ } public float powerProduction(){ - return tiles.sumf(s -> s.block instanceof PowerGenerator ? ((PowerGenerator)s.block).powerProduction : 0f); + return tiles.sumf(s -> s.block instanceof PowerGenerator p ? p.powerProduction : 0f); } public float powerConsumption(){ @@ -62,6 +65,10 @@ public class Schematic implements Publishable, Comparable{ return tags.get("name", "unknown"); } + public String description(){ + return tags.get("description", ""); + } + public void save(){ schematics.saveChanges(this); } @@ -90,7 +97,7 @@ public class Schematic implements Publishable, Comparable{ @Override public String steamDescription(){ - return null; + return description(); } @Override diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 672f0a23b5..f21381802c 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -9,7 +9,6 @@ import arc.graphics.gl.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import arc.util.io.Streams.*; @@ -17,6 +16,7 @@ import arc.util.pooling.*; import arc.util.serialization.*; import mindustry.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; @@ -26,13 +26,14 @@ import mindustry.input.*; import mindustry.input.Placement.*; import mindustry.io.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; import mindustry.world.blocks.storage.*; +import mindustry.world.meta.*; import java.io.*; import java.util.zip.*; @@ -61,19 +62,9 @@ public class Schematics implements Loadable{ private long lastClearTime; public Schematics(){ - Events.on(DisposeEvent.class, e -> { - previews.each((schem, m) -> m.dispose()); - previews.clear(); - shadowBuffer.dispose(); - if(errorTexture != null){ - errorTexture.dispose(); - } - }); Events.on(ClientLoadEvent.class, event -> { - Pixmap pixmap = Core.atlas.getPixmap("error").crop(); - errorTexture = new Texture(pixmap); - pixmap.dispose(); + errorTexture = new Texture("sprites/error.png"); }); } @@ -107,13 +98,10 @@ public class Schematics implements Loadable{ if(shadowBuffer == null){ Core.app.post(() -> shadowBuffer = new FrameBuffer(maxSchematicSize + padding + 8, maxSchematicSize + padding + 8)); } - - //load base schematics - bases.load(); } private void loadLoadouts(){ - Seq.with(Loadouts.basicShard, Loadouts.basicFoundation, Loadouts.basicNucleus).each(s -> checkLoadout(s,false)); + Seq.with(Loadouts.basicShard, Loadouts.basicFoundation, Loadouts.basicNucleus).each(s -> checkLoadout(s, false)); } public void overwrite(Schematic target, Schematic newSchematic){ @@ -129,9 +117,13 @@ public class Schematics implements Loadable{ newSchematic.tags.putAll(target.tags); newSchematic.file = target.file; + loadouts.each((block, list) -> list.remove(target)); + checkLoadout(target, true); + try{ write(newSchematic, target.file); }catch(Exception e){ + Log.err("Failed to overwrite schematic '@' (@)", newSchematic.name(), target.file); Log.err(e); ui.showException(e); } @@ -152,6 +144,7 @@ public class Schematics implements Loadable{ return s; }catch(Throwable e){ + Log.err("Failed to read schematic from file '@'", file); Log.err(e); } return null; @@ -177,7 +170,7 @@ public class Schematics implements Loadable{ Draw.flush(); buffer.begin(); Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(0, 0, buffer.getWidth(), buffer.getHeight()); - file.writePNG(pixmap); + file.writePng(pixmap); buffer.end(); } @@ -187,6 +180,7 @@ public class Schematics implements Loadable{ try{ return getBuffer(schematic).getTexture(); }catch(Throwable t){ + Log.err("Failed to get preview for schematic '@' (@)", schematic.name(), schematic.file); Log.err(t); errored.add(schematic); return errorTexture; @@ -258,10 +252,10 @@ public class Schematics implements Loadable{ requests.each(req -> { req.animScale = 1f; req.worldContext = false; - req.block.drawRequestRegion(req, requests::each); + req.block.drawRequestRegion(req, requests); }); - requests.each(req -> req.block.drawRequestConfigTop(req, requests::each)); + requests.each(req -> req.block.drawRequestConfigTop(req, requests)); Draw.flush(); Draw.trans().idt(); @@ -280,7 +274,7 @@ public class Schematics implements Loadable{ /** Creates an array of build requests from a schematic's data, centered on the provided x+y coordinates. */ public Seq toRequests(Schematic schem, int x, int y){ return schem.tiles.map(t -> new BuildPlan(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block, t.config).original(t.x, t.y, schem.width, schem.height)) - .removeAll(s -> !s.block.isVisible() || !s.block.unlockedNow()); + .removeAll(s -> (!s.block.isVisible() && !(s.block instanceof CoreBlock)) || !s.block.unlockedNow()).sort(Structs.comparingInt(s -> -s.block.schematicPriority)); } /** @return all the valid loadouts for a specific core type. */ @@ -288,12 +282,18 @@ public class Schematics implements Loadable{ return loadouts.get(block, Seq::new); } + public ObjectMap> getLoadouts(){ + return loadouts; + } + /** Checks a schematic for deployment validity and adds it to the cache. */ private void checkLoadout(Schematic s, boolean validate){ Stile core = s.tiles.find(t -> t.block instanceof CoreBlock); + int cores = s.tiles.count(t -> t.block instanceof CoreBlock); //make sure a core exists, and that the schematic is small enough. - if(core == null || (validate && (s.width > core.block.size + maxLoadoutSchematicPad *2 || s.height > core.block.size + maxLoadoutSchematicPad *2))) return; + if(core == null || (validate && (s.width > core.block.size + maxLoadoutSchematicPad *2 || s.height > core.block.size + maxLoadoutSchematicPad *2 + || s.tiles.contains(t -> t.block.buildVisibility == BuildVisibility.sandboxOnly || !t.block.unlocked()) || cores > 1))) return; //place in the cache loadouts.get((CoreBlock)core.block, Seq::new).add(s); @@ -346,10 +346,11 @@ public class Schematics implements Loadable{ for(int cx = x; cx <= x2; cx++){ for(int cy = y; cy <= y2; cy++){ Building linked = world.build(cx, cy); + Block realBlock = linked == null ? null : linked instanceof ConstructBuild cons ? cons.current : linked.block; - if(linked != null && linked.block.isVisible() && !(linked.block instanceof ConstructBlock)){ - int top = linked.block.size/2; - int bot = linked.block.size % 2 == 1 ? -linked.block.size/2 : -(linked.block.size - 1)/2; + if(linked != null && realBlock != null && (realBlock.isVisible() || realBlock instanceof CoreBlock)){ + int top = realBlock.size/2; + int bot = realBlock.size % 2 == 1 ? -realBlock.size/2 : -(realBlock.size - 1)/2; minx = Math.min(linked.tileX() + bot, minx); miny = Math.min(linked.tileY() + bot, miny); maxx = Math.max(linked.tileX() + top, maxx); @@ -374,12 +375,13 @@ public class Schematics implements Loadable{ for(int cx = ox; cx <= ox2; cx++){ for(int cy = oy; cy <= oy2; cy++){ Building tile = world.build(cx, cy); + Block realBlock = tile == null ? null : tile instanceof ConstructBuild cons ? cons.current : tile.block; - if(tile != null && !counted.contains(tile.pos()) && !(tile.block instanceof ConstructBlock) - && (tile.block.isVisible() || (tile.block instanceof CoreBlock))){ - Object config = tile.config(); + if(tile != null && !counted.contains(tile.pos()) && realBlock != null + && (realBlock.isVisible() || realBlock instanceof CoreBlock)){ + Object config = tile instanceof ConstructBuild cons ? cons.lastConfig : tile.config(); - tiles.add(new Stile(tile.block, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); + tiles.add(new Stile(realBlock, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); counted.add(tile.pos()); } } @@ -411,13 +413,27 @@ public class Schematics implements Loadable{ } public static void placeLoadout(Schematic schem, int x, int y, Team team, Block resource){ + placeLoadout(schem, x, y, team, resource, true); + } + + public static void placeLoadout(Schematic schem, int x, int y, Team team, Block resource, boolean check){ Stile coreTile = schem.tiles.find(s -> s.block instanceof CoreBlock); + Seq seq = new Seq<>(); if(coreTile == null) throw new IllegalArgumentException("Loadout schematic has no core tile!"); int ox = x - coreTile.x, oy = y - coreTile.y; - schem.tiles.each(st -> { + schem.tiles.copy().sort(s -> -s.block.schematicPriority).each(st -> { Tile tile = world.tile(st.x + ox, st.y + oy); if(tile == null) return; + //check for blocks that are in the way. + if(check && !(st.block instanceof CoreBlock)){ + seq.clear(); + tile.getLinkedTilesAs(st.block, seq); + if(seq.contains(t -> !t.block().alwaysReplace && !t.synthetic())){ + return; + } + } + tile.setBlock(st.block, team, st.rotation); Object config = st.config; @@ -479,11 +495,19 @@ public class Schematics implements Loadable{ short width = stream.readShort(), height = stream.readShort(); StringMap map = new StringMap(); - byte tags = stream.readByte(); + int tags = stream.readUnsignedByte(); for(int i = 0; i < tags; i++){ map.put(stream.readUTF(), stream.readUTF()); } + String[] labels = null; + + //try to read the categories, but skip if it fails + try{ + labels = JsonIO.read(String[].class, map.get("labels", "[]")); + }catch(Exception ignored){ + } + IntMap blocks = new IntMap<>(); byte length = stream.readByte(); for(int i = 0; i < length; i++){ @@ -504,7 +528,9 @@ public class Schematics implements Loadable{ } } - return new Schematic(tiles, map, width, height); + Schematic out = new Schematic(tiles, map, width, height); + if(labels != null) out.labels.addAll(labels); + return out; } } @@ -521,6 +547,8 @@ public class Schematics implements Loadable{ stream.writeShort(schematic.width); stream.writeShort(schematic.height); + schematic.tags.put("labels", JsonIO.write(schematic.labels.toArray(String.class))); + stream.writeByte(schematic.tags.size); for(ObjectMap.Entry e : schematic.tags.entries()){ stream.writeUTF(e.key); @@ -609,8 +637,8 @@ public class Schematics implements Loadable{ wx = wy; wy = -x; } - req.x = (short)(world.toTile(wx - req.block.offset) + ox); - req.y = (short)(world.toTile(wy - req.block.offset) + oy); + req.x = (short)(World.toTile(wx - req.block.offset) + ox); + req.y = (short)(World.toTile(wy - req.block.offset) + oy); req.rotation = (byte)Mathf.mod(req.rotation + direction, 4); }); diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index cb6197d879..06dd82a59c 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -2,15 +2,18 @@ package mindustry.game; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; +import mindustry.maps.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.meta.*; import mindustry.world.modules.*; +import java.util.*; + import static mindustry.Vars.*; public class SectorInfo{ @@ -21,29 +24,82 @@ public class SectorInfo{ /** Core input statistics. */ public ObjectMap production = new ObjectMap<>(); + /** Raw item production statistics. */ + public ObjectMap rawProduction = new ObjectMap<>(); /** Export statistics. */ public ObjectMap export = new ObjectMap<>(); /** Items stored in all cores. */ - public ItemSeq coreItems = new ItemSeq(); + public ItemSeq items = new ItemSeq(); /** The best available core type. */ - public Block bestCoreType = Blocks.air; + public Block bestCoreType = Blocks.coreShard; /** Max storage capacity. */ public int storageCapacity = 0; /** Whether a core is available here. */ public boolean hasCore = true; + /** Whether this sector was ever fully captured. */ + public boolean wasCaptured = false; /** Sector that was launched from. */ public @Nullable Sector origin; /** Launch destination. */ public @Nullable Sector destination; /** Resources known to occur at this sector. */ public Seq resources = new Seq<>(); - /** Time spent at this sector. Do not use unless you know what you're doing. */ - public transient float internalTimeSpent; + /** Whether waves are enabled here. */ + public boolean waves = true; + /** Whether attack mode is enabled here. */ + public boolean attack = false; + /** Whether this sector has any enemy spawns. */ + public boolean hasSpawns = true; + /** Wave # from state */ + public int wave = 1, winWave = -1; + /** Waves this sector can survive if under attack. Based on wave in info. <0 means uncalculated. */ + public int wavesSurvived = -1; + /** Time between waves. */ + public float waveSpacing = 60 * 60 * 2; + /** Damage dealt to sector. */ + public float damage; + /** How many waves have passed while the player was away. */ + public int wavesPassed; + /** Packed core spawn position. */ + public int spawnPosition; + /** How long the player has been playing elsewhere. */ + public float secondsPassed; + /** How many minutes this sector has been captured. */ + public float minutesCaptured; + /** Display name. */ + public @Nullable String name; + /** Displayed icon. */ + public @Nullable String icon; + /** Displayed icon, as content. */ + public @Nullable UnlockableContent contentIcon; + /** Version of generated waves. When it doesn't match, new waves are generated. */ + public int waveVersion = -1; + /** Whether this sector was indicated to the player or not. */ + public boolean shown = false; + + /** Special variables for simulation. */ + public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope, bossHealth, bossDps, curEnemyHealth, curEnemyDps; + /** Wave where first boss shows up. */ + public int bossWave = -1; /** Counter refresh state. */ private transient Interval time = new Interval(); - /** Core item storage to prevent spoofing. */ - private transient int[] lastCoreItems; + /** Core item storage input/output deltas. */ + private @Nullable transient int[] coreDeltas; + /** Core item storage input/output deltas. */ + private @Nullable transient int[] productionDeltas; + + /** Handles core item changes. */ + public void handleCoreItem(Item item, int amount){ + if(coreDeltas == null) coreDeltas = new int[content.items().size]; + coreDeltas[item.id] += amount; + } + + /** Handles raw production stats. */ + public void handleProduction(Item item, int amount){ + if(productionDeltas == null) productionDeltas = new int[content.items().size]; + productionDeltas[item.id] += amount; + } /** @return the real location items go when launched on this sector */ public Sector getRealDestination(){ @@ -70,26 +126,86 @@ public class SectorInfo{ return export.get(item, ExportStat::new).mean; } + /** Write contents of meta into main storage. */ + public void write(){ + //enable attack mode when there's a core. + if(state.rules.waveTeam.core() != null){ + attack = true; + winWave = 0; + } + + //if there are infinite waves and no win wave, add a win wave. + if(winWave <= 0 && !attack){ + winWave = 30; + } + + state.wave = wave; + state.rules.waves = waves; + state.rules.waveSpacing = waveSpacing; + state.rules.winWave = winWave; + state.rules.attackMode = attack; + + //assign new wave patterns when the version changes + if(waveVersion != Waves.waveVersion && state.rules.sector.preset == null){ + state.rules.spawns = Waves.generate(state.rules.sector.threat); + } + + CoreBuild entity = state.rules.defaultTeam.core(); + if(entity != null){ + entity.items.clear(); + entity.items.add(items); + //ensure capacity. + entity.items.each((i, a) -> entity.items.set(i, Mathf.clamp(a, 0, entity.storageCapacity))); + } + } + /** Prepare data for writing to a save. */ public void prepare(){ //update core items - coreItems.clear(); + items.clear(); CoreBuild entity = state.rules.defaultTeam.core(); if(entity != null){ ItemModule items = entity.items; for(int i = 0; i < items.length(); i++){ - coreItems.set(content.item(i), items.get(i)); + this.items.set(content.item(i), items.get(i)); } + + spawnPosition = entity.pos(); } + waveVersion = Waves.waveVersion; + waveSpacing = state.rules.waveSpacing; + wave = state.wave; + winWave = state.rules.winWave; + waves = state.rules.waves; + attack = state.rules.attackMode; hasCore = entity != null; bestCoreType = !hasCore ? Blocks.air : state.rules.defaultTeam.cores().max(e -> e.block.size).block; storageCapacity = entity != null ? entity.storageCapacity : 0; + secondsPassed = 0; + wavesPassed = 0; + damage = 0; + hasSpawns = spawner.countSpawns() > 0; - //update sector's internal time spent counter - state.rules.sector.setTimeSpent(internalTimeSpent); + //cap production at raw production. + production.each((item, stat) -> { + stat.mean = Math.min(stat.mean, rawProduction.get(item, ExportStat::new).mean); + }); + + var pads = indexer.getAllied(state.rules.defaultTeam, BlockFlag.launchPad); + + //disable export when launch pads are disabled, or there aren't any active ones + if(pads.size() == 0 || !Seq.with(pads).contains(t -> t.build.consValid())){ + export.clear(); + } + + if(state.rules.sector != null){ + state.rules.sector.saveInfo(); + } + + SectorDamage.writeParameters(this); } /** Update averages of various stats, updates some special sector logic. @@ -98,22 +214,6 @@ public class SectorInfo{ //updating in multiplayer as a client doesn't make sense if(net.client()) return; - internalTimeSpent += Time.delta; - - //autorun turns - if(internalTimeSpent >= turnDuration){ - internalTimeSpent = 0; - universe.runTurn(); - } - - //create last stored core items - if(lastCoreItems == null){ - lastCoreItems = new int[content.items().size]; - updateCoreDeltas(); - } - - CoreBuild ent = state.rules.defaultTeam.core(); - //refresh throughput if(time.get(refreshPeriod)){ @@ -125,41 +225,43 @@ public class SectorInfo{ stat.loaded = true; } - //how the resources changed - only interested in negative deltas, since that's what happens during spoofing - int coreDelta = Math.min(ent == null ? 0 : ent.items.get(item) - lastCoreItems[item.id], 0); - //add counter, subtract how many items were taken from the core during this time - stat.means.add(Math.max(stat.counter + coreDelta, 0)); + stat.means.add(Math.max(stat.counter, 0)); stat.counter = 0; stat.mean = stat.means.rawMean(); }); + if(coreDeltas == null) coreDeltas = new int[content.items().size]; + if(productionDeltas == null) productionDeltas = new int[content.items().size]; + //refresh core items for(Item item : content.items()){ - ExportStat stat = production.get(item, ExportStat::new); - if(!stat.loaded){ - stat.means.fill(stat.mean); - stat.loaded = true; + updateDelta(item, production, coreDeltas); + updateDelta(item, rawProduction, productionDeltas); + + //cap production/export by production + production.get(item).mean = Math.min(production.get(item).mean, rawProduction.get(item).mean); + + if(export.containsKey(item)){ + export.get(item).mean = Math.min(export.get(item).mean, Math.max(rawProduction.get(item).mean, -production.get(item).mean)); } - - //get item delta - //TODO is preventing negative production a good idea? - int delta = Math.max((ent == null ? 0 : ent.items.get(item)) - lastCoreItems[item.id], 0); - - //store means - stat.means.add(delta); - stat.mean = stat.means.rawMean(); } - updateCoreDeltas(); + Arrays.fill(coreDeltas, 0); + Arrays.fill(productionDeltas, 0); } } - private void updateCoreDeltas(){ - CoreBuild ent = state.rules.defaultTeam.core(); - for(int i = 0; i < lastCoreItems.length; i++){ - lastCoreItems[i] = ent == null ? 0 : ent.items.get(i); + void updateDelta(Item item, ObjectMap map, int[] deltas){ + ExportStat stat = map.get(item, ExportStat::new); + if(!stat.loaded){ + stat.means.fill(stat.mean); + stat.loaded = true; } + + //store means + stat.means.add(deltas[item.id]); + stat.mean = stat.means.rawMean(); } public ObjectFloatMap exportRates(){ diff --git a/core/src/mindustry/game/SpawnGroup.java b/core/src/mindustry/game/SpawnGroup.java index 15f7c98fff..2b7e8625c9 100644 --- a/core/src/mindustry/game/SpawnGroup.java +++ b/core/src/mindustry/game/SpawnGroup.java @@ -1,5 +1,6 @@ package mindustry.game; +import arc.util.*; import arc.util.serialization.*; import arc.util.serialization.Json.*; import mindustry.content.*; @@ -8,14 +9,16 @@ import mindustry.gen.*; import mindustry.io.legacy.*; import mindustry.type.*; -import static mindustry.Vars.content; +import java.util.*; + +import static mindustry.Vars.*; /** * A spawn group defines spawn information for a specific type of unit, with optional extra information like * weapon equipped, ammo used, and status effects. * Each spawn group can have multiple sub-groups spawned in different areas of the map. */ -public class SpawnGroup implements Serializable{ +public class SpawnGroup implements JsonSerializable{ public static final int never = Integer.MAX_VALUE; /** The unit type spawned */ @@ -27,7 +30,7 @@ public class SpawnGroup implements Serializable{ /** The spacing, in waves, of spawns. For example, 2 = spawns every other wave */ public int spacing = 1; /** Maximum amount of units that spawn */ - public int max = 100; + public int max = 40; /** How many waves need to pass before the amount of units spawned increases by 1 */ public float unitScaling = never; /** Shield points that this unit has. */ @@ -37,8 +40,10 @@ public class SpawnGroup implements Serializable{ /** Amount of enemies spawned initially, with no scaling */ public int unitAmount = 1; /** Status effect applied to the spawned unit. Null to disable. */ + @Nullable public StatusEffect effect; /** Items this unit spawns with. Null to disable. */ + @Nullable public ItemStack items; public SpawnGroup(UnitType type){ @@ -49,14 +54,20 @@ public class SpawnGroup implements Serializable{ //serialization use only } - /** Returns the amount of units spawned on a specific wave. */ - public int getUnitsSpawned(int wave){ + /** @return amount of units spawned on a specific wave. */ + public int getSpawned(int wave){ + if(spacing == 0) spacing = 1; if(wave < begin || wave > end || (wave - begin) % spacing != 0){ return 0; } return Math.min(unitAmount + (int)(((wave - begin) / spacing) / unitScaling), max); } + /** @return amount of shields each unit has at a specific wave. */ + public float getShield(int wave){ + return Math.max(shields + shieldScaling*(wave - begin), 0); + } + /** * Creates a unit, and assigns correct values based on this group's data. * This method does not add() the unit. @@ -72,7 +83,7 @@ public class SpawnGroup implements Serializable{ unit.addItem(items.item, items.amount); } - unit.shield(Math.max(shields + shieldScaling*(wave - begin), 0)); + unit.shield = getShield(wave); return unit; } @@ -84,12 +95,12 @@ public class SpawnGroup implements Serializable{ if(begin != 0) json.writeValue("begin", begin); if(end != never) json.writeValue("end", end); if(spacing != 1) json.writeValue("spacing", spacing); - //if(max != 40) json.writeValue("max", max); + if(max != 40) json.writeValue("max", max); if(unitScaling != never) json.writeValue("scaling", unitScaling); if(shields != 0) json.writeValue("shields", shields); if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling); if(unitAmount != 1) json.writeValue("amount", unitAmount); - if(effect != null) json.writeValue("effect", effect.id); + if(effect != null) json.writeValue("effect", effect.name); } @Override @@ -101,12 +112,18 @@ public class SpawnGroup implements Serializable{ begin = data.getInt("begin", 0); end = data.getInt("end", never); spacing = data.getInt("spacing", 1); - //max = data.getInt("max", 40); + max = data.getInt("max", 40); unitScaling = data.getFloat("scaling", never); shields = data.getFloat("shields", 0); shieldScaling = data.getFloat("shieldScaling", 0); unitAmount = data.getInt("amount", 1); - effect = content.getByID(ContentType.status, data.getInt("effect", -1)); + + //old boss effect ID + if(data.has("effect") && data.get("effect").isNumber() && data.getInt("effect", -1) == 8){ + effect = StatusEffects.boss; + }else{ + effect = content.getByName(ContentType.status, data.has("effect") && data.get("effect").isString() ? data.getString("effect", "none") : "none"); + } } @Override @@ -123,4 +140,20 @@ public class SpawnGroup implements Serializable{ ", items=" + items + '}'; } + + @Override + public boolean equals(Object o){ + if(this == o) return true; + if(o == null || getClass() != o.getClass()) return false; + SpawnGroup group = (SpawnGroup)o; + return end == group.end && begin == group.begin && spacing == group.spacing && max == group.max + && Float.compare(group.unitScaling, unitScaling) == 0 && Float.compare(group.shields, shields) == 0 + && Float.compare(group.shieldScaling, shieldScaling) == 0 && unitAmount == group.unitAmount && + type == group.type && effect == group.effect && Structs.eq(items, group.items); + } + + @Override + public int hashCode(){ + return Arrays.hashCode(new Object[]{type, end, begin, spacing, max, unitScaling, shields, shieldScaling, unitAmount, effect, items}); + } } diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index 5a416009ff..cbed06f4e7 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -4,7 +4,7 @@ import arc.*; import arc.graphics.*; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.game.Rules.*; import mindustry.game.Teams.*; import mindustry.graphics.*; @@ -31,9 +31,9 @@ public class Team implements Comparable{ Color.valueOf("ffd37f"), Color.valueOf("eab678"), Color.valueOf("d4816b")), crux = new Team(2, "crux", Color.valueOf("f25555"), Color.valueOf("fc8e6c"), Color.valueOf("f25555"), Color.valueOf("a04553")), - green = new Team(3, "green", Color.valueOf("4dd98b")), - purple = new Team(4, "purple", Color.valueOf("9a4bdf")), - blue = new Team(5, "blue", Color.royal.cpy()); + green = new Team(3, "green", Color.valueOf("54d67d")), + purple = new Team(4, "purple", Color.valueOf("995bb0")), + blue = new Team(5, "blue", Color.valueOf("5a4deb")); static{ Mathf.rand.setSeed(8); @@ -83,15 +83,12 @@ public class Team implements Comparable{ return state.rules.teams.get(this); } - public Team[] enemies(){ - return state.teams.enemiesOf(this); - } - public TeamData data(){ return state.teams.get(this); } - public @Nullable CoreBuild core(){ + @Nullable + public CoreBuild core(){ return data().core(); } diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index e513c31fc6..92b85a2481 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -2,15 +2,20 @@ package mindustry.game; import arc.func.*; import arc.math.geom.*; +import arc.struct.Queue; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.*; import mindustry.ai.*; import mindustry.content.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.storage.CoreBlock.*; +import java.util.*; + import static mindustry.Vars.*; /** Class for various team-based utilities. */ @@ -18,28 +23,30 @@ public class Teams{ /** Maps team IDs to team data. */ private TeamData[] map = new TeamData[256]; /** Active teams. */ - private Seq active = new Seq<>(); + public Seq active = new Seq<>(); + /** Teams with block or unit presence. */ + public Seq present = new Seq<>(TeamData.class); + /** Current boss units. */ + public Seq bosses = new Seq<>(); public Teams(){ active.add(get(Team.crux)); } - public @Nullable CoreBuild closestEnemyCore(float x, float y, Team team){ - for(Team enemy : team.enemies()){ + @Nullable + public CoreBuild closestEnemyCore(float x, float y, Team team){ + for(Team enemy : team.data().coreEnemies){ CoreBuild tile = Geometry.findClosest(x, y, enemy.cores()); if(tile != null) return tile; } return null; } - public @Nullable CoreBuild closestCore(float x, float y, Team team){ + @Nullable + public CoreBuild closestCore(float x, float y, Team team){ return Geometry.findClosest(x, y, get(team).cores); } - public Team[] enemiesOf(Team team){ - return get(team).enemies; - } - public boolean eachEnemyCore(Team team, Boolf ret){ for(TeamData data : active){ if(areEnemies(team, data.team)){ @@ -65,9 +72,7 @@ public class Teams{ /** Returns team data by type. */ public TeamData get(Team team){ - if(map[team.id] == null){ - map[team.id] = new TeamData(team); - } + if(map[team.id] == null) map[team.id] = new TeamData(team); return map[team.id]; } @@ -112,13 +117,11 @@ public class Teams{ if(data.active() && !active.contains(data)){ active.add(data); updateEnemies(); - indexer.updateTeamIndex(data.team); } } public void unregisterCore(CoreBuild entity){ TeamData data = get(entity.team); - //remove core data.cores.remove(entity); //unregister in active list if(!data.active()){ @@ -127,6 +130,83 @@ public class Teams{ } } + private void count(Unit unit){ + unit.team.data().updateCount(unit.type, 1); + + if(unit instanceof Payloadc payloadc){ + payloadc.payloads().each(p -> { + if(p instanceof UnitPayload payload){ + count(payload.unit); + } + }); + } + } + + public void updateTeamStats(){ + present.clear(); + bosses.clear(); + + for(Team team : Team.all){ + TeamData data = team.data(); + + data.presentFlag = false; + data.unitCount = 0; + data.units.clear(); + if(data.tree != null){ + data.tree.clear(); + } + + if(data.typeCounts != null){ + Arrays.fill(data.typeCounts, 0); + } + + //clear old unit records + if(data.unitsByType != null){ + for(int i = 0; i < data.unitsByType.length; i++){ + if(data.unitsByType[i] != null){ + data.unitsByType[i].clear(); + } + } + } + } + + //update presence flag. + Groups.build.each(b -> b.team.data().presentFlag = true); + + for(Unit unit : Groups.unit){ + if(unit.type == null) continue; + TeamData data = unit.team.data(); + data.tree().insert(unit); + data.units.add(unit); + data.presentFlag = true; + + if(unit.team == state.rules.waveTeam && unit.isBoss()){ + bosses.add(unit); + } + + if(data.unitsByType == null || data.unitsByType.length <= unit.type.id){ + data.unitsByType = new Seq[content.units().size]; + } + + if(data.unitsByType[unit.type.id] == null){ + data.unitsByType[unit.type.id] = new Seq<>(); + } + + data.unitsByType[unit.type.id].add(unit); + + count(unit); + } + + //update presence of each team. + for(Team team : Team.all){ + TeamData data = team.data(); + + if(data.presentFlag || data.active()){ + present.add(data); + } + } + } + private void updateEnemies(){ if(state.rules.waves && !active.contains(get(state.rules.waveTeam))){ active.add(get(state.rules.waveTeam)); @@ -141,16 +221,19 @@ public class Teams{ } } - data.enemies = enemies.toArray(Team.class); + data.coreEnemies = enemies.toArray(Team.class); } } - public class TeamData{ + public static class TeamData{ public final Seq cores = new Seq<>(); public final Team team; public final BaseAI ai; - public Team[] enemies = {}; + private boolean presentFlag; + + /** Enemies with cores or spawn points. */ + public Team[] coreEnemies = {}; /** Planned blocks for drones. This is usually only blocks that have been broken. */ public Queue blocks = new Queue<>(); /** The current command for units to follow. */ @@ -158,11 +241,54 @@ public class Teams{ /** Target items to mine. */ public Seq mineItems = Seq.with(Items.copper, Items.lead, Items.titanium, Items.thorium); + /** Quadtree for all buildings of this team. Null if not active. */ + @Nullable + public QuadTree buildings; + /** Current unit cap. Do not modify externally. */ + public int unitCap; + /** Total unit count. */ + public int unitCount; + /** Counts for each type of unit. Do not access directly. */ + @Nullable + public int[] typeCounts; + /** Quadtree for units of this team. Do not access directly. */ + @Nullable + public QuadTree tree; + /** Units of this team. Updated each frame. */ + public Seq units = new Seq<>(); + /** Units of this team by type. Updated each frame. */ + @Nullable + public Seq[] unitsByType; + public TeamData(Team team){ this.team = team; this.ai = new BaseAI(this); } + @Nullable + public Seq unitCache(UnitType type){ + if(unitsByType == null || unitsByType.length <= type.id || unitsByType[type.id] == null) return null; + return unitsByType[type.id]; + } + + public void updateCount(UnitType type, int amount){ + if(type == null) return; + unitCount = Math.max(amount + unitCount, 0); + if(typeCounts == null || typeCounts.length <= type.id){ + typeCounts = new int[Vars.content.units().size]; + } + typeCounts[type.id] = Math.max(amount + typeCounts[type.id], 0); + } + + public QuadTree tree(){ + if(tree == null) tree = new QuadTree<>(Vars.world.getQuadBounds(new Rect())); + return tree; + } + + public int countType(UnitType type){ + return typeCounts == null || typeCounts.length <= type.id ? 0 : typeCounts[type.id]; + } + public boolean active(){ return (team == state.rules.waveTeam && state.rules.waves) || cores.size > 0; } @@ -175,7 +301,8 @@ public class Teams{ return cores.isEmpty(); } - public @Nullable CoreBuild core(){ + @Nullable + public CoreBuild core(){ return cores.isEmpty() ? null : cores.first(); } @@ -206,5 +333,16 @@ public class Teams{ this.block = block; this.config = config; } + + @Override + public String toString(){ + return "BlockPlan{" + + "x=" + x + + ", y=" + y + + ", rotation=" + rotation + + ", block=" + block + + ", config=" + config + + '}'; + } } } diff --git a/core/src/mindustry/game/Tutorial.java b/core/src/mindustry/game/Tutorial.java deleted file mode 100644 index e0f73248ed..0000000000 --- a/core/src/mindustry/game/Tutorial.java +++ /dev/null @@ -1,308 +0,0 @@ -package mindustry.game; - -import arc.*; -import arc.struct.*; -import arc.func.*; -import arc.graphics.g2d.*; -import arc.math.*; -import arc.scene.*; -import arc.scene.ui.*; -import arc.scene.ui.layout.*; -import arc.util.*; -import mindustry.content.*; -import mindustry.gen.*; -import mindustry.game.EventType.*; -import mindustry.graphics.*; -import mindustry.type.*; -import mindustry.world.*; - -import static mindustry.Vars.*; - -/** Handles tutorial state. */ -public class Tutorial{ - private static final int mineCopper = 18; - private static final int blocksToBreak = 3, blockOffset = -6; - - ObjectSet events = new ObjectSet<>(); - ObjectIntMap blocksPlaced = new ObjectIntMap<>(); - int sentence; - public TutorialStage stage = TutorialStage.values()[0]; - - public Tutorial(){ - Events.on(BlockBuildEndEvent.class, event -> { - if(!event.breaking){ - blocksPlaced.increment(event.tile.block(), 1); - } - }); - - Events.on(LineConfirmEvent.class, event -> events.add("lineconfirm")); - Events.on(TurretAmmoDeliverEvent.class, event -> events.add("ammo")); - Events.on(CoreItemDeliverEvent.class, event -> events.add("coreitem")); - Events.on(BlockInfoEvent.class, event -> events.add("blockinfo")); - Events.on(DepositEvent.class, event -> events.add("deposit")); - Events.on(WithdrawEvent.class, event -> events.add("withdraw")); - - Events.on(ClientLoadEvent.class, e -> { - for(TutorialStage stage : TutorialStage.values()){ - stage.load(); - } - }); - } - - /** update tutorial state, transition if needed */ - public void update(){ - if(stage.done.get() && !canNext()){ - next(); - }else{ - stage.update(); - } - } - - /** draw UI overlay */ - public void draw(){ - if(!Core.scene.hasDialog()){ - stage.draw(); - } - } - - /** Resets tutorial state. */ - public void reset(){ - stage = TutorialStage.values()[0]; - stage.begin(); - blocksPlaced.clear(); - events.clear(); - sentence = 0; - } - - /** Goes on to the next tutorial step. */ - public void next(){ - stage = TutorialStage.values()[Mathf.clamp(stage.ordinal() + 1, 0, TutorialStage.values().length)]; - stage.begin(); - blocksPlaced.clear(); - events.clear(); - sentence = 0; - } - - public boolean canNext(){ - return sentence + 1 < stage.sentences.size; - } - - public void nextSentence(){ - if(canNext()){ - sentence ++; - } - } - - public boolean canPrev(){ - return sentence > 0; - } - - public void prevSentence(){ - if(canPrev()){ - sentence --; - } - } - - public enum TutorialStage{ - intro( - line -> Core.bundle.format(line, item(Items.copper), mineCopper), - () -> item(Items.copper) >= mineCopper - ), - drill(() -> placed(Blocks.mechanicalDrill, 1)){ - void draw(){ - outline("category-production"); - outline("block-mechanical-drill"); - outline("confirmplace"); - } - }, - blockinfo(() -> event("blockinfo")){ - void draw(){ - outline("category-production"); - outline("block-mechanical-drill"); - outline("blockinfo"); - } - }, - conveyor(() -> placed(Blocks.conveyor, 2) && event("lineconfirm") && event("coreitem")){ - void draw(){ - outline("category-distribution"); - outline("block-conveyor"); - } - }, - turret(() -> placed(Blocks.duo, 1)){ - void draw(){ - outline("category-turret"); - outline("block-duo"); - } - }, - drillturret(() -> event("ammo")), - pause(() -> state.isPaused()){ - void draw(){ - if(mobile){ - outline("pause"); - } - } - }, - unpause(() -> !state.isPaused()){ - void draw(){ - if(mobile){ - outline("pause"); - } - } - }, - breaking(TutorialStage::blocksBroken){ - void begin(){ - placeBlocks(); - } - - void draw(){ - if(mobile){ - outline("breakmode"); - } - } - }, - withdraw(() -> event("withdraw")){ - void begin(){ - state.teams.playerCores().first().items.add(Items.copper, 10); - } - }, - deposit(() -> event("deposit")), - waves(() -> state.wave > 2 && state.enemies <= 0 && !spawner.isSpawning()){ - void begin(){ - state.rules.waveTimer = true; - logic.runWave(); - } - - void update(){ - if(state.wave > 2){ - state.rules.waveTimer = false; - } - } - }, - launch(() -> false){ - void begin(){ - state.rules.waveTimer = false; - state.wave = 5; - - //end tutorial, never show it again - Events.fire(Trigger.tutorialComplete); - Core.settings.put("playedtutorial", true); - } - - void draw(){ - outline("waves"); - } - },; - - protected String line = ""; - protected final Func text; - protected Seq sentences; - protected final Boolp done; - - TutorialStage(Func text, Boolp done){ - this.text = text; - this.done = done; - } - - TutorialStage(Boolp done){ - this(line -> line, done); - } - - /** displayed tutorial stage text.*/ - public String text(){ - if(sentences == null){ - load(); - } - String line = sentences.get(control.tutorial.sentence); - return line.contains("{") ? text.get(line) : line; - } - - void load(){ - this.line = Core.bundle.has("tutorial." + name() + ".mobile") && mobile ? "tutorial." + name() + ".mobile" : "tutorial." + name(); - this.sentences = Seq.select(Core.bundle.get(line).split("\n"), s -> !s.isEmpty()); - } - - /** called every frame when this stage is active.*/ - void update(){ - - } - - /** called when a stage begins.*/ - void begin(){ - - } - - /** called when a stage needs to draw itself, usually over highlighted UI elements. */ - void draw(){ - - } - - //utility - - static void placeBlocks(){ - Building core = state.teams.playerCores().first(); - for(int i = 0; i < blocksToBreak; i++){ - world.tile(core.tile().x + blockOffset, core.tile().y + i).remove(); - world.tile(core.tile().x + blockOffset, core.tile().y + i).setBlock(Blocks.scrapWall, state.rules.defaultTeam); - } - } - - static boolean blocksBroken(){ - Building core = state.teams.playerCores().first(); - - for(int i = 0; i < blocksToBreak; i++){ - if(world.tile(core.tile.x + blockOffset, core.tile.y + i).block() == Blocks.scrapWall){ - return false; - } - } - return true; - } - - static boolean event(String name){ - return control.tutorial.events.contains(name); - } - - static boolean placed(Block block, int amount){ - return placed(block) >= amount; - } - - static int placed(Block block){ - return control.tutorial.blocksPlaced.get(block, 0); - } - - static int item(Item item){ - return state.rules.defaultTeam.data().noCores() ? 0 : state.rules.defaultTeam.core().items.get(item); - } - - static boolean toggled(String name){ - Element element = Core.scene.findVisible(name); - if(element instanceof Button){ - return ((Button)element).isChecked(); - } - return false; - } - - static void outline(String name){ - Element element = Core.scene.findVisible(name); - if(element != null && !toggled(name)){ - element.localToStageCoordinates(Tmp.v1.setZero()); - float sin = Mathf.sin(11f, Scl.scl(4f)); - Lines.stroke(Scl.scl(7f), Pal.place); - Lines.rect(Tmp.v1.x - sin, Tmp.v1.y - sin, element.getWidth() + sin*2, element.getHeight() + sin*2); - - float size = Math.max(element.getWidth(), element.getHeight()) + Mathf.absin(11f/2f, Scl.scl(18f)); - float angle = Angles.angle(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Tmp.v1.x + element.getWidth()/2f, Tmp.v1.y + element.getHeight()/2f); - Tmp.v2.trns(angle + 180f, size*1.4f); - float fs = Scl.scl(40f); - float fs2 = Scl.scl(56f); - - Draw.color(Pal.gray); - Drawf.tri(Tmp.v1.x + element.getWidth()/2f + Tmp.v2.x, Tmp.v1.y + element.getHeight()/2f + Tmp.v2.y, fs2, fs2, angle); - Draw.color(Pal.place); - Tmp.v2.setLength(Tmp.v2.len() - Scl.scl(4)); - Drawf.tri(Tmp.v1.x + element.getWidth()/2f + Tmp.v2.x, Tmp.v1.y + element.getHeight()/2f + Tmp.v2.y, fs, fs, angle); - Draw.reset(); - } - } - } - -} diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index b2c9c7d039..a9215f70d0 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -6,6 +6,9 @@ import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.game.EventType.*; +import mindustry.game.SectorInfo.*; +import mindustry.gen.*; +import mindustry.maps.*; import mindustry.type.*; import mindustry.world.blocks.storage.*; @@ -17,8 +20,9 @@ public class Universe{ private int netSeconds; private float secondCounter; private int turn; + private float turnCounter; - private Schematic lastLoadout; + private @Nullable Schematic lastLoadout; private ItemSeq lastLaunchResources = new ItemSeq(); public Universe(){ @@ -26,7 +30,7 @@ public class Universe{ //update base coverage on capture Events.on(SectorCaptureEvent.class, e -> { - if(state.isCampaign()){ + if(!net.client() && state.isCampaign()){ state.getSector().planet.updateBaseCoverage(); } }); @@ -53,17 +57,19 @@ public class Universe{ } } - /** @return sectors attacked on the current planet, minus the ones that are being played on right now. */ - public Seq getAttacked(Planet planet){ - return planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed() && s.getSecondsPassed() > 1); - } - /** Update planet rotations, global time and relevant state. */ public void update(){ //only update time when not in multiplayer if(!net.client()){ secondCounter += Time.delta / 60f; + turnCounter += Time.delta; + + //auto-run turns + if(turnCounter >= turnDuration){ + turnCounter = 0; + runTurn(); + } if(secondCounter >= 1){ seconds += (int)secondCounter; @@ -79,7 +85,7 @@ public class Universe{ if(state.hasSector()){ //update sector light float light = state.getSector().getLight(); - float alpha = Mathf.clamp(Mathf.map(light, 0f, 0.8f, 0.1f, 1f)); + float alpha = Mathf.clamp(Mathf.map(light, 0f, 0.8f, 0.3f, 1f)); //assign and map so darkness is not 100% dark state.rules.ambientLight.a = 1f - alpha; @@ -87,6 +93,15 @@ public class Universe{ } } + public void clearLoadoutInfo(){ + lastLoadout = null; + lastLaunchResources = new ItemSeq(); + Core.settings.remove("launch-resources-seq"); + Core.settings.remove("lastloadout-core-shard"); + Core.settings.remove("lastloadout-core-nucleus"); + Core.settings.remove("lastloadout-core-foundation"); + } + public ItemSeq getLaunchResources(){ lastLaunchResources = Core.settings.getJson("launch-resources-seq", ItemSeq.class, ItemSeq::new); return lastLaunchResources; @@ -109,6 +124,7 @@ public class Universe{ } /** @return the last selected loadout for this specific core type. */ + @Nullable public Schematic getLoadout(CoreBlock core){ //for tools - schem if(schematics == null) return Loadouts.basicShard; @@ -120,7 +136,7 @@ public class Universe{ Seq all = schematics.getLoadouts(core); Schematic schem = all.find(s -> s.file != null && s.file.nameWithoutExtension().equals(file)); - return schem == null ? all.first() : schem; + return schem == null ? all.any() ? all.first() : null : schem; } /** Runs possible events. Resets event counter. */ @@ -132,41 +148,109 @@ public class Universe{ //update relevant sectors for(Planet planet : content.planets()){ for(Sector sector : planet.sectors){ - if(sector.hasSave()){ - int spent = (int)(sector.getTimeSpent() / 60); - int actuallyPassed = Math.max(newSecondsPassed - spent, 0); + if(sector.hasSave() && sector.hasBase()){ + + //if it is being attacked, capture time is 0; otherwise, increment the timer + if(sector.isAttacked()){ + sector.info.minutesCaptured = 0; + }else{ + sector.info.minutesCaptured += turnDuration / 60 / 60; + } //increment seconds passed for this sector by the time that just passed with this turn if(!sector.isBeingPlayed()){ - sector.setSecondsPassed(sector.getSecondsPassed() + actuallyPassed); + + //increment time if attacked + if(sector.isAttacked()){ + sector.info.secondsPassed += turnDuration/60f; + } + + int wavesPassed = (int)(sector.info.secondsPassed*60f / sector.info.waveSpacing); + boolean attacked = sector.info.waves; + + if(attacked){ + sector.info.wavesPassed = wavesPassed; + } + + float damage = attacked ? SectorDamage.getDamage(sector.info) : 0f; + + //damage never goes down until the player visits the sector, so use max + sector.info.damage = Math.max(sector.info.damage, damage); //check if the sector has been attacked too many times... - if(sector.hasBase() && sector.hasWaves() && sector.getSecondsPassed() * 60f > turnDuration * sectorDestructionTurns){ + if(attacked && damage >= 0.999f){ //fire event for losing the sector Events.fire(new SectorLoseEvent(sector)); - //if so, just delete the save for now. it's lost. - //TODO don't delete it later maybe - sector.save.delete(); - //clear recieved - sector.setExtraItems(new ItemSeq()); - sector.save = null; + //sector is dead. + sector.info.items.clear(); + sector.info.damage = 1f; + sector.info.hasCore = false; + sector.info.production.clear(); + }else if(attacked && wavesPassed > 0 && sector.info.winWave > 1 && sector.info.wave + wavesPassed >= sector.info.winWave && !sector.hasEnemyBase()){ + //autocapture the sector + sector.info.waves = false; + sector.info.wasCaptured = true; + + //fire the event + Events.fire(new SectorCaptureEvent(sector)); } + + float scl = sector.getProductionScale(); + + //export to another sector + if(sector.info.destination != null){ + Sector to = sector.info.destination; + if(to.hasBase()){ + ItemSeq items = new ItemSeq(); + //calculated exported items to this sector + sector.info.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed * scl))); + to.addItems(items); + } + } + + sector.info.export.each((item, amount) -> { + if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0){ + //disable export when production is negative. + sector.info.export.get(item).mean = 0f; + } + }); + + //add production, making sure that it's capped + sector.info.production.each((item, stat) -> sector.info.items.add(item, Math.min((int)(stat.mean * newSecondsPassed * scl), sector.info.storageCapacity - sector.info.items.get(item)))); + //prevent negative values with unloaders + sector.info.items.checkNegative(); + + sector.saveInfo(); } - //export to another sector - if(sector.save != null && sector.save.meta != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.destination != null){ - Sector to = sector.save.meta.secinfo.destination; - if(to.save != null){ - ItemSeq items = to.getExtraItems(); - //calculated exported items to this sector - sector.save.meta.secinfo.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed))); - to.setExtraItems(items); + //queue random invasions + if(!sector.isAttacked() && sector.info.minutesCaptured > invasionGracePeriod && sector.info.hasSpawns){ + int count = sector.near().count(Sector::hasEnemyBase); + + //invasion chance depends on # of nearby bases + if(count > 0 && Mathf.chance(baseInvasionChance * (0.8f + (count - 1) * 0.3f))){ + int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 4) * 5; + + //assign invasion-related things + if(sector.isBeingPlayed()){ + state.rules.winWave = waveMax; + state.rules.waves = true; + state.rules.attackMode = false; + //update rules in multiplayer + if(net.server()){ + Call.setRules(state.rules); + } + }else{ + sector.info.winWave = waveMax; + sector.info.waves = true; + sector.info.attack = false; + sector.saveInfo(); + } + + Events.fire(new SectorInvasionEvent(sector)); } } - - //reset time spent to 0 - sector.setTimeSpent(0f); } } } @@ -183,7 +267,7 @@ public class Universe{ for(Planet planet : content.planets()){ for(Sector sector : planet.sectors){ if(sector.hasSave()){ - count.add(sector.calculateItems()); + count.add(sector.items()); } } } diff --git a/core/src/mindustry/game/Waves.java b/core/src/mindustry/game/Waves.java new file mode 100644 index 0000000000..bdd95abedf --- /dev/null +++ b/core/src/mindustry/game/Waves.java @@ -0,0 +1,423 @@ +package mindustry.game; + +import arc.func.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.type.*; + +import static mindustry.content.UnitTypes.*; + +public class Waves{ + public static final int waveVersion = 5; + + private Seq spawns; + + public Seq get(){ + if(spawns == null && dagger != null){ + spawns = Seq.with( + new SpawnGroup(dagger){{ + end = 10; + unitScaling = 2f; + max = 30; + }}, + + new SpawnGroup(crawler){{ + begin = 4; + end = 13; + unitAmount = 2; + unitScaling = 1.5f; + }}, + + new SpawnGroup(flare){{ + begin = 12; + end = 16; + unitScaling = 1f; + }}, + + new SpawnGroup(dagger){{ + begin = 11; + unitScaling = 1.7f; + spacing = 2; + max = 4; + shieldScaling = 25f; + }}, + + new SpawnGroup(pulsar){{ + begin = 13; + spacing = 3; + unitScaling = 0.5f; + max = 25; + }}, + + new SpawnGroup(mace){{ + begin = 7; + spacing = 3; + unitScaling = 2; + + end = 30; + }}, + + new SpawnGroup(dagger){{ + begin = 12; + unitScaling = 1; + unitAmount = 4; + spacing = 2; + shieldScaling = 20f; + max = 14; + }}, + + new SpawnGroup(mace){{ + begin = 28; + spacing = 3; + unitScaling = 1; + end = 40; + shieldScaling = 20f; + }}, + + new SpawnGroup(spiroct){{ + begin = 45; + spacing = 3; + unitScaling = 1; + max = 10; + shieldScaling = 30f; + shields = 100; + effect = StatusEffects.overdrive; + }}, + + new SpawnGroup(pulsar){{ + begin = 120; + spacing = 2; + unitScaling = 3; + unitAmount = 5; + effect = StatusEffects.overdrive; + }}, + + new SpawnGroup(flare){{ + begin = 16; + unitScaling = 1; + spacing = 2; + shieldScaling = 20f; + max = 20; + }}, + + new SpawnGroup(quasar){{ + begin = 82; + spacing = 3; + unitAmount = 4; + unitScaling = 3; + shieldScaling = 30f; + effect = StatusEffects.overdrive; + }}, + + new SpawnGroup(pulsar){{ + begin = 41; + spacing = 5; + unitAmount = 1; + unitScaling = 3; + effect = StatusEffects.shielded; + max = 25; + }}, + + new SpawnGroup(fortress){{ + begin = 40; + spacing = 5; + unitAmount = 2; + unitScaling = 2; + max = 20; + shieldScaling = 30; + }}, + + new SpawnGroup(nova){{ + begin = 35; + spacing = 3; + unitAmount = 4; + effect = StatusEffects.overdrive; + items = new ItemStack(Items.blastCompound, 60); + end = 60; + }}, + + new SpawnGroup(dagger){{ + begin = 42; + spacing = 3; + unitAmount = 4; + effect = StatusEffects.overdrive; + items = new ItemStack(Items.pyratite, 100); + end = 130; + max = 30; + }}, + + new SpawnGroup(horizon){{ + begin = 40; + unitAmount = 2; + spacing = 2; + unitScaling = 2; + shieldScaling = 20; + }}, + + new SpawnGroup(flare){{ + begin = 50; + unitAmount = 4; + unitScaling = 3; + spacing = 5; + shields = 100f; + shieldScaling = 10f; + effect = StatusEffects.overdrive; + max = 20; + }}, + + new SpawnGroup(zenith){{ + begin = 50; + unitAmount = 2; + unitScaling = 3; + spacing = 5; + max = 16; + shieldScaling = 30; + }}, + + new SpawnGroup(nova){{ + begin = 53; + unitAmount = 2; + unitScaling = 3; + spacing = 4; + shieldScaling = 30; + }}, + + new SpawnGroup(atrax){{ + begin = 31; + unitAmount = 4; + unitScaling = 1; + spacing = 3; + shieldScaling = 10f; + }}, + + new SpawnGroup(scepter){{ + begin = 41; + unitAmount = 1; + unitScaling = 1; + spacing = 30; + shieldScaling = 30f; + }}, + + new SpawnGroup(reign){{ + begin = 81; + unitAmount = 1; + unitScaling = 1; + spacing = 40; + shieldScaling = 30f; + }}, + + new SpawnGroup(antumbra){{ + begin = 120; + unitAmount = 1; + unitScaling = 1; + spacing = 40; + shieldScaling = 30f; + }}, + + new SpawnGroup(vela){{ + begin = 100; + unitAmount = 1; + unitScaling = 1; + spacing = 30; + shieldScaling = 30f; + }}, + + new SpawnGroup(corvus){{ + begin = 145; + unitAmount = 1; + unitScaling = 1; + spacing = 35; + shieldScaling = 30f; + shields = 100; + }}, + + new SpawnGroup(horizon){{ + begin = 90; + unitAmount = 2; + unitScaling = 3; + spacing = 4; + shields = 40f; + shieldScaling = 30f; + }}, + + new SpawnGroup(toxopid){{ + begin = 210; + unitAmount = 1; + unitScaling = 1; + spacing = 35; + shields = 1000; + shieldScaling = 35f; + }} + ); + } + return spawns == null ? new Seq<>() : spawns; + } + + public static Seq generate(float difficulty){ + //apply power curve to make starting sectors easier + return generate(Mathf.pow(difficulty, 1.12f), new Rand(), false); + } + + public static Seq generate(float difficulty, Rand rand, boolean attack){ + UnitType[][] species = { + {dagger, mace, fortress, scepter, reign}, + {nova, pulsar, quasar, vela, corvus}, + {crawler, atrax, spiroct, arkyid, toxopid}, + {flare, horizon, zenith, rand.chance(0.5) ? quad : antumbra, rand.chance(0.1) ? quad : eclipse} + }; + + //required progression: + //- extra periodic patterns + + Seq out = new Seq<>(); + + //max reasonable wave, after which everything gets boring + int cap = 150; + + float shieldStart = 30, shieldsPerWave = 20 + difficulty*30f; + float[] scaling = {1, 2f, 3f, 4f, 5f}; + + Intc createProgression = start -> { + //main sequence + UnitType[] curSpecies = Structs.random(species); + int curTier = 0; + + for(int i = start; i < cap;){ + int f = i; + int next = rand.random(8, 16) + (int)Mathf.lerp(5f, 0f, difficulty) + curTier * 4; + + float shieldAmount = Math.max((i - shieldStart) * shieldsPerWave, 0); + int space = start == 0 ? 1 : rand.random(1, 2); + int ctier = curTier; + + //main progression + out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ + unitAmount = f == start ? 1 : 6 / (int)scaling[ctier]; + begin = f; + end = f + next >= cap ? never : f + next; + max = 13; + unitScaling = (difficulty < 0.4f ? rand.random(2.5f, 5f) : rand.random(1f, 4f)) * scaling[ctier]; + shields = shieldAmount; + shieldScaling = shieldsPerWave; + spacing = space; + }}); + + //extra progression that tails out, blends in + out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ + unitAmount = 3 / (int)scaling[ctier]; + begin = f + next - 1; + end = f + next + rand.random(6, 10); + max = 6; + unitScaling = rand.random(2f, 4f); + spacing = rand.random(2, 4); + shields = shieldAmount/2f; + shieldScaling = shieldsPerWave; + }}); + + i += next + 1; + if(curTier < 3 || (rand.chance(0.05) && difficulty > 0.8)){ + curTier ++; + } + + //do not spawn bosses + curTier = Math.min(curTier, 3); + + //small chance to switch species + if(rand.chance(0.3)){ + curSpecies = Structs.random(species); + } + } + }; + + createProgression.get(0); + + int step = 5 + rand.random(5); + + while(step <= cap){ + createProgression.get(step); + step += (int)(rand.random(15, 30) * Mathf.lerp(1f, 0.5f, difficulty)); + } + + int bossWave = (int)(rand.random(50, 70) * Mathf.lerp(1f, 0.7f, difficulty)); + int bossSpacing = (int)(rand.random(25, 40) * Mathf.lerp(1f, 0.6f, difficulty)); + + int bossTier = difficulty < 0.6 ? 3 : 4; + + //main boss progression + out.add(new SpawnGroup(Structs.random(species)[bossTier]){{ + unitAmount = 1; + begin = bossWave; + spacing = bossSpacing; + end = never; + max = 16; + unitScaling = bossSpacing; + shieldScaling = shieldsPerWave; + effect = StatusEffects.boss; + }}); + + //alt boss progression + out.add(new SpawnGroup(Structs.random(species)[bossTier]){{ + unitAmount = 1; + begin = bossWave + rand.random(3, 5) * bossSpacing; + spacing = bossSpacing; + end = never; + max = 16; + unitScaling = bossSpacing; + shieldScaling = shieldsPerWave; + effect = StatusEffects.boss; + }}); + + int finalBossStart = 120 + rand.random(30); + + //final boss waves + out.add(new SpawnGroup(Structs.random(species)[bossTier]){{ + unitAmount = 1; + begin = finalBossStart; + spacing = bossSpacing/2; + end = never; + unitScaling = bossSpacing; + shields = 500; + shieldScaling = shieldsPerWave * 4; + effect = StatusEffects.boss; + }}); + + //final boss waves (alt) + out.add(new SpawnGroup(Structs.random(species)[bossTier]){{ + unitAmount = 1; + begin = finalBossStart + 15; + spacing = bossSpacing/2; + end = never; + unitScaling = bossSpacing; + shields = 500; + shieldScaling = shieldsPerWave * 4; + effect = StatusEffects.boss; + }}); + + //add megas to heal the base. + if(attack && difficulty >= 0.5){ + int amount = Mathf.random(1, 3 + (int)(difficulty*2)); + + for(int i = 0; i < amount; i++){ + int wave = Mathf.random(3, 20); + out.add(new SpawnGroup(mega){{ + unitAmount = 1; + begin = wave; + end = wave; + max = 16; + }}); + } + } + + //shift back waves on higher difficulty for a harder start + int shift = Math.max((int)(difficulty * 14 - 5), 0); + + for(SpawnGroup group : out){ + group.begin -= shift; + group.end -= shift; + } + + return out; + } +} diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index c65b3cae7c..5183551b93 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -6,6 +6,7 @@ import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; @@ -16,15 +17,17 @@ import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.power.*; -import static arc.Core.camera; +import static arc.Core.*; import static mindustry.Vars.*; -public class BlockRenderer implements Disposable{ +public class BlockRenderer{ + public static final int crackRegions = 8, maxCrackSize = 9; + private static final int initialRequests = 32 * 32; - private static final int expandr = 9; - private static final Color shadowColor = new Color(0, 0, 0, 0.71f); + private static final Color shadowColor = new Color(0, 0, 0, 0.71f), blendShadowColor = Color.white.cpy().lerp(Color.black, shadowColor.a); public final FloorRenderer floor = new FloorRenderer(); + public TextureRegion[][] cracks; private Seq tileview = new Seq<>(false, initialRequests, Tile.class); private Seq lightview = new Seq<>(false, initialRequests, Tile.class); @@ -35,12 +38,26 @@ public class BlockRenderer implements Disposable{ private FrameBuffer dark = new FrameBuffer(); private Seq outArray2 = new Seq<>(); private Seq shadowEvents = new Seq<>(); - private IntSet processedEntities = new IntSet(), processedLinks = new IntSet(); - private boolean displayStatus = false; + private IntSet darkEvents = new IntSet(); + private IntSet procLinks = new IntSet(), procLights = new IntSet(); + + private BlockQuadtree blockTree; + private FloorQuadtree floorTree; public BlockRenderer(){ + Events.on(ClientLoadEvent.class, e -> { + cracks = new TextureRegion[maxCrackSize][crackRegions]; + for(int size = 1; size <= maxCrackSize; size++){ + for(int i = 0; i < crackRegions; i++){ + cracks[size - 1][i] = Core.atlas.find("cracks-" + size + "-" + i); + } + } + }); + Events.on(WorldLoadEvent.class, event -> { + blockTree = new BlockQuadtree(new Rect(0, 0, world.unitWidth(), world.unitHeight())); + floorTree = new FloorQuadtree(new Rect(0, 0, world.unitWidth(), world.unitHeight())); shadowEvents.clear(); lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated @@ -50,7 +67,7 @@ public class BlockRenderer implements Disposable{ Core.graphics.clear(Color.white); Draw.proj().setOrtho(0, 0, shadows.getWidth(), shadows.getHeight()); - Draw.color(shadowColor); + Draw.color(blendShadowColor); for(Tile tile : world.tiles){ if(tile.block().hasShadow){ @@ -62,17 +79,19 @@ public class BlockRenderer implements Disposable{ Draw.color(); shadows.end(); - dark.getTexture().setFilter(TextureFilter.linear, TextureFilter.linear); + dark.getTexture().setFilter(TextureFilter.linear); dark.resize(world.width(), world.height()); dark.begin(); Core.graphics.clear(Color.white); Draw.proj().setOrtho(0, 0, dark.getWidth(), dark.getHeight()); for(Tile tile : world.tiles){ + recordIndex(tile); + float darkness = world.getDarkness(tile.x, tile.y); if(darkness > 0){ - Draw.color(0f, 0f, 0f, Math.min((darkness + 0.5f) / 4f, 1f)); + Draw.colorl(1f - Math.min((darkness + 0.5f) / 4f, 1f)); Fill.rect(tile.x + 0.5f, tile.y + 0.5f, 1, 1); } } @@ -82,6 +101,11 @@ public class BlockRenderer implements Disposable{ dark.end(); }); + Events.on(TilePreChangeEvent.class, event -> { + if(indexBlock(event.tile)) blockTree.remove(event.tile); + if(indexFloor(event.tile)) floorTree.remove(event.tile); + }); + Events.on(TileChangeEvent.class, event -> { shadowEvents.add(event.tile); @@ -93,10 +117,60 @@ public class BlockRenderer implements Disposable{ if(Math.abs(avgx - event.tile.x) <= rangex && Math.abs(avgy - event.tile.y) <= rangey){ lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated } + + recordIndex(event.tile); }); } + boolean indexBlock(Tile tile){ + var block = tile.block(); + return tile.isCenter() && block != Blocks.air && block.cacheLayer == CacheLayer.normal; + } + + boolean indexFloor(Tile tile){ + return tile.block() == Blocks.air && tile.floor().emitLight && world.getDarkness(tile.x, tile.y) < 3; + } + + void recordIndex(Tile tile){ + if(indexBlock(tile)) blockTree.insert(tile); + if(indexFloor(tile)) floorTree.insert(tile); + } + + public void recacheWall(Tile tile){ + for(int cx = tile.x - darkRadius; cx <= tile.x + darkRadius; cx++){ + for(int cy = tile.y - darkRadius; cy <= tile.y + darkRadius; cy++){ + Tile other = world.tile(cx, cy); + if(other != null){ + darkEvents.add(other.pos()); + } + } + } + } + public void drawDarkness(){ + if(!darkEvents.isEmpty()){ + Draw.flush(); + + dark.begin(); + Draw.proj().setOrtho(0, 0, dark.getWidth(), dark.getHeight()); + + darkEvents.each(pos -> { + var tile = world.tile(pos); + tile.data = world.getWallDarkness(tile); + float darkness = world.getDarkness(tile.x, tile.y); + //then draw the shadow + Draw.colorl(!tile.isDarkened() || darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f)); + Fill.rect(tile.x + 0.5f, tile.y + 0.5f, 1, 1); + }); + + Draw.flush(); + Draw.color(); + dark.end(); + darkEvents.clear(); + + Draw.proj(camera); + } + Draw.shader(Shaders.darkness); Draw.fbo(dark, world.width(), world.height(), tilesize); Draw.shader(); @@ -117,8 +191,8 @@ public class BlockRenderer implements Disposable{ if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset, block.y * tilesize + b.offset))) continue; Draw.alpha(0.33f * brokenFade); - Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime(), 6f, 0.2f)); - Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset, block.y * tilesize + b.offset, b.rotate ? block.rotation * 90 : 0f); + Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime, 6f, 0.2f)); + Draw.rect(b.fullIcon, block.x * tilesize + b.offset, block.y * tilesize + b.offset, b.rotate ? block.rotation * 90 : 0f); } Draw.reset(); } @@ -132,11 +206,8 @@ public class BlockRenderer implements Disposable{ Draw.proj().setOrtho(0, 0, shadows.getWidth(), shadows.getHeight()); for(Tile tile : shadowEvents){ - //clear it first - Draw.color(Color.white); - Fill.rect(tile.x + 0.5f, tile.y + 0.5f, 1, 1); - //then draw the shadow - Draw.color(!tile.block().hasShadow ? Color.white : shadowColor); + //draw white/shadow color depending on blend + Draw.color(!tile.block().hasShadow ? Color.white : blendShadowColor); Fill.rect(tile.x + 0.5f, tile.y + 0.5f, 1, 1); } @@ -165,13 +236,11 @@ public class BlockRenderer implements Disposable{ /** Process all blocks to draw. */ public void processBlocks(){ - displayStatus = Core.settings.getBool("blockstatus"); - int avgx = (int)(camera.position.x / tilesize); int avgy = (int)(camera.position.y / tilesize); - int rangex = (int)(camera.width / tilesize / 2) + 3; - int rangey = (int)(camera.height / tilesize / 2) + 3; + int rangex = (int)(camera.width / tilesize / 2); + int rangey = (int)(camera.height / tilesize / 2); if(avgx == lastCamX && avgy == lastCamY && lastRangeX == rangex && lastRangeY == rangey){ return; @@ -179,55 +248,32 @@ public class BlockRenderer implements Disposable{ tileview.clear(); lightview.clear(); - processedEntities.clear(); - processedLinks.clear(); + procLinks.clear(); + procLights.clear(); - int minx = Math.max(avgx - rangex - expandr, 0); - int miny = Math.max(avgy - rangey - expandr, 0); - int maxx = Math.min(world.width() - 1, avgx + rangex + expandr); - int maxy = Math.min(world.height() - 1, avgy + rangey + expandr); + var bounds = camera.bounds(Tmp.r3).grow(tilesize); - for(int x = minx; x <= maxx; x++){ - for(int y = miny; y <= maxy; y++){ - boolean expanded = (Math.abs(x - avgx) > rangex || Math.abs(y - avgy) > rangey); - Tile tile = world.rawTile(x, y); - Block block = tile.block(); - //link to center - if(tile.build != null){ - tile = tile.build.tile; - } + //draw floor lights + floorTree.intersect(bounds, tile -> lightview.add(tile)); - if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id))){ - if(block.expanded || !expanded){ - if(tile.build == null || processedLinks.add(tile.build.id)){ - tileview.add(tile); - if(tile.build != null){ - processedEntities.add(tile.build.id); - processedLinks.add(tile.build.id); - } - } + blockTree.intersect(bounds, tile -> { + if(tile.build == null || procLinks.add(tile.build.id)){ + tileview.add(tile); + } + + //lights are drawn even in the expanded range + if(((tile.build != null && procLights.add(tile.build.pos())) || tile.block().emitLight)){ + lightview.add(tile); + } + + if(tile.build != null && tile.build.power != null && tile.build.power.links.size > 0){ + for(Building other : tile.build.getPowerConnections(outArray2)){ + if(other.block instanceof PowerNode && procLinks.add(other.id)){ //TODO need a generic way to render connections! + tileview.add(other.tile); } - - //lights are drawn even in the expanded range - if(tile.build != null || tile.block().emitLight){ - lightview.add(tile); - } - - if(tile.build != null && tile.build.power != null && tile.build.power.links.size > 0){ - for(Building other : tile.build.getPowerConnections(outArray2)){ - if(other.block instanceof PowerNode && processedLinks.add(other.id)){ //TODO need a generic way to render connections! - tileview.add(other.tile); - } - } - } - } - - //special case for floors - if(block == Blocks.air && tile.floor().emitLight){ - lightview.add(tile); } } - } + }); lastCamX = avgx; lastCamY = avgy; @@ -235,7 +281,29 @@ public class BlockRenderer implements Disposable{ lastRangeY = rangey; } + //debug method for drawing block bounds + void drawTree(QuadTree tree){ + Draw.color(Color.blue); + Lines.rect(tree.bounds); + + Draw.color(Color.green); + for(var tile : tree.objects){ + var block = tile.block(); + Tmp.r1.setCentered(tile.worldx() + block.offset, tile.worldy() + block.offset, block.clipSize, block.clipSize); + Lines.rect(Tmp.r1); + } + + if(!tree.leaf){ + drawTree(tree.botLeft); + drawTree(tree.botRight); + drawTree(tree.topLeft); + drawTree(tree.topRight); + } + Draw.reset(); + } + public void drawBlocks(){ + drawDestroyed(); //draw most tile stuff @@ -262,7 +330,7 @@ public class BlockRenderer implements Disposable{ Draw.z(Layer.block); } - if(displayStatus && block.consumes.any()){ + if(renderer.drawStatus && block.consumes.any()){ entity.drawStatus(); } } @@ -280,20 +348,47 @@ public class BlockRenderer implements Disposable{ entity.drawLight(); }else if(tile.block().emitLight){ tile.block().drawEnvironmentLight(tile); - }else if(tile.floor().emitLight){ + }else if(tile.floor().emitLight && tile.block() == Blocks.air){ //only draw floor light under non-solid blocks tile.floor().drawEnvironmentLight(tile); } } } - - } - @Override - public void dispose(){ - shadows.dispose(); - dark.dispose(); - shadows = dark = null; - floor.dispose(); + static class BlockQuadtree extends QuadTree{ + + public BlockQuadtree(Rect bounds){ + super(bounds); + } + + @Override + public void hitbox(Tile tile){ + var block = tile.block(); + tmp.setCentered(tile.worldx() + block.offset, tile.worldy() + block.offset, block.clipSize, block.clipSize); + } + + @Override + protected QuadTree newChild(Rect rect){ + return new BlockQuadtree(rect); + } } + + static class FloorQuadtree extends QuadTree{ + + public FloorQuadtree(Rect bounds){ + super(bounds); + } + + @Override + public void hitbox(Tile tile){ + var floor = tile.floor(); + tmp.setCentered(tile.worldx(), tile.worldy(), floor.clipSize, floor.clipSize); + } + + @Override + protected QuadTree newChild(Rect rect){ + return new FloorQuadtree(rect); + } + } + } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index c3eed64feb..31b8074196 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -4,93 +4,82 @@ import arc.*; import arc.graphics.*; import arc.graphics.gl.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; -public enum CacheLayer{ - water{ - @Override - public void begin(){ - beginShader(); - } +public class CacheLayer{ + public static CacheLayer - @Override - public void end(){ - endShader(Shaders.water); - } - }, - mud{ - @Override - public void begin(){ - beginShader(); - } + water, mud, tar, slag, space, normal, walls; - @Override - public void end(){ - endShader(Shaders.mud); - } - }, - tar{ - @Override - public void begin(){ - beginShader(); - } + public static CacheLayer[] all = {}; - @Override - public void end(){ - endShader(Shaders.tar); - } - }, - slag{ - @Override - public void begin(){ - beginShader(); - } + public int id; - @Override - public void end(){ - endShader(Shaders.slag); + /** Register a new CacheLayer. */ + public static void add(CacheLayer... layers){ + int newSize = all.length + layers.length; + var prev = all; + //reallocate the array and copy everything over; performance matters very little here anyway + all = new CacheLayer[newSize]; + System.arraycopy(prev, 0, all, 0, prev.length); + System.arraycopy(layers, 0, all, prev.length, layers.length); + + for(int i = 0; i < all.length; i++){ + all[i].id = i; } - }, - normal(5), - walls(3); - - public static final CacheLayer[] all = values(); - /** Capacity multiplier. */ - public final int capacity; - - CacheLayer(){ - this(2); } - CacheLayer(int capacity){ - this.capacity = capacity; + /** Loads default cache layers. */ + public static void init(){ + add( + water = new ShaderLayer(Shaders.water), + mud = new ShaderLayer(Shaders.mud), + tar = new ShaderLayer(Shaders.tar), + slag = new ShaderLayer(Shaders.slag), + space = new ShaderLayer(Shaders.space), + normal = new CacheLayer(), + walls = new CacheLayer() + ); } + /** Called before the cache layer begins rendering. Begin FBOs here. */ public void begin(){ } + /** Called after the cache layer ends rendering. Blit FBOs here. */ public void end(){ } - void beginShader(){ - if(!Core.settings.getBool("animatedwater")) return; + public static class ShaderLayer extends CacheLayer{ + public Shader shader; - renderer.blocks.floor.endc(); - renderer.effectBuffer.begin(); - Core.graphics.clear(Color.clear); - renderer.blocks.floor.beginc(); - } + public ShaderLayer(Shader shader){ + //shader will be null on headless backend, but that's ok + this.shader = shader; + } - void endShader(Shader shader){ - if(!Core.settings.getBool("animatedwater")) return; + @Override + public void begin(){ + if(!Core.settings.getBool("animatedwater")) return; - renderer.blocks.floor.endc(); - renderer.effectBuffer.end(); + renderer.blocks.floor.endc(); + renderer.effectBuffer.begin(); + Core.graphics.clear(Color.clear); + renderer.blocks.floor.beginc(); + } - renderer.effectBuffer.blit(shader); + @Override + public void end(){ + if(!Core.settings.getBool("animatedwater")) return; - renderer.blocks.floor.beginc(); + renderer.blocks.floor.endc(); + renderer.effectBuffer.end(); + + renderer.effectBuffer.blit(shader); + + renderer.blocks.floor.beginc(); + } } } diff --git a/core/src/mindustry/graphics/CubemapMesh.java b/core/src/mindustry/graphics/CubemapMesh.java index 7631c2bd2d..67ef264d86 100644 --- a/core/src/mindustry/graphics/CubemapMesh.java +++ b/core/src/mindustry/graphics/CubemapMesh.java @@ -3,7 +3,6 @@ package mindustry.graphics; import arc.*; import arc.graphics.*; import arc.graphics.Texture.*; -import arc.graphics.VertexAttributes.*; import arc.graphics.gl.*; import arc.math.geom.*; import arc.util.*; @@ -60,9 +59,7 @@ public class CubemapMesh implements Disposable{ public CubemapMesh(Cubemap map){ this.map = map; this.map.setFilter(TextureFilter.linear); - this.mesh = new Mesh(true, vertices.length, 0, - new VertexAttribute(Usage.position, 3, "a_position") - ); + this.mesh = new Mesh(true, vertices.length, 0, VertexAttribute.position3); mesh.getVerticesBuffer().limit(vertices.length); mesh.getVerticesBuffer().put(vertices, 0, vertices.length); diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index f1d45bebc3..7d8b2be9d5 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -10,13 +10,37 @@ import mindustry.*; import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; -import mindustry.ui.*; import mindustry.world.*; import static mindustry.Vars.*; public class Drawf{ + public static void dashLine(Color color, float x, float y, float x2, float y2){ + int segments = (int)(Math.max(Math.abs(x - x2), Math.abs(y - y2)) / tilesize * 2); + Lines.stroke(3f, Pal.gray); + Lines.dashLine(x, y, x2, y2, segments); + Lines.stroke(1f, color); + Lines.dashLine(x, y, x2, y2, segments); + Draw.reset(); + } + + public static void target(float x, float y, float rad, Color color){ + target(x, y, rad, 1, color); + } + + public static void target(float x, float y, float rad, float alpha, Color color){ + Lines.stroke(3f); + Draw.color(Pal.gray, alpha); + Lines.poly(x, y, 4, rad, Time.time * 1.5f); + Lines.spikes(x, y, 3f/7f * rad, 6f/7f * rad, 4, Time.time * 1.5f); + Lines.stroke(1f); + Draw.color(color, alpha); + Lines.poly(x, y, 4, rad, Time.time * 1.5f); + Lines.spikes(x, y, 3f/7f * rad, 6f/7f * rad, 4, Time.time * 1.5f); + Draw.reset(); + } + public static float text(){ float z = Draw.z(); if(renderer.pixelator.enabled()){ @@ -51,7 +75,7 @@ public class Drawf{ } private static boolean allowLight(Team team){ - return team == Team.derelict || team == Vars.player.team() || state.rules.enemyLights; + return renderer != null && (team == Team.derelict || team == Vars.player.team() || state.rules.enemyLights); } public static void selected(Building tile, Color color){ @@ -80,7 +104,7 @@ public class Drawf{ public static void shadow(float x, float y, float rad, float alpha){ Draw.color(0, 0, 0, 0.4f * alpha); - Draw.rect("circle-shadow", x, y, rad, rad); + Draw.rect("circle-shadow", x, y, rad * Draw.xscl, rad * Draw.yscl); Draw.color(); } @@ -95,6 +119,12 @@ public class Drawf{ Draw.rect(region, x, y); Draw.color(); } + + public static void shadow(TextureRegion region, float x, float y, float width, float height, float rotation){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y, width, height, rotation); + Draw.color(); + } public static void liquid(TextureRegion region, float x, float y, float alpha, Color color, float rotation){ Draw.color(color, alpha); @@ -136,16 +166,24 @@ public class Drawf{ Draw.reset(); } - public static void square(float x, float y, float radius, Color color){ + public static void square(float x, float y, float radius, float rotation, Color color){ Lines.stroke(3f, Pal.gray); - Lines.square(x, y, radius + 1f, 45); + Lines.square(x, y, radius + 1f, rotation); Lines.stroke(1f, color); - Lines.square(x, y, radius + 1f, 45); + Lines.square(x, y, radius + 1f, rotation); Draw.reset(); } + public static void square(float x, float y, float radius, float rotation){ + square(x, y, radius, rotation, Pal.accent); + } + + public static void square(float x, float y, float radius, Color color){ + square(x, y, radius, 45, color); + } + public static void square(float x, float y, float radius){ - square(x, y, radius, Pal.accent); + square(x, y, radius, 45); } public static void arrow(float x, float y, float x2, float y2, float length, float radius){ @@ -193,13 +231,17 @@ public class Drawf{ } public static void construct(Building t, UnlockableContent content, float rotation, float progress, float speed, float time){ - construct(t, content.icon(Cicon.full), rotation, progress, speed, time); + construct(t, content.fullIcon, rotation, progress, speed, time); } public static void construct(float x, float y, TextureRegion region, float rotation, float progress, float speed, float time){ + construct(x, y, region, Pal.accent, rotation, progress, speed, time); + } + + public static void construct(float x, float y, TextureRegion region, Color color, float rotation, float progress, float speed, float time){ Shaders.build.region = region; Shaders.build.progress = progress; - Shaders.build.color.set(Pal.accent); + Shaders.build.color.set(color); Shaders.build.color.a = speed; Shaders.build.time = -time / 20f; @@ -211,9 +253,13 @@ public class Drawf{ } public static void construct(Building t, TextureRegion region, float rotation, float progress, float speed, float time){ + construct(t, region, Pal.accent, rotation, progress, speed, time); + } + + public static void construct(Building t, TextureRegion region, Color color, float rotation, float progress, float speed, float time){ Shaders.build.region = region; Shaders.build.progress = progress; - Shaders.build.color.set(Pal.accent); + Shaders.build.color.set(color); Shaders.build.color.a = speed; Shaders.build.time = -time / 20f; diff --git a/core/src/mindustry/graphics/EnvRenderers.java b/core/src/mindustry/graphics/EnvRenderers.java new file mode 100644 index 0000000000..bc669b56ef --- /dev/null +++ b/core/src/mindustry/graphics/EnvRenderers.java @@ -0,0 +1,8 @@ +package mindustry.graphics; + +public class EnvRenderers{ + + public static void init(){ + + } +} diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 4030125ebb..8d837b5dad 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -3,6 +3,7 @@ package mindustry.graphics; import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; +import arc.graphics.gl.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -12,27 +13,92 @@ import mindustry.game.EventType.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -import java.util.*; - import static mindustry.Vars.*; -public class FloorRenderer implements Disposable{ - //TODO find out number with best performance - private static final int chunksize = mobile ? 16 : 32; +/** + * general implementation: + * + * caching: + * 1. create fixed-size float array fpr rendering into + * 2. for each chunk, cache each layer into buffer; record layer boundary indices (alternatively, create mesh per layer for fast recache) + * 3. create mesh for this chunk based on buffer size, copy buffer into mesh + * + * rendering: + * 1. iterate through visible chunks + * 2. activate the shader vertex attributes beforehand + * 3. bind each mesh individually, draw it + * + * */ +public class FloorRenderer{ + private static final VertexAttribute[] attributes = {VertexAttribute.position, VertexAttribute.color, VertexAttribute.texCoords}; + private static final int + chunksize = 30, //todo 32? + chunkunits = chunksize * tilesize, + vertexSize = 2 + 1 + 2, + spriteSize = vertexSize * 4, + maxSprites = chunksize * chunksize * 9; + private static final float pad = tilesize/2f; + //if true, chunks are rendered on-demand; this causes small lag spikes and is generally not needed for most maps + private static final boolean dynamic = false; - private int[][][] cache; - private MultiCacheBatch cbatch; + private float[] vertices = new float[maxSprites * vertexSize * 4]; + private short[] indices = new short[maxSprites * 6]; + private int vidx; + private FloorRenderBatch batch = new FloorRenderBatch(); + private Shader shader; + private Texture texture; + private TextureRegion error; + + private Mesh[][][] cache; private IntSet drawnLayerSet = new IntSet(); private IntSet recacheSet = new IntSet(); private IntSeq drawnLayers = new IntSeq(); private ObjectSet used = new ObjectSet<>(); public FloorRenderer(){ + short j = 0; + for(int i = 0; i < indices.length; i += 6, j += 4){ + indices[i] = j; + indices[i + 1] = (short)(j + 1); + indices[i + 2] = (short)(j + 2); + indices[i + 3] = (short)(j + 2); + indices[i + 4] = (short)(j + 3); + indices[i + 5] = j; + } + + shader = new Shader( + """ + attribute vec4 a_position; + attribute vec4 a_color; + attribute vec2 a_texCoord0; + uniform mat4 u_projectionViewMatrix; + varying vec4 v_color; + varying vec2 v_texCoords; + + void main(){ + v_color = a_color; + v_color.a = v_color.a * (255.0/254.0); + v_texCoords = a_texCoord0; + gl_Position = u_projectionViewMatrix * a_position; + } + """, + """ + varying vec4 v_color; + varying vec2 v_texCoords; + uniform sampler2D u_texture; + + void main(){ + gl_FragColor = v_color * texture2D(u_texture, v_texCoords); + } + """); + Events.on(WorldLoadEvent.class, event -> clearTiles()); } - /**Queues up a cache change for a tile. Only runs in render loop. */ + /** Queues up a cache change for a tile. Only runs in render loop. */ public void recacheTile(Tile tile){ + //TODO will be faster it the position also specified the layer to be recached + //recaching all layers may not be necessary recacheSet.add(Point2.pack(tile.x / chunksize, tile.y / chunksize)); } @@ -43,11 +109,13 @@ public class FloorRenderer implements Disposable{ Camera camera = Core.camera; - int crangex = (int)(camera.width / (chunksize * tilesize)) + 1; - int crangey = (int)(camera.height / (chunksize * tilesize)) + 1; + float pad = tilesize/2f; - int camx = (int)(camera.position.x / (chunksize * tilesize)); - int camy = (int)(camera.position.y / (chunksize * tilesize)); + int + minx = (int)((camera.position.x - camera.width/2f - pad) / chunkunits), + miny = (int)((camera.position.y - camera.height/2f - pad) / chunkunits), + maxx = Mathf.ceil((camera.position.x + camera.width/2f + pad) / chunkunits), + maxy = Mathf.ceil((camera.position.y + camera.height/2f + pad) / chunkunits); int layers = CacheLayer.all.length; @@ -55,19 +123,20 @@ public class FloorRenderer implements Disposable{ drawnLayerSet.clear(); //preliminary layer check - for(int x = -crangex; x <= crangex; x++){ - for(int y = -crangey; y <= crangey; y++){ - int worldx = camx + x; - int worldy = camy + y; + for(int x = minx; x <= maxx; x++){ + for(int y = miny; y <= maxy; y++){ - if(!Structs.inBounds(worldx, worldy, cache)) - continue; + if(!Structs.inBounds(x, y, cache)) continue; - int[] chunk = cache[worldx][worldy]; + if(cache[x][y].length == 0){ + cacheChunk(x, y); + } + + Mesh[] chunk = cache[x][y]; //loop through all layers, and add layer index if it exists for(int i = 0; i < layers; i++){ - if(chunk[i] != -1 && i != CacheLayer.walls.ordinal()){ + if(chunk[i] != null && i != CacheLayer.walls.id){ drawnLayerSet.add(i); } } @@ -94,11 +163,30 @@ public class FloorRenderer implements Disposable{ } public void beginc(){ - cbatch.beginDraw(); + shader.bind(); + shader.setUniformMatrix4("u_projectionViewMatrix", Core.camera.mat); + shader.setUniformi("u_texture", 0); + + //only ever use the base environment texture + //TODO show error texture for anything else + texture.bind(0); + + //enable all mesh attributes + for(VertexAttribute attribute : attributes){ + shader.enableVertexAttribute(attribute.alias); + } } public void endc(){ - cbatch.endDraw(); + + //disable all mesh attributes + for(VertexAttribute attribute : attributes){ + shader.disableVertexAttribute(attribute.alias); + } + + //unbind last buffer + Gl.bindBuffer(Gl.arrayBuffer, 0); + Gl.bindBuffer(Gl.elementArrayBuffer, 0); } public void checkChanges(){ @@ -119,8 +207,9 @@ public class FloorRenderer implements Disposable{ return; } - cbatch.setProjection(Core.camera.mat); - cbatch.beginDraw(); + Draw.flush(); + + beginc(); Gl.enable(Gl.blend); } @@ -130,7 +219,7 @@ public class FloorRenderer implements Disposable{ return; } - cbatch.endDraw(); + endc(); } public void drawLayer(CacheLayer layer){ @@ -140,23 +229,48 @@ public class FloorRenderer implements Disposable{ Camera camera = Core.camera; - int crangex = (int)(camera.width / (chunksize * tilesize)) + 1; - int crangey = (int)(camera.height / (chunksize * tilesize)) + 1; + int + minx = (int)((camera.position.x - camera.width/2f - pad) / chunkunits), + miny = (int)((camera.position.y - camera.height/2f - pad) / chunkunits), + maxx = Mathf.ceil((camera.position.x + camera.width/2f + pad) / chunkunits), + maxy = Mathf.ceil((camera.position.y + camera.height/2f + pad) / chunkunits); layer.begin(); - for(int x = -crangex; x <= crangex; x++){ - for(int y = -crangey; y <= crangey; y++){ - int worldx = (int)(camera.position.x / (chunksize * tilesize)) + x; - int worldy = (int)(camera.position.y / (chunksize * tilesize)) + y; + for(int x = minx; x <= maxx; x++){ + for(int y = miny; y <= maxy; y++){ - if(!Structs.inBounds(worldx, worldy, cache)){ + if(!Structs.inBounds(x, y, cache) || cache[x][y].length == 0){ continue; } - int[] chunk = cache[worldx][worldy]; - if(chunk[layer.ordinal()] == -1) continue; - cbatch.drawCache(chunk[layer.ordinal()]); + var mesh = cache[x][y][layer.id]; + + if(mesh != null){ + + //this *must* be a vertexbufferobject, so cast it and render it directly + if(mesh.vertices instanceof VertexBufferObject vbo && mesh.indices instanceof IndexBufferObject ibo){ + + //bindi the buffer and update its contents, but do not unnecessarily enable all the attributes again + vbo.bind(); + //set up vertex attribute pointers for this specific VBO + int offset = 0; + for(VertexAttribute attribute : attributes){ + int location = shader.getAttributeLocation(attribute.alias); + int aoffset = offset; + offset += attribute.size; + if(location < 0) continue; + + shader.setVertexAttribute(location, attribute.components, attribute.type, attribute.normalized, vertexSize * 4, aoffset); + } + + ibo.bind(); + + mesh.vertices.render(mesh.indices, Gl.triangles, 0, mesh.getNumIndices()); + }else{ + throw new ArcRuntimeException("Non-VBO meshes are not supported for caches."); + } + } } } @@ -165,7 +279,6 @@ public class FloorRenderer implements Disposable{ private void cacheChunk(int cx, int cy){ used.clear(); - int[] chunk = cache[cx][cy]; for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize && tilex < world.width(); tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize && tiley < world.height(); tiley++){ @@ -179,21 +292,29 @@ public class FloorRenderer implements Disposable{ } } + if(cache[cx][cy].length == 0){ + cache[cx][cy] = new Mesh[CacheLayer.all.length]; + } + + var meshes = cache[cx][cy]; + + for(CacheLayer layer : CacheLayer.all){ + if(meshes[layer.id] != null){ + meshes[layer.id].dispose(); + } + meshes[layer.id] = null; + } + for(CacheLayer layer : used){ - cacheChunkLayer(cx, cy, chunk, layer); + meshes[layer.id] = cacheChunkLayer(cx, cy, layer); } } - private void cacheChunkLayer(int cx, int cy, int[] chunk, CacheLayer layer){ - Batch current = Core.batch; - Core.batch = cbatch; + private Mesh cacheChunkLayer(int cx, int cy, CacheLayer layer){ + vidx = 0; - //begin a new cache - if(chunk[layer.ordinal()] == -1){ - cbatch.beginCache(); - }else{ - cbatch.beginCache(chunk[layer.ordinal()]); - } + Batch current = Core.batch; + Core.batch = batch; for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ @@ -217,37 +338,173 @@ public class FloorRenderer implements Disposable{ } Core.batch = current; - cbatch.reserve(layer.capacity * chunksize * chunksize); - chunk[layer.ordinal()] = cbatch.endCache(); + + int floats = vidx; + //every 4 vertices need 6 indices + int vertCount = floats / vertexSize, indCount = vertCount * 6/4; + + Mesh mesh = new Mesh(true, vertCount, indCount, attributes); + mesh.setAutoBind(false); + mesh.setVertices(vertices, 0, vidx); + mesh.setIndices(indices, 0, indCount); + + return mesh; } public void clearTiles(){ - if(cbatch != null) cbatch.dispose(); - - recacheSet.clear(); - int chunksx = Mathf.ceil((float)(world.width()) / chunksize), - chunksy = Mathf.ceil((float)(world.height()) / chunksize); - cache = new int[chunksx][chunksy][CacheLayer.all.length]; - cbatch = new MultiCacheBatch(chunksize * chunksize * 9); - - Time.mark(); - - for(int x = 0; x < chunksx; x++){ - for(int y = 0; y < chunksy; y++){ - Arrays.fill(cache[x][y], -1); - - cacheChunk(x, y); + //dispose all old meshes + if(cache != null){ + for(var x : cache){ + for(var y : x){ + for(var mesh : y){ + if(mesh != null){ + mesh.dispose(); + } + } + } } } - Log.debug("Time to cache: @", Time.elapsed()); + recacheSet.clear(); + int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); + cache = new Mesh[chunksx][chunksy][dynamic ? 0 : CacheLayer.all.length]; + + texture = Core.atlas.find("grass1").texture; + error = Core.atlas.find("env-error"); + //not supported due to internal access + Mesh.useVAO = false; + + //pre-cache chunks + if(!dynamic){ + Time.mark(); + + for(int x = 0; x < chunksx; x++){ + for(int y = 0; y < chunksy; y++){ + cacheChunk(x, y); + } + } + + Log.debug("Time to cache: @", Time.elapsed()); + } } - @Override - public void dispose(){ - if(cbatch != null){ - cbatch.dispose(); - cbatch = null; + class FloorRenderBatch extends Batch{ + + @Override + protected void draw(TextureRegion region, float x, float y, float originX, float originY, float width, float height, float rotation){ + + //substitute invalid regions with error + if(region.texture != texture && region != error){ + draw(error, x, y, originX, originY, width, height, rotation); + return; + } + + float[] verts = vertices; + int idx = vidx; + vidx += spriteSize; + + if(!Mathf.zero(rotation)){ + //bottom left and top right corner points relative to origin + float worldOriginX = x + originX; + float worldOriginY = y + originY; + float fx = -originX; + float fy = -originY; + float fx2 = width - originX; + float fy2 = height - originY; + + // rotate + float cos = Mathf.cosDeg(rotation); + float sin = Mathf.sinDeg(rotation); + + float x1 = cos * fx - sin * fy + worldOriginX; + float y1 = sin * fx + cos * fy + worldOriginY; + float x2 = cos * fx - sin * fy2 + worldOriginX; + float y2 = sin * fx + cos * fy2 + worldOriginY; + float x3 = cos * fx2 - sin * fy2 + worldOriginX; + float y3 = sin * fx2 + cos * fy2 + worldOriginY; + float x4 = x1 + (x3 - x2); + float y4 = y3 - (y2 - y1); + + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; + + float color = this.colorPacked; + + verts[idx] = x1; + verts[idx + 1] = y1; + verts[idx + 2] = color; + verts[idx + 3] = u; + verts[idx + 4] = v; + + verts[idx + 5] = x2; + verts[idx + 6] = y2; + verts[idx + 7] = color; + verts[idx + 8] = u; + verts[idx + 9] = v2; + + verts[idx + 10] = x3; + verts[idx + 11] = y3; + verts[idx + 12] = color; + verts[idx + 13] = u2; + verts[idx + 14] = v2; + + verts[idx + 15] = x4; + verts[idx + 16] = y4; + verts[idx + 17] = color; + verts[idx + 18] = u2; + verts[idx + 19] = v; + }else{ + float fx2 = x + width; + float fy2 = y + height; + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; + + float color = this.colorPacked; + + verts[idx] = x; + verts[idx + 1] = y; + verts[idx + 2] = color; + verts[idx + 3] = u; + verts[idx + 4] = v; + + verts[idx + 5] = x; + verts[idx + 6] = fy2; + verts[idx + 7] = color; + verts[idx + 8] = u; + verts[idx + 9] = v2; + + verts[idx + 10] = fx2; + verts[idx + 11] = fy2; + verts[idx + 12] = color; + verts[idx + 13] = u2; + verts[idx + 14] = v2; + + verts[idx + 15] = fx2; + verts[idx + 16] = y; + verts[idx + 17] = color; + verts[idx + 18] = u2; + verts[idx + 19] = v; + } + + } + + @Override + public void flush(){ + + } + + @Override + public void setShader(Shader shader, boolean apply){ + throw new IllegalArgumentException("cache shader unsupported"); + } + + @Override + protected void draw(Texture texture, float[] spriteVertices, int offset, int count){ + throw new IllegalArgumentException("cache vertices unsupported"); } } } diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 46b9093a14..9c02615fbd 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -1,7 +1,6 @@ package mindustry.graphics; import arc.graphics.*; -import arc.graphics.VertexAttributes.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; import arc.math.*; @@ -200,9 +199,9 @@ public class IndexedRenderer implements Disposable{ if(mesh != null) mesh.dispose(); mesh = new Mesh(true, 6 * sprites, 0, - new VertexAttribute(Usage.position, 2, "a_position"), - new VertexAttribute(Usage.colorPacked, 4, "a_color"), - new VertexAttribute(Usage.textureCoordinates, 2, "a_texCoord0")); + VertexAttribute.position, + VertexAttribute.color, + VertexAttribute.texCoords); vertices = new float[6 * sprites * vsize]; mesh.setVertices(vertices); } diff --git a/core/src/mindustry/graphics/InverseKinematics.java b/core/src/mindustry/graphics/InverseKinematics.java index a920dc6527..133eae78ff 100644 --- a/core/src/mindustry/graphics/InverseKinematics.java +++ b/core/src/mindustry/graphics/InverseKinematics.java @@ -26,4 +26,4 @@ public class InverseKinematics{ return dist > 0 && dist < lengthA; } -} \ No newline at end of file +} diff --git a/core/src/mindustry/graphics/Layer.java b/core/src/mindustry/graphics/Layer.java index 519850a2f9..5ddea70282 100644 --- a/core/src/mindustry/graphics/Layer.java +++ b/core/src/mindustry/graphics/Layer.java @@ -65,6 +65,9 @@ public class Layer{ //overlaied UI, like block config guides overlayUI = 120, + //build beam effects + buildBeam = 122, + //shield effects shields = 125, diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index fbe154a6b9..acf0583e02 100644 --- a/core/src/mindustry/graphics/LightRenderer.java +++ b/core/src/mindustry/graphics/LightRenderer.java @@ -10,7 +10,7 @@ import arc.struct.*; import arc.util.*; import mindustry.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; /** Renders overlay lights. Client only. */ public class LightRenderer{ @@ -19,6 +19,9 @@ public class LightRenderer{ private float[] vertices = new float[24]; private FrameBuffer buffer = new FrameBuffer(); private Seq lights = new Seq<>(); + private Seq circles = new Seq<>(CircleLight.class); + private int circleIndex = 0; + private TextureRegion circleRegion; public void add(Runnable run){ if(!enabled()) return; @@ -27,14 +30,17 @@ public class LightRenderer{ } public void add(float x, float y, float radius, Color color, float opacity){ - if(!enabled()) return; + if(!enabled() || radius <= 0f) return; - float res = color.toFloatBits(); - add(() -> { - Draw.color(res); - Draw.alpha(opacity); - Draw.rect("circle-shadow", x, y, radius * 2, radius * 2); - }); + float res = Color.toFloatBits(color.r, color.g, color.b, opacity); + + if(circles.size <= circleIndex) circles.add(new CircleLight()); + + //pool circles to prevent runaway GC usage from lambda capturing + var light = circles.items[circleIndex]; + light.set(x, y, res, radius); + + circleIndex ++; } public void add(float x, float y, TextureRegion region, Color color, float opacity){ @@ -100,7 +106,6 @@ public class LightRenderer{ Draw.vert(ledge.texture, vertices, 0, vertices.length); - Vec2 v3 = Tmp.v2.trnsExact(rot, stroke); u = ledge.u; @@ -171,7 +176,7 @@ public class LightRenderer{ } public boolean enabled(){ - return state.rules.lighting && state.rules.ambientLight.a > 0.00001f; + return state.rules.lighting && state.rules.ambientLight.a > 0.0001f; } public void draw(){ @@ -180,6 +185,8 @@ public class LightRenderer{ return; } + if(circleRegion == null) circleRegion = Core.atlas.find("circle-shadow"); + buffer.resize(Core.graphics.getWidth()/scaling, Core.graphics.getHeight()/scaling); Draw.color(); @@ -189,6 +196,11 @@ public class LightRenderer{ for(Runnable run : lights){ run.run(); } + for(int i = 0; i < circleIndex; i++){ + var cir = circles.items[i]; + Draw.color(cir.color); + Draw.rect(circleRegion, cir.x, cir.y, cir.radius * 2, cir.radius * 2); + } Draw.reset(); buffer.end(); Gl.blendEquationSeparate(Gl.funcAdd, Gl.funcAdd); @@ -198,5 +210,17 @@ public class LightRenderer{ buffer.blit(Shaders.light); lights.clear(); + circleIndex = 0; } -} \ No newline at end of file + + static class CircleLight{ + float x, y, color, radius; + + public void set(float x, float y, float color, float radius){ + this.x = x; + this.y = y; + this.color = color; + this.radius = radius; + } + } +} diff --git a/core/src/mindustry/graphics/LoadRenderer.java b/core/src/mindustry/graphics/LoadRenderer.java index 35674837d6..c15e948285 100644 --- a/core/src/mindustry/graphics/LoadRenderer.java +++ b/core/src/mindustry/graphics/LoadRenderer.java @@ -35,20 +35,28 @@ public class LoadRenderer implements Disposable{ private Mesh mesh = MeshBuilder.buildHex(colorRed, 2, true, 1f); private Camera3D cam = new Camera3D(); private int lastLength = -1; - private FxProcessor fx = new FxProcessor(Format.rgba8888, 2, 2, false, true); + private FxProcessor fx; private WindowedMean renderTimes = new WindowedMean(20); + private BloomFilter bloom; private long lastFrameTime; { + //some systems don't support rgba8888 w/ a stencil buffer + try{ + fx = new FxProcessor(Format.rgba8888, 2, 2, false, true); + }catch(Exception e){ + fx = new FxProcessor(Format.rgb565, 2, 2, false, true); + } + //vignetting is probably too much //fx.addEffect(new VignettingFilter(false)); - fx.addEffect(new BloomFilter()); + fx.addEffect(bloom = new BloomFilter()); bars = new Bar[]{ new Bar("s_proc#", OS.cores / 16f, OS.cores < 4), new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false), - new Bar("g_vtype", graphics.getGLVersion().type == Type.GLES ? 0.5f : 1f, graphics.getGLVersion().type == Type.GLES), - new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024*1024*110), + new Bar("g_vtype", graphics.getGLVersion().type == GlType.GLES ? 0.5f : 1f, graphics.getGLVersion().type == GlType.GLES), + new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110), new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")), new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac), new Bar("v_worlds#", () -> Vars.control != null && Vars.control.saves != null, () -> Vars.control.saves.getSaveSlots().size / 30f, () -> Vars.control.saves.getSaveSlots().size > 30), @@ -62,6 +70,7 @@ public class LoadRenderer implements Disposable{ public void dispose(){ mesh.dispose(); fx.dispose(); + bloom.dispose(); } public void draw(){ @@ -304,7 +313,7 @@ public class LoadRenderer implements Disposable{ float vsize = vcont - vpad*2; int rx = (int)(vx + vw/2f - vsize/2f), ry = (int)(vy + vh/2f - vsize/2f), rw = (int)vsize, rh = (int)vsize; - float vrad = vsize/2f + vpad / 1f; + float vrad = vsize/2f + vpad; //planet + bars if(!graphics.isPortrait()){ @@ -463,7 +472,7 @@ public class LoadRenderer implements Disposable{ Font font = assets.get("tech"); font.setColor(Pal.accent); Draw.color(Color.black); - font.draw(red + "[[[[ " + key + " ]]\n"+orange+"<" + Version.modifier + " " + (Version.build == 0 ? " [init]" : Version.build == -1 ? " custom" : " " + Version.build) + ">", w/2f, h/2f + 110*s, Align.center); + font.draw(red + "[[[[ " + key + " ]]\n" + orange + "<" + Version.modifier + " " + (Version.build == 0 ? "[init]" : Version.buildString()) + ">", w/2f, h/2f + 110*s, Align.center); } Draw.flush(); diff --git a/core/src/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java index 5d036ce4e5..dbbf75f06a 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -12,7 +12,6 @@ import arc.util.*; import arc.util.noise.*; import mindustry.content.*; import mindustry.type.*; -import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; @@ -30,19 +29,19 @@ public class MenuRenderer implements Disposable{ private float time = 0f; private float flyerRot = 45f; private int flyers = Mathf.chance(0.2) ? Mathf.random(35) : Mathf.random(15); - private UnitType flyerType = Structs.select(UnitTypes.flare, UnitTypes.flare, UnitTypes.horizon, UnitTypes.mono, UnitTypes.poly, UnitTypes.mega, UnitTypes.zenith); + private UnitType flyerType = content.units().select(u -> u.hitSize <= 20f && u.flying && u.region.found()).random(); public MenuRenderer(){ Time.mark(); generate(); cache(); - Log.info("Time to generate menu: @", Time.elapsed()); + Log.debug("Time to generate menu: @", Time.elapsed()); } private void generate(){ world.beginMapLoad(); Tiles tiles = world.resize(width, height); - Seq ores = content.blocks().select(b -> b instanceof OreBlock); + Seq ores = content.blocks().select(b -> b instanceof OreBlock && !(b instanceof WallOreBlock)); shadows = new FrameBuffer(width, height); int offset = Mathf.random(100000); Simplex s1 = new Simplex(offset); @@ -237,16 +236,14 @@ public class MenuRenderer implements Disposable{ } private void drawFlyers(){ - //TODO fix - if(true) return; Draw.color(0f, 0f, 0f, 0.4f); - TextureRegion icon = flyerType.icon(Cicon.full); + TextureRegion icon = flyerType.fullIcon; float size = Math.max(icon.width, icon.height) * Draw.scl * 1.6f; flyers((x, y) -> { - Draw.rect(flyerType.region, x - 12f, y - 13f, flyerRot - 90); + Draw.rect(icon, x - 12f, y - 13f, flyerRot - 90); }); flyers((x, y) -> { @@ -259,14 +256,14 @@ public class MenuRenderer implements Disposable{ Draw.color(Pal.engine); Fill.circle(x + Angles.trnsx(rotation + 180, engineOffset), y + Angles.trnsy(rotation + 180, engineOffset), - engineSize + Mathf.absin(Time.time(), 2f, engineSize / 4f)); + engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f)); Draw.color(Color.white); Fill.circle(x + Angles.trnsx(rotation + 180, engineOffset - 1f), y + Angles.trnsy(rotation + 180, engineOffset - 1f), - (engineSize + Mathf.absin(Time.time(), 2f, engineSize / 4f)) / 2f); + (engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f)) / 2f); Draw.color(); - Draw.rect(flyerType.region, x, y, flyerRot - 90); + Draw.rect(icon, x, y, flyerRot - 90); }); } @@ -277,10 +274,12 @@ public class MenuRenderer implements Disposable{ float offset = -100f; for(int i = 0; i < flyers; i++){ - Tmp.v1.trns(flyerRot, time * (2f + flyerType.speed)); + Tmp.v1.trns(flyerRot, time * (flyerType.speed)); - cons.get((Mathf.randomSeedRange(i, range) + Tmp.v1.x + Mathf.absin(time + Mathf.randomSeedRange(i + 2, 500), 10f, 3.4f) + offset) % (tw + Mathf.randomSeed(i + 5, 0, 500)), - (Mathf.randomSeedRange(i + 1, range) + Tmp.v1.y + Mathf.absin(time + Mathf.randomSeedRange(i + 3, 500), 10f, 3.4f) + offset) % th); + cons.get( + (Mathf.randomSeedRange(i, range) + Tmp.v1.x + Mathf.absin(time + Mathf.randomSeedRange(i + 2, 500), 10f, 3.4f) + offset) % (tw + Mathf.randomSeed(i + 5, 0, 500)), + (Mathf.randomSeedRange(i + 1, range) + Tmp.v1.y + Mathf.absin(time + Mathf.randomSeedRange(i + 3, 500), 10f, 3.4f) + offset) % th + ); } } diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index f9803b9db8..a77face3f4 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -2,14 +2,12 @@ package mindustry.graphics; import arc.*; import arc.graphics.*; -import arc.graphics.Pixmap.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.entities.*; import mindustry.game.EventType.*; @@ -20,7 +18,7 @@ import mindustry.world.*; import static mindustry.Vars.*; -public class MinimapRenderer implements Disposable{ +public class MinimapRenderer{ private static final float baseSize = 16f; private final Seq units = new Seq<>(); private Pixmap pixmap; @@ -37,6 +35,7 @@ public class MinimapRenderer implements Disposable{ //make sure to call on the graphics thread Events.on(TileChangeEvent.class, event -> { + //TODO don't update when the minimap is off? if(!ui.editor.isShown()){ update(event.tile); } @@ -70,7 +69,7 @@ public class MinimapRenderer implements Disposable{ texture.dispose(); } setZoom(4f); - pixmap = new Pixmap(world.width(), world.height(), Format.rgba8888); + pixmap = new Pixmap(world.width(), world.height()); texture = new Texture(pixmap); region = new TextureRegion(texture); } @@ -92,18 +91,24 @@ public class MinimapRenderer implements Disposable{ rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize); for(Unit unit : units){ - float rx = !withLabels ? (unit.x() - rect.x) / rect.width * w : unit.x() / (world.width() * tilesize) * w; - float ry = !withLabels ? (unit.y() - rect.y) / rect.width * h : unit.y() / (world.height() * tilesize) * h; + float rx = !withLabels ? (unit.x - rect.x) / rect.width * w : unit.x / (world.width() * tilesize) * w; + float ry = !withLabels ? (unit.y - rect.y) / rect.width * h : unit.y / (world.height() * tilesize) * h; Draw.mixcol(unit.team().color, 1f); float scale = Scl.scl(1f) / 2f * scaling * 32f; - Draw.rect(unit.type().icon(Cicon.full), x + rx, y + ry, scale, scale, unit.rotation() - 90); + var region = unit.type.fullIcon; + Draw.rect(region, x + rx, y + ry, scale, scale * (float)region.height / region.width, unit.rotation() - 90); Draw.reset(); + } - //only disable player names in multiplayer - if(withLabels && unit.isPlayer() && net.active()){ - Player pl = unit.getPlayer(); - drawLabel(x + rx, y + ry, pl.name, unit.team().color); + if(withLabels && net.active()){ + for(Player player : Groups.player){ + if(!player.dead()){ + float rx = player.x / (world.width() * tilesize) * w; + float ry = player.y / (world.height() * tilesize) * h; + + drawLabel(x + rx, y + ry, player.name, player.team().color); + } } } @@ -131,7 +136,7 @@ public class MinimapRenderer implements Disposable{ public void updateAll(){ for(Tile tile : world.tiles){ - pixmap.draw(tile.x, pixmap.getHeight() - 1 - tile.y, colorFor(tile)); + pixmap.set(tile.x, pixmap.height - 1 - tile.y, colorFor(tile)); } texture.draw(pixmap); } @@ -139,10 +144,10 @@ public class MinimapRenderer implements Disposable{ public void update(Tile tile){ if(world.isGenerating() || !state.isGame()) return; - int color = colorFor(world.tile(tile.x, tile.y)); - pixmap.draw(tile.x, pixmap.getHeight() - 1 - tile.y, color); + int color = colorFor(tile); + pixmap.set(tile.x, pixmap.height - 1 - tile.y, color); - Pixmaps.drawPixel(texture, tile.x, pixmap.getHeight() - 1 - tile.y, color); + Pixmaps.drawPixel(texture, tile.x, pixmap.height - 1 - tile.y, color); } public void updateUnitArray(){ @@ -159,22 +164,12 @@ public class MinimapRenderer implements Disposable{ private int colorFor(Tile tile){ if(tile == null) return 0; int bc = tile.block().minimapColor(tile); - Color color = Tmp.c1.set(bc == 0 ? MapIO.colorFor(tile.floor(), tile.block(), tile.overlay(), tile.team()) : bc); + Color color = Tmp.c1.set(bc == 0 ? MapIO.colorFor(tile.block(), tile.floor(), tile.overlay(), tile.team()) : bc); color.mul(1f - Mathf.clamp(world.getDarkness(tile.x, tile.y) / 4f)); return color.rgba(); } - @Override - public void dispose(){ - if(pixmap != null && texture != null){ - pixmap.dispose(); - texture.dispose(); - texture = null; - pixmap = null; - } - } - public void drawLabel(float x, float y, String text, Color color){ Font font = Fonts.outline; GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new); diff --git a/core/src/mindustry/graphics/MultiPacker.java b/core/src/mindustry/graphics/MultiPacker.java index ac8277b078..eb823ea991 100644 --- a/core/src/mindustry/graphics/MultiPacker.java +++ b/core/src/mindustry/graphics/MultiPacker.java @@ -1,21 +1,40 @@ package mindustry.graphics; import arc.graphics.*; -import arc.graphics.Pixmap.*; import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.util.*; +import mindustry.*; public class MultiPacker implements Disposable{ private PixmapPacker[] packers = new PixmapPacker[PageType.all.length]; public MultiPacker(){ for(int i = 0; i < packers.length; i++){ - int pageSize = 2048; - packers[i] = new PixmapPacker(pageSize, pageSize, Format.rgba8888, 2, true); + packers[i] = new PixmapPacker(Math.min(Vars.maxTextureSize, PageType.all[i].width), Math.min(Vars.maxTextureSize, PageType.all[i].height), 2, true); } } + @Nullable + public PixmapRegion get(String name){ + for(var packer : packers){ + var region = packer.getRegion(name); + if(region != null){ + return region; + } + } + return null; + } + + public boolean has(String name){ + for(var page : PageType.all){ + if(packers[page.ordinal()].getRect(name) != null){ + return true; + } + } + return false; + } + public boolean has(PageType type, String name){ return packers[type.ordinal()].getRect(name) != null; } @@ -24,6 +43,10 @@ public class MultiPacker implements Disposable{ packers[type.ordinal()].pack(name, region); } + public void add(PageType type, String name, PixmapRegion region, int[] splits, int[] pads){ + packers[type.ordinal()].pack(name, region, splits, pads); + } + public void add(PageType type, String name, Pixmap pix){ packers[type.ordinal()].pack(name, pix); } @@ -50,11 +73,27 @@ public class MultiPacker implements Disposable{ //zone page (sprites4.png) - zone previews //ui page (sprites5.png) - content icons, white icons and UI elements public enum PageType{ - main, + main(4096), environment, - editor, - ui; + editor(4096, 2048), + rubble, + ui(4096); public static final PageType[] all = values(); + + public int width = 2048, height = 2048; + + PageType(int defaultSize){ + this.width = this.height = defaultSize; + } + + PageType(int width, int height){ + this.width = width; + this.height = height; + } + + PageType(){ + + } } } diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index ea988e5e78..5279de9e4d 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -7,6 +7,8 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.*; +import mindustry.ai.types.*; +import mindustry.entities.*; import mindustry.gen.*; import mindustry.input.*; import mindustry.ui.*; @@ -18,8 +20,9 @@ public class OverlayRenderer{ private static final float indicatorLength = 14f; private static final float spawnerMargin = tilesize*11f; private static final Rect rect = new Rect(); + private float buildFade, unitFade; - private Unit lastSelect; + private Sized lastSelect; public void drawBottom(){ InputHandler input = control.input; @@ -27,7 +30,7 @@ public class OverlayRenderer{ if(player.dead()) return; if(player.isBuilder()){ - player.builder().drawBuildRequests(); + player.unit().drawBuildPlans(); } input.drawBottom(); @@ -35,7 +38,7 @@ public class OverlayRenderer{ public void drawTop(){ - if(!player.dead()){ + if(!player.dead() && ui.hudfrag.shown){ if(Core.settings.getBool("playerindicators")){ for(Player player : Groups.player){ if(Vars.player != player && Vars.player.team() == player.team()){ @@ -70,25 +73,33 @@ public class OverlayRenderer{ InputHandler input = control.input; - Unit select = input.selectedUnit(); + + Sized select = input.selectedUnit(); + if(select == null) select = input.selectedControlBuild(); if(!Core.input.keyDown(Binding.control)) select = null; + unitFade = Mathf.lerpDelta(unitFade, Mathf.num(select != null), 0.1f); if(select != null) lastSelect = select; if(select == null) select = lastSelect; - if(select != null && select.isAI()){ + if(select != null && (!(select instanceof Unitc u) || u.isAI())){ Draw.mixcol(Pal.accent, 1f); Draw.alpha(unitFade); + Building build = (select instanceof BlockUnitc b ? b.tile() : select instanceof Building b ? b : null); - if(select instanceof BlockUnitc){ + if(build != null){ //special selection for block "units" - Fill.square(select.x, select.y, ((BlockUnitc)select).tile().block.size * tilesize/2f); - }else{ - Draw.rect(select.type().icon(Cicon.full), select.x(), select.y(), select.rotation() - 90); + Fill.square(build.x, build.y, build.block.size * tilesize/2f); + }else if(select instanceof Unit u){ + Draw.rect(u.type.fullIcon, u.x, u.y, u.rotation - 90); + } + + for(int i = 0; i < 4; i++){ + float rot = i * 90f + 45f + (-Time.time) % 360f; + float length = select.hitSize() * 1.5f + (unitFade * 2.5f); + Draw.rect("select-arrow", select.getX() + Angles.trnsx(rot, length), select.getY() + Angles.trnsy(rot, length), length / 1.9f, length / 1.9f, rot - 135f); } - Lines.stroke(unitFade); - Lines.square(select.x, select.y, select.hitSize() * 1.5f, Time.time() * 2f); Draw.reset(); } @@ -111,19 +122,21 @@ public class OverlayRenderer{ if(dst < state.rules.enemyCoreBuildRadius * 2.2f){ Draw.color(Color.darkGray); Lines.circle(core.x, core.y - 2, state.rules.enemyCoreBuildRadius); - Draw.color(Pal.accent, core.team.color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f)); + Draw.color(Pal.accent, core.team.color, 0.5f + Mathf.absin(Time.time, 10f, 0.5f)); Lines.circle(core.x, core.y, state.rules.enemyCoreBuildRadius); } }); } Lines.stroke(2f); - Draw.color(Color.gray, Color.lightGray, Mathf.absin(Time.time(), 8f, 1f)); + Draw.color(Color.gray, Color.lightGray, Mathf.absin(Time.time, 8f, 1f)); - for(Tile tile : spawner.getSpawns()){ - if(tile.within(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); + if(state.hasSpawns()){ + for(Tile tile : spawner.getSpawns()){ + if(tile.within(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); + } } } @@ -151,21 +164,29 @@ public class OverlayRenderer{ input.drawOverSelect(); + if(ui.hudfrag.blockfrag.hover() instanceof Unit unit && unit.controller() instanceof LogicAI ai && ai.controller != null && ai.controller.isValid()){ + var build = ai.controller; + Drawf.square(build.x, build.y, build.block.size * tilesize/2f + 2f); + if(!unit.within(build, unit.hitSize * 2f)){ + Drawf.arrow(unit.x, unit.y, build.x, build.y, unit.hitSize *2f, 4f); + } + } + //draw selection overlay when dropping item if(input.isDroppingItem()){ Vec2 v = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); float size = 8; - Draw.rect(player.unit().item().icon(Cicon.medium), v.x, v.y, size, size); + Draw.rect(player.unit().item().fullIcon, v.x, v.y, size, size); Draw.color(Pal.accent); - Lines.circle(v.x, v.y, 6 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.circle(v.x, v.y, 6 + Mathf.absin(Time.time, 5f, 1f)); Draw.reset(); Building tile = world.buildWorld(v.x, v.y); - if(tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0 && player.within(tile, itemTransferRange)){ + if(input.canDropItem() && tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0 && player.within(tile, itemTransferRange)){ Lines.stroke(3f, Pal.gray); - Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 3 + Mathf.absin(Time.time, 5f, 1f)); Lines.stroke(1f, Pal.place); - Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 2 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 2 + Mathf.absin(Time.time, 5f, 1f)); Draw.reset(); } diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index a61b363557..012e5a0aff 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -1,10 +1,12 @@ package mindustry.graphics; -import arc.graphics.Color; +import arc.graphics.*; public class Pal{ public static Color + thoriumPink = Color.valueOf("f9a3c7"), + items = Color.valueOf("2ea756"), command = Color.valueOf("eab678"), @@ -12,10 +14,12 @@ public class Pal{ sapBullet = Color.valueOf("bf92f9"), sapBulletBack = Color.valueOf("6d56bf"), + reactorPurple = Color.valueOf("bf92f9"), + reactorPurple2 = Color.valueOf("8a73c6"), + spore = Color.valueOf("7457ce"), shield = Color.valueOf("ffd37f").a(0.7f), - shieldIn = Color.black.cpy().a(0f), bulletYellow = Color.valueOf("fff8e8"), bulletYellowBack = Color.valueOf("f9c27a"), @@ -94,5 +98,13 @@ public class Pal{ redDust = Color.valueOf("ffa480"), redderDust = Color.valueOf("ff7b69"), - plasticSmoke = Color.valueOf("f1e479"); + plasticSmoke = Color.valueOf("f1e479"), + + adminChat = Color.valueOf("ff4000"), + + logicBlocks = Color.valueOf("d4816b"), + logicControl = Color.valueOf("6bb2b2"), + logicOperations = Color.valueOf("877bad"), + logicIo = Color.valueOf("a08a8a"), + logicUnits = Color.valueOf("c7b59d"); } diff --git a/core/src/mindustry/graphics/Pixelator.java b/core/src/mindustry/graphics/Pixelator.java index 4d77af56a7..5bce6721e3 100644 --- a/core/src/mindustry/graphics/Pixelator.java +++ b/core/src/mindustry/graphics/Pixelator.java @@ -8,7 +8,7 @@ import arc.graphics.gl.*; import arc.util.*; import static arc.Core.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; public class Pixelator implements Disposable{ private FrameBuffer buffer = new FrameBuffer(); diff --git a/core/src/mindustry/graphics/ScorchGenerator.java b/core/src/mindustry/graphics/ScorchGenerator.java deleted file mode 100644 index b7dfd15439..0000000000 --- a/core/src/mindustry/graphics/ScorchGenerator.java +++ /dev/null @@ -1,31 +0,0 @@ -package mindustry.graphics; - -import arc.graphics.*; -import arc.math.*; -import arc.util.noise.*; - -/** Generates a scorch pixmap based on parameters. Thread safe, unless multiple scorch generators are running in parallel. */ -public class ScorchGenerator{ - private static final Simplex sim = new Simplex(); - - public int size = 80, seed = 0, color = Color.white.rgba(); - public double scale = 18, pow = 2, octaves = 4, pers = 0.4, add = 2, nscl = 4.5f; - - public Pixmap generate(){ - Pixmap pix = new Pixmap(size, size); - sim.setSeed(seed); - - pix.each((x, y) -> { - double dst = Mathf.dst(x, y, size/2, size/2) / (size / 2f); - double scaled = Math.abs(dst - 0.5f) * 5f + add; - scaled -= noise(Angles.angle(x, y, size/2, size/2))*nscl; - if(scaled < 1.5f) pix.draw(x, y, color); - }); - - return pix; - } - - private double noise(float angle){ - return Math.pow(sim.octaveNoise2D(octaves, pers, 1 / scale, Angles.trnsx(angle, size/2f) + size/2f, Angles.trnsy(angle, size/2f) + size/2f), pow); - } -} diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 5fed02b762..75d61a2178 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -1,6 +1,7 @@ package mindustry.graphics; import arc.*; +import arc.files.*; import arc.graphics.*; import arc.graphics.Texture.*; import arc.graphics.g2d.*; @@ -8,19 +9,19 @@ import arc.graphics.g3d.*; import arc.graphics.gl.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.type.*; import static mindustry.Vars.*; public class Shaders{ - public static BlockBuild blockbuild; + public static BlockBuildShader blockbuild; public static @Nullable ShieldShader shield; - public static UnitBuild build; + public static BuildBeamShader buildBeam; + public static UnitBuildShader build; public static DarknessShader darkness; public static LightShader light; - public static SurfaceShader water, mud, tar, slag; + public static SurfaceShader water, mud, tar, slag, space, caustics; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; @@ -30,7 +31,7 @@ public class Shaders{ public static void init(){ mesh = new MeshShader(); - blockbuild = new BlockBuild(); + blockbuild = new BlockBuildShader(); try{ shield = new ShieldShader(); }catch(Throwable t){ @@ -38,13 +39,21 @@ public class Shaders{ shield = null; t.printStackTrace(); } - build = new UnitBuild(); + buildBeam = new BuildBeamShader(); + build = new UnitBuildShader(); darkness = new DarknessShader(); light = new LightShader(); water = new SurfaceShader("water"); mud = new SurfaceShader("mud"); tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); + space = new SpaceShader("space"); + caustics = new SurfaceShader("caustics"){ + @Override + public String textureName(){ + return "caustics"; + } + }; planet = new PlanetShader(); planetGrid = new PlanetGridShader(); atmosphere = new AtmosphereShader(); @@ -66,13 +75,13 @@ public class Shaders{ public void apply(){ setUniformf("u_resolution", Core.graphics.getWidth(), Core.graphics.getHeight()); - setUniformf("u_time", Time.globalTime() / 10f); + setUniformf("u_time", Time.globalTime / 10f); setUniformf("u_campos", camera.position); setUniformf("u_rcampos", Tmp.v31.set(camera.position).sub(planet.position)); setUniformf("u_light", planet.getLightNormal()); setUniformf("u_color", planet.atmosphereColor.r, planet.atmosphereColor.g, planet.atmosphereColor.b); - setUniformf("u_innerRadius", planet.radius + 0.02f); - setUniformf("u_outerRadius", planet.radius * 1.3f); + setUniformf("u_innerRadius", planet.radius + planet.atmosphereRadIn); + setUniformf("u_outerRadius", planet.radius + planet.atmosphereRadOut); setUniformMatrix4("u_model", planet.getTransform(mat).val); setUniformMatrix4("u_projection", camera.combined.val); @@ -139,12 +148,16 @@ public class Shaders{ } } - public static class UnitBuild extends LoadShader{ + /** @deprecated transition class for mods; use UnitBuildShader instead. */ + @Deprecated + public static class UnitBuild extends UnitBuildShader{} + + public static class UnitBuildShader extends LoadShader{ public float progress, time; public Color color = new Color(); public TextureRegion region; - public UnitBuild(){ + public UnitBuildShader(){ super("unitbuild", "default"); } @@ -159,22 +172,20 @@ public class Shaders{ } } - public static class BlockBuild extends LoadShader{ - public Color color = new Color(); + public static class BlockBuildShader extends LoadShader{ public float progress; public TextureRegion region = new TextureRegion(); - public BlockBuild(){ + public BlockBuildShader(){ super("blockbuild", "default"); } @Override public void apply(){ setUniformf("u_progress", progress); - setUniformf("u_color", color); setUniformf("u_uv", region.u, region.v); setUniformf("u_uv2", region.u2, region.v2); - setUniformf("u_time", Time.time()); + setUniformf("u_time", Time.time); setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -188,7 +199,25 @@ public class Shaders{ @Override public void apply(){ setUniformf("u_dp", Scl.scl(1f)); - setUniformf("u_time", Time.time() / Scl.scl(1f)); + setUniformf("u_time", Time.time / Scl.scl(1f)); + setUniformf("u_offset", + Core.camera.position.x - Core.camera.width / 2, + Core.camera.position.y - Core.camera.height / 2); + setUniformf("u_texsize", Core.camera.width, Core.camera.height); + setUniformf("u_invsize", 1f/Core.camera.width, 1f/Core.camera.height); + } + } + + public static class BuildBeamShader extends LoadShader{ + + public BuildBeamShader(){ + super("buildbeam", "screenspace"); + } + + @Override + public void apply(){ + setUniformf("u_dp", Scl.scl(1f)); + setUniformf("u_time", Time.time / Scl.scl(1f)); setUniformf("u_offset", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); @@ -197,12 +226,53 @@ public class Shaders{ } } - public static class SurfaceShader extends LoadShader{ + //seed: 8kmfuix03fw + public static class SpaceShader extends SurfaceShader{ + Texture texture; + + public SpaceShader(String frag){ + super(frag); + + Core.assets.load("sprites/space.png", Texture.class).loaded = t -> { + texture = (Texture)t; + texture.setFilter(TextureFilter.linear); + texture.setWrap(TextureWrap.mirroredRepeat); + }; + } + + @Override + public void apply(){ + setUniformf("u_campos", Core.camera.position.x, Core.camera.position.y); + setUniformf("u_ccampos", Core.camera.position); + setUniformf("u_resolution", Core.graphics.getWidth(), Core.graphics.getHeight()); + setUniformf("u_time", Time.time); + + texture.bind(1); + renderer.effectBuffer.getTexture().bind(0); + + setUniformi("u_stars", 1); + } + } + + public static class SurfaceShader extends Shader{ + Texture noiseTex; public SurfaceShader(String frag){ - super(frag, "screenspace"); + super(getShaderFi("screenspace.vert"), getShaderFi(frag + ".frag")); + loadNoise(); + } - Core.assets.load("sprites/noise.png", Texture.class).loaded = t -> { + public SurfaceShader(String vertRaw, String fragRaw){ + super(vertRaw, fragRaw); + loadNoise(); + } + + public String textureName(){ + return "noise"; + } + + public void loadNoise(){ + Core.assets.load("sprites/" + textureName() + ".png", Texture.class).loaded = t -> { ((Texture)t).setFilter(TextureFilter.linear); ((Texture)t).setWrap(TextureWrap.repeat); }; @@ -212,10 +282,14 @@ public class Shaders{ public void apply(){ setUniformf("u_campos", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); setUniformf("u_resolution", Core.camera.width, Core.camera.height); - setUniformf("u_time", Time.time()); + setUniformf("u_time", Time.time); if(hasUniform("u_noise")){ - Core.assets.get("sprites/noise.png", Texture.class).bind(1); + if(noiseTex == null){ + noiseTex = Core.assets.get("sprites/" + textureName() + ".png", Texture.class); + } + + noiseTex.bind(1); renderer.effectBuffer.getTexture().bind(0); setUniformi("u_noise", 1); @@ -224,9 +298,12 @@ public class Shaders{ } public static class LoadShader extends Shader{ - public LoadShader(String frag, String vert){ - super(Core.files.internal("shaders/" + vert + ".vert").readString(), Core.files.internal("shaders/" + frag + ".frag").readString()); + super(getShaderFi(vert + ".vert"), getShaderFi(frag + ".frag")); } } + + public static Fi getShaderFi(String file){ + return Core.files.internal("shaders/" + file); + } } diff --git a/core/src/mindustry/graphics/Trail.java b/core/src/mindustry/graphics/Trail.java index 9838e40b63..fc998e64ea 100644 --- a/core/src/mindustry/graphics/Trail.java +++ b/core/src/mindustry/graphics/Trail.java @@ -3,51 +3,101 @@ package mindustry.graphics; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.struct.*; -import arc.util.pooling.*; +import arc.util.*; public class Trail{ public int length; - private final Seq points; - private float lastX = -1, lastY = -1; + private final FloatSeq points; + private float lastX = -1, lastY = -1, lastAngle = -1, counter = 0f; public Trail(int length){ this.length = length; - points = new Seq<>(length); + points = new FloatSeq(length*3); + } + + public Trail copy(){ + Trail out = new Trail(length); + out.points.addAll(points); + out.lastX = lastX; + out.lastY = lastY; + out.lastAngle = lastAngle; + return out; } public void clear(){ points.clear(); } + public int size(){ + return points.size/3; + } + + public void drawCap(Color color, float width){ + if(points.size > 0){ + Draw.color(color); + float[] items = points.items; + int i = points.size - 3; + float x1 = items[i], y1 = items[i + 1], w1 = items[i + 2], w = w1 * width / (points.size/3) * i/3f * 2f; + Draw.rect("hcircle", x1, y1, w, w, -Mathf.radDeg * lastAngle + 180f); + Draw.reset(); + } + } + public void draw(Color color, float width){ Draw.color(color); + float[] items = points.items; + float lx = lastX, ly = lastY, lastAngle = this.lastAngle; - for(int i = 0; i < points.size - 1; i++){ - Vec3 c = points.get(i); - Vec3 n = points.get(i + 1); - float size = width * 1f / length; + for(int i = 0; i < points.size - 3; i+= 3){ + float x1 = items[i], y1 = items[i + 1], w1 = items[i + 2], + x2 = items[i + 3], y2 = items[i + 4], w2 = items[i + 5]; + float size = width / (points.size/3); + float z1 = lastAngle; + float z2 = -Angles.angleRad(x2, y2, lx, ly); - float cx = Mathf.sin(c.z) * i * size, cy = Mathf.cos(c.z) * i * size, nx = Mathf.sin(n.z) * (i + 1) * size, ny = Mathf.cos(n.z) * (i + 1) * size; - Fill.quad(c.x - cx, c.y - cy, c.x + cx, c.y + cy, n.x + nx, n.y + ny, n.x - nx, n.y - ny); + float cx = Mathf.sin(z1) * i/3f * size * w1, cy = Mathf.cos(z1) * i/3f * size * w1, + nx = Mathf.sin(z2) * (i/3f + 1) * size * w2, ny = Mathf.cos(z2) * (i/3f + 1) * size * w2; + Fill.quad(x1 - cx, y1 - cy, x1 + cx, y1 + cy, x2 + nx, y2 + ny, x2 - nx, y2 - ny); + + lastAngle = z2; + lx = x2; + ly = y2; } Draw.reset(); } - public void update(float x, float y){ - if(points.size > length){ - Pools.free(points.first()); - points.remove(0); + /** Removes the last point from the trail at intervals. */ + public void shorten(){ + if((counter += Time.delta) >= 0.99f){ + if(points.size >= 3){ + points.removeRange(0, 2); + } } + } - float angle = -Angles.angle(x, y, lastX, lastY); + /** Adds a new point to the trail at intervals. */ + public void update(float x, float y){ + update(x, y, 1f); + } - points.add(Pools.obtain(Vec3.class, Vec3::new).set(x, y, (angle) * Mathf.degRad)); + /** Adds a new point to the trail at intervals. */ + public void update(float x, float y, float width){ + if((counter += Time.delta) >= 0.99f){ + if(points.size > length*3){ + points.removeRange(0, 2); + } - lastX = x; - lastY = y; + lastAngle = -Angles.angleRad(x, y, lastX, lastY); + + points.add(x, y, width); + + lastX = x; + lastY = y; + + counter = 0f; + } } } diff --git a/core/src/mindustry/graphics/g3d/MeshBuilder.java b/core/src/mindustry/graphics/g3d/MeshBuilder.java index dc26cec9f5..1eeec3e891 100644 --- a/core/src/mindustry/graphics/g3d/MeshBuilder.java +++ b/core/src/mindustry/graphics/g3d/MeshBuilder.java @@ -1,8 +1,6 @@ package mindustry.graphics.g3d; import arc.graphics.*; -import arc.graphics.VertexAttributes.*; -import arc.graphics.gl.*; import arc.math.geom.*; import mindustry.graphics.g3d.PlanetGrid.*; @@ -77,8 +75,6 @@ public class MeshBuilder{ if(c.length > 5){ verts(c[0].v, c[4].v, c[5].v, nor, color); - }else{ - verts(c[0].v, c[3].v, c[4].v, nor, color); } } @@ -94,9 +90,9 @@ public class MeshBuilder{ private static void begin(int count){ mesh = new Mesh(true, count, 0, - new VertexAttribute(Usage.position, 3, Shader.positionAttribute), - new VertexAttribute(Usage.normal, 3, Shader.normalAttribute), - new VertexAttribute(Usage.colorPacked, 4, Shader.colorAttribute) + VertexAttribute.position3, + VertexAttribute.normal, + VertexAttribute.color ); mesh.getVerticesBuffer().limit(mesh.getMaxVertices()); @@ -105,6 +101,7 @@ public class MeshBuilder{ private static Mesh end(){ Mesh last = mesh; + last.getVerticesBuffer().limit(last.getVerticesBuffer().position()); mesh = null; return last; } diff --git a/core/src/mindustry/graphics/g3d/PlanetGrid.java b/core/src/mindustry/graphics/g3d/PlanetGrid.java index e4972e3eb7..9b72970087 100644 --- a/core/src/mindustry/graphics/g3d/PlanetGrid.java +++ b/core/src/mindustry/graphics/g3d/PlanetGrid.java @@ -22,15 +22,16 @@ public class PlanetGrid{ {5, 3, 10, 1, 4}, {2, 5, 4, 0, 11}, {3, 7, 6, 1, 8}, {7, 2, 9, 0, 6} }; - public final int size; - public final Ptile[] tiles; - public final Corner[] corners; - public final Edge[] edges; + public int size; + public Ptile[] tiles; + public Corner[] corners; + public Edge[] edges; - PlanetGrid(int size){ + //this is protected so if you want to make strange grids you should know what you're doing. + protected PlanetGrid(int size){ this.size = size; - tiles = new Ptile[Buildingount(size)]; + tiles = new Ptile[tileCount(size)]; for(int i = 0; i < tiles.length; i++){ tiles[i] = new Ptile(i, i < 12 ? 5 : 6); } @@ -67,7 +68,7 @@ public class PlanetGrid{ return result; } - static PlanetGrid initialGrid(){ + public static PlanetGrid initialGrid(){ PlanetGrid grid = new PlanetGrid(0); for(Ptile t : grid.tiles){ @@ -111,7 +112,7 @@ public class PlanetGrid{ return grid; } - static PlanetGrid subdividedGrid(PlanetGrid prev){ + public static PlanetGrid subdividedGrid(PlanetGrid prev){ PlanetGrid grid = new PlanetGrid(prev.size + 1); int prevTiles = prev.tiles.length; @@ -187,27 +188,27 @@ public class PlanetGrid{ } static int pos(Ptile t, Ptile n){ - for(int i = 0; i < t.edgeCount; i++) - if(t.tiles[i] == n) - return i; + for(int i = 0; i < t.edgeCount; i++){ + if(t.tiles[i] == n) return i; + } return -1; } static int pos(Ptile t, Corner c){ - for(int i = 0; i < t.edgeCount; i++) - if(t.corners[i] == c) - return i; + for(int i = 0; i < t.edgeCount; i++){ + if(t.corners[i] == c) return i; + } return -1; } static int pos(Corner c, Corner n){ - for(int i = 0; i < 3; i++) - if(c.corners[i] == n) - return i; + for(int i = 0; i < 3; i++){ + if(c.corners[i] == n) return i; + } return -1; } - static int Buildingount(int size){ + static int tileCount(int size){ return 10 * Mathf.pow(3, size) + 2; } @@ -220,12 +221,12 @@ public class PlanetGrid{ } public static class Ptile{ - public final int id; - public final int edgeCount; + public int id; + public int edgeCount; - public final Ptile[] tiles; - public final Corner[] corners; - public final Edge[] edges; + public Ptile[] tiles; + public Corner[] corners; + public Edge[] edges; public Vec3 v = new Vec3(); @@ -240,11 +241,11 @@ public class PlanetGrid{ } public static class Corner{ - public final int id; - public final Ptile[] tiles = new Ptile[3]; - public final Corner[] corners = new Corner[3]; - public final Edge[] edges = new Edge[3]; - public final Vec3 v = new Vec3(); + public int id; + public Ptile[] tiles = new Ptile[3]; + public Corner[] corners = new Corner[3]; + public Edge[] edges = new Edge[3]; + public Vec3 v = new Vec3(); public Corner(int id){ this.id = id; @@ -252,9 +253,9 @@ public class PlanetGrid{ } public static class Edge{ - public final int id; - public final Ptile[] tiles = new Ptile[2]; - public final Corner[] corners = new Corner[2]; + public int id; + public Ptile[] tiles = new Ptile[2]; + public Corner[] corners = new Corner[2]; public Edge(int id){ this.id = id; diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index e0e76c0cee..3401ba8b3d 100644 --- a/core/src/mindustry/graphics/g3d/PlanetRenderer.java +++ b/core/src/mindustry/graphics/g3d/PlanetRenderer.java @@ -10,6 +10,7 @@ import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; +import mindustry.game.EventType.*; import mindustry.graphics.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.type.*; @@ -17,16 +18,12 @@ import mindustry.type.*; public class PlanetRenderer implements Disposable{ public static final float outlineRad = 1.17f, camLength = 4f; public static final Color - outlineColor = Pal.accent.cpy().a(1f), - hoverColor = Pal.accent.cpy().a(0.5f), - borderColor = Pal.accent.cpy().a(0.3f), - shadowColor = new Color(0, 0, 0, 0.7f); + outlineColor = Pal.accent.cpy().a(1f), + hoverColor = Pal.accent.cpy().a(0.5f), + borderColor = Pal.accent.cpy().a(0.3f), + shadowColor = new Color(0, 0, 0, 0.7f); private static final Seq points = new Seq<>(); - private static final PlanetInterfaceRenderer emptyRenderer = new PlanetInterfaceRenderer(){ - @Override public void renderSectors(Planet planet){} - @Override public void renderProjections(){} - }; /** Camera direction relative to the planet. Length is determined by zoom. */ public final Vec3 camPos = new Vec3(); @@ -40,26 +37,28 @@ public class PlanetRenderer implements Disposable{ public final VertexBatch3D batch = new VertexBatch3D(20000, false, true, 0); public float zoom = 1f; + public float orbitAlpha = 1f; private final Mesh[] outlines = new Mesh[10]; - private final PlaneBatch3D projector = new PlaneBatch3D(); - private final Mat3D mat = new Mat3D(); - private final FrameBuffer buffer = new FrameBuffer(2, 2, true); - private PlanetInterfaceRenderer irenderer; + public final PlaneBatch3D projector = new PlaneBatch3D(); + public final Mat3D mat = new Mat3D(); + public final FrameBuffer buffer = new FrameBuffer(2, 2, true); + public PlanetInterfaceRenderer irenderer; - private final Bloom bloom = new Bloom(Core.graphics.getWidth()/4, Core.graphics.getHeight()/4, true, false){{ + public final Bloom bloom = new Bloom(Core.graphics.getWidth()/4, Core.graphics.getHeight()/4, true, false){{ setThreshold(0.8f); blurPasses = 6; }}; - private final Mesh atmosphere = MeshBuilder.buildHex(Color.white, 2, false, 1.5f); + public final Mesh atmosphere = MeshBuilder.buildHex(Color.white, 2, false, 1.5f); //seed: 8kmfuix03fw - private final CubemapMesh skybox = new CubemapMesh(new Cubemap("cubemaps/stars/")); + public final CubemapMesh skybox = new CubemapMesh(new Cubemap("cubemaps/stars/")); public PlanetRenderer(){ camPos.set(0, 0f, camLength); projector.setScaling(1f / 150f); cam.fov = 60f; + cam.far = 150f; } /** Render the entire planet scene to the screen. */ @@ -86,17 +85,37 @@ public class PlanetRenderer implements Disposable{ projector.proj(cam.combined); batch.proj(cam.combined); + Events.fire(Trigger.universeDrawBegin); + beginBloom(); + //render skybox at 0,0,0 + Vec3 lastPos = Tmp.v31.set(cam.position); + cam.position.setZero(); + cam.update(); + + Gl.depthMask(false); + skybox.render(cam.combined); + Gl.depthMask(true); + + cam.position.set(lastPos); + cam.update(); + + Events.fire(Trigger.universeDraw); + renderPlanet(solarSystem); + renderTransparent(solarSystem); + endBloom(); + Events.fire(Trigger.universeDrawEnd); + Gl.enable(Gl.blend); - irenderer.renderProjections(); + irenderer.renderProjections(planet); Gl.disable(Gl.cullFace); Gl.disable(Gl.depthTest); @@ -104,26 +123,39 @@ public class PlanetRenderer implements Disposable{ cam.update(); } - private void beginBloom(){ + public void beginBloom(){ bloom.resize(Core.graphics.getWidth() / 4, Core.graphics.getHeight() / 4); bloom.capture(); } - private void endBloom(){ + public void endBloom(){ bloom.render(); } - private void renderPlanet(Planet planet){ + + public void renderPlanet(Planet planet){ + if(!planet.visible()) return; + //render planet at offsetted position in the world - planet.mesh.render(cam.combined, planet.getTransform(mat)); + planet.draw(cam.combined, planet.getTransform(mat)); renderOrbit(planet); + for(Planet child : planet.children){ + renderPlanet(child); + } + } + + public void renderTransparent(Planet planet){ + if(!planet.visible()) return; + if(planet.isLandable() && planet == this.planet){ renderSectors(planet); } if(planet.parent != null && planet.hasAtmosphere && Core.settings.getBool("atmosphere")){ + Gl.depthMask(false); + Blending.additive.apply(); Shaders.atmosphere.camera = cam; @@ -134,24 +166,28 @@ public class PlanetRenderer implements Disposable{ atmosphere.render(Shaders.atmosphere, Gl.triangles); Blending.normal.apply(); + + Gl.depthMask(true); } for(Planet child : planet.children){ - renderPlanet(child); + renderTransparent(child); } } - private void renderOrbit(Planet planet){ - if(planet.parent == null) return; + public void renderOrbit(Planet planet){ + if(planet.parent == null || !planet.visible() || orbitAlpha <= 0.02f) return; Vec3 center = planet.parent.position; float radius = planet.orbitRadius; - int points = (int)(radius * 50); - Angles.circleVectors(points, radius, (cx, cy) -> batch.vertex(Tmp.v32.set(center).add(cx, 0, cy), Pal.gray)); + int points = (int)(radius * 10); + Angles.circleVectors(points, radius, (cx, cy) -> batch.vertex(Tmp.v32.set(center).add(cx, 0, cy), Pal.gray.write(Tmp.c1).a(orbitAlpha))); batch.flush(Gl.lineLoop); } - private void renderSectors(Planet planet){ + public void renderSectors(Planet planet){ + if(orbitAlpha <= 0.02f) return; + //apply transformed position batch.proj().mul(planet.getTransform(mat)); @@ -171,17 +207,24 @@ public class PlanetRenderer implements Disposable{ } public void drawArc(Planet planet, Vec3 a, Vec3 b){ + drawArc(planet, a, b, Pal.accent, Color.clear, 1f); + } + + public void drawArc(Planet planet, Vec3 a, Vec3 b, Color from, Color to, float length){ + drawArc(planet, a, b, from, to, length, 80f, 25); + } + + public void drawArc(Planet planet, Vec3 a, Vec3 b, Color from, Color to, float length, float timeScale, int pointCount){ Vec3 avg = Tmp.v31.set(b).add(a).scl(0.5f); - avg.setLength(planet.radius*2f); + avg.setLength(planet.radius*(1f+length)); points.clear(); points.addAll(Tmp.v33.set(b).setLength(outlineRad), Tmp.v31, Tmp.v34.set(a).setLength(outlineRad)); Tmp.bz3.set(points); - float points = 25; - for(int i = 0; i < points + 1; i++){ - float f = i / points; - Tmp.c1.set(Pal.accent).lerp(Color.clear, (f+Time.globalTime()/80f)%1f); + for(int i = 0; i < pointCount + 1; i++){ + float f = i / (float)pointCount; + Tmp.c1.set(from).lerp(to, (f+ Time.globalTime /timeScale)%1f); batch.color(Tmp.c1); batch.vertex(Tmp.bz3.valueAt(Tmp.v32, f)); @@ -190,7 +233,7 @@ public class PlanetRenderer implements Disposable{ } public void drawBorders(Sector sector, Color base){ - Color color = Tmp.c1.set(base).a(base.a + 0.3f + Mathf.absin(Time.globalTime(), 5f, 0.3f)); + Color color = Tmp.c1.set(base).a(base.a + 0.3f + Mathf.absin(Time.globalTime, 5f, 0.3f)); float r1 = 1f; float r2 = outlineRad + 0.001f; @@ -272,7 +315,7 @@ public class PlanetRenderer implements Disposable{ } } - private Mesh outline(int size){ + public Mesh outline(int size){ if(outlines[size] == null){ outlines[size] = MeshBuilder.buildHex(new HexMesher(){ @Override @@ -306,6 +349,6 @@ public class PlanetRenderer implements Disposable{ public interface PlanetInterfaceRenderer{ void renderSectors(Planet planet); - void renderProjections(); + void renderProjections(Planet planet); } } diff --git a/core/src/mindustry/input/Binding.java b/core/src/mindustry/input/Binding.java index 75655412cb..de9aa56d04 100644 --- a/core/src/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -58,6 +58,9 @@ public enum Binding implements KeyBind{ fullscreen(KeyCode.f11), pause(KeyCode.space), minimap(KeyCode.m), + research(KeyCode.b), + planet_map(KeyCode.n), + block_info(KeyCode.f1), toggle_menus(KeyCode.c), screenshot(KeyCode.p), toggle_power_lines(KeyCode.f5), @@ -67,6 +70,7 @@ public enum Binding implements KeyBind{ chat_history_prev(KeyCode.up), chat_history_next(KeyCode.down), chat_scroll(new Axis(KeyCode.scroll)), + chat_mode(KeyCode.tab), console(KeyCode.f8), ; diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index a71ed25564..3746dae72e 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -3,16 +3,16 @@ package mindustry.input; import arc.*; import arc.Graphics.*; import arc.Graphics.Cursor.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.scene.*; -import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; +import mindustry.core.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -43,40 +43,48 @@ public class DesktopInput extends InputHandler{ /** Whether player is currently deleting removal requests. */ public boolean deleting = false, shouldShoot = false, panning = false; /** Mouse pan speed. */ - public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 9f; + public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f; + /** Delta time between consecutive clicks. */ + public long selectMillis = 0; + /** Previously selected tile. */ + public Tile prevSelected; + + boolean showHint(){ + return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() && + (!isBuilding && !Core.settings.getBool("buildautopause") || player.unit().isBuilding() || !player.dead() && !player.unit().spawnedByCore()); + } @Override public void buildUI(Group group){ - + //building and respawn hints group.fill(t -> { - t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown() && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); + t.color.a = 0f; + t.visible(() -> (t.color.a = Mathf.lerpDelta(t.color.a, Mathf.num(showHint()), 0.15f)) > 0.001f); t.bottom(); t.table(Styles.black6, b -> { + StringBuilder str = new StringBuilder(); b.defaults().left(); - b.label(() -> Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())).style(Styles.outlineLabel); - }).margin(6f); - }); - - group.fill(t -> { - t.bottom(); - t.visible(() -> { - t.color.a = Mathf.lerpDelta(t.color.a, player.builder().isBuilding() ? 1f : 0f, 0.15f); - - return Core.settings.getBool("hints") && selectRequests.isEmpty() && t.color.a > 0.01f; - }); - t.touchable(() -> t.color.a < 0.1f ? Touchable.disabled : Touchable.childrenOnly); - t.table(Styles.black6, b -> { - b.defaults().left(); - b.label(() -> Core.bundle.format(!isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel); - b.row(); - b.label(() -> Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel); - b.row(); - b.label(() -> Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel); + b.label(() -> { + if(!showHint()) return str; + str.setLength(0); + if(!isBuilding && !Core.settings.getBool("buildautopause") && !player.unit().isBuilding()){ + str.append(Core.bundle.format("enablebuilding", Core.keybinds.get(Binding.pause_building).key.toString())); + }else if(player.unit().isBuilding()){ + str.append(Core.bundle.format(isBuilding ? "pausebuilding" : "resumebuilding", Core.keybinds.get(Binding.pause_building).key.toString())) + .append("\n").append(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())) + .append("\n").append(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())); + } + if(!player.dead() && !player.unit().spawnedByCore()){ + str.append(str.length() != 0 ? "\n" : "").append(Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())); + } + return str; + }).style(Styles.outlineLabel); }).margin(10f); }); + //schematic controls group.fill(t -> { - t.visible(() -> lastSchematic != null && !selectRequests.isEmpty()); + t.visible(() -> ui.hudfrag.shown && lastSchematic != null && !selectRequests.isEmpty()); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); @@ -121,7 +129,7 @@ public class DesktopInput extends InputHandler{ drawArrow(sreq.block, sreq.x, sreq.y, sreq.rotation, valid); } - sreq.block.drawRequest(sreq, allRequests(), valid); + sreq.block.drawPlan(sreq, allRequests(), valid); drawSelected(sreq.x, sreq.y, sreq.block, getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null ? Pal.remove : Pal.accent); } @@ -152,21 +160,24 @@ public class DesktopInput extends InputHandler{ } drawRequest(lineRequests.get(i)); } + lineRequests.each(this::drawOverRequest); }else if(isPlacing()){ - if(block.rotate){ + if(block.rotate && block.drawArrow){ drawArrow(block, cursorX, cursorY, rotation); } Draw.color(); + boolean valid = validPlace(cursorX, cursorY, block, rotation); drawRequest(cursorX, cursorY, block, rotation); - block.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, block, rotation)); + block.drawPlace(cursorX, cursorY, rotation, valid); - if(block.saveConfig && block.lastConfig != null){ + if(block.saveConfig){ + Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime, 6f, 0.28f)); brequest.set(cursorX, cursorY, rotation, block); brequest.config = block.lastConfig; block.drawRequestConfig(brequest, allRequests()); brequest.config = null; + Draw.reset(); } - } } @@ -177,14 +188,14 @@ public class DesktopInput extends InputHandler{ public void update(){ super.update(); - if(net.active() && Core.input.keyTap(Binding.player_list) && (scene.getKeyboardFocus() == null || scene.getKeyboardFocus().isDescendantOf(ui.listfrag.content))){ + if(net.active() && Core.input.keyTap(Binding.player_list) && (scene.getKeyboardFocus() == null || scene.getKeyboardFocus().isDescendantOf(ui.listfrag.content) || scene.getKeyboardFocus().isDescendantOf(ui.minimapfrag.elem))){ ui.listfrag.toggle(); } boolean panCam = false; float camSpeed = (!Core.input.keyDown(Binding.boost) ? panSpeed : panBoostSpeed) * Time.delta; - if(input.keyDown(Binding.pan)){ + if(input.keyDown(Binding.pan) && !scene.hasField() && !scene.hasDialog()){ panCam = true; panning = true; } @@ -194,11 +205,10 @@ public class DesktopInput extends InputHandler{ } //TODO awful UI state checking code - if(((player.dead() || state.isPaused()) && !ui.chatfrag.shown()) && (!scene.hasField() && !scene.hasDialog())){ + if(((player.dead() || state.isPaused()) && !ui.chatfrag.shown()) && !scene.hasField() && !scene.hasDialog()){ if(input.keyDown(Binding.mouse_move)){ panCam = true; } - panning = false; Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(camSpeed)); }else if(!player.dead() && !panning){ @@ -215,17 +225,20 @@ public class DesktopInput extends InputHandler{ if(!scene.hasMouse()){ if(Core.input.keyDown(Binding.control) && Core.input.keyTap(Binding.select)){ Unit on = selectedUnit(); + var build = selectedControlBuild(); if(on != null){ Call.unitControl(player, on); shouldShoot = false; + }else if(build != null){ + Call.buildingControlSelect(player, build); } } } - if(!player.dead() && !state.isPaused() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ + if(!player.dead() && !state.isPaused() && !scene.hasField()){ updateMovement(player.unit()); - if(Core.input.keyDown(Binding.respawn) && !player.unit().spawnedByCore() && !scene.hasField()){ + if(Core.input.keyDown(Binding.respawn)){ Call.unitClear(player); controlledType = null; } @@ -235,18 +248,27 @@ public class DesktopInput extends InputHandler{ player.shooting = false; } - if(state.isGame() && Core.input.keyTap(Binding.minimap) && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){ - ui.minimapfrag.toggle(); + if(state.isGame() && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){ + if(Core.input.keyTap(Binding.minimap)) ui.minimapfrag.toggle(); + if(Core.input.keyTap(Binding.planet_map) && state.isCampaign()) ui.planet.toggle(); + if(Core.input.keyTap(Binding.research) && state.isCampaign()) ui.research.toggle(); } if(state.isMenu() || Core.scene.hasDialog()) return; //zoom camera if((!Core.scene.hasScroll() || Core.input.keyDown(Binding.diagonal_placement)) && !ui.chatfrag.shown() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 - && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ + && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!player.isBuilder() || !isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } + if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){ + Tile selected = world.tileWorld(input.mouseWorldX(), input.mouseWorldY()); + if(selected != null){ + Call.tileTap(player, selected); + } + } + if(player.dead()){ cursorType = SystemCursor.arrow; return; @@ -279,7 +301,7 @@ public class DesktopInput extends InputHandler{ if(isPlacing() && mode == placing){ updateLine(selectX, selectY); - }else if(!selectRequests.isEmpty()){ + }else if(!selectRequests.isEmpty() && !ui.chatfrag.shown()){ rotateRequests(selectRequests, Mathf.sign(Core.input.axisTap(Binding.rotate))); } } @@ -291,7 +313,7 @@ public class DesktopInput extends InputHandler{ cursorType = cursor.build.getCursor(); } - if(isPlacing() || !selectRequests.isEmpty()){ + if((isPlacing() && player.isBuilder()) || !selectRequests.isEmpty()){ cursorType = SystemCursor.hand; } @@ -345,6 +367,10 @@ public class DesktopInput extends InputHandler{ ui.schematics.show(); }).tooltip("@schematics"); + table.button(Icon.book, Styles.clearPartiali, () -> { + ui.database.show(); + }).tooltip("@database"); + table.button(Icon.tree, Styles.clearPartiali, () -> { ui.research.show(); }).visible(() -> state.isCampaign()).tooltip("@research"); @@ -352,10 +378,6 @@ public class DesktopInput extends InputHandler{ table.button(Icon.map, Styles.clearPartiali, () -> { ui.planet.show(); }).visible(() -> state.isCampaign()).tooltip("@planetmap"); - - table.button(Icon.up, Styles.clearPartiali, () -> { - ui.planet.showLaunch(state.getSector(), player.team().core()); - }).visible(() -> state.isCampaign()).tooltip("@launchcore").disabled(b -> player.team().core() == null); } void pollInput(){ @@ -364,10 +386,10 @@ public class DesktopInput extends InputHandler{ Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY()); int cursorX = tileX(Core.input.mouseX()); int cursorY = tileY(Core.input.mouseY()); - int rawCursorX = world.toTile(Core.input.mouseWorld().x), rawCursorY = world.toTile(Core.input.mouseWorld().y); + int rawCursorX = World.toTile(Core.input.mouseWorld().x), rawCursorY = World.toTile(Core.input.mouseWorld().y); - // automatically pause building if the current build queue is empty - if(Core.settings.getBool("buildautopause") && isBuilding && !player.builder().isBuilding()){ + //automatically pause building if the current build queue is empty + if(Core.settings.getBool("buildautopause") && isBuilding && !player.unit().isBuilding()){ isBuilding = false; buildWasAutoPaused = true; } @@ -384,12 +406,12 @@ public class DesktopInput extends InputHandler{ schematicY += shiftY; } - if(Core.input.keyTap(Binding.deselect)){ - player.miner().mineTile(null); + if(Core.input.keyTap(Binding.deselect) && !isPlacing()){ + player.unit().mineTile = null; } if(Core.input.keyTap(Binding.clear_building)){ - player.builder().clearBuilding(); + player.unit().clearBuilding(); } if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard() && mode != breaking){ @@ -402,7 +424,6 @@ public class DesktopInput extends InputHandler{ ui.schematics.hide(); }else{ ui.schematics.show(); - ui.schematics.focusSearchField(); } } @@ -459,10 +480,6 @@ public class DesktopInput extends InputHandler{ } if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){ - if(selected != null){ - Call.tileTap(player, selected); - } - BuildPlan req = getRequest(cursorX, cursorY); if(Core.input.keyDown(Binding.break_block)){ @@ -482,13 +499,15 @@ public class DesktopInput extends InputHandler{ deleting = true; }else if(selected != null){ //only begin shooting if there's no cursor event - if(!tileTapped(selected.build) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.builder().plans().size == 0 || !player.builder().updateBuilding()) && !droppingItem && - !tryBeginMine(selected) && player.miner().mineTile() == null && !Core.scene.hasKeyboard()){ + if(!tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !tileTapped(selected.build) && !player.unit().activelyBuilding() && !droppingItem + && !(tryStopMine(selected) || (!settings.getBool("doubletapmine") || selected == prevSelected && Time.timeSinceMillis(selectMillis) < 500) && tryBeginMine(selected)) && !Core.scene.hasKeyboard()){ player.shooting = shouldShoot; } }else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine player.shooting = shouldShoot; } + selectMillis = Time.millis(); + prevSelected = selected; }else if(Core.input.keyTap(Binding.deselect) && isPlacing()){ block = null; mode = none; @@ -508,7 +527,7 @@ public class DesktopInput extends InputHandler{ if(Core.input.keyDown(Binding.select) && mode == none && !isPlacing() && deleting){ BuildPlan req = getRequest(cursorX, cursorY); if(req != null && req.breaking){ - player.builder().plans().remove(req); + player.unit().plans().remove(req); } }else{ deleting = false; @@ -549,7 +568,7 @@ public class DesktopInput extends InputHandler{ if(sreq != null){ if(getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null){ - player.builder().plans().remove(sreq, true); + player.unit().plans().remove(sreq, true); } sreq = null; } @@ -600,19 +619,9 @@ public class DesktopInput extends InputHandler{ } protected void updateMovement(Unit unit){ - boolean omni = unit.type().omniMovement; - boolean ground = unit.isGrounded(); + boolean omni = unit.type.omniMovement; - float strafePenalty = ground ? 1f : Mathf.lerp(1f, unit.type().strafePenalty, Angles.angleDist(unit.vel().angle(), unit.rotation()) / 180f); - float baseSpeed = unit.type().speed; - - //limit speed to minimum formation speed to preserve formation - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ - //add a tiny multiplier to let units catch up just in case - baseSpeed = ((Commanderc)unit).minFormationSpeed() * 0.95f; - } - - float speed = baseSpeed * Mathf.lerp(1f, unit.type().canBoost ? unit.type().boostMultiplier : 1f, unit.elevation) * strafePenalty; + float speed = unit.realSpeed(); float xa = Core.input.axis(Binding.move_x); float ya = Core.input.axis(Binding.move_y); boolean boosted = (unit instanceof Mechc && unit.isFlying()); @@ -623,35 +632,34 @@ public class DesktopInput extends InputHandler{ } float mouseAngle = Angles.mouseAngle(unit.x, unit.y); - boolean aimCursor = omni && player.shooting && unit.type().hasWeapons() && unit.type().faceTarget && !boosted && unit.type().rotateShooting; + boolean aimCursor = omni && player.shooting && unit.type.hasWeapons() && unit.type.faceTarget && !boosted && unit.type.rotateShooting; if(aimCursor){ unit.lookAt(mouseAngle); }else{ - if(!movement.isZero()){ - unit.lookAt(unit.vel.isZero() ? movement.angle() : unit.vel.angle()); - } + unit.lookAt(unit.prefRotation()); } if(omni){ unit.moveAt(movement); }else{ unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len())); - if(!movement.isZero() && ground){ - unit.vel.rotateTo(movement.angle(), unit.type().rotateSpeed); + + //problem: actual unit rotation is controlled by velocity, but velocity is 1) unpredictable and 2) can be set to 0 + if(!movement.isZero()){ + unit.rotation = Angles.moveToward(unit.rotation, movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1)); } } - unit.aim(unit.type().faceTarget ? Core.input.mouseWorld() : Tmp.v1.trns(unit.rotation, Core.input.mouseWorld().dst(unit)).add(unit.x, unit.y)); + unit.aim(unit.type.faceTarget ? Core.input.mouseWorld() : Tmp.v1.trns(unit.rotation, Core.input.mouseWorld().dst(unit)).add(unit.x, unit.y)); unit.controlWeapons(true, player.shooting && !boosted); - player.boosting = Core.input.keyDown(Binding.boost) && !movement.isZero(); + player.boosting = Core.input.keyDown(Binding.boost); player.mouseX = unit.aimX(); player.mouseY = unit.aimY(); //update payload input if(unit instanceof Payloadc){ - if(Core.input.keyTap(Binding.pickupCargo)){ tryPickupPayload(); } @@ -661,11 +669,9 @@ public class DesktopInput extends InputHandler{ } } - //update commander inut - if(unit instanceof Commanderc){ - if(Core.input.keyTap(Binding.command)){ - Call.unitCommand(player); - } + //update commander unit + if(Core.input.keyTap(Binding.command) && unit.type.commandLimit > 0){ + Call.unitCommand(player); } } } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 9034bcdd07..ebabd2523f 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -12,11 +12,11 @@ import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.ai.formations.patterns.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; @@ -30,11 +30,10 @@ import mindustry.net.*; import mindustry.type.*; import mindustry.ui.fragments.*; import mindustry.world.*; -import mindustry.world.blocks.*; import mindustry.world.blocks.ConstructBlock.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.payloads.*; -import mindustry.world.blocks.power.*; -import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.meta.*; import java.util.*; @@ -44,16 +43,14 @@ import static mindustry.Vars.*; public abstract class InputHandler implements InputProcessor, GestureListener{ /** Used for dropping items. */ final static float playerSelectRange = mobile ? 17f : 11f; + final static IntSeq removed = new IntSeq(); /** Maximum line length. */ final static int maxLength = 100; - final static Vec2 stackTrns = new Vec2(); final static Rect r1 = new Rect(), r2 = new Rect(); - final static Seq units = new Seq<>(); - /** Distance on the back from where items originate. */ - final static float backTrns = 3f; public final OverlayFragment frag = new OverlayFragment(); + public Interval controlInterval = new Interval(); public @Nullable Block block; public boolean overrideLineRotation; public int rotation; @@ -70,6 +67,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public Seq lineRequests = new Seq<>(); public Seq selectRequests = new Seq<>(); + public InputHandler(){ + Events.on(UnitDestroyEvent.class, e -> { + if(e.unit != null && e.unit.isPlayer() && e.unit.getPlayer().isLocal() && e.unit.type.weapons.contains(w -> w.bullet.killShooter)){ + player.shooting = false; + } + }); + } + //methods to override @Remote(called = Loc.server, unreliable = true) @@ -78,6 +83,19 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ createItemTransfer(item, 1, x, y, to, null); } + @Remote(called = Loc.server, unreliable = true) + public static void takeItems(Building build, Item item, int amount, Unit to){ + if(to == null || build == null) return; + + int removed = build.removeStack(item, Math.min(to.maxAccepted(item), amount)); + if(removed == 0) return; + + to.addItem(item, removed); + for(int j = 0; j < Mathf.clamp(removed / 3, 1, 8); j++){ + Time.run(j * 3f, () -> transferItemEffect(item, build.x, build.y, to)); + } + } + @Remote(called = Loc.server, unreliable = true) public static void transferItemToUnit(Item item, float x, float y, Itemsc to){ if(to == null) return; @@ -85,12 +103,50 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } @Remote(called = Loc.server, unreliable = true) - public static void transferItemTo(Item item, int amount, float x, float y, Building build){ + public static void setItem(Building build, Item item, int amount){ if(build == null || build.items == null) return; + build.items.set(item, amount); + } + + @Remote(called = Loc.server, unreliable = true) + public static void clearItems(Building build){ + if(build == null || build.items == null) return; + build.items.clear(); + } + + @Remote(called = Loc.server, unreliable = true) + public static void transferItemTo(@Nullable Unit unit, Item item, int amount, float x, float y, Building build){ + if(build == null || build.items == null) return; + + if(unit != null && unit.item() == item) unit.stack.amount = Math.max(unit.stack.amount - amount, 0); + for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){ Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {})); } - build.items.add(item, amount); + if(amount > 0){ + build.handleStack(item, amount, unit); + } + } + + @Remote(called = Loc.both, targets = Loc.both, forward = true, unreliable = true) + public static void deletePlans(Player player, int[] positions){ + if(netServer.admins.allowAction(player, ActionType.removePlanned, a -> a.plans = positions)){ + + var it = state.teams.get(player.team()).blocks.iterator(); + //O(n^2) search here; no way around it + outer: + while(it.hasNext()){ + BlockPlan req = it.next(); + + for(int pos : positions){ + if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){ + it.remove(); + continue outer; + } + } + } + + } } public static void createItemTransfer(Item item, int amount, float x, float y, Position to, Runnable done){ @@ -100,86 +156,123 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + @Remote(called = Loc.server, targets = Loc.both, forward = true) + public static void requestItem(Player player, Building build, Item item, int amount){ + if(player == null || build == null || !build.interactable(player.team()) || !player.within(build, buildingRange) || player.dead()) return; + + if(net.server() && (!Units.canInteract(player, build) || + !netServer.admins.allowAction(player, ActionType.withdrawItem, build.tile(), action -> { + action.item = item; + action.itemAmount = amount; + }))){ + throw new ValidateException(player, "Player cannot request items."); + } + + //remove item for every controlling unit + player.unit().eachGroup(unit -> { + Call.takeItems(build, item, unit.maxAccepted(item), unit); + + if(unit == player.unit()){ + Events.fire(new WithdrawEvent(build, player, item, amount)); + } + }); + } + + @Remote(targets = Loc.both, forward = true, called = Loc.server) + public static void transferInventory(Player player, Building build){ + if(player == null || build == null || !player.within(build, buildingRange) || build.items == null || player.dead()) return; + + if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, build) || + !netServer.admins.allowAction(player, ActionType.depositItem, build.tile, action -> { + action.itemAmount = player.unit().stack.amount; + action.item = player.unit().item(); + }))){ + throw new ValidateException(player, "Player cannot transfer an item."); + } + + //deposit for every controlling unit + player.unit().eachGroup(unit -> { + Item item = unit.item(); + int accepted = build.acceptStack(item, unit.stack.amount, unit); + + Call.transferItemTo(unit, item, accepted, unit.x, unit.y, build); + + if(unit == player.unit()){ + Events.fire(new DepositEvent(build, player, item, accepted)); + } + }); + } + @Remote(variants = Variant.one) public static void removeQueueBlock(int x, int y, boolean breaking){ - player.builder().removeBuild(x, y, breaking); + player.unit().removeBuild(x, y, breaking); } @Remote(targets = Loc.both, called = Loc.server) public static void requestUnitPayload(Player player, Unit target){ - if(player == null) return; + if(player == null || !(player.unit() instanceof Payloadc pay)) return; Unit unit = player.unit(); - Payloadc pay = (Payloadc)unit; if(target.isAI() && target.isGrounded() && pay.canPickup(target) - && target.within(unit, unit.type().hitSize * 2f + target.type().hitSize * 2f)){ - Call.pickedUnitPayload(player, target); + && target.within(unit, unit.type.hitSize * 2f + target.type.hitSize * 2f)){ + Call.pickedUnitPayload(unit, target); } } @Remote(targets = Loc.both, called = Loc.server) - public static void requestBlockPayload(Player player, Building tile){ - if(player == null) return; + public static void requestBuildPayload(Player player, Building build){ + if(player == null || !(player.unit() instanceof Payloadc pay)) return; Unit unit = player.unit(); - Payloadc pay = (Payloadc)unit; - if(tile != null && tile.team == unit.team - && unit.within(tile, tilesize * tile.block.size * 1.2f + tilesize * 5f)){ - //pick up block directly - if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ - Call.pickedBlockPayload(player, tile, true); - }else{ //pick up block payload - Payload current = tile.getPayload(); - if(current != null && pay.canPickupPayload(current)){ - Call.pickedBlockPayload(player, tile, false); - } - } - } - } + if(build != null && build.team == unit.team + && unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)){ - @Remote(targets = Loc.server, called = Loc.server) - public static void pickedUnitPayload(Player player, Unit target){ - if(player == null || target == null || !(player.unit() instanceof Payloadc)){ - if(target != null){ - target.remove(); - } - return; - } - - ((Payloadc)player.unit()).pickup(target); - } - - @Remote(targets = Loc.server, called = Loc.server) - public static void pickedBlockPayload(Player player, Building tile, boolean onGround){ - if(player == null || tile == null || !(player.unit() instanceof Payloadc)){ - if(tile != null && onGround){ - Fx.unitPickup.at(tile); - tile.tile.remove(); - } - return; - } - - Unit unit = player.unit(); - Payloadc pay = (Payloadc)unit; - - if(onGround){ - if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ - pay.pickup(tile); - }else{ - Fx.unitPickup.at(tile); - tile.tile.remove(); - } - }else{ - Payload current = tile.getPayload(); + //pick up block's payload + Payload current = build.getPayload(); if(current != null && pay.canPickupPayload(current)){ - Payload taken = tile.takePayload(); - if(taken != null){ - pay.addPayload(taken); - Fx.unitPickup.at(tile); + Call.pickedBuildPayload(unit, build, false); + //pick up whole building directly + }else if(build.block.buildVisibility != BuildVisibility.hidden && build.canPickup() && pay.canPickup(build)){ + Call.pickedBuildPayload(unit, build, true); + } + } + } + + @Remote(targets = Loc.server, called = Loc.server) + public static void pickedUnitPayload(Unit unit, Unit target){ + if(target != null && unit instanceof Payloadc pay){ + pay.pickup(target); + }else if(target != null){ + target.remove(); + } + } + + @Remote(targets = Loc.server, called = Loc.server) + public static void pickedBuildPayload(Unit unit, Building build, boolean onGround){ + if(build != null && unit instanceof Payloadc pay){ + if(onGround){ + if(build.block.buildVisibility != BuildVisibility.hidden && build.canPickup() && pay.canPickup(build)){ + pay.pickup(build); + }else{ + Fx.unitPickup.at(build); + build.tile.remove(); + } + }else{ + Payload current = build.getPayload(); + if(current != null && pay.canPickupPayload(current)){ + Payload taken = build.takePayload(); + if(taken != null){ + pay.addPayload(taken); + Fx.unitPickup.at(build); + } } } + + }else if(build != null && onGround){ + Fx.unitPickup.at(build); + build.tile.remove(); } } @@ -193,19 +286,22 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Tmp.v1.set(x, y).sub(pay).limit(tilesize * 4f).add(pay); float cx = Tmp.v1.x, cy = Tmp.v1.y; - Call.payloadDropped(player, cx, cy); + Call.payloadDropped(player.unit(), cx, cy); } @Remote(called = Loc.server, targets = Loc.server) - public static void payloadDropped(Player player, float x, float y){ - if(player == null) return; - - Payloadc pay = (Payloadc)player.unit(); - - float prevx = pay.x(), prevy = pay.y(); - pay.set(x, y); - pay.dropLastPayload(); - pay.set(prevx, prevy); + public static void payloadDropped(Unit unit, float x, float y){ + if(unit instanceof Payloadc pay){ + float prevx = pay.x(), prevy = pay.y(); + pay.set(x, y); + pay.dropLastPayload(); + pay.set(prevx, prevy); + pay.controlling().each(u -> { + if(u instanceof Payloadc){ + Call.payloadDropped(u, u.x, u.y); + } + }); + } } @Remote(targets = Loc.client, called = Loc.server) @@ -216,62 +312,35 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ throw new ValidateException(player, "Player cannot drop an item."); } - Fx.dropItem.at(player.x, player.y, angle, Color.white, player.unit().item()); - player.unit().clearItem(); + player.unit().eachGroup(unit -> { + Fx.dropItem.at(unit.x, unit.y, angle, Color.white, unit.item()); + unit.clearItem(); + }); } @Remote(targets = Loc.both, called = Loc.server, forward = true, unreliable = true) - public static void rotateBlock(Player player, Building tile, boolean direction){ - if(tile == null) return; + public static void rotateBlock(@Nullable Player player, Building build, boolean direction){ + if(build == null) return; - if(net.server() && (!Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.rotate, tile.tile(), action -> action.rotation = Mathf.mod(tile.rotation + Mathf.sign(direction), 4)))){ + if(net.server() && (!Units.canInteract(player, build) || + !netServer.admins.allowAction(player, ActionType.rotate, build.tile(), action -> action.rotation = Mathf.mod(build.rotation + Mathf.sign(direction), 4)))){ throw new ValidateException(player, "Player cannot rotate a block."); } - tile.rotation = Mathf.mod(tile.rotation + Mathf.sign(direction), 4); - tile.updateProximity(); - tile.noSleep(); - } - - @Remote(targets = Loc.both, forward = true, called = Loc.server) - public static void transferInventory(Player player, Building tile){ - if(player == null || tile == null || !player.within(tile, buildingRange) || tile.items == null) return; - - if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> { - action.itemAmount = player.unit().stack.amount; - action.item = player.unit().item(); - }))){ - throw new ValidateException(player, "Player cannot transfer an item."); - } - - Item item = player.unit().item(); - int amount = player.unit().stack.amount; - int accepted = tile.acceptStack(item, amount, player.unit()); - player.unit().stack.amount -= accepted; - - Core.app.post(() -> Events.fire(new DepositEvent(tile, player, item, accepted))); - - tile.getStackOffset(item, stackTrns); - tile.handleStack(item, accepted, player.unit()); - - createItemTransfer( - item, - amount, - player.x + Angles.trnsx(player.unit().rotation + 180f, backTrns), player.y + Angles.trnsy(player.unit().rotation + 180f, backTrns), - new Vec2(tile.x + stackTrns.x, tile.y + stackTrns.y), - () -> {} - ); + if(player != null) build.lastAccessed = player.name; + build.rotation = Mathf.mod(build.rotation + Mathf.sign(direction), 4); + build.updateProximity(); + build.noSleep(); + Fx.rotateBlock.at(build.x, build.y, build.block.size); } @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void tileConfig(@Nullable Player player, Building tile, @Nullable Object value){ - if(tile == null) return; - if(net.server() && (!Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.configure, tile.tile, action -> action.config = value))) throw new ValidateException(player, "Player cannot configure a tile."); - tile.configured(player == null || player.dead() ? null : player.unit(), value); - Core.app.post(() -> Events.fire(new ConfigEvent(tile, player, value))); + public static void tileConfig(@Nullable Player player, Building build, @Nullable Object value){ + if(build == null) return; + if(net.server() && (!Units.canInteract(player, build) || + !netServer.admins.allowAction(player, ActionType.configure, build.tile, action -> action.config = value))) throw new ValidateException(player, "Player cannot configure a tile."); + build.configured(player == null || player.dead() ? null : player.unit(), value); + Core.app.post(() -> Events.fire(new ConfigEvent(build, player, value))); } //only useful for servers or local mods, and is not replicated across clients @@ -283,22 +352,31 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Events.fire(new TapEvent(player, tile)); } + @Remote(targets = Loc.both, called = Loc.both, forward = true) + public static void buildingControlSelect(Player player, Building build){ + if(player == null || build == null || player.dead()) return; + + //make sure player is allowed to control the building + if(net.server() && !netServer.admins.allowAction(player, ActionType.buildSelect, action -> action.tile = build.tile)){ + throw new ValidateException(player, "Player cannot control a building."); + } + + if(player.team() == build.team && build.canControlSelect(player)){ + build.onControlSelect(player); + } + } + @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void unitControl(Player player, @Nullable Unit unit){ if(player == null) return; + //make sure player is allowed to control the unit + if(net.server() && !netServer.admins.allowAction(player, ActionType.control, action -> action.unit = unit)){ + throw new ValidateException(player, "Player cannot control a unit."); + } + //clear player unit when they possess a core - if((unit instanceof BlockUnitc && ((BlockUnitc)unit).tile() instanceof CoreBuild)){ - Fx.spawn.at(player); - if(net.client()){ - control.input.controlledType = null; - } - - player.clearUnit(); - player.deathTimer = 61f; - ((CoreBuild)((BlockUnitc)unit).tile()).requestSpawn(player); - - }else if(unit == null){ //just clear the unit (is this used?) + if(unit == null){ //just clear the unit (is this used?) player.clearUnit(); //make sure it's AI controlled, so players can't overwrite each other }else if(unit.isAI() && unit.team == player.team() && !unit.dead){ @@ -311,38 +389,42 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Fx.unitSpirit.at(player.x, player.y, 0f, unit); } } + + Events.fire(new UnitControlEvent(player, unit)); } @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void unitClear(Player player){ - //no free core teleports? - if(player == null || !player.dead() && player.unit().spawnedByCore) return; + if(player == null) return; Fx.spawn.at(player); player.clearUnit(); - player.deathTimer = 61f; //for instant respawn + player.deathTimer = Player.deathDelay + 1f; //for instant respawn } @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void unitCommand(Player player){ - if(player == null || player.dead() || !(player.unit() instanceof Commanderc)) return; + if(player == null || player.dead() || (player.unit() == null)) return; - Commanderc commander = (Commanderc)player.unit(); + //make sure player is allowed to make the command + if(net.server() && !netServer.admins.allowAction(player, ActionType.command, action -> {})){ + throw new ValidateException(player, "Player cannot command a unit."); + } - if(commander.isCommanding()){ - commander.clearCommand(); - }else{ + if(player.unit().isCommanding()){ + player.unit().clearCommand(); + }else if(player.unit().type.commandLimit > 0){ //TODO try out some other formations - commander.commandNearby(new CircleFormation()); - Fx.commandSend.at(player); + player.unit().commandNearby(new CircleFormation()); + Fx.commandSend.at(player, player.unit().type.commandRadius); } } public Eachable allRequests(){ return cons -> { - for(BuildPlan request : player.builder().plans()) cons.get(request); + for(BuildPlan request : player.unit().plans()) cons.get(request); for(BuildPlan request : selectRequests) cons.get(request); for(BuildPlan request : lineRequests) cons.get(request); }; @@ -360,33 +442,36 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.typing = ui.chatfrag.shown(); if(player.isBuilder()){ - player.builder().updateBuilding(isBuilding); + player.unit().updateBuilding(isBuilding); } if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && player.unit().ammo <= 0){ - player.unit().type().weapons.first().noAmmoSound.at(player.unit()); + player.unit().type.weapons.first().noAmmoSound.at(player.unit()); } wasShooting = player.shooting; if(!player.dead()){ - controlledType = player.unit().type(); + controlledType = player.unit().type; } if(controlledType != null && player.dead()){ - Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.dead); + Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type == controlledType && !u.dead); if(unit != null){ - Call.unitControl(player, unit); + //only trying controlling once a second to prevent packet spam + if(!net.client() || controlInterval.get(0, 70f)){ + Call.unitControl(player, unit); + } } } } public void checkUnit(){ if(controlledType != null){ - Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.dead); + Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type == controlledType && !u.dead); if(unit == null && controlledType == UnitTypes.block){ - unit = world.buildWorld(player.x, player.y) instanceof ControlBlock ? ((ControlBlock)world.buildWorld(player.x, player.y)).unit() : null; + unit = world.buildWorld(player.x, player.y) instanceof ControlBlock cont && cont.canControl() ? cont.unit() : null; } if(unit != null){ @@ -401,17 +486,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void tryPickupPayload(){ Unit unit = player.unit(); - if(!(unit instanceof Payloadc)) return; - Payloadc pay = (Payloadc)unit; + if(!(unit instanceof Payloadc pay)) return; - Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitSize * 2.5f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); + Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type.hitSize * 2f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize)); if(target != null){ Call.requestUnitPayload(player, target); }else{ - Building tile = world.buildWorld(pay.x(), pay.y()); + Building build = world.buildWorld(pay.x(), pay.y()); - if(tile != null && tile.team == unit.team){ - Call.requestBlockPayload(player, tile); + if(build != null && build.team == unit.team){ + Call.requestBuildPayload(player, build); } } } @@ -471,7 +555,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public boolean requestMatches(BuildPlan request){ Tile tile = world.tile(request.x, request.y); - return tile != null && tile.block() instanceof ConstructBlock && tile.bc().cblock == request.block; + return tile != null && tile.build instanceof ConstructBuild cons && cons.current == request.block; } public void drawBreaking(int x, int y){ @@ -499,9 +583,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }); }else{ lastSchematic.tags.put("name", text); + lastSchematic.tags.put("description", ""); schematics.add(lastSchematic); ui.showInfoFade("@schematic.saved"); ui.schematics.showInfo(lastSchematic); + Events.fire(new SchematicCreateEvent(lastSchematic)); } }); } @@ -510,6 +596,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ int ox = schemOriginX(), oy = schemOriginY(); requests.each(req -> { + if(req.breaking) return; + req.pointConfig(p -> { int cx = p.x, cy = p.y; int lx = cx; @@ -534,8 +622,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ wx = wy; wy = -x; } - req.x = world.toTile(wx - req.block.offset) + ox; - req.y = world.toTile(wy - req.block.offset) + oy; + req.x = World.toTile(wx - req.block.offset) + ox; + req.y = World.toTile(wy - req.block.offset) + oy; req.rotation = Mathf.mod(req.rotation + direction, 4); }); } @@ -544,6 +632,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ int origin = (x ? schemOriginX() : schemOriginY()) * tilesize; requests.each(req -> { + if(req.breaking) return; + float value = -((x ? req.x : req.y) * tilesize - origin + req.block.offset) + origin; if(x){ @@ -608,7 +698,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return r2.overlaps(r1); }; - for(BuildPlan req : player.builder().plans()){ + for(BuildPlan req : player.unit().plans()){ if(test.get(req)) return req; } @@ -633,7 +723,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Draw.color(Pal.remove); Lines.stroke(1f); - for(BuildPlan req : player.builder().plans()){ + for(BuildPlan req : player.unit().plans()){ if(req.breaking) continue; if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ drawBreaking(req); @@ -695,7 +785,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ for(BuildPlan req : requests){ if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){ BuildPlan copy = req.copy(); - player.builder().addBuild(copy); + req.block.onNewPlan(copy); + player.unit().addBuild(copy); } } } @@ -704,21 +795,24 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ boolean valid = validPlace(request.x, request.y, request.block, request.rotation); Draw.reset(); - Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime(), 6f, 0.28f)); + Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime, 6f, 0.28f)); Draw.alpha(1f); - request.block.drawRequestConfigTop(request, selectRequests); + request.block.drawRequestConfigTop(request, cons -> { + selectRequests.each(cons); + lineRequests.each(cons); + }); Draw.reset(); } protected void drawRequest(BuildPlan request){ - request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation)); + request.block.drawPlan(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation)); } /** Draws a placement icon for a specific block. */ protected void drawRequest(int x, int y, Block block, int rotation){ brequest.set(x, y, rotation, block); brequest.animScale = 1f; - block.drawRequest(brequest, allRequests(), validPlace(x, y, block, rotation)); + block.drawPlan(brequest, allRequests(), validPlace(x, y, block, rotation)); } /** Remove everything from the queue in a selection. */ @@ -733,7 +827,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ /** Remove everything from the queue in a selection. */ protected void removeSelection(int x1, int y1, int x2, int y2, boolean flush){ - removeSelection(x1, y1, x2, y2, false, maxLength); + removeSelection(x1, y1, x2, y2, flush, maxLength); } /** Remove everything from the queue in a selection. */ @@ -759,7 +853,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ //remove build requests Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize); - Iterator it = player.builder().plans().iterator(); + Iterator it = player.unit().plans().iterator(); while(it.hasNext()){ BuildPlan req = it.next(); if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ @@ -775,15 +869,23 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + removed.clear(); + //remove blocks to rebuild Iterator broken = state.teams.get(player.team()).blocks.iterator(); while(broken.hasNext()){ BlockPlan req = broken.next(); Block block = content.block(req.block); if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){ + removed.add(Point2.pack(req.x, req.y)); broken.remove(); } } + + //TODO array may be too large? + if(removed.size > 0 && net.active()){ + Call.deletePlans(player, removed.toArray()); + } } protected void updateLine(int x1, int y1, int x2, int y2){ @@ -802,6 +904,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ req.block = replace; } }); + + block.handlePlacementLine(lineRequests); } } @@ -810,8 +914,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } /** Handles tile tap events that are not platform specific. */ - boolean tileTapped(@Nullable Building tile){ - if(tile == null){ + boolean tileTapped(@Nullable Building build){ + if(build == null){ frag.inv.hide(); frag.config.hideConfig(); return false; @@ -819,18 +923,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ boolean consumed = false, showedInventory = false; //check if tapped block is configurable - if(tile.block.configurable && tile.interactable(player.team())){ + if(build.block.configurable && build.interactable(player.team())){ consumed = true; - if(((!frag.config.isShown() && tile.shouldShowConfigure(player)) //if the config fragment is hidden, show + if(((!frag.config.isShown() && build.shouldShowConfigure(player)) //if the config fragment is hidden, show //alternatively, the current selected block can 'agree' to switch config tiles - || (frag.config.isShown() && frag.config.getSelectedTile().onConfigureTileTapped(tile)))){ - Sounds.click.at(tile); - frag.config.showConfig(tile); + || (frag.config.isShown() && frag.config.getSelectedTile().onConfigureTileTapped(build)))){ + Sounds.click.at(build); + frag.config.showConfig(build); } //otherwise... }else if(!frag.config.hasConfigMouse()){ //make sure a configuration fragment isn't on the cursor //then, if it's shown and the current block 'agrees' to hide, hide it. - if(frag.config.isShown() && frag.config.getSelectedTile().onConfigureTileTapped(tile)){ + if(frag.config.isShown() && frag.config.getSelectedTile().onConfigureTileTapped(build)){ consumed = true; frag.config.hideConfig(); } @@ -841,16 +945,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } //call tapped event - if(!consumed && tile.interactable(player.team())){ - tile.tapped(); + if(!consumed && build.interactable(player.team())){ + build.tapped(); } //consume tap event if necessary - if(tile.interactable(player.team()) && tile.block.consumesTap){ + if(build.interactable(player.team()) && build.block.consumesTap){ consumed = true; - }else if(tile.interactable(player.team()) && tile.block.synthetic() && !consumed){ - if(tile.block.hasItems && tile.items.total() > 0){ - frag.inv.showFor(tile); + }else if(build.interactable(player.team()) && build.block.synthetic() && !consumed){ + if(build.block.hasItems && build.items.total() > 0){ + frag.inv.showFor(build); consumed = true; showedInventory = true; } @@ -879,8 +983,24 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ /** Tries to begin mining a tile, returns true if successful. */ boolean tryBeginMine(Tile tile){ if(canMine(tile)){ - //if a block is clicked twice, reset it - player.miner().mineTile(player.miner().mineTile() == tile ? null : tile); + player.unit().mineTile = tile; + return true; + } + return false; + } + + /** Tries to stop mining, returns true if mining was stopped. */ + boolean tryStopMine(){ + if(player.unit().mining()){ + player.unit().mineTile = null; + return true; + } + return false; + } + + boolean tryStopMine(Tile tile){ + if(player.unit().mineTile == tile){ + player.unit().mineTile = null; return true; } return false; @@ -888,10 +1008,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ boolean canMine(Tile tile){ return !Core.scene.hasMouse() - && tile.drop() != null && player.miner().canMine(tile.drop()) - && !(tile.floor().playerUnmineable && tile.overlay().itemDrop == null) - && player.unit().acceptsItem(tile.drop()) - && tile.block() == Blocks.air && player.dst(tile.worldx(), tile.worldy()) <= miningRange; + && tile.drop() != null + && player.unit().validMine(tile) + && !(tile.floor().playerUnmineable && tile.overlay().itemDrop == null) + && player.unit().acceptsItem(tile.drop()) + && tile.block() == Blocks.air; } /** Returns the tile at the specified MOUSE coordinates. */ @@ -900,11 +1021,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } int rawTileX(){ - return world.toTile(Core.input.mouseWorld().x); + return World.toTile(Core.input.mouseWorld().x); } int rawTileY(){ - return world.toTile(Core.input.mouseWorld().y); + return World.toTile(Core.input.mouseWorld().y); } int tileX(float cursorX){ @@ -912,7 +1033,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(selectedBlock()){ vec.sub(block.offset, block.offset); } - return world.toTile(vec.x); + return World.toTile(vec.x); } int tileY(float cursorY){ @@ -920,7 +1041,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(selectedBlock()){ vec.sub(block.offset, block.offset); } - return world.toTile(vec.y); + return World.toTile(vec.y); } public boolean selectedBlock(){ @@ -940,7 +1061,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public @Nullable Unit selectedUnit(){ - Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> u.isAI()); + Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, Unitc::isAI); if(unit != null){ unit.hitbox(Tmp.r1); Tmp.r1.grow(6f); @@ -949,14 +1070,22 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); - if(tile instanceof ControlBlock && tile.team == player.team()){ - return ((ControlBlock)tile).unit(); + Building build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + if(build instanceof ControlBlock cont && cont.canControl() && build.team == player.team()){ + return cont.unit(); } return null; } + public @Nullable Building selectedControlBuild(){ + Building build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + if(build != null && !player.dead() && build.canControlSelect(player) && build.team == player.team()){ + return build; + } + return null; + } + public void remove(){ Core.input.removeProcessor(this); frag.remove(); @@ -998,8 +1127,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public boolean canShoot(){ - return block == null && !onConfigurable() && !isDroppingItem() && !(player.builder().updateBuilding() && player.builder().isBuilding()) && - !(player.unit() instanceof Mechc && player.unit().isFlying()); + return block == null && !onConfigurable() && !isDroppingItem() && !player.unit().activelyBuilding() && + !(player.unit() instanceof Mechc && player.unit().isFlying()) && !player.unit().mining(); } public boolean onConfigurable(){ @@ -1010,7 +1139,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return droppingItem; } - public void tryDropItems(@Nullable Building tile, float x, float y){ + public boolean canDropItem(){ + return droppingItem && !canTapPlayer(Core.input.mouseWorldX(), Core.input.mouseWorldY()); + } + + public void tryDropItems(@Nullable Building build, float x, float y){ if(!droppingItem || player.unit().stack.amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){ droppingItem = false; return; @@ -1020,19 +1153,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ ItemStack stack = player.unit().stack; - if(tile != null && tile.acceptStack(stack.item, stack.amount, player.unit()) > 0 && tile.interactable(player.team()) && tile.block.hasItems && player.unit().stack().amount > 0 && tile.interactable(player.team())){ - Call.transferInventory(player, tile); + if(build != null && build.acceptStack(stack.item, stack.amount, player.unit()) > 0 && build.interactable(player.team()) && build.block.hasItems && player.unit().stack().amount > 0 && build.interactable(player.team())){ + Call.transferInventory(player, build); }else{ Call.dropItem(player.angleTo(x, y)); } } - public void tryPlaceBlock(int x, int y){ - if(block != null && validPlace(x, y, block, rotation)){ - placeBlock(x, y, block, rotation); - } - } - public void tryBreakBlock(int x, int y){ if(validBreak(x, y)){ breakBlock(x, y); @@ -1044,7 +1171,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public boolean validPlace(int x, int y, Block type, int rotation, BuildPlan ignore){ - for(BuildPlan req : player.builder().plans()){ + for(BuildPlan req : player.unit().plans()){ if(req != ignore && !req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2)) @@ -1059,18 +1186,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return Build.validBreak(player.team(), x, y); } - public void placeBlock(int x, int y, Block block, int rotation){ - BuildPlan req = getRequest(x, y); - if(req != null){ - player.builder().plans().remove(req); - } - player.builder().addBuild(new BuildPlan(x, y, rotation, block, block.nextConfig())); - } - public void breakBlock(int x, int y){ Tile tile = world.tile(x, y); if(tile != null && tile.build != null) tile = tile.build.tile; - player.builder().addBuild(new BuildPlan(tile.x, tile.y)); + player.unit().addBuild(new BuildPlan(tile.x, tile.y)); } public void drawArrow(Block block, int x, int y, int rotation){ @@ -1104,37 +1223,25 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ diagonal = !diagonal; } - if(block instanceof PowerNode){ + if(block != null && block.swapDiagonalPlacement){ diagonal = !diagonal; } if(diagonal){ - points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY); + var start = world.build(startX, startY); + var end = world.build(endX, endY); + if(block != null && start instanceof ChainedBuilding && end instanceof ChainedBuilding + && block.canReplace(end.block) && block.canReplace(start.block)){ + points = Placement.upgradeLine(startX, startY, endX, endY); + }else{ + points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY); + } }else{ points = Placement.normalizeLine(startX, startY, endX, endY); } - if(block instanceof PowerNode){ - Seq skip = new Seq<>(); - - for(int i = 1; i < points.size; i++){ - int overlaps = 0; - Point2 point = points.get(i); - - //check with how many powernodes the *next* tile will overlap - for(int j = 0; j < i; j++){ - if(!skip.contains(points.get(j)) && ((PowerNode)block).overlaps(world.tile(point.x, point.y), world.tile(points.get(j).x, points.get(j).y))){ - overlaps++; - } - } - - //if it's more than one, it can bridge the gap - if(overlaps > 1){ - skip.add(points.get(i-1)); - } - } - //remove skipped points - points.removeAll(skip); + if(block != null){ + block.changePlacementPath(points, rotation); } float angle = Angles.angle(startX, startY, endX, endY); @@ -1156,7 +1263,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ line.x = point.x; line.y = point.y; if(!overrideLineRotation || diagonal){ - line.rotation = next != null ? Tile.relativeTo(point.x, point.y, next.x, next.y) : baseRotation; + int result = baseRotation; + if(next != null){ + result = Tile.relativeTo(point.x, point.y, next.x, next.y); + }else if(block.conveyorPlacement && i > 0){ + Point2 prev = points.get(i - 1); + result = Tile.relativeTo(prev.x, prev.y, point.x, point.y); + } + if(result != -1){ + line.rotation = result; + } }else{ line.rotation = rotation; } diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 07b543c704..d037a0d351 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -14,6 +14,7 @@ import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; @@ -23,6 +24,7 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; import static mindustry.Vars.*; import static mindustry.input.PlaceMode.*; @@ -57,13 +59,22 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Current place mode. */ public PlaceMode mode = none; /** Whether no recipe was available when switching to break mode. */ - public Block lastBlock; + public @Nullable Block lastBlock; /** Last placed request. Used for drawing block overlay. */ - public BuildPlan lastPlaced; - /** Down tracking for panning.*/ + public @Nullable BuildPlan lastPlaced; + /** Down tracking for panning. */ public boolean down = false; + /** Whether manual shooting (point with finger) is enabled. */ + public boolean manualShooting = false; - public Teamc target, moveTarget; + /** Current thing being shot at. */ + public @Nullable Teamc target; + /** Payload target being moved to. Can be a position (for dropping), or a unit/block. */ + public @Nullable Position payloadTarget; + /** Unit last tapped, or null if last tap was not on a unit. */ + public @Nullable Unit unitTapped; + /** Control building last tapped. */ + public @Nullable Building buildingTapped; //region utility methods @@ -72,16 +83,13 @@ public class MobileInput extends InputHandler implements GestureListener{ Unit unit = Units.closestEnemy(player.team(), x, y, 20f, u -> !u.dead); if(unit != null){ - player.miner().mineTile(null); + player.unit().mineTile = null; target = unit; }else{ Building tile = world.buildWorld(x, y); - if(tile != null && player.team().isEnemy(tile.team)){ - player.miner().mineTile(null); - target = tile; - }else if(tile != null && player.unit().type().canHeal && tile.team == player.team() && tile.damaged()){ - player.miner().mineTile(null); + if((tile != null && player.team().isEnemy(tile.team) && tile.team != Team.derelict) || (tile != null && player.unit().type.canHeal && tile.team == player.team() && tile.damaged())){ + player.unit().mineTile = null; target = tile; } } @@ -110,7 +118,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } } - for(BuildPlan req : player.builder().plans()){ + for(BuildPlan req : player.unit().plans()){ Tile other = world.tile(req.x, req.y); if(other == null || req.breaking) continue; @@ -198,7 +206,7 @@ public class MobileInput extends InputHandler implements GestureListener{ boolean arrow = block != null && block.rotate; i.getImage().setRotationOrigin(!arrow ? 0 : rotation * 90, Align.center); - i.getStyle().imageUp = arrow ? Icon.right : Icon.paste; + i.getStyle().imageUp = arrow ? Icon.right : Icon.copy; i.setChecked(!arrow && schematicMode); }); @@ -215,10 +223,10 @@ public class MobileInput extends InputHandler implements GestureListener{ BuildPlan copy = request.copy(); if(other == null){ - player.builder().addBuild(copy); + player.unit().addBuild(copy); }else if(!other.breaking && other.x == request.x && other.y == request.y && other.block.size == request.block.size){ - player.builder().plans().remove(other); - player.builder().addBuild(copy); + player.unit().plans().remove(other); + player.unit().addBuild(copy); } } @@ -241,14 +249,14 @@ public class MobileInput extends InputHandler implements GestureListener{ Boolp schem = () -> lastSchematic != null && !selectRequests.isEmpty(); group.fill(t -> { - t.visible(() -> (player.builder().isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !schem.get()); + t.visible(() -> (player.unit().isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !schem.get()); t.bottom().left(); t.button("@cancel", Icon.cancel, () -> { - player.builder().clearBuilding(); + player.unit().clearBuilding(); selectRequests.clear(); mode = none; block = null; - }).width(155f).margin(12f); + }).width(155f).height(50f).margin(12f); }); group.fill(t -> { @@ -288,7 +296,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(request.breaking){ drawSelected(request.x, request.y, tile.block(), Pal.remove); }else{ - request.block.drawRequest(request, allRequests(), true); + request.block.drawPlan(request, allRequests(), true); } } @@ -307,9 +315,10 @@ public class MobileInput extends InputHandler implements GestureListener{ if(i == lineRequests.size - 1 && request.block.rotate){ drawArrow(block, request.x, request.y, request.rotation); } - request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(request.x, request.y, request.block.size, null) == null); + request.block.drawPlan(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(request.x, request.y, request.block.size, null) == null); drawSelected(request.x, request.y, request.block, Pal.accent); } + lineRequests.each(this::drawOverRequest); }else if(mode == breaking){ drawBreakSelection(lineStartX, lineStartY, tileX, tileY); } @@ -320,7 +329,6 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public void drawTop(){ - //draw schematic selection if(mode == schematicSelect){ drawSelection(lineStartX, lineStartY, lastLineX, lastLineY, Vars.maxSchematicSize); @@ -351,16 +359,19 @@ public class MobileInput extends InputHandler implements GestureListener{ Draw.reset(); drawRequest(request); + if(!request.breaking){ + drawOverRequest(request); + } //draw last placed request - if(!request.breaking && request == lastPlaced && request.block != null){ + if(!request.breaking && request == lastPlaced && request.block != null && request.block.drawArrow){ Draw.mixcol(); request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation)); } } //draw targeting crosshair - if(target != null && !state.isEditor()){ + if(target != null && !state.isEditor() && !manualShooting){ if(target != lastTarget){ crosshairScale = 0f; lastTarget = target; @@ -368,13 +379,7 @@ public class MobileInput extends InputHandler implements GestureListener{ crosshairScale = Mathf.lerpDelta(crosshairScale, 1f, 0.2f); - Draw.color(Pal.remove); - Lines.stroke(1f); - - float radius = Interp.swingIn.apply(crosshairScale); - - Lines.poly(target.getX(), target.getY(), 4, 7f * radius, Time.time() * 1.5f); - Lines.spikes(target.getX(), target.getY(), 3f * radius, 6f * radius, 4, Time.time() * 1.5f); + Drawf.target(target.getX(), target.getY(), 7f * Interp.swingIn.apply(crosshairScale), Pal.remove); } Draw.reset(); @@ -388,7 +393,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(request.breaking){ drawSelected(request.x, request.y, request.tile().block(), Pal.remove); }else{ - request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation)); + request.block.drawPlan(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation)); drawSelected(request.x, request.y, request.block, Pal.accent); } } @@ -400,14 +405,14 @@ public class MobileInput extends InputHandler implements GestureListener{ protected int schemOriginX(){ Tmp.v1.setZero(); selectRequests.each(r -> Tmp.v1.add(r.drawx(), r.drawy())); - return world.toTile(Tmp.v1.scl(1f / selectRequests.size).x); + return World.toTile(Tmp.v1.scl(1f / selectRequests.size).x); } @Override protected int schemOriginY(){ Tmp.v1.setZero(); selectRequests.each(r -> Tmp.v1.add(r.drawx(), r.drawy())); - return world.toTile(Tmp.v1.scl(1f / selectRequests.size).y); + return World.toTile(Tmp.v1.scl(1f / selectRequests.size).y); } @Override @@ -423,7 +428,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public void useSchematic(Schematic schem){ selectRequests.clear(); - selectRequests.addAll(schematics.toRequests(schem, player.tileX(), player.tileY())); + selectRequests.addAll(schematics.toRequests(schem, World.toTile(Core.camera.position.x), World.toTile(Core.camera.position.y))); lastSchematic = schem; } @@ -474,6 +479,7 @@ public class MobileInput extends InputHandler implements GestureListener{ down = false; } + manualShooting = false; selecting = false; //place down a line if in line mode @@ -517,12 +523,31 @@ public class MobileInput extends InputHandler implements GestureListener{ //handle long tap when player isn't building if(mode == none){ + Vec2 pos = Core.input.mouseWorld(x, y); - //control a unit/block - Unit on = selectedUnit(); - if(on != null){ - Call.unitControl(player, on); + if(player.unit() instanceof Payloadc pay){ + Unit target = Units.closest(player.team(), pos.x, pos.y, 8f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(pos, u.hitSize + 8f)); + if(target != null){ + payloadTarget = target; + }else{ + Building build = world.buildWorld(pos.x, pos.y); + + if(build != null && build.team == player.team() && (pay.canPickup(build) || build.getPayload() != null && pay.canPickupPayload(build.getPayload()))){ + payloadTarget = build; + }else if(pay.hasPayload()){ + //drop off at position + payloadTarget = new Vec2(pos); + }else{ + manualShooting = true; + this.target = null; + } + } + }else{ + manualShooting = true; + this.target = null; } + + if(!state.isPaused()) Fx.select.at(pos); }else{ //ignore off-screen taps @@ -573,27 +598,36 @@ public class MobileInput extends InputHandler implements GestureListener{ }else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){ //add to selection queue if it's a valid place position selectRequests.add(lastPlaced = new BuildPlan(cursor.x, cursor.y, rotation, block, block.nextConfig())); + block.onNewPlan(lastPlaced); }else if(mode == breaking && validBreak(linked.x,linked.y) && !hasRequest(linked)){ //add to selection queue if it's a valid BREAK position selectRequests.add(new BuildPlan(linked.x, linked.y)); }else{ - if(!canTapPlayer(worldx, worldy) && !tileTapped(linked.build)){ - tryBeginMine(cursor); - } - - //apply command on double tap - if(count == 2 && Mathf.within(worldx, worldy, player.unit().x, player.unit().y, player.unit().hitSize * 2f)){ - if(player.unit() instanceof Commanderc){ + //control units + if(count == 2){ + //reset payload target + payloadTarget = null; + //apply command on double tap when own unit is tapped + if(!player.dead() && Mathf.within(worldx, worldy, player.unit().x, player.unit().y, player.unit().hitSize * 0.6f + 8f) && player.unit().type.commandLimit > 0){ Call.unitCommand(player); - } - - if(player.unit() instanceof Payloadc){ - if(((Payloadc)player.unit()).hasPayload()){ - tryDropPayload(); - }else{ - tryPickupPayload(); + }else{ + //control a unit/block detected on first tap of double-tap + if(unitTapped != null){ + Call.unitControl(player, unitTapped); + }else if(buildingTapped != null){ + Call.buildingControlSelect(player, buildingTapped); + }else if(!tryBeginMine(cursor)){ + tileTapped(linked.build); } } + return false; + } + + unitTapped = selectedUnit(); + buildingTapped = selectedControlBuild(); + //prevent mining if placing/breaking blocks + if(!tryStopMine() && !canTapPlayer(worldx, worldy) && !tileTapped(linked.build) && mode == none && !Core.settings.getBool("doubletapmine")){ + tryBeginMine(cursor); } } @@ -601,21 +635,30 @@ public class MobileInput extends InputHandler implements GestureListener{ } @Override - public void update(){ - super.update(); + public void updateState(){ + super.updateState(); if(state.isMenu()){ selectRequests.clear(); removals.clear(); mode = none; + manualShooting = false; + payloadTarget = null; } + } + + @Override + public void update(){ + super.update(); if(player.dead()){ mode = none; + manualShooting = false; + payloadTarget = null; } //zoom camera - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!player.isBuilder() || !isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } @@ -684,7 +727,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //When in line mode, pan when near screen edges automatically if(Core.input.isTouched(0)){ - autoPan(); + autoPan(); } int lx = tileX(Core.input.mouseX()), ly = tileY(Core.input.mouseY()); @@ -708,6 +751,10 @@ public class MobileInput extends InputHandler implements GestureListener{ i--; } } + + if(player.shooting && (player.unit().activelyBuilding() || player.unit().mining())){ + player.shooting = false; + } } protected void autoPan(){ @@ -741,7 +788,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public boolean pan(float x, float y, float deltaX, float deltaY){ - if(Core.scene.hasDialog() || Core.settings.getBool("keyboard")) return false; + if(Core.scene == null || Core.scene.hasDialog() || Core.settings.getBool("keyboard")) return false; float scale = Core.camera.width / Core.graphics.getWidth(); deltaX *= scale; @@ -752,7 +799,8 @@ public class MobileInput extends InputHandler implements GestureListener{ return false; } - if(!down) return false; + //do not pan with manual shooting enabled + if(!down || manualShooting) return false; if(selecting){ //pan all requests shiftDeltaX += deltaX; @@ -803,12 +851,10 @@ public class MobileInput extends InputHandler implements GestureListener{ protected void updateMovement(Unit unit){ Rect rect = Tmp.r3; - UnitType type = unit.type(); + UnitType type = unit.type; if(type == null) return; - boolean flying = type.flying; - boolean omni = unit.type().omniMovement; - boolean legs = unit.isGrounded(); + boolean omni = unit.type.omniMovement; boolean allowHealing = type.canHeal; boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team && ((Building)target).damaged() && target.within(unit, type.range); @@ -823,17 +869,8 @@ public class MobileInput extends InputHandler implements GestureListener{ targetPos.set(Core.camera.position); float attractDst = 15f; - float strafePenalty = legs ? 1f : Mathf.lerp(1f, type.strafePenalty, Angles.angleDist(unit.vel.angle(), unit.rotation) / 180f); - float baseSpeed = unit.type().speed; - - //limit speed to minimum formation speed to preserve formation - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ - //add a tiny multiplier to let units catch up just in case - baseSpeed = ((Commanderc)unit).minFormationSpeed() * 0.98f; - } - - float speed = baseSpeed * Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, unit.elevation) * strafePenalty; + float speed = unit.realSpeed(); float range = unit.hasWeapons() ? unit.range() : 0f; float bulletSpeed = unit.hasWeapons() ? type.weapons.first().bullet.speed : 0f; float mouseAngle = unit.angleTo(unit.aimX(), unit.aimY()); @@ -842,19 +879,29 @@ public class MobileInput extends InputHandler implements GestureListener{ if(aimCursor){ unit.lookAt(mouseAngle); }else{ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } + unit.lookAt(unit.prefRotation()); } - if(moveTarget != null){ - targetPos.set(moveTarget); + if(payloadTarget != null && unit instanceof Payloadc pay){ + targetPos.set(payloadTarget); attractDst = 0f; - if(unit.within(moveTarget, 2f * Time.delta)){ - handleTapTarget(moveTarget); - moveTarget = null; + if(unit.within(payloadTarget, 3f * Time.delta)){ + if(payloadTarget instanceof Vec2 && pay.hasPayload()){ + //vec -> dropping something + tryDropPayload(); + }else if(payloadTarget instanceof Building build && build.team == unit.team){ + //building -> picking building up + Call.requestBuildPayload(player, build); + }else if(payloadTarget instanceof Unit other && pay.canPickup(other)){ + //unit -> picking unit up + Call.requestUnitPayload(player, other); + } + + payloadTarget = null; } + }else{ + payloadTarget = null; } movement.set(targetPos).sub(player).limit(speed); @@ -862,7 +909,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(player.within(targetPos, attractDst)){ movement.setZero(); - unit.vel.approachDelta(Vec2.ZERO, type.speed * type.accel / 2f); + unit.vel.approachDelta(Vec2.ZERO, unit.speed() * type.accel / 2f); } float expansion = 3f; @@ -879,18 +926,21 @@ public class MobileInput extends InputHandler implements GestureListener{ unit.moveAt(movement); }else{ unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len())); - if(!movement.isZero() && legs){ - unit.vel.rotateTo(movement.angle(), type.rotateSpeed); + if(!movement.isZero()){ + unit.vel.rotateTo(movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1)); } } //update shooting if not building + not mining - if(!player.builder().isBuilding() && player.miner().mineTile() == null){ + if(!player.unit().activelyBuilding() && player.unit().mineTile == null){ - //autofire - if(target == null){ + //autofire targeting + if(manualShooting){ + player.shooting = !boosted; + unit.aim(player.mouseX = Core.input.mouseWorldX(), player.mouseY = Core.input.mouseWorldY()); + }else if(target == null){ player.shooting = false; - if(Core.settings.getBool("autotarget")){ + if(Core.settings.getBool("autotarget") && !(player.unit() instanceof BlockUnitUnit u && u.tile() instanceof ControlBlock c && !c.shouldAutoTarget())){ target = Units.closestTarget(unit.team, unit.x, unit.y, range, u -> u.team != Team.derelict, u -> u.team != Team.derelict); if(allowHealing && target == null){ @@ -899,11 +949,11 @@ public class MobileInput extends InputHandler implements GestureListener{ target = null; } } - - if(target != null && player.isMiner()){ - player.miner().mineTile(null); - } } + + //when not shooting, aim at mouse cursor + //this may be a bad idea, aiming for a point far in front could work better, test it out + unit.aim(Core.input.mouseWorldX(), Core.input.mouseWorldY()); }else{ Vec2 intercept = Predict.intercept(unit, target, bulletSpeed); @@ -913,16 +963,10 @@ public class MobileInput extends InputHandler implements GestureListener{ unit.aim(player.mouseX, player.mouseY); } - } unit.controlWeapons(player.shooting && !boosted); } - - protected void handleTapTarget(Teamc target){ - - } - //endregion } diff --git a/core/src/mindustry/input/Placement.java b/core/src/mindustry/input/Placement.java index d2c3eb7d41..f4afb96683 100644 --- a/core/src/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -1,29 +1,33 @@ package mindustry.input; import arc.*; +import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.pooling.*; +import mindustry.entities.units.*; import mindustry.world.*; +import mindustry.world.blocks.distribution.*; import static mindustry.Vars.*; public class Placement{ + private static final Seq plans1 = new Seq<>(); + private static final Seq tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>(); private static final NormalizeResult result = new NormalizeResult(); private static final NormalizeDrawResult drawResult = new NormalizeDrawResult(); - private static Bresenham2 bres = new Bresenham2(); - private static Seq points = new Seq<>(); + private static final Bresenham2 bres = new Bresenham2(); + private static final Seq points = new Seq<>(); //for pathfinding - private static IntFloatMap costs = new IntFloatMap(); - private static IntIntMap parents = new IntIntMap(); - private static IntSet closed = new IntSet(); + private static final IntFloatMap costs = new IntFloatMap(); + private static final IntIntMap parents = new IntIntMap(); + private static final IntSet closed = new IntSet(); /** Normalize a diagonal line into points. */ public static Seq pathfindLine(boolean conveyors, int startX, int startY, int endX, int endY){ Pools.freeAll(points); - points.clear(); if(conveyors && Core.settings.getBool("conveyorpathfinding")){ if(astar(startX, startY, endX, endY)){ @@ -54,6 +58,173 @@ public class Placement{ return points; } + public static Seq upgradeLine(int startX, int startY, int endX, int endY){ + closed.clear(); + Pools.freeAll(points); + points.clear(); + var build = world.build(startX, startY); + points.add(Pools.obtain(Point2.class, Point2::new).set(startX, startY)); + while(build instanceof ChainedBuilding chain && (build.tile.x != endX || build.tile.y != endY) && closed.add(build.id)){ + if(chain.next() == null) return pathfindLine(true, startX, startY, endX, endY); + build = chain.next(); + points.add(Pools.obtain(Point2.class, Point2::new).set(build.tile.x, build.tile.y)); + } + return points; + } + + /** Calculates optimal node placement for nodes with spacing. Used for bridges and power nodes. */ + public static void calculateNodes(Seq points, Block block, int rotation, Boolf2 overlapper){ + var base = tmpPoints2; + var result = tmpPoints.clear(); + + base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation)); + boolean addedLast = false; + + outer: + for(int i = 0; i < base.size;){ + var point = base.get(i); + result.add(point); + if(i == base.size - 1) addedLast = true; + + //find the furthest node that overlaps this one + for(int j = base.size - 1; j > i; j--){ + var other = base.get(j); + boolean over = overlapper.get(point, other); + + if(over){ + //add node to list and start searching for node that overlaps the next one + i = j; + continue outer; + } + } + + //if it got here, that means nothing was found. try to proceed to the next node anyway + i ++; + } + + if(!addedLast && !base.isEmpty()) result.add(base.peek()); + + points.clear(); + points.addAll(result); + } + + public static void calculateBridges(Seq plans, ItemBridge bridge){ + //check for orthogonal placement + unlocked state + if(!(plans.first().x == plans.peek().x || plans.first().y == plans.peek().y) || !bridge.unlockedNow()){ + return; + } + + Boolf placeable = plan -> (plan.placeable(player.team())) || + (plan.tile() != null && plan.tile().block() == plan.block); //don't count the same block as inaccessible + + var result = plans1.clear(); + var team = player.team(); + var rotated = plans.first().tile() != null && plans.first().tile().absoluteRelativeTo(plans.peek().x, plans.peek().y) == Mathf.mod(plans.first().rotation + 2, 4); + + outer: + for(int i = 0; i < plans.size;){ + var cur = plans.get(i); + result.add(cur); + + //gap found + if(i < plans.size - 1 && placeable.get(cur) && !placeable.get(plans.get(i + 1))){ + + //find the closest valid position within range + for(int j = i + 1; j < plans.size; j++){ + var other = plans.get(j); + + //out of range now, set to current position and keep scanning forward for next occurrence + if(!bridge.positionsValid(cur.x, cur.y, other.x, other.y)){ + //add 'missed' conveyors + for(int k = i + 1; k < j; k++){ + result.add(plans.get(k)); + } + i = j; + continue outer; + }else if(other.placeable(team)){ + //found a link, assign bridges + cur.block = bridge; + other.block = bridge; + if(rotated){ + other.config = new Point2(cur.x - other.x, cur.y - other.y); + }else{ + cur.config = new Point2(other.x - cur.x, other.y - cur.y); + } + + i = j; + continue outer; + } + } + + //if it got here, that means nothing was found. this likely means there's a bunch of stuff at the end; add it and bail out + for(int j = i + 1; j < plans.size; j++){ + result.add(plans.get(j)); + } + break; + }else{ + i ++; + } + } + + plans.set(result); + } + + public static void calculateDuctBridges(Seq plans, DuctBridge bridge){ + //check for orthogonal placement + unlocked state + if(!(plans.first().x == plans.peek().x || plans.first().y == plans.peek().y) || !bridge.unlockedNow()){ + return; + } + + Boolf placeable = plan -> (plan.placeable(player.team())) || + (plan.tile() != null && plan.tile().block() == plan.block); //don't count the same block as inaccessible + + var result = plans1.clear(); + var team = player.team(); + var rot = plans.first().rotation; + + outer: + for(int i = 0; i < plans.size;){ + var cur = plans.get(i); + result.add(cur); + + //gap found + if(i < plans.size - 1 && placeable.get(cur) && !placeable.get(plans.get(i + 1))){ + + //find the closest valid position within range + for(int j = i + 1; j < plans.size; j++){ + var other = plans.get(j); + + //out of range now, set to current position and keep scanning forward for next occurrence + if(!bridge.positionsValid(cur.x, cur.y, other.x, other.y)){ + //add 'missed' conveyors + for(int k = i + 1; k < j; k++){ + result.add(plans.get(k)); + } + i = j; + continue outer; + }else if(other.placeable(team)){ + //found a link, assign bridges + cur.block = bridge; + other.block = bridge; + + i = j; + continue outer; + } + } + + //if it got here, that means nothing was found. this likely means there's a bunch of stuff at the end; add it and bail out + for(int j = i + 1; j < plans.size; j++){ + result.add(plans.get(j)); + } + break; + }else{ + i ++; + } + } + + plans.set(result); + } + private static float tileHeuristic(Tile tile, Tile other){ Block block = control.input.block; @@ -188,7 +359,6 @@ public class Placement{ * @param maxLength maximum length of area */ public static NormalizeResult normalizeArea(int tilex, int tiley, int endx, int endy, int rotation, boolean snap, int maxLength){ - if(snap){ if(Math.abs(tilex - endx) > Math.abs(tiley - endy)){ endy = tiley; @@ -242,35 +412,10 @@ public class Placement{ } public static class NormalizeDrawResult{ - float x, y, x2, y2; + public float x, y, x2, y2; } public static class NormalizeResult{ public int x, y, x2, y2, rotation; - - boolean isX(){ - return Math.abs(x2 - x) > Math.abs(y2 - y); - } - - /** - * Returns length of greater edge of the selection. - */ - int getLength(){ - return Math.max(x2 - x, y2 - y); - } - - /** - * Returns the X position of a specific index along this area as a line. - */ - int getScaledX(int i){ - return x + (x2 - x > y2 - y ? i : 0); - } - - /** - * Returns the Y position of a specific index along this area as a line. - */ - int getScaledY(int i){ - return y + (x2 - x > y2 - y ? 0 : i); - } } } diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index 39c3a1a821..ea15b3969c 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -13,8 +13,9 @@ import java.io.*; @SuppressWarnings("unchecked") public class JsonIO{ - private static CustomJson jsonBase = new CustomJson(); - private static Json json = new Json(){ + private static final CustomJson jsonBase = new CustomJson(); + + public static final Json json = new Json(){ { apply(this); } @Override @@ -39,10 +40,6 @@ public class JsonIO{ } }; - public static Json json(){ - return json; - } - public static String write(Object object){ return json.toJson(object, object.getClass()); } @@ -69,7 +66,6 @@ public class JsonIO{ } static void apply(Json json){ - json.setIgnoreUnknownFields(true); json.setElementType(Rules.class, "spawns", SpawnGroup.class); json.setElementType(Rules.class, "loadout", ItemStack.class); @@ -83,8 +79,9 @@ public class JsonIO{ @Override public Sector read(Json json, JsonValue jsonData, Class type){ - String[] split = jsonData.asString().split("-"); - return Vars.content.getByName(ContentType.planet, split[0]).sectors.get(Integer.parseInt(split[1])); + String name = jsonData.asString(); + int idx = name.lastIndexOf('-'); + return Vars.content.getByName(ContentType.planet, name.substring(0, idx)).sectors.get(Integer.parseInt(name.substring(idx + 1))); } }); @@ -165,6 +162,18 @@ public class JsonIO{ } }); + json.setSerializer(UnitType.class, new Serializer<>(){ + @Override + public void write(Json json, UnitType object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public UnitType read(Json json, JsonValue jsonData, Class type){ + return Vars.content.getByName(ContentType.unit, jsonData.asString()); + } + }); + json.setSerializer(ItemStack.class, new Serializer<>(){ @Override public void write(Json json, ItemStack object, Class knownType){ @@ -183,11 +192,12 @@ public class JsonIO{ json.setSerializer(UnlockableContent.class, new Serializer<>(){ @Override public void write(Json json, UnlockableContent object, Class knownType){ - json.writeValue(object.name); + json.writeValue(object == null ? null : object.name); } @Override public UnlockableContent read(Json json, JsonValue jsonData, Class type){ + if(jsonData.isNull()) return null; String str = jsonData.asString(); Item item = Vars.content.getByName(ContentType.item, str); Liquid liquid = Vars.content.getByName(ContentType.liquid, str); @@ -199,9 +209,7 @@ public class JsonIO{ static class CustomJson extends Json{ private Object baseObject; - { - apply(this); - } + { apply(this); } @Override public T fromJson(Class type, String json){ diff --git a/core/src/mindustry/io/MapIO.java b/core/src/mindustry/io/MapIO.java index f88ebf9a37..d7c6c8a49f 100644 --- a/core/src/mindustry/io/MapIO.java +++ b/core/src/mindustry/io/MapIO.java @@ -2,7 +2,6 @@ package mindustry.io; import arc.files.*; import arc.graphics.*; -import arc.graphics.Pixmap.*; import arc.math.geom.*; import arc.struct.*; import arc.util.io.*; @@ -11,6 +10,7 @@ import mindustry.core.*; import mindustry.game.*; import mindustry.maps.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; import mindustry.world.blocks.storage.*; import java.io.*; @@ -80,18 +80,11 @@ public class MapIO{ @Override public void setBlock(Block type){ super.setBlock(type); - int c = colorFor(Blocks.air, block(), Blocks.air, team()); - if(c != black){ - walls.draw(x, floors.getHeight() - 1 - y, c); - floors.draw(x, floors.getHeight() - 1 - y + 1, shade); - } - } - @Override - public void setTeam(Team team){ - super.setTeam(team); - if(block instanceof CoreBlock){ - map.teams.add(team.id); + int c = colorFor(block(), Blocks.air, Blocks.air, team()); + if(c != black){ + walls.setRaw(x, floors.height - 1 - y, c); + floors.set(x, floors.height - 1 - y + 1, shade); } } }; @@ -107,6 +100,27 @@ public class MapIO{ world.setGenerating(false); } + @Override + public void onReadBuilding(){ + //read team colors + if(tile.build != null){ + int c = tile.build.team.color.rgba8888(); + int size = tile.block().size; + int offsetx = -(size - 1) / 2; + int offsety = -(size - 1) / 2; + for(int dx = 0; dx < size; dx++){ + for(int dy = 0; dy < size; dy++){ + int drawx = tile.x + dx + offsetx, drawy = tile.y + dy + offsety; + walls.set(drawx, floors.height - 1 - drawy, c); + } + } + + if(tile.build.block instanceof CoreBlock){ + map.teams.add(tile.build.team.id); + } + } + } + @Override public Tile tile(int index){ tile.x = (short)(index % map.width); @@ -117,9 +131,9 @@ public class MapIO{ @Override public Tile create(int x, int y, int floorID, int overlayID, int wallID){ if(overlayID != 0){ - floors.draw(x, floors.getHeight() - 1 - y, colorFor(Blocks.air, Blocks.air, content.block(overlayID), Team.derelict)); + floors.set(x, floors.height - 1 - y, colorFor(Blocks.air, Blocks.air, content.block(overlayID), Team.derelict)); }else{ - floors.draw(x, floors.getHeight() - 1 - y, colorFor(content.block(floorID), Blocks.air, Blocks.air, Team.derelict)); + floors.set(x, floors.height - 1 - y, colorFor(Blocks.air, content.block(floorID), Blocks.air, Team.derelict)); } if(content.block(overlayID) == Blocks.spawn){ map.spawns ++; @@ -128,7 +142,7 @@ public class MapIO{ } })); - floors.drawPixmap(walls, 0, 0); + floors.draw(walls, true); walls.dispose(); return floors; }finally{ @@ -137,21 +151,21 @@ public class MapIO{ } public static Pixmap generatePreview(Tiles tiles){ - Pixmap pixmap = new Pixmap(tiles.width, tiles.height, Format.rgba8888); - for(int x = 0; x < pixmap.getWidth(); x++){ - for(int y = 0; y < pixmap.getHeight(); y++){ + Pixmap pixmap = new Pixmap(tiles.width, tiles.height); + for(int x = 0; x < pixmap.width; x++){ + for(int y = 0; y < pixmap.height; y++){ Tile tile = tiles.getn(x, y); - pixmap.draw(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.overlay(), tile.team())); + pixmap.set(x, pixmap.height - 1 - y, colorFor(tile.block(), tile.floor(), tile.overlay(), tile.team())); } } return pixmap; } - public static int colorFor(Block floor, Block wall, Block ore, Team team){ + public static int colorFor(Block wall, Block floor, Block overlay, Team team){ if(wall.synthetic()){ return team.color.rgba(); } - return (wall.solid ? wall.mapColor : ore == Blocks.air ? floor.mapColor : ore.mapColor).rgba(); + return (wall.solid ? wall.mapColor : !overlay.useColor ? floor.mapColor : overlay.mapColor).rgba(); } public static Pixmap writeImage(Tiles tiles){ @@ -160,14 +174,14 @@ public class MapIO{ //while synthetic blocks are possible, most of their data is lost, so in order to avoid questions like //"why is there air under my drill" and "why are all my conveyors facing right", they are disabled int color = tile.block().hasColor && !tile.block().synthetic() ? tile.block().mapColor.rgba() : tile.floor().mapColor.rgba(); - pix.draw(tile.x, tiles.height - 1 - tile.y, color); + pix.set(tile.x, tiles.height - 1 - tile.y, color); } return pix; } public static void readImage(Pixmap pixmap, Tiles tiles){ for(Tile tile : tiles){ - int color = pixmap.getPixel(tile.x, pixmap.getHeight() - 1 - tile.y); + int color = pixmap.get(tile.x, pixmap.height - 1 - tile.y); Block block = ColorMapper.get(color); if(block.isFloor()){ @@ -185,11 +199,16 @@ public class MapIO{ for(Point2 p : Geometry.d4){ Tile other = tiles.get(tile.x + p.x, tile.y + p.y); if(other != null && other.floor() != Blocks.air){ - tile.setFloor(other.floor()); + tile.setFloorUnder(other.floor()); break; } } } + + //default to stone floor + if(tile.floor() == Blocks.air){ + tile.setFloorUnder((Floor)Blocks.stone); + } } } } diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index 0aef1a19df..178980207f 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -2,6 +2,7 @@ package mindustry.io; import arc.struct.*; import arc.struct.ObjectMap.*; +import arc.util.*; import arc.util.io.*; import mindustry.world.*; @@ -23,12 +24,12 @@ public abstract class SaveFileReader{ "spirit-factory", "legacy-unit-factory", "phantom-factory", "legacy-unit-factory", "wraith-factory", "legacy-unit-factory", - "ghoul-factory", "legacy-unit-factory", - "revenant-factory", "legacy-unit-factory", + "ghoul-factory", "legacy-unit-factory-air", + "revenant-factory", "legacy-unit-factory-air", "dagger-factory", "legacy-unit-factory", "crawler-factory", "legacy-unit-factory", - "titan-factory", "legacy-unit-factory", - "fortress-factory", "legacy-unit-factory", + "titan-factory", "legacy-unit-factory-ground", + "fortress-factory", "legacy-unit-factory-ground", "mass-conveyor", "payload-conveyor", "vestige", "scepter", @@ -60,9 +61,11 @@ public abstract class SaveFileReader{ protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); protected int lastRegionLength; + protected @Nullable CounterInputStream currCounter; - protected void region(String name, DataInput stream, CounterInputStream counter, IORunner cons) throws IOException{ + public void region(String name, DataInput stream, CounterInputStream counter, IORunner cons) throws IOException{ counter.resetCount(); + this.currCounter = counter; int length; try{ length = readChunk(stream, cons); @@ -70,12 +73,12 @@ public abstract class SaveFileReader{ throw new IOException("Error reading region \"" + name + "\".", e); } - if(length != counter.count() - 4){ - throw new IOException("Error reading region \"" + name + "\": read length mismatch. Expected: " + length + "; Actual: " + (counter.count() - 4)); + if(length != counter.count - 4){ + throw new IOException("Error reading region \"" + name + "\": read length mismatch. Expected: " + length + "; Actual: " + (counter.count - 4)); } } - protected void region(String name, DataOutput stream, IORunner cons) throws IOException{ + public void region(String name, DataOutput stream, IORunner cons) throws IOException{ try{ writeChunk(stream, cons); }catch(Throwable e){ @@ -99,8 +102,8 @@ public abstract class SaveFileReader{ if(!isByte){ output.writeInt(length); }else{ - if(length > Short.MAX_VALUE){ - throw new IOException("Byte write length exceeded: " + length + " > " + Short.MAX_VALUE); + if(length > 65535){ + throw new IOException("Byte write length exceeded: " + length + " > 65535"); } output.writeShort(length); } @@ -153,7 +156,7 @@ public abstract class SaveFileReader{ public abstract void write(DataOutputStream stream) throws IOException; - protected interface IORunner{ + public interface IORunner{ void accept(T stream) throws IOException; } } diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index 8b56ef2a61..e6d04d5ddb 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -18,10 +18,10 @@ import java.util.zip.*; import static mindustry.Vars.*; public class SaveIO{ - /** Format header. This is the string 'MSAV' in ASCII. */ - public static final byte[] header = {77, 83, 65, 86}; + /** Save format header. */ + public static final byte[] header = {'M', 'S', 'A', 'V'}; public static final IntMap versions = new IntMap<>(); - public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4()); + public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4(), new Save5()); static{ for(SaveVersion version : versionArray){ diff --git a/core/src/mindustry/io/SaveMeta.java b/core/src/mindustry/io/SaveMeta.java index 4aeb7d2f99..c6133889bc 100644 --- a/core/src/mindustry/io/SaveMeta.java +++ b/core/src/mindustry/io/SaveMeta.java @@ -4,7 +4,7 @@ import arc.struct.*; import mindustry.game.*; import mindustry.maps.*; -import static mindustry.Vars.maps; +import static mindustry.Vars.*; public class SaveMeta{ public int version; @@ -14,12 +14,10 @@ public class SaveMeta{ public Map map; public int wave; public Rules rules; - public SectorInfo secinfo; public StringMap tags; public String[] mods; - public boolean hasProduction; - public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules, SectorInfo secinfo, StringMap tags){ + public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules, StringMap tags){ this.version = version; this.build = build; this.timestamp = timestamp; @@ -29,8 +27,5 @@ public class SaveMeta{ this.rules = rules; this.tags = tags; this.mods = JsonIO.read(String[].class, tags.get("mods", "[]")); - this.secinfo = secinfo; - - secinfo.production.each((e, amount) -> hasProduction |= amount.mean > 0.001f); } } diff --git a/core/src/mindustry/io/SavePreviewLoader.java b/core/src/mindustry/io/SavePreviewLoader.java index bf01424a11..46f51216b1 100644 --- a/core/src/mindustry/io/SavePreviewLoader.java +++ b/core/src/mindustry/io/SavePreviewLoader.java @@ -1,14 +1,14 @@ package mindustry.io; +import arc.*; import arc.assets.*; import arc.assets.loaders.*; -import arc.assets.loaders.resolvers.*; import arc.files.*; public class SavePreviewLoader extends TextureLoader{ public SavePreviewLoader(){ - super(new AbsoluteFileHandleResolver()); + super(Core.files::absolute); } @Override diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index cacac7700a..90fd35a59d 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -1,6 +1,7 @@ package mindustry.io; import arc.*; +import arc.func.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; @@ -12,10 +13,11 @@ import mindustry.ctype.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; -import mindustry.maps.*; +import mindustry.maps.Map; import mindustry.world.*; import java.io.*; +import java.util.*; import static mindustry.Vars.*; @@ -24,6 +26,9 @@ public abstract class SaveVersion extends SaveFileReader{ //HACK stores the last read build of the save file, valid after read meta call protected int lastReadBuild; + //stores entity mappings for use after readEntityMapping + //if null, fall back to EntityMapping's values + protected @Nullable Prov[] entityMapping; public SaveVersion(int version){ this.version = version; @@ -40,7 +45,6 @@ public abstract class SaveVersion extends SaveFileReader{ map.get("mapname"), map.getInt("wave"), JsonIO.read(Rules.class, map.get("rules", "{}")), - JsonIO.read(SectorInfo.class, map.get("secinfo", "{}")), map ); } @@ -73,7 +77,8 @@ public abstract class SaveVersion extends SaveFileReader{ public void writeMeta(DataOutput stream, StringMap tags) throws IOException{ //prepare campaign data for writing if(state.isCampaign()){ - state.secinfo.prepare(); + state.rules.sector.info.prepare(); + state.rules.sector.saveInfo(); } //flush tech node progress @@ -89,7 +94,6 @@ public abstract class SaveVersion extends SaveFileReader{ "wave", state.wave, "wavetime", state.wavetime, "stats", JsonIO.write(state.stats), - "secinfo", state.isCampaign() ? JsonIO.write(state.secinfo) : "{}", "rules", JsonIO.write(state.rules), "mods", JsonIO.write(mods.getModStrings().toArray(String.class)), "width", world.width(), @@ -106,17 +110,11 @@ public abstract class SaveVersion extends SaveFileReader{ state.wave = map.getInt("wave"); state.wavetime = map.getFloat("wavetime", state.rules.waveSpacing); - state.stats = JsonIO.read(Stats.class, map.get("stats", "{}")); - state.secinfo = JsonIO.read(SectorInfo.class, map.get("secinfo", "{}")); + state.stats = JsonIO.read(GameStats.class, map.get("stats", "{}")); state.rules = JsonIO.read(Rules.class, map.get("rules", "{}")); - if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get(); + if(state.rules.spawns.isEmpty()) state.rules.spawns = waves.get(); lastReadBuild = map.getInt("build", -1); - //load time spent on sector into state - if(state.rules.sector != null){ - state.secinfo.internalTimeSpent = state.rules.sector.getStoredTimeSpent(); - } - if(!headless){ Tmp.v1.tryFromString(map.get("viewpos")); Core.camera.position.set(Tmp.v1); @@ -270,6 +268,8 @@ public abstract class SaveVersion extends SaveFileReader{ //skip the entity region, as the entity and its IO code are now gone skipChunk(stream, true); } + + context.onReadBuilding(); } }else if(hadData){ tile.setBlock(block); @@ -289,9 +289,10 @@ public abstract class SaveVersion extends SaveFileReader{ } } - public void writeEntities(DataOutput stream) throws IOException{ + public void writeTeamBlocks(DataOutput stream) throws IOException{ //write team data with entities. - Seq data = state.teams.getActive(); + Seq data = state.teams.getActive().copy(); + if(!data.contains(Team.sharded.data())) data.add(Team.sharded.data()); stream.writeInt(data.size); for(TeamData team : data){ stream.writeInt(team.team.id); @@ -304,7 +305,9 @@ public abstract class SaveVersion extends SaveFileReader{ TypeIO.writeObject(Writes.get(stream), block.config); } } + } + public void writeWorldEntities(DataOutput stream) throws IOException{ stream.writeInt(Groups.all.count(Entityc::serialize)); for(Entityc entity : Groups.all){ if(!entity.serialize()) continue; @@ -316,33 +319,83 @@ public abstract class SaveVersion extends SaveFileReader{ } } - public void readEntities(DataInput stream) throws IOException{ + public void writeEntityMapping(DataOutput stream) throws IOException{ + stream.writeShort(EntityMapping.customIdMap.size); + for(var entry : EntityMapping.customIdMap.entries()){ + stream.writeShort(entry.key); + stream.writeUTF(entry.value); + } + } + + public void writeEntities(DataOutput stream) throws IOException{ + writeEntityMapping(stream); + writeTeamBlocks(stream); + writeWorldEntities(stream); + } + + public void readTeamBlocks(DataInput stream) throws IOException{ int teamc = stream.readInt(); + for(int i = 0; i < teamc; i++){ Team team = Team.get(stream.readInt()); TeamData data = team.data(); int blocks = stream.readInt(); + data.blocks.clear(); + data.blocks.ensureCapacity(Math.min(blocks, 1000)); + var reads = Reads.get(stream); + var set = new IntSet(); + for(int j = 0; j < blocks; j++){ - data.blocks.addLast(new BlockPlan(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, TypeIO.readObject(Reads.get(stream)))); + short x = stream.readShort(), y = stream.readShort(), rot = stream.readShort(), bid = stream.readShort(); + var obj = TypeIO.readObject(reads); + //cannot have two in the same position + if(set.add(Point2.pack(x, y))){ + data.blocks.addLast(new BlockPlan(x, y, rot, content.block(bid).id, obj)); + } } } + } + + public void readWorldEntities(DataInput stream) throws IOException{ + //entityMapping is null in older save versions, so use the default + Prov[] mapping = this.entityMapping == null ? EntityMapping.idMap : this.entityMapping; int amount = stream.readInt(); for(int j = 0; j < amount; j++){ readChunk(stream, true, in -> { byte typeid = in.readByte(); - if(EntityMapping.map(typeid) == null){ + if(mapping[typeid] == null){ in.skipBytes(lastRegionLength - 1); return; } - Entityc entity = (Entityc)EntityMapping.map(typeid).get(); + Entityc entity = (Entityc)mapping[typeid].get(); entity.read(Reads.get(in)); entity.add(); }); } } + public void readEntityMapping(DataInput stream) throws IOException{ + //copy entityMapping for further mutation; will be used in readWorldEntities + entityMapping = Arrays.copyOf(EntityMapping.idMap, EntityMapping.idMap.length); + + short amount = stream.readShort(); + for(int i = 0; i < amount; i++){ + //everything that corresponded to this ID in this save goes by this name + //so replace the prov in the current mapping with the one found with this name + short id = stream.readShort(); + String name = stream.readUTF(); + entityMapping[id] = EntityMapping.map(name); + } + } + + public void readEntities(DataInput stream) throws IOException{ + readEntityMapping(stream); + readTeamBlocks(stream); + readWorldEntities(stream); + } + public void readContentHeader(DataInput stream) throws IOException{ byte mapped = stream.readByte(); diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 733bb27c28..f070c3446b 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -3,9 +3,8 @@ package mindustry.io; import arc.graphics.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.io.*; -import arc.util.pooling.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -29,7 +28,7 @@ import java.nio.*; import static mindustry.Vars.*; -/** Class for specifying read/write methods for code generation. */ +/** Class for specifying read/write methods for code generation. All IO MUST be thread safe!*/ @SuppressWarnings("unused") @TypeIOHandler public class TypeIO{ @@ -37,64 +36,64 @@ public class TypeIO{ public static void writeObject(Writes write, Object object){ if(object == null){ write.b((byte)0); - }else if(object instanceof Integer){ + }else if(object instanceof Integer i){ write.b((byte)1); - write.i((Integer)object); - }else if(object instanceof Long){ + write.i(i); + }else if(object instanceof Long l){ write.b((byte)2); - write.l((Long)object); - }else if(object instanceof Float){ + write.l(l); + }else if(object instanceof Float f){ write.b((byte)3); - write.f((Float)object); - }else if(object instanceof String){ + write.f(f); + }else if(object instanceof String s){ write.b((byte)4); - writeString(write, (String)object); - }else if(object instanceof Content){ - Content map = (Content)object; + writeString(write, s); + }else if(object instanceof Content map){ write.b((byte)5); write.b((byte)map.getContentType().ordinal()); write.s(map.id); - }else if(object instanceof IntSeq){ + }else if(object instanceof IntSeq arr){ write.b((byte)6); - IntSeq arr = (IntSeq)object; write.s((short)arr.size); for(int i = 0; i < arr.size; i++){ write.i(arr.items[i]); } - }else if(object instanceof Point2){ + }else if(object instanceof Point2 p){ write.b((byte)7); - write.i(((Point2)object).x); - write.i(((Point2)object).y); - }else if(object instanceof Point2[]){ + write.i(p.x); + write.i(p.y); + }else if(object instanceof Point2[] p){ write.b((byte)8); - write.b(((Point2[])object).length); - for(int i = 0; i < ((Point2[])object).length; i++){ - write.i(((Point2[])object)[i].pack()); + write.b(p.length); + for(Point2 point2 : p){ + write.i(point2.pack()); } - }else if(object instanceof TechNode){ - TechNode map = (TechNode)object; + }else if(object instanceof TechNode map){ write.b(9); write.b((byte)map.content.getContentType().ordinal()); write.s(map.content.id); - }else if(object instanceof Boolean){ + }else if(object instanceof Boolean b){ write.b((byte)10); - write.bool((Boolean)object); - }else if(object instanceof Double){ + write.bool(b); + }else if(object instanceof Double d){ write.b((byte)11); - write.d((Double)object); - }else if(object instanceof Building){ - write.b((byte)12); - write.i(((Building)object).pos()); - }else if(object instanceof LAccess){ + write.d(d); + }else if(object instanceof Building b){ + write.b(12); + write.i(b.pos()); + }else if(object instanceof LAccess l){ write.b((byte)13); - write.s(((LAccess)object).ordinal()); - }else if(object instanceof byte[]){ + write.s(l.ordinal()); + }else if(object instanceof byte[] b){ write.b((byte)14); - write.i(((byte[])object).length); - write.b((byte[])object); - }else if(object instanceof UnitCommand){ + write.i(b.length); + write.b(b); + }else if(object instanceof UnitCommand c){ write.b((byte)15); - write.b(((UnitCommand)object).ordinal()); + write.b(c.ordinal()); + }else if(object instanceof BuildingBox b){ + write.b(12); + write.i(b.pos); }else{ throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } @@ -102,6 +101,12 @@ public class TypeIO{ @Nullable public static Object readObject(Reads read){ + return readObjectBoxed(read, false); + } + + /** Reads an object, but boxes buildings. */ + @Nullable + public static Object readObjectBoxed(Reads read, boolean box){ byte type = read.b(); switch(type){ case 0: return null; @@ -116,7 +121,7 @@ public class TypeIO{ case 9: return TechTree.getNotNull(content.getByID(ContentType.all[read.b()], read.s())); case 10: return read.bool(); case 11: return read.d(); - case 12: return world.build(read.i()); + case 12: return !box ? world.build(read.i()) : new BuildingBox(read.i()); case 13: return LAccess.all[read.s()]; case 14: int blen = read.i(); byte[] bytes = new byte[blen]; read.b(bytes); return bytes; case 15: return UnitCommand.all[read.b()]; @@ -169,10 +174,13 @@ public class TypeIO{ } public static void writeUnit(Writes write, Unit unit){ - write.b(unit.isNull() ? 0 : unit instanceof BlockUnitc ? 1 : 2); + write.b(unit == null || unit.isNull() ? 0 : unit instanceof BlockUnitc ? 1 : 2); + //block units are special if(unit instanceof BlockUnitc){ write.i(((BlockUnitc)unit).tile().pos()); + }else if(unit == null){ + write.i(0); }else{ write.i(unit.id); } @@ -188,7 +196,7 @@ public class TypeIO{ return unit == null ? Nulls.unit : unit; }else if(type == 1){ //block Building tile = world.build(id); - return tile instanceof ControlBlock ? ((ControlBlock)tile).unit() : Nulls.unit; + return tile instanceof ControlBlock cont ? cont.unit() : Nulls.unit; } return Nulls.unit; } @@ -293,12 +301,15 @@ public class TypeIO{ public static void writeController(Writes write, UnitController control){ //no real unit controller state is written, only the type - if(control instanceof Player){ + if(control instanceof Player p){ write.b(0); - write.i(((Player)control).id); - }else if(control instanceof FormationAI){ + write.i(p.id); + }else if(control instanceof FormationAI form && form.leader != null){ write.b(1); - write.i(((FormationAI)control).leader.id); + write.i(form.leader.id); + }else if(control instanceof LogicAI logic && logic.controller != null){ + write.b(3); + write.i(logic.controller.pos()); }else{ write.b(2); } @@ -314,13 +325,30 @@ public class TypeIO{ return player; }else if(type == 1){ //formation controller int id = read.i(); - return prev instanceof FormationAI ? prev : new FormationAI(Groups.unit.getByID(id), null); + if(prev instanceof FormationAI f){ + f.leader = Groups.unit.getByID(id); + return f; + } + return new FormationAI(Groups.unit.getByID(id), null); + }else if(type == 3){ + int pos = read.i(); + if(prev instanceof LogicAI pai){ + pai.controller = world.build(pos); + return pai; + }else{ + //create new AI for assignment + LogicAI out = new LogicAI(); + //instantly time out when updated. + out.controlTimer = LogicAI.logicControlTimeout; + out.controller = world.build(pos); + return out; + } }else{ //there are two cases here: //1: prev controller was not a player, carry on //2: prev controller was a player, so replace this controller with *anything else* //...since AI doesn't update clientside it doesn't matter - return (!(prev instanceof AIController) || (prev instanceof FormationAI)) ? new GroundAI() : prev; + return (!(prev instanceof AIController) || (prev instanceof FormationAI) || (prev instanceof LogicAI)) ? new GroundAI() : prev; } } @@ -363,13 +391,13 @@ public class TypeIO{ return new Vec2(read.f(), read.f()); } - public static void writeStatuse(Writes write, StatusEntry entry){ + public static void writeStatus(Writes write, StatusEntry entry){ write.s(entry.effect.id); write.f(entry.time); } - public static StatusEntry readStatuse(Reads read){ - return Pools.obtain(StatusEntry.class, StatusEntry::new).set(content.getByID(ContentType.status, read.s()), read.f()); + public static StatusEntry readStatus(Reads read){ + return new StatusEntry().set(content.getByID(ContentType.status, read.s()), read.f()); } public static void writeItems(Writes write, ItemStack stack){ @@ -437,6 +465,16 @@ public class TypeIO{ return color.set(read.i()); } + public static void writeContent(Writes write, Content cont){ + write.b(cont.getContentType().ordinal()); + write.s(cont.id); + } + + public static Content readContent(Reads read){ + byte id = read.b(); + return content.getByID(ContentType.all[id], read.s()); + } + public static void writeLiquid(Writes write, Liquid liquid){ write.s(liquid == null ? -1 : liquid.id); } @@ -521,15 +559,33 @@ public class TypeIO{ return read.b(new byte[length]); } + public static void writeInts(Writes write, int[] ints){ + write.s((short)ints.length); + for(int i : ints){ + write.i(i); + } + } + + public static int[] readInts(Reads read){ + short length = read.s(); + int[] out = new int[length]; + for(int i = 0; i < length; i++){ + out[i] = read.i(); + } + return out; + } + public static void writeTraceInfo(Writes write, TraceInfo trace){ writeString(write, trace.ip); writeString(write, trace.uuid); write.b(trace.modded ? (byte)1 : 0); write.b(trace.mobile ? (byte)1 : 0); + write.i(trace.timesJoined); + write.i(trace.timesKicked); } public static TraceInfo readTraceInfo(Reads read){ - return new TraceInfo(readString(read), readString(read), read.b() == 1, read.b() == 1); + return new TraceInfo(readString(read), readString(read), read.b() == 1, read.b() == 1, read.i(), read.i()); } public static void writeStringData(DataOutput buffer, String string) throws IOException{ @@ -552,4 +608,13 @@ public class TypeIO{ return null; } } + + /** Representes a building that has not been resolved yet. */ + public static class BuildingBox{ + public int pos; + + public BuildingBox(int pos){ + this.pos = pos; + } + } } diff --git a/core/src/mindustry/io/legacy/LegacyIO.java b/core/src/mindustry/io/legacy/LegacyIO.java index 545487d8ca..9ca0533855 100644 --- a/core/src/mindustry/io/legacy/LegacyIO.java +++ b/core/src/mindustry/io/legacy/LegacyIO.java @@ -2,6 +2,9 @@ package mindustry.io.legacy; import arc.*; import arc.struct.*; +import arc.util.*; +import mindustry.*; +import mindustry.ctype.*; import mindustry.ui.dialogs.JoinDialog.*; import java.io.*; @@ -48,4 +51,34 @@ public class LegacyIO{ return arr; } + public static void readResearch(){ + try{ + byte[] bytes = Core.settings.getBytes("unlocks"); + DataInputStream stream = new DataInputStream(new ByteArrayInputStream(bytes)); + + int length = stream.readInt(); + if(length > 0){ + stream.readUTF(); //name of key type + stream.readUTF(); //name of value type + + //each element is an array list + for(int i = 0; i < length; i++){ + ContentType type = ContentType.all[stream.readInt()]; + int arrLength = stream.readInt(); + if(arrLength > 0){ + stream.readUTF(); //type of contents (String) + for(int j = 0; j < arrLength; j++){ + String name = stream.readUTF(); + Content out = Vars.content.getByName(type, name); + if(out instanceof UnlockableContent u){ + u.quietUnlock(); + } + } + } + } + } + }catch(Exception e){ + Log.err(e); + } + } } diff --git a/core/src/mindustry/io/legacy/LegacySaveVersion.java b/core/src/mindustry/io/legacy/LegacySaveVersion.java index 7e84526bec..bb7d7eff11 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/legacy/LegacySaveVersion.java @@ -9,7 +9,7 @@ import mindustry.world.*; import java.io.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public abstract class LegacySaveVersion extends SaveVersion{ @@ -26,7 +26,6 @@ public abstract class LegacySaveVersion extends SaveVersion{ if(!generating) context.begin(); try{ - context.resize(width, height); //read floor and create tiles first @@ -85,6 +84,8 @@ public abstract class LegacySaveVersion extends SaveVersion{ }catch(Throwable e){ throw new IOException("Failed to read tile entity of block: " + block, e); } + + context.onReadBuilding(); }else{ int consecutives = stream.readUnsignedByte(); diff --git a/core/src/mindustry/io/legacy/Save3.java b/core/src/mindustry/io/legacy/Save3.java index 64e7683ff2..7306b2bf29 100644 --- a/core/src/mindustry/io/legacy/Save3.java +++ b/core/src/mindustry/io/legacy/Save3.java @@ -5,7 +5,7 @@ import mindustry.game.Teams.*; import java.io.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class Save3 extends LegacySaveVersion{ diff --git a/core/src/mindustry/io/versions/Save4.java b/core/src/mindustry/io/versions/Save4.java index 4c3198cc35..c75268592c 100644 --- a/core/src/mindustry/io/versions/Save4.java +++ b/core/src/mindustry/io/versions/Save4.java @@ -2,9 +2,25 @@ package mindustry.io.versions; import mindustry.io.*; +import java.io.*; + +/** This version only writes entities, no entity ID mappings. */ public class Save4 extends SaveVersion{ public Save4(){ super(4); } + + @Override + public void writeEntities(DataOutput stream) throws IOException{ + writeTeamBlocks(stream); + writeWorldEntities(stream); + } + + @Override + public void readEntities(DataInput stream) throws IOException{ + readTeamBlocks(stream); + readWorldEntities(stream); + } + } diff --git a/core/src/mindustry/io/versions/Save5.java b/core/src/mindustry/io/versions/Save5.java new file mode 100644 index 0000000000..98cdbad1dd --- /dev/null +++ b/core/src/mindustry/io/versions/Save5.java @@ -0,0 +1,10 @@ +package mindustry.io.versions; + +import mindustry.io.*; + +public class Save5 extends SaveVersion{ + + public Save5(){ + super(5); + } +} diff --git a/core/src/mindustry/logic/ConditionOp.java b/core/src/mindustry/logic/ConditionOp.java index 0954567c06..6af660bafe 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -1,12 +1,15 @@ package mindustry.logic; +import arc.util.*; + public enum ConditionOp{ - equal("==", (a, b) -> Math.abs(a - b) < 0.000001, (a, b) -> a == b), - notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001, (a, b) -> a != b), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001, Structs::eq), + notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001, (a, b) -> !Structs.eq(a, b)), lessThan("<", (a, b) -> a < b), lessThanEq("<=", (a, b) -> a <= b), greaterThan(">", (a, b) -> a > b), greaterThanEq(">=", (a, b) -> a >= b), + strictEqual("===", (a, b) -> false), always("always", (a, b) -> true); public static final ConditionOp[] all = values(); diff --git a/core/src/mindustry/logic/Controllable.java b/core/src/mindustry/logic/Controllable.java index 31baf31a1e..025559b4b9 100644 --- a/core/src/mindustry/logic/Controllable.java +++ b/core/src/mindustry/logic/Controllable.java @@ -1,6 +1,10 @@ package mindustry.logic; +import mindustry.game.*; + /** An object that can be controlled with logic. */ public interface Controllable{ void control(LAccess type, double p1, double p2, double p3, double p4); + void control(LAccess type, Object p1, double p2, double p3, double p4); + Team team(); } diff --git a/core/src/mindustry/logic/DataType.java b/core/src/mindustry/logic/DataType.java deleted file mode 100644 index 49090d69f6..0000000000 --- a/core/src/mindustry/logic/DataType.java +++ /dev/null @@ -1,24 +0,0 @@ -package mindustry.logic; - -import arc.graphics.*; -import mindustry.graphics.*; - -/** The types of data a node field can be. */ -public enum DataType{ - /** A double. Used for integer calculations as well. */ - number(Pal.place), - /** Any type of content, e.g. item. */ - content(Color.cyan), - /** A building of a tile. */ - building(Pal.items), - /** A unit on the map. */ - unit(Pal.health), - /** Java string */ - string(Color.royal); - - public final Color color; - - DataType(Color color){ - this.color = color; - } -} \ No newline at end of file diff --git a/core/src/mindustry/logic/GlobalConstants.java b/core/src/mindustry/logic/GlobalConstants.java new file mode 100644 index 0000000000..b13c658611 --- /dev/null +++ b/core/src/mindustry/logic/GlobalConstants.java @@ -0,0 +1,86 @@ +package mindustry.logic; + +import arc.struct.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.logic.LExecutor.*; +import mindustry.type.*; +import mindustry.world.*; + +/** Stores global constants for logic processors. */ +public class GlobalConstants{ + public static final int ctrlProcessor = 1, ctrlPlayer = 2, ctrlFormation = 3; + + private ObjectIntMap namesToIds = new ObjectIntMap<>(); + private Seq vars = new Seq<>(Var.class); + + public void init(){ + put("the end", null); + //add default constants + put("false", 0); + put("true", 1); + put("null", null); + + //special enums + + put("@ctrlProcessor", ctrlProcessor); + put("@ctrlPlayer", ctrlPlayer); + put("@ctrlFormation", ctrlFormation); + + //store base content + + for(Item item : Vars.content.items()){ + put("@" + item.name, item); + } + + for(Liquid liquid : Vars.content.liquids()){ + put("@" + liquid.name, liquid); + } + + for(Block block : Vars.content.blocks()){ + if(block.synthetic()){ + put("@" + block.name, block); + } + } + + //used as a special value for any environmental solid block + put("@solid", Blocks.stoneWall); + put("@air", Blocks.air); + + for(UnitType type : Vars.content.units()){ + put("@" + type.name, type); + } + + //store sensor constants + for(LAccess sensor : LAccess.all){ + put("@" + sensor.name(), sensor); + } + } + + /** @return a constant ID > 0 if there is a constant with this name, otherwise -1. */ + public int get(String name){ + return namesToIds.get(name, -1); + } + + /** @return a constant variable by ID. ID is not bound checked and must be positive. */ + public Var get(int id){ + return vars.items[id]; + } + + /** Adds a constant value by name. */ + public Var put(String name, Object value){ + Var var = new Var(name); + var.constant = true; + if(value instanceof Number num){ + var.numval = num.doubleValue(); + }else{ + var.isobj = true; + var.objval = value; + } + + int index = vars.size; + namesToIds.put(name, index); + vars.add(var); + return var; + } +} diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index 30eacf2402..baf4068707 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -5,6 +5,7 @@ import arc.struct.*; /** Setter/getter enum for logic-controlled objects. */ public enum LAccess{ totalItems, + firstItem, totalLiquids, totalPower, itemCapacity, @@ -14,30 +15,60 @@ public enum LAccess{ powerNetCapacity, powerNetIn, powerNetOut, + ammo, + ammoCapacity, health, maxHealth, heat, efficiency, + progress, + timescale, rotation, x, y, shootX, shootY, + size, + dead, + range, shooting, + boosting, + mineX, + mineY, + mining, team, type, + flag, + controlled, + controller, + commanded, + name, + payloadCount, + payloadType, //values with parameters are considered controllable enabled("to"), //"to" is standard for single parameter access - shoot("x", "y", "shoot"),; + shoot("x", "y", "shoot"), + shootp(true, "unit", "shoot"), + config(true, "to"), + color("r", "g", "b"); - public final String[] parameters; + public final String[] params; + public final boolean isObj; - public static final LAccess[] all = values(); - public static final LAccess[] senseable = Seq.select(all, t -> t.parameters.length <= 1).toArray(LAccess.class); - public static final LAccess[] controls = Seq.select(all, t -> t.parameters.length > 0).toArray(LAccess.class); + public static final LAccess[] + all = values(), + senseable = Seq.select(all, t -> t.params.length <= 1).toArray(LAccess.class), + controls = Seq.select(all, t -> t.params.length > 0).toArray(LAccess.class); - LAccess(String... parameters){ - this.parameters = parameters; + LAccess(String... params){ + this.params = params; + isObj = false; } + + LAccess(boolean obj, String... params){ + this.params = params; + isObj = obj; + } + } diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index 7ca74ca83c..243b2f620f 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -2,60 +2,40 @@ package mindustry.logic; import arc.func.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.*; -import mindustry.gen.*; import mindustry.logic.LExecutor.*; -import mindustry.logic.LStatements.*; -import mindustry.type.*; -import mindustry.world.*; /** "Compiles" a sequence of statements into instructions. */ public class LAssembler{ public static ObjectMap> customParsers = new ObjectMap<>(); + public static final int maxTokenLength = 36; + + private static final int invalidNum = Integer.MIN_VALUE; private int lastVar; /** Maps names to variable IDs. */ - ObjectMap vars = new ObjectMap<>(); + public ObjectMap vars = new ObjectMap<>(); /** All instructions to be executed. */ - LInstruction[] instructions; + public LInstruction[] instructions; public LAssembler(){ + //instruction counter putVar("@counter").value = 0; + //unix timestamp putConst("@time", 0); - - //add default constants - putConst("false", 0); - putConst("true", 1); - putConst("null", null); - - //store base content (TODO hacky?) - - for(Item item : Vars.content.items()){ - putConst("@" + item.name, item); - } - - for(Liquid liquid : Vars.content.liquids()){ - putConst("@" + liquid.name, liquid); - } - - for(Block block : Vars.content.blocks()){ - if(block.synthetic()){ - putConst("@" + block.name, block); - } - } - - //store sensor constants - - for(LAccess sensor : LAccess.all){ - putConst("@" + sensor.name(), sensor); - } + //currently controlled unit + putConst("@unit", null); + //reference to self + putConst("@this", null); + //global tick + putConst("@tick", 0); } - public static LAssembler assemble(String data, int maxInstructions){ + public static LAssembler assemble(String data){ LAssembler asm = new LAssembler(); - Seq st = read(data, maxInstructions); + Seq st = read(data); asm.instructions = st.map(l -> l.build(asm)).filter(l -> l != null).toArray(LInstruction.class); return asm; @@ -72,117 +52,46 @@ public class LAssembler{ } public static Seq read(String data){ - return read(data, LExecutor.maxInstructions); - } - - public static Seq read(String data, int max){ - //empty data check - if(data == null || data.isEmpty()) return new Seq<>(); - - Seq statements = new Seq<>(); - String[] lines = data.split("[;\n]+"); - int index = 0; - for(String line : lines){ - //comments - if(line.startsWith("#")) continue; - - if(index++ > max) break; - - line = line.replace("\t", "").trim(); - - try{ - String[] arr; - - //yes, I am aware that this can be split with regex, but that's slow and even more incomprehensible - if(line.contains(" ")){ - Seq tokens = new Seq<>(); - boolean inString = false; - int lastIdx = 0; - - for(int i = 0; i < line.length() + 1; i++){ - char c = i == line.length() ? ' ' : line.charAt(i); - if(c == '"'){ - inString = !inString; - }else if(c == ' ' && !inString){ - tokens.add(line.substring(lastIdx, i)); - lastIdx = i + 1; - } - } - - arr = tokens.toArray(String.class); - }else{ - arr = new String[]{line}; - } - - String type = arr[0]; - - //legacy stuff - if(type.equals("bop")){ - arr[0] = "op"; - - //field order for bop used to be op a, b, result, but now it's op result a b - String res = arr[4]; - arr[4] = arr[3]; - arr[3] = arr[2]; - arr[2] = res; - }else if(type.equals("uop")){ - arr[0] = "op"; - - if(arr[1].equals("negate")){ - arr = new String[]{ - "op", "mul", arr[3], arr[2], "-1" - }; - }else{ - //field order for uop used to be op a, result, but now it's op result a - String res = arr[3]; - arr[3] = arr[2]; - arr[2] = res; - } - } - - LStatement st = LogicIO.read(arr); - - if(st != null){ - statements.add(st); - }else{ - //attempt parsing using custom parser if a match is found - this is for mods - String first = arr[0]; - if(customParsers.containsKey(first)){ - statements.add(customParsers.get(first).get(arr)); - }else{ - //unparseable statement - statements.add(new InvalidStatement()); - } - } - }catch(Exception parseFailed){ - parseFailed.printStackTrace(); - //when parsing fails, add a dummy invalid statement - statements.add(new InvalidStatement()); - } - } - return statements; + return LParser.parse(data); } /** @return a variable ID by name. * This may be a constant variable referring to a number or object. */ public int var(String symbol){ + int constId = Vars.constants.get(symbol); + if(constId > 0){ + //global constants are *negated* and stored separately + return -constId; + } + symbol = symbol.trim(); //string case - if(symbol.startsWith("\"") && symbol.endsWith("\"")){ + if(!symbol.isEmpty() && symbol.charAt(0) == '\"' && symbol.charAt(symbol.length() - 1) == '\"'){ return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1).replace("\\n", "\n")).id; } - try{ - double value = Double.parseDouble(symbol); - //this creates a hidden const variable with the specified value - String key = "___" + value; - return putConst(key, value).id; - }catch(NumberFormatException e){ + //remove spaces for non-strings + symbol = symbol.replace(' ', '_'); + + double value = parseDouble(symbol); + + if(value == invalidNum){ return putVar(symbol).id; + }else{ + //this creates a hidden const variable with the specified value + return putConst("___" + value, value).id; } } + double parseDouble(String symbol){ + //parse hex/binary syntax + if(symbol.startsWith("0b")) return Strings.parseLong(symbol, 2, 2, symbol.length(), invalidNum); + if(symbol.startsWith("0x")) return Strings.parseLong(symbol, 16, 2, symbol.length(), invalidNum); + + return Strings.parseDouble(symbol, invalidNum); + } + /** Adds a constant value by name. */ public BVar putConst(String name, Object value){ BVar var = putVar(name); @@ -202,7 +111,8 @@ public class LAssembler{ } } - public @Nullable BVar getVar(String name){ + @Nullable + public BVar getVar(String name){ return vars.get(name); } diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 1c8d61b91a..e6ca89e23b 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -13,24 +13,43 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; +import mindustry.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; public class LCanvas extends Table{ + public static final int maxJumpsDrawn = 100; //ew static variables static LCanvas canvas; - DragLayout statements; + public DragLayout statements; + public ScrollPane pane; + public Group jumps; StatementElem dragging; - ScrollPane pane; - Group jumps; + StatementElem hovered; float targetWidth; + int jumpCount = 0; + Seq tooltips = new Seq<>(); public LCanvas(){ canvas = this; + Core.scene.addListener(new InputListener(){ + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ + //hide tooltips on tap + for(var t : tooltips){ + t.container.toFront(); + } + Core.app.post(() -> { + tooltips.each(Tooltip::hide); + tooltips.clear(); + }); + return super.touchDown(event, x, y, pointer, button); + } + }); + rebuild(); } @@ -39,6 +58,43 @@ public class LCanvas extends Table{ return Core.graphics.getWidth() < Scl.scl(900f) * 1.2f; } + public static void tooltip(Cell cell, String key){ + String lkey = key.toLowerCase().replace(" ", ""); + if(Core.settings.getBool("logichints", true) && Core.bundle.has(lkey)){ + var tip = new Tooltip(t -> t.background(Styles.black8).margin(4f).add("[lightgray]" + Core.bundle.get(lkey)).style(Styles.outlineLabel)); + + //mobile devices need long-press tooltips + if(Vars.mobile){ + cell.get().addListener(new ElementGestureListener(20, 0.4f, 0.43f, 0.15f){ + @Override + public boolean longPress(Element element, float x, float y){ + tip.show(element, x, y); + canvas.tooltips.add(tip); + //prevent touch down for other listeners + for(var list : cell.get().getListeners()){ + if(list instanceof ClickListener cl){ + cl.cancel(); + } + } + return true; + } + }); + }else{ + cell.get().addListener(tip); + } + + } + } + + public static void tooltip(Cell cell, Enum key){ + String cl = key.getClass().getSimpleName().toLowerCase() + "." + key.name().toLowerCase(); + if(Core.bundle.has(cl)){ + tooltip(cell, cl); + }else{ + tooltip(cell, "lenum." + key.name()); + } + } + public void rebuild(){ targetWidth = useRows() ? 400f : 900f; float s = pane != null ? pane.getScrollPercentY() : 0f; @@ -70,18 +126,24 @@ public class LCanvas extends Table{ } } - void add(LStatement statement){ + @Override + public void draw(){ + jumpCount = 0; + super.draw(); + } + + public void add(LStatement statement){ statements.addChild(new StatementElem(statement)); } - String save(){ + public String save(){ Seq st = statements.getChildren().as().map(s -> s.st); st.each(LStatement::saveUI); return LAssembler.write(st); } - void load(String asm){ + public void load(String asm){ jumps.clear(); Seq statements = LAssembler.read(asm); @@ -98,10 +160,23 @@ public class LCanvas extends Table{ this.statements.layout(); } + StatementElem checkHovered(){ + Element e = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); + if(e != null){ + while(e != null && !(e instanceof StatementElem)){ + e = e.parent; + } + } + if(e == null || isDescendantOf(e)) return null; + return (StatementElem)e; + } + @Override public void act(float delta){ super.act(delta); + hovered = checkHovered(); + if(Core.input.isTouched()){ float y = Core.input.mouseY(); float dst = Math.min(y - this.y, Core.graphics.getHeight() - y); @@ -240,14 +315,14 @@ public class LCanvas extends Table{ } public class StatementElem extends Table{ - LStatement st; + public LStatement st; public StatementElem(LStatement st){ this.st = st; st.elem = this; background(Tex.whitePane); - setColor(st.category().color); + setColor(st.color()); margin(0f); touchable = Touchable.enabled; @@ -262,13 +337,13 @@ public class LCanvas extends Table{ t.add().growX(); t.button(Icon.copy, Styles.logici, () -> { - }).padRight(6).get().tapped(() -> copy()); + }).size(24f).padRight(6).get().tapped(this::copy); t.button(Icon.cancel, Styles.logici, () -> { remove(); dragging = null; statements.layout(); - }); + }).size(24f); t.addListener(new InputListener(){ float lastx, lasty; @@ -306,7 +381,7 @@ public class LCanvas extends Table{ statements.finishLayout(); } }); - }).growX(); + }).growX().height(38); row(); @@ -320,7 +395,7 @@ public class LCanvas extends Table{ marginBottom(7); } - void copy(){ + public void copy(){ LStatement copy = st.copy(); if(copy != null){ StatementElem s = new StatementElem(copy); @@ -352,9 +427,8 @@ public class LCanvas extends Table{ boolean selecting; float mx, my; ClickListener listener; - StatementElem hovered; - JumpCurve curve; + public JumpCurve curve; public JumpButton(Prov getter, Cons setter){ super(Tex.logicNode, Styles.colori); @@ -381,7 +455,7 @@ public class LCanvas extends Table{ @Override public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode code){ localToStageCoordinates(Tmp.v1.set(x, y)); - StatementElem elem = hovered(); + StatementElem elem = canvas.hovered; if(elem != null && !isDescendantOf(elem)){ setter.get(elem); @@ -404,13 +478,6 @@ public class LCanvas extends Table{ curve = new JumpCurve(this); } - @Override - public void act(float delta){ - super.act(delta); - - hovered = hovered(); - } - @Override protected void setScene(Scene stage){ super.setScene(stage); @@ -421,21 +488,10 @@ public class LCanvas extends Table{ canvas.jumps.addChild(curve); } } - - StatementElem hovered(){ - Element e = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); - if(e != null){ - while(e != null && !(e instanceof StatementElem)){ - e = e.parent; - } - } - if(e == null || isDescendantOf(e)) return null; - return (StatementElem)e; - } } public static class JumpCurve extends Element{ - JumpButton button; + public JumpButton button; public JumpCurve(JumpButton button){ this.button = button; @@ -452,7 +508,13 @@ public class LCanvas extends Table{ @Override public void draw(){ - Element hover = button.to.get() == null && button.selecting ? button.hovered : button.to.get(); + canvas.jumpCount ++; + + if(canvas.jumpCount > maxJumpsDrawn && !button.selecting && !button.listener.isOver()){ + return; + } + + Element hover = button.to.get() == null && button.selecting ? canvas.hovered : button.to.get(); boolean draw = false; Vec2 t = Tmp.v1, r = Tmp.v2; @@ -484,19 +546,33 @@ public class LCanvas extends Table{ } } - void drawCurve(float x, float y, float x2, float y2){ + public void drawCurve(float x, float y, float x2, float y2){ Lines.stroke(4f, button.color); Draw.alpha(parentAlpha); float dist = 100f; + //square jumps + if(false){ + float len = Scl.scl(Mathf.randomSeed(hashCode(), 10, 50)); + + float maxX = Math.max(x, x2) + len; + + Lines.beginLine(); + Lines.linePoint(x, y); + Lines.linePoint(maxX, y); + Lines.linePoint(maxX, y2); + Lines.linePoint(x2, y2); + Lines.endLine(); + return; + } + Lines.curve( x, y, x + dist, y, x2 + dist, y2, x2, y2, - Math.max(20, (int)(Mathf.dst(x, y, x2, y2) / 6)) - ); + Math.max(18, (int)(Mathf.dst(x, y, x2, y2) / 6))); } } } diff --git a/core/src/mindustry/logic/LCategory.java b/core/src/mindustry/logic/LCategory.java deleted file mode 100644 index b576261f74..0000000000 --- a/core/src/mindustry/logic/LCategory.java +++ /dev/null @@ -1,17 +0,0 @@ -package mindustry.logic; - -import arc.graphics.*; -import mindustry.graphics.*; - -public enum LCategory{ - blocks(Pal.accentBack), - control(Color.cyan.cpy().shiftSaturation(-0.6f).mul(0.7f)), - operations(Pal.place.cpy().shiftSaturation(-0.5f).mul(0.7f)), - io(Pal.remove.cpy().shiftSaturation(-0.5f).mul(0.7f)); - - public final Color color; - - LCategory(Color color){ - this.color = color; - } -} \ No newline at end of file diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 82bcc02ab3..06661d83bc 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1,17 +1,27 @@ package mindustry.logic; +import arc.*; +import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.*; +import mindustry.ai.types.*; +import mindustry.content.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.logic.*; import mindustry.world.blocks.logic.LogicDisplay.*; import mindustry.world.blocks.logic.MemoryBlock.*; import mindustry.world.blocks.logic.MessageBlock.*; +import mindustry.world.blocks.payloads.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -23,20 +33,26 @@ public class LExecutor{ //special variables public static final int - varCounter = 0, - varTime = 1; + varCounter = 0, + varTime = 1, + varUnit = 2, + varThis = 3, + varTick = 4; public static final int - maxGraphicsBuffer = 256, - maxDisplayBuffer = 1024, - maxTextBuffer = 256; + maxGraphicsBuffer = 256, + maxDisplayBuffer = 1024, + maxTextBuffer = 256; public LInstruction[] instructions = {}; public Var[] vars = {}; + public int[] binds; public LongSeq graphicsBuffer = new LongSeq(); public StringBuilder textBuffer = new StringBuilder(); public Building[] links = {}; + public IntSet linkIds = new IntSet(); + public Team team = Team.derelict; public boolean initialized(){ return instructions != null && vars != null && instructions.length > 0; @@ -46,18 +62,20 @@ public class LExecutor{ public void runOnce(){ //set time vars[varTime].numval = Time.millis(); + vars[varTick].numval = Time.time; //reset to start - if(vars[varCounter].numval >= instructions.length - || vars[varCounter].numval < 0) vars[varCounter].numval = 0; + if(vars[varCounter].numval >= instructions.length || vars[varCounter].numval < 0){ + vars[varCounter].numval = 0; + } if(vars[varCounter].numval < instructions.length){ instructions[(int)(vars[varCounter].numval++)].run(this); } } - public void load(String data, int maxInstructions){ - load(LAssembler.assemble(data, maxInstructions)); + public void load(String data){ + load(LAssembler.assemble(data)); } /** Loads with a specified assembler. Resets all variables. */ @@ -71,9 +89,9 @@ public class LExecutor{ dest.constant = var.constant; - if(var.value instanceof Number){ + if(var.value instanceof Number number){ dest.isobj = false; - dest.numval = ((Number)var.value).doubleValue(); + dest.numval = number.doubleValue(); }else{ dest.isobj = true; dest.objval = var.value; @@ -83,47 +101,77 @@ public class LExecutor{ //region utility + private static boolean invalid(double d){ + return Double.isNaN(d) || Double.isInfinite(d); + } + + public Var var(int index){ + //global constants have variable IDs < 0, and they are fetched from the global constants object after being negated + return index < 0 ? constants.get(-index) : vars[index]; + } + public @Nullable Building building(int index){ - Object o = vars[index].objval; - return vars[index].isobj && o instanceof Building ? (Building)o : null; + Object o = var(index).objval; + return var(index).isobj && o instanceof Building building ? building : null; } public @Nullable Object obj(int index){ - Object o = vars[index].objval; - return vars[index].isobj ? o : null; + Object o = var(index).objval; + return var(index).isobj ? o : null; } public boolean bool(int index){ - Var v = vars[index]; + Var v = var(index); return v.isobj ? v.objval != null : Math.abs(v.numval) >= 0.00001; } public double num(int index){ - Var v = vars[index]; - return v.isobj ? v.objval != null ? 1 : 0 : v.numval; + Var v = var(index); + return v.isobj ? v.objval != null ? 1 : 0 : invalid(v.numval) ? 0 : v.numval; + } + + public float numf(int index){ + Var v = var(index); + return v.isobj ? v.objval != null ? 1 : 0 : invalid(v.numval) ? 0 : (float)v.numval; } public int numi(int index){ return (int)num(index); } + public void setbool(int index, boolean value){ + setnum(index, value ? 1 : 0); + } + public void setnum(int index, double value){ - Var v = vars[index]; + Var v = var(index); if(v.constant) return; - v.numval = value; - v.objval = null; - v.isobj = false; + if(invalid(value)){ + v.objval = null; + v.isobj = true; + }else{ + v.numval = value; + v.objval = null; + v.isobj = false; + } } public void setobj(int index, Object value){ - Var v = vars[index]; + Var v = var(index); if(v.constant) return; v.objval = value; v.isobj = true; } + public void setconst(int index, Object value){ + Var v = var(index); + v.objval = value; + v.isobj = true; + } + //endregion + /** A logic variable. */ public static class Var{ public final String name; @@ -143,6 +191,335 @@ public class LExecutor{ void run(LExecutor exec); } + /** Binds the processor to a unit based on some filters. */ + public static class UnitBindI implements LInstruction{ + public int type; + + public UnitBindI(int type){ + this.type = type; + } + + public UnitBindI(){ + } + + @Override + public void run(LExecutor exec){ + + if(exec.binds == null || exec.binds.length != content.units().size){ + exec.binds = new int[content.units().size]; + } + + //binding to `null` was previously possible, but was too powerful and exploitable + if(exec.obj(type) instanceof UnitType type){ + Seq seq = exec.team.data().unitCache(type); + + if(seq != null && seq.any()){ + exec.binds[type.id] %= seq.size; + if(exec.binds[type.id] < seq.size){ + //bind to the next unit + exec.setconst(varUnit, seq.get(exec.binds[type.id])); + } + exec.binds[type.id] ++; + }else{ + //no units of this type found + exec.setconst(varUnit, null); + } + }else if(exec.obj(type) instanceof Unit u && u.team == exec.team){ + //bind to specific unit object + exec.setconst(varUnit, u); + }else{ + exec.setconst(varUnit, null); + } + } + } + + /** Uses a unit to find something that may not be in its range. */ + public static class UnitLocateI implements LInstruction{ + public LLocate locate = LLocate.building; + public BlockFlag flag = BlockFlag.core; + public int enemy, ore; + public int outX, outY, outFound, outBuild; + + public UnitLocateI(LLocate locate, BlockFlag flag, int enemy, int ore, int outX, int outY, int outFound, int outBuild){ + this.locate = locate; + this.flag = flag; + this.enemy = enemy; + this.ore = ore; + this.outX = outX; + this.outY = outY; + this.outFound = outFound; + this.outBuild = outBuild; + } + + public UnitLocateI(){ + } + + @Override + public void run(LExecutor exec){ + Object unitObj = exec.obj(varUnit); + LogicAI ai = UnitControlI.checkLogicAI(exec, unitObj); + + if(unitObj instanceof Unit unit && ai != null){ + ai.controlTimer = LogicAI.logicControlTimeout; + + Cache cache = (Cache)ai.execCache.get(this, Cache::new); + + if(ai.checkTargetTimer(this)){ + Tile res = null; + boolean build = false; + + switch(locate){ + case ore -> { + if(exec.obj(ore) instanceof Item item){ + res = indexer.findClosestOre(unit, item); + } + } + case building -> { + res = Geometry.findClosest(unit.x, unit.y, exec.bool(enemy) ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag)); + build = true; + } + case spawn -> { + res = Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns()); + } + case damaged -> { + Building b = Units.findDamagedTile(unit.team, unit.x, unit.y); + res = b == null ? null : b.tile; + build = true; + } + } + + if(res != null && (!build || res.build != null)){ + cache.found = true; + //set result if found + exec.setnum(outX, cache.x = World.conv(build ? res.build.x : res.worldx())); + exec.setnum(outY, cache.y = World.conv(build ? res.build.y : res.worldy())); + exec.setnum(outFound, 1); + }else{ + cache.found = false; + exec.setnum(outFound, 0); + } + exec.setobj(outBuild, res != null && res.build != null && res.build.team == exec.team ? cache.build = res.build : null); + }else{ + exec.setobj(outBuild, cache.build); + exec.setbool(outFound, cache.found); + exec.setnum(outX, cache.x); + exec.setnum(outY, cache.y); + } + }else{ + exec.setbool(outFound, false); + } + } + + static class Cache{ + float x, y; + boolean found; + Building build; + } + } + + /** Controls the unit based on some parameters. */ + public static class UnitControlI implements LInstruction{ + public LUnitControl type = LUnitControl.move; + public int p1, p2, p3, p4, p5; + + public UnitControlI(LUnitControl type, int p1, int p2, int p3, int p4, int p5){ + this.type = type; + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + this.p4 = p4; + this.p5 = p5; + } + + public UnitControlI(){ + } + + /** Checks is a unit is valid for logic AI control, and returns the controller. */ + @Nullable + public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){ + if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){ + if(unit.controller() instanceof LogicAI la){ + la.controller = exec.building(varThis); + return la; + }else{ + var la = new LogicAI(); + la.controller = exec.building(varThis); + + unit.controller(la); + //clear old state + unit.mineTile = null; + unit.clearBuilding(); + + return la; + } + } + return null; + } + + @Override + public void run(LExecutor exec){ + Object unitObj = exec.obj(varUnit); + LogicAI ai = checkLogicAI(exec, unitObj); + + //only control standard AI units + if(unitObj instanceof Unit unit && ai != null){ + ai.controlTimer = LogicAI.logicControlTimeout; + float x1 = World.unconv(exec.numf(p1)), y1 = World.unconv(exec.numf(p2)), d1 = World.unconv(exec.numf(p3)); + + switch(type){ + case move, stop, approach -> { + ai.control = type; + ai.moveX = x1; + ai.moveY = y1; + if(type == LUnitControl.approach){ + ai.moveRad = d1; + } + + //stop mining/building + if(type == LUnitControl.stop){ + unit.mineTile = null; + unit.clearBuilding(); + } + } + case within -> { + exec.setnum(p4, unit.within(x1, y1, d1) ? 1 : 0); + } + case pathfind -> { + ai.control = type; + } + case target -> { + ai.posTarget.set(x1, y1); + ai.aimControl = type; + ai.mainTarget = null; + ai.shoot = exec.bool(p3); + } + case targetp -> { + ai.aimControl = type; + ai.mainTarget = exec.obj(p1) instanceof Teamc t ? t : null; + ai.shoot = exec.bool(p2); + } + case boost -> { + ai.boost = exec.bool(p1); + } + case flag -> { + unit.flag = exec.num(p1); + } + case mine -> { + Tile tile = world.tileWorld(x1, y1); + if(unit.canMine()){ + unit.mineTile = unit.validMine(tile) ? tile : null; + } + } + case payDrop -> { + if(ai.payTimer > 0) return; + + if(unit instanceof Payloadc pay && pay.hasPayload()){ + Call.payloadDropped(unit, unit.x, unit.y); + ai.payTimer = LogicAI.transferDelay; + } + } + case payTake -> { + if(ai.payTimer > 0) return; + + if(unit instanceof Payloadc pay){ + //units + if(exec.bool(p1)){ + Unit result = Units.closest(unit.team, unit.x, unit.y, unit.type.hitSize * 2f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); + + if(result != null){ + Call.pickedUnitPayload(unit, result); + } + }else{ //buildings + Building tile = world.buildWorld(unit.x, unit.y); + + //TODO copy pasted code + if(tile != null && tile.team == unit.team){ + if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ + Call.pickedBuildPayload(unit, tile, true); + }else{ //pick up block payload + Payload current = tile.getPayload(); + if(current != null && pay.canPickupPayload(current)){ + Call.pickedBuildPayload(unit, tile, false); + } + } + } + } + ai.payTimer = LogicAI.transferDelay; + } + } + case build -> { + if(state.rules.logicUnitBuild && unit.canBuild() && exec.obj(p3) instanceof Block block){ + int x = World.toTile(x1 - block.offset/tilesize), y = World.toTile(y1 - block.offset/tilesize); + int rot = exec.numi(p4); + + //reset state of last request when necessary + if(ai.plan.x != x || ai.plan.y != y || ai.plan.block != block || unit.plans.isEmpty()){ + ai.plan.progress = 0; + ai.plan.initialized = false; + ai.plan.stuck = false; + } + + var conf = exec.obj(p5); + ai.plan.set(x, y, rot, block); + ai.plan.config = conf instanceof Content c ? c : conf instanceof Building b ? b : null; + + unit.clearBuilding(); + Tile tile = ai.plan.tile(); + + if(tile != null && !(tile.block() == block && tile.build != null && tile.build.rotation == rot)){ + unit.updateBuilding = true; + unit.addBuild(ai.plan); + } + } + } + case getBlock -> { + float range = Math.max(unit.range(), buildingRange); + if(!unit.within(x1, y1, range)){ + exec.setobj(p3, null); + exec.setobj(p4, null); + }else{ + Tile tile = world.tileWorld(x1, y1); + //any environmental solid block is returned as StoneWall, aka "@solid" + Block block = tile == null ? null : !tile.synthetic() ? (tile.solid() ? Blocks.stoneWall : Blocks.air) : tile.block(); + exec.setobj(p3, block); + exec.setobj(p4, tile != null && tile.build != null ? tile.build : null); + } + } + case itemDrop -> { + if(ai.itemTimer > 0) return; + + Building build = exec.building(p1); + int dropped = Math.min(unit.stack.amount, exec.numi(p2)); + if(build != null && build.team == unit.team && build.isValid() && dropped > 0 && unit.within(build, logicItemTransferRange + build.block.size * tilesize/2f)){ + int accepted = build.acceptStack(unit.item(), dropped, unit); + if(accepted > 0){ + Call.transferItemTo(unit, unit.item(), accepted, unit.x, unit.y, build); + ai.itemTimer = LogicAI.transferDelay; + } + } + } + case itemTake -> { + if(ai.itemTimer > 0) return; + + Building build = exec.building(p1); + int amount = exec.numi(p3); + + if(build != null && build.team == unit.team && build.isValid() && build.items != null && + exec.obj(p2) instanceof Item item && unit.within(build, logicItemTransferRange + build.block.size * tilesize/2f)){ + int taken = Math.min(build.items.get(item), Math.min(amount, unit.maxAccepted(item))); + + if(taken > 0){ + Call.takeItems(build, item, taken, unit); + ai.itemTimer = LogicAI.transferDelay; + } + } + } + default -> {} + } + } + } + } + /** Controls a building's state. */ public static class ControlI implements LInstruction{ public int target; @@ -163,9 +540,12 @@ public class LExecutor{ @Override public void run(LExecutor exec){ Object obj = exec.obj(target); - if(obj instanceof Controllable){ - Controllable cont = (Controllable)obj; - cont.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id)){ + if(type.isObj && exec.var(p1).isobj){ //TODO may break logic? + b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + }else{ + b.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + } } } } @@ -206,8 +586,7 @@ public class LExecutor{ int address = exec.numi(position); Building from = exec.building(target); - if(from instanceof MemoryBuild){ - MemoryBuild mem = (MemoryBuild)from; + if(from instanceof MemoryBuild mem && from.team == exec.team){ exec.setnum(output, address < 0 || address >= mem.memory.length ? 0 : mem.memory[address]); } @@ -231,8 +610,7 @@ public class LExecutor{ int address = exec.numi(position); Building from = exec.building(target); - if(from instanceof MemoryBuild){ - MemoryBuild mem = (MemoryBuild)from; + if(from instanceof MemoryBuild mem && from.team == exec.team){ if(address >= 0 && address < mem.memory.length){ mem.memory[address] = exec.num(value); @@ -259,23 +637,28 @@ public class LExecutor{ Object target = exec.obj(from); Object sense = exec.obj(type); - if(target instanceof Senseable){ - Senseable se = (Senseable)target; - if(sense instanceof Content){ - exec.setnum(to, se.sense(((Content)sense))); - }else if(sense instanceof LAccess){ - Object objOut = se.senseObject((LAccess)sense); + if(target == null && sense == LAccess.dead){ + exec.setnum(to, 1); + return; + } + + //note that remote units/buildings can be sensed as well + if(target instanceof Senseable se){ + if(sense instanceof Content co){ + exec.setnum(to, se.sense(co)); + }else if(sense instanceof LAccess la){ + Object objOut = se.senseObject(la); if(objOut == Senseable.noSensed){ //numeric output - exec.setnum(to, se.sense((LAccess)sense)); + exec.setnum(to, se.sense(la)); }else{ //object output exec.setobj(to, objOut); } } }else{ - exec.setnum(to, 0); + exec.setobj(to, null); } } } @@ -308,16 +691,20 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - Building target = exec.building(radar); + Object base = exec.obj(radar); int sortDir = exec.bool(sortOrder) ? 1 : -1; + LogicAI ai = null; - if(target instanceof Ranged){ - float range = ((Ranged)target).range(); + if(base instanceof Ranged r && r.team() == exec.team && + (base instanceof Building || (ai = UnitControlI.checkLogicAI(exec, base)) != null)){ //must be a building or a controllable unit + float range = r.range(); Healthc targeted; - if(timer.get(30f)){ + //timers update on a fixed 30 tick interval + //units update on a special timer per controller instance + if((base instanceof Building && timer.get(30f)) || (ai != null && ai.checkTargetTimer(this))){ //if any of the targets involve enemies boolean enemies = target1 == RadarTarget.enemy || target2 == RadarTarget.enemy || target3 == RadarTarget.enemy; @@ -325,11 +712,14 @@ public class LExecutor{ bestValue = 0; if(enemies){ - for(Team enemy : state.teams.enemiesOf(target.team)){ - find(target, range, sortDir, enemy); + Seq data = state.teams.present; + for(int i = 0; i < data.size; i++){ + if(data.items[i].team != r.team()){ + find(r, range, sortDir, data.items[i].team); + } } }else{ - find(target, range, sortDir, target.team); + find(r, range, sortDir, r.team()); } lastTarget = targeted = best; @@ -343,14 +733,14 @@ public class LExecutor{ } } - void find(Building b, float range, int sortDir, Team team){ - Units.nearby(team, b.x, b.y, range, u -> { + void find(Ranged b, float range, int sortDir, Team team){ + Units.nearby(team, b.x(), b.y(), range, u -> { if(!u.within(b, range)) return; boolean valid = - target1.func.get(b.team, u) && - target2.func.get(b.team, u) && - target3.func.get(b.team, u); + target1.func.get(b.team(), u) && + target2.func.get(b.team(), u) && + target3.func.get(b.team(), u); if(!valid) return; @@ -375,8 +765,8 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - Var v = exec.vars[to]; - Var f = exec.vars[from]; + Var v = exec.var(to); + Var f = exec.var(from); //TODO error out when the from-value is a constant if(!v.constant){ @@ -384,7 +774,7 @@ public class LExecutor{ v.objval = f.objval; v.isobj = true; }else{ - v.numval = f.numval; + v.numval = invalid(f.numval) ? 0 : f.numval; v.isobj = false; } } @@ -406,14 +796,17 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - if(op.unary){ + if(op == LogicOp.strictEqual){ + Var v = exec.var(a), v2 = exec.var(b); + exec.setnum(dest, v.isobj == v2.isobj && ((v.isobj && v.objval == v2.objval) || (!v.isobj && v.numval == v2.numval)) ? 1 : 0); + }else if(op.unary){ exec.setnum(dest, op.function1.get(exec.num(a))); }else{ - Var va = exec.vars[a]; - Var vb = exec.vars[b]; + Var va = exec.var(a); + Var vb = exec.var(b); - if(op.objFunction2 != null && (va.isobj || vb.isobj)){ - //use object function if provided, and one of the variables is an object + if(op.objFunction2 != null && va.isobj && vb.isobj){ + //use object function if both are objects exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b))); }else{ //otherwise use the numeric function @@ -428,7 +821,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - exec.vars[varCounter].numval = exec.instructions.length; + exec.var(varCounter).numval = exec.instructions.length; } } @@ -461,11 +854,21 @@ public class LExecutor{ //graphics on headless servers are useless. if(Vars.headless) return; + int num1 = exec.numi(p1); + + if(type == LogicDisplay.commandImage){ + num1 = exec.obj(p1) instanceof UnlockableContent u ? u.iconId : 0; + } + //add graphics calls, cap graphics buffer size if(exec.graphicsBuffer.size < maxGraphicsBuffer){ - exec.graphicsBuffer.add(DisplayCmd.get(type, exec.numi(x), exec.numi(y), exec.numi(p1), exec.numi(p2), exec.numi(p3), exec.numi(p4))); + exec.graphicsBuffer.add(DisplayCmd.get(type, packSign(exec.numi(x)), packSign(exec.numi(y)), packSign(num1), packSign(exec.numi(p2)), packSign(exec.numi(p3)), packSign(exec.numi(p4)))); } } + + static int packSign(int value){ + return (Math.abs(value) & 0b0111111111) | (value < 0 ? 0b1000000000 : 0); + } } public static class DrawFlushI implements LInstruction{ @@ -483,9 +886,7 @@ public class LExecutor{ //graphics on headless servers are useless. if(Vars.headless) return; - Building build = exec.building(target); - if(build instanceof LogicDisplayBuild){ - LogicDisplayBuild d = (LogicDisplayBuild)build; + if(exec.building(target) instanceof LogicDisplayBuild d && d.team == exec.team){ if(d.commands.size + exec.graphicsBuffer.size < maxDisplayBuffer){ for(int i = 0; i < exec.graphicsBuffer.size; i++){ d.commands.addLast(exec.graphicsBuffer.items[i]); @@ -511,14 +912,16 @@ public class LExecutor{ if(exec.textBuffer.length() >= maxTextBuffer) return; //this should avoid any garbage allocation - Var v = exec.vars[value]; + Var v = exec.var(value); if(v.isobj && value != 0){ String strValue = v.objval == null ? "null" : - v.objval instanceof String ? (String)v.objval : + v.objval instanceof String s ? s : + v.objval == Blocks.stoneWall ? "solid" : //special alias + v.objval instanceof MappableContent content ? content.name : v.objval instanceof Content ? "[content]" : - v.objval instanceof Building ? "[building]" : - v.objval instanceof Unit ? "[unit]" : + v.objval instanceof Building build ? build.block.name : + v.objval instanceof Unit unit ? unit.type.name : "[object]"; exec.textBuffer.append(strValue); @@ -546,9 +949,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - Building build = exec.building(target); - if(build instanceof MessageBuild){ - MessageBuild d = (MessageBuild)build; + if(exec.building(target) instanceof MessageBuild d && d.team == exec.team){ d.message.setLength(0); d.message.append(exec.textBuffer, 0, Math.min(exec.textBuffer.length(), maxTextBuffer)); @@ -575,23 +976,57 @@ public class LExecutor{ @Override public void run(LExecutor exec){ if(address != -1){ - Var va = exec.vars[value]; - Var vb = exec.vars[compare]; + Var va = exec.var(value); + Var vb = exec.var(compare); boolean cmp; - if(op.objFunction != null && (va.isobj || vb.isobj)){ - //use object function if provided, and one of the variables is an object + if(op == ConditionOp.strictEqual){ + cmp = va.isobj == vb.isobj && ((va.isobj && va.objval == vb.objval) || (!va.isobj && va.numval == vb.numval)); + }else if(op.objFunction != null && va.isobj && vb.isobj){ + //use object function if both are objects cmp = op.objFunction.get(exec.obj(value), exec.obj(compare)); }else{ cmp = op.function.get(exec.num(value), exec.num(compare)); } if(cmp){ - exec.vars[varCounter].numval = address; + exec.var(varCounter).numval = address; } } } } + public static class WaitI implements LInstruction{ + public int value; + + public float curTime; + public double wait; + public long frameId; + + public WaitI(int value){ + this.value = value; + } + + public WaitI(){ + + } + + @Override + public void run(LExecutor exec){ + if(curTime >= exec.num(value)){ + curTime = 0f; + }else{ + //skip back to self. + exec.var(varCounter).numval --; + } + + if(Core.graphics.getFrameId() != frameId){ + curTime += Time.delta / 60f; + frameId = Core.graphics.getFrameId(); + } + } + } + + //endregion } diff --git a/core/src/mindustry/logic/LLocate.java b/core/src/mindustry/logic/LLocate.java new file mode 100644 index 0000000000..84da2321f9 --- /dev/null +++ b/core/src/mindustry/logic/LLocate.java @@ -0,0 +1,10 @@ +package mindustry.logic; + +public enum LLocate{ + ore, + building, + spawn, + damaged; + + public static final LLocate[] all = values(); +} diff --git a/core/src/mindustry/logic/LParser.java b/core/src/mindustry/logic/LParser.java new file mode 100644 index 0000000000..d6e8b40e62 --- /dev/null +++ b/core/src/mindustry/logic/LParser.java @@ -0,0 +1,200 @@ +package mindustry.logic; + +import arc.struct.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.logic.LStatements.*; + +public class LParser{ + private static final String[] tokens = new String[16]; + private static final int maxJumps = 500; + private static final StringMap opNameChanges = StringMap.of( + "atan2", "angle", + "dst", "len" + ); + + private static final Seq jumps = new Seq<>(); + private static final ObjectIntMap jumpLocations = new ObjectIntMap<>(); + + Seq statements = new Seq<>(); + char[] chars; + int pos, line, tok; + + LParser(String text){ + this.chars = text.toCharArray(); + } + + /** Parses a sequence of statements from a string. */ + public static Seq parse(String text){ + //don't waste time parsing null/empty text + if(text == null || text.isEmpty()) return new Seq<>(); + return new LParser(text).parse(); + } + + void comment(){ + //read until \n or eof + while(pos < chars.length && chars[pos++] != '\n'); + } + + void error(String message){ + throw new RuntimeException("Invalid code. " + message); + } + + String string(){ + int from = pos; + + while(++pos < chars.length){ + var c = chars[pos]; + if(c == '\n'){ + error("Missing closing quote \" before end of line."); + }else if(c == '"'){ + break; + } + } + + if(pos >= chars.length || chars[pos] != '"') error("Missing closing quote \" before end of file."); + + return new String(chars, from, ++pos - from); + } + + String token(){ + int from = pos; + + while(pos < chars.length){ + char c = chars[pos]; + if(c == '\n' || c == ' ' || c == '#' || c == '\t' || c == ';') break; + pos ++; + } + + return new String(chars, from, pos - from); + } + + /** Apply changes after reading a list of tokens. */ + void checkRead(){ + if(tokens[0].equals("op")){ + //legacy name change + tokens[1] = opNameChanges.get(tokens[1], tokens[1]); + } + } + + /** Reads the next statement until EOL/EOF. */ + void statement(){ + boolean expectNext = false; + tok = 0; + + while(pos < chars.length){ + char c = chars[pos]; + if(tok >= tokens.length) error("Line too long; may only contain " + tokens.length + " tokens"); + + //reached end of line, bail out. + if(c == '\n' || c == ';') break; + + if(expectNext && c != ' ' && c != '#' && c != '\t'){ + error("Expected space after string/token."); + } + + expectNext = false; + + if(c == '#'){ + comment(); + break; + }else if(c == '"'){ + tokens[tok ++] = string(); + expectNext = true; + }else if(c != ' ' && c != '\t'){ + tokens[tok ++] = token(); + expectNext = true; + }else{ + pos ++; + } + } + + //only process lines with at least 1 token + if(tok > 0){ + checkRead(); + + //store jump location, always ends with colon + if(tok == 1 && tokens[0].charAt(tokens[0].length() - 1) == ':'){ + if(jumpLocations.size >= maxJumps){ + error("Too many jump locations. Max jumps: " + maxJumps); + } + jumpLocations.put(tokens[0].substring(0, tokens[0].length() - 1), line); + }else{ + boolean wasJump; + String jumpLoc = null; + //clean up jump position before parsing + if(wasJump = (tokens[0].equals("jump") && tok > 1 && !Strings.canParseInt(tokens[1]))){ + jumpLoc = tokens[1]; + tokens[1] = "-1"; + } + + for(int i = 1; i < tok; i++){ + if(tokens[i].equals("@configure")) tokens[i] = "@config"; + if(tokens[i].equals("configure")) tokens[i] = "config"; + } + + LStatement st; + + try{ + st = LogicIO.read(tokens, tok); + }catch(Exception e){ + //log invalid statements + Log.err(e); + st = new InvalidStatement(); + } + + //store jumps that use labels + if(st instanceof JumpStatement jump && wasJump){ + jumps.add(new JumpIndex(jump, jumpLoc)); + } + + if(st != null){ + statements.add(st); + }else{ + //attempt parsing using custom parser if a match is found; this is for mods + if(LAssembler.customParsers.containsKey(tokens[0])){ + statements.add(LAssembler.customParsers.get(tokens[0]).get(tokens)); + }else{ + //unparseable statement + statements.add(new InvalidStatement()); + } + } + line ++; + } + } + } + + Seq parse(){ + jumps.clear(); + jumpLocations.clear(); + + while(pos < chars.length && line < LExecutor.maxInstructions){ + switch(chars[pos]){ + case '\n', ';', ' ' -> pos ++; //skip newlines and spaces + case '\r' -> pos += 2; //skip the newline after the \r + default -> statement(); + } + } + + //load destination indices + for(var i : jumps){ + if(!jumpLocations.containsKey(i.location)){ + error("Undefined jump location: \"" + i.location + "\". Make sure the jump label exists and is typed correctly."); + } + i.jump.destIndex = jumpLocations.get(i.location, -1); + } + + return statements; + } + + static class JumpIndex{ + JumpStatement jump; + String location; + + public JumpIndex(JumpStatement jump, String location){ + this.jump = jump; + this.location = location; + } + } + +} diff --git a/core/src/mindustry/logic/LStatement.java b/core/src/mindustry/logic/LStatement.java index cbe5029d94..29c9c14677 100644 --- a/core/src/mindustry/logic/LStatement.java +++ b/core/src/mindustry/logic/LStatement.java @@ -2,6 +2,7 @@ package mindustry.logic; import arc.*; import arc.func.*; +import arc.graphics.*; import arc.math.*; import arc.scene.*; import arc.scene.actions.*; @@ -9,12 +10,13 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.logic.LCanvas.*; import mindustry.logic.LExecutor.*; import mindustry.ui.*; +import static mindustry.logic.LCanvas.*; + /** * A statement is an intermediate representation of an instruction, to be used mostly in UI. * Contains all relevant variable information. */ @@ -22,7 +24,7 @@ public abstract class LStatement{ public transient @Nullable StatementElem elem; public abstract void build(Table table); - public abstract LCategory category(); + public abstract Color color(); public abstract LInstruction build(LAssembler builder); public LStatement copy(){ @@ -32,16 +34,64 @@ public abstract class LStatement{ return read.size == 0 ? null : read.first(); } - //protected methods are only for internal UI layout utilities - - protected Cell field(Table table, String value, Cons setter){ - return table.field(value, Styles.nodeField, setter) - .size(144f, 40f).pad(2f).color(table.color).addInputDialog(); + public boolean hidden(){ + return false; } - protected void fields(Table table, String desc, String value, Cons setter){ - table.add(desc).padLeft(10).left(); - field(table, value, setter).width(85f).padRight(10).left(); + //protected methods are only for internal UI layout utilities + + protected void param(Cell