Compare commits

...

101 Commits
v115 ... v116

Author SHA1 Message Date
Anuken
ad71007a0a Campaign balance 2020-11-22 17:20:20 -05:00
Anuken
b595f7b175 Cleanup 2020-11-22 17:03:49 -05:00
Anuken
e783ad8893 Merge pull request #3526 from feu-follet/patch-5
Update bundle_fr_BE.properties
2020-11-22 17:00:36 -05:00
Anuken
0ac54aba83 Merge pull request #3516 from Quezler/patch-65
Remove stray newline
2020-11-22 17:00:28 -05:00
Anuken
fc47e1cf16 Merge pull request #3510 from Nikolass1000/patch-1
Polish language update.
2020-11-22 17:00:21 -05:00
Anuken
37246becc2 Merge pull request #3474 from PetrGasparik/v116
Czech translation for v116
2020-11-22 16:59:20 -05:00
Anuken
58e45aa22d Merge pull request #3462 from Prosta4okua/master
[Bundle][RU] actual L10n
2020-11-22 16:59:09 -05:00
Anuken
5952785199 Merge pull request #3350 from YellOw139/patch-1
[Bundle][RO] Translation Update
2020-11-22 16:58:36 -05:00
Anuken
ea377c6f16 Bugfixes 2020-11-22 16:53:50 -05:00
YellOw139
0da32c969c Removed block select timeout 2020-11-22 23:07:27 +02:00
Anuken
b42e5c3b66 Merge remote-tracking branch 'origin/master' 2020-11-22 14:45:47 -05:00
Anuken
455e3188c4 More concentrated enemy bases 2020-11-22 14:45:43 -05:00
Nikolass1000
fa150eb5f1 Rest od desc. 2020-11-22 20:27:09 +01:00
Anuken
704b53a02e Merge pull request #3532 from Quezler/patch-66
unitBuildSpeedMultiplier | UnitSpawnAbility.java
2020-11-22 14:24:50 -05:00
Anuken
bf31a8c06b Merge remote-tracking branch 'origin/master' 2020-11-22 12:00:02 -05:00
Anuken
909dff7608 Bugfixes 2020-11-22 11:59:53 -05:00
Anuken
a8c22c1a99 Update bug_report.md 2020-11-22 11:38:38 -05:00
Patrick 'Quezler' Mounier
ebf7cf859e Update UnitSpawnAbility.java 2020-11-22 17:37:53 +01:00
Patrick 'Quezler' Mounier
3ef2c585a5 Update UnitSpawnAbility.java 2020-11-22 17:33:50 +01:00
feu-follet
84765f696b Update bundle_fr_BE.properties
Some fixes and new translations
2020-11-22 16:27:26 +01:00
YellOw139
925cc7318b Sector display polishes + Hints 2020-11-22 17:10:03 +02:00
Anuken
9dba2389bb Merge pull request #3522 from YellOw136/master
Missing Vietnamese characters bugfix
2020-11-22 08:58:25 -05:00
YellOw136
b707ef10f1 Add fixed font.woff 2020-11-22 12:59:42 +02:00
YellOw136
8f1d05b3e3 Delete font.woff 2020-11-22 12:59:12 +02:00
Felix Corvus
a84eb58d86 5 changed lines (@skykatik)
- sector.tarFields.description
- item.scrap.details
- block.resupply-point.description
- block.mass-driver.description
- block.mechanical-drill.description
2020-11-22 13:32:53 +03:00
Vanguard
b6b550fc04 1 changed line
map.multiplayer
2020-11-22 13:18:53 +03:00
Felix Corvus
df7d856aae 17 new lines; 7 changed lines; 21 removed lines
New:

- sectors.enemybase
- sectors.vulnerable
- sectors.underattack
- sectors.survives
- sector.curlost
- keybind.planet_map.name
- hint.schematicSelect
- hint.conveyorPathfind
- hint.conveyorPathfind.mobile
- hint.boost
- hint.command
- hint.command.mobile
- hint.payloadPickup
- hint.payloadPickup.mobile
- hint.payloadDrop
- hint.payloadDrop.mobile
- hint.waveFire

Changed:

- sector.overgrowth.description
- hint.mine
- hint.respawn.mobile
- hint.placeDrill.mobile
- hint.breaking.mobile
- hint.launch
- hint.launch.mobile

Removed:

- tutorial.next
- tutorial.intro
- tutorial.intro.mobile
- tutorial.drill
- tutorial.drill.mobile
- tutorial.blockinfo
- tutorial.conveyor
- tutorial.conveyor.mobile
- tutorial.turret
- tutorial.drillturret
- tutorial.pause
- tutorial.pause.mobile
- tutorial.unpause
- tutorial.unpause.mobile 
- tutorial.breaking
- tutorial.breaking.mobile
- tutorial.withdraw
- tutorial.deposit
- tutorial.waves
- tutorial.waves.mobile
- tutorial.launch
2020-11-22 13:15:07 +03:00
Anuken
19638da99d arc 2020-11-21 17:17:20 -05:00
Anuken
e4266d22f5 Added more hints 2020-11-21 17:17:03 -05:00
Nikolass1000
22bd64508c Small Omura fix 2020-11-21 22:15:44 +01:00
Anuken
b09dc47aad Bugfixes / Tutorial cleanup 2020-11-21 15:50:44 -05:00
Anuken
96b55c6b1c Merge pull request #3508 from DeltaNedas/extend
unified extend and extendContent to work for any class
2020-11-21 15:22:44 -05:00
Anuken
ac4a96eefb Merge pull request #3513 from Quezler/patch-64
Sync construction blocks
2020-11-21 15:22:25 -05:00
Felix Corvus
1b0d2dcdc0 23 new lines
- map.multiplayer
- hint.skip
- hint.desktopMove
- hint.zoom
- hint.mine
- hint.desktopShoot
- hint.depositItems
- hint.respawn
- hint.respawn.mobile
- hint.desktopPause
- hint.placeDrill
- hint.placeDrill.mobile
- hint.placeConveyor
- hint.placeConveyor.mobile
- hint.placeTurret
- hint.breaking
- hint.breaking.mobile
- hint.research
- hint.research.mobile
- hint.unitControl
- hint.unitControl.mobile
- hint.launch
- hint.launch.mobile
2020-11-21 22:32:16 +03:00
Nikolass1000
cd7c90f1f6 Polish unit descriptions 2020-11-21 20:30:18 +01:00
Anuken
3b991952b1 Merge remote-tracking branch 'origin/master' 2020-11-21 14:06:06 -05:00
Anuken
6fba84959c New hint tutorial system (unfinished!) 2020-11-21 14:05:58 -05:00
YellOw139
0662fd8427 Sector not found 2020-11-21 20:55:53 +02:00
Patrick 'Quezler' Mounier
55a929010e Remove stray newline 2020-11-21 18:51:50 +01:00
Patrick 'Quezler' Mounier
c6657109b1 Sync construction blocks 2020-11-21 16:59:09 +01:00
Nikolass1000
0422cf79b2 Polish language update. 2020-11-21 15:33:21 +01:00
Anuken
3ce6a6dea4 Merge pull request #3502 from skykatik/patch-8
[Typo] communitycommunity servers
2020-11-21 08:59:30 -05:00
DeltaNedas
09eed078cd unified extend and extendContent to work for any class 2020-11-21 13:04:17 +00:00
Skat
2b22170318 [Typo] communitycommunity servers 2020-11-21 10:31:10 +03:00
Felix Corvus
589971a8c3 1 new line
sector.curlost
2020-11-21 02:09:15 +03:00
Anuken
522a7f4728 Fixed #3493 but for point defense turrets 2020-11-20 12:53:51 -05:00
Anuken
06921b53be Fixed #3493 2020-11-20 12:53:09 -05:00
Anuken
1372fc4079 Fixed sector gameover ghost bug 2020-11-20 12:38:16 -05:00
Anuken
aa2783a885 Testing higher build numbers 2020-11-20 11:26:49 -05:00
Anuken
dbc0e6751b Merge remote-tracking branch 'origin/master' 2020-11-20 11:23:35 -05:00
Anuken
814065bf8e Removed Rules#tutorial 2020-11-20 11:23:30 -05:00
Anuken
3e5d5e4064 Merge pull request #3483 from skykatik/patch-7
Added missed log argument
2020-11-20 10:31:35 -05:00
Anuken
139fa329d4 Merge remote-tracking branch 'origin/master' 2020-11-20 09:13:40 -05:00
Anuken
abdccbb1bd Fixed #3487 / Fixed #3484 2020-11-20 09:13:36 -05:00
Anuken
0e4ec86f34 Merge pull request #3482 from Quezler/patch-59
Remove double whiteline from under package
2020-11-20 09:05:07 -05:00
Skat
67dcc28312 Update ServerControl.java 2020-11-20 12:58:46 +03:00
Patrick 'Quezler' Mounier
2d06495472 Remove double whiteline from under package 2020-11-20 10:55:01 +01:00
YellOw139
88535665e8 revert 2020-11-20 07:36:11 +02:00
YellOw139
75744256f9 Brief test 2020-11-20 07:31:50 +02:00
Anuken
a0f1f52a8b CI cleanup 2020-11-19 19:44:49 -05:00
Anuken
b1ace4a7c9 CI cleanup 2020-11-19 19:39:40 -05:00
Anuken
8214188215 CI cleanup 2020-11-19 19:32:27 -05:00
Anuken
07ddf806ac CI cleanup 2020-11-19 19:27:21 -05:00
Anuken
8bd2b9b45c CI cleanup 2020-11-19 19:26:10 -05:00
Anuken
4e9b07d8e2 CI cleanup 2020-11-19 18:54:28 -05:00
Anuken
a7aad1a1f9 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.github/workflows/gradle.yml
2020-11-19 18:53:15 -05:00
Anuken
f71b726877 Testing Github Actions CI 2020-11-19 18:53:02 -05:00
Petr Gašparík
e700ef179e Czech translation up to commit 72d5a8a.
Hell of a work.
2020-11-20 00:33:13 +01:00
Anuken
ffcda6d246 Merge pull request #3470 from Quezler/patch-58
Allow for plugins to trigger the same alerts as sectors and guardians
2020-11-19 16:17:04 -05:00
Anuken
4d113a6aac Merge pull request #3472 from DeltaNedas/buildpr
upload pr jar
2020-11-19 15:13:58 -05:00
Patrick 'Quezler' Mounier
a6d1ac0b86 Use icon font in favor of def 2020-11-19 21:08:07 +01:00
Patrick 'Quezler' Mounier
637cca2e66 Probably one more 2020-11-19 20:50:14 +01:00
Patrick 'Quezler' Mounier
72136ebea3 Or is it? 2020-11-19 20:36:58 +01:00
Patrick 'Quezler' Mounier
ce045a470a Update NetClient.java 2020-11-19 20:34:49 +01:00
DeltaNedas
647911725b compile the jar first 2020-11-19 19:34:16 +00:00
DeltaNedas
61582fed3a upload pr jar 2020-11-19 19:15:23 +00:00
Patrick 'Quezler' Mounier
07893eee9c Allow for plugins to trigger the same alerts as sectors and guardians 2020-11-19 19:50:30 +01:00
Anuken
15ef32447c Merge remote-tracking branch 'origin/master' 2020-11-19 13:31:03 -05:00
Anuken
aef6ac4335 Made RepairAI only move toward ally buildings 2020-11-19 13:30:59 -05:00
Anuken
d63efb1ff0 Merge pull request #3467 from Quezler/patch-57
Give some techtree brackets a new line
2020-11-19 12:45:05 -05:00
Anuken
f4c69372c9 Merge pull request #3468 from skykatik/patch-6
Remove space in ban message & added @ for argument
2020-11-19 12:44:52 -05:00
Skat
16adbd667d Update ServerControl.java 2020-11-19 20:40:00 +03:00
Patrick 'Quezler' Mounier
dd9b85f79b Give some techtree brackets a new line 2020-11-19 18:32:03 +01:00
Anuken
c468bdef6d Merge remote-tracking branch 'origin/master' 2020-11-19 12:31:31 -05:00
Anuken
97c3d36bae Re-added preloading of ground enemy path / Core unit casing FX 2020-11-19 12:31:27 -05:00
Anuken
9033683e15 Merge pull request #3466 from Quezler/patch-55
Remove leading space from console kick message
2020-11-19 12:22:49 -05:00
Patrick 'Quezler' Mounier
1c48bc786b Remove leading space from console kick message 2020-11-19 18:21:17 +01:00
Anuken
7612a22480 Implemented legacy (V5) research loading 2020-11-19 11:55:46 -05:00
Felix Corvus
f07a108410 1 line changed
block.interplanetary-accelerator.description
2020-11-19 19:08:25 +03:00
YellOw139
babb6616ef Interplanetary strings 2020-11-19 10:02:32 +02:00
YellOw139
9fe01eec38 Translation Allowed + few commit bumps 2020-11-18 10:55:41 +02:00
YellOw139
73955611d1 sector stuff 2020-11-17 11:22:04 +02:00
YellOw139
f56c944329 translation forbidden 2020-11-16 07:55:48 +02:00
YellOw139
7affde5a2e oh no no ui 2020-11-15 23:49:30 +02:00
YellOw139
4a46baecae Updated indev and scrap 2020-11-15 22:46:13 +02:00
YellOw139
e9f7ba5f41 Enemy Cores in Sectors 2020-11-15 18:16:58 +02:00
YellOw139
775b3592a3 reqs typos/improvements 2020-11-14 22:14:13 +02:00
YellOw139
59a7b584fb req.produce 2020-11-14 22:10:24 +02:00
YellOw139
3055485e17 Good stuff I can't even translate 2020-11-14 10:22:59 +02:00
YellOw139
bd992b4612 Unit stats look threatening 2020-11-14 00:01:17 +02:00
YellOw139
56fece1a30 [Bundle][RO] Translation Update
This PR was tested in-game and is ready to merge at any time (unless marked as draft).

Changelog:

- New strings/changes up to commit ddc2cc7098
- Typo fixes & various other improvements
2020-11-11 21:51:00 +02:00
90 changed files with 1550 additions and 1056 deletions

View File

@@ -24,4 +24,5 @@ assignees: ''
--- ---
*Place an X (no spaces) between the brackets to confirm that you have read the line below.* *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.** - [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.**

59
.github/workflows/deployment.yml vendored Normal file
View File

@@ -0,0 +1,59 @@
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: Create artifacts
run: |
./gradlew desktop:dist server:dist core:javadoc -Pbuildversion=${GITHUB_REF:1}"
- name: Update docs
run: |
cd ../
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 ${GITHUB_REF: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 ${GITHUB_REF}
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/Arc ${GITHUB_REF};
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 ${GITHUB_REF:1}"
echo versionName=6-fdroid-${GITHUB_REF:1}$'\n'versionCode=${GITHUB_REF:1} > version_fdroid.txt
git add .
git commit -m "Updating to build ${GITHUB_REF:1}"
cd ../Mindustry
- name: Upload client artifacts
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: desktop/libs/Mindustry.jar
tag: ${{ github.ref }}
- name: Upload server artifacts
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: server/libs/server-release.jar
tag: ${{ github.ref }}

View File

@@ -1,27 +0,0 @@
name: Java CI
on: [push, pull_request]
jobs:
buildJava14:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 14
uses: actions/setup-java@v1
with:
java-version: 14
- name: Run unit tests with gradle and Java 14
run: ./gradlew compileJava
buildJava15:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 15
uses: actions/setup-java@v1
with:
java-version: 15
- name: Run unit tests with gradle and Java 15
run: ./gradlew compileJava

21
.github/workflows/pr.yml vendored Normal file
View File

@@ -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

24
.github/workflows/push.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: Tests
on: [push]
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 test
- name: Trigger BE build
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}

View File

@@ -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=6-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
cleanup: false
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=

View File

@@ -35,7 +35,8 @@ dependencies{
natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}" natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
//android dependencies magically disappear during compilation, thanks gradle! //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){ task deploy(type: Copy){

View File

@@ -46,7 +46,7 @@ public class AssetsProcess extends BaseProcessor{
String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", ""); String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", "");
if(SourceVersion.isKeyword(name) || name.equals("char")) 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), ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class),
@@ -64,7 +64,7 @@ public class AssetsProcess extends BaseProcessor{
int code = val.getInt("code", 0); int code = val.getInt("code", 0);
iconcAll.append((char)code); iconcAll.append((char)code);
ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + code).build()); 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); ichinit.addStatement("codes.put($S, $L)", name, code);
ictype.addField(TextureRegionDrawable.class, name + "Small", Modifier.PUBLIC, Modifier.STATIC); ictype.addField(TextureRegionDrawable.class, name + "Small", Modifier.PUBLIC, Modifier.STATIC);

View File

@@ -99,6 +99,17 @@ allprojects{
return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1) 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 = { generateLocales = {
def output = 'en\n' def output = 'en\n'
def bundles = new File(project(':core').projectDir, 'assets/bundles/') def bundles = new File(project(':core').projectDir, 'assets/bundles/')

View File

@@ -497,6 +497,7 @@ requirement.produce = Produce {0}
requirement.capture = Capture {0} requirement.capture = Capture {0}
launch.text = Launch launch.text = Launch
research.multiplayer = Only the host can research items. research.multiplayer = Only the host can research items.
map.multiplayer = Only the host can view sectors.
uncover = Uncover uncover = Uncover
configure = Configure Loadout configure = Configure Loadout
@@ -547,8 +548,13 @@ sectors.launch = Launch
sectors.select = Select sectors.select = Select
sectors.nonelaunch = [lightgray]none (sun) sectors.nonelaunch = [lightgray]none (sun)
sectors.rename = Rename Sector 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.curcapture = Sector Captured
sector.curlost = Sector Lost
sector.missingresources = [scarlet]Insufficient Core Resources sector.missingresources = [scarlet]Insufficient Core Resources
sector.attacked = Sector [accent]{0}[white] under attack! sector.attacked = Sector [accent]{0}[white] under attack!
sector.lost = Sector [accent]{0}[white] lost! sector.lost = Sector [accent]{0}[white] lost!
@@ -589,7 +595,7 @@ 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.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.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.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.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.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.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.
@@ -799,7 +805,6 @@ setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
setting.sensitivity.name = Controller Sensitivity setting.sensitivity.name = Controller Sensitivity
setting.saveinterval.name = Save Interval setting.saveinterval.name = Save Interval
setting.seconds = {0} seconds setting.seconds = {0} seconds
setting.blockselecttimeout.name = Block Select Timeout
setting.milliseconds = {0} milliseconds setting.milliseconds = {0} milliseconds
setting.fullscreen.name = Fullscreen setting.fullscreen.name = Fullscreen
setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required)
@@ -888,6 +893,7 @@ keybind.menu.name = Menu
keybind.pause.name = Pause keybind.pause.name = Pause
keybind.pause_building.name = Pause/Resume Building keybind.pause_building.name = Pause/Resume Building
keybind.minimap.name = Minimap keybind.minimap.name = Minimap
keybind.planet_map.name = Planet Map
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Player List keybind.player_list.name = Player List
keybind.console.name = Console keybind.console.name = Console
@@ -1234,27 +1240,39 @@ team.derelict.name = derelict
team.green.name = green team.green.name = green
team.purple.name = purple team.purple.name = purple
tutorial.next = [lightgray]<Tap to continue> hint.skip = Skip
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 hint.desktopMove = Use [accent][[WASD][] to move.
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 hint.zoom = [accent]Scroll[] to zoom in or out.
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. hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
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. hint.desktopShoot = [accent][[Left-click][] to shoot.
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.[] hint.depositItems = To transfer items, drag from your ship to the core.
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. hint.respawn = To respawn as a ship, press [accent][[V][].
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. hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
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. hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
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 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.
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. 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.
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. 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.
tutorial.unpause = Now press space again to unpause. 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.
tutorial.unpause.mobile = Now press it again to unpause. 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.
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. hint.breaking = [accent]Right-click[] and drag to break blocks.
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. 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.
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.[] hint.research = Use the \ue875 [accent]Research[] button to research new technology.
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.[] hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
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. hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
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. hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets.
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.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 into formation.
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.
item.copper.description = Used in all types of construction and ammunition. 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.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced.

View File

@@ -10,18 +10,22 @@ link.dev-builds.description = Nestabilní vývojová verze hry
link.trello.description = Oficiální Trello nástěnka s plánovanými novinkami 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.itch.io.description = Stránka na itch.io s odkazy na stažení hry
link.google-play.description = Obchod Google Play 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.wiki.description = Oficiální Wiki Mindustry
link.suggestions.description = Suggest new features link.suggestions.description = Suggest new features
linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky. linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky.
screenshot = Snímek obrazovky uložen {0} screenshot = Snímek obrazovky uložen {0}
screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky. screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky.
gameover = Konec hry gameover = Konec hry
gameover.disconnect = Odpojit se
gameover.pvp = Vyhrál tým [accent]{0}[]! gameover.pvp = Vyhrál tým [accent]{0}[]!
gameover.waiting = [accent]Hra čeká na další mapu...
highscore = [accent]Nový rekord! highscore = [accent]Nový rekord!
copied = Zkopírováno. copied = Zkopírováno.
indev.popup = Mindustry [accent]v6[] je aktuálně ve verzi [accent]beta[].\n[lightgray]To znamená:[]\n[scarlet]- Kampaň je nedokončená[]\n- SFX a hudba je nedokončená nebo chybí\n- Cokoli, co vidíte, se může změnit nebo být odstraněno.\n\nHlaste prosím chyby na [accent]Github[]. indev.popup = Mindustry [accent]v6[] je aktuálně ve verzi [accent]beta[].\n[lightgray]To znamená:[]\n[scarlet]- Kampaň je nedokončená[]\n- Cokoli, co vidíte, se může změnit nebo být odstraněno.\n\nHlaste prosím chyby na [accent]Github[].
indev.notready = Tato část hry ještě není připravena indev.notready = Tato část hry ještě není připravena
indev.campaign = [accent]Dovrš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.sound = Zvuky
load.map = Mapy load.map = Mapy
@@ -57,6 +61,7 @@ schematic.rename = Přejmenovat šablonu
schematic.info = {0}x{1}, {2} bloků 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. 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.wave = Vln poraženo: [accent]{0}
stat.enemiesDestroyed = Nepřátel zničeno: [accent]{0}[] stat.enemiesDestroyed = Nepřátel zničeno: [accent]{0}[]
stat.built = Budov postaveno: [accent]{0}[] stat.built = Budov postaveno: [accent]{0}[]
@@ -189,6 +194,10 @@ servers.local = Místní servery
servers.remote = Vzdálené servery servers.remote = Vzdálené servery
servers.global = Komunitní servery servers.global = Komunitní servery
servers.showhidden = Zobraz skryté servery
server.shown = Zobrazené
server.hidden = Skryté
trace = Vystopovat hráče trace = Vystopovat hráče
trace.playername = Jméno hráče: [accent]{0}[] trace.playername = Jméno hráče: [accent]{0}[]
trace.ip = Adresa IP: [accent]{0}[] trace.ip = Adresa IP: [accent]{0}[]
@@ -267,6 +276,9 @@ cancel = Zrušit
openlink = Otevřít odkaz openlink = Otevřít odkaz
copylink = Zkopírovat odkaz copylink = Zkopírovat odkaz
back = Zpět 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.export = Exportovat data
data.import = Importovat data data.import = Importovat data
data.openfolder = Otevřít složku s daty data.openfolder = Otevřít složku s daty
@@ -283,6 +295,7 @@ cancelbuilding = [accent][[{0}][] vyčistí plán šablony
selectschematic = [accent][[{0}][] provede výběr a zkopírování selectschematic = [accent][[{0}][] provede výběr a zkopírování
pausebuilding = [accent][[{0}][] zastaví stavění pausebuilding = [accent][[{0}][] zastaví stavění
resumebuilding = [scarlet][[{0}][] bude pokračovat ve 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 = [accent]Vlna číslo {0}[]
wave.cap = [accent]Vlna {0} z {1}[] wave.cap = [accent]Vlna {0} z {1}[]
wave.waiting = [lightgray]Vlna za {0} vteřin[] wave.waiting = [lightgray]Vlna za {0} vteřin[]
@@ -290,7 +303,9 @@ wave.waveInProgress = [lightgray]Vlna přichází![]
waiting = [lightgray]Čekám...[] waiting = [lightgray]Čekám...[]
waiting.players = Čekání na hráče... waiting.players = Čekání na hráče...
wave.enemies = [lightgray]{0} zbývajících nepřátel 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 = Počet vln do příchodu strážce: [accent]{0}[].
wave.guardianwarn.one = [accent]Strážce přijde již příští vlnu![] wave.guardianwarn.one = [accent]Strážce přijde již příští vlnu![]
loadimage = Nahrát obrázek loadimage = Nahrát obrázek
@@ -420,7 +435,7 @@ toolmode.drawteams.description = Kreslí týmy místo bloků.
filters.empty = [lightgray]Nejsou zadány žádné filtry, přidej filtr tlačítkem níže.[] filters.empty = [lightgray]Nejsou zadány žádné filtry, přidej filtr tlačítkem níže.[]
filter.distort = Zkreslení filter.distort = Zkreslení
filter.noise = Zašumění filter.noise = Zašumění
filter.enemyspawn = Výběr nepřítelské líhně filter.enemyspawn = Výběr nepřátelské líhně
filter.spawnpath = Cesta k líhni filter.spawnpath = Cesta k líhni
filter.corespawn = Váběr ládra filter.corespawn = Váběr ládra
filter.median = Medián filter.median = Medián
@@ -463,7 +478,9 @@ load = Načíst
save = Uložit save = Uložit
fps = FPS: {0} fps = FPS: {0}
ping = Odezva: {0} ms 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 settings = Volby
tutorial = Výuka tutorial = Výuka
tutorial.retake = Spustit znovu výuku. tutorial.retake = Spustit znovu výuku.
@@ -476,18 +493,20 @@ locked = Zamčeno
complete = [lightgray]Dokončeno: complete = [lightgray]Dokončeno:
requirement.wave = Dosáhni vlny {0} na mapě {1} requirement.wave = Dosáhni vlny {0} na mapě {1}
requirement.core = Znič nepřátelské jádro na mapě {0} requirement.core = Znič nepřátelské jádro na mapě {0}
requirement.research = Vynalezeno {0} requirement.research = Vynalezni {0}
requirement.capture = Polapeno {0} requirement.produce = Vyrob {0}
bestwave = [lightgray]Nejvyšší vlna: {0} requirement.capture = Polap {0}
launch.text = Vyslat launch.text = Vyslat
research.multiplayer = Jen hostitel hry může vynalézat nové technologie. research.multiplayer = Jen hostitel hry může vynalézat nové technologie.
uncover = Odkrýt mapu uncover = Odkrýt mapu
configure = Přizpůsobit vybavení configure = Přizpůsobit vybavení
#TODO #TODO
loadout = Načtení loadout = Načtení
resources = Zdroje resources = Zdroje
bannedblocks = Zakázané bloky bannedblocks = Zakázané bloky
addall = Přidat vše addall = Přidat vše
launch.from = Vysláno z: [accent]{0}
launch.destination = Cíl: {0} launch.destination = Cíl: {0}
configure.invalid = Hodnota musí být číslo mezi 0 a {0}. configure.invalid = Hodnota musí být číslo mezi 0 a {0}.
zone.unlocked = [lightgray]Mapa {0} byla odemknuta.[] zone.unlocked = [lightgray]Mapa {0} byla odemknuta.[]
@@ -519,19 +538,36 @@ weather.fog.name = Mlha
sectors.unexplored = [lightgray]Neprozkoumáno sectors.unexplored = [lightgray]Neprozkoumáno
sectors.resources = Zdroje: sectors.resources = Zdroje:
sectors.production = Výroba: sectors.production = Výroba:
sectors.export = Export:
sectors.time = Čas:
sectors.threat = Ohrožení:
sectors.wave = Vlna:
sectors.stored = Uskladněno: sectors.stored = Uskladněno:
sectors.resume = Pokračovat sectors.resume = Pokračovat
sectors.launch = Vyslat sectors.launch = Vyslat
sectors.select = Vybrat sectors.select = Vybrat
sectors.nonelaunch = [lightgray]bez (slunce)[] sectors.nonelaunch = [lightgray]bez (slunce)[]
sectors.rename = Přejmenovat sektor sectors.rename = Přejmenovat sektor
sector.missingresources = [scarlet]Nedostatečné zdroje v jádře[]
sector.curcapture = Sektor polapen
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: the missing space in the line below is intentional
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.serpulo.name = Serpulo
#TODO better name
planet.sun.name = Sol planet.sun.name = Sol
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway sector.impact0078.name = Dopad 0078
sector.groundZero.name = Základní tábor sector.groundZero.name = Základní tábor
sector.craters.name = Krátery sector.craters.name = Krátery
sector.frozenForest.name = Zamrzlý les sector.frozenForest.name = Zamrzlý les
@@ -543,16 +579,19 @@ sector.overgrowth.name = Džungle
sector.tarFields.name = Dehtová pole sector.tarFields.name = Dehtová pole
sector.saltFlats.name = Solné nížiny sector.saltFlats.name = Solné nížiny
sector.fungalPass.name = Plísňový průsmyk 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
#unused #unused
#sector.impact0078.name = Impact 0078
#sector.crags.name = Crags #sector.crags.name = Crags
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.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.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.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.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.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 Dýka a znič s jejich pomocí jádro základny. Získej znovu to, co bylo již dávno ztraceno.
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.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.[]
@@ -590,6 +629,7 @@ unit.nobuild = [scarlet]Jednotka nemůže stavět
lastaccessed = [lightgray]Naposledy použil: {0} lastaccessed = [lightgray]Naposledy použil: {0}
block.unknown = [lightgray]???[] block.unknown = [lightgray]???[]
stat.description = Účel
stat.input = Vstup stat.input = Vstup
stat.output = Výstup stat.output = Výstup
stat.booster = Posilovač stat.booster = Posilovač
@@ -617,6 +657,8 @@ stat.memorycapacity = Kapacita paměti
stat.basepowergeneration = Základní generování energie stat.basepowergeneration = Základní generování energie
stat.productiontime = Čas produkce stat.productiontime = Čas produkce
stat.repairtime = Čas do úplné opravy stat.repairtime = Čas do úplné opravy
stat.weapons = Zbraně
stat.bullet = Střela
stat.speedincrease = Zvýšení rychlosti stat.speedincrease = Zvýšení rychlosti
stat.range = Dosah stat.range = Dosah
stat.drilltier = Lze těžit stat.drilltier = Lze těžit
@@ -624,9 +666,9 @@ stat.drillspeed = Základní rychlost vrtu
stat.boosteffect = Účinek posílení stat.boosteffect = Účinek posílení
stat.maxunits = Nejvýše aktivních jednotek stat.maxunits = Nejvýše aktivních jednotek
stat.health = Životy stat.health = Životy
stat.buildtime = Čas stavby stat.buildtime = Čas konstrukce
stat.maxconsecutive = Nejvýše po sobě stat.maxconsecutive = Nejvýše po sobě
stat.buildcost = Cena stavby stat.buildcost = Cena konstrukce
stat.inaccuracy = Nepřesnost stat.inaccuracy = Nepřesnost
stat.shots = Střely stat.shots = Střely
stat.reload = Střel za 1s stat.reload = Střel za 1s
@@ -657,6 +699,7 @@ ability.repairfield = Opravit pole
ability.statusfield = Stav pole ability.statusfield = Stav pole
ability.unitspawn = {0} továrna ability.unitspawn = {0} továrna
ability.shieldregenfield = Silově opravné pole ability.shieldregenfield = Silově opravné pole
ability.movelightning = Pohybující se blesk
bar.drilltierreq = Je vyžadován lepší vrt bar.drilltierreq = Je vyžadován lepší vrt
bar.noresources = Chybějí zdroje bar.noresources = Chybějí zdroje
@@ -676,7 +719,7 @@ bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[jednotka je v
bar.liquid = Chlazení bar.liquid = Chlazení
bar.heat = Teplo bar.heat = Teplo
bar.power = Energie bar.power = Energie
bar.progress = Stavba v průběhu bar.progress = Konstrukce v průběhu
bar.input = Vstup bar.input = Vstup
bar.output = Výstup bar.output = Výstup
@@ -684,13 +727,15 @@ units.processorcontrol = [lightgray]Procesor je ovládán[]
bullet.damage = [stat]{0}[lightgray] poškození[] bullet.damage = [stat]{0}[lightgray] poškození[]
bullet.splashdamage = [stat]{0}[lightgray] plošného poškození ~[stat] {1}[lightgray] dlaždic 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.homing = [stat]samonaváděcí
bullet.shock = [stat]šokové bullet.shock = [stat]šokový
bullet.frag = [stat]trhavé bullet.frag = [stat]trhavý
bullet.knockback = [stat]{0}[lightgray] odhození[] bullet.knockback = [stat]{0}[lightgray] odhození[]
bullet.pierce = [stat]{0}[lightgray]x průrazné[] bullet.pierce = [stat]{0}[lightgray]x průrazné[]
bullet.infinitepierce = [stat]průrazné[] bullet.infinitepierce = [stat]průrazné[]
bullet.healpercent = [stat]{0}[lightgray]% opravující
bullet.freezing = [stat]zmrazující[] bullet.freezing = [stat]zmrazující[]
bullet.tarred = [stat]dehtující[] bullet.tarred = [stat]dehtující[]
bullet.multiplier = [stat]{0}[lightgray]x více střel[] bullet.multiplier = [stat]{0}[lightgray]x více střel[]
@@ -715,6 +760,7 @@ unit.items = předměty
unit.thousands = tis unit.thousands = tis
unit.millions = mio unit.millions = mio
unit.billions = mld unit.billions = mld
category.purpose = Účel
category.general = Všeobecné category.general = Všeobecné
category.power = Energie category.power = Energie
category.liquids = Kapaliny category.liquids = Kapaliny
@@ -728,7 +774,7 @@ setting.blockreplace.name = Automatický návrh bloků
setting.linear.name = Lineární filtrování setting.linear.name = Lineární filtrování
setting.hints.name = Rady a tipy setting.hints.name = Rady a tipy
setting.flow.name = Zobrazit rychlost toku zdroje [scarlet](experimentální)[] setting.flow.name = Zobrazit rychlost toku zdroje [scarlet](experimentální)[]
setting.backgroundpause.name = Pozastavit na pozadí setting.backgroundpause.name = Pozastavit v pozadí
setting.buildautopause.name = Automaticky pozastavit stavění setting.buildautopause.name = Automaticky pozastavit stavění
setting.animatedwater.name = Animované povrchy setting.animatedwater.name = Animované povrchy
setting.animatedshields.name = Animované štíty setting.animatedshields.name = Animované štíty
@@ -859,7 +905,7 @@ keybind.drop_unit.name = Zahodit jednotku
keybind.zoom_minimap.name = Přiblížit mapu keybind.zoom_minimap.name = Přiblížit mapu
mode.help.title = Popis režimů mode.help.title = Popis režimů
mode.survival.name = Hra o přežití 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.name = Pískoviště
mode.sandbox.description = Zdroje jsou nekonečné, vlny nepřátel nemají automatické načasování. mode.sandbox.description = Zdroje jsou nekonečné, vlny nepřátel nemají automatické načasování.
mode.editor.name = Editor mode.editor.name = Editor
@@ -909,6 +955,7 @@ content.item.name = Předměty
content.liquid.name = Kapaliny content.liquid.name = Kapaliny
content.unit.name = Jednotky content.unit.name = Jednotky
content.block.name = Bloky content.block.name = Bloky
content.sector.name = Sektory
item.copper.name = Měď item.copper.name = Měď
item.lead.name = Olovo item.lead.name = Olovo
@@ -927,7 +974,7 @@ item.pyratite.name = Pyratit
item.metaglass.name = Metasklo item.metaglass.name = Metasklo
item.scrap.name = Šrot item.scrap.name = Šrot
liquid.water.name = Voda liquid.water.name = Voda
liquid.slag.name = Roztavený kov liquid.slag.name = Struska
liquid.oil.name = Nafta liquid.oil.name = Nafta
liquid.cryofluid.name = Chladící kapalina liquid.cryofluid.name = Chladící kapalina
@@ -970,7 +1017,7 @@ block.parallax.name = Paralaxa
block.cliff.name = Útes block.cliff.name = Útes
block.sand-boulder.name = Pískovec block.sand-boulder.name = Pískovec
block.grass.name = Tráva block.grass.name = Tráva
block.slag.name = Slag block.slag.name = Struska
block.space.name = Vesmír block.space.name = Vesmír
block.salt.name = Sůl block.salt.name = Sůl
block.salt-wall.name = Solné skály block.salt-wall.name = Solné skály
@@ -1066,7 +1113,6 @@ block.conveyor.name = Dopravník
block.titanium-conveyor.name = Titanoový dopravník block.titanium-conveyor.name = Titanoový dopravník
block.plastanium-conveyor.name = Plastanový přepravník block.plastanium-conveyor.name = Plastanový přepravník
block.armored-conveyor.name = Obrněný dopravní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.junction.name = Křižovatka
block.router.name = Směrovač block.router.name = Směrovač
block.distributor.name = Rozdělovač block.distributor.name = Rozdělovač
@@ -1148,7 +1194,7 @@ block.fuse.name = Fúze
block.shock-mine.name = Šoková mina block.shock-mine.name = Šoková mina
block.overdrive-projector.name = Urychlující projektor block.overdrive-projector.name = Urychlující projektor
block.force-projector.name = Silový projektor block.force-projector.name = Silový projektor
block.arc.name = Oblouk block.arc.name = Výboj
block.rtg-generator.name = RTG block.rtg-generator.name = RTG
block.spectre.name = Přízrak block.spectre.name = Přízrak
block.meltdown.name = Rozpékač block.meltdown.name = Rozpékač
@@ -1170,6 +1216,11 @@ block.payload-router.name = Směřovač nákladu
block.disassembler.name = Rozebírač block.disassembler.name = Rozebírač
block.silicon-crucible.name = Tavicí tyglík pro křemík block.silicon-crucible.name = Tavicí tyglík pro křemík
block.overdrive-dome.name = Velká urychlující kupole 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.switch.name = Přepínač
block.micro-processor.name = Mikroprocesor block.micro-processor.name = Mikroprocesor
@@ -1196,10 +1247,10 @@ tutorial.drill.mobile = Sám vidíš, že ruční těžba není moc efektivní.\
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.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 = 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.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.turret = Jakmile se materiál dostane do jádra, může být použit pro konstrukci.\nPamatuj si, že ne všechno lze použít pro konstrukci.\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é konstrukce.\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.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 = Během hry, například v boji, můžeš [accent]pozastavit hru[].\nPři pozastavení můžeš naplánovat konstrukci 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.pause.mobile = Během hry, například v boji, můžeš [accent]pozastavit hru[].\nPři pozastavení můžeš naplánovat konstrukci 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 = 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.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 = 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[].
@@ -1210,136 +1261,207 @@ tutorial.waves = [lightgray]Nepřítel[] se přibližuje.\n\nUbraň své jádro
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.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[]. 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[].
item.copper.description = Nejběžnější stavební materiál. Používá se ve všech typech bloků. item.copper.description = Používá se ve všech typech bloků a munice.
item.lead.description = Základní materiál. Používá se v energetických blocích a při přepravě kapalin. item.copper.details = Měď. Nezvykle nadpočetný kov na Serpulu. Konstrukčně slabý, pokud není rafinovaná.
item.metaglass.description = Velmi tvrdá skleněná sloučenina. Hodně používaná pro ukládání a rozvod kapalin. item.lead.description = Používá se v přepravě kapalin a elektrických konstrukcích.
item.graphite.description = Mineralizovaný uhlík, používaný v energetických komponentách a též jako munice. 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.sand.description = Běžný materiál, který se hojně používá při slévání a tavení. item.metaglass.description = Používá se v přepravě kapalin a úložných konstrukcích.
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.graphite.description = Používá se v elektrických komponentách a nábojích do věží.
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.sand.description = Používá se ve výrobě ostatních rafinovaných materiálů.
item.thorium.description = Hutný, radioaktivní materiál, využívaný jako strukturální podpora a nuklearní palivo. item.coal.description = Používá se na palivo a výrobu rafinovaný materiálů.
item.scrap.description = Zbytky starých struktur a jednotek. Obsahuje stopové množství mnoha různých kovů. 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.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.titanium.description = Používá se v konstrukcích pro přepravu kapalin, ve vrtácích a letectví.
item.plastanium.description = Lehký, kujný materiál, využívaný v pokročilém letectví a jako tříštivá munice. item.thorium.description = Používá se v bytelných konstrukcích a též jako nukleární palivo.
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.scrap.description = Používá se v tavičích a drtičích pro rafinaci na jiné materiály.
item.surge-alloy.description = Vyspělá slitina s jedinečnými energetickými vlastnostmi. item.scrap.details = Zbytky zbytků starých konstrukcí a jednotek.
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.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.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.plastanium.description = Používá se v pokročilých jednotkách, izolaci a tříštivé munici.
item.pyratite.description = Extrémně vznětlivá substance, používaná ve zápalném střelivu. item.phase-fabric.description = Používá se v pokročilé elektronice a samoopravných konstrukcích.
liquid.water.description = Nejužitečnější kapalina. Hojně využívaná jak chlazení do strojů a též pro výrobu spór. item.surge-alloy.description = Používá se v pokročilém zbrojnictví a reakčních obranných konstrukcích.
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. item.spore-pod.description = Používá se pro přeměnu na ropu, výbušniny a palivo.
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ň. 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.
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.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. liquid.water.description = Používá se pro chladící stroje a na zpracování odpadu.
block.graphite-press.description = Přeměňuje neforemné kusy uhlí do ušlechtilých výlisků grafitu. liquid.slag.description = Používá se v oddělovačích pro rozdělení na jednotlivé kovy, nebo je chrlena na protivníky z věží.
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í. liquid.oil.description = Používá se v pokročilé materiálové výrobě a jako zápalná munice.
block.silicon-smelter.description = Redukuje písek vyčištěným uhlím, čímž vyrábí křemík. liquid.cryofluid.description = Používá se jako chladící kapalina v reaktorech, věžích a továrnách.
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.resupply-point.description = Zásobuje okolní jednotky měděnou municí. Není kompatibilní s jednotkami, které vyžadují energii z baterie.
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.armored-conveyor.description = Přepravuje předměty vpřed. Nepřijímá předměty ze stran.
block.alloy-smelter.description = Produkuje rázovou slitinu z titanu, olova, křemíku a mědi. block.illuminator.description = Vydává světlo.
block.cryofluid-mixer.description = Míchá vodu a jemný titanová prášek do chladící kapaliny, nezbytné například pro thoriový reaktor. block.message.description = Ukládá zprávu pro komunikaci mezi spojenci.
block.blast-mixer.description = Drtí a míchá shluky spór s pyratitem, čímž vzniká výbušnina. block.graphite-press.description = Lisuje uhlí na grafit.
block.pyratite-mixer.description = Míchá uhlí, olovo a písek do vysoce hořlavého pyratitu. block.multi-press.description = Lisuje uhlí na grafit. Vyžaduje vodu jako chladivo.
block.melter.description = Taví šrot do roztaveného kovu pro další zpracování, nebo pro munici do střílny Vlna. block.silicon-smelter.description = Rafinuje křemík z písku a uhlí.
block.separator.description = Odděluje z roztaveného kovu jednotlivé minerální součásti, které na výstupu zchlazuje do pevné formy. block.kiln.description = Taví písek a olovo na metasklo.
block.spore-press.description = Lisuje ze spór pod enormním tlakem naftu. 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.pulverizer.description = Drtí šrot na jemný písek.
block.coal-centrifuge.description = Tuhne naftu do kusů uhlí. block.coal-centrifuge.description = Přetváří naftu na uhlí.
block.incinerator.description = Vypaří jakékoliv nadbytečné předměty nebo kapaliny, které mu pošleš. block.incinerator.description = Vypařuje jakékoliv předměty nebo kapaliny, které obdrží.
block.power-void.description = Zničí jakoukoliv energii, kterou bloku pošleš. Jen pro režim Pískoviště. 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 pro 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 pro 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 pro 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 pro 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 pro 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 = 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.description = Chrání konstrukce před nepřátelskými střelami.
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.copper-wall-large.description = Chrání konstrukce před nepřátelskými střelami.
block.titanium-wall.description = Středně silný obranný blok.\nPoskytuje středně dobrou obranu proti nepřátelům. block.titanium-wall.description = Chrání konstrukce před nepřátelskými střelami.
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.titanium-wall-large.description = Chrání konstrukce před nepřátelskými střelami.
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.description = Chrání konstrukce před nepřátelskými střelami. Pohlcuje laserové a elektrické výboje. Automaticky blokuje energetické spoje.
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.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 = Silný obranný blok.\nSlušná obrana před nepřáteli. block.thorium-wall.description = Chrání konstrukce před nepřátelskými střelami.
block.thorium-wall-large.description = Silný obranný blok.\nSlušná obrana před nepřáteli.\nZabírá více dlaždic. block.thorium-wall-large.description = Chrání konstrukce před nepřátelskými střelami.
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.description = Chrání konstrukce před nepřátelskými střelami, reflecting most bullets upon impact.
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.phase-wall-large.description = Chrání konstrukce před nepřátelskými střelami, reflecting most bullets upon impact.
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.description = Chrání konstrukce před nepřátelskými střelami. Při doteku opakovaně vydává elektrické 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.surge-wall-large.description = Chrání konstrukce před nepřátelskými střelami. Při doteku opakovaně vydává elektrické výboje.
block.door.description = Malé dveře, které se dají otevřít nebo zavřít kliknutím/tupnutím na ně. block.door.description = Zeď, která může být otevřena a zavřena.
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.door-large.description = Zeď, která může být otevřena a zavřena.
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.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 = 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.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ě lze využít křemíku 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 = 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.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 = 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.shock-mine.description = Vydává elektrické výboje při dotyku nepřátelskou jednotkou.
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.conveyor.description = Přepravuje předměty vpřed.
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.titanium-conveyor.description = Přepravuje předměty vpřed. Rychlejší, než standardní 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.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 = 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.junction.description = Funguje jako most pro dva křížící se dopravníky.
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.bridge-conveyor.description = Přepravuje předměty přes terén nebo budovy.
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.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 = 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.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 = 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.inverted-sorter.description = Podobné stanrdardní třídičce, ale vykládá vybrané položky do stran.
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.router.description = Rozděluje vstupní položky rovnoměrně do tří výstupů.
block.distributor.description = Pokročilý směrovač. Rozděluje předměty rovnoměrně až do 7 dalších směrů. 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.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.distributor.description = Rozděluje vstupní položky rovnoměrně do sedmi výstupů.
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.overflow-gate.description = Pokud je směr vpřed ucpán, posí vstupní položky do stran. Nelze použít vedle jiné brány.
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.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.mechanical-pump.description = Levné čerpadlo s pomalým průtokem, nevyžaduje však energii k provozu. 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.rotary-pump.description = Pokročilé čerpadlo, které za pomoci energie vyčerpá větší množství kapalin, než standardní. block.mechanical-pump.description = Pumpuje kapalinu a předává ji dál. Nevyžaduje energii.
block.thermal-pump.description = Ultimátní čerpadlo. Nejrychlejší čerpání kapalin. block.rotary-pump.description = Pumpuje kapalinu a předává ji dál. Vyžaduje energii.
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.thermal-pump.description = Pumpuje kapalinu a předává ji dál.
block.pulse-conduit.description = Pokročilý blok přepravy kapalin. Přepravuje kapaliny rychleji a má větší kapacitu, než základní potrubí. block.conduit.description = Přepravuje kapaliny vpřed. Používá se spolu s pumpami a dalším potrubím.
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í.\nNedochází zde k úniku kapalin. block.pulse-conduit.description = Přepravuje kapaliny vpřed. Přepravuje kapaliny rychleji a ukládá jich více, než standadní potrubí.
block.liquid-router.description = 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.plated-conduit.description = epravuje kapaliny vpřed. Nepřijímá kapaliny ze stran. Nemá úniky.
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-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-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.liquid-tank.description = Ukládá velké množství kapaliny. Předává ji do stran, podobně jako směřovač kapalin.
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.liquid-junction.description = Funguje jako most pro dvě křížící se potrubí.
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.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.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.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.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 a druhé straně je méně energie (například vybitá baterie). 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á (záporný rozdíl). 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á více energie, než základní baterie. 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.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.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.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.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 = Základní solární panel pro generoní malého množství energie ze Slunce. block.solar-panel.description = Vytří 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.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. Výstup energie závisí na míře naplnění generátoru, základní generování energie se aktivuje při plné kapacitě. 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 = 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.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 = 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.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.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.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.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.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.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-shard.description = Jádro základny. Pokud je zničena, sektor je ztracen.
block.core-foundation.description = Druhá cerze jádra. Je lépe obrněná a pojme více surovin. 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-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-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.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.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.unloader.description = Vyskladňuje vybrané položky z okolních bloků.
block.launch-pad.description = Vysílá dávky předmětů z mapy bez nutnosti vyslat zpět jádro. block.launch-pad.description = Vysílá dávky předmětů do přilehlých sektorů.
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 = Střílí střídavé dávky kulek na nepřátele.
block.duo.description = Malá, levná střílna. Užitečná proti pozemním jednotkám. block.scatter.description = Střílí kusy olova, pláty šrotu nebo střepy metaskla na nepřátelské letectvo.
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.scorch.description = Sežehne pozemní jednotky blízkosti. Velmi efektivní na malé vzdálenosti. 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.hail.description = Střílí na dálku malé patrony na pozemní nepřátele.
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.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 = Středně velká střílna proti pozemním jednotkám. Po nabití se střílí mocné energetické paprsky. block.lancer.description = Po nabití střílí mocné energetické paprsky na pozemní cíle.
block.arc.description = Malá energetická střílna. Pálí výboje po nepřátelských jednotkách. block.arc.description = Střílí výboje po pozemní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.swarmer.description = Střílí po nepřátelích 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.salvo.description = Stří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.fuse.description = Stří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.ripple.description = Střílí na dálku shluky střel na pozemní jednotky.
block.cyclone.description = Velká protiletecká a protipozemní střílna. Pálí explodující dávky na nepřítele v okolí. block.cyclone.description = Střílí vybuchující dávky na blízké nepřátele.
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.spectre.description = Střílí velké náboje, které pronikají brněním jak pozemních, tak vzdušný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.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ě léčí nejbližší poškozenou jednotku v poli své působnosti. 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.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í oblouky elektřiny, 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é elektrické 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.

View File

@@ -20,8 +20,8 @@ gameover = Le base a été détruite.
gameover.pvp = L'équipe[accent] {0}[] a gagnée ! gameover.pvp = L'équipe[accent] {0}[] a gagnée !
highscore = [accent]Nouveau meilleur score ! highscore = [accent]Nouveau meilleur score !
copied = Copié. 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.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 = This part of the game isn't ready yet indev.notready = Cette partie du jeu n'est pas encore prête
load.sound = Son load.sound = Son
load.map = Maps load.map = Maps
@@ -52,10 +52,10 @@ schematic.copy.import = Importer du presse-papier
schematic.shareworkshop = Partager sur l'Atelier schematic.shareworkshop = Partager sur l'Atelier
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner Schéma schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner Schéma
schematic.saved = Schéma enregistré. 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.rename = Renommer Schéma
schematic.info = {0}x{1}, {2} blocks schematic.info = {0}x{1}, {2} blocks
schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. schematic.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.wave = Vagues vaincues:[accent] {0}
stat.enemiesDestroyed = Ennemies détruits:[accent] {0} stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
@@ -508,13 +508,13 @@ error.io = Network I/O error.
error.any = Erreur réseau inconnue. error.any = Erreur réseau inconnue.
error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter.
weather.rain.name = Rain weather.rain.name = Pluie
weather.snow.name = Snow weather.snow.name = Neige
weather.sandstorm.name = Sandstorm weather.sandstorm.name = Tempête de sable
weather.sporestorm.name = Sporestorm weather.sporestorm.name = Tempête de spores
weather.fog.name = Fog weather.fog.name = Brouillard
sectors.unexplored = [lightgray]Unexplored sectors.unexplored = [lightgray] Inexploré
sectors.resources = Resources: sectors.resources = Resources:
sectors.production = Production: sectors.production = Production:
sectors.stored = Stored: sectors.stored = Stored:
@@ -523,10 +523,10 @@ sectors.launch = Launch
sectors.select = Select sectors.select = Select
sectors.nonelaunch = [lightgray]none (sun) sectors.nonelaunch = [lightgray]none (sun)
sectors.rename = Rename Sector sectors.rename = Rename Sector
sector.missingresources = [scarlet]Insufficient Core Resources sector.missingresources = [scarlet]Ressources du noyau insuffisantes
planet.serpulo.name = Serpulo planet.serpulo.name = Serpulo
planet.sun.name = Sun planet.sun.name = Soleil
sector.groundZero.name = Ground Zero sector.groundZero.name = Ground Zero
sector.craters.name = The Craters sector.craters.name = The Craters
@@ -552,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.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.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.language = Langue
settings.data = Game Data settings.data = Données du jeu
settings.reset = Valeur par défaut. settings.reset = Valeur par défaut.
settings.rebind = Réatttribuer settings.rebind = Réatttribuer
settings.resetKey = Reset settings.resetKey = Reset
@@ -927,7 +927,7 @@ unit.fortress.name = Forteresse
unit.nova.name = Nova unit.nova.name = Nova
unit.pulsar.name = Pulsar unit.pulsar.name = Pulsar
unit.quasar.name = Quasar unit.quasar.name = Quasar
unit.crawler.name = Chenille unit.crawler.name = Rampeur
unit.atrax.name = Atrax unit.atrax.name = Atrax
unit.spiroct.name = Spiroct unit.spiroct.name = Spiroct
unit.arkyid.name = Arkyid unit.arkyid.name = Arkyid
@@ -955,18 +955,18 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
block.resupply-point.name = Resupply Point block.resupply-point.name = Point de rechargement
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Cliff block.cliff.name = Falaise
block.sand-boulder.name = Sable rocheux block.sand-boulder.name = Sable rocheux
block.grass.name = Herbe block.grass.name = Herbe
block.slag.name = Slag block.slag.name = Scories
block.space.name = Space block.space.name = Space
block.salt.name = Sel block.salt.name = Sel
block.salt-wall.name = Salt Wall block.salt-wall.name = Mur de sel
block.pebbles.name = Cailloux block.pebbles.name = Cailloux
block.tendrils.name = Vrilles 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-pine.name = Pin sporifère
block.spore-wall.name = Spore Wall block.spore-wall.name = Spore Wall
block.boulder.name = Boulder block.boulder.name = Boulder
@@ -983,11 +983,11 @@ block.scrap-wall-large.name = Grand mur de ferraille
block.scrap-wall-huge.name = Enorme mur de ferraille block.scrap-wall-huge.name = Enorme mur de ferraille
block.scrap-wall-gigantic.name = Gigantesque mur de ferraille block.scrap-wall-gigantic.name = Gigantesque mur de ferraille
block.thruster.name = Propulseur block.thruster.name = Propulseur
block.kiln.name = Four a métaverre block.kiln.name = Four
block.graphite-press.name = Presse à graphite block.graphite-press.name = Presse à graphite
block.multi-press.name = Multi-Presse block.multi-press.name = Multi-Presse
block.constructing = {0}\n[lightgray](En construction) 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-shard.name = Core: Shard
block.core-foundation.name = Core: Fondation block.core-foundation.name = Core: Fondation
block.core-nucleus.name = Core: Nucleus block.core-nucleus.name = Core: Nucleus
@@ -1048,20 +1048,20 @@ block.thorium-wall-large.name = Grand mur en thorium
block.door.name = Porte block.door.name = Porte
block.door-large.name = Grande porte block.door-large.name = Grande porte
block.duo.name = Duo block.duo.name = Duo
block.scorch.name = Scorch block.scorch.name = Brûleur
block.scatter.name = Scatter block.scatter.name = Disperseur
block.hail.name = Hail block.hail.name = Grêle
block.lancer.name = Lancer block.lancer.name = Lancier
block.conveyor.name = Transporteur block.conveyor.name = Convoyeur
block.titanium-conveyor.name = Transporteur en titane block.titanium-conveyor.name = Convoyeur en titane
block.plastanium-conveyor.name = Plastanium Conveyor block.plastanium-conveyor.name = Convoyeur en plastanium
block.armored-conveyor.name = Armored Conveyor 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.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.router.name = Routeur
block.distributor.name = [accent]Distributeur[] block.distributor.name = [accent]Distributeur[]
block.sorter.name = Trieur block.sorter.name = Trieur
block.inverted-sorter.name = Inverted Sorter block.inverted-sorter.name = Trieur inversé
block.message.name = Message block.message.name = Message
block.illuminator.name = Illuminator block.illuminator.name = Illuminator
block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.illuminator.description = A small, compact, configurable light source. Requires power to function.
@@ -1073,30 +1073,30 @@ block.pulverizer.name = Pulvérisateur
block.cryofluid-mixer.name = Refroidisseur block.cryofluid-mixer.name = Refroidisseur
block.melter.name = Four à Fusion block.melter.name = Four à Fusion
block.incinerator.name = Incinérateur block.incinerator.name = Incinérateur
block.spore-press.name = Spore presse block.spore-press.name = Presse à spores
block.separator.name = Séparateur block.separator.name = Séparateur
block.coal-centrifuge.name = Centrifugeuse à charbon block.coal-centrifuge.name = Centrifugeuse à charbon
block.power-node.name = Transmetteur énergétique block.power-node.name = Transmetteur énergétique
block.power-node-large.name = Grand transmetteur énergétique block.power-node-large.name = Grand transmetteur énergétique
block.surge-tower.name = Tour de surtension block.surge-tower.name = Tour de surtension
block.diode.name = Battery Diode block.diode.name = Diode de batterie
block.battery.name = 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.combustion-generator.name = Générateur à combustion
block.steam-generator.name = Générateur à turbine block.steam-generator.name = Générateur à turbine
block.differential-generator.name = Générateur différentiel block.differential-generator.name = Générateur différentiel
block.impact-reactor.name = Réacteur à impact block.impact-reactor.name = Réacteur à impact
block.mechanical-drill.name = Foreuse mécanique 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.laser-drill.name = Foreuse Laser
block.water-extractor.name = Extracteur d'eau block.water-extractor.name = Extracteur d'eau
block.cultivator.name = Cultivateur block.cultivator.name = Cultivateur
block.conduit.name = Conduit 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-source.name = Source d'objets
block.item-void.name = Destructeur d'objets block.item-void.name = Destructeur d'objets
block.liquid-source.name = Source de liquide 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-void.name = Absorbeur énergétique
block.power-source.name = Puissance infinie block.power-source.name = Puissance infinie
block.unloader.name = Déchargeur block.unloader.name = Déchargeur
@@ -1105,15 +1105,15 @@ block.wave.name = Vague
block.tsunami.name = Tsunami block.tsunami.name = Tsunami
block.swarmer.name = Essaim block.swarmer.name = Essaim
block.salvo.name = Salve block.salvo.name = Salve
block.ripple.name = Ripple block.ripple.name = Percussion
block.phase-conveyor.name = Transporteur phasé block.phase-conveyor.name = Convoyeur phasé
block.bridge-conveyor.name = Pont transporteur block.bridge-conveyor.name = Pont
block.plastanium-compressor.name = Compresseur de plastanium block.plastanium-compressor.name = Compresseur de plastanium
block.pyratite-mixer.name = Mixeur à pyratite block.pyratite-mixer.name = Mixeur à pyratite
block.blast-mixer.name = Mixeur à explosion block.blast-mixer.name = Mixeur à explosion
block.solar-panel.name = Panneau solaire block.solar-panel.name = Panneau solaire
block.solar-panel-large.name = Grand 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.repair-point.name = Point de Réparation
block.pulse-conduit.name = Conduit à Impulsion block.pulse-conduit.name = Conduit à Impulsion
block.plated-conduit.name = Plated Conduit block.plated-conduit.name = Plated Conduit

View File

@@ -10,7 +10,7 @@ link.dev-builds.description = Niestabilne wersje gry
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
link.google-play.description = Strona w sklepie Google Play 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.wiki.description = Oficjana Wiki Mindustry
link.suggestions.description = Zaproponuj nowe funkcje link.suggestions.description = Zaproponuj nowe funkcje
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
@@ -112,12 +112,12 @@ mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Włączony mod.enabled = [lightgray]Włączony
mod.disabled = [scarlet]Wyłączony mod.disabled = [scarlet]Wyłączony
mod.disable = Wyłącz 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.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.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0}
mod.outdated = [scarlet]Niekompatybilne z wersją v6 (no minGameVersion: 105) mod.outdated = [scarlet]Niekompatybilne z wersją v6 (no minGameVersion: 105)
mod.missingdependencies = [scarlet]Brakujące zależności: {0} 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.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.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. 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.
@@ -139,8 +139,8 @@ mod.scripts.disable = Twoje urządzenie nie wspiera modów ze skryptami. Musisz
about.button = O Grze about.button = O Grze
name = Nazwa: name = Nazwa:
noname = Najpierw wybierz[accent] nazwę gracza[]. noname = Najpierw wybierz[accent] nazwę gracza[].
planetmap = Planet Map planetmap = Mapa Planety
launchcore = Launch Core launchcore = Wystrzel Rdzeń
filename = Nazwa Pliku: filename = Nazwa Pliku:
unlocked = Odblokowano nową zawartość! unlocked = Odblokowano nową zawartość!
completed = [accent]Ukończony completed = [accent]Ukończony
@@ -284,15 +284,15 @@ selectschematic = [accent][[{0}][] by wybrać+skopiować
pausebuilding = [accent][[{0}][] by wstrzymać budowę pausebuilding = [accent][[{0}][] by wstrzymać budowę
resumebuilding = [scarlet][[{0}][] by kontynuować budowę resumebuilding = [scarlet][[{0}][] by kontynuować budowę
wave = [accent]Fala {0} wave = [accent]Fala {0}
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]Fala {0}/{1}
wave.waiting = [lightgray]Fala za {0} wave.waiting = [lightgray]Fala za {0}
wave.waveInProgress = [lightgray]Fala w trakcie wave.waveInProgress = [lightgray]Fala w trakcie
waiting = [lightgray]Oczekiwanie... waiting = [lightgray]Oczekiwanie...
waiting.players = Oczekiwanie na graczy... waiting.players = Oczekiwanie na graczy...
wave.enemies = Pozostało [lightgray]{0} wrogów wave.enemies = Pozostało [lightgray]{0} wrogów
wave.enemy = Pozostał [lightgray]{0} wróg wave.enemy = Pozostał [lightgray]{0} wróg
wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. wave.guardianwarn = Strażnik nadejdzie za [accent]{0}[] fale.
wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. wave.guardianwarn.one = Strażnik nadejdzie za [accent]{0}[] fale.
loadimage = Załaduj Obraz loadimage = Załaduj Obraz
saveimage = Zapisz Obraz saveimage = Zapisz Obraz
unknown = Nieznane unknown = Nieznane
@@ -339,9 +339,9 @@ waves.never = <nigdy>
waves.every = co waves.every = co
waves.waves = fal(e) waves.waves = fal(e)
waves.perspawn = co pojawienie waves.perspawn = co pojawienie
waves.shields = shields/wave waves.shields = tarcze/fala
waves.to = do waves.to = do
waves.guardian = Guardian waves.guardian = Strażnik
waves.preview = Podgląd waves.preview = Podgląd
waves.edit = Edytuj... waves.edit = Edytuj...
waves.copy = Kopiuj Do Schowka waves.copy = Kopiuj Do Schowka
@@ -350,9 +350,9 @@ waves.invalid = Nieprawidłowe fale w schowku.
waves.copied = Fale zostały skopiowane. 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. 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.counts = liczba
wavemode.totals = totals wavemode.totals = sumy
wavemode.health = health wavemode.health = życie
editor.default = [lightgray]<Domyślne> editor.default = [lightgray]<Domyślne>
details = Detale... details = Detale...
@@ -420,7 +420,7 @@ filters.empty = [lightgray]Brak filtrów! Dodaj jeden za pomocą przycisku poni
filter.distort = Zniekształcanie filter.distort = Zniekształcanie
filter.noise = Szum filter.noise = Szum
filter.enemyspawn = Wybierz spawn przeciwnika filter.enemyspawn = Wybierz spawn przeciwnika
filter.spawnpath = Path To Spawn filter.spawnpath = Droga Do Spawnu
filter.corespawn = Wybierz rdzeń filter.corespawn = Wybierz rdzeń
filter.median = Mediana filter.median = Mediana
filter.oremedian = Mediana Rud filter.oremedian = Mediana Rud
@@ -479,7 +479,7 @@ requirement.research = Zbadaj {0}
requirement.capture = Zdobądź {0} requirement.capture = Zdobądź {0}
bestwave = [lightgray]Najwyższa fala: {0} bestwave = [lightgray]Najwyższa fala: {0}
launch.text = Wystrzel launch.text = Wystrzel
research.multiplayer = Only the host can research items. research.multiplayer = Tylko host może odkrywać przedmoty.
uncover = Odkryj uncover = Odkryj
configure = Skonfiguruj Ładunek configure = Skonfiguruj Ładunek
loadout = Loadout loadout = Loadout
@@ -512,17 +512,17 @@ weather.rain.name = Deszcz
weather.snow.name = Śnieg weather.snow.name = Śnieg
weather.sandstorm.name = Burza piaskowa weather.sandstorm.name = Burza piaskowa
weather.sporestorm.name = Burza zarodników weather.sporestorm.name = Burza zarodników
weather.fog.name = Fog weather.fog.name = Mgła
sectors.unexplored = [lightgray]Niezbadane sectors.unexplored = [lightgray]Niezbadane
sectors.resources = Resources: sectors.resources = Zasoby:
sectors.production = Production: sectors.production = Produkcja:
sectors.stored = Stored: sectors.stored = Zmagazynowane:
sectors.resume = Resume sectors.resume = Kontynuuj
sectors.launch = Launch sectors.launch = Wystrzel
sectors.select = Select sectors.select = Wybierz
sectors.nonelaunch = [lightgray]none (sun) sectors.nonelaunch = [lightgray]żaden (słońce)
sectors.rename = Rename Sector sectors.rename = Zmień Nazwę Sektora
sector.missingresources = [scarlet]Insufficient Core Resources sector.missingresources = [scarlet]Insufficient Core Resources
planet.serpulo.name = Serpulo planet.serpulo.name = Serpulo
@@ -564,12 +564,12 @@ settings.graphics = Grafika
settings.cleardata = Wyczyść Dane Gry... settings.cleardata = Wyczyść Dane Gry...
settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! 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.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.confirm = Jesteś pewny że chcesz usunąć wszystkie zapisy?
settings.clearsaves = Clear Saves settings.clearsaves = Usuń Zapisy
settings.clearresearch = Clear Research settings.clearresearch = Usuń Postęp Drzewa Tech.
settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? settings.clearresearch.confirm = Jesteś pewny że chcesz usunąć cały postęp drzewa technologicznego?
settings.clearcampaignsaves = Clear Campaign Saves settings.clearcampaignsaves = Usuń Zapisy Kampanii
settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? settings.clearcampaignsaves.confirm = Jesteś pewny że chcesz usunąć wszystkie zapisy kampanii?
paused = [accent]< Wstrzymano > paused = [accent]< Wstrzymano >
clear = Wyczyść clear = Wyczyść
banned = [scarlet]Zbanowano banned = [scarlet]Zbanowano
@@ -597,16 +597,16 @@ stat.itemsmoved = Prędkość poruszania się
stat.launchtime = Czas pomiędzy wystrzeleniami stat.launchtime = Czas pomiędzy wystrzeleniami
stat.shootrange = Zasięg stat.shootrange = Zasięg
stat.size = Rozmiar stat.size = Rozmiar
stat.displaysize = Display Size stat.displaysize = Wielkość Wyświetlania
stat.liquidcapacity = Pojemność cieczy stat.liquidcapacity = Pojemność cieczy
stat.powerrange = Zakres mocy stat.powerrange = Zakres mocy
stat.linkrange = Link Range stat.linkrange = Link Range
stat.instructions = Instructions stat.instructions = Instrukcje
stat.powerconnections = Maksymalna ilość połączeń stat.powerconnections = Maksymalna ilość połączeń
stat.poweruse = Zużycie prądu stat.poweruse = Zużycie prądu
stat.powerdamage = Moc/Zniszczenia stat.powerdamage = Moc/Zniszczenia
stat.itemcapacity = Pojemność przedmiotów stat.itemcapacity = Pojemność przedmiotów
stat.memorycapacity = Memory Capacity stat.memorycapacity = Pojemość Pamięci
stat.basepowergeneration = Podstawowa generacja mocy stat.basepowergeneration = Podstawowa generacja mocy
stat.productiontime = Czas produkcji stat.productiontime = Czas produkcji
stat.repairtime = Czas pełnej naprawy bloku stat.repairtime = Czas pełnej naprawy bloku
@@ -618,36 +618,36 @@ stat.boosteffect = Efekt wzmocnienia
stat.maxunits = Maksymalna ilość jednostek stat.maxunits = Maksymalna ilość jednostek
stat.health = Zdrowie stat.health = Zdrowie
stat.buildtime = Czas budowy stat.buildtime = Czas budowy
stat.maxconsecutive = Max Consecutive stat.maxconsecutive = Maksymalnie Kolejny
stat.buildcost = Koszt budowy stat.buildcost = Koszt budowy
stat.inaccuracy = Niecelność stat.inaccuracy = Niecelność
stat.shots = Strzały stat.shots = Strzały
stat.reload = Strzałów/sekundę stat.reload = Strzałów/Sekundę
stat.ammo = Amunicja stat.ammo = Amunicja
stat.shieldhealth = Shield Health stat.shieldhealth = Życie Tarczy
stat.cooldowntime = Cooldown Time stat.cooldowntime = Czas Odnowienia
stat.explosiveness = Explosiveness stat.explosiveness = Wybuchowość
stat.basedeflectchance = Base Deflect Chance stat.basedeflectchance = Bazowa Szansa Na Odbicie
stat.lightningchance = Lightning Chance stat.lightningchance = Szansa Na Błyskawicę
stat.lightningdamage = Lightning Damage stat.lightningdamage = Obrażenia Błyskawic
stat.flammability = Flammability stat.flammability = Palność
stat.radioactivity = Radioactivity stat.radioactivity = Radioaktywność
stat.heatcapacity = HeatCapacity stat.heatcapacity = Pojemność Cieplna
stat.viscosity = Viscosity stat.viscosity = Lepkość
stat.temperature = Temperature stat.temperature = Temperatura
stat.speed = Speed stat.speed = Prędość
stat.buildspeed = Build Speed stat.buildspeed = Prędkość Budowy
stat.minespeed = Mine Speed stat.minespeed = Prędkość Wydobycia
stat.minetier = Mine Tier stat.minetier = Stopień Wydobycia
stat.payloadcapacity = Payload Capacity stat.payloadcapacity = Ładowność
stat.commandlimit = Command Limit stat.commandlimit = Limit Jednostek Zarządanych
stat.abilities = Abilities stat.abilities = Umiejętności
ability.forcefield = Force Field ability.forcefield = Pole Mocy
ability.repairfield = Repair Field ability.repairfield = Pole Naprawy
ability.statusfield = Status Field ability.statusfield = Pole Statusu
ability.unitspawn = {0} Factory ability.unitspawn = {0} Fabryka
ability.shieldregenfield = Shield Regen Field ability.shieldregenfield = Strefa Tarczy Regenerującej
bar.drilltierreq = Wymagane Lepsze Wiertło bar.drilltierreq = Wymagane Lepsze Wiertło
bar.noresources = Missing Resources bar.noresources = Missing Resources
@@ -671,7 +671,7 @@ bar.progress = Postęp Budowy
bar.input = Wejście bar.input = Wejście
bar.output = Wyjście bar.output = Wyjście
units.processorcontrol = [lightgray]Processor Controlled units.processorcontrol = [lightgray]Procesor Kontrolowany
bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.damage = [stat]{0}[lightgray] Obrażenia
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
@@ -680,15 +680,15 @@ bullet.homing = [stat]naprowadzający
bullet.shock = [stat]piorunowy bullet.shock = [stat]piorunowy
bullet.frag = [stat]fragmentacyjny bullet.frag = [stat]fragmentacyjny
bullet.knockback = [stat]{0}[lightgray] odrzut bullet.knockback = [stat]{0}[lightgray] odrzut
bullet.pierce = [stat]{0}[lightgray]x pierce bullet.pierce = [stat]{0}[lightgray]x przebicia
bullet.infinitepierce = [stat]pierce bullet.infinitepierce = [stat]przebijający
bullet.freezing = [stat]zamrażający bullet.freezing = [stat]zamrażający
bullet.tarred = [stat]smolny bullet.tarred = [stat]smolny
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
bullet.reload = [stat]{0}[lightgray]x szybkość ataku bullet.reload = [stat]{0}[lightgray]x szybkość ataku
unit.blocks = bloki unit.blocks = bloki
unit.blockssquared = blocks² unit.blockssquared = bloki²
unit.powersecond = jednostek prądu na sekundę unit.powersecond = jednostek prądu na sekundę
unit.liquidsecond = jednostek płynu na sekundę unit.liquidsecond = jednostek płynu na sekundę
unit.itemssecond = przedmiotów na sekundę unit.itemssecond = przedmiotów na sekundę
@@ -701,7 +701,7 @@ unit.persecond = /sekundę
unit.perminute = /min unit.perminute = /min
unit.timesspeed = x prędkość unit.timesspeed = x prędkość
unit.percent = % unit.percent = %
unit.shieldhealth = shield health unit.shieldhealth = życie tarczy
unit.items = przedmioty unit.items = przedmioty
unit.thousands = tys. unit.thousands = tys.
unit.millions = mln unit.millions = mln
@@ -711,7 +711,7 @@ category.power = Prąd
category.liquids = Płyny category.liquids = Płyny
category.items = Przedmioty category.items = Przedmioty
category.crafting = Przetwórstwo category.crafting = Przetwórstwo
category.function = Function category.function = Funkcja
category.optional = Dodatkowe ulepszenia category.optional = Dodatkowe ulepszenia
setting.landscape.name = Zablokuj tryb panoramiczny setting.landscape.name = Zablokuj tryb panoramiczny
setting.shadows.name = Cienie setting.shadows.name = Cienie
@@ -747,19 +747,19 @@ setting.conveyorpathfinding.name = Ustalanie ścieżki przenośników
setting.sensitivity.name = Czułość kontrolera setting.sensitivity.name = Czułość kontrolera
setting.saveinterval.name = Interwał automatycznego zapisywania setting.saveinterval.name = Interwał automatycznego zapisywania
setting.seconds = {0} sekund setting.seconds = {0} sekund
setting.blockselecttimeout.name = Block Select Timeout setting.blockselecttimeout.name = Czas Wyboru Klocka
setting.milliseconds = {0} milisekund setting.milliseconds = {0} milisekund
setting.fullscreen.name = Pełny ekran setting.fullscreen.name = Pełny ekran
setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu) setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu)
setting.fps.name = Pokazuj FPS oraz ping setting.fps.name = Pokazuj FPS oraz ping
setting.smoothcamera.name = Smooth Camera setting.smoothcamera.name = Gładka Kamera
setting.vsync.name = Synchronizacja pionowa setting.vsync.name = Synchronizacja pionowa
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje) setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
setting.minimap.name = Pokaż Minimapę 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.position.name = Pokazuj położenie gracza
setting.musicvol.name = Głośność muzyki 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.ambientvol.name = Głośność otoczenia
setting.mutemusic.name = Wycisz muzykę setting.mutemusic.name = Wycisz muzykę
setting.sfxvol.name = Głośność dźwięków setting.sfxvol.name = Głośność dźwięków
@@ -782,11 +782,11 @@ keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w
category.general.name = Ogólne category.general.name = Ogólne
category.view.name = Wyświetl category.view.name = Wyświetl
category.multiplayer.name = Wielu graczy category.multiplayer.name = Wielu graczy
category.blocks.name = Block Select category.blocks.name = Wybierz Blok
command.attack = Atakuj command.attack = Atakuj
command.rally = Zbierz command.rally = Zbierz
command.retreat = Wycofaj command.retreat = Wycofaj
command.idle = Idle command.idle = Nieaktywny
placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, placement.blockselectkeys = \n[lightgray]Klawisz: [{0},
keybind.respawn.name = Respawn keybind.respawn.name = Respawn
keybind.control.name = Control Unit keybind.control.name = Control Unit
@@ -795,12 +795,12 @@ keybind.press = Naciśnij wybrany klawisz...
keybind.press.axis = Naciśnij oś lub klawisz... keybind.press.axis = Naciśnij oś lub klawisz...
keybind.screenshot.name = Zrzut ekranu mapy keybind.screenshot.name = Zrzut ekranu mapy
keybind.toggle_power_lines.name = Zmień widoczność linii energetycznych 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_x.name = Poruszanie w poziomie
keybind.move_y.name = Poruszanie w pionie keybind.move_y.name = Poruszanie w pionie
keybind.mouse_move.name = Podążaj Za Myszą keybind.mouse_move.name = Podążaj Za Myszą
keybind.pan.name = Pan View keybind.pan.name = Widok Panoramiczny
keybind.boost.name = Boost keybind.boost.name = Przyspiesz
keybind.schematic_select.name = Wybierz region keybind.schematic_select.name = Wybierz region
keybind.schematic_menu.name = Menu schematów keybind.schematic_menu.name = Menu schematów
keybind.schematic_flip_x.name = Obróć schemat horyzontalnie keybind.schematic_flip_x.name = Obróć schemat horyzontalnie
@@ -827,8 +827,8 @@ keybind.diagonal_placement.name = Budowa po skosie
keybind.pick.name = Wybierz Blok keybind.pick.name = Wybierz Blok
keybind.break_block.name = Zniszcz Blok keybind.break_block.name = Zniszcz Blok
keybind.deselect.name = Odznacz keybind.deselect.name = Odznacz
keybind.pickupCargo.name = Pickup Cargo keybind.pickupCargo.name = Podnieś Ładunek
keybind.dropCargo.name = Drop Cargo keybind.dropCargo.name = Opuść Ładunek
keybind.command.name = Command keybind.command.name = Command
keybind.shoot.name = Strzelanie keybind.shoot.name = Strzelanie
keybind.zoom.name = Przybliżanie keybind.zoom.name = Przybliżanie
@@ -857,29 +857,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.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.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.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.infiniteresources = Nieskończone Zasoby
rules.reactorexplosions = Eksplozje reaktorów rules.reactorexplosions = Eksplozje Reaktorów
rules.schematic = Schematics Allowed rules.schematic = Schematy Są Dozwolone
rules.wavetimer = Zegar fal rules.wavetimer = Zegar Fal
rules.waves = Fale rules.waves = Fale
rules.attack = Tryb ataku rules.attack = Tryb Ataku
rules.buildai = AI Building rules.buildai = SI Może Budować
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu) rules.enemyCheat = Nieskończone Zasoby SI (czerwonego zespołu)
rules.blockhealthmultiplier = Mnożnik życia bloków rules.blockhealthmultiplier = Mnożnik Życia Bloków
rules.blockdamagemultiplier = Block Damage Multiplier rules.blockdamagemultiplier = Mnożnik Uszkodzeń Bloków
rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
rules.unithealthmultiplier = Mnożnik życia jednostek rules.unithealthmultiplier = Mnożnik Życia Jednostek
rules.unitdamagemultiplier = Mnożnik obrażeń jednostek rules.unitdamagemultiplier = Mnożnik Obrażeń jednostek
rules.enemycorebuildradius = Zasięg blokady budowy przy rdzeniu wroga:[lightgray] (kratki) rules.enemycorebuildradius = Zasięg Blokady Budowy Przy Rdzeniu Wroga:[lightgray] (kratki)
rules.wavespacing = Odstępy między falami:[lightgray] (sek) rules.wavespacing = Odstępy Między Falami:[lightgray] (sek)
rules.buildcostmultiplier = Mnożnik kosztów budowania rules.buildcostmultiplier = Mnożnik Kosztów Budowania
rules.buildspeedmultiplier = Mnożnik prędkości budowania rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
rules.deconstructrefundmultiplier = Mnożnik Zwrotu Dekonstrukcji rules.deconstructrefundmultiplier = Mnożnik Zwrotu Dekonstrukcji
rules.waitForWaveToEnd = Fale czekają na przeciwników rules.waitForWaveToEnd = Fale Czekają Na Przeciwników
rules.dropzoneradius = Zasięg strefy zrzutu:[lightgray] (kratki) rules.dropzoneradius = Zasięg Strefy Zrzutu:[lightgray] (kratki)
rules.unitammo = Units Require Ammo rules.unitammo = Jednostki Potrzebują Amunicji
rules.title.waves = Fale rules.title.waves = Fale
rules.title.resourcesbuilding = Zasoby i Budowanie rules.title.resourcesbuilding = Zasoby i Budowanie
rules.title.enemy = Przeciwnicy rules.title.enemy = Przeciwnicy
@@ -887,13 +887,13 @@ rules.title.unit = Jednostki
rules.title.experimental = Eksperymentalne rules.title.experimental = Eksperymentalne
rules.title.environment = Environment rules.title.environment = Environment
rules.lighting = Oświetlenie rules.lighting = Oświetlenie
rules.enemyLights = Enemy Lights rules.enemyLights = Wrogowie Emitują Światło
rules.fire = Fire rules.fire = Ogień
rules.explosions = Block/Unit Explosion Damage rules.explosions = Uszkodzenia Wybuchu Klocka/Jednostki
rules.ambientlight = Otaczające Światło rules.ambientlight = Otaczające Światło
rules.weather = Weather rules.weather = Pogoda
rules.weather.frequency = Frequency: rules.weather.frequency = Częstotliwość:
rules.weather.duration = Duration: rules.weather.duration = Czas trwania:
content.item.name = Przedmioty content.item.name = Przedmioty
content.liquid.name = Płyny content.liquid.name = Płyny
@@ -955,7 +955,7 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
block.resupply-point.name = Resupply Point block.resupply-point.name = Punkt Uzupełnienia
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Klif block.cliff.name = Klif
block.sand-boulder.name = Piaskowy Głaz block.sand-boulder.name = Piaskowy Głaz
@@ -1147,28 +1147,28 @@ block.container.name = Kontener
block.launch-pad.name = Wyrzutnia block.launch-pad.name = Wyrzutnia
block.launch-pad-large.name = Duża Wyrzutnia block.launch-pad-large.name = Duża Wyrzutnia
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Command Center block.command-center.name = Centrum Dowodzenia
block.ground-factory.name = Fabryka Naziemna block.ground-factory.name = Fabryka Naziemna
block.air-factory.name = Fabryka Powietrzna block.air-factory.name = Fabryka Powietrzna
block.naval-factory.name = Fabryka Morska block.naval-factory.name = Fabryka Morska
block.additive-reconstructor.name = Rekonstruktor Addytywny block.additive-reconstructor.name = Rekonstruktor Addytywny
block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatywny block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatywny
block.exponential-reconstructor.name = Rekonstruktor Wykładniczy 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-conveyor.name = Przenośnik Masowy
block.payload-router.name = Rozdzielacz Ładunku block.payload-router.name = Rozdzielacz Ładunku
block.disassembler.name = Dezasembler block.disassembler.name = Rozkładacz
block.silicon-crucible.name = Silicon Crucible block.silicon-crucible.name = Tygiel Krzemu
block.overdrive-dome.name = Kopuła Pola Overdrive block.overdrive-dome.name = Kopuła Pola Overdrive
block.switch.name = Switch block.switch.name = Przełącznik
block.micro-processor.name = Micro Processor block.micro-processor.name = Micro Procesor
block.logic-processor.name = Logic Processor block.logic-processor.name = Logiczny Procesor
block.hyper-processor.name = Hyper Processor block.hyper-processor.name = Hyper Procesor
block.logic-display.name = Logic Display block.logic-display.name = Wyświetlacz Logiczny
block.large-logic-display.name = Large Logic Display block.large-logic-display.name = Duży Wyświetlacz Logiczny
block.memory-cell.name = Memory Cell block.memory-cell.name = Komórka Pamięci
block.memory-bank.name = Memory Bank block.memory-bank.name = Bank Pamięci
team.blue.name = niebieski team.blue.name = niebieski
team.crux.name = czerwony team.crux.name = czerwony
@@ -1219,7 +1219,7 @@ item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Ni
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów. 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.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.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.message.description = Przechowuje wiadomość. Wykorzystywane do komunikacji pomiędzy sojusznikami. 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.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
@@ -1278,7 +1278,7 @@ block.underflow-gate.description = Odwrotność bramy przepełnieniowej, który
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.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.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.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.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.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. 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.
@@ -1332,4 +1332,63 @@ 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.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.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu. 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 wierza. 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.

View File

@@ -17,11 +17,14 @@ linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată.
screenshot = Captură de ecran salvată la {0} screenshot = Captură de ecran salvată la {0}
screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran. screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran.
gameover = Jocul s-a încheiat gameover = Jocul s-a încheiat
gameover.disconnect = Deconectare
gameover.pvp = Echipa [accent] {0}[] este câștigătoare! gameover.pvp = Echipa [accent] {0}[] este câștigătoare!
gameover.waiting = [accent]Se așteaptă următoarea hartă...
highscore = [accent]Scor maxim nou! highscore = [accent]Scor maxim nou!
copied = Copiat. copied = Copiat.
indev.popup = [accent]v6[] este momentan în [accent]beta[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este neterminată[]\n- Efectele sonore și muzica sunt neterminate/lipsesc\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.popup = [accent]v6[] este momentan în [accent]beta[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este neterminată[]\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.notready = Această secțiune a jocului nu este gata încă.
indev.campaign = [accent]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.sound = Sunete
load.map = Hărți load.map = Hărți
@@ -57,6 +60,7 @@ schematic.rename = Redenumește Schema
schematic.info = {0}x{1}, {2} blocuri 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. 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.wave = Valuri Învinse:[accent] {0}
stat.enemiesDestroyed = Inamici Distruși:[accent] {0} stat.enemiesDestroyed = Inamici Distruși:[accent] {0}
stat.built = Structuri Construite:[accent] {0} stat.built = Structuri Construite:[accent] {0}
@@ -290,6 +294,7 @@ cancelbuilding = [accent][[{0}][] pt a curăța planul
selectschematic = [accent][[{0}][] pt selectare+copiere selectschematic = [accent][[{0}][] pt selectare+copiere
pausebuilding = [accent][[{0}][] pt a face o pauză de la construit pausebuilding = [accent][[{0}][] pt a face o pauză de la construit
resumebuilding = [scarlet][[{0}][] pt a continua construitul resumebuilding = [scarlet][[{0}][] pt a continua construitul
showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața.
wave = [accent]Valul {0} wave = [accent]Valul {0}
wave.cap = [accent]Valul {0}/{1} wave.cap = [accent]Valul {0}/{1}
wave.waiting = [lightgray]Val în {0} wave.waiting = [lightgray]Val în {0}
@@ -297,6 +302,8 @@ wave.waveInProgress = [lightgray]Val în desfășurare
waiting = [lightgray]În așteptare... waiting = [lightgray]În așteptare...
waiting.players = Se așteaptă jucătorii... waiting.players = Se așteaptă jucătorii...
wave.enemies = [lightgray]Mai sunt {0} inamici 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.enemy = [lightgray]Mai e {0} inamic
wave.guardianwarn = Gardianul va veni în [accent]{0}[] valuri. wave.guardianwarn = Gardianul va veni în [accent]{0}[] valuri.
wave.guardianwarn.one = Gardianul va veni într-[accent]un[] val. wave.guardianwarn.one = Gardianul va veni într-[accent]un[] val.
@@ -483,13 +490,14 @@ abandon = Abandonează
abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului. abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului.
locked = Blocat locked = Blocat
complete = [lightgray]Finalizat: complete = [lightgray]Finalizat:
requirement.wave = Ajungi la valul {0} în {1} requirement.wave = Treci de valul {0} în {1}
requirement.core = Distruge Nucleu Inamic în{0} requirement.core = Distruge Nucleul Inamic din {0}
requirement.research = Cercetează {0} requirement.research = Cercetează {0}
requirement.produce = Produ {0}
requirement.capture = Capturează {0} requirement.capture = Capturează {0}
bestwave = [lightgray]Cel Mai Bun Val: {0}
launch.text = Lansează launch.text = Lansează
research.multiplayer = Doar gazda poate cerceta noi tehnologii. research.multiplayer = Doar gazda poate cerceta noi tehnologii.
map.multiplayer = Doar gazda poate vedea harta sectoarelor.
uncover = Descoperă uncover = Descoperă
configure = Configurează Încărcarea configure = Configurează Încărcarea
@@ -498,6 +506,7 @@ loadout = Încărcare
resources = Resurse resources = Resurse
bannedblocks = Blocuri Interzise bannedblocks = Blocuri Interzise
addall = Adaugă-le pe toate addall = Adaugă-le pe toate
launch.from = Lansează Din: [accent]{0}
launch.destination = Destinație: {0} launch.destination = Destinație: {0}
configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}.
zone.unlocked = [lightgray]{0} deblocat(ă). zone.unlocked = [lightgray]{0} deblocat(ă).
@@ -529,45 +538,67 @@ weather.fog.name = Ceață
sectors.unexplored = [lightgray]Neexplorat sectors.unexplored = [lightgray]Neexplorat
sectors.resources = Resurse: sectors.resources = Resurse:
sectors.production = Producție: sectors.production = Producție:
sectors.export = Export:
sectors.time = Timp:
sectors.threat = Amenințare:
sectors.wave = Valul:
sectors.stored = Stocat: sectors.stored = Stocat:
sectors.resume = Revino sectors.resume = Revino
sectors.launch = Lansare sectors.launch = Lansare
sectors.select = Selectează sectors.select = Selectează
sectors.nonelaunch = [lightgray]nimic (soarele) sectors.nonelaunch = [lightgray]nimic (soarele)
sectors.rename = Redenumește Sectorul 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
sector.curcapture = Sector Capturat
sector.curlost = Sector Pierdut
sector.missingresources = [scarlet]Resurse din Nucleu Insuficiente 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]!
threat.low = Scăzută
threat.medium = Medie
threat.high = Mare
threat.extreme = Extremă
threat.eradication = Eradicare
planets = Planete
planet.serpulo.name = Serpulo planet.serpulo.name = Serpulo
#Spațiu Necesar
planet.sun.name = Soare planet.sun.name = Soare
#Spațiu Necesar sector.impact0078.name = Impact 0078
sector.groundZero.name = Ground Zero sector.groundZero.name = Punctul Zero
sector.craters.name = The Craters sector.craters.name = Craterele
sector.frozenForest.name = Frozen Forest sector.frozenForest.name = Pădurea Glacială
sector.ruinousShores.name = Ruinous Shores sector.ruinousShores.name = Țărmurile Părăsite
sector.stainedMountains.name = Stained Mountains sector.stainedMountains.name = Munții Pătați
sector.desolateRift.name = Desolate Rift sector.desolateRift.name = Riftul Dezolat
sector.nuclearComplex.name = Nuclear Production Complex sector.nuclearComplex.name = Complexul de Producție Nucleară
sector.overgrowth.name = Overgrowth sector.overgrowth.name = Supracreșterea
sector.tarFields.name = Tar Fields sector.tarFields.name = Câmpurile cu Păcură
sector.saltFlats.name = Salt Flats sector.saltFlats.name = Podișurile Saline
sector.fungalPass.name = Fungal Pass sector.fungalPass.name = Pasul Fungic
sector.biomassFacility.name = Facilitatea de Sinteză a Biomasei
#Spațiu sector.windsweptIslands.name = Insulele Măturate de Vânt
#Absolut sector.extractionOutpost.name = Avanpostul de Extracție
#Necesar 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.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, 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.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 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.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-depozit 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.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.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.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.overgrowth.description = Această zonă este plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un adăpost aici. Construiește unități Mace. 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.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.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.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 constând 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.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.
settings.language = Limbă settings.language = Limbă
@@ -628,6 +659,8 @@ stat.memorycapacity = Capacitate Memorie
stat.basepowergeneration = Generare Electricitate (Bază) stat.basepowergeneration = Generare Electricitate (Bază)
stat.productiontime = Timp Producție stat.productiontime = Timp Producție
stat.repairtime = Durată Reparare Bloc stat.repairtime = Durată Reparare Bloc
stat.weapons = Arme
stat.bullet = Glonț
stat.speedincrease = Creștere Viteză stat.speedincrease = Creștere Viteză
stat.range = Rază stat.range = Rază
stat.drilltier = Minabile stat.drilltier = Minabile
@@ -697,12 +730,14 @@ units.processorcontrol = [lightgray]Controlat de Procesor
bullet.damage = [stat]{0}[lightgray] forță bullet.damage = [stat]{0}[lightgray] forță
bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate
bullet.incendiary = [stat]incendiar bullet.incendiary = [stat]incendiar
bullet.sapping = [stat]atragere inamici
bullet.homing = [stat]cu radar bullet.homing = [stat]cu radar
bullet.shock = [stat]șoc bullet.shock = [stat]șoc
bullet.frag = [stat]fragil bullet.frag = [stat]fragil
bullet.knockback = [stat]{0} [lightgray]împingere bullet.knockback = [stat]{0} [lightgray]împingere
bullet.pierce = [stat]{0}[lightgray]x penetrare bullet.pierce = [stat]{0}[lightgray]x penetrare
bullet.infinitepierce = [stat]penetrare bullet.infinitepierce = [stat]penetrare
bullet.healpercent = [stat]{0}[lightgray]% reparare
bullet.freezing = [stat]înghețat bullet.freezing = [stat]înghețat
bullet.tarred = [stat]lipicios bullet.tarred = [stat]lipicios
bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție
@@ -770,7 +805,6 @@ setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii
setting.sensitivity.name = Sensibilitatea Controlului setting.sensitivity.name = Sensibilitatea Controlului
setting.saveinterval.name = Interval de Salvare setting.saveinterval.name = Interval de Salvare
setting.seconds = {0} secunde setting.seconds = {0} secunde
setting.blockselecttimeout.name = Selectarea Blocului a Întârziat
setting.milliseconds = {0} millisecunde setting.milliseconds = {0} millisecunde
setting.fullscreen.name = Ecran Complet setting.fullscreen.name = Ecran Complet
setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară) setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară)
@@ -859,6 +893,7 @@ keybind.menu.name = Meniu
keybind.pause.name = Pauză keybind.pause.name = Pauză
keybind.pause_building.name = Pauză/Reia Construit keybind.pause_building.name = Pauză/Reia Construit
keybind.minimap.name = Minihartă keybind.minimap.name = Minihartă
keybind.planet_map.name = Harta Planetei
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Listă Jucători keybind.player_list.name = Listă Jucători
keybind.console.name = Consolă keybind.console.name = Consolă
@@ -922,6 +957,7 @@ content.item.name = Materiale
content.liquid.name = Lichide content.liquid.name = Lichide
content.unit.name = Unități content.unit.name = Unități
content.block.name = Blocuri content.block.name = Blocuri
content.sector.name = Sectoare
item.copper.name = Cupru item.copper.name = Cupru
item.lead.name = Plumb item.lead.name = Plumb
@@ -1086,7 +1122,6 @@ block.distributor.name = Distributor
block.block-forge.name = Forjă de Blocuri block.block-forge.name = Forjă de Blocuri
block.block-loader.name = Încărcător de Blocuri block.block-loader.name = Încărcător de Blocuri
block.block-unloader.name = Descărcător de Blocuri block.block-unloader.name = Descărcător de Blocuri
block.sorter.name = Sortator block.sorter.name = Sortator
block.inverted-sorter.name = Sortator Invers block.inverted-sorter.name = Sortator Invers
block.message.name = Mesaj block.message.name = Mesaj
@@ -1186,6 +1221,7 @@ block.payload-router.name = Router în Masă
block.disassembler.name = Dezasamblator block.disassembler.name = Dezasamblator
block.silicon-crucible.name = Creuzet de Silicon block.silicon-crucible.name = Creuzet de Silicon
block.overdrive-dome.name = Dom de Suprasolicitare block.overdrive-dome.name = Dom de Suprasolicitare
block.interplanetary-accelerator.name = Accelerator Interplanetar
block.switch.name = Întrerupător block.switch.name = Întrerupător
block.micro-processor.name = Microprocesor block.micro-processor.name = Microprocesor
@@ -1204,27 +1240,40 @@ team.derelict.name = abandonată
team.green.name = verde team.green.name = verde
team.purple.name = mov team.purple.name = mov
tutorial.next = [lightgray]<Click pt a continua> # A NU SE TRADUCE! NU SUNT GATA!
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 hint.skip = Skip
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 hint.desktopMove = Use [accent][[WASD][] to move.
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. hint.zoom = [accent]Scroll[] to zoom in or out.
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. hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
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.[] hint.desktopShoot = [accent][[Left-click][] to shoot.
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. hint.depositItems = To transfer items, drag from your ship to the core.
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. hint.respawn = To respawn as a ship, press [accent][[V][].
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. hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
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 hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
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ă. 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.
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ă. 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.
tutorial.unpause = Acum apasă space din nou pt a continua. 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.
tutorial.unpause.mobile = Acum apasă-l din nou pt a continua. 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.
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. 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.
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. hint.breaking = [accent]Right-click[] and drag to break blocks.
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.[] 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.
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.[] hint.research = Use the \ue875 [accent]Research[] button to research new technology.
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. hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
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. hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
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.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 into formation.
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.
item.copper.description = Folosit în tot felul de construcții și muniție. 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.copper.details = Cupru. Metal anormal de abundent pe Serpulo. Structural slab dacă nu este consolidat.
@@ -1237,7 +1286,7 @@ item.coal.description = Folosit extensiv ca combustibil și pt producerea de mat
item.coal.details = Pare să fie materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. 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.titanium.description = Folosit pt structuri transportatoare de lichid, burghie și aeronautică.
item.thorium.description = Folosit în structuri durabile și combustibil nuclear. item.thorium.description = Folosit în structuri durabile și combustibil nuclear.
item.scrap.description = Topit și rafinat în alte materiale. 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.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.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.plastanium.description = Folosit pt unitățile militare avansate, ca izolator electric și muniție fragilă.
@@ -1247,11 +1296,13 @@ item.spore-pod.description = Folosită pt a fi convertită în petrol, explozibi
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.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.blast-compound.description = Folosit în bombe și muniție explozibilă.
item.pyratite.description = Folosită în armele incendiare și generatoare pe bază de procese de combustie. item.pyratite.description = Folosită în armele incendiare și generatoare pe bază de procese de combustie.
liquid.water.description = Folosită pt răcirea mașinăriilor și procesarea deșeurilor. 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.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.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. 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.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi.
block.illuminator.description = Emite lumină. block.illuminator.description = Emite lumină.
block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați. block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați.
@@ -1393,6 +1444,7 @@ block.memory-cell.description = Stochează informație pt un procesor.
block.memory-bank.description = Stochează informație pt un procesor. Capacitate mare. 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.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.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.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.mace.description = Trage cu jeturi de flacără aprinsă către toți inamicii din apropiere.
@@ -1420,7 +1472,7 @@ unit.mega.description = Repară automat structurile deteriorate. Capabilă să c
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.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.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.risso.description = Trage un baraj de rachete și gloanțe către toți inamicii din apropiere.
unit.minke.description = Trage cu capsule incendiare și gloanțe standard către artileria inamică 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.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.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.omura.description = Trage cu un railgun cu gloanțe care penetrează scuturile inamice pe distanțe lungi. Construiește unități Flare.

View File

@@ -497,6 +497,7 @@ requirement.produce = Произведите {0}
requirement.capture = Захватите {0} requirement.capture = Захватите {0}
launch.text = Высадка launch.text = Высадка
research.multiplayer = Только хост может исследовать предметы. research.multiplayer = Только хост может исследовать предметы.
map.multiplayer = Только хост может просматривать секторы.
uncover = Раскрыть uncover = Раскрыть
configure = Конфигурация выгрузки configure = Конфигурация выгрузки
@@ -547,8 +548,13 @@ sectors.launch = Высадка
sectors.select = Выбор sectors.select = Выбор
sectors.nonelaunch = [lightgray]нет (солнце) sectors.nonelaunch = [lightgray]нет (солнце)
sectors.rename = Переименовать сектор sectors.rename = Переименовать сектор
sectors.enemybase = [scarlet]Вражеская база
sectors.vulnerable = [scarlet]Уязвим
sectors.underattack = [scarlet]Атакован! [accent]{0}% повреждений
sectors.survives = [accent]Продержался {0} волн(ы)
sector.curcapture = Сектор захвачен sector.curcapture = Сектор захвачен
sector.curlost = Сектор потерян
sector.missingresources = [scarlet]Недостаточно ресурсов для высадки sector.missingresources = [scarlet]Недостаточно ресурсов для высадки
sector.attacked = Сектор [accent]{0}[white] атакован! sector.attacked = Сектор [accent]{0}[white] атакован!
sector.lost = Сектор [accent]{0}[white] потерян! sector.lost = Сектор [accent]{0}[white] потерян!
@@ -589,8 +595,8 @@ sector.saltFlats.description = На окраине пустыни лежат с
sector.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров. sector.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров.
sector.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии. sector.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии.
sector.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Научитесь им пользоваться.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц. sector.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Научитесь им пользоваться.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц.
sector.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Титан». Уничтожьте его. Верните то, что было потеряно. sector.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Булава». Уничтожьте его. Верните то, что было потеряно.
sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя эта область заброшенна, в ней поблизости присутствуют некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно. sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя эта область заброшена, в ней поблизости присутствуют некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно.
sector.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками. sector.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками.
sector.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и варианты его многочисленного применения.\n\nВраг присутствует здесь в большом числе, постоянно разведывая нападающих. sector.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и варианты его многочисленного применения.\n\nВраг присутствует здесь в большом числе, постоянно разведывая нападающих.
sector.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Ползун». Достаньте до обоих ядер. sector.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Ползун». Достаньте до обоих ядер.
@@ -888,6 +894,7 @@ keybind.menu.name = Меню
keybind.pause.name = Пауза keybind.pause.name = Пауза
keybind.pause_building.name = Приостановить/возобновить строительство keybind.pause_building.name = Приостановить/возобновить строительство
keybind.minimap.name = Мини-карта keybind.minimap.name = Мини-карта
keybind.planet_map.name = Карта планеты
keybind.chat.name = Чат keybind.chat.name = Чат
keybind.player_list.name = Список игроков keybind.player_list.name = Список игроков
keybind.console.name = Консоль keybind.console.name = Консоль
@@ -1234,27 +1241,40 @@ team.derelict.name = Покинутая
team.green.name = Зелёная team.green.name = Зелёная
team.purple.name = Фиолетовая team.purple.name = Фиолетовая
tutorial.next = [lightgray]<Нажмите для продолжения> # DO NOT TRANSLATE ANY OF THESE YET! THEY ARE UNFINISHED!
tutorial.intro = Вы начали[scarlet] обучение по Mindustry.[]\nИспользуйте кнопки [accent][[WASD][] для передвижения.\n[accent]Покрутите колесо мыши[] для приближения или отдаления камеры.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди # hint.skip = Skip
tutorial.intro.mobile = Вы начали[scarlet] обучение по Mindustry.[]\nПроведите по экрану, чтобы двигаться.\n[accent]Сведите или разведите 2 пальца[] для изменения масштаба.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле Ввашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди # hint.desktopMove = Use [accent][[WASD][] to move.
tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры[] могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство. # hint.zoom = [accent]Scroll[] to zoom in or out.
tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[].\nРазместите его на медной жиле нажатием, затем нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение. # hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
tutorial.blockinfo = Каждый блок имеет разные характеристики. Каждая дрель может добывать определенные руды.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[] # hint.desktopShoot = [accent][[Left-click][] to shoot.
tutorial.conveyor = [accent]Конвейеры[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить в линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]Разместите 2 конвейера в линию и доставьте предметы в ядро. # hint.depositItems = To transfer items, drag from your ship to the core.
tutorial.conveyor.mobile = [accent]Конвейеры[] используются для транспортировки ресурсов в ядро\nСделайте линию конвейеров от бура к ядру\n[accent]Сделайте линию, удерживая палец несколько секунд в том месте, в котором вы хотите начать линию,[] и перетяните его в нужном направлении. [accent]Разместите 2 конвейера в линию и доставьте предметы в ядро. # hint.respawn = To respawn as a ship, press [accent][[V][].
tutorial.turret = Как только предмет попадает в ядро, его можно использовать в строительстве.\nИмейте в виду, что не все предметы могут быть использованы в строительстве.\nПредметы, которые нельзя использовать для стоительства, такие как[accent] уголь[] или[accent] металлолом[], не могут быть транспортированы в ядро.\nЗащитные структуры нужно строить для отражения[lightgray] противников[].\nПостройте[accent] двойную турель[] возле вашей базы. # hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
tutorial.drillturret = Двойным турелям нужна [accent]медные боеприпасы[] для стрельбы.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её медью.\n\n[accent]Боеприпасов доставлено: 0/1 # hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
tutorial.pause = Во время битвы, вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры. # 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.
tutorial.pause.mobile = Во время битвы, вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку вверху слева, чтобы поставить игру на паузу. # 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.
tutorial.unpause = Снова нажмите пробел для снятия паузы. # 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.
tutorial.unpause.mobile = Снова нажмите туда для снятия паузы. # 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.
tutorial.breaking = Зачастую, блоки приходится разрушать\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в выбранной зоне.[]\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра. # 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.
tutorial.breaking.mobile = Зачастую, блоки приходится разрушать.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы разрушить его.\nРазрушьте блоки в выбранной зоне, зажав палец на несколько секунд[], и проведя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра. # hint.breaking = [accent]Right-click[] and drag to break blocks.
tutorial.withdraw = В некоторых ситуациях, необходимо забрать предметы из блоков вручную.\nЧтобы сделать это, [accent]нажмите на блок[], в котором находятся предметы, затем [accent]нажмите на предмет[] в инвентаре.\nМожно забрать несколько предметов [accent]нажатием с зажимом[].\n\n[accent]Заберите немного меди из ядра[] # 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.
tutorial.deposit = Положите предметы в блок, перетащив их от своего корабля в нужный блок.\n\n[accent]Перенесите медь обратно в ядро[] # hint.research = Use the \ue875 [accent]Research[] button to research new technology.
tutorial.waves = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Используйте[accent] левую кнопку мыши[] для стрельбы.\nПостройте больше турелей и буров. Добудьте больше меди. # hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш корабль будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди. # hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
tutorial.launch = Когда вы достигаете определенной волны, вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения новых технологий.\n\n[accent]Нажмите кнопку запуска. # 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 into formation.
# 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.
item.copper.description = Используется во всех типах построек и боеприпасов. item.copper.description = Используется во всех типах построек и боеприпасов.
item.copper.details = Медь. Аномально широко распространённый металл на Серпуло. Структурно слабый, если не укреплён. item.copper.details = Медь. Аномально широко распространённый металл на Серпуло. Структурно слабый, если не укреплён.
@@ -1268,7 +1288,7 @@ item.coal.details = Похоже, что это окаменевшее раст
item.titanium.description = Широко используется в транспортировке жидкостей, бурах и авиации. item.titanium.description = Широко используется в транспортировке жидкостей, бурах и авиации.
item.thorium.description = Используется в прочных постройках и как ядерного топлива. item.thorium.description = Используется в прочных постройках и как ядерного топлива.
item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов. item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов.
item.scrap.details = Остататки старых построек и единиц. item.scrap.details = Остатки старых построек и единиц.
item.silicon.description = Используется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах для турелей. item.silicon.description = Используется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах для турелей.
item.plastanium.description = Используется в продвинутой авиации, изоляции и осколочных боеприпасах. item.plastanium.description = Используется в продвинутой авиации, изоляции и осколочных боеприпасах.
item.phase-fabric.description = Используется в продвинутой электронике и самовосстанавливающихся постройках. item.phase-fabric.description = Используется в продвинутой электронике и самовосстанавливающихся постройках.
@@ -1283,7 +1303,7 @@ liquid.slag.description = Может быть переработан в разд
liquid.oil.description = Используется в производстве продвинутых материалов и как зажигательный боеприпас. liquid.oil.description = Используется в производстве продвинутых материалов и как зажигательный боеприпас.
liquid.cryofluid.description = Используется в качестве охлаждающей жидкости для реакторов, турелей и фабрик. liquid.cryofluid.description = Используется в качестве охлаждающей жидкости для реакторов, турелей и фабрик.
block.resupply-point.description = Снаряжает медными боеприпасами ближайщие боевые единицы. Не совместим с единицами, требующими питания от батареи. block.resupply-point.description = Снаряжает медными боеприпасами ближайшие боевые единицы. Не совместим с единицами, требующими питания от батареи.
block.armored-conveyor.description = Перемещает предметы вперёд. Не принимает вход по бокам. block.armored-conveyor.description = Перемещает предметы вперёд. Не принимает вход по бокам.
block.illuminator.description = Излучает свет. block.illuminator.description = Излучает свет.
block.message.description = Сохраняет сообщение для связи между союзниками. block.message.description = Сохраняет сообщение для связи между союзниками.
@@ -1341,7 +1361,7 @@ block.router.details = Необходимое зло. Не рекомендуе
block.distributor.description = Равномерно распределяет входящие предметы по 7 выходящим направлениям. block.distributor.description = Равномерно распределяет входящие предметы по 7 выходящим направлениям.
block.overflow-gate.description = Выводит предметы по бокам, только если передний путь заблокирован. Нельзя использовать вплотную к другим затворам или шлюзам. block.overflow-gate.description = Выводит предметы по бокам, только если передний путь заблокирован. Нельзя использовать вплотную к другим затворам или шлюзам.
block.underflow-gate.description = Противоположность избыточного затвора. Выводит предметы вперёд только в том случае, если боковые пути заблокированы. Нельзя использовать вплотную к другим шлюзам или затворам. block.underflow-gate.description = Противоположность избыточного затвора. Выводит предметы вперёд только в том случае, если боковые пути заблокированы. Нельзя использовать вплотную к другим шлюзам или затворам.
block.mass-driver.description = Постройка для дальней транспортировки предметов. Собирает несколько предметов и затем стреляет ими в другуе катапульты. block.mass-driver.description = Постройка для дальней транспортировки предметов. Собирает несколько предметов и затем стреляет ими в другие катапульты.
block.mechanical-pump.description = Перекачивает и выводит жидкости. Не требует энергию. block.mechanical-pump.description = Перекачивает и выводит жидкости. Не требует энергию.
block.rotary-pump.description = Перекачивает и выводит жидкости. Требует энергию. block.rotary-pump.description = Перекачивает и выводит жидкости. Требует энергию.
block.thermal-pump.description = Перекачивает и выводит жидкости. block.thermal-pump.description = Перекачивает и выводит жидкости.
@@ -1368,7 +1388,7 @@ block.solar-panel.description = Обеспечивает небольшое ко
block.solar-panel-large.description = Обеспечивает небольшое количество энергии от солнца. Более эффективный вариант стандартной солнечной панели. block.solar-panel-large.description = Обеспечивает небольшое количество энергии от солнца. Более эффективный вариант стандартной солнечной панели.
block.thorium-reactor.description = Вырабатывает значительное количество энергии из тория. Требует постоянного охлаждения. Взорвётся с большой силой при недостаточном количестве охлаждающей жидкости. block.thorium-reactor.description = Вырабатывает значительное количество энергии из тория. Требует постоянного охлаждения. Взорвётся с большой силой при недостаточном количестве охлаждающей жидкости.
block.impact-reactor.description = Создаёт огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. block.impact-reactor.description = Создаёт огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса.
block.mechanical-drill.description = При размещении на соответствующей руде, остоянно выводит предметы в медленном темпе. Способен добывать только базовые ресурсы. block.mechanical-drill.description = При размещении на соответствующей руде, постоянно выводит предметы в медленном темпе. Способен добывать только базовые ресурсы.
block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур.
block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий.
block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии. block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии.
@@ -1426,7 +1446,7 @@ block.memory-cell.description = Хранит информацию для лог
block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость. block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость.
block.logic-display.description = Отображает произвольную графику из логического процессора. block.logic-display.description = Отображает произвольную графику из логического процессора.
block.large-logic-display.description = Отображает произвольную графику из логического процессора. block.large-logic-display.description = Отображает произвольную графику из логического процессора.
block.interplanetary-accelerator.description = Массивный рельсотронный ускоритель. Разгоняет ядро до второй космической скорости для межпланетных размещений. block.interplanetary-accelerator.description = Массивный рельсотронный ускоритель. Ускоряет ядро позволяя преодолеть гравитацию для межпланетного развёртывания
unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости. unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости.
unit.mace.description = Стреляет потоками огня по всем врагам поблизости. unit.mace.description = Стреляет потоками огня по всем врагам поблизости.

Binary file not shown.

View File

@@ -1,6 +1,6 @@
"use strict"; "use strict";
const log = function(context, obj){ function log(context, obj){
Vars.mods.scripts.log(context, String(obj)) Vars.mods.scripts.log(context, String(obj))
} }
@@ -19,15 +19,28 @@ let modName = "none"
const print = text => log(modName + "/" + scriptName, text); const print = text => log(modName + "/" + scriptName, text);
const extendContent = function(classType, name, params){ //js 'extend(Base, ..., {})' = java 'new Base(...) {}'
return new JavaAdapter(classType, params, name) 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){ //For backwards compatibility, use extend instead
return new JavaAdapter(classType, params) 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 run = method => new java.lang.Runnable(){run: method}
const boolf = method => new Boolf(){get: method} const boolf = method => new Boolf(){get: method}
const boolp = method => new Boolp(){get: method} const boolp = method => new Boolp(){get: method}

View File

@@ -2,14 +2,14 @@
"use strict"; "use strict";
const log = function(context, obj){ function log(context, obj){
Vars.mods.getScripts().log(context, String(obj)) Vars.mods.scripts.log(context, String(obj))
} }
const readString = path => Vars.mods.getScripts().readString(path) const readString = path => Vars.mods.scripts.readString(path)
const readBytes = path => Vars.mods.getScripts().readBytes(path) const readBytes = path => Vars.mods.scripts.readBytes(path)
const loadMusic = path => Vars.mods.getScripts().loadMusic(path) const loadMusic = path => Vars.mods.scripts.loadMusic(path)
const loadSound = path => Vars.mods.getScripts().loadSound(path) const loadSound = path => Vars.mods.scripts.loadSound(path)
const readFile = (purpose, ext, cons) => Vars.mods.scripts.readFile(purpose, ext, cons); 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 readBinFile = (purpose, ext, cons) => Vars.mods.scripts.readBinFile(purpose, ext, cons);
@@ -21,15 +21,28 @@ let modName = "none"
const print = text => log(modName + "/" + scriptName, text); const print = text => log(modName + "/" + scriptName, text);
const extendContent = function(classType, name, params){ //js 'extend(Base, ..., {})' = java 'new Base(...) {}'
return new JavaAdapter(classType, params, name) 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){ //For backwards compatibility, use extend instead
return new JavaAdapter(classType, params) 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 run = method => new java.lang.Runnable(){run: method}
const boolf = method => new Boolf(){get: method} const boolf = method => new Boolf(){get: method}
const boolp = method => new Boolp(){get: method} const boolp = method => new Boolp(){get: method}
@@ -73,6 +86,7 @@ importPackage(Packages.mindustry.entities)
importPackage(Packages.mindustry.entities.abilities) importPackage(Packages.mindustry.entities.abilities)
importPackage(Packages.mindustry.entities.bullet) importPackage(Packages.mindustry.entities.bullet)
importPackage(Packages.mindustry.entities.comp) importPackage(Packages.mindustry.entities.comp)
importPackage(Packages.mindustry.entities.effect)
importPackage(Packages.mindustry.entities.units) importPackage(Packages.mindustry.entities.units)
importPackage(Packages.mindustry.game) importPackage(Packages.mindustry.game)
importPackage(Packages.mindustry.gen) importPackage(Packages.mindustry.gen)
@@ -134,6 +148,8 @@ const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent
const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent
const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent
const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent 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 TapEvent = Packages.mindustry.game.EventType.TapEvent
const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent
const DepositEvent = Packages.mindustry.game.EventType.DepositEvent const DepositEvent = Packages.mindustry.game.EventType.DepositEvent
@@ -142,6 +158,8 @@ const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent 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 LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent
const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent

View File

@@ -88,7 +88,7 @@ public class Vars implements Loadable{
/** duration of time between turns in ticks */ /** duration of time between turns in ticks */
public static final float turnDuration = 2 * Time.toMinutes; public static final float turnDuration = 2 * Time.toMinutes;
/** chance of an invasion per turn, 1 = 100% */ /** chance of an invasion per turn, 1 = 100% */
public static final float baseInvasionChance = 1f / 30f; public static final float baseInvasionChance = 1f / 50f;
/** how many turns have to pass before invasions start */ /** how many turns have to pass before invasions start */
public static final int invasionGracePeriod = 20; public static final int invasionGracePeriod = 20;
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */ /** min armor fraction damage; e.g. 0.05 = at least 5% damage */

View File

@@ -1,5 +1,7 @@
package mindustry.ai; package mindustry.ai;
import arc.*;
import arc.input.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
@@ -17,16 +19,18 @@ import mindustry.world.*;
import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.*;
import mindustry.world.blocks.production.*; import mindustry.world.blocks.production.*;
import mindustry.world.blocks.storage.*; import mindustry.world.blocks.storage.*;
import mindustry.world.blocks.storage.CoreBlock.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class BaseAI{ public class BaseAI{
private static final Vec2 axis = new Vec2(), rotator = new Vec2(); private static final Vec2 axis = new Vec2(), rotator = new Vec2();
private static final float correctPercent = 0.5f; private static final float correctPercent = 0.5f;
private static final float step = 5;
private static final int attempts = 4; private static final int attempts = 4;
private static final float emptyChance = 0.01f; 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<Tile> tmpTiles = new Seq<>();
private static int correct = 0, incorrect = 0; private static int correct = 0, incorrect = 0;
@@ -36,6 +40,13 @@ public class BaseAI{
TeamData data; TeamData data;
Interval timer = new Interval(4); 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){ public BaseAI(TeamData data){
this.data = data; this.data = data;
} }
@@ -53,8 +64,76 @@ public class BaseAI{
} }
} }
//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());
//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 ++;
break;
}
calcCount ++;
}
}
}
//only schedule when there's something to build. //only schedule when there's something to build.
if(data.blocks.isEmpty() && timer.get(timerStep, Mathf.lerp(20f, 4f, data.team.rules().aiTier))){ if(totalCalcs > 0 && data.blocks.isEmpty() && timer.get(timerStep, Mathf.lerp(20f, 4f, data.team.rules().aiTier))){
if(!triedWalls){ if(!triedWalls){
tryWalls(); tryWalls();
triedWalls = true; triedWalls = true;
@@ -123,6 +202,13 @@ public class BaseAI{
if(!Build.validPlace(tile.block, data.team, realX, realY, tile.rotation)){ if(!Build.validPlace(tile.block, data.team, realX, realY, tile.rotation)){
return false; 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 //make sure at least X% of resource requirements are met
@@ -191,7 +277,8 @@ public class BaseAI{
} }
} }
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)); data.blocks.add(new BlockPlan(tile.x, tile.y, (short)0, wall.id, null));
} }
} }

View File

@@ -87,6 +87,8 @@ public class Pathfinder implements Runnable{
tiles[tile.x][tile.y] = packTile(tile); tiles[tile.x][tile.y] = packTile(tile);
} }
preloadPath(getField(state.rules.waveTeam, costGround, fieldCore));
start(); start();
}); });

View File

@@ -19,10 +19,6 @@ public class BuilderAI extends AIController{
@Override @Override
public void updateMovement(){ public void updateMovement(){
if(unit.moving()){
unit.lookAt(unit.vel.angle());
}
if(target != null && shouldShoot()){ if(target != null && shouldShoot()){
unit.lookAt(target); unit.lookAt(target);
} }

View File

@@ -23,7 +23,7 @@ public class RepairAI extends AIController{
} }
if(target != null){ if(target != null){
if(!target.within(unit, unit.type.range * 0.65f) && target instanceof Building){ if(!target.within(unit, unit.type.range * 0.65f) && target instanceof Building b && b.team == unit.team){
moveTo(target, unit.type.range * 0.65f); moveTo(target, unit.type.range * 0.65f);
} }

View File

@@ -1508,6 +1508,7 @@ public class Blocks implements ContentList{
shootEffect = Fx.shootLiquid; shootEffect = Fx.shootLiquid;
range = 110f; range = 110f;
health = 250 * size * size; health = 250 * size * size;
flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher);
}}; }};
lancer = new ChargeTurret("lancer"){{ lancer = new ChargeTurret("lancer"){{
@@ -2054,11 +2055,12 @@ public class Blocks implements ContentList{
}}; }};
interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{
requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 9000, Items.silicon, 9000, Items.thorium, 9000, Items.titanium, 9000, Items.surgeAlloy, 5000, Items.phaseFabric, 4000)); 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; researchCostMultiplier = 0.1f;
size = 7; size = 7;
hasPower = true; hasPower = true;
consumes.power(10f); consumes.power(10f);
buildCostMultiplier = 0.5f;
}}; }};
//endregion campaign //endregion campaign

View File

@@ -40,8 +40,6 @@ public class Planets implements ContentList{
startSector = 10; startSector = 10;
atmosphereRadIn = -0.01f; atmosphereRadIn = -0.01f;
atmosphereRadOut = 0.3f; atmosphereRadOut = 0.3f;
accessible = false;
visible = false;
}};*/ }};*/
serpulo = new Planet("serpulo", sun, 3, 1){{ serpulo = new Planet("serpulo", sun, 3, 1){{

View File

@@ -31,6 +31,7 @@ public class TechTree implements ContentList{
node(router, () -> { node(router, () -> {
node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> {
node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> {
}); });
}); });
@@ -200,6 +201,7 @@ public class TechTree implements ContentList{
}); });
node(illuminator, () -> { node(illuminator, () -> {
}); });
}); });
@@ -422,6 +424,7 @@ public class TechTree implements ContentList{
node(multiplicativeReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> { node(multiplicativeReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> {
node(exponentialReconstructor, () -> { node(exponentialReconstructor, () -> {
node(tetrativeReconstructor, () -> { node(tetrativeReconstructor, () -> {
}); });
}); });
}); });
@@ -463,7 +466,7 @@ public class TechTree implements ContentList{
node(impact0078, Seq.with( node(impact0078, Seq.with(
new SectorComplete(tarFields), new SectorComplete(tarFields),
new Research(Items.thorium), new Research(Items.thorium),
new Research(overdriveProjector) new Research(coreFoundation)
), () -> { ), () -> {
node(desolateRift, Seq.with( node(desolateRift, Seq.with(
new SectorComplete(impact0078), new SectorComplete(impact0078),

View File

@@ -995,6 +995,7 @@ public class UnitTypes implements ContentList{
shots = 2; shots = 2;
inaccuracy = 5f; inaccuracy = 5f;
velocityRnd = 0.2f; velocityRnd = 0.2f;
shootSound = Sounds.missile;
bullet = new MissileBulletType(3f, 12){{ bullet = new MissileBulletType(3f, 12){{
width = 8f; width = 8f;
@@ -1055,7 +1056,7 @@ public class UnitTypes implements ContentList{
ejectEffect = Fx.casing1; ejectEffect = Fx.casing1;
rotateSpeed = 8f; rotateSpeed = 8f;
bullet = missiles; bullet = missiles;
shootSound = Sounds.shoot; shootSound = Sounds.missile;
rotate = true; rotate = true;
occlusion = 6f; occlusion = 6f;
}}, }},
@@ -1066,7 +1067,7 @@ public class UnitTypes implements ContentList{
rotateSpeed = 8f; rotateSpeed = 8f;
ejectEffect = Fx.casing1; ejectEffect = Fx.casing1;
bullet = missiles; bullet = missiles;
shootSound = Sounds.shoot; shootSound = Sounds.missile;
rotate = true; rotate = true;
occlusion = 6f; occlusion = 6f;
}}, }},
@@ -1147,7 +1148,7 @@ public class UnitTypes implements ContentList{
y = 27f; y = 27f;
rotateSpeed = 2f; rotateSpeed = 2f;
reload = 9f; reload = 9f;
shootSound = Sounds.flame; shootSound = Sounds.shoot;
occlusion = 7f; occlusion = 7f;
rotate = true; rotate = true;
recoil = 0.5f; recoil = 0.5f;
@@ -1249,6 +1250,7 @@ public class UnitTypes implements ContentList{
defaultController = RepairAI::new; defaultController = RepairAI::new;
mineTier = 3; mineTier = 3;
mineSpeed = 4f;
health = 500; health = 500;
armor = 5f; armor = 5f;
speed = 2.5f; speed = 2.5f;
@@ -1692,8 +1694,8 @@ public class UnitTypes implements ContentList{
bullet = new RailBulletType(){{ bullet = new RailBulletType(){{
shootEffect = Fx.railShoot; shootEffect = Fx.railShoot;
speed = 67f; length = 500;
lifetime = 8f; updateEffectSeg = 60f;
pierceEffect = Fx.railHit; pierceEffect = Fx.railHit;
updateEffect = Fx.railTrail; updateEffect = Fx.railTrail;
hitEffect = Fx.massiveExplosion; hitEffect = Fx.massiveExplosion;
@@ -1731,6 +1733,7 @@ public class UnitTypes implements ContentList{
x = 2.75f; x = 2.75f;
y = 1f; y = 1f;
top = false; top = false;
ejectEffect = Fx.casing1;
bullet = new BasicBulletType(2.5f, 10){{ bullet = new BasicBulletType(2.5f, 10){{
width = 7f; width = 7f;
@@ -1738,7 +1741,7 @@ public class UnitTypes implements ContentList{
lifetime = 60f; lifetime = 60f;
shootEffect = Fx.shootSmall; shootEffect = Fx.shootSmall;
smokeEffect = Fx.shootSmallSmoke; smokeEffect = Fx.shootSmallSmoke;
tileDamageMultiplier = 0.03f; tileDamageMultiplier = 0.02f;
}}; }};
}}); }});
}}; }};
@@ -1772,6 +1775,7 @@ public class UnitTypes implements ContentList{
shots = 2; shots = 2;
shotDelay = 4f; shotDelay = 4f;
spacing = 0f; spacing = 0f;
ejectEffect = Fx.casing1;
bullet = new BasicBulletType(3f, 10){{ bullet = new BasicBulletType(3f, 10){{
width = 7f; width = 7f;
@@ -1779,7 +1783,7 @@ public class UnitTypes implements ContentList{
lifetime = 60f; lifetime = 60f;
shootEffect = Fx.shootSmall; shootEffect = Fx.shootSmall;
smokeEffect = Fx.shootSmallSmoke; smokeEffect = Fx.shootSmallSmoke;
tileDamageMultiplier = 0.03f; tileDamageMultiplier = 0.02f;
}}; }};
}}); }});
}}; }};
@@ -1811,6 +1815,7 @@ public class UnitTypes implements ContentList{
spacing = 2f; spacing = 2f;
inaccuracy = 3f; inaccuracy = 3f;
shotDelay = 3f; shotDelay = 3f;
ejectEffect = Fx.casing1;
bullet = new BasicBulletType(3.5f, 10){{ bullet = new BasicBulletType(3.5f, 10){{
width = 6.5f; width = 6.5f;
@@ -1818,7 +1823,7 @@ public class UnitTypes implements ContentList{
lifetime = 70f; lifetime = 70f;
shootEffect = Fx.shootSmall; shootEffect = Fx.shootSmall;
smokeEffect = Fx.shootSmallSmoke; smokeEffect = Fx.shootSmallSmoke;
tileDamageMultiplier = 0.03f; tileDamageMultiplier = 0.02f;
homingPower = 0.04f; homingPower = 0.04f;
}}; }};
}}); }});

View File

@@ -44,7 +44,6 @@ import static mindustry.Vars.*;
public class Control implements ApplicationListener, Loadable{ public class Control implements ApplicationListener, Loadable{
public Saves saves; public Saves saves;
public SoundControl sound; public SoundControl sound;
public Tutorial tutorial;
public InputHandler input; public InputHandler input;
private Interval timer = new Interval(2); private Interval timer = new Interval(2);
@@ -53,7 +52,6 @@ public class Control implements ApplicationListener, Loadable{
public Control(){ public Control(){
saves = new Saves(); saves = new Saves();
tutorial = new Tutorial();
sound = new SoundControl(); sound = new SoundControl();
Events.on(StateChangeEvent.class, event -> { Events.on(StateChangeEvent.class, event -> {
@@ -87,7 +85,6 @@ public class Control implements ApplicationListener, Loadable{
Events.on(ResetEvent.class, event -> { Events.on(ResetEvent.class, event -> {
player.reset(); player.reset();
tutorial.reset();
hiscore = false; hiscore = false;
saves.resetSave(); saves.resetSave();
@@ -164,7 +161,7 @@ public class Control implements ApplicationListener, Loadable{
if(state.isCampaign() && !net.client() && !headless){ if(state.isCampaign() && !net.client() && !headless){
//save gameover sate immediately //save gameover sate immediately
if(saves.getCurrent() != null && !state.rules.tutorial){ if(saves.getCurrent() != null){
saves.getCurrent().save(); saves.getCurrent().save();
} }
} }
@@ -408,13 +405,6 @@ public class Control implements ApplicationListener, Loadable{
public void init(){ public void init(){
platform.updateRPC(); platform.updateRPC();
//just a regular reminder
if(!OS.prop("user.name").equals("anuke") && !OS.hasEnv("iknowwhatimdoing")){
app.post(() -> app.post(() -> {
ui.showStartupInfo("@indev.popup");
}));
}
//display UI scale changed dialog //display UI scale changed dialog
if(Core.settings.getBool("uiscalechanged", false)){ if(Core.settings.getBool("uiscalechanged", false)){
Core.app.post(() -> Core.app.post(() -> { Core.app.post(() -> Core.app.post(() -> {
@@ -479,10 +469,6 @@ public class Control implements ApplicationListener, Loadable{
if(state.isGame()){ if(state.isGame()){
input.update(); input.update();
if(state.rules.tutorial){
tutorial.update();
}
//auto-update rpc every 5 seconds //auto-update rpc every 5 seconds
if(timer.get(0, 60 * 5)){ if(timer.get(0, 60 * 5)){
platform.updateRPC(); platform.updateRPC();

View File

@@ -69,7 +69,7 @@ public class GameState{
} }
public boolean isPaused(){ 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(){ public boolean isPlaying(){

View File

@@ -264,7 +264,7 @@ public class Logic implements ApplicationListener{
Events.fire(new SectorCaptureEvent(state.rules.sector)); Events.fire(new SectorCaptureEvent(state.rules.sector));
//save, just in case //save, just in case
if(!headless){ if(!headless && !net.client()){
control.saves.saveSector(state.rules.sector); control.saves.saveSector(state.rules.sector);
} }
} }

View File

@@ -21,6 +21,7 @@ import mindustry.net.Administration.*;
import mindustry.net.Net.*; import mindustry.net.Net.*;
import mindustry.net.*; import mindustry.net.*;
import mindustry.net.Packets.*; import mindustry.net.Packets.*;
import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.modules.*; import mindustry.world.modules.*;
@@ -340,6 +341,13 @@ public class NetClient implements ApplicationListener{
ui.showInfoToast(message, duration); 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) @Remote(variants = Variant.both)
public static void setRules(Rules rules){ public static void setRules(Rules rules){
state.rules = rules; state.rules = rules;

View File

@@ -41,7 +41,7 @@ public class NetServer implements ApplicationListener{
private static final Vec2 vector = new Vec2(); private static final Vec2 vector = new Vec2();
private static final Rect viewport = new Rect(); private static final Rect viewport = new Rect();
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ /** 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 * 8f;
public final Administration admins = new Administration(); public final Administration admins = new Administration();
public final CommandHandler clientCommands = new CommandHandler("/"); public final CommandHandler clientCommands = new CommandHandler("/");
@@ -638,12 +638,12 @@ public class NetServer implements ApplicationListener{
Unit unit = player.unit(); Unit unit = player.unit();
long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime); long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime);
float maxSpeed = ((player.unit().type.canBoost && player.unit().isFlying()) ? player.unit().type.boostMultiplier : 1f) * player.unit().speed(); float maxSpeed = unit.realSpeed();
if(unit.isGrounded()){ if(unit.isGrounded()){
maxSpeed *= unit.floorSpeedMultiplier(); 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 //ignore the position if the player thinks they're dead, or the unit is wrong
boolean ignorePosition = dead || unit.id != unitID; boolean ignorePosition = dead || unit.id != unitID;

View File

@@ -42,6 +42,7 @@ public class UI implements ApplicationListener, Loadable{
public MinimapFragment minimapfrag; public MinimapFragment minimapfrag;
public PlayerListFragment listfrag; public PlayerListFragment listfrag;
public LoadingFragment loadfrag; public LoadingFragment loadfrag;
public HintsFragment hints;
public WidgetGroup menuGroup, hudGroup; public WidgetGroup menuGroup, hudGroup;
@@ -140,12 +141,6 @@ public class UI implements ApplicationListener, Loadable{
} }
} }
//draw overlay for buttons
if(state.rules.tutorial){
control.tutorial.draw();
Draw.flush();
}
Events.fire(Trigger.uiDrawEnd); Events.fire(Trigger.uiDrawEnd);
} }
@@ -156,6 +151,7 @@ public class UI implements ApplicationListener, Loadable{
menufrag = new MenuFragment(); menufrag = new MenuFragment();
hudfrag = new HudFragment(); hudfrag = new HudFragment();
hints = new HintsFragment();
chatfrag = new ChatFragment(); chatfrag = new ChatFragment();
minimapfrag = new MinimapFragment(); minimapfrag = new MinimapFragment();
listfrag = new PlayerListFragment(); listfrag = new PlayerListFragment();
@@ -526,7 +522,7 @@ public class UI implements ApplicationListener, Loadable{
//TODO move? //TODO move?
public static String formatAmount(long number){ public static String formatAmount(int number){
if(number >= 1_000_000_000){ if(number >= 1_000_000_000){
return Strings.fixed(number / 1_000_000_000f, 1) + "[gray]" + Core.bundle.get("unit.billions") + "[]"; return Strings.fixed(number / 1_000_000_000f, 1) + "[gray]" + Core.bundle.get("unit.billions") + "[]";
}else if(number >= 1_000_000){ }else if(number >= 1_000_000){

View File

@@ -25,6 +25,7 @@ public class Damage{
private static Rect rect = new Rect(); private static Rect rect = new Rect();
private static Rect hitrect = new Rect(); private static Rect hitrect = new Rect();
private static Vec2 tr = new Vec2(); private static Vec2 tr = new Vec2();
private static Seq<Unit> units = new Seq<>();
private static GridBits bits = new GridBits(30, 30); private static GridBits bits = new GridBits(30, 30);
private static IntQueue propagation = new IntQueue(); private static IntQueue propagation = new IntQueue();
private static IntSet collidedBlocks = new IntSet(); private static IntSet collidedBlocks = new IntSet();
@@ -117,6 +118,7 @@ public class Damage{
Building tile = world.build(cx, cy); Building tile = world.build(cx, cy);
boolean collide = tile != null && collidedBlocks.add(tile.pos()); boolean collide = tile != null && collidedBlocks.add(tile.pos());
if(hitter.damage > 0){
if(collide && tile.team != team && tile.collide(hitter)){ if(collide && tile.team != team && tile.collide(hitter)){
tile.collision(hitter); tile.collision(hitter);
hitter.type.hit(hitter, tile.x, tile.y); hitter.type.hit(hitter, tile.x, tile.y);
@@ -124,7 +126,8 @@ public class Damage{
//try to heal the tile //try to heal the tile
if(collide && hitter.type.collides(hitter, tile)){ if(collide && hitter.type.collides(hitter, tile)){
hitter.type.hitTile(hitter, tile, 0f, false); hitter.type.hitTile(hitter, tile, tile.health, false);
}
} }
}; };
@@ -161,20 +164,27 @@ public class Damage{
rect.height += expand * 2; rect.height += expand * 2;
Cons<Unit> cons = e -> { Cons<Unit> cons = e -> {
if(!e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return;
e.hitbox(hitrect); e.hitbox(hitrect);
Vec2 vec = Geometry.raycastRect(x, y, x2, y2, hitrect.grow(expand * 2)); 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); effect.at(vec.x, vec.y);
e.collision(hitter, vec.x, vec.y); e.collision(hitter, vec.x, vec.y);
hitter.collision(e, 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);
} }
/** /**

View File

@@ -4,6 +4,7 @@ import arc.*;
import arc.func.*; import arc.func.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*;
import mindustry.gen.*; import mindustry.gen.*;
import java.util.*; import java.util.*;
@@ -93,6 +94,7 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
return map != null; return map != null;
} }
@Nullable
public T getByID(int id){ public T getByID(int id){
if(map == null) throw new RuntimeException("Mapping is not enabled for group " + id + "!"); if(map == null) throw new RuntimeException("Mapping is not enabled for group " + id + "!");
return map.get(id); return map.get(id);
@@ -188,10 +190,16 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
clearing = false; clearing = false;
} }
@Nullable
public T find(Boolf<T> pred){ public T find(Boolf<T> pred){
return array.find(pred); return array.find(pred);
} }
@Nullable
public T first(){
return array.first();
}
@Override @Override
public Iterator<T> iterator(){ public Iterator<T> iterator(){
return array.iterator(); return array.iterator();

View File

@@ -12,6 +12,8 @@ import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import static mindustry.Vars.*;
public class UnitSpawnAbility extends Ability{ public class UnitSpawnAbility extends Ability{
public UnitType type; public UnitType type;
public float spawnTime = 60f, spawnX, spawnY; public float spawnTime = 60f, spawnX, spawnY;
@@ -31,7 +33,7 @@ public class UnitSpawnAbility extends Ability{
@Override @Override
public void update(Unit unit){ public void update(Unit unit){
timer += Time.delta; timer += Time.delta * state.rules.unitBuildSpeedMultiplier;
if(timer >= spawnTime && Units.canCreate(unit.team, type)){ 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); float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX);

View File

@@ -1,5 +1,7 @@
package mindustry.entities.bullet; package mindustry.entities.bullet;
import arc.math.geom.*;
import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -15,36 +17,54 @@ public class RailBulletType extends BulletType{
/** Multiplier of damage decreased per health pierced. */ /** Multiplier of damage decreased per health pierced. */
public float pierceDamageFactor = 1f; public float pierceDamageFactor = 1f;
public float length = 100f;
public float updateEffectSeg = 20f;
public RailBulletType(){ public RailBulletType(){
pierceBuilding = true; pierceBuilding = true;
pierce = true; pierce = true;
reflectable = false; reflectable = false;
hitEffect = Fx.none; hitEffect = Fx.none;
despawnEffect = Fx.none; despawnEffect = Fx.none;
collides = false;
lifetime = 1f;
}
@Override
public float range(){
return length;
} }
void handle(Bullet b, Posc pos, float initialHealth){ void handle(Bullet b, Posc pos, float initialHealth){
float sub = initialHealth*pierceDamageFactor; float sub = initialHealth*pierceDamageFactor;
if(sub >= b.damage){ if(b.damage <= 0){
//cause a despawn b.fdata = Math.min(b.fdata, b.dst(pos));
b.remove(); return;
} }
//subtract health from each consecutive pierce
b.damage -= Math.min(b.damage, sub);
if(b.damage > 0){ if(b.damage > 0){
pierceEffect.at(pos.getX(), pos.getY(), b.rotation()); pierceEffect.at(pos.getX(), pos.getY(), b.rotation());
}
hitEffect.at(pos.getX(), pos.getY()); hitEffect.at(pos.getX(), pos.getY());
} }
//subtract health from each consecutive pierce
b.damage -= Math.min(b.damage, sub);
}
@Override @Override
public void update(Bullet b){ public void init(Bullet b){
if(b.timer(1, 0.9f)){ super.init(b);
updateEffect.at(b.x, b.y, b.rotation());
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());
} }
} }

View File

@@ -519,7 +519,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
public void dumpLiquid(Liquid liquid){ public void dumpLiquid(Liquid liquid){
int dump = this.cdump; int dump = this.cdump;
if(!net.client() && state.isCampaign()) liquid.unlock(); if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock();
for(int i = 0; i < proximity.size; i++){ for(int i = 0; i < proximity.size; i++){
incrementDump(proximity.size); incrementDump(proximity.size);
@@ -620,7 +620,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
*/ */
public void offload(Item item){ public void offload(Item item){
int dump = this.cdump; int dump = this.cdump;
if(!net.client() && state.isCampaign()) item.unlock(); if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) item.unlock();
for(int i = 0; i < proximity.size; i++){ for(int i = 0; i < proximity.size; i++){
incrementDump(proximity.size); incrementDump(proximity.size);

View File

@@ -29,9 +29,14 @@ abstract class CommanderComp implements Entityc, Posc{
transient float minFormationSpeed; transient float minFormationSpeed;
public void update(){ public void update(){
if(controlling.isEmpty()){
formation = null;
}
if(formation != null){ if(formation != null){
formation.anchor.set(x, y, 0); formation.anchor.set(x, y, 0);
formation.updateSlots(); formation.updateSlots();
controlling.removeAll(u -> u.dead || !(u.controller() instanceof FormationAI ai && ai.leader == self()));
} }
} }
@@ -64,6 +69,8 @@ abstract class CommanderComp implements Entityc, Posc{
} }
}); });
if(units.isEmpty()) return;
//sort by hitbox size, then by distance //sort by hitbox size, then by distance
units.sort(Structs.comps(Structs.comparingFloat(u -> -u.hitSize), Structs.comparingFloat(u -> u.dst2(this)))); units.sort(Structs.comps(Structs.comparingFloat(u -> -u.hitSize), Structs.comparingFloat(u -> u.dst2(this))));
units.truncate(type.commandLimit); units.truncate(type.commandLimit);

View File

@@ -45,7 +45,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
} }
public boolean canMine(){ public boolean canMine(){
return type.mineSpeed > 0; return type.mineSpeed > 0 && type.mineTier >= 0;
} }
@Override @Override

View File

@@ -32,8 +32,6 @@ public class Rules{
public boolean attackMode = false; public boolean attackMode = false;
/** Whether this is the editor gamemode. */ /** Whether this is the editor gamemode. */
public boolean editor = false; 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. */ /** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */
public boolean canGameOver = true; public boolean canGameOver = true;
/** Whether reactors can explode and damage other blocks. */ /** Whether reactors can explode and damage other blocks. */

View File

@@ -85,7 +85,7 @@ public class Saves{
lastTimestamp = Time.millis(); 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; time += Time.delta;
if(time > Core.settings.getInt("saveinterval") * 60){ if(time > Core.settings.getInt("saveinterval") * 60){
saving = true; saving = true;

View File

@@ -1,308 +0,0 @@
package mindustry.game;
import arc.*;
import arc.func.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.scene.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
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<String> events = new ObjectSet<>();
ObjectIntMap<Block> 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<String, String> text;
protected Seq<String> sentences;
protected final Boolp done;
TutorialStage(Func<String, String> 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();
}
}
}
}

View File

@@ -27,9 +27,16 @@ public class Universe{
public Universe(){ public Universe(){
load(); load();
//load legacy research
Events.on(ClientLoadEvent.class, e -> {
if(Core.settings.has("unlocks")){
LegacyIO.readResearch();
}
});
//update base coverage on capture //update base coverage on capture
Events.on(SectorCaptureEvent.class, e -> { Events.on(SectorCaptureEvent.class, e -> {
if(state.isCampaign()){ if(!net.client() && state.isCampaign()){
state.getSector().planet.updateBaseCoverage(); state.getSector().planet.updateBaseCoverage();
} }
}); });
@@ -208,7 +215,7 @@ public class Universe{
//queue random invasions //queue random invasions
if(!sector.isAttacked() && turn > invasionGracePeriod && sector.info.hasSpawns){ if(!sector.isAttacked() && turn > invasionGracePeriod && sector.info.hasSpawns){
//invasion chance depends on # of nearby bases //invasion chance depends on # of nearby bases
if(Mathf.chance(baseInvasionChance * sector.near().count(Sector::hasEnemyBase))){ 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, 5) * 5; int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 5) * 5;
//assign invasion-related things //assign invasion-related things
@@ -273,10 +280,6 @@ public class Universe{
private void load(){ private void load(){
seconds = Core.settings.getInt("utimei"); seconds = Core.settings.getInt("utimei");
turn = Core.settings.getInt("turn"); turn = Core.settings.getInt("turn");
if(Core.settings.has("unlocks")){
LegacyIO.readResearch();
}
} }
} }

View File

@@ -257,10 +257,10 @@ public class Waves{
public static Seq<SpawnGroup> generate(float difficulty){ public static Seq<SpawnGroup> generate(float difficulty){
//apply power curve to make starting sectors easier //apply power curve to make starting sectors easier
return generate(new Rand(), Mathf.pow(difficulty, 1.12f)); return generate(Mathf.pow(difficulty, 1.12f), new Rand(), false);
} }
public static Seq<SpawnGroup> generate(Rand rand, float difficulty){ public static Seq<SpawnGroup> generate(float difficulty, Rand rand, boolean attack){
UnitType[][] species = { UnitType[][] species = {
{dagger, mace, fortress, scepter, reign}, {dagger, mace, fortress, scepter, reign},
{nova, pulsar, quasar, vela, corvus}, {nova, pulsar, quasar, vela, corvus},
@@ -395,6 +395,21 @@ public class Waves{
effect = StatusEffects.boss; 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 //shift back waves on higher difficulty for a harder start
int shift = Math.max((int)(difficulty * 15 - 5), 0); int shift = Math.max((int)(difficulty * 15 - 5), 0);

View File

@@ -171,7 +171,7 @@ public class OverlayRenderer{
Draw.reset(); Draw.reset();
Building tile = world.buildWorld(v.x, v.y); 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.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.stroke(1f, Pal.place);

View File

@@ -58,6 +58,7 @@ public enum Binding implements KeyBind{
fullscreen(KeyCode.f11), fullscreen(KeyCode.f11),
pause(KeyCode.space), pause(KeyCode.space),
minimap(KeyCode.m), minimap(KeyCode.m),
planet_map(KeyCode.n),
toggle_menus(KeyCode.c), toggle_menus(KeyCode.c),
screenshot(KeyCode.p), screenshot(KeyCode.p),
toggle_power_lines(KeyCode.f5), toggle_power_lines(KeyCode.f5),

View File

@@ -47,6 +47,7 @@ public class DesktopInput extends InputHandler{
@Override @Override
public void buildUI(Group group){ public void buildUI(Group group){
//respawn hints
group.fill(t -> { 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.bottom();
@@ -56,6 +57,7 @@ public class DesktopInput extends InputHandler{
}).margin(6f); }).margin(6f);
}); });
//building hints
group.fill(t -> { group.fill(t -> {
t.bottom(); t.bottom();
t.visible(() -> { t.visible(() -> {
@@ -74,6 +76,7 @@ public class DesktopInput extends InputHandler{
}).margin(10f); }).margin(10f);
}); });
//schematic controls
group.fill(t -> { group.fill(t -> {
t.visible(() -> ui.hudfrag.shown && lastSchematic != null && !selectRequests.isEmpty()); t.visible(() -> ui.hudfrag.shown && lastSchematic != null && !selectRequests.isEmpty());
t.bottom(); t.bottom();
@@ -234,8 +237,9 @@ public class DesktopInput extends InputHandler{
player.shooting = false; player.shooting = false;
} }
if(state.isGame() && Core.input.keyTap(Binding.minimap) && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){ if(state.isGame() && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){
ui.minimapfrag.toggle(); if(Core.input.keyTap(Binding.minimap)) ui.minimapfrag.toggle();
if(Core.input.keyTap(Binding.planet_map) && state.isCampaign()) ui.planet.toggle();
} }
if(state.isMenu() || Core.scene.hasDialog()) return; if(state.isMenu() || Core.scene.hasDialog()) return;
@@ -480,7 +484,7 @@ public class DesktopInput extends InputHandler{
deleting = true; deleting = true;
}else if(selected != null){ }else if(selected != null){
//only begin shooting if there's no cursor event //only begin shooting if there's no cursor event
if(!tileTapped(selected.build) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !player.unit().activelyBuilding() && !droppingItem && 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()){ !tryBeginMine(selected) && player.unit().mineTile == null && !Core.scene.hasKeyboard()){
player.shooting = shouldShoot; player.shooting = shouldShoot;
} }

View File

@@ -1056,6 +1056,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
return droppingItem; return droppingItem;
} }
public boolean canDropItem(){
return droppingItem && !canTapPlayer(Core.input.mouseWorldX(), Core.input.mouseWorldY());
}
public void tryDropItems(@Nullable Building tile, float x, float y){ public void tryDropItems(@Nullable Building tile, float x, float y){
if(!droppingItem || player.unit().stack.amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){ if(!droppingItem || player.unit().stack.amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){
droppingItem = false; droppingItem = false;

View File

@@ -252,7 +252,7 @@ public class MobileInput extends InputHandler implements GestureListener{
selectRequests.clear(); selectRequests.clear();
mode = none; mode = none;
block = null; block = null;
}).width(155f).margin(12f); }).width(155f).height(50f).margin(12f);
}); });
group.fill(t -> { group.fill(t -> {

View File

@@ -5,6 +5,7 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.ai.*;
import mindustry.ai.BaseRegistry.*; import mindustry.ai.BaseRegistry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.*; import mindustry.game.*;
@@ -146,6 +147,15 @@ 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.team() == state.rules.waveTeam && !t.within(tile, 25f * 8)){
t.setBlock(Blocks.air);
}
});
}
} }
public void postGenerate(){ public void postGenerate(){

View File

@@ -10,7 +10,9 @@ import mindustry.ai.*;
import mindustry.ai.BaseRegistry.*; import mindustry.ai.BaseRegistry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.graphics.g3d.PlanetGrid.*;
import mindustry.maps.generators.*; import mindustry.maps.generators.*;
import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -59,6 +61,43 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
return (Mathf.pow((float)noise.octaveNoise3D(7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset); 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 @Override
public float getHeight(Vec3 position){ public float getHeight(Vec3 position){
float height = rawHeight(position); float height = rawHeight(position);
@@ -158,7 +197,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
//check positions on the map to place the player spawn. this needs to be in the corner of the map //check positions on the map to place the player spawn. this needs to be in the corner of the map
Room spawn = null; Room spawn = null;
Seq<Room> enemies = new Seq<>(); Seq<Room> 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); int offset = rand.nextInt(360);
float length = width/2.55f - rand.random(13, 23); float length = width/2.55f - rand.random(13, 23);
int angleStep = 5; int angleStep = 5;
@@ -237,7 +276,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
FloatSeq frequencies = new FloatSeq(); FloatSeq frequencies = new FloatSeq();
for(int i = 0; i < ores.size; i++){ 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) -> { pass((x, y) -> {
@@ -439,7 +478,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
state.rules.waves = sector.info.waves = true; state.rules.waves = sector.info.waves = true;
state.rules.enemyCoreBuildRadius = 600f; state.rules.enemyCoreBuildRadius = 600f;
state.rules.spawns = Waves.generate(difficulty); state.rules.spawns = Waves.generate(difficulty, new Rand(), state.rules.attackMode);
} }
@Override @Override

View File

@@ -15,7 +15,7 @@ public class TantrosPlanetGenerator extends PlanetGenerator{
@Override @Override
public Color getColor(Vec3 position){ public Color getColor(Vec3 position){
float depth = (float)noise.octaveNoise3D(2, 0.56, 1.7f, position.x, position.y, position.z) / 1.7f; 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); return c1.write(out).lerp(c2, Mathf.clamp(Mathf.round(depth, 0.15f))).a(0.6f);
} }
} }

View File

@@ -37,6 +37,7 @@ import mindustry.world.draw.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class ContentParser{ public class ContentParser{
@@ -267,7 +268,13 @@ public class ContentParser{
UnitType unit; UnitType unit;
if(locate(ContentType.unit, name) == null){ if(locate(ContentType.unit, name) == null){
unit = new UnitType(mod + "-" + name); 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{ }else{
unit = locate(ContentType.unit, name); unit = locate(ContentType.unit, name);
} }
@@ -337,6 +344,18 @@ public class ContentParser{
//ContentType.sector, parser(ContentType.sector, SectorPreset::new) //ContentType.sector, parser(ContentType.sector, SectorPreset::new)
); );
private Prov<Unit> 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){ private String getString(JsonValue value, String key){
if(value.has(key)){ if(value.has(key)){
return value.getString(key); return value.getString(key);

View File

@@ -629,7 +629,7 @@ public class Mods implements Loadable{
} }
//make sure the main class exists before loading it; if it doesn't just don't put it there //make sure the main class exists before loading it; if it doesn't just don't put it there
if(mainFile.exists() && Core.settings.getBool("mod-" + meta.name.toLowerCase().replace(" ", "-") + "-enabled", true)){ if(mainFile.exists() && Core.settings.getBool("mod-" + baseName + "-enabled", true)){
//mobile versions don't support class mods //mobile versions don't support class mods
if(ios){ if(ios){
throw new IllegalArgumentException("Java class mods are not supported on iOS."); throw new IllegalArgumentException("Java class mods are not supported on iOS.");
@@ -830,7 +830,7 @@ public class Mods implements Loadable{
/** Mod metadata information.*/ /** Mod metadata information.*/
public static class ModMeta{ 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<String> dependencies = Seq.with(); public Seq<String> dependencies = Seq.with();
/** Hidden mods are only server-side or client-side, and do not support adding new content. */ /** Hidden mods are only server-side or client-side, and do not support adding new content. */
public boolean hidden; public boolean hidden;

View File

@@ -303,8 +303,6 @@ public class Administration{
public boolean adminPlayer(String id, String usid){ public boolean adminPlayer(String id, String usid){
PlayerInfo info = getCreateInfo(id); PlayerInfo info = getCreateInfo(id);
if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) return false;
info.adminUsid = usid; info.adminUsid = usid;
info.admin = true; info.admin = true;
save(); save();

View File

@@ -98,7 +98,7 @@ public class Sector{
/** @return whether the player has a base here. */ /** @return whether the player has a base here. */
public boolean hasBase(){ public boolean hasBase(){
return save != null && info.hasCore; return save != null && info.hasCore && !(Vars.state.isGame() && Vars.state.rules.sector == this && state.gameOver);
} }
/** @return whether the enemy has a generated base here. */ /** @return whether the enemy has a generated base here. */

View File

@@ -374,7 +374,7 @@ public class UnitType extends UnlockableContent{
if(stacks != null){ if(stacks != null){
ItemStack[] out = new ItemStack[stacks.length]; ItemStack[] out = new ItemStack[stacks.length];
for(int i = 0; i < out.length; i++){ for(int i = 0; i < out.length; i++){
out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.11) * 50))); out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50)));
} }
return out; return out;

View File

@@ -129,7 +129,7 @@ public class Fonts{
glyph.srcX = 0; glyph.srcX = 0;
glyph.srcY = 0; glyph.srcY = 0;
glyph.width = size; glyph.width = size;
glyph.height = size; glyph.height = (int)((float)region.height / region.width * size);
glyph.u = region.u; glyph.u = region.u;
glyph.v = region.v2; glyph.v = region.v2;
glyph.u2 = region.u2; glyph.u2 = region.u2;

View File

@@ -3,6 +3,7 @@ package mindustry.ui;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import mindustry.core.*;
import mindustry.type.*; import mindustry.type.*;
public class ItemImage extends Stack{ public class ItemImage extends Stack{
@@ -16,7 +17,7 @@ public class ItemImage extends Stack{
add(new Table(t -> { add(new Table(t -> {
t.left().bottom(); t.left().bottom();
t.add(amount + ""); t.add(amount > 1000 ? UI.formatAmount(amount) : amount + "");
t.pack(); t.pack();
})); }));
} }
@@ -38,7 +39,7 @@ public class ItemImage extends Stack{
if(stack.amount != 0){ if(stack.amount != 0){
add(new Table(t -> { add(new Table(t -> {
t.left().bottom(); 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(); t.pack();
})); }));
} }

View File

@@ -26,7 +26,7 @@ public class Styles{
//TODO all these names are inconsistent and not descriptive //TODO all these names are inconsistent and not descriptive
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver; public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver;
public static ButtonStyle defaultb, waveb; public static ButtonStyle defaultb, waveb;
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict; 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 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 ScrollPaneStyle defaultPane, horizontalPane, smallPane;
public static KeybindDialogStyle defaultKeybindDialog; public static KeybindDialogStyle defaultKeybindDialog;
@@ -86,6 +86,13 @@ public class Styles{
up = buttonOver; up = buttonOver;
over = buttonDown; over = buttonDown;
}}; }};
nonet = new TextButtonStyle(){{
font = Fonts.outline;
fontColor = Color.lightGray;
overFontColor = Pal.accent;
disabledFontColor = Color.gray;
up = none;
}};
cleart = new TextButtonStyle(){{ cleart = new TextButtonStyle(){{
over = flatOver; over = flatOver;
font = Fonts.def; font = Fonts.def;

View File

@@ -31,13 +31,13 @@ public class GameOverDialog extends BaseDialog{
} }
void rebuild(){ void rebuild(){
title.setText("@gameover"); title.setText(state.isCampaign() ? "@sector.curlost" : "@gameover");
buttons.clear(); buttons.clear();
cont.clear(); cont.clear();
buttons.margin(10); buttons.margin(10);
if(state.rules.pvp){ if(state.rules.pvp && winner != null){
cont.add(Core.bundle.format("gameover.pvp", winner.localized())).pad(6); cont.add(Core.bundle.format("gameover.pvp", winner.localized())).pad(6);
buttons.button("@menu", () -> { buttons.button("@menu", () -> {
hide(); hide();

View File

@@ -499,7 +499,7 @@ public class JoinDialog extends BaseDialog{
} }
}); });
}catch(Throwable e){ }catch(Throwable e){
Log.err("Failed to fetch communitycommunity servers."); Log.err("Failed to fetch community servers.");
} }
}, t -> {}); }, t -> {});
} }

View File

@@ -116,7 +116,7 @@ public class LaunchLoadoutDialog extends BaseDialog{
selected = s; selected = s;
update.run(); update.run();
rebuildItems.run(); rebuildItems.run();
}).group(group).pad(4).disabled(!sitems.has(s.requirements())).checked(s == selected).size(200f); }).group(group).pad(4).checked(s == selected).size(200f);
if(++i % cols == 0){ if(++i % cols == 0){
t.row(); t.row();

View File

@@ -35,7 +35,6 @@ public class PausedDialog extends BaseDialog{
cont.button("@back", Icon.left, this::hide).name("back"); cont.button("@back", Icon.left, this::hide).name("back");
cont.button("@settings", Icon.settings, ui.settings::show).name("settings"); cont.button("@settings", Icon.settings, ui.settings::show).name("settings");
if(!state.rules.tutorial){
if(!state.isCampaign() && !state.isEditor()){ if(!state.isCampaign() && !state.isEditor()){
cont.row(); cont.row();
cont.button("@savegame", Icon.save, save::show); cont.button("@savegame", Icon.save, save::show);
@@ -55,7 +54,6 @@ public class PausedDialog extends BaseDialog{
} }
} }
}).disabled(b -> !((steam && net.server()) || !net.active())).colspan(2).width(dw * 2 + 20f).update(e -> e.setText(net.server() && steam ? "@invitefriends" : "@hostserver")); }).disabled(b -> !((steam && net.server()) || !net.active())).colspan(2).width(dw * 2 + 20f).update(e -> e.setText(net.server() && steam ? "@invitefriends" : "@hostserver"));
}
cont.row(); cont.row();
@@ -95,10 +93,7 @@ public class PausedDialog extends BaseDialog{
} }
void showQuitConfirm(){ void showQuitConfirm(){
ui.showConfirm("@confirm", state.rules.tutorial ? "@quit.confirm.tutorial" : "@quit.confirm", () -> { ui.showConfirm("@confirm", "@quit.confirm", () -> {
if(state.rules.tutorial){
Core.settings.put("playedtutorial", true);
}
wasClient = net.client(); wasClient = net.client();
if(net.client()) netClient.disconnectQuietly(); if(net.client()) netClient.disconnectQuietly();
runExitSave(); runExitSave();
@@ -112,7 +107,7 @@ public class PausedDialog extends BaseDialog{
return; return;
} }
if(control.saves.getCurrent() == null || !control.saves.getCurrent().isAutosave() || state.rules.tutorial || wasClient){ if(control.saves.getCurrent() == null || !control.saves.getCurrent().isAutosave() || wasClient){
logic.reset(); logic.reset();
return; return;
} }

View File

@@ -134,6 +134,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
/** show with no limitations, just as a map. */ /** show with no limitations, just as a map. */
@Override @Override
public Dialog show(){ public Dialog show(){
if(net.client()){
ui.showInfo("@map.multiplayer");
return this;
}
mode = look; mode = look;
selected = hovered = launchSector = null; selected = hovered = launchSector = null;
launching = false; launching = false;
@@ -239,6 +244,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
} }
Sector findLauncher(Sector to){ Sector findLauncher(Sector to){
Sector launchSector = this.launchSector != null && this.launchSector.hasBase() ? this.launchSector : null;
//directly nearby. //directly nearby.
if(to.near().contains(launchSector)) return launchSector; if(to.near().contains(launchSector)) return launchSector;
@@ -671,23 +677,22 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
stable.add(Core.bundle.get("sectors.threat") + " [accent]" + sector.displayThreat()).row(); stable.add(Core.bundle.get("sectors.threat") + " [accent]" + sector.displayThreat()).row();
} }
if(sector.isAttacked()){ //TODO localize if(sector.isAttacked()){
//these mechanics are likely to change and as such are not added to the bundle stable.add(Core.bundle.format("sectors.underattack", (int)(sector.info.damage * 100)));
stable.add("[scarlet]Under attack! [accent]" + (int)(sector.info.damage * 100) + "% damaged");
stable.row(); stable.row();
if(sector.info.wavesSurvived >= 0 && sector.info.wavesSurvived - sector.info.wavesPassed >= 0 && !sector.isBeingPlayed()){ if(sector.info.wavesSurvived >= 0 && sector.info.wavesSurvived - sector.info.wavesPassed >= 0 && !sector.isBeingPlayed()){
int toCapture = sector.info.attack || sector.info.winWave <= 1 ? -1 : sector.info.winWave - (sector.info.wave + sector.info.wavesPassed); int toCapture = sector.info.attack || sector.info.winWave <= 1 ? -1 : sector.info.winWave - (sector.info.wave + sector.info.wavesPassed);
boolean plus = (sector.info.wavesSurvived - sector.info.wavesPassed) >= SectorDamage.maxRetWave - 1; boolean plus = (sector.info.wavesSurvived - sector.info.wavesPassed) >= SectorDamage.maxRetWave - 1;
stable.add("[accent]Survives " + Math.min(sector.info.wavesSurvived - sector.info.wavesPassed, toCapture <= 0 ? 200 : 0) + stable.add(Core.bundle.format("sectors.survives", Math.min(sector.info.wavesSurvived - sector.info.wavesPassed, toCapture <= 0 ? 200 : 0) +
(plus ? "+" : "") + (toCapture < 0 ? "" : "/" + toCapture) + " waves"); (plus ? "+" : "") + (toCapture < 0 ? "" : "/" + toCapture)));
stable.row(); stable.row();
} }
}else if(sector.hasBase() && sector.near().contains(Sector::hasEnemyBase)){ //TODO localize }else if(sector.hasBase() && sector.near().contains(Sector::hasEnemyBase)){
stable.add("[scarlet]Vulnerable"); stable.add("@sectors.vulnerable");
stable.row(); stable.row();
}else if(!sector.hasBase() && sector.hasEnemyBase()){ //TODO localize }else if(!sector.hasBase() && sector.hasEnemyBase()){
stable.add("[scarlet]Enemy Base"); stable.add("@sectors.enemybase");
stable.row(); stable.row();
} }
@@ -710,8 +715,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
} }
if((sector.hasBase() && mode == look) || canSelect(sector) || (sector.preset != null && sector.preset.alwaysUnlocked) || debugSelect){ if((sector.hasBase() && mode == look) || canSelect(sector) || (sector.preset != null && sector.preset.alwaysUnlocked) || debugSelect){
stable.button(mode == select ? "@sectors.select" : sector.hasBase() ? "@sectors.resume" : "@sectors.launch", Icon.play, () -> { stable.button(mode == select ? "@sectors.select" : sector.isBeingPlayed() ? "@sectors.resume" : sector.hasBase() ? "@sectors.go" : "@sectors.launch", Icon.play, () -> {
if(state.rules.sector == sector && !state.isMenu()){ if(sector.isBeingPlayed()){
//already at this sector //already at this sector
hide(); hide();
return; return;

View File

@@ -169,7 +169,7 @@ public class ResearchDialog extends BaseDialog{
public Dialog show(){ public Dialog show(){
if(net.client()){ if(net.client()){
ui.showInfo("@research.multiplayer"); ui.showInfo("@research.multiplayer");
return null; return this;
} }
return super.show(); return super.show();

View File

@@ -130,6 +130,7 @@ public class SettingsMenuDialog extends SettingsDialog{
u.clearUnlock(); u.clearUnlock();
} }
}); });
settings.remove("unlocks");
}); });
}).marginLeft(4); }).marginLeft(4);
@@ -313,8 +314,6 @@ public class SettingsMenuDialog extends SettingsDialog{
game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i));
if(!mobile){ if(!mobile){
game.sliderPref("blockselecttimeout", 750, 0, 2000, 50, i -> Core.bundle.format("setting.milliseconds", i));
game.checkPref("crashreport", true); game.checkPref("crashreport", true);
} }

View File

@@ -0,0 +1,261 @@
package mindustry.ui.fragments;
import arc.*;
import arc.func.*;
import arc.input.*;
import arc.math.*;
import arc.scene.*;
import arc.scene.actions.*;
import arc.scene.event.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import mindustry.*;
import mindustry.content.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
import mindustry.input.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class HintsFragment extends Fragment{
private static final Boolp isTutorial = () -> Vars.state.rules.sector == SectorPresets.groundZero.sector;
private static final float foutTime = 0.6f;
/** All hints to be displayed in the game. */
public Seq<Hint> hints = Seq.with(DefaultHint.values());
@Nullable Hint current;
Group group = new WidgetGroup();
ObjectSet<String> events = new ObjectSet<>();
ObjectSet<Block> placedBlocks = new ObjectSet<>();
Table last;
@Override
public void build(Group parent){
group.setFillParent(true);
group.touchable = Touchable.childrenOnly;
group.visibility = () -> Core.settings.getBool("hints", true);
group.update(() -> {
if(current != null){
//current got completed
if(current.complete()){
complete();
}else if(!current.show()){ //current became hidden
hide();
}
}else if(hints.size > 0){
//check one hint each frame to see if it should be shown.
Hint hint = hints.find(Hint::show);
if(hint != null && !hint.finished() & !hint.complete()){
display(hint);
}
}
});
parent.addChild(group);
checkNext();
Events.on(BlockBuildEndEvent.class, event -> {
if(!event.breaking && event.unit == player.unit()){
placedBlocks.add(event.tile.block());
}
if(event.breaking){
events.add("break");
}
});
Events.on(ResetEvent.class, e -> {
placedBlocks.clear();
events.clear();
});
}
void checkNext(){
if(current != null) return;
hints.removeAll(h -> h == current || !h.valid() || h.finished() || (h.show() && h.complete()));
hints.sort(Hint::order);
Hint first = hints.find(Hint::show);
if(first != null){
hints.remove(first);
display(first);
}
}
void display(Hint hint){
if(current != null) return;
group.fill(t -> {
last = t;
t.left();
t.table(Styles.black5, cont -> {
cont.actions(Actions.alpha(0f), Actions.alpha(1f, 1f, Interp.smooth));
cont.margin(6f).add(hint.text()).width(Vars.mobile ? 270f : 400f).left().labelAlign(Align.left).wrap();
});
t.row();
t.button("@hint.skip", Styles.nonet, () -> {
if(current != null){
complete();
}
}).size(100f, 40f).left();
});
this.current = hint;
}
/** Completes and hides the current hint. */
void complete(){
if(current == null) return;
current.finish();
hints.remove(current);
hide();
}
/** Hides the current hint, but does not complete it. */
void hide(){
//hide previous child if found
if(last != null){
last.actions(Actions.parallel(Actions.alpha(0f, foutTime, Interp.smooth), Actions.translateBy(0f, Scl.scl(-200f), foutTime, Interp.smooth)), Actions.remove());
}
//check for next hint to display immediately
current = null;
last = null;
checkNext();
}
public boolean shown(){
return current != null;
}
public enum DefaultHint implements Hint{
desktopMove(visibleDesktop, () -> Core.input.axis(Binding.move_x) != 0 || Core.input.axis(Binding.move_y) != 0),
zoom(visibleDesktop, () -> Core.input.axis(KeyCode.scroll) != 0),
mine(() -> player.unit().canMine() && isTutorial.get(), () -> player.unit().mining()),
placeDrill(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.mechanicalDrill)),
placeConveyor(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.conveyor)),
placeTurret(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.duo)),
breaking(isTutorial, () -> ui.hints.events.contains("break")),
desktopShoot(visibleDesktop, () -> Vars.state.enemies > 0, () -> player.shooting),
depositItems(() -> player.unit().hasItem(), () -> !player.unit().hasItem()),
desktopPause(visibleDesktop, () -> isTutorial.get() && !Vars.net.active(), () -> Core.input.keyTap(Binding.pause)),
research(isTutorial, () -> ui.research.isShown()),
unitControl(() -> state.rules.defaultTeam.data().units.size > 1 && !net.active(), () -> !player.dead() && !player.unit().spawnedByCore),
respawn(visibleMobile, () -> !player.dead() && !player.unit().spawnedByCore, () -> !player.dead() && player.unit().spawnedByCore),
launch(() -> isTutorial.get() && state.rules.sector.isCaptured(), () -> ui.planet.isShown()),
schematicSelect(visibleDesktop, () -> ui.hints.placedBlocks.contains(Blocks.router), () -> Core.input.keyRelease(Binding.schematic_select) || Core.input.keyTap(Binding.pick)),
conveyorPathfind(() -> control.input.block == Blocks.titaniumConveyor, () -> Core.input.keyRelease(Binding.diagonal_placement) || (mobile && Core.settings.getBool("swapdiagonal"))),
boost(visibleDesktop, () -> !player.dead() && player.unit().type.canBoost, () -> Core.input.keyDown(Binding.boost)),
command(() -> state.rules.defaultTeam.data().units.size > 3 && !net.active(), () -> player.unit().isCommanding()),
payloadPickup(() -> !player.unit().dead && player.unit() instanceof Payloadc p && p.payloads().isEmpty(), () -> player.unit() instanceof Payloadc p && p.payloads().any()),
payloadDrop(() -> !player.unit().dead && player.unit() instanceof Payloadc p && p.payloads().any(), () -> player.unit() instanceof Payloadc p && p.payloads().isEmpty()),
waveFire(() -> Groups.fire.size() > 0 && Blocks.wave.unlockedNow(), () -> indexer.getAllied(state.rules.defaultTeam, BlockFlag.extinguisher).size() > 0),
;
@Nullable
String text;
int visibility = visibleAll;
Hint[] dependencies = {};
boolean finished, cached;
Boolp complete, shown = () -> true;
DefaultHint(Boolp complete){
this.complete = complete;
}
DefaultHint(int visiblity, Boolp complete){
this(complete);
this.visibility = visiblity;
}
DefaultHint(Boolp shown, Boolp complete){
this(complete);
this.shown = shown;
}
DefaultHint(int visiblity, Boolp shown, Boolp complete){
this(complete);
this.shown = shown;
this.visibility = visiblity;
}
@Override
public boolean finished(){
if(!cached){
cached = true;
finished = Core.settings.getBool(name() + "-hint-done", false);
}
return finished;
}
@Override
public void finish(){
Core.settings.put(name() + "-hint-done", finished = true);
}
@Override
public String text(){
if(text == null){
text = Vars.mobile && Core.bundle.has("hint." + name() + ".mobile") ? Core.bundle.get("hint." + name() + ".mobile") : Core.bundle.get("hint." + name());
if(!Vars.mobile) text = text.replace("tap", "click").replace("Tap", "Click");
}
return text;
}
@Override
public boolean complete(){
return complete.get();
}
@Override
public boolean show(){
return shown.get() && (dependencies.length == 0 || !Structs.contains(dependencies, d -> !d.finished()));
}
@Override
public int order(){
return ordinal();
}
@Override
public boolean valid(){
return (Vars.mobile && (visibility & visibleMobile) != 0) || (!Vars.mobile && (visibility & visibleDesktop) != 0);
}
}
/** Hint interface for defining any sort of message appearing at the left. */
public interface Hint{
int visibleDesktop = 1, visibleMobile = 2, visibleAll = visibleDesktop | visibleMobile;
/** Hint name for preference storage. */
String name();
/** Displayed text. */
String text();
/** @return true if hint objective is complete */
boolean complete();
/** @return whether the hint is ready to be shown */
boolean show();
/** @return order integer, determines priority */
int order();
/** @return whether this hint should be processed, used for platform splits */
boolean valid();
/** finishes the hint - it should not be shown again */
default void finish(){
Core.settings.put(name() + "-hint-done", true);
}
/** @return whether the hint is finished - if true, it should not be shown again */
default boolean finished(){
return Core.settings.getBool(name() + "-hint-done", false);
}
}
}

View File

@@ -53,7 +53,7 @@ public class HudFragment extends Fragment{
int max = 10; int max = 10;
int winWave = state.isCampaign() && state.rules.winWave > 0 ? state.rules.winWave : Integer.MAX_VALUE; int winWave = state.isCampaign() && state.rules.winWave > 0 ? state.rules.winWave : Integer.MAX_VALUE;
outer: outer:
for(int i = state.wave - 1; i <= Math.min(state.wave + max, winWave); i++){ for(int i = state.wave - 1; i <= Math.min(state.wave + max, winWave - 2); i++){
for(SpawnGroup group : state.rules.spawns){ for(SpawnGroup group : state.rules.spawns){
if(group.effect == StatusEffects.boss && group.getSpawned(i) > 0){ if(group.effect == StatusEffects.boss && group.getSpawned(i) > 0){
int diff = (i + 2) - state.wave; int diff = (i + 2) - state.wave;
@@ -90,25 +90,26 @@ public class HudFragment extends Fragment{
parent.fill(t -> { parent.fill(t -> {
t.name = "paused"; t.name = "paused";
t.top().visible(() -> state.isPaused() && shown).touchable = Touchable.disabled; t.top().visible(() -> state.isPaused() && shown).touchable = Touchable.disabled;
t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX(); t.table(Styles.black5, top -> top.label(() -> state.gameOver && state.isCampaign() ? "@sector.curlost" : "@paused").style(Styles.outlineLabel).pad(8f)).growX();
}); });
//minimap + position //minimap + position
parent.fill(t -> { parent.fill(t -> {
t.name = "minimap/position"; t.name = "minimap/position";
t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown); t.visible(() -> Core.settings.getBool("minimap") && shown);
//minimap //minimap
t.add(new Minimap()).name("minimap"); t.add(new Minimap()).name("minimap");
t.row(); t.row();
//position //position
t.label(() -> player.tileX() + "," + player.tileY()) t.label(() -> player.tileX() + "," + player.tileY())
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial) .visible(() -> Core.settings.getBool("position"))
.touchable(Touchable.disabled) .touchable(Touchable.disabled)
.name("position"); .name("position");
t.top().right(); t.top().right();
}); });
//TODO tear this all down ui.hints.build(parent);
//menu at top left //menu at top left
parent.fill(cont -> { parent.fill(cont -> {
cont.name = "overlaymarker"; cont.name = "overlaymarker";
@@ -319,29 +320,6 @@ public class HudFragment extends Fragment{
.update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled); .update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled);
}); });
//tutorial text
parent.fill(t -> {
t.name = "tutorial";
Runnable resize = () -> {
t.clearChildren();
t.top().right().visible(() -> state.rules.tutorial);
t.stack(new Button(){{
marginLeft(48f);
labelWrap(() -> control.tutorial.stage.text() + (control.tutorial.canNext() ? "\n\n" + Core.bundle.get("tutorial.next") : "")).width(!Core.graphics.isPortrait() ? 400f : 160f).pad(2f);
clicked(() -> control.tutorial.nextSentence());
setDisabled(() -> !control.tutorial.canNext());
}},
new Table(f -> {
f.left().button(Icon.left, Styles.emptyi, () -> {
control.tutorial.prevSentence();
}).width(44f).growY().visible(() -> control.tutorial.canPrev());
}));
};
resize.run();
Events.on(ResizeEvent.class, e -> resize.run());
});
//'saving' indicator //'saving' indicator
parent.fill(t -> { parent.fill(t -> {
t.name = "saving"; t.name = "saving";
@@ -465,7 +443,7 @@ public class HudFragment extends Fragment{
public void showUnlock(UnlockableContent content){ public void showUnlock(UnlockableContent content){
//some content may not have icons... yet //some content may not have icons... yet
//also don't play in the tutorial to prevent confusion //also don't play in the tutorial to prevent confusion
if(state.isMenu() || state.rules.tutorial) return; if(state.isMenu()) return;
Sounds.message.play(); Sounds.message.play();
@@ -720,19 +698,15 @@ public class HudFragment extends Fragment{
float bw = 40f; float bw = 40f;
float pad = -20; float pad = -20;
t.margin(0); t.margin(0);
t.clicked(() -> {
t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad); if(!player.dead() && mobile){
t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f).with(i -> {
if(mobile){
//on mobile, cause a respawn on tap
i.clicked(() -> {
if(!player.unit().spawnedByCore && !player.dead()){
Call.unitClear(player); Call.unitClear(player);
control.input.controlledType = null; control.input.controlledType = null;
} }
}); });
}
}); t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad);
t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f);
t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> { t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> {
b.color.set(player.displayAmmo() ? player.dead() || player.unit() instanceof BlockUnitc ? Pal.ammo : player.unit().type.ammoType.color : Pal.health); b.color.set(player.displayAmmo() ? player.dead() || player.unit() instanceof BlockUnitc ? Pal.ammo : player.unit().type.ammoType.color : Pal.health);
}); });
@@ -782,13 +756,11 @@ public class HudFragment extends Fragment{
return builder; return builder;
}).growX().pad(8f); }).growX().pad(8f);
table.touchable(() -> state.rules.waves ? Touchable.enabled : Touchable.disabled);
return table; return table;
} }
private boolean canSkipWave(){ private boolean canSkipWave(){
return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning() && !state.rules.tutorial; return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning();
} }
} }

View File

@@ -97,7 +97,7 @@ public class PlacementFragment extends Fragment{
boolean gridUpdate(InputHandler input){ boolean gridUpdate(InputHandler input){
scrollPositions.put(currentCategory, blockPane.getScrollY()); scrollPositions.put(currentCategory, blockPane.getScrollY());
if(Core.input.keyDown(Binding.pick) && player.isBuilder()){ //mouse eyedropper select if(Core.input.keyTap(Binding.pick) && player.isBuilder()){ //mouse eyedropper select
Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block; Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block;
Object tryConfig = tile == null ? null : tile.config(); Object tryConfig = tile == null ? null : tile.config();
@@ -145,7 +145,7 @@ public class PlacementFragment extends Fragment{
break; break;
} }
} }
}else if(blockSelectEnd || Time.timeSinceMillis(blockSelectSeqMillis) > Core.settings.getInt("blockselecttimeout")){ //1st number of combo, select category }else if(blockSelectEnd || Time.timeSinceMillis(blockSelectSeqMillis) > 750){ //1st number of combo, select category
//select only visible categories //select only visible categories
if(!getUnlockedByCategory(Category.all[i]).isEmpty()){ if(!getUnlockedByCategory(Category.all[i]).isEmpty()){
currentCategory = Category.all[i]; currentCategory = Category.all[i];

View File

@@ -617,7 +617,7 @@ public class Block extends UnlockableContent{
public ItemStack[] researchRequirements(){ public ItemStack[] researchRequirements(){
ItemStack[] out = new ItemStack[requirements.length]; ItemStack[] out = new ItemStack[requirements.length];
for(int i = 0; i < out.length; i++){ for(int i = 0; i < out.length; i++){
int quantity = 60 + Mathf.round(Mathf.pow(requirements[i].amount, 1.13f) * 20 * researchCostMultiplier, 10); int quantity = 60 + Mathf.round(Mathf.pow(requirements[i].amount, 1.1f) * 20 * researchCostMultiplier, 10);
out[i] = new ItemStack(requirements[i].item, UI.roundAmount(quantity)); out[i] = new ItemStack(requirements[i].item, UI.roundAmount(quantity));
} }

View File

@@ -40,6 +40,7 @@ public class ConstructBlock extends Block{
consumesTap = true; consumesTap = true;
solidifes = true; solidifes = true;
consBlocks[size - 1] = this; consBlocks[size - 1] = this;
sync = true;
} }
/** Returns a ConstructBlock by size. */ /** Returns a ConstructBlock by size. */

View File

@@ -32,8 +32,10 @@ public class Accelerator extends Block{
@Override @Override
public void init(){ public void init(){
itemCapacity = 0;
for(ItemStack stack : launching.requirements){ for(ItemStack stack : launching.requirements){
capacities[stack.item.id] = stack.amount; capacities[stack.item.id] = stack.amount;
itemCapacity += stack.amount;
} }
consumes.items(launching.requirements); consumes.items(launching.requirements);
super.init(); super.init();

View File

@@ -46,7 +46,7 @@ public class ItemTurret extends Turret{
public void build(Building tile, Table table){ public void build(Building tile, Table table){
MultiReqImage image = new MultiReqImage(); MultiReqImage image = new MultiReqImage();
content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)), content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)),
() -> tile != null && !((ItemTurretBuild)tile).ammo.isEmpty() && ((ItemEntry)((ItemTurretBuild)tile).ammo.peek()).item == item))); () -> tile instanceof ItemTurretBuild it && !it.ammo.isEmpty() && ((ItemEntry)it.ammo.peek()).item == item)));
table.add(image).size(8 * 4); table.add(image).size(8 * 4);
} }
@@ -54,7 +54,7 @@ public class ItemTurret extends Turret{
@Override @Override
public boolean valid(Building entity){ public boolean valid(Building entity){
//valid when there's any ammo in the turret //valid when there's any ammo in the turret
return !((ItemTurretBuild)entity).ammo.isEmpty(); return entity instanceof ItemTurretBuild it && !it.ammo.isEmpty();
} }
@Override @Override
@@ -139,11 +139,6 @@ public class ItemTurret extends Turret{
//must not be found //must not be found
ammo.add(new ItemEntry(item, (int)type.ammoMultiplier)); ammo.add(new ItemEntry(item, (int)type.ammoMultiplier));
//fire events for the tutorial
if(state.rules.tutorial){
Events.fire(new TurretAmmoDeliverEvent());
}
} }
@Override @Override

View File

@@ -96,8 +96,6 @@ public class PointDefenseTurret extends ReloadTurret{
shootSound.at(x + Tmp.v1.x, y + Tmp.v1.y, Mathf.random(0.9f, 1.1f)); shootSound.at(x + Tmp.v1.x, y + Tmp.v1.y, Mathf.random(0.9f, 1.1f));
reload = 0; reload = 0;
} }
}else{
target = null;
} }
} }

View File

@@ -93,19 +93,22 @@ public class TractorBeamTurret extends BaseTurret{
coolant = 1f + (used * liquid.heatCapacity * coolantMultiplier); coolant = 1f + (used * liquid.heatCapacity * coolantMultiplier);
} }
any = false;
//look at target //look at target
if(target != null && target.within(this, range) && target.team() != team && target.type.flying && efficiency() > 0.01f){ if(target != null && target.within(this, range) && target.team() != team && target.type.flying && efficiency() > 0.02f){
if(!headless){ if(!headless){
control.sound.loop(shootSound, this, shootSoundVolume); control.sound.loop(shootSound, this, shootSoundVolume);
} }
any = true;
float dest = angleTo(target); float dest = angleTo(target);
rotation = Angles.moveToward(rotation, dest, rotateSpeed * edelta()); rotation = Angles.moveToward(rotation, dest, rotateSpeed * edelta());
lastX = target.x; lastX = target.x;
lastY = target.y; lastY = target.y;
strength = Mathf.lerpDelta(strength, 1f, 0.1f); strength = Mathf.lerpDelta(strength, 1f, 0.1f);
//shoot when possible
if(Angles.within(rotation, dest, shootCone)){
if(damage > 0){ if(damage > 0){
target.damageContinuous(damage * efficiency()); target.damageContinuous(damage * efficiency());
} }
@@ -114,12 +117,10 @@ public class TractorBeamTurret extends BaseTurret{
target.apply(status, statusDuration); target.apply(status, statusDuration);
} }
//shoot when possible any = true;
if(Angles.within(rotation, dest, shootCone)){
target.impulse(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * efficiency() * timeScale)); target.impulse(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * efficiency() * timeScale));
} }
}else{ }else{
target = null;
strength = Mathf.lerpDelta(strength, 0, 0.1f); strength = Mathf.lerpDelta(strength, 0, 0.1f);
} }
} }

View File

@@ -106,6 +106,8 @@ public class StackConveyor extends Block implements Autotiler{
public float cooldown; public float cooldown;
public Item lastItem; public Item lastItem;
boolean proxUpdating = false;
@Override @Override
public void draw(){ public void draw(){
Draw.rect(regions[state], x, y, rotdeg()); Draw.rect(regions[state], x, y, rotdeg());
@@ -168,15 +170,15 @@ public class StackConveyor extends Block implements Autotiler{
//update other conveyor state when this conveyor's state changes //update other conveyor state when this conveyor's state changes
if(state != lastState){ if(state != lastState){
proxUpdating = true;
for(Building near : proximity){ for(Building near : proximity){
if(near instanceof StackConveyorBuild){ if(!(near instanceof StackConveyorBuild b && b.proxUpdating && b.state != stateUnload)){
near.onProximityUpdate(); near.onProximityUpdate();
for(Building other : near.proximity){
if(!(other instanceof StackConveyorBuild)) other.onProximityUpdate();
}
} }
} }
proxUpdating = false;
} }
} }
@Override @Override

View File

@@ -366,10 +366,6 @@ public class CoreBlock extends StorageBlock{
}else{ }else{
super.handleItem(source, item); super.handleItem(source, item);
} }
if(state.rules.tutorial){
Events.fire(new CoreItemDeliverEvent());
}
} }
} }
} }

View File

@@ -53,12 +53,15 @@ public class UnitFactory extends UnitBlock{
@Override @Override
public void init(){ public void init(){
capacities = new int[Vars.content.items().size]; capacities = new int[Vars.content.items().size];
itemCapacity = 0;
for(UnitPlan plan : plans){ for(UnitPlan plan : plans){
for(ItemStack stack : plan.requirements){ for(ItemStack stack : plan.requirements){
capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2); capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2);
itemCapacity = Math.max(itemCapacity, stack.amount * 2);
} }
} }
for(int i : capacities){
itemCapacity += i;
}
super.init(); super.init();
} }

View File

@@ -23,7 +23,9 @@ public enum BlockFlag{
/** Any reactor block. */ /** Any reactor block. */
reactor, reactor,
/** Any block that boosts unit capacity. */ /** Any block that boosts unit capacity. */
unitModifier; unitModifier,
/** Blocks that extinguishes fires. */
extinguisher;
public final static BlockFlag[] all = values(); public final static BlockFlag[] all = values();
} }

View File

@@ -0,0 +1,9 @@
Yes, it's another one. Get ready for more rapid-fire releases.
- Fixed sound not working [Android]
- Fixed sound being muffled at start of game
- Fixed continuous lasers setting shooters on fire
- Fixed deconstruction area not being queued [Mobile]
- Limited logic symbols to 40 characters
- Added "Launching From" info to sector launch dialog
- Added final campaign sector (untested!)

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=e327ec0bf805e7ad3cb4d95b242bf8424c487a64 archash=bfac70a18ab9158efefcd36f3ff43738c96733a0

View File

@@ -405,7 +405,7 @@ public class ServerControl implements ApplicationListener{
info("Path: @", mod.file.path()); info("Path: @", mod.file.path());
info("Description: @", mod.meta.description); info("Description: @", mod.meta.description);
}else{ }else{
info("No mod with name '@' found."); info("No mod with name '@' found.", arg[0]);
} }
}); });
@@ -728,7 +728,7 @@ public class ServerControl implements ApplicationListener{
handler.register("unban", "<ip/ID>", "Completely unban a person by IP or ID.", arg -> { handler.register("unban", "<ip/ID>", "Completely unban a person by IP or ID.", arg -> {
if(netServer.admins.unbanPlayerIP(arg[0]) || netServer.admins.unbanPlayerID(arg[0])){ if(netServer.admins.unbanPlayerIP(arg[0]) || netServer.admins.unbanPlayerID(arg[0])){
info("Unbanned player.", arg[0]); info("Unbanned player: @", arg[0]);
}else{ }else{
err("That IP/ID is not banned!"); err("That IP/ID is not banned!");
} }

View File

@@ -1,6 +1,5 @@
package mindustry.server; package mindustry.server;
import arc.*; import arc.*;
import arc.backend.headless.*; import arc.backend.headless.*;
import arc.files.*; import arc.files.*;
@@ -86,5 +85,4 @@ public class ServerLauncher implements ApplicationListener{
Events.fire(new ServerLoadEvent()); Events.fire(new ServerLoadEvent());
} }
} }

View File

@@ -37,7 +37,8 @@ public class ScriptMainGenerator{
getClasses("arc.func"), getClasses("arc.func"),
getClasses("arc.struct"), getClasses("arc.struct"),
getClasses("arc.scene"), getClasses("arc.scene"),
getClasses("arc.math") getClasses("arc.math"),
getClasses("arc.audio")
); );
classes.addAll(whitelist); classes.addAll(whitelist);
classes.sort(Structs.comparing(Class::getName)); classes.sort(Structs.comparing(Class::getName));

View File

@@ -1,9 +0,0 @@
git config --global user.name "Wiki Updater"
git clone --depth=1 --branch=master https://github.com/MindustryGame/wiki ../wiki
git clone --depth=1 --branch=master https://github.com/Anuken/Mindustry-Wiki-Generator ../Mindustry-Wiki-Generator
cd ../Mindustry-Wiki-Generator
./gradlew run
cd ../wiki
git add .
git commit -m "Update to match build ${TRAVIS_TAG}"
git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/wiki