diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 419e88052a..bd5e582e33 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -9,7 +9,7 @@ assignees: '' **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.* @@ -17,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, if applicable.* +**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.* -**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..e98615e268 --- /dev/null +++ b/.github/workflows/deployment.yml @@ -0,0 +1,63 @@ +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: Create artifacts + run: | + ./gradlew desktop:dist server:dist core:javadoc -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 + cp -a Mindustry/core/build/docs/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: 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: 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}" + 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 4b79df9a48..0000000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Java CI - -on: [push] - -jobs: - buildJava8: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up JDK 8 - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Run unit tests with gradle and Java 8 - run: ./gradlew compileJava - - 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 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000000..81cf1ff4e9 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,21 @@ +name: Pull Request Tests + +on: [pull_request] + +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..471b909106 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,6 +36,7 @@ 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 @@ -45,6 +47,12 @@ config/ /core/assets/basepartnames version.properties +#sprites + +core/assets/sprites/sprites* +core/assets/sprites/fallback/ +core/assets/sprites/block_colors.png + .attach_* ## Java @@ -143,13 +151,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 58eed0c4fd..64bd54bd56 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,33 +4,35 @@ This is for code contributions. For translations, see [TRANSLATING](TRANSLATING. ## Basic Guidelines -#### Use an IDE. +### Use an IDE. Specifically, IntelliJ IDEA. Download the (free) Community Edition of it [here](https://www.jetbrains.com/idea/download/). Some people use other tools, like VS Code, but I would personally not recommend them for Java development. -#### Always test your changes. +### Always test your changes. Do not submit something without at least running the game to see if it compiles. If you are submitting a new block, make sure it has a name and description, and that it works correctly in-game. If you are changing existing block mechanics, test them out first. - -#### Do not make large changes before discussing them first. +### Do not make large changes before discussing them first. If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*). For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it. ## Style Guidelines -#### Follow the formatting guidelines. +### Follow the formatting guidelines. This means: - No spaces around parentheses: `if(condition){`, `SomeType s = (SomeType)object` - Same-line braces. - 4 spaces indentation -- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more. +- `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 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. -#### Do not use incompatible Java features (java.util.function, java.awt). +### Do not use incompatible Java features (java.util.function, java.awt). Android and RoboVM (iOS) do not support many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code. If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes. @@ -39,7 +41,7 @@ The same applies to any class *outside* of the standard `java.[n]io` / `java.net In general, if you are using IntelliJ, you should be warned about platform incompatiblities. -#### Use `arc` collections and classes when possible. +### Use `arc` collections and classes when possible. Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Seq`, `ObjectMap` and other equivalents from `arc.struct`. Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them. In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`). @@ -52,21 +54,21 @@ What you'll usually need to change: - *Many others* -#### Avoid boxed types (Integer, Boolean) +### Avoid boxed types (Integer, Boolean) Never create variables or collections with boxed types `Seq` or `ObjectMap`. Use the collections specialized for this task, e.g. `IntSeq` and `IntMap`. -#### Do not allocate anything if possible. +### Do not allocate anything if possible. Never allocate `new` objects in the main loop. If you absolutely require new objects, use `Pools` to obtain and free object instances. Otherwise, use the `Tmp` variables for things like vector/shape operations, or create `static` variables for re-use. If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible. -#### Avoid bloated code and unnecessary getters/setters. +### Avoid bloated code and unnecessary getters/setters. This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things. If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks. -#### Do not create methods unless necessary. +### Do not create methods unless necessary. Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance. ## Other Notes 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 0c43316cb9..97aece9742 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) +[![Discord](https://img.shields.io/discord/391020510269669376.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord)](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,20 +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/) +| [![](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..83aa15a3d7 100644 --- a/SERVERLIST.md +++ b/SERVERLIST.md @@ -1,7 +1,7 @@ ### 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: @@ -16,7 +16,7 @@ You'll need to either hire some moderators, or make use of (currently non-existe 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. +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/build.gradle b/android/build.gradle index 59b698955a..cf60a2f945 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -35,7 +35,8 @@ dependencies{ natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}" //android dependencies magically disappear during compilation, thanks gradle! - if(new File(projectDir.parent, '../Arc').exists()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar']) + def sdkFile = new File((String)findSdkDir(), "/platforms/android-29/android.jar") + if(sdkFile.exists()) compileOnly files(sdkFile.absolutePath) } task deploy(type: Copy){ @@ -76,7 +77,7 @@ android{ targetSdkVersion 29 versionName versionNameResult - versionCode vcode + versionCode = (System.getenv("TRAVIS_BUILD_ID") != null ? System.getenv("TRAVIS_BUILD_ID").toInteger() : vcode) if(project.hasProperty("release")){ props['androidBuildCode'] = (vcode + 1).toString() @@ -98,15 +99,20 @@ android{ storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD + }else if(System.getenv("CI") == "true"){ + storeFile = file("../../bekeystore.jks") + storePassword = System.getenv("keystore_password") + keyAlias = System.getenv("keystore_alias") + keyPassword = System.getenv("keystore_alias_password") }else{ println("No keystore property found. Releases will be unsigned.") } } } - if(project.hasProperty("RELEASE_STORE_FILE")) { - buildTypes { - release { + if(project.hasProperty("RELEASE_STORE_FILE") || System.getenv("CI") == "true"){ + buildTypes{ + release{ signingConfig signingConfigs.release } } @@ -146,3 +152,9 @@ task run(type: Exec){ def adb = path + "/platform-tools/adb" commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher' } + +if(!project.ext.hasSprites()){ + println "Scheduling sprite pack." + run.dependsOn ":tools:pack" + deploy.dependsOn ":tools:pack" +} \ No newline at end of file diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java index e2c484e50d..5084cbc67d 100644 --- a/android/src/mindustry/android/AndroidLauncher.java +++ b/android/src/mindustry/android/AndroidLauncher.java @@ -7,7 +7,6 @@ import android.content.pm.*; import android.net.*; import android.os.Build.*; import android.os.*; -import android.provider.Settings.*; import android.telephony.*; import arc.*; import arc.backend.android.*; @@ -15,7 +14,7 @@ import arc.files.*; import arc.func.*; import arc.scene.ui.layout.*; import arc.util.*; -import arc.util.serialization.*; +import dalvik.system.*; import mindustry.*; import mindustry.game.Saves.*; import mindustry.io.*; @@ -23,13 +22,11 @@ import mindustry.net.*; import mindustry.ui.dialogs.*; import java.io.*; -import java.lang.System; import java.lang.Thread.*; import java.util.*; import static mindustry.Vars.*; - public class AndroidLauncher extends AndroidApplication{ public static final int PERMISSION_REQUEST_CODE = 1; boolean doubleScaleTablets = true; @@ -74,11 +71,24 @@ public class AndroidLauncher extends AndroidApplication{ } @Override - public void showFileChooser(boolean open, String extension, Cons cons){ + 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); + } + + @Override + public void showFileChooser(boolean open, String title, String extension, Cons cons){ + showFileChooser(open, title, cons, extension); + } + + void showFileChooser(boolean open, String title, Cons cons, String... extensions){ + String extension = extensions[0]; + if(VERSION.SDK_INT >= VERSION_CODES.Q){ Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(extension.equals("zip") && !open ? "application/zip" : "*/*"); + intent.setType(extension.equals("zip") && !open && extensions.length == 1 ? "application/zip" : "*/*"); + addResultListener(i -> startActivityForResult(intent, i), (code, in) -> { if(code == Activity.RESULT_OK && in != null && in.getData() != null){ Uri uri = in.getData(); @@ -108,7 +118,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 -> file.extension().equalsIgnoreCase(extension), 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{ @@ -125,10 +135,19 @@ public class AndroidLauncher extends AndroidApplication{ } requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE); }else{ - super.showFileChooser(open, extension, cons); + if(open){ + new FileChooser(title, file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show(); + }else{ + super.showFileChooser(open, "@open", extension, cons); + } } } + @Override + public void showMultiFileChooser(Cons cons, String... extensions){ + showFileChooser(true, "@open", cons, extensions); + } + @Override public void beginForceLandscape(){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); @@ -146,29 +165,33 @@ public class AndroidLauncher extends AndroidApplication{ }}); checkFiles(getIntent()); + try{ + //new external folder + Fi data = Core.files.absolute(getContext().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..."); - //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); + 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(); } - //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); } } 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..88bd457e05 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. */ diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index 710bef22ca..fd2c05dca2 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -115,12 +115,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 +137,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); } } @@ -204,10 +204,10 @@ public abstract class BaseProcessor extends AbstractProcessor{ 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; } } @@ -229,7 +229,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 231823ec9a..8eba0ec683 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -1,10 +1,8 @@ package mindustry.annotations.entity; -import arc.*; 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.*; @@ -78,9 +76,10 @@ public class EntityProcess extends BaseProcessor{ if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE)) continue; //get all statements in the method, store them methodBlocks.put(elem.descString(), elem.tree().getBody().toString() - //replace all self() invocations with this - .replaceAll("this\\.<(.*)>self\\(\\)", "this") - .replaceAll("self\\(\\)", "this") + .replaceAll("this\\.<(.*)>self\\(\\)", "this") //fix parameterized self() calls + .replaceAll("self\\(\\)", "this") //fix self() calls + .replaceAll(" yield ", "") //fix enchanced switch + .replaceAll("\\/\\*missing\\*\\/", "var") //fix vars ); } } @@ -241,7 +240,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 +273,10 @@ public class EntityProcess extends BaseProcessor{ name += "Entity"; } + if(ann.legacy()){ + name += "Legacy" + Strings.capitalize(type.name()); + } + //skip double classes if(usedNames.containsKey(name)){ extraNames.get(usedNames.get(name), ObjectSet::new).add(type.name()); @@ -379,7 +381,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()); @@ -520,7 +522,7 @@ public class EntityProcess extends BaseProcessor{ //add free code to remove methods - always at the end //this only gets called next frame. if(first.name().equals("remove") && ann.pooled()){ - mbuilder.addStatement("$T.app.post(() -> $T.free(this))", Core.class, Pools.class); + mbuilder.addStatement("mindustry.gen.Groups.queueFree(($T)this)", Poolable.class); } builder.addMethod(mbuilder.build()); @@ -587,6 +589,17 @@ public class EntityProcess extends BaseProcessor{ //write clear groupsBuilder.addMethod(groupClear.build()); + //add method for pool storage + groupsBuilder.addField(FieldSpec.builder(ParameterizedTypeName.get(Seq.class, Poolable.class), "freeQueue", Modifier.PRIVATE, Modifier.STATIC).initializer("new Seq<>()").build()); + + //method for freeing things + MethodSpec.Builder groupFreeQueue = MethodSpec.methodBuilder("queueFree") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addParameter(Poolable.class, "obj") + .addStatement("freeQueue.add(obj)"); + + groupsBuilder.addMethod(groupFreeQueue.build()); + //add method for resizing all necessary groups MethodSpec.Builder groupResize = MethodSpec.methodBuilder("resize") .addParameter(TypeName.FLOAT, "x").addParameter(TypeName.FLOAT, "y").addParameter(TypeName.FLOAT, "w").addParameter(TypeName.FLOAT, "h") @@ -595,6 +608,11 @@ public class EntityProcess extends BaseProcessor{ MethodSpec.Builder groupUpdate = MethodSpec.methodBuilder("update") .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + //free everything pooled at the start of each updaet + groupUpdate + .addStatement("for($T p : freeQueue) $T.free(p)", Poolable.class, Pools.class) + .addStatement("freeQueue.clear()"); + //method resize for(GroupDefinition group : groupDefs){ if(group.spatial){ diff --git a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java index 8e22e33db9..c38570a4d4 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"; + 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){ @@ -106,7 +122,6 @@ public class AssetsProcess extends BaseProcessor{ HashSet names = new HashSet<>(); Fi.get(path).walk(p -> { - String fname = p.name(); String name = p.nameWithoutExtension(); if(names.contains(name)){ @@ -115,23 +130,20 @@ 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")+"\""; - - loadBegin.addStatement("arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", 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")); 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()); diff --git a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java index eca5d84387..6e597bd002 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java @@ -43,9 +43,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 +53,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){ @@ -67,7 +68,7 @@ public class LogicStatementProcessor extends BaseProcessor{ int index = 0; for(Svar field : fields){ - if(field.is(Modifier.TRANSIENT)) continue; + if(field.isAny(Modifier.TRANSIENT, Modifier.STATIC)) continue; writer.addStatement("out.append(\" \")"); writer.addStatement("out.append((($T)obj).$L$L)", c.mirror(), field.name(), diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java index a8493d5643..3442843669 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java @@ -107,7 +107,7 @@ public class RemoteReadGenerator{ } 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.addStatement("throw new java.lang.RuntimeException(\"Failed to read remote method '" + entry.element.getSimpleName() + "'!\", e)"); readBlock.endControlFlow(); } 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/resources/classids.properties b/annotations/src/main/resources/classids.properties index 86ca440e1c..293373a9df 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,6 +17,8 @@ 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 @@ -24,6 +29,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/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/BuilderMinerUnit/0.json b/annotations/src/main/resources/revisions/BuilderMinerUnit/0.json deleted file mode 100644 index a4e818fd35..0000000000 --- a/annotations/src/main/resources/revisions/BuilderMinerUnit/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/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/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/MechUnit/0.json b/annotations/src/main/resources/revisions/MechUnit/0.json deleted file mode 100644 index 1779e118de..0000000000 --- a/annotations/src/main/resources/revisions/MechUnit/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/MechUnit/1.json b/annotations/src/main/resources/revisions/MechUnit/1.json deleted file mode 100644 index 66897ee06f..0000000000 --- a/annotations/src/main/resources/revisions/MechUnit/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/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/UnitEntity/0.json b/annotations/src/main/resources/revisions/UnitEntity/0.json deleted file mode 100644 index 5431957381..0000000000 --- a/annotations/src/main/resources/revisions/UnitEntity/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/UnitEntity/1.json b/annotations/src/main/resources/revisions/UnitEntity/1.json deleted file mode 100644 index dd8fdb2784..0000000000 --- a/annotations/src/main/resources/revisions/UnitEntity/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/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/BlockUnitUnit/0.json b/annotations/src/main/resources/revisions/block/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BlockUnitUnit/0.json rename to annotations/src/main/resources/revisions/block/0.json diff --git a/annotations/src/main/resources/revisions/BlockUnitUnit/1.json b/annotations/src/main/resources/revisions/block/1.json similarity index 100% rename from annotations/src/main/resources/revisions/BlockUnitUnit/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/CommanderLegsUnit/0.json b/annotations/src/main/resources/revisions/corvus/0.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderLegsUnit/0.json rename to annotations/src/main/resources/revisions/corvus/0.json diff --git a/annotations/src/main/resources/revisions/CommanderLegsUnit/1.json b/annotations/src/main/resources/revisions/corvus/1.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderLegsUnit/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/CommanderMechUnit/0.json b/annotations/src/main/resources/revisions/mace/0.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderMechUnit/0.json rename to annotations/src/main/resources/revisions/mace/0.json diff --git a/annotations/src/main/resources/revisions/CommanderMechUnit/1.json b/annotations/src/main/resources/revisions/mace/1.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderMechUnit/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/BuilderMinerTrailUnit/0.json b/annotations/src/main/resources/revisions/poly/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerTrailUnit/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/LegsUnit/0.json b/annotations/src/main/resources/revisions/risso/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LegsUnit/0.json rename to annotations/src/main/resources/revisions/risso/0.json diff --git a/annotations/src/main/resources/revisions/LegsUnit/1.json b/annotations/src/main/resources/revisions/risso/1.json similarity index 100% rename from annotations/src/main/resources/revisions/LegsUnit/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 7a9ebbbe7c..98744b1358 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript{ } 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" @@ -32,11 +32,11 @@ allprojects{ ext{ versionNumber = '6' - if(!project.hasProperty("versionModifier")) versionModifier = 'alpha' + if(!project.hasProperty("versionModifier")) versionModifier = 'release' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' - rhinoVersion = '8437435dab9993769d72739608580d40c5343285' + rhinoVersion = '2617981f706e50b8753155d8e15e326308be3b22' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } @@ -83,6 +83,10 @@ allprojects{ return "v$buildVersion" } + hasSprites = { + return new File(rootDir, "core/assets/sprites/sprites.atlas").exists() + } + getModifierString = { if(versionModifier != "release"){ return "[${versionModifier.toUpperCase()}]" @@ -99,6 +103,17 @@ 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("local.properties") + if(!file.exists()) file = new File("../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/') @@ -172,24 +187,48 @@ allprojects{ jcenter() } + task clearCache{ + doFirst{ + delete{ + delete "$rootDir/core/assets/cache" + } + } + } + tasks.withType(JavaCompile){ - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + targetCompatibility = 8 + sourceCompatibility = 14 options.encoding = "UTF-8" options.compilerArgs += ["-Xlint:deprecation"] + dependsOn clearCache } } -//compile with java 8 compatibility for everything except the annotati project +configure(project(":annotations")){ + tasks.withType(JavaCompile){ + targetCompatibility = 8 + sourceCompatibility = 8 + } +} + +//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']) + options.compilerArgs.addAll(['--release', '8', '--enable-preview']) + } + + doFirst{ + options.compilerArgs = options.compilerArgs.findAll{it != '--enable-preview' } } } tasks.withType(Javadoc){ - options.addStringOption('Xdoclint:none', '-quiet') + options{ + addStringOption('Xdoclint:none', '-quiet') + addBooleanOption('-enable-preview', true) + addStringOption('-release', '14') + } } } @@ -200,7 +239,6 @@ project(":desktop"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") implementation 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' @@ -219,18 +257,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) } @@ -239,7 +281,6 @@ project(":ios"){ implementation arcModule("natives:natives-ios") implementation arcModule("natives:natives-freetype-ios") - implementation arcModule("natives:natives-box2d-ios") implementation arcModule("backends:backend-robovm") compileOnly project(":annotations") @@ -249,6 +290,8 @@ project(":ios"){ project(":core"){ apply plugin: "java-library" + compileJava.options.fork = true + task preGen{ outputs.upToDateWhen{ false } generateLocales() @@ -262,9 +305,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){ @@ -282,7 +326,6 @@ project(":core"){ api "org.lz4:lz4-java:1.4.1" api arcModule("arc-core") api arcModule("extensions:freetype") - api arcModule("extensions:box2d") api arcModule("extensions:g3d") api arcModule("extensions:fx") api arcModule("extensions:arcnet") @@ -291,6 +334,8 @@ project(":core"){ compileOnly project(":annotations") annotationProcessor project(":annotations") + annotationProcessor 'com.github.Anuken:jabel:34e4c172e65b3928cd9eabe1993654ea79c409cd' + } } @@ -299,7 +344,6 @@ project(":server"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } @@ -312,7 +356,6 @@ project(":tests"){ testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1" testImplementation arcModule("backends:backend-headless") - testImplementation arcModule("natives:natives-box2d-desktop") testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1" } @@ -334,7 +377,6 @@ project(":tools"){ implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } @@ -345,7 +387,6 @@ 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") } } 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/core-silo.png b/core/assets-raw/sprites/blocks/campaign/core-silo.png deleted file mode 100644 index dbb0b6d70c..0000000000 Binary files a/core/assets-raw/sprites/blocks/campaign/core-silo.png and /dev/null 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 index ac04aef1c4..ac77dbe43c 100644 Binary files a/core/assets-raw/sprites/blocks/campaign/launch-pad-large.png and b/core/assets-raw/sprites/blocks/campaign/launch-pad-large.png differ diff --git a/core/assets-raw/sprites/blocks/defense/parallax.png b/core/assets-raw/sprites/blocks/defense/parallax.png index d9224ab066..2b6109e0b1 100644 Binary files a/core/assets-raw/sprites/blocks/defense/parallax.png and b/core/assets-raw/sprites/blocks/defense/parallax.png differ diff --git a/core/assets-raw/sprites/blocks/defense/segment.png b/core/assets-raw/sprites/blocks/defense/segment.png index 57bd53d61d..57da490c5f 100644 Binary files a/core/assets-raw/sprites/blocks/defense/segment.png and b/core/assets-raw/sprites/blocks/defense/segment.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png index 5a113d8e02..2995011050 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png index 0312349cc8..4e3d884d60 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png index 97ff507f6e..ca1ca5e98f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png index f0555606e1..b5afa99ceb 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png index caab53e98b..961cfc9290 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png index 26c760e325..3c2cb422da 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png index 652dff1730..d3e7cac664 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png index 8af227bd04..ba02b11f2f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png index a10e7d2c30..dde9319f48 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png index babb8c9d7b..c1c73953ac 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png index 31af8a221e..5401d769aa 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png index 4bd89f0199..feb39f4ab1 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png index 5a665f713b..868b0f4798 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png index a9647797fe..2d7f0902f6 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png index fc36ed94f0..a1d8c76dd9 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png index 6db61c006e..e707dd80d4 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png index aed4c7decb..c50b281985 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png index 213168b5ea..6dfe694ec0 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png index a69604d6fe..ef313ad576 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png index 6cd887f110..e5ccf27dbb 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png index 0eaf09d5a4..5041f028ed 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png index b19a7aaab7..3f5fbf0184 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png index 16b0938f9f..0f8b73714d 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png index 98d03b428e..89ad916de7 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png index f166ec32f7..fa082af1be 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png index 0694b091f6..fd22fd478c 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.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/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-wall1.png b/core/assets-raw/sprites/blocks/environment/dune-wall1.png index 923945dd74..64d13b3f24 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/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/liquid/liquid-tank-bottom.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png index a94e604467..4e33a6bfba 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png index 85533fef2f..961a9f82c7 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png index 255c710915..c1c36e33be 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.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/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/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/power/thorium-reactor-lights.png b/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.png index fb10892472..5af4b45d78 100644 Binary files a/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.png and b/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.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/production/cryofluidmixer-bottom.png b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-bottom.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/cryofluidmixer-bottom.png rename to core/assets-raw/sprites/blocks/production/cryofluid-mixer-bottom.png diff --git a/core/assets-raw/sprites/blocks/production/cryofluidmixer-liquid.png b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-liquid.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/cryofluidmixer-liquid.png rename to core/assets-raw/sprites/blocks/production/cryofluid-mixer-liquid.png diff --git a/core/assets-raw/sprites/blocks/production/cryofluid-mixer-top.png b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-top.png new file mode 100644 index 0000000000..3bb5abe3cb Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-top.png differ diff --git a/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png b/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png deleted file mode 100644 index e90db33565..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/phase-weaver.png b/core/assets-raw/sprites/blocks/production/phase-weaver.png index 4cbda78f1b..282d9bcd6a 100644 Binary files a/core/assets-raw/sprites/blocks/production/phase-weaver.png and b/core/assets-raw/sprites/blocks/production/phase-weaver.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/turrets/arc.png b/core/assets-raw/sprites/blocks/turrets/arc.png index f214c4aa0f..106963aa68 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/arc.png and b/core/assets-raw/sprites/blocks/turrets/arc.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/duo.png b/core/assets-raw/sprites/blocks/turrets/duo.png index c234ccb38c..147d78f16f 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/duo.png and b/core/assets-raw/sprites/blocks/turrets/duo.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/foreshadow-heat.png b/core/assets-raw/sprites/blocks/turrets/foreshadow-heat.png new file mode 100644 index 0000000000..e0902e17d4 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/foreshadow-heat.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/foreshadow.png b/core/assets-raw/sprites/blocks/turrets/foreshadow.png new file mode 100644 index 0000000000..5a27960a73 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/foreshadow.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/hail.png b/core/assets-raw/sprites/blocks/turrets/hail.png index 4333d6ef7e..10001df6ed 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/hail.png and b/core/assets-raw/sprites/blocks/turrets/hail.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/lancer.png b/core/assets-raw/sprites/blocks/turrets/lancer.png index d3bbc2d909..08f1ea9e30 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/lancer.png and b/core/assets-raw/sprites/blocks/turrets/lancer.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/salvo-panel-left.png b/core/assets-raw/sprites/blocks/turrets/salvo-panel-left.png deleted file mode 100644 index de0af2f724..0000000000 Binary files a/core/assets-raw/sprites/blocks/turrets/salvo-panel-left.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/turrets/salvo-panel-right.png b/core/assets-raw/sprites/blocks/turrets/salvo-panel-right.png deleted file mode 100644 index 462f082f2a..0000000000 Binary files a/core/assets-raw/sprites/blocks/turrets/salvo-panel-right.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/turrets/salvo.png b/core/assets-raw/sprites/blocks/turrets/salvo.png index 63db15cded..4904a913a5 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/salvo.png and b/core/assets-raw/sprites/blocks/turrets/salvo.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/scatter.png b/core/assets-raw/sprites/blocks/turrets/scatter.png index 82d01d22c2..f4f0d73954 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/scatter.png and b/core/assets-raw/sprites/blocks/turrets/scatter.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/scorch.png b/core/assets-raw/sprites/blocks/turrets/scorch.png index 54616726e5..abbd3b5188 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/scorch.png and b/core/assets-raw/sprites/blocks/turrets/scorch.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/tsunami-liquid.png b/core/assets-raw/sprites/blocks/turrets/tsunami-liquid.png new file mode 100644 index 0000000000..8c88e9a0be Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/tsunami-liquid.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/tsunami-top.png b/core/assets-raw/sprites/blocks/turrets/tsunami-top.png new file mode 100644 index 0000000000..fc3b172fd2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/tsunami-top.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/tsunami.png b/core/assets-raw/sprites/blocks/turrets/tsunami.png new file mode 100644 index 0000000000..b11d2c2307 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/tsunami.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/wave-top.png b/core/assets-raw/sprites/blocks/turrets/wave-top.png new file mode 100644 index 0000000000..66f9939101 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/wave-top.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/wave.png b/core/assets-raw/sprites/blocks/turrets/wave.png index e557fa43b2..58d5d46e55 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/wave.png and b/core/assets-raw/sprites/blocks/turrets/wave.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..ccb7fbc5a3 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/walls/copper-wall-large.png b/core/assets-raw/sprites/blocks/walls/copper-wall-large.png index dbc59dd808..00e890dabc 100644 Binary files a/core/assets-raw/sprites/blocks/walls/copper-wall-large.png and b/core/assets-raw/sprites/blocks/walls/copper-wall-large.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/surge-wall-large.png b/core/assets-raw/sprites/blocks/walls/surge-wall-large.png index 285cfb52e8..e0cc1b8b86 100644 Binary files a/core/assets-raw/sprites/blocks/walls/surge-wall-large.png and b/core/assets-raw/sprites/blocks/walls/surge-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/surge-wall.png b/core/assets-raw/sprites/blocks/walls/surge-wall.png index 786ea64867..8dd6798b02 100644 Binary files a/core/assets-raw/sprites/blocks/walls/surge-wall.png and b/core/assets-raw/sprites/blocks/walls/surge-wall.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png b/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png index 80564101f8..ef8f313f09 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png and b/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thorium-wall.png b/core/assets-raw/sprites/blocks/walls/thorium-wall.png index 4fb0aaf1da..deb9edeea0 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thorium-wall.png and b/core/assets-raw/sprites/blocks/walls/thorium-wall.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/blocks/walls/titanium-wall-large.png b/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png index 2bf8ad2aec..9242df7d20 100644 Binary files a/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png and b/core/assets-raw/sprites/blocks/walls/titanium-wall-large.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/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..3d802be63f 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..f6ddf438fc 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/ui/logo.png b/core/assets-raw/sprites/ui/logo.png index 0a1778c104..e064a8a450 100644 Binary files a/core/assets-raw/sprites/ui/logo.png and b/core/assets-raw/sprites/ui/logo.png differ diff --git a/core/assets-raw/sprites/units/beta.png b/core/assets-raw/sprites/units/beta.png index b1bca129e6..5bba30659e 100644 Binary files a/core/assets-raw/sprites/units/beta.png and b/core/assets-raw/sprites/units/beta.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/pulsar.png b/core/assets-raw/sprites/units/pulsar.png index eb49cd3751..af014df891 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/weapons/heal-shotgun-weapon.png b/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png index 5b85b778a7..a519b8e8c0 100644 Binary files a/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png and b/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.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/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œ-Œ[ƒ D�J¬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êG�k�…VNf ¿Jjª›ÒÐ8�PK¨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•®J�F ¬ÅÀ°“†"®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œM�kNì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;j�Qß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&Ã}T�GÕ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..b3475ff259 100644 --- a/core/assets/bloomshaders/alpha_bloom.frag +++ b/core/assets/bloomshaders/alpha_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/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 index ec09b4435a..ec2634ef3f 100644 --- a/core/assets/bloomshaders/maskedtreshold.frag +++ b/core/assets/bloomshaders/maskedtreshold.frag @@ -6,4 +6,4 @@ 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 f61af0dd4e..4e9923983b 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,11 @@ be.ignore = Ignore be.noupdates = No updates found. be.check = Check for updates +mod.featured.dialog.title = Mod Browser (WIP) +mods.browser.selected = Selected mod +mods.browser.add = Install +mods.github.open = View + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -57,6 +65,7 @@ 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. +stats = Stats stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -66,7 +75,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 +89,7 @@ joingame = Join Game customgame = Custom Game newgame = New Game none = +none.found = [lightgray] minimap = Minimap position = Position close = Close @@ -96,12 +106,11 @@ 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.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub. mods = Mods mods.none = [lightgray]No mods found! mods.guide = Modding Guide @@ -144,8 +153,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,6 +203,11 @@ 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} @@ -223,6 +241,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 +287,9 @@ cancel = Cancel openlink = Open Link copylink = Copy Link back = Back +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 @@ -284,13 +306,19 @@ cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume 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,6 +357,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 @@ -418,6 +447,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 +472,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 +489,9 @@ load = Load save = Save 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 = Restart your game for the language settings to take effect. settings = Settings tutorial = Tutorial tutorial.retake = Re-Take Tutorial @@ -472,34 +505,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} -resume = Resume Zone:\n[lightgray]{0} -bestwave = [lightgray]Best Wave: {0} -#TODO fix/remove this -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. +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 +boss.health = Guardian Health connectfail = [scarlet]Connection error:\n\n[accent]{0} error.unreachable = Server unreachable.\nIs the address spelled correctly? @@ -516,17 +538,46 @@ 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! -#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 @@ -538,10 +589,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. @@ -549,11 +600,16 @@ 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. settings.language = Language settings.data = Game Data @@ -569,60 +625,94 @@ 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 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.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.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.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 = 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 + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field +ability.movelightning = Movement Lightning bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -634,10 +724,10 @@ 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 @@ -645,19 +735,27 @@ 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 +bullet.sapping = [stat]sapping bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag +bullet.buildingdamage = [stat]{0}%[lightgray] building damage bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce +bullet.healpercent = [stat]{0}[lightgray]% healing 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 @@ -675,12 +773,14 @@ 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 @@ -688,9 +788,9 @@ setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = 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.animatedwater.name = Animated Surfaces setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.playerindicators.name = Player Indicators @@ -717,17 +817,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 @@ -743,7 +841,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 @@ -807,6 +907,8 @@ 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.chat.name = Chat keybind.player_list.name = Player List keybind.console.name = Console @@ -816,6 +918,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 @@ -858,17 +961,21 @@ 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 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.sector.name = Sectors + item.copper.name = Copper item.lead.name = Lead item.coal.name = Coal @@ -890,23 +997,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 @@ -945,8 +1035,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 @@ -992,6 +1084,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 @@ -1040,7 +1133,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 @@ -1048,13 +1140,12 @@ 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 block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -1082,10 +1173,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 @@ -1125,6 +1217,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 @@ -1142,6 +1235,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 @@ -1160,159 +1258,248 @@ 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.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 aircraft. +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.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. -block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. -block.separator.description = Separates slag into its mineral components. Outputs the cooled result. -block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. +block.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. Cannot be used next to other gates. +block.underflow-gate.description = Opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. Cannot be used next to other gates. +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. +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. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index daeeb0e525..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 = Навала спрэчка @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Залішнi шлюз block.silicon-smelter.name = Крэмнявы плавільны завод block.phase-weaver.name = Фазавы ткач block.pulverizer.name = Здрабняльнік -block.cryofluidmixer.name = Мешалка крыягеннай вадкасці +block.cryofluid-mixer.name = Мешалка крыягеннай вадкасці block.melter.name = Плавільня block.incinerator.name = Мусарасжыгатель block.spore-press.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 = Рэдкі звышлёгкі метал, шырока выкарыстоўваецца для транспарціроўкі вадкасцяў, бураў і авіяцыі. @@ -1199,7 +1229,7 @@ block.kiln.description = выплавляемым пясок і свінец ў block.plastanium-compressor.description = Вырабляе пластан з нафты ды тытана. block.phase-weaver.description = Сінтэзуе фазавую тканіна з радыеактыўнага торыя і пяску. Патрабуецца вялікая колькасць энергіі для працы. block.alloy-smelter.description = Аб'ядноўвае тытан, свінец, крэмній і медзь для вытворчасці кінэтычнага сплаву. -block.cryofluidmixer.description = змешваюцца ваду і дробны тытанавы парашок у криогеннную вадкасць. Неад'емная частка пры выкарыстання ториевого рэактара +block.cryofluid-mixer.description = змешваюцца ваду і дробны тытанавы парашок у криогеннную вадкасць. Неад'емная частка пры выкарыстання ториевого рэактара block.blast-mixer.description = расціскаюць і змешвае навалы спрэчка з пиротитом для атрымання выбуховага рэчыва. block.pyratite-mixer.description = Змешвае вугаль, свінец і пясок у гаручы піратыт block.melter.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_cs.properties b/core/assets/bundles/bundle_cs.properties index a946de85ed..58942b40e3 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,10 @@ servers.local = Místní servery servers.remote = Vzdálené servery servers.global = Komunitní servery +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 +231,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 +277,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 +291,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 +347,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 +357,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 +366,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 +436,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 +462,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 +479,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 +494,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 +521,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 +579,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 +613,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 +713,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 +721,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 +762,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 +776,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 +805,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 +852,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 +893,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 +908,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 +920,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 +945,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 +958,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 +977,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 +1000,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 +1013,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 +1068,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 +1115,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č @@ -1043,7 +1130,7 @@ block.underflow-gate.name = Brána s podtokem block.silicon-smelter.name = Křemíková huť block.phase-weaver.name = Tkalcovna pro fázovou tkaninu block.pulverizer.name = Rozmělňovač -block.cryofluidmixer.name = Míchačka na chladící kapalinu +block.cryofluid-mixer.name = Míchačka na chladící kapalinu block.melter.name = Tavírna block.incinerator.name = Spalovna block.spore-press.name = Lis na spóry @@ -1075,6 +1162,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 +1198,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 +1220,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 +1233,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 +1243,243 @@ 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. -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.cryofluidmixer.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 poškozené 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 3f94fbdd9f..71609c0d2d 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -55,6 +55,7 @@ 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]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Invasionsbølger nedslået:[accent] {0} stat.enemiesDestroyed = Fjender nedlagt:[accent] {0} @@ -100,7 +101,6 @@ 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 = Mods mods.none = [LIGHT_GRAY]Ingen mods fundet! 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]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 = [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 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 & 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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.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. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 2231d79456..571a1b6e53 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,11 @@ be.ignore = Ignorieren be.noupdates = Keine Aktualisierungen gefunden. be.check = Auf Aktualisierungen prüfen +mod.featured.dialog.title = Mod Browser (unfertig) +mods.browser.selected = Ausgewählter Mod +mods.browser.add = Installieren +mods.github.open = Ansehen + schematic = Entwurf schematic.add = Entwurf speichern... schematics = Entwürfe @@ -55,22 +63,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.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 +89,7 @@ joingame = Spiel beitreten customgame = Benutzerdefiniertes Spiel newgame = Neues Spiel none = +none.found = [lightgray] minimap = Minimap position = Position close = Schließen @@ -95,64 +106,67 @@ 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.alphainfo = Vergiss nicht, dass Mods in der Alpha sind und[scarlet] sehr fehlerhaft sein können[].\nMelde alle Probleme auf GitHub oder Discord. mods = Mods mods.none = [lightgray]Keine Mods gefunden! mods.guide = Modding-Anleitung mods.report = Problem melden mods.openfolder = Mod-Verzeichnis öffnen 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.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Aktiviert mod.disabled = [scarlet]Deaktiviert 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 +177,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 +185,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,9 +199,14 @@ 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} @@ -212,7 +231,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 +241,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 +287,61 @@ cancel = Abbruch openlink = Link öffnen copylink = Link kopieren back = Zurück +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 +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 +350,24 @@ 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 +376,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 +390,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. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 'v3.5/build 40'-Karte importieren möchtest, benutze den 'Importiere Terrainbild'-Knopf im Editor. 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 +403,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 +420,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 +440,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 +459,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 +468,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 +489,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 +499,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 +534,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 +589,33 @@ 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. 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 +623,111 @@ 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.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.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.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 + +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.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 +735,27 @@ 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.sapping = [stat]entzieht Lebenspunkte bullet.shock = [stat]schockend bullet.frag = [stat]explosiv +bullet.buildingdamage = [stat]{0}%[lightgray]Blockschaden bullet.knockback = [stat]{0}[lightgray] zurückstoßend +bullet.pierce = [stat]{0}[lightgray]x Durchstechkraft +bullet.infinitepierce = [stat]Durchstechkraft bullet.freezing = [stat]frierend +bullet.healpercent = [stat]{0}[lightgray]% Heilung bullet.tarred = [stat]teerend 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 +768,35 @@ 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.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.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 +812,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 +836,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 +898,27 @@ 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.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 +935,47 @@ mode.custom = Angepasste Regeln rules.infiniteresources = Unbegrenzte Ressourcen rules.reactorexplosions = Reaktor-Explosionen +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.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.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.sector.name = Sektoren + item.copper.name = Kupfer item.lead.name = Blei item.coal.name = Kohle @@ -879,23 +997,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 +1005,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 +1017,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 +1029,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 = Nachlade-Punkt 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 +1070,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 +1082,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 +1131,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,13 +1140,12 @@ 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 block.phase-weaver.name = Phasenweber block.pulverizer.name = Pulverisierer -block.cryofluidmixer.name = Kryoflüssigkeitsmixer +block.cryofluid-mixer.name = Kryoflüssigkeitsmixer block.melter.name = Schmelzer block.incinerator.name = Verbrennungsanlage block.spore-press.name = Sporenpresse @@ -1071,10 +1173,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 +1217,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 Gebäude 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.cryofluidmixer.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.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 = 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 +1351,155 @@ 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. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden. +block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden. +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 einzigen Schuss mit einem einzigen Ziel über eine erstaunlich große Distanz. 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. \ No newline at end of file diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 93d422040e..60e9538f1a 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 todo lo 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 = Exterminio -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 = Crecimiento excesivo +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. Baja amenaza enemiga. 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 Titán. 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,102 @@ 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.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.heatcapacity = Resistencia 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 = Zona de Escudo +ability.repairfield = Zona de Reparación +ability.statusfield = Zona de Estado +ability.unitspawn = {0} Fábrica de Drones +ability.shieldregenfield = 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 +723,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 +735,26 @@ bar.progress = Progreso de construcción bar.input = Entrada bar.output = Salida -bullet.damage = [stat]{0}[lightgray] daño +units.processorcontrol = [lightgray]Procesador Controlado + +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.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 +767,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 = Máximos FPS 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 elementos 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.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 +947,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 +982,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 +1027,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 +1105,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 @@ -1020,16 +1120,15 @@ block.thorium-wall.name = Pared 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,13 +1136,12 @@ 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 block.phase-weaver.name = Tejedor de Fase block.pulverizer.name = Pulverizador -block.cryofluidmixer.name = Mezclador de Criogénicos +block.cryofluid-mixer.name = Mezclador de Criogénicos block.melter.name = Fundidor block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporas @@ -1073,11 +1171,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 +1185,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,101 +1195,135 @@ 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 = Fundidor 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.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.orange.name = naranja +team.derelict.name = abandonado +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 bloque 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[] usan 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 de estructura. Usado en todo tipo de bloques. +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. @@ -1199,7 +1332,7 @@ block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades block.plastanium-compressor.description = Produce plastanio con aceite 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.cryofluidmixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. +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.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. @@ -1208,12 +1341,12 @@ block.spore-press.description = Comprime esporas en petróleo. block.pulverizer.description = Despedaza la piedra 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. @@ -1235,71 +1368,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.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.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo. block.thermal-generator.description = Genera una gran cantidad de energía con la lava. 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 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, repairing itself in the process. 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 = Recosntruye 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 0565a4920b..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Ränisulatusahi block.phase-weaver.name = Faaskangakuduja block.pulverizer.name = Metallijahvataja -block.cryofluidmixer.name = Krüosegisti +block.cryofluid-mixer.name = Krüosegisti block.melter.name = Metallisulataja block.incinerator.name = Tuhastusahi block.spore-press.name = Spooripress @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Sulatab liiva ja plii metaklaasiks. Väike energiatarve block.plastanium-compressor.description = Toodab naftast ja titaanist plastiumit. block.phase-weaver.description = Sünteesib faaskangast radioaktiivsest tooriumist ja liivast. Tohutu energiatarve. block.alloy-smelter.description = Kombineerib titaaniumi, plii, räni ja vase voogsulamiks. -block.cryofluidmixer.description = Toodab krüovedelikku, segades kokku vee ja peene titaanpulbri. Hädavajalik tooriumreaktori toimimiseks. +block.cryofluid-mixer.description = Toodab krüovedelikku, segades kokku vee ja peene titaanpulbri. Hädavajalik tooriumreaktori toimimiseks. block.blast-mixer.description = Purustab spoorikobaraid ja segab neid püratiidiga, et toota lõhkeainet. block.pyratite-mixer.description = Segab söe, plii ja liiva tuleohtlikuks püratiidiks. block.melter.description = Sulatab vanametalli räbuks, mida saab kas edasi töödelda või kasutada pritskahurites. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 1c77a1068c..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silizio galdategia block.phase-weaver.name = Fase ehulea block.pulverizer.name = Birringailua -block.cryofluidmixer.name = Krio-isurkari nahasgailua +block.cryofluid-mixer.name = Krio-isurkari nahasgailua block.melter.name = Urtzailea block.incinerator.name = Erraustegia block.spore-press.name = Espora prentsa @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Hondarra eta beruna galdatzen ditu metabeira izeneko ko block.plastanium-compressor.description = Plastanioa ekoizten du olioa eta titanioa erabiliz. block.phase-weaver.description = Fasezko ehuna sintetizatzen du torio erradioaktiboa eta hondarra erabiliz. Energia kopurua handia behar du jarduteko. block.alloy-smelter.description = Titanioa, beruna, silizioa eta kobrea konbinatzen ditu tirain aleazioa ekoizteko. -block.cryofluidmixer.description = Ura eta titanio hauts fina nahasten ditu krio-isurkia ekoizteko. Toriozko erreaktorea erabiltzeko ezinbestekoa. +block.cryofluid-mixer.description = Ura eta titanio hauts fina nahasten ditu krio-isurkia ekoizteko. Toriozko erreaktorea erabiltzeko ezinbestekoa. block.blast-mixer.description = Espora sortak eta piratita txikitu eta nahasten ditu lehergai konposatua ekoizteko. block.pyratite-mixer.description = Ikatza, beruna, eta hondarra nahasten ditu oso sukoia den piratita sortuz. block.melter.description = Metala zepara urtzen du, prozesatzen jarraitzeko edo olatu dorreetan erabiltzeko. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index a65555994c..9e516c89c9 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -21,7 +21,7 @@ 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,7 +42,7 @@ 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 @@ -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,7 +63,7 @@ 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.playtime = Pelattu aika:[accent] {0} stat.rank = Lopullinen arvosana: [accent]{0} globalitems = [accent]Global Items @@ -100,7 +101,6 @@ 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 @@ -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 @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Taso {0} +wave.cap = [accent]Wave {0}/{1} wave.waiting = [lightgray]Seuraava taso {0} wave.waveInProgress = [lightgray]Wave in progress waiting = [lightgray]Odotetaan... waiting.players = Odotetaan pelaajia... wave.enemies = [lightgray]{0} vihollista jäljellä wave.enemy = [lightgray]{0} vihollinen jäljellä +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Lataa kuva saveimage = Tallenna kuva unknown = Tuntematon @@ -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 @@ -416,6 +420,7 @@ 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 @@ -440,6 +445,7 @@ 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 @@ -471,15 +477,9 @@ 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 @@ -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 = 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 = 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 = 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.reload = [stat]{0}[lightgray]x ampumisnopeus unit.blocks = palikat +unit.blockssquared = blocks² unit.powersecond = energiayksikköä/sekunti unit.liquidsecond = nesteyksikköä/sekunti unit.itemssecond = esinettä/sekunti @@ -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)[] @@ -713,7 +753,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[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 @@ -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 @@ -879,23 +921,6 @@ 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} - unit.dagger.name = Tikari unit.mace.name = Mace unit.fortress.name = Linnoitus @@ -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 @@ -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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.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. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 27dea1e7c7..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.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. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 798e482994..79de4a4865 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -38,6 +38,12 @@ be.ignore = Ignorer be.noupdates = Aucune mise à jour trouvée. be.check = Vérifiez les mises à jour +mod.featured.title = Explorateur de mods +mod.featured.dialog.title = Explorateur de Mods +mods.browser.selected = Mod sélectionné +mods.browser.add = Installer le mod +mods.github.open = Ouvrir au Github + schematic = Schéma schematic.add = Sauvegarder le schéma... schematics = Schémas @@ -55,6 +61,7 @@ schematic.saved = Schéma sauvegardé. 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]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Vagues vaincues:[accent] {0} stat.enemiesDestroyed = Ennemis détruits:[accent] {0} @@ -100,7 +107,6 @@ done = Fait feature.unsupported = Votre appareil ne supporte pas cette fonctionnalité. mods.alphainfo = Gardez à l'esprit que les mods sont en alpha et[scarlet] peuvent être très buggés[].\nMerci de signaler les problèmes que vous rencontrez via le GitHub ou le Discord Mindustry. -mods.alpha = [accent](Alpha) mods = Mods mods.none = [lightgray]Aucun mod trouvé! mods.guide = Guide de Modding @@ -284,12 +290,15 @@ selectschematic = [accent][[{0}][] pour sélectionner et copier pausebuilding = [accent][[{0}][] pour mettre la construction en pause resumebuilding = [scarlet][[{0}][] pour reprendre la construction wave = [accent]Vague {0} +wave.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.enemy = [lightgray]{0} Ennemi restant +wave.guardianwarn = Gardien à l'approche dans [accent]{0}[] vagues. +wave.guardianwarn.one = Gardien à l'approche dans [accent]{0}[] vague. loadimage = Charger l'image saveimage = Sauvegarder l'image unknown = Inconnu @@ -328,6 +337,7 @@ 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 @@ -416,6 +426,7 @@ filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-desso filter.distort = Déformation filter.noise = Bruit filter.enemyspawn = Zone d'apparition enemi +filter.spawnpath = Path To Spawn filter.corespawn = Zone d'apparition du noyau filter.median = Médian filter.oremedian = Minerai Médian @@ -440,6 +451,7 @@ filter.option.amount = Quantité filter.option.block = Bloc filter.option.floor = Sol filter.option.flooronto = Sol en question +filter.option.target = Cible filter.option.wall = Mur filter.option.ore = Minerai filter.option.floor2 = Sol secondaire @@ -471,15 +483,9 @@ 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. +research.multiplayer = Only the host can research items. uncover = Découvrir configure = Modifier les ressources à emporter loadout = Loadout @@ -512,6 +518,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 +528,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 +572,10 @@ settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour 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.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]< Pause > clear = Effacer banned = [scarlet]Bannis @@ -570,49 +586,74 @@ info.title = Info error.title = [crimson]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 +lastaccessed = [lightgray]Last Accessed: {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.input = Entrée +stat.output = Sortie +stat.booster = Booster +stat.tiles = Pré-requis +stat.affinities = Affinités +stat.powercapacity = Capacité d'énergie +stat.powershot = É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 = Display Size +stat.liquidcapacity = Capacité liquide +stat.powerrange = Portée électrique +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Nombre maximal de connections +stat.poweruse = Énergie utilisée +stat.powerdamage = Dégâts d'énergie +stat.itemcapacity = Stockage +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Production d'énergie +stat.productiontime = Durée de production +stat.repairtime = Durée de réparation complète du Bloc +stat.speedincrease = Accélération +stat.range = Portée +stat.drilltier = Forable +stat.drillspeed = Vitesse de forage de base +stat.boosteffect = Effet du Boost +stat.maxunits = Unités actives max +stat.health = Santé +stat.buildtime = Durée de construction +stat.maxconsecutive = Max Consecutive +stat.buildcost = Coût de construction +stat.inaccuracy = Imprécision +stat.shots = Tirs +stat.reload = Tirs/Seconde +stat.ammo = Munitions +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 = Meilleure Foreuse Requise bar.noresources = Missing Resources @@ -624,6 +665,7 @@ bar.powerbalance = Énergie: {0}/s bar.powerstored = En stock: {0}/{1} bar.poweramount = Énergie: {0} bar.poweroutput = Énergie Produite: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Objets: {0} bar.capacity = Capacité: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +677,8 @@ bar.progress = Progression de la construction bar.input = Entrée bar.output = Sortie +units.processorcontrol = [lightgray]Processor Controlled + 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 @@ -642,12 +686,15 @@ bullet.homing = [stat]autoguidé bullet.shock = [stat]choc électrique bullet.frag = [stat]explosif bullet.knockback = [stat]{0}[lightgray] recul +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce bullet.freezing = [stat]gel bullet.tarred = [stat]goudronné bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions bullet.reload = [stat]{0}[lightgray]x vitesse de tir unit.blocks = blocs +unit.blockssquared = blocks² unit.powersecond = énergie/seconde unit.liquidsecond = unité de liquide/seconde unit.itemssecond = objets/seconde @@ -670,7 +717,7 @@ category.power = Énergie category.liquids = Liquides category.items = Objets category.crafting = Fabrication -category.shooting = Puissance de feu +category.function = Function category.optional = Améliorations optionnelles setting.landscape.name = Verrouiller en rotation paysage setting.shadows.name = Ombres @@ -679,7 +726,6 @@ 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.animatedshields.name = Boucliers Animés setting.antialias.name = Anticrénelage[lightgray] (redémarrage du jeu nécessaire)[] @@ -713,7 +759,6 @@ setting.fullscreen.name = Plein Écran setting.borderlesswindow.name = Fenêtre sans bords (Borderless)[lightgray] (peut nécessiter le redémarrage du jeu) setting.fps.name = Afficher FPS 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 @@ -822,6 +867,7 @@ mode.custom = Règles personnalisées rules.infiniteresources = Ressources infinies rules.reactorexplosions = Explosion des Réacteurs +rules.schematic = Schematics Allowed rules.wavetimer = Minuterie pour les vagues rules.waves = Vagues rules.attack = Mode « Attaque » @@ -847,6 +893,7 @@ rules.title.unit = Unités rules.title.experimental = Expérimental rules.title.environment = Environment rules.lighting = Éclairage +rules.enemyLights = Enemy Lights rules.fire = Fire rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Éclairage Ambiant @@ -858,6 +905,7 @@ 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 @@ -879,23 +927,6 @@ 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.fortress.name = Forteresse @@ -936,6 +967,7 @@ block.cliff.name = Falaise block.sand-boulder.name = Bloc de Sable block.grass.name = Herbe block.slag.name = Scories +block.space.name = Space block.salt.name = Sel block.salt-wall.name = Salt Wall block.pebbles.name = Cailloux @@ -981,6 +1013,7 @@ block.darksand-water.name = Eau avec fond de Sable Sombre block.char.name = Cendre block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Neige et Glace block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1043,7 +1076,7 @@ block.underflow-gate.name = Barrière de Refoulement block.silicon-smelter.name = Fonderie de Silicium block.phase-weaver.name = Tisseur à Phase block.pulverizer.name = Pulvérisateur -block.cryofluidmixer.name = Refroidisseur +block.cryofluid-mixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur block.spore-press.name = Presse à Spore @@ -1075,6 +1108,7 @@ block.power-source.name = Source d'Énergie block.unloader.name = Déchargeur block.vault.name = Coffre-Fort block.wave.name = Onde +block.tsunami.name = Tsunami block.swarmer.name = Nuée block.salvo.name = Salve block.ripple.name = Percussion @@ -1114,6 +1148,7 @@ block.arc.name = Arc block.rtg-generator.name = Générateur G.T.R. block.spectre.name = Spectre block.meltdown.name = Fusion +block.foreshadow.name = Foreshadow block.container.name = Conteneur block.launch-pad.name = Plateforme de Lancement block.launch-pad-large.name = Grande Plateforme de Lancement @@ -1139,6 +1174,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 = bleu team.crux.name = rouge @@ -1199,7 +1235,7 @@ block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Néc 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.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicium et de cuivre. -block.cryofluidmixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable lors de l'utilisation de réacteurs aux thoriums. +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 ». diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index f3d33f1028..8975031cb6 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -20,8 +20,8 @@ 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 +indev.popup = [accent]La v6[] est actuellement en [accent]alpha[].\n[lightgray]Cela signifie :[]\n[scarlet]- La campagne est totalement incomplète[]\n- Il manque du contenu\n - La plupart des [scarlet]IA d'unités[] ne fonctionne pas correctement\n- De nombreuses unités ne sont pas terminées\n- Tout ce que vous voyez est susceptible d'être modifié ou supprimé.\n\nMerci de rapporter les bugs/crash sur [accent]Github[]. +indev.notready = Cette partie du jeu n'est pas encore prête load.sound = Son load.map = Maps @@ -33,7 +33,7 @@ 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.updating = En train de mettre à jour... be.ignore = Ignorer be.noupdates = Aucune mise à jour n'as été trouvée. be.check = Chercher des mises à jour @@ -52,9 +52,10 @@ 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.delete.confirm = Ce Schéma sera définitivement supprimé. schematic.rename = Renommer Schéma schematic.info = {0}x{1}, {2} blocks +schematic.disabled = [scarlet] Schémas désactivés ![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]map[] ou ce [accent]serveur. stat.wave = Vagues vaincues:[accent] {0} stat.enemiesDestroyed = Ennemies détruits:[accent] {0} @@ -100,7 +101,6 @@ 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 @@ -284,12 +284,15 @@ selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Vague {0} +wave.cap = [accent]Wave {0}/{1} 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 +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Charger l'image saveimage = Sauvegarder l'image unknown = Inconnu @@ -328,6 +331,7 @@ editor.generation = Generation: editor.ingame = Modifier en jeu editor.publish.workshop = Publish On Workshop editor.newmap = Nouvelle carte +editor.center = Center workshop = Workshop waves.title = Vagues waves.remove = Retirer @@ -416,6 +420,7 @@ filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-desso filter.distort = Déformation filter.noise = Bruit 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 = Bloc filter.option.floor = Sol filter.option.flooronto = Sible au sol +filter.option.target = Target filter.option.wall = Mur filter.option.ore = Minerai filter.option.floor2 = Sol secondaire @@ -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 = 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. +research.multiplayer = Only the host can research items. uncover = Découvrir configure = Configurer le transfert des ressources. loadout = Loadout @@ -508,12 +508,13 @@ 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 +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.unexplored = [lightgray] Inexploré sectors.resources = Resources: sectors.production = Production: sectors.stored = Stored: @@ -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]Ressources du noyau insuffisantes + +planet.serpulo.name = Serpulo +planet.sun.name = Soleil sector.groundZero.name = Ground Zero sector.craters.name = The Craters @@ -546,8 +552,8 @@ 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 = Langage -settings.data = Game Data +settings.language = Langue +settings.data = Données du jeu settings.reset = Valeur par défaut. settings.rebind = Réatttribuer settings.resetKey = Reset @@ -560,6 +566,10 @@ settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\n[scarlet]Ceci 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 +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 = En pause clear = Clear banned = [scarlet]Banned @@ -570,49 +580,74 @@ 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 +lastaccessed = [lightgray]Last Accessed: {0} 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 + +stat.input = Ressource(s) requise(s) +stat.output = Ressource(s) produite(s) +stat.booster = Booster +stat.tiles = Required Tiles +stat.affinities = Affinities +stat.powercapacity = Capacité d'énergie +stat.powershot = Énergie/Tir +stat.damage = Damage +stat.targetsair = Cible les unités aériennes +stat.targetsground = Cible les unités terrestres +stat.itemsmoved = Vitesse de déplacement +stat.launchtime = Temps entre chaque lancement +stat.shootrange = Portée +stat.size = Taille +stat.displaysize = Display Size +stat.liquidcapacity = Capacité en liquide +stat.powerrange = Distance de transmission +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Max Connections +stat.poweruse = Énergie utilisée +stat.powerdamage = Énergie/Dégâts +stat.itemcapacity = Stockage +stat.memorycapacity = Memory Capacity +stat.basepowergeneration = Production d'énergie de base +stat.productiontime = Temps de production +stat.repairtime = Temps pour la réparation totale du bloc +stat.speedincrease = Augmentation de la vitesse +stat.range = Portée +stat.drilltier = Forable +stat.drillspeed = Vitesse de forage de base +stat.boosteffect = Effet boostant +stat.maxunits = Maximum d'unitée active +stat.health = Santé +stat.buildtime = Temps de construction +stat.maxconsecutive = Max Consecutive +stat.buildcost = Coût de construction +stat.inaccuracy = Précision +stat.shots = Tirs +stat.reload = Tirs/Seconde +stat.ammo = Munition +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 = Énergie: {0} bar.powerstored = Stored: {0}/{1} bar.poweramount = Énergie: {0} bar.poweroutput = Énergie en sortie: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Objets: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} @@ -635,6 +671,8 @@ bar.progress = Progression de la construction bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] dégats bullet.splashdamage = [stat]{0}[lightgray] dgt zone ~[stat] {1}[lightgray] tuiles bullet.incendiary = [stat]incendiaire @@ -642,12 +680,15 @@ bullet.homing = [stat]autoguidage bullet.shock = [stat]choc bullet.frag = [stat]frag bullet.knockback = [stat]{0}[lightgray]recul +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce 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.blockssquared = blocks² unit.powersecond = Énergie/seconde unit.liquidsecond = Liquides/seconde unit.itemssecond = Objets/seconde @@ -670,7 +711,7 @@ category.power = Énergie category.liquids = Liquides category.items = Objets category.crafting = Fabrication -category.shooting = Défense +category.function = Function category.optional = Améliorations facultatives setting.landscape.name = Verrouiller la rotation en mode paysage setting.shadows.name = Ombres @@ -679,7 +720,6 @@ 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)[] @@ -713,7 +753,6 @@ 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 @@ -822,6 +861,7 @@ mode.custom = Règles personnalisées rules.infiniteresources = Ressources infinies rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Temps de vague rules.waves = Vague rules.attack = Mode attaque @@ -847,6 +887,7 @@ rules.title.unit = Unités 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 = 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 @@ -879,30 +921,13 @@ 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.crawler.name = Rampeur unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid @@ -930,17 +955,18 @@ unit.reign.name = Reign 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 = Cliff +block.cliff.name = Falaise block.sand-boulder.name = Sable rocheux block.grass.name = Herbe -block.slag.name = Slag +block.slag.name = Scories +block.space.name = Space 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 sporifère block.spore-wall.name = Spore Wall block.boulder.name = Boulder @@ -957,11 +983,11 @@ 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.kiln.name = Four 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.spawn.name = Générateur d'ennemis block.core-shard.name = Core: Shard block.core-foundation.name = Core: Fondation block.core-nucleus.name = Core: Nucleus @@ -981,6 +1007,7 @@ block.darksand-water.name = Eau (sable noir) block.char.name = Carboniser block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Neige glacée block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1021,71 +1048,72 @@ 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.scorch.name = Brûleur +block.scatter.name = Disperseur +block.hail.name = Grêle +block.lancer.name = Lancier +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 = 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.junction.name = Jonction block.router.name = Routeur block.distributor.name = [accent]Distributeur[] block.sorter.name = Trieur -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Trieur inversé 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.underflow-gate.name = Barrière de Refoulement block.silicon-smelter.name = Fonderie de silicium block.phase-weaver.name = Tisseur à phase block.pulverizer.name = Pulvérisateur -block.cryofluidmixer.name = Refroidisseur +block.cryofluid-mixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur -block.spore-press.name = Spore presse +block.spore-press.name = Presse à spores 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.diode.name = Diode de batterie block.battery.name = Batterie -block.battery-large.name = Batterie large +block.battery-large.name = Grande batterie 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.pneumatic-drill.name = Foreuse à vérins 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.mechanical-pump.name = Pompe Mécanique 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.liquid-void.name = Vaporisateur 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.tsunami.name = Tsunami 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.ripple.name = Percussion +block.phase-conveyor.name = Convoyeur phasé +block.bridge-conveyor.name = Pont 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.oil-extractor.name = Extracteur de pétrole block.repair-point.name = Point de Réparation block.pulse-conduit.name = Conduit à Impulsion block.plated-conduit.name = Plated Conduit @@ -1114,6 +1142,7 @@ block.arc.name = Arc block.rtg-generator.name = G.T.R. block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Conteneur block.launch-pad.name = Rampe de lancement block.launch-pad-large.name = Grande rampe de lancement @@ -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 = Bleu team.crux.name = red @@ -1199,7 +1229,7 @@ block.kiln.description = Fait fondre le sable et le plomb en métaverre. Nécess 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.cryofluidmixer.description = L'eau et le titane combinés forment un fluide cryo beaucoup plus efficace pour le refroidissement. +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. @@ -1244,7 +1274,7 @@ block.inverted-sorter.description = Processes items like a standard sorter, but 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.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 = 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. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 76522053f7..200f3e1530 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1,9 +1,10 @@ -credits.text = Készítette [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +#Fordította: Vajda Simon +credits.text = Created by [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 @@ -13,30 +14,38 @@ 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 egyett? 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érte a kampány végét! []\n\nEz a tartalom mostanáig terjedt. 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 épület áll rendelkezésre: +be.update.confirm = Letölti és újra indítja? 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 = Mellőzés +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 schematic = Schematic schematic.add = Schematic mentése... @@ -55,68 +64,69 @@ 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]Sémák letiltva[]\nNem használhat sematikákat ezen a [accent]mapon[] vagy [accent] szerveren. -stat.wave = Hullámok kivédve:[accent] {0} -stat.enemiesDestroyed = Ellenségek kivédve:[accent] {0} +stats = Statisztika +stat.wave = Hullámok kivádve:[accent] {0} +stat.enemiesDestroyed = Kivédett 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.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 item +map.delete = Biztosan törli ezt a mapot"[accent]{0}[]"? +level.highscore = Magas pontszám: [accent]{0} +level.select = Szint kiválasztása level.mode = Játékmód: -coreattack = < A mag támadás alatt van! > +coreattack = < A mag támadás alatt! > nearpoint = [[ [scarlet]AZONNAL HAGYD EL A LEDOBÁSI PONTOT[] ]\nveszélyes zóna 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 = Custom Game newgame = Új játék none = -minimap = Minitérkép +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álasszon 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 benne 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ítsa ú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-al (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. @@ -125,31 +135,35 @@ 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ön meg arról, hogy ezt a modot megbízható forrásból importálja! 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.scripts.disable = Az eszköz nem támogatja a szkriptekkel rendelkező modokat. \nA játékhoz le kell tiltania 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 +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é [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 -players = {0} játékos +research.progress = {0}% kész +players = {0} játékosok players.single = {0} játékos players.search = keresés players.notfound = [gray]nincsen játékos @@ -171,11 +185,11 @@ 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. +host.info = Az [accent]host[] gomb kiszolgálót üzemeltet a [scarlet]6567[] porton.\nAzon a [lightgray] wifin vagy a helyi hálózaton [] bárki láthatja a szervert a szerverlistáján.\n\nHa azt szeretné, hogy az emberek bárhonnan IP-címmel csatlakozhassanak, [accent] port-továbbítás []\n\n[lightgray] Megjegyzés: Ha valakinek problémái vannak a LAN-játékhoz való csatlakozással, győződjön meg arról, hogy a tűzfal beállításaiban engedélyezte-e a Mindustry hozzáférését a helyi hálózathoz. Ne feledje, hogy a nyilvános hálózatok néha nem teszik lehetővé a kiszolgálók felderítését. +join.info = Itt megadhat egy [accent]szerver IP-t[] a csatlakozáshoz, vagy felfedezheti a [accent]helyi hálózat[] vagy [accent]globális[] szervereket, amelyekhez csatlakozni szeretne.\nMindkét LAN és WAN multiplayer támogatott.\n\n[lightgray]Ha IP-vel akarsz csatlakozni valakihez, akkor meg kell kérdezned a gazdagéptől az IP-jét, amely megtalálható a "my ip" Google kereséssel. hostserver = Másik játékos meghívása invitefriends = Barátok meghívása -hostserver.mobile = JátékosMeghívása +hostserver.mobile = Játékos meghívása host = meghívás hosting = [accent]Szerver megnyitása... hosts.refresh = Frissítés @@ -189,6 +203,11 @@ servers.local = Lokális 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 nem 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} @@ -222,6 +241,7 @@ disconnect.timeout = Időtúllépés. disconnect.data = Nem sikerült betölteni az adatokat! cantconnect = Nem sikerült csatlakozni ehhez: ([accent]{0}[]). connecting = [accent]Csatlakozás... +reconnecting = [accent]Újra csatlakozás... connecting.data = [accent]Betöltés... server.port = Port: server.addressinuse = Már van ilyen cím! @@ -267,6 +287,9 @@ cancel = Mégse openlink = Link megnyitása copylink = Link másolása back = Vissza +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 @@ -276,43 +299,49 @@ data.import.confirm = Külső adat importálása felülírja[scarlet] minden[] j 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 -wave = [accent]{0}. hullám -wave.waiting = [lightgray]Következő hullám: {0} -wave.waveInProgress = [lightgray]Wave in progress +reloading = [accent]Modok Újratöltése... +saving = [accent]Mentés... +respawn = Nyomd meg a [accent][[{0}][] gombot, hogy újra élegy 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.\nNyomja meg a(z) [accent][[{0}][] gombot a megjelenítéséhez. +wave = [accent]Hullám {0} +wave.cap = [accent]Hullám {0}/{1} +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! +waiting.players = Várakozás a játékosokra... +wave.enemies = [lightgray]Fennmaradó ellenségek: {0} +wave.enemycores = [accent]{0}[lightgray] Ellenséges magok +wave.enemycore = [accent]{0}[lightgray] Ellenséges mag +wave.enemy = [lightgray]{0} Magmaradt ellenség +wave.guardianwarn = Az őrző [accent]{0}[] hullám múlva érkezik. +wave.guardianwarn.one = Az őrző [accent]{0}[] hullám múlva érkezik. +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örli ezt a mapot? Ez a művelet nem visszavonható! 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): +map.nospawn = Ez a map nem rendelkezik maggal, amelybe a játékos beleszülethet! Adjon hozzá egy [accent]narancssárga[] magot ehhez a maphoz a szerkesztőben. +map.nospawn.pvp = Ezen a térképen nincsen ellenséges mag, amiba az másik csapat éledhet! Adjon hozzá [scarlet]nem narancssárga[] magok 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 a map betöltésekor: sérült vagy érvénytelen mapfájl. +workshop.update = Item frisítése +workshop.error = Hiba történt a műhely részleteinek lekérésekor: {0} +map.publish.confirm = Biztos, hogy közzéteszi ezt a mapot?\n\n[lightgray] Győződjön meg róla, hogy először elfogadta a Workshop EULA-t, különben a mapok nem jelennek meg! +workshop.menu = Válassza ki, mit szeretne csinálni ezzel az itemmel. +workshop.info = Item Infó +changelog = Changelog (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 műhely adatait automatikusan leválasztották. +publishing = [accent]Publikálás... +publish.confirm = Biztosan közzéteszi ezt?\n\n[lightgray] Győződjön meg róla, hogy először elfogadta a Workshop EULA-t, különben az itemei 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 @@ -328,6 +357,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 @@ -346,6 +376,7 @@ 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. +#these are intentionally in lower case wavemode.counts = counts wavemode.totals = totals wavemode.health = health @@ -380,20 +411,20 @@ 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 = Import Image File 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.exportimage.description = Export an image file containing only basic terrain editor.loadimage = Import Terrain editor.saveimage = Export Terrain -editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? +editor.unsaved = Are you sure you want to exit?\n[scarlet]Any unsaved changes will be lost. 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.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?\n"[accent]{0}[]" editor.exists = A map with this name already exists. editor.selectmap = Select a map to load: @@ -416,6 +447,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 +472,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 @@ -450,78 +483,101 @@ filter.option.percentile = Percentile 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ítsa ú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 +tutorial = Tutorial +tutorial.retake = Re-Take Tutorial 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 +abandon = Abandon +abandon.text = This zone and all its resources will be lost to the enemy. +locked = Lezárva 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} -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. +launch.text = Indítás +research.multiplayer = Only the host can research items. +map.multiplayer = Only the host can view sectors. uncover = Uncover configure = Configure Loadout + loadout = Loadout -resources = Resources +resources = Resources bannedblocks = Banned Blocks -addall = Add All +addall = Összes hozzáadása +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 +boss.health = Guardian Health -connectfail = [crimson]Connection error:\n\n[accent]{0} +connectfail = [scarlet]Csatlakozási hiba:\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.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.fog.name = Fog sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: sectors.production = Production: +sectors.export = Export: +sectors.time = Idő: +sectors.threat = Threat: +sectors.wave = Hullámok: sectors.stored = Stored: -sectors.resume = Resume +sectors.resume = Folytatás sectors.launch = Launch -sectors.select = Select +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]Vulnerable +sectors.underattack = [scarlet]Under attack! [accent]{0}% damaged +sectors.survives = [accent]Survives {0} waves +sectors.go = Go +sector.curcapture = Sector Captured +sector.curlost = Elvesztett szektor +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! +threat.low = Gyenge +threat.medium = Közepes +threat.high = Nehéz +threat.extreme = Extrém +threat.eradication = Felszámolás + +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 @@ -533,6 +589,10 @@ 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. @@ -540,79 +600,119 @@ 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. -settings.language = Language -settings.data = Game Data -settings.reset = Reset to Defaults +settings.language = Nyelvek +settings.data = Játék adatok +settings.reset = Visszaállítás az alapértelmezett értékekre 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 +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örli ezeket az adatokat?\n A végrehajtottakat nem lehet visszavonni! +settings.clearall.confirm = [scarlet] FIGYELEM! []\n Ez törli az összes adatot, beleértve a mentéseket, a térképeket, a feloldásokat és a billentyűzárakat.\n Amint megnyomja az 'OK' gombot, a játék minden adatot töröl és automatikusan kilép. +settings.clearsaves.confirm = Biztosan törli az összes mentést? +settings.clearsaves = Mentések törlése +settings.clearresearch = Kutatások törlése +settings.clearresearch.confirm = Biztosan törli az összes kutatást? +settings.clearcampaignsaves = Kampány mentések törlése +settings.clearcampaignsaves.confirm = Biztosan törli 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 + +stat.description = Célja +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.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.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 = 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 + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field +ability.movelightning = Movement Lightning bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -624,10 +724,10 @@ 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 @@ -635,19 +735,27 @@ 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 +bullet.sapping = [stat]sapping bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag +bullet.buildingdamage = [stat]{0}%[lightgray] building damage bullet.knockback = [stat]{0}[lightgray] knockback +bullet.pierce = [stat]{0}[lightgray]x pierce +bullet.infinitepierce = [stat]pierce +bullet.healpercent = [stat]{0}[lightgray]% healing 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 @@ -665,40 +773,42 @@ 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.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.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 = Az erőforrás áramlási sebességének megjelenítése +setting.backgroundpause.name = Szünet 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] (újra kell indítani)[] setting.playerindicators.name = Player Indicators -setting.indicators.name = Enemy/Ally Indicators +setting.indicators.name = Enemy Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls 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] (restart required)[] 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.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 = Screen Shake setting.effects.name = Display Effects setting.destroyedblocks.name = Display Destroyed Blocks @@ -707,17 +817,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] (may require restart) +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 @@ -733,7 +841,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 @@ -797,6 +907,8 @@ 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.chat.name = Chat keybind.player_list.name = Player List keybind.console.name = Console @@ -806,22 +918,24 @@ 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 -mode.survival.name = Túlélő +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 = Homokozó +mode.sandbox.name = Sandbox mode.sandbox.description = Infinite resources and no timer for waves. mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. -mode.attack.name = Támadás +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 rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -847,17 +961,21 @@ 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 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.sector.name = Sectors + item.copper.name = Copper item.lead.name = Lead item.coal.name = Coal @@ -879,23 +997,6 @@ liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid -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} - unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -934,8 +1035,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 +1084,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 +1133,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,13 +1140,12 @@ 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 block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -1071,10 +1173,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 +1217,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 +1230,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,6 +1248,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 @@ -1148,158 +1258,248 @@ 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.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 aircraft. +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.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. -block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. -block.separator.description = Separates slag into its mineral components. Outputs the cooled result. -block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. +block.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. -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. Cannot be used next to other gates. +block.underflow-gate.description = Opposite of an overflow gate. Outputs to the front if the left and right paths are blocked. Cannot be used next to other gates. +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 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.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. +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. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 4131d7def0..7c82ca930e 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -13,31 +13,40 @@ link.google-play.description = Google Play Store link.f-droid.description = Daftar katalog F-Droid link.wiki.description = Wiki Mindustry resmi link.suggestions.description = Saran fitur baru +link.bug.description = Menemukan bug? Laporkan di sini linkfail = Gagal membuka tautan!\nURL disalin ke papan ke papan klip. screenshot = Tangkapan layar disimpan di {0} screenshot.invalid = Peta terlalu besar, tidak cukup memori untuk menangkap layar. gameover = Permainan Habis +gameover.disconnect = Terputus gameover.pvp = Tim[accent] {0}[] menang! +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 +mod.featured.title = Browser mod +mod.featured.dialog.title = Browser Mod +mods.browser.selected = Mod yang Dipilih +mods.browser.add = Unduh Mod +mods.github.open = Buka di GitHub + schematic = Skema schematic.add = Menyimpan skema... schematics = Kumpulan skema @@ -52,10 +61,12 @@ 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.delete.confirm = Skema ini akan benar-benar dihapus. schematic.rename = Ganti nama Skema schematic.info = {0}x{1}, {2} blok +schematic.disabled = [scarlet]Skema dilarang[]\nAnda tidak diperbolehkan untuk menggunakan skema 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 +76,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]Item Global map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? level.highscore = Nilai Tertinggi: [accent]{0} level.select = Pilih Level @@ -85,7 +96,7 @@ 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! @@ -100,22 +111,21 @@ 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 = Mod mods.none = [lightgray]Tidak ada mod yang ditemukan! mods.guide = Panduan Modding mods.report = Lapor Kesalahan mods.openfolder = Buka Folder Mod -mods.reload = mengulangi -mods.reloadexit = game akan keluar, untuk mengulang mod. +mods.reload = Muat Ulang +mods.reloadexit = Game akan keluar, untuk mengulang mod. mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Aktif mod.disabled = [scarlet]Nonaktif mod.disable = Aktif -mod.content = konten: +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.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. @@ -125,40 +135,44 @@ mod.enable = Aktif 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. @@ -189,6 +203,11 @@ 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} @@ -197,7 +216,7 @@ trace.mobile = Client Mobile: [accent]{0} trace.modclient = Client Modifikasi: [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 +240,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 +282,14 @@ 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 +crash.export = Export Crash Logs +crash.none = No crash logs found. +crash.exported = Crash logs exported. data.export = Ekspor Data data.import = Impor Data data.openfolder = Buka Folder Data @@ -283,13 +306,19 @@ cancelbuilding = [accent][[{0}][] untuk menghapus rencana selectschematic = [accent][[{0}][] untuk memilih+salin pausebuilding = [accent][[{0}][] untuk berhenti membangun resumebuilding = [scarlet][[{0}][] untuk lanjut 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 @@ -328,6 +357,7 @@ 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 @@ -335,9 +365,9 @@ 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 +376,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,9 +388,9 @@ 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. Jangan merubah ekstensi dan megharapkan akan berhasil.\n\nJika anda ingin mengimpor peta "Legacy", gunakan tombol 'Impor Peta Legacy ' di penyunting. 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. @@ -415,8 +446,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 +468,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 +484,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 +504,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 item. +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,46 +534,85 @@ 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 = Ekstrem +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 = Impact 0078 +sector.groundZero.name = Titik Nol +sector.craters.name = Kawah +sector.frozenForest.name = Hutan Yang 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 Tar +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 +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. settings.language = Bahasa -settings.data = Game Data +settings.data = Data Game settings.reset = Atur ulang ke Default (standar) settings.rebind = Ganti tombol settings.resetKey = Atur ulang @@ -558,65 +623,100 @@ 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 = Afinitas +stat.powercapacity = Kapasitas Tenaga +stat.powershot = Tenaga/Tembakan +stat.damage = Kerusakan +stat.targetsair = Menargetkan Udara +stat.targetsground = Menargetkan 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 Item +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 = Maks Unit Aktif +stat.health = Darah +stat.buildtime = Waktu Pembuatan +stat.maxconsecutive = Maks 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.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 + +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}% @@ -624,10 +724,10 @@ bar.powerbalance = Tenaga: {0}/s bar.powerstored = Disimpan: {0}/{1} bar.poweramount = Tenaga: {0} bar.poweroutput = Pengeluaran Tenaga: {0} +bar.powerlines = Sambungan: {0}/{1} bar.items = Item: {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,19 +735,27 @@ 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.sapping = [stat]sapping bullet.homing = [stat]mengejar bullet.shock = [stat]mengkejut bullet.frag = [stat]menyebar +bullet.buildingdamage = [stat]{0}%[lightgray] kerusakan bangunan bullet.knockback = [stat]{0}[lightgray] pantulan kembali +bullet.pierce = [stat]{0}[lightgray]x tembus +bullet.infinitepierce = [stat]menembus +bullet.healpercent = [stat]{0}[lightgray]% menyembuhkan bullet.freezing = [stat]membeku bullet.tarred = [stat]tar bullet.multiplier = [stat]{0}[lightgray]x multiplikasi amunisi bullet.reload = [stat]{0}[lightgray]x rasio menembak unit.blocks = blok +unit.blockssquared = blok² unit.powersecond = unit tenaga/detik unit.liquidsecond = unit zat cair/detik unit.itemssecond = item/detik @@ -655,35 +763,37 @@ 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.shieldhealth = darah perisai unit.items = item -unit.thousands = ribu -unit.millions = juta -unit.billions = b +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.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.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.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 @@ -702,25 +812,23 @@ 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 Item 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 +841,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.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,20 +898,22 @@ 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 = Muat Kargo +keybind.dropCargo.name = Turunkan Kargo +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.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 @@ -817,18 +929,19 @@ mode.editor.name = Sunting mode.pvp.name = PvP mode.pvp.description = Melawan pemain lain. Membutuhkan setidaknya 2 inti berbeda warna didalam 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.schematic = Skema Diperbolehkan rules.wavetimer = Pengaturan Waktu Gelombang rules.waves = Gelombang rules.attack = Mode Penyerangan -rules.buildai = AI Building +rules.buildai = Bangunan A.I. rules.enemyCheat = Sumber Daya A.I Musuh (Tim Merah) Tak Terbatas rules.blockhealthmultiplier = Multiplikasi Darah Blok -rules.blockdamagemultiplier = Block Damage Multiplier +rules.blockdamagemultiplier = Multiplikasi Kekuatan Blok rules.unitbuildspeedmultiplier = Multiplikasi Kecepatan Munculnya Unit rules.unithealthmultiplier = Multiplikasi Darah Unit rules.unitdamagemultiplier = Multiplikasi Kekuatan Unit @@ -836,28 +949,32 @@ rules.enemycorebuildradius = Dilarang Membangun Radius Inti Musuh :[lightgray] ( rules.wavespacing = Jarak Gelombang:[lightgray] (detik) rules.buildcostmultiplier = Multiplikasi Harga Bangunan rules.buildspeedmultiplier = Multiplikasi Waktu Pembuatan Bangunan -rules.deconstructrefundmultiplier = Penggembalian Dana Mendekonstraksi Blok +rules.deconstructrefundmultiplier = Penggembalian Bahan Mendekonstruksi Blok 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.liquid.name = Zat Cair content.unit.name = Unit content.block.name = Blok +content.sector.name = Sektor + item.copper.name = Tembaga item.lead.name = Timah item.coal.name = Batu Bara @@ -873,28 +990,11 @@ 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} +liquid.cryofluid.name = Cairan Pendingin unit.dagger.name = Dagger unit.mace.name = Mace @@ -930,32 +1030,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 @@ -979,17 +1081,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 +1108,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,28 +1124,26 @@ 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.pulverizer.name = Penghancur block.cryofluidmixer.name = Penyampur Cairan Dingin block.melter.name = Pencair block.incinerator.name = Penghangus @@ -1074,18 +1175,19 @@ 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.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 @@ -1099,102 +1201,135 @@ 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 mentransfer item, tarik item 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]checkmark[] di bawah kanan untuk menkonfirmasi pembangunan. +hint.placeConveyor = Pengantar dapat memindahkan item 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 item 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]Turret[] 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][[Klik 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 berefek pada mereka[].\n\nGunakan turret yang lebih bagus atau gunakan 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.copper.details = Tembaga. Logam yang sangat melimpah di Serpulo. Lemah secara struktural kecuali jika diperkuat. item.lead.description = Bahan dasar di awal permainan. Digunakan di elektronik dan blok transportasi zat cair. +item.lead.details = Padat. Lembam. Biasanya digunakan dalam baterai.\nCatatan : Kemungkinan beracun untuk kehidupan biologis. Bukan berarti tidak banyak disini. 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.sand.description = Digunakan sebagai produksi untuk material yang akan dimurnikan. +item.coal.description = Digunakan sebagai bahan bakar dan memurnikan material. +item.coal.details = Hasil dari tumbuhan yang menjadi fosil, sudah terjadi sangat lama sebelum spora-spora menyebar. +item.titanium.description = Digunakan di transportasi zat cair, bor dan pesawat terbang. +item.thorium.description = Digunakan dalam struktur tahan lama dan sebagai bahan bakar nuklir. +item.scrap.description = Dilebur dan dimurnikan menjadi material lain. +item.scrap.details = Sisa sisa bangunan dan unit tua. +item.silicon.description = Digunakan di 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 = Senyawa yang digunakan sebagai bom dan amunisi peledak. +item.pyratite.description = Digunakan di senjata pembakar dan generator yang membutuhkan bahan mudah terbakar. +liquid.water.description = Umumnya digunakan untuk mendinginkan bor dan turret. +liquid.slag.description = Berbagai campuran tipe logam yang meleleh. Dapat dipisahkan menjadi mineral masing-masing, 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, turret, dan pabrik. + +block.resupply-point.description = Mengisi ulang amunisi unit terdekat dengan tembaga. Jika tidak bisa berarti unit tersebut membutuhkan baterai. +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.illuminator.description = Sebuah lampu kecil untuk menerangi daerah sekitar. Perlu listrik untuk bekerja. 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.multi-press.description = Versi pemadat grafit yang lebih bagus. Membutuhkan air sebagai pendingin. +block.silicon-smelter.description = Melebur pasir dengan batu bara untuk memproduksi silikon. block.kiln.description = Membakar pasir dan timah menjadi kaca meta. Membutuhkan tenaga. block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium. block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. @@ -1202,8 +1337,8 @@ block.alloy-smelter.description = Memproduksi campuran logam dari titanium, tima block.cryofluidmixer.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.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.coal-centrifuge.description = Memadatkan minyak menjadi bongkahan batu bara. @@ -1229,19 +1364,20 @@ block.surge-wall-large.description = Blok pelindung terkuat.\nMempunyai kemungki 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.mend-projector.description = Versi mender yang lebih besar. Menyembuhkan blok di sekelilingnya secara berkala.\nDapat menggunakan phase 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.plastanium-conveyor.description = Memindahkan barang secara bertumpuk.\nMenerima barang dari belakang, dan membaginya ke tiga arah di depan.\nMembutuhkan beberapa titik pemuat dan pembongkar untuk hasil yang maksimal. 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.router.details = Bisa sangat menggangu. Jangan meletakannya disamping input produksi, karena bisa tersumbat oleh output. 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. @@ -1266,40 +1402,102 @@ block.battery-large.description = Menyimpan lebih banyak tenaga daripada baterai 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.differential-generator.description = Menghasilkan tenaga dalam jumlah banyak. 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.description = Menghasilkan tenaga dalam jumlah kecil dari sinar 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.impact-reactor.description = Sebuah generator yang lebih maju, dapat menghasilkan tenaga dengan jumlah yang sangat banyak. Memerlukan tenaga untuk menyalakan reaktor terlebih dahulu. block.mechanical-drill.description = Bor murah. Saat ditaruh ditempat yang sesuai, mengeluarkan item 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.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.cultivator.description = Menumbuhkan konsentrasi spora yang kecil di atmosfer menjadi polong spora. +block.cultivator.details = Teknologi yang dipulihkan. Digunakan untuk memproduksi biomassa secara efesien. Kemungkinan merupakan inkubator awal dari spora yang sekarang menutupi Serpulo. 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.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 = Versi kedua dari inti. Lebih kuat. Menyimpan banyak sumber daya. +block.core-foundation.details = Iterasi kedua. +block.core-nucleus.description = Versi ketiga dan pengulangan terakhir dari kapsul inti. Sangat kuat. Menyimpan sangat banyak sumber daya. +block.core-nucleus.details = Iterasi ketiga dan yang terakhir. 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.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 = Menembak petir 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 = Menembak 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 = Menembak baut besar jarak jauh yang hanya menembak satu target. block.repair-point.description = Terus menerus memulihkan unit terluka disekitar. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. +block.segment.description = Merusakkan dan menghancurkan proyektil yang datang. Proyektil laser tidak akan ditargetkan. +block.parallax.description = Menembak laser yang menarik target udara, juga merusaknya selama dalam proses. +block.tsunami.description = Menembak 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 = Menambah kecepatan kepada bangunan disekitarnya. Membutuhkan 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. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bacb61ebdd..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.cryofluidmixer.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.cryofluidmixer.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 c5d498b872..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,13 +1140,12 @@ 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.pulverizer.name = 粉砕機 -block.cryofluidmixer.name = 冷却ミキサー +block.cryofluid-mixer.name = 冷却ミキサー block.melter.name = 融合機 block.incinerator.name = 焼却炉 block.spore-press.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 = 黒鉛圧縮機のアップグレード版です。水と電力を使用して、より効率的に石炭を圧縮します。 @@ -1199,7 +1336,7 @@ block.kiln.description = 砂と鉛を溶かしてメタガラスを生成しま block.plastanium-compressor.description = オイルとチタンからプラスタニウムを製造します。 block.phase-weaver.description = 放射性トリウムと多量の砂からフェーズファイバーを製造します。 block.alloy-smelter.description = チタンや鉛、シリコン、銅からサージ合金を製造します。 -block.cryofluidmixer.description = 水とチタンから冷却に効率的な冷却水を製造します。 +block.cryofluid-mixer.description = 水とチタンから冷却に効率的な冷却水を製造します。 block.blast-mixer.description = 可燃性のピラタイトを石油を使用してさらに爆発性化合物にします。 block.pyratite-mixer.description = 石炭、鉛、砂から燃えやすいピラタイトを製造します。 block.melter.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 f0b2e73317..6bba05f072 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1,49 +1,57 @@ 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.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 +copied = 복사 +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 = 업데이트 확인 +mod.featured.dialog.title = 모드 탐색 (WIP) +mods.browser.selected = 선택된 모드 +mods.browser.add = 모드 설치 +mods.github.open = 깃허브 사이트 열기 + schematic = 설계도 schematic.add = 설계도 저장하기 schematics = 설계도들 schematic.replace = 해당 이름의 설계도가 이미 존재합니다. 교체하시겠습니까? schematic.exists = 해당 이름의 설계도가 이미 존재합니다. -schematic.import = 설계도 가져오기... +schematic.import = 설계도 가져오기 schematic.exportfile = 파일 내보내기 schematic.importfile = 파일 가져오기 schematic.browseworkshop = 창작마당 검색 @@ -55,8 +63,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 +75,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,16 +102,15 @@ 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.alphainfo = 현재 모드는 정식 출시 버전이 아니며, [scarlet]오류가 많을 수 있습니다[].\n발견한 문제는 Mindustry Github 또는 Discord에 보고하세요. mods = 모드 mods.none = [lightgray]모드를 찾을 수 없습니다! mods.guide = 모드 제작 가이드 @@ -115,12 +125,12 @@ 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]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]재시작 필요 @@ -131,25 +141,29 @@ 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[lighthray]모드들:\n{0} +mod.preview.missing = 창작마당에 모드를 올리기 전에 미리 보기 이미지를 추가해야 합니다.\n[accent]preview.png[] 라는 이름의 미리 보기 이미지를 모드 폴더에 넣고 다시 시도하세요. +mod.folder.missing = 창작마당에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 모드 파일을 모드 폴더에 압축을 풀고 이전 모드 파일을 삭제 후, 게임을 재시작하거나 모드를 다시 불러오십시오. mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하지 않습니다. 게임을 플레이하려면 이 모드를 비활성화해야 합니다. about.button = 정보 -name = 이름: -noname = 먼저 [accent]플레이어 이름[]을 설정하세요. -planetmap = Planet Map -launchcore = Launch Core -filename = 파일 이름: +name = 닉네임 : +noname = 먼저 [accent]닉네임[]을 설정하세요. +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,42 +171,47 @@ 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.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.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} invalidid = 잘못된 클라이언트 ID입니다! 버그 보고서를 보내주세요. @@ -207,12 +226,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 +240,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 +263,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 +287,38 @@ cancel = 취소 openlink = 링크 열기 copylink = 링크 복사 back = 뒤로가기 +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}][] 를 눌러 계획 초기화 +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]웨이브 진행중 +pausebuilding = [accent][[{0}][] 를 눌러 건설을 일시중지 +resumebuilding = [scarlet][[{0}][] 를 눌러 건설을 재개 +showui = [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 +326,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 +335,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에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다! +publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EULA에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다! publish.error = 아이템 게시 오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} @@ -322,33 +351,35 @@ 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.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 = 설명 @@ -363,7 +394,7 @@ editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n3.5/build 40 editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원되지 않는 구형 맵 형식을 사용합니다. editor.errornot = 맵 파일이 아닙니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. -editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려 합니까? +editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요? editor.update = 업데이트 editor.randomize = 무작위 editor.apply = 적용 @@ -404,19 +435,20 @@ 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.corespawn = 코어 선택 +filter.enemyspawn = 적 소환지점 제한 +filter.spawnpath = 자동생성된 적 이동경로 폭 +filter.corespawn = 코어 1개 제한 filter.median = 중앙값 filter.oremedian = 자원 중앙값 filter.blend = 블렌드 @@ -428,24 +460,25 @@ 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.threshold2 = 2번째 경계선 filter.option.radius = 반경 -filter.option.percentile = 백분위수 +filter.option.percentile = 백분율 width = 넓이: height = 높이: @@ -456,76 +489,99 @@ 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 = 튜토리얼 다시 시작 +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당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. -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] 지역을 점령했습니다! -sector.groundZero.name = 전초기지 +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 = Zero 전초기지 sector.craters.name = 크레이터 sector.frozenForest.name = 얼어붙은 숲 -sector.ruinousShores.name = 폐허 +sector.ruinousShores.name = 파괴된 해안가 sector.stainedMountains.name = 얼룩진 산맥 sector.desolateRift.name = 황폐한 협곡 sector.nuclearComplex.name = 핵 생산 단지 @@ -533,90 +589,134 @@ 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.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.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] 건투를 빕니다.[] settings.language = 언어 settings.data = 게임 데이터 settings.reset = 설정 초기화 -settings.rebind = 키 설정 -settings.resetKey = 키 초기화 +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 = 아니오 +yes = O +no = X info.title = 정보 error.title = [scarlet]오류가 발생했습니다. -error.crashtitle = 오류가 발생했습니다 -unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다. -blocks.input = 입력 -blocks.output = 출력 -blocks.booster = 가속 -blocks.tiles = 필요한 타일 -blocks.affinities = 친화력 +error.crashtitle = 오류가 발생했습니다. +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 = 최대 체인 길이 +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.corereq = 코어 필요 bar.drillspeed = 드릴 속도: {0}/s bar.pumpspeed = 펌프 속도: {0}/s bar.efficiency = 효율: {0}% @@ -624,10 +724,10 @@ 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 = 전력 @@ -635,19 +735,27 @@ 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.sapping = [stat]흡혈 bullet.homing = [stat]유도 bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[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.freezing = [stat]빙결 bullet.tarred = [stat]타르 -bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 -bullet.reload = [stat]{0}[lightgray]x 발사 속도 +bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수 +bullet.reload = [stat]{0}[lightgray]배 발사 속도 unit.blocks = 블록 +unit.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 = 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.function = 기능 category.optional = 보조 자원 setting.landscape.name = 가로화면 잠금 setting.shadows.name = 그림자 @@ -678,13 +788,13 @@ setting.blockreplace.name = 자동 블록 제안 setting.linear.name = 선형 필터링 setting.hints.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.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 +804,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.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}ms 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 = 미니맵 표시 @@ -730,16 +838,18 @@ setting.savecreate.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 = 멀티플레이어 @@ -747,20 +857,20 @@ category.blocks.name = 블록 선택 command.attack = 공격 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.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,26 +918,28 @@ keybind.toggle_menus.name = 메뉴 보이기/숨기기 keybind.chat_history_prev.name = 이전 채팅 기록 keybind.chat_history_next.name = 다음 채팅 기록 keybind.chat_scroll.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.schematic = 설계도 허용 +rules.wavetimer = 시간 제한이 있는 단계 +rules.waves = 일반 단계 rules.attack = 공격 모드 -rules.buildai = AI Building +rules.buildai = AI 건설 rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.blockhealthmultiplier = 블록 체력 배수 rules.blockdamagemultiplier = 블록 공격력 배수 @@ -833,31 +947,35 @@ rules.unitbuildspeedmultiplier = 유닛 생산 속도 배수 rules.unithealthmultiplier = 유닛 체력 배수 rules.unitdamagemultiplier = 유닛 공격력 배수 rules.enemycorebuildradius = 적 코어 건설 금지구역 범위:[lightgray] (타일) -rules.wavespacing = 웨이브 간격:[lightgray] (초) +rules.wavespacing = 단계 간격:[lightgray] (초) rules.buildcostmultiplier = 건설 자원소모 배수 rules.buildspeedmultiplier = 건설 속도 배수 rules.deconstructrefundmultiplier = 해체 환불 배수 -rules.waitForWaveToEnd = 웨이브가 끝날때까지 대기중 +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.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 = 석탄 @@ -868,7 +986,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 +994,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 +1007,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 +1016,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.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 +1052,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 +1064,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 +1072,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 +1082,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 +1095,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 +1133,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,27 +1140,26 @@ 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.pulverizer.name = 분쇄기 -block.cryofluidmixer.name = 냉각수 제조기 +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 +1177,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 +1202,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 +1212,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,65 +1258,92 @@ 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.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. +item.spore-pod.details = 포자. 유기적인 생명체로 판단된다. 타 유기체에 치명적인 독가스를 내뿜는다. 침입성이 매우 강하다. 특정 조건에서 강력한 인화성을 보입니다. item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. -item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질. -liquid.water.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.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.cryofluidmixer.description = 물과 미세 티타늄 분말을 냉각수로 혼합합니다. 토륨 원자로 사용에 필수적입니다. -block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분쇄하고 혼합하여 폭발물을 만듭니다. -block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. -block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다. -block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다. -block.spore-press.description = 포자 버섯을 극압으로 압축하여 기름을 합성합니다. -block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다. -block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다. +block.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 = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. @@ -1214,54 +1351,55 @@ 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.mender.description = 주변의 블록을 주기적으로 수리합니다. 각 단계 사이의 방어를 유지하게 합니다.\n선택적으로 실리콘을 사용하여 범위와 효율성을 향상합니다. +block.mend-projector.description = 소형 수리 프로젝터의 강화 버전. 주변의 블록을 수리합니다.\n선택적으로 메타를 사용하여 범위와 효율성을 향상합니다. block.overdrive-projector.description = 주변 건물의 속도를 높입니다.\n선택적으로 메타를 사용하여 범위와 효율성을 높입니다. -block.force-projector.description = 건물과 내부의 유닛을 공격으로부터 보호하며, 그 주위에 육각형 역장을 형성합니다.\n너무 많은 손상이 지속되면 과열되며, 선택적으로 냉각수를 사용하여 과열을 방지할 수 있고, 메타는 역장의 크기를 늘리는 데 사용할 수 있습니다. -block.shock-mine.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.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.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.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다. @@ -1273,33 +1411,95 @@ 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.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.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 = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index ca4ffed5ba..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Neperpildymo Užtvara block.silicon-smelter.name = Silicio Lydykla block.phase-weaver.name = Fazinė Audykla block.pulverizer.name = Pulverizatorius -block.cryofluidmixer.name = Krio Skysčio Maišytojas +block.cryofluid-mixer.name = Krio Skysčio Maišytojas block.melter.name = Lydytuvas block.incinerator.name = Deginimo krosnis block.spore-press.name = Sporų Presas @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Sulydo smėlį ir stiklą į junginį žinomą kaip met block.plastanium-compressor.description = Gamina plastaniumą iš naftos ir titano. block.phase-weaver.description = Susintetina fazinį audinį iš radioaktyvaus torio ir smėlio. Veikimui reikalingas didžiulis kiekis energijos. block.alloy-smelter.description = Sumaišo titaną, šviną, silicį ir varį į viršįtampį lydinį. -block.cryofluidmixer.description = Maišo vandenį ir smulkias titano dulkes į krio skystį. Būtinas torio reaktoriaus naudojimui. +block.cryofluid-mixer.description = Maišo vandenį ir smulkias titano dulkes į krio skystį. Būtinas torio reaktoriaus naudojimui. block.blast-mixer.description = Susmulkina ir sumaišo sporas su piratitu ir pagamina sprogųjį junginį. block.pyratite-mixer.description = Sumaišo anglį, šviną ir smėlį į itin degų piratitą. block.melter.description = Išlydo metalo laužą į šlaką tolesniam apdorojimui arba naudojimui wave bokštuose. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 55b1b765f0..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,13 +1064,13 @@ 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 block.phase-weaver.name = Phase Weaver block.pulverizer.name = Vermorzelaar -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Smelter block.incinerator.name = Verbrandingsoven block.spore-press.name = Schimmelpers @@ -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. @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into metaglass. Requires small amo block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.cryofluid-mixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in turrets. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index e7c574de34..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into metaglass. Requires small amo block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.cryofluid-mixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in turrets. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 8ed68e8273..aa26f651db 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.f-droid.description = Wykaz Katalogu F-Droid link.wiki.description = Oficjana 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]Czekanie 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ć kampanie![]\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,12 @@ be.ignore = Zignoruj be.noupdates = Nie znaleziono aktualizacji. be.check = Sprawdź aktualizacje +mod.featured.title = Wyszukiwarka Modów +mod.featured.dialog.title = Wyszukiwarka Modów +mods.browser.selected = Wybrany Mod +mods.browser.add = Zainstaluj Moda +mods.github.open = Otwórz w GitHub'ie + schematic = Schemat schematic.add = Zapisz schemat... schematics = Schematy @@ -55,7 +64,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} @@ -99,25 +110,25 @@ committingchanges = Zatwierdzanie Zmian done = Gotowe feature.unsupported = Twoje urządzenie nie wspiera tej funkcji. + mods.alphainfo = Pamiętaj, że mody są wersji alpha, i[scarlet] mogą być pełne błędów[].\nZgłaszaj wszystkie znalezione problemy na Mindustry GitHub lub Discord. -mods.alpha = [scarlet](Alpha) mods = Mody 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.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.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony 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 +138,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,21 +150,25 @@ 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 +research.legacy = Znaleziono badania z wersji [accent]5.0[].\nCzy chcesz [accent]załadować je[], albo [accent]usunąć[] dane z drzewa technologiczno (rekomendowane)? +research.load = Załaduj +research.discard = Odrzuć research.list = [lightgray]Badania: research = Badaj 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.serverClose = Serwer został zamknięty. @@ -171,11 +186,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,6 +204,11 @@ 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} @@ -208,11 +228,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ę admina "{0}[white]"? +confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina "{0}[white]"? joingame.title = Dołącz do gry joingame.ip = IP: disconnect = Rozłączono. @@ -222,6 +242,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,7 +258,7 @@ 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.export.fail = [crimson]Nie udało się wyeksportować zapisu: [accent]{0} save.import = Importuj Zapis save.newslot = Zapisz nazwę: save.rename = Zmień nazwę @@ -255,47 +276,56 @@ save.wave = Fala {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óć +crash.export = Eksportuj logi błędów. +crash.none = Nie znaleziono logów błędów. +crash.exported = Logi zostały przeniesione. data.export = Eksportuj Dane data.import = Importuj Dane 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... 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ę +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 +339,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,6 +358,7 @@ editor.generation = Generacja: editor.ingame = Edytuj w Grze editor.publish.workshop = Opublikuj w Warsztacie editor.newmap = Nowa Mapa +editor.center = Center workshop = Warsztat waves.title = Fale waves.remove = Usuń @@ -335,9 +366,9 @@ 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 +377,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 +418,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 +448,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 +473,7 @@ filter.option.amount = Ilość filter.option.block = Blok filter.option.floor = Podłoga filter.option.flooronto = Podłoga Docelowa +filter.option.target = Target filter.option.wall = Ściana filter.option.ore = Ruda filter.option.floor2 = Druga Podłoga @@ -456,6 +490,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 @@ -469,38 +505,29 @@ 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.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 +resources = Zasoby bannedblocks = Zabronione bloki addall = Dodaj wszystkie -launch.destination = Destination: {0} +launch.from = Wstrzelony 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.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 +535,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,10 +590,14 @@ 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. @@ -545,6 +606,11 @@ sector.tarFields.description = Obrzeża strefy produkcji ropy, między górami a 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.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 wyakzują ze 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 @@ -558,65 +624,99 @@ 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.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]Osatino wpłynął: {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.buildtime = Czas budowy +stat.maxconsecutive = Maksymalnie Kolejny +stat.buildcost = Koszt budowy +stat.inaccuracy = Niecelność +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.heatcapacity = Pojemność Cieplna +stat.viscosity = Lepkość +stat.temperature = Temperatura +stat.speed = Prędość +stat.buildspeed = Prędkość Budowy +stat.minespeed = Prędkość Wydobycia +stat.minetier = Stopień Wydobycia +stat.payloadcapacity = Ładowność +stat.commandlimit = Limit Jednostek Zarządanych +stat.abilities = Umiejętności +stat.canboost = Może przyspieszyć +stat.flying = Latanie + +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}% @@ -624,6 +724,7 @@ 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} @@ -635,19 +736,26 @@ bar.progress = Postęp Budowy bar.input = Wejście bar.output = Wyjście +units.processorcontrol = [lightgray]Kontrolowany Procesorem + 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.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,17 +768,18 @@ 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 +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 @@ -678,8 +787,8 @@ setting.blockreplace.name = Automatyczne sugestie bloków setting.linear.name = Filtrowanie Liniowe setting.hints.name = Podpowiedzi setting.flow.name = Wyświetl szybkość przepływu zasobów[scarlet] (eksperymentalne) +setting.backgroundpause.name = Wstrzymaj w tle setting.buildautopause.name = Automatycznie zatrzymaj budowanie -setting.mapcenter.name = Auto Center Map To Player setting.animatedwater.name = Animowana woda setting.animatedshields.name = Animowana tarcza setting.antialias.name = Antyaliasing[lightgray] (wymaga restartu)[] @@ -707,20 +816,18 @@ 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 = Gładka 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.coreitems.name = Poazuj Przedmoty W Rdzeniu (WIP) 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 @@ -733,6 +840,7 @@ 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.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.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}[] @@ -743,11 +851,11 @@ keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w 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 @@ -756,12 +864,12 @@ 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,8 +896,8 @@ 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.pickupCargo.name = Podnieś Ładunek +keybind.dropCargo.name = Opuść Ładunek keybind.command.name = Command keybind.shoot.name = Strzelanie keybind.zoom.name = Przybliżanie @@ -797,6 +905,8 @@ 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 @@ -818,28 +928,29 @@ 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.schematic = Schematy Są Dozwolone +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.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 @@ -847,17 +958,20 @@ rules.title.unit = Jednostki rules.title.experimental = Eksperymentalne rules.title.environment = Environment rules.lighting = Oświetlenie -rules.fire = Fire -rules.explosions = Block/Unit Explosion Damage +rules.enemyLights = Wrogowie Emitują Światło +rules.fire = Ogień +rules.explosions = Uszkodzenia Wybuchu Klocka/Jednostki rules.ambientlight = Otaczające Światło -rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.duration = Duration: +rules.weather = Pogoda +rules.weather.frequency = Częstotliwość: +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,23 +993,6 @@ 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.mace.name = Mace unit.fortress.name = Forteca @@ -930,28 +1027,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 = Space block.salt.name = Sól -block.salt-wall.name = Salt Wall +block.salt-wall.name = Solna Ściana block.pebbles.name = Kamyki block.tendrils.name = Wić -block.sand-wall.name = Sand Wall +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 @@ -981,6 +1080,7 @@ block.darksand-water.name = Woda z Ciemnym Piaskiem block.char.name = Popiół block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Lodowy Śnieg block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -990,7 +1090,7 @@ 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.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 @@ -1029,7 +1129,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,13 +1136,12 @@ 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 block.phase-weaver.name = Fazowa Fabryka block.pulverizer.name = Rozkruszacz -block.cryofluidmixer.name = Mieszacz Lodocieczy +block.cryofluid-mixer.name = Mieszacz Lodocieczy block.melter.name = Przetapiacz block.incinerator.name = Spalacz block.spore-press.name = Prasa Zarodników @@ -1075,6 +1173,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 +1213,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 = Przspieszacz 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 = Micro Procesor +block.logic-processor.name = Logiczny Procesor +block.hyper-processor.name = Hyper Procesor +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,49 +1254,76 @@ 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]Przewiń[] by przybliżać lub oddlać 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 górnym lewym 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 odkrwyać nowe technologie. +hint.unitControl = Przytrzymaj [accent][[Lewy CTRL][] i [accent]kliknij[] to control 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]Mape[] 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ć podniesoiny towar. +hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuścić podniesoiny towar. +hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary. +hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekuzują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzeły Prądu[]. +hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] oraz [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ą kampanie[], przedmioty które są produkowane na mapie trafią także [accent]dotwoich 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 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.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. @@ -1199,7 +1332,7 @@ block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilo 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. -block.cryofluidmixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda. +block.cryofluid-mixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda. block.blast-mixer.description = Kruszy i miesza skupiska zarodników z piratytem, tworząc związek wybuchowy. block.pyratite-mixer.description = Miesza węgiel, ołów i piasek tworząc bardzo łatwopalny piratian. block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach @@ -1242,13 +1375,14 @@ block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiot 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 zasilaina. 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. @@ -1278,15 +1412,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.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. Użyj ekstraktora, aby rozładować magazyn. block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozładować kontener. block.unloader.description = Wyciąga przedmioty z 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 +1438,64 @@ 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, który przyciąga 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 przewoźnika masowego i dzieli je 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 stopnia piątego i ostatniego. +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ż mikro procesor. +block.hyper-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż logiczny procesor. +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 wiązki laserowe, które uszkadzają przeciwników i leczą 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 masywny laserowy błysk, który 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 stos 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 na ziemi, które uszkadzają przeciwników i leczą 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. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index b7490dd8f2..0e597d2159 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 @@ -55,6 +55,7 @@ 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,7 +66,7 @@ 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 @@ -100,22 +101,21 @@ 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 = 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.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 @@ -278,18 +278,21 @@ quit.confirm.tutorial = Você tem certeza que você sabe o que você esta fazend 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 @@ -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 @@ -335,7 +339,7 @@ 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.preview = Pré-visualizar @@ -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... @@ -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 = Medio 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 = Alcançar a Horda {0} em {1} requirement.core = Destruir o 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 futuras. +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 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.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 = Limpo 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 = Saída -blocks.booster = Apoio -blocks.tiles = Required Tiles -blocks.affinities = Affinities +lastaccessed = [lightgray]Last Accessed: {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 = Affinities +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 = Display Size +stat.liquidcapacity = Capacidade de Líquido +stat.powerrange = Alcance da Energia +stat.linkrange = Link Range +stat.instructions = Instructions +stat.powerconnections = Conexões Máximas +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 = 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 = Shield Health +stat.cooldowntime = Tempo de espera +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 = Entrada bar.output = Sainda +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) 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 por segundo unit.liquidsecond = líquido segundo unit.itemssecond = itens por segundo @@ -670,7 +711,7 @@ category.power = Energia category.liquids = Líquidos category.items = Itens category.crafting = Entrada/Saída -category.shooting = Atiradores +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 = Dicas setting.flow.name = Display Resource Flow Rate[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)[] @@ -702,7 +742,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 +752,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.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 @@ -743,25 +782,25 @@ keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em 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 = Ausente 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 a propriedade 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 +823,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 +846,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. @@ -822,10 +861,11 @@ mode.custom = Regras personalizadas rules.infiniteresources = Recursos infinitos rules.reactorexplosions = Reatores explodem +rules.schematic = Schematics Allowed 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 @@ -836,28 +876,30 @@ rules.enemycorebuildradius = Raio de "Não-criação" de core inimigo:[lightgray 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 = Enemy Lights +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 @@ -879,23 +921,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 @@ -930,28 +955,29 @@ 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.spore-pine.name = Pinheiro de esporo block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder +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,7 +987,7 @@ 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 @@ -978,18 +1004,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 +1032,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 +1046,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 @@ -1038,12 +1065,12 @@ 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.overflow-gate.name = Portão de Fluxo +block.underflow-gate.name = Portão de Fluxo invertido block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador -block.cryofluidmixer.name = Misturador de Crio Fluido +block.cryofluid-mixer.name = Misturador de Crio Fluido block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporo @@ -1075,9 +1102,10 @@ 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 +block.ripple.name = Morteiro block.phase-conveyor.name = Transportador de Fase block.bridge-conveyor.name = Esteira-Ponte block.plastanium-compressor.name = Compressor de Plastânio @@ -1087,8 +1115,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 +1138,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.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 = Memory Bank team.blue.name = Azul team.crux.name = Vermelho @@ -1199,7 +1229,7 @@ block.kiln.description = Derrete chumbo e areia no composto conhecido como metav block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. -block.cryofluidmixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. +block.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. block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. @@ -1223,7 +1253,7 @@ 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.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no 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-s aleatoriamente. block.surge-wall-large.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente.\nOcupa multiplos blocos. block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. @@ -1239,8 +1269,8 @@ block.plastanium-conveyor.description = Moves items in batches.\nAccepts items a block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. -block.sorter.description = [interact]Aperte no bloco para configurar[] -block.inverted-sorter.description = Processa os itens como um sorteador normal, mas os itens escolhidos sairão pelas laterais ao invés. +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 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. @@ -1300,6 +1330,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 903b761736..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Portão Desobrecarregado block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador -block.cryofluidmixer.name = Misturador de Crio Fluido +block.cryofluid-mixer.name = Misturador de Crio Fluido block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporo @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Derrete chumbo e areia no composto conhecido como metav block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. -block.cryofluidmixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. +block.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 block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 0a3e005854..103b173a72 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,12 @@ be.ignore = Ignoră be.noupdates = Niciun update disponibil. be.check = Verifică updateurile +mod.featured.title = Mod browser +mod.featured.dialog.title = Mod Browser (Neterminat) +mods.browser.selected = Mod selectat +mods.browser.add = Instalează +mods.github.open = Vezi + schematic = Schemă schematic.add = Salvează Schema... schematics = Scheme @@ -50,12 +59,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 +76,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 +89,7 @@ loadgame = Încarcă Jocul joingame = Intră în Joc customgame = Personalizat newgame = Joc Nou +none.found = [lightgray] none = minimap = Minihartă position = Poziție @@ -99,8 +111,7 @@ 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.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportează orice probleme apărute pe Githubul Mindustry. mods = Moduri mods.none = [lightgray]Nu s-au găsit moduri! mods.guide = Ghid de Modding @@ -127,11 +138,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 +154,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 +187,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,6 +204,11 @@ 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} @@ -222,6 +242,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 +285,12 @@ ok = OK open = Deschide customize = Personalizează Regulile cancel = Anulare -openlink = Deschidr Linkul +openlink = Deschide Linkul copylink = Copiază Linkul back = Înapoi +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 +307,19 @@ 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 +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,6 +358,7 @@ 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ă @@ -346,6 +377,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,6 +390,8 @@ 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.errorlegacy = Hartă aceasta este prea veche, și folosește un format învechit care nu mai este suportat. @@ -416,11 +450,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 +474,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 +492,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 +503,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 +539,78 @@ 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 a avut 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ă-și 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ă de forțe inamice periculoase. Nu le subestima.\n\n[lightgray]Cercetează tehnologie 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 mai 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. settings.language = Limbă settings.data = Datele Jocului @@ -560,59 +626,94 @@ 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.booster = Îmbunătățiri +stat.tiles = Teren Necesar +stat.affinities = Efecte Teren +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.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.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 + +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 = Scurt Regenerabil +ability.movelightning = Mișcare Fulger bar.drilltierreq = Burghiu Mai Bun Necesar bar.noresources = Resurse lipsă @@ -624,10 +725,10 @@ 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 +736,27 @@ 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.incendiary = [stat]incendiar +bullet.sapping = [stat]atragere inamici bullet.homing = [stat]cu radar bullet.shock = [stat]șoc bullet.frag = [stat]fragil +bullet.buildingdamage = [stat]{0}%[lightgray] forță/clădire bullet.knockback = [stat]{0} [lightgray]împingere +bullet.pierce = [stat]{0}[lightgray]x penetrare +bullet.infinitepierce = [stat]penetrare +bullet.healpercent = [stat]{0}[lightgray]% reparare bullet.freezing = [stat]înghețat bullet.tarred = [stat]lipicios 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,17 +769,19 @@ 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 @@ -679,8 +790,8 @@ setting.linear.name = Filtrare Liniară setting.hints.name = Indicii 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.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 +818,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 +842,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 +908,18 @@ 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.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 +935,8 @@ 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.schematic = Se Pot Folosi Scheme rules.wavetimer = Valuri pe Timp rules.waves = Valuri rules.attack = Modul Atac @@ -846,18 +961,22 @@ 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.sector.name = Sectoare + item.copper.name = Cupru item.lead.name = Plumb item.coal.name = Cărbune @@ -879,23 +998,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 @@ -925,7 +1027,7 @@ unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma -unit.scepter.name = Scepter +unit.scepter.name = Septer unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus @@ -935,7 +1037,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 +1084,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,21 +1134,23 @@ 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 +#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.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 block.phase-weaver.name = Țesătorie de Fază block.pulverizer.name = Pulverizator -block.cryofluidmixer.name = Mixer de Criofluid +block.cryofluid-mixer.name = Mixer de Criofluid block.melter.name = Topitor block.incinerator.name = Incinerator block.spore-press.name = Presă de Spori @@ -1071,10 +1178,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 @@ -1114,6 +1222,7 @@ block.arc.name = Arc block.rtg-generator.name = Generator RTG block.spectre.name = Specter 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 +1240,266 @@ 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 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 materialet ș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.cryofluidmixer.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.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.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. Nu poate fi folosită lângă alte porți. +block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate. Nu poate fi folosită lângă alte porți. +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.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, tranformându-le în unități de nivel doi. +block.multiplicative-reconstructor.description = Îmbunătățește unitățile primite, tranformându-le în unități de nivel trei. +block.exponential-reconstructor.description = Îmbunătățește unitățile primite, tranformându-le în unități de nivel patru. +block.tetrative-reconstructor.description =Îmbunătățește unitățile primite, tranformâ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 inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor. +unit.arkyid.description = Trage cu lasere mari care apropie 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. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 82e30a4089..23a3b55158 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,12 @@ be.ignore = Игнорировать be.noupdates = Обновления не найдены. be.check = Проверить обновления +mod.featured.title = Обозреватель модов +mod.featured.dialog.title = Обозреватель модов +mods.browser.selected = Выбранный мод +mods.browser.add = Установить мод +mods.github.open = Открыть GitHub страницу + schematic = Схема schematic.add = Сохранить схему… schematics = Схемы @@ -57,6 +66,7 @@ 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} @@ -66,7 +76,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 = Выбор карты @@ -100,15 +110,14 @@ committingchanges = Внесение изменений done = Готово feature.unsupported = Ваше устройство не поддерживает эту возможность. -mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и [scarlet]могут содержать много ошибок[]. Докладывайте о любых проблемах, которые вы найдете в Mindustry Github или Discord. -mods.alpha = [accent](Альфа) +mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и [scarlet]могут содержать много ошибок[]. Докладывайте о любых проблемах, которые вы найдете в Mindustry Github. mods = Модификации mods.none = [lightgray]Модификации не найдены! mods.guide = Руководство по модам mods.report = Доложить об ошибке mods.openfolder = Открыть папку с модификациями mods.reload = Перезагрузить -mods.reloadexit = Игра будет закрыта для перезагрузки модов. +mods.reloadexit = Игра будет закрыта для перезагрузки модификаций. mod.display = [gray]Модификация:[orange] {0} mod.enabled = [lightgray]Включён mod.disabled = [scarlet]Выключен @@ -139,13 +148,17 @@ 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,6 +203,11 @@ 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} @@ -223,6 +241,7 @@ disconnect.timeout = Время ожидания истекло. disconnect.data = Ошибка при загрузке данных мира! cantconnect = Не удаётся присоединиться к игре ([accent]{0}[]). connecting = [accent]Подключение… +reconnecting = [accent]Переподключение… connecting.data = [accent]Загрузка данных мира… server.port = Порт: server.addressinuse = Данный адрес уже используется! @@ -268,6 +287,9 @@ cancel = Отмена openlink = Открыть ссылку copylink = Скопировать ссылку back = Назад +crash.export = Экспорт отчёта об ошибках +crash.none = Отчёты об ошибках не найдены. +crash.exported = Отчёты об ошибках экспортированы. data.export = Экспортировать данные data.import = Импортировать данные data.openfolder = Открыть папку с данными @@ -284,13 +306,19 @@ cancelbuilding = [accent][[{0}][] для очистки плана selectschematic = [accent][[{0}][] выделить и скопировать pausebuilding = [accent][[{0}][] для приостановки строительства resumebuilding = [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 = Неизвестно @@ -329,6 +357,7 @@ editor.generation = Генерация: editor.ingame = Редактировать в игре editor.publish.workshop = Опубликовать в Мастерской editor.newmap = Новая карта +editor.center = Центрировать workshop = Мастерская waves.title = Волны waves.remove = Удалить @@ -387,8 +416,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 +447,7 @@ filters.empty = [lightgray]Нет фильтров! Добавьте один п filter.distort = Искажение filter.noise = Шум filter.enemyspawn = Случайный выбор \nточек высадки +filter.spawnpath = Путь до точки высадки filter.corespawn = Случайный выбор ядра filter.median = Медиана filter.oremedian = Рудная медиана @@ -442,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 = Вторая поверхность @@ -458,6 +489,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 +505,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 +517,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 +538,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 +589,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 +600,16 @@ 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Произведите морские единицы. Уничтожьте врага как можно скорее. Изучите пусковую конструкцию. settings.language = Язык settings.data = Игровые данные @@ -569,60 +625,94 @@ 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.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 = Недостаточно ресурсов @@ -634,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][[единица отключена] bar.liquid = Жидкости bar.heat = Нагрев bar.power = Энергия @@ -645,25 +735,33 @@ 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.frag = [stat]осколочный -bullet.knockback = [stat]{0}[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.freezing = [stat]замораживающий bullet.tarred = [stat]замедляющий, горючий 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.degrees = ° unit.seconds = сек. unit.minutes = мин. unit.persecond = /сек @@ -675,12 +773,14 @@ 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 = Тени @@ -688,9 +788,9 @@ setting.blockreplace.name = Автоматическая замена блоко setting.linear.name = Линейная фильтрация setting.hints.name = Подсказки setting.flow.name = Показывать скорость потока ресурсов +setting.backgroundpause.name = Фоновая пауза setting.buildautopause.name = Автоматическая приостановка строительства -setting.mapcenter.name = Центрирование карты на игроке -setting.animatedwater.name = Анимированные жидкости +setting.animatedwater.name = Анимированные поверхности setting.animatedshields.name = Анимированные щиты setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[] setting.playerindicators.name = Индикаторы направления игроков @@ -717,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 = Отображать предметы из ядра (WIP) +setting.coreitems.name = Отображать предметы из ядра setting.position.name = Отображать координаты игрока setting.musicvol.name = Громкость музыки setting.atmosphere.name = Отображать атмосферу планеты @@ -743,13 +841,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 +871,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 +882,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 +907,8 @@ 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 = Консоль @@ -816,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 = Изменить режим чата keybind.drop_unit.name = Сбросить боев. ед. keybind.zoom_minimap.name = Масштабировать мини-карту mode.help.title = Описание режимов @@ -858,17 +961,21 @@ 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.sector.name = Секторы + item.copper.name = Медь item.lead.name = Свинец item.coal.name = Уголь @@ -890,23 +997,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 +1028,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 +1084,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 +1133,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,13 +1140,12 @@ 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.pulverizer.name = Измельчитель -block.cryofluidmixer.name = Мешалка криогенной жидкости +block.cryofluid-mixer.name = Мешалка криогенной жидкости block.melter.name = Плавильня block.incinerator.name = Мусоросжигатель block.spore-press.name = Споровый пресс @@ -1086,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 = Рябь @@ -1125,6 +1217,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 +1235,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 +1258,248 @@ 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.cryofluidmixer.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.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.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 = Перемещает жидкости вперёд. Не принимает ввод по бокам. Не протекает. +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 = Защищает ядро «Атом» от врагов. Основная строительная единица. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 0102844ace..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Kiselsmältare block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulveriserare -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Smältare block.incinerator.name = Förbrännare block.spore-press.name = Spore Press @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.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. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 72028722d0..930887461d 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 = 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,8 +350,8 @@ waves.invalid = waves ในคลิปบอร์ดไม่ถูกต้ waves.copied = คัดลอก Waves แล้ว waves.none = ไม่ได้กำหนดศัตรู\nwave layouts เปล่าจะถูกแทนที่โดย layout ค่าเริ่มต้นของเกม -wavemode.counts = counts -wavemode.totals = totals +wavemode.counts = จำนวน +wavemode.totals = ทั้งหมด wavemode.health = health editor.default = [lightgray]<ค่าเริ่่มต้น> @@ -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 = Fog -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]Insufficient Core Resources + +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 = 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]แบน -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]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 = ต้องการ 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 = Link Range +stat.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 = ติดต่อกันสูงสุด +stat.buildcost = ใช้ +stat.inaccuracy = ความคลาดเคลื่อน +stat.shots = นัด +stat.reload = นัด/วินาที +stat.ammo = กระสุน +stat.shieldhealth = เลือดของเกราะ +stat.cooldowntime = เวลา Cooldown +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 -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 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 จำนวนกระสุนต่อ 1 ไอเท็ม bullet.reload = [stat]{0}[lightgray]x ความเร็วยิง unit.blocks = บล็อค +unit.blockssquared = blocks² unit.powersecond = หน่วยพลังงาน/วินาที unit.liquidsecond = หน่วยของเหลว/วินาที unit.itemssecond = ไอเท็ม/วินาที @@ -660,30 +701,29 @@ unit.persecond = /วินาที unit.perminute = /min 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 = การควบคุมแบบ เม้าส์+คีย์บอร์ด @@ -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.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 = เปิด/ปิด Fullscreen 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 = Schematics Allowed 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.environment = สิ่งแวดล้อม +rules.lighting = แสง +rules.enemyLights = Enemy Lights +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.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.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 = Dacite Boulder 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,14 +1063,14 @@ 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 = เครื่องบด -block.cryofluidmixer.name = เครื่องผสมสารหล่อเย็น +block.cryofluid-mixer.name = เครื่องผสมสารหล่อเย็น block.melter.name = เตาหลอม block.incinerator.name = เตาเผาขยะ block.spore-press.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 = Tsunami 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 = 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.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 = ม่วง @@ -1199,7 +1229,7 @@ block.kiln.description = เผาทรายและตะกั่วเป block.plastanium-compressor.description = ผลิตพลาสตาเนี่ยมจากน้ำมันและไทเทเนี่ยม. block.phase-weaver.description = สังเคราะห์ใยเฟสจากทอเรี่ยมที่มีรังสีและทราย. จำเป็นต้องใช้พลังงานจำนวนมากจึงจะทำงานง. block.alloy-smelter.description = ผสมไทเทเนี่ยม, ตะกั่ว, ซิลิก้อนและทองแดงเพื่อที่จะผลิตเซิร์จอัลลอย. -block.cryofluidmixer.description = ผสมน้ำและผงไทเทเนี่ยมบริสุทธิ์เป็นไครโยฟลูอิด. สำคัญสำหรับเตาปฏิกรณ์ทอเรี่ยม. +block.cryofluid-mixer.description = ผสมน้ำและผงไทเทเนี่ยมบริสุทธิ์เป็นไครโยฟลูอิด. สำคัญสำหรับเตาปฏิกรณ์ทอเรี่ยม. block.blast-mixer.description = บอและผสมสปอร์กับไพไรต์เพื่อผลิตสารประกอบระเบิด. block.pyratite-mixer.description = ผสมถ่านหิน, ตะกั่วและทรายเข้าด้วยกันเป็นไฟไรต์ที่ติดไฟได้ง่าย. block.melter.description = หลอมเศษเหล็กเป็กกากแร่เพื่อใช้สำหรับกระบวนการต่อไปหรือใช้ในป้อมปืนเวฟ. @@ -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 21f0cb129c..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 @@ -1043,7 +1070,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silikon eritici block.phase-weaver.name = Dokumaci block.pulverizer.name = pulvarizor -block.cryofluidmixer.name = Cryosivisi karistiricisi +block.cryofluid-mixer.name = Cryosivisi karistiricisi block.melter.name = eritici block.incinerator.name = isi firini block.spore-press.name = Spore Press @@ -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 @@ -1199,7 +1229,7 @@ block.kiln.description = Smelts sand and lead into metaglass. Requires small amo block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.cryofluid-mixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Heats up stone to very high temperatures to obtain lava. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 5ebb31a858..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,14 +1069,14 @@ 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 -block.cryofluidmixer.name = Kriyosıvı Mikseri +block.cryofluid-mixer.name = Kriyosıvı Mikseri block.melter.name = Eritici block.incinerator.name = Yakıcı block.spore-press.name = Spor Presi @@ -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.[] @@ -1199,7 +1235,7 @@ block.kiln.description = Kum ve kurşunu eritir ve metacam olarak bilinen malzem block.plastanium-compressor.description = Petrol ve titanyumdan plastanyum üretir. block.phase-weaver.description = Kum ve radyoaktif toryumdan faz örgüsü üretir. Çalışması için çok miktarda enerji gerekir. block.alloy-smelter.description = Akı alaşımı üretmek için titanyum, kurşun, silikon ve bakırı birleştirir. -block.cryofluidmixer.description = Su ve titanyum tozunu karıştırıp kriyosıvı üretir. Toryum reaktörü kullanımı için gereklidir. +block.cryofluid-mixer.description = Su ve titanyum tozunu karıştırıp kriyosıvı üretir. Toryum reaktörü kullanımı için gereklidir. block.blast-mixer.description = Patlayıcı bileşen üretmek için spor kapsüllerini pirratit ile ezer ve karıştırır. block.pyratite-mixer.description = Kömür, kurşun ve kumu karıştırıp oldukça yanıcı olan pirratit üretir. block.melter.description = Wave taretlerinde kullanılması veya daha çok işlemesi için hurdayı eritip cürufa çevirir. @@ -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 631e56dac5..bdb83b4ca3 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,16 @@ 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 = Переглядач модифікацій +mod.featured.dialog.title = Переглядач модифікацій +mods.browser.selected = Обрана модифікація +mods.browser.add = Установити модифікацію +mods.github.open = Відкрити в Github + +stats = Статистика stat.wave = Хвиль відбито:[accent] {0} stat.enemiesDestroyed = Противників знищено:[accent] {0} stat.built = Будівель збудовано:[accent] {0} @@ -64,8 +71,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 = Вибір мапи @@ -98,9 +104,7 @@ uploadingpreviewfile = Вивантаження файлу попередньо committingchanges = Здійснення змін done = Зроблено feature.unsupported = Ваш пристрій не підтримує цю функцію - mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. -mods.alpha = [accent](Альфа) mods = Модифікації mods.none = [lightgray]Модифікацій не знайдено! mods.guide = Посібник із модифікацій @@ -115,7 +119,7 @@ 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 +139,6 @@ mod.missing = Це збереження містить модифікації, mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри. - about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. @@ -143,8 +146,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 +178,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,11 +191,14 @@ 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} @@ -222,6 +232,7 @@ disconnect.timeout = Час вийшов. disconnect.data = Не вдалося завантажити світові дані! cantconnect = Не вдалося під’єднатися до гри ([accent]{0}[]). connecting = [accent]Приєднання… +reconnecting = [accent]Повторне зʼєднання… connecting.data = [accent]Завантаження даних світу… server.port = Порт: server.addressinuse = Ця адреса вже використовується! @@ -267,6 +278,9 @@ cancel = Скасувати openlink = Перейти за посиланням copylink = Скопіювати посилання back = Назад +crash.export = Експортувати аварійні звіти +crash.none = Аварійних звітів не знайдено +crash.exported = Аварійні звіти експортовано data.export = Вивантажити дані data.import = Завантажити дані data.openfolder = Відчинити теку з даними @@ -274,7 +288,7 @@ 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]Збереження… @@ -283,13 +297,19 @@ cancelbuilding = [accent][[{0}][], щоб очистити план selectschematic = [accent][[{0}][], щоби вибрати та скопіювати pausebuilding = [accent][[{0}][], щоби призупинити будування resumebuilding = [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 +333,6 @@ publishing = [accent]Публікація… publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! publish.error = Виникла помилка під час публікації предмета: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} - editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Генерація руд @@ -328,6 +347,7 @@ editor.generation = Генерація: editor.ingame = Редагувати в грі editor.publish.workshop = Опублікувати в Майстерні Steam editor.newmap = Нова мапа +editor.center = Центрувати workshop = Майстерня waves.title = Хвилі waves.remove = Видалити @@ -345,11 +365,9 @@ waves.load = Завантажити з буфера обміну waves.invalid = Недійсні хвилі в буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. - wavemode.counts = кількість wavemode.totals = усього wavemode.health = здоров’я - editor.default = [lightgray]<За замовчуванням> details = Подробиці… edit = Редагувати… @@ -396,7 +414,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 +428,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 +457,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 +473,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 +514,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,19 +563,26 @@ 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Виробляє військово-морські підрозділи. Усуньте ворога якомога швидше. Дослідіть структуру запуску. settings.language = Мова settings.data = Ігрові дані settings.reset = За замовчуванням @@ -557,63 +594,94 @@ 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.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 = Літає +ability.forcefield = Щитове поле +ability.repairfield = Ремонтувальне поле +ability.statusfield = Поле підсилення +ability.unitspawn = Завод одиниць «{0}» +ability.shieldregenfield = Поле, що відновлює щити +ability.movelightning = Блискавки під час руху bar.drilltierreq = Потребується кращий бур bar.noresources = Бракує ресурсів bar.corereq = Необхідне основне ядро @@ -624,6 +692,7 @@ 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} @@ -634,20 +703,24 @@ 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.sapping = [stat]виснажує bullet.homing = [stat]самонаведення bullet.shock = [stat]шок bullet.frag = [stat]шкода по ділянці 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 = предметів за секунду @@ -660,17 +733,18 @@ unit.persecond = за секунду unit.perminute = за хвилину unit.timesspeed = x швидкість unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = міцність щита unit.items = предм. unit.thousands = тис unit.millions = млн unit.billions = млрд +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 +752,20 @@ setting.blockreplace.name = Пропонування щодо автоматич setting.linear.name = Лінійна фільтрація setting.hints.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.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 +781,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 = Показувати планетарну атмосферу @@ -736,7 +808,7 @@ setting.playerchat.name = Показувати хмару чата над гра public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… -uiscale.cancel = Скасувати & Вийти +uiscale.cancel = Скасувати і вийти setting.bloom.name = Світіння keybind.title = Налаштування керування keybinds.mobile = [scarlet]Більшість прив’язаних клавіш не функціональні для мобільних пристроїв. Підтримується лише базовий рух. @@ -747,8 +819,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 +829,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 +860,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 = Консоль @@ -819,9 +893,9 @@ mode.pvp.description = Боріться проти інших гравців.\n[ mode.attack.name = Атака mode.attack.description = Зруйнуйте ворожу базу. \n[gray]Потрібно червоне ядро на мапі для гри. mode.custom = Користувацькі правила - rules.infiniteresources = Нескінченні ресурси rules.reactorexplosions = Вибухи реактора +rules.schematic = Використання схем дозволено rules.wavetimer = Таймер для хвиль rules.waves = Хвилі rules.attack = Режим атаки @@ -836,7 +910,7 @@ rules.enemycorebuildradius = Радіус оборони для ворожого rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування -rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу +rules.deconstructrefundmultiplier = Множник відшкодування в разі демонтажу rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпасів @@ -847,17 +921,18 @@ 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.sector.name = Cектори item.copper.name = Мідь item.lead.name = Свинець item.coal.name = Вугілля @@ -871,31 +946,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 +964,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 +1018,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 +1039,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 +1048,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 +1088,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,13 +1095,12 @@ 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.pulverizer.name = Подрібнювач -block.cryofluidmixer.name = Змішувач кріогенної рідини +block.cryofluid-mixer.name = Змішувач кріогенної рідини block.melter.name = Плавильня block.incinerator.name = Сміттєспалювальний завод block.spore-press.name = Споровий прес @@ -1073,15 +1130,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 +1172,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 +1189,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 +1201,252 @@ 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.cryofluidmixer.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 = Захищає ядро «Атом» від противників. Будує споруди. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties new file mode 100644 index 0000000000..d45c16a170 --- /dev/null +++ b/core/assets/bundles/bundle_vi.properties @@ -0,0 +1,1490 @@ +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 +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. + +schematic = Schematic +schematic.add = Lưu Schematic... +schematics = Schematics +schematic.replace = Schematics có tên đó đã tồn tại. Thay thế nó? +schematic.exists = Schematics có tên đó đã tồn tại. +schematic.import = Nhập Schematic... +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 = Nhập từ bộ nhớ tạm +schematic.shareworkshop = Chia sẻ từ Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật Schematic +schematic.saved = Đã lưu Schematic. +schematic.delete.confirm = Schematic này sẽ bị xóa hoàn toàn. +schematic.rename = Đổi tên Schematic +schematic.info = {0}x{1}, {2} khối +schematic.disabled = [scarlet]Tính năng Schematics đã bị tắt[]\nBạn không được sử dụng schematic 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 ĐIỂM THẢ NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra +database = Cơ sở dữ liệu căn cứ +savegame = Lưu trò chơi +loadgame = Tải trò chơi +joingame = Tham gia trò chơi +customgame = Tùy chỉnh +newgame = Trò chơi mới +none = +minimap = Bản đồ mini +position = Vị trí +close = Đóng +website = Website +quit = Thoát +save.quit = Lưu & Thoát +maps = Maps +maps.browse = Duyệt bản đồ +continue = Tiếp tục +maps.none = [lightgray]Không có bản đồ nào được tìm thấy! +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.alphainfo = Hãy nhớ rằng các bản mod đang ở giai đoạn alpha, và[scarlet] có thể chứa rất rất lỗi[].\nBáo cáo bất kỳ vấn đề nào bạn gặp phải tại Mindustry GitHub. +mods = Mods +mods.none = [lightgray]Không có mod nào được tìm thấy! +mods.guide = Hướng dẫn mod +mods.report = Báo lỗi +mods.openfolder = Mở thư mục +mods.reload = Tải lại +mods.reloadexit = Trò chơi sẽ đóng để tải lại mod. +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ị ảnh hưởng hoặc sửa chữ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 = Nhập Mod +mod.import.file = Nhập tệp +mod.import.github = Nhập từ GitHub +mod.jarwarn = [scarlet]JAR mod vốn dĩ không an toàn.[]\nĐảm bảo rằng bạn đang nhập bản 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òn cài đặt nữa. 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 xuất bản 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ể xuất bản 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.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 +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 +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.never = +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 đồ.\n\nNếu bạn muốn nhập một bản đồ 3.5/build 40, sử dụng nút 'Nhập bản đồ thay thế' trong trình chỉnh sửa. +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.buildtime = Thời gian xây +stat.maxconsecutive = Đầu ra tối đa +stat.buildcost = Chi phí +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.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 + +ability.forcefield = Force Field +ability.repairfield = Repair Field +ability.statusfield = Status Field +ability.unitspawn = {0} Factory +ability.shieldregenfield = Shield Regen Field +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.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.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[quân lính bị vô hiệu hóa] +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]homing +bullet.shock = [stat]sốc +bullet.frag = [stat]frag +bullet.knockback = [stat]{0}[lightgray] bật lùi +bullet.pierce = [stat]{0}[lightgray]x xuyên giáp +bullet.infinitepierce = [stat]pierce +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 = nghìn +unit.millions = triệu +unit.billions = tỷ +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.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àng 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àng 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ảng đồ 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 +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.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 = Toggle Power Lasers +keybind.toggle_block_status.name = Toggle Block Statuses +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 = Xem Pan +keybind.boost.name = Tăng tốc +keybind.schematic_select.name = Chọn khu vực +keybind.schematic_menu.name = Menu Schematic +keybind.schematic_flip_x.name = Lật Schematic X +keybind.schematic_flip_y.name = Lật Schematic 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 hiện có (Giữ) +keybind.toggle_menus.name = Chuyển đổi 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.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.schematic = Cho phép dùng schematic +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.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.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 = Plastanium +item.phase-fabric.name = Phase Fabric +item.surge-alloy.name = Surge Alloy +item.spore-pod.name = Vỏ bào tử +item.sand.name = Cát +item.blast-compound.name = Chất nổ +item.pyratite.name = Pyratite +item.metaglass.name = Metaglass +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 = Cryofluid + +#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 sắt vụn +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 thang chì +block.multi-press.name = Máy nén thang 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 Plastanium +block.plastanium-wall-large.name = Tường Plastanium 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 Plastanium +block.armored-conveyor.name = Băng chuyền bọc thép +block.junction.name = Junction +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sorter +block.inverted-sorter.name = Sorter ngược +block.message.name = Thông điệp +block.illuminator.name = Đèn +block.overflow-gate.name = Overflow Gate +block.underflow-gate.name = Underflow Gate +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 trộn Cryofluid +block.melter.name = Máy 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 Surge +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 = 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 = Vô hạn năng lượng +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 +block.phase-conveyor.name = Phase Conveyor +block.bridge-conveyor.name = Bridge Conveyor +block.plastanium-compressor.name = Máy nén Plastanium +block.pyratite-mixer.name = Máy trộn Pyratite +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 thép +block.phase-conduit.name = Ống dẫn Phase +block.liquid-router.name = Liquid Router +block.liquid-tank.name = Thùng chất lỏng +block.liquid-junction.name = Liquid Junction +block.bridge-conduit.name = Bridge Conduit +block.rotary-pump.name = Bơm điện +block.thorium-reactor.name = Lò phản ứng Thorium +block.mass-driver.name = Mass Driver +block.blast-drill.name = Máy khoang 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 Surge +block.surge-wall-large.name = Tường Surge 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 = Payload Router +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 = Block Unloader +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í mini +block.logic-processor.name = Bộ xử lý +block.hyper-processor.name = Bộ xử lý lớn +block.logic-display.name = Màng hình +block.large-logic-display.name = Màng 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. + +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áychá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 chất 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 metaglass. +block.plastanium-compressor.description = Sản xuất plastanium 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 surge. +block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất cryofluid. +block.blast-mixer.description = Tạo ra hợp chất nổ từ pyratite và vỏ bào tử. +block.pyratite-mixer.description = Trộn than, chì và cát thành pyratite. +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ế độ Sandbox. +block.power-source.description = Tạo ra năng lượng mãi mãi. Chỉ có trong chế độ Sandbox. +block.item-source.description = Tạo ra vật phẩm mãi mãi. Chỉ có trong chế độ Sandbox. +block.item-void.description = Hủy mọi vật phẩm. Chỉ có trong chế độ Sandbox. +block.liquid-source.description = Tạo ra chất lỏng mãi mãi. Chỉ có trong chế độ Sandbox. +block.liquid-void.description = Loại bỏ mọi chất lỏng. Chỉ có trong chế độ Sandbox. +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 nguồ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 nguồ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 silicon để 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 silicon để 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 tòa 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, không thể đặt cạnh nhau. +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, không thể đặt cạnh nhau. +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 mass driver 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 cryofluid và pyratite đ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 = Core of the base. Well armored. Stores more resources than a Shard. +block.core-foundation.details = The second iteration. +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 = Lần thử thứ ba và lần thử cuối. +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 Unloader. +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 Unloader. +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 metaglass vào máy bay địch. +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 homing vào kẻ địch. +block.salvo.description = Bắn đạn salvo 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 ở gần 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. +block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng pyratite 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 vi xử lí micro. +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 vi xử lí logic. +block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí logic. +block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí logic. Dung lượng cao. +block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic. +block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic. +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 = Bắn cục xỉ 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ó kả 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 robot báo hiệu. +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. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 069bc2ed8e..4e5074ae4c 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -17,11 +17,14 @@ 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.popup = [accent]6.0[]仍在[accent]测试版[].\n[lightgray]这意味着:[]\n[scarlet]- 战役玩法完全没有完成[]\n- 很多内容还没有做完\n- 大多[scarlet]单位AI[]无法正确地运行\n- 单位系统完全没有完成\n- 一切您所看到的内容都可能会移除或调整。\n\n在[accent]Github[]提交错误报告。 +indev.notready = 这部分玩法还未开发完成。 +indev.campaign = [accent]恭喜!您已经到达战役模式的结尾![]\n\n这是目前内容的全部。 未来的更新中将添加行星际旅行。 load.sound = 音乐加载中 load.map = 地图加载中 @@ -55,7 +58,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 +70,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 = 选择关卡 @@ -99,15 +104,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 +119,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,20 +131,20 @@ 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 = 解锁了新内容! completed = [accent]己研究 @@ -148,31 +152,31 @@ techtree = 科技树 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 +193,10 @@ servers.local = 本地服务器 servers.remote = 远程服务器 servers.global = 全球服务器 +servers.showhidden = 显示隐藏的服务器 +server.shown = 显示 +server.hidden = 隐藏 + trace = 跟踪玩家 trace.playername = 玩家名称:[accent]{0} trace.ip = IP 地址:[accent]{0} @@ -201,7 +209,7 @@ server.bans.none = 没有被封禁的玩家! server.admins = 管理员 server.admins.none = 该服务器没有管理员! server.add = 添加服务器 -server.delete = 你确定要删除这个服务器吗? +server.delete = 您确定要删除这个服务器吗? server.edit = 编辑服务器 server.outdated = [crimson]服务器过旧![] server.outdated.client = [crimson]客户端过旧![] @@ -228,11 +236,11 @@ 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 +253,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 +275,9 @@ cancel = 取消 openlink = 打开链接 copylink = 复制链接 back = 返回 +crash.export = 导出崩溃日志 +crash.none = 找不到崩溃日志。 +crash.exported = 崩溃日志已导出。 data.export = 导出数据 data.import = 导入数据 data.openfolder = 打开数据文件夹 @@ -278,24 +289,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 +345,7 @@ editor.generation = 筛选器: editor.ingame = 游戏内编辑 editor.publish.workshop = 上传到创意工坊 editor.newmap = 新地图 +editor.center = 居中 workshop = 创意工坊 waves.title = 波数 waves.remove = 移除 @@ -335,9 +353,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 +364,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 +378,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 +391,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 +434,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 +460,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 +477,8 @@ load = 载入游戏 save = 保存 fps = 帧数:{0} ping = 延迟:{0}毫秒 +memory = 内存: {0}mb +memory2 = 内存:\n {0}mb +\n {1}mb language.restart = 为了使语言设置生效请重启游戏。 settings = 设置 tutorial = 教程 @@ -469,33 +492,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 +522,77 @@ 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使用尖刀和爬行者单位来摧毁两个核心。 settings.language = 语言 settings.data = 游戏数据 @@ -558,65 +606,99 @@ 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 = 可飞行 + +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 +706,11 @@ 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.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[已达单位上限] bar.liquid = 液体 bar.heat = 热量 bar.power = 电力 @@ -635,19 +718,26 @@ 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.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 +745,32 @@ 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 +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.flow.name = 显示资源传送速度[scarlet] +setting.backgroundpause.name = 在背景中暂停 setting.buildautopause.name = 自动暂停建造 -setting.mapcenter.name = 地图自动居中 setting.animatedwater.name = 流动的水 setting.animatedshields.name = 动态画面 setting.antialias.name = 抗锯齿 @@ -707,24 +798,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 = 游戏公开可见 @@ -743,25 +832,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 +877,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 = 控制台 @@ -822,13 +913,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 +931,37 @@ 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.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 = 沙 @@ -874,84 +969,70 @@ 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 = 冷冻液 -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 +1043,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 +1060,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 +1087,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 +1096,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 +1111,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,13 +1118,12 @@ 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.cryofluidmixer.name = 冷冻液混合器 +block.cryofluid-mixer.name = 冷冻液混合器 block.melter.name = 熔炉 block.incinerator.name = 焚化炉 block.spore-press.name = 孢子压缩机 @@ -1075,21 +1155,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 +1182,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 +1195,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 +1236,245 @@ 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. -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.cryofluidmixer.description = 将水和细的钛粉混成冷却液。钍反应堆的必备之物。 -block.blast-mixer.description = 用油料将硫转化为不易燃但更具爆炸性的爆炸化合物。 -block.pyratite-mixer.description = 将煤、铅和沙子混合成高度易燃的硫。 -block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔弹药。 -block.separator.description = 从矿渣中提取有用的矿物。 -block.spore-press.description = 以极高压力压缩孢子荚合成油料。 -block.pulverizer.description = 将废料碾成沙。 -block.coal-centrifuge.description = 使石油凝固成煤块。 -block.incinerator.description = 用来接收并除掉多余的物品或液体。 +block.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.thermal-pump.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 = 保护终代核心。可构建结构。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index ae572fdb39..77a37663b1 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,17 @@ be.ignore = 忽略 be.noupdates = 沒有新的更新。 be.check = 檢查是否有新的更新 +mod.featured.dialog.title = 模組瀏覽器 (尚未完成) +mods.browser.selected = 已選模組 +mods.browser.add = 安裝 +mods.github.open = 查看 + schematic = 藍圖 -schematic.add = 儲存藍圖... +schematic.add = 儲存藍圖…… schematics = 藍圖 schematic.replace = 相同名稱的藍圖已經存在。是否取代它? schematic.exists = 相同名稱的藍圖已經存在。 -schematic.import = 匯入藍圖... +schematic.import = 匯入藍圖…… schematic.exportfile = 匯出檔案 schematic.importfile = 匯入檔案 schematic.browseworkshop = 瀏覽工作坊 @@ -51,11 +59,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 +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 = 選擇關卡 @@ -91,23 +101,22 @@ 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.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多臭蟲[]。\n請到Mindustry GitHub或Discord報告發現的任何問題。 mods = 模組 mods.none = [lightgray]找不到模組! mods.guide = 模組指南 mods.report = 回報錯誤 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,73 +124,77 @@ 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 +202,20 @@ 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 = 沒有玩家被封禁! +invalidid = 無效的客戶端 ID!請遞交錯誤回報。 +server.bans = 封鎖 +server.bans.none = 沒有玩家被封鎖! server.admins = 管理員 server.admins.none = 找不到管理員! server.add = 新增伺服器 @@ -207,29 +225,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 +264,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 +286,113 @@ cancel = 取消 openlink = 開啟連結 copylink = 複製連結 back = 返回 +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}][]繼續建造 +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.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 = 這是圖片檔,而非地圖。不要試圖修改副檔名讓它可以使用。\n\n如果要匯入地形圖片檔,請使用編輯器中的「匯入地形圖片檔」按鈕。 +editor.errorlegacy = 此地圖太舊,並使用不支援的舊地圖格式。 +editor.errornot = 這不是地圖檔。 +editor.errorheader = 此地圖檔無效或已損毀。 editor.errorname = 地圖沒有定義名稱。 editor.update = 更新 editor.randomize = 隨機化 @@ -372,23 +402,23 @@ 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.exportfile.description = 匯出地圖檔 +editor.exportimage = 匯出地形圖片檔 +editor.exportimage.description = 匯出地形圖片檔 +editor.loadimage = 載入圖片 +editor.saveimage = 儲存圖片 editor.unsaved = [scarlet]尚未儲存變更![]\n您確定要退出嗎? editor.resizemap = 調整地圖大小 editor.mapname = 地圖名稱: @@ -404,18 +434,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 +471,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 +487,246 @@ 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生產海上單位。盡速摧毀敵人。研究該發射建築。 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.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 = 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.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 +734,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.homing = [stat]追踪 -bullet.shock = [stat]電擊 +bullet.sapping = [stat]吸血 +bullet.homing = [stat]追蹤 +bullet.shock = [stat]震懾 bullet.frag = [stat]破片彈 +bullet.buildingdamage = [stat]{0}%[lightgray] 建築傷害 bullet.knockback = [stat]{0}[lightgray]擊退 +bullet.pierce = [stat]{0}[lightgray]×穿刺 +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,43 +762,45 @@ 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.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](需要重啟遊戲)[] -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 +816,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 +832,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 +897,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,13 +934,14 @@ mode.custom = 自訂規則 rules.infiniteresources = 無限資源 rules.reactorexplosions = 反應爐爆炸 +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 = 單位傷害倍數 @@ -838,8 +951,8 @@ 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 +960,21 @@ 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.sector.name = 地區 + item.copper.name = 銅 item.lead.name = 鉛 item.coal.name = 煤炭 @@ -870,7 +987,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 +996,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 +1077,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 +1108,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 +1132,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,13 +1139,12 @@ 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.pulverizer.name = 粉碎機 -block.cryofluidmixer.name = 冷凍液混合器 +block.cryofluid-mixer.name = 冷凍液混合器 block.melter.name = 熔爐 block.incinerator.name = 焚化爐 block.spore-press.name = 孢子壓縮機 @@ -1061,7 +1162,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 +1172,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 +1216,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,66 +1257,93 @@ 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.cryofluidmixer.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 = 無限輸出物品。僅限沙盒。 @@ -1232,16 +1368,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 +1390,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 +1398,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 +1440,65 @@ 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 = 抵禦敵軍對核心:核子的攻擊。建造建築物。 diff --git a/core/assets/contributors b/core/assets/contributors index 0a76529fe7..9e0676f107 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 @@ -94,4 +95,21 @@ Summet 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 \ No newline at end of file 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 e5778f6442..008fb1289a 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -62,7 +62,7 @@ 63674=plastanium-compressor|block-plastanium-compressor-medium 63673=phase-weaver|block-phase-weaver-medium 63672=alloy-smelter|block-alloy-smelter-medium -63671=cryofluidmixer|block-cryofluidmixer-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 @@ -311,3 +311,10 @@ 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 +63420=space|block-space-medium +63419=legacy-unit-factory-air|block-legacy-unit-factory-air-medium +63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium +63417=interplanetary-accelerator|block-interplanetary-accelerator-medium +63416=basalt-boulder|block-basalt-boulder-medium 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..d63ca28bf9 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..1ba2e25ceb 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/stainedMountains.msav b/core/assets/maps/stainedMountains.msav index c627b0917e..b5ec28c9d4 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..04055ac8b7 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 5b9dbe5ee4..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..368ebff42d 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -1,28 +1,46 @@ "use strict"; -const log = function(context, obj){ - Vars.mods.getScripts().log(context, String(obj)) +function log(context, obj){ + Vars.mods.scripts.log(context, String(obj)) } -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 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); + +let scriptName = "base.js" +let modName = "none" const print = text => log(modName + "/" + scriptName, text); -const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, name) +//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 } -const extend = function(classType, params){ - return new JavaAdapter(classType, params) -} +//For backwards compatibility, use extend instead +const extendContent = extend; -//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 +50,5 @@ 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 diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 7d395c8378..92a7fd5562 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -2,29 +2,47 @@ "use strict"; -const log = function(context, obj){ - Vars.mods.getScripts().log(context, String(obj)) +function log(context, obj){ + Vars.mods.scripts.log(context, String(obj)) } -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 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); + +let scriptName = "base.js" +let modName = "none" const print = text => log(modName + "/" + scriptName, text); -const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, name) +//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 } -const extend = function(classType, params){ - return new JavaAdapter(classType, params) -} +//For backwards compatibility, use extend instead +const extendContent = extend; -//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,7 +52,7 @@ 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 importPackage(Packages.arc) @@ -68,6 +86,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) @@ -82,6 +101,7 @@ importPackage(Packages.mindustry.maps.generators) importPackage(Packages.mindustry.maps.planet) importPackage(Packages.mindustry.net) importPackage(Packages.mindustry.type) +importPackage(Packages.mindustry.type.weather) importPackage(Packages.mindustry.ui) importPackage(Packages.mindustry.ui.dialogs) importPackage(Packages.mindustry.ui.fragments) @@ -108,7 +128,6 @@ importPackage(Packages.mindustry.world.draw) importPackage(Packages.mindustry.world.meta) importPackage(Packages.mindustry.world.meta.values) importPackage(Packages.mindustry.world.modules) -importPackage(Packages.mindustry.world.producers) const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent const PlayerUnbanEvent = Packages.mindustry.game.EventType.PlayerUnbanEvent @@ -118,6 +137,7 @@ const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent +const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent const BlockDestroyEvent = Packages.mindustry.game.EventType.BlockDestroyEvent const BuildSelectEvent = Packages.mindustry.game.EventType.BuildSelectEvent @@ -128,6 +148,9 @@ const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent 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 const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent @@ -135,10 +158,14 @@ 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 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 @@ -154,7 +181,6 @@ const SaveLoadEvent = Packages.mindustry.game.EventType.SaveLoadEvent const MapPublishEvent = Packages.mindustry.game.EventType.MapPublishEvent const MapMakeEvent = Packages.mindustry.game.EventType.MapMakeEvent const ResizeEvent = Packages.mindustry.game.EventType.ResizeEvent -const LaunchEvent = Packages.mindustry.game.EventType.LaunchEvent const LoseEvent = Packages.mindustry.game.EventType.LoseEvent const WinEvent = Packages.mindustry.game.EventType.WinEvent const Trigger = Packages.mindustry.game.EventType.Trigger diff --git a/core/assets/shaders/atmosphere.frag b/core/assets/shaders/atmosphere.frag index cbb7c4ea21..f5f437f298 100644 --- a/core/assets/shaders/atmosphere.frag +++ b/core/assets/shaders/atmosphere.frag @@ -27,12 +27,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 +43,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 +55,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 +76,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 +115,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..fe877e873b 100644 --- a/core/assets/shaders/blockbuild.frag +++ b/core/assets/shaders/blockbuild.frag @@ -1,6 +1,5 @@ uniform sampler2D u_texture; -uniform vec4 u_color; uniform vec2 u_texsize; uniform vec2 u_uv; uniform vec2 u_uv2; @@ -24,7 +23,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 +37,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/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..e7f4ee1016 100644 --- a/core/assets/shaders/water.frag +++ b/core/assets/shaders/water.frag @@ -34,4 +34,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/pew_.ogg b/core/assets/sounds/pew_.ogg new file mode 100644 index 0000000000..0c1df7f711 Binary files /dev/null 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 18fd2094e7..0000000000 Binary files a/core/assets/sprites/block_colors.png and /dev/null differ diff --git a/core/assets/sprites/fallback/sprites.atlas b/core/assets/sprites/fallback/sprites.atlas deleted file mode 100644 index f4ce4cf94b..0000000000 --- a/core/assets/sprites/fallback/sprites.atlas +++ /dev/null @@ -1,20810 +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 -core-silo - rotate: false - xy: 195, 1466 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -launch-pad - rotate: false - xy: 1565, 1467 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large - rotate: false - xy: 725, 363 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -launch-pad-light - rotate: false - xy: 1663, 1467 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector - rotate: false - xy: 1349, 773 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector-top - rotate: false - xy: 1349, 675 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome - rotate: false - xy: 1561, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-top - rotate: false - xy: 1463, 1173 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-loader - rotate: false - xy: 1055, 479 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader - rotate: false - xy: 1157, 969 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mass-driver-base - rotate: false - xy: 1663, 1369 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor - rotate: false - xy: 1659, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-edge - rotate: false - xy: 1561, 1173 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-top - rotate: false - xy: 1757, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-top - rotate: false - xy: 1757, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router - rotate: false - xy: 1659, 1173 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-edge - rotate: false - xy: 1757, 1173 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-over - rotate: false - xy: 1353, 1075 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 335, 571 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 335, 441 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 325, 311 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 325, 181 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -laser-drill - rotate: false - xy: 1349, 89 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rim - rotate: false - xy: 1271, 1467 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rotator - rotate: false - xy: 1369, 1467 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-top - rotate: false - xy: 1467, 1467 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor - rotate: false - xy: 1267, 1173 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-liquid - rotate: false - xy: 1365, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-rotator - rotate: false - xy: 1463, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-top - rotate: false - xy: 1365, 1173 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -place-arrow - rotate: false - xy: 1353, 977 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-bottom - rotate: false - xy: 1761, 1467 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-liquid - rotate: false - xy: 1271, 1369 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-top - rotate: false - xy: 1369, 1369 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 1447, 879 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hyper-processor - rotate: false - xy: 1349, 381 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-display - rotate: false - xy: 1467, 1369 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large - rotate: false - xy: 957, 437 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large-top - rotate: false - xy: 957, 339 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator - rotate: false - xy: 1251, 773 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-liquid - rotate: false - xy: 1251, 675 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-top - rotate: false - xy: 1251, 577 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -impact-reactor - rotate: false - xy: 725, 1273 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 725, 1143 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 725, 1013 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 725, 883 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 725, 753 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 725, 623 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 725, 493 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 1745, 977 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 1447, 781 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-lights - rotate: false - xy: 1545, 879 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-top - rotate: false - xy: 1447, 683 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter - rotate: false - xy: 957, 633 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-top - rotate: false - xy: 957, 535 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-mixer - rotate: false - xy: 1747, 51 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 1059, 969 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -coal-centrifuge - rotate: false - xy: 1899, 228 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -disassembler - rotate: false - xy: 1251, 479 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-liquid - rotate: false - xy: 1251, 381 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-spinner - rotate: false - xy: 1251, 283 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 1761, 1369 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible - rotate: false - xy: 1647, 977 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible-top - rotate: false - xy: 1745, 1075 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -container - rotate: false - xy: 1965, 240 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team - rotate: false - xy: 1965, 174 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 465, 571 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 465, 441 - 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: 1153, 773 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team - rotate: false - xy: 1153, 675 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 1545, 781 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team - rotate: false - xy: 1643, 879 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 1827, 132 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-3 - rotate: false - xy: 957, 241 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 325, 51 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 585, 193 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple-heat - rotate: false - xy: 1451, 977 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor - rotate: false - xy: 957, 927 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor-top - rotate: false - xy: 957, 829 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory - rotate: false - xy: 957, 731 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 1965, 306 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -factory-in-3 - rotate: false - xy: 1251, 185 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-5 - rotate: false - xy: 163, 8 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-out-3 - rotate: false - xy: 1251, 87 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-out-5 - rotate: false - xy: 389, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-top-3 - rotate: false - xy: 1349, 871 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ground-factory - rotate: false - xy: 1349, 479 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor - rotate: false - xy: 551, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 713, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory - rotate: false - xy: 1267, 1271 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 1385, 1565 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge2 - rotate: false - xy: 1549, 977 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge3 - rotate: false - xy: 1647, 1075 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 1645, 1565 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -circle-end - rotate: false - xy: 855, 1030 - size: 100, 199 - orig: 100, 199 - offset: 0, 0 - index: -1 -large-bomb - rotate: false - xy: 715, 1 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -large-bomb-back - rotate: false - xy: 817, 1 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -laser-end - rotate: false - xy: 1813, 710 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -minelaser-end - rotate: false - xy: 1813, 636 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -parallax-laser-end - rotate: false - xy: 1889, 784 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -arkyid-foot - rotate: false - xy: 1887, 638 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-joint-base - rotate: false - xy: 1807, 564 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-leg-base - rotate: false - xy: 969, 1393 - size: 104, 64 - orig: 104, 64 - offset: 0, 0 - index: -1 -arkyid-outline - rotate: false - xy: 335, 1091 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck0 - rotate: false - xy: 335, 961 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 335, 831 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 335, 701 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -artillery-mount-outline - rotate: false - xy: 1789, 420 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -atrax-outline - rotate: false - xy: 1641, 593 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 1045, 21 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 1135, 21 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 1225, 21 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beam-weapon-outline - rotate: false - xy: 1837, 858 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 1075, 1361 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 1071, 1263 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 465, 1221 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-container-full - rotate: false - xy: 1823, 66 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 465, 1091 - 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: 1071, 1165 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 1879, 570 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 1945, 572 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 1059, 1067 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 1055, 871 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 1055, 773 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 465, 961 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 1919, 874 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 1055, 675 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 1055, 577 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 1055, 381 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 1933, 504 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 465, 831 - 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: 1055, 283 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 1055, 185 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 1933, 438 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 957, 143 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 957, 143 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 1055, 87 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 1055, 87 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 1963, 808 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 1963, 742 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 947, 45 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 1961, 676 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 1928, 961 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 1157, 1067 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 1157, 1067 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 1893, 132 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 1889, 66 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 465, 701 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 1955, 66 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-steam-generator-full - rotate: false - xy: 1861, 426 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 1861, 360 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-vault-full - rotate: false - xy: 1153, 871 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 1927, 372 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 1899, 294 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-outline - rotate: false - xy: 665, 1403 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 829, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 971, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 1113, 1573 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 455, 311 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 455, 181 - 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: 1153, 577 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 1153, 479 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -corvus-foot - rotate: false - xy: 1447, 262 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -corvus-joint-base - rotate: false - xy: 1789, 348 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -toxopid-joint-base - rotate: false - xy: 1789, 348 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 1153, 381 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 1153, 283 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 1153, 185 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 1153, 87 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 1169, 1263 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 1169, 1165 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 1255, 1067 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 1255, 969 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 455, 51 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 595, 1233 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 595, 1103 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 595, 973 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 595, 843 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 595, 713 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 595, 583 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 595, 453 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 173, 1304 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 173, 1142 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 173, 980 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 173, 818 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 173, 656 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 173, 494 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 163, 332 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 163, 170 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cyclone - rotate: false - xy: 1251, 871 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -fortress-leg - rotate: false - xy: 585, 1 - size: 80, 60 - orig: 80, 60 - offset: 0, 0 - index: -1 -fortress-outline - rotate: false - xy: 855, 866 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 855, 784 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 855, 702 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 855, 620 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 1349, 577 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -gamma-outline - rotate: false - xy: 1683, 117 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 1753, 117 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 1863, 494 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1611, 98 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -horizon-outline - rotate: false - xy: 1739, 752 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 1739, 678 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 1733, 604 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 1815, 784 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -large-bullet-mount-outline - rotate: false - xy: 1539, 156 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount-outline - rotate: false - xy: 1173, 1371 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount-outline - rotate: false - xy: 1611, 248 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 1565, 1369 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mega-outline - rotate: false - xy: 855, 314 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck0 - rotate: false - xy: 855, 212 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck1 - rotate: false - xy: 845, 110 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck2 - rotate: false - xy: 969, 1209 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 595, 323 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-outline - rotate: false - xy: 1859, 1434 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 1949, 1434 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 1859, 1331 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 1949, 1331 - 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: 1543, 442 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-outline - rotate: false - xy: 1543, 360 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 1627, 511 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 1625, 429 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 1625, 347 - 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: 1843, 1022 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 1451, 1075 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-outline - rotate: false - xy: 1683, 267 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 1683, 187 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 1755, 267 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 1755, 187 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -scepter-leg - rotate: false - xy: 1255, 1565 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-leg - rotate: false - xy: 1255, 1565 - 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: 1707, 429 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 1515, 1565 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-outline - rotate: false - xy: 1447, 508 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 1545, 606 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 1643, 725 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 1447, 431 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid-foot - rotate: false - xy: 1447, 170 - size: 90, 90 - orig: 90, 90 - offset: 0, 0 - index: -1 -toxopid-leg - rotate: false - xy: 665, 1545 - size: 150, 72 - orig: 150, 72 - offset: 0, 0 - index: -1 -toxopid-outline - rotate: false - xy: 1037, 1715 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 1199, 1715 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 1361, 1695 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 1523, 1695 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 1775, 1565 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 1855, 1265 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 357, 1351 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 957, 1127 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 1609, 28 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 1887, 710 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -unit-mega-full - rotate: false - xy: 957, 1025 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -unit-minke-full - rotate: false - xy: 1855, 1162 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 1707, 347 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 1827, 268 - 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: 1447, 354 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-toxopid-full - rotate: false - xy: 1685, 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: 1905, 1651 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -vault-team-crux - rotate: false - xy: 1447, 585 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team-sharded - rotate: false - xy: 1545, 683 - 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: 931, 1459 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 1045, 1459 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 855, 1345 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 855, 1231 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -arkyid - rotate: false - xy: 499, 1363 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 335, 1221 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -atrax - rotate: false - xy: 1447, 104 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-base - rotate: false - xy: 1681, 51 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -atrax-cell - rotate: false - xy: 1643, 659 - 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: 367, 1619 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -fortress - rotate: false - xy: 969, 1311 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-cell - rotate: false - xy: 855, 948 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -gamma - rotate: false - xy: 1827, 198 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -horizon - rotate: false - xy: 1315, 13 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-cell - rotate: false - xy: 1741, 826 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -mega - rotate: false - xy: 855, 518 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-cell - rotate: false - xy: 855, 416 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -minke - rotate: false - xy: 1447, 1 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-cell - rotate: false - xy: 585, 63 - 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: 1945, 1109 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-base - rotate: false - xy: 1928, 1027 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-cell - rotate: false - xy: 1545, 524 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign-base - rotate: false - xy: 521, 1619 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-cell - rotate: false - xy: 675, 1619 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -risso - rotate: false - xy: 1611, 168 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-cell - rotate: false - xy: 1549, 1075 - 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, 233 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-base - rotate: false - xy: 725, 233 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-cell - rotate: false - xy: 715, 103 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct - rotate: false - xy: 1643, 802 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-cell - rotate: false - xy: 1741, 900 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid - rotate: false - xy: 875, 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: 1791, 492 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -beam-weapon - rotate: false - xy: 1843, 940 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -large-bullet-mount - rotate: false - xy: 1539, 255 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount - rotate: false - xy: 1349, 187 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount - rotate: false - xy: 1537, 57 - 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: 1945, 1191 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -sei-launcher - rotate: false - xy: 1709, 511 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -zenith - rotate: false - xy: 1905, 1537 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-cell - rotate: false - xy: 817, 1459 - 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: 397, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector - rotate: false - xy: 331, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-top - rotate: false - xy: 397, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender - rotate: false - xy: 1887, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-top - rotate: false - xy: 1921, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overdrive-projector - rotate: false - xy: 463, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-top - rotate: false - xy: 529, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shock-mine - rotate: false - xy: 657, 350 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-arrow - rotate: false - xy: 1304, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 761, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-bridge - rotate: false - xy: 795, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-end - rotate: false - xy: 829, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -center - rotate: false - xy: 863, 681 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 1453, 709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 1453, 709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 1491, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 1525, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 1559, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 513, 205 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 1487, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 1521, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 1555, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 1589, 689 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 1623, 689 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 497, 387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 779, 494 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 505, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 813, 494 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 719, 728 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 1749, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 1783, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 1817, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 1851, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 1885, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 889, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 889, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 855, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-0 - rotate: false - xy: 889, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-1 - rotate: false - xy: 847, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-2 - rotate: false - xy: 881, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-3 - rotate: false - xy: 923, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-0 - rotate: false - xy: 923, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-1 - rotate: false - xy: 923, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-2 - rotate: false - xy: 915, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-3 - rotate: false - xy: 949, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-0 - rotate: false - xy: 1649, 887 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-1 - rotate: false - xy: 1683, 887 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-2 - rotate: false - xy: 1643, 853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-3 - rotate: false - xy: 1643, 819 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-0 - rotate: false - xy: 1677, 853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-1 - rotate: false - xy: 1643, 785 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-2 - rotate: false - xy: 1677, 819 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-3 - rotate: false - xy: 1643, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor - rotate: false - xy: 733, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-0 - rotate: false - xy: 661, 418 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-1 - rotate: false - xy: 695, 418 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-2 - rotate: false - xy: 729, 418 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-edge - rotate: false - xy: 767, 460 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-stack - rotate: false - xy: 801, 460 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-1 - rotate: false - xy: 999, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-2 - rotate: false - xy: 957, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-3 - rotate: false - xy: 957, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-0 - rotate: false - xy: 991, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-1 - rotate: false - xy: 957, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-2 - rotate: false - xy: 991, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-3 - rotate: false - xy: 991, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-0 - rotate: false - xy: 1025, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-1 - rotate: false - xy: 1025, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-2 - rotate: false - xy: 1025, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-3 - rotate: false - xy: 983, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-0 - rotate: false - xy: 1017, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-1 - rotate: false - xy: 1005, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-2 - rotate: false - xy: 1005, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-3 - rotate: false - xy: 1039, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-0 - rotate: false - xy: 1039, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-1 - rotate: false - xy: 1051, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-2 - rotate: false - xy: 1073, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-3 - rotate: false - xy: 1073, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cross - rotate: false - xy: 1745, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 133, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -inverted-sorter - rotate: false - xy: 1881, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction - rotate: false - xy: 1751, 649 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overflow-gate - rotate: false - xy: 631, 520 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor - rotate: false - xy: 699, 520 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-arrow - rotate: false - xy: 699, 486 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-bridge - rotate: false - xy: 665, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-end - rotate: false - xy: 699, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router - rotate: false - xy: 865, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter - rotate: false - xy: 725, 350 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -underflow-gate - rotate: false - xy: 1069, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 331, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-liquid - rotate: false - xy: 331, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill - rotate: false - xy: 67, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 133, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 199, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill - rotate: false - xy: 529, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 595, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 1, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor - rotate: false - xy: 265, 365 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 331, 431 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 397, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 463, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 957, 783 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 539, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 1032, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 897, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit - rotate: false - xy: 1338, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 1372, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 1372, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 787, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 821, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 829, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 863, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 897, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 863, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 863, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 863, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 821, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 821, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 821, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 855, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 855, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 855, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction - rotate: false - xy: 1819, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate - rotate: false - xy: 1853, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate-top - rotate: false - xy: 1887, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-bottom - rotate: false - xy: 1887, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-liquid - rotate: false - xy: 1921, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-top - rotate: false - xy: 1921, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump - rotate: false - xy: 533, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-liquid - rotate: false - xy: 1785, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump-liquid - rotate: false - xy: 1785, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-pump-liquid - rotate: false - xy: 1785, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit - rotate: false - xy: 631, 486 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-arrow - rotate: false - xy: 665, 520 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-bridge - rotate: false - xy: 665, 486 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-end - rotate: false - xy: 631, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-cap - rotate: false - xy: 801, 426 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-0 - rotate: false - xy: 835, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-1 - rotate: false - xy: 869, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-2 - rotate: false - xy: 903, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-3 - rotate: false - xy: 937, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-4 - rotate: false - xy: 835, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-0 - rotate: false - xy: 971, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-1 - rotate: false - xy: 971, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-2 - rotate: false - xy: 661, 384 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-4 - rotate: false - xy: 695, 384 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 397, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -logic-processor - rotate: false - xy: 1, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-bank - rotate: false - xy: 265, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell - rotate: false - xy: 1853, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message - rotate: false - xy: 1955, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor - rotate: false - xy: 1989, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch - rotate: false - xy: 965, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch-on - rotate: false - xy: 999, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 1919, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-top - rotate: false - xy: 1953, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 897, 681 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 795, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -diode - rotate: false - xy: 1779, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -diode-arrow - rotate: false - xy: 1813, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator - rotate: false - xy: 1779, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-top - rotate: false - xy: 1813, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node - rotate: false - xy: 869, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 67, 365 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source - rotate: false - xy: 903, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void - rotate: false - xy: 937, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 463, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator-top - rotate: false - xy: 899, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel - rotate: false - xy: 691, 350 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -steam-generator - rotate: false - xy: 331, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-cap - rotate: false - xy: 397, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-top - rotate: false - xy: 463, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine0 - rotate: false - xy: 529, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine1 - rotate: false - xy: 595, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 661, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 1, 101 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-bottom - rotate: false - xy: 67, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-liquid - rotate: false - xy: 133, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-top - rotate: false - xy: 199, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 265, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 1, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 67, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 67, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -incinerator - rotate: false - xy: 1847, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source - rotate: false - xy: 1861, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void - rotate: false - xy: 1751, 683 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 133, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 199, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 199, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-source - rotate: false - xy: 1989, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-void - rotate: false - xy: 1989, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter - rotate: false - xy: 1819, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-weaver - rotate: false - xy: 133, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 199, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 265, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 331, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 397, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulverizer - rotate: false - xy: 729, 384 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-rotator - rotate: false - xy: 763, 392 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 199, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 463, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-liquid - rotate: false - xy: 529, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-spinner - rotate: false - xy: 595, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter - rotate: false - xy: 661, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press - rotate: false - xy: 727, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame0 - rotate: false - xy: 1, 167 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame1 - rotate: false - xy: 67, 233 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame2 - rotate: false - xy: 133, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 199, 365 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 265, 431 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -boulder1 - rotate: false - xy: 1009, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -boulder2 - rotate: false - xy: 1059, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder1 - rotate: false - xy: 1749, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder2 - rotate: false - xy: 1799, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-boulder1 - rotate: false - xy: 933, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-boulder2 - rotate: false - xy: 967, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder1 - rotate: false - xy: 933, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder2 - rotate: false - xy: 967, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-boulder1 - rotate: false - xy: 1593, 723 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-boulder2 - rotate: false - xy: 323, 315 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 779, 528 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 589, 487 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 589, 445 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unloader - rotate: false - xy: 1069, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-center - rotate: false - xy: 1065, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arc-heat - rotate: false - xy: 589, 373 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 1987, 891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hail-heat - rotate: false - xy: 457, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -lancer-heat - rotate: false - xy: 331, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-heat - rotate: false - xy: 595, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-left - rotate: false - xy: 661, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 1, 233 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-heat - rotate: false - xy: 797, 358 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 595, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rally-point - rotate: false - xy: 265, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-base - rotate: false - xy: 831, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 331, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall - rotate: false - xy: 1677, 785 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 67, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door - rotate: false - xy: 1745, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 199, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 265, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-open - rotate: false - xy: 1779, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall - rotate: false - xy: 733, 486 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 67, 431 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall - rotate: false - xy: 767, 426 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 463, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large1 - rotate: false - xy: 133, 365 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 199, 431 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 265, 497 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 331, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall2 - rotate: false - xy: 831, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall3 - rotate: false - xy: 865, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall4 - rotate: false - xy: 899, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall5 - rotate: false - xy: 899, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall - rotate: false - xy: 931, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 727, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall - rotate: false - xy: 965, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 67, 167 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titanium-wall - rotate: false - xy: 1035, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 133, 233 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 1615, 971 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 1669, 971 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -casing - rotate: false - xy: 531, 403 - size: 8, 16 - orig: 8, 16 - offset: 0, 0 - index: -1 -circle-mid - rotate: false - xy: 1103, 234 - size: 1, 199 - orig: 1, 199 - offset: 0, 0 - index: -1 -error - rotate: false - xy: 943, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -laser - rotate: false - xy: 853, 909 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -minelaser - rotate: false - xy: 127, 117 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -missile - rotate: false - xy: 589, 407 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 437, 201 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -parallax-laser - rotate: false - xy: 193, 183 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -particle - rotate: false - xy: 779, 570 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -scale_marker - rotate: false - xy: 61, 95 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -shell - rotate: false - xy: 475, 201 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 433, 163 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -transfer - rotate: false - xy: 1377, 917 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -transfer-arrow - rotate: false - xy: 1035, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white - rotate: false - xy: 1406, 720 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -alpha-outline - rotate: false - xy: 1823, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 1873, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 1923, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 1973, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -arc - rotate: false - xy: 471, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arkyid-leg - rotate: false - xy: 265, 307 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -artillery-outline - rotate: false - xy: 1549, 909 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -atrax-foot - rotate: false - xy: 415, 7 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -atrax-joint - rotate: false - xy: 2021, 897 - size: 26, 26 - orig: 26, 26 - offset: 0, 0 - index: -1 -atrax-leg - rotate: false - xy: 1453, 743 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-leg-base - rotate: false - xy: 399, 211 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -beta-outline - rotate: false - xy: 67, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 61, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 133, 133 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 199, 199 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 889, 783 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-full - rotate: false - xy: 923, 783 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-boulder-full - rotate: false - xy: 859, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 991, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 1025, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 1059, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 1059, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 627, 411 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-boulder-full - rotate: false - xy: 909, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-full - rotate: false - xy: 471, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-full - rotate: false - xy: 505, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 467, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 467, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-full - rotate: false - xy: 501, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-full - rotate: false - xy: 501, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-full - rotate: false - xy: 499, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 623, 373 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 1411, 695 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 1445, 675 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 1479, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 1513, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 1547, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-full - rotate: false - xy: 1581, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 1615, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 1649, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 539, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 727, 797 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-full - rotate: false - xy: 726, 763 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 753, 729 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 760, 763 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 794, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 828, 775 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 794, 741 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 828, 741 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 862, 749 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 896, 749 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 930, 749 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 862, 715 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 896, 715 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-full - rotate: false - xy: 930, 715 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 964, 741 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 998, 741 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-full - rotate: false - xy: 1032, 741 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 964, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 998, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 998, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 1066, 733 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 1100, 733 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-full - rotate: false - xy: 1066, 699 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 1100, 699 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-full - rotate: false - xy: 959, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 1134, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-full - rotate: false - xy: 1168, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 737, 562 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 1202, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-wall-full - rotate: false - xy: 1134, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 1168, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-full - rotate: false - xy: 1202, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 1236, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 1270, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 1270, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -container-team-crux - rotate: false - xy: 1, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team-sharded - rotate: false - xy: 1, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -corvus-joint - rotate: false - xy: 727, 831 - size: 60, 60 - orig: 60, 60 - offset: 0, 0 - index: -1 -corvus-leg - rotate: false - xy: 2017, 821 - size: 30, 68 - orig: 30, 68 - offset: 0, 0 - index: -1 -corvus-leg-base - rotate: false - xy: 2017, 755 - size: 30, 64 - orig: 30, 64 - offset: 0, 0 - index: -1 -cracks-1-0 - rotate: false - xy: 1677, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 1711, 853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 1711, 819 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 1711, 785 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 1711, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 1745, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 1745, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 1779, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 1, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 67, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 133, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 1, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 67, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 133, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 199, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 1, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -crawler-leg - rotate: false - xy: 1259, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-outline - rotate: false - xy: 1309, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 1599, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 1649, 921 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 1699, 921 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 1949, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-outline - rotate: false - xy: 1999, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 843, 859 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 839, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 893, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 1813, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -eruption-outline - rotate: false - xy: 1043, 859 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flamethrower-outline - rotate: false - xy: 1193, 859 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flare-outline - rotate: false - xy: 1293, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 1093, 817 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 1143, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 1193, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 1847, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -heal-shotgun-weapon-outline - rotate: false - xy: 1293, 817 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount-outline - rotate: false - xy: 1393, 871 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-outline - rotate: false - xy: 1443, 871 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 505, 463 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 1847, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 931, 613 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 2031, 737 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1393, 821 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 505, 421 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 1915, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 957, 511 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 1359, 949 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1443, 821 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 547, 471 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 1881, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 2023, 999 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 719, 710 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1493, 859 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 547, 429 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 1949, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 862, 783 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 761, 655 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1543, 859 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 1243, 725 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 1915, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 795, 613 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 983, 485 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1493, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 1285, 725 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 1983, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 1657, 691 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 2023, 981 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1543, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 1327, 725 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 1949, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 1005, 409 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 551, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 117, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 1369, 725 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 1949, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 1035, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 1359, 931 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 111, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 1411, 729 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 1983, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 2023, 695 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 569, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 183, 133 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 373, 281 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 1691, 717 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 2023, 669 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 737, 710 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 167, 83 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 415, 281 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 1759, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 2023, 643 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 755, 711 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 167, 33 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 457, 281 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 1827, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 2023, 617 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 587, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 217, 83 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 399, 239 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 1929, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 761, 805 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 1059, 681 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 217, 33 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 441, 239 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 1997, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 1717, 895 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 1059, 663 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 249, 199 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 483, 239 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 1717, 683 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 499, 281 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 1077, 681 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 259, 249 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 753, 612 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 1717, 649 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 1033, 681 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 1095, 681 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 233, 149 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 265, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-artillery-outline - rotate: false - xy: 1593, 773 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-weapon-outline - rotate: false - xy: 299, 199 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 737, 520 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 1785, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 1065, 307 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 1077, 663 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 267, 99 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 455, 405 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 1853, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 1033, 655 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 1113, 681 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 267, 49 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 571, 529 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 1955, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 499, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 1095, 663 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 333, 149 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 547, 387 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 535, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 525, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 1113, 663 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 317, 99 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 265, 761 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-outline - rotate: false - xy: 331, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 397, 893 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 463, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 1, 431 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -missiles-mount-outline - rotate: false - xy: 367, 49 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-outline - rotate: false - xy: 455, 447 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 521, 513 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 893, 817 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 943, 817 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon-outline - rotate: false - xy: 1043, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon-outline - rotate: false - xy: 1143, 759 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 1243, 767 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-outline - rotate: false - xy: 529, 571 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 595, 637 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 661, 704 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 919, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 1, 365 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-outline - rotate: false - xy: 1093, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 1151, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 1209, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 1267, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-leg - rotate: false - xy: 133, 431 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulsar-outline - rotate: false - xy: 1, 51 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 1, 1 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 67, 117 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 133, 183 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 797, 392 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 529, 827 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 67, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scepter-weapon-outline - rotate: false - xy: 1441, 921 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 763, 358 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 397, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -small-basic-weapon-outline - rotate: false - xy: 1393, 771 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon-outline - rotate: false - xy: 1493, 759 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-foot - rotate: false - xy: 367, 1 - size: 46, 46 - orig: 46, 46 - offset: 0, 0 - index: -1 -spiroct-joint - rotate: false - xy: 1001, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spiroct-leg - rotate: false - xy: 267, 13 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-leg-base - rotate: false - xy: 317, 13 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-weapon-outline - rotate: false - xy: 389, 373 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 1001, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 759, 324 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 567, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 931, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 793, 324 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 827, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 861, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 895, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 929, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 963, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 997, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 1031, 307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 793, 959 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 349, 199 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 383, 149 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 373, 323 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 417, 99 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 417, 49 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 199, 299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 423, 323 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 1499, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 1557, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 199, 249 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 529, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-missiles-outline - rotate: false - xy: 687, 554 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 1813, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 1881, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 1847, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 1915, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 1881, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 1949, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 1915, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 1983, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 1983, 789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 1657, 717 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 1725, 717 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 1793, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 1895, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 1963, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 1683, 683 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 1683, 649 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 1785, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 1819, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 1955, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 535, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 1131, 696 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 661, 762 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 1723, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 1773, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta - rotate: false - xy: 793, 859 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-cell - rotate: false - xy: 789, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler - rotate: false - xy: 1109, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 1159, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 1209, 917 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 1849, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 1899, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare - rotate: false - xy: 1243, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-base - rotate: false - xy: 1, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 331, 373 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mace - rotate: false - xy: 67, 563 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 133, 629 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 199, 695 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mono - rotate: false - xy: 661, 654 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-cell - rotate: false - xy: 653, 604 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 397, 439 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 1193, 759 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 463, 505 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 977, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 1035, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 1325, 967 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 793, 909 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 1293, 767 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 859, 975 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -vanguard - rotate: false - xy: 711, 654 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -vanguard-cell - rotate: false - xy: 703, 604 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -artillery - rotate: false - xy: 1499, 909 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -eruption - rotate: false - xy: 993, 859 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 1093, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 1143, 859 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 1243, 817 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 1343, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 1343, 817 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 1593, 841 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-weapon - rotate: false - xy: 283, 149 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles - rotate: false - xy: 317, 49 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles-mount - rotate: false - xy: 367, 99 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon - rotate: false - xy: 993, 809 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 1093, 767 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scepter-weapon - rotate: false - xy: 1383, 921 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -small-basic-weapon - rotate: false - xy: 1343, 767 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 1443, 771 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 1543, 759 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 309, 249 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 587, 579 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 637, 554 - 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, 743 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory-icon-editor - rotate: false - xy: 1717, 905 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-icon-editor - rotate: false - xy: 711, 743 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-icon-editor - rotate: false - xy: 2011, 969 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-icon-editor - rotate: false - xy: 1751, 665 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt-icon-editor - rotate: false - xy: 1793, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt1 - rotate: false - xy: 1793, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-icon-editor - rotate: false - xy: 2011, 935 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large-icon-editor - rotate: false - xy: 1815, 905 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill-icon-editor - rotate: false - xy: 1, 3 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-mixer-icon-editor - rotate: false - xy: 1103, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border-editor - rotate: false - xy: 1827, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-forge-icon-editor - rotate: false - xy: 809, 743 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-loader-icon-editor - rotate: false - xy: 1913, 905 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader-icon-editor - rotate: false - xy: 227, 261 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -boulder-icon-editor - rotate: false - xy: 1601, 691 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -bridge-conduit-icon-editor - rotate: false - xy: 2011, 901 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-icon-editor - rotate: false - xy: 1861, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char-icon-editor - rotate: false - xy: 2011, 867 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char1 - rotate: false - xy: 2011, 867 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear-editor - rotate: false - xy: 615, 544 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -cliff-icon-editor - rotate: false - xy: 1895, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-editor - rotate: false - xy: 1169, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -combustion-generator-icon-editor - rotate: false - xy: 2011, 833 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -command-center-icon-editor - rotate: false - xy: 1235, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conduit-icon-editor - rotate: false - xy: 1929, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -container-icon-editor - rotate: false - xy: 1301, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conveyor-icon-editor - rotate: false - xy: 1963, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-icon-editor - rotate: false - xy: 131, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large-icon-editor - rotate: false - xy: 1367, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation-icon-editor - rotate: false - xy: 323, 389 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-icon-editor - rotate: false - xy: 613, 841 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-icon-editor - rotate: false - xy: 227, 163 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -craters-icon-editor - rotate: false - xy: 165, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters1 - rotate: false - xy: 165, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cryofluidmixer-icon-editor - rotate: false - xy: 1433, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-icon-editor - rotate: false - xy: 1499, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cyclone-icon-editor - rotate: false - xy: 517, 615 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dacite-boulder-icon-editor - rotate: false - xy: 1601, 641 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-icon-editor - rotate: false - xy: 943, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite1 - rotate: false - xy: 943, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-wall-icon-editor - rotate: false - xy: 1601, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-icon-editor - rotate: false - xy: 1635, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-icon-editor - rotate: false - xy: 1669, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-1 - rotate: false - xy: 1669, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-icon-editor - rotate: false - xy: 1703, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-2 - rotate: false - xy: 1703, 607 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-icon-editor - rotate: false - xy: 977, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-3 - rotate: false - xy: 977, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-icon-editor - rotate: false - xy: 229, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-4 - rotate: false - xy: 229, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-icon-editor - rotate: false - xy: 263, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-5 - rotate: false - xy: 263, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-icon-editor - rotate: false - xy: 423, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-6 - rotate: false - xy: 423, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-icon-editor - rotate: false - xy: 423, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand1 - rotate: false - xy: 423, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-editor - rotate: false - xy: 423, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-icon-editor - rotate: false - xy: 423, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-icon-editor - rotate: false - xy: 423, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-deepwater - rotate: false - xy: 423, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator-icon-editor - rotate: false - xy: 131, 35 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -diode-icon-editor - rotate: false - xy: 327, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-icon-editor - rotate: false - xy: 361, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt1 - rotate: false - xy: 361, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-wall-icon-editor - rotate: false - xy: 1997, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -disassembler-icon-editor - rotate: false - xy: 517, 517 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -distributor-icon-editor - rotate: false - xy: 1565, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-icon-editor - rotate: false - xy: 649, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large-icon-editor - rotate: false - xy: 1631, 807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dune-wall-icon-editor - rotate: false - xy: 683, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -duo-icon-editor - rotate: false - xy: 717, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt2 - rotate: false - xy: 751, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt3 - rotate: false - xy: 785, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char2 - rotate: false - xy: 819, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char3 - rotate: false - xy: 853, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters2 - rotate: false - xy: 887, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters3 - rotate: false - xy: 395, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite2 - rotate: false - xy: 1751, 631 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite3 - rotate: false - xy: 921, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water1 - rotate: false - xy: 1737, 597 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water2 - rotate: false - xy: 1771, 597 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water3 - rotate: false - xy: 1785, 665 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water1 - rotate: false - xy: 1785, 631 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water2 - rotate: false - xy: 1819, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water3 - rotate: false - xy: 1819, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand2 - rotate: false - xy: 955, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand3 - rotate: false - xy: 989, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt2 - rotate: false - xy: 1853, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt3 - rotate: false - xy: 1853, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass1 - rotate: false - xy: 1887, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-icon-editor - rotate: false - xy: 1887, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass2 - rotate: false - xy: 1887, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass3 - rotate: false - xy: 1921, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock1 - rotate: false - xy: 1921, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-editor - rotate: false - xy: 1921, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock2 - rotate: false - xy: 1955, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock3 - rotate: false - xy: 1955, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow1 - rotate: false - xy: 1839, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-editor - rotate: false - xy: 1839, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow2 - rotate: false - xy: 1873, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow3 - rotate: false - xy: 1907, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice1 - rotate: false - xy: 1989, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-editor - rotate: false - xy: 1989, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice2 - rotate: false - xy: 1989, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice3 - rotate: false - xy: 1805, 597 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock1 - rotate: false - xy: 1941, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock-icon-editor - rotate: false - xy: 1941, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock2 - rotate: false - xy: 1975, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock3 - rotate: false - xy: 2009, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor - rotate: false - xy: 1839, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-editor - rotate: false - xy: 1839, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-2 - rotate: false - xy: 1873, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-icon-editor - rotate: false - xy: 1873, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-3 - rotate: false - xy: 1907, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-editor - rotate: false - xy: 1907, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-5 - rotate: false - xy: 1941, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-editor - rotate: false - xy: 1941, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged1 - rotate: false - xy: 1975, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-editor - rotate: false - xy: 1975, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged2 - rotate: false - xy: 2009, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged3 - rotate: false - xy: 425, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss1 - rotate: false - xy: 425, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-editor - rotate: false - xy: 425, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss2 - rotate: false - xy: 425, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss3 - rotate: false - xy: 429, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud1 - rotate: false - xy: 429, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud-icon-editor - rotate: false - xy: 429, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud2 - rotate: false - xy: 1011, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud3 - rotate: false - xy: 1045, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal1 - rotate: false - xy: 457, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal2 - rotate: false - xy: 457, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal3 - rotate: false - xy: 491, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper1 - rotate: false - xy: 457, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper2 - rotate: false - xy: 525, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper3 - rotate: false - xy: 491, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead1 - rotate: false - xy: 457, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead2 - rotate: false - xy: 559, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead3 - rotate: false - xy: 491, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap1 - rotate: false - xy: 525, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap2 - rotate: false - xy: 457, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap3 - rotate: false - xy: 593, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium1 - rotate: false - xy: 491, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium2 - rotate: false - xy: 525, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium3 - rotate: false - xy: 559, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium1 - rotate: false - xy: 491, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium2 - rotate: false - xy: 525, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium3 - rotate: false - xy: 559, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles1 - rotate: false - xy: 593, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles2 - rotate: false - xy: 525, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles3 - rotate: false - xy: 559, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-salt - rotate: false - xy: 593, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-editor - rotate: false - xy: 593, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water1 - rotate: false - xy: 627, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water2 - rotate: false - xy: 627, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water3 - rotate: false - xy: 661, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand1 - rotate: false - xy: 559, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-editor - rotate: false - xy: 559, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand2 - rotate: false - xy: 593, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand3 - rotate: false - xy: 593, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale1 - rotate: false - xy: 627, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-editor - rotate: false - xy: 627, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale2 - rotate: false - xy: 661, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale3 - rotate: false - xy: 695, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-slag - rotate: false - xy: 627, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-icon-editor - rotate: false - xy: 627, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow1 - rotate: false - xy: 661, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow2 - rotate: false - xy: 695, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow3 - rotate: false - xy: 729, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spawn - rotate: false - xy: 661, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss1 - rotate: false - xy: 695, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-icon-editor - rotate: false - xy: 695, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss2 - rotate: false - xy: 729, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss3 - rotate: false - xy: 763, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone1 - rotate: false - xy: 695, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-icon-editor - rotate: false - xy: 695, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone2 - rotate: false - xy: 729, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone3 - rotate: false - xy: 763, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tainted-water - rotate: false - xy: 797, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-icon-editor - rotate: false - xy: 797, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tar - rotate: false - xy: 729, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-icon-editor - rotate: false - xy: 729, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils1 - rotate: false - xy: 763, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils2 - rotate: false - xy: 797, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils3 - rotate: false - xy: 831, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-water - rotate: false - xy: 763, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-icon-editor - rotate: false - xy: 763, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -exponential-reconstructor-icon-editor - rotate: false - xy: 1, 133 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -force-projector-icon-editor - rotate: false - xy: 325, 291 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -fuse-icon-editor - rotate: false - xy: 325, 193 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press-icon-editor - rotate: false - xy: 943, 481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ground-factory-icon-editor - rotate: false - xy: 615, 645 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hail-icon-editor - rotate: false - xy: 797, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hyper-processor-icon-editor - rotate: false - xy: 615, 547 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-wall-icon-editor - rotate: false - xy: 831, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-icon-editor - rotate: false - xy: 865, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-editor - rotate: false - xy: 937, 873 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -incinerator-icon-editor - rotate: false - xy: 797, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -inverted-sorter-icon-editor - rotate: false - xy: 831, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-editor - rotate: false - xy: 865, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-editor - rotate: false - xy: 831, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-editor - rotate: false - xy: 865, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln-icon-editor - rotate: false - xy: 1007, 709 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -lancer-icon-editor - rotate: false - xy: 1007, 643 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-logic-display-icon-editor - rotate: false - xy: 323, 519 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -laser-drill-icon-editor - rotate: false - xy: 713, 645 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-icon-editor - rotate: false - xy: 713, 547 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large-icon-editor - rotate: false - xy: 1067, 873 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -liquid-junction-icon-editor - rotate: false - xy: 865, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-icon-editor - rotate: false - xy: 627, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-source-icon-editor - rotate: false - xy: 661, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-icon-editor - rotate: false - xy: 811, 645 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-void-icon-editor - rotate: false - xy: 695, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-display-icon-editor - rotate: false - xy: 811, 547 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor-icon-editor - rotate: false - xy: 1007, 577 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver-icon-editor - rotate: false - xy: 229, 65 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill-icon-editor - rotate: false - xy: 1009, 511 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-pump-icon-editor - rotate: false - xy: 729, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -meltdown-icon-editor - rotate: false - xy: 1197, 873 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -melter-icon-editor - rotate: false - xy: 763, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -memory-bank-icon-editor - rotate: false - xy: 1103, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell-icon-editor - rotate: false - xy: 797, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mend-projector-icon-editor - rotate: false - xy: 1169, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender-icon-editor - rotate: false - xy: 831, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message-icon-editor - rotate: false - xy: 865, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor-icon-editor - rotate: false - xy: 899, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press-icon-editor - rotate: false - xy: 327, 95 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-icon-editor - rotate: false - xy: 775, 841 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory-icon-editor - rotate: false - xy: 453, 419 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-icon-editor - rotate: false - xy: 551, 419 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-icon-editor - rotate: false - xy: 649, 449 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector-icon-editor - rotate: false - xy: 1235, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overflow-gate-icon-editor - rotate: false - xy: 899, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -parallax-icon-editor - rotate: false - xy: 1301, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -payload-conveyor-icon-editor - rotate: false - xy: 747, 449 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon-editor - rotate: false - xy: 845, 449 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pebbles-icon-editor - rotate: false - xy: 933, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-icon-editor - rotate: false - xy: 899, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-icon-editor - rotate: false - xy: 933, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-icon-editor - rotate: false - xy: 967, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large-icon-editor - rotate: false - xy: 1367, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-icon-editor - rotate: false - xy: 1433, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pine-icon-editor - rotate: false - xy: 1651, 691 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-editor - rotate: false - xy: 1499, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-conveyor-icon-editor - rotate: false - xy: 899, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-icon-editor - rotate: false - xy: 933, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large-icon-editor - rotate: false - xy: 1565, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plated-conduit-icon-editor - rotate: false - xy: 967, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-editor - rotate: false - xy: 1631, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-node-icon-editor - rotate: false - xy: 933, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large-icon-editor - rotate: false - xy: 1697, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source-icon-editor - rotate: false - xy: 967, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void-icon-editor - rotate: false - xy: 967, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-icon-editor - rotate: false - xy: 899, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-icon-editor - rotate: false - xy: 933, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-editor - rotate: false - xy: 1763, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-icon-editor - rotate: false - xy: 967, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point-icon-editor - rotate: false - xy: 1829, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ripple-icon-editor - rotate: false - xy: 1717, 807 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rotary-pump-icon-editor - rotate: false - xy: 1895, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -router-icon-editor - rotate: false - xy: 1001, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator-icon-editor - rotate: false - xy: 1961, 741 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salt-wall-icon-editor - rotate: false - xy: 1001, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo-icon-editor - rotate: false - xy: 1073, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-boulder-icon-editor - rotate: false - xy: 1001, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-wall-icon-editor - rotate: false - xy: 1001, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-editor - rotate: false - xy: 1001, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scatter-icon-editor - rotate: false - xy: 1073, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-icon-editor - rotate: false - xy: 459, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-editor - rotate: false - xy: 1327, 873 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-editor - rotate: false - xy: 1815, 807 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-icon-editor - rotate: false - xy: 493, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-editor - rotate: false - xy: 1139, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -segment-icon-editor - rotate: false - xy: 1139, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-icon-editor - rotate: false - xy: 1205, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-boulder-icon-editor - rotate: false - xy: 459, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-wall-icon-editor - rotate: false - xy: 527, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shock-mine-icon-editor - rotate: false - xy: 459, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-icon-editor - rotate: false - xy: 493, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -silicon-crucible-icon-editor - rotate: false - xy: 1913, 807 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter-icon-editor - rotate: false - xy: 1205, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snow-boulder-icon-editor - rotate: false - xy: 1651, 641 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-icon-editor - rotate: false - xy: 561, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-pine-icon-editor - rotate: false - xy: 1701, 691 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-wall-icon-editor - rotate: false - xy: 493, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-icon-editor - rotate: false - xy: 527, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large-icon-editor - rotate: false - xy: 907, 743 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sorter-icon-editor - rotate: false - xy: 527, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn-icon-editor - rotate: false - xy: 561, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spectre-icon-editor - rotate: false - xy: 1457, 873 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spore-cluster-icon-editor - rotate: false - xy: 1751, 699 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-pine-icon-editor - rotate: false - xy: 1701, 641 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-press-icon-editor - rotate: false - xy: 1271, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-wall-icon-editor - rotate: false - xy: 561, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -steam-generator-icon-editor - rotate: false - xy: 1271, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -stone-wall-icon-editor - rotate: false - xy: 1023, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-tower-icon-editor - rotate: false - xy: 1337, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-icon-editor - rotate: false - xy: 1057, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large-icon-editor - rotate: false - xy: 1337, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -swarmer-icon-editor - rotate: false - xy: 1403, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -switch-icon-editor - rotate: false - xy: 463, 113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils-icon-editor - rotate: false - xy: 463, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tetrative-reconstructor-icon-editor - rotate: false - xy: 323, 713 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -thermal-generator-icon-editor - rotate: false - xy: 1403, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump-icon-editor - rotate: false - xy: 909, 645 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-icon-editor - rotate: false - xy: 909, 547 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-wall-icon-editor - rotate: false - xy: 497, 113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-editor - rotate: false - xy: 1469, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster-icon-editor - rotate: false - xy: 1587, 873 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-editor - rotate: false - xy: 497, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-icon-editor - rotate: false - xy: 531, 113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-editor - rotate: false - xy: 1469, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -underflow-gate-icon-editor - rotate: false - xy: 531, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-icon-editor - rotate: false - xy: 463, 45 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault-icon-editor - rotate: false - xy: 1005, 775 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -water-extractor-icon-editor - rotate: false - xy: 1535, 675 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-icon-editor - rotate: false - xy: 1535, 609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -white-tree-dead-icon-editor - rotate: false - xy: 1, 681 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-icon-editor - rotate: false - xy: 1, 359 - 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: 578, 52 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 549, 52 - 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: 1699, 689 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-additive-reconstructor-small - rotate: false - xy: 2023, 881 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-additive-reconstructor-tiny - rotate: false - xy: 301, 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: 1825, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-air-factory-small - rotate: false - xy: 2023, 855 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-air-factory-tiny - rotate: false - xy: 319, 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, 307 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-alloy-smelter-medium - rotate: false - xy: 1859, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-alloy-smelter-small - rotate: false - xy: 2023, 829 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 1927, 739 - 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, 174 - 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, 803 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 331, 598 - 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: 546, 132 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-armored-conveyor-medium - rotate: false - xy: 1989, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-small - rotate: false - xy: 1043, 179 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 1043, 2 - 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: 451, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-basalt-medium - rotate: false - xy: 1989, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-small - rotate: false - xy: 2010, 655 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-basalt-tiny - rotate: false - xy: 309, 672 - 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: 446, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 651, 265 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 1951, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-large-small - rotate: false - xy: 351, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 1853, 679 - 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: 881, 563 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 377, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 331, 580 - 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: 644, 223 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 915, 563 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 403, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 1061, 2 - 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: 701, 333 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 877, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 1591, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 1342, 93 - 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: 693, 291 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 911, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 1013, 150 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-tiny - rotate: false - xy: 1360, 93 - 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: 693, 249 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-loader-medium - rotate: false - xy: 877, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-loader-small - rotate: false - xy: 549, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-loader-tiny - rotate: false - xy: 1378, 93 - 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: 686, 207 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-unloader-medium - rotate: false - xy: 911, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-unloader-small - rotate: false - xy: 575, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-unloader-tiny - rotate: false - xy: 1396, 93 - 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: 751, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-boulder-medium - rotate: false - xy: 877, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-boulder-small - rotate: false - xy: 1069, 179 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-boulder-tiny - rotate: false - xy: 1414, 93 - 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: 751, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 911, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 1095, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 1432, 93 - 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: 793, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 877, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1121, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 1450, 93 - 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: 751, 452 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 911, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 1147, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 1468, 93 - 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: 793, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliff-medium - rotate: false - xy: 877, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliff-small - rotate: false - xy: 1173, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliff-tiny - rotate: false - xy: 1486, 93 - 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: 835, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 911, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 1199, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 1504, 93 - 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, 410 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1091, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1225, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 1522, 93 - 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, 452 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1125, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 1251, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 1540, 93 - 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: 835, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1159, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 1277, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 1558, 93 - 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, 410 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1193, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 1303, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 1303, 67 - 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, 452 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 1227, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 1329, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 1277, 7 - 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: 835, 410 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 751, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1261, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 1355, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 2014, 785 - 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: 1295, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1381, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 2015, 767 - 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: 793, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 1329, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1407, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 2015, 749 - 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: 835, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 1363, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 1433, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 1321, 76 - 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: 743, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 1397, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1459, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 1339, 75 - 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: 785, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 1431, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 1485, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 1357, 75 - 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-cryofluidmixer-large - rotate: false - xy: 827, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluidmixer-medium - rotate: false - xy: 1465, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-small - rotate: false - xy: 1511, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluidmixer-tiny - rotate: false - xy: 1375, 75 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluidmixer-xlarge - rotate: false - xy: 907, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 735, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 1499, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 1537, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 1393, 75 - 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: 777, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 1533, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 1563, 189 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 1411, 75 - 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: 819, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-boulder-medium - rotate: false - xy: 1567, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-boulder-small - rotate: false - xy: 1095, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-boulder-tiny - rotate: false - xy: 1429, 75 - 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: 735, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-medium - rotate: false - xy: 949, 563 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-small - rotate: false - xy: 1121, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-tiny - rotate: false - xy: 1447, 75 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-wall-large - rotate: false - xy: 777, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-wall-medium - rotate: false - xy: 945, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-small - rotate: false - xy: 1147, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-wall-tiny - rotate: false - xy: 1465, 75 - 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: 819, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 945, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 1173, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1483, 75 - 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: 728, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 945, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 1199, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1501, 75 - 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: 770, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 945, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 1225, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 1519, 75 - 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: 812, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 945, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 1251, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 1537, 75 - 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: 601, 184 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 983, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 1277, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 1555, 75 - 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: 643, 181 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 1017, 571 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 1303, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 1321, 58 - 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: 685, 165 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 1051, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 1329, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 1303, 49 - 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: 727, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 1741, 703 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 1355, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 769, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 1085, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 1381, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 1339, 57 - 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: 1357, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 811, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 1119, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 1407, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 1375, 57 - 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: 501, 83 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 1153, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 1433, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 1393, 57 - 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: 869, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 1187, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 1459, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 1411, 57 - 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: 861, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 1221, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 1485, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 1429, 57 - 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: 861, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-medium - rotate: false - xy: 1255, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-small - rotate: false - xy: 1511, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-tiny - rotate: false - xy: 1447, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dirt-wall-large - rotate: false - xy: 854, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-wall-medium - rotate: false - xy: 1289, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-small - rotate: false - xy: 1537, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-wall-tiny - rotate: false - xy: 1465, 57 - 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: 853, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 1323, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 1563, 163 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 1483, 57 - 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: 903, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 1357, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 1589, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 1501, 57 - 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: 903, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 896, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 1391, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 1589, 149 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 1519, 57 - 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: 1425, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 1617, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 1537, 57 - 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: 895, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dune-wall-medium - rotate: false - xy: 1459, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-small - rotate: false - xy: 1615, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dune-wall-tiny - rotate: false - xy: 1555, 57 - 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: 546, 90 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 1493, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 1615, 149 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 1301, 31 - 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: 938, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-medium - rotate: false - xy: 1527, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-small - rotate: false - xy: 429, 6 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-tiny - rotate: false - xy: 1321, 40 - 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: 937, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 1561, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 455, 6 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 1339, 39 - 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-fuse-large - rotate: false - xy: 821, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 1051, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 519, 15 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 1357, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 695, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 863, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1085, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 481, 6 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 1375, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 101, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 905, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 1119, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1733, 677 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 1393, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 101, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ground-factory-large - rotate: false - xy: 947, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ground-factory-medium - rotate: false - xy: 1153, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-small - rotate: false - xy: 1759, 677 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ground-factory-tiny - rotate: false - xy: 1411, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ground-factory-xlarge - rotate: false - xy: 101, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 989, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 1187, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 601, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 1429, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 101, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 1031, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 1221, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 588, 148 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 1447, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 101, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hyper-processor-large - rotate: false - xy: 1073, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hyper-processor-medium - rotate: false - xy: 1255, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hyper-processor-small - rotate: false - xy: 588, 122 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hyper-processor-tiny - rotate: false - xy: 1465, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hyper-processor-xlarge - rotate: false - xy: 101, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 1115, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 1289, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 588, 96 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 1157, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1323, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 614, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1483, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 101, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1501, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-large - rotate: false - xy: 1199, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-wall-medium - rotate: false - xy: 1357, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-small - rotate: false - xy: 614, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-wall-tiny - rotate: false - xy: 1519, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-xlarge - rotate: false - xy: 101, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 101, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-illuminator-large - rotate: false - xy: 1241, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 1391, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 614, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 1537, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge - rotate: false - xy: 101, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 1283, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 1425, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 640, 155 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 1555, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 231, 608 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 1325, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 1459, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 640, 129 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1853, 661 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 231, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 1367, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1493, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 640, 103 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1871, 671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 745, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 1409, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1527, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 614, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1889, 671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 151, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 1451, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 1561, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 640, 77 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 1907, 671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 151, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 1493, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 1893, 723 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 607, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 1925, 671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 201, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 1535, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 911, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 633, 51 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 1871, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 151, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 1577, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 945, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 627, 25 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 1889, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 201, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-large-logic-display-large - rotate: false - xy: 1619, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-large-logic-display-medium - rotate: false - xy: 1775, 703 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-large-logic-display-small - rotate: false - xy: 666, 139 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-large-logic-display-tiny - rotate: false - xy: 1907, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-large-logic-display-xlarge - rotate: false - xy: 151, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 1661, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1809, 697 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 692, 139 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1925, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 201, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 1703, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 1745, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1843, 697 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 666, 113 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 1943, 658 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 151, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1877, 689 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 666, 87 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1961, 658 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 201, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 1787, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1911, 689 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 692, 113 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 545, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 151, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 1829, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 983, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 692, 87 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 563, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 201, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 1871, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 1017, 537 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 718, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 581, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 151, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 1913, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 979, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 744, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 599, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 201, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-void-large - rotate: false - xy: 1955, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 979, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-void-small - rotate: false - xy: 718, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-void-tiny - rotate: false - xy: 1319, 22 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-void-xlarge - rotate: false - xy: 151, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-display-large - rotate: false - xy: 845, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 1013, 503 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-display-small - rotate: false - xy: 770, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-display-tiny - rotate: false - xy: 1301, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-display-xlarge - rotate: false - xy: 201, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-processor-large - rotate: false - xy: 887, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-processor-medium - rotate: false - xy: 979, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-processor-small - rotate: false - xy: 744, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-processor-tiny - rotate: false - xy: 1337, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-processor-xlarge - rotate: false - xy: 151, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 929, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1013, 469 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 796, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1355, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 201, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 971, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 979, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 770, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1373, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 151, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 1013, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 1013, 435 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 822, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1391, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 201, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 1055, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 979, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 796, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1409, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 201, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 1097, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 1013, 401 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 848, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1427, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 251, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 1139, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 1013, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 822, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1445, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 251, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-bank-large - rotate: false - xy: 1181, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-bank-medium - rotate: false - xy: 1051, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-bank-small - rotate: false - xy: 874, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-bank-tiny - rotate: false - xy: 1463, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-bank-xlarge - rotate: false - xy: 251, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-cell-large - rotate: false - xy: 1223, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-cell-medium - rotate: false - xy: 1047, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-cell-small - rotate: false - xy: 848, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-cell-tiny - rotate: false - xy: 1481, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-cell-xlarge - rotate: false - xy: 251, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 1265, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 1047, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 900, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1499, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 251, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 1307, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 1047, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 874, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1517, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 251, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 1349, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 1047, 368 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 926, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1535, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 251, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 1391, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 1085, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 900, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1553, 21 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 251, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 1433, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 1119, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 952, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1319, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 251, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 1475, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 1153, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 926, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1337, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 251, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 1517, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 1187, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 952, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1355, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 151, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 1559, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 1221, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 718, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1373, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 201, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-micro-processor-large - rotate: false - xy: 1601, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-micro-processor-medium - rotate: false - xy: 1255, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-micro-processor-small - rotate: false - xy: 744, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-micro-processor-tiny - rotate: false - xy: 1391, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-micro-processor-xlarge - rotate: false - xy: 251, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 1643, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 1289, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 770, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1409, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 281, 619 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mud-large - rotate: false - xy: 1685, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mud-medium - rotate: false - xy: 1323, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-small - rotate: false - xy: 796, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mud-tiny - rotate: false - xy: 1427, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mud-xlarge - rotate: false - xy: 281, 569 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 1727, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 1357, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 822, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1445, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 301, 519 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-large - rotate: false - xy: 1769, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-medium - rotate: false - xy: 1391, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-small - rotate: false - xy: 848, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-tiny - rotate: false - xy: 1463, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-xlarge - rotate: false - xy: 301, 469 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-naval-factory-large - rotate: false - xy: 1811, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-naval-factory-medium - rotate: false - xy: 1425, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-naval-factory-small - rotate: false - xy: 874, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-naval-factory-tiny - rotate: false - xy: 1481, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-naval-factory-xlarge - rotate: false - xy: 301, 419 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 1853, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 1459, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 900, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 1499, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 301, 369 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-coal-large - rotate: false - xy: 1895, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-coal-medium - rotate: false - xy: 1493, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-small - rotate: false - xy: 926, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-coal-tiny - rotate: false - xy: 1517, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-coal-xlarge - rotate: false - xy: 301, 319 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-copper-large - rotate: false - xy: 1937, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-copper-medium - rotate: false - xy: 1527, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-small - rotate: false - xy: 952, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-copper-tiny - rotate: false - xy: 1535, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-copper-xlarge - rotate: false - xy: 301, 269 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-lead-large - rotate: false - xy: 859, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-lead-medium - rotate: false - xy: 1561, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-small - rotate: false - xy: 666, 61 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-lead-tiny - rotate: false - xy: 1553, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-lead-xlarge - rotate: false - xy: 301, 219 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-scrap-large - rotate: false - xy: 859, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-scrap-medium - rotate: false - xy: 1081, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-small - rotate: false - xy: 692, 61 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-scrap-tiny - rotate: false - xy: 617, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-scrap-xlarge - rotate: false - xy: 301, 169 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-thorium-large - rotate: false - xy: 901, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-thorium-medium - rotate: false - xy: 1081, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-small - rotate: false - xy: 718, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-thorium-tiny - rotate: false - xy: 635, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-thorium-xlarge - rotate: false - xy: 301, 119 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-titanium-large - rotate: false - xy: 859, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-titanium-medium - rotate: false - xy: 1115, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-small - rotate: false - xy: 744, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-titanium-tiny - rotate: false - xy: 653, 7 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-titanium-xlarge - rotate: false - xy: 301, 69 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-dome-large - rotate: false - xy: 943, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-dome-medium - rotate: false - xy: 1081, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-dome-small - rotate: false - xy: 770, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-dome-tiny - rotate: false - xy: 1979, 646 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-dome-xlarge - rotate: false - xy: 301, 19 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 901, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 1115, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 796, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1943, 640 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 795, 878 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 859, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 1149, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 822, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1961, 640 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 309, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-parallax-large - rotate: false - xy: 985, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-parallax-medium - rotate: false - xy: 1115, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-small - rotate: false - xy: 848, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-parallax-tiny - rotate: false - xy: 1979, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-parallax-xlarge - rotate: false - xy: 309, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-conveyor-large - rotate: false - xy: 943, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-conveyor-medium - rotate: false - xy: 1149, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-conveyor-small - rotate: false - xy: 874, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-conveyor-tiny - rotate: false - xy: 1997, 637 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-conveyor-xlarge - rotate: false - xy: 359, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-router-large - rotate: false - xy: 901, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-router-medium - rotate: false - xy: 1183, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-router-small - rotate: false - xy: 900, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-router-tiny - rotate: false - xy: 2015, 637 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-router-xlarge - rotate: false - xy: 309, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 859, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 1149, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 926, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1997, 619 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 359, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 1027, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 1183, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 952, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 2015, 619 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 409, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 985, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 1217, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 653, 25 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1625, 469 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 359, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 943, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 901, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 1183, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 679, 35 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1625, 451 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 409, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 1217, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 679, 9 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1625, 433 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 459, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 1069, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 1251, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 705, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1625, 415 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 409, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 1027, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 1217, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 731, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 1625, 397 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 459, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 985, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 1251, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 757, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1625, 379 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 509, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-large - rotate: false - xy: 943, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-medium - rotate: false - xy: 1285, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-small - rotate: false - xy: 783, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-tiny - rotate: false - xy: 1625, 361 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-xlarge - rotate: false - xy: 459, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 901, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 1111, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 1251, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 809, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 1625, 343 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 509, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 1285, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 835, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1625, 325 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 559, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large - rotate: false - xy: 1069, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 1319, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-small - rotate: false - xy: 861, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plated-conduit-tiny - rotate: false - xy: 1625, 307 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plated-conduit-xlarge - rotate: false - xy: 509, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 1027, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1285, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 887, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 1625, 289 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 559, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 985, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 943, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1319, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 913, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 1625, 271 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 609, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 1353, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 939, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1625, 253 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 559, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 1153, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 1319, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 705, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 1625, 235 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 609, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 1111, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1353, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 731, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 1637, 131 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 659, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 1069, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 1387, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 757, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 1637, 113 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 609, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 1027, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 1353, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 783, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 1577, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 659, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 985, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 1387, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 809, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1595, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 709, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1195, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 1421, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 835, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1613, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 659, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-resupply-point-large - rotate: false - xy: 1153, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-resupply-point-medium - rotate: false - xy: 1387, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-resupply-point-small - rotate: false - xy: 861, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-resupply-point-tiny - rotate: false - xy: 1576, 87 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-resupply-point-xlarge - rotate: false - xy: 709, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1111, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 1421, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 887, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 1594, 87 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 709, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 1069, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 1455, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 913, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 1612, 87 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 759, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 1027, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 1421, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 939, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 1573, 69 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 759, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 1237, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 1455, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 965, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 1573, 51 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 759, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 1195, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 1489, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 965, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 1591, 69 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-large - rotate: false - xy: 1153, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-wall-medium - rotate: false - xy: 1455, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-small - rotate: false - xy: 979, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-wall-tiny - rotate: false - xy: 1591, 51 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-xlarge - rotate: false - xy: 809, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 809, 778 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 1111, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 1489, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 978, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 1609, 69 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 809, 728 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 1069, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 1523, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 978, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 1609, 51 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 809, 678 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 1279, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 1489, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 978, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 1573, 33 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-large - rotate: false - xy: 1237, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-wall-medium - rotate: false - xy: 1523, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-small - rotate: false - xy: 991, 33 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-wall-tiny - rotate: false - xy: 1591, 33 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-xlarge - rotate: false - xy: 331, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 1195, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 1557, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 991, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 1609, 33 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 331, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 381, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 1153, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 1523, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1005, 124 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 1571, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 381, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 1111, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 1557, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 1004, 98 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 1589, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 431, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 1321, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 1557, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 1004, 72 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 1607, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 431, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 1279, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 1081, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 1031, 124 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 1657, 677 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 481, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 1237, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 1195, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 1115, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 1030, 98 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 1675, 677 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 481, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 1149, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1030, 72 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1656, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 531, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large - rotate: false - xy: 1153, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-segment-medium - rotate: false - xy: 1183, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-segment-small - rotate: false - xy: 1039, 150 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-segment-tiny - rotate: false - xy: 1674, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-segment-xlarge - rotate: false - xy: 531, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1363, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 1217, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1065, 153 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1656, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 581, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1321, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 1251, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1017, 46 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 1674, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 581, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 1279, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 1285, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 1017, 20 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 1693, 671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-large - rotate: false - xy: 1237, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-wall-medium - rotate: false - xy: 1319, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-small - rotate: false - xy: 1043, 46 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-wall-tiny - rotate: false - xy: 1711, 671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-xlarge - rotate: false - xy: 631, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 631, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 1195, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 1353, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 1043, 20 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 1692, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 681, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 1405, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 1387, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 1057, 124 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 1710, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 681, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-crucible-large - rotate: false - xy: 1363, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-crucible-medium - rotate: false - xy: 1421, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-crucible-small - rotate: false - xy: 1056, 98 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-crucible-tiny - rotate: false - xy: 1692, 635 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-crucible-xlarge - rotate: false - xy: 731, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 1321, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 1455, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 1056, 72 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 1710, 635 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 731, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-slag-large - rotate: false - xy: 1279, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 1489, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 1069, 46 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 1627, 69 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge - rotate: false - xy: 781, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-boulder-large - rotate: false - xy: 1237, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-boulder-medium - rotate: false - xy: 1523, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-small - rotate: false - xy: 1069, 20 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-boulder-tiny - rotate: false - xy: 1627, 51 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-boulder-xlarge - rotate: false - xy: 831, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 1447, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 1557, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 1405, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1047, 334 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1091, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1627, 33 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 781, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 1117, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1625, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-large - rotate: false - xy: 1363, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-wall-medium - rotate: false - xy: 1081, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-small - rotate: false - xy: 1143, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-wall-tiny - rotate: false - xy: 1630, 87 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-xlarge - rotate: false - xy: 831, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 351, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 1321, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 1279, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1115, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 1169, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 1621, 624 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 351, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1149, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1195, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1645, 69 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 401, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 1489, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 1183, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1221, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1645, 51 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 351, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 1447, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 1217, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 1247, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 1645, 33 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 401, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 1405, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1251, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 1273, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 1643, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 451, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 1363, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 1285, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 1299, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 1641, 183 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 351, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 1321, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1319, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 1325, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 1641, 165 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 401, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 1531, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 1353, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 1351, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 1729, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 451, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 1489, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 1387, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 1377, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 1747, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 501, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-wall-large - rotate: false - xy: 1447, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-wall-medium - rotate: false - xy: 1421, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-wall-small - rotate: false - xy: 1403, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-wall-tiny - rotate: false - xy: 1765, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-wall-xlarge - rotate: false - xy: 351, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-steam-generator-large - rotate: false - xy: 1405, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-steam-generator-medium - rotate: false - xy: 1455, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-small - rotate: false - xy: 1429, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-steam-generator-tiny - rotate: false - xy: 1783, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-steam-generator-xlarge - rotate: false - xy: 401, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 1363, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1489, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 1455, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 1728, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-large - rotate: false - xy: 1573, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-wall-medium - rotate: false - xy: 1523, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-small - rotate: false - xy: 1481, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-wall-tiny - rotate: false - xy: 1746, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-xlarge - rotate: false - xy: 451, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 501, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 1531, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1557, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1507, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1764, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 551, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 1489, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 1447, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 979, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 1533, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 1782, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 351, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1013, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1559, 137 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1728, 623 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 401, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 1405, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 945, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 1585, 123 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 1746, 623 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 451, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-switch-large - rotate: false - xy: 1615, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-switch-medium - rotate: false - xy: 945, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-switch-small - rotate: false - xy: 1611, 123 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-switch-tiny - rotate: false - xy: 1764, 623 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-switch-xlarge - rotate: false - xy: 501, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 1573, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 979, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 1083, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 1782, 623 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 551, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 1531, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 945, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 1109, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 1801, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 601, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 1489, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 1013, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 1135, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 1819, 653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 351, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-large - rotate: false - xy: 1447, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-medium - rotate: false - xy: 1047, 300 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-small - rotate: false - xy: 1161, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-tiny - rotate: false - xy: 1800, 635 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-xlarge - rotate: false - xy: 401, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 1657, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 979, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 1187, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 1818, 635 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 451, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 1615, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 1013, 265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 1213, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 1800, 617 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 501, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 1573, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1047, 266 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1239, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 1818, 617 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 551, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 1531, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 1489, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1081, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 1265, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 1601, 621 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 601, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 1115, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1291, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 1601, 603 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 651, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 1699, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 1149, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 1317, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 1619, 606 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 351, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 1657, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1183, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 1343, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 1661, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 401, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 1615, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 1573, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1217, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 1369, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 1637, 606 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 451, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1251, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 1395, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 1836, 635 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 501, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-underflow-gate-large - rotate: false - xy: 1531, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-underflow-gate-medium - rotate: false - xy: 1285, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-underflow-gate-small - rotate: false - xy: 1421, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-underflow-gate-tiny - rotate: false - xy: 1836, 617 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-underflow-gate-xlarge - rotate: false - xy: 551, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 1741, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1319, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 1447, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 1629, 588 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 601, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 1699, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 1353, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 1473, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 1629, 570 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 651, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 1657, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1387, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 1499, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 1629, 552 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 701, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 1615, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 1421, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 1525, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 1629, 534 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 351, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 1573, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1455, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1551, 111 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 1629, 516 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 401, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 1783, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 1489, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 1082, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 1629, 498 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 451, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 1741, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 1523, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 1108, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 1647, 588 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 501, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 1395, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 1091, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 1091, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 1129, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 1129, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 1167, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 1167, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-disabled - rotate: false - xy: 1167, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-over-4 - rotate: false - xy: 1205, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 1205, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 1243, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 1281, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 1243, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 1281, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1134, 85 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 1357, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 1319, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 1319, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 1357, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 1557, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 1081, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1115, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 1149, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 1183, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1217, 249 - 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: 1693, 689 - 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: 1395, 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: 1988, 778 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -item-blast-compound-icon - rotate: false - xy: 1251, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-icon - rotate: false - xy: 1285, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-icon - rotate: false - xy: 1319, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-icon - rotate: false - xy: 1353, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-icon - rotate: false - xy: 1387, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-icon - rotate: false - xy: 1421, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-icon - rotate: false - xy: 1455, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-icon - rotate: false - xy: 1489, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-icon - rotate: false - xy: 1523, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-icon - rotate: false - xy: 1557, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-icon - rotate: false - xy: 1047, 232 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-icon - rotate: false - xy: 1081, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-icon - rotate: false - xy: 1115, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-icon - rotate: false - xy: 1149, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-icon - rotate: false - xy: 1183, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-icon - rotate: false - xy: 1217, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-icon - rotate: false - xy: 1251, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-icon - rotate: false - xy: 1285, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-icon - rotate: false - xy: 1319, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-icon - rotate: false - xy: 1353, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-node - rotate: false - xy: 1387, 215 - 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: 1433, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 1433, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 1121, 48 - 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: 1095, 43 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -scroll-knob-vertical-thin - rotate: false - xy: 1854, 619 - size: 12, 40 - orig: 12, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 640, 181 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 543, 115 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 1979, 704 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 1979, 664 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 488, 34 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 309, 866 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 1547, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 1471, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 1471, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 1509, 652 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-white - rotate: false - xy: 1509, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -unit-alpha-large - rotate: false - xy: 1699, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-alpha-medium - rotate: false - xy: 1421, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-alpha-small - rotate: false - xy: 1160, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-alpha-tiny - rotate: false - xy: 1647, 570 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-alpha-xlarge - rotate: false - xy: 551, 366 - 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: 1785, 677 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-antumbra-tiny - rotate: false - xy: 1837, 653 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-antumbra-xlarge - rotate: false - xy: 401, 33 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-arkyid-large - rotate: false - xy: 1657, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-arkyid-medium - rotate: false - xy: 1455, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-arkyid-small - rotate: false - xy: 1147, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-arkyid-tiny - rotate: false - xy: 1647, 552 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-arkyid-xlarge - rotate: false - xy: 601, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-atrax-large - rotate: false - xy: 1615, 692 - size: 40, 29 - orig: 40, 29 - offset: 0, 0 - index: -1 -unit-atrax-medium - rotate: false - xy: 877, 368 - size: 32, 23 - orig: 32, 23 - offset: 0, 0 - index: -1 -unit-atrax-small - rotate: false - xy: 1017, 1 - size: 24, 17 - orig: 24, 17 - offset: 0, 0 - index: -1 -unit-atrax-tiny - rotate: false - xy: 1927, 726 - size: 16, 11 - orig: 16, 11 - offset: 0, 0 - index: -1 -unit-atrax-xlarge - rotate: false - xy: 651, 480 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -unit-beta-large - rotate: false - xy: 1825, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-beta-medium - rotate: false - xy: 1489, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-beta-small - rotate: false - xy: 1186, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-beta-tiny - rotate: false - xy: 1647, 534 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-beta-xlarge - rotate: false - xy: 701, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-bryde-large - rotate: false - xy: 1783, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-bryde-medium - rotate: false - xy: 1523, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-bryde-small - rotate: false - xy: 1173, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-bryde-tiny - rotate: false - xy: 1647, 516 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-bryde-xlarge - rotate: false - xy: 351, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-corvus-large - rotate: false - xy: 1741, 779 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-corvus-medium - rotate: false - xy: 1014, 243 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-corvus-small - rotate: false - xy: 1095, 26 - 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: 401, 183 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-crawler-large - rotate: false - xy: 1699, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-crawler-medium - rotate: false - xy: 1557, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-crawler-small - rotate: false - xy: 1212, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-crawler-tiny - rotate: false - xy: 1647, 498 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-crawler-xlarge - rotate: false - xy: 451, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-large - rotate: false - xy: 1867, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-dagger-medium - rotate: false - xy: 980, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-dagger-small - rotate: false - xy: 1199, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-dagger-tiny - rotate: false - xy: 1643, 480 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-dagger-xlarge - rotate: false - xy: 501, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-large - rotate: false - xy: 1825, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-eclipse-medium - rotate: false - xy: 980, 197 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-eclipse-small - rotate: false - xy: 1238, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-eclipse-tiny - rotate: false - xy: 1643, 462 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-eclipse-xlarge - rotate: false - xy: 551, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-large - rotate: false - xy: 1741, 737 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-flare-medium - rotate: false - xy: 979, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-flare-small - rotate: false - xy: 1225, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-flare-tiny - rotate: false - xy: 1643, 444 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-flare-xlarge - rotate: false - xy: 601, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-large - rotate: false - xy: 1783, 773 - 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: 1121, 27 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-fortress-tiny - rotate: false - xy: 1601, 589 - size: 16, 12 - orig: 16, 12 - offset: 0, 0 - index: -1 -unit-fortress-xlarge - rotate: false - xy: 651, 440 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-gamma-large - rotate: false - xy: 1909, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-gamma-medium - rotate: false - xy: 1945, 710 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-gamma-small - rotate: false - xy: 1121, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-gamma-tiny - rotate: false - xy: 1643, 426 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-gamma-xlarge - rotate: false - xy: 701, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-horizon-large - rotate: false - xy: 1867, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-horizon-medium - rotate: false - xy: 1945, 676 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-horizon-small - rotate: false - xy: 1147, 33 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-horizon-tiny - rotate: false - xy: 1643, 408 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-horizon-xlarge - rotate: false - xy: 351, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mace-large - rotate: false - xy: 1909, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mace-medium - rotate: false - xy: 1595, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mace-small - rotate: false - xy: 1264, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mace-tiny - rotate: false - xy: 1643, 390 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mace-xlarge - rotate: false - xy: 401, 133 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mega-large - rotate: false - xy: 881, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mega-medium - rotate: false - xy: 1595, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mega-small - rotate: false - xy: 1251, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mega-tiny - rotate: false - xy: 1643, 372 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mega-xlarge - rotate: false - xy: 451, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-minke-large - rotate: false - xy: 1585, 639 - size: 34, 40 - orig: 34, 40 - offset: 0, 0 - index: -1 -unit-minke-medium - rotate: false - xy: 1014, 176 - 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: 1639, 624 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-minke-xlarge - rotate: false - xy: 601, 226 - size: 41, 48 - orig: 41, 48 - offset: 0, 0 - index: -1 -unit-mono-large - rotate: false - xy: 881, 597 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mono-medium - rotate: false - xy: 1595, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mono-small - rotate: false - xy: 1147, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mono-tiny - rotate: false - xy: 1643, 354 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mono-xlarge - rotate: false - xy: 501, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-large - rotate: false - xy: 923, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-nova-medium - rotate: false - xy: 1591, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-nova-small - rotate: false - xy: 1173, 33 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-nova-tiny - rotate: false - xy: 1643, 336 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-nova-xlarge - rotate: false - xy: 551, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-oct-large - rotate: false - xy: 965, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-oct-medium - rotate: false - xy: 1591, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-oct-small - rotate: false - xy: 1290, 85 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-oct-tiny - rotate: false - xy: 1643, 318 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-oct-xlarge - rotate: false - xy: 601, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-omura-large - rotate: false - xy: 519, 41 - size: 28, 40 - orig: 28, 40 - offset: 0, 0 - index: -1 -unit-omura-medium - rotate: false - xy: 1277, 25 - size: 22, 32 - orig: 22, 32 - offset: 0, 0 - index: -1 -unit-omura-small - rotate: false - xy: 1643, 292 - size: 16, 24 - orig: 16, 24 - offset: 0, 0 - index: -1 -unit-omura-tiny - rotate: false - xy: 337, 1 - size: 11, 16 - orig: 11, 16 - offset: 0, 0 - index: -1 -unit-omura-xlarge - rotate: false - xy: 1621, 642 - 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: 1591, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-poly-small - rotate: false - xy: 1277, 59 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-poly-tiny - rotate: false - xy: 1643, 274 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-poly-xlarge - rotate: false - xy: 651, 390 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-pulsar-large - rotate: false - xy: 1783, 738 - size: 40, 33 - orig: 40, 33 - offset: 0, 0 - index: -1 -unit-pulsar-medium - rotate: false - xy: 911, 331 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-pulsar-small - rotate: false - xy: 1095, 5 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-pulsar-tiny - rotate: false - xy: 945, 242 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-pulsar-xlarge - rotate: false - xy: 701, 425 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-quad-large - rotate: false - xy: 1825, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quad-medium - rotate: false - xy: 1014, 210 - size: 31, 31 - orig: 31, 31 - offset: 0, 0 - index: -1 -unit-quad-small - rotate: false - xy: 1173, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quad-tiny - rotate: false - xy: 2032, 786 - size: 15, 15 - orig: 15, 15 - offset: 0, 0 - index: -1 -unit-quad-xlarge - rotate: false - xy: 401, 83 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-quasar-large - rotate: false - xy: 1007, 639 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quasar-medium - rotate: false - xy: 1591, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-quasar-small - rotate: false - xy: 1199, 33 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quasar-tiny - rotate: false - xy: 1643, 256 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-quasar-xlarge - rotate: false - xy: 451, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-reign-large - rotate: false - xy: 1657, 695 - 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: 1316, 94 - size: 24, 15 - orig: 24, 15 - offset: 0, 0 - index: -1 -unit-reign-tiny - rotate: false - xy: 963, 245 - size: 15, 10 - orig: 15, 10 - offset: 0, 0 - index: -1 -unit-reign-xlarge - rotate: false - xy: 351, 33 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-risso-large - rotate: false - xy: 1951, 778 - size: 35, 40 - orig: 35, 40 - offset: 0, 0 - index: -1 -unit-risso-medium - rotate: false - xy: 1985, 744 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-risso-small - rotate: false - xy: 1808, 671 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-risso-tiny - rotate: false - xy: 2033, 768 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-risso-xlarge - rotate: false - xy: 501, 125 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-scepter-large - rotate: false - xy: 965, 605 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-scepter-medium - rotate: false - xy: 1591, 323 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-scepter-small - rotate: false - xy: 1199, 12 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-scepter-tiny - rotate: false - xy: 666, 166 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-scepter-xlarge - rotate: false - xy: 501, 175 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-sei-large - rotate: false - xy: 1867, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-sei-medium - rotate: false - xy: 1591, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-sei-small - rotate: false - xy: 1225, 33 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-sei-tiny - rotate: false - xy: 1643, 238 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-sei-xlarge - rotate: false - xy: 551, 216 - 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: 1047, 205 - size: 31, 25 - orig: 31, 25 - offset: 0, 0 - index: -1 -unit-spiroct-small - rotate: false - xy: 1225, 12 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-spiroct-tiny - rotate: false - xy: 1571, 1 - size: 15, 12 - orig: 15, 12 - offset: 0, 0 - index: -1 -unit-spiroct-xlarge - rotate: false - xy: 601, 276 - 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: 781, 682 - size: 26, 32 - orig: 26, 32 - offset: 0, 0 - index: -1 -unit-toxopid-small - rotate: false - xy: 1831, 671 - size: 20, 24 - orig: 20, 24 - offset: 0, 0 - index: -1 -unit-toxopid-tiny - rotate: false - xy: 1079, 2 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-toxopid-xlarge - rotate: false - xy: 1909, 757 - size: 40, 48 - orig: 40, 48 - offset: 0, 0 - index: -1 -unit-vela-large - rotate: false - xy: 1007, 605 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-vela-medium - rotate: false - xy: 1591, 261 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-vela-small - rotate: false - xy: 1251, 38 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-vela-tiny - rotate: false - xy: 1641, 150 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-vela-xlarge - rotate: false - xy: 651, 349 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-zenith-large - rotate: false - xy: 1049, 606 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-zenith-medium - rotate: false - xy: 1591, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-zenith-small - rotate: false - xy: 1251, 12 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-zenith-tiny - rotate: false - xy: 1643, 220 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-zenith-xlarge - rotate: false - xy: 701, 375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wavepane - rotate: false - xy: 1547, 623 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -white-pane - rotate: false - xy: 1951, 820 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 446, 78 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 2010, 681 - 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 5154e3df5c..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 9d666ce306..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 91597bb356..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 85a567199e..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 7bf1907c99..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 31a4d943bb..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 8db8e20e83..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 b83f154c2b..0000000000 --- a/core/assets/sprites/sprites.atlas +++ /dev/null @@ -1,20792 +0,0 @@ - -sprites.png -size: 4096,4096 -format: rgba8888 -filter: nearest,nearest -repeat: none -core-silo - rotate: false - xy: 1501, 1904 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -launch-pad - rotate: false - xy: 3785, 2613 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large - rotate: false - xy: 3263, 2957 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -launch-pad-light - rotate: false - xy: 3883, 2593 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launchpod - rotate: false - xy: 2353, 2434 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -force-projector - rotate: false - xy: 3099, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector-top - rotate: false - xy: 3197, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mend-projector - rotate: false - xy: 2278, 1796 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-top - rotate: false - xy: 2344, 1771 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender - rotate: false - xy: 3685, 2261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-top - rotate: false - xy: 3719, 2261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overdrive-dome - rotate: false - xy: 2903, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-top - rotate: false - xy: 3001, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector - rotate: false - xy: 2410, 1771 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-top - rotate: false - xy: 2419, 2466 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shock-mine - rotate: false - xy: 2928, 1721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-loader - rotate: false - xy: 2013, 232 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader - rotate: false - xy: 1801, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -bridge-arrow - rotate: false - xy: 1724, 2853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 3216, 1977 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-bridge - rotate: false - xy: 3250, 2079 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-end - rotate: false - xy: 3250, 2045 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -center - rotate: false - xy: 3250, 2011 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 1588, 2841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 1588, 2841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 773, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 3793, 2447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 1622, 2841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 2709, 3191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 1053, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 1033, 2609 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 4017, 3587 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 3491, 2211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 1113, 2285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 3487, 2177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 1087, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 1067, 2609 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 4051, 3587 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 3525, 2211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 1113, 2251 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 3521, 2177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 1121, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 1101, 2609 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 3559, 2211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 2868, 1773 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 2758, 1739 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 2792, 1739 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-0 - rotate: false - xy: 2826, 1739 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-1 - rotate: false - xy: 2860, 1739 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-2 - rotate: false - xy: 3827, 2391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-3 - rotate: false - xy: 3861, 2409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-0 - rotate: false - xy: 3895, 2409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-1 - rotate: false - xy: 3929, 2409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-2 - rotate: false - xy: 3861, 2375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-3 - rotate: false - xy: 3895, 2375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-0 - rotate: false - xy: 3929, 2375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-1 - rotate: false - xy: 3963, 2389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-2 - rotate: false - xy: 3997, 2389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-3 - rotate: false - xy: 4031, 2389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-0 - rotate: false - xy: 3963, 2355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-1 - rotate: false - xy: 3997, 2355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-2 - rotate: false - xy: 4031, 2355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-3 - rotate: false - xy: 2013, 2 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor - rotate: false - xy: 3889, 2341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-0 - rotate: false - xy: 3855, 2307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-1 - rotate: false - xy: 3923, 2341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-2 - rotate: false - xy: 3889, 2307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-edge - rotate: false - xy: 3923, 2307 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-stack - rotate: false - xy: 3957, 2321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-1 - rotate: false - xy: 2021, 1557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-2 - rotate: false - xy: 2021, 1523 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-3 - rotate: false - xy: 2021, 1489 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-0 - rotate: false - xy: 2055, 1840 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-1 - rotate: false - xy: 2089, 1840 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-2 - rotate: false - xy: 2055, 1806 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-3 - rotate: false - xy: 2089, 1806 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-0 - rotate: false - xy: 2055, 1772 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-1 - rotate: false - xy: 2055, 1738 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-2 - rotate: false - xy: 2089, 1772 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-3 - rotate: false - xy: 2055, 1704 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-0 - rotate: false - xy: 2089, 1738 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-1 - rotate: false - xy: 2055, 1670 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-2 - rotate: false - xy: 2089, 1704 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-3 - rotate: false - xy: 2055, 1636 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-0 - rotate: false - xy: 2089, 1670 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-1 - rotate: false - xy: 2055, 1602 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-2 - rotate: false - xy: 2089, 1636 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-3 - rotate: false - xy: 2055, 1568 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cross - rotate: false - xy: 1772, 2819 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 3629, 2481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -inverted-sorter - rotate: false - xy: 3250, 1943 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction - rotate: false - xy: 3148, 1811 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mass-driver-base - rotate: false - xy: 2217, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overflow-gate - rotate: false - xy: 3753, 2295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -payload-conveyor - rotate: false - xy: 3099, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-edge - rotate: false - xy: 3197, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-top - rotate: false - xy: 3295, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-top - rotate: false - xy: 3295, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router - rotate: false - xy: 3393, 2611 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-edge - rotate: false - xy: 3491, 2611 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-over - rotate: false - xy: 1755, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -phase-conveyor - rotate: false - xy: 3787, 2277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-arrow - rotate: false - xy: 3821, 2357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-bridge - rotate: false - xy: 3821, 2323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-end - rotate: false - xy: 3821, 2289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router - rotate: false - xy: 3889, 2205 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter - rotate: false - xy: 2996, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -underflow-gate - rotate: false - xy: 2089, 1568 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 3961, 3079 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 1747, 802 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 2973, 3087 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 3103, 3087 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 3761, 2481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-liquid - rotate: false - xy: 3761, 2481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -laser-drill - rotate: false - xy: 1657, 2437 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rim - rotate: false - xy: 1703, 2339 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rotator - rotate: false - xy: 1703, 2241 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-top - rotate: false - xy: 3687, 2613 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill - rotate: false - xy: 2414, 2035 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 2414, 1969 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 2410, 1903 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -oil-extractor - rotate: false - xy: 2511, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-liquid - rotate: false - xy: 2609, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-rotator - rotate: false - xy: 2707, 2647 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-top - rotate: false - xy: 2805, 2631 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pneumatic-drill - rotate: false - xy: 2527, 2268 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 2447, 2202 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 2447, 2136 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor - rotate: false - xy: 2881, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 2947, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 3013, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 3079, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 2978, 2075 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 3148, 2015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 2850, 1909 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 2800, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -place-arrow - rotate: false - xy: 1853, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -bridge-conduit - rotate: false - xy: 1758, 2853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 3216, 2079 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 3216, 2079 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 3216, 2045 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 3216, 2011 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 2808, 1841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 2842, 1841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 2876, 1841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 2766, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 2766, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 2766, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 2834, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 2868, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 2766, 1773 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 2800, 1773 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 2800, 1773 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 2834, 1773 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction - rotate: false - xy: 3072, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate - rotate: false - xy: 3004, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate-top - rotate: false - xy: 3038, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-bottom - rotate: false - xy: 3072, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-liquid - rotate: false - xy: 3106, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-top - rotate: false - xy: 3140, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-bottom - rotate: false - xy: 3981, 2573 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-liquid - rotate: false - xy: 1825, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-top - rotate: false - xy: 1923, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-pump - rotate: false - xy: 3685, 2295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-liquid - rotate: false - xy: 3719, 2329 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump-liquid - rotate: false - xy: 3719, 2329 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-pump-liquid - rotate: false - xy: 3719, 2329 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit - rotate: false - xy: 3753, 2261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-arrow - rotate: false - xy: 3787, 2379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-bridge - rotate: false - xy: 3787, 2345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-end - rotate: false - xy: 3787, 2311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-cap - rotate: false - xy: 4025, 2321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-0 - rotate: false - xy: 3855, 2273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-1 - rotate: false - xy: 3889, 2273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-2 - rotate: false - xy: 3923, 2273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-3 - rotate: false - xy: 3957, 2287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-4 - rotate: false - xy: 3991, 2287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-0 - rotate: false - xy: 3855, 2239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-1 - rotate: false - xy: 3889, 2239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-2 - rotate: false - xy: 3923, 2239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-4 - rotate: false - xy: 3957, 2253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 2476, 1872 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 2049, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hyper-processor - rotate: false - xy: 3491, 2709 - 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: 2021, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor - rotate: false - xy: 2353, 2368 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-bank - rotate: false - xy: 2410, 1837 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell - rotate: false - xy: 3651, 2261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message - rotate: false - xy: 3753, 2363 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor - rotate: false - xy: 3753, 2329 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch - rotate: false - xy: 2021, 1659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch-on - rotate: false - xy: 2021, 1625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 3555, 2177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large - rotate: false - xy: 1877, 820 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large-top - rotate: false - xy: 1975, 918 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-top - rotate: false - xy: 1155, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 3250, 1977 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 2774, 1841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator - rotate: false - xy: 2315, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-liquid - rotate: false - xy: 2413, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-top - rotate: false - xy: 2511, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -diode - rotate: false - xy: 1772, 2785 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -diode-arrow - rotate: false - xy: 1772, 2751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator - rotate: false - xy: 3148, 1947 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-top - rotate: false - xy: 3182, 1947 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor - rotate: false - xy: 2483, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 2613, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 2743, 3071 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 2743, 2941 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 2873, 2957 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 3003, 2957 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 3133, 2957 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -power-node - rotate: false - xy: 4025, 2287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 2513, 2202 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source - rotate: false - xy: 3821, 2255 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void - rotate: false - xy: 3787, 2243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 2476, 1806 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator-top - rotate: false - xy: 3923, 2205 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel - rotate: false - xy: 2962, 1721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 2147, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -steam-generator - rotate: false - xy: 2683, 2383 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-cap - rotate: false - xy: 2749, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-top - rotate: false - xy: 2815, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine0 - rotate: false - xy: 2881, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine1 - rotate: false - xy: 2947, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 3013, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 3211, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 1951, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-lights - rotate: false - xy: 2245, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-top - rotate: false - xy: 2147, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter - rotate: false - xy: 1953, 1016 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-top - rotate: false - xy: 1877, 918 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-mixer - rotate: false - xy: 2278, 1928 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 1985, 722 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -coal-centrifuge - rotate: false - xy: 3233, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-bottom - rotate: false - xy: 3431, 2479 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-liquid - rotate: false - xy: 3497, 2479 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-top - rotate: false - xy: 3563, 2545 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 3563, 2479 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 3629, 2547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 3695, 2547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -disassembler - rotate: false - xy: 2609, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-liquid - rotate: false - xy: 2707, 2843 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-spinner - rotate: false - xy: 2707, 2745 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 2329, 2299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -incinerator - rotate: false - xy: 3216, 1943 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source - rotate: false - xy: 3152, 1879 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void - rotate: false - xy: 3114, 1811 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 2315, 2233 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 2315, 2167 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 2315, 2167 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-source - rotate: false - xy: 3685, 2363 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-void - rotate: false - xy: 3651, 2295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter - rotate: false - xy: 3719, 2295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 2315, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -phase-weaver - rotate: false - xy: 2485, 2400 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 2551, 2466 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 2551, 2400 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 2461, 2334 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 2527, 2334 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulverizer - rotate: false - xy: 3991, 2253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-rotator - rotate: false - xy: 4025, 2253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 2480, 2070 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 2579, 2136 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-liquid - rotate: false - xy: 2612, 2070 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-spinner - rotate: false - xy: 2612, 2004 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-crucible - rotate: false - xy: 1951, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible-top - rotate: false - xy: 1853, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter - rotate: false - xy: 2612, 1938 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press - rotate: false - xy: 2608, 1872 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame0 - rotate: false - xy: 2608, 1806 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame1 - rotate: false - xy: 2608, 1740 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame2 - rotate: false - xy: 2617, 2466 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 2617, 2400 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 2683, 2449 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -boulder1 - rotate: false - xy: 3927, 2493 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -boulder2 - rotate: false - xy: 3827, 2459 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder1 - rotate: false - xy: 3249, 2317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder2 - rotate: false - xy: 3299, 2318 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-boulder1 - rotate: false - xy: 3957, 2219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-boulder2 - rotate: false - xy: 3991, 2219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder1 - rotate: false - xy: 3174, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder2 - rotate: false - xy: 3182, 1811 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-boulder1 - rotate: false - xy: 2828, 2001 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-boulder2 - rotate: false - xy: 2778, 1951 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 3575, 2287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 3575, 2245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 1641, 6 - 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: 2771, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team - rotate: false - xy: 2837, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 1817, 1456 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 1817, 1326 - 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: 1997, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team - rotate: false - xy: 2095, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unloader - rotate: false - xy: 2055, 1500 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-center - rotate: false - xy: 2089, 1534 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 2049, 2447 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team - rotate: false - xy: 2343, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-heat - rotate: false - xy: 1554, 2841 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 1189, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 2278, 1862 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-3 - rotate: false - xy: 1975, 820 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 3233, 3087 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -hail-heat - rotate: false - xy: 758, 3251 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -lancer-heat - rotate: false - xy: 2343, 2500 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 3003, 2827 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple-heat - rotate: false - xy: 1951, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo-heat - rotate: false - xy: 2546, 2070 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-left - rotate: false - xy: 2546, 2004 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 2546, 1938 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-heat - rotate: false - xy: 3957, 2185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 3211, 2367 - 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: 1757, 1004 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory - rotate: false - xy: 1855, 1016 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 3299, 2565 - 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: 2805, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-5 - rotate: false - xy: 1563, 446 - 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: 2903, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-out-5 - rotate: false - xy: 1559, 284 - 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: 3001, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ground-factory - rotate: false - xy: 3393, 2709 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor - rotate: false - xy: 1559, 122 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 1725, 608 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory - rotate: false - xy: 2413, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rally-point - rotate: false - xy: 2480, 2004 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-base - rotate: false - xy: 3855, 2205 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 2480, 1938 - 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: 2047, 2 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 3035, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door - rotate: false - xy: 3012, 1947 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 3761, 2547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 3695, 2481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-open - rotate: false - xy: 3046, 1947 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall - rotate: false - xy: 3855, 2341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 2485, 2466 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall - rotate: false - xy: 3991, 2321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 2461, 2268 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 3393, 2807 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge2 - rotate: false - xy: 1853, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge3 - rotate: false - xy: 2049, 2643 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-large1 - rotate: false - xy: 2542, 1806 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 2542, 1740 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 2593, 2334 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 2593, 2268 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall2 - rotate: false - xy: 3991, 2185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall3 - rotate: false - xy: 4025, 2185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall4 - rotate: false - xy: 3174, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall5 - rotate: false - xy: 3174, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall - rotate: false - xy: 2021, 1693 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 3079, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall - rotate: false - xy: 2021, 1591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 3277, 2433 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 3653, 2937 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-wall - rotate: false - xy: 2089, 1602 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 2749, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 1251, 1119 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 3827, 2559 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -casing - rotate: false - xy: 1103, 1371 - size: 8, 16 - orig: 8, 16 - offset: 0, 0 - index: -1 -circle-end - rotate: false - xy: 1440, 2640 - 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: 3442, 2379 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-bomb - rotate: false - xy: 3885, 2977 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -large-bomb-back - rotate: false - xy: 3783, 2813 - 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: 1947, 1709 - 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: 1947, 1635 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -missile - rotate: false - xy: 1113, 2319 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 2778, 1913 - 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: 1947, 1561 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -particle - rotate: false - xy: 3533, 2245 - 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: 2774, 1875 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 3449, 2173 - 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: 2055, 1534 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white - rotate: false - xy: 1910, 2130 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -alpha-outline - rotate: false - xy: 2999, 2317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 3049, 2317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 3099, 2317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 3149, 2317 - 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: 2208, 2064 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arkyid-foot - rotate: false - xy: 173, 1 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-joint-base - rotate: false - xy: 1947, 1415 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -arkyid-leg - rotate: false - xy: 773, 35 - 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: 3831, 3209 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck0 - rotate: false - xy: 3961, 3209 - 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: 3831, 3079 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -artillery-mount-outline - rotate: false - xy: 1947, 1271 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -artillery-outline - rotate: false - xy: 2833, 2251 - 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: 1683, 20 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-outline - rotate: false - xy: 1757, 938 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 1801, 2304 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 1993, 2381 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 2083, 2381 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beam-weapon-outline - rotate: false - xy: 2173, 2262 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -beta-outline - rotate: false - xy: 2703, 2213 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 2703, 2163 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 2753, 2213 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 2753, 2163 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 1887, 722 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 1887, 624 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 3795, 3089 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-full - rotate: false - xy: 2255, 2265 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 3363, 3087 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-boulder-full - rotate: false - xy: 3881, 2543 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 2978, 2041 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 2978, 2007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-full - rotate: false - xy: 2441, 2598 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 2978, 1973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 2978, 1973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 3493, 3067 - 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: 1887, 526 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 3012, 2083 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 2507, 2598 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 2573, 2598 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 1887, 428 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-dacite-boulder-full - rotate: false - xy: 3931, 2543 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-full - rotate: false - xy: 3012, 2049 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-full - rotate: false - xy: 3046, 2083 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 3012, 2015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 3046, 2049 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-full - rotate: false - xy: 3080, 2083 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-full - rotate: false - xy: 3012, 1981 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-full - rotate: false - xy: 3046, 2015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 3080, 2049 - 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-fuse-full - rotate: false - xy: 1985, 624 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 3114, 2083 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 1985, 526 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 3046, 1981 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 3080, 2015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 3114, 2049 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 3148, 2083 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-full - rotate: false - xy: 3080, 1981 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 3623, 3067 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 2639, 2601 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 1985, 428 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 3114, 2015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 2013, 330 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 3148, 2049 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 2013, 134 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 2705, 2581 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 1817, 1716 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 3114, 1981 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 3148, 1981 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-full - rotate: false - xy: 3617, 2337 - 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: 2013, 36 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 1542, 2743 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 3617, 2303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 3617, 2269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 3593, 2211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 3589, 2177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 2674, 1729 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 3203, 2233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 2439, 2532 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 1542, 2645 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 1542, 2645 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 1559, 2547 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 1559, 2547 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 3203, 2199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 2505, 2532 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 3203, 2165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 2571, 2532 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 3203, 2131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 3237, 2215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 3237, 2181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 1559, 2449 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-salt-wall-full - rotate: false - xy: 3237, 2147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 2639, 2535 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 3182, 2083 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 3182, 2049 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-full - rotate: false - xy: 3182, 2015 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 2705, 2515 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 3182, 1981 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 2816, 1909 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 2816, 1909 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 1703, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 1703, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 2771, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 2837, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 2884, 1909 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 2812, 1875 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-full - rotate: false - xy: 2846, 1875 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 2880, 1875 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-full - rotate: false - xy: 3877, 2493 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 2928, 1925 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-full - rotate: false - xy: 2724, 1745 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 1817, 1586 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 3183, 2267 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 3793, 2413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 2903, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-spore-wall-full - rotate: false - xy: 3827, 2425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-full - rotate: false - xy: 2969, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 3237, 2113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-full - rotate: false - xy: 2962, 1925 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 3035, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 1656, 2841 - 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: 1690, 2853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 1690, 2853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-full - rotate: false - xy: 1899, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 3101, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 3167, 2565 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-outline - rotate: false - xy: 3121, 3217 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 3263, 3217 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 3405, 3217 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 3547, 3197 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -container-team-crux - rotate: false - xy: 2903, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team-sharded - rotate: false - xy: 2969, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 1817, 1196 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 1883, 286 - 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: 2193, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 2291, 2937 - 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: 1507, 3121 - size: 60, 60 - orig: 60, 60 - offset: 0, 0 - index: -1 -corvus-joint-base - rotate: false - xy: 1947, 1199 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -toxopid-joint-base - rotate: false - xy: 1947, 1199 - 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: 2081, 2 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 3643, 2397 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 3677, 2397 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 3711, 2397 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 3745, 2397 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 1738, 2819 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 1738, 2785 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 1738, 2751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 3101, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 3167, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 3233, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 3299, 2499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 3365, 2545 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 3431, 2545 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 3497, 2545 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 3365, 2479 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 2389, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 2487, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 2585, 2937 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 1640, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 1825, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 1923, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 2021, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 2119, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 1883, 156 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 1883, 26 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 1703, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 1833, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 1963, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 2093, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 2223, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 2353, 3035 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 1501, 1742 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 1501, 1580 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1501, 1418 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 1501, 1256 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 1501, 1094 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 1595, 932 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 1585, 770 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 1563, 608 - 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: 4031, 2523 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-outline - rotate: false - xy: 3977, 2473 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 4027, 2473 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 3977, 2423 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 4027, 2423 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cyclone - rotate: false - xy: 2217, 2839 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 3443, 2429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-outline - rotate: false - xy: 3493, 2429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 3543, 2429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 3342, 2379 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 3392, 2379 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 3080, 1947 - 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: 3542, 2371 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flamethrower-outline - rotate: false - xy: 3593, 2421 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flare-outline - rotate: false - xy: 3643, 2431 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 3693, 2431 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 3743, 2431 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 2803, 2201 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-leg - rotate: false - xy: 91, 11 - size: 80, 60 - orig: 80, 60 - offset: 0, 0 - index: -1 -fortress-outline - rotate: false - xy: 1777, 1114 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 1879, 1114 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 3783, 2997 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 3783, 2915 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 3295, 2729 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -gamma-outline - rotate: false - xy: 1981, 1129 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 2208, 1994 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 2208, 1924 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 2208, 1854 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 3114, 1947 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -heal-shotgun-weapon-outline - rotate: false - xy: 2853, 2201 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount-outline - rotate: false - xy: 2903, 2159 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-outline - rotate: false - xy: 2933, 2259 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -horizon-outline - rotate: false - xy: 1641, 48 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 3753, 3123 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 323, 2341 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 1947, 1783 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 1016, 3073 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 2902, 1773 - 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: 2245, 2450 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 2983, 2267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 3753, 3081 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 2910, 1841 - 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: 1685, 3147 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 3033, 2267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 245, 31 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 2948, 1891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 2289, 2273 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 2725, 2967 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 3083, 2267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 1992, 1863 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 2982, 1891 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 719, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 1569, 3307 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 3133, 2267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 2683, 2943 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 2944, 1823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 1601, 3415 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 1685, 3129 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 2953, 2209 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 3449, 2337 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 2936, 1789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 745, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 2725, 2949 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 2953, 2159 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 2724, 1821 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 2936, 1755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 1601, 3389 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 1685, 3111 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 3003, 2217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 758, 3209 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 3016, 1913 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 771, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 4079, 2653 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 3003, 2167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 3449, 2295 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 3050, 1913 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 1601, 3363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 4079, 2635 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 3053, 2217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 2724, 1779 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 3084, 1913 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 797, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 4079, 2617 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 3053, 2167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 758, 3167 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 3118, 1913 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 1601, 3337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 4079, 2599 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 3103, 2217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 3449, 2253 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 3152, 1913 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 823, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 4079, 2581 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 3103, 2167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 758, 3125 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 3050, 1845 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 849, 2331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 3216, 2113 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 3153, 2217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 3449, 2211 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 3118, 1845 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 2709, 3165 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 1685, 3093 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 3153, 2167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 3491, 2329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 3012, 1811 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 1690, 2827 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 693, 2603 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 3349, 2279 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 3491, 2287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 3080, 1811 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 1601, 3311 - 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: 3399, 2271 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 2315, 2101 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-artillery-outline - rotate: false - xy: 3249, 2249 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-bullet-mount-outline - rotate: false - xy: 2243, 2064 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount-outline - rotate: false - xy: 1657, 2535 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount-outline - rotate: false - xy: 1992, 1905 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-weapon-outline - rotate: false - xy: 3399, 2221 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 3533, 2329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 3038, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 725, 2917 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 1199, 2767 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 3299, 2200 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 3491, 2245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 3140, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 2495, 3781 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 1229, 876 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 3349, 2179 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 3533, 2287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 3651, 2329 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 2595, 3539 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 1401, 786 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 3399, 2171 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 3575, 2329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 3719, 2363 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 983, 2831 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 3547, 3341 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 1670, 2887 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 2381, 2101 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-outline - rotate: false - xy: 2348, 2035 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 2348, 1969 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 2344, 1903 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 2344, 1837 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 2119, 2741 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mega-outline - rotate: false - xy: 3987, 2875 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck0 - rotate: false - xy: 3885, 2773 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck1 - rotate: false - xy: 3987, 2773 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck2 - rotate: false - xy: 3783, 2711 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 2873, 2827 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-outline - rotate: false - xy: 2173, 2344 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 2263, 2365 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 2083, 2278 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 1993, 2278 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -missiles-mount-outline - rotate: false - xy: 2703, 2113 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-outline - rotate: false - xy: 2853, 2101 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 2903, 2109 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 2953, 2109 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 3003, 2117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon-outline - rotate: false - xy: 3103, 2117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon-outline - rotate: false - xy: 2678, 2063 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 2728, 2063 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-outline - rotate: false - xy: 2659, 2267 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 2645, 2209 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 2645, 2151 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 1567, 3049 - 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: 2419, 2400 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-outline - rotate: false - xy: 1554, 2933 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 1612, 2991 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 1554, 2875 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 1612, 2933 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-leg - rotate: false - xy: 2513, 2136 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulsar-outline - rotate: false - xy: 1063, 3323 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 2649, 3175 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 1507, 3071 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 1063, 3273 - size: 58, 48 - orig: 58, 48 - 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: 2161, 2180 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-outline - rotate: false - xy: 1915, 2103 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 1997, 2114 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 2079, 2114 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 1910, 2021 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign-leg - rotate: false - xy: 1663, 1342 - 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: 1825, 1855 - 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: 3821, 2221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 1755, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-outline - rotate: false - xy: 2064, 1954 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 2136, 2018 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 2136, 1938 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 2064, 1874 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 2476, 1740 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 2542, 1872 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scepter-leg - rotate: false - xy: 3523, 2937 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-leg - rotate: false - xy: 3523, 2937 - 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: 2775, 2263 - 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: 4025, 2219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 2579, 2202 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sei-launcher-outline - rotate: false - xy: 1910, 1857 - 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: 2728, 1963 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon-outline - rotate: false - xy: 2778, 2001 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 3523, 2807 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-foot - rotate: false - xy: 2805, 2827 - size: 46, 46 - orig: 46, 46 - offset: 0, 0 - index: -1 -spiroct-joint - rotate: false - xy: 3030, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spiroct-leg - rotate: false - xy: 983, 2607 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-leg-base - rotate: false - xy: 3967, 3585 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-outline - rotate: false - xy: 2343, 2566 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-weapon-outline - rotate: false - xy: 2878, 2043 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 2245, 2468 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 2537, 2664 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 1801, 2370 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 3064, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 3098, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 2021, 1761 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 2021, 1727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 3132, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 3166, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 3208, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 3208, 1743 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 3200, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 3234, 1709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 2021, 1829 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 2021, 1795 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 3145, 2433 - 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: 1721, 224 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 1721, 32 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 1541, 2230 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 1663, 2038 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 2878, 1993 - 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: 3653, 2807 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 1801, 2238 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 2878, 1943 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 3689, 3197 - 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: 2928, 2059 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 2928, 2009 - 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: 2928, 1959 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 3885, 2691 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 2278, 1994 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 1947, 1487 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 2815, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mega-full - rotate: false - xy: 3987, 2671 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -unit-minke-full - rotate: false - xy: 1825, 2135 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 2678, 1913 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 2833, 2309 - 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: 2891, 2309 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 1063, 3223 - size: 58, 48 - orig: 58, 48 - 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: 2161, 2098 - 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: 2136, 1858 - 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: 1897, 2370 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-toxopid-full - rotate: false - xy: 1663, 1846 - 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: 2245, 2545 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-team-sharded - rotate: false - xy: 2147, 2447 - 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: 3145, 2367 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-missiles-outline - rotate: false - xy: 2674, 1763 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-outline - rotate: false - xy: 1663, 1102 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 1527, 8 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 1440, 2955 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 1440, 2841 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 2902, 1807 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 2894, 1739 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 2914, 1875 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 2948, 1857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 2982, 1857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 2978, 1823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 2970, 1789 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 2970, 1755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 3016, 1879 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 3050, 1879 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 3084, 1879 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 3118, 1879 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 3016, 1845 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 3084, 1845 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 3152, 1845 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 3046, 1811 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 3004, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 3106, 1777 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 3651, 2363 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 3685, 2329 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 1947, 1196 - 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: 3277, 2368 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 2949, 2317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 3827, 2509 - 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: 2805, 2875 - 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: 2883, 2259 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-cell - rotate: false - xy: 1001, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -bryde - rotate: false - xy: 3945, 3881 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-cell - rotate: false - xy: 2979, 3217 - 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, 1720 - 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: 3877, 2443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 3927, 2443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 3981, 2523 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 3343, 2429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 3393, 2429 - 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: 3592, 2371 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress - rotate: false - xy: 2649, 3225 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-base - rotate: false - xy: 2263, 2299 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -fortress-cell - rotate: false - xy: 1225, 12 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -gamma - rotate: false - xy: 1327, 24 - size: 68, 68 - orig: 68, 68 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 1569, 3107 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -horizon - rotate: false - xy: 2633, 2667 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-cell - rotate: false - xy: 323, 2415 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -mace - rotate: false - xy: 2395, 2302 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 2381, 2233 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 2381, 2167 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mega - rotate: false - xy: 3885, 2875 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-cell - rotate: false - xy: 3987, 2977 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -minke - rotate: false - xy: 1891, 2267 - size: 88, 101 - orig: 88, 101 - offset: 0, 0 - index: -1 -minke-cell - rotate: false - xy: 3133, 2827 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -mono - rotate: false - xy: 2753, 2113 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-cell - rotate: false - xy: 2803, 2101 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 1627, 3107 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 2678, 2013 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 2659, 2325 - 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: 1625, 3049 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 1554, 2991 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 1612, 2875 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 507, 93 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 2678, 1963 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 2683, 2985 - 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: 1915, 2185 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-base - rotate: false - xy: 1997, 2196 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-cell - rotate: false - xy: 2079, 2196 - 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, 1594 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-cell - rotate: false - xy: 1663, 1468 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -risso - rotate: false - xy: 2064, 2034 - size: 70, 78 - orig: 70, 78 - offset: 0, 0 - index: -1 -risso-cell - rotate: false - xy: 1755, 2447 - 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: 3263, 2827 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -vela-base - rotate: false - xy: 3263, 2827 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-cell - rotate: false - xy: 3393, 2937 - 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: 3687, 2730 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-cell - rotate: false - xy: 2441, 2664 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid - rotate: false - xy: 1725, 416 - 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, 1216 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -vanguard - rotate: false - xy: 2728, 1913 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -vanguard-cell - rotate: false - xy: 2674, 1863 - 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: 3199, 2309 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -artillery-mount - rotate: false - xy: 1947, 1343 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 -beam-weapon - rotate: false - xy: 691, 11 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -eruption - rotate: false - xy: 3492, 2371 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 3349, 2329 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 3399, 2321 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 2803, 2151 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 2853, 2151 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 2903, 2209 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 3299, 2250 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 -large-bullet-mount - rotate: false - xy: 2243, 2163 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-laser-mount - rotate: false - xy: 3589, 2613 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -large-purple-mount - rotate: false - xy: 1992, 2004 - size: 70, 97 - orig: 70, 97 - offset: 0, 0 - index: -1 -large-weapon - rotate: false - xy: 3349, 2229 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles - rotate: false - xy: 1720, 2887 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles-mount - rotate: false - xy: 1770, 2887 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon - rotate: false - xy: 3053, 2117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 3153, 2117 - 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: 1825, 1995 - size: 83, 138 - orig: 83, 138 - offset: 0, 0 - index: -1 -scepter-weapon - rotate: false - xy: 2717, 2263 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 -sei-launcher - rotate: false - xy: 1910, 1939 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -small-basic-weapon - rotate: false - xy: 2728, 2013 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 2778, 2051 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 2828, 2051 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 2828, 1943 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 2674, 1813 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 2724, 1863 - 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: 2167, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory-icon-editor - rotate: false - xy: 2265, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-icon-editor - rotate: false - xy: 2363, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-icon-editor - rotate: false - xy: 305, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-icon-editor - rotate: false - xy: 339, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -basalt-icon-editor - rotate: false - xy: 373, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt1 - rotate: false - xy: 373, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-icon-editor - rotate: false - xy: 407, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large-icon-editor - rotate: false - xy: 2461, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill-icon-editor - rotate: false - xy: 163, 51 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-mixer-icon-editor - rotate: false - xy: 4029, 437 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border-editor - rotate: false - xy: 441, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-forge-icon-editor - rotate: false - xy: 2559, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-loader-icon-editor - rotate: false - xy: 2657, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader-icon-editor - rotate: false - xy: 2755, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -boulder-icon-editor - rotate: false - xy: 3817, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -bridge-conduit-icon-editor - rotate: false - xy: 475, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-icon-editor - rotate: false - xy: 509, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char-icon-editor - rotate: false - xy: 553, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char1 - rotate: false - xy: 553, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear-editor - rotate: false - xy: 645, 210 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -cliff-icon-editor - rotate: false - xy: 587, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-editor - rotate: false - xy: 1553, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -combustion-generator-icon-editor - rotate: false - xy: 651, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -command-center-icon-editor - rotate: false - xy: 1619, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conduit-icon-editor - rotate: false - xy: 685, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -container-icon-editor - rotate: false - xy: 1685, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -conveyor-icon-editor - rotate: false - xy: 719, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-icon-editor - rotate: false - xy: 753, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large-icon-editor - rotate: false - xy: 1751, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation-icon-editor - rotate: false - xy: 1517, 373 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-icon-editor - rotate: false - xy: 1, 19 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-icon-editor - rotate: false - xy: 2853, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -craters-icon-editor - rotate: false - xy: 787, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters1 - rotate: false - xy: 787, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cryofluidmixer-icon-editor - rotate: false - xy: 1817, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-icon-editor - rotate: false - xy: 1883, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cyclone-icon-editor - rotate: false - xy: 2951, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dacite-boulder-icon-editor - rotate: false - xy: 3867, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-icon-editor - rotate: false - xy: 821, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite1 - rotate: false - xy: 821, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dacite-wall-icon-editor - rotate: false - xy: 855, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-icon-editor - rotate: false - xy: 889, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-icon-editor - rotate: false - xy: 1141, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-1 - rotate: false - xy: 1141, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-icon-editor - rotate: false - xy: 1175, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-2 - rotate: false - xy: 1175, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-icon-editor - rotate: false - xy: 1209, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-3 - rotate: false - xy: 1209, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-icon-editor - rotate: false - xy: 1243, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-4 - rotate: false - xy: 1243, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-icon-editor - rotate: false - xy: 1277, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-5 - rotate: false - xy: 1277, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-icon-editor - rotate: false - xy: 4029, 403 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dark-panel-6 - rotate: false - xy: 4029, 403 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-icon-editor - rotate: false - xy: 4063, 403 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand1 - rotate: false - xy: 4063, 403 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-editor - rotate: false - xy: 1357, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-icon-editor - rotate: false - xy: 1391, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-icon-editor - rotate: false - xy: 1425, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-deepwater - rotate: false - xy: 1425, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator-icon-editor - rotate: false - xy: 3049, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -diode-icon-editor - rotate: false - xy: 1459, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-icon-editor - rotate: false - xy: 1493, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt1 - rotate: false - xy: 1493, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dirt-wall-icon-editor - rotate: false - xy: 1311, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -disassembler-icon-editor - rotate: false - xy: 3147, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -distributor-icon-editor - rotate: false - xy: 1949, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-icon-editor - rotate: false - xy: 543, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large-icon-editor - rotate: false - xy: 2015, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dune-wall-icon-editor - rotate: false - xy: 577, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -duo-icon-editor - rotate: false - xy: 4017, 369 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt2 - rotate: false - xy: 4051, 369 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-basalt3 - rotate: false - xy: 3817, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char2 - rotate: false - xy: 3851, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char3 - rotate: false - xy: 3885, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters2 - rotate: false - xy: 3919, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters3 - rotate: false - xy: 3953, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite2 - rotate: false - xy: 3987, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dacite3 - rotate: false - xy: 4021, 335 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water1 - rotate: false - xy: 1337, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water2 - rotate: false - xy: 1371, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water3 - rotate: false - xy: 1371, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water1 - rotate: false - xy: 1405, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water2 - rotate: false - xy: 1405, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water3 - rotate: false - xy: 1439, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand2 - rotate: false - xy: 4055, 335 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand3 - rotate: false - xy: 1337, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt2 - rotate: false - xy: 1439, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-dirt3 - rotate: false - xy: 1473, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass1 - rotate: false - xy: 1473, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-icon-editor - rotate: false - xy: 1473, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass2 - rotate: false - xy: 1507, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass3 - rotate: false - xy: 1507, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock1 - rotate: false - xy: 2147, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-editor - rotate: false - xy: 2147, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock2 - rotate: false - xy: 2147, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock3 - rotate: false - xy: 2181, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow1 - rotate: false - xy: 2249, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-editor - rotate: false - xy: 2249, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow2 - rotate: false - xy: 2249, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow3 - rotate: false - xy: 2283, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice1 - rotate: false - xy: 2181, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-editor - rotate: false - xy: 2181, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice2 - rotate: false - xy: 2215, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice3 - rotate: false - xy: 2215, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock1 - rotate: false - xy: 2283, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock-icon-editor - rotate: false - xy: 2283, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock2 - rotate: false - xy: 2317, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock3 - rotate: false - xy: 2317, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor - rotate: false - xy: 2351, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-editor - rotate: false - xy: 2351, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-2 - rotate: false - xy: 2351, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-icon-editor - rotate: false - xy: 2351, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-3 - rotate: false - xy: 2385, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-editor - rotate: false - xy: 2385, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-5 - rotate: false - xy: 2385, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-editor - rotate: false - xy: 2385, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged1 - rotate: false - xy: 2419, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-editor - rotate: false - xy: 2419, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged2 - rotate: false - xy: 2419, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged3 - rotate: false - xy: 2453, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss1 - rotate: false - xy: 2453, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-editor - rotate: false - xy: 2453, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss2 - rotate: false - xy: 2487, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss3 - rotate: false - xy: 2487, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud1 - rotate: false - xy: 2521, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mud-icon-editor - rotate: false - xy: 2521, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud2 - rotate: false - xy: 2521, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-mud3 - rotate: false - xy: 2555, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal1 - rotate: false - xy: 2555, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal2 - rotate: false - xy: 2589, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal3 - rotate: false - xy: 2589, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper1 - rotate: false - xy: 2623, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper2 - rotate: false - xy: 2623, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper3 - rotate: false - xy: 2657, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead1 - rotate: false - xy: 2657, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead2 - rotate: false - xy: 2691, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead3 - rotate: false - xy: 2691, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap1 - rotate: false - xy: 2725, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap2 - rotate: false - xy: 2725, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap3 - rotate: false - xy: 2759, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium1 - rotate: false - xy: 2759, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium2 - rotate: false - xy: 2793, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium3 - rotate: false - xy: 2793, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium1 - rotate: false - xy: 2827, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium2 - rotate: false - xy: 2827, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium3 - rotate: false - xy: 2861, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles1 - rotate: false - xy: 2861, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles2 - rotate: false - xy: 2895, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles3 - rotate: false - xy: 2895, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-salt - rotate: false - xy: 2929, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-editor - rotate: false - xy: 2929, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water1 - rotate: false - xy: 2997, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water2 - rotate: false - xy: 2997, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water3 - rotate: false - xy: 3031, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand1 - rotate: false - xy: 2929, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-editor - rotate: false - xy: 2929, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand2 - rotate: false - xy: 2963, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand3 - rotate: false - xy: 2963, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale1 - rotate: false - xy: 3031, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-editor - rotate: false - xy: 3031, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale2 - rotate: false - xy: 3065, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale3 - rotate: false - xy: 3065, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-slag - rotate: false - xy: 3099, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-icon-editor - rotate: false - xy: 3099, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow1 - rotate: false - xy: 3099, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow2 - rotate: false - xy: 3133, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow3 - rotate: false - xy: 3133, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spawn - rotate: false - xy: 3167, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss1 - rotate: false - xy: 3167, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-icon-editor - rotate: false - xy: 3167, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss2 - rotate: false - xy: 3201, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss3 - rotate: false - xy: 3201, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone1 - rotate: false - xy: 3235, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-icon-editor - rotate: false - xy: 3235, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone2 - rotate: false - xy: 3235, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone3 - rotate: false - xy: 3269, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tainted-water - rotate: false - xy: 3269, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-icon-editor - rotate: false - xy: 3269, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tar - rotate: false - xy: 3303, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-icon-editor - rotate: false - xy: 3303, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils1 - rotate: false - xy: 3303, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils2 - rotate: false - xy: 3337, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils3 - rotate: false - xy: 3337, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-water - rotate: false - xy: 3371, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-icon-editor - rotate: false - xy: 3371, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -exponential-reconstructor-icon-editor - rotate: false - xy: 935, 277 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -force-projector-icon-editor - rotate: false - xy: 3245, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -fuse-icon-editor - rotate: false - xy: 3343, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press-icon-editor - rotate: false - xy: 2081, 307 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ground-factory-icon-editor - rotate: false - xy: 3441, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hail-icon-editor - rotate: false - xy: 3371, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hyper-processor-icon-editor - rotate: false - xy: 3539, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-wall-icon-editor - rotate: false - xy: 3405, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-icon-editor - rotate: false - xy: 3405, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-editor - rotate: false - xy: 293, 51 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -incinerator-icon-editor - rotate: false - xy: 3439, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -inverted-sorter-icon-editor - rotate: false - xy: 3439, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-editor - rotate: false - xy: 3473, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-editor - rotate: false - xy: 3473, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-editor - rotate: false - xy: 3507, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln-icon-editor - rotate: false - xy: 1553, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -lancer-icon-editor - rotate: false - xy: 1619, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-logic-display-icon-editor - rotate: false - xy: 1161, 309 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -laser-drill-icon-editor - rotate: false - xy: 3637, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-icon-editor - rotate: false - xy: 3735, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large-icon-editor - rotate: false - xy: 1647, 373 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -liquid-junction-icon-editor - rotate: false - xy: 3507, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-icon-editor - rotate: false - xy: 3541, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-source-icon-editor - rotate: false - xy: 3541, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-icon-editor - rotate: false - xy: 3833, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-void-icon-editor - rotate: false - xy: 3575, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-display-icon-editor - rotate: false - xy: 3931, 405 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor-icon-editor - rotate: false - xy: 1685, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver-icon-editor - rotate: false - xy: 553, 83 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill-icon-editor - rotate: false - xy: 1751, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-pump-icon-editor - rotate: false - xy: 3575, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -meltdown-icon-editor - rotate: false - xy: 423, 51 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -melter-icon-editor - rotate: false - xy: 3609, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -memory-bank-icon-editor - rotate: false - xy: 1817, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell-icon-editor - rotate: false - xy: 3609, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mend-projector-icon-editor - rotate: false - xy: 1883, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender-icon-editor - rotate: false - xy: 3643, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message-icon-editor - rotate: false - xy: 3643, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor-icon-editor - rotate: false - xy: 3677, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press-icon-editor - rotate: false - xy: 651, 115 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-icon-editor - rotate: false - xy: 1355, 341 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory-icon-editor - rotate: false - xy: 749, 115 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-icon-editor - rotate: false - xy: 847, 115 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-icon-editor - rotate: false - xy: 945, 179 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector-icon-editor - rotate: false - xy: 1949, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overflow-gate-icon-editor - rotate: false - xy: 3677, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -parallax-icon-editor - rotate: false - xy: 2015, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -payload-conveyor-icon-editor - rotate: false - xy: 1043, 179 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon-editor - rotate: false - xy: 945, 81 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pebbles-icon-editor - rotate: false - xy: 3711, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-icon-editor - rotate: false - xy: 3711, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-icon-editor - rotate: false - xy: 3745, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-icon-editor - rotate: false - xy: 3745, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large-icon-editor - rotate: false - xy: 2081, 241 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-icon-editor - rotate: false - xy: 2167, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pine-icon-editor - rotate: false - xy: 3917, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-editor - rotate: false - xy: 2233, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-conveyor-icon-editor - rotate: false - xy: 3779, 305 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-icon-editor - rotate: false - xy: 3779, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large-icon-editor - rotate: false - xy: 2299, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plated-conduit-icon-editor - rotate: false - xy: 2147, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-editor - rotate: false - xy: 2365, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-node-icon-editor - rotate: false - xy: 2181, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large-icon-editor - rotate: false - xy: 2431, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source-icon-editor - rotate: false - xy: 2215, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void-icon-editor - rotate: false - xy: 2249, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-icon-editor - rotate: false - xy: 2283, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-icon-editor - rotate: false - xy: 2317, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-editor - rotate: false - xy: 2497, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-icon-editor - rotate: false - xy: 2351, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point-icon-editor - rotate: false - xy: 2563, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ripple-icon-editor - rotate: false - xy: 1043, 81 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rotary-pump-icon-editor - rotate: false - xy: 2629, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -router-icon-editor - rotate: false - xy: 2385, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator-icon-editor - rotate: false - xy: 2695, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salt-wall-icon-editor - rotate: false - xy: 2419, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo-icon-editor - rotate: false - xy: 2761, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-boulder-icon-editor - rotate: false - xy: 2453, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-wall-icon-editor - rotate: false - xy: 2487, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-editor - rotate: false - xy: 2521, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scatter-icon-editor - rotate: false - xy: 2827, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-icon-editor - rotate: false - xy: 2555, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-editor - rotate: false - xy: 1777, 373 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-editor - rotate: false - xy: 1161, 211 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-icon-editor - rotate: false - xy: 2589, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-editor - rotate: false - xy: 2893, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -segment-icon-editor - rotate: false - xy: 2959, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-icon-editor - rotate: false - xy: 3025, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-boulder-icon-editor - rotate: false - xy: 2623, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-wall-icon-editor - rotate: false - xy: 2657, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shock-mine-icon-editor - rotate: false - xy: 2691, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-icon-editor - rotate: false - xy: 2725, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -silicon-crucible-icon-editor - rotate: false - xy: 1259, 211 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter-icon-editor - rotate: false - xy: 3091, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snow-boulder-icon-editor - rotate: false - xy: 3967, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-icon-editor - rotate: false - xy: 2759, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-pine-icon-editor - rotate: false - xy: 163, 1 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-wall-icon-editor - rotate: false - xy: 2793, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-icon-editor - rotate: false - xy: 2827, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large-icon-editor - rotate: false - xy: 1141, 113 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sorter-icon-editor - rotate: false - xy: 2861, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn-icon-editor - rotate: false - xy: 2895, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spectre-icon-editor - rotate: false - xy: 1907, 373 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spore-cluster-icon-editor - rotate: false - xy: 263, 9 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-pine-icon-editor - rotate: false - xy: 213, 1 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-press-icon-editor - rotate: false - xy: 3157, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-wall-icon-editor - rotate: false - xy: 2929, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -steam-generator-icon-editor - rotate: false - xy: 3223, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -stone-wall-icon-editor - rotate: false - xy: 2963, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-tower-icon-editor - rotate: false - xy: 3289, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-icon-editor - rotate: false - xy: 2997, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large-icon-editor - rotate: false - xy: 3355, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -swarmer-icon-editor - rotate: false - xy: 3421, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -switch-icon-editor - rotate: false - xy: 3031, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils-icon-editor - rotate: false - xy: 3065, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tetrative-reconstructor-icon-editor - rotate: false - xy: 645, 213 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -thermal-generator-icon-editor - rotate: false - xy: 3487, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump-icon-editor - rotate: false - xy: 1239, 113 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-icon-editor - rotate: false - xy: 1357, 243 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-wall-icon-editor - rotate: false - xy: 3099, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-editor - rotate: false - xy: 3553, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster-icon-editor - rotate: false - xy: 2037, 373 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-editor - rotate: false - xy: 3133, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-icon-editor - rotate: false - xy: 3167, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-editor - rotate: false - xy: 3619, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -underflow-gate-icon-editor - rotate: false - xy: 3201, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-icon-editor - rotate: false - xy: 3235, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault-icon-editor - rotate: false - xy: 1455, 243 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -water-extractor-icon-editor - rotate: false - xy: 3685, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-icon-editor - rotate: false - xy: 3751, 339 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -white-tree-dead-icon-editor - rotate: false - xy: 1, 181 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-icon-editor - rotate: false - xy: 323, 181 - 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: 3509, 202 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 3153, 134 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -block-additive-reconstructor-large - rotate: false - xy: 3842, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-additive-reconstructor-medium - rotate: false - xy: 1158, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-additive-reconstructor-small - rotate: false - xy: 3533, 387 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-additive-reconstructor-tiny - rotate: false - xy: 3253, 120 - 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: 3884, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-air-factory-medium - rotate: false - xy: 1192, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-air-factory-small - rotate: false - xy: 3533, 361 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-air-factory-tiny - rotate: false - xy: 3926, 323 - 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: 845, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-alloy-smelter-medium - rotate: false - xy: 1226, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-alloy-smelter-small - rotate: false - xy: 2649, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 3182, 154 - 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: 887, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-arc-medium - rotate: false - xy: 1260, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-arc-small - rotate: false - xy: 2649, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 3201, 109 - 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: 929, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-armored-conveyor-medium - rotate: false - xy: 1294, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-small - rotate: false - xy: 2675, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 1063, 5 - 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: 971, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-basalt-medium - rotate: false - xy: 1328, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basalt-small - rotate: false - xy: 2675, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-basalt-tiny - rotate: false - xy: 1609, 83 - 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: 1013, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 1055, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 1362, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-large-small - rotate: false - xy: 2701, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 3609, 345 - 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: 1396, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 2727, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 309, 160 - 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: 1097, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 1430, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 2701, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 1449, 57 - 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: 1139, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 1464, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 2727, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 3182, 136 - 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: 1181, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 1498, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 2753, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-tiny - rotate: false - xy: 1081, 5 - 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: 1223, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-loader-medium - rotate: false - xy: 1532, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-loader-small - rotate: false - xy: 2753, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-loader-tiny - rotate: false - xy: 1627, 83 - 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: 1265, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-unloader-medium - rotate: false - xy: 1566, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-unloader-small - rotate: false - xy: 3559, 351 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-unloader-tiny - rotate: false - xy: 3627, 345 - 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: 1307, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-boulder-medium - rotate: false - xy: 1600, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-boulder-small - rotate: false - xy: 2649, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-boulder-tiny - rotate: false - xy: 1467, 57 - 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: 1349, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 1634, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 2675, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 1099, 5 - 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: 1391, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1668, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 2701, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 1645, 83 - 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: 1433, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 1702, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 2727, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 1485, 57 - 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: 1475, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliff-medium - rotate: false - xy: 1736, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliff-small - rotate: false - xy: 2753, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliff-tiny - rotate: false - xy: 1117, 5 - 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: 1517, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 1770, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 2779, 132 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 1663, 83 - 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: 1559, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1804, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 2779, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 1503, 57 - 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: 1601, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1838, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 2779, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 1681, 83 - 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: 1643, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1872, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 2805, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 1521, 57 - 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: 1685, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1906, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 2831, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 1699, 83 - 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: 1727, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 1940, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 2805, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 1539, 57 - 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: 1769, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 1811, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1974, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 2857, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 1717, 83 - 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: 2008, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 2805, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 1557, 57 - 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: 1853, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 2042, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 2831, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 1735, 83 - 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: 1895, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 2076, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 2883, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 1753, 83 - 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: 1937, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 2110, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 2831, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 1771, 83 - 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: 1979, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 2144, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 2857, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 1789, 83 - 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-cryofluidmixer-large - rotate: false - xy: 2021, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluidmixer-medium - rotate: false - xy: 2178, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-small - rotate: false - xy: 2909, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluidmixer-tiny - rotate: false - xy: 1807, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluidmixer-xlarge - rotate: false - xy: 1907, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 2063, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 2212, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 2857, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 1825, 83 - 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: 2105, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 2246, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 2883, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 1843, 83 - 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: 2147, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-boulder-medium - rotate: false - xy: 2280, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-boulder-small - rotate: false - xy: 2935, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-boulder-tiny - rotate: false - xy: 1861, 83 - 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: 2189, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-medium - rotate: false - xy: 2314, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-small - rotate: false - xy: 2883, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-tiny - rotate: false - xy: 1879, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dacite-wall-large - rotate: false - xy: 2231, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dacite-wall-medium - rotate: false - xy: 2348, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-small - rotate: false - xy: 2909, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dacite-wall-tiny - rotate: false - xy: 1897, 83 - 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: 2273, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 2382, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 2961, 133 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1915, 83 - 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: 2315, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 2416, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 2909, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1933, 83 - 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: 2357, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 2455, 194 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 2935, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 1951, 83 - 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: 2399, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 2450, 160 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 2935, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 1969, 83 - 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: 2441, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 2497, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 2961, 107 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 1987, 83 - 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: 2483, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 2959, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 2961, 81 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 2005, 83 - 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: 2525, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 2993, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 3523, 282 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 2023, 83 - 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: 2567, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 3027, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 3525, 256 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 2609, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 3061, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 2987, 119 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 2041, 83 - 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: 2059, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 2651, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 3095, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 2987, 93 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 2077, 83 - 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: 2693, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 3129, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 2987, 67 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 2095, 83 - 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: 2735, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 3163, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 3372, 124 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 2113, 83 - 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: 2777, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 3197, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 3123, 112 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 2131, 83 - 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: 2819, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-medium - rotate: false - xy: 3231, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-small - rotate: false - xy: 3149, 108 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-tiny - rotate: false - xy: 2149, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dirt-wall-large - rotate: false - xy: 2861, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dirt-wall-medium - rotate: false - xy: 3265, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-small - rotate: false - xy: 3407, 153 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dirt-wall-tiny - rotate: false - xy: 2167, 83 - 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: 2903, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 3299, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 3433, 152 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 2185, 83 - 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: 2945, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 3333, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 4040, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 2203, 83 - 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: 2987, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 3029, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 3367, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 4066, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 2221, 83 - 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: 3401, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 2551, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 2239, 83 - 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: 3071, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dune-wall-medium - rotate: false - xy: 3435, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-small - rotate: false - xy: 2577, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dune-wall-tiny - rotate: false - xy: 2257, 83 - 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: 3113, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 3469, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 2603, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 2275, 83 - 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: 3155, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-medium - rotate: false - xy: 3503, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-small - rotate: false - xy: 3013, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-tiny - rotate: false - xy: 2293, 83 - 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: 3197, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 2489, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 3013, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 2311, 83 - 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-fuse-large - rotate: false - xy: 3239, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 2484, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 3039, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 2329, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 3357, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 3281, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 2539, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 3039, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 2347, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 3407, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 3323, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 3842, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 3065, 112 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 2365, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 3457, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ground-factory-large - rotate: false - xy: 3365, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ground-factory-medium - rotate: false - xy: 3876, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-small - rotate: false - xy: 3065, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ground-factory-tiny - rotate: false - xy: 2383, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ground-factory-xlarge - rotate: false - xy: 3507, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 3407, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 3910, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 3091, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 2401, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 3557, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 3449, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 3944, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 3091, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 2419, 83 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 3607, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hyper-processor-large - rotate: false - xy: 3491, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hyper-processor-medium - rotate: false - xy: 1123, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hyper-processor-small - rotate: false - xy: 3117, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hyper-processor-tiny - rotate: false - xy: 3349, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hyper-processor-xlarge - rotate: false - xy: 3657, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 859, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 1158, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 3143, 82 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 859, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1192, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 3065, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 3529, 343 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 3707, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1219, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-large - rotate: false - xy: 901, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-wall-medium - rotate: false - xy: 1226, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-small - rotate: false - xy: 3091, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-wall-tiny - rotate: false - xy: 1237, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-xlarge - rotate: false - xy: 3757, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 3807, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-illuminator-large - rotate: false - xy: 859, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 1260, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 3117, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 1255, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge - rotate: false - xy: 3857, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 901, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 1294, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 3143, 56 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 1273, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 3907, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 943, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 1328, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 3013, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1141, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 3957, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 859, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1362, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 3039, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1159, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 4007, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 901, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1396, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 3065, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1177, 15 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 345, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 943, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 1430, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 3091, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 1195, 20 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 395, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 985, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 1464, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 3117, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 3537, 325 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 445, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 901, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 1498, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 3143, 30 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 1449, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 495, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 943, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 1532, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 3117, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 1467, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 545, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-large-logic-display-large - rotate: false - xy: 985, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-large-logic-display-medium - rotate: false - xy: 1566, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-large-logic-display-small - rotate: false - xy: 3143, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-large-logic-display-tiny - rotate: false - xy: 1485, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-large-logic-display-xlarge - rotate: false - xy: 595, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 1027, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1600, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 3398, 124 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1503, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 645, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 943, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 985, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1634, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 3424, 126 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 1521, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 695, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1668, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 3450, 126 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1539, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 231, 96 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 1027, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1702, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 3175, 108 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 1557, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 231, 46 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 1069, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 1736, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 3169, 82 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1575, 57 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 745, 354 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 985, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 1770, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 3169, 56 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1575, 39 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 281, 107 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 1027, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 1804, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 3169, 30 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1593, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 281, 57 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-void-large - rotate: false - xy: 1069, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 1838, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-void-small - rotate: false - xy: 3169, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-void-tiny - rotate: false - xy: 1593, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-void-xlarge - rotate: false - xy: 795, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-display-large - rotate: false - xy: 1111, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 1872, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-display-small - rotate: false - xy: 3271, 118 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-display-tiny - rotate: false - xy: 1611, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-display-xlarge - rotate: false - xy: 309, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-processor-large - rotate: false - xy: 1027, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-processor-medium - rotate: false - xy: 1906, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-processor-small - rotate: false - xy: 3297, 112 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-processor-tiny - rotate: false - xy: 1629, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-processor-xlarge - rotate: false - xy: 309, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 1069, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1940, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 3323, 112 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1611, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 359, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 1111, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 1974, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 3476, 146 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1647, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 309, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 1153, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 2008, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 3476, 120 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1629, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 359, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 1069, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 2042, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 3502, 142 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1665, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 409, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 1111, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 2076, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 3502, 116 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1647, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 359, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 1153, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 2110, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 3528, 142 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1683, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 409, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-bank-large - rotate: false - xy: 1195, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-bank-medium - rotate: false - xy: 2144, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-bank-small - rotate: false - xy: 3528, 116 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-bank-tiny - rotate: false - xy: 1665, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-bank-xlarge - rotate: false - xy: 459, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-cell-large - rotate: false - xy: 1111, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-cell-medium - rotate: false - xy: 2178, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-cell-small - rotate: false - xy: 3195, 82 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-cell-tiny - rotate: false - xy: 1701, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-cell-xlarge - rotate: false - xy: 409, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 1153, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 2212, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 3195, 56 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1683, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 459, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 1195, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 2246, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 3195, 30 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1719, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 509, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 1237, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 2280, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 3195, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1701, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 459, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 1153, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 2314, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 3201, 127 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1737, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 509, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 1195, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 2348, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 3944, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1719, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 559, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 1237, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 2382, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 3970, 257 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1755, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 509, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 1279, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 2416, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 3996, 256 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1737, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 559, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 1195, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 2450, 126 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 4022, 256 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1773, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 609, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-micro-processor-large - rotate: false - xy: 1237, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-micro-processor-medium - rotate: false - xy: 2484, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-micro-processor-small - rotate: false - xy: 4048, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-micro-processor-tiny - rotate: false - xy: 1755, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-micro-processor-xlarge - rotate: false - xy: 559, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 1279, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 2917, 295 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 2727, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1791, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 609, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mud-large - rotate: false - xy: 1321, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mud-medium - rotate: false - xy: 2523, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-small - rotate: false - xy: 2753, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mud-tiny - rotate: false - xy: 1773, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mud-xlarge - rotate: false - xy: 659, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 1237, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 2518, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 2779, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1809, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 609, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-large - rotate: false - xy: 1279, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-medium - rotate: false - xy: 2518, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-small - rotate: false - xy: 2805, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-tiny - rotate: false - xy: 1791, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-xlarge - rotate: false - xy: 659, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-naval-factory-large - rotate: false - xy: 1321, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-naval-factory-medium - rotate: false - xy: 2573, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-naval-factory-small - rotate: false - xy: 2831, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-naval-factory-tiny - rotate: false - xy: 1827, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-naval-factory-xlarge - rotate: false - xy: 709, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 1363, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 2557, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 2857, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 1809, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 659, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-coal-large - rotate: false - xy: 1279, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-coal-medium - rotate: false - xy: 2591, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-small - rotate: false - xy: 2883, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-coal-tiny - rotate: false - xy: 1845, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-coal-xlarge - rotate: false - xy: 709, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-copper-large - rotate: false - xy: 1321, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-copper-medium - rotate: false - xy: 2607, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-small - rotate: false - xy: 2909, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-copper-tiny - rotate: false - xy: 1827, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-copper-xlarge - rotate: false - xy: 709, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-lead-large - rotate: false - xy: 1363, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-lead-medium - rotate: false - xy: 2641, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-small - rotate: false - xy: 2935, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-lead-tiny - rotate: false - xy: 1863, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-lead-xlarge - rotate: false - xy: 759, 304 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-scrap-large - rotate: false - xy: 1405, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-scrap-medium - rotate: false - xy: 2625, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-small - rotate: false - xy: 2961, 55 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-scrap-tiny - rotate: false - xy: 1845, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-scrap-xlarge - rotate: false - xy: 759, 254 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-thorium-large - rotate: false - xy: 1321, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-thorium-medium - rotate: false - xy: 2675, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-small - rotate: false - xy: 2987, 41 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-thorium-tiny - rotate: false - xy: 1881, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-thorium-xlarge - rotate: false - xy: 759, 204 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ore-titanium-large - rotate: false - xy: 1363, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ore-titanium-medium - rotate: false - xy: 2659, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-small - rotate: false - xy: 3013, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-titanium-tiny - rotate: false - xy: 1863, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-titanium-xlarge - rotate: false - xy: 809, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-dome-large - rotate: false - xy: 1405, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-dome-medium - rotate: false - xy: 2693, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-dome-small - rotate: false - xy: 3039, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-dome-tiny - rotate: false - xy: 1899, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-dome-xlarge - rotate: false - xy: 809, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 1447, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 2557, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 3065, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1881, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 809, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 1363, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 2591, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 3424, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1917, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 809, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-parallax-large - rotate: false - xy: 1405, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-parallax-medium - rotate: false - xy: 2625, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-small - rotate: false - xy: 3450, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-parallax-tiny - rotate: false - xy: 1899, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-parallax-xlarge - rotate: false - xy: 281, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-conveyor-large - rotate: false - xy: 1447, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-conveyor-medium - rotate: false - xy: 2659, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-conveyor-small - rotate: false - xy: 3476, 94 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-conveyor-tiny - rotate: false - xy: 1935, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-conveyor-xlarge - rotate: false - xy: 331, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-router-large - rotate: false - xy: 1489, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-router-medium - rotate: false - xy: 2693, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-router-small - rotate: false - xy: 3502, 90 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-router-tiny - rotate: false - xy: 1917, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-router-xlarge - rotate: false - xy: 331, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 1405, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 2552, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 3528, 90 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1953, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 381, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 1447, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 2586, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 4048, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 1935, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 331, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 1489, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 2552, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 3227, 112 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1971, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 381, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 1531, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 1447, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 2586, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 3221, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1953, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 431, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 1157, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 3221, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1989, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 381, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 1489, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 1191, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 3221, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1971, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 431, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 1531, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 1225, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 3221, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 2007, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 481, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 1573, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 1259, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 3247, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1989, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 431, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-large - rotate: false - xy: 1489, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-medium - rotate: false - xy: 1293, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-small - rotate: false - xy: 3247, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-tiny - rotate: false - xy: 2025, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-xlarge - rotate: false - xy: 481, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 1531, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 1573, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 1327, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 3247, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 2007, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 531, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 1361, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 3247, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 2043, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 481, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large - rotate: false - xy: 1615, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 1395, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-small - rotate: false - xy: 3273, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plated-conduit-tiny - rotate: false - xy: 2025, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plated-conduit-xlarge - rotate: false - xy: 531, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 1531, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1429, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 3299, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 2061, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 581, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 1573, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 1615, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1463, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 3273, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 2043, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 531, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 1497, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 3273, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 2079, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 581, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 1657, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 1531, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 3299, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 2061, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 631, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 1573, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1565, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 3273, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 2097, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 581, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 1615, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 1599, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 3299, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 2079, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 631, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 1657, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 1633, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 3299, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 2115, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 681, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 1699, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 1667, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 3325, 86 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 2097, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 631, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1615, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 1701, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 3325, 60 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 2133, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 681, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-resupply-point-large - rotate: false - xy: 1657, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-resupply-point-medium - rotate: false - xy: 1735, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-resupply-point-small - rotate: false - xy: 3325, 34 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-resupply-point-tiny - rotate: false - xy: 2115, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-resupply-point-xlarge - rotate: false - xy: 731, 154 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1699, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 1769, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 3325, 8 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 2151, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 681, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 1741, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 1803, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 2629, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 2133, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 731, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 1657, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 1837, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 2655, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 2169, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 731, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 1699, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 1871, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 2681, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 2151, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 331, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 1741, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 1905, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 2805, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 2187, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-large - rotate: false - xy: 1783, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-wall-medium - rotate: false - xy: 1939, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-small - rotate: false - xy: 2831, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-wall-tiny - rotate: false - xy: 2169, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-xlarge - rotate: false - xy: 381, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 431, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 1699, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 1973, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 2857, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 2205, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 481, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 1741, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 2007, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 2883, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 2187, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 531, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 1783, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 2041, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 2909, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 2223, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-large - rotate: false - xy: 1825, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-wall-medium - rotate: false - xy: 2075, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-small - rotate: false - xy: 2935, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-wall-tiny - rotate: false - xy: 2205, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-xlarge - rotate: false - xy: 581, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 1741, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 2109, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 2961, 29 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 2241, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 631, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 681, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 1783, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 2143, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 2987, 15 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 2223, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 731, 4 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 1825, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 2177, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 3013, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 2259, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 781, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 1867, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 2211, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 3039, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 2241, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 781, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 1783, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 2245, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 881, 135 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 2277, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 781, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 1825, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 1867, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 2279, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 881, 109 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 2259, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 831, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 2313, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 881, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 2295, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 831, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large - rotate: false - xy: 1909, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-segment-medium - rotate: false - xy: 2347, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-segment-small - rotate: false - xy: 881, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-segment-tiny - rotate: false - xy: 2277, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-segment-xlarge - rotate: false - xy: 831, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1825, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 2381, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 881, 31 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 2313, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1867, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 2415, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 881, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 2295, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 1909, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 2449, 92 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 907, 148 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 2331, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-large - rotate: false - xy: 1951, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-wall-medium - rotate: false - xy: 2483, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-small - rotate: false - xy: 933, 148 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-wall-tiny - rotate: false - xy: 2313, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-xlarge - rotate: false - xy: 959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 1009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 1867, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 2517, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 907, 122 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 2349, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 1059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 1909, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 2707, 260 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 959, 148 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 2331, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 1109, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-crucible-large - rotate: false - xy: 1951, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-crucible-medium - rotate: false - xy: 2709, 226 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-crucible-small - rotate: false - xy: 907, 96 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-crucible-tiny - rotate: false - xy: 2367, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-crucible-xlarge - rotate: false - xy: 1159, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 1993, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 2727, 192 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 933, 122 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 2349, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 1209, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-slag-large - rotate: false - xy: 1909, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 2727, 158 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 985, 148 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 2385, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge - rotate: false - xy: 1259, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-boulder-large - rotate: false - xy: 1951, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-boulder-medium - rotate: false - xy: 2741, 260 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-small - rotate: false - xy: 907, 70 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-boulder-tiny - rotate: false - xy: 2367, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-boulder-xlarge - rotate: false - xy: 1309, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 1993, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 2743, 226 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 2035, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 2761, 192 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 933, 96 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 2403, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 1359, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 959, 122 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 2385, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-large - rotate: false - xy: 1951, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-wall-medium - rotate: false - xy: 2761, 158 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-small - rotate: false - xy: 907, 44 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-wall-tiny - rotate: false - xy: 2403, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-xlarge - rotate: false - xy: 1409, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 1459, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 1993, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 2035, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 2775, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 933, 70 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 2421, 65 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 1509, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 2777, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 959, 96 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 2421, 47 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 1559, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 2077, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 2795, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 985, 122 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 3351, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 1609, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 1993, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 2795, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 907, 18 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 3351, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 1659, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 2035, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 2809, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 933, 44 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 3351, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 1709, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 2077, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 2811, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 959, 70 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 3351, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 1759, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 2119, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 2843, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 985, 96 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 3351, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 1809, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 2035, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 2877, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 933, 18 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 3351, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 1859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 2077, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 2845, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 959, 44 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 3369, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 1909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-wall-large - rotate: false - xy: 2119, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-wall-medium - rotate: false - xy: 2829, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-wall-small - rotate: false - xy: 985, 70 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-wall-tiny - rotate: false - xy: 3369, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-wall-xlarge - rotate: false - xy: 1959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-steam-generator-large - rotate: false - xy: 2161, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-steam-generator-medium - rotate: false - xy: 2829, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-small - rotate: false - xy: 959, 18 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-steam-generator-tiny - rotate: false - xy: 3387, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-steam-generator-xlarge - rotate: false - xy: 2009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 2077, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 2879, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 985, 44 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 3369, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-large - rotate: false - xy: 2119, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-wall-medium - rotate: false - xy: 2863, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-small - rotate: false - xy: 985, 18 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-wall-tiny - rotate: false - xy: 3387, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-xlarge - rotate: false - xy: 2059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 2109, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 2161, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 2863, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1011, 135 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 3405, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 2159, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 2203, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 2119, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 2911, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 1037, 135 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 3369, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 2209, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 2913, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1011, 109 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 3387, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 2259, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 2161, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 2897, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 1011, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 3405, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 2309, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-switch-large - rotate: false - xy: 2203, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-switch-medium - rotate: false - xy: 2897, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-switch-small - rotate: false - xy: 1037, 109 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-switch-tiny - rotate: false - xy: 3369, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-switch-xlarge - rotate: false - xy: 2359, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 2245, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 2931, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 1011, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 3387, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 2409, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 2161, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 2931, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 1011, 31 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 3405, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 2459, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 2203, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 2945, 261 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 1037, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 3369, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 2509, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-large - rotate: false - xy: 2245, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-medium - rotate: false - xy: 2947, 227 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-small - rotate: false - xy: 1037, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-tiny - rotate: false - xy: 3387, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-xlarge - rotate: false - xy: 2559, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 2287, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 2979, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 1037, 31 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 3405, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 2609, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 2203, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 3013, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 1011, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 3387, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 2659, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 2245, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 3047, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1037, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 3405, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 2709, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 2287, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 2329, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 3081, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 1063, 127 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 3405, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 2759, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 3115, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1063, 101 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 3423, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 2809, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 2245, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 3149, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 1063, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 3441, 82 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 2859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 2287, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 3183, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 1063, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 3423, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 2909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 2329, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 2371, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 3217, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 1089, 127 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 3423, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 2959, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 3251, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 1089, 101 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 3441, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 3009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-underflow-gate-large - rotate: false - xy: 2287, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-underflow-gate-medium - rotate: false - xy: 3285, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-underflow-gate-small - rotate: false - xy: 1089, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-underflow-gate-tiny - rotate: false - xy: 3423, 28 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-underflow-gate-xlarge - rotate: false - xy: 3059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 2329, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 3319, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 1089, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 3441, 46 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 3109, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 2371, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 3353, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 1063, 23 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 3441, 28 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 3159, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 2413, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 3387, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 1089, 23 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 3423, 10 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 3209, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 2329, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 3421, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 1115, 101 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 3441, 10 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 3259, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 2371, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 3455, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1115, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 2707, 40 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 3309, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 2413, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 3489, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 1115, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 2725, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 3359, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 2455, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 2981, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 1115, 23 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 2743, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 3409, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 3301, 342 - 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: 4059, 310 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 2959, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 2997, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 3111, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 3035, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 3073, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1141, 75 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 3225, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 3149, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 3187, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 3263, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 3015, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 3049, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 3083, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 3117, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 3151, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 3185, 240 - 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: 2707, 58 - size: 18, 18 - orig: 18, 18 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 2581, 253 - 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: 3339, 342 - 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: 1141, 33 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -item-blast-compound-icon - rotate: false - xy: 3219, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-icon - rotate: false - xy: 3253, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-icon - rotate: false - xy: 3287, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-icon - rotate: false - xy: 3321, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-icon - rotate: false - xy: 3355, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-icon - rotate: false - xy: 3389, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-icon - rotate: false - xy: 3423, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-icon - rotate: false - xy: 3457, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-icon - rotate: false - xy: 3491, 240 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-icon - rotate: false - xy: 2965, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-icon - rotate: false - xy: 2965, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-icon - rotate: false - xy: 2999, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-icon - rotate: false - xy: 2999, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-icon - rotate: false - xy: 3033, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-icon - rotate: false - xy: 3033, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-icon - rotate: false - xy: 3067, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-icon - rotate: false - xy: 3067, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-icon - rotate: false - xy: 3101, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-icon - rotate: false - xy: 3101, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-icon - rotate: false - xy: 3135, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -logic-node - rotate: false - xy: 3135, 172 - 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: 3415, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 3377, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 1193, 64 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 2875, 295 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 859, 177 - size: 40, 24 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 1167, 59 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -scroll-knob-vertical-thin - rotate: false - xy: 3645, 321 - size: 12, 40 - orig: 12, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 821, 463 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 3200, 162 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 3978, 283 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 4009, 282 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 3032, 132 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 309, 354 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 901, 174 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 3453, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 3491, 342 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 2623, 258 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-white - rotate: false - xy: 2661, 258 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -unit-alpha-large - rotate: false - xy: 2371, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-alpha-medium - rotate: false - xy: 3169, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-alpha-small - rotate: false - xy: 1167, 33 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-alpha-tiny - rotate: false - xy: 2761, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-alpha-xlarge - rotate: false - xy: 3459, 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: 3063, 138 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-antumbra-small - rotate: false - xy: 4074, 258 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-antumbra-tiny - rotate: false - xy: 1141, 109 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-antumbra-xlarge - rotate: false - xy: 3709, 330 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-arkyid-large - rotate: false - xy: 2413, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-arkyid-medium - rotate: false - xy: 3169, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-arkyid-small - rotate: false - xy: 1219, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-arkyid-tiny - rotate: false - xy: 2779, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-arkyid-xlarge - rotate: false - xy: 3509, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-atrax-large - rotate: false - xy: 2455, 298 - size: 40, 29 - orig: 40, 29 - offset: 0, 0 - index: -1 -unit-atrax-medium - rotate: false - xy: 3203, 215 - size: 32, 23 - orig: 32, 23 - offset: 0, 0 - index: -1 -unit-atrax-small - rotate: false - xy: 3091, 7 - size: 24, 17 - orig: 24, 17 - offset: 0, 0 - index: -1 -unit-atrax-tiny - rotate: false - xy: 2981, 227 - size: 16, 11 - orig: 16, 11 - offset: 0, 0 - index: -1 -unit-atrax-xlarge - rotate: false - xy: 3559, 427 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -unit-beta-large - rotate: false - xy: 2497, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-beta-medium - rotate: false - xy: 3203, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-beta-small - rotate: false - xy: 1193, 38 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-beta-tiny - rotate: false - xy: 3555, 333 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-beta-xlarge - rotate: false - xy: 3609, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-bryde-large - rotate: false - xy: 2413, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-bryde-medium - rotate: false - xy: 3237, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-bryde-small - rotate: false - xy: 1219, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-bryde-tiny - rotate: false - xy: 3555, 315 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-bryde-xlarge - rotate: false - xy: 3659, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-corvus-large - rotate: false - xy: 2455, 270 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-corvus-medium - rotate: false - xy: 3926, 341 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-corvus-small - rotate: false - xy: 907, 1 - 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: 3709, 430 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-crawler-large - rotate: false - xy: 2497, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-crawler-medium - rotate: false - xy: 3271, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-crawler-small - rotate: false - xy: 1245, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-crawler-tiny - rotate: false - xy: 1291, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-crawler-xlarge - rotate: false - xy: 3759, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-large - rotate: false - xy: 2539, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-dagger-medium - rotate: false - xy: 3305, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-dagger-small - rotate: false - xy: 1245, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-dagger-tiny - rotate: false - xy: 1309, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-dagger-xlarge - rotate: false - xy: 3809, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-large - rotate: false - xy: 2455, 228 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-eclipse-medium - rotate: false - xy: 3339, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-eclipse-small - rotate: false - xy: 1271, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-eclipse-tiny - rotate: false - xy: 1327, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-eclipse-xlarge - rotate: false - xy: 3859, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-large - rotate: false - xy: 2497, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-flare-medium - rotate: false - xy: 3373, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-flare-small - rotate: false - xy: 1271, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-flare-tiny - rotate: false - xy: 1345, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-flare-xlarge - rotate: false - xy: 3909, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-large - rotate: false - xy: 2539, 295 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-fortress-medium - rotate: false - xy: 3407, 213 - size: 32, 25 - orig: 32, 25 - offset: 0, 0 - index: -1 -unit-fortress-small - rotate: false - xy: 1297, 80 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-fortress-tiny - rotate: false - xy: 3537, 311 - size: 16, 12 - orig: 16, 12 - offset: 0, 0 - index: -1 -unit-fortress-xlarge - rotate: false - xy: 3959, 423 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-gamma-large - rotate: false - xy: 2581, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-gamma-medium - rotate: false - xy: 3441, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-gamma-small - rotate: false - xy: 1297, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-gamma-tiny - rotate: false - xy: 1363, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-gamma-xlarge - rotate: false - xy: 4009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-horizon-large - rotate: false - xy: 2539, 253 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-horizon-medium - rotate: false - xy: 3475, 206 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-horizon-small - rotate: false - xy: 1323, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-horizon-tiny - rotate: false - xy: 1381, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-horizon-xlarge - rotate: false - xy: 3709, 380 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mace-large - rotate: false - xy: 2581, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mace-medium - rotate: false - xy: 3237, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mace-small - rotate: false - xy: 1349, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mace-tiny - rotate: false - xy: 1399, 31 - 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: 2623, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mega-medium - rotate: false - xy: 3271, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mega-small - rotate: false - xy: 1375, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mega-tiny - rotate: false - xy: 1417, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mega-xlarge - rotate: false - xy: 3809, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-minke-large - rotate: false - xy: 1052, 161 - size: 34, 40 - orig: 34, 40 - offset: 0, 0 - index: -1 -unit-minke-medium - rotate: false - xy: 3509, 168 - 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: 3944, 323 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-minke-xlarge - rotate: false - xy: 3799, 313 - size: 41, 48 - orig: 41, 48 - offset: 0, 0 - index: -1 -unit-mono-large - rotate: false - xy: 2623, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mono-medium - rotate: false - xy: 3305, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mono-small - rotate: false - xy: 1401, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mono-tiny - rotate: false - xy: 3573, 325 - 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: 2665, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-nova-medium - rotate: false - xy: 3339, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-nova-small - rotate: false - xy: 1427, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-nova-tiny - rotate: false - xy: 3591, 325 - 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: 2665, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-oct-medium - rotate: false - xy: 3373, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-oct-small - rotate: false - xy: 1453, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-oct-tiny - rotate: false - xy: 3609, 327 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-oct-xlarge - rotate: false - xy: 3959, 373 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-omura-large - rotate: false - xy: 3093, 130 - size: 28, 40 - orig: 28, 40 - offset: 0, 0 - index: -1 -unit-omura-medium - rotate: false - xy: 3585, 343 - size: 22, 32 - orig: 22, 32 - offset: 0, 0 - index: -1 -unit-omura-small - rotate: false - xy: 3627, 319 - size: 16, 24 - orig: 16, 24 - offset: 0, 0 - index: -1 -unit-omura-tiny - rotate: false - xy: 1435, 31 - size: 11, 16 - orig: 11, 16 - offset: 0, 0 - index: -1 -unit-omura-xlarge - rotate: false - xy: 1088, 153 - size: 33, 48 - orig: 33, 48 - offset: 0, 0 - index: -1 -unit-poly-large - rotate: false - xy: 2707, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-poly-medium - rotate: false - xy: 3407, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-poly-small - rotate: false - xy: 1479, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-poly-tiny - rotate: false - xy: 3573, 307 - 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: 2707, 294 - size: 40, 33 - orig: 40, 33 - offset: 0, 0 - index: -1 -unit-pulsar-medium - rotate: false - xy: 3441, 178 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-pulsar-small - rotate: false - xy: 1323, 54 - size: 24, 19 - orig: 24, 19 - 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, 5 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-quad-large - rotate: false - xy: 2749, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quad-medium - rotate: false - xy: 3339, 139 - size: 31, 31 - orig: 31, 31 - offset: 0, 0 - index: -1 -unit-quad-small - rotate: false - xy: 1505, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quad-tiny - rotate: false - xy: 959, 1 - size: 15, 15 - orig: 15, 15 - offset: 0, 0 - index: -1 -unit-quad-xlarge - rotate: false - xy: 3559, 377 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-quasar-large - rotate: false - xy: 2791, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quasar-medium - rotate: false - xy: 3475, 172 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-quasar-small - rotate: false - xy: 1531, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quasar-tiny - rotate: false - xy: 3591, 307 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-quasar-xlarge - rotate: false - xy: 3609, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-reign-large - rotate: false - xy: 2581, 259 - size: 40, 26 - orig: 40, 26 - offset: 0, 0 - index: -1 -unit-reign-medium - rotate: false - xy: 3372, 150 - size: 31, 20 - orig: 31, 20 - offset: 0, 0 - index: -1 -unit-reign-small - rotate: false - xy: 933, 1 - size: 24, 15 - orig: 24, 15 - offset: 0, 0 - index: -1 -unit-reign-tiny - rotate: false - xy: 4040, 310 - size: 15, 10 - orig: 15, 10 - offset: 0, 0 - index: -1 -unit-reign-xlarge - rotate: false - xy: 3659, 380 - size: 48, 31 - orig: 48, 31 - offset: 0, 0 - index: -1 -unit-risso-large - rotate: false - xy: 1015, 161 - size: 35, 40 - orig: 35, 40 - offset: 0, 0 - index: -1 -unit-risso-medium - rotate: false - xy: 3123, 138 - size: 28, 32 - orig: 28, 32 - offset: 0, 0 - index: -1 -unit-risso-small - rotate: false - xy: 4074, 232 - size: 21, 24 - orig: 21, 24 - offset: 0, 0 - index: -1 -unit-risso-tiny - rotate: false - xy: 3459, 160 - size: 14, 16 - orig: 14, 16 - offset: 0, 0 - index: -1 -unit-risso-xlarge - rotate: false - xy: 3754, 313 - size: 43, 48 - orig: 43, 48 - offset: 0, 0 - index: -1 -unit-scepter-large - rotate: false - xy: 2749, 295 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-scepter-medium - rotate: false - xy: 3203, 153 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-scepter-small - rotate: false - xy: 1349, 54 - 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: 181, 5 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-sei-large - rotate: false - xy: 2833, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-sei-medium - rotate: false - xy: 3237, 138 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-sei-small - rotate: false - xy: 1557, 75 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-sei-tiny - rotate: false - xy: 3609, 309 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-sei-xlarge - rotate: false - xy: 3959, 323 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-spiroct-large - rotate: false - xy: 2791, 296 - size: 40, 31 - orig: 40, 31 - offset: 0, 0 - index: -1 -unit-spiroct-medium - rotate: false - xy: 2999, 145 - size: 31, 25 - orig: 31, 25 - offset: 0, 0 - index: -1 -unit-spiroct-small - rotate: false - xy: 1375, 54 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-spiroct-tiny - rotate: false - xy: 1135, 1 - size: 15, 12 - orig: 15, 12 - offset: 0, 0 - index: -1 -unit-spiroct-xlarge - rotate: false - xy: 231, 6 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-toxopid-large - rotate: false - xy: 1123, 161 - 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: 1427, 49 - size: 20, 24 - orig: 20, 24 - offset: 0, 0 - index: -1 -unit-toxopid-tiny - rotate: false - xy: 3459, 82 - size: 13, 16 - orig: 13, 16 - offset: 0, 0 - index: -1 -unit-toxopid-xlarge - rotate: false - xy: 2875, 321 - size: 40, 48 - orig: 40, 48 - offset: 0, 0 - index: -1 -unit-vela-large - rotate: false - xy: 2833, 295 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-vela-medium - rotate: false - xy: 3271, 144 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-vela-small - rotate: false - xy: 1583, 80 - 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: 4009, 322 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-zenith-large - rotate: false - xy: 2917, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-zenith-medium - rotate: false - xy: 3305, 138 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-zenith-small - rotate: false - xy: 1401, 49 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-zenith-tiny - rotate: false - xy: 3555, 297 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-zenith-xlarge - rotate: false - xy: 3659, 330 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wavepane - rotate: false - xy: 939, 174 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -white-pane - rotate: false - xy: 977, 174 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 3754, 375 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 2620, 88 - 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 8b88eb4a19..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 56e473b452..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 8abebc8d56..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 5fcf60bcf8..0000000000 Binary files a/core/assets/sprites/sprites5.png and /dev/null differ diff --git a/core/src/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java index 553c4ce2cc..978361898a 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.*; @@ -74,7 +75,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 -> { + 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); }; @@ -103,6 +104,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform assets.load(schematics); assets.loadRun("contentinit", ContentLoader.class, () -> content.init(), () -> content.load()); + assets.loadRun("baseparts", BaseRegistry.class, () -> {}, () -> bases.load()); } @Override @@ -110,8 +112,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); } } diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 26bcbcf059..d8928a434e 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -10,14 +10,14 @@ import arc.util.*; import arc.util.Log.*; import mindustry.ai.*; import mindustry.async.*; -import mindustry.audio.*; import mindustry.core.*; import mindustry.entities.*; -import mindustry.game.*; import mindustry.game.EventType.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.input.*; import mindustry.io.*; +import mindustry.logic.*; import mindustry.maps.Map; import mindustry.maps.*; import mindustry.mod.*; @@ -36,6 +36,8 @@ public class Vars implements Loadable{ 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; /** Maximum extra padding around deployment schematics. */ public static final int maxLoadoutSchematicPad = 5; /** Maximum schematic size.*/ @@ -55,7 +57,7 @@ public class Vars implements Loadable{ /** URL for sending crash reports to */ 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/"; + public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-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"; /** URL to the JSON file containing all the BE servers. Only queried in BE. */ @@ -63,17 +65,17 @@ public class Vars implements Loadable{ /** 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 of the github issue report template.*/ - public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; + 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 */ public static final int maxTextLength = 150; /** max player name length in bytes */ public static final int maxNameLength = 40; - /** shadow color for turrets */ - public static final float turretShadowColor = Color.toFloatBits(0, 0, 0, 0.22f); /** displayed item size when ingame. */ public static final float itemSize = 5f; /** units outside of this bound will die instantly */ @@ -84,10 +86,14 @@ public class Vars implements Loadable{ 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 turns have to pass before invasions start */ + public static final int invasionGracePeriod = 20; /** min armor fraction damage; e.g. 0.05 = at least 5% damage */ public static final float minArmorDamage = 0.1f; /** launch animation duration */ @@ -183,15 +189,14 @@ 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 Universe universe; public static World world; @@ -232,6 +237,7 @@ 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(); @@ -252,8 +258,7 @@ 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(); @@ -265,6 +270,7 @@ public class Vars implements Loadable{ indexer = new BlockIndexer(); pathfinder = new Pathfinder(); bases = new BaseRegistry(); + constants = new GlobalConstants(); state = new GameState(); @@ -282,10 +288,10 @@ public class Vars implements Loadable{ 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); @@ -301,9 +307,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)); @@ -315,19 +321,25 @@ 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; } @@ -383,6 +395,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..2a81d1535d 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,129 @@ import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.defense.*; +import mindustry.world.blocks.distribution.*; 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 +152,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 @@ -117,6 +206,13 @@ public class BaseAI{ if(!Build.validPlace(tile.block, data.team, realX, realY, tile.rotation)){ return false; } + Tile wtile = world.tile(realX, realY); + + //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 @@ -179,13 +275,18 @@ public class BaseAI{ } Tile o = world.tile(tile.x + p.x, tile.y + p.y); + if(o != null && (o.block() instanceof PayloadAcceptor || o.block() instanceof PayloadConveyor)){ + break; + } + 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 25aec37c97..683d04cc78 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -6,10 +6,12 @@ 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.core.*; import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; @@ -54,18 +56,7 @@ public class BlockIndexer{ 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); + updateIndices(event.tile); }); Events.on(WorldLoadEvent.class, event -> { @@ -109,6 +100,21 @@ public class BlockIndexer{ }); } + public void updateIndices(Tile tile){ + if(typeMap.get(tile.pos()) != null){ + TileIndex index = typeMap.get(tile.pos()); + for(BlockFlag flag : index.flags){ + getFlagged(index.team)[flag.ordinal()].remove(tile); + } + + if(index.flags.contains(BlockFlag.unitModifier)){ + updateCap(index.team); + } + } + process(tile); + updateQuadrant(tile); + } + private TileArray[] getFlagged(Team team){ return flagMap[team.id]; } @@ -178,8 +184,8 @@ public class BlockIndexer{ public boolean eachBlock(Team team, float wx, float wy, float range, Boolf pred, Cons cons){ intSet.clear(); - int tx = world.toTile(wx); - int ty = world.toTile(wy); + int tx = World.toTile(wx); + int ty = World.toTile(wy); int tileRange = (int)(range / tilesize + 1); boolean any = false; @@ -192,7 +198,7 @@ public class BlockIndexer{ if(other == null) continue; - if(other.team == team && pred.get(other) && intSet.add(other.pos())){ + if((team == null || other.team == team) && pred.get(other) && intSet.add(other.pos())){ cons.get(other); any = true; } @@ -205,8 +211,22 @@ public class BlockIndexer{ /** 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,12 +235,13 @@ public class BlockIndexer{ } } } + return returnArray; } public void notifyTileDamaged(Building entity){ if(damagedTiles[entity.team.id] == null){ - damagedTiles[entity.team.id] = new ObjectSet(); + damagedTiles[entity.team.id] = new ObjectSet<>(); } damagedTiles[entity.team.id].add(entity); @@ -230,7 +251,7 @@ public class BlockIndexer{ 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){ @@ -259,10 +280,7 @@ public class BlockIndexer{ for(int ty = ry * quadrantSize; ty < (ry + 1) * quadrantSize && ty < world.height(); ty++){ Building e = world.build(tx, ty); - if(e == null) continue; - - if(e.team != team || !pred.get(e) || !e.block.targetable) - continue; + if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue; float ndst = e.dst2(x, y); if(ndst < range2 && (closest == null || @@ -309,6 +327,11 @@ public class BlockIndexer{ return null; } + /** Find the closest ore block relative to a position. */ + public Tile findClosestOre(Unit unit, Item item){ + return findClosestOre(unit.x, unit.y, item); + } + /** @return extra unit cap of a team. This is added onto the base value. */ public int getExtraUnits(Team team){ return unitCaps[team.id]; @@ -454,8 +477,8 @@ public class BlockIndexer{ } 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 c81b3b53cc..8c9a9cda6d 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -4,20 +4,22 @@ 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; @@ -35,7 +37,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 @@ -43,7 +45,7 @@ public class Pathfinder implements Runnable{ PathTile.health(tile) * 5 + (PathTile.nearSolid(tile) ? 2 : 0) + (PathTile.nearLiquid(tile) ? 6 : 0) + - (PathTile.deep(tile) ? 70 : 0) + + (PathTile.deep(tile) ? 6000 : 0) + (PathTile.damages(tile) ? 30 : 0), //legs @@ -51,7 +53,7 @@ public class Pathfinder implements Runnable{ (PathTile.solid(tile) ? 5 : 0), //water - (team, tile) -> PathTile.solid(tile) || !PathTile.liquid(tile) ? 200 : 2 + //TODO cannot go through blocks - pathfinding isn't great + (team, tile) -> PathTile.solid(tile) || !PathTile.liquid(tile) ? 200 : 2 + (PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) + (PathTile.deep(tile) ? -1 : 0) + (PathTile.damages(tile) ? 35 : 0) @@ -86,9 +88,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,11 +109,10 @@ public class Pathfinder implements Runnable{ /** Packs a tile into its internal representation. */ private int packTile(Tile tile){ - //TODO nearGround is just the inverse of nearLiquid? boolean nearLiquid = false, nearSolid = false, nearGround = false; 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; @@ -116,11 +121,11 @@ public class Pathfinder implements Runnable{ } return PathTile.get( - tile.build == null ? 0 : Math.min((int)(tile.build.health / 40), 127), + tile.build == null || !tile.solid() || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80), tile.getTeamID(), tile.solid(), tile.floor().isLiquid, - tile.staticDarkness() >= 2, + tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air), nearLiquid, nearGround, nearSolid, @@ -188,6 +193,8 @@ public class Pathfinder implements Runnable{ for(Flowfield data : threadList){ updateFrontier(data, maxUpdate / threadList.size); + //TODO implement timeouts... or don't + /* //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 @@ -196,12 +203,11 @@ public class Pathfinder implements Runnable{ 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); - //} + 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); }); @@ -210,7 +216,7 @@ public class Pathfinder implements Runnable{ //remove from this thread list with a delay threadList.remove(data); }); - } + }*/ } } @@ -353,13 +359,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++){ @@ -445,16 +445,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. */ @@ -463,13 +462,13 @@ 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! */ - IntSeq targets = new IntSeq(); + final IntSeq targets = new IntSeq(); /** current search ID */ int search = 1; /** last updated time */ diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 417909a92b..afc8ab30db 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; @@ -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.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)){ @@ -157,7 +178,7 @@ public class WaveSpawner{ } private void spawnEffect(Unit unit){ - Call.spawnEffect(unit.x, unit.y, unit.type()); + Call.spawnEffect(unit.x, unit.y, unit.type); Time.run(30f, unit::add); } 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/ArrowFormation.java b/core/src/mindustry/ai/formations/patterns/ArrowFormation.java deleted file mode 100644 index e3db12d2fe..0000000000 --- a/core/src/mindustry/ai/formations/patterns/ArrowFormation.java +++ /dev/null @@ -1,26 +0,0 @@ -package mindustry.ai.formations.patterns; - -import arc.math.geom.*; -import mindustry.ai.formations.*; - -public class ArrowFormation extends FormationPattern{ - //total triangular numbers - private static final int totalTris = 30; - //triangular number table - private static final int[] triTable = new int[totalTris]; - - //calculat triangular numbers - static{ - int sum = 0; - for(int i = 0; i < totalTris; i++){ - triTable[i] = sum; - sum += (i + 1); - } - } - - @Override - public Vec3 calculateSlotLocation(Vec3 out, int slot){ - //TODO - return out; - } -} 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 6b89adcce3..ce8b5ae92d 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.*; @@ -14,17 +15,16 @@ import static mindustry.Vars.*; public class BuilderAI extends AIController{ float buildRadius = 1500; boolean found = false; - @Nullable Builderc following; + @Nullable Unit following; @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){ //try to follow and mimic someone @@ -32,21 +32,31 @@ public class BuilderAI extends AIController{ //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()); } - if(builder.buildPlan() != null){ + if(unit.buildPlan() != null){ //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(); + return; + } + } + } boolean valid = - (req.tile().build instanceof ConstructBuild && req.tile().bc().cblock == req.block) || + (req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.cblock == 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 +66,7 @@ public class BuilderAI extends AIController{ moveTo(req.tile(), buildingRange - 20f); }else{ //discard invalid request - builder.plans().removeFirst(); + unit.plans.removeFirst(); } }else{ @@ -67,18 +77,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,9 +94,11 @@ 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)){ - Queue blocks = unit.team().data().blocks; + if(!unit.team.data().blocks.isEmpty() && following == null && timer.get(timerTarget3, rebuildTime)){ + Queue blocks = unit.team.data().blocks; BlockPlan block = blocks.first(); //check if it's already been placed @@ -96,14 +106,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/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index 1237966425..239e48682a 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){ + if(!unit.type.circleTarget){ moveTo(target, unit.range() * 0.8f); unit.lookAt(target); }else{ - attack(80f); + attack(120f); } } @@ -34,17 +34,15 @@ 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); @@ -57,7 +55,7 @@ public class FlyingAI extends AIController{ vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.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..8a4f351b4e 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,52 @@ 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 : leader.type.canBoost ? leader.elevation : 0f, 0.08f); } 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.x, leader.vel.y); - float margin = 3f; + float speed = unit.realSpeed() * unit.floorSpeedMultiplier() * 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 +85,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.1f; } @Override diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index 88fa3fc51c..2a711235c9 100644 --- a/core/src/mindustry/ai/types/GroundAI.java +++ b/core/src/mindustry/ai/types/GroundAI.java @@ -13,8 +13,6 @@ 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(){ @@ -34,55 +32,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.canPassOn()){ + if(unit.type.canBoost && !unit.onSolid()){ unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); } - if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type().rotateShooting){ - if(unit.type().hasWeapons()){ - //TODO certain units should not look at the target, e.g. ships - 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/LogicAI.java b/core/src/mindustry/ai/types/LogicAI.java new file mode 100644 index 0000000000..a0eb6d1fa9 --- /dev/null +++ b/core/src/mindustry/ai/types/LogicAI.java @@ -0,0 +1,159 @@ +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.stop; + 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()), 0.08f); + } + + //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(); + } + + unit.approach(vec); + } + + //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..28306deb84 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.range)){ + 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.range / 2f, 20f); - if(unit.within(ore, unit.type().range)){ - miner.mineTile(ore); + if(unit.within(ore, unit.type.range)){ + 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..db20cc7d60 100644 --- a/core/src/mindustry/ai/types/RepairAI.java +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -2,33 +2,45 @@ package mindustry.ai.types; 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{ @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); + } } @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..1143f31675 100644 --- a/core/src/mindustry/ai/types/SuicideAI.java +++ b/core/src/mindustry/ai/types/SuicideAI.java @@ -6,6 +6,8 @@ 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.meta.*; public class SuicideAI extends GroundAI{ @@ -14,52 +16,58 @@ public class SuicideAI extends GroundAI{ @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(!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.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) -> { + 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(); + } + }); + + //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 +75,10 @@ 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 && core != null){ - moveTo(Pathfinder.fieldCore); + pathfind(Pathfinder.fieldCore); } if(unit.moving()) unit.lookAt(unit.vel().angle()); @@ -78,4 +86,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..a9d4cdd90d 100644 --- a/core/src/mindustry/async/AsyncCore.java +++ b/core/src/mindustry/async/AsyncCore.java @@ -2,18 +2,16 @@ 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() + new PhysicsProcess() ); //futures to be awaited diff --git a/core/src/mindustry/async/PhysicsProcess.java b/core/src/mindustry/async/PhysicsProcess.java index 05c2665baf..a60dab7f68 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -1,31 +1,25 @@ package mindustry.async; -import arc.box2d.*; -import arc.box2d.BodyDef.*; +import arc.math.*; import arc.math.geom.*; +import arc.math.geom.QuadTree.*; import arc.struct.*; +import mindustry.*; +import mindustry.async.PhysicsProcess.PhysicsWorld.*; import mindustry.entities.*; import mindustry.gen.*; public class PhysicsProcess implements AsyncProcess{ - private Physics physics; + private static final int + layers = 3, + layerGround = 0, + layerLegs = 1, + layerFlying = 2; + + private PhysicsWorld physics; private Seq refs = new Seq<>(false); - private BodyDef def; - - private EntityGroup group; - private Filter flying = new Filter(){{ - maskBits = categoryBits = 2; - }}, ground = new Filter(){{ - maskBits = categoryBits = 1; - }}; - - public PhysicsProcess(){ - def = new BodyDef(); - def.type = BodyType.dynamicBody; - - //currently only enabled for units - group = Groups.unit; - } + //currently only enabled for units + private EntityGroup group = Groups.unit; @Override public void begin(){ @@ -34,47 +28,39 @@ public class PhysicsProcess implements AsyncProcess{ //remove stale entities refs.removeAll(ref -> { if(!ref.entity.isAdded()){ - physics.destroyBody(ref.body); + physics.remove(ref.body); ref.entity.physref(null); return true; } return false; }); - //find entities without bodies and assign them - for(Physicsc entity : group){ - boolean grounded = entity.isGrounded(); - int bits = grounded ? ground.maskBits : flying.maskBits; + //find Unit without bodies and assign them + for(Unit entity : group){ if(entity.physref() == null){ - //add bodies to entities that have none - FixtureDef fd = new FixtureDef(); - fd.shape = new CircleShape(entity.hitSize() / 2f); - fd.density = 5f; - fd.restitution = 0.0f; - fd.filter.maskBits = fd.filter.categoryBits = (grounded ? ground : flying).maskBits; - - def.position.set(entity); - - Body body = physics.createBody(def); - body.createFixture(fd); + PhysicsBody body = new PhysicsBody(); + body.x = entity.x(); + body.y = entity.y(); + body.mass = entity.mass(); + body.radius = entity.hitSize() / 2f; PhysicRef ref = new PhysicRef(entity, body); refs.add(ref); entity.physref(ref); + + physics.add(body); } //save last position PhysicRef ref = entity.physref(); - if(ref.body.getFixtureList().any() && ref.body.getFixtureList().first().getFilterData().categoryBits != bits){ - //set correct filter - ref.body.getFixtureList().first().setFilterData(grounded ? ground : flying); - } - - ref.velocity.set(entity.deltaX(), entity.deltaY()); - ref.position.set(entity); + ref.body.layer = + entity.type.allowLegStep ? layerLegs : + entity.isGrounded() ? layerGround : layerFlying; + ref.x = entity.x(); + ref.y = entity.y(); } } @@ -85,26 +71,11 @@ public class PhysicsProcess implements AsyncProcess{ //get last position vectors before step for(PhysicRef ref : refs){ //force set target position - ref.body.setPosition(ref.position.x, ref.position.y); - - //save last position for delta - ref.lastPosition.set(ref.body.getPosition()); - - //write velocity - ref.body.setLinearVelocity(ref.velocity); - - ref.lastVelocity.set(ref.velocity); + ref.body.x = ref.x; + ref.body.y = ref.y; } - physics.step(1f/45f, 5, 8); - - //get delta vectors - for(PhysicRef ref : refs){ - //get delta vector - ref.delta.set(ref.body.getPosition()).sub(ref.lastPosition); - - ref.velocity.set(ref.body.getLinearVelocity()); - } + physics.update(); } @Override @@ -115,13 +86,8 @@ public class PhysicsProcess implements AsyncProcess{ for(PhysicRef ref : refs){ Physicsc entity = ref.entity; - entity.move(ref.delta.x, ref.delta.y); - - //save last position - ref.position.set(entity); - - //add delta velocity - this doesn't work very well yet - //entity.vel().add(ref.velocity).sub(ref.lastVelocity); + //move by delta + entity.move(ref.body.x - ref.x, ref.body.y - ref.y); } } @@ -129,7 +95,6 @@ public class PhysicsProcess implements AsyncProcess{ public void reset(){ if(physics != null){ refs.clear(); - physics.dispose(); physics = null; } } @@ -138,17 +103,95 @@ public class PhysicsProcess implements AsyncProcess{ public void init(){ reset(); - physics = new Physics(new Vec2(), true); + physics = new PhysicsWorld(Vars.world.getQuadBounds(new Rect())); } public static class PhysicRef{ public Physicsc entity; - public Body body; - public Vec2 lastPosition = new Vec2(), delta = new Vec2(), velocity = new Vec2(), lastVelocity = new Vec2(), position = new Vec2(); + public PhysicsBody body; + public float x, y; - public PhysicRef(Physicsc entity, Body body){ + public PhysicRef(Physicsc entity, PhysicsBody body){ this.entity = entity; this.body = body; } } + + //world for simulating physics in a different thread + public static class PhysicsWorld{ + //how much to soften movement by + private static final float scl = 1.25f; + + private final QuadTree[] trees = new QuadTree[layers]; + private final Seq bodies = new Seq<>(false, 16, PhysicsBody.class); + private final Seq seq = new Seq<>(PhysicsBody.class); + private final Rect rect = new Rect(); + private final Vec2 vec = new Vec2(); + + public PhysicsWorld(Rect bounds){ + for(int i = 0; i < layers; i++){ + trees[i] = new QuadTree<>(new Rect(bounds)); + } + } + + public void add(PhysicsBody body){ + bodies.add(body); + } + + public void remove(PhysicsBody body){ + bodies.remove(body); + } + + public void update(){ + for(int i = 0; i < layers; i++){ + trees[i].clear(); + } + + for(int i = 0; i < bodies.size; i++){ + PhysicsBody body = bodies.items[i]; + body.collided = false; + trees[body.layer].insert(body); + } + + for(int i = 0; i < bodies.size; i++){ + PhysicsBody body = bodies.items[i]; + body.hitbox(rect); + + seq.size = 0; + trees[body.layer].intersect(rect, seq); + + for(int j = 0; j < seq.size; j++){ + PhysicsBody other = seq.items[j]; + + if(other == body || other.collided) continue; + + float rs = body.radius + other.radius; + float dst = Mathf.dst(body.x, body.y, other.x, other.y); + + if(dst < rs){ + vec.set(body.x - other.x, body.y - other.y).setLength(rs - dst); + float ms = body.mass + other.mass; + float m1 = other.mass / ms, m2 = body.mass / ms; + + body.x += vec.x * m1 / scl; + body.y += vec.y * m1 / scl; + other.x -= vec.x * m2 / scl; + other.y -= vec.y * m2 / scl; + } + } + body.collided = true; + } + } + + public static class PhysicsBody implements QuadTreeObject{ + public float x, y, radius, mass; + public int layer = 0; + public boolean collided = false; + + @Override + public void hitbox(Rect out){ + out.setCentered(x, y, radius * 2, radius * 2); + } + } + } } 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..bed176f972 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,32 @@ 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.stop(); + } + } + if(state.isMenu()){ silenced = false; if(ui.planet.isShown()){ @@ -79,10 +158,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 +286,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 +297,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 498bed9295..d071e7dab9 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3,6 +3,8 @@ package mindustry.content; import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; +import arc.struct.*; +import mindustry.*; import mindustry.ctype.*; import mindustry.entities.bullet.*; import mindustry.gen.*; @@ -34,10 +36,10 @@ 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, + 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, grass, salt, - metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, boulder, snowBoulder, saltWall, + 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, @@ -74,7 +76,7 @@ public class Blocks implements ContentList{ coreShard, coreFoundation, coreNucleus, vault, container, unloader, //turrets - duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown, segment, parallax, + duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, foreshadow, spectre, meltdown, segment, parallax, tsunami, //units commandCenter, @@ -86,7 +88,7 @@ public class Blocks implements ContentList{ message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, memoryBank, //campaign - launchPad, launchPadLarge, + launchPad, launchPadLarge, interplanetaryAccelerator, //misc experimental blockForge, blockLoader, blockUnloader; @@ -99,6 +101,8 @@ public class Blocks implements ContentList{ { alwaysReplace = true; hasShadow = false; + useColor = false; + wall = this; } @Override public void drawBase(Tile tile){} @@ -118,6 +122,7 @@ public class Blocks implements ContentList{ spawn = new OverlayFloor("spawn"){ { variants = 0; + needsSurface = false; } @Override public void drawBase(Tile tile){} @@ -130,7 +135,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 +173,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"){{ @@ -208,6 +215,18 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.slag; isLiquid = true; cacheLayer = CacheLayer.slag; + attributes.set(Attribute.heat, 0.85f); + + emitLight = true; + lightRadius = 40f; + lightColor = Color.orange.cpy().a(0.38f); + }}; + + space = new Floor("space"){{ + cacheLayer = CacheLayer.space; + placeableOn = false; + solid = true; + variants = 0; }}; stone = new Floor("stone"); @@ -242,7 +261,7 @@ public class Blocks implements ContentList{ blendGroup = basalt; emitLight = true; - lightRadius = 60f; + lightRadius = 50f; lightColor = Color.orange.cpy().a(0.3f); }}; @@ -268,6 +287,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); @@ -282,7 +305,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); }}; @@ -302,6 +325,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; }}; @@ -310,15 +338,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; }}; @@ -343,11 +362,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; }}; @@ -360,8 +385,6 @@ public class Blocks implements ContentList{ variants = 0; }}; - shrubs = new StaticWall("shrubs"); - whiteTreeDead = new TreeBlock("white-tree-dead"); whiteTree = new TreeBlock("white-tree"); @@ -370,13 +393,13 @@ public class Blocks implements ContentList{ variants = 3; }}; - shale = new Floor("shale"){{ - variants = 3; - attributes.set(Attribute.oil, 1f); + boulder = new Boulder("boulder"){{ + variants = 2; }}; - shaleWall = new StaticWall("shale-wall"){{ + snowBoulder = new Boulder("snow-boulder"){{ variants = 2; + snow.asFloor().decoration = ice.asFloor().decoration = iceSnow.asFloor().decoration = salt.asFloor().decoration = this; }}; shaleBoulder = new Boulder("shale-boulder"){{ @@ -391,6 +414,10 @@ public class Blocks implements ContentList{ variants = 2; }}; + basaltBoulder = new Boulder("basalt-boulder"){{ + variants = 2; + }}; + moss = new Floor("moss"){{ variants = 3; attributes.set(Attribute.spores, 0.15f); @@ -512,7 +539,7 @@ public class Blocks implements ContentList{ hasLiquids = false; flameColor = 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); }}; @@ -528,7 +555,7 @@ public class Blocks implements ContentList{ itemCapacity = 30; boostScale = 0.15f; - 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); }}; @@ -541,7 +568,7 @@ public class Blocks implements ContentList{ hasPower = hasItems = true; flameColor = 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); }}; @@ -566,13 +593,16 @@ 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; }}; @@ -580,16 +610,17 @@ public class Blocks implements ContentList{ surgeSmelter = new GenericSmelter("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; 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("cryofluidmixer"){{ + cryofluidMixer = new LiquidConverter("cryofluid-mixer"){{ requirements(Category.crafting, with(Items.lead, 65, Items.silicon, 40, Items.titanium, 60)); outputLiquid = new LiquidStack(Liquids.cryofluid, 0.2f); craftTime = 120f; @@ -607,17 +638,6 @@ 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"){{ requirements(Category.crafting, with(Items.copper, 50, Items.lead, 25)); flameColor = Color.clear; @@ -628,7 +648,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"){{ @@ -659,7 +690,7 @@ 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, @@ -689,7 +720,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"){{ @@ -700,6 +731,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); @@ -713,8 +746,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"){{ @@ -752,14 +785,14 @@ public class Blocks implements ContentList{ plastaniumWall = new Wall("plastanium-wall"){{ requirements(Category.defense, with(Items.plastanium, 5, Items.metaglass, 2)); - health = 190 * wallHealthMultiplier; + health = 130 * wallHealthMultiplier; insulated = true; absorbLasers = true; }}; plastaniumWallLarge = new Wall("plastanium-wall-large"){{ requirements(Category.defense, ItemStack.mult(plastaniumWall.requirements, 4)); - health = 190 * wallHealthMultiplier * 4; + health = 130 * wallHealthMultiplier * 4; size = 2; insulated = true; absorbLasers = true; @@ -777,20 +810,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; }}; @@ -816,32 +851,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; }}; @@ -865,27 +900,28 @@ public class Blocks implements ContentList{ size = 2; reload = 250f; range = 85f; - healPercent = 14f; + 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"){{ @@ -893,20 +929,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; @@ -941,26 +977,26 @@ 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; @@ -980,7 +1016,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"){{ @@ -1086,7 +1122,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; @@ -1110,10 +1146,10 @@ 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; }}; diode = new PowerDiode("diode"){{ @@ -1121,7 +1157,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); }}; @@ -1135,6 +1171,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"){{ @@ -1142,15 +1181,21 @@ public class Blocks implements ContentList{ powerProduction = 1.8f; generateEffect = Fx.redgeneratespark; size = 2; + floating = true; + ambientSound = Sounds.hum; + ambientSoundVolume = 0.06f; }}; steamGenerator = new BurnerGenerator("steam-generator"){{ requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30)); powerProduction = 5.5f; itemDuration = 90f; - consumes.liquid(Liquids.water, 0.09f); + consumes.liquid(Liquids.water, 0.1f); hasLiquids = true; size = 2; + + ambientSound = Sounds.smelter; + ambientSoundVolume = 0.06f; }}; differentialGenerator = new SingleTypeGenerator("differential-generator"){{ @@ -1160,31 +1205,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; @@ -1195,11 +1244,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); @@ -1213,7 +1265,7 @@ public class Blocks implements ContentList{ tier = 2; drillTime = 600; size = 2; - drawMineItem = true; + consumes.liquid(Liquids.water, 0.05f).boost(); }}; @@ -1222,7 +1274,7 @@ public class Blocks implements ContentList{ tier = 3; drillTime = 400; size = 2; - drawMineItem = true; + consumes.liquid(Liquids.water, 0.06f).boost(); }}; @@ -1268,11 +1320,11 @@ public class Blocks implements ContentList{ rotateSpeed = 1.4f; attribute = Attribute.water; - consumes.power(1.25f); + consumes.power(1.5f); }}; cultivator = new Cultivator("cultivator"){{ - requirements(Category.production, with(Items.copper, 10, Items.lead, 25, Items.silicon, 10)); + requirements(Category.production, with(Items.copper, 25, Items.lead, 25, Items.silicon, 10)); outputItem = new ItemStack(Items.sporePod, 1); craftTime = 140; size = 2; @@ -1280,7 +1332,7 @@ public class Blocks implements ContentList{ hasPower = true; hasItems = true; - consumes.power(0.80f); + consumes.power(0.9f); consumes.liquid(Liquids.water, 0.2f); }}; @@ -1306,7 +1358,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; @@ -1325,7 +1377,8 @@ public class Blocks implements ContentList{ itemCapacity = 9000; size = 4; - unitCapModifier = 14; + unitCapModifier = 16; + researchCostMultiplier = 0.04f; }}; coreNucleus = new CoreBlock("core-nucleus"){{ @@ -1336,24 +1389,28 @@ public class Blocks implements ContentList{ itemCapacity = 13000; size = 5; - unitCapModifier = 20; + unitCapModifier = 24; + researchCostMultiplier = 0.06f; }}; vault = new StorageBlock("vault"){{ requirements(Category.effect, with(Items.titanium, 250, Items.thorium, 125)); size = 3; itemCapacity = 1000; + flags = EnumSet.of(BlockFlag.storage); }}; container = new StorageBlock("container"){{ requirements(Category.effect, with(Items.titanium, 100)); size = 2; itemCapacity = 300; + flags = EnumSet.of(BlockFlag.storage); }}; unloader = new Unloader("unloader"){{ requirements(Category.effect, with(Items.titanium, 25, Items.silicon, 30)); speed = 6f; + group = BlockGroup.transportation; }}; //endregion @@ -1375,7 +1432,7 @@ public class Blocks implements ContentList{ restitution = 0.03f; range = 100; shootCone = 15f; - ammoUseEffect = Fx.shellEjectSmall; + ammoUseEffect = Fx.casing1; health = 250; inaccuracy = 2f; rotateSpeed = 10f; @@ -1435,7 +1492,7 @@ public class Blocks implements ContentList{ inaccuracy = 1f; shootCone = 10f; health = 260; - shootSound = Sounds.artillery; + shootSound = Sounds.bang; }}; wave = new LiquidTurret("wave"){{ @@ -1455,17 +1512,17 @@ public class Blocks implements ContentList{ 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; @@ -1487,11 +1544,12 @@ public class Blocks implements ContentList{ lifetime = 16f; drawSize = 400f; collidesAir = false; + length = 173f; }}; }}; 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; @@ -1500,7 +1558,7 @@ public class Blocks implements ContentList{ reloadTime = 35f; shootCone = 40f; rotateSpeed = 8f; - powerUse = 3f; + powerUse = 3.3f; targetAir = false; range = 90f; shootEffect = Fx.lightningShoot; @@ -1516,10 +1574,10 @@ public class Blocks implements ContentList{ hasPower = true; size = 2; - force = 4.5f; - scaledForce = 5.5f; - range = 110f; - damage = 0.1f; + force = 8f; + scaledForce = 7f; + range = 230f; + damage = 0.3f; health = 160 * size * size; rotateSpeed = 10; @@ -1531,7 +1589,7 @@ public class Blocks implements ContentList{ ammo( Items.blastCompound, Bullets.missileExplosive, Items.pyratite, Bullets.missileIncendiary, - Items.surgealloy, Bullets.missileSurge + Items.surgeAlloy, Bullets.missileSurge ); reloadTime = 30f; shots = 4; @@ -1545,7 +1603,7 @@ public class Blocks implements ContentList{ }}; 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, 90, Items.titanium, 60)); ammo( Items.copper, Bullets.standardCopper, Items.graphite, Bullets.standardDense, @@ -1564,22 +1622,45 @@ public class Blocks implements ContentList{ shootShake = 1f; burstSpacing = 3f; shots = 4; - ammoUseEffect = Fx.shellEjectBig; + ammoUseEffect = Fx.casing2; health = 240 * size * size; shootSound = Sounds.shootBig; }}; 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 = 140f; + range = 160f; hasPower = true; - consumes.power(8f); + consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null); size = 2; shootLength = 5f; bulletDamage = 25f; - reloadTime = 10f; + reloadTime = 9f; + }}; + + tsunami = new LiquidTurret("tsunami"){{ + requirements(Category.turret, with(Items.metaglass, 100, Items.lead, 400, Items.titanium, 250, Items.thorium, 100)); + ammo( + Liquids.water, Bullets.heavyWaterShot, + Liquids.slag, Bullets.heavySlagShot, + Liquids.cryofluid, Bullets.heavyCryoShot, + Liquids.oil, Bullets.heavyOilShot + ); + size = 3; + recoilAmount = 0f; + reloadTime = 2f; + shots = 2; + velocityInaccuracy = 0.1f; + inaccuracy = 4f; + recoilAmount = 1f; + restitution = 0.04f; + shootCone = 45f; + liquidCapacity = 40f; + shootEffect = Fx.shootLiquid; + range = 190f; + health = 250 * size * size; }}; fuse = new ItemTurret("fuse"){{ @@ -1600,11 +1681,22 @@ public class Blocks implements ContentList{ float brange = range + 10f; - ammo(Items.thorium, new ShrapnelBulletType(){{ + 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 = 6f; - }}); + ammoMultiplier = 5f; + toColor = Pal.thoriumPink; + shootEffect = smokeEffect = Fx.thoriumShoot; + }} + ); }}; ripple = new ItemTurret("ripple"){{ @@ -1623,7 +1715,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; @@ -1643,7 +1735,7 @@ public class Blocks implements ContentList{ Items.metaglass, Bullets.fragGlass, Items.blastCompound, Bullets.fragExplosive, Items.plastanium, Bullets.fragPlastic, - Items.surgealloy, Bullets.fragSurge + Items.surgeAlloy, Bullets.fragSurge ); xRand = 4f; reloadTime = 8f; @@ -1658,8 +1750,51 @@ public class Blocks implements ContentList{ health = 145 * size * size; }}; + 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)); + ammo( + 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.3f; + speed = brange; + hitShake = 6f; + ammoMultiplier = 1f; + }} + ); + + maxAmmo = 40; + ammoPerShot = 4; + rotateSpeed = 2f; + reloadTime = 200f; + ammoUseEffect = Fx.casing3Double; + recoilAmount = 5f; + restitution = 0.009f; + cooldown = 0.009f; + shootShake = 4f; + shots = 1; + size = 4; + shootCone = 2f; + shootSound = Sounds.railgun; + unitSort = (u, x, y) -> -u.maxHealth; + + coolantMultiplier = 0.4f; + + health = 150 * size * size; + coolantUsage = 1f; + + 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, @@ -1668,7 +1803,7 @@ public class Blocks implements ContentList{ reloadTime = 6f; coolantMultiplier = 0.5f; restitution = 0.1f; - ammoUseEffect = Fx.shellEjectBig; + ammoUseEffect = Fx.casing3; range = 200f; inaccuracy = 3f; recoilAmount = 3f; @@ -1680,12 +1815,12 @@ public class Blocks implements ContentList{ shootCone = 24f; shootSound = Sounds.shootBig; - health = 155 * size * size; - consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 2f)).update(false).optional(true, true); + health = 160 * size * size; + coolantUsage = 1f; }}; 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; @@ -1697,8 +1832,8 @@ public class Blocks implements ContentList{ shootDuration = 220f; powerUse = 17f; shootSound = Sounds.laserbig; - activeSound = Sounds.beam; - activeSoundVolume = 2f; + loopSound = Sounds.beam; + loopSoundVolume = 2f; shootType = new ContinuousLaserBulletType(70){{ length = 200f; @@ -1725,32 +1860,33 @@ 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[]{ - new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)), - }; + plans = Seq.with( + new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)) + ); size = 3; consumes.power(1.2f); + floating = true; }}; additiveReconstructor = new Reconstructor("additive-reconstructor"){{ @@ -1762,14 +1898,14 @@ 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} + ); }}; multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{ @@ -1781,18 +1917,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); @@ -1802,35 +1938,35 @@ 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"){{ @@ -1856,6 +1992,7 @@ public class Blocks implements ContentList{ powerSource = new PowerSource("power-source"){{ requirements(Category.power, BuildVisibility.sandboxOnly, with()); + powerProduction = 100000f / 60f; alwaysUnlocked = true; }}; @@ -1886,9 +2023,9 @@ public class Blocks implements ContentList{ illuminator = new LightBlock("illuminator"){{ requirements(Category.effect, BuildVisibility.lightingOnly, with(Items.graphite, 12, Items.silicon, 8)); - brightness = 0.67f; - radius = 140f; - consumes.power(0.06f); + brightness = 0.75f; + radius = 120f; + consumes.power(0.05f); }}; //endregion @@ -1897,6 +2034,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 @@ -1912,7 +2055,7 @@ public class Blocks implements ContentList{ //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)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75)); size = 4; itemCapacity = 300; launchTime = 60f * 35; @@ -1920,6 +2063,15 @@ public class Blocks implements ContentList{ consumes.power(6f); }}; + 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(10f); + buildCostMultiplier = 0.5f; + }}; + //endregion campaign //region logic @@ -1932,7 +2084,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, 80, Items.lead, 50, Items.silicon, 30)); instructionsPerTick = 2; @@ -1940,7 +2092,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, 60, Items.graphite, 60, Items.thorium, 50)); instructionsPerTick = 8; @@ -1950,7 +2102,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, 130, Items.thorium, 75, Items.surgeAlloy, 50)); consumes.liquid(Liquids.cryofluid, 0.08f); hasLiquids = true; @@ -1969,7 +2121,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; @@ -1984,7 +2136,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; @@ -1995,21 +2147,21 @@ public class Blocks implements ContentList{ //region experimental blockForge = new BlockForge("block-forge"){{ - requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); + requirements(Category.crafting, 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.distribution, 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.distribution, 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 bf3a575433..dbed9cc7ac 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -30,18 +30,33 @@ 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, + 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 = new BulletType(0.0001f, 0f){}; + JsonIO.copy(damageLightning, damageLightningGround); + damageLightningGround.collidesAir = false; + artilleryDense = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.flakExplosion; knockback = 0.8f; @@ -102,6 +117,7 @@ public class Bullets implements ContentList{ status = StatusEffects.burning; frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; + makeFire = true; trailEffect = Fx.incendTrail; }}; @@ -156,7 +172,7 @@ public class Bullets implements ContentList{ }}; flakGlass = new FlakBulletType(4f, 3){{ - lifetime = 70f; + lifetime = 60f; ammoMultiplier = 5f; shootEffect = Fx.shootSmall; reloadMultiplier = 0.8f; @@ -190,7 +206,6 @@ public class Bullets implements ContentList{ }}; fragGlass = new FlakBulletType(4f, 3){{ - lifetime = 70f; ammoMultiplier = 3f; shootEffect = Fx.shootSmall; reloadMultiplier = 0.8f; @@ -265,6 +280,7 @@ public class Bullets implements ContentList{ homingPower = 0.08f; splashDamageRadius = 20f; splashDamage = 20f; + makeFire = true; hitEffect = Fx.blastExplosion; status = StatusEffects.burning; }}; @@ -278,6 +294,7 @@ public class Bullets implements ContentList{ splashDamage = 25f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; + lightningDamage = 10; lightning = 2; lightningLength = 10; }}; @@ -323,27 +340,11 @@ 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"){{ width = 15f; height = 21f; @@ -354,6 +355,9 @@ public class Bullets implements ContentList{ width = 16f; height = 23f; shootEffect = Fx.shootBig; + pierceCap = 2; + pierceBuilding = true; + knockback = 0.7f; }}; standardIncendiaryBig = new BasicBulletType(7f, 60, "bullet"){{ @@ -363,29 +367,10 @@ public class Bullets implements ContentList{ 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){{ - collidesAir = false; - }}; - JsonIO.copy(damageLightning, damageLightningGround); - - 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){ @@ -428,7 +413,7 @@ public class Bullets implements ContentList{ } }; - basicFlame = new BulletType(3.35f, 15f){{ + basicFlame = new BulletType(3.35f, 16f){{ ammoMultiplier = 3f; hitSize = 7f; lifetime = 18f; @@ -443,7 +428,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; @@ -459,29 +444,70 @@ 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){{ + lifetime = 49f; + speed = 4f; + knockback = 1.7f; + puddleSize = 8f; + orbSize = 4f; + drag = 0.001f; + ammoMultiplier = 0.4f; + statusDuration = 60f * 4f; + damage = 0.2f; + }}; + + heavyCryoShot = new LiquidBulletType(Liquids.cryofluid){{ + lifetime = 49f; + speed = 4f; + knockback = 1.3f; + puddleSize = 8f; + orbSize = 4f; + drag = 0.001f; + ammoMultiplier = 0.4f; + statusDuration = 60f * 4f; + damage = 0.2f; + }}; + + heavySlagShot = new LiquidBulletType(Liquids.slag){{ + lifetime = 49f; + speed = 4f; + knockback = 1.3f; + puddleSize = 8f; + orbSize = 4f; + damage = 4.75f; + drag = 0.001f; + ammoMultiplier = 0.4f; + statusDuration = 60f * 4f; + }}; + + heavyOilShot = new LiquidBulletType(Liquids.oil){{ + lifetime = 49f; + speed = 4f; + knockback = 1.3f; + puddleSize = 8f; + orbSize = 4f; + drag = 0.001f; + ammoMultiplier = 0.4f; + statusDuration = 60f * 4f; + 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 c11c32fbcb..7688108ebe 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -18,7 +18,7 @@ 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{ public static final Effect @@ -56,9 +56,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.icon(Cicon.full) : select.type.icon(Cicon.full), 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 +66,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 +74,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.icon(Cicon.full), select.x, select.y, select.rotation - 90f); reset(); Draw.scl = p; @@ -96,7 +96,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 -> { @@ -127,7 +127,7 @@ public class Fx{ 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); }), @@ -138,12 +138,13 @@ public class Fx{ stroke(3f * e.fout()); color(e.color, Color.white, e.fin()); - beginLine(); - lines.each(Lines::linePoint); - linePoint(e.x, e.y); - endLine(); + for(int i = 0; i < lines.size - 1; i++){ + Vec2 cur = lines.get(i); + Vec2 next = lines.get(i + 1); + + Lines.line(cur.x, cur.y, next.x, next.y, false); + } - int i = 0; for(Vec2 p : lines){ Fill.circle(p.x, p.y, Lines.getStroke() / 2f); } @@ -256,33 +257,33 @@ public class Fx{ 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); @@ -388,7 +389,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 -> { @@ -399,7 +399,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 -> { @@ -410,7 +409,6 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - }), hitLiquid = new Effect(16, e -> { @@ -419,7 +417,6 @@ 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); }); - }), hitLancer = new Effect(12, e -> { @@ -430,7 +427,6 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - }), hitMeltdown = new Effect(12, e -> { @@ -441,7 +437,6 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - }), hitMeltHeal = new Effect(12, e -> { @@ -452,7 +447,79 @@ public class Fx{ float ang = Mathf.angle(x, y); lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); + }), + instBomb = new Effect(15f, 100f, e -> { + color(Pal.bulletYellowBack); + stroke(e.fout() * 4f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 20f); + + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 6f, 80f * e.fout(), i*90 + 45); + } + + color(); + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 3f, 30f * e.fout(), i*90 + 45); + } + }), + + instTrail = new Effect(30, e -> { + for(int i = 0; i < 2; i++){ + color(i == 0 ? Pal.bulletYellowBack : Pal.bulletYellow); + + float m = i == 0 ? 1f : 0.5f; + + float rot = e.rotation + 180f; + float w = 15f * e.fout() * m; + 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); + } + }), + + instShoot = new Effect(24f, e -> { + e.scaled(10f, b -> { + color(Color.white, Pal.bulletYellowBack, b.fin()); + stroke(b.fout() * 3f + 0.2f); + Lines.circle(b.x, b.y, b.fin() * 50f); + }); + + color(Pal.bulletYellowBack); + + for(int i : Mathf.signs){ + 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); + } + }), + + instHit = new Effect(20f, 200f, e -> { + color(Pal.bulletYellowBack); + + for(int i = 0; i < 2; i++){ + color(i == 0 ? Pal.bulletYellowBack : Pal.bulletYellow); + + float m = i == 0 ? 1f : 0.5f; + + for(int j = 0; j < 5; j++){ + float rot = e.rotation + Mathf.randomSeedRange(e.id + j, 50f); + float w = 23f * e.fout() * m; + Drawf.tri(e.x, e.y, w, (80f + Mathf.randomSeedRange(e.id + j, 40f)) * m, rot); + Drawf.tri(e.x, e.y, w, 20f * m, rot + 180f); + } + } + + e.scaled(10f, c -> { + color(Pal.bulletYellow); + stroke(c.fout() * 2f + 0.2f); + Lines.circle(e.x, e.y, c.fin() * 30f); + }); + + e.scaled(12f, c -> { + color(Pal.bulletYellowBack); + randLenVectors(e.id, 25, 5f + e.fin() * 80f, e.rotation, 60f, (x, y) -> { + Fill.square(e.x + x, e.y + y, c.fout() * 3f, 45f); + }); + }); }), hitLaser = new Effect(8, e -> { @@ -479,8 +546,8 @@ public class Fx{ }), 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); @@ -493,17 +560,16 @@ 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); }); - }), 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); @@ -516,17 +582,16 @@ 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); }); - }), 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); @@ -539,17 +604,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); @@ -562,17 +626,16 @@ 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); }); - }), 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); @@ -585,17 +648,16 @@ 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); }); - }), 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); @@ -608,12 +670,11 @@ 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); }); - }), artilleryTrail = new Effect(50, e -> { @@ -638,8 +699,8 @@ public class Fx{ }), 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); @@ -652,12 +713,11 @@ 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); }); - }), burning = new Effect(35f, e -> { @@ -666,7 +726,6 @@ 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); }); - }), fire = new Effect(50f, e -> { @@ -687,7 +746,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 -> { @@ -696,7 +754,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 -> { @@ -705,7 +762,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 -> { @@ -714,7 +770,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 -> { @@ -723,7 +778,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 -> { @@ -732,21 +786,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 -> { @@ -755,7 +808,6 @@ 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); }); - }), sporeSlowed = new Effect(40f, e -> { @@ -768,9 +820,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 -> { @@ -779,7 +830,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 -> { @@ -835,7 +885,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()); @@ -879,7 +929,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()); @@ -888,7 +938,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 -> { @@ -896,9 +945,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 -> { @@ -928,7 +976,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 -> { @@ -951,7 +998,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 -> { @@ -960,7 +1006,6 @@ 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); }); - }), shootSmallFlame = new Effect(32f, 80f, e -> { @@ -969,7 +1014,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 -> { @@ -978,7 +1022,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 -> { @@ -987,69 +1030,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 -> { @@ -1074,28 +1152,11 @@ public class Fx{ }), railHit = new Effect(18f, 200f, e -> { - if(true){ - color(Pal.orangeSpark); + color(Pal.orangeSpark); - for(int i : Mathf.signs){ - Drawf.tri(e.x, e.y, 10f * e.fout(), 60f, e.rotation + 140f * i); - } - }else{ - e.scaled(7f, b -> { - color(Color.white, Color.lightGray, b.fin()); - stroke(b.fout() * 2f + 0.2f); - Lines.circle(b.x, b.y, b.fin() * 28f); - }); - - color(Pal.orangeSpark); - float rot = e.rotation + Mathf.randomSeedRange(e.id, 20f); - float w = 9f * e.fout(); - - Drawf.tri(e.x, e.y, w, 100f, rot); - Drawf.tri(e.x, e.y, w, 10f, rot + 180f); + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 10f * e.fout(), 60f, e.rotation + 140f * i); } - - }), lancerLaserShoot = new Effect(21f, e -> { @@ -1104,17 +1165,15 @@ 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 -> { color(Color.white); - float length = e.data == null || !(e.data instanceof Float) ? 70f : (Float)e.data; + float length = !(e.data instanceof Float) ? 70f : (Float)e.data; 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 -> { @@ -1123,7 +1182,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 -> { @@ -1140,7 +1198,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 -> { @@ -1150,7 +1207,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 -> { @@ -1160,7 +1216,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 -> { @@ -1236,10 +1300,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()); }); }), @@ -1263,21 +1335,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()); @@ -1292,21 +1364,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; @@ -1314,7 +1386,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; @@ -1322,50 +1394,58 @@ 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); }), + mine = new Effect(20, e -> { 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 -> { randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> { color(e.color, Color.lightGray, e.fin()); @@ -1379,12 +1459,14 @@ public class Fx{ Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); }); }), + smelt = new Effect(20, e -> { 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); @@ -1398,8 +1480,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); @@ -1408,8 +1490,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); @@ -1418,7 +1500,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 -> { @@ -1427,7 +1508,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)); @@ -1467,7 +1548,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); }), @@ -1502,7 +1583,6 @@ public class Fx{ float radius = unit.hitSize() * 1.3f; - e.scaled(16f, c -> { color(Pal.shield); stroke(c.fout() * 2f + 0.1f); @@ -1513,7 +1593,7 @@ public class Fx{ }); color(Pal.shield, e.fout()); - stroke(1f * e.fout()); + stroke(e.fout()); Lines.circle(e.x, e.y, radius); }), diff --git a/core/src/mindustry/content/Items.java b/core/src/mindustry/content/Items.java index e16784a61b..65c464a249 100644 --- a/core/src/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -5,7 +5,7 @@ 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, + public static Item scrap, copper, lead, graphite, coal, titanium, thorium, silicon, plastanium, phaseFabric, surgeAlloy, sporePod, sand, blastCompound, pyratite, metaglass; @Override @@ -32,6 +32,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 +67,13 @@ 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; }}; 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..7ff39522f1 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,13 +12,13 @@ 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); }}; diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index 873ba1c054..9450c441da 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -9,12 +9,14 @@ import mindustry.type.*; public class Planets implements ContentList{ public static Planet sun, + //tantros, serpulo; @Override public void load(){ sun = new Planet("sun", null, 0, 2){{ bloom = true; + accessible = false; //lightColor = Color.valueOf("f4ee8e"); @@ -31,10 +33,21 @@ public class Planets implements ContentList{ ); }}; + /*tantros = new Planet("tantros", sun, 2, 0.8f){{ + generator = new TantrosPlanetGenerator(); + meshLoader = () -> new HexMesh(this, 4); + atmosphereColor = Color.valueOf("3db899"); + startSector = 10; + atmosphereRadIn = -0.01f; + atmosphereRadOut = 0.3f; + }};*/ + serpulo = new Planet("serpulo", sun, 3, 1){{ generator = new SerpuloPlanetGenerator(); meshLoader = () -> new HexMesh(this, 6); atmosphereColor = Color.valueOf("3c1b8f"); + atmosphereRadIn = 0.02f; + atmosphereRadOut = 0.3f; startSector = 15; }}; } diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 3b76795c1d..e84547dd5f 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -8,57 +8,92 @@ 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(){ groundZero = new SectorPreset("groundZero", serpulo, 15){{ alwaysUnlocked = true; + addStartingItems = true; captureWave = 10; + difficulty = 1; }}; 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; }}; } } diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 7dc957a344..b20463a65f 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -2,10 +2,13 @@ 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{ @@ -17,22 +20,24 @@ public class StatusEffects implements ContentList{ none = new StatusEffect("none"); burning = new StatusEffect("burning"){{ + color = Pal.lightFlame; damage = 0.12f; //over 8 seconds, this would be 60 damage effect = Fx.burning; init(() -> { - opposite(wet,freezing); + 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)); + 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)); })); }); }}; freezing = new StatusEffect("freezing"){{ + color = Color.valueOf("6ecdec"); speedMultiplier = 0.6f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; effect = Fx.freezing; init(() -> { @@ -46,10 +51,12 @@ public class StatusEffects implements ContentList{ }}; unmoving = new StatusEffect("unmoving"){{ + color = Pal.gray; speedMultiplier = 0.001f; }}; slow = new StatusEffect("slow"){{ + color = Pal.lightishGray; speedMultiplier = 0.4f; }}; @@ -62,7 +69,7 @@ public class StatusEffects implements ContentList{ init(() -> { trans(shocked, ((unit, time, newTime, result) -> { unit.damagePierce(14f); - if(unit.team() == state.rules.waveTeam){ + if(unit.team == state.rules.waveTeam){ Events.fire(Trigger.shock); } result.set(this, time); @@ -79,42 +86,51 @@ public class StatusEffects implements ContentList{ }}; 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); + 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, 200f)); + })); }); }}; sapped = new StatusEffect("sapped"){{ + color = Pal.sap; speedMultiplier = 0.7f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; effect = Fx.sapped; 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(melting, ((unit, time, newTime, result) -> result.set(melting, newTime + time))); trans(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + 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 +139,7 @@ public class StatusEffects implements ContentList{ }}; overclock = new StatusEffect("overclock"){{ + color = Pal.accent; speedMultiplier = 1.15f; damageMultiplier = 1.15f; reloadMultiplier = 1.25f; @@ -131,20 +148,27 @@ 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; + }}; - blasted = new StatusEffect("blasted"); + blasted = new StatusEffect("blasted"){{ + color = Color.valueOf("ff795e"); + }}; corroded = new StatusEffect("corroded"){{ + color = Pal.plastanium; damage = 0.1f; }}; } diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index b1a17c7ef9..2e0a0f3646 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,183 +110,155 @@ public class TechTree implements ContentList{ }); }); - node(Items.coal, with(Items.lead, 3000), () -> { - node(Items.graphite, with(Items.coal, 1000), () -> { - 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(graphitePress, () -> { + node(pneumaticDrill, Seq.with(new SectorComplete(frozenForest)), () -> { + node(cultivator, Seq.with(new SectorComplete(biomassFacility)), () -> { - }); - }); + }); - node(Items.thorium, with(Items.titanium, 10000, Items.lead, 15000, Items.copper, 30000), () -> { - node(laserDrill, () -> { - node(blastDrill, () -> { + node(laserDrill, () -> { + node(blastDrill, Seq.with(new SectorComplete(nuclearComplex)), () -> { - }); - - 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, () -> { + + }); + }); }); }); }); @@ -316,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)), () -> { }); }); @@ -344,11 +318,17 @@ public class TechTree implements ContentList{ }); }); + + node(tsunami, () -> { + + }); }); node(lancer, () -> { node(meltdown, () -> { + node(foreshadow, () -> { + }); }); node(shockMine, () -> { @@ -425,7 +405,7 @@ public class TechTree implements ContentList{ }); }); - node(navalFactory, () -> { + node(navalFactory, Seq.with(new SectorComplete(ruinousShores)), () -> { node(risso, () -> { node(minke, () -> { node(bryde, () -> { @@ -440,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, () -> { + }); }); }); @@ -468,30 +449,75 @@ public class TechTree implements ContentList{ 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) + ), () -> { + }); }); }); @@ -500,6 +526,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) ), () -> { @@ -507,23 +534,92 @@ 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), + new Research(siliconSmelter) ), () -> { + 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, () -> { }); }); @@ -534,35 +630,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); } @@ -571,8 +686,6 @@ public class TechTree implements ContentList{ } public static class TechNode{ - static TechNode context; - /** Depth in tech tree. */ public int depth; /** Requirement node. */ @@ -585,19 +698,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 @@ -605,18 +715,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 8e2a5f0734..99895be719 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -10,53 +10,53 @@ import mindustry.entities.bullet.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; public class UnitTypes implements ContentList{ //region definitions + //(the wall of shame - should fix the legacy stuff eventually...) + //mech public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, scepter, reign; - //mech + builder + miner + commander - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType nova, pulsar, quasar; + //mech + public static @EntityDef(value = {Unitc.class, Mechc.class}, legacy = true) 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 + public static @EntityDef({Unitc.class, Mechc.class}) UnitType vela; //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 + 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 + 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 + 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 + 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}) 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 + 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; + //water + public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType risso, minke, bryde, sei, omura; //special block unit type public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block; @@ -76,7 +76,7 @@ public class UnitTypes implements ContentList{ x = 4f; y = 2f; top = false; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }}); }}; @@ -113,7 +113,7 @@ public class UnitTypes implements ContentList{ }}; fortress = new UnitType("fortress"){{ - speed = 0.38f; + speed = 0.39f; hitSize = 13f; rotateSpeed = 3f; targetAir = false; @@ -128,7 +128,7 @@ 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; @@ -138,7 +138,7 @@ public class UnitTypes implements ContentList{ collides = true; collidesTiles = true; splashDamageRadius = 24f; - splashDamage = 38f; + splashDamage = 45f; backColor = Pal.bulletYellowBack; frontColor = Pal.bulletYellow; }}; @@ -156,6 +156,7 @@ public class UnitTypes implements ContentList{ mechStepParticles = true; mechStepShake = 0.15f; + singleTarget = true; weapons.add( new Weapon("scepter-weapon"){{ @@ -163,16 +164,16 @@ 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; - bullet = new BasicBulletType(7f, 45){{ + bullet = new BasicBulletType(7f, 50){{ width = 11f; height = 20f; lifetime = 25f; @@ -181,7 +182,7 @@ public class UnitTypes implements ContentList{ lightningLength = 6; lightningColor = Pal.surge; //standard bullet damage is far too much for lightning - lightningDamage = 25; + lightningDamage = 20; }}; }}, @@ -190,7 +191,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"){{ @@ -198,7 +199,7 @@ public class UnitTypes implements ContentList{ x = 8.5f; y = -7f; rotate = true; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }} @@ -226,11 +227,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, 60){{ pierce = true; + pierceCap = 10; width = 14f; height = 33f; lifetime = 15f; @@ -249,6 +251,8 @@ public class UnitTypes implements ContentList{ width = 10f; height = 10f; pierce = true; + pierceBuilding = true; + pierceCap = 3; lifetime = 20f; hitEffect = Fx.flakExplosion; @@ -265,17 +269,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"){{ @@ -286,16 +289,22 @@ 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, 14){{ + lifetime = 37f; + healPercent = 5f; + collidesTeam = true; + backColor = Pal.heal; + frontColor = Color.white; + }}; }}); }}; pulsar = new UnitType("pulsar"){{ - itemCapacity = 60; canBoost = true; - boostMultiplier = 1.5f; - speed = 0.65f; + boostMultiplier = 1.6f; + speed = 0.7f; hitSize = 10f; health = 320f; buildSpeed = 0.9f; @@ -303,9 +312,9 @@ public class UnitTypes implements ContentList{ mineTier = 2; mineSpeed = 5f; - commandLimit = 15; + 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"){{ @@ -323,38 +332,49 @@ public class UnitTypes implements ContentList{ 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; + mineTier = 3; hitSize = 12f; boostMultiplier = 2f; - itemCapacity = 80; health = 650f; buildSpeed = 1.7f; canBoost = true; armor = 9f; landShake = 2f; - commandLimit = 18; + commandLimit = 10; mechFrontSway = 0.55f; ammoType = AmmoTypes.power; speed = 0.4f; hitSize = 10f; - mineTier = 2; - mineSpeed = 7f; + mineSpeed = 6f; drawShields = false; abilities.add(new ForceFieldAbility(60f, 0.3f, 400f, 60f * 6)); @@ -369,11 +389,13 @@ public class UnitTypes implements ContentList{ shootSound = Sounds.laser; bullet = new LaserBulletType(){{ - damage = 40f; + damage = 45f; recoil = 1f; sideAngle = 45f; sideWidth = 1f; sideLength = 70f; + healPercent = 10f; + collidesTeam = true; colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; }}; }}); @@ -396,12 +418,13 @@ public class UnitTypes implements ContentList{ engineSize = 6f; lowAltitude = true; - health = 6500f; + health = 7000f; armor = 7f; canBoost = true; landShake = 4f; + immunities = ObjectSet.with(StatusEffects.burning); - commandLimit = 20; + commandLimit = 8; weapons.add(new Weapon("vela-weapon"){{ mirror = false; @@ -412,14 +435,16 @@ public class UnitTypes implements ContentList{ firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f; - reload = 320f; + reload = 160f; recoil = 0f; - shootSound = Sounds.laser; + chargeSound = Sounds.lasercharge2; + shootSound = Sounds.beam; continuous = true; cooldownTime = 200f; - bullet = new ContinuousLaserBulletType(17){{ - length = 150f; + bullet = new ContinuousLaserBulletType(){{ + damage = 23f; + length = 160f; hitEffect = Fx.hitMeltHeal; drawSize = 420f; lifetime = 160f; @@ -429,10 +454,14 @@ public class UnitTypes implements ContentList{ shootEffect = Fx.greenLaserChargeSmall; - incendChance = 0.02f; + incendChance = 0.075f; 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}; }}; @@ -444,14 +473,12 @@ public class UnitTypes implements ContentList{ corvus = new UnitType("corvus"){{ mineTier = 1; hitSize = 29f; - itemCapacity = 80; - health = 19000f; - buildSpeed = 1.7f; + health = 18000f; armor = 9f; landShake = 1.5f; rotateSpeed = 1.5f; - commandLimit = 20; + commandLimit = 8; legCount = 4; legLength = 14f; @@ -462,6 +489,7 @@ public class UnitTypes implements ContentList{ visualElevation = 0.2f; allowLegStep = true; ammoType = AmmoTypes.powerHigh; + groundLayer = Layer.legUnit; speed = 0.3f; @@ -470,6 +498,9 @@ public class UnitTypes implements ContentList{ drawShields = false; weapons.add(new Weapon("corvus-weapon"){{ + shootSound = Sounds.laserblast; + chargeSound = Sounds.lasercharge; + soundPitchMin = 1f; top = false; mirror = false; shake = 14f; @@ -477,7 +508,6 @@ public class UnitTypes implements ContentList{ x = y = 0; reload = 350f; recoil = 0f; - shootSound = Sounds.laser; cooldownTime = 350f; @@ -486,8 +516,8 @@ public class UnitTypes implements ContentList{ firstShotDelay = Fx.greenLaserCharge.lifetime; bullet = new LaserBulletType(){{ - length = 500f; - damage = 520f; + length = 460f; + damage = 560f; width = 75f; lifetime = 65f; @@ -503,6 +533,9 @@ public class UnitTypes implements ContentList{ shootEffect = Fx.greenLaserCharge; + healPercent = 25f; + collidesTeam = true; + sideAngle = 15f; sideWidth = 0f; sideLength = 0f; @@ -517,14 +550,14 @@ public class UnitTypes implements ContentList{ crawler = new UnitType("crawler"){{ defaultController = SuicideAI::new; - speed = 0.85f; + speed = 1f; hitSize = 8f; health = 180; mechSideSway = 0.25f; range = 40f; weapons.add(new Weapon(){{ - reload = 12f; + reload = 24f; shootCone = 180f; ejectEffect = Fx.none; shootSound = Sounds.explosion; @@ -532,9 +565,9 @@ public class UnitTypes implements ContentList{ hitEffect = Fx.pulverize; lifetime = 10f; speed = 1f; - splashDamageRadius = 55f; + splashDamageRadius = 70f; instantDisappear = true; - splashDamage = 55f; + splashDamage = 80f; killShooter = true; hittable = false; collidesAir = true; @@ -543,7 +576,6 @@ public class UnitTypes implements ContentList{ }}; atrax = new UnitType("atrax"){{ - itemCapacity = 80; speed = 0.5f; drag = 0.4f; hitSize = 10f; @@ -588,7 +620,7 @@ public class UnitTypes implements ContentList{ drag = 0.4f; hitSize = 12f; rotateSpeed = 3f; - health = 760; + health = 900; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); legCount = 6; legLength = 13f; @@ -611,15 +643,15 @@ public class UnitTypes implements ContentList{ 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.4f; length = 75f; - damage = 15; + damage = 20; shootEffect = Fx.shootSmall; hitColor = color = Color.valueOf("bf92f9"); despawnEffect = Fx.none; @@ -634,11 +666,12 @@ public class UnitTypes implements ContentList{ 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; @@ -665,11 +698,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; @@ -680,9 +713,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; @@ -698,6 +731,7 @@ public class UnitTypes implements ContentList{ y = 8f; rotate = true; bullet = sapper; + shootSound = Sounds.sap; }}, new Weapon("spiroct-weapon"){{ reload = 15f; @@ -705,6 +739,7 @@ public class UnitTypes implements ContentList{ y = 6f; rotate = true; bullet = sapper; + shootSound = Sounds.sap; }}, new Weapon("spiroct-weapon"){{ reload = 23f; @@ -712,6 +747,7 @@ public class UnitTypes implements ContentList{ y = 0f; rotate = true; bullet = sapper; + shootSound = Sounds.sap; }}, new Weapon("large-purple-mount"){{ y = -7f; @@ -720,10 +756,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){{ @@ -769,6 +805,7 @@ public class UnitTypes implements ContentList{ rippleScale = 3f; legSpeed = 0.19f; ammoType = AmmoTypes.powerHigh; + buildSpeed = 1f; legSplashDamage = 80; legSplashRange = 60; @@ -786,10 +823,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; @@ -818,10 +855,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; @@ -876,23 +913,32 @@ 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; weapons.add(new Weapon(){{ y = 0f; x = 2f; - reload = 15f; - ejectEffect = Fx.shellEjectSmall; - bullet = Bullets.standardCopper; - shootSound = Sounds.shoot; + reload = 13f; + 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.7f; accel = 0.08f; drag = 0.016f; flying = true; @@ -901,19 +947,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; @@ -928,12 +977,12 @@ public class UnitTypes implements ContentList{ zenith = new UnitType("zenith"){{ health = 700; - speed = 1.7f; + speed = 1.8f; accel = 0.04f; drag = 0.016f; flying = true; range = 140f; - hitSize = 18f; + hitSize = 20f; lowAltitude = true; armor = 5f; @@ -948,8 +997,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; @@ -957,7 +1007,7 @@ public class UnitTypes implements ContentList{ homingRange = 60f; keepVelocity = false; splashDamageRadius = 25f; - splashDamage = 10f; + splashDamage = 16f; lifetime = 60f; trailColor = Pal.unitBack; backColor = Pal.unitBack; @@ -971,9 +1021,9 @@ public class UnitTypes implements ContentList{ }}; antumbra = new UnitType("antumbra"){{ - speed = 1.13f; - accel = 0.035f; - drag = 0.05f; + speed = 0.8f; + accel = 0.04f; + drag = 0.04f; rotateSpeed = 1.9f; flying = true; lowAltitude = true; @@ -982,6 +1032,7 @@ public class UnitTypes implements ContentList{ engineOffset = 21; engineSize = 5.3f; hitSize = 56f; + targetFlag = BlockFlag.battery; BulletType missiles = new MissileBulletType(2.7f, 10){{ width = 8f; @@ -1004,23 +1055,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; @@ -1029,10 +1080,10 @@ public class UnitTypes implements ContentList{ reload = 12; shake = 1f; rotateSpeed = 2f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; shootSound = Sounds.shootBig; rotate = true; - occlusion = 8f; + shadow = 8f; bullet = new BasicBulletType(7f, 50){{ width = 12f; height = 18f; @@ -1044,9 +1095,9 @@ public class UnitTypes implements ContentList{ }}; eclipse = new UnitType("eclipse"){{ - speed = 1.09f; - accel = 0.02f; - drag = 0.05f; + speed = 0.52f; + accel = 0.04f; + drag = 0.04f; rotateSpeed = 1f; flying = true; lowAltitude = true; @@ -1056,6 +1107,7 @@ public class UnitTypes implements ContentList{ hitSize = 58f; destructibleWreck = false; armor = 13f; + targetFlag = BlockFlag.reactor; BulletType fragBullet = new FlakBulletType(4f, 5){{ shootEffect = Fx.shootBig; @@ -1079,7 +1131,7 @@ public class UnitTypes implements ContentList{ reload = 45f; recoil = 4f; shootSound = Sounds.laser; - occlusion = 20f; + shadow = 20f; rotate = true; bullet = new LaserBulletType(){{ @@ -1098,8 +1150,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; @@ -1109,12 +1161,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; }}); }}; @@ -1128,11 +1180,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; @@ -1147,24 +1198,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; 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 * 5, 50f)); weapons.add(new Weapon("heal-weapon-mount"){{ top = false; @@ -1173,7 +1222,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; @@ -1187,8 +1236,12 @@ public class UnitTypes implements ContentList{ 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; }}; @@ -1198,11 +1251,11 @@ 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; @@ -1212,44 +1265,62 @@ public class UnitTypes implements ContentList{ hitSize = 15f; engineSize = 3f; payloadCapacity = (2 * 2) * tilePayload; - buildSpeed = 2.5f; + buildSpeed = 2.6f; + isCounted = false; ammoType = AmmoTypes.power; weapons.add( new Weapon("heal-weapon-mount"){{ + shootSound = Sounds.lasershoot; reload = 25f; 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; payloadCapacity = (3 * 3) * tilePayload; buildSpeed = 2.5f; + buildBeamOffset = 23; range = 140f; targetAir = false; + targetFlag = BlockFlag.battery; ammoType = AmmoTypes.powerHigh; @@ -1257,23 +1328,27 @@ 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; collidesAir = false; @@ -1290,8 +1365,9 @@ public class UnitTypes implements ContentList{ speed = 0.001f; collides = false; - splashDamage = 240f; - splashDamageRadius = 115f; + healPercent = 15f; + splashDamage = 230f; + splashDamageRadius = 120f; }}; }}); }}; @@ -1299,7 +1375,7 @@ public class UnitTypes implements ContentList{ oct = new UnitType("oct"){{ armor = 16f; health = 24000; - speed = 0.6f; + speed = 0.8f; rotateSpeed = 1f; accel = 0.04f; drag = 0.018f; @@ -1311,9 +1387,14 @@ public class UnitTypes implements ContentList{ payloadCapacity = (5.3f * 5.3f) * tilePayload; buildSpeed = 4f; drawShields = false; - commandLimit = 25; + commandLimit = 6; + lowAltitude = true; + buildBeamOffset = 43; - abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new HealFieldAbility(130f, 60f * 2, 140f)); + ammoCapacity = 1300; + ammoResupplyAmount = 20; + + abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new RepairFieldAbility(130f, 60f * 2, 140f)); }}; //endregion @@ -1337,7 +1418,7 @@ public class UnitTypes implements ContentList{ shootY = 4f; y = 1.5f; rotate = true; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; bullet = Bullets.standardCopper; }}); @@ -1347,14 +1428,15 @@ public class UnitTypes implements ContentList{ 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; @@ -1393,7 +1475,8 @@ public class UnitTypes implements ContentList{ rotate = true; rotateSpeed = 5f; inaccuracy = 10f; - ejectEffect = Fx.shellEjectSmall; + ejectEffect = Fx.casing1; + shootSound = Sounds.shoot; bullet = Bullets.flakLead; }}); @@ -1405,8 +1488,9 @@ 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; }}); }}; @@ -1425,7 +1509,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; @@ -1437,23 +1521,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 = 100f; height = 15.5f; width = 15f; collidesTiles = false; ammoMultiplier = 4f; splashDamageRadius = 60f; - splashDamage = 85f; + splashDamage = 80f; backColor = Pal.missileYellowBack; frontColor = Pal.missileYellow; trailEffect = Fx.artilleryTrail; @@ -1472,7 +1557,7 @@ public class UnitTypes implements ContentList{ x = 8.5f; y = -9f; - occlusion = 6f; + shadow = 6f; rotateSpeed = 4f; rotate = true; @@ -1480,6 +1565,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){{ @@ -1527,7 +1613,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 4f; mirror = false; - occlusion = 20f; + shadow = 20f; shootY = 2f; recoil = 4f; @@ -1538,11 +1624,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; @@ -1550,9 +1636,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; @@ -1564,7 +1650,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; @@ -1573,17 +1659,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; }}; }}); }}; @@ -1618,15 +1705,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; @@ -1645,31 +1733,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; }}; }}); }}; @@ -1683,15 +1774,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; @@ -1702,14 +1794,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; }}; }}); }}; @@ -1723,13 +1816,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; @@ -1740,14 +1834,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; }}; }}); @@ -1763,6 +1858,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 6f59edbed0..8e3ea38a92 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -1,337 +1,106 @@ 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; @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); - - 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.45f; - Color color = Color.valueOf("f7cba4"); - Texture noise; - - { - attrs.set(Attribute.light, -0.1f); - } - - @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; - Color color = Color.valueOf("7457ce"); - Texture noise; - - { - attrs.set(Attribute.spores, 1f); - attrs.set(Attribute.light, -0.15f); - status = StatusEffects.sporeSlowed; - statusGround = false; - } - - @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); - } - } - } - }; + 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; + }}; } } diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index 56e46d8be2..fef7cc528b 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,6 +98,8 @@ 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.*/ @@ -161,8 +164,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); } } } diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 4bb22b7839..8dd487034b 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,12 @@ 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.*; import mindustry.ui.dialogs.*; import mindustry.world.*; -import mindustry.world.blocks.storage.CoreBlock.*; import java.io.*; import java.text.*; @@ -38,14 +42,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 +57,11 @@ public class Control implements ApplicationListener, Loadable{ public Control(){ saves = new Saves(); - tutorial = new Tutorial(); - music = new MusicControl(); + sound = new SoundControl(); 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(); - } } }); @@ -91,7 +90,6 @@ public class Control implements ApplicationListener, Loadable{ Events.on(ResetEvent.class, event -> { player.reset(); - tutorial.reset(); hiscore = false; saves.resetSave(); @@ -131,7 +129,23 @@ public class Control implements ApplicationListener, Loadable{ } })); - Events.on(UnlockEvent.class, e -> ui.hudfrag.showUnlock(e.content)); + Events.on(UnlockEvent.class, e -> { + 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.icon(Cicon.large)), bundle.get("available")); + } + } + } + }); + + Events.on(SectorCaptureEvent.class, e -> { + checkAutoUnlocks(); + }); Events.on(BlockBuildEndEvent.class, e -> { if(e.team == player.team()){ @@ -159,11 +173,9 @@ 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(); } } }); @@ -183,18 +195,23 @@ public class Control implements ApplicationListener, Loadable{ app.post(() -> ui.hudfrag.showLand()); renderer.zoomIn(Fx.coreLand.lifetime); app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block)); + camera.position.set(core); + player.set(core); + 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); + } }); }); } - void resetCamera(){ - - } - @Override public void loadAsync(){ Draw.scl = 1f / Core.atlas.find("scale_marker").width; @@ -213,6 +230,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"); @@ -257,59 +285,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 * 2f; + //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); @@ -320,78 +385,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; } @@ -403,27 +411,33 @@ 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); } } + for(Music music : assets.getAll(Music.class, new Seq<>())){ + music.stop(); + } + content.dispose(); net.dispose(); Musics.dispose(); Sounds.dispose(); - ui.editor.dispose(); + if(ui != null && ui.editor != null) 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); } } @@ -432,19 +446,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(() -> { @@ -477,15 +478,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(); @@ -498,8 +495,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"); @@ -511,19 +507,28 @@ 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(); } - if(Core.input.keyTap(Binding.pause) && !state.isOutOfTime() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + //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 ac827fbfae..de7cf6f60c 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,15 @@ public class GameState{ /** Wave countdown in ticks. */ public float wavetime; /** Whether the game is in game over state. */ - public boolean gameOver = false, launched = false, serverPaused = false, wasTimeout; + public boolean gameOver = false, serverPaused = false, wasTimeout; /** Map that is currently being played on. */ - public @NonNull Map map = emptyMap; + 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,26 +33,27 @@ public class GameState{ /** Current game state. */ private State state = State.menu; - //TODO optimize public Unit boss(){ - return Groups.unit.find(u -> u.isBoss() && u.team == rules.waveTeam); + return teams.boss; } 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; } - /** @return whether the player is in a campaign and they are out of sector time */ - public boolean isOutOfTime(){ - return isCampaign() && isGame() && getSector().getTimeSpent() >= turnDuration; - } - public boolean hasSector(){ return rules.sector != null; } @@ -69,11 +68,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 9058539764..91a0c410c1 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -4,8 +4,8 @@ import arc.*; import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; -import mindustry.content.*; import mindustry.core.GameState.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; @@ -14,9 +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.*; @@ -37,36 +34,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; - 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 -> { @@ -83,51 +54,117 @@ 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(); + SectorInfo info = state.rules.sector.info; + info.write(); - //apply fractional damage based on how many turns have passed for this sector - float turnsPassed = seconds / (turnDuration / 60f); + //how much wave time has passed + int wavesPassed = info.wavesPassed; - if(state.rules.sector.hasWaves() && turnsPassed > 0 && state.rules.sector.hasBase()){ - SectorDamage.apply(turnsPassed / sectorDestructionTurns); + //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)); + SectorDamage.applyCalculatedDamage(); - //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); + //make sure damaged buildings are counted + for(Tile tile : world.tiles){ + if(tile.build != null && tile.build.damaged()){ + indexer.notifyTileDamaged(tile.build); + } } } - 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.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. */ @@ -167,18 +204,13 @@ 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; } public void runWave(){ spawner.spawnEnemies(); state.wave++; - state.wavetime = state.hasSector() && state.getSector().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing; + state.wavetime = state.rules.waveSpacing; Events.fire(new WaveEvent()); } @@ -199,36 +231,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; } } @@ -236,14 +255,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); @@ -251,56 +271,29 @@ public class Logic implements ApplicationListener{ } } - @Remote(called = Loc.both) - public static void launchZone(){ - if(!state.isCampaign()) return; + @Remote(called = Loc.server) + public static void sectorCapture(){ + //the sector has been conquered - waves get disabled + state.rules.waves = false; - if(!headless){ - ui.hudfrag.showLaunch(); + if(state.rules.sector == null){ + //disable attack mode + state.rules.attackMode = false; + return; } - //TODO better core launch effect - for(Building tile : state.teams.playerCores()){ - Fx.launch.at(tile); + 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); } - - Sector sector = state.rules.sector; - - //TODO containers must be launched too - Time.runTask(30f, () -> { - Sector origin = sector.save.meta.secinfo.origin; - if(origin != null){ - ItemSeq stacks = origin.getExtraItems(); - - //add up all items into list - for(Building entity : state.teams.playerCores()){ - entity.items.each(stacks::add); - } - - //save received items - origin.setExtraItems(stacks); - } - - //remove all the cores - state.teams.playerCores().each(b -> b.tile.remove()); - - state.launched = true; - state.gameOver = true; - - //save over the data w/o the cores - sector.save.save(); - - //run a turn, since launching takes up a turn - universe.runTurn(); - - //TODO apply extra damage to sector - //sector.setTurnsPassed(sector.getTurnsPassed() + 3); - - //TODO load the sector that was launched from - Events.fire(new LaunchEvent()); - //manually fire game over event now - Events.fire(new GameOverEvent(state.rules.defaultTeam)); - }); } @Remote(called = Loc.both) @@ -315,6 +308,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 @@ -332,24 +372,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); - } - - //force pausing when the player is out of sector time - if(state.isOutOfTime()){ - if(!state.wasTimeout){ - universe.displayTimeEnd(); - state.wasTimeout = true; - } - //if no turn was run. - if(state.isOutOfTime()){ - state.set(State.paused); - } + state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.type.isCounted); } if(!state.isPaused()){ + state.teams.updateTeamStats(); + if(state.isCampaign()){ - state.secinfo.update(); + state.rules.sector.info.update(); } if(state.isCampaign()){ @@ -358,7 +388,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()){ @@ -395,5 +425,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 c4e519a4a5..32b058997b 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -21,6 +21,7 @@ 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.*; @@ -32,7 +33,7 @@ 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; + public static final float viewScale = 2f; private long ping; private Interval timer = new Interval(5); @@ -40,7 +41,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; @@ -105,12 +106,10 @@ public class NetClient implements ApplicationListener{ Time.runTask(3f, ui.loadfrag::hide); if(packet.reason != null){ - if(packet.reason.equals("closed")){ - ui.showSmall("@disconnect", "@disconnect.closed"); - }else if(packet.reason.equals("timeout")){ - ui.showSmall("@disconnect", "@disconnect.timeout"); - }else if(packet.reason.equals("error")){ - ui.showSmall("@disconnect", "@disconnect.error"); + switch(packet.reason){ + case "closed" -> ui.showSmall("@disconnect", "@disconnect.closed"); + case "timeout" -> ui.showSmall("@disconnect", "@disconnect.timeout"); + case "error" -> ui.showSmall("@disconnect", "@disconnect.error"); } }else{ ui.showErrorMessage("@disconnect"); @@ -196,14 +195,14 @@ public class NetClient implements ApplicationListener{ } //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); + Log.info("<&fi@: @&fr>", "&lk" + player.name, "&lw" + message); //a command was sent, now get the output if(response.type != ResponseType.valid){ @@ -236,7 +235,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); @@ -258,6 +257,11 @@ public class NetClient implements ApplicationListener{ public static void kick(KickReason reason){ netClient.disconnectQuietly(); logic.reset(); + + if(reason == KickReason.serverRestarting){ + ui.join.reconnect(); + return; + } if(!reason.quiet){ if(reason.extraText() != null){ @@ -295,6 +299,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; @@ -317,15 +328,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) @@ -335,6 +346,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; @@ -435,7 +453,7 @@ public class NetClient implements ApplicationListener{ tile.build.readAll(Reads.get(input), tile.build.version()); } }catch(Exception e){ - e.printStackTrace(); + Log.err(e); } } @@ -566,19 +584,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; } @@ -586,7 +604,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); } } @@ -600,9 +618,9 @@ public class NetClient implements ApplicationListener{ unit.x, 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, diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 9b298f9924..da801cc454 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,6 +18,7 @@ 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.*; @@ -41,7 +41,7 @@ public class NetServer implements ApplicationListener{ 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 * 12f; public final Administration admins = new Administration(); public final CommandHandler clientCommands = new CommandHandler("/"); @@ -164,7 +164,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; } @@ -226,8 +226,8 @@ public class NetServer implements ApplicationListener{ writeBuffer.reset(); player.write(outputBuffer); }catch(Throwable t){ - t.printStackTrace(); con.kick(KickReason.nameEmpty); + err(t); return; } @@ -248,11 +248,10 @@ public class NetServer implements ApplicationListener{ try{ RemoteReadServer.readPacket(packet.reader(), packet.type, con.player); }catch(ValidateException e){ - Log.debug("Validation failed for '@': @", e.player, e.getMessage()); + 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()); + if(e.getCause() instanceof ValidateException v){ + debug("Validation failed for '@': @", v.player, v.getMessage()); }else{ throw e; } @@ -285,7 +284,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 +300,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 +339,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 +418,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."); } } }); @@ -439,12 +447,17 @@ 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; + } + + if(!arg[0].equalsIgnoreCase("y") && !arg[0].equalsIgnoreCase("n")){ player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no)."); return; } - int sign = arg[0].toLowerCase().equals("y") ? 1 : -1; + int sign = arg[0].equalsIgnoreCase("y") ? 1 : -1; currentlyKicking[0].vote(player, sign); } }); @@ -485,7 +498,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 +510,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 +523,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 +544,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 +591,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 +605,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,14 +630,12 @@ 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(); @@ -631,12 +643,12 @@ public class NetServer implements ApplicationListener{ 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; + float maxSpeed = unit.realSpeed(); if(unit.isGrounded()){ maxSpeed *= unit.floorSpeedMultiplier(); } - 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 +705,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; } @@ -713,10 +724,10 @@ public class NetServer implements ApplicationListener{ netServer.admins.banPlayerIP(other.con.address); netServer.admins.banPlayerID(other.con.uuid); 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); if(player.con != null){ @@ -724,7 +735,7 @@ public class NetServer implements ApplicationListener{ }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); } } @@ -738,7 +749,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 +775,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 +798,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); @@ -905,7 +916,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 +941,6 @@ public class NetServer implements ApplicationListener{ } void sync(){ - try{ Groups.player.each(p -> !p.isLocal(), player -> { if(player.con == null || !player.con.isConnected()){ @@ -955,7 +964,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 ff7d44ec88..bddcd3d749 100644 --- a/core/src/mindustry/core/Platform.java +++ b/core/src/mindustry/core/Platform.java @@ -14,10 +14,18 @@ import mindustry.type.*; import mindustry.ui.dialogs.*; import rhino.*; +import java.net.*; + 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()}, getClass().getClassLoader()); + return Class.forName(mainClass, true, classLoader); + } + /** Steam: Update lobby visibility.*/ default void updateLobby(){} @@ -109,9 +117,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{ @@ -120,8 +129,12 @@ 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. Only supported on desktop. + * Show a file chooser for multiple file types. * @param cons Selection listener * @param extensions File extensions to filter */ diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index ad7806267c..712f894155 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -27,10 +27,14 @@ 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; + /** minZoom = zooming out, maxZoom = zooming in */ + public float minZoom = 1.5f, maxZoom = 6f; - private Bloom bloom; + //TODO unused private FxProcessor fx = new FxProcessor(); private Color clearColor = new Color(0f, 0f, 0f, 1f); private float targetscale = Scl.scl(4); @@ -53,7 +57,7 @@ public class Renderer implements ApplicationListener{ public void init(){ planets = new PlanetRenderer(); - if(settings.getBool("bloom")){ + if(settings.getBool("bloom", !ios)){ setupBloom(); } } @@ -63,8 +67,11 @@ public class Renderer implements ApplicationListener{ 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; + animateShields = settings.getBool("animatedshields"); if(landTime > 0){ landTime -= Time.delta; @@ -108,7 +115,10 @@ public class Renderer implements ApplicationListener{ minimap.dispose(); effectBuffer.dispose(); blocks.dispose(); - planets.dispose(); + if(planets != null){ + planets.dispose(); + planets = null; + } if(bloom != null){ bloom.dispose(); bloom = null; @@ -118,10 +128,6 @@ public class Renderer implements ApplicationListener{ @Override public void resize(int width, int height){ - if(settings.getBool("bloom")){ - setupBloom(); - } - fx.resize(width, height); } @@ -140,9 +146,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); } } @@ -200,7 +206,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,8 +223,6 @@ 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); @@ -239,17 +243,23 @@ public class Renderer implements ApplicationListener{ } if(bloom != null){ + bloom.resize(graphics.getWidth() / 4, graphics.getHeight() / 4); Draw.draw(Layer.bullet - 0.01f, bloom::capture); Draw.draw(Layer.effect + 0.01f, 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); @@ -301,12 +311,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(){ @@ -334,6 +351,7 @@ public class Renderer implements ApplicationListener{ 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; @@ -359,8 +377,8 @@ public class Renderer implements ApplicationListener{ PixmapIO.writePNG(file, fullPixmap); fullPixmap.dispose(); ui.showInfoFade(Core.bundle.format("screenshot", file.toString())); + drawWeather = true; buffer.dispose(); } - } diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 536e89a9b2..1eddb7b8fc 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.*; @@ -42,6 +42,7 @@ public class UI implements ApplicationListener, Loadable{ public MinimapFragment minimapfrag; public PlayerListFragment listfrag; public LoadingFragment loadfrag; + public HintsFragment hints; public WidgetGroup menuGroup, hudGroup; @@ -91,6 +92,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(); @@ -104,7 +111,7 @@ public class UI implements ApplicationListener, Loadable{ Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black5).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,12 +147,6 @@ public class UI implements ApplicationListener, Loadable{ } } - //draw overlay for buttons - if(state.rules.tutorial){ - control.tutorial.draw(); - Draw.flush(); - } - Events.fire(Trigger.uiDrawEnd); } @@ -156,6 +157,7 @@ public class UI implements ApplicationListener, Loadable{ menufrag = new MenuFragment(); hudfrag = new HudFragment(); + hints = new HintsFragment(); chatfrag = new ChatFragment(); minimapfrag = new MinimapFragment(); listfrag = new PlayerListFragment(); @@ -262,11 +264,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,20 +330,21 @@ 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){ @@ -356,6 +359,7 @@ public class UI implements ApplicationListener, Loadable{ hide(); listener.run(); }).size(110, 50).pad(4); + closeOnBack(); }}.show(); } @@ -364,6 +368,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 +383,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 +394,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 +411,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 +427,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 +435,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,6 +445,7 @@ 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(); } @@ -487,13 +497,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); } @@ -511,7 +528,7 @@ public class UI implements ApplicationListener, Loadable{ //TODO move? - public static String formatAmount(long number){ + public static String formatAmount(int 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){ 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 867ba38f1a..9751a3cd0d 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -6,7 +6,6 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.struct.ObjectIntMap.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.content.*; @@ -31,7 +30,7 @@ import static mindustry.Vars.*; public class World{ public final Context context = new Context(); - public @NonNull Tiles tiles = new Tiles(0, 0); + public Tiles tiles = new Tiles(0, 0); private boolean generating, invalidMap; private ObjectMap customMapLoaders = new ObjectMap<>(); @@ -66,6 +65,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); } @@ -86,13 +90,11 @@ public class World{ return height()*tilesize; } - @NonNull public Floor floor(int x, int y){ Tile tile = tile(x, y); return tile == null ? Blocks.air.asFloor() : tile.floor(); } - @NonNull public Floor floorWorld(float x, float y){ Tile tile = tileWorld(x, y); return tile == null ? Blocks.air.asFloor() : tile.floor(); @@ -132,7 +134,6 @@ public class World{ return tile.build; } - @NonNull public Tile rawTile(int x, int y){ return tiles.getn(x, y); } @@ -147,7 +148,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); } @@ -175,22 +186,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; } @@ -252,12 +263,12 @@ 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(); @@ -266,8 +277,6 @@ public class World{ ObjectIntMap floorc = new ObjectIntMap<>(); ObjectSet content = new ObjectSet<>(); - float waterFloors = 0, totalFloors = 0; - for(Tile tile : world.tiles){ if(world.getDarkness(tile.x, tile.y) >= 3){ continue; @@ -279,10 +288,6 @@ public class World{ 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()); @@ -297,16 +302,14 @@ public class World{ 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 hasRain = !hasSnow && content.contains(Liquids.water) && !floors[0].name.contains("sand"); + boolean hasDesert = !hasSnow && !hasRain && floors[0] == Blocks.sand; boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted"); if(hasSnow){ @@ -315,6 +318,7 @@ public class World{ if(hasRain){ state.rules.weather.add(new WeatherEntry(Weathers.rain)); + state.rules.weather.add(new WeatherEntry(Weathers.fog)); } if(hasDesert){ @@ -325,9 +329,9 @@ public class World{ 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){ @@ -439,7 +443,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; @@ -539,7 +542,7 @@ public class World{ int circleDst = (int)(rawDst - (length - circleBlend)); if(circleDst > 0){ - dark = Math.max(circleDst / 1f, dark); + dark = Math.max(circleDst, dark); } } @@ -610,6 +613,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 7565dc88b0..71bf965e3f 100644 --- a/core/src/mindustry/ctype/Content.java +++ b/core/src/mindustry/ctype/Content.java @@ -2,7 +2,6 @@ package mindustry.ctype; import arc.files.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.mod.Mods.*; @@ -10,8 +9,7 @@ import mindustry.mod.Mods.*; public abstract class Content implements Comparable, Disposable{ public final short id; /** Info on which mod this content was loaded from. */ - public @NonNull ModContentInfo minfo = new ModContentInfo(); - + public ModContentInfo minfo = new ModContentInfo(); public Content(){ this.id = (short)Vars.content.getBy(getContentType()).size; @@ -33,7 +31,7 @@ public abstract class Content implements Comparable, Disposable{ */ public void load(){} - /** @return whether an error ocurred during mod loading. */ + /** @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..a08dab1b67 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -4,25 +4,34 @@ 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; + /** Whether to show the description in the research dialog preview. */ + public boolean inlineDescription = true; + /** Special logic icon ID. */ + public int iconId = 0; /** Icons by Cicon ID.*/ - protected TextureRegion[] cicons = new TextureRegion[mindustry.ui.Cicon.all.length]; + protected TextureRegion[] cicons = new TextureRegion[Cicon.all.length]; /** Unlock state. Loaded from settings. Do not modify outside of the constructor. */ protected boolean unlocked; @@ -31,13 +40,31 @@ 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); } + /** @return the tech node for this content. may be null. */ + public @Nullable TechNode node(){ + return TechTree.get(this); + } + public String displayDescription(){ return minfo.mod == null ? description : description + "\n" + Core.bundle.format("mod.display", minfo.mod.meta.displayName()); } + /** 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 asynchronously.*/ @CallSuper public void createIcons(MultiPacker packer){ @@ -59,9 +86,11 @@ public abstract class UnlockableContent extends MappableContent{ cicons[icon.ordinal()] = Core.atlas.find(getContentType().name() + "-" + name + "-" + icon.name(), Core.atlas.find(getContentType().name() + "-" + name + "-full", + Core.atlas.find(name + "-" + icon.name(), + Core.atlas.find(name + "-full", Core.atlas.find(name, Core.atlas.find(getContentType().name() + "-" + name, - Core.atlas.find(name + "1"))))); + Core.atlas.find(name + "1"))))))); } return cicons[icon.ordinal()]; } @@ -73,7 +102,9 @@ 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); + public void display(Table table){ + + } /** Called when this content is unlocked. Use this to unlock other related content. */ public void onUnlock(){ @@ -86,7 +117,7 @@ public abstract class UnlockableContent extends MappableContent{ /** 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 +126,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 unlocked || 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..53134663ea 100755 --- a/core/src/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -1,20 +1,19 @@ 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) { + public DrawOperation(MapEditor editor){ this.editor = editor; } @@ -38,7 +37,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 1098e463d3..e4be334888 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.*; @@ -19,7 +18,7 @@ public class EditorTile extends Tile{ } @Override - public void setFloor(@NonNull Floor type){ + public void setFloor(Floor type){ if(skip()){ super.setFloor(type); return; @@ -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 -> ui.editor.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; } @@ -112,7 +130,7 @@ public class EditorTile extends Tile{ Block block = block(); - if(block.hasEntity()){ + if(block.hasBuilding()){ build = entityprov.get().init(this, team, false, rotation); build.cons = new ConsumeModule(build); if(block.hasItems) build.items = new ItemModule(); diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 2dff5e9f46..cd4b63935e 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -118,7 +118,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(); diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index 49d174779b..c460d7c042 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -4,6 +4,7 @@ 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.*; @@ -136,7 +137,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 +157,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 +168,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 +179,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++){ diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 353e39fcf8..316d29f5e6 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.*; @@ -43,6 +42,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; @@ -257,7 +257,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); 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); + player.unit(UnitTypes.alpha.spawn(player.team(), player.x, player.y)); + } }); } @@ -385,7 +392,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ } public void build(){ - float size = 60f; + float size = 58f; clearChildren(); table(cont -> { @@ -557,6 +564,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(); @@ -645,9 +667,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(() -> { @@ -655,9 +677,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()); @@ -671,28 +706,32 @@ public class MapEditorDialog extends Dialog implements Disposable{ return Integer.compare(b1.id, b2.id); }); + int i = 0; + for(Block block : blocksOut){ TextureRegion region = block.icon(Cicon.medium); - if(!Core.atlas.isFound(region) || !block.inEditor || (block.buildVisibility == BuildVisibility.debugOnly)) continue; + 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 472a20dee0..f6a87f77b1 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -29,7 +29,8 @@ public class MapGenerateDialog extends BaseDialog{ private final Prov[] filterTypes = new Prov[]{ NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new, RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new, - BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new, EnemySpawnFilter::new + BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new, + EnemySpawnFilter::new, SpawnPathFilter::new }; private final MapEditor editor; private final boolean applied; @@ -44,16 +45,20 @@ public class MapGenerateDialog extends BaseDialog{ private AsyncExecutor executor = new AsyncExecutor(1); private AsyncResult result; boolean generating; - private GenTile returnTile = new GenTile(); - private GenTile[][] buffer1, buffer2; + private long[] buffer1, buffer2; private 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. */ @@ -65,7 +70,7 @@ public class MapGenerateDialog extends BaseDialog{ shown(this::setup); addCloseButton(); if(applied){ - buttons.button("@editor.apply", () -> { + buttons.button("@editor.apply", Icon.ok, () -> { ui.loadAnd(() -> { apply(); hide(); @@ -78,14 +83,14 @@ public class MapGenerateDialog extends BaseDialog{ 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("@add", Icon.add, this::showAdd).height(64f).width(150f); if(!applied){ hidden(this::apply); @@ -107,38 +112,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); } }); } @@ -201,15 +204,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(){ @@ -295,7 +291,7 @@ public class MapGenerateDialog extends BaseDialog{ for(Prov gen : filterTypes){ GenerateFilter filter = gen.get(); - if((!applied && filter.isBuffered()) || (filter.isPost() && applied)) continue; + if((filter.isPost() && applied)) continue; selection.cont.button(filter.name(), () -> { filters.add(filter); @@ -317,9 +313,15 @@ public class MapGenerateDialog extends BaseDialog{ 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(){ @@ -350,6 +352,7 @@ public class MapGenerateDialog extends BaseDialog{ result = executor.submit(() -> { try{ + int w = pixmap.getWidth(); world.setGenerating(true); generating = true; @@ -357,24 +360,24 @@ public class MapGenerateDialog extends BaseDialog{ //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)); + 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()); + input.begin(filter, editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.getWidth()-1) + w* Mathf.clamp(y / scaling, 0, pixmap.getHeight()-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++){ @@ -383,10 +386,10 @@ public class MapGenerateDialog extends BaseDialog{ //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); } @@ -401,44 +404,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 = 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..dd9959b199 100644 --- a/core/src/mindustry/editor/MapInfoDialog.java +++ b/core/src/mindustry/editor/MapInfoDialog.java @@ -1,8 +1,8 @@ package mindustry.editor; import arc.*; -import arc.struct.*; import arc.scene.ui.*; +import arc.struct.*; import mindustry.*; import mindustry.game.*; import mindustry.io.*; 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/MapResizeDialog.java b/core/src/mindustry/editor/MapResizeDialog.java index b3e190b020..afb0356bfa 100644 --- a/core/src/mindustry/editor/MapResizeDialog.java +++ b/core/src/mindustry/editor/MapResizeDialog.java @@ -8,7 +8,7 @@ import arc.util.*; import mindustry.ui.dialogs.*; 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){ diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 21e659ae1b..69ae67d7c9 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -1,24 +1,22 @@ 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; @@ -173,6 +171,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 +243,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 +321,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..d6a33bf6ff 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); diff --git a/core/src/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java index d5b957e143..a98d03a923 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.*; @@ -35,15 +34,9 @@ public class WaveInfoDialog extends BaseDialog{ 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.icon(Cicon.medium)).size(32f).padRight(3).scaling(Scaling.fit); b.add(group.type.localizedName).color(Pal.accent); b.add().growX(); @@ -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.icon(Cicon.medium)).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 152982a986..9ddca6e986 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -2,13 +2,13 @@ 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,7 +23,8 @@ 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 Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2(); + private static Seq units = new Seq<>(); private static GridBits bits = new GridBits(30, 30); private static IntQueue propagation = new IntQueue(); private static IntSet collidedBlocks = new IntSet(); @@ -31,15 +32,22 @@ public class Damage{ private static Unit tmpUnit; /** 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(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); @@ -47,7 +55,7 @@ public class Damage{ 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.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)); }); } @@ -82,7 +90,7 @@ public class Damage{ 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; @@ -112,20 +120,35 @@ public class Damage{ collidedBlocks.clear(); tr.trns(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 +177,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); } /** @@ -184,7 +214,6 @@ public class Damage{ Building tile = world.build(cx, cy); if(tile != null && tile.team != hitter.team){ tmpBuilding = tile; - //TODO return tile return true; } return false; @@ -362,9 +391,9 @@ public class Damage{ 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){ + if(tile.build != null && tile.build.team != team){ + int health = (int)(tile.build.health / (tile.block().size * tile.block().size)); + if(tile.build.health > 0){ tile.build.damage(scaledDamage); scaledDamage -= health; @@ -402,8 +431,7 @@ public class Damage{ } @Struct - static - class PropCellStruct{ + 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..6fa163b074 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,46 @@ 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; + + 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 layer(float l){ + layer = l; return this; } - public Effect ground(float duration){ - ground = true; - this.groundDuration = duration; + public Effect layer(float l, float duration){ + layer = l; + this.layerDuration = duration; return this; } @@ -88,14 +98,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,9 +137,14 @@ 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; @@ -147,7 +166,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 +229,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..3425314810 100644 --- a/core/src/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -115,7 +115,6 @@ public class EntityCollisions{ @SuppressWarnings("unchecked") public void updatePhysics(EntityGroup group){ - QuadTree tree = group.tree(); tree.clear(); @@ -127,7 +126,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; } public static boolean waterSolid(int x, int y){ @@ -141,7 +140,6 @@ public class EntityCollisions{ } private void checkCollide(Hitboxc a, Hitboxc b){ - a.hitbox(this.r1); b.hitbox(this.r2); @@ -218,7 +216,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..6553e72d44 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") @@ -57,8 +58,9 @@ public class EntityGroup implements Iterable{ each(Entityc::update); } - public void copy(Seq arr){ + public Seq copy(Seq arr){ arr.addAll(array); + return arr; } public void each(Cons cons){ @@ -92,6 +94,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 +185,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 dbc7f616c9..ce5a3f97da 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.*; @@ -24,36 +26,34 @@ public class Lightning{ /** Create a lighting branch at a location. Use Team.derelict to damage everyone. */ public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){ - createLightingInternal(null, lastSeed++, team, color, damage, x, y, targetAngle, length); + createLightningInternal(null, lastSeed++, team, color, damage, x, y, targetAngle, length); } /** Create a lighting branch at a location. Uses bullet parameters. */ public static void create(Bullet bullet, Color color, float damage, float x, float y, float targetAngle, int length){ - createLightingInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); + createLightningInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); } - //TODO remote method - //@Remote(called = Loc.server, unreliable = true) - private static void createLightingInternal(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, 0f, 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); 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/Units.java b/core/src/mindustry/entities/Units.java index 82827c6530..cd602327a6 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -3,9 +3,11 @@ package mindustry.entities; import arc.*; import arc.func.*; import arc.math.geom.*; +import arc.struct.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; @@ -65,7 +67,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){ @@ -124,7 +126,7 @@ public class Units{ nearby(x, y, width, height, unit -> { if(boolResult) return; - if((unit.isGrounded() && !unit.type().hovering) == ground){ + if((unit.isGrounded() && !unit.type.hovering) == ground){ unit.hitbox(hitrect); if(hitrect.overlaps(x, y, width, height)){ @@ -175,6 +177,18 @@ public class Units{ } } + /** Returns the closest target enemy. First, units are checked, then tile entities. */ + public static Teamc bestTarget(Team team, float x, float y, float range, Boolf unitPred, Boolf tilePred, Sortf sort){ + if(team == Team.derelict) return null; + + Unit unit = bestEnemy(team, x, y, range, unitPred, sort); + if(unit != null){ + return unit; + }else{ + return findEnemyTile(team, x, y, range, tilePred); + } + } + /** Returns the closest enemy of this team. Filter by predicate. */ public static Unit closestEnemy(Team team, float x, float y, float range, Boolf predicate){ if(team == Team.derelict) return null; @@ -183,7 +197,7 @@ 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); if(dst2 < range*range && (result == null || dst2 < cdist)){ @@ -195,6 +209,26 @@ public class Units{ return result; } + /** Returns the closest enemy of this team using a custom comparison function. Filter by predicate. */ + public static Unit bestEnemy(Team team, float x, float y, float range, Boolf predicate, Sortf sort){ + if(team == Team.derelict) return null; + + result = null; + 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; + + float cost = sort.cost(e, x, y); + if(result == null || cost < cdist){ + result = e; + cdist = cost; + } + }); + + return result; + } + /** Returns the closest ally of this team. Filter by predicate. No range. */ public static Unit closest(Team team, float x, float y, Boolf predicate){ result = null; @@ -252,7 +286,7 @@ public class Units{ /** 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); + team.data().tree().intersect(x, y, width, height, cons); } /** Iterates over all units in a circle around this position. */ @@ -276,20 +310,12 @@ 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. */ @@ -297,4 +323,7 @@ public class Units{ nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons); } + public interface Sortf{ + float cost(Unit unit, float x, float y); + } } 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/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 7d36f97e04..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. */ @@ -27,8 +29,8 @@ public class ForceFieldAbility extends Ability{ private static float realRad; private static Unit paramUnit; private static ForceFieldAbility paramField; - private static final Cons shieldConsumer = trait -> { - if(trait.team() != paramUnit.team && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ + private static final Cons shieldConsumer = trait -> { + if(trait.team != paramUnit.team && trait.type.absorbable && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ trait.absorb(); Fx.absorb.at(trait); @@ -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..17d3eaa23a --- /dev/null +++ b/core/src/mindustry/entities/abilities/MoveLightningAbility.java @@ -0,0 +1,46 @@ +package mindustry.entities.abilities; + +import arc.graphics.*; +import arc.math.*; +import arc.util.*; +import arc.audio.*; +import mindustry.content.*; +import mindustry.entities.*; +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 + 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"); + + public Effect shootEffect = Fx.sparkShoot; + public Sound shootSound = Sounds.spark; + + MoveLightningAbility(){} + + public MoveLightningAbility(float damage, int length, float chance, float minSpeed, float maxSpeed, Color color){ + this.damage = damage; + this.length = length; + this.chance = chance; + 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)){ + shootEffect.at(unit.x, unit.y, unit.rotation, color); + Lightning.create(unit.team, color, damage, unit.x + unit.vel.x, unit.y + unit.vel.y, unit.rotation, length); + shootSound.at(unit); + } + } +} 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 86% rename from core/src/mindustry/entities/abilities/ShieldFieldAbility.java rename to core/src/mindustry/entities/abilities/ShieldRegenFieldAbility.java index 739751f6c1..8af8d2390a 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; diff --git a/core/src/mindustry/entities/abilities/StatusFieldAbility.java b/core/src/mindustry/entities/abilities/StatusFieldAbility.java index a1c9a53418..a1bf47d408 100644 --- a/core/src/mindustry/entities/abilities/StatusFieldAbility.java +++ b/core/src/mindustry/entities/abilities/StatusFieldAbility.java @@ -1,6 +1,5 @@ package mindustry.entities.abilities; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; @@ -8,7 +7,7 @@ import mindustry.gen.*; import mindustry.type.*; public class StatusFieldAbility extends Ability{ - public @NonNull StatusEffect effect; + public StatusEffect effect; public float duration = 60, reload = 100, range = 20; public Effect applyEffect = Fx.heal; public Effect activeEffect = Fx.overdriveWave; @@ -17,7 +16,7 @@ public class StatusFieldAbility extends Ability{ StatusFieldAbility(){} - public StatusFieldAbility(@NonNull StatusEffect effect, float duration, float reload, float range){ + public StatusFieldAbility(StatusEffect effect, float duration, float reload, float range){ this.duration = duration; this.reload = reload; this.range = range; @@ -29,7 +28,6 @@ public class StatusFieldAbility extends Ability{ 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 1af235140b..422a02bbba 100644 --- a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java +++ b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java @@ -1,8 +1,8 @@ package mindustry.entities.abilities; +import arc.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; import mindustry.content.*; @@ -12,14 +12,16 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; +import static mindustry.Vars.*; + public class UnitSpawnAbility extends Ability{ - public @NonNull UnitType type; + public UnitType type; public float spawnTime = 60f, spawnX, spawnY; public Effect spawnEffect = Fx.spawn; protected float timer; - public UnitSpawnAbility(@NonNull UnitType type, float spawnTime, float spawnX, float spawnY){ + public UnitSpawnAbility(UnitType type, float spawnTime, float spawnX, float spawnY){ this.type = type; this.spawnTime = spawnTime; this.spawnX = spawnX; @@ -31,10 +33,9 @@ public class UnitSpawnAbility extends Ability{ @Override public void update(Unit unit){ - timer += Time.delta; + timer += Time.delta * state.rules.unitBuildSpeedMultiplier; if(timer >= spawnTime && Units.canCreate(unit.team, type)){ - 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); @@ -57,4 +58,9 @@ public class UnitSpawnAbility extends Ability{ }); } } + + @Override + public String localized(){ + return Core.bundle.format("ability.unitspawn", type.localizedName); + } } diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 5cbb7fd3f1..73e0fb93ba 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -3,7 +3,6 @@ package mindustry.entities.bullet; import arc.audio.*; import arc.graphics.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -14,6 +13,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.*; import static mindustry.Vars.*; @@ -25,6 +25,7 @@ public abstract class BulletType extends Content{ public float drawSize = 40f; public float drag = 0f; public boolean pierce, pierceBuilding; + public int pierceCap = -1; public Effect hitEffect, despawnEffect; /** Effect created when shooting. */ @@ -40,7 +41,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. */ @@ -71,15 +72,25 @@ public abstract class BulletType extends Content{ public boolean hittable = true; /** Whether this bullet can be reflected. */ 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. + * 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; //additional effects public float fragCone = 360f; + public float fragAngle = 0f; public int fragBullets = 9; public float fragVelocityMin = 0.2f, fragVelocityMax = 1f, fragLifeMin = 1f, fragLifeMax = 1f; - public BulletType fragBullet = null; + public @Nullable BulletType fragBullet = null; public Color hitColor = Color.white; public Color trailColor = Pal.missileYellowBack; @@ -95,12 +106,18 @@ 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; public int lightningLength = 5, lightningLengthRand = 0; /** Use a negative value to use default bullet damage. */ 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; @@ -126,17 +143,37 @@ public abstract class BulletType extends Content{ this(1f, 1f); } + /** @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; + public boolean testCollision(Bullet bullet, Building tile){ + return healPercent <= 0.001f || tile.team != bullet.team || tile.healthf() < 1f; } - public void hitTile(Bullet b, Building tile, float initialHealth){ - hit(b); + /** 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 other, float initialHealth){ @@ -156,7 +193,7 @@ public abstract class BulletType extends Content{ if(fragBullet != null){ for(int i = 0; i < fragBullets; i++){ float len = Mathf.random(1f, 7f); - float a = b.rotation() + Mathf.range(fragCone/2); + float a = b.rotation() + Mathf.range(fragCone/2) + fragAngle; fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax), Mathf.random(fragLifeMin, fragLifeMax)); } } @@ -172,16 +209,29 @@ public abstract class BulletType extends Content{ 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++){ - Lightning.create(b, lightningColor, lightningDamage < 0 ? damage : lightningDamage, b.x, b.y, Mathf.random(360f), lightningLength + Mathf.random(lightningLengthRand)); + Lightning.create(b, lightningColor, lightningDamage < 0 ? damage : lightningDamage, b.x, b.y, b.rotation() + Mathf.range(lightningCone/2) + lightningAngle, lightningLength + Mathf.random(lightningLengthRand)); } } @@ -204,17 +254,18 @@ public abstract class BulletType extends Content{ } 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); + b.time = lifetime; } } public void update(Bullet b){ - if(homingPower > 0.0001f){ + if(homingPower > 0.0001f && b.time >= homingDelay){ Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround); if(target != null){ b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), homingPower)); @@ -222,7 +273,8 @@ public abstract class BulletType extends Content{ } if(weaveMag > 0){ - b.vel.rotate(Mathf.sin(Mathf.randomSeed(b.id, 10f) + b.time, weaveScale, weaveMag) * Time.delta); + float scl = Mathf.randomSeed(id, 0.9f, 1.1f); + b.vel.rotate(Mathf.sin(b.time + Mathf.PI * weaveScale/2f * scl, weaveScale * scl, weaveMag) * Time.delta); } if(trailChance > 0){ @@ -232,6 +284,18 @@ public abstract class BulletType extends Content{ } } + @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 public ContentType getContentType(){ return ContentType.bullet; @@ -254,11 +318,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){ @@ -271,15 +335,19 @@ public abstract class BulletType extends Content{ bullet.owner = owner; bullet.team = team; bullet.vel.trns(angle, speed * velocityScl); - bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); + if(backMove){ + bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); + }else{ + bullet.set(x, y); + } bullet.lifetime = lifetime * lifetimeScl; 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(); 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; } @@ -289,6 +357,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 0f1894271f..9edcdb0a5c 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}; @@ -28,21 +30,29 @@ public class ContinuousLaserBulletType extends BulletType{ 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; + keepVelocity = false; + collides = false; + pierce = true; + hittable = false; + absorbable = false; } protected ContinuousLaserBulletType(){ this(0); } + @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; @@ -57,7 +67,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)){ @@ -77,17 +86,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/HealBulletType.java b/core/src/mindustry/entities/bullet/HealBulletType.java deleted file mode 100644 index 9400eb5092..0000000000 --- a/core/src/mindustry/entities/bullet/HealBulletType.java +++ /dev/null @@ -1,54 +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; - } - - 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..cd5d89d5da --- /dev/null +++ b/core/src/mindustry/entities/bullet/LaserBoltBulletType.java @@ -0,0 +1,33 @@ +package mindustry.entities.bullet; + +import arc.graphics.g2d.*; +import mindustry.gen.*; +import mindustry.content.*; + +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; + } + + public LaserBoltBulletType(){ + this(1f, 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(); + } +} diff --git a/core/src/mindustry/entities/bullet/LaserBulletType.java b/core/src/mindustry/entities/bullet/LaserBulletType.java index ad5965f3b8..ab6cd9dce1 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -23,22 +23,29 @@ public class LaserBulletType extends BulletType{ public LaserBulletType(float damage){ super(0.01f, damage); - keepVelocity = false; hitEffect = Fx.hitLancer; despawnEffect = Fx.none; shootEffect = Fx.hitLancer; smokeEffect = Fx.none; - collides = false; hitSize = 4; lifetime = 16f; + 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(); diff --git a/core/src/mindustry/entities/bullet/LightningBulletType.java b/core/src/mindustry/entities/bullet/LightningBulletType.java index dbfbcc0301..24dabecba3 100644 --- a/core/src/mindustry/entities/bullet/LightningBulletType.java +++ b/core/src/mindustry/entities/bullet/LightningBulletType.java @@ -26,6 +26,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 22d5c22d42..e99b7afefc 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.*; @@ -13,8 +13,9 @@ import mindustry.world.*; import static mindustry.Vars.*; public class LiquidBulletType extends BulletType{ - public @NonNull Liquid liquid; + public Liquid liquid; public float puddleSize = 6f; + public float orbSize = 3f; public LiquidBulletType(@Nullable Liquid liquid){ super(3.5f, 0); @@ -22,10 +23,12 @@ public class LiquidBulletType extends BulletType{ if(liquid != null){ this.liquid = liquid; this.status = liquid.effect; + lightColor = liquid.lightColor; + lightOpacity = liquid.lightColor.a; } ammoMultiplier = 1f; - lifetime = 74f; + lifetime = 34f; statusDuration = 60f * 2f; despawnEffect = Fx.none; hitEffect = Fx.hitLiquid; @@ -62,7 +65,7 @@ public class LiquidBulletType extends BulletType{ public void draw(Bullet b){ Draw.color(liquid.color, Color.white, b.fout() / 100f); - Fill.circle(b.x, b.y, 3f); + Fill.circle(b.x, b.y, orbSize); } @Override @@ -79,7 +82,7 @@ public class LiquidBulletType extends BulletType{ Puddles.deposit(world.tileWorld(hitx, hity), liquid, puddleSize); if(liquid.temperature <= 0.5f && liquid.flammability < 0.3f){ - float intensity = 400f; + float intensity = 400f * puddleSize/6f; Fires.extinguish(world.tileWorld(hitx, hity), intensity); for(Point2 p : Geometry.d4){ Fires.extinguish(world.tileWorld(hitx + p.x * tilesize, hity + p.y * tilesize), intensity); 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/PointBulletType.java b/core/src/mindustry/entities/bullet/PointBulletType.java new file mode 100644 index 0000000000..920e6e5b51 --- /dev/null +++ b/core/src/mindustry/entities/bullet/PointBulletType.java @@ -0,0 +1,70 @@ +package mindustry.entities.bullet; + +import arc.math.geom.*; +import arc.util.*; +import mindustry.*; +import mindustry.entities.*; +import mindustry.gen.*; + +public class PointBulletType extends BulletType{ + private static float cdist = 0f; + private static Unit result; + + public float trailSpacing = 10f; + + public PointBulletType(){ + scaleVelocity = true; + lifetime = 100f; + collides = false; + keepVelocity = false; + backMove = false; + } + + @Override + public void init(Bullet b){ + super.init(b); + + float px = b.x + b.lifetime * b.vel.x, + py = b.y + b.lifetime * b.vel.y, + rot = b.rotation(); + + Geometry.iterateLine(0f, b.x, b.y, px, py, trailSpacing, (x, y) -> { + trailEffect.at(x, y, rot); + }); + + b.time = b.lifetime; + b.set(px, py); + + //calculate hit entity + + cdist = 0f; + result = null; + float range = 1f; + + Units.nearbyEnemies(b.team, px - range, py - range, range*2f, range*2f, e -> { + if(e.dead()) return; + + e.hitbox(Tmp.r1); + if(!Tmp.r1.contains(px, py)) return; + + float dst = e.dst(px, py) - e.hitSize; + if((result == null || dst < cdist)){ + result = e; + cdist = dst; + } + }); + + if(result != null){ + b.collision(result, px, py); + }else{ + Building build = Vars.world.buildWorld(px, py); + if(build != null && build.team != b.team){ + build.collision(b); + } + } + + b.remove(); + + b.vel.setZero(); + } +} diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java index 8265f35e8b..aa5136e7fc 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -1,60 +1,80 @@ 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); + 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 boolean testCollision(Bullet bullet, Building tile){ + return bullet.team != tile.team; + } + @Override public void hitEntity(Bullet b, Hitboxc entity, float initialHealth){ handle(b, entity, initialHealth); } @Override - public void hitTile(Bullet b, Building tile, float initialHealth){ - handle(b, tile, initialHealth); + 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..dbd30b77a8 100644 --- a/core/src/mindustry/entities/bullet/SapBulletType.java +++ b/core/src/mindustry/entities/bullet/SapBulletType.java @@ -19,7 +19,8 @@ public class SapBulletType extends BulletType{ public SapBulletType(){ speed = 0.0001f; despawnEffect = Fx.none; - pierce = true; + pierce = false; + collides = false; hitSize = 0f; hittable = false; hitEffect = Fx.hitLiquid; @@ -29,8 +30,7 @@ public class SapBulletType extends BulletType{ @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); @@ -61,21 +61,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..236ede8887 100644 --- a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java +++ b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java @@ -24,9 +24,11 @@ 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; } @Override diff --git a/core/src/mindustry/entities/comp/AmmoDistributeComp.java b/core/src/mindustry/entities/comp/AmmoDistributeComp.java new file mode 100644 index 0000000000..96e10a9ce0 --- /dev/null +++ b/core/src/mindustry/entities/comp/AmmoDistributeComp.java @@ -0,0 +1,28 @@ +package mindustry.entities.comp; + +import arc.util.*; +import mindustry.annotations.Annotations.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.blocks.units.*; + +@Component +abstract class AmmoDistributeComp implements Unitc{ + @Import float x, y; + @Import UnitType type; + @Import Team team; + @Import float ammo; + + private transient float ammoCooldown; + + @Override + public void update(){ + if(ammoCooldown > 0f) ammoCooldown -= Time.delta; + + if(ammo > 0 && ammoCooldown <= 0f && ResupplyPoint.resupply(team, x, y, type.ammoResupplyRange, Math.min(type.ammoResupplyAmount, ammo), type.ammoType.color, u -> u != self())){ + ammo -= Math.min(type.ammoResupplyAmount, ammo); + ammoCooldown = 5f; + } + } +} diff --git a/core/src/mindustry/entities/comp/BoundedComp.java b/core/src/mindustry/entities/comp/BoundedComp.java index c266ae3e51..c02d34a760 100644 --- a/core/src/mindustry/entities/comp/BoundedComp.java +++ b/core/src/mindustry/entities/comp/BoundedComp.java @@ -16,11 +16,13 @@ abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{ @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()){ + //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; + } //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..5b065ef666 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -1,19 +1,21 @@ package mindustry.entities.comp; import arc.*; +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.*; @@ -23,20 +25,38 @@ import java.util.*; import static mindustry.Vars.*; @Component -abstract class BuilderComp implements Unitc{ +abstract class BuilderComp implements Posc, Teamc, Rotc{ static final Vec2[] vecs = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()}; @Import float x, y, rotation; + @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; + } @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(); @@ -57,7 +77,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 +85,88 @@ 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.cblock != current.block)){ 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 * 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 * 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(){ - /** 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(BuildPlan plan : plans){ + if(plan.progress > 0.01f || (buildPlan() == plan && plan.initialized && (within(plan.x * tilesize, plan.y * tilesize, buildingRange) || state.isEditor()))) continue; + drawPlan(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); + + 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 +194,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 +207,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 +218,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 +233,32 @@ 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); + 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 +272,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 32b23f2b6b..1ac7394258 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -13,21 +13,25 @@ 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.payloads.*; import mindustry.world.blocks.power.*; @@ -47,17 +51,18 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, static final Seq tempTiles = 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 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; @@ -79,8 +84,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, }else{ if(block.hasPower){ //reinit power graph - power.graph = new PowerGraph(); - power.graph.add(self()); + new PowerGraph().add(self()); } } this.rotation = rotation; @@ -103,8 +107,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; @@ -191,6 +195,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.cblock != null && entity.cblock.synthetic() && entity.wasConstructing){ + block = entity.cblock; + 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 +253,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 +358,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 +390,15 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //endregion //region handler methods + 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 +446,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); } @@ -421,9 +474,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * @param todump payload to dump. * @return whether the payload was moved successfully */ - public boolean movePayload(@NonNull Payload todump){ + 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); @@ -438,10 +491,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * @param todump payload to dump. * @return whether the payload was moved successfully */ - public boolean dumpPayload(@NonNull Payload todump){ + 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 +519,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 +528,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void dumpLiquid(Liquid liquid){ - int dump = this.dump; + 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); @@ -497,23 +554,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 +585,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 +632,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 +652,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,6 +666,14 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return false; } + 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); + } + /** Try dumping any item near the */ public boolean dump(){ return dump(null); @@ -619,7 +686,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, 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 +721,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. */ @@ -692,9 +759,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++){ @@ -739,7 +804,7 @@ 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(); } @@ -751,16 +816,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, Draw.z(Layer.power + 1); Draw.color(Pal.gray); Fill.square(brcx, brcy, 2.5f, 45); - Draw.color(cons.status().color); + Draw.color(status().color); Fill.square(brcx, brcy, 1.5f, 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,7 +893,7 @@ 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)){ + if(block.consumesPower || block.outputsPower){ int range = 10; tempTiles.clear(); Geometry.circle(tileX(), tileY(), range, (x, y) -> { @@ -849,6 +914,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + /** + * Called when a block is placed over some other blocks. This seq will always have at least one item. + * Should load some previous state, if necessary. */ + public void overwrote(Seq previous){ + + } + public void onRemoved(){ } @@ -863,7 +935,15 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Called when arbitrary configuration is applied to a tile. */ public void configured(@Nullable Unit builder, @Nullable Object value){ //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(); + Class type = value == null ? void.class : value.getClass().isAnonymousClass() || value.getClass().getSimpleName().startsWith("adapter") ? 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); @@ -914,34 +994,13 @@ 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; } @@ -1029,6 +1088,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); } } @@ -1043,8 +1107,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; + } } } @@ -1061,7 +1130,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 && team == player.team() ? SystemCursor.hand : SystemCursor.arrow; } /** @@ -1093,7 +1162,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return false; } - public float handleDamage(float amount){ return amount; } @@ -1105,7 +1173,7 @@ 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.damage() * other.type().buildingDamageMultiplier); return true; } @@ -1114,6 +1182,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return true; } + public void pickedUp(){ + + } + public void removeFromProximity(){ onProximityRemoved(); tmpTiles.clear(); @@ -1156,10 +1228,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, proximity.add(tile); } - for(Building other : tmpTiles){ - other.onProximityUpdate(); - } - onProximityAdded(); onProximityUpdate(); @@ -1172,6 +1240,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } + /** @return ambient sound volume scale. */ + public float ambientVolume(){ + return efficiency(); + } + //endregion //region overrides @@ -1213,31 +1286,41 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @Override public double sense(LAccess sensor){ - if(sensor == LAccess.x) return x; - if(sensor == LAccess.y) return y; - if(sensor == LAccess.team) return team.id; - if(sensor == LAccess.health) return health; - if(sensor == LAccess.maxHealth) return maxHealth(); - if(sensor == LAccess.efficiency) return efficiency(); - if(sensor == LAccess.rotation) return rotation; - if(sensor == LAccess.totalItems && items != null) return items.total(); - if(sensor == LAccess.totalLiquids && liquids != null) return liquids.total(); - if(sensor == LAccess.totalPower && power != null && block.consumes.hasPower()) return power.status * (block.consumes.getPower().buffered ? block.consumes.getPower().capacity : 1f); - if(sensor == LAccess.itemCapacity) return block.itemCapacity; - if(sensor == LAccess.liquidCapacity) return block.liquidCapacity; - if(sensor == LAccess.powerCapacity) return block.consumes.hasPower() ? block.consumes.getPower().capacity : 0f; - if(sensor == LAccess.powerNetIn && power != null) return power.graph.getLastScaledPowerIn() * 60; - if(sensor == LAccess.powerNetOut && power != null) return power.graph.getLastScaledPowerOut() * 60; - if(sensor == LAccess.powerNetStored && power != null) return power.graph.getLastPowerStored(); - if(sensor == LAccess.powerNetCapacity && power != null) return power.graph.getLastCapacity(); - return 0; + return switch(sensor){ + case x -> World.conv(x); + case y -> World.conv(y); + case team -> team.id; + case health -> health; + case maxHealth -> maxHealth; + case efficiency -> efficiency(); + 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.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(); + case enabled -> enabled ? 1 : 0; + case controlled -> this instanceof ControlBlock c ? c.isControlled() ? 1 : 0 : 0; + case payloadCount -> getPayload() != null ? 1 : 0; + default -> 0; + }; } @Override public Object senseObject(LAccess sensor){ - if(sensor == LAccess.type) return block; + 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; + }; - return noSensed; } @Override @@ -1255,6 +1338,18 @@ 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 as the client + if(type == LAccess.configure && block.logicConfigurable && !net.client()){ + //change config only if it's new + Object prev = senseObject(LAccess.config); + if(prev != p1){ + configureAny(p1); + } + } + } + @Override public void remove(){ if(sound != null){ @@ -1274,6 +1369,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @Final @Override public void update(){ + if(state.isEditor()) return; + timeScaleDuration -= Time.delta; if(timeScaleDuration <= 0f || !block.canOverdrive){ timeScale = 1f; @@ -1287,12 +1384,18 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } - if(sound != null){ - sound.update(x, y, shouldActiveSound()); + if(team == Team.derelict){ + 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..a51a30dfd7 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -1,5 +1,6 @@ package mindustry.entities.comp; +import arc.*; import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; @@ -7,10 +8,14 @@ import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.core.*; import mindustry.entities.bullet.*; +import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.blocks.defense.Wall.*; import static mindustry.Vars.*; @@ -19,25 +24,20 @@ 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; @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()); } } } @@ -68,6 +68,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Override public void absorb(){ + absorbed = true; remove(); } @@ -76,11 +77,6 @@ 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){ @@ -95,14 +91,12 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw type.hit(self(), x, y); float health = 0f; - if(other instanceof Healthc){ - Healthc h = (Healthc)other; + if(other instanceof Healthc h){ health = h.health(); h.damage(damage); } - if(other instanceof Unit){ - Unit unit = (Unit)other; + if(other instanceof Unit unit){ unit.impulse(Tmp.v3.set(unit).sub(this.x, this.y).nor().scl(type.knockback * 80f)); unit.apply(type.status, type.statusDuration); } @@ -115,6 +109,10 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw } type.hitEntity(self(), other, health); + + if(owner instanceof WallBuild && player != null && team == player.team() && other instanceof Unit unit && unit.dead){ + Events.fire(Trigger.phaseDeflectHit); + } } @Override @@ -122,12 +120,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; @@ -144,7 +142,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw } } - type.hitTile(self(), tile, health); + type.hitTile(self(), tile, health, true); return !type.pierceBuilding; } @@ -152,6 +150,10 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw return false; }); } + + if(type.pierceCap != -1 && collided.size >= type.pierceCap){ + remove(); + } } @Override 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 354581654b..0ce8d60d10 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -3,47 +3,52 @@ package mindustry.entities.comp; import arc.func.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; 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()){ + 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,14 +63,17 @@ 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, 150f, 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); } @@ -73,15 +81,15 @@ abstract class CommanderComp implements Unitc{ void command(Formation formation, Seq units){ clearCommand(); - float spacing = hitSize() * 1f; - minFormationSpeed = type().speed; + float spacing = hitSize * 0.8f; + 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 +113,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..a97a2e0cc3 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 diff --git a/core/src/mindustry/entities/comp/FireComp.java b/core/src/mindustry/entities/comp/FireComp.java index ea67ca9e19..7981e061b6 100644 --- a/core/src/mindustry/entities/comp/FireComp.java +++ b/core/src/mindustry/entities/comp/FireComp.java @@ -16,7 +16,7 @@ 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; + private static final float spreadChance = 0.04f, fireballChance = 0.06f; @Import float time, lifetime, x, y; @@ -26,7 +26,7 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{ @Override public void update(){ - if(Mathf.chance(0.1 * Time.delta)){ + if(Mathf.chance(0.09 * Time.delta)){ Fx.fire.at(x + Mathf.range(4f), y + Mathf.range(4f)); } @@ -34,8 +34,8 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{ Fx.fireSmoke.at(x + Mathf.range(4f), y + Mathf.range(4f)); } - if(Mathf.chance(0.001 * Time.delta)){ - Sounds.fire.at(this); + if(!headless){ + control.sound.loop(Sounds.fire, this, 0.07f); } time = Mathf.clamp(time + Time.delta, 0, lifetime()); @@ -59,7 +59,7 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{ } if(baseFlammability < 0 || block != tile.block()){ - baseFlammability = tile.build == null ? 0 : tile.build.getFlammability(); + baseFlammability = tile.build == null ? 0 : tile.getFlammability(); block = tile.block(); } @@ -77,12 +77,12 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{ } } - if(Mathf.chance(0.1 * Time.delta)){ + if(Mathf.chance(0.025 * Time.delta)){ Puddlec p = Puddles.get(tile); puddleFlammability = p != null ? p.getFlammability() / 3f : 0; if(damage){ - entity.damage(0.4f); + entity.damage(1.6f); } Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f, unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning), diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index 15d0e84b1e..94db2f6a63 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -1,14 +1,16 @@ package mindustry.entities.comp; +import arc.*; import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +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{ @@ -44,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); } @@ -66,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); @@ -90,7 +96,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ //TODO is the netClient check necessary? if(drownTime >= 0.999f && !net.client()){ kill(); - //TODO drown event! + Events.fire(new UnitDrownEvent(self())); } }else{ drownTime = Mathf.lerpDelta(drownTime, 0f, 0.03f); 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..f44270ebed 100644 --- a/core/src/mindustry/entities/comp/HitboxComp.java +++ b/core/src/mindustry/entities/comp/HitboxComp.java @@ -2,8 +2,8 @@ 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.gen.*; diff --git a/core/src/mindustry/entities/comp/LaunchCoreComp.java b/core/src/mindustry/entities/comp/LaunchCoreComp.java index 7283a9e220..4f642c8493 100644 --- a/core/src/mindustry/entities/comp/LaunchCoreComp.java +++ b/core/src/mindustry/entities/comp/LaunchCoreComp.java @@ -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 44969416e9..6d99f368cb 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -25,7 +25,7 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati @Override public void update(){ //trigger animation only when walking manually - if(walked){ + if(walked || net.client()){ float len = deltaLen(); baseRotation = Angles.moveToward(baseRotation, deltaAngle(), type().baseRotateSpeed * Mathf.clamp(len / type().speed / Time.delta) * Time.delta); walkTime += len; @@ -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; @@ -83,4 +83,12 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati walked = true; } } + + @Override + public void approach(Vec2 vector){ + if(!vector.isZero(0.09f)){ + //mark walking state when moving in a controlled manner + walked = true; + } + } } diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index 7049617b73..1faabadef8 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(), 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(!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 99c6b84f87..f29d988d74 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(){ @@ -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; } @@ -112,20 +120,24 @@ 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)){ + 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(isPlayer()) payload.build.lastAccessed = getPlayer().name; + Fx.unitDrop.at(tile); Fx.placeBlock.at(on.drawx(), on.drawy(), on.block().size); return true; @@ -133,4 +145,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(Cicon.small)).size(itemSize).padRight(pad); + } + } } diff --git a/core/src/mindustry/entities/comp/PhysicsComp.java b/core/src/mindustry/entities/comp/PhysicsComp.java index 12972935ee..d68e392dca 100644 --- a/core/src/mindustry/entities/comp/PhysicsComp.java +++ b/core/src/mindustry/entities/comp/PhysicsComp.java @@ -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 ca52705964..5e6c214cc6 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.*; @@ -29,11 +28,11 @@ 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; - @NonNull @ReadOnly Unit unit = Nulls.unit; + @ReadOnly Unit unit = Nulls.unit; transient private Unit lastReadUnit = Nulls.unit; transient @Nullable NetConnection con; @@ -49,11 +48,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra transient float textFadeTime; public boolean isBuilder(){ - return unit instanceof Builderc; - } - - public boolean isMiner(){ - return unit instanceof Minerc; + return unit.canBuild(); } public @Nullable CoreBuild closestCore(){ @@ -79,8 +74,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 +88,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 @@ -124,13 +120,13 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra deathTimer = 0; //update some basic state to sync things - if(unit.type().canBoost){ + if(unit.type.canBoost){ Tile tile = unit.tileOn(); unit.elevation = Mathf.approachDelta(unit.elevation, (tile != null && tile.solid()) || boosting ? 1f : 0f, 0.08f); } }else if(core != 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 +160,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 +177,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)); @@ -250,7 +243,7 @@ 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); 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..cefebe8307 100644 --- a/core/src/mindustry/entities/comp/PuddleComp.java +++ b/core/src/mindustry/entities/comp/PuddleComp.java @@ -22,8 +22,7 @@ import static mindustry.entities.Puddles.*; 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 float x, y; @@ -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); } } } @@ -98,13 +96,13 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ 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); + 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 5125faa96e..5a489686ff 100644 --- a/core/src/mindustry/entities/comp/ShieldComp.java +++ b/core/src/mindustry/entities/comp/ShieldComp.java @@ -5,16 +5,16 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; 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; /** Absorbs health damage. */ float shield; - /** Absorbs percentage of damage. */ + /** Substracts an amount from damage. */ float armor; /** Shield opacity. */ transient float shieldAlpha = 0f; @@ -23,11 +23,25 @@ abstract class ShieldComp implements Healthc, Posc{ @Override public void damage(float amount){ //apply armor - //TODO balancing of armor stats & minArmorDamage 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){ @@ -36,6 +50,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){ diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index 3a31b13b95..c4ea7be07a 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -19,7 +19,7 @@ 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; + @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1; @Import UnitType type; @@ -104,7 +104,7 @@ abstract class StatusComp implements Posc, Flyingc{ } applied.clear(); - speedMultiplier = damageMultiplier = armorMultiplier = reloadMultiplier = 1f; + speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = 1f; if(statuses.isEmpty()) return; @@ -114,15 +114,16 @@ 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; entry.effect.update(self(), entry.time); diff --git a/core/src/mindustry/entities/comp/TeamComp.java b/core/src/mindustry/entities/comp/TeamComp.java index ed03caca5c..c58e97b7fd 100644 --- a/core/src/mindustry/entities/comp/TeamComp.java +++ b/core/src/mindustry/entities/comp/TeamComp.java @@ -1,11 +1,11 @@ package mindustry.entities.comp; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.game.*; import mindustry.gen.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; @Component abstract class TeamComp implements Posc{ @@ -17,15 +17,18 @@ abstract class TeamComp implements Posc{ return team.rules().cheat; } - public @Nullable Building core(){ + @Nullable + public Building core(){ return team.core(); } - public @Nullable Building closestCore(){ + @Nullable + public Building closestCore(){ return state.teams.closestCore(x, y, team); } - public @Nullable Building closestEnemyCore(){ + @Nullable + public Building 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 695703dd2f..004ae4a196 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,26 +20,29 @@ 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.*; @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 float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed; @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); private transient float resupplyTime = Mathf.random(10f); @@ -46,6 +51,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I moveAt(vector, type.accel); } + public void approach(Vec2 vector){ + vel.approachDelta(vector, type.accel * realSpeed() * floorSpeedMultiplier()); + } + public void aimLook(Position pos){ aim(pos); lookAt(pos); @@ -64,35 +73,88 @@ 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(); + } + + /** 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()){ + return vel().angle(); + } + return rotation; + } + + @Override public float range(){ return type.range; } @Replace public float clipSize(){ + if(isBuilding()){ + return state.rules.infiniteResources ? Float.MAX_VALUE : Math.max(type.clipSize, type.region.width) + buildingRange + tilesize*4f; + } return Math.max(type.region.width * 2f, type.clipSize); } @Override public double sense(LAccess sensor){ - if(sensor == LAccess.totalItems) return stack().amount; - if(sensor == LAccess.rotation) return rotation; - if(sensor == LAccess.health) return health; - if(sensor == LAccess.maxHealth) return maxHealth; - if(sensor == LAccess.x) return x; - if(sensor == LAccess.y) return y; - if(sensor == LAccess.team) return team.id; - if(sensor == LAccess.shooting) return isShooting() ? 1 : 0; - if(sensor == LAccess.shootX) return aimX(); - if(sensor == LAccess.shootY) return aimY(); - return 0; + return switch(sensor){ + case totalItems -> stack().amount; + case itemCapacity -> type.itemCapacity; + case rotation -> rotation; + case health -> health; + case maxHealth -> maxHealth; + case ammo -> !state.rules.unitAmmo ? type.ammoCapacity : ammo; + case ammoCapacity -> type.ammoCapacity; + case x -> World.conv(x); + case y -> World.conv(y); + case team -> team.id; + case shooting -> isShooting() ? 1 : 0; + 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 -> controller instanceof LogicAI || controller instanceof Player ? 1 : 0; + case commanded -> controller instanceof FormationAI ? 1 : 0; + case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0; + default -> 0; + }; } @Override public Object senseObject(LAccess sensor){ - if(sensor == LAccess.type) return type; + return switch(sensor){ + case type -> type; + case name -> controller instanceof Player p ? p.name : null; + case firstItem -> stack().amount == 0 ? null : item(); + case payloadType -> self() 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; + }; - return noSensed; } @Override @@ -141,22 +203,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; @@ -179,14 +231,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; @@ -204,7 +256,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()); } @@ -217,17 +269,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){ 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()); } @@ -264,7 +318,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); //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)){ @@ -339,7 +393,7 @@ 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()); } } @@ -351,9 +405,14 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I /** 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; + + if(!spawnedByCore){ + Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team); + } float shake = hitSize / 3f; @@ -369,7 +428,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } //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); } @@ -417,7 +476,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I dead = true; //don't waste time when the unit is already on the ground, just destroy it - if(isGrounded()){ + if(!type.flying){ destroy(); } } diff --git a/core/src/mindustry/entities/comp/VelComp.java b/core/src/mindustry/entities/comp/VelComp.java index deec6756d1..ca04d6a40c 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.*; 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 fd22fc7add..9cc5f8487a 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -4,6 +4,7 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.audio.*; import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.entities.units.*; @@ -18,15 +19,13 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ @Import Vec2 vel; @Import UnitType type; - /** minimum cursor distance from unit, fixes 'cross-eyed' shooting */ - static final float minAimDst = 18f; /** 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; @@ -67,7 +66,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ /** Aim at something. This will make all mounts point at it. */ void aim(float x, float y){ Tmp.v1.set(x, y).sub(this.x, this.y); - if(Tmp.v1.len() < minAimDst) Tmp.v1.setLength(minAimDst); + if(Tmp.v1.len() < type.aimDst) Tmp.v1.setLength(type.aimDst); x = Tmp.v1.x + this.x; y = Tmp.v1.y + this.y; @@ -92,6 +91,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ mount.bullet.time = mount.bullet.lifetime - 10f; mount.bullet = null; } + + if(mount.sound != null){ + mount.sound.stop(); + } } } @@ -113,21 +116,30 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ //update continuous state if(weapon.continuous && mount.bullet != null){ - if(!mount.bullet.isAdded() || mount.bullet.time >= mount.bullet.lifetime){ + if(!mount.bullet.isAdded() || mount.bullet.time >= mount.bullet.lifetime || mount.bullet.type != weapon.bullet){ mount.bullet = null; }else{ mount.bullet.rotation(weaponRotation + 90); mount.bullet.set(shootX, shootY); + mount.reload = weapon.reload; vel.add(Tmp.v1.trns(rotation + 180f, mount.bullet.type.recoil)); + if(weapon.shootSound != Sounds.none && !headless){ + if(mount.sound == null) mount.sound = new SoundLoop(weapon.shootSound, 1f); + mount.sound.update(x, y, true); + } } }else{ //heat decreases when not firing mount.heat = Math.max(mount.heat - Time.delta * reloadMultiplier / mount.weapon.cooldownTime, 0); + + if(mount.sound != null){ + mount.sound.update(x, y, false); + } } //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){ + mount.reload + Time.delta * reloadMultiplier > weapon.reload/2f && mount.reload <= weapon.reload/2f){ mounts[weapon.otherSide].side = !mounts[weapon.otherSide].side; mount.side = !mount.side; } @@ -154,7 +166,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ 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)); + shoot(mount, shootX, shootY, mount.aimX, mount.aimY, mountX, mountY, shootAngle, Mathf.sign(weapon.x)); mount.reload = weapon.reload; @@ -164,18 +176,19 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ } } - private void shoot(WeaponMount mount, float x, float y, float aimX, float aimY, float rotation, int side){ + private void shoot(WeaponMount mount, float x, float y, float aimX, float aimY, float mountX, float mountY, float rotation, int side){ Weapon weapon = mount.weapon; float baseX = this.x, baseY = this.y; + boolean delay = weapon.firstShotDelay + weapon.shotDelay > 0f; - weapon.shootSound.at(x, y, Mathf.random(0.8f, 1.0f)); + (delay ? weapon.chargeSound : weapon.continuous ? Sounds.none : weapon.shootSound).at(x, y, Mathf.random(weapon.soundPitchMin, weapon.soundPitchMax)); 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){ + if(delay){ Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> { Time.run(sequenceNum * weapon.shotDelay + weapon.firstShotDelay, () -> { if(!isAdded()) return; @@ -189,13 +202,16 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ boolean parentize = ammo.keepVelocity; - if(weapon.firstShotDelay > 0){ + if(delay){ 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; + if(!weapon.continuous){ + weapon.shootSound.at(x, y, Mathf.random(weapon.soundPitchMin, weapon.soundPitchMax)); + } }); }else{ vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); @@ -203,7 +219,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ mount.heat = 1f; } - weapon.ejectEffect.at(x, y, rotation * side); + weapon.ejectEffect.at(mountX, mountY, 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); diff --git a/core/src/mindustry/entities/effect/MultiEffect.java b/core/src/mindustry/entities/effect/MultiEffect.java new file mode 100644 index 0000000000..c1b0e7e6d4 --- /dev/null +++ b/core/src/mindustry/entities/effect/MultiEffect.java @@ -0,0 +1,32 @@ +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); + } + } + + @Override + public void render(EffectContainer e){ + for(Effect f : effects){ + e.scaled(f.lifetime, f::render); + 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..f38fc00603 --- /dev/null +++ b/core/src/mindustry/entities/effect/ParticleEffect.java @@ -0,0 +1,55 @@ +package mindustry.entities.effect; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.entities.*; + +/** 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; + public Interp interp = Interp.linear; + + //region only + public float sizeFrom = 2f, sizeTo = 0f; + 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; + + Draw.color(colorFrom, colorTo, fin); + + 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(e.x + x, e.y + y, Mathf.angle(x, y), len); + }); + }else{ + Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { + Draw.rect(tex, e.x + x, e.y + y, rad, rad); + }); + } + } +} diff --git a/core/src/mindustry/entities/effect/WaveEffect.java b/core/src/mindustry/entities/effect/WaveEffect.java new file mode 100644 index 0000000000..88ff7391d2 --- /dev/null +++ b/core/src/mindustry/entities/effect/WaveEffect.java @@ -0,0 +1,33 @@ +package mindustry.entities.effect; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.entities.*; + +/** Effect that renders a basic shockwave. */ +public class WaveEffect extends Effect{ + public Color colorFrom = Color.white.cpy(), colorTo = Color.white.cpy(); + public float sizeFrom = 0f, sizeTo = 100f; + public int sides = -1; + public float rotation = 0f; + public float strokeFrom = 2f, strokeTo = 0f; + public Interp interp = Interp.linear; + + @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); + + Draw.color(colorFrom, colorTo, ifin); + Lines.stroke(interp.apply(strokeFrom, strokeTo, fin)); + + float rad = interp.apply(sizeFrom, sizeTo, fin); + Lines.poly(e.x, e.y, sides <= 0 ? Lines.circleVertices(rad) : sides, rad, rotation + e.rotation); + } +} diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index 03d9daf8b4..0eb12d7a6a 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,12 +15,11 @@ 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; protected Unit unit; protected Interval timer = new Interval(4); + protected AIController fallback; /** main target that is being faced */ protected Teamc target; @@ -34,23 +33,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,6 +76,23 @@ public class AIController implements UnitController{ } } + 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), unit.speed())); + } + protected void updateWeapons(){ if(targets.length != unit.mounts.length) targets = new Teamc[unit.mounts.length]; @@ -71,13 +100,15 @@ public class AIController implements UnitController{ 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; } + unit.isShooting = false; + for(int i = 0; i < targets.length; i++){ WeaponMount mount = unit.mounts[i]; Weapon weapon = mount.weapon; @@ -85,7 +116,7 @@ public class AIController implements UnitController{ 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){ + if(unit.type.singleTarget){ targets[i] = target; }else{ if(ret){ @@ -100,20 +131,28 @@ public class AIController implements UnitController{ boolean shoot = false; if(targets[i] != null){ - shoot = targets[i].within(mountX, mountY, weapon.bullet.range()); + shoot = targets[i].within(mountX, mountY, weapon.bullet.range()) && 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, targets[i], weapon.bullet.speed); + mount.aimX = to.x; + mount.aimY = to.y; } mount.shoot = shoot; mount.rotate = shoot; + + unit.isShooting |= shoot; + if(shoot){ + unit.aimX = mount.aimX; + unit.aimY = mount.aimY; + } } } + 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, 40); } 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..04117b1661 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,16 @@ public class BuildPlan{ } + 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 +138,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 +153,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/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index f5aa45c4ea..e5f61679c7 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,8 @@ public class WeaponMount{ public boolean side; /** current bullet for continuous weapons */ public @Nullable Bullet bullet; + /** sound loop for continuous weapons */ + public @Nullable SoundLoop sound; 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 07269df4c1..0000000000 --- a/core/src/mindustry/game/DefaultWaves.java +++ /dev/null @@ -1,197 +0,0 @@ -package mindustry.game; - -import arc.struct.Seq; -import mindustry.content.*; -import mindustry.type.ItemStack; - -public class DefaultWaves{ - private Seq spawns; - - public Seq get(){ - if(spawns == null && UnitTypes.dagger != null){ - spawns = Seq.with( - new SpawnGroup(UnitTypes.dagger){{ - end = 10; - unitScaling = 2f; - }}, - - new SpawnGroup(UnitTypes.crawler){{ - begin = 4; - end = 13; - unitAmount = 2; - unitScaling = 1.5f; - }}, - - new SpawnGroup(UnitTypes.flare){{ - begin = 12; - end = 16; - unitScaling = 1f; - }}, - - new SpawnGroup(UnitTypes.dagger){{ - begin = 11; - unitScaling = 1.7f; - spacing = 2; - max = 4; - }}, - - new SpawnGroup(UnitTypes.pulsar){{ - begin = 13; - spacing = 3; - unitScaling = 0.5f; - }}, - - new SpawnGroup(UnitTypes.mace){{ - begin = 7; - spacing = 3; - unitScaling = 2; - - end = 30; - }}, - - new SpawnGroup(UnitTypes.dagger){{ - begin = 8; - unitScaling = 1; - unitAmount = 4; - spacing = 2; - }}, - - new SpawnGroup(UnitTypes.mace){{ - begin = 28; - spacing = 3; - unitScaling = 1; - end = 40; - }}, - - new SpawnGroup(UnitTypes.mace){{ - begin = 45; - spacing = 3; - unitScaling = 2; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(UnitTypes.mace){{ - begin = 120; - spacing = 2; - unitScaling = 3; - unitAmount = 5; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(UnitTypes.flare){{ - begin = 16; - unitScaling = 1; - spacing = 2; - }}, - - new SpawnGroup(UnitTypes.dagger){{ - begin = 82; - spacing = 3; - unitAmount = 4; - unitScaling = 3; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(UnitTypes.dagger){{ - begin = 41; - spacing = 5; - unitAmount = 1; - unitScaling = 3; - effect = StatusEffects.shielded; - }}, - - new SpawnGroup(UnitTypes.fortress){{ - begin = 40; - spacing = 5; - unitAmount = 2; - unitScaling = 2; - max = 20; - }}, - - new SpawnGroup(UnitTypes.dagger){{ - begin = 35; - spacing = 3; - unitAmount = 4; - effect = StatusEffects.overdrive; - items = new ItemStack(Items.blastCompound, 60); - end = 60; - }}, - - new SpawnGroup(UnitTypes.dagger){{ - begin = 42; - spacing = 3; - unitAmount = 4; - effect = StatusEffects.overdrive; - items = new ItemStack(Items.pyratite, 100); - end = 130; - }}, - - new SpawnGroup(UnitTypes.horizon){{ - begin = 40; - unitAmount = 2; - spacing = 2; - unitScaling = 2; - }}, - - new SpawnGroup(UnitTypes.flare){{ - begin = 50; - unitAmount = 4; - unitScaling = 3; - spacing = 5; - effect = StatusEffects.overdrive; - }}, - - new SpawnGroup(UnitTypes.zenith){{ - begin = 50; - unitAmount = 2; - unitScaling = 3; - spacing = 5; - max = 16; - }}, - - new SpawnGroup(UnitTypes.horizon){{ - begin = 53; - unitAmount = 2; - unitScaling = 3; - spacing = 4; - }}, - - new SpawnGroup(UnitTypes.atrax){{ - begin = 31; - unitAmount = 4; - unitScaling = 1; - spacing = 3; - }}, - - new SpawnGroup(UnitTypes.scepter){{ - begin = 41; - unitAmount = 1; - unitScaling = 1; - spacing = 30; - }}, - - new SpawnGroup(UnitTypes.reign){{ - begin = 81; - unitAmount = 1; - unitScaling = 1; - spacing = 40; - }}, - - new SpawnGroup(UnitTypes.antumbra){{ - begin = 131; - unitAmount = 1; - unitScaling = 1; - spacing = 40; - }}, - - new SpawnGroup(UnitTypes.horizon){{ - begin = 90; - unitAmount = 2; - unitScaling = 3; - spacing = 4; - }} - ); - } - return spawns == null ? new Seq<>() : spawns; - } -} diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 98622b4bc5..3efe48932e 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -1,6 +1,6 @@ package mindustry.game; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.core.GameState.*; import mindustry.ctype.*; import mindustry.entities.units.*; @@ -17,14 +17,13 @@ public class EventType{ phaseDeflectHit, impactPower, thoriumReactorOverheat, - itemLaunch, fireExtinguish, + acceleratorUse, newGame, tutorialComplete, flameAmmo, turretCool, enablePixelation, - drown, exclusionDeath, suicideBomb, openWiki, @@ -35,12 +34,17 @@ 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{} public static class LoseEvent{} - public static class LaunchEvent{} public static class ResizeEvent{} public static class MapMakeEvent{} public static class MapPublishEvent{} @@ -60,6 +64,8 @@ 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 when a game begins and the world is loaded. */ @@ -74,6 +80,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; @@ -82,6 +97,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; @@ -149,7 +180,7 @@ public class EventType{ } } - /** Called when the configures sets a specific block. */ + /** Called when the player configures a specific building. */ public static class ConfigEvent{ public final Building tile; public final Player player; @@ -162,6 +193,45 @@ public class EventType{ } } + /** Called when a player taps any tile. */ + public static class TapEvent{ + public final Player player; + public final Tile tile; + + public TapEvent(Player player, Tile tile){ + this.tile = tile; + this.player = player; + } + } + + 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; @@ -204,17 +274,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; } } @@ -237,15 +309,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; @@ -271,6 +343,14 @@ public class EventType{ } } + public static class UnitDrownEvent{ + public final Unit unit; + + public UnitDrownEvent(Unit unit){ + this.unit = unit; + } + } + public static class UnitCreateEvent{ public final Unit unit; 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 9cea3b582f..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,36 +22,12 @@ public class Stats{ /** Friendly buildings destroyed. */ public int buildingsDestroyed; - 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); @@ -69,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..f2bb95130a 100644 --- a/core/src/mindustry/game/Gamemode.java +++ b/core/src/mindustry/game/Gamemode.java @@ -23,7 +23,6 @@ public enum Gamemode{ rules.waveTimer = true; rules.waveSpacing /= 2f; - rules.teams.get(rules.waveTeam).ai = true; rules.teams.get(rules.waveTeam).infiniteResources = true; }, map -> map.teams.contains(state.rules.waveTeam.id)), pvp(rules -> { diff --git a/core/src/mindustry/game/Objectives.java b/core/src/mindustry/game/Objectives.java index ad66fb9219..31fc92e1b3 100644 --- a/core/src/mindustry/game/Objectives.java +++ b/core/src/mindustry/game/Objectives.java @@ -2,7 +2,6 @@ package mindustry.game; import arc.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import mindustry.ctype.*; import mindustry.type.*; @@ -10,7 +9,7 @@ import mindustry.type.*; public class Objectives{ public static class Research implements Objective{ - public @NonNull UnlockableContent content; + public UnlockableContent content; public Research(UnlockableContent content){ this.content = content; @@ -29,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; @@ -39,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 @@ -48,11 +68,6 @@ public class Objectives{ } } - //TODO merge - public abstract static class SectorObjective implements Objective{ - public @NonNull SectorPreset preset; - } - /** Defines a specific objective for a game. */ public interface Objective{ @@ -67,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 e0937c9b2b..e0db8ac94a 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.*; @@ -28,17 +28,15 @@ 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 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; @@ -60,7 +58,7 @@ 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; @@ -68,22 +66,24 @@ public class Rules{ public float dropZoneRadius = 300f; /** Time between waves in ticks. */ public float waveSpacing = 60 * 60 * 2; - /** How many times longer a launch wave takes. */ - public float launchWaveMultiplier = 2f; /** 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.*/ + /** 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. @@ -91,21 +91,23 @@ 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 */ + /** 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. */ @@ -119,7 +121,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; diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 0f7908aa63..c832f86471 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); @@ -219,7 +217,7 @@ public class Saves{ 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 5ad51382f2..e539ae69a2 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.*; @@ -21,7 +21,7 @@ public class Schematic implements Publishable, Comparable{ /** Associated mod. If null, no mod is associated with this schematic. */ public @Nullable LoadedMod mod; - public Schematic(Seq tiles, @NonNull StringMap tags, int width, int height){ + public Schematic(Seq tiles, StringMap tags, int width, int height){ this.tiles = tiles; this.tags = tags; this.width = width; @@ -52,7 +52,7 @@ public class Schematic implements Publishable, Comparable{ return tiles.contains(s -> s.block instanceof CoreBlock); } - public @NonNull CoreBlock findCore(){ + public CoreBlock findCore(){ Stile tile = tiles.find(s -> s.block instanceof CoreBlock); if(tile == null) throw new IllegalArgumentException("Schematic is missing a core!"); return (CoreBlock)tile.block; @@ -62,6 +62,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 +94,7 @@ public class Schematic implements Publishable, Comparable{ @Override public String steamDescription(){ - return null; + return description(); } @Override @@ -118,7 +122,7 @@ public class Schematic implements Publishable, Comparable{ } public static class Stile{ - public @NonNull Block block; + public Block block; public short x, y; public Object config; public byte rotation; diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 672f0a23b5..e60a1660fd 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.*; @@ -33,6 +33,7 @@ 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.*; @@ -67,13 +68,12 @@ public class Schematics implements Loadable{ shadowBuffer.dispose(); if(errorTexture != null){ errorTexture.dispose(); + errorTexture = null; } }); 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 +107,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,12 +126,18 @@ 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); } + + } private @Nullable Schematic loadFile(Fi file){ @@ -152,6 +155,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; @@ -187,6 +191,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 +263,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 +285,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()); } /** @return all the valid loadouts for a specific core type. */ @@ -288,12 +293,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); @@ -347,7 +358,7 @@ public class Schematics implements Loadable{ for(int cy = y; cy <= y2; cy++){ Building linked = world.build(cx, cy); - if(linked != null && linked.block.isVisible() && !(linked.block instanceof ConstructBlock)){ + if(linked != null && (linked.block.isVisible() || linked.block() instanceof CoreBlock) && !(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; minx = Math.min(linked.tileX() + bot, minx); @@ -376,7 +387,7 @@ public class Schematics implements Loadable{ Building tile = world.build(cx, cy); if(tile != null && !counted.contains(tile.pos()) && !(tile.block instanceof ConstructBlock) - && (tile.block.isVisible() || (tile.block instanceof CoreBlock))){ + && (tile.block.isVisible() || tile.block instanceof CoreBlock)){ Object config = tile.config(); tiles.add(new Stile(tile.block, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); @@ -411,13 +422,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 -> { 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; @@ -609,8 +634,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 29e75b3e57..6a15c50e96 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -2,15 +2,17 @@ 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.modules.*; +import java.util.*; + import static mindustry.Vars.*; public class SectorInfo{ @@ -21,29 +23,78 @@ 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 ObjectIntMap coreItems = new ObjectIntMap<>(); + 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; + /** Display name. */ + public @Nullable String name; + /** Displayed icon. */ + public @Nullable String icon; + /** 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 +121,79 @@ 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.put(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 counter1 - 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); + }); + + if(state.rules.sector != null){ + state.rules.sector.saveInfo(); + } + + SectorDamage.writeParameters(this); } /** Update averages of various stats, updates some special sector logic. @@ -98,16 +202,6 @@ public class SectorInfo{ //updating in multiplayer as a client doesn't make sense if(net.client()) return; - internalTimeSpent += Time.delta; - - //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)){ @@ -119,41 +213,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..86ba7b6324 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,7 +9,9 @@ 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 @@ -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 3028edf3f4..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); @@ -74,7 +74,7 @@ public class Team implements Comparable{ /** @return the core items for this team, or an empty item module. * Never add to the resulting item module, as it is mutable. */ - public @NonNull ItemModule items(){ + public ItemModule items(){ return core() == null ? ItemModule.empty : core().items; } @@ -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..d5afac1217 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 unit. */ + public @Nullable Unit boss; 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]; } @@ -127,6 +132,82 @@ 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(); + boss = null; + + 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){ + TeamData data = unit.team.data(); + data.tree().insert(unit); + data.units.add(unit); + data.presentFlag = true; + + if(unit.team == state.rules.waveTeam && unit.isBoss()){ + boss = 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 +222,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 +242,49 @@ public class Teams{ /** Target items to mine. */ public Seq mineItems = Seq.with(Items.copper, Items.lead, Items.titanium, Items.thorium); + /** 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 type. 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 +297,8 @@ public class Teams{ return cores.isEmpty(); } - public @Nullable CoreBuild core(){ + @Nullable + public CoreBuild core(){ return cores.isEmpty() ? null : cores.first(); } 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 b148657275..6ebf66afad 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -5,8 +5,9 @@ import arc.math.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; -import mindustry.core.GameState.*; import mindustry.game.EventType.*; +import mindustry.game.SectorInfo.*; +import mindustry.maps.*; import mindustry.type.*; import mindustry.world.blocks.storage.*; @@ -18,8 +19,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(){ @@ -27,7 +29,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(); } }); @@ -54,33 +56,19 @@ public class Universe{ } } - public void displayTimeEnd(){ - if(!headless){ - //check if any sectors are under attack to display this - Seq attacked = state.getSector().planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed() && s.getSecondsPassed() > 1); - - if(attacked.any()){ - state.set(State.paused); - - //TODO localize - String text = attacked.size > 1 ? attacked.size + " sectors attacked." : "Sector " + attacked.first().id + " under attack."; - - ui.hudfrag.sectorText = text; - ui.hudfrag.attackedSectors = attacked; - ui.announce(text); - }else{ - //autorun next turn - universe.runTurn(); - } - } - } - /** 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; @@ -96,7 +84,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; @@ -104,6 +92,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; @@ -149,45 +146,99 @@ 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()){ //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() && turn > invasionGracePeriod && sector.info.hasSpawns){ + //invasion chance depends on # of nearby bases + if(Mathf.chance(baseInvasionChance * Math.min(sector.near().count(Sector::hasEnemyBase), 1))){ + 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; + }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); } } } - //TODO events Events.fire(new TurnEvent()); @@ -201,7 +252,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 99996f09eb..651e1d01d7 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -16,15 +16,18 @@ 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 static final int crackRegions = 8, maxCrackSize = 9; + private static final int initialRequests = 32 * 32; - private static final int expandr = 9; + private static final int expandr = 10; private static final Color shadowColor = new Color(0, 0, 0, 0.71f); 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,11 +38,20 @@ 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(); + private IntSet procEntities = new IntSet(), procLinks = new IntSet(), procLights = new IntSet(); private boolean displayStatus = false; 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 -> { shadowEvents.clear(); lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated @@ -117,7 +129,7 @@ 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.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.reset(); @@ -179,7 +191,9 @@ public class BlockRenderer implements Disposable{ tileview.clear(); lightview.clear(); - processedEntities.clear(); + procEntities.clear(); + procLinks.clear(); + procLights.clear(); int minx = Math.max(avgx - rangex - expandr, 0); int miny = Math.max(avgy - rangey - expandr, 0); @@ -196,20 +210,25 @@ public class BlockRenderer implements Disposable{ tile = tile.build.tile; } - if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id()))){ + if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !procEntities.contains(tile.build.id))){ if(block.expanded || !expanded){ - tileview.add(tile); - if(tile.build != null) processedEntities.add(tile.build.id()); + if(tile.build == null || procLinks.add(tile.build.id)){ + tileview.add(tile); + if(tile.build != null){ + procEntities.add(tile.build.id); + procLinks.add(tile.build.id); + } + } } //lights are drawn even in the expanded range - if(tile.build != null || tile.block().emitLight){ + 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){ //TODO need a generic way to render connections! + if(other.block instanceof PowerNode && procLinks.add(other.id)){ //TODO need a generic way to render connections! tileview.add(other.tile); } } @@ -217,7 +236,7 @@ public class BlockRenderer implements Disposable{ } //special case for floors - if(block == Blocks.air && tile.floor().emitLight){ + if((block == Blocks.air && tile.floor().emitLight) && procLights.add(tile.pos())){ lightview.add(tile); } } @@ -274,7 +293,7 @@ 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().solid && world.getDarkness(tile.x, tile.y) < 3){ //only draw floor light under non-solid blocks tile.floor().drawEnvironmentLight(tile); } } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index c3eed64feb..01ef5e5bff 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -4,7 +4,7 @@ import arc.*; import arc.graphics.*; import arc.graphics.gl.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; public enum CacheLayer{ water{ @@ -51,20 +51,21 @@ public enum CacheLayer{ endShader(Shaders.slag); } }, - normal(5), - walls(3); + space{ + @Override + public void begin(){ + beginShader(); + } + + @Override + public void end(){ + endShader(Shaders.space); + } + }, + normal, + walls; public static final CacheLayer[] all = values(); - /** Capacity multiplier. */ - public final int capacity; - - CacheLayer(){ - this(2); - } - - CacheLayer(int capacity){ - this.capacity = capacity; - } public void begin(){ diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index 4da853049b..b8d1f1e522 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -51,7 +51,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){ @@ -84,6 +84,30 @@ public class Drawf{ Draw.color(); } + public static void shadow(TextureRegion region, float x, float y, float rotation){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y, rotation); + Draw.color(); + } + + public static void shadow(TextureRegion region, float x, float y){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y); + Draw.color(); + } + + public static void liquid(TextureRegion region, float x, float y, float alpha, Color color, float rotation){ + Draw.color(color, alpha); + Draw.rect(region, x, y, rotation); + Draw.color(); + } + + public static void liquid(TextureRegion region, float x, float y, float alpha, Color color){ + Draw.color(color, alpha); + Draw.rect(region, x, y); + Draw.color(); + } + public static void dashCircle(float x, float y, float rad, Color color){ Lines.stroke(3f, Pal.gray); Lines.dashCircle(x, y, rad); @@ -112,16 +136,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){ diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index d6ec756910..3e8d4e1fcb 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -17,10 +17,9 @@ 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; - private Chunk[][] cache; + private int[][][] cache; private MultiCacheBatch cbatch; private IntSet drawnLayerSet = new IntSet(); private IntSet recacheSet = new IntSet(); @@ -33,7 +32,8 @@ public class FloorRenderer implements Disposable{ /**Queues up a cache change for a tile. Only runs in render loop. */ public void recacheTile(Tile tile){ - recacheSet.add(Point2.pack(tile.x / chunksize, tile.y / chunksize)); + //currently a no-op + //recacheSet.add(Point2.pack(tile.x / chunksize, tile.y / chunksize)); } public void drawFloor(){ @@ -63,11 +63,11 @@ public class FloorRenderer implements Disposable{ if(!Structs.inBounds(worldx, worldy, cache)) continue; - Chunk chunk = cache[worldx][worldy]; + int[] chunk = cache[worldx][worldy]; //loop through all layers, and add layer index if it exists for(int i = 0; i < layers; i++){ - if(chunk.caches[i] != -1 && i != CacheLayer.walls.ordinal()){ + if(chunk[i] != -1 && i != CacheLayer.walls.ordinal()){ drawnLayerSet.add(i); } } @@ -154,9 +154,9 @@ public class FloorRenderer implements Disposable{ continue; } - Chunk chunk = cache[worldx][worldy]; - if(chunk.caches[layer.ordinal()] == -1) continue; - cbatch.drawCache(chunk.caches[layer.ordinal()]); + int[] chunk = cache[worldx][worldy]; + if(chunk[layer.ordinal()] == -1) continue; + cbatch.drawCache(chunk[layer.ordinal()]); } } @@ -165,7 +165,7 @@ public class FloorRenderer implements Disposable{ private void cacheChunk(int cx, int cy){ used.clear(); - Chunk chunk = cache[cx][cy]; + 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++){ @@ -184,15 +184,15 @@ public class FloorRenderer implements Disposable{ } } - private void cacheChunkLayer(int cx, int cy, Chunk chunk, CacheLayer layer){ + private void cacheChunkLayer(int cx, int cy, int[] chunk, CacheLayer layer){ Batch current = Core.batch; Core.batch = cbatch; //begin a new cache - if(chunk.caches[layer.ordinal()] == -1){ + if(chunk[layer.ordinal()] == -1){ cbatch.beginCache(); }else{ - cbatch.beginCache(chunk.caches[layer.ordinal()]); + cbatch.beginCache(chunk[layer.ordinal()]); } for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ @@ -217,8 +217,7 @@ public class FloorRenderer implements Disposable{ } Core.batch = current; - cbatch.reserve(layer.capacity * chunksize * chunksize); - chunk.caches[layer.ordinal()] = cbatch.endCache(); + chunk[layer.ordinal()] = cbatch.endCache(); } public void clearTiles(){ @@ -227,15 +226,14 @@ public class FloorRenderer implements Disposable{ recacheSet.clear(); int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); - cache = new Chunk[chunksx][chunksy]; - cbatch = new MultiCacheBatch(chunksize * chunksize * 8); + 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++){ - cache[x][y] = new Chunk(); - Arrays.fill(cache[x][y].caches, -1); + Arrays.fill(cache[x][y], -1); cacheChunk(x, y); } @@ -251,13 +249,4 @@ public class FloorRenderer implements Disposable{ cbatch = null; } } - - private static class Chunk{ - /** Maps cache layer ID to cache ID in the batch. - * -1 means that this cache is unoccupied. */ - int[] caches = new int[CacheLayer.all.length]; - - Chunk(){ - } - } } diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 154147da14..46b9093a14 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -7,7 +7,6 @@ import arc.graphics.gl.*; import arc.math.*; import arc.util.*; -//TODO this class is a trainwreck, remove it public class IndexedRenderer implements Disposable{ private static final int vsize = 5; 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..ebf1cf9187 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{ @@ -100,7 +100,6 @@ public class LightRenderer{ Draw.vert(ledge.texture, vertices, 0, vertices.length); - Vec2 v3 = Tmp.v2.trnsExact(rot, stroke); u = ledge.u; @@ -199,4 +198,4 @@ public class LightRenderer{ lights.clear(); } -} \ No newline at end of file +} diff --git a/core/src/mindustry/graphics/LoadRenderer.java b/core/src/mindustry/graphics/LoadRenderer.java index 35674837d6..ba3778a026 100644 --- a/core/src/mindustry/graphics/LoadRenderer.java +++ b/core/src/mindustry/graphics/LoadRenderer.java @@ -35,11 +35,18 @@ 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 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()); @@ -48,7 +55,7 @@ public class LoadRenderer implements Disposable{ 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("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), @@ -304,7 +311,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 +470,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..efa42cfc89 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -237,8 +237,6 @@ 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); @@ -246,7 +244,7 @@ public class MenuRenderer implements Disposable{ 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 +257,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); }); } diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index bba020f792..ad61d171a5 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -9,7 +9,6 @@ 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.*; @@ -92,18 +91,23 @@ 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); + Draw.rect(unit.type.icon(Cicon.full), x + rx, y + ry, scale, scale, 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); + } } } @@ -122,7 +126,7 @@ public class MinimapRenderer implements Disposable{ float dy = (Core.camera.position.y / tilesize); dx = Mathf.clamp(dx, sz, world.width() - sz); dy = Mathf.clamp(dy, sz, world.height() - sz); - float invTexWidth = 1f / texture.getWidth(); + float invTexWidth = 1f / texture.width; float invTexHeight = 1f / texture.height; float x = dx - sz, y = world.height() - dy - sz, width = sz * 2, height = sz * 2; region.set(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight); @@ -159,7 +163,7 @@ 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(); diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index ea988e5e78..2f5ea104c7 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -7,6 +7,7 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.*; +import mindustry.ai.types.*; import mindustry.gen.*; import mindustry.input.*; import mindustry.ui.*; @@ -27,7 +28,7 @@ public class OverlayRenderer{ if(player.dead()) return; if(player.isBuilder()){ - player.builder().drawBuildRequests(); + player.unit().drawBuildPlans(); } input.drawBottom(); @@ -35,7 +36,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()){ @@ -84,11 +85,11 @@ public class OverlayRenderer{ //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); + Draw.rect(select.type.icon(Cicon.full), select.x(), select.y(), select.rotation() - 90); } Lines.stroke(unitFade); - Lines.square(select.x, select.y, select.hitSize() * 1.5f, Time.time() * 2f); + Lines.square(select.x, select.y, select.hitSize() * 1.5f, Time.time * 2f); Draw.reset(); } @@ -111,19 +112,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 +154,28 @@ public class OverlayRenderer{ input.drawOverSelect(); + if(ui.hudfrag.blockfrag.hover() instanceof Unit unit && unit.controller() instanceof LogicAI ai && ai.controller instanceof Building build && build.isValid()){ + 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.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 771697b845..1b2b10ff94 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"), @@ -47,6 +49,7 @@ public class Pal{ darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f), darkerGray = new Color(0.2f, 0.2f, 0.2f, 1f), darkestGray = new Color(0.1f, 0.1f, 0.1f, 1f), + shadow = new Color(0, 0, 0, 0.22f), ammo = Color.valueOf("ff8947"), rubble = Color.valueOf("1c1817"), @@ -93,5 +96,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/Shaders.java b/core/src/mindustry/graphics/Shaders.java index bdc95d2a92..637b09967b 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,7 +9,6 @@ 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.*; @@ -17,10 +17,11 @@ import static mindustry.Vars.*; public class Shaders{ public static BlockBuild blockbuild; public static @Nullable ShieldShader shield; + public static BuildBeamShader buildBeam; public static UnitBuild build; public static DarknessShader darkness; public static LightShader light; - public static SurfaceShader water, mud, tar, slag; + public static SurfaceShader water, mud, tar, slag, space; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; @@ -38,6 +39,7 @@ public class Shaders{ shield = null; t.printStackTrace(); } + buildBeam = new BuildBeamShader(); build = new UnitBuild(); darkness = new DarknessShader(); light = new LightShader(); @@ -45,6 +47,7 @@ public class Shaders{ mud = new SurfaceShader("mud"); tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); + space = new SpaceShader("space"); planet = new PlanetShader(); planetGrid = new PlanetGridShader(); atmosphere = new AtmosphereShader(); @@ -66,13 +69,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); @@ -155,12 +158,11 @@ public class Shaders{ setUniformf("u_progress", progress); setUniformf("u_uv", region.u, region.v); setUniformf("u_uv2", region.u2, region.v2); - setUniformf("u_texsize", region.texture.getWidth(), region.texture.height); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } public static class BlockBuild extends LoadShader{ - public Color color = new Color(); public float progress; public TextureRegion region = new TextureRegion(); @@ -171,11 +173,10 @@ public class Shaders{ @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_texsize", region.texture.getWidth(), region.texture.height); + setUniformf("u_time", Time.time); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -188,7 +189,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,11 +216,46 @@ 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{ public SurfaceShader(String frag){ - super(frag, "screenspace"); + super(getShaderFi("screenspace.vert"), getShaderFi(frag + ".frag")); + loadNoise(); + } + public SurfaceShader(String vertRaw, String fragRaw){ + super(vertRaw, fragRaw); + loadNoise(); + } + + public void loadNoise(){ Core.assets.load("sprites/noise.png", Texture.class).loaded = t -> { ((Texture)t).setFilter(TextureFilter.linear); ((Texture)t).setWrap(TextureWrap.repeat); @@ -212,7 +266,7 @@ 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); @@ -224,9 +278,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..fd5e36eb25 100644 --- a/core/src/mindustry/graphics/Trail.java +++ b/core/src/mindustry/graphics/Trail.java @@ -28,7 +28,7 @@ public class Trail{ 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; + float size = width / length; 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); diff --git a/core/src/mindustry/graphics/g3d/MeshBuilder.java b/core/src/mindustry/graphics/g3d/MeshBuilder.java index 2342c469c6..89668e2858 100644 --- a/core/src/mindustry/graphics/g3d/MeshBuilder.java +++ b/core/src/mindustry/graphics/g3d/MeshBuilder.java @@ -4,11 +4,10 @@ import arc.graphics.*; import arc.graphics.VertexAttributes.*; import arc.graphics.gl.*; import arc.math.geom.*; -import arc.util.*; import mindustry.graphics.g3d.PlanetGrid.*; public class MeshBuilder{ - private static final Vec3 v1 = new Vec3(), v2 = new Vec3(), v3 = new Vec3(); + private static final Vec3 v1 = new Vec3(), v2 = new Vec3(), v3 = new Vec3(), v4 = new Vec3(); private static final float[] floats = new float[3 + 3 + 1]; private static Mesh mesh; @@ -78,8 +77,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); } } @@ -106,12 +103,13 @@ public class MeshBuilder{ private static Mesh end(){ Mesh last = mesh; + last.getVerticesBuffer().limit(last.getVerticesBuffer().position()); mesh = null; return last; } private static Vec3 normal(Vec3 v1, Vec3 v2, Vec3 v3){ - return Tmp.v32.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); + return v4.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); } private static void verts(Vec3 a, Vec3 b, Vec3 c, Vec3 normal, Color color){ 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..7e84e7a8bb 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,33 @@ 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(); + skybox.render(cam.combined); + 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 +119,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 +162,26 @@ 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()) 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){ //apply transformed position batch.proj().mul(planet.getTransform(mat)); @@ -171,17 +201,23 @@ 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 +226,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 +308,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 +342,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..6291012259 100644 --- a/core/src/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -58,6 +58,8 @@ public enum Binding implements KeyBind{ fullscreen(KeyCode.f11), pause(KeyCode.space), minimap(KeyCode.m), + research(KeyCode.b), + planet_map(KeyCode.n), toggle_menus(KeyCode.c), screenshot(KeyCode.p), toggle_power_lines(KeyCode.f5), @@ -67,6 +69,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 88c317d29b..801ffdbbd8 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -10,9 +10,9 @@ 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,13 +43,13 @@ 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; @Override public void buildUI(Group group){ - + //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.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); @@ -57,12 +57,13 @@ public class DesktopInput extends InputHandler{ }).margin(6f); }); + //building hints group.fill(t -> { t.bottom(); t.visible(() -> { - t.color.a = Mathf.lerpDelta(t.color.a, player.builder().isBuilding() ? 1f : 0f, 0.15f); + t.color.a = Mathf.lerpDelta(t.color.a, player.unit().isBuilding() ? 1f : 0f, 0.15f); - return Core.settings.getBool("hints") && selectRequests.isEmpty() && t.color.a > 0.01f; + return ui.hudfrag.shown && 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 -> { @@ -75,8 +76,9 @@ public class DesktopInput extends InputHandler{ }).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 +123,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,6 +154,7 @@ public class DesktopInput extends InputHandler{ } drawRequest(lineRequests.get(i)); } + lineRequests.each(this::drawOverRequest); }else if(isPlacing()){ if(block.rotate){ drawArrow(block, cursorX, cursorY, rotation); @@ -166,7 +169,6 @@ public class DesktopInput extends InputHandler{ block.drawRequestConfig(brequest, allRequests()); brequest.config = null; } - } } @@ -177,14 +179,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,7 +196,7 @@ 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; } @@ -235,8 +237,10 @@ 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; @@ -279,7 +283,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 +295,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 +349,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 +360,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 +368,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()){ + if(Core.settings.getBool("buildautopause") && isBuilding && !player.unit().isBuilding()){ isBuilding = false; buildWasAutoPaused = true; } @@ -384,12 +388,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 +406,6 @@ public class DesktopInput extends InputHandler{ ui.schematics.hide(); }else{ ui.schematics.show(); - ui.schematics.focusSearchField(); } } @@ -459,6 +462,10 @@ 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)){ @@ -478,8 +485,8 @@ 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 && + !tryBeginMine(selected) && player.unit().mineTile == null && !Core.scene.hasKeyboard()){ player.shooting = shouldShoot; } }else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine @@ -504,7 +511,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; @@ -545,7 +552,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; } @@ -596,19 +603,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()); @@ -619,26 +616,24 @@ 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); + if(!movement.isZero()){ + unit.vel.rotateTo(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(); @@ -647,7 +642,6 @@ public class DesktopInput extends InputHandler{ //update payload input if(unit instanceof Payloadc){ - if(Core.input.keyTap(Binding.pickupCargo)){ tryPickupPayload(); } @@ -657,11 +651,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 bbca06d7e0..d42773124d 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.*; @@ -32,6 +32,7 @@ import mindustry.ui.fragments.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.blocks.ConstructBlock.*; +import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -46,14 +47,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ final static float playerSelectRange = mobile ? 17f : 11f; /** 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; @@ -78,6 +76,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 +96,23 @@ 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 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); + } } public static void createItemTransfer(Item item, int amount, float x, float y, Position to, Runnable done){ @@ -100,9 +122,56 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + @Remote(called = Loc.server, targets = Loc.both, forward = true) + public static void requestItem(Player player, Building tile, Item item, int amount){ + if(player == null || tile == null || !tile.interactable(player.team()) || !player.within(tile, buildingRange) || player.dead()) return; + + if(net.server() && (!Units.canInteract(player, tile) || + !netServer.admins.allowAction(player, ActionType.withdrawItem, tile.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(tile, item, unit.maxAccepted(item), unit); + + if(unit == player.unit()){ + Events.fire(new WithdrawEvent(tile, player, item, amount)); + } + }); + } + + @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 || player.dead()) 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."); + } + + //deposit for every controlling unit + player.unit().eachGroup(unit -> { + Item item = unit.item(); + int accepted = tile.acceptStack(item, unit.stack.amount, unit); + + Call.transferItemTo(unit, item, accepted, unit.x, unit.y, tile); + + if(unit == player.unit()){ + Events.fire(new DepositEvent(tile, 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) @@ -113,13 +182,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ 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){ + public static void requestBuildPayload(Player player, Building tile){ if(player == null) return; Unit unit = player.unit(); @@ -127,59 +196,51 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ 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); - } - } - } - } - @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{ + //pick up block's payload Payload current = tile.getPayload(); if(current != null && pay.canPickupPayload(current)){ - Payload taken = tile.takePayload(); - if(taken != null){ - pay.addPayload(taken); + Call.pickedBuildPayload(unit, tile, false); + //pick up whole building directly + }else if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ + Call.pickedBuildPayload(unit, tile, 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 tile, boolean onGround){ + if(tile != null && unit instanceof Payloadc pay){ + 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(); + if(current != null && pay.canPickupPayload(current)){ + Payload taken = tile.takePayload(); + if(taken != null){ + pay.addPayload(taken); + Fx.unitPickup.at(tile); + } } } + + }else if(tile != null && onGround){ + Fx.unitPickup.at(tile); + tile.tile.remove(); } } @@ -193,19 +254,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,12 +280,14 @@ 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){ + public static void rotateBlock(@Nullable Player player, Building tile, boolean direction){ if(tile == null) return; if(net.server() && (!Units.canInteract(player, tile) || @@ -229,42 +295,12 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ throw new ValidateException(player, "Player cannot rotate a block."); } + if(player != null) tile.lastAccessed = player.name; 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), - () -> {} - ); - } - @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; @@ -274,12 +310,26 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Core.app.post(() -> Events.fire(new ConfigEvent(tile, player, value))); } + //only useful for servers or local mods, and is not replicated across clients + //uses unreliable packets due to high frequency + @Remote(targets = Loc.both, called = Loc.both, unreliable = true) + public static void tileTap(@Nullable Player player, Tile tile){ + if(tile == null) return; + + Events.fire(new TapEvent(player, tile)); + } + @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)){ + if(unit instanceof BlockUnitc block && block.tile() instanceof CoreBuild build){ Fx.spawn.at(player); if(net.client()){ control.input.controlledType = null; @@ -287,8 +337,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.clearUnit(); player.deathTimer = 61f; - ((CoreBuild)((BlockUnitc)unit).tile()).requestSpawn(player); - + build.requestSpawn(player); }else 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 @@ -302,6 +351,8 @@ 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) @@ -316,13 +367,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @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() instanceof Commanderc commander)) 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{ + }else if(player.unit().type.commandLimit > 0){ //TODO try out some other formations commander.commandNearby(new CircleFormation()); @@ -333,7 +387,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ 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); }; @@ -351,33 +405,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){ @@ -392,17 +449,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()); if(tile != null && tile.team == unit.team){ - Call.requestBlockPayload(player, tile); + Call.requestBuildPayload(player, tile); } } } @@ -462,7 +518,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.cblock == request.block; } public void drawBreaking(int x, int y){ @@ -490,9 +546,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)); } }); } @@ -525,8 +583,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); }); } @@ -599,7 +657,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; } @@ -624,7 +682,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); @@ -686,7 +744,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); } } } @@ -695,21 +754,21 @@ 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); 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. */ @@ -724,7 +783,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. */ @@ -750,7 +809,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)){ @@ -871,7 +930,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ 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 = player.unit().mineTile == tile ? null : tile; return true; } return false; @@ -879,10 +938,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. */ @@ -891,11 +951,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){ @@ -903,7 +963,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){ @@ -911,7 +971,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(){ @@ -931,7 +991,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); @@ -941,8 +1001,8 @@ 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(); + if(tile instanceof ControlBlock cont && cont.canControl() && tile.team == player.team()){ + return cont.unit(); } return null; @@ -989,8 +1049,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(){ @@ -1001,6 +1061,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return droppingItem; } + public boolean canDropItem(){ + return droppingItem && !canTapPlayer(Core.input.mouseWorldX(), Core.input.mouseWorldY()); + } + public void tryDropItems(@Nullable Building tile, float x, float y){ if(!droppingItem || player.unit().stack.amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){ droppingItem = false; @@ -1018,12 +1082,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - 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); @@ -1035,7 +1093,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)) @@ -1050,18 +1108,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){ @@ -1095,37 +1145,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); @@ -1147,7 +1185,14 @@ 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; + if(next != null){ + line.rotation = Tile.relativeTo(point.x, point.y, next.x, next.y); + }else if(block.conveyorPlacement && i > 0){ + Point2 prev = points.get(i - 1); + line.rotation = Tile.relativeTo(prev.x, prev.y, point.x, point.y); + }else{ + line.rotation = baseRotation; + } }else{ line.rotation = rotation; } diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 03d90e18be..fb9fdbf86b 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.*; @@ -60,10 +62,15 @@ public class MobileInput extends InputHandler implements GestureListener{ public Block lastBlock; /** Last placed request. Used for drawing block overlay. */ public BuildPlan lastPlaced; - /** Down tracking for panning.*/ + /** 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 Teamc target; + /** Payload target being moved to. Can be a position (for dropping), or a unit/block. */ + public Position payloadTarget; //region utility methods @@ -72,16 +79,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 +114,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 +202,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 +219,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 +245,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 +292,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,7 +311,7 @@ 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); } }else if(mode == breaking){ @@ -320,7 +324,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,6 +354,9 @@ 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){ @@ -360,7 +366,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //draw targeting crosshair - if(target != null && !state.isEditor()){ + if(target != null && !state.isEditor() && !manualShooting){ if(target != lastTarget){ crosshairScale = 0f; lastTarget = target; @@ -373,8 +379,8 @@ public class MobileInput extends InputHandler implements GestureListener{ 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); + 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); } Draw.reset(); @@ -388,7 +394,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 +406,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 @@ -474,6 +480,7 @@ public class MobileInput extends InputHandler implements GestureListener{ down = false; } + manualShooting = false; selecting = false; //place down a line if in line mode @@ -517,12 +524,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)){ + 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 @@ -558,6 +584,9 @@ public class MobileInput extends InputHandler implements GestureListener{ //ignore off-screen taps if(cursor == null || Core.scene.hasMouse(x, y)) return false; + + Call.tileTap(player, cursor); + Tile linked = cursor.build == null ? cursor : cursor.build.tile; if(!player.dead()){ @@ -570,6 +599,7 @@ 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)); @@ -578,17 +608,18 @@ public class MobileInput extends InputHandler implements GestureListener{ 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 + Unit on = selectedUnit(); + if(on != null){ + Call.unitControl(player, on); } } } @@ -598,17 +629,26 @@ 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 @@ -705,6 +745,10 @@ public class MobileInput extends InputHandler implements GestureListener{ i--; } } + + if(player.shooting && (player.unit().activelyBuilding() || player.unit().mining())){ + player.shooting = false; + } } protected void autoPan(){ @@ -738,7 +782,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; @@ -749,7 +793,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; @@ -800,12 +845,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); @@ -820,17 +863,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()); @@ -839,19 +873,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 && pay.canPickup(build)){ + //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); @@ -859,7 +903,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; @@ -876,24 +920,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 * Time.delta); + if(!movement.isZero()){ + unit.vel.rotateTo(movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1)); } } - if(flying){ - //hovering effect - unit.x += Mathf.sin(Time.time(), 25f, 0.08f); - unit.y += Mathf.cos(Time.time(), 25f, 0.08f); - } - //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){ @@ -902,11 +943,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); @@ -916,16 +957,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..874269846f 100644 --- a/core/src/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -1,15 +1,18 @@ package mindustry.input; import arc.*; +import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.pooling.*; import mindustry.world.*; +import mindustry.world.blocks.distribution.*; import static mindustry.Vars.*; public class Placement{ + private final static 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(); @@ -23,7 +26,6 @@ public class Placement{ /** 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 +56,56 @@ 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, false)); + 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) result.add(base.peek()); + + points.clear(); + points.addAll(result); + } + private static float tileHeuristic(Tile tile, Tile other){ Block block = control.input.block; @@ -188,7 +240,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 +293,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 e6ea20cf9e..aa395a425b 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -75,7 +75,7 @@ public class JsonIO{ //TODO this is terrible - json.setSerializer(Sector.class, new Serializer(){ + json.setSerializer(Sector.class, new Serializer<>(){ @Override public void write(Json json, Sector object, Class knownType){ json.writeValue(object.planet.name + "-" + object.id); @@ -83,12 +83,13 @@ 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))); } }); - json.setSerializer(SectorPreset.class, new Serializer(){ + json.setSerializer(SectorPreset.class, new Serializer<>(){ @Override public void write(Json json, SectorPreset object, Class knownType){ json.writeValue(object.name); @@ -100,7 +101,7 @@ public class JsonIO{ } }); - json.setSerializer(Liquid.class, new Serializer(){ + json.setSerializer(Liquid.class, new Serializer<>(){ @Override public void write(Json json, Liquid object, Class knownType){ json.writeValue(object.name); @@ -109,12 +110,12 @@ public class JsonIO{ @Override public Liquid read(Json json, JsonValue jsonData, Class type){ if(jsonData.asString() == null) return Liquids.water; - Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString()); + Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString()); return i == null ? Liquids.water : i; } }); - json.setSerializer(Item.class, new Serializer(){ + json.setSerializer(Item.class, new Serializer<>(){ @Override public void write(Json json, Item object, Class knownType){ json.writeValue(object.name); @@ -123,12 +124,12 @@ public class JsonIO{ @Override public Item read(Json json, JsonValue jsonData, Class type){ if(jsonData.asString() == null) return Items.copper; - Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); + Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); return i == null ? Items.copper : i; } }); - json.setSerializer(Team.class, new Serializer(){ + json.setSerializer(Team.class, new Serializer<>(){ @Override public void write(Json json, Team object, Class knownType){ json.writeValue(object.id); @@ -140,7 +141,7 @@ public class JsonIO{ } }); - json.setSerializer(Block.class, new Serializer(){ + json.setSerializer(Block.class, new Serializer<>(){ @Override public void write(Json json, Block object, Class knownType){ json.writeValue(object.name); @@ -153,7 +154,7 @@ public class JsonIO{ } }); - json.setSerializer(Weather.class, new Serializer(){ + json.setSerializer(Weather.class, new Serializer<>(){ @Override public void write(Json json, Weather object, Class knownType){ json.writeValue(object.name); @@ -165,7 +166,19 @@ public class JsonIO{ } }); - json.setSerializer(ItemStack.class, new Serializer(){ + 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){ json.writeObjectStart(); @@ -180,7 +193,7 @@ public class JsonIO{ } }); - json.setSerializer(UnlockableContent.class, new Serializer(){ + json.setSerializer(UnlockableContent.class, new Serializer<>(){ @Override public void write(Json json, UnlockableContent object, Class knownType){ json.writeValue(object.name); diff --git a/core/src/mindustry/io/MapIO.java b/core/src/mindustry/io/MapIO.java index f88ebf9a37..18f6a712bd 100644 --- a/core/src/mindustry/io/MapIO.java +++ b/core/src/mindustry/io/MapIO.java @@ -80,20 +80,13 @@ public class MapIO{ @Override public void setBlock(Block type){ super.setBlock(type); - int c = colorFor(Blocks.air, block(), Blocks.air, team()); + + int c = colorFor(block(), Blocks.air, 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); - } - } }; ver.region("content", stream, counter, ver::readContentHeader); @@ -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.draw(drawx, floors.getHeight() - 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); @@ -119,7 +133,7 @@ public class MapIO{ if(overlayID != 0){ floors.draw(x, floors.getHeight() - 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.draw(x, floors.getHeight() - 1 - y, colorFor(Blocks.air, content.block(floorID), Blocks.air, Team.derelict)); } if(content.block(overlayID) == Blocks.spawn){ map.spawns ++; @@ -141,17 +155,17 @@ public class MapIO{ for(int x = 0; x < pixmap.getWidth(); x++){ for(int y = 0; y < pixmap.getHeight(); y++){ Tile tile = tiles.getn(x, y); - pixmap.draw(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.overlay(), tile.team())); + pixmap.draw(x, pixmap.getHeight() - 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){ diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index c925dc48a4..69e1ea67cc 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", @@ -49,7 +50,9 @@ public abstract class SaveFileReader{ "holostone-wall", "dacite-wall", "rock", "boulder", "snowrock", "snow-boulder", - "cliffs", "stone-wall" + "cliffs", "stone-wall", + + "cryofluidmixer", "cryofluid-mixer" ); protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); @@ -58,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); @@ -68,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){ @@ -151,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/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/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index c3f83b30d8..58d9d77d53 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -40,7 +40,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 +72,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 +89,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 +105,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); @@ -257,7 +250,7 @@ public abstract class SaveVersion extends SaveFileReader{ if(hadEntity){ if(isCenter){ //only read entity for center blocks - if(block.hasEntity()){ + if(block.hasBuilding()){ try{ readChunk(stream, true, in -> { byte revision = in.readByte(); @@ -270,6 +263,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); @@ -291,7 +286,8 @@ public abstract class SaveVersion extends SaveFileReader{ public void writeEntities(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); @@ -318,12 +314,23 @@ public abstract class SaveVersion extends SaveFileReader{ public void readEntities(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)); + } } } diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 733bb27c28..9e8ab187dd 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -3,7 +3,7 @@ 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.*; @@ -37,64 +37,61 @@ 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{ throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } @@ -169,10 +166,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 +188,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 +293,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 +317,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; } } @@ -437,6 +457,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,6 +551,22 @@ 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); 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 cd8302d16d..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 @@ -61,7 +60,7 @@ public abstract class LegacySaveVersion extends SaveVersion{ tile.setBlock(block); } - if(block.hasEntity()){ + if(block.hasBuilding()){ try{ readChunk(stream, true, in -> { byte version = in.readByte(); @@ -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/logic/ConditionOp.java b/core/src/mindustry/logic/ConditionOp.java index 2661509c7e..0954567c06 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -6,7 +6,8 @@ public enum ConditionOp{ lessThan("<", (a, b) -> a < b), lessThanEq("<=", (a, b) -> a <= b), greaterThan(">", (a, b) -> a > b), - greaterThanEq(">=", (a, b) -> a >= b); + greaterThanEq(">=", (a, b) -> a >= b), + 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..eea74416c0 --- /dev/null +++ b/core/src/mindustry/logic/GlobalConstants.java @@ -0,0 +1,78 @@ +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{ + 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); + + //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..0daf9ae83f 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,6 +15,8 @@ public enum LAccess{ powerNetCapacity, powerNetIn, powerNetOut, + ammo, + ammoCapacity, health, maxHealth, heat, @@ -24,20 +27,48 @@ public enum LAccess{ shootX, shootY, shooting, + mineX, + mineY, + mining, team, type, + flag, + controlled, + commanded, + name, + config, + 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"), + configure(true, 30, "to"); - public final String[] parameters; + public final String[] params; + public final boolean isObj; + /** Tick cooldown between invocations. */ + public float cooldown = -1; - 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; + } + + LAccess(boolean obj, float cooldown, String... params){ + this.params = params; + this.cooldown = cooldown; + isObj = obj; } } diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index 7ca74ca83c..8282e66ca6 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -2,54 +2,32 @@ 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 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); } public static LAssembler assemble(String data, int maxInstructions){ @@ -80,16 +58,20 @@ public class LAssembler{ if(data == null || data.isEmpty()) return new Seq<>(); Seq statements = new Seq<>(); - String[] lines = data.split("[;\n]+"); + String[] lines = data.split("\n"); int index = 0; for(String line : lines){ //comments - if(line.startsWith("#")) continue; + int commentIdx = line.indexOf('#'); + if(commentIdx != -1) line = line.substring(0, commentIdx).trim(); + if(line.isEmpty()) continue; + //remove trailing semicolons in case someone adds them in for no reason + if(line.endsWith(";")) line = line.substring(0, line.length() - 1); if(index++ > max) break; line = line.replace("\t", "").trim(); - + try{ String[] arr; @@ -104,7 +86,7 @@ public class LAssembler{ if(c == '"'){ inString = !inString; }else if(c == ' ' && !inString){ - tokens.add(line.substring(lastIdx, i)); + tokens.add(line.substring(lastIdx, Math.min(i, lastIdx + maxTokenLength))); lastIdx = i + 1; } } @@ -166,6 +148,12 @@ public class LAssembler{ /** @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 @@ -173,16 +161,28 @@ public class LAssembler{ return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1).replace("\\n", "\n")).id; } + //remove spaces for non-strings + symbol = symbol.replace(' ', '_'); + try{ - double value = Double.parseDouble(symbol); + double value = parseDouble(symbol); + if(Double.isNaN(value) || Double.isInfinite(value)) value = 0; + //this creates a hidden const variable with the specified value - String key = "___" + value; - return putConst(key, value).id; + return putConst("___" + value, value).id; }catch(NumberFormatException e){ return putVar(symbol).id; } } + double parseDouble(String symbol) throws NumberFormatException{ + //parse hex/binary syntax + if(symbol.startsWith("0b")) return Long.parseLong(symbol.substring(2), 2); + if(symbol.startsWith("0x")) return Long.parseLong(symbol.substring(2), 16); + + return Double.parseDouble(symbol); + } + /** Adds a constant value by name. */ public BVar putConst(String name, Object value){ BVar var = putVar(name); @@ -202,7 +202,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 d626f95388..92c8f61d53 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -13,20 +13,22 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; 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; public LCanvas(){ canvas = this; @@ -70,18 +72,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 +106,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 +261,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,7 +283,7 @@ public class LCanvas extends Table{ t.add().growX(); t.button(Icon.copy, Styles.logici, () -> { - }).padRight(6).get().tapped(() -> copy()); + }).padRight(6).get().tapped(this::copy); t.button(Icon.cancel, Styles.logici, () -> { remove(); @@ -306,7 +327,7 @@ public class LCanvas extends Table{ statements.finishLayout(); } }); - }).growX(); + }).growX().height(38); row(); @@ -320,7 +341,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); @@ -348,15 +369,14 @@ public class LCanvas extends Table{ public static class JumpButton extends ImageButton{ Color hoverColor = Pal.place; Color defaultColor = Color.white; - @NonNull Prov to; + Prov to; boolean selecting; float mx, my; ClickListener listener; - StatementElem hovered; - JumpCurve curve; + public JumpCurve curve; - public JumpButton(@NonNull Prov getter, Cons setter){ + public JumpButton(Prov getter, Cons setter){ super(Tex.logicNode, Styles.colori); to = getter; @@ -381,7 +401,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 +424,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 +434,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 +454,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 +492,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 b532151f1c..29811c8205 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1,17 +1,26 @@ package mindustry.logic; +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 +32,25 @@ public class LExecutor{ //special variables public static final int - varCounter = 0, - varTime = 1; + varCounter = 0, + varTime = 1, + varUnit = 2, + varThis = 3; 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; @@ -48,8 +62,9 @@ public class LExecutor{ vars[varTime].numval = Time.millis(); //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); @@ -71,9 +86,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 +98,68 @@ public class LExecutor{ //region utility + 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 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : v.numval; + } + + public float numf(int index){ + Var v = var(index); + return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(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.numval = Double.isNaN(value) || Double.isInfinite(value) ? 0 : 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,11 +179,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)){ + unit.controller(new LogicAI()); + ((LogicAI)unit.controller()).controller = exec.building(varThis); + + //clear old state + unit.mineTile = null; + unit.clearBuilding(); + + return (LogicAI)unit.controller(); + } + return (LogicAI)unit.controller(); + } + 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(unit.canBuild() && exec.obj(p3) instanceof Block block){ + int x = World.toTile(x1), y = World.toTile(y1); + 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; + } + + ai.plan.set(x, y, rot, block); + ai.plan.config = exec.obj(p5) instanceof Content c ? c : null; + + unit.clearBuilding(); + + if(ai.plan.tile() != null){ + 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.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.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; public LAccess type = LAccess.enabled; public int p1, p2, p3, p4; + public Interval timer = new Interval(1); public ControlI(LAccess type, int target, int p1, int p2, int p3, int p4){ this.type = type; @@ -163,9 +523,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) && (type.cooldown <= 0 || timer.get(type.cooldown))){ + if(type.isObj){ + 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 +569,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){ exec.setnum(output, address < 0 || address >= mem.memory.length ? 0 : mem.memory[address]); } @@ -231,8 +593,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){ if(address >= 0 && address < mem.memory.length){ mem.memory[address] = exec.num(value); @@ -259,8 +620,8 @@ public class LExecutor{ Object target = exec.obj(from); Object sense = exec.obj(type); - if(target instanceof Senseable){ - Senseable se = (Senseable)target; + //TODO should remote enemy buildings be senseable? + if(target instanceof Senseable se){ if(sense instanceof Content){ exec.setnum(to, se.sense(((Content)sense))); }else if(sense instanceof LAccess){ @@ -308,16 +669,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 +690,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 +711,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 +743,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 +752,7 @@ public class LExecutor{ v.objval = f.objval; v.isobj = true; }else{ - v.numval = f.numval; + v.numval = Double.isNaN(f.numval) || Double.isInfinite(f.numval) ? 0 : f.numval; v.isobj = false; } } @@ -409,10 +777,10 @@ public class LExecutor{ 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)){ + if(op.objFunction2 != null && va.isobj && vb.isobj){ //use object function if provided, and one of the variables is an object exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b))); }else{ @@ -428,7 +796,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,9 +829,15 @@ 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, exec.numi(x), exec.numi(y), num1, exec.numi(p2), exec.numi(p3), exec.numi(p4))); } } } @@ -484,8 +858,7 @@ public class LExecutor{ if(Vars.headless) return; Building build = exec.building(target); - if(build instanceof LogicDisplayBuild){ - LogicDisplayBuild d = (LogicDisplayBuild)build; + if(build instanceof LogicDisplayBuild d){ 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 +884,15 @@ 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 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); @@ -547,8 +921,7 @@ public class LExecutor{ public void run(LExecutor exec){ Building build = exec.building(target); - if(build instanceof MessageBuild){ - MessageBuild d = (MessageBuild)build; + if(build instanceof MessageBuild d){ d.message.setLength(0); d.message.append(exec.textBuffer, 0, Math.min(exec.textBuffer.length(), maxTextBuffer)); @@ -575,9 +948,9 @@ public class LExecutor{ @Override public void run(LExecutor exec){ if(address != -1){ - Var va = exec.vars[value]; - Var vb = exec.vars[compare]; - boolean cmp = false; + 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 @@ -587,7 +960,7 @@ public class LExecutor{ } if(cmp){ - exec.vars[varCounter].numval = address; + exec.var(varCounter).numval = address; } } } 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/LStatement.java b/core/src/mindustry/logic/LStatement.java index cbe5029d94..ea54bd833b 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,7 +10,6 @@ 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.*; @@ -22,7 +22,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 +32,20 @@ public abstract class LStatement{ return read.size == 0 ? null : read.first(); } + public boolean hidden(){ + return false; + } + //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(); + .size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength).addInputDialog(); } - protected void fields(Table table, String desc, String value, Cons setter){ + protected Cell fields(Table table, String desc, String value, Cons setter){ table.add(desc).padLeft(10).left(); - field(table, value, setter).width(85f).padRight(10).left(); + return field(table, value, setter).width(85f).padRight(10).left(); } protected void fields(Table table, String value, Cons setter){ @@ -88,8 +92,8 @@ public abstract class LStatement{ hitter.fillParent = true; hitter.tapped(hide); - Core.scene.add(hitter); + Core.scene.add(hitter); Core.scene.add(t); t.update(() -> { @@ -103,11 +107,14 @@ public abstract class LStatement{ b.localToStageCoordinates(Tmp.v1.set(b.getWidth()/2f, b.getHeight()/2f)); t.setPosition(Tmp.v1.x, Tmp.v1.y, Align.center); + if(t.getWidth() > Core.scene.getWidth()) t.setWidth(Core.graphics.getWidth()); + if(t.getHeight() > Core.scene.getHeight()) t.setHeight(Core.graphics.getHeight()); t.keepInStage(); }); t.actions(Actions.alpha(0), Actions.fadeIn(0.3f, Interp.fade)); t.top().pane(inner -> { + inner.marginRight(24f); inner.top(); hideCons.get(inner, hide); }).top(); diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 1a8abf221b..d20c4477f4 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1,16 +1,19 @@ package mindustry.logic; import arc.func.*; +import arc.graphics.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.logic.LCanvas.*; import mindustry.logic.LExecutor.*; import mindustry.type.*; import mindustry.ui.*; +import mindustry.world.meta.*; import static mindustry.world.blocks.logic.LogicDisplay.*; @@ -27,8 +30,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.control; + public Color color(){ + return Pal.logicControl; } @Override @@ -45,8 +48,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.operations; + public Color color(){ + return Pal.logicOperations; } @Override @@ -77,8 +80,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.io; + public Color color(){ + return Pal.logicIo; } @Override @@ -109,8 +112,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.io; + public Color color(){ + return Pal.logicIo; } @Override @@ -141,6 +144,12 @@ public class LStatements{ if(type == GraphicsType.color){ p2 = "255"; } + + if(type == GraphicsType.image){ + p1 = "@copper"; + p2 = "32"; + p3 = "0"; + } rebuild(table); }, 2, cell -> cell.size(100, 50))); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); @@ -154,39 +163,37 @@ public class LStatements{ s.setColor(table.color); switch(type){ - case clear: + case clear -> { fields(s, "r", x, v -> x = v); fields(s, "g", y, v -> y = v); fields(s, "b", p1, v -> p1 = v); - break; - case color: + } + case color -> { fields(s, "r", x, v -> x = v); fields(s, "g", y, v -> y = v); fields(s, "b", p1, v -> p1 = v); row(s); fields(s, "a", p2, v -> p2 = v); - break; - case stroke: + } + case stroke -> { s.add().width(4); fields(s, x, v -> x = v); - break; - case line: + } + case line -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "x2", p1, v -> p1 = v); fields(s, "y2", p2, v -> p2 = v); - break; - case rect: - case lineRect: + } + case rect, lineRect -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "width", p1, v -> p1 = v); fields(s, "height", p2, v -> p2 = v); - break; - case poly: - case linePoly: + } + case poly, linePoly -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); @@ -194,8 +201,8 @@ public class LStatements{ fields(s, "radius", p2, v -> p2 = v); row(s); fields(s, "rotation", p3, v -> p3 = v); - break; - case triangle: + } + case triangle -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); @@ -204,7 +211,16 @@ public class LStatements{ row(s); fields(s, "x3", p3, v -> p3 = v); fields(s, "y3", p4, v -> p4 = v); - break; + } + case image -> { + fields(s, "x", x, v -> x = v); + fields(s, "y", y, v -> y = v); + row(s); + fields(s, "image", p1, v -> p1 = v); + fields(s, "size", p2, v -> p2 = v); + row(s); + fields(s, "rotation", p3, v -> p3 = v); + } } }).expand().left(); } @@ -218,8 +234,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.io; + public Color color(){ + return Pal.logicIo; } @Override @@ -243,8 +259,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.io; + public Color color(){ + return Pal.logicIo; } } @@ -259,8 +275,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.blocks; + public Color color(){ + return Pal.logicBlocks; } @Override @@ -280,8 +296,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.blocks; + public Color color(){ + return Pal.logicBlocks; } @Override @@ -304,8 +320,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.blocks; + public Color color(){ + return Pal.logicBlocks; } @Override @@ -348,17 +364,17 @@ public class LStatements{ //Q: why don't you just use arrays for this? //A: arrays aren't as easy to serialize so the code generator doesn't handle them int c = 0; - for(int i = 0; i < type.parameters.length; i++){ + for(int i = 0; i < type.params.length; i++){ - fields(table, type.parameters[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); + fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); if(++c % 2 == 0) row(table); } } @Override - public LCategory category(){ - return LCategory.blocks; + public Color color(){ + return Pal.logicBlocks; } @Override @@ -371,17 +387,21 @@ public class LStatements{ public static class RadarStatement extends LStatement{ public RadarTarget target1 = RadarTarget.enemy, target2 = RadarTarget.any, target3 = RadarTarget.any; public RadarSort sort = RadarSort.distance; - public String radar = "turret1", sortOrder = "1", output = "result"; + public String radar = "0", sortOrder = "1", output = "result"; @Override public void build(Table table){ table.defaults().left(); - table.add(" from "); + if(buildFrom()){ + radar = "turret1"; - fields(table, radar, v -> radar = v); + table.add(" from "); - row(table); + fields(table, radar, v -> radar = v); + + row(table); + } for(int i = 0; i < 3; i++){ int fi = i; @@ -421,9 +441,13 @@ public class LStatements{ fields(table, output, v -> output = v); } + public boolean buildFrom(){ + return true; + } + @Override - public LCategory category(){ - return LCategory.blocks; + public Color color(){ + return Pal.logicBlocks; } @Override @@ -506,7 +530,9 @@ public class LStatements{ stack.clearChildren(); stack.addChild(tables[selected]); - t.pack(); + + t.parent.parent.pack(); + t.parent.parent.invalidateHierarchy(); }).size(80f, 50f).growX().checked(selected == fi).group(group); } t.row(); @@ -525,8 +551,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.blocks; + public Color color(){ + return Pal.logicBlocks; } @Override @@ -550,8 +576,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.operations; + public Color color(){ + return Pal.logicOperations; } @Override @@ -608,8 +634,8 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.operations; + public Color color(){ + return Pal.logicOperations; } } @@ -626,13 +652,15 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.control; + public Color color(){ + return Pal.logicControl; } } @RegisterStatement("jump") public static class JumpStatement extends LStatement{ + private static Color last = new Color(); + public transient StatementElem dest; public int destIndex; @@ -644,19 +672,30 @@ public class LStatements{ public void build(Table table){ table.add("if ").padLeft(4); - field(table, value, str -> value = str); - - table.button(b -> { - b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> op = o)); - }, Styles.logict, () -> {}).size(48f, 40f).pad(4f).color(table.color); - - field(table, compare, str -> compare = str); + last = table.color; + table.table(this::rebuild); table.add().growX(); table.add(new JumpButton(() -> dest, s -> dest = s)).size(30).right().padLeft(-8); } + void rebuild(Table table){ + table.clearChildren(); + table.setColor(last); + + if(op != ConditionOp.always) field(table, value, str -> value = str); + + table.button(b -> { + b.label(() -> op.symbol); + b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> { + op = o; + rebuild(table); + })); + }, Styles.logict, () -> {}).size(op == ConditionOp.always ? 80f : 48f, 40f).pad(4f).color(table.color); + + if(op != ConditionOp.always) field(table, compare, str -> compare = str); + } + //elements need separate conversion logic @Override public void setupUI(){ @@ -678,8 +717,233 @@ public class LStatements{ } @Override - public LCategory category(){ - return LCategory.control; + public Color color(){ + return Pal.logicControl; + } + } + + @RegisterStatement("ubind") + public static class UnitBindStatement extends LStatement{ + public String type = "@poly"; + + @Override + public void build(Table table){ + table.add(" type "); + + TextField field = field(table, type, str -> type = str).get(); + + table.button(b -> { + b.image(Icon.pencilSmall); + b.clicked(() -> showSelectTable(b, (t, hide) -> { + t.row(); + t.table(i -> { + i.left(); + int c = 0; + for(UnitType item : Vars.content.units()){ + if(!item.unlockedNow() || item.isHidden()) continue; + i.button(new TextureRegionDrawable(item.icon(Cicon.small)), Styles.cleari, () -> { + type = "@" + item.name; + field.setText(type); + hide.run(); + }).size(40f).get().resizeImage(Cicon.small.size); + + if(++c % 6 == 0) i.row(); + } + }).colspan(3).width(240f).left(); + })); + }, Styles.logict, () -> {}).size(40f).padLeft(-2).color(table.color); + } + + @Override + public Color color(){ + return Pal.logicUnits; + } + + @Override + public LInstruction build(LAssembler builder){ + return new UnitBindI(builder.var(type)); + } + } + + @RegisterStatement("ucontrol") + public static class UnitControlStatement extends LStatement{ + public LUnitControl type = LUnitControl.move; + public String p1 = "0", p2 = "0", p3 = "0", p4 = "0", p5 = "0"; + + @Override + public void build(Table table){ + rebuild(table); + } + + void rebuild(Table table){ + table.clearChildren(); + + table.left(); + + table.add(" "); + + table.button(b -> { + b.label(() -> type.name()); + b.clicked(() -> showSelect(b, LUnitControl.all, type, t -> { + type = t; + rebuild(table); + }, 2, cell -> cell.size(120, 50))); + }, Styles.logict, () -> {}).size(120, 40).color(table.color).left().padLeft(2); + + row(table); + + //Q: why don't you just use arrays for this? + //A: arrays aren't as easy to serialize so the code generator doesn't handle them + int c = 0; + for(int i = 0; i < type.params.length; i++){ + + fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : i == 3 ? p4 : p5, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : i == 3 ? v -> p4 = v : v -> p5 = v).width(100f); + + if(++c % 2 == 0) row(table); + + if(i == 3){ + table.row(); + } + } + } + + @Override + public Color color(){ + return Pal.logicUnits; + } + + @Override + public LInstruction build(LAssembler builder){ + return new UnitControlI(type, builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4), builder.var(p5)); + } + } + + @RegisterStatement("uradar") + public static class UnitRadarStatement extends RadarStatement{ + + @Override + public boolean buildFrom(){ + //do not build the "from" section + return false; + } + + @Override + public Color color(){ + return Pal.logicUnits; + } + + @Override + public LInstruction build(LAssembler builder){ + return new RadarI(target1, target2, target3, sort, LExecutor.varUnit, builder.var(sortOrder), builder.var(output)); + } + } + + @RegisterStatement("ulocate") + public static class UnitLocateStatement extends LStatement{ + public LLocate locate = LLocate.building; + public BlockFlag flag = BlockFlag.core; + public String enemy = "true", ore = "@copper"; + public String outX = "outx", outY = "outy", outFound = "found", outBuild = "building"; + + @Override + public void build(Table table){ + rebuild(table); + } + + void rebuild(Table table){ + table.clearChildren(); + + table.add(" find ").left(); + + table.button(b -> { + b.label(() -> locate.name()); + b.clicked(() -> showSelect(b, LLocate.all, locate, t -> { + locate = t; + rebuild(table); + }, 2, cell -> cell.size(110, 50))); + }, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2); + + switch(locate){ + case building -> { + row(table); + table.add(" type ").left(); + table.button(b -> { + b.label(() -> flag.name()); + b.clicked(() -> showSelect(b, BlockFlag.all, flag, t -> flag = t, 2, cell -> cell.size(110, 50))); + }, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2); + row(table); + + table.add(" enemy ").left(); + + fields(table, enemy, str -> enemy = str); + + table.row(); + } + + case ore -> { + table.add(" ore ").left(); + table.table(ts -> { + ts.color.set(table.color); + + fields(ts, ore, str -> ore = str); + + ts.button(b -> { + b.image(Icon.pencilSmall); + b.clicked(() -> showSelectTable(b, (t, hide) -> { + t.row(); + t.table(i -> { + i.left(); + int c = 0; + for(Item item : Vars.content.items()){ + if(!item.unlockedNow()) continue; + i.button(new TextureRegionDrawable(item.icon(Cicon.small)), Styles.cleari, () -> { + ore = "@" + item.name; + rebuild(table); + hide.run(); + }).size(40f).get().resizeImage(Cicon.small.size); + + if(++c % 6 == 0) i.row(); + } + }).colspan(3).width(240f).left(); + })); + }, Styles.logict, () -> {}).size(40f).padLeft(-2).color(table.color); + }); + + + table.row(); + } + + case spawn, damaged -> { + table.row(); + } + } + + table.add(" outX ").left(); + fields(table, outX, str -> outX = str); + + table.add(" outY ").left(); + fields(table, outY, str -> outY = str); + + row(table); + + table.add(" found ").left(); + fields(table, outFound, str -> outFound = str); + + if(locate != LLocate.ore){ + table.add(" building ").left(); + fields(table, outBuild, str -> outBuild = str); + } + + } + + @Override + public Color color(){ + return Pal.logicUnits; + } + + @Override + public LInstruction build(LAssembler builder){ + return new UnitLocateI(locate, flag, builder.var(enemy), builder.var(ore), builder.var(outX), builder.var(outY), builder.var(outFound), builder.var(outBuild)); } } } diff --git a/core/src/mindustry/logic/LUnitControl.java b/core/src/mindustry/logic/LUnitControl.java new file mode 100644 index 0000000000..41f00da025 --- /dev/null +++ b/core/src/mindustry/logic/LUnitControl.java @@ -0,0 +1,27 @@ +package mindustry.logic; + +public enum LUnitControl{ + stop, + move("x", "y"), + approach("x", "y", "radius"), + boost("enable"), + pathfind(), + target("x", "y", "shoot"), + targetp("unit", "shoot"), + itemDrop("to", "amount"), + itemTake("from", "item", "amount"), + payDrop, + payTake("takeUnits"), + mine("x", "y"), + flag("value"), + build("x", "y", "block", "rotation", "config"), + getBlock("x", "y", "type", "building"), + within("x", "y", "radius", "result"); + + public final String[] params; + public static final LUnitControl[] all = values(); + + LUnitControl(String... params){ + this.params = params; + } +} diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index fb97e5c4bc..51b6468c77 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -11,7 +11,7 @@ import mindustry.ui.dialogs.*; import static mindustry.Vars.*; public class LogicDialog extends BaseDialog{ - LCanvas canvas; + public LCanvas canvas; Cons consumer = s -> {}; public LogicDialog(){ @@ -21,9 +21,11 @@ public class LogicDialog extends BaseDialog{ canvas = new LCanvas(); shouldPause = true; - addCloseButton(); - buttons.getCells().first().width(170f); + addCloseListener(); + + buttons.defaults().size(160f, 64f); + buttons.button("@back", Icon.left, this::hide).name("back"); buttons.button("@edit", Icon.edit, () -> { BaseDialog dialog = new BaseDialog("@editor.export"); @@ -51,7 +53,7 @@ public class LogicDialog extends BaseDialog{ dialog.addCloseButton(); dialog.show(); - }).width(170f); + }).name("edit"); buttons.button("@add", Icon.add, () -> { BaseDialog dialog = new BaseDialog("@add"); @@ -60,10 +62,10 @@ public class LogicDialog extends BaseDialog{ int i = 0; for(Prov prov : LogicIO.allStatements){ LStatement example = prov.get(); - if(example instanceof InvalidStatement) continue; + if(example instanceof InvalidStatement || example.hidden()) continue; TextButtonStyle style = new TextButtonStyle(Styles.cleart); - style.fontColor = example.category().color; + style.fontColor = example.color(); style.font = Fonts.outline; t.button(example.name(), style, () -> { @@ -75,13 +77,13 @@ public class LogicDialog extends BaseDialog{ }); dialog.addCloseButton(); dialog.show(); - }).width(170f).disabled(t -> canvas.statements.getChildren().size >= LExecutor.maxInstructions); + }).disabled(t -> canvas.statements.getChildren().size >= LExecutor.maxInstructions); - add(canvas).grow(); + add(canvas).grow().name("canvas"); row(); - add(buttons).growX(); + add(buttons).growX().name("canvas"); hidden(() -> consumer.get(canvas.save())); diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java index b289efc1f2..658a7cdeb8 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -1,6 +1,7 @@ package mindustry.logic; import arc.math.*; +import arc.util.*; public enum LogicOp{ add("+", (a, b) -> a + b), @@ -9,25 +10,28 @@ public enum LogicOp{ div("/", (a, b) -> a / b), idiv("//", (a, b) -> Math.floor(a / b)), mod("%", (a, b) -> a % b), - equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0, (a, b) -> a == b ? 1 : 0), - notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1, (a, b) -> a != b ? 1 : 0), + pow("^", Math::pow), + + equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0, (a, b) -> Structs.eq(a, b) ? 1 : 0), + notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1, (a, b) -> !Structs.eq(a, b) ? 1 : 0), + land("and", (a, b) -> a != 0 && b != 0 ? 1 : 0), lessThan("<", (a, b) -> a < b ? 1 : 0), lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), greaterThan(">", (a, b) -> a > b ? 1 : 0), greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), - pow("^", Math::pow), + shl("<<", (a, b) -> (long)a << (long)b), shr(">>", (a, b) -> (long)a >> (long)b), or("or", (a, b) -> (long)a | (long)b), - and("and", (a, b) -> (long)a & (long)b), + and("b-and", (a, b) -> (long)a & (long)b), xor("xor", (a, b) -> (long)a ^ (long)b), + not("flip", a -> ~(long)(a)), + max("max", Math::max), min("min", Math::min), atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)), noise("noise", LExecutor.noise::rawNoise2D), - - not("not", a -> ~(long)(a)), abs("abs", a -> Math.abs(a)), log("log", Math::log), log10("log10", Math::log10), @@ -37,9 +41,7 @@ public enum LogicOp{ floor("floor", Math::floor), ceil("ceil", Math::ceil), sqrt("sqrt", Math::sqrt), - rand("rand", d -> Mathf.rand.nextDouble() * d), - - ; + rand("rand", d -> Mathf.rand.nextDouble() * d); public static final LogicOp[] all = values(); diff --git a/core/src/mindustry/logic/RadarSort.java b/core/src/mindustry/logic/RadarSort.java index 4164563f6d..50e553b70f 100644 --- a/core/src/mindustry/logic/RadarSort.java +++ b/core/src/mindustry/logic/RadarSort.java @@ -6,6 +6,8 @@ import mindustry.gen.*; public enum RadarSort{ distance((pos, other) -> -pos.dst2(other)), health((pos, other) -> other.health()), + shield((pos, other) -> other.shield()), + armor((pos, other) -> other.armor()), maxHealth((pos, other) -> other.maxHealth()); public final RadarSortFunc func; @@ -17,6 +19,6 @@ public enum RadarSort{ } public interface RadarSortFunc{ - float get(Position pos, Healthc other); + float get(Position pos, Unit other); } } diff --git a/core/src/mindustry/logic/RadarTarget.java b/core/src/mindustry/logic/RadarTarget.java index f6499db8c8..ddd7a1f368 100644 --- a/core/src/mindustry/logic/RadarTarget.java +++ b/core/src/mindustry/logic/RadarTarget.java @@ -8,6 +8,7 @@ public enum RadarTarget{ enemy((team, other) -> team != other.team), ally((team, other) -> team == other.team), player((team, other) -> other.isPlayer()), + attacker((pos, other) -> other.canShoot()), flying((team, other) -> other.isFlying()), boss((team, other) -> other.isBoss()), ground((team, other) -> other.isGrounded()); diff --git a/core/src/mindustry/maps/Map.java b/core/src/mindustry/maps/Map.java index ebf2896e0e..1f9ab65cdd 100644 --- a/core/src/mindustry/maps/Map.java +++ b/core/src/mindustry/maps/Map.java @@ -1,11 +1,10 @@ package mindustry.maps; import arc.*; -import arc.struct.*; import arc.files.*; import arc.graphics.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -71,11 +70,11 @@ public class Map implements Comparable, Publishable{ } public Fi previewFile(){ - return Vars.mapPreviewDirectory.child((workshop ? file.parent().name() : file.nameWithoutExtension()) + ".png"); + return Vars.mapPreviewDirectory.child((workshop ? file.parent().name() : file.nameWithoutExtension()) + "_v2.png"); } public Fi cacheFile(){ - return Vars.mapPreviewDirectory.child(workshop ? file.parent().name() + "-workshop-cache.dat" : file.nameWithoutExtension() + "-cache.dat"); + return Vars.mapPreviewDirectory.child(workshop ? file.parent().name() + "-workshop-cache.dat" : file.nameWithoutExtension() + "-cache_v2.dat"); } public void setHighScore(int score){ @@ -99,8 +98,10 @@ public class Map implements Comparable, Publishable{ public Rules rules(Rules base){ try{ - Rules result = JsonIO.read(Rules.class, base, tags.get("rules", "{}")); - if(result.spawns.isEmpty()) result.spawns = Vars.defaultWaves.get(); + //this replacement is a MASSIVE hack but it fixes some incorrect overwriting of team-specific rules. + //may need to be tweaked later + Rules result = JsonIO.read(Rules.class, base, tags.get("rules", "{}").replace("teams:{2:{infiniteAmmo:true}},", "")); + if(result.spawns.isEmpty()) result.spawns = Vars.waves.get(); return result; }catch(Exception e){ //error reading rules. ignore? diff --git a/core/src/mindustry/maps/MapPreviewLoader.java b/core/src/mindustry/maps/MapPreviewLoader.java index ebc69eeae4..6453c6f0b1 100644 --- a/core/src/mindustry/maps/MapPreviewLoader.java +++ b/core/src/mindustry/maps/MapPreviewLoader.java @@ -3,12 +3,12 @@ package mindustry.maps; import arc.assets.*; import arc.assets.loaders.*; import arc.assets.loaders.resolvers.*; -import arc.struct.*; import arc.files.*; import arc.graphics.*; +import arc.struct.*; import arc.util.*; import mindustry.*; -import mindustry.ctype.Content; +import mindustry.ctype.*; public class MapPreviewLoader extends TextureLoader{ diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 54c3856d7d..cd4020a07a 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -8,7 +8,6 @@ import arc.func.*; import arc.graphics.*; import arc.struct.IntSet.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.async.*; import arc.util.io.*; @@ -30,7 +29,7 @@ import static mindustry.Vars.*; public class Maps{ /** List of all built-in maps. Filenames only. */ - private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "veins", "glacier"}; + private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "mudFlats", "moltenLake", "archipelago", "debrisField", "veins", "glacier"}; /** Maps tagged as PvP */ static final String[] pvpMaps = {"veins", "glacier"}; /** All maps stored in an ordered array. */ @@ -83,9 +82,7 @@ public class Maps{ } public Maps(){ - Events.on(ClientLoadEvent.class, event -> { - maps.sort(); - }); + Events.on(ClientLoadEvent.class, event -> maps.sort()); if(Core.assets != null){ ((CustomLoader)Core.assets.getLoader(ContentLoader.class)).loaded = this::createAllPreviews; @@ -305,6 +302,14 @@ public class Maps{ flooronto = Blocks.sand; block = Blocks.sandBoulder; }}, + new ScatterFilter(){{ + flooronto = Blocks.darksand; + block = Blocks.basaltBoulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.basalt; + block = Blocks.basaltBoulder; + }}, new ScatterFilter(){{ flooronto = Blocks.dacite; block = Blocks.daciteBoulder; diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index 5f4e267d74..28d9846d1d 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -3,31 +3,391 @@ package mindustry.maps; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.util.*; import mindustry.ai.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.abilities.*; +import mindustry.game.*; import mindustry.gen.*; +import mindustry.logic.*; +import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.defense.*; +import mindustry.world.blocks.defense.turrets.*; +import mindustry.world.blocks.defense.turrets.Turret.*; import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; public class SectorDamage{ + public static final int maxRetWave = 40, maxWavesSimulated = 50; + //direct damage is for testing only private static final boolean direct = false, rubble = true; + /** @return calculated capture progress of the enemy */ + public static float getDamage(SectorInfo info){ + return getDamage(info, info.wavesPassed); + } + + /** @return calculated capture progress of the enemy */ + public static float getDamage(SectorInfo info, int wavesPassed){ + return getDamage(info, wavesPassed, false); + } + + /** @return maximum waves survived, up to maxRetWave. */ + public static int getWavesSurvived(SectorInfo info){ + return (int)getDamage(info, maxRetWave, true); + } + + /** @return calculated capture progress of the enemy if retWave if false, otherwise return the maximum waves survived as int. + * if it survives all the waves, returns maxRetWave. */ + public static float getDamage(SectorInfo info, int wavesPassed, boolean retWave){ + float health = info.sumHealth; + int wave = info.wave; + float waveSpace = info.waveSpacing; + + //this approach is O(n), it simulates every wave passing. + //other approaches can assume all the waves come as one, but that's not as fair. + if(wavesPassed > 0){ + int waveBegin = wave; + int waveEnd = wave + wavesPassed; + + //do not simulate every single wave if there's too many + if(wavesPassed > maxWavesSimulated && !retWave){ + waveBegin = waveEnd - maxWavesSimulated; + } + + for(int i = waveBegin; i <= waveEnd; i++){ + + float efficiency = health / info.sumHealth; + float dps = info.sumDps * efficiency; + float rps = info.sumRps * efficiency; + + float enemyDps = info.waveDpsBase + info.waveDpsSlope * (i); + float enemyHealth = info.waveHealthBase + info.waveHealthSlope * (i); + + if(info.bossWave == i){ + enemyDps += info.bossDps; + enemyHealth += info.bossHealth; + } + + if(i == waveBegin){ + enemyDps += info.curEnemyDps; + enemyHealth += info.curEnemyHealth; + } + + //happens due to certain regressions + if(enemyHealth < 0 || enemyDps < 0) continue; + + //calculate time to destroy both sides + float timeDestroyEnemy = dps <= 0.0001f ? Float.POSITIVE_INFINITY : enemyHealth / dps; //if dps == 0, this is infinity + float timeDestroyBase = health / (enemyDps - rps); //if regen > enemyDps this is negative + + //regenerating faster than the base can be damaged + if(timeDestroyBase < 0) continue; + + //sector is lost, enemy took too long. + if(timeDestroyEnemy > timeDestroyBase){ + health = 0f; + //return current wave if simulating + if(retWave) return i - waveBegin; + break; + } + + //otherwise, the enemy shoots for timeDestroyEnemy seconds, so calculate damage taken + float damageTaken = timeDestroyEnemy * (enemyDps - rps); + + //damage the base. + health -= damageTaken; + + //regen health after wave. + health = Math.min(health + rps / 60f * waveSpace, info.sumHealth); + } + } + + //survived everything + if(retWave){ + return maxRetWave; + } + + return 1f - Mathf.clamp(health / info.sumHealth); + } + + /** Applies wave damage based on sector parameters. */ + public static void applyCalculatedDamage(){ + //calculate base damage fraction + float damage = getDamage(state.rules.sector.info); + + //scaled damage has a power component to make it seem a little more realistic (as systems fail, enemy capturing gets easier and easier) + float scaled = Mathf.pow(damage, 1.2f); + + Tile spawn = spawner.getFirstSpawn(); + + //damage only units near the spawn point + if(spawn != null){ + Seq allies = new Seq<>(); + float sumUnitHealth = 0f; + for(Unit ally : Groups.unit){ + if(ally.team == state.rules.defaultTeam && ally.within(spawn, state.rules.dropZoneRadius * 2.5f)){ + allies.add(ally); + sumUnitHealth += ally.health; + } + } + + allies.sort(u -> u.dst2(spawn)); + + //apply damage to units + float unitDamage = damage * sumUnitHealth; + + //damage units one by one, not uniformly + for(var u : allies){ + if(u.health < unitDamage){ + u.remove(); + unitDamage -= u.health; + }else{ + u.health -= unitDamage; + break; + } + } + } + + if(state.rules.sector.info.wavesPassed > 0){ + //simply remove each block in the spawner range if a wave passed + for(Tile spawner : spawner.getSpawns()){ + spawner.circle((int)(state.rules.dropZoneRadius / tilesize), tile -> { + if(tile.team() == state.rules.defaultTeam){ + if(rubble && tile.floor().hasSurface() && Mathf.chance(0.4)){ + Effect.rubble(tile.build.x, tile.build.y, tile.block().size); + } + + tile.remove(); + } + }); + } + } + + //finally apply scaled damage + apply(scaled); + } + + /** Calculates damage simulation parameters before a game is saved. */ + public static void writeParameters(SectorInfo info){ + Building core = state.rules.defaultTeam.core(); + Seq spawns = new Seq<>(); + spawner.eachGroundSpawn((x, y) -> spawns.add(world.tile(x, y))); + + if(spawns.isEmpty() && state.rules.waveTeam.core() != null){ + spawns.add(state.rules.waveTeam.core().tile); + } + + if(core == null || spawns.isEmpty()) return; + + Tile start = spawns.first(); + + Time.mark(); + var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore); + Seq path = new Seq<>(); + boolean found = false; + + if(field != null && field.weights != null){ + int[][] weights = field.weights; + int count = 0; + Tile current = start; + while(count < world.width() * world.height()){ + int minCost = Integer.MAX_VALUE; + int cx = current.x, cy = current.y; + 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]; + current = other; + } + } + + path.add(current); + + if(current.build == core){ + found = true; + break; + } + + count ++; + } + } + + if(!found){ + path = Astar.pathfind(start, core.tile, SectorDamage::cost, t -> !(t.block().isStatic() && t.solid())); + } + + //create sparse tile array for fast range query + int sparseSkip = 5, sparseSkip2 = 3; + //TODO if this is slow, use a quadtree + Seq sparse = new Seq<>(path.size / sparseSkip + 1); + Seq sparse2 = new Seq<>(path.size / sparseSkip2 + 1); + + for(int i = 0; i < path.size; i++){ + if(i % sparseSkip == 0){ + sparse.add(path.get(i)); + } + if(i % sparseSkip2 == 0){ + sparse2.add(path.get(i)); + } + } + + //regen is in health per second + //dps is per second + float sumHealth = 0f, sumRps = 0f, sumDps = 0f; + float totalPathBuild = 0; + + //first, calculate the total health of blocks in the path + + //radius around the path that gets counted + int radius = 7; + IntSet counted = new IntSet(); + + for(Tile t : sparse2){ + + //radius is square. + for(int dx = -radius; dx <= radius; dx++){ + for(int dy = -radius; dy <= radius; dy++){ + int wx = dx + t.x, wy = dy + t.y; + if(wx >= 0 && wy >= 0 && wx < world.width() && wy < world.height()){ + Tile tile = world.rawTile(wx, wy); + + if(tile.build != null && tile.team() == state.rules.defaultTeam && counted.add(tile.pos())){ + //health is divided by block size, because multiblocks are counted multiple times. + sumHealth += tile.build.health / (tile.block().size * tile.block().size); + totalPathBuild += 1f / (tile.block().size * tile.block().size); + } + } + } + } + } + + float avgHealth = totalPathBuild <= 1 ? sumHealth : sumHealth / totalPathBuild; + + //block dps + regen + extra health/shields + for(Building build : Groups.build){ + float e = build.efficiency(); + if(e > 0.08f){ + if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range() + radius*tilesize))){ + if(build.block instanceof Turret t && build instanceof TurretBuild b && b.hasAmmo()){ + sumDps += t.shots / t.reloadTime * 60f * b.peekAmmo().estimateDPS() * e; + } + + if(build.block instanceof MendProjector m){ + sumRps += m.healPercent / m.reload * avgHealth * 60f / 100f * e; + } + + if(build.block instanceof ForceProjector f){ + sumHealth += f.shieldHealth * e; + sumRps += e; + } + } + } + } + + float curEnemyHealth = 0f, curEnemyDps = 0f; + + //unit regen + health + dps + for(Unit unit : Groups.unit){ + //skip player + if(unit.isPlayer()) continue; + + //scale health based on armor - yes, this is inaccurate, but better than nothing + float healthMult = 1f + Mathf.clamp(unit.armor / 20f); + + if(unit.team == state.rules.defaultTeam){ + sumHealth += unit.health*healthMult + unit.shield; + sumDps += unit.type.dpsEstimate; + if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){ + sumRps += h.amount / h.reload * 60f; + } + }else{ + float bossMult = unit.isBoss() ? 3f : 1f; + curEnemyDps += unit.type.dpsEstimate * unit.damageMultiplier() * bossMult; + curEnemyHealth += unit.health * healthMult * unit.healthMultiplier() * bossMult + unit.shield; + } + } + + //calculate DPS and health for the next few waves and store in list + var reg = new LinearRegression(); + SpawnGroup bossGroup = null; + Seq waveDps = new Seq<>(), waveHealth = new Seq<>(); + + for(int wave = state.wave; wave < state.wave + 10; wave ++){ + float sumWaveDps = 0f, sumWaveHealth = 0f; + + for(SpawnGroup group : state.rules.spawns){ + float healthMult = 1f + Mathf.clamp(group.type.armor / 20f); + StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect); + int spawned = group.getSpawned(wave); + //save the boss group + if(group.effect == StatusEffects.boss){ + bossGroup = group; + continue; + } + if(spawned <= 0) continue; + sumWaveHealth += spawned * (group.getShield(wave) + group.type.health * effect.healthMultiplier * healthMult); + sumWaveDps += spawned * group.type.dpsEstimate * effect.damageMultiplier; + } + waveDps.add(new Vec2(wave, sumWaveDps)); + waveHealth.add(new Vec2(wave, sumWaveHealth)); + } + + if(bossGroup != null){ + float bossMult = 1.2f; + //calculate first boss appearaance + for(int wave = state.wave; wave < state.wave + 60; wave++){ + int spawned = bossGroup.getSpawned(wave - 1); + if(spawned > 0){ + //set up relevant stats + info.bossWave = wave; + info.bossDps = spawned * bossGroup.type.dpsEstimate * StatusEffects.boss.damageMultiplier * bossMult; + info.bossHealth = spawned * (bossGroup.getShield(wave) + bossGroup.type.health * StatusEffects.boss.healthMultiplier * (1f + Mathf.clamp(bossGroup.type.armor / 20f))) * bossMult; + break; + } + } + } + + //calculate linear regression of the wave data and store it + reg.calculate(waveHealth); + info.waveHealthBase = reg.intercept; + info.waveHealthSlope = reg.slope; + + reg.calculate(waveDps); + info.waveDpsBase = reg.intercept; + info.waveDpsSlope = reg.slope; + + //enemy units like to aim for a lot of non-essential things, so increase resulting health slightly + info.sumHealth = sumHealth * 1.05f; + //players tend to have longer range units/turrets, so assume DPS is higher + info.sumDps = sumDps * 1.05f; + info.sumRps = sumRps; + + float cmult = 1.5f; + + info.curEnemyDps = curEnemyDps*cmult; + info.curEnemyHealth = curEnemyHealth*cmult; + + info.wavesSurvived = getWavesSurvived(info); + } + public static void apply(float fraction){ Tiles tiles = world.tiles; Queue frontier = new Queue<>(); float[][] values = new float[tiles.width][tiles.height]; - float damage = fraction*80; //arbitrary damage value //phase one: find all spawnpoints for(Tile tile : tiles){ if((tile.block() instanceof CoreBlock && tile.team() == state.rules.waveTeam) || tile.overlay() == Blocks.spawn){ frontier.add(tile); - values[tile.x][tile.y] = damage; + values[tile.x][tile.y] = fraction * 24; } } @@ -35,76 +395,130 @@ public class SectorDamage{ if(core != null && !frontier.isEmpty()){ for(Tile spawner : frontier){ //find path from spawn to core - //TODO this is broken Seq path = Astar.pathfind(spawner, core.tile, SectorDamage::cost, t -> !(t.block().isStatic() && t.solid())); - int amount = (int)(path.size * fraction); - for(int i = 0; i < amount; i++){ - Tile t = path.get(i); - Geometry.circle(t.x, t.y, tiles.width, tiles.height, 5, (cx, cy) -> { - Tile other = tiles.getn(cx, cy); - //just remove all the buildings in the way - as long as they're not cores! - if(other.build != null && other.team() == state.rules.defaultTeam && !(other.block() instanceof CoreBlock)){ - if(rubble && !other.floor().solid && !other.floor().isLiquid && Mathf.chance(0.4)){ - Effect.rubble(other.build.x, other.build.y, other.block().size); - } + Seq removal = new Seq<>(); - other.remove(); + int radius = 3; + + //only penetrate a certain % by health, not by distance + float totalHealth = fraction >= 1f ? 1f : path.sumf(t -> { + float s = 0; + for(int dx = -radius; dx <= radius; dx++){ + for(int dy = -radius; dy <= radius; dy++){ + int wx = dx + t.x, wy = dy + t.y; + if(wx >= 0 && wy >= 0 && wx < world.width() && wy < world.height() && Mathf.within(dx, dy, radius)){ + Tile other = world.rawTile(wx, wy); + if(!(other.block() instanceof CoreBlock)){ + s += other.team() == state.rules.defaultTeam ? other.build.health / (other.block().size * other.block().size) : 0f; + } + } } - }); + } + return s; + }); + float targetHealth = totalHealth * fraction; + float healthCount = 0; + + out: + for(int i = 0; i < path.size && (healthCount < targetHealth || fraction >= 1f); i++){ + Tile t = path.get(i); + + for(int dx = -radius; dx <= radius; dx++){ + for(int dy = -radius; dy <= radius; dy++){ + int wx = dx + t.x, wy = dy + t.y; + if(wx >= 0 && wy >= 0 && wx < world.width() && wy < world.height() && Mathf.within(dx, dy, radius)){ + Tile other = world.rawTile(wx, wy); + + //just remove all the buildings in the way - as long as they're not cores + if(other.build != null && other.team() == state.rules.defaultTeam && !(other.block() instanceof CoreBlock)){ + if(rubble && !other.floor().solid && !other.floor().isLiquid && Mathf.chance(0.4)){ + Effect.rubble(other.build.x, other.build.y, other.block().size); + } + + //since the whole block is removed, count the whole health + healthCount += other.build.health; + + removal.add(other.build); + + if(healthCount >= targetHealth && fraction < 0.999f){ + break out; + } + } + } + } + } + } + + for(Building r : removal){ + if(r.tile.build == r){ + r.addPlan(false); + r.tile.remove(); + } } } } - float falloff = (damage) / (Math.max(tiles.width, tiles.height) * Mathf.sqrt2); + //kill every core if damage is maximum + if(fraction >= 1){ + for(Building c : state.rules.defaultTeam.cores().copy()){ + c.tile.remove(); + } + } + + float falloff = (fraction) / (Math.max(tiles.width, tiles.height) * Mathf.sqrt2); int peak = 0; - //phase two: propagate the damage - while(!frontier.isEmpty()){ - peak = Math.max(peak, frontier.size); - Tile tile = frontier.removeFirst(); - float currDamage = values[tile.x][tile.y] - falloff; + if(fraction > 0.15f){ + //phase two: propagate the damage + while(!frontier.isEmpty()){ + peak = Math.max(peak, frontier.size); + Tile tile = frontier.removeFirst(); + float currDamage = values[tile.x][tile.y] - falloff; - for(int i = 0; i < 4; i++){ - int cx = tile.x + Geometry.d4x[i], cy = tile.y + Geometry.d4y[i]; + for(int i = 0; i < 4; i++){ + int cx = tile.x + Geometry.d4x[i], cy = tile.y + Geometry.d4y[i]; - //propagate to new tiles - if(tiles.in(cx, cy) && values[cx][cy] < currDamage){ - Tile other = tiles.getn(cx, cy); - float resultDamage = currDamage; + //propagate to new tiles + if(tiles.in(cx, cy) && values[cx][cy] < currDamage){ + Tile other = tiles.getn(cx, cy); + float resultDamage = currDamage; - //damage the tile if it's not friendly - if(other.build != null && other.team() != state.rules.waveTeam){ - resultDamage -= other.build.health(); + //damage the tile if it's not friendly + if(other.build != null && other.team() != state.rules.waveTeam){ + resultDamage -= other.build.health(); - if(direct){ - other.build.damage(currDamage); - }else{ //indirect damage happens at game load time - other.build.health -= currDamage; - //don't kill the core! - if(other.block() instanceof CoreBlock) other.build.health = Math.max(other.build.health, 1f); + if(direct){ + other.build.damage(currDamage); + }else{ //indirect damage happens at game load time + other.build.health -= currDamage; + //don't kill the core! + if(other.block() instanceof CoreBlock) other.build.health = Math.max(other.build.health, 1f); - //remove the block when destroyed - if(other.build.health < 0){ - //rubble - if(rubble && !other.floor().solid && !other.floor().isLiquid && Mathf.chance(0.4)){ - Effect.rubble(other.build.x, other.build.y, other.block().size); + //remove the block when destroyed + if(other.build.health < 0){ + //rubble + if(rubble && !other.floor().solid && !other.floor().isLiquid && Mathf.chance(0.4)){ + Effect.rubble(other.build.x, other.build.y, other.block().size); + } + + other.build.addPlan(false); + other.remove(); } - - other.remove(); } + + }else if(other.solid() && !other.synthetic()){ //skip damage propagation through solid blocks + continue; } - }else if(other.solid() && !other.synthetic()){ //skip damage propagation through solid blocks - continue; - } - - if(resultDamage > 0 && values[cx][cy] < resultDamage){ - frontier.addLast(other); - values[cx][cy] = resultDamage; + if(resultDamage > 0 && values[cx][cy] < resultDamage){ + frontier.addLast(other); + values[cx][cy] = resultDamage; + } } } } } + } static float cost(Tile tile){ diff --git a/core/src/mindustry/maps/filters/ClearFilter.java b/core/src/mindustry/maps/filters/ClearFilter.java index 3769d7f77d..4da2564a79 100644 --- a/core/src/mindustry/maps/filters/ClearFilter.java +++ b/core/src/mindustry/maps/filters/ClearFilter.java @@ -11,7 +11,7 @@ public class ClearFilter extends GenerateFilter{ @Override public FilterOption[] options(){ - return Structs.arr(new BlockOption("block", () -> block, b -> block = b, wallsOnly)); + return Structs.arr(new BlockOption("block", () -> block, b -> block = b, b -> oresOnly.get(b) || wallsOnly.get(b))); } @Override @@ -20,5 +20,9 @@ public class ClearFilter extends GenerateFilter{ if(in.block == block){ in.block = Blocks.air; } + + if(in.overlay == block){ + in.overlay = Blocks.air; + } } } diff --git a/core/src/mindustry/maps/filters/CoreSpawnFilter.java b/core/src/mindustry/maps/filters/CoreSpawnFilter.java index fa3b270d4d..6aa2db744b 100644 --- a/core/src/mindustry/maps/filters/CoreSpawnFilter.java +++ b/core/src/mindustry/maps/filters/CoreSpawnFilter.java @@ -5,7 +5,7 @@ import arc.util.*; import mindustry.world.*; import mindustry.world.blocks.storage.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; /** Selects X spawns from the core spawn pool.*/ public class CoreSpawnFilter extends GenerateFilter{ diff --git a/core/src/mindustry/maps/filters/DistortFilter.java b/core/src/mindustry/maps/filters/DistortFilter.java index 0d3691f1f7..daedca1765 100644 --- a/core/src/mindustry/maps/filters/DistortFilter.java +++ b/core/src/mindustry/maps/filters/DistortFilter.java @@ -3,7 +3,6 @@ package mindustry.maps.filters; import arc.util.*; import mindustry.maps.filters.FilterOption.*; import mindustry.world.*; -import mindustry.world.blocks.environment.*; public class DistortFilter extends GenerateFilter{ float scl = 40, mag = 5; @@ -27,6 +26,6 @@ public class DistortFilter extends GenerateFilter{ in.floor = tile.floor(); if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block(); - if(!((Floor)in.floor).isLiquid) in.ore = tile.overlay(); + in.overlay = tile.overlay(); } } diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index dedebfe713..1a867d8dee 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -20,9 +20,10 @@ public abstract class FilterOption{ public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)); public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)) && b.inEditor; public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); - public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Boolf wallsOptional = b -> (b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)))) && b.inEditor; public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))) && b.inEditor; - public static final Boolf oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); + public static final Boolf oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(Cicon.full)); + public static final Boolf oresFloorsOptional = b -> (b instanceof Floor) && !headless && Core.atlas.isFound(b.icon(Cicon.full)); public static final Boolf anyOptional = b -> (floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air) && b.inEditor; public abstract void build(Table table); @@ -89,14 +90,14 @@ public abstract class FilterOption{ @Override public void build(Table table){ table.button(b -> b.image(supplier.get().icon(Cicon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) - .setRegion(supplier.get() == Blocks.air ? Icon.block.getRegion() : supplier.get().icon(Cicon.small))).size(8 * 3), () -> { + .setRegion(supplier.get() == Blocks.air ? Icon.none.getRegion() : supplier.get().icon(Cicon.small))).size(8 * 3), () -> { BaseDialog dialog = new BaseDialog(""); dialog.setFillParent(false); int i = 0; for(Block block : Vars.content.blocks()){ if(!filter.get(block)) continue; - dialog.cont.image(block == Blocks.air ? Icon.block.getRegion() : block.icon(Cicon.medium)).size(8 * 4).pad(3).get().clicked(() -> { + dialog.cont.image(block == Blocks.air ? Icon.none.getRegion() : block.icon(Cicon.medium)).size(8 * 4).pad(3).get().clicked(() -> { consumer.get(block); dialog.hide(); changed.run(); diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index 6d0f48d121..07811c3baf 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -5,7 +5,10 @@ import arc.math.*; import arc.scene.ui.*; import arc.util.*; import arc.util.noise.*; +import mindustry.*; +import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.gen.*; import mindustry.world.*; public abstract class GenerateFilter{ @@ -15,15 +18,45 @@ public abstract class GenerateFilter{ public void apply(Tiles tiles, GenerateInput in){ this.in = in; - for(Tile tile : tiles){ - in.apply(tile.x, tile.y, tile.floor(), tile.block(), tile.overlay()); - apply(); - tile.setFloor(in.floor.asFloor()); - tile.setOverlay(in.floor.asFloor().isLiquid ? Blocks.air : in.ore); + if(isBuffered()){ + //buffer of tiles used, each tile packed into a long struct + long[] buffer = new long[tiles.width * tiles.height]; - if(!tile.block().synthetic() && !in.block.synthetic()){ - tile.setBlock(in.block); + for(int i = 0; i < tiles.width * tiles.height; i++){ + Tile tile = tiles.geti(i); + + in.apply(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay()); + apply(); + + buffer[i] = PackTile.get(in.block.id, in.floor.id, in.overlay.id); + } + + //write to buffer + for(int i = 0; i < tiles.width * tiles.height; i++){ + Tile tile = tiles.geti(i); + long b = buffer[i]; + + Block block = Vars.content.block(PackTile.block(b)), floor = Vars.content.block(PackTile.floor(b)), overlay = Vars.content.block(PackTile.overlay(b)); + + tile.setFloor(floor.asFloor()); + tile.setOverlay(!floor.asFloor().hasSurface() && overlay.asFloor().needsSurface ? Blocks.air : overlay); + + if(!tile.block().synthetic() && !block.synthetic()){ + tile.setBlock(block); + } + } + }else{ + for(Tile tile : tiles){ + in.apply(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay()); + apply(); + + tile.setFloor(in.floor.asFloor()); + tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface ? Blocks.air : in.overlay); + + if(!tile.block().synthetic() && !in.block.synthetic()){ + tile.setBlock(in.block); + } } } } @@ -89,16 +122,16 @@ public abstract class GenerateFilter{ public int x, y, width, height; /** output parameters */ - public Block floor, block, ore; + public Block floor, block, overlay; Simplex noise = new Simplex(); RidgedPerlin pnoise = new RidgedPerlin(0, 1); TileProvider buffer; - public void apply(int x, int y, Block floor, Block block, Block ore){ + public void apply(int x, int y, Block block, Block floor, Block overlay){ this.floor = floor; this.block = block; - this.ore = ore; + this.overlay = overlay; this.x = x; this.y = y; } @@ -119,4 +152,9 @@ public abstract class GenerateFilter{ Tile get(int x, int y); } } + + @Struct + class PackTileStruct{ + short block, floor, overlay; + } } diff --git a/core/src/mindustry/maps/filters/MedianFilter.java b/core/src/mindustry/maps/filters/MedianFilter.java index c70bf6d71b..78a4df65d4 100644 --- a/core/src/mindustry/maps/filters/MedianFilter.java +++ b/core/src/mindustry/maps/filters/MedianFilter.java @@ -1,12 +1,12 @@ package mindustry.maps.filters; -import arc.struct.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.maps.filters.FilterOption.*; import mindustry.world.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class MedianFilter extends GenerateFilter{ float radius = 2; diff --git a/core/src/mindustry/maps/filters/MirrorFilter.java b/core/src/mindustry/maps/filters/MirrorFilter.java index 8d2e22bdbe..3ebdb45a71 100644 --- a/core/src/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/mindustry/maps/filters/MirrorFilter.java @@ -39,7 +39,7 @@ public class MirrorFilter extends GenerateFilter{ if(!tile.block().synthetic()){ in.block = tile.block(); } - in.ore = tile.overlay(); + in.overlay = tile.overlay(); } } diff --git a/core/src/mindustry/maps/filters/NoiseFilter.java b/core/src/mindustry/maps/filters/NoiseFilter.java index 1feba11ad1..abff26ceb8 100644 --- a/core/src/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/mindustry/maps/filters/NoiseFilter.java @@ -1,17 +1,14 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.BlockOption; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.floorsOnly; -import static mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.*; public class NoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0.5f, octaves = 3f, falloff = 0.5f; - Block floor = Blocks.stone, block = Blocks.stoneWall; + Block floor = Blocks.stone, block = Blocks.stoneWall, target = Blocks.air; @Override public FilterOption[] options(){ @@ -20,8 +17,9 @@ public class NoiseFilter extends GenerateFilter{ new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), - new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), - new BlockOption("wall", () -> block, b -> block = b, wallsOnly) + new BlockOption("target", () -> target, b -> target = b, anyOptional), + new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional), + new BlockOption("wall", () -> block, b -> block = b, wallsOptional) ); } @@ -29,9 +27,9 @@ public class NoiseFilter extends GenerateFilter{ public void apply(){ float noise = noise(in.x, in.y, scl, 1f, octaves, falloff); - if(noise > threshold){ - in.floor = floor; - if(wallsOnly.get(in.block)) in.block = block; + if(noise > threshold && (target == Blocks.air || in.floor == target || in.block == target)){ + if(floor != Blocks.air) in.floor = floor; + if(block != Blocks.air && in.block != Blocks.air) in.block = block; } } } diff --git a/core/src/mindustry/maps/filters/OreFilter.java b/core/src/mindustry/maps/filters/OreFilter.java index 91c989e151..501d152d4f 100644 --- a/core/src/mindustry/maps/filters/OreFilter.java +++ b/core/src/mindustry/maps/filters/OreFilter.java @@ -1,16 +1,14 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.BlockOption; -import static mindustry.maps.filters.FilterOption.oresOnly; +import static mindustry.maps.filters.FilterOption.*; public class OreFilter extends GenerateFilter{ public float scl = 23, threshold = 0.81f, octaves = 2f, falloff = 0.3f; - public Block ore = Blocks.oreCopper; + public Block ore = Blocks.oreCopper, target = Blocks.air; @Override public FilterOption[] options(){ @@ -19,7 +17,8 @@ public class OreFilter extends GenerateFilter{ new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), - new BlockOption("ore", () -> ore, b -> ore = b, oresOnly) + new BlockOption("ore", () -> ore, b -> ore = b, oresOnly), + new BlockOption("target", () -> target, b -> target = b, oresFloorsOptional) ); } @@ -27,8 +26,8 @@ public class OreFilter extends GenerateFilter{ public void apply(){ float noise = noise(in.x, in.y, scl, 1f, octaves, falloff); - if(noise > threshold && in.ore != Blocks.spawn){ - in.ore = ore; + if(noise > threshold && in.overlay != Blocks.spawn && (target == Blocks.air || in.floor == target || in.overlay == target) && in.floor.asFloor().hasSurface()){ + in.overlay = ore; } } } diff --git a/core/src/mindustry/maps/filters/OreMedianFilter.java b/core/src/mindustry/maps/filters/OreMedianFilter.java index 43c589d586..27a10548af 100644 --- a/core/src/mindustry/maps/filters/OreMedianFilter.java +++ b/core/src/mindustry/maps/filters/OreMedianFilter.java @@ -1,7 +1,7 @@ package mindustry.maps.filters; -import arc.struct.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.content.*; @@ -29,14 +29,14 @@ public class OreMedianFilter extends GenerateFilter{ @Override public void apply(){ - if(in.ore == Blocks.spawn) return; + if(in.overlay == Blocks.spawn) return; int cx = (in.x / 2) * 2; int cy = (in.y / 2) * 2; - if(in.ore != Blocks.air){ - if(!(in.tile(cx + 1, cy).overlay() == in.ore && in.tile(cx, cy).overlay() == in.ore && in.tile(cx + 1, cy + 1).overlay() == in.ore && in.tile(cx, cy + 1).overlay() == in.ore && + if(in.overlay != Blocks.air){ + if(!(in.tile(cx + 1, cy).overlay() == in.overlay && in.tile(cx, cy).overlay() == in.overlay && in.tile(cx + 1, cy + 1).overlay() == in.overlay && in.tile(cx, cy + 1).overlay() == in.overlay && !in.tile(cx + 1, cy).block().isStatic() && !in.tile(cx, cy).block().isStatic() && !in.tile(cx + 1, cy + 1).block().isStatic() && !in.tile(cx, cy + 1).block().isStatic())){ - in.ore = Blocks.air; + in.overlay = Blocks.air; } } @@ -58,6 +58,6 @@ public class OreMedianFilter extends GenerateFilter{ int index = Math.min((int)(blocks.size * percentile), blocks.size - 1); int overlay = blocks.get(index); - in.ore = Vars.content.block(overlay); + in.overlay = Vars.content.block(overlay); } } diff --git a/core/src/mindustry/maps/filters/RiverNoiseFilter.java b/core/src/mindustry/maps/filters/RiverNoiseFilter.java index 0a462548cc..73ce77acb9 100644 --- a/core/src/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -1,13 +1,10 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.BlockOption; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.floorsOnly; -import static mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.*; public class RiverNoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0f, threshold2 = 0.1f; diff --git a/core/src/mindustry/maps/filters/ScatterFilter.java b/core/src/mindustry/maps/filters/ScatterFilter.java index 8866130baa..9cc809eeed 100644 --- a/core/src/mindustry/maps/filters/ScatterFilter.java +++ b/core/src/mindustry/maps/filters/ScatterFilter.java @@ -1,13 +1,13 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.world.*; import static mindustry.maps.filters.FilterOption.*; public class ScatterFilter extends GenerateFilter{ - protected float chance = 0.014f; + protected float chance = 0.013f; protected Block flooronto = Blocks.air, floor = Blocks.air, block = Blocks.air; @Override @@ -27,7 +27,7 @@ public class ScatterFilter extends GenerateFilter{ if(!block.isOverlay()){ in.block = block; }else{ - in.ore = block; + in.overlay = block; } } diff --git a/core/src/mindustry/maps/filters/SpawnPathFilter.java b/core/src/mindustry/maps/filters/SpawnPathFilter.java new file mode 100644 index 0000000000..8384024186 --- /dev/null +++ b/core/src/mindustry/maps/filters/SpawnPathFilter.java @@ -0,0 +1,64 @@ +package mindustry.maps.filters; + +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.*; +import mindustry.ai.*; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.*; + +import static mindustry.Vars.*; + +/** Selects X spawns from the spawn pool.*/ +public class SpawnPathFilter extends GenerateFilter{ + int radius = 3; + + @Override + public FilterOption[] options(){ + return Structs.arr( + new SliderOption("radius", () -> radius, f -> radius = (int)f, 1, 20).display() + ); + } + + @Override + public void apply(Tiles tiles, GenerateInput in){ + Tile core = null; + var spawns = new Seq(); + + for(Tile tile : tiles){ + if(tile.overlay() == Blocks.spawn){ + spawns.add(tile); + } + if(tile.block() instanceof CoreBlock && tile.team() != Vars.state.rules.waveTeam){ + core = tile; + } + } + + if(core != null && spawns.any()){ + for(var spawn : spawns){ + var path = Astar.pathfind(core.x, core.y, spawn.x, spawn.y, t -> t.solid() ? 100 : 1, Astar.manhattan, tile -> !tile.floor().isDeep()); + for(var tile : path){ + for(int x = -radius; x <= radius; x++){ + for(int y = -radius; y <= radius; y++){ + int wx = tile.x + x, wy = tile.y + y; + if(Structs.inBounds(wx, wy, world.width(), world.height()) && Mathf.within(x, y, radius)){ + Tile other = tiles.getn(wx, wy); + if(!other.synthetic()){ + other.setBlock(Blocks.air); + } + } + } + } + } + } + } + } + + @Override + public boolean isPost(){ + return true; + } +} diff --git a/core/src/mindustry/maps/filters/TerrainFilter.java b/core/src/mindustry/maps/filters/TerrainFilter.java index f6dcaeaf27..4747149448 100644 --- a/core/src/mindustry/maps/filters/TerrainFilter.java +++ b/core/src/mindustry/maps/filters/TerrainFilter.java @@ -1,18 +1,15 @@ package mindustry.maps.filters; -import arc.math.Mathf; +import arc.math.*; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.BlockOption; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.floorsOnly; -import static mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.*; public class TerrainFilter extends GenerateFilter{ float scl = 40, threshold = 0.9f, octaves = 3f, falloff = 0.5f, magnitude = 1f, circleScl = 2.1f; - Block floor = Blocks.stone, block = Blocks.stoneWall; + Block floor = Blocks.air, block = Blocks.stoneWall; @Override public FilterOption[] options(){ @@ -23,7 +20,7 @@ public class TerrainFilter extends GenerateFilter{ new SliderOption("circle-scale", () -> circleScl, f -> circleScl = f, 0f, 3f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), - new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), + new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional), new BlockOption("wall", () -> block, b -> block = b, wallsOnly) ); } @@ -32,13 +29,12 @@ public class TerrainFilter extends GenerateFilter{ public void apply(){ float noise = noise(in.x, in.y, scl, magnitude, octaves, falloff) + Mathf.dst((float)in.x / in.width, (float)in.y / in.height, 0.5f, 0.5f) * circleScl; - in.floor = floor; - in.ore = Blocks.air; + if(floor != Blocks.air){ + in.floor = floor; + } if(noise >= threshold){ in.block = block; - }else{ - in.block = Blocks.air; } } } diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 7a752a453a..02e02e8de2 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -4,6 +4,8 @@ import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.util.*; +import mindustry.ai.*; import mindustry.ai.BaseRegistry.*; import mindustry.content.*; import mindustry.game.*; @@ -12,7 +14,7 @@ import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.defense.*; -import mindustry.world.blocks.environment.*; +import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.meta.*; @@ -22,17 +24,13 @@ import static mindustry.Vars.*; public class BaseGenerator{ private static final Vec2 axis = new Vec2(), rotator = new Vec2(); - private static final int range = 180; + private static final int range = 160; private Tiles tiles; - private Team team; - private ObjectMap ores = new ObjectMap<>(); - private ObjectMap oreFloors = new ObjectMap<>(); private Seq cores; public void generate(Tiles tiles, Seq cores, Tile spawn, Team team, Sector sector, float difficulty){ this.tiles = tiles; - this.team = team; this.cores = cores; //don't generate bases when there are no loaded schematics @@ -40,37 +38,26 @@ public class BaseGenerator{ Mathf.rand.setSeed(sector.id); - 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()); - } - } - - //TODO limit base size - float costBudget = 1000; - - Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1 && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); - Seq wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2 && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); + Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1 && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); + Seq wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2 && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); //sort by cost for correct fraction wallsSmall.sort(b -> b.buildCost); wallsLarge.sort(b -> b.buildCost); - //TODO proper difficulty selection - float bracket = difficulty; float bracketRange = 0.2f; + float baseChance = Mathf.lerp(0.7f, 1.9f, difficulty); int wallAngle = 70; //180 for full coverage - double resourceChance = 0.5; - double nonResourceChance = 0.0005; - BasePart coreschem = bases.cores.getFrac(bracket); + double resourceChance = 0.5 * baseChance; + double nonResourceChance = 0.0005 * baseChance; + BasePart coreschem = bases.cores.getFrac(difficulty); + int passes = difficulty < 0.4 ? 1 : difficulty < 0.8 ? 2 : 3; - Block wall = wallsSmall.getFrac(bracket), wallLarge = wallsLarge.getFrac(bracket); + Block wall = wallsSmall.getFrac(difficulty * 0.91f), wallLarge = wallsLarge.getFrac(difficulty * 0.91f); for(Tile tile : cores){ tile.clearOverlay(); - Schematics.placeLoadout(coreschem.schematic, tile.x, tile.y, team, coreschem.required instanceof Item ? ores.get((Item)coreschem.required) : Blocks.oreCopper); + Schematics.placeLoadout(coreschem.schematic, tile.x, tile.y, team, coreschem.required instanceof Item ? bases.ores.get((Item)coreschem.required) : Blocks.oreCopper, false); //fill core with every type of item (even non-material) Building entity = tile.build; @@ -79,20 +66,22 @@ public class BaseGenerator{ } } - //random schematics - pass(tile -> { - if(!tile.block().alwaysReplace) return; + for(int i = 0; i < passes; i++){ + //random schematics + pass(tile -> { + if(!tile.block().alwaysReplace) return; - if(((tile.overlay().asFloor().itemDrop != null || (tile.drop() != null && Mathf.chance(nonResourceChance))) + if(((tile.overlay().asFloor().itemDrop != null || (tile.drop() != null && Mathf.chance(nonResourceChance))) || (tile.floor().liquidDrop != null && Mathf.chance(nonResourceChance * 2))) && Mathf.chance(resourceChance)){ - Seq parts = bases.forResource(tile.drop() != null ? tile.drop() : tile.floor().liquidDrop); - if(!parts.isEmpty()){ - tryPlace(parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y); + Seq parts = bases.forResource(tile.drop() != null ? tile.drop() : tile.floor().liquidDrop); + if(!parts.isEmpty()){ + tryPlace(parts.getFrac(difficulty + Mathf.range(bracketRange)), tile.x, tile.y, team); + } + }else if(Mathf.chance(nonResourceChance)){ + tryPlace(bases.parts.getFrac(difficulty + Mathf.range(bracketRange)), tile.x, tile.y, team); } - }else if(Mathf.chance(nonResourceChance)){ - tryPlace(bases.parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y); - } - }); + }); + } //replace walls with the correct type (disabled) if(false) @@ -110,6 +99,15 @@ public class BaseGenerator{ if(tile.block().alwaysReplace){ boolean any = false; + for(Point2 p : Geometry.d4){ + Tile o = tiles.get(tile.x + p.x, tile.y + p.y); + + //do not block payloads + if(o != null && (o.block() instanceof PayloadConveyor || o.block() instanceof PayloadAcceptor)){ + return; + } + } + for(Point2 p : Geometry.d8){ if(Angles.angleDist(Angles.angle(p.x, p.y), spawn.angleTo(tile)) > wallAngle){ continue; @@ -147,13 +145,31 @@ public class BaseGenerator{ } }); } + + //clear path for ground units + for(Tile tile : cores){ + Astar.pathfind(tile, spawn, t -> t.team() == state.rules.waveTeam && !t.within(tile, 25f * 8) ? 100000 : t.floor().hasSurface() ? 1 : 10, t -> !t.block().isStatic()).each(t -> { + if(!t.within(tile, 25f * 8)){ + if(t.team() == state.rules.waveTeam){ + t.setBlock(Blocks.air); + } + + for(Point2 p : Geometry.d8){ + Tile other = t.nearby(p); + if(other != null && other.team() == state.rules.waveTeam){ + other.setBlock(Blocks.air); + } + } + } + }); + } } public void postGenerate(){ if(tiles == null) return; for(Tile tile : tiles){ - if(tile.isCenter() && tile.block() instanceof PowerNode){ + if(tile.isCenter() && tile.block() instanceof PowerNode && tile.team() == state.rules.waveTeam){ tile.build.placed(); } } @@ -164,7 +180,19 @@ public class BaseGenerator{ core.circle(range, (x, y) -> cons.get(tiles.getn(x, y))); } - boolean tryPlace(BasePart part, int x, int y){ + /** + * Tries to place a base part at a certain location with a certain team. + * @return success state + * */ + public static boolean tryPlace(BasePart part, int x, int y, Team team){ + return tryPlace(part, x, y, team, null); + } + + /** + * Tries to place a base part at a certain location with a certain team. + * @return success state + * */ + public static boolean tryPlace(BasePart part, int x, int y, Team team, @Nullable Intc2 posc){ int rotation = Mathf.range(2); axis.set((int)(part.schematic.width / 2f), (int)(part.schematic.height / 2f)); Schematic result = Schematics.rotate(part.schematic, rotation); @@ -180,21 +208,24 @@ public class BaseGenerator{ if(isTaken(tile.block, realX, realY)){ return false; } + + if(posc != null){ + posc.get(realX, realY); + } } - if(part.required instanceof Item){ - Item item = (Item)part.required; + if(part.required instanceof Item item){ for(Stile tile : result.tiles){ if(tile.block instanceof Drill){ tile.block.iterateTaken(tile.x + cx, tile.y + cy, (ex, ey) -> { - if(!tiles.getn(ex, ey).floor().isLiquid){ - set(tiles.getn(ex, ey), item); + if(world.tiles.getn(ex, ey).floor().hasSurface()){ + set(world.tiles.getn(ex, ey), item); } - Tile rand = tiles.getc(ex + Mathf.range(1), ey + Mathf.range(1)); - if(!rand.floor().isLiquid){ + Tile rand = world.tiles.getc(ex + Mathf.range(1), ey + Mathf.range(1)); + if(rand.floor().hasSurface()){ //random ores nearby to make it look more natural set(rand, item); } @@ -206,8 +237,7 @@ public class BaseGenerator{ Schematics.place(result, cx + result.width/2, cy + result.height/2, team); //fill drills with items after placing - if(part.required instanceof Item){ - Item item = (Item)part.required; + if(part.required instanceof Item item){ for(Stile tile : result.tiles){ if(tile.block instanceof Drill){ @@ -223,15 +253,15 @@ public class BaseGenerator{ return true; } - void set(Tile tile, Item item){ - if(ores.containsKey(item)){ - tile.setOverlay(ores.get(item)); - }else if(oreFloors.containsKey(item)){ - tile.setFloor(oreFloors.get(item)); + static void set(Tile tile, Item item){ + if(bases.ores.containsKey(item)){ + tile.setOverlay(bases.ores.get(item)); + }else if(bases.oreFloors.containsKey(item)){ + tile.setFloor(bases.oreFloors.get(item)); } } - boolean isTaken(Block block, int x, int y){ + static boolean isTaken(Block block, int x, int y){ int offsetx = -(block.size - 1) / 2; int offsety = -(block.size - 1) / 2; int pad = 1; @@ -247,8 +277,8 @@ public class BaseGenerator{ return false; } - boolean overlaps(int x, int y){ - Tile tile = tiles.get(x, y); + static boolean overlaps(int x, int y){ + Tile tile = world.tiles.get(x, y); return tile == null || !tile.block().alwaysReplace || world.getDarkness(x, y) > 0; } diff --git a/core/src/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java index 542f84cf29..1ef6d31297 100644 --- a/core/src/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -69,7 +69,7 @@ public abstract class BasicGenerator implements WorldGenerator{ public void ores(Seq ores){ pass((x, y) -> { - if(floor.asFloor().isLiquid) return; + if(!floor.asFloor().hasSurface()) return; int offsetX = x - 4, offsetY = y + 23; for(int i = ores.size - 1; i >= 0; i--){ @@ -124,7 +124,7 @@ public abstract class BasicGenerator implements WorldGenerator{ Block[] blocks = {Blocks.darkPanel3}; int secSize = 20; pass((x, y) -> { - if(floor.asFloor().isLiquid) return; + if(!floor.asFloor().hasSurface()) return; int mx = x % secSize, my = y % secSize; int sclx = x / secSize, scly = y / secSize; @@ -248,7 +248,7 @@ public abstract class BasicGenerator implements WorldGenerator{ for(int x = -rad; x <= rad; x++){ for(int y = -rad; y <= rad; y++){ int wx = cx + x, wy = cy + y; - if(Structs.inBounds(wx, wy, width, height) && Mathf.dst(x, y, 0, 0) <= rad){ + if(Structs.inBounds(wx, wy, width, height) && Mathf.within(x, y, rad)){ Tile other = tiles.getn(wx, wy); other.setBlock(Blocks.air); } diff --git a/core/src/mindustry/maps/generators/FileMapGenerator.java b/core/src/mindustry/maps/generators/FileMapGenerator.java index dab00370ed..ebebd03877 100644 --- a/core/src/mindustry/maps/generators/FileMapGenerator.java +++ b/core/src/mindustry/maps/generators/FileMapGenerator.java @@ -14,9 +14,11 @@ import static mindustry.Vars.*; public class FileMapGenerator implements WorldGenerator{ public final Map map; + public final SectorPreset preset; - public FileMapGenerator(String mapName){ + public FileMapGenerator(String mapName, SectorPreset preset){ this.map = maps != null ? maps.loadInternalMap(mapName) : null; + this.preset = preset; } @Override @@ -56,6 +58,10 @@ public class FileMapGenerator implements WorldGenerator{ if(tile.isCenter() && tile.block() instanceof CoreBlock && tile.team() == state.rules.defaultTeam && !anyCores){ Schematics.placeLaunchLoadout(tile.x, tile.y); anyCores = true; + + if(preset.addStartingItems){ + tile.build.items.add(state.rules.loadout); + } } } diff --git a/core/src/mindustry/maps/generators/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 6bbc15ed2f..d1cfe30bf5 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -1,6 +1,7 @@ package mindustry.maps.generators; import arc.math.geom.*; +import arc.struct.*; import arc.util.noise.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; @@ -8,7 +9,9 @@ import mindustry.type.*; import mindustry.world.*; public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{ + protected IntSeq ints = new IntSeq(); protected Sector sector; + protected Simplex noise = new Simplex(); /** Should generate sector bases for a planet. */ public void generateSector(Sector sector){ @@ -17,12 +20,17 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe boolean any = false; float noise = Noise.snoise3(tile.v.x, tile.v.y, tile.v.z, 0.001f, 0.5f); - if(noise > 0.028){ + if(noise > 0.027){ any = true; } if(noise < 0.15){ for(Ptile other : tile.tiles){ + //no sectors near start sector! + if(sector.planet.getSector(other).id == sector.planet.startSector){ + return; + } + if(sector.planet.getSector(other).generateEnemyBase){ any = false; break; @@ -39,6 +47,12 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe } + @Override + protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){ + Vec3 v = sector.rect.project(x, y); + return (float)noise.octaveNoise3D(octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag; + } + public void generate(Tiles tiles, Sector sec){ this.tiles = tiles; this.sector = sec; diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index 6c5f047a90..cc0b1ea934 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -7,15 +7,17 @@ import arc.struct.*; import arc.util.*; import arc.util.noise.*; import mindustry.ai.*; +import mindustry.ai.BaseRegistry.*; import mindustry.content.*; import mindustry.game.*; +import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.maps.generators.*; +import mindustry.type.*; import mindustry.world.*; import static mindustry.Vars.*; public class SerpuloPlanetGenerator extends PlanetGenerator{ - Simplex noise = new Simplex(); RidgedPerlin rid = new RidgedPerlin(1, 2); BaseGenerator basegen = new BaseGenerator(); float scl = 5f; @@ -29,9 +31,9 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ {Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.salt, Blocks.salt, Blocks.sand, Blocks.stone, Blocks.stone, Blocks.stone, Blocks.snow, Blocks.iceSnow, Blocks.ice}, {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.basalt, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice}, {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.iceSnow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice}, - {Blocks.deepwater, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.moss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.ice}, - {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.darksand, Blocks.basalt, Blocks.moss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, - {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.moss, Blocks.sporeMoss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice}, + {Blocks.deepwater, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.moss, Blocks.snow, Blocks.basalt, Blocks.basalt, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice}, + {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.darksand, Blocks.basalt, Blocks.moss, Blocks.basalt, Blocks.hotrock, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, + {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.moss, Blocks.sporeMoss, Blocks.snow, Blocks.basalt, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.sporeMoss, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice}, {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.sporeMoss, Blocks.sporeMoss, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice}, {Blocks.darksandTaintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.sporeMoss, Blocks.moss, Blocks.sporeMoss, Blocks.iceSnow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice}, @@ -52,12 +54,48 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float water = 2f / arr[0].length; - float rawHeight(Vec3 position){ position = Tmp.v33.set(position).scl(scl); return (Mathf.pow((float)noise.octaveNoise3D(7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset); } + @Override + public void generateSector(Sector sector){ + + //these always have bases + if(sector.id == 154 || sector.id == 0){ + sector.generateEnemyBase = true; + return; + } + + Ptile tile = sector.tile; + + boolean any = false; + float poles = Math.abs(tile.v.y); + float noise = Noise.snoise3(tile.v.x, tile.v.y, tile.v.z, 0.001f, 0.58f); + + if(noise + poles/7.1 > 0.12 && poles > 0.23){ + any = true; + } + + if(noise < 0.16){ + for(Ptile other : tile.tiles){ + var osec = sector.planet.getSector(other); + + //no sectors near start sector! + if( + osec.id == sector.planet.startSector || //near starting sector + osec.generateEnemyBase && poles < 0.85 || //near other base + (sector.preset != null && noise < 0.11) //near preset + ){ + return; + } + } + } + + sector.generateEnemyBase = any; + } + @Override public float getHeight(Vec3 position){ float height = rawHeight(position); @@ -143,7 +181,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float constraint = 1.3f; float radius = width / 2f / Mathf.sqrt3; int rooms = rand.random(2, 5); - Seq array = new Seq<>(); + Seq roomseq = new Seq<>(); for(int i = 0; i < rooms; i++){ Tmp.v1.trns(rand.random(360f), rand.random(radius / constraint)); @@ -151,13 +189,13 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float ry = (height/2f + Tmp.v1.y); float maxrad = radius - Tmp.v1.len(); float rrad = Math.min(rand.random(9f, maxrad / 2f), 30f); - array.add(new Room((int)rx, (int)ry, (int)rrad)); + roomseq.add(new Room((int)rx, (int)ry, (int)rrad)); } //check positions on the map to place the player spawn. this needs to be in the corner of the map Room spawn = null; Seq enemies = new Seq<>(); - int enemySpawns = rand.chance(0.3) ? 2 : 1; + int enemySpawns = rand.random(1, Math.max((int)(sector.threat * 4), 1)); int offset = rand.nextInt(360); float length = width/2.55f - rand.random(13, 23); int angleStep = 5; @@ -180,13 +218,13 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ } if(waterTiles <= 4 || (i + angleStep >= 360)){ - array.add(spawn = new Room(cx, cy, rand.random(8, 15))); + roomseq.add(spawn = new Room(cx, cy, rand.random(8, 15))); for(int j = 0; j < enemySpawns; j++){ float enemyOffset = rand.range(60f); Tmp.v1.set(cx - width/2, cy - height/2).rotate(180f + enemyOffset).add(width/2, height/2); Room espawn = new Room((int)Tmp.v1.x, (int)Tmp.v1.y, rand.random(8, 15)); - array.add(espawn); + roomseq.add(espawn); enemies.add(espawn); } @@ -194,16 +232,16 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ } } - for(Room room : array){ + for(Room room : roomseq){ erase(room.x, room.y, room.radius); } int connections = rand.random(Math.max(rooms - 1, 1), rooms + 3); for(int i = 0; i < connections; i++){ - array.random(rand).connect(array.random(rand)); + roomseq.random(rand).connect(roomseq.random(rand)); } - for(Room room : array){ + for(Room room : roomseq){ spawn.connect(room); } @@ -230,13 +268,17 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ ores.add(Blocks.oreThorium); } + if(rand.chance(0.25)){ + ores.add(Blocks.oreScrap); + } + FloatSeq frequencies = new FloatSeq(); for(int i = 0; i < ores.size; i++){ - frequencies.add(rand.random(-0.09f, 0.01f) - i * 0.01f); + frequencies.add(rand.random(-0.1f, 0.01f) - i * 0.01f + poles * 0.04f); } pass((x, y) -> { - if(floor.asFloor().isLiquid) return; + if(!floor.asFloor().hasSurface()) return; int offsetX = x - 4, offsetY = y + 23; for(int i = ores.size - 1; i >= 0; i--){ @@ -248,11 +290,11 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ break; } } - }); - for(Room espawn : enemies){ - tiles.getn(espawn.x, espawn.y).setOverlay(Blocks.spawn); - } + if(ore == Blocks.oreScrap && rand.chance(0.33)){ + floor = Blocks.metalFloorDamaged; + } + }); trimDark(); @@ -261,40 +303,183 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ tech(); pass((x, y) -> { - if(floor == Blocks.sporeMoss && rand.chance(0.9)){ - floor = Blocks.moss; - } - - //random stuff - - for(int i = 0; i < 4; i++){ - Tile near = world.tile(x + Geometry.d4[i].x, y + Geometry.d4[i].y); - if(near != null && near.block() != Blocks.air){ - return; + //random moss + if(floor == Blocks.sporeMoss){ + if(Math.abs(0.5f - noise(x - 90, y, 4, 0.8, 65)) > 0.02){ + floor = Blocks.moss; } } - if(rand.chance(0.01) && !floor.asFloor().isLiquid && block == Blocks.air){ - block = dec.get(floor, floor.asFloor().decoration); + //tar + if(floor == Blocks.darksand){ + if(Math.abs(0.5f - noise(x - 40, y, 2, 0.7, 80)) > 0.25f && + Math.abs(0.5f - noise(x, y + sector.id*10, 1, 1, 60)) > 0.41f && !(roomseq.contains(r -> Mathf.within(x, y, r.x, r.y, 15)))){ + floor = Blocks.tar; + ore = Blocks.air; + } + } + + //hotrock tweaks + if(floor == Blocks.hotrock){ + if(Math.abs(0.5f - noise(x - 90, y, 4, 0.8, 80)) > 0.035){ + floor = Blocks.basalt; + }else{ + ore = Blocks.air; + boolean all = true; + for(Point2 p : Geometry.d4){ + Tile other = tiles.get(x + p.x, y + p.y); + if(other == null || (other.floor() != Blocks.hotrock && other.floor() != Blocks.magmarock)){ + all = false; + } + } + if(all){ + floor = Blocks.magmarock; + } + } + }else if(floor != Blocks.basalt && floor != Blocks.ice && floor.asFloor().hasSurface()){ + float noise = noise(x + 782, y, 5, 0.75f, 260f, 1f); + if(noise > 0.67f && !enemies.contains(e -> Mathf.within(x, y, e.x, e.y, 8))){ + if(noise > 0.72f){ + floor = noise > 0.78f ? Blocks.taintedWater : (floor == Blocks.sand ? Blocks.sandWater : Blocks.darksandTaintedWater); + }else{ + floor = (floor == Blocks.sand ? floor : Blocks.darksand); + } + ore = Blocks.air; + } + } + + if(rand.chance(0.0075)){ + //random spore trees + boolean any = false; + boolean all = true; + for(Point2 p : Geometry.d4){ + Tile other = tiles.get(x + p.x, y + p.y); + if(other != null && other.block() == Blocks.air){ + any = true; + }else{ + all = false; + } + } + if(any && ((block == Blocks.snowWall || block == Blocks.iceWall) || (all && block == Blocks.air && floor == Blocks.snow && rand.chance(0.03)))){ + block = rand.chance(0.5) ? Blocks.whiteTree : Blocks.whiteTreeDead; + } + } + + //random stuff + dec: { + for(int i = 0; i < 4; i++){ + Tile near = world.tile(x + Geometry.d4[i].x, y + Geometry.d4[i].y); + if(near != null && near.block() != Blocks.air){ + break dec; + } + } + + if(rand.chance(0.01) && floor.asFloor().hasSurface() && block == Blocks.air){ + block = dec.get(floor, floor.asFloor().decoration); + } } }); + float difficulty = sector.threat; + ints.clear(); + ints.ensureCapacity(width * height / 4); + + int ruinCount = rand.random(-2, 4); + if(ruinCount > 0){ + int padding = 25; + + //create list of potential positions + for(int x = padding; x < width - padding; x++){ + for(int y = padding; y < height - padding; y++){ + Tile tile = tiles.getn(x, y); + if(!tile.solid() && (tile.drop() != null || tile.floor().liquidDrop != null)){ + ints.add(tile.pos()); + } + } + } + + ints.shuffle(rand); + + int placed = 0; + float diffRange = 0.4f; + //try each position + for(int i = 0; i < ints.size && placed < ruinCount; i++){ + int val = ints.items[i]; + int x = Point2.x(val), y = Point2.y(val); + + //do not overwrite player spawn + if(Mathf.within(x, y, spawn.x, spawn.y, 18f)){ + continue; + } + + float range = difficulty + rand.random(diffRange); + + Tile tile = tiles.getn(x, y); + BasePart part = null; + if(tile.overlay().itemDrop != null){ + part = bases.forResource(tile.drop()).getFrac(range); + }else if(tile.floor().liquidDrop != null && rand.chance(0.05)){ + part = bases.forResource(tile.floor().liquidDrop).getFrac(range); + }else if(rand.chance(0.05)){ //ore-less parts are less likely to occur. + part = bases.parts.getFrac(range); + } + + //actually place the part + if(part != null && BaseGenerator.tryPlace(part, x, y, Team.derelict, (cx, cy) -> { + Tile other = tiles.getn(cx, cy); + if(other.floor().hasSurface()){ + other.setOverlay(Blocks.oreScrap); + for(int j = 1; j <= 2; j++){ + for(Point2 p : Geometry.d8){ + Tile t = tiles.get(cx + p.x*j, cy + p.y*j); + if(t != null && t.floor().hasSurface() && rand.chance(j == 1 ? 0.4 : 0.2)){ + t.setOverlay(Blocks.oreScrap); + } + } + } + } + })){ + placed ++; + + int debrisRadius = Math.max(part.schematic.width, part.schematic.height)/2 + 3; + Geometry.circle(x, y, tiles.width, tiles.height, debrisRadius, (cx, cy) -> { + float dst = Mathf.dst(cx, cy, x, y); + float removeChance = Mathf.lerp(0.05f, 0.5f, dst / debrisRadius); + + Tile other = tiles.getn(cx, cy); + if(other.build != null && other.isCenter()){ + if(other.team() == Team.derelict && rand.chance(removeChance)){ + other.remove(); + }else if(rand.chance(0.5)){ + other.build.health = other.build.health - rand.random(other.build.health * 0.9f); + } + } + }); + } + } + } + Schematics.placeLaunchLoadout(spawn.x, spawn.y); - float difficulty = sector.baseCoverage; + for(Room espawn : enemies){ + tiles.getn(espawn.x, espawn.y).setOverlay(Blocks.spawn); + } if(sector.hasEnemyBase()){ basegen.generate(tiles, enemies.map(r -> tiles.getn(r.x, r.y)), tiles.get(spawn.x, spawn.y), state.rules.waveTeam, sector, difficulty); - state.rules.attackMode = true; + state.rules.attackMode = sector.info.attack = true; }else{ - state.rules.winWave = 15 * (int)Math.max(difficulty * 5, 1); + state.rules.winWave = sector.info.winWave = 10 + 5 * (int)Math.max(difficulty * 10, 1); } - state.rules.waves = true; + float waveTimeDec = 0.4f; - //TODO better waves - state.rules.spawns = defaultWaves.get(); + state.rules.waveSpacing = Mathf.lerp(60 * 65 * 2, 60f * 60f * 1f, Math.max(difficulty - waveTimeDec, 0f) / 0.8f); + state.rules.waves = sector.info.waves = true; + state.rules.enemyCoreBuildRadius = 600f; + + state.rules.spawns = Waves.generate(difficulty, new Rand(), state.rules.attackMode); } @Override diff --git a/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java b/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java new file mode 100644 index 0000000000..d74f94e250 --- /dev/null +++ b/core/src/mindustry/maps/planet/TantrosPlanetGenerator.java @@ -0,0 +1,32 @@ +package mindustry.maps.planet; + +import arc.graphics.*; +import arc.math.*; +import arc.math.geom.*; +import mindustry.content.*; +import mindustry.game.*; +import mindustry.maps.generators.*; + +public class TantrosPlanetGenerator extends PlanetGenerator{ + Color c1 = Color.valueOf("5057a6"), c2 = Color.valueOf("272766"), out = new Color(); + + @Override + public float getHeight(Vec3 position){ + return 0; + } + + @Override + public Color getColor(Vec3 position){ + float depth = (float)noise.octaveNoise3D(2, 0.56, 1.7f, position.x, position.y, position.z) / 2f; + return c1.write(out).lerp(c2, Mathf.clamp(Mathf.round(depth, 0.15f))).a(0.6f); + } + + @Override + protected void generate(){ + pass((x, y) -> { + floor = Blocks.deepwater; + }); + + Schematics.placeLaunchLoadout(width / 2, height / 2); + } +} diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index b63a0b17dc..c00ae23fe1 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -2,13 +2,14 @@ package mindustry.mod; import arc.*; import arc.assets.*; +import arc.assets.loaders.SoundLoader.*; import arc.audio.*; import arc.files.*; import arc.func.*; import arc.graphics.*; -import arc.mock.*; +import arc.graphics.g2d.*; +import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.serialization.*; import arc.util.serialization.Json.*; @@ -19,26 +20,42 @@ import mindustry.content.TechTree.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.bullet.*; +import mindustry.entities.effect.*; import mindustry.game.*; import mindustry.game.Objectives.*; import mindustry.gen.*; import mindustry.mod.Mods.*; import mindustry.type.*; import mindustry.world.*; -import mindustry.world.blocks.*; +import mindustry.world.blocks.units.*; +import mindustry.world.blocks.units.UnitFactory.*; import mindustry.world.consumers.*; import mindustry.world.draw.*; import mindustry.world.meta.*; import java.lang.reflect.*; +import static mindustry.Vars.*; + @SuppressWarnings("unchecked") public class ContentParser{ private static final boolean ignoreUnknownFields = true; ObjectMap, ContentType> contentTypes = new ObjectMap<>(); + ObjectSet> implicitNullable = ObjectSet.with(TextureRegion.class, TextureRegion[].class, TextureRegion[][].class); + ObjectMap sounds = new ObjectMap<>(); - ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ - put(Effect.class, (type, data) -> field(Fx.class, data)); + ObjectMap, FieldParser> classParsers = new ObjectMap<>(){{ + put(Effect.class, (type, data) -> { + if(data.isString()){ + return field(Fx.class, data); + } + Class bc = data.has("type") ? resolve(data.getString("type"), "mindustry.entities.effect") : ParticleEffect.class; + data.remove("type"); + Effect result = make(bc); + readFields(result, data); + return result; + }); + put(Interp.class, (type, data) -> field(Interp.class, data)); put(Schematic.class, (type, data) -> { Object result = fieldOpt(Loadouts.class, data); if(result != null){ @@ -74,16 +91,16 @@ public class ContentParser{ }); put(Sound.class, (type, data) -> { if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data); - if(Vars.headless) return new MockSound(); + if(Vars.headless) return new Sound(); String name = "sounds/" + data.asString(); - String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; + String path = Vars.tree.get(name + ".ogg").exists() ? name + ".ogg" : name + ".mp3"; - if(Core.assets.contains(path, Sound.class)) return Core.assets.get(path, Sound.class); - ModLoadingSound sound = new ModLoadingSound(); - AssetDescriptor desc = Core.assets.load(path, Sound.class); - desc.loaded = result -> sound.sound = (Sound)result; + if(sounds.containsKey(path)) return ((SoundParameter)sounds.get(path).params).sound; + var sound = new Sound(); + AssetDescriptor desc = Core.assets.load(path, Sound.class, new SoundParameter(sound)); desc.errored = Throwable::printStackTrace; + sounds.put(path, desc); return sound; }); put(Objectives.Objective.class, (type, data) -> { @@ -169,11 +186,9 @@ public class ContentParser{ readBundle(ContentType.block, name, value); Block block; - boolean exists; if(locate(ContentType.block, name) != null){ block = locate(ContentType.block, name); - exists = true; if(value.has("type")){ throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name); @@ -181,7 +196,6 @@ public class ContentParser{ }else{ //TODO generate dynamically instead of doing.. this Class type; - exists = false; try{ type = resolve(getType(value), @@ -190,6 +204,7 @@ public class ContentParser{ "mindustry.world.blocks.defense", "mindustry.world.blocks.defense.turrets", "mindustry.world.blocks.distribution", + "mindustry.world.blocks.environment", "mindustry.world.blocks.liquid", "mindustry.world.blocks.logic", "mindustry.world.blocks.power", @@ -207,16 +222,8 @@ public class ContentParser{ currentContent = block; - String[] research = {null}; - - //add research tech node - if(value.has("research")){ - research[0] = value.get("research").asString(); - value.remove("research"); - } - read(() -> { - if(value.has("consumes")){ + if(value.has("consumes") && value.get("consumes").isObject()){ for(JsonValue child : value.get("consumes")){ if(child.name.equals("item")){ block.consumes.item(find(ContentType.item, child.asString())); @@ -241,35 +248,8 @@ public class ContentParser{ readFields(block, value, true); - if(block.size > ConstructBlock.maxSize){ - throw new IllegalArgumentException("Blocks cannot be larger than " + ConstructBlock.maxSize); - } - - //add research tech node - if(research[0] != null){ - //TODO only works with blocks - Block parent = find(ContentType.block, research[0]); - TechNode baseNode = exists && TechTree.all.contains(t -> t.content == block) ? TechTree.all.find(t -> t.content == block) : TechTree.create(parent, block); - LoadedMod cur = currentMod; - - postreads.add(() -> { - currentContent = block; - currentMod = cur; - - if(baseNode.parent != null){ - baseNode.parent.children.remove(baseNode); - } - - TechNode parnode = TechTree.all.find(t -> t.content == parent); - if(parnode == null){ - throw new IllegalArgumentException("Block '" + parent.name + "' isn't in the tech tree, but '" + block.name + "' requires it to be researched."); - } - if(!parnode.children.contains(baseNode)){ - parnode.children.add(baseNode); - } - baseNode.parent = parnode; - }); - + if(block.size > maxBlockSize){ + throw new IllegalArgumentException("Blocks cannot be larger than " + maxBlockSize); } //make block visible by default if there are requirements and no visibility set @@ -286,21 +266,98 @@ public class ContentParser{ UnitType unit; if(locate(ContentType.unit, name) == null){ unit = new UnitType(mod + "-" + name); - unit.constructor = Reflect.cons(resolve(Strings.capitalize(getType(value)), "mindustry.gen")); + var typeVal = value.get("type"); + + if(typeVal != null && !typeVal.isString()){ + throw new RuntimeException("Unit '" + name + "' has an incorrect type. Types must be strings."); + } + + unit.constructor = unitType(typeVal); }else{ unit = locate(ContentType.unit, name); } currentContent = unit; - read(() -> readFields(unit, value, true)); + //TODO test this! + read(() -> { + //add reconstructor type + if(value.has("requirements")){ + JsonValue rec = value.remove("requirements"); + + //intermediate class for parsing + class UnitReq{ + public Block block; + public ItemStack[] requirements = {}; + @Nullable + public UnitType previous; + public float time = 60f * 10f; + } + + UnitReq req = parser.readValue(UnitReq.class, rec); + + if(req.block instanceof Reconstructor r){ + if(req.previous != null){ + r.upgrades.add(new UnitType[]{req.previous, unit}); + } + }else if(req.block instanceof UnitFactory f){ + f.plans.add(new UnitPlan(unit, req.time, req.requirements)); + }else{ + throw new IllegalArgumentException("Missing a valid 'block' in 'requirements'"); + } + + } + + if(value.has("controller")){ + unit.defaultController = make(resolve(value.getString("controller"), "mindustry.ai.types")); + } + + //read extra default waves + if(value.has("waves")){ + JsonValue waves = value.remove("waves"); + SpawnGroup[] groups = parser.readValue(SpawnGroup[].class, waves); + for(SpawnGroup group : groups){ + group.type = unit; + } + + Vars.waves.get().addAll(groups); + } + + readFields(unit, value, true); + }); return unit; }, + ContentType.weather, (TypeParser)(mod, name, value) -> { + Weather item; + if(locate(ContentType.weather, name) != null){ + item = locate(ContentType.weather, name); + readBundle(ContentType.weather, name, value); + }else{ + readBundle(ContentType.weather, name, value); + Class type = resolve(getType(value), "mindustry.type.weather"); + item = make(type); + } + currentContent = item; + read(() -> readFields(item, value)); + return item; + }, ContentType.item, parser(ContentType.item, Item::new), ContentType.liquid, parser(ContentType.liquid, Liquid::new) //ContentType.sector, parser(ContentType.sector, SectorPreset::new) ); + private Prov unitType(JsonValue value){ + if(value == null) return UnitEntity::create; + return switch(value.asString()){ + case "flying" -> UnitEntity::create; + case "mech" -> MechUnit::create; + case "legs" -> LegsUnit::create; + case "naval" -> UnitWaterMove::create; + case "payload" -> PayloadUnit::create; + default -> throw new RuntimeException("Invalid unit type: '" + value + "'. Must be 'flying/mech/legs/naval/payload'."); + }; + } + private String getString(JsonValue value, String key){ if(value.has(key)){ return value.getString(key); @@ -323,8 +380,8 @@ public class ContentParser{ private TypeParser parser(ContentType type, Func constructor){ return (mod, name, value) -> { T item; - if(Vars.content.getByName(type, name) != null){ - item = (T)Vars.content.getByName(type, name); + if(locate(type, name) != null){ + item = (T)locate(type, name); readBundle(type, name, value); }else{ readBundle(type, name, value); @@ -440,6 +497,8 @@ public class ContentParser{ } public void markError(Content content, LoadedMod mod, Fi file, Throwable error){ + Log.err("Error for @ / @:\n@\n", content, file, Strings.getStackTrace(error)); + content.minfo.mod = mod; content.minfo.sourceFile = file; content.minfo.error = makeError(error, file); @@ -539,14 +598,16 @@ public class ContentParser{ } void checkNullFields(Object object){ - if(object instanceof Number || object instanceof String || toBeParsed.contains(object)) return; + if(object == null || object instanceof Number || object instanceof String || toBeParsed.contains(object) || object.getClass().getName().startsWith("arc.")) return; parser.getFields(object.getClass()).values().toSeq().each(field -> { try{ if(field.field.getType().isPrimitive()) return; - if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){ - throw new RuntimeException("'" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!"); + if(!field.field.isAnnotationPresent(Nullable.class) && field.field.get(object) == null && !implicitNullable.contains(field.field.getType())){ + throw new RuntimeException("'" + field.field.getName() + "' in " + + ((object.getClass().isAnonymousClass() ? object.getClass().getSuperclass() : object.getClass()).getSimpleName()) + + " is missing! Object = " + object + ", field = (" + field.field.getName() + " = " + field.field.get(object) + ")"); } }catch(Exception e){ throw new RuntimeException(e); @@ -560,6 +621,8 @@ public class ContentParser{ } void readFields(Object object, JsonValue jsonMap){ + JsonValue research = jsonMap.remove("research"); + toBeParsed.remove(object); Class type = object.getClass(); ObjectMap fields = parser.getFields(type); @@ -590,6 +653,57 @@ public class ContentParser{ throw ex; } } + + + if(object instanceof UnlockableContent unlock && research != null){ + + //add research tech node + String researchName; + ItemStack[] customRequirements; + + //research can be a single string or an object with parent and requirements + if(research.isString()){ + researchName = research.asString(); + customRequirements = null; + }else{ + researchName = research.getString("parent"); + customRequirements = research.has("requirements") ? parser.readValue(ItemStack[].class, research.get("requirements")) : null; + } + + //remove old node + TechNode lastNode = TechTree.all.find(t -> t.content == unlock); + if(lastNode != null){ + lastNode.remove(); + } + + TechNode node = new TechNode(null, unlock, customRequirements == null ? unlock.researchRequirements() : customRequirements); + LoadedMod cur = currentMod; + + postreads.add(() -> { + currentContent = unlock; + currentMod = cur; + + //remove old node from parent + if(node.parent != null){ + node.parent.children.remove(node); + } + + + //find parent node. + TechNode parent = TechTree.all.find(t -> t.content.name.equals(researchName) || t.content.name.equals(currentMod.name + "-" + researchName)); + + if(parent == null){ + throw new IllegalArgumentException("Content '" + researchName + "' isn't in the tech tree, but '" + unlock.name + "' requires it to be researched."); + } + + //add this node to the parent + if(!parent.children.contains(node)){ + parent.children.add(node); + } + //reparent the node + node.parent = parent; + }); + } } /** Tries to resolve a class from a list of potential class names. */ diff --git a/core/src/mindustry/mod/ModListing.java b/core/src/mindustry/mod/ModListing.java index 5596853b19..08a1a8e963 100644 --- a/core/src/mindustry/mod/ModListing.java +++ b/core/src/mindustry/mod/ModListing.java @@ -3,6 +3,7 @@ package mindustry.mod; /** Mod listing as a data class. */ public class ModListing{ public String repo, name, author, lastUpdated, description, minGameVersion; + public boolean hasScripts, hasJava; public int stars; @Override @@ -14,6 +15,8 @@ public class ModListing{ ", lastUpdated='" + lastUpdated + '\'' + ", description='" + description + '\'' + ", minGameVersion='" + minGameVersion + '\'' + + ", hasScripts=" + hasScripts + + ", hasJava=" + hasJava + ", stars=" + stars + '}'; } diff --git a/core/src/mindustry/mod/ModLoadingMusic.java b/core/src/mindustry/mod/ModLoadingMusic.java deleted file mode 100644 index 8797456a18..0000000000 --- a/core/src/mindustry/mod/ModLoadingMusic.java +++ /dev/null @@ -1,79 +0,0 @@ -package mindustry.mod; - -import arc.audio.*; -import arc.mock.*; -import arc.util.ArcAnnotate.*; - -public class ModLoadingMusic implements Music{ - public @NonNull Music music = new MockMusic(); - - @Override - public void play(){ - music.play(); - } - - @Override - public void pause(){ - music.pause(); - } - - @Override - public void stop(){ - music.stop(); - } - - @Override - public boolean isPlaying(){ - return music.isPlaying(); - } - - @Override - public boolean isLooping(){ - return music.isLooping(); - } - - @Override - public void setLooping(boolean isLooping){ - music.setLooping(isLooping); - } - - @Override - public float getVolume(){ - return music.getVolume(); - } - - @Override - public void setVolume(float volume){ - music.setVolume(volume); - } - - @Override - public void setPan(float pan, float volume){ - music.setPan(pan, volume); - } - - @Override - public float getPosition(){ - return music.getPosition(); - } - - @Override - public void setPosition(float position){ - music.setPosition(position); - } - - @Override - public void dispose(){ - music.dispose(); - } - - @Override - public void setCompletionListener(OnCompletionListener listener){ - music.setCompletionListener(listener); - } - - @Override - public boolean isDisposed(){ - return music.isDisposed(); - } -} diff --git a/core/src/mindustry/mod/ModLoadingSound.java b/core/src/mindustry/mod/ModLoadingSound.java deleted file mode 100644 index 7bae2f5a6b..0000000000 --- a/core/src/mindustry/mod/ModLoadingSound.java +++ /dev/null @@ -1,135 +0,0 @@ -package mindustry.mod; - -import arc.audio.*; -import arc.math.geom.*; -import arc.mock.*; -import arc.util.ArcAnnotate.*; - -public class ModLoadingSound implements Sound{ - public @NonNull Sound sound = new MockSound(); - - @Override - public float calcPan(float x, float y){ - return sound.calcPan(x, y); - } - - @Override - public float calcVolume(float x, float y){ - return sound.calcVolume(x, y); - } - - @Override - public float calcFalloff(float x, float y){ - return sound.calcFalloff(x, y); - } - - @Override - public int at(float x, float y, float pitch){ - return sound.at(x, y, pitch); - } - - @Override - public int at(float x, float y){ - return sound.at(x, y); - } - - @Override - public int at(Position pos){ - return sound.at(pos); - } - - @Override - public int at(Position pos, float pitch){ - return sound.at(pos, pitch); - } - - @Override - public int play(){ - return sound.play(); - } - - @Override - public int play(float volume){ - return sound.play(volume); - } - - @Override - public int play(float volume, float pitch, float pan){ - return sound.play(volume, pitch, pan); - } - - @Override - public int loop(){ - return sound.loop(); - } - - @Override - public int loop(float volume){ - return sound.loop(volume); - } - - @Override - public int loop(float volume, float pitch, float pan){ - return sound.loop(volume, pitch, pan); - } - - @Override - public void stop(){ - sound.stop(); - } - - @Override - public void pause(){ - sound.pause(); - } - - @Override - public void resume(){ - sound.resume(); - } - - @Override - public void dispose(){ - sound.dispose(); - } - - @Override - public void stop(int soundId){ - sound.stop(soundId); - } - - @Override - public void pause(int soundId){ - sound.pause(soundId); - } - - @Override - public void resume(int soundId){ - sound.resume(soundId); - } - - @Override - public void setLooping(int soundId, boolean looping){ - sound.setLooping(soundId, looping); - } - - @Override - public void setPitch(int soundId, float pitch){ - sound.setPitch(soundId, pitch); - } - - @Override - public void setVolume(int soundId, float volume){ - sound.setVolume(soundId, volume); - } - - @Override - public void setPan(int soundId, float pan, float volume){ - sound.setPan(soundId, pan, volume); - } - - @Override - public boolean isDisposed(){ - return sound.isDisposed(); - } -} diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 9aeee4ab2f..4c6605fbbf 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -11,7 +11,6 @@ import arc.graphics.g2d.TextureAtlas.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; import arc.util.serialization.*; import arc.util.serialization.Jval.*; @@ -25,7 +24,6 @@ import mindustry.type.*; import mindustry.ui.*; import java.io.*; -import java.net.*; import static mindustry.Vars.*; @@ -136,7 +134,7 @@ public class Mods implements Loadable{ }catch(IOException e){ Core.app.post(() -> { Log.err("Error packing images for mod: @", mod.meta.name); - e.printStackTrace(); + Log.err(e); if(!headless) ui.showException(e); }); break; @@ -172,8 +170,7 @@ public class Mods implements Loadable{ //generate new icons for(Seq arr : content.getContentMap()){ arr.each(c -> { - if(c instanceof UnlockableContent && c.minfo.mod != null){ - UnlockableContent u = (UnlockableContent)c; + if(c instanceof UnlockableContent u && c.minfo.mod != null){ u.load(); u.createIcons(packer); } @@ -250,7 +247,7 @@ public class Mods implements Loadable{ mods.add(mod); }catch(Throwable e){ if(e instanceof ClassNotFoundException && e.getMessage().contains("mindustry.plugin.Plugin")){ - Log.info("Plugin @ is outdated and needs to be ported to 6.0! Update its main class to inherit from 'mindustry.mod.Plugin'."); + Log.info("Plugin @ is outdated and needs to be ported to 6.0! Update its main class to inherit from 'mindustry.mod.Plugin'. See https://mindustrygame.github.io/wiki/modding/6-migrationv6/"); }else{ Log.err("Failed to load mod file @. Skipping.", file); Log.err(e); @@ -400,7 +397,7 @@ public class Mods implements Loadable{ d.button("@details", Icon.downOpen, Styles.transt, () -> { new Dialog(""){{ setFillParent(true); - cont.pane(e -> e.add(c.minfo.error).wrap().grow()).grow(); + cont.pane(e -> e.add(c.minfo.error).wrap().grow().labelAlign(Align.center, Align.left)).grow(); cont.row(); cont.button("@ok", Icon.left, this::hide).size(240f, 60f); }}.show(); @@ -632,14 +629,13 @@ public class Mods implements Loadable{ } //make sure the main class exists before loading it; if it doesn't just don't put it there - if(mainFile.exists()){ + if(mainFile.exists() && Core.settings.getBool("mod-" + baseName + "-enabled", true)){ //mobile versions don't support class mods - if(mobile){ - throw new IllegalArgumentException("Java class mods are not supported on mobile."); + if(ios){ + throw new IllegalArgumentException("Java class mods are not supported on iOS."); } - URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - Class main = classLoader.loadClass(mainClass); + Class main = platform.loadJar(sourceFile, mainClass); metas.put(main, meta); mainMod = (Mod)main.getDeclaredConstructor().newInstance(); }else{ @@ -651,6 +647,14 @@ public class Mods implements Loadable{ meta.hidden = true; } + //disallow putting a description after the version + if(meta.version != null){ + int line = meta.version.indexOf('\n'); + if(line != -1){ + meta.version = meta.version.substring(0, line); + } + } + if(!headless){ Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed()); } @@ -681,7 +685,7 @@ public class Mods implements Loadable{ public Seq missingDependencies = new Seq<>(); /** Script files to run. */ public Seq scripts = new Seq<>(); - /** Content with intialization code. */ + /** Content with initialization code. */ public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ public ModState state = ModState.enabled; @@ -712,7 +716,7 @@ public class Mods implements Loadable{ return !erroredContent.isEmpty(); } - /** @return whether this mod is supported by the game verison */ + /** @return whether this mod is supported by the game version */ public boolean isSupported(){ if(isOutdated()) return false; @@ -834,7 +838,7 @@ public class Mods implements Loadable{ /** Mod metadata information.*/ public static class ModMeta{ - public String name, displayName, author, description, version, main, minGameVersion = "0"; + public String name, displayName, author, description, version, main, minGameVersion = "0", repo; public Seq dependencies = Seq.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 1aa260e8fa..6ae9631da1 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -2,9 +2,11 @@ package mindustry.mod; import arc.*; import arc.assets.*; +import arc.assets.loaders.MusicLoader.*; +import arc.assets.loaders.SoundLoader.*; import arc.audio.*; import arc.files.*; -import arc.mock.*; +import arc.func.*; import arc.struct.*; import arc.util.*; import arc.util.Log.*; @@ -22,7 +24,7 @@ public class Scripts implements Disposable{ private final Seq blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org."); - private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio"); + private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio", "systemcursor"); private final Context context; private final Scriptable scope; private boolean errored; @@ -59,12 +61,12 @@ public class Scripts implements Disposable{ if(o instanceof Undefined) o = "undefined"; return String.valueOf(o); }catch(Throwable t){ - return getError(t); + return getError(t, false); } } - private String getError(Throwable t){ - t.printStackTrace(); + private String getError(Throwable t, boolean log){ + if(log) Log.err(t); return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); } @@ -87,33 +89,67 @@ public class Scripts implements Disposable{ } public Sound loadSound(String soundName){ - if(Vars.headless) return new MockSound(); + if(Vars.headless) return new Sound(); String name = "sounds/" + soundName; - String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; + String path = Vars.tree.get(name + ".ogg").exists() ? name + ".ogg" : name + ".mp3"; - if(Core.assets.contains(path, Sound.class)) return Core.assets.get(path, Sound.class); - ModLoadingSound sound = new ModLoadingSound(); - AssetDescriptor desc = Core.assets.load(path, Sound.class); - desc.loaded = result -> sound.sound = (Sound)result; + var sound = new Sound(); + AssetDescriptor desc = Core.assets.load(path, Sound.class, new SoundParameter(sound)); desc.errored = Throwable::printStackTrace; return sound; } public Music loadMusic(String soundName){ - if(Vars.headless) return new MockMusic(); + if(Vars.headless) return new Music(); String name = "music/" + soundName; - String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; + String path = Vars.tree.get(name + ".ogg").exists() ? name + ".ogg" : name + ".mp3"; - if(Core.assets.contains(path, Music.class)) return Core.assets.get(path, Music.class); - ModLoadingMusic sound = new ModLoadingMusic(); - AssetDescriptor desc = Core.assets.load(path, Music.class); - desc.loaded = result -> sound.music = (Music)result; + var music = new Music(); + AssetDescriptor desc = Core.assets.load(path, Music.class, new MusicParameter(music)); desc.errored = Throwable::printStackTrace; - return sound; + return music; + } + + /** Ask the user to select a file to read for a certain purpose like "Please upload a sprite" */ + public void readFile(String purpose, String ext, Cons cons){ + selectFile(true, purpose, ext, fi -> cons.get(fi.readString())); + } + + /** readFile but for a byte[] */ + public void readBinFile(String purpose, String ext, Cons cons){ + selectFile(true, purpose, ext, fi -> cons.get(fi.readBytes())); + } + + /** Ask the user to write a file. */ + public void writeFile(String purpose, String ext, String contents){ + if(contents == null) contents = ""; + final String fContents = contents; + selectFile(false, purpose, ext, fi -> fi.writeString(fContents)); + } + + /** writeFile but for a byte[] */ + public void writeBinFile(String purpose, String ext, byte[] contents){ + if(contents == null) contents = new byte[0]; + final byte[] fContents = contents; + selectFile(false, purpose, ext, fi -> fi.writeBytes(fContents)); + } + + private void selectFile(boolean open, String purpose, String ext, Cons cons){ + purpose = purpose.startsWith("@") ? Core.bundle.get(purpose.substring(1)) : purpose; + //add purpose and extension at the top + String title = Core.bundle.get(open ? "open" : "save") + " - " + purpose + " (." + ext + ")"; + Vars.platform.showFileChooser(open, title, ext, fi -> { + try{ + cons.get(fi); + }catch(Exception e){ + Log.err("Failed to select file '@' for a mod", fi); + Log.err(e); + } + }); } //endregion @@ -138,7 +174,7 @@ public class Scripts implements Disposable{ if(currentMod != null){ file = currentMod.name + "/" + file; } - log(LogLevel.err, file, "" + getError(t)); + log(LogLevel.err, file, "" + getError(t, true)); return false; } } diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index 7e5eb65339..b7d0c451e9 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -3,7 +3,6 @@ package mindustry.net; import arc.*; import arc.func.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.Log.*; import arc.util.pooling.Pool.*; @@ -13,8 +12,6 @@ import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; -import java.io.*; - import static mindustry.Vars.*; import static mindustry.game.EventType.*; @@ -143,11 +140,18 @@ public class Administration{ /** @return whether this action is allowed by the action filters. */ public boolean allowAction(Player player, ActionType type, Tile tile, Cons setter){ + return allowAction(player, type, action -> setter.get(action.set(player, type, tile))); + } + + /** @return whether this action is allowed by the action filters. */ + public boolean allowAction(Player player, ActionType type, Cons setter){ //some actions are done by the server (null player) and thus are always allowed if(player == null) return true; PlayerAction act = Pools.obtain(PlayerAction.class, PlayerAction::new); - setter.get(act.set(player, type, tile)); + act.player = player; + act.type = type; + setter.get(act); for(ActionFilter filter : actionFilters){ if(!filter.allow(act)){ Pools.free(act); @@ -250,8 +254,7 @@ public class Administration{ public boolean unbanPlayerID(String id){ PlayerInfo info = getCreateInfo(id); - if(!info.banned) - return false; + if(!info.banned) return false; info.banned = false; bannedIPs.removeAll(info.ips, false); @@ -300,8 +303,6 @@ public class Administration{ public boolean adminPlayer(String id, String usid){ PlayerInfo info = getCreateInfo(id); - if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) return false; - info.adminUsid = usid; info.admin = true; save(); @@ -444,111 +445,11 @@ public class Administration{ @SuppressWarnings("unchecked") private void load(){ - if(!loadLegacy()){ - //load default data - playerInfo = Core.settings.getJson("player-data", ObjectMap.class, ObjectMap::new); - bannedIPs = Core.settings.getJson("ip-bans", Seq.class, Seq::new); - whitelist = Core.settings.getJson("whitelist-ids", Seq.class, Seq::new); - subnetBans = Core.settings.getJson("banned-subnets", Seq.class, Seq::new); - }else{ - //save over loaded legacy data - save(); - Log.info("Loaded legacy (5.0) server data."); - } - } - - private boolean loadLegacy(){ - try{ - byte[] info = Core.settings.getBytes("player-info"); - byte[] ips = Core.settings.getBytes("banned-ips"); - byte[] whitelist = Core.settings.getBytes("whitelisted"); - byte[] subnet = Core.settings.getBytes("subnet-bans"); - - if(info != null){ - DataInputStream d = new DataInputStream(new ByteArrayInputStream(info)); - int size = d.readInt(); - if(size != 0){ - d.readUTF(); - d.readUTF(); - - for(int i = 0; i < size; i++){ - String mapKey = d.readUTF(); - - PlayerInfo data = new PlayerInfo(); - - data.id = d.readUTF(); - data.lastName = d.readUTF(); - data.lastIP = d.readUTF(); - int ipsize = d.readInt(); - if(ipsize != 0){ - d.readUTF(); - for(int j = 0; j < ipsize; j++){ - data.ips.add(d.readUTF()); - } - } - - int namesize = d.readInt(); - if(namesize != 0){ - d.readUTF(); - for(int j = 0; j < ipsize; j++){ - data.names.add(d.readUTF()); - } - } - //ips, names... - data.adminUsid = d.readUTF(); - data.timesKicked = d.readInt(); - data.timesJoined = d.readInt(); - data.banned = d.readBoolean(); - data.admin = d.readBoolean(); - data.lastKicked = d.readLong(); - - playerInfo.put(mapKey, data); - } - } - Core.settings.remove("player-info"); - } - - if(ips != null){ - DataInputStream d = new DataInputStream(new ByteArrayInputStream(ips)); - int size = d.readInt(); - if(size != 0){ - d.readUTF(); - for(int i = 0; i < size; i++){ - bannedIPs.add(d.readUTF()); - } - } - Core.settings.remove("banned-ips"); - } - - if(whitelist != null){ - DataInputStream d = new DataInputStream(new ByteArrayInputStream(whitelist)); - int size = d.readInt(); - if(size != 0){ - d.readUTF(); - for(int i = 0; i < size; i++){ - this.whitelist.add(d.readUTF()); - } - } - Core.settings.remove("whitelisted"); - } - - if(subnet != null){ - DataInputStream d = new DataInputStream(new ByteArrayInputStream(subnet)); - int size = d.readInt(); - if(size != 0){ - d.readUTF(); - for(int i = 0; i < size; i++){ - subnetBans.add(d.readUTF()); - } - } - Core.settings.remove("subnet-bans"); - } - - return info != null || ips != null || whitelist != null || subnet != null; - }catch(Throwable e){ - e.printStackTrace(); - } - return false; + //load default data + playerInfo = Core.settings.getJson("player-data", ObjectMap.class, ObjectMap::new); + bannedIPs = Core.settings.getJson("ip-bans", Seq.class, Seq::new); + whitelist = Core.settings.getJson("whitelist-ids", Seq.class, Seq::new); + subnetBans = Core.settings.getJson("banned-subnets", Seq.class, Seq::new); } /** Server configuration definition. Each config value can be a string, boolean or number. */ @@ -578,7 +479,9 @@ public class Administration{ autosave("Whether the periodically save the map when playing.", false), autosaveAmount("The maximum amount of autosaves. Older ones get replaced.", 10), autosaveSpacing("Spacing between autosaves in seconds.", 60 * 5), - debug("Enable debug logging", false, () -> Log.setLogLevel(debug() ? LogLevel.debug : LogLevel.info)); + debug("Enable debug logging", false, () -> { + Log.level = debug() ? LogLevel.debug : LogLevel.info; + }); public static final Config[] all = values(); @@ -695,9 +598,9 @@ public class Administration{ /** Defines a (potentially dangerous) action that a player has done in the world. * These objects are pooled; do not cache them! */ public static class PlayerAction implements Poolable{ - public @NonNull Player player; - public @NonNull ActionType type; - public @NonNull Tile tile; + public Player player; + public ActionType type; + public @Nullable Tile tile; /** valid for block placement events only */ public @Nullable Block block; @@ -710,6 +613,9 @@ public class Administration{ public @Nullable Item item; public int itemAmount; + /** valid for unit-type events only, and even in that case may be null. */ + public @Nullable Unit unit; + public PlayerAction set(Player player, ActionType type, Tile tile){ this.player = player; this.type = type; @@ -717,6 +623,13 @@ public class Administration{ return this; } + public PlayerAction set(Player player, ActionType type, Unit unit){ + this.player = player; + this.type = type; + this.unit = unit; + return this; + } + @Override public void reset(){ item = null; @@ -726,11 +639,12 @@ public class Administration{ type = null; tile = null; block = null; + unit = null; } } public enum ActionType{ - breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem + breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem, control, command } } diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index bd4f948f89..da3cf9fb42 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -68,7 +68,7 @@ public class ArcNetProvider implements NetProvider{ } }); - server = new Server(8192, 8192, new PacketSerializer()); + server = new Server(32768, 8192, new PacketSerializer()); server.setMulticast(multicastGroup, multicastPort); server.setDiscoveryHandler((address, handler) -> { ByteBuffer buffer = NetworkIO.writeServerData(); @@ -361,8 +361,7 @@ public class ArcNetProvider implements NetProvider{ } public void writeFramework(ByteBuffer buffer, FrameworkMessage message){ - if(message instanceof Ping){ - Ping p = (Ping)message; + if(message instanceof Ping p){ buffer.put((byte)0); buffer.putInt(p.id); buffer.put(p.isReply ? 1 : (byte)0); @@ -370,12 +369,10 @@ public class ArcNetProvider implements NetProvider{ buffer.put((byte)1); }else if(message instanceof KeepAlive){ buffer.put((byte)2); - }else if(message instanceof RegisterUDP){ - RegisterUDP p = (RegisterUDP)message; + }else if(message instanceof RegisterUDP p){ buffer.put((byte)3); buffer.putInt(p.connectionID); - }else if(message instanceof RegisterTCP){ - RegisterTCP p = (RegisterTCP)message; + }else if(message instanceof RegisterTCP p){ buffer.put((byte)4); buffer.putInt(p.connectionID); } diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java index a30308ed52..6bc9e296f4 100644 --- a/core/src/mindustry/net/BeControl.java +++ b/core/src/mindustry/net/BeControl.java @@ -23,7 +23,7 @@ import static mindustry.Vars.*; /** Handles control of bleeding edge builds. */ public class BeControl{ - private static final int updateInterval = 60 * 1; + private static final int updateInterval = 60; private AsyncExecutor executor = new AsyncExecutor(1); private boolean checkUpdates = true; @@ -45,10 +45,12 @@ public class BeControl{ }, updateInterval, updateInterval); } - if(System.getProperties().contains("becopy")){ + if(System.getProperties().containsKey("becopy")){ try{ Fi dest = Fi.get(System.getProperty("becopy")); Fi self = Fi.get(BeControl.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); + + for(Fi file : self.parent().findAll(f -> !f.equals(self))) file.delete(); self.copyTo(dest); }catch(Throwable e){ diff --git a/core/src/mindustry/net/CrashSender.java b/core/src/mindustry/net/CrashSender.java index 2d31c25ca8..0d2204890c 100644 --- a/core/src/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -2,9 +2,9 @@ package mindustry.net; import arc.*; import arc.Net.*; -import arc.struct.*; import arc.files.*; import arc.func.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import arc.util.serialization.*; @@ -19,21 +19,21 @@ import java.text.*; import java.util.*; import static arc.Core.*; -import static mindustry.Vars.mods; import static mindustry.Vars.net; +import static mindustry.Vars.*; public class CrashSender{ public static String createReport(String error){ - String report = "Oh no, Mindustry crashed!\n"; - if(mods.list().size == 0){ - report += "Please report this at https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md\n\n"; + String report = "Mindustry has crashed. How unfortunate.\n"; + if(mods.list().size == 0 && Version.build != -1){ + report += "Report this at " + Vars.reportIssueURL + "\n\n"; } return report + "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n" + "OS: " + System.getProperty("os.name") + " x" + (OS.is64Bit ? "64" : "32") + "\n" + "Java Version: " + System.getProperty("java.version") + "\n" + "Java Architecture: " + System.getProperty("sun.arch.data.model") + "\n" - + mods.list().size + " Mods: " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version) + + mods.list().size + " Mods" + (mods.list().isEmpty() ? "" : ": " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version)) + "\n\n" + error; } diff --git a/core/src/mindustry/net/Host.java b/core/src/mindustry/net/Host.java index fe80c879ce..41f8c8811e 100644 --- a/core/src/mindustry/net/Host.java +++ b/core/src/mindustry/net/Host.java @@ -1,6 +1,6 @@ package mindustry.net; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.*; import mindustry.game.*; diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index af8d2ff739..dc7431d0d4 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -4,7 +4,6 @@ import arc.*; import arc.func.*; import arc.net.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.pooling.*; import mindustry.gen.*; @@ -58,7 +57,7 @@ public class Net{ t = t.getCause(); } - String baseError = Strings.getFinalMesage(e); + String baseError = Strings.getFinalMessage(e); String error = baseError == null ? "" : baseError.toLowerCase(); String type = t.getClass().toString().toLowerCase(); @@ -238,12 +237,10 @@ public class Net{ */ public void handleClientReceived(Object object){ - if(object instanceof StreamBegin){ - StreamBegin b = (StreamBegin)object; + if(object instanceof StreamBegin b){ streams.put(b.id, currentStream = new StreamBuilder(b)); - }else if(object instanceof StreamChunk){ - StreamChunk c = (StreamChunk)object; + }else if(object instanceof StreamChunk c){ StreamBuilder builder = streams.get(c.id); if(builder == null){ throw new RuntimeException("Received stream chunk without a StreamBegin beforehand!"); @@ -257,8 +254,9 @@ public class Net{ }else if(clientListeners.get(object.getClass()) != null){ if(clientLoaded || ((object instanceof Packet) && ((Packet)object).isImportant())){ - if(clientListeners.get(object.getClass()) != null) + if(clientListeners.get(object.getClass()) != null){ clientListeners.get(object.getClass()).get(object); + } Pools.free(object); }else if(!((object instanceof Packet) && ((Packet)object).isUnimportant())){ packetQueue.add(object); @@ -276,8 +274,9 @@ public class Net{ public void handleServerReceived(NetConnection connection, Object object){ if(serverListeners.get(object.getClass()) != null){ - if(serverListeners.get(object.getClass()) != null) + if(serverListeners.get(object.getClass()) != null){ serverListeners.get(object.getClass()).get(connection, object); + } Pools.free(object); }else{ Log.err("Unhandled packet type: '@'!", object.getClass()); diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index 976bea5a74..cf1e47bbbd 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -1,7 +1,6 @@ package mindustry.net; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 68e5f02f80..fbcea51267 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -1,10 +1,12 @@ package mindustry.net; -import arc.Core; +import arc.*; import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.content.*; import mindustry.core.*; +import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.io.*; @@ -22,6 +24,18 @@ public class NetworkIO{ public static void writeWorld(Player player, OutputStream os){ try(DataOutputStream stream = new DataOutputStream(os)){ + //write all researched content to rules if hosting + if(state.isCampaign()){ + state.rules.researched.clear(); + for(ContentType type : ContentType.all){ + for(Content c : content.getBy(type)){ + if(c instanceof UnlockableContent u && u.unlocked() && TechTree.get(u) != null){ + state.rules.researched.add(u.name); + } + } + } + } + stream.writeUTF(JsonIO.write(state.rules)); SaveIO.getSaveWriter().writeStringMap(stream, state.map.tags); diff --git a/core/src/mindustry/net/Packet.java b/core/src/mindustry/net/Packet.java index 9058637a66..2aaa2a05c0 100644 --- a/core/src/mindustry/net/Packet.java +++ b/core/src/mindustry/net/Packet.java @@ -1,8 +1,8 @@ package mindustry.net; -import arc.util.pooling.Pool.Poolable; +import arc.util.pooling.Pool.*; -import java.nio.ByteBuffer; +import java.nio.*; public interface Packet extends Poolable{ default void read(ByteBuffer buffer){} diff --git a/core/src/mindustry/net/Registrator.java b/core/src/mindustry/net/Registrator.java index c0368497f5..2280d016e0 100644 --- a/core/src/mindustry/net/Registrator.java +++ b/core/src/mindustry/net/Registrator.java @@ -1,7 +1,7 @@ package mindustry.net; -import arc.struct.ObjectIntMap; -import arc.func.Prov; +import arc.func.*; +import arc.struct.*; import mindustry.net.Packets.*; public class Registrator{ diff --git a/core/src/mindustry/net/ServerGroup.java b/core/src/mindustry/net/ServerGroup.java new file mode 100644 index 0000000000..15bd8fa4d3 --- /dev/null +++ b/core/src/mindustry/net/ServerGroup.java @@ -0,0 +1,28 @@ +package mindustry.net; + +import arc.*; + +public class ServerGroup{ + public String name; + public String[] addresses; + + public ServerGroup(String name, String[] addresses){ + this.name = name; + this.addresses = addresses; + } + + public ServerGroup(){ + } + + public boolean hidden(){ + return Core.settings.getBool(key() + "-hidden", false); + } + + public void setHidden(boolean hidden){ + Core.settings.put(key() + "-hidden", hidden); + } + + String key(){ + return "server-" + (name.isEmpty() ? addresses.length == 0 ? "" : addresses[0] : name); + } +} diff --git a/core/src/mindustry/net/Streamable.java b/core/src/mindustry/net/Streamable.java index 18171b6cbf..52ce5d36d8 100644 --- a/core/src/mindustry/net/Streamable.java +++ b/core/src/mindustry/net/Streamable.java @@ -1,6 +1,6 @@ package mindustry.net; -import mindustry.net.Packets.StreamBegin; +import mindustry.net.Packets.*; import java.io.*; diff --git a/core/src/mindustry/net/WorldReloader.java b/core/src/mindustry/net/WorldReloader.java new file mode 100644 index 0000000000..23515aae87 --- /dev/null +++ b/core/src/mindustry/net/WorldReloader.java @@ -0,0 +1,59 @@ +package mindustry.net; + +import arc.struct.*; +import arc.struct.Seq.*; +import mindustry.gen.*; + +import static mindustry.Vars.*; + +/** Handles player state for sending to every connected player*/ +public class WorldReloader{ + Seq players = new Seq<>(); + boolean wasServer = false; + boolean began = false; + + /** Begins reloading the world. Sends world begin packets to each user and stores player state. + * If the current client is not a server, this resets state and disconnects. */ + public void begin(){ + //don't begin twice + if(began) return; + + if(wasServer = net.server()){ + players.clear(); + + for(Player p : Groups.player){ + if(p.isLocal()) continue; + + players.add(p); + p.clearUnit(); + } + + logic.reset(); + + Call.worldDataBegin(); + }else{ + net.reset(); + logic.reset(); + } + + began = true; + } + + /** Ends reloading the world. Sends world data to each player. + * If the current client was not a server, does nothing.*/ + public void end(){ + if(wasServer){ + for(Player p : players){ + if(p.con == null) continue; + + boolean wasAdmin = p.admin; + p.reset(); + p.admin = wasAdmin; + if(state.rules.pvp){ + p.team(netServer.assignTeam(p, new SeqIterable<>(players))); + } + netServer.sendWorldData(p); + } + } + } +} diff --git a/core/src/mindustry/type/AmmoTypes.java b/core/src/mindustry/type/AmmoTypes.java index 0dafe2ba8b..761bcbc8d0 100644 --- a/core/src/mindustry/type/AmmoTypes.java +++ b/core/src/mindustry/type/AmmoTypes.java @@ -1,6 +1,5 @@ package mindustry.type; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.content.*; import mindustry.ctype.*; @@ -42,15 +41,15 @@ public class AmmoTypes implements ContentList{ @Override public void resupply(Unit unit){ float range = unit.hitSize + 60f; - Tile closest = Vars.indexer.findClosestFlag(unit.x, unit.y, unit.team, BlockFlag.powerResupply); + Tile closest = Vars.indexer.findClosestFlag(unit.x, unit.y, unit.team, BlockFlag.battery); if(closest != null && closest.build != null && unit.within(closest.build, range) && closest.build.power != null){ - Building build = closest.build; + var build = closest.build; if(build.block.consumes.hasPower() && build.block.consumes.getPower().buffered){ float amount = closest.build.power.status * build.block.consumes.getPower().capacity; - float powerPerAmmo = totalPower / unit.type().ammoCapacity; - float ammoRequired = unit.type().ammoCapacity - unit.ammo; + float powerPerAmmo = totalPower / unit.type.ammoCapacity; + float ammoRequired = unit.type.ammoCapacity - unit.ammo; float powerRequired = ammoRequired * powerPerAmmo; float powerTaken = Math.min(amount, powerRequired); @@ -66,7 +65,7 @@ public class AmmoTypes implements ContentList{ } public static class ItemAmmoType extends AmmoType{ - public @NonNull Item item; + public Item item; public ItemAmmoType(Item item){ this.item = item; diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index 6558636343..18cbdff886 100644 --- a/core/src/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -1,16 +1,15 @@ package mindustry.type; -import arc.struct.*; import arc.graphics.*; -import arc.scene.ui.layout.*; +import arc.struct.*; import mindustry.ctype.*; -import mindustry.ui.*; import mindustry.world.blocks.environment.*; +import mindustry.world.meta.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class Item extends UnlockableContent{ - public final Color color; + public Color color; /** how explosive this item is. */ public float explosiveness = 0f; @@ -25,6 +24,8 @@ public class Item extends UnlockableContent{ * 1 cost = 1 tick added to build time */ public float cost = 1f; + /** if true, this item is of lowest priority to drills. */ + public boolean lowPriority; public Item(String name, Color color){ super(name); @@ -36,8 +37,10 @@ public class Item extends UnlockableContent{ } @Override - public void displayInfo(Table table){ - ContentDisplay.displayItem(table, this); + public void setStats(){ + stats.addPercent(Stat.explosiveness, explosiveness); + stats.addPercent(Stat.flammability, flammability); + stats.addPercent(Stat.radioactivity, radioactivity); } @Override diff --git a/core/src/mindustry/type/ItemSeq.java b/core/src/mindustry/type/ItemSeq.java index 9926e1d3b9..4fb7409796 100644 --- a/core/src/mindustry/type/ItemSeq.java +++ b/core/src/mindustry/type/ItemSeq.java @@ -21,6 +21,19 @@ public class ItemSeq implements Iterable, Serializable{ stacks.each(this::add); } + public void checkNegative(){ + for(int i = 0; i < values.length; i++){ + if(values[i] < 0) values[i] = 0; + } + } + + public ItemSeq copy(){ + ItemSeq out = new ItemSeq(); + out.total = total; + System.arraycopy(values, 0, out.values, 0, values.length); + return out; + } + public void each(ItemConsumer cons){ for(int i = 0; i < values.length; i++){ if(values[i] != 0){ @@ -42,10 +55,29 @@ public class ItemSeq implements Iterable, Serializable{ return out; } + public void min(int number){ + for(Item item : Vars.content.items()){ + set(item, Math.min(get(item), number)); + } + } + public boolean has(Item item){ return values[item.id] > 0; } + public boolean has(ItemSeq seq){ + for(int i = 0; i < values.length; i++){ + if(seq.values[i] > values[i]){ + return false; + } + } + return true; + } + + public boolean has(Item item, int amount){ + return values[item.id] >= amount; + } + public int get(Item item){ return values[item.id]; } @@ -98,14 +130,16 @@ public class ItemSeq implements Iterable, Serializable{ @Override public void read(Json json, JsonValue jsonData){ + total = 0; for(Item item : Vars.content.items()){ values[item.id] = jsonData.getInt(item.name, 0); + total += values[item.id]; } } @Override public String toString(){ - return JsonIO.write(this); + return JsonIO.print(JsonIO.write(this)); } @Override diff --git a/core/src/mindustry/type/ItemStack.java b/core/src/mindustry/type/ItemStack.java index a8a765c4df..26cffe97b4 100644 --- a/core/src/mindustry/type/ItemStack.java +++ b/core/src/mindustry/type/ItemStack.java @@ -1,7 +1,8 @@ package mindustry.type; -import arc.struct.Seq; -import mindustry.content.Items; +import arc.math.*; +import arc.struct.*; +import mindustry.content.*; public class ItemStack implements Comparable{ public static final ItemStack[] empty = {}; @@ -35,10 +36,10 @@ public class ItemStack implements Comparable{ return other != null && other.item == item && other.amount == amount; } - public static ItemStack[] mult(ItemStack[] stacks, int amount){ + public static ItemStack[] mult(ItemStack[] stacks, float amount){ ItemStack[] copy = new ItemStack[stacks.length]; for(int i = 0; i < copy.length; i++){ - copy[i] = new ItemStack(stacks[i].item, stacks[i].amount * amount); + copy[i] = new ItemStack(stacks[i].item, Mathf.round(stacks[i].amount * amount)); } return copy; } @@ -64,6 +65,13 @@ public class ItemStack implements Comparable{ return item.compareTo(itemStack.item); } + @Override + public boolean equals(Object o){ + if(this == o) return true; + if(!(o instanceof ItemStack stack)) return false; + return amount == stack.amount && item == stack.item; + } + @Override public String toString(){ return "ItemStack{" + diff --git a/core/src/mindustry/type/Liquid.java b/core/src/mindustry/type/Liquid.java index f968a0f68a..e62805e60b 100644 --- a/core/src/mindustry/type/Liquid.java +++ b/core/src/mindustry/type/Liquid.java @@ -1,15 +1,14 @@ package mindustry.type; import arc.graphics.*; -import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; -import mindustry.ui.*; +import mindustry.world.meta.*; public class Liquid extends UnlockableContent{ /** Color used in pipes and on the ground. */ - public final @NonNull Color color; + public Color color; /** Color used in bars. */ public @Nullable Color barColor; /** Color used to draw lights. Note that the alpha channel is used to dictate brightness. */ @@ -46,8 +45,12 @@ public class Liquid extends UnlockableContent{ } @Override - public void displayInfo(Table table){ - ContentDisplay.displayLiquid(table, this); + public void setStats(){ + stats.addPercent(Stat.explosiveness, explosiveness); + stats.addPercent(Stat.flammability, flammability); + stats.addPercent(Stat.temperature, temperature); + stats.addPercent(Stat.heatCapacity, heatCapacity); + stats.addPercent(Stat.viscosity, viscosity); } @Override diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 651c5c7923..f12cdb5c53 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -5,9 +5,7 @@ import arc.func.*; import arc.graphics.*; import arc.math.*; import arc.math.geom.*; -import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.ctype.*; @@ -20,11 +18,11 @@ import static mindustry.Vars.*; public class Planet extends UnlockableContent{ /** Default spacing between planet orbits in world units. */ - private static final float orbitSpacing = 6f; + private static final float orbitSpacing = 9f; /** intersect() temp var. */ private static final Vec3 intersectResult = new Vec3(); /** Mesh used for rendering. Created on load() - will be null on the server! */ - public PlanetMesh mesh; + public @Nullable PlanetMesh mesh; /** Position in global coordinates. Will be 0,0,0 until the Universe updates it. */ public Vec3 position = new Vec3(); /** Grid used for the sectors on the planet. Null if this planet can't be landed on. */ @@ -32,9 +30,11 @@ public class Planet extends UnlockableContent{ /** Generator that will make the planet. Can be null for planets that don't need to be landed on. */ public @Nullable PlanetGenerator generator; /** Array of sectors; directly maps to tiles in the grid. */ - public @NonNull Seq sectors; + public Seq sectors; /** Radius of this planet's sphere. Does not take into account sattelites. */ public float radius; + /** Atmosphere radius adjustment parameters. */ + public float atmosphereRadIn = 0, atmosphereRadOut = 0.3f; /** Orbital radius around the sun. Do not change unless you know exactly what you are doing.*/ public float orbitRadius; /** Total radius of this planet and all its children. */ @@ -47,10 +47,14 @@ public class Planet extends UnlockableContent{ public float sectorApproxRadius; /** Whether this planet is tidally locked relative to its parent - see https://en.wikipedia.org/wiki/Tidal_locking */ public boolean tidalLock = false; + /** Whether or not this planet is listed in the planet access UI. **/ + public boolean accessible = true; /** The default starting sector displayed to the map dialog. */ public int startSector = 0; /** Whether the bloom render effect is enabled. */ public boolean bloom = false; + /** Whether this planet is displayed. */ + public boolean visible = true; /** For suns, this is the color that shines on other planets. Does nothing for children. */ public Color lightColor = Color.white.cpy(); /** Atmosphere tint for landable planets. */ @@ -60,7 +64,7 @@ public class Planet extends UnlockableContent{ /** Parent body that this planet orbits around. If null, this planet is considered to be in the middle of the solar system.*/ public @Nullable Planet parent; /** The root parent of the whole solar system this planet is in. */ - public @NonNull Planet solarSystem; + public Planet solarSystem; /** All planets orbiting this one, in ascending order of radius. */ public Seq children = new Seq<>(); /** Sattelites orbiting this planet. */ @@ -176,17 +180,17 @@ public class Planet extends UnlockableContent{ public void updateBaseCoverage(){ for(Sector sector : sectors){ float sum = 1f; - for(Sector other : sector.inRange(2)){ + for(Sector other : sector.near()){ if(other.generateEnemyBase){ - sum += 1f; + sum += 0.9f; } } if(sector.hasEnemyBase()){ - sum += 2f; + sum += 0.88f; } - sector.baseCoverage = Mathf.clamp(sum / 5f); + sector.threat = sector.preset == null ? Math.min(sum / 5f, 1.2f) : Mathf.clamp(sector.preset.difficulty / 10f); } } @@ -203,6 +207,10 @@ public class Planet extends UnlockableContent{ @Override public void init(){ + for(Sector sector : sectors){ + sector.loadInfo(); + } + if(generator != null){ Noise.setSeed(id + 1); @@ -254,13 +262,16 @@ public class Planet extends UnlockableContent{ return true; } - @Override - public void displayInfo(Table table){ - - } - @Override public ContentType getContentType(){ return ContentType.planet; } + + public boolean visible(){ + return visible; + } + + public void draw(Mat3D projection, Mat3D transform){ + mesh.render(projection, transform); + } } diff --git a/core/src/mindustry/type/Publishable.java b/core/src/mindustry/type/Publishable.java index 8c8b32edde..274b5f3f7c 100644 --- a/core/src/mindustry/type/Publishable.java +++ b/core/src/mindustry/type/Publishable.java @@ -1,14 +1,15 @@ package mindustry.type; -import arc.struct.*; import arc.files.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; +import arc.util.*; import mindustry.*; /** Defines a piece of content that can be published on the Workshop. */ public interface Publishable{ /** @return workshop item ID, or null if this isn't on the workshop. */ - @Nullable String getSteamID(); + @Nullable + String getSteamID(); /** adds a steam ID to this item once it's published. should save the item to make sure this change is persisted. */ void addSteamID(String id); /** removes the item ID; called when the item isn't found. */ @@ -16,7 +17,8 @@ public interface Publishable{ /** @return default title of the listing. */ String steamTitle(); /** @return standard steam listing description, may be null. this is editable by users after release.*/ - @Nullable String steamDescription(); + @Nullable + String steamDescription(); /** @return the tag that this content has. e.g. 'schematic' or 'map'. */ String steamTag(); /** @return a folder with everything needed for this piece of content in it; does not need to be a copy. */ diff --git a/core/src/mindustry/type/Satellite.java b/core/src/mindustry/type/Satellite.java index 4b2546c651..a30a44c136 100644 --- a/core/src/mindustry/type/Satellite.java +++ b/core/src/mindustry/type/Satellite.java @@ -1,12 +1,10 @@ package mindustry.type; -import arc.util.ArcAnnotate.*; - /** Any object that is orbiting a planet. */ public class Satellite{ - public @NonNull Planet planet; + public Planet planet; - public Satellite(@NonNull Planet orbiting){ + public Satellite(Planet orbiting){ this.planet = orbiting; } } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 19bc03f874..dda4cc6a6c 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -2,21 +2,24 @@ package mindustry.type; import arc.*; import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; import arc.math.geom.*; -import arc.struct.ObjectIntMap.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; import mindustry.game.Saves.*; +import mindustry.game.*; import mindustry.graphics.g3d.PlanetGrid.*; +import mindustry.ui.*; +import mindustry.world.modules.*; import static mindustry.Vars.*; /** A small section of a planet. */ public class Sector{ - private static final Seq tmpSeq1 = new Seq<>(), tmpSeq2 = new Seq<>(), tmpSeq3 = new Seq<>(); - private static final ObjectSet tmpSet = new ObjectSet<>(); + private static final Seq tmpSeq1 = new Seq<>(); public final SectorRect rect; public final Plane plane; @@ -26,14 +29,12 @@ public class Sector{ public @Nullable SaveSlot save; public @Nullable SectorPreset preset; + public SectorInfo info = new SectorInfo(); /** Number 0-1 indicating the difficulty based on nearby bases. */ - public float baseCoverage; + public float threat; public boolean generateEnemyBase; - //TODO implement a dynamic launch period - public int launchPeriod = 10; - public Sector(Planet planet, Ptile tile){ this.planet = planet; this.tile = tile; @@ -42,74 +43,91 @@ public class Sector{ this.id = tile.id; } - public Seq inRange(int range){ - //TODO cleanup/remove - if(true){ - tmpSeq1.clear(); - neighbors(tmpSeq1::add); - - return tmpSeq1; - } - + public Seq near(){ tmpSeq1.clear(); - tmpSeq2.clear(); - tmpSet.clear(); - - tmpSeq1.add(this); - tmpSet.add(this); - for(int i = 0; i < range; i++){ - while(!tmpSeq1.isEmpty()){ - Sector sec = tmpSeq1.pop(); - tmpSet.add(sec); - sec.neighbors(other -> { - if(tmpSet.add(other)){ - tmpSeq2.add(other); - } - }); - } - tmpSeq1.clear(); - tmpSeq1.addAll(tmpSeq2); + for(Ptile tile : tile.tiles){ + tmpSeq1.add(planet.getSector(tile)); } - tmpSeq3.clear().addAll(tmpSeq2); - return tmpSeq3; + return tmpSeq1; } - public void neighbors(Cons cons){ + public void near(Cons cons){ for(Ptile tile : tile.tiles){ cons.get(planet.getSector(tile)); } } + /** Displays threat as a formatted string. */ + public String displayThreat(){ + float step = 0.25f; + String color = Tmp.c1.set(Color.white).lerp(Color.scarlet, Mathf.round(threat, step)).toString(); + String[] threats = {"low", "medium", "high", "extreme", "eradication"}; + int index = Math.min((int)(threat / step), threats.length - 1); + return "[#" + color + "]" + Core.bundle.get("threat." + threats[index]); + } + /** @return whether this sector can be landed on at all. - * Only sectors adjacent to non-wave sectors can be landed on. - * TODO also preset sectors*/ + * Only sectors adjacent to non-wave sectors can be landed on. */ public boolean unlocked(){ return hasBase() || (preset != null && preset.alwaysUnlocked); } + public void saveInfo(){ + Core.settings.putJson(planet.name + "-s-" + id + "-info", info); + } + + public void loadInfo(){ + info = Core.settings.getJson(planet.name + "-s-" + id + "-info", SectorInfo.class, SectorInfo::new); + } + + /** Removes any sector info. */ + public void clearInfo(){ + info = new SectorInfo(); + Core.settings.remove(planet.name + "-s-" + id + "-info"); + } + + public float getProductionScale(){ + return Math.max(1f - info.damage, 0); + } + + public boolean isAttacked(){ + if(isBeingPlayed()) return state.rules.waves; + return save != null && info.waves && info.hasCore; + } + /** @return whether the player has a base here. */ public boolean hasBase(){ - return save != null && !save.meta.tags.getBool("nocores"); + return save != null && info.hasCore && !(Vars.state.isGame() && Vars.state.rules.sector == this && state.gameOver); } /** @return whether the enemy has a generated base here. */ public boolean hasEnemyBase(){ - return generateEnemyBase && (save == null || save.meta.rules.waves); + return ((generateEnemyBase && preset == null) || (preset != null && preset.captureWave == 0)) && (save == null || info.attack); } public boolean isBeingPlayed(){ //after the launch dialog, a sector is no longer considered being played - return Vars.state.isGame() && Vars.state.rules.sector == this && !Vars.state.launched && !Vars.state.gameOver; + return Vars.state.isGame() && Vars.state.rules.sector == this && !Vars.state.gameOver && !net.client(); + } + + public String name(){ + if(preset != null && info.name == null) return preset.localizedName; + return info.name == null ? id + "" : info.name; + } + + public void setName(String name){ + info.name = name; + saveInfo(); + } + + @Nullable + public TextureRegion icon(){ + return info.icon == null ? null : Fonts.getLargeIcon(info.icon); } public boolean isCaptured(){ - return save != null && !save.meta.rules.waves; - } - - /** @return whether waves are present - if true, any bases here will be attacked. */ - public boolean hasWaves(){ - return save != null && save.meta.rules.waves; + return save != null && !info.waves; } public boolean hasSave(){ @@ -134,149 +152,50 @@ public class Sector{ return res % 2 == 0 ? res : res + 1; } - //TODO implement - public boolean isLaunchWave(int wave){ - return metCondition() && wave % launchPeriod == 0; - } - - public boolean metCondition(){ - //TODO implement - return false; - } - - //TODO this should be stored in a more efficient structure, and be updated each turn - public ItemSeq getExtraItems(){ - return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new); - } - - public void setExtraItems(ItemSeq stacks){ - Core.settings.putJson(key("extra-items"), stacks); - } - - public void addItem(Item item, int amount){ - removeItem(item, -amount); + public void removeItems(ItemSeq items){ + ItemSeq copy = items.copy(); + copy.each((i, a) -> copy.set(i, -a)); + addItems(copy); } public void removeItem(Item item, int amount){ + ItemSeq seq = new ItemSeq(); + seq.add(item, -amount); + addItems(seq); + } + + public void addItems(ItemSeq items){ + if(isBeingPlayed()){ if(state.rules.defaultTeam.core() != null){ - state.rules.defaultTeam.items().remove(item, amount); + ItemModule storage = state.rules.defaultTeam.items(); + int cap = state.rules.defaultTeam.core().storageCapacity; + items.each((item, amount) -> storage.add(item, Math.min(cap - storage.get(item), amount))); } - }else{ - ItemSeq recv = getExtraItems(); - - recv.remove(item, amount); - - setExtraItems(recv); + }else if(hasBase()){ + items.each((item, amount) -> info.items.add(item, Math.min(info.storageCapacity - info.items.get(item), amount))); + info.items.checkNegative(); + saveInfo(); } } - public ItemSeq calculateItems(){ + /** @return items currently in this sector, taking into account playing state. */ + public ItemSeq items(){ ItemSeq count = new ItemSeq(); //for sectors being played on, add items directly if(isBeingPlayed()){ - count.add(state.rules.defaultTeam.items()); - }else if(save != null){ + if(state.rules.defaultTeam.core() != null) count.add(state.rules.defaultTeam.items()); + }else{ //add items already present - for(Entry ent : save.meta.secinfo.coreItems){ - count.add(ent.key, ent.value); - } - - count.add(calculateReceivedItems()); - - int capacity = save.meta.secinfo.storageCapacity; - - //validation - for(Item item : content.items()){ - //ensure positive items - if(count.get(item) < 0) count.set(item, 0); - //cap the items - if(count.get(item) > capacity) count.set(item, capacity); - } + count.add(info.items); } return count; } - public ItemSeq calculateReceivedItems(){ - ItemSeq count = new ItemSeq(); - - if(save != null){ - long seconds = getSecondsPassed(); - - //add produced items - save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds))); - - //add received items - getExtraItems().each(count::add); - } - - return count; - } - - //TODO these methods should maybe move somewhere else and/or be contained in a data object - public void setSpawnPosition(int position){ - put("spawn-position", position); - } - - /** Only valid after this sector has been landed on once. */ - //TODO move to sector data? - public int getSpawnPosition(){ - return Core.settings.getInt(key("spawn-position"), Point2.pack(world.width() / 2, world.height() / 2)); - } - - /** @return time spent in this sector this turn in ticks. */ - public float getTimeSpent(){ - //return currently counting time spent if being played on - if(isBeingPlayed()) return state.secinfo.internalTimeSpent; - - //else return the stored value - return getStoredTimeSpent(); - } - - public void setTimeSpent(float time){ - put("time-spent", time); - - //update counting time - if(isBeingPlayed()){ - state.secinfo.internalTimeSpent = time; - } - } - - public String displayTimeRemaining(){ - float amount = Vars.turnDuration - getTimeSpent(); - int seconds = (int)(amount / 60); - int sf = seconds % 60; - return (seconds / 60) + ":" + (sf < 10 ? "0" : "") + sf; - } - - /** @return the stored amount of time spent in this sector this turn in ticks. - * Do not use unless you know what you're doing. */ - public float getStoredTimeSpent(){ - return Core.settings.getFloat(key("time-spent")); - } - - public void setSecondsPassed(long number){ - put("seconds-passed", number); - } - - /** @return how much time has passed in this sector without the player resuming here. - * Used for resource production calculations. */ - public long getSecondsPassed(){ - return Core.settings.getLong(key("seconds-passed")); - } - - private String key(String key){ - return planet.name + "-s-" + id + "-" + key; - } - - private void put(String key, Object value){ - Core.settings.put(key(key), value); - } - public String toString(){ - return planet.name + "#" + id; + return planet.name + "#" + id + " (" + name() + ")"; } /** Projects this sector onto a 4-corner square for use in map gen. diff --git a/core/src/mindustry/type/SectorPreset.java b/core/src/mindustry/type/SectorPreset.java index e67492dafa..997e014c63 100644 --- a/core/src/mindustry/type/SectorPreset.java +++ b/core/src/mindustry/type/SectorPreset.java @@ -2,8 +2,6 @@ package mindustry.type; import arc.func.*; import arc.graphics.g2d.*; -import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; @@ -11,18 +9,24 @@ import mindustry.maps.generators.*; import mindustry.ui.*; public class SectorPreset extends UnlockableContent{ - public @NonNull FileMapGenerator generator; - public @NonNull Planet planet; - public @NonNull Sector sector; + public FileMapGenerator generator; + public Planet planet; + public Sector sector; public int captureWave = 0; public Cons rules = rules -> rules.winWave = captureWave; + public boolean useAI = true; + /** Difficulty, 0-10. */ + public float difficulty; + public boolean addStartingItems = false; public SectorPreset(String name, Planet planet, int sector){ super(name); - this.generator = new FileMapGenerator(name); + this.generator = new FileMapGenerator(name, this); this.planet = planet; + sector %= planet.sectors.size; this.sector = planet.sectors.get(sector); + inlineDescription = false; planet.preset(sector, this); } @@ -34,12 +38,7 @@ public class SectorPreset extends UnlockableContent{ @Override public boolean isHidden(){ - return true; - } - - //neither of these are implemented, as zones are not displayed in a normal fashion... yet - @Override - public void displayInfo(Table table){ + return description == null; } @Override diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index fda8dbbbf2..a02cb28978 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -13,8 +13,8 @@ import mindustry.gen.*; public class StatusEffect extends MappableContent{ /** Damage dealt by the unit with the effect. */ public float damageMultiplier = 1f; - /** Unit armor multiplier. */ - public float armorMultiplier = 1f; + /** Unit health multiplier. */ + public float healthMultiplier = 1f; /** Unit speed multiplier */ public float speedMultiplier = 1f; /** Unit speed multiplier */ @@ -52,11 +52,11 @@ public class StatusEffect extends MappableContent{ if(damage > 0){ unit.damageContinuousPierce(damage); }else if(damage < 0){ //heal unit - unit.heal(damage * Time.delta); + unit.heal(-1f * damage * Time.delta); } if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ - Tmp.v1.rnd(unit.type().hitSize /2f); + Tmp.v1.rnd(unit.type.hitSize /2f); effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y); } } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 8f89385640..e41050118f 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -11,7 +11,6 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -19,7 +18,6 @@ import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.abilities.*; -import mindustry.entities.bullet.*; import mindustry.entities.units.*; import mindustry.game.*; import mindustry.gen.*; @@ -30,28 +28,32 @@ import mindustry.world.blocks.environment.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.units.*; import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; import static mindustry.Vars.*; public class UnitType extends UnlockableContent{ - public static final float shadowTX = -12, shadowTY = -13, shadowColor = Color.toFloatBits(0, 0, 0, 0.22f), outlineSpace = 0.01f; + public static final float shadowTX = -12, shadowTY = -13, outlineSpace = 0.01f; private static final Vec2 legOffset = new Vec2(); /** If true, the unit is always at elevation 1. */ public boolean flying; - public @NonNull Prov constructor; - public @NonNull Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); + public Prov constructor; + public Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); public float speed = 1.1f, boostMultiplier = 1f, rotateSpeed = 5f, baseRotateSpeed = 5f; public float drag = 0.3f, accel = 0.5f, landShake = 0f, rippleScale = 1f, fallSpeed = 0.018f; - public float health = 200f, range = -1, armor = 0f; + public float health = 200f, range = -1, armor = 0f, maxRange = -1f; public float crashDamageMultiplier = 1f; public boolean targetAir = true, targetGround = true; - public boolean faceTarget = true, rotateShooting = true, isCounted = true, lowAltitude = false; + public boolean faceTarget = true, rotateShooting = true, isCounted = true, lowAltitude = false, circleTarget = false; public boolean canBoost = false; public boolean destructibleWreck = true; public float groundLayer = Layer.groundUnit; public float payloadCapacity = 8; - public int commandLimit = 24; + public float aimDst = -1f; + public float buildBeamOffset = 3.8f; + public int commandLimit = 8; public float visualElevation = -1f; public boolean allowLegStep = false; public boolean hovering = false; @@ -59,12 +61,16 @@ public class UnitType extends UnlockableContent{ public Effect fallEffect = Fx.fallSmoke; public Effect fallThrusterEffect = Fx.fallSmoke; public Seq abilities = new Seq<>(); + public BlockFlag targetFlag = BlockFlag.generator; public int legCount = 4, legGroupSize = 2; public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0, legPairOffset = 0, legLengthScl = 1f, kinematicScl = 1f, maxStretch = 1.75f; public float legSplashDamage = 0f, legSplashRange = 5; public boolean flipBackLegs = true; + public int ammoResupplyAmount = 10; + public float ammoResupplyRange = 100f; + public float mechSideSway = 0.54f, mechFrontSway = 0.1f; public float mechStride = -1f; public float mechStepShake = -1f; @@ -75,8 +81,12 @@ public class UnitType extends UnlockableContent{ public int ammoCapacity = -1; public AmmoType ammoType = AmmoTypes.copper; public int mineTier = -1; - public float buildSpeed = 1f, mineSpeed = 1f; + public float buildSpeed = -1f, mineSpeed = 1f; + public Sound mineSound = Sounds.minebeam; + public float mineSoundVolume = 0.6f; + /** This is a VERY ROUGH estimate of unit DPS. */ + public float dpsEstimate = -1; public float clipSize = -1; public boolean canDrown = true; public float engineOffset = 5f, engineSize = 2.5f; @@ -97,9 +107,11 @@ public class UnitType extends UnlockableContent{ public Seq weapons = new Seq<>(); public TextureRegion baseRegion, legRegion, region, shadowRegion, cellRegion, - occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion; + softShadowRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion; public TextureRegion[] wreckRegions; + protected @Nullable ItemStack[] cachedRequirements; + public UnitType(String name){ super(name); @@ -113,7 +125,7 @@ public class UnitType extends UnlockableContent{ public Unit create(Team team){ Unit unit = constructor.get(); unit.team = team; - unit.type(this); + unit.setType(this); unit.ammo = ammoCapacity; //fill up on ammo upon creation unit.elevation = flying ? 1f : 0; unit.heal(); @@ -152,14 +164,38 @@ public class UnitType extends UnlockableContent{ table.table(bars -> { bars.defaults().growX().height(20f).pad(4); - bars.add(new Bar("blocks.health", Pal.health, unit::healthf).blink(Color.white)); + bars.add(new Bar("stat.health", Pal.health, unit::healthf).blink(Color.white)); bars.row(); if(state.rules.unitAmmo){ - bars.add(new Bar(ammoType.icon + " " + Core.bundle.get("blocks.ammo"), ammoType.barColor, () -> unit.ammo / ammoCapacity)); + bars.add(new Bar(ammoType.icon + " " + Core.bundle.get("stat.ammo"), ammoType.barColor, () -> unit.ammo / ammoCapacity)); bars.row(); } + + for(Ability ability : unit.abilities){ + ability.displayBars(unit, bars); + } + + if(unit instanceof Payloadc payload){ + bars.add(new Bar("stat.payloadcapacity", Pal.items, () -> payload.payloadUsed() / unit.type().payloadCapacity)); + bars.row(); + + var count = new float[]{-1}; + bars.table().update(t -> { + if(count[0] != payload.payloadUsed()) { + payload.contentInfo(t, 8 * 2, 270); + count[0] = payload.payloadUsed(); + } + }).growX().left(); + } }).growX(); + + if(unit.controller() instanceof LogicAI){ + table.row(); + table.add(Blocks.microProcessor.emoji() + " " + Core.bundle.get("units.processorcontrol")).growX().left(); + table.row(); + table.label(() -> Iconc.settings + " " + (long)unit.flag + "").color(Color.lightGray).growX().wrap().left(); + } table.row(); } @@ -168,8 +204,7 @@ public class UnitType extends UnlockableContent{ public void getDependencies(Cons cons){ //units require reconstructors being researched for(Block block : content.blocks()){ - if(block instanceof Reconstructor){ - Reconstructor r = (Reconstructor)block; + if(block instanceof Reconstructor r){ for(UnitType[] recipe : r.upgrades){ //result of reconstruction is this, so it must be a dependency if(recipe[1] == this){ @@ -178,12 +213,52 @@ public class UnitType extends UnlockableContent{ } } } + + for(ItemStack stack : researchRequirements()){ + cons.get(stack.item); + } } - @Override - public void displayInfo(Table table){ - ContentDisplay.displayUnit(table, this); + public void setStats(){ + Unit inst = constructor.get(); + + stats.add(Stat.health, health); + stats.add(Stat.speed, speed); + stats.add(Stat.itemCapacity, itemCapacity); + stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks); + stats.add(Stat.commandLimit, commandLimit); + + if(abilities.any()){ + var unique = new ObjectSet(); + + for(Ability a : abilities){ + if(unique.add(a.localized())){ + stats.add(Stat.abilities, a.localized()); + } + } + } + + stats.add(Stat.flying, flying); + + if(!flying){ + stats.add(Stat.canBoost, canBoost); + } + + if(mineTier >= 1){ + stats.addPercent(Stat.mineSpeed, mineSpeed); + stats.add(Stat.mineTier, new BlockFilterValue(b -> b instanceof Floor f && f.itemDrop != null && f.itemDrop.hardness <= mineTier && !f.playerUnmineable)); + } + if(buildSpeed > 0){ + stats.addPercent(Stat.buildSpeed, buildSpeed); + } + if(inst instanceof Payloadc){ + stats.add(Stat.payloadCapacity, (payloadCapacity / (tilesize * tilesize)), StatUnit.blocksSquared); + } + + if(weapons.any()){ + stats.add(Stat.weapons, new WeaponListValue(this, weapons)); + } } @CallSuper @@ -203,14 +278,23 @@ public class UnitType extends UnlockableContent{ singleTarget = weapons.size <= 1; if(itemCapacity < 0){ - itemCapacity = Math.max(Mathf.round(hitSize * 7, 20), 20); + itemCapacity = Math.max(Mathf.round((int)(hitSize * 4.3), 10), 10); } //set up default range if(range < 0){ range = Float.MAX_VALUE; for(Weapon weapon : weapons){ - range = Math.min(range, weapon.bullet.range() + hitSize /2f); + range = Math.min(range, weapon.bullet.range() + hitSize / 2f); + maxRange = Math.max(maxRange, weapon.bullet.range() + hitSize / 2f); + } + } + + if(maxRange < 0){ + maxRange = 0f; + + for(Weapon weapon : weapons){ + maxRange = Math.max(maxRange, weapon.bullet.range() + hitSize / 2f); } } @@ -218,12 +302,16 @@ public class UnitType extends UnlockableContent{ mechStride = 4f + (hitSize -8f)/2.1f; } + if(aimDst < 0){ + aimDst = weapons.contains(w -> !w.rotate) ? hitSize * 2f : hitSize / 2f; + } + if(mechStepShake < 0){ mechStepShake = Mathf.round((hitSize - 11f) / 9f); mechStepParticles = hitSize > 15f; } - canHeal = weapons.contains(w -> w.bullet instanceof HealBulletType); + canHeal = weapons.contains(w -> w.bullet.healPercent > 0f); //add mirrored weapon variants Seq mapped = new Seq<>(); @@ -256,6 +344,17 @@ public class UnitType extends UnlockableContent{ ammoCapacity = Math.max(1, (int)(shotsPerSecond * targetSeconds)); } + + //calculate estimated DPS for one target based on weapons + if(dpsEstimate < 0){ + dpsEstimate = weapons.sumf(w -> (w.bullet.estimateDPS() / w.reload) * w.shots * 60f); + + //suicide enemy + if(weapons.contains(w -> w.bullet.killShooter)){ + //scale down DPS to be insignificant + dpsEstimate /= 25f; + } + } } @CallSuper @@ -270,7 +369,7 @@ public class UnitType extends UnlockableContent{ legBaseRegion = Core.atlas.find(name + "-leg-base", name + "-leg"); baseRegion = Core.atlas.find(name + "-base"); cellRegion = Core.atlas.find(name + "-cell", Core.atlas.find("power-cell")); - occlusionRegion = Core.atlas.find("circle-shadow"); + softShadowRegion = Core.atlas.find("circle-shadow"); outlineRegion = Core.atlas.find(name + "-outline"); shadowRegion = icon(Cicon.full); @@ -282,17 +381,21 @@ public class UnitType extends UnlockableContent{ @Override public ItemStack[] researchRequirements(){ + if(cachedRequirements != null){ + return cachedRequirements; + } + ItemStack[] stacks = null; //calculate costs based on reconstructors or factories found - Block rec = content.blocks().find(b -> b instanceof Reconstructor && Structs.contains(((Reconstructor)b).upgrades, u -> u[1] == this)); + Block rec = content.blocks().find(b -> b instanceof Reconstructor re && re.upgrades.contains(u -> u[1] == this)); - if(rec != null && rec.consumes.has(ConsumeType.item) && rec.consumes.get(ConsumeType.item) instanceof ConsumeItems){ - stacks = ((ConsumeItems)rec.consumes.get(ConsumeType.item)).items; + if(rec != null && rec.consumes.has(ConsumeType.item) && rec.consumes.get(ConsumeType.item) instanceof ConsumeItems ci){ + stacks = ci.items; }else{ - UnitFactory factory = (UnitFactory)content.blocks().find(u -> u instanceof UnitFactory && Structs.contains(((UnitFactory)u).plans, p -> p.unit == this)); + UnitFactory factory = (UnitFactory)content.blocks().find(u -> u instanceof UnitFactory uf && uf.plans.contains(p -> p.unit == this)); if(factory != null){ - stacks = Structs.find(factory.plans, p -> p.unit == this).requirements; + stacks = factory.plans.find(p -> p.unit == this).requirements; } } @@ -302,6 +405,8 @@ public class UnitType extends UnlockableContent{ out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50))); } + cachedRequirements = out; + return out; } @@ -317,7 +422,7 @@ public class UnitType extends UnlockableContent{ public void draw(Unit unit){ Mechc mech = unit instanceof Mechc ? (Mechc)unit : null; - float z = unit.elevation > 0.5f ? (lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit) : groundLayer + Mathf.clamp(hitSize /4000f, 0, 0.01f); + float z = unit.elevation > 0.5f ? (lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit) : groundLayer + Mathf.clamp(hitSize / 4000f, 0, 0.01f); if(unit.controller().isBeingControlled(player.unit())){ drawControl(unit); @@ -352,8 +457,7 @@ public class UnitType extends UnlockableContent{ drawPayload((Unit & Payloadc)unit); } - //TODO - drawOcclusion(unit); + drawSoftShadow(unit); Draw.z(z - outlineSpace); @@ -409,17 +513,17 @@ public class UnitType extends UnlockableContent{ } public void drawShadow(Unit unit){ - Draw.color(shadowColor); + Draw.color(Pal.shadow); float e = Math.max(unit.elevation, visualElevation); Draw.rect(shadowRegion, unit.x + shadowTX * e, unit.y + shadowTY * e, unit.rotation - 90); Draw.color(); } - public void drawOcclusion(Unit unit){ + public void drawSoftShadow(Unit unit){ Draw.color(0, 0, 0, 0.4f); float rad = 1.6f; float size = Math.max(region.width, region.height) * Draw.scl; - Draw.rect(occlusionRegion, unit, size * rad, size * rad); + Draw.rect(softShadowRegion, unit, size * rad, size * rad); Draw.color(); } @@ -427,10 +531,10 @@ public class UnitType extends UnlockableContent{ applyColor(unit); //draw back items - if(unit.hasItem() && unit.itemTime > 0.01f){ - float size = (itemSize + Mathf.absin(Time.time(), 5f, 1f)) * unit.itemTime; + if(unit.item() != null && unit.itemTime > 0.01f){ + float size = (itemSize + Mathf.absin(Time.time, 5f, 1f)) * unit.itemTime; - Draw.mixcol(Pal.accent, Mathf.absin(Time.time(), 5f, 0.5f)); + Draw.mixcol(Pal.accent, Mathf.absin(Time.time, 5f, 0.5f)); Draw.rect(unit.item().icon(Cicon.medium), unit.x + Angles.trnsx(unit.rotation + 180f, itemOffsetY), unit.y + Angles.trnsy(unit.rotation + 180f, itemOffsetY), @@ -442,7 +546,7 @@ public class UnitType extends UnlockableContent{ Lines.circle( unit.x + Angles.trnsx(unit.rotation + 180f, itemOffsetY), unit.y + Angles.trnsy(unit.rotation + 180f, itemOffsetY), - (3f + Mathf.absin(Time.time(), 5f, 1f)) * unit.itemTime); + (3f + Mathf.absin(Time.time, 5f, 1f)) * unit.itemTime); if(unit.isLocal() && !renderer.pixelator.enabled()){ Fonts.outline.draw(unit.stack.amount + "", @@ -464,20 +568,20 @@ public class UnitType extends UnlockableContent{ if(unit instanceof Trailc){ Trail trail = ((Trailc)unit).trail(); - trail.draw(unit.team.color, (engineSize + Mathf.absin(Time.time(), 2f, engineSize / 4f) * scale) * trailScl); + trail.draw(unit.team.color, (engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f) * scale) * trailScl); } Draw.color(unit.team.color); Fill.circle( unit.x + Angles.trnsx(unit.rotation + 180, offset), unit.y + Angles.trnsy(unit.rotation + 180, offset), - (engineSize + Mathf.absin(Time.time(), 2f, engineSize / 4f)) * scale + (engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f)) * scale ); Draw.color(Color.white); Fill.circle( unit.x + Angles.trnsx(unit.rotation + 180, offset - 1f), unit.y + Angles.trnsy(unit.rotation + 180, offset - 1f), - (engineSize + Mathf.absin(Time.time(), 2f, engineSize / 4f)) / 2f * scale + (engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f)) / 2f * scale ); Draw.color(); } @@ -494,8 +598,8 @@ public class UnitType extends UnlockableContent{ float wx = unit.x + Angles.trnsx(rotation, weapon.x, weapon.y) + Angles.trnsx(weaponRotation, 0, recoil), wy = unit.y + Angles.trnsy(rotation, weapon.x, weapon.y) + Angles.trnsy(weaponRotation, 0, recoil); - if(weapon.occlusion > 0){ - Drawf.shadow(wx, wy, weapon.occlusion); + if(weapon.shadow > 0){ + Drawf.shadow(wx, wy, weapon.shadow); } if(weapon.outlineRegion.found()){ @@ -558,7 +662,7 @@ public class UnitType extends UnlockableContent{ } public Color cellColor(Unit unit){ - return Tmp.c1.set(Color.black).lerp(unit.team.color, unit.healthf() + Mathf.absin(Time.time(), Math.max(unit.healthf() * 5f, 1f), 1f - unit.healthf())); + return Tmp.c1.set(Color.black).lerp(unit.team.color, unit.healthf() + Mathf.absin(Time.time, Math.max(unit.healthf() * 5f, 1f), 1f - unit.healthf())); } public void drawLight(Unit unit){ @@ -594,7 +698,7 @@ public class UnitType extends UnlockableContent{ if(leg.moving && visualElevation > 0){ float scl = visualElevation; float elev = Mathf.slope(1f - leg.stage) * scl; - Draw.color(shadowColor); + Draw.color(Pal.shadow); Draw.rect(footRegion, leg.base.x + shadowTX * elev, leg.base.y + shadowTY * elev, position.angleTo(leg.base)); Draw.color(); } @@ -616,7 +720,6 @@ public class UnitType extends UnlockableContent{ } } - //TODO should be below/above legs if(baseRegion.found()){ Draw.rect(baseRegion, unit.x, unit.y, rotation - 90); } diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 2734dc3fca..f98150c85d 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -4,7 +4,6 @@ import arc.*; import arc.audio.*; import arc.graphics.*; import arc.graphics.g2d.*; -import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.bullet.*; @@ -14,9 +13,9 @@ import mindustry.io.*; public class Weapon{ /** displayed weapon region */ - public String name; + public String name = ""; /** bullet shot */ - public @NonNull BulletType bullet; + public BulletType bullet; /** shell ejection effect */ public Effect ejectEffect = Fx.none; /** whether to create a flipped copy of this weapon upon initialization. default: true */ @@ -51,8 +50,8 @@ public class Weapon{ public float x = 5f, y = 0f; /** random spread on the X axis */ public float xRand = 0f; - /** radius of occlusion drawn under the weapon; <0 to diable */ - public float occlusion = -1f; + /** radius of shadow drawn under the weapon; <0 to disable */ + public float shadow = -1f; /** fraction of velocity that is random */ public float velocityRnd = 0f; /** delay in ticks between shots */ @@ -63,6 +62,8 @@ public class Weapon{ public float shootCone = 5f; /** ticks to cool down the heat region */ public float cooldownTime = 20f; + /** random sound pitch range */ + public float soundPitchMin = 0.8f, soundPitchMax = 1f; /** whether shooter rotation is ignored when shooting. */ public boolean ignoreRotation = false; /** min velocity required for this weapon to shoot */ @@ -71,8 +72,10 @@ public class Weapon{ public int otherSide = -1; /** sound used for shooting */ public Sound shootSound = Sounds.pew; + /** sound used for weapons that have a delay */ + public Sound chargeSound = Sounds.none; /** sound played when there is nothing to shoot */ - public Sound noAmmoSound = Sounds.click; + public Sound noAmmoSound = Sounds.noammo; /** displayed region (autoloaded) */ public TextureRegion region; /** heat region, must be same size as region (optional) */ diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 5e7eedc6bc..113b1a18af 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -1,24 +1,32 @@ package mindustry.type; +import arc.*; +import arc.audio.*; import arc.func.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; -import arc.scene.ui.layout.*; import arc.util.*; +import arc.util.noise.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.*; import mindustry.world.blocks.*; import static mindustry.Vars.*; -public abstract class Weather extends UnlockableContent{ +public class Weather extends UnlockableContent{ /** Default duration of this weather event in ticks. */ - public float duration = 9f * Time.toMinutes; + public float duration = 10f * Time.toMinutes; + public float opacityMultiplier = 1f; public Attributes attrs = new Attributes(); + public Sound sound = Sounds.none; + public float soundVol = 0.1f, soundVolMin = 0f; + public float soundVolOscMag = 0f, soundVolOscScl = 20f; //internals public Rand rand = new Rand(); @@ -53,12 +61,17 @@ public abstract class Weather extends UnlockableContent{ return entity; } + @Nullable + public WeatherState instance(){ + return Groups.weather.find(w -> w.weather() == this); + } + public boolean isActive(){ - return Groups.weather.find(w -> w.weather() == this) != null; + return instance() != null; } public void remove(){ - Entityc e = Groups.weather.find(w -> w.weather() == this); + var e = instance(); if(e != null) e.remove(); } @@ -80,6 +93,11 @@ public abstract class Weather extends UnlockableContent{ state.effectTimer -= Time.delta; } } + + if(!headless && sound != Sounds.none){ + float noise = soundVolOscMag > 0 ? (float)Math.abs(Noise.rawNoise(Time.time / soundVolOscScl)) * soundVolOscMag : 0; + control.sound.loop(sound, Math.max((soundVol + noise) * state.opacity, soundVolMin)); + } } public void drawOver(WeatherState state){ @@ -90,9 +108,136 @@ public abstract class Weather extends UnlockableContent{ } - @Override - public void displayInfo(Table table){ - //do not + public void drawParticles(TextureRegion region, Color color, + float sizeMin, float sizeMax, + float density, float intensity, float opacity, + float windx, float windy, + float minAlpha, float maxAlpha, + float sinSclMin, float sinSclMax, float sinMagMin, float sinMagMax){ + 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(sizeMax * 1.5f); + Core.camera.bounds(Tmp.r2); + int total = (int)(Tmp.r1.area() / density * intensity); + Draw.color(color, opacity); + + for(int i = 0; i < total; i++){ + float scl = rand.random(0.5f, 1f); + float scl2 = rand.random(0.5f, 1f); + float size = rand.random(sizeMin, sizeMax); + 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(minAlpha, maxAlpha); + + x += Mathf.sin(y, rand.random(sinSclMin, sinSclMax), rand.random(sinMagMin, sinMagMax)); + + 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).overlaps(Tmp.r2)){ + Draw.alpha(alpha * opacity); + Draw.rect(region, x, y, size, size); + } + } + } + + public void drawRain(float sizeMin, float sizeMax, float xspeed, float yspeed, float density, float intensity, float stroke, Color color){ + float padding = sizeMax*0.9f; + + 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 * intensity); + Lines.stroke(stroke); + float alpha = Draw.getColor().a; + Draw.color(color); + + for(int i = 0; i < total; i++){ + float scl = rand.random(0.5f, 1f); + float scl2 = rand.random(0.5f, 1f); + float size = rand.random(sizeMin, sizeMax); + 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).overlaps(Tmp.r2)){ + Draw.alpha(tint); + Lines.lineAngle(x, y, Angles.angle(xspeed * scl2, - yspeed * scl), size/2f); + } + } + } + + public void drawSplashes(TextureRegion[] splashes, float padding, float density, float intensity, float opacity, float timeScale, float stroke, Color color, Liquid splasher){ + 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 * intensity) / 2; + Lines.stroke(stroke); + + float t = Time.time / timeScale; + + 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); + + //only create splashes on specific liquid. + if(tile != null && tile.floor().liquidDrop == splasher){ + Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.5f).a(opacity)); + Draw.rect(splashes[(int)(life * (splashes.length - 1))], x, y); + }else if(tile != null && tile.floor().liquidDrop == null && !tile.floor().solid){ + Draw.color(color); + Draw.alpha(Mathf.slope(life) * 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)); + } + } + } + } + } + + public void drawNoise(Texture noise, Color color, float noisescl, float opacity, float baseSpeed, float intensity, float vwindx, float vwindy, float offset){ + Draw.alpha(opacity); + Draw.tint(color); + + float speed = baseSpeed * intensity; + float windx = vwindx * speed, windy = vwindy * speed; + + float scale = 1f / noisescl; + float scroll = Time.time * scale + offset; + 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); } @Override @@ -119,10 +264,12 @@ public abstract class Weather extends UnlockableContent{ public float cooldown; /** Intensity of the weather produced. */ public float intensity = 1f; + /** If true, this weather is always active. */ + public boolean always = false; /** Creates a weather entry with some approximate weather values. */ public WeatherEntry(Weather weather){ - this(weather, weather.duration * 1f, weather.duration * 3f, weather.duration / 2f, weather.duration * 1.5f); + this(weather, weather.duration * 2f, weather.duration * 6f, weather.duration / 2f, weather.duration * 1.5f); } public WeatherEntry(Weather weather, float minFrequency, float maxFrequency, float minDuration, float maxDuration){ @@ -174,17 +321,17 @@ public abstract class Weather extends UnlockableContent{ @Override public void draw(){ - if(renderer.weatherAlpha() > 0.0001f){ + if(renderer.weatherAlpha() > 0.0001f && renderer.drawWeather && Core.settings.getBool("showweather")){ Draw.draw(Layer.weather, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); + Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); weather.drawOver(self()); Draw.reset(); }); Draw.draw(Layer.debris, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); + Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); weather.drawUnder(self()); Draw.reset(); }); diff --git a/core/src/mindustry/type/weather/ParticleWeather.java b/core/src/mindustry/type/weather/ParticleWeather.java new file mode 100644 index 0000000000..b8e5b6e8ba --- /dev/null +++ b/core/src/mindustry/type/weather/ParticleWeather.java @@ -0,0 +1,90 @@ +package mindustry.type.weather; + +import arc.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.type.*; + +public class ParticleWeather extends Weather{ + public String particleRegion = "circle-shadow"; + public Color color = Color.white.cpy(); + public TextureRegion region; + public float yspeed = -2f, xspeed = 0.25f, padding = 16f, sizeMin = 2.4f, sizeMax = 12f, density = 1200f, minAlpha = 1f, maxAlpha = 1f, force = 0, noiseScale = 2000f, baseSpeed = 6.1f; + public float sinSclMin = 30f, sinSclMax = 80f, sinMagMin = 1f, sinMagMax = 7f; + + public Color noiseColor = color; + public boolean drawNoise = false, drawParticles = true, useWindVector = false; + public int noiseLayers = 1; + public float noiseLayerSpeedM = 1.1f, noiseLayerAlphaM = 0.8f, noiseLayerSclM = 0.99f, noiseLayerColorM = 1f; + public String noisePath = "noiseAlpha"; + public @Nullable Texture noise; + + public ParticleWeather(String name){ + super(name); + } + + @Override + public void load(){ + super.load(); + + region = Core.atlas.find(particleRegion); + + //load noise texture + //TODO mod support + if(drawNoise && Core.assets != null){ + Core.assets.load("sprites/" + noisePath + ".png", Texture.class); + } + } + + @Override + public void update(WeatherState state){ + float speed = force * state.intensity; + if(speed > 0.001f){ + 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){ + + float windx, windy; + if(useWindVector){ + float speed = baseSpeed * state.intensity; + windx = state.windVector.x * speed; + windy = state.windVector.y * speed; + }else{ + windx = this.xspeed; + windy = this.yspeed; + } + + if(drawNoise){ + if(noise == null){ + noise = Core.assets.get("sprites/" + noisePath + ".png", Texture.class); + noise.setWrap(TextureWrap.repeat); + noise.setFilter(TextureFilter.linear); + } + + float sspeed = 1f, sscl = 1f, salpha = 1f, offset = 0f; + Color col = Tmp.c1.set(noiseColor); + for(int i = 0; i < noiseLayers; i++){ + drawNoise(noise, noiseColor, noiseScale * sscl, state.opacity * salpha * opacityMultiplier, sspeed * (useWindVector ? 1f : baseSpeed), state.intensity, windx, windy, offset); + sspeed *= noiseLayerSpeedM; + salpha *= noiseLayerAlphaM; + sscl *= noiseLayerSclM; + offset += 0.29f; + col.mul(noiseLayerColorM); + } + } + + if(drawParticles){ + drawParticles(region, color, sizeMin, sizeMax, density, state.intensity, state.opacity, windx, windy, minAlpha, maxAlpha, sinSclMin, sinSclMax, sinMagMin, sinMagMax); + } + } +} diff --git a/core/src/mindustry/type/weather/RainWeather.java b/core/src/mindustry/type/weather/RainWeather.java new file mode 100644 index 0000000000..78fd096062 --- /dev/null +++ b/core/src/mindustry/type/weather/RainWeather.java @@ -0,0 +1,38 @@ +package mindustry.type.weather; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.content.*; +import mindustry.gen.*; +import mindustry.type.*; + +public class RainWeather extends Weather{ + public float yspeed = 5f, xspeed = 1.5f, padding = 16f, density = 1200f, stroke = 0.75f, sizeMin = 8f, sizeMax = 40f, splashTimeScale = 22f; + public Liquid liquid = Liquids.water; + public TextureRegion[] splashes = new TextureRegion[12]; + public Color color = Color.valueOf("7a95eaff"); + + public RainWeather(String name){ + super(name); + } + + @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){ + drawRain(sizeMin, sizeMax, xspeed, yspeed, density, state.intensity, stroke, color); + } + + @Override + public void drawUnder(WeatherState state){ + drawSplashes(splashes, sizeMax, density, state.intensity, state.opacity, splashTimeScale, stroke, color, liquid); + } +} diff --git a/core/src/mindustry/ui/Bar.java b/core/src/mindustry/ui/Bar.java index d58ad53c37..8de089041a 100644 --- a/core/src/mindustry/ui/Bar.java +++ b/core/src/mindustry/ui/Bar.java @@ -29,11 +29,19 @@ public class Bar extends Element{ public Bar(Prov name, Prov color, Floatp fraction){ this.fraction = fraction; - lastValue = value = Mathf.clamp(fraction.get()); + try{ + lastValue = value = Mathf.clamp(fraction.get()); + }catch(Exception e){ //getting the fraction may involve referring to invalid data + lastValue = value = 0f; + } update(() -> { - this.name = name.get(); - this.blinkColor.set(color.get()); - setColor(color.get()); + try{ + this.name = name.get(); + this.blinkColor.set(color.get()); + setColor(color.get()); + }catch(Exception e){ //getting the fraction may involve referring to invalid data + this.name = ""; + } }); } @@ -62,12 +70,25 @@ public class Bar extends Element{ public void draw(){ if(fraction == null) return; - float computed = Mathf.clamp(fraction.get()); + float computed; + try{ + computed = Mathf.clamp(fraction.get()); + }catch(Exception e){ //getting the fraction may involve referring to invalid data + computed = 0f; + } + if(lastValue > computed){ blink = 1f; lastValue = computed; } + if(Float.isNaN(lastValue)) lastValue = 0; + if(Float.isInfinite(lastValue)) lastValue = 1f; + if(Float.isNaN(value)) value = 0; + if(Float.isInfinite(value)) value = 1f; + if(Float.isNaN(computed)) computed = 0; + if(Float.isInfinite(computed)) computed = 1f; + blink = Mathf.lerpDelta(blink, 0f, 0.2f); value = Mathf.lerpDelta(value, computed, 0.15f); diff --git a/core/src/mindustry/ui/BorderImage.java b/core/src/mindustry/ui/BorderImage.java index fc1c94f044..262a02a197 100644 --- a/core/src/mindustry/ui/BorderImage.java +++ b/core/src/mindustry/ui/BorderImage.java @@ -2,9 +2,9 @@ package mindustry.ui; import arc.graphics.*; import arc.graphics.g2d.*; -import arc.scene.ui.Image; -import arc.scene.ui.layout.Scl; -import mindustry.graphics.Pal; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.graphics.*; public class BorderImage extends Image{ public float thickness = 4f; diff --git a/core/src/mindustry/ui/ContentDisplay.java b/core/src/mindustry/ui/ContentDisplay.java deleted file mode 100644 index 3e82412f0e..0000000000 --- a/core/src/mindustry/ui/ContentDisplay.java +++ /dev/null @@ -1,165 +0,0 @@ -package mindustry.ui; - -import arc.*; -import arc.struct.*; -import arc.graphics.*; -import arc.scene.ui.layout.*; -import arc.util.*; -import mindustry.gen.*; -import mindustry.graphics.*; -import mindustry.type.*; -import mindustry.world.*; -import mindustry.world.meta.*; - -public class ContentDisplay{ - - public static void displayBlock(Table table, Block block){ - - table.table(title -> { - int size = 8 * 6; - - title.image(block.icon(Cicon.xlarge)).size(size); - title.add("[accent]" + block.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(8).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(block.description != null){ - table.add(block.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(8).padLeft(0).padRight(0).fillX(); - table.row(); - } - - BlockStats stats = block.stats; - - for(StatCategory cat : stats.toMap().keys()){ - OrderedMap> map = stats.toMap().get(cat); - - if(map.size == 0) continue; - - table.add("@category." + cat.name()).color(Pal.accent).fillX(); - table.row(); - - for(BlockStat stat : map.keys()){ - table.table(inset -> { - inset.left(); - inset.add("[lightgray]" + stat.localized() + ":[] ").left(); - Seq arr = map.get(stat); - for(StatValue value : arr){ - value.display(inset); - inset.add().size(10f); - } - - }).fillX().padLeft(10); - table.row(); - } - } - } - - public static void displayItem(Table table, Item item){ - - table.table(title -> { - title.image(item.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + item.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(item.description != null){ - table.add(item.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - table.row(); - } - - table.left().defaults().fillX(); - - table.add(Core.bundle.format("item.explosiveness", (int)(item.explosiveness * 100))); - table.row(); - table.add(Core.bundle.format("item.flammability", (int)(item.flammability * 100))); - table.row(); - table.add(Core.bundle.format("item.radioactivity", (int)(item.radioactivity * 100))); - table.row(); - } - - public static void displayLiquid(Table table, Liquid liquid){ - - table.table(title -> { - title.image(liquid.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + liquid.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(liquid.description != null){ - table.add(liquid.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - table.row(); - } - - table.left().defaults().fillX(); - - table.add(Core.bundle.format("item.explosiveness", (int)(liquid.explosiveness * 100))); - table.row(); - table.add(Core.bundle.format("item.flammability", (int)(liquid.flammability * 100))); - table.row(); - table.add(Core.bundle.format("liquid.heatcapacity", (int)(liquid.heatCapacity * 100))); - table.row(); - table.add(Core.bundle.format("liquid.temperature", (int)(liquid.temperature * 100))); - table.row(); - table.add(Core.bundle.format("liquid.viscosity", (int)(liquid.viscosity * 100))); - table.row(); - } - - public static void displayUnit(Table table, UnitType unit){ - table.table(title -> { - title.image(unit.icon(Cicon.xlarge)).size(8 * 6).scaling(Scaling.fit); - title.add("[accent]" + unit.localizedName).padLeft(5); - }); - - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - - table.row(); - - if(unit.description != null){ - table.add(unit.displayDescription()).padLeft(5).padRight(5).width(400f).wrap().fillX(); - table.row(); - - table.image().height(3).color(Color.lightGray).pad(15).padLeft(0).padRight(0).fillX(); - table.row(); - } - - table.left().defaults().fillX(); - - Unit inst = unit.constructor.get(); - - //TODO more stats - table.add(Core.bundle.format("unit.health", unit.health)).row(); - table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1))).row(); - table.add(Core.bundle.format("unit.itemcapacity", unit.itemCapacity)).row(); - - if(inst instanceof Minerc) table.add(Core.bundle.format("unit.minespeed", (int)(unit.mineSpeed * 100f))).row(); - if(inst instanceof Builderc) table.add(Core.bundle.format("unit.buildspeed", (int)(unit.buildSpeed * 100f))).row(); - - table.row(); - } -} diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index cbc0100943..35c6f1bcd9 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -16,27 +16,38 @@ import arc.graphics.g2d.*; import arc.graphics.g2d.Font.*; import arc.graphics.g2d.PixmapPacker.*; import arc.graphics.g2d.TextureAtlas.*; -import arc.math.*; import arc.math.geom.*; import arc.scene.style.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import mindustry.*; import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.gen.*; import java.util.*; public class Fonts{ private static final String mainFont = "fonts/font.woff"; + private static final ObjectSet unscaled = ObjectSet.with("iconLarge"); private static ObjectIntMap unicodeIcons = new ObjectIntMap<>(); private static ObjectMap stringIcons = new ObjectMap<>(); + private static ObjectMap largeIcons = new ObjectMap<>(); + private static TextureRegion[] iconTable; + private static int lastCid; public static Font def; public static Font outline; public static Font chat; public static Font icon; + public static Font iconLarge; public static Font tech; + public static TextureRegion logicIcon(int id){ + return iconTable[id]; + } + public static int getUnicode(String content){ return unicodeIcons.get(content, 0); } @@ -55,10 +66,11 @@ public class Fonts{ } public static int cursorScale(){ - return Math.max(1, Mathf.round(Scl.scl(1f))); + return 1; } public static void loadFonts(){ + largeIcons.clear(); FreeTypeFontParameter param = fontParameter(); Core.assets.load("default", Font.class, new FreeTypeFontLoaderParameter(mainFont, param)).loaded = f -> Fonts.def = (Font)f; @@ -68,6 +80,25 @@ public class Fonts{ incremental = true; characters = "\0"; }})).loaded = f -> Fonts.icon = (Font)f; + Core.assets.load("iconLarge", Font.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{ + size = 48; + incremental = false; + characters = "\0" + Iconc.all; + borderWidth = 5f; + borderColor = Color.darkGray; + }})).loaded = f -> Fonts.iconLarge = (Font)f; + } + + public static TextureRegion getLargeIcon(String name){ + return largeIcons.get(name, () -> { + var region = new TextureRegion(); + int code = Iconc.codes.get(name, '\uF8D4'); + var glyph = iconLarge.getData().getGlyph((char)code); + if(glyph == null) return Core.atlas.find("error"); + region.set(iconLarge.getRegion().texture); + region.set(glyph.u, glyph.v2, glyph.u2, glyph.v); + return region; + }); } public static void loadContentIcons(){ @@ -97,7 +128,7 @@ public class Fonts{ glyph.srcX = 0; glyph.srcY = 0; glyph.width = size; - glyph.height = size; + glyph.height = (int)((float)region.height / region.width * size); glyph.u = region.u; glyph.v = region.v2; glyph.u2 = region.u2; @@ -111,6 +142,19 @@ public class Fonts{ fonts.each(f -> f.getData().setGlyph(ch, glyph)); } } + + iconTable = new TextureRegion[512]; + iconTable[0] = Core.atlas.find("error"); + lastCid = 1; + + Vars.content.each(c -> { + if(c instanceof UnlockableContent u){ + TextureRegion region = Core.atlas.find(u.name + "-icon-logic"); + if(region.found()){ + iconTable[u.iconId = lastCid++] = region; + } + } + }); } /** Called from a static context for use in the loading screen.*/ @@ -129,7 +173,8 @@ public class Fonts{ parameter.fontParameters.borderWidth = Scl.scl(2f); parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth; } - if(!scaled.contains(parameter.fontParameters)){ + + if(!scaled.contains(parameter.fontParameters) && !unscaled.contains(fileName)){ parameter.fontParameters.size = (int)(Scl.scl(parameter.fontParameters.size)); scaled.add(parameter.fontParameters); } diff --git a/core/src/mindustry/ui/GridImage.java b/core/src/mindustry/ui/GridImage.java index 13d786a5be..f80262d5ac 100644 --- a/core/src/mindustry/ui/GridImage.java +++ b/core/src/mindustry/ui/GridImage.java @@ -1,7 +1,7 @@ package mindustry.ui; -import arc.graphics.g2d.Fill; -import arc.scene.Element; +import arc.graphics.g2d.*; +import arc.scene.*; public class GridImage extends Element{ private int imageWidth, imageHeight; diff --git a/core/src/mindustry/ui/IntFormat.java b/core/src/mindustry/ui/IntFormat.java index 187e21993f..fab10cd67f 100644 --- a/core/src/mindustry/ui/IntFormat.java +++ b/core/src/mindustry/ui/IntFormat.java @@ -1,8 +1,8 @@ package mindustry.ui; -import arc.Core; -import arc.func.Func; +import arc.*; +import arc.func.*; /** * A low-garbage way to format bundle strings. @@ -10,7 +10,7 @@ import arc.func.Func; public class IntFormat{ private final StringBuilder builder = new StringBuilder(); private final String text; - private int lastValue = Integer.MIN_VALUE; + private int lastValue = Integer.MIN_VALUE, lastValue2 = Integer.MIN_VALUE; private Func converter = String::valueOf; public IntFormat(String text){ @@ -30,4 +30,14 @@ public class IntFormat{ lastValue = value; return builder; } + + public CharSequence get(int value1, int value2){ + if(lastValue != value1 || lastValue2 != value2){ + builder.setLength(0); + builder.append(Core.bundle.format(text, value1, value2)); + } + lastValue = value1; + lastValue2 = value2; + return builder; + } } diff --git a/core/src/mindustry/ui/ItemDisplay.java b/core/src/mindustry/ui/ItemDisplay.java index 721fbc8b33..d0cedc5ba1 100644 --- a/core/src/mindustry/ui/ItemDisplay.java +++ b/core/src/mindustry/ui/ItemDisplay.java @@ -1,8 +1,7 @@ package mindustry.ui; -import arc.scene.ui.layout.Table; -import mindustry.type.Item; -import mindustry.type.ItemStack; +import arc.scene.ui.layout.*; +import mindustry.type.*; /** An item image with text. */ public class ItemDisplay extends Table{ diff --git a/core/src/mindustry/ui/ItemImage.java b/core/src/mindustry/ui/ItemImage.java index fb26769c98..437360829e 100644 --- a/core/src/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -3,6 +3,7 @@ package mindustry.ui; import arc.graphics.g2d.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import mindustry.core.*; import mindustry.type.*; public class ItemImage extends Stack{ @@ -16,7 +17,7 @@ public class ItemImage extends Stack{ add(new Table(t -> { t.left().bottom(); - t.add(amount + ""); + t.add(amount > 1000 ? UI.formatAmount(amount) : amount + ""); t.pack(); })); } @@ -38,7 +39,7 @@ public class ItemImage extends Stack{ if(stack.amount != 0){ add(new Table(t -> { t.left().bottom(); - t.add(stack.amount + "").style(Styles.outlineLabel); + t.add(stack.amount > 1000 ? UI.formatAmount(stack.amount) : stack.amount + "").style(Styles.outlineLabel); t.pack(); })); } diff --git a/core/src/mindustry/ui/ItemsDisplay.java b/core/src/mindustry/ui/ItemsDisplay.java index a1dc45d7a0..a6dec71bc7 100644 --- a/core/src/mindustry/ui/ItemsDisplay.java +++ b/core/src/mindustry/ui/ItemsDisplay.java @@ -5,7 +5,7 @@ import arc.math.*; import arc.scene.actions.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.core.*; import mindustry.gen.*; import mindustry.graphics.*; diff --git a/core/src/mindustry/ui/Links.java b/core/src/mindustry/ui/Links.java index 4f14c746d5..6c5962d11c 100644 --- a/core/src/mindustry/ui/Links.java +++ b/core/src/mindustry/ui/Links.java @@ -1,28 +1,32 @@ package mindustry.ui; -import arc.Core; +import arc.*; +import arc.graphics.*; import arc.scene.style.*; -import arc.util.Strings; -import arc.graphics.Color; +import arc.util.*; +import mindustry.*; +import mindustry.core.*; import mindustry.gen.*; -import mindustry.graphics.Pal; +import mindustry.graphics.*; +import mindustry.mod.Mods.*; public class Links{ private static LinkEntry[] links; private static void createLinks(){ links = new LinkEntry[]{ - new LinkEntry("discord", "https://discord.gg/mindustry", Icon.discord, Color.valueOf("7289da")), - new LinkEntry("changelog", "https://github.com/Anuken/Mindustry/releases", Icon.list, Pal.accent.cpy()), - new LinkEntry("trello", "https://trello.com/b/aE2tcUwF", Icon.trello, Color.valueOf("026aa7")), - new LinkEntry("wiki", "https://mindustrygame.github.io/wiki/", Icon.book, Color.valueOf("0f142f")), - new LinkEntry("suggestions", "https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose/", Icon.add, Color.valueOf("ebebeb")), - new LinkEntry("reddit", "https://www.reddit.com/r/Mindustry/", Icon.redditAlien, Color.valueOf("ee593b")), - new LinkEntry("itch.io", "https://anuke.itch.io/mindustry", Icon.itchio, Color.valueOf("fa5c5c")), - new LinkEntry("google-play", "https://play.google.com/store/apps/details?id=io.anuke.mindustry", Icon.googleplay, Color.valueOf("689f38")), - new LinkEntry("f-droid", "https://f-droid.org/packages/io.anuke.mindustry/", Icon.android, Color.valueOf("026aa7")), - new LinkEntry("github", "https://github.com/Anuken/Mindustry/", Icon.github, Color.valueOf("24292e")), - new LinkEntry("dev-builds", "https://github.com/Anuken/MindustryBuilds", Icon.githubSquare, Color.valueOf("fafbfc")) + new LinkEntry("discord", "https://discord.gg/mindustry", Icon.discord, Color.valueOf("7289da")), + new LinkEntry("changelog", "https://github.com/Anuken/Mindustry/releases", Icon.list, Pal.accent.cpy()), + new LinkEntry("trello", "https://trello.com/b/aE2tcUwF", Icon.trello, Color.valueOf("026aa7")), + new LinkEntry("wiki", "https://mindustrygame.github.io/wiki/", Icon.book, Color.valueOf("0f142f")), + new LinkEntry("suggestions", "https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose/", Icon.add, Color.valueOf("ebebeb")), + new LinkEntry("reddit", "https://www.reddit.com/r/Mindustry/", Icon.redditAlien, Color.valueOf("ee593b")), + new LinkEntry("itch.io", "https://anuke.itch.io/mindustry", Icon.itchio, Color.valueOf("fa5c5c")), + new LinkEntry("google-play", "https://play.google.com/store/apps/details?id=io.anuke.mindustry", Icon.googleplay, Color.valueOf("689f38")), + new LinkEntry("f-droid", "https://f-droid.org/packages/io.anuke.mindustry/", Icon.android, Color.valueOf("026aa7")), + new LinkEntry("github", "https://github.com/Anuken/Mindustry/", Icon.github, Color.valueOf("24292e")), + new LinkEntry("dev-builds", "https://github.com/Anuken/MindustryBuilds", Icon.githubSquare, Color.valueOf("fafbfc")), + new LinkEntry("bug", report(), Icon.wrench, Color.valueOf("cbd97f")) }; } @@ -48,4 +52,23 @@ public class Links{ this.title = Core.bundle.get("link." + name + ".title", Strings.capitalize(name.replace("-", " "))); } } -} + + private static String report(){ + return "https://github.com/Anuken/Mindustry/issues/new?assignees=&labels=bug&body=" + + Strings.encode(Strings.format( + "**Platform**: `@`\n" + + "\n**Build**: `@`\n" + + "\n**Issue**: *Explain your issue in detail.*\n" + + "\n**Steps to reproduce**: *How you happened across the issue, and what exactly you did to make the bug happen.*\n" + + "\n**Link(s) to mod(s) used**: `@`\n" + + "\n**Save file**: *The (zipped) save file you were playing on when the bug happened. THIS IS REQUIRED FOR ANY ISSUE HAPPENING IN-GAME, 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.*\n" + + "\n**Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.*\n" + + "\n---\n" + + "\n*Place an X (no spaces) between the brackets to confirm that you have read the line below.*" + + "\n- [ ] **I have updated to the latest release (https://github.com/Anuken/Mindustry/releases) to make sure my issue has not been fixed.**" + + "\n- [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.**", + OS.isAndroid ? "Android " + Core.app.getVersion() : (System.getProperty("os.name") + (OS.is64Bit ? " x64" : " x32")), + Version.combined(), + Vars.mods.list().any() ? Vars.mods.list().select(LoadedMod::enabled).map(l -> l.meta.author + "/" + l.name + ":" + l.meta.version) : "none")); + } +} \ No newline at end of file diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index 6c645e6218..c2d71fee25 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -1,12 +1,11 @@ package mindustry.ui; -import arc.graphics.Color; -import arc.scene.ui.Image; -import arc.scene.ui.layout.Stack; -import arc.scene.ui.layout.Table; -import arc.util.Strings; -import mindustry.type.Liquid; -import mindustry.world.meta.StatUnit; +import arc.graphics.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.type.*; +import mindustry.world.meta.*; /** An ItemDisplay, but for liquids. */ public class LiquidDisplay extends Table{ diff --git a/core/src/mindustry/ui/Minimap.java b/core/src/mindustry/ui/Minimap.java index dfec82c9fd..53736910f1 100644 --- a/core/src/mindustry/ui/Minimap.java +++ b/core/src/mindustry/ui/Minimap.java @@ -1,9 +1,9 @@ package mindustry.ui; -import arc.Core; -import arc.graphics.g2d.Draw; -import arc.input.KeyCode; -import arc.scene.Element; +import arc.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.layout.*; import mindustry.gen.*; diff --git a/core/src/mindustry/ui/MobileButton.java b/core/src/mindustry/ui/MobileButton.java index 736247d45b..5174613b88 100644 --- a/core/src/mindustry/ui/MobileButton.java +++ b/core/src/mindustry/ui/MobileButton.java @@ -1,8 +1,8 @@ package mindustry.ui; import arc.scene.style.*; -import arc.scene.ui.ImageButton; -import arc.util.Align; +import arc.scene.ui.*; +import arc.util.*; public class MobileButton extends ImageButton{ diff --git a/core/src/mindustry/ui/MultiReqImage.java b/core/src/mindustry/ui/MultiReqImage.java index ebbb4fc359..a887a85299 100644 --- a/core/src/mindustry/ui/MultiReqImage.java +++ b/core/src/mindustry/ui/MultiReqImage.java @@ -1,8 +1,8 @@ package mindustry.ui; -import arc.struct.Seq; -import arc.scene.ui.layout.Stack; -import arc.util.Time; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; public class MultiReqImage extends Stack{ private Seq displays = new Seq<>(); diff --git a/core/src/mindustry/ui/ReqImage.java b/core/src/mindustry/ui/ReqImage.java index eef8591f63..a02ad7e5d0 100644 --- a/core/src/mindustry/ui/ReqImage.java +++ b/core/src/mindustry/ui/ReqImage.java @@ -1,12 +1,11 @@ package mindustry.ui; -import arc.func.Boolp; +import arc.func.*; import arc.graphics.g2d.*; -import arc.scene.Element; -import arc.scene.ui.Image; -import arc.scene.ui.layout.Stack; -import arc.scene.ui.layout.Scl; -import mindustry.graphics.Pal; +import arc.scene.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.graphics.*; public class ReqImage extends Stack{ private final Boolp valid; diff --git a/core/src/mindustry/ui/SearchBar.java b/core/src/mindustry/ui/SearchBar.java new file mode 100644 index 0000000000..57d1977a9d --- /dev/null +++ b/core/src/mindustry/ui/SearchBar.java @@ -0,0 +1,62 @@ +package mindustry.ui; + +import arc.func.*; +import arc.graphics.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.gen.*; + +public class SearchBar{ + + public static Table add(Table parent, Seq list, Func queryf, + Func namef, Cons2 itemc, boolean show){ + Table[] pane = {null}; + + Cons rebuild = str -> { + String query = queryf.get(str); + + pane[0].clear(); + boolean any = false; + for(T item : list){ + if(query.isEmpty() || matches(query, namef.get(item))){ + any = true; + itemc.get(pane[0], item); + } + } + + if(!any){ + pane[0].add("@none.found").color(Color.lightGray).pad(4); + } + }; + + if(show){ + parent.table(search -> { + search.image(Icon.zoom).padRight(8f); + search.field("", rebuild).growX(); + }).fillX().padBottom(4); + } + + parent.row(); + parent.pane(table -> { + pane[0] = table; + rebuild.get(""); + }); + return pane[0]; + } + + public static Table add(Table parent, Seq list, Func queryf, Func namef, Cons2 itemc){ + return add(parent, list, queryf, namef, itemc, true); + } + + public static Table add(Table parent, Seq list, Func namef, Cons2 itemc, boolean show){ + return add(parent, list, String::toLowerCase, namef, itemc, show); + } + + /** Match a list item with the search query, case insensitive */ + public static boolean matches(String query, String name){ + if(name == null || name.isEmpty()){ + return false; + } + return name.toLowerCase().contains(query); + } +} diff --git a/core/src/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java index ea7babb459..bad2dbc5a7 100644 --- a/core/src/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -1,7 +1,6 @@ package mindustry.ui; import arc.*; -import mindustry.annotations.Annotations.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.g2d.TextureAtlas.*; @@ -16,6 +15,7 @@ import arc.scene.ui.ScrollPane.*; import arc.scene.ui.Slider.*; import arc.scene.ui.TextButton.*; import arc.scene.ui.TextField.*; +import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -23,10 +23,11 @@ import static mindustry.gen.Tex.*; @StyleDefaults public class Styles{ + //TODO all these names are inconsistent and not descriptive public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver; - public static ButtonStyle defaultb, waveb; - public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict; - public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali; + public static ButtonStyle defaultb, waveb, modsb; + public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict; + public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali; public static ScrollPaneStyle defaultPane, horizontalPane, smallPane; public static KeybindDialogStyle defaultKeybindDialog; public static SliderStyle defaultSlider, vSlider; @@ -52,6 +53,12 @@ public class Styles{ over = buttonOver; disabled = buttonDisabled; }}; + + modsb = new ButtonStyle(){{ + down = flatOver; + up = underline; + over = underlineWhite; + }}; waveb = new ButtonStyle(){{ up = wavepane; @@ -85,6 +92,13 @@ public class Styles{ up = buttonOver; over = buttonDown; }}; + nonet = new TextButtonStyle(){{ + font = Fonts.outline; + fontColor = Color.lightGray; + overFontColor = Pal.accent; + disabledFontColor = Color.gray; + up = none; + }}; cleart = new TextButtonStyle(){{ over = flatOver; font = Fonts.def; @@ -212,6 +226,11 @@ public class Styles{ //imageDownColor = Pal.accent; imageUpColor = Color.white; }}; + accenti = new ImageButtonStyle(){{ + //imageDownColor = Pal.accent; + imageUpColor = Color.lightGray; + imageDownColor = Color.white; + }}; cleari = new ImageButtonStyle(){{ down = flatOver; up = black; diff --git a/core/src/mindustry/ui/dialogs/AboutDialog.java b/core/src/mindustry/ui/dialogs/AboutDialog.java index 3ba3b5d7e2..0e86d0ee64 100644 --- a/core/src/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/mindustry/ui/dialogs/AboutDialog.java @@ -1,10 +1,10 @@ package mindustry.ui.dialogs; import arc.*; -import arc.struct.*; import arc.graphics.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.game.EventType.*; import mindustry.gen.*; diff --git a/core/src/mindustry/ui/dialogs/BaseDialog.java b/core/src/mindustry/ui/dialogs/BaseDialog.java index b180763f86..b99b164ca4 100644 --- a/core/src/mindustry/ui/dialogs/BaseDialog.java +++ b/core/src/mindustry/ui/dialogs/BaseDialog.java @@ -1,7 +1,6 @@ package mindustry.ui.dialogs; import arc.*; -import arc.input.*; import arc.scene.ui.*; import arc.util.*; import mindustry.core.GameState.*; @@ -53,15 +52,15 @@ public class BaseDialog extends Dialog{ }); } + public void addCloseListener(){ + closeOnBack(); + } + @Override public void addCloseButton(){ buttons.defaults().size(210f, 64f); buttons.button("@back", Icon.left, this::hide).size(210f, 64f); - keyDown(key -> { - if(key == KeyCode.escape || key == KeyCode.back){ - Core.app.post(this::hide); - } - }); + addCloseListener(); } } diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 947afa0141..b076d4b766 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -1,8 +1,13 @@ package mindustry.ui.dialogs; -import arc.scene.ui.ScrollPane; -import arc.scene.ui.layout.Table; -import mindustry.ctype.UnlockableContent; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import mindustry.ctype.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.meta.*; public class ContentInfoDialog extends BaseDialog{ @@ -18,11 +23,72 @@ public class ContentInfoDialog extends BaseDialog{ Table table = new Table(); table.margin(10); - content.displayInfo(table); + //initialize stats if they haven't been yet + content.checkStats(); + + table.table(title1 -> { + int size = 8 * 6; + + title1.image(content.icon(Cicon.xlarge)).size(size).scaling(Scaling.fit); + title1.add("[accent]" + content.localizedName).padLeft(5); + }); + + table.row(); + + if(content.description != null){ + var any = content.stats.toMap().size > 0; + + if(any){ + table.add("@category.purpose").color(Pal.accent).fillX().padTop(10); + table.row(); + } + + table.add("[lightgray]" + content.displayDescription()).wrap().fillX().padLeft(any ? 10 : 0).width(500f).padTop(any ? 0 : 10).left(); + table.row(); + + if(!content.stats.useCategories && any){ + table.add("@category.general").fillX().color(Pal.accent); + table.row(); + } + } + + Stats stats = content.stats; + + for(StatCat cat : stats.toMap().keys()){ + OrderedMap> map = stats.toMap().get(cat); + + if(map.size == 0) continue; + + //TODO check + if(stats.useCategories){ + table.add("@category." + cat.name()).color(Pal.accent).fillX(); + table.row(); + } + + for(Stat stat : map.keys()){ + table.table(inset -> { + inset.left(); + inset.add("[lightgray]" + stat.localized() + ":[] ").left(); + Seq arr = map.get(stat); + for(StatValue value : arr){ + value.display(inset); + inset.add().size(10f); + } + + }).fillX().padLeft(10); + table.row(); + } + } + + if(content.details != null){ + table.add("[gray]" + content.details).pad(6).padTop(20).width(400f).wrap().fillX(); + table.row(); + } ScrollPane pane = new ScrollPane(table); cont.add(pane); show(); } + } diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 68f61f1df2..ece89b15f8 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -24,8 +24,8 @@ import static arc.util.Time.*; import static mindustry.Vars.*; public class CustomRulesDialog extends BaseDialog{ - private Table main; Rules rules; + private Table main; private Prov resetter; private LoadoutDialog loadoutDialog; private BaseDialog banDialog; @@ -134,15 +134,15 @@ public class CustomRulesDialog extends BaseDialog{ check("@rules.waves", b -> rules.waves = b, () -> rules.waves); check("@rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer); check("@rules.waitForWaveToEnd", b -> rules.waitEnemies = b, () -> rules.waitEnemies); - number("@rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> true); + number("@rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> true, 1, Float.MAX_VALUE); number("@rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> true); title("@rules.title.resourcesbuilding"); check("@rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources); check("@rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); - check("@rules.schematic", b-> rules.schematicsAllowed = b, () -> rules.schematicsAllowed); + check("@rules.schematic", b -> rules.schematicsAllowed = b, () -> rules.schematicsAllowed); number("@rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); - number("@rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); + number("@rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier, 0.00001f, 10000f); number("@rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources); number("@rules.blockhealthmultiplier", f -> rules.blockHealthMultiplier = f, () -> rules.blockHealthMultiplier); number("@rules.blockdamagemultiplier", f -> rules.blockDamageMultiplier = f, () -> rules.blockDamageMultiplier); @@ -162,17 +162,18 @@ public class CustomRulesDialog extends BaseDialog{ check("@rules.unitammo", b -> rules.unitAmmo = b, () -> rules.unitAmmo); number("@rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier); number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier); - number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier); + number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, 0.00001f, 100f); title("@rules.title.enemy"); check("@rules.attack", b -> rules.attackMode = b, () -> rules.attackMode); - check("@rules.buildai", b -> rules.waveTeam.rules().ai = b, () -> rules.waveTeam.rules().ai); + check("@rules.buildai", b -> rules.teams.get(rules.waveTeam).ai = rules.teams.get(rules.waveTeam).infiniteResources = b, () -> rules.teams.get(rules.waveTeam).ai); number("@rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200)); title("@rules.title.environment"); check("@rules.explosions", b -> rules.damageExplosions = b, () -> rules.damageExplosions); check("@rules.fire", b -> rules.fire = b, () -> rules.fire); check("@rules.lighting", b -> rules.lighting = b, () -> rules.lighting); + check("@rules.enemyLights", b -> rules.enemyLights = b, () -> rules.enemyLights); main.button(b -> { b.left(); @@ -185,15 +186,25 @@ public class CustomRulesDialog extends BaseDialog{ }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row(); main.button("@rules.weather", this::weatherDialog).width(250f).left().row(); - - //TODO add weather patterns } void number(String text, Floatc cons, Floatp prov){ - number(text, false, cons, prov, () -> true); + number(text, false, cons, prov, () -> true, 0, Float.MAX_VALUE); + } + + void number(String text, Floatc cons, Floatp prov, float min, float max){ + number(text, false, cons, prov, () -> true, min, max); } void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition){ + number(text, integer, cons, prov, condition, 0, Float.MAX_VALUE); + } + + void number(String text, Floatc cons, Floatp prov, Boolp condition){ + number(text, false, cons, prov, condition, 0, Float.MAX_VALUE); + } + + void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition, float min, float max){ main.table(t -> { t.left(); t.add(text).left().padRight(5) @@ -201,7 +212,7 @@ public class CustomRulesDialog extends BaseDialog{ t.field((integer ? (int)prov.get() : prov.get()) + "", s -> cons.get(Strings.parseFloat(s))) .padRight(100f) .update(a -> a.setDisabled(!condition.get())) - .valid(Strings::canParsePositiveFloat).width(120f).left().addInputDialog(); + .valid(f -> Strings.canParsePositiveFloat(f) && Strings.parseFloat(f) >= min && Strings.parseFloat(f) <= max).width(120f).left().addInputDialog(); }).padTop(0); main.row(); } @@ -273,19 +284,23 @@ public class CustomRulesDialog extends BaseDialog{ f.defaults().padRight(4).left(); f.add("@rules.weather.duration"); - field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes); + field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes).disabled(v -> entry.always); f.add("@waves.to"); - field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes); + field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes).disabled(v -> entry.always); f.add("@unit.minutes"); f.row(); f.add("@rules.weather.frequency"); - field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes); + field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes).disabled(v -> entry.always); f.add("@waves.to"); - field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes); + field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes).disabled(v -> entry.always); f.add("@unit.minutes"); + f.row(); + + f.check("@rules.weather.always", val -> entry.always = val).checked(cc -> entry.always).padBottom(4); + //intensity can't currently be customized }).grow().left().pad(6).top(); @@ -303,8 +318,8 @@ public class CustomRulesDialog extends BaseDialog{ dialog.addCloseButton(); dialog.buttons.button("@add", Icon.add, () -> { - BaseDialog addd = new BaseDialog("@add"); - addd.cont.pane(t -> { + BaseDialog add = new BaseDialog("@add"); + add.cont.pane(t -> { t.background(Tex.button); int i = 0; for(Weather weather : content.getBy(ContentType.weather)){ @@ -313,13 +328,13 @@ public class CustomRulesDialog extends BaseDialog{ rules.weather.add(new WeatherEntry(weather)); rebuild[0].run(); - addd.hide(); + add.hide(); }).size(140f, 50f); if(++i % 2 == 0) t.row(); } }); - addd.addCloseButton(); - addd.show(); + add.addCloseButton(); + add.show(); }).width(170f); //reset cooldown to random number diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 1a718e318a..e275e410e0 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -40,7 +40,7 @@ public class DatabaseDialog extends BaseDialog{ for(int j = 0; j < allContent.length; j++){ ContentType type = ContentType.all[j]; - Seq array = allContent[j].select(c -> c instanceof UnlockableContent && !((UnlockableContent)c).isHidden()); + Seq array = allContent[j].select(c -> c instanceof UnlockableContent u && (!u.isHidden() || u.node() != null)); if(array.size == 0) continue; table.add("@content." + type.name() + ".name").growX().left().color(Pal.accent); @@ -57,7 +57,7 @@ public class DatabaseDialog extends BaseDialog{ UnlockableContent unlock = (UnlockableContent)array.get(i); Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)).setScaling(Scaling.fit) : new Image(Icon.lock, Pal.gray); - list.add(image).size(8*4).pad(3); + list.add(image).size(8 * 4).pad(3); ClickListener listener = new ClickListener(); image.addListener(listener); if(!Vars.mobile && unlocked(unlock)){ diff --git a/core/src/mindustry/ui/dialogs/DiscordDialog.java b/core/src/mindustry/ui/dialogs/DiscordDialog.java index 3413a4a67b..600fe39e16 100644 --- a/core/src/mindustry/ui/dialogs/DiscordDialog.java +++ b/core/src/mindustry/ui/dialogs/DiscordDialog.java @@ -1,10 +1,10 @@ package mindustry.ui.dialogs; -import arc.Core; -import arc.graphics.Color; -import arc.scene.ui.Dialog; +import arc.*; +import arc.graphics.*; +import arc.scene.ui.*; import mindustry.gen.*; -import mindustry.graphics.Pal; +import mindustry.graphics.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/ui/dialogs/FileChooser.java b/core/src/mindustry/ui/dialogs/FileChooser.java index 78a3c1a459..c755585b12 100644 --- a/core/src/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/mindustry/ui/dialogs/FileChooser.java @@ -4,6 +4,7 @@ import arc.*; import arc.files.*; import arc.func.*; import arc.graphics.g2d.*; +import arc.input.*; import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; @@ -17,7 +18,7 @@ import java.util.*; public class FileChooser extends BaseDialog{ private static final Fi homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); - static Fi lastDirectory = homeDirectory; + static Fi lastDirectory = Core.files.absolute(Core.settings.getString("lastDirectory", homeDirectory.absolutePath())); private Table files; Fi directory = lastDirectory; @@ -45,6 +46,12 @@ public class FileChooser extends BaseDialog{ cont.clear(); setupWidgets(); }); + + keyDown(KeyCode.enter, () -> { + ok.fireClick(); + }); + + addCloseListener(); } private void setupWidgets(){ @@ -108,7 +115,7 @@ public class FileChooser extends BaseDialog{ ImageButton home = new ImageButton(Icon.home); home.clicked(() -> { directory = homeDirectory; - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); }); @@ -187,7 +194,7 @@ public class FileChooser extends BaseDialog{ TextButton upbutton = new TextButton(".." + directory.toString(), Styles.clearTogglet); upbutton.clicked(() -> { directory = directory.parent(); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); }); @@ -217,7 +224,7 @@ public class FileChooser extends BaseDialog{ updateFileFieldStatus(); }else{ directory = directory.child(filename); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); } }); @@ -242,6 +249,11 @@ public class FileChooser extends BaseDialog{ if(open) filefield.clearText(); } + public static void setLastDirectory(Fi directory){ + lastDirectory = directory; + Core.settings.put("lastDirectory", directory.absolutePath()); + } + private String shorten(String string){ int max = 30; if(string.length() <= max){ @@ -269,14 +281,14 @@ public class FileChooser extends BaseDialog{ if(!canBack()) return; index--; directory = history.get(index - 1); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(false); } public void forward(){ if(!canForward()) return; directory = history.get(index); - lastDirectory = directory; + setLastDirectory(directory); index++; updateFiles(false); } diff --git a/core/src/mindustry/ui/dialogs/GameOverDialog.java b/core/src/mindustry/ui/dialogs/GameOverDialog.java index b53627b835..8c69756a3c 100644 --- a/core/src/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustry/ui/dialogs/GameOverDialog.java @@ -1,8 +1,8 @@ package mindustry.ui.dialogs; import arc.*; +import mindustry.core.GameState.*; import mindustry.game.EventType.*; -import mindustry.game.Stats.*; import mindustry.game.*; import mindustry.type.*; import mindustry.ui.*; @@ -16,6 +16,8 @@ public class GameOverDialog extends BaseDialog{ super("@gameover"); setFillParent(true); shown(this::rebuild); + + Events.on(ResetEvent.class, e -> hide()); } public void show(Team winner){ @@ -29,13 +31,13 @@ public class GameOverDialog extends BaseDialog{ } void rebuild(){ - title.setText(state.launched ? "@launch.title" : "@gameover"); + title.setText(state.isCampaign() ? "@sector.curlost" : "@gameover"); buttons.clear(); cont.clear(); buttons.margin(10); - if(state.rules.pvp){ + if(state.rules.pvp && winner != null){ cont.add(Core.bundle.format("gameover.pvp", winner.localized())).pad(6); buttons.button("@menu", () -> { hide(); @@ -50,52 +52,51 @@ public class GameOverDialog extends BaseDialog{ cont.pane(t -> { t.margin(13f); t.left().defaults().left(); - t.add(Core.bundle.format("stat.wave", state.stats.wavesLasted)); - t.row(); - t.add(Core.bundle.format("stat.enemiesDestroyed", state.stats.enemyUnitsDestroyed)); - t.row(); - t.add(Core.bundle.format("stat.built", state.stats.buildingsBuilt)); - t.row(); - t.add(Core.bundle.format("stat.destroyed", state.stats.buildingsDestroyed)); - t.row(); - t.add(Core.bundle.format("stat.deconstructed", state.stats.buildingsDeconstructed)); - t.row(); + t.add(Core.bundle.format("stat.wave", state.stats.wavesLasted)).row(); + t.add(Core.bundle.format("stat.enemiesDestroyed", state.stats.enemyUnitsDestroyed)).row(); + t.add(Core.bundle.format("stat.built", state.stats.buildingsBuilt)).row(); + t.add(Core.bundle.format("stat.destroyed", state.stats.buildingsDestroyed)).row(); + t.add(Core.bundle.format("stat.deconstructed", state.stats.buildingsDeconstructed)).row(); if(control.saves.getCurrent() != null){ - t.add(Core.bundle.format("stat.playtime", control.saves.getCurrent().getPlayTime())); - t.row(); + t.add(Core.bundle.format("stat.playtime", control.saves.getCurrent().getPlayTime())).row(); } if(state.isCampaign() && !state.stats.itemsDelivered.isEmpty()){ - t.add("@stat.delivered"); - t.row(); + t.add("@stat.delivered").row(); for(Item item : content.items()){ if(state.stats.itemsDelivered.get(item, 0) > 0){ t.table(items -> { items.add(" [lightgray]" + state.stats.itemsDelivered.get(item, 0)); items.image(item.icon(Cicon.small)).size(8 * 3).pad(4); - }).left(); - t.row(); + }).left().row(); } } } - if(state.hasSector()){ - RankResult result = state.stats.calculateRank(state.getSector(), state.launched); - t.add(Core.bundle.format("stat.rank", result.rank + result.modifier)); - t.row(); + if(state.isCampaign() && net.client()){ + t.add("@gameover.waiting").padTop(20f).row(); } + }).pad(12); if(state.isCampaign()){ - buttons.button("@continue", () -> { - hide(); - logic.reset(); - ui.planet.show(); - }).size(130f, 60f); + if(net.client()){ + buttons.button("@gameover.disconnect", () -> { + logic.reset(); + net.reset(); + hide(); + state.set(State.menu); + }).size(170f, 60f); + }else{ + buttons.button("@continue", () -> { + hide(); + ui.planet.show(); + }).size(170f, 60f); + } }else{ buttons.button("@menu", () -> { hide(); logic.reset(); - }).size(130f, 60f); + }).size(140f, 60f); } } } diff --git a/core/src/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java index 7962e46e10..c4e263d208 100644 --- a/core/src/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -85,22 +85,29 @@ public class HostDialog extends BaseDialog{ player.admin(true); if(steam){ - Core.app.post(() -> Core.settings.getBoolOnce("steampublic2", () -> { + Core.app.post(() -> Core.settings.getBoolOnce("steampublic3", () -> { ui.showCustomConfirm("@setting.publichost.name", "@public.confirm", "@yes", "@no", () -> { - Core.settings.put("publichost", true); - platform.updateLobby(); + ui.showCustomConfirm("@setting.publichost.name", "@public.confirm.really", "@no", "@yes", () -> { + Core.settings.put("publichost", true); + platform.updateLobby(); + }, () -> { + Core.settings.put("publichost", false); + platform.updateLobby(); + }); }, () -> { Core.settings.put("publichost", false); platform.updateLobby(); }); })); + + if(Version.modifier.contains("beta") || Version.modifier.contains("alpha")){ + Core.settings.put("publichost", false); + platform.updateLobby(); + Core.settings.getBoolOnce("betapublic", () -> ui.showInfo("@public.beta")); + } } - if(Version.modifier.contains("beta")){ - Core.settings.put("publichost", false); - platform.updateLobby(); - Core.settings.getBoolOnce("betapublic", () -> ui.showInfo("@public.beta")); - } + }catch(IOException e){ ui.showException("@server.error", e); } diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 233dab599b..2d9f565c7b 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -1,6 +1,7 @@ package mindustry.ui.dialogs; import arc.*; +import arc.Net.*; import arc.graphics.*; import arc.input.*; import arc.math.*; @@ -8,6 +9,7 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import arc.util.Timer.*; import arc.util.serialization.*; import mindustry.*; import mindustry.core.*; @@ -31,6 +33,11 @@ public class JoinDialog extends BaseDialog{ Table hosts = new Table(); int totalHosts; int refreshes; + boolean showHidden; + + String lastIp; + int lastPort; + Task ping; public JoinDialog(){ super("@joingame"); @@ -193,7 +200,7 @@ public class JoinDialog extends BaseDialog{ void refreshServer(Server server){ server.content.clear(); - server.content.label(() -> Core.bundle.get("server.refreshing") + Strings.animated(Time.time(), 4, 11, ".")); + server.content.label(() -> Core.bundle.get("server.refreshing") + Strings.animated(Time.time, 4, 11, ".")); net.pingHost(server.ip, server.port, host -> setupServer(server, host), e -> { server.content.clear(); @@ -252,9 +259,9 @@ public class JoinDialog extends BaseDialog{ hosts.clear(); - section("@servers.local", local); - section("@servers.remote", remote); - section("@servers.global", global); + section("@servers.local", local, false); + section("@servers.remote", remote, false); + section("@servers.global", global, true); ScrollPane pane = new ScrollPane(hosts); pane.setFadeScrollBars(false); @@ -292,7 +299,7 @@ public class JoinDialog extends BaseDialog{ pad = 6; } - Cell cell = ((Table)pane.parent).getCell(button); + var cell = ((Table)pane.parent).getCell(button); if(!Mathf.equal(cell.minWidth(), pw)){ cell.width(pw); @@ -302,12 +309,21 @@ public class JoinDialog extends BaseDialog{ }); } - void section(String label, Table servers){ + void section(String label, Table servers, boolean eye){ Collapser coll = new Collapser(servers, Core.settings.getBool("collapsed-" + label, false)); coll.setDuration(0.1f); hosts.table(name -> { name.add(label).pad(10).growX().left().color(Pal.accent); + + if(eye){ + name.button(Icon.eyeSmall, Styles.emptyi, () -> { + showHidden = !showHidden; + refreshGlobal(); + }).update(i -> i.getStyle().imageUp = (showHidden ? Icon.eyeSmall : Icon.eyeOffSmall)) + .size(40f).right().padRight(3).tooltip("@servers.showhidden"); + } + name.button(Icon.downOpen, Styles.emptyi, () -> { coll.toggle(false); Core.settings.put("collapsed-" + label, coll.isCollapsed()); @@ -325,7 +341,7 @@ public class JoinDialog extends BaseDialog{ local.clear(); local.background(null); - local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time(), 4, 10f, ".")).pad(10f)).growX(); + local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time, 4, 10f, ".")).pad(10f)).growX(); net.discoverServers(this::addLocalHost, this::finishLocalHosts); } @@ -334,17 +350,73 @@ public class JoinDialog extends BaseDialog{ global.clear(); global.background(null); - for(String host : defaultServers){ - String resaddress = host.contains(":") ? host.split(":")[0] : host; - int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port; - net.pingHost(resaddress, resport, res -> { - if(refreshes != cur) return; - res.port = resport; - addGlobalHost(res); - }, e -> {}); + for(ServerGroup group : defaultServers){ + boolean hidden = group.hidden(); + if(hidden && !showHidden){ + continue; + } + + Table[] groupTable = {null}; + + //table containing all groups + for(String address : group.addresses){ + String resaddress = address.contains(":") ? address.split(":")[0] : address; + int resport = address.contains(":") ? Strings.parseInt(address.split(":")[1]) : port; + net.pingHost(resaddress, resport, res -> { + if(refreshes != cur) return; + res.port = resport; + + //add header + if(groupTable[0] == null){ + global.table(t -> groupTable[0] = t).row(); + + groupTable[0].table(head -> { + if(!group.name.isEmpty()){ + head.add(group.name).color(Color.lightGray).padRight(4); + } + head.image().height(3f).growX().color(Color.lightGray); + + //button for showing/hiding servers + ImageButton[] image = {null}; + image[0] = head.button(hidden ? Icon.eyeOffSmall : Icon.eyeSmall, Styles.accenti, () -> { + group.setHidden(!group.hidden()); + image[0].getStyle().imageUp = group.hidden() ? Icon.eyeOffSmall : Icon.eyeSmall; + if(group.hidden() && !showHidden){ + groupTable[0].remove(); + } + }).size(40f).get(); + image[0].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden"))); + }).width(targetWidth()).padBottom(-2).row(); + } + + addGlobalHost(res, groupTable[0]); + + groupTable[0].margin(5f); + groupTable[0].pack(); + }, e -> {}); + } } } + void addGlobalHost(Host host, Table container){ + global.background(null); + float w = targetWidth(); + + container.button(b -> buildServer(host, b), Styles.cleart, () -> { + Events.fire(new ClientPreConnectEvent(host)); + if(!Core.settings.getBool("server-disclaimer", false)){ + ui.showCustomConfirm("@warning", "@servers.disclaimer", "@ok", "@back", () -> { + Core.settings.put("server-disclaimer", true); + safeConnect(host.address, host.port, host.version); + }, () -> { + Core.settings.put("server-disclaimer", false); + }); + }else{ + safeConnect(host.address, host.port, host.version); + } + }).width(w).row(); + } + void finishLocalHosts(){ if(totalHosts == 0){ local.clear(); @@ -367,22 +439,10 @@ public class JoinDialog extends BaseDialog{ local.row(); - TextButton button = local.button("", Styles.cleart, () -> safeConnect(host.address, host.port, host.version)) - .width(w).pad(5f).get(); - button.clearChildren(); - buildServer(host, button); - } - - void addGlobalHost(Host host){ - global.background(null); - float w = targetWidth(); - - global.row(); - - TextButton button = global.button("", Styles.cleart, () -> safeConnect(host.address, host.port, host.version)) - .width(w).pad(5f).get(); - button.clearChildren(); - buildServer(host, button); + local.button(b -> buildServer(host, b), Styles.cleart, () -> { + Events.fire(new ClientPreConnectEvent(host)); + safeConnect(host.address, host.port, host.version); + }).width(w); } public void connect(String ip, int port){ @@ -402,13 +462,34 @@ public class JoinDialog extends BaseDialog{ logic.reset(); net.reset(); Vars.netClient.beginConnecting(); - net.connect(ip, port, () -> { + net.connect(lastIp = ip, lastPort = port, () -> { hide(); add.hide(); }); }); } + public void reconnect(){ + if(lastIp == null || lastIp.isEmpty()) return; + ui.loadfrag.show("@reconnecting"); + + ping = Timer.schedule(() -> { + net.pingHost(lastIp, lastPort, host -> { + if(ping == null) return; + ping.cancel(); + ping = null; + connect(lastIp, lastPort); + }, exception -> {}); + }, 1, 1); + + ui.loadfrag.setButton(() -> { + ui.loadfrag.hide(); + if(ping == null) return; + ping.cancel(); + ping = null; + }); + } + void safeConnect(String ip, int port, int version){ if(version != Version.build && Version.build != -1 && version != -1){ ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + @@ -432,23 +513,42 @@ public class JoinDialog extends BaseDialog{ Core.settings.remove("server-list"); } + var url = becontrol.active() ? serverJsonBeURL : serverJsonV6URL; + Log.info("Fetching community servers at @", url); + //get servers - Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> { + Core.net.httpGet(url, result -> { try{ + if(result.getStatus() != HttpStatus.OK){ + Log.warn("Failed to fetch community servers: @", result.getStatus()); + return; + } + Jval val = Jval.read(result.getResultAsString()); Core.app.post(() -> { try{ defaultServers.clear(); - val.asArray().each(child -> defaultServers.add(child.getString("address", ""))); - Log.info("Fetched @ global servers.", defaultServers.size); - }catch(Throwable ignored){ + val.asArray().each(child -> { + String name = child.getString("name", ""); + String[] addresses; + if(child.has("addresses") || (child.has("address") && child.get("address").isArray())){ + addresses = (child.has("addresses") ? child.get("addresses") : child.get("address")).asArray().map(Jval::asString).toArray(String.class); + }else{ + addresses = new String[]{child.getString("address", "")}; + } + defaultServers.add(new ServerGroup(name, addresses)); + }); + Log.info("Fetched @ community servers.", defaultServers.size); + }catch(Throwable e){ Log.err("Failed to parse community servers."); + Log.err(e); } }); }catch(Throwable e){ Log.err("Failed to fetch community servers."); + Log.err(e); } - }, t -> {}); + }, Log::err); } private void saveServers(){ diff --git a/core/src/mindustry/ui/dialogs/LanguageDialog.java b/core/src/mindustry/ui/dialogs/LanguageDialog.java index 979f35a7a9..41519c32fd 100644 --- a/core/src/mindustry/ui/dialogs/LanguageDialog.java +++ b/core/src/mindustry/ui/dialogs/LanguageDialog.java @@ -1,17 +1,15 @@ package mindustry.ui.dialogs; -import arc.Core; -import arc.struct.*; +import arc.*; import arc.scene.ui.*; -import arc.scene.ui.layout.Table; -import arc.util.Log; -import arc.util.Strings; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; import mindustry.ui.*; -import java.util.Locale; +import java.util.*; -import static mindustry.Vars.locales; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class LanguageDialog extends BaseDialog{ private Locale lastLocale; diff --git a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java index acb240d7c9..c8ea27ae97 100644 --- a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java @@ -29,18 +29,30 @@ public class LaunchLoadoutDialog extends BaseDialog{ super("@configure"); } - public void show(CoreBlock core, Building build, Runnable confirm){ + public void show(CoreBlock core, Sector sector, Runnable confirm){ cont.clear(); buttons.clear(); - addCloseButton(); + buttons.defaults().size(160f, 64f); + buttons.button("@back", Icon.left, this::hide); + + addCloseListener(); + + ItemSeq sitems = sector.items(); //updates sum requirements Runnable update = () -> { + int cap = selected.findCore().itemCapacity; + + //cap resources based on core type + ItemSeq resources = universe.getLaunchResources(); + resources.min(cap); + universe.updateLaunchResources(resources); + total.clear(); selected.requirements().each(total::add); universe.getLaunchResources().each(total::add); - valid = build.items.has(total); + valid = sitems.has(total); }; Cons rebuild = table -> { @@ -51,14 +63,14 @@ public class LaunchLoadoutDialog extends BaseDialog{ ItemSeq launches = universe.getLaunchResources(); for(ItemStack s : total){ - table.image(s.item.icon(Cicon.small)).left(); + table.image(s.item.icon(Cicon.small)).left().size(Cicon.small.size); int as = schems.get(s.item), al = launches.get(s.item); - String amountStr = "[lightgray]" + (al + " + [accent]" + as + "[lightgray]"); + String amountStr = (al + as) + "[gray] (" + (al + " + " + as + ")"); table.add( - build.items.has(s.item, s.amount) ? amountStr : - "[scarlet]" + (Math.min(build.items.get(s.item), s.amount) + "[lightgray]/" + amountStr)).padLeft(2).left().padRight(4); + sitems.has(s.item, s.amount) ? amountStr : + "[scarlet]" + (Math.min(sitems.get(s.item), s.amount) + "[lightgray]/" + amountStr)).padLeft(2).left().padRight(4); if(++i % 4 == 0){ table.row(); @@ -74,12 +86,12 @@ public class LaunchLoadoutDialog extends BaseDialog{ ItemSeq stacks = universe.getLaunchResources(); Seq out = stacks.toSeq(); - loadout.show(core.itemCapacity, out, UnlockableContent::unlocked, out::clear, () -> {}, () -> { + loadout.show(selected.findCore().itemCapacity, out, UnlockableContent::unlocked, out::clear, () -> {}, () -> { universe.updateLaunchResources(new ItemSeq(out)); update.run(); rebuildItems.run(); }); - }); + }).width(204); buttons.button("@launch.text", Icon.ok, () -> { universe.updateLoadout(core, selected); @@ -91,25 +103,35 @@ public class LaunchLoadoutDialog extends BaseDialog{ ButtonGroup