Compare commits
146 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7b1c60c24f | ||
|
|
8b8d990852 | ||
|
|
6583cc0b5d | ||
|
|
5c3ae425ae | ||
|
|
744b1b2037 | ||
|
|
a313ca8a26 | ||
|
|
87204df3ee | ||
|
|
bc70c08820 | ||
|
|
2c2828617f | ||
|
|
a451ad895c | ||
|
|
d13b69c36f | ||
|
|
d64f603e08 | ||
|
|
3d2c094056 | ||
|
|
64e99f613e | ||
|
|
51b4078288 | ||
|
|
db8d099fcc | ||
|
|
002be46915 | ||
|
|
9fa2691b02 | ||
|
|
6686584003 | ||
|
|
78c8c57649 | ||
|
|
ca65fd31e5 | ||
|
|
e2109f2f56 | ||
|
|
6b63cd7a46 | ||
|
|
e19c857d74 | ||
|
|
b18f418c61 | ||
|
|
12ee38476c | ||
|
|
48c8357ff7 | ||
|
|
a0702559f3 | ||
|
|
55db91e53e | ||
|
|
a333fa3722 | ||
|
|
5284750c6a | ||
|
|
9c616fd03b | ||
|
|
d4bee41103 | ||
|
|
2e586c4403 | ||
|
|
129f21e3a9 | ||
|
|
435f15a450 | ||
|
|
3eac8cb6ad | ||
|
|
ea96bf2675 | ||
|
|
e4c3664cc6 | ||
|
|
664cd6a3a0 | ||
|
|
c26a9bd123 | ||
|
|
5008573aa5 | ||
|
|
395f7193ea | ||
|
|
775e17a726 | ||
|
|
900ec8db6a | ||
|
|
e23a7c213c | ||
|
|
96513e4967 | ||
|
|
b64df565a4 | ||
|
|
382e27e1e4 | ||
|
|
0dd95e736d | ||
|
|
0ae6a33971 | ||
|
|
380c9ab113 | ||
|
|
1028ade80d | ||
|
|
a8e34381ef | ||
|
|
5f5987cef2 | ||
|
|
430538ea7e | ||
|
|
ee966d1198 | ||
|
|
076363ac87 | ||
|
|
327442f6fe | ||
|
|
c03400ccbc | ||
|
|
a5ad45ff30 | ||
|
|
3161e23285 | ||
|
|
e82ee227a5 | ||
|
|
f8a859620d | ||
|
|
30107db81e | ||
|
|
05f7a15115 | ||
|
|
305e2642ba | ||
|
|
cb95059c3e | ||
|
|
20aa2384ea | ||
|
|
c5574d3ae0 | ||
|
|
45b43e7772 | ||
|
|
a461c184be | ||
|
|
00e1cf7e9d | ||
|
|
86887f2ec1 | ||
|
|
bff0c2e6f3 | ||
|
|
fcaf1e49cb | ||
|
|
448fef980b | ||
|
|
7832b6cafd | ||
|
|
3a259d0001 | ||
|
|
11168efffa | ||
|
|
367da94e34 | ||
|
|
f8bce3cea0 | ||
|
|
daed19e79b | ||
|
|
0e565f00ff | ||
|
|
d4ab674b1c | ||
|
|
884abb54e6 | ||
|
|
026d3ef9ab | ||
|
|
0abf333168 | ||
|
|
a124c2a2b4 | ||
|
|
a43957a1fa | ||
|
|
d0f3e413c6 | ||
|
|
469d5945b2 | ||
|
|
5a8d0071df | ||
|
|
6f139641da | ||
|
|
c413be3ce0 | ||
|
|
19a804db91 | ||
|
|
f6d35822fb | ||
|
|
8f1f015f3d | ||
|
|
ed1b3ba608 | ||
|
|
f3831eb9c5 | ||
|
|
1ed2b2eb2e | ||
|
|
be6b294087 | ||
|
|
67c35e12ae | ||
|
|
7acc5e0858 | ||
|
|
0553cafbe9 | ||
|
|
9d78459d7d | ||
|
|
4102c380d2 | ||
|
|
bbee3ae9cd | ||
|
|
f67f09934e | ||
|
|
149ce3bccf | ||
|
|
00a25f31b8 | ||
|
|
e535f94832 | ||
|
|
06faa368cc | ||
|
|
8f58f40b1a | ||
|
|
7bab4d67e1 | ||
|
|
3a2514e937 | ||
|
|
66b540988b | ||
|
|
c2d808b921 | ||
|
|
69960017d3 | ||
|
|
b1a4d51210 | ||
|
|
4cda52caf7 | ||
|
|
9c54792341 | ||
|
|
56b947fb9e | ||
|
|
f7170dc39a | ||
|
|
3aabfaf14b | ||
|
|
2cc0ae3d81 | ||
|
|
ab8a381ad9 | ||
|
|
ced6369b25 | ||
|
|
49f4b1fd67 | ||
|
|
ba6d40cc22 | ||
|
|
dc15c9a7e4 | ||
|
|
27e22a84d3 | ||
|
|
f5023aa846 | ||
|
|
d10fd8e738 | ||
|
|
c2bedc0210 | ||
|
|
103f5a65b6 | ||
|
|
7697a21003 | ||
|
|
72a453654e | ||
|
|
25c31c5250 | ||
|
|
77ba760a94 | ||
|
|
fe01282421 | ||
|
|
226ff9aa03 | ||
|
|
5d92b4dd2e | ||
|
|
3271020e7c | ||
|
|
daf96241e1 | ||
|
|
ef7d814049 |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -21,7 +21,7 @@ assignees: ''
|
|||||||
|
|
||||||
If you remove the line above without reading it properly and understanding what it means, I will reap your soul. Even if you're playing on someone's server, you can still save the game to a slot.
|
If you remove the line above without reading it properly and understanding what it means, I will reap your soul. Even if you're playing on someone's server, you can still save the game to a slot.
|
||||||
|
|
||||||
**Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.*
|
**(Crash) logs**: *Either crash reports from the crash folder, or the file you get when you go into Settings -> Game Data -> Export Crash logs. REQUIRED if you are reporting a crash.*
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/push.yml
vendored
2
.github/workflows/push.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
java-version: 14
|
java-version: 14
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
run: ./gradlew test
|
run: ./gradlew clean cleanTest test
|
||||||
- name: Trigger BE build
|
- name: Trigger BE build
|
||||||
if: ${{ github.repository == 'Anuken/Mindustry' }}
|
if: ${{ github.repository == 'Anuken/Mindustry' }}
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
52
ISSUES.md
Normal file
52
ISSUES.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# Why was my issue closed?
|
||||||
|
|
||||||
|
This document goes over some common causes for issue closures.
|
||||||
|
|
||||||
|
## You did not fill in the template
|
||||||
|
|
||||||
|
I can't debug the problem unless you provide the information the template asks for.
|
||||||
|
If you cannot put in the effort to fill out a template, then don't expect me to put in the effort to fix it.
|
||||||
|
|
||||||
|
## Your issue was already reported
|
||||||
|
|
||||||
|
If the problem in your issue has already been encountered before, it will be closed - especially if your report doesn't provide any new information.
|
||||||
|
Make sure you search the *closed* issues before making an issue.
|
||||||
|
|
||||||
|
I do not link the specific issue(s) that report the same problem, because searching takes time - if you're interested in finding them, you should be able to do so without my help.
|
||||||
|
|
||||||
|
To be clear: I do **not** expect users to look at *all* previous issues, or do a comprehensive stack trace analysis to see if their crash was already reported.
|
||||||
|
|
||||||
|
## Your issue was already fixed
|
||||||
|
|
||||||
|
The problem you reported has been addressed. Note that this does **not** mean that the latest stable version of Mindustry has the fix!
|
||||||
|
It simply means that I have committed (or am about to commit) a patch that fixes it *on the current development branch*.
|
||||||
|
|
||||||
|
## Your issue is missing a crash report or log
|
||||||
|
|
||||||
|
If the game crashes without a specific cause, and you don't send me a log, I can't fix it. There is no way for me to know what went wrong.
|
||||||
|
|
||||||
|
During a normal crash, the game should tell you where the log is saved. If not, you should still be able to look in the game's crash folder on most operating systems, or export the logs in *Settings -> Game Data -> Export Crash Logs*.
|
||||||
|
|
||||||
|
## Your issue is missing saves or screenshots
|
||||||
|
|
||||||
|
Even if you think your problem happens everywhere and saves/screenshots are redundant, this is frequently not the case.
|
||||||
|
If I cannot reproduce the problem on my own saves and you have not linked any of your own, then the problem is likely to be save-specific. If you do not send me any, the problem cannot be investigated further.
|
||||||
|
|
||||||
|
## Your issue is related to an external program
|
||||||
|
|
||||||
|
If Mindustry causes something else to crash or misbehave, I am very unlikely to fix it. Unless the problem is serious, widespread and/or clearly a bug *in Mindustry*, it is not my responsibility.
|
||||||
|
|
||||||
|
Similarly, if you use another (invasive) program to change how Mindustry works, and something goes wrong, that is not my problem. Don't do it.
|
||||||
|
|
||||||
|
## Your issue is caused by mods
|
||||||
|
|
||||||
|
Crashes and bugs related to installed mods should be reported in the relevant mod repository, not here.
|
||||||
|
*Note that problems with the Mindustry modding API are a separate problem, and do not apply.*
|
||||||
|
|
||||||
|
## I cannot reproduce your issue
|
||||||
|
|
||||||
|
If I follow your instructions and am repeatedly unable to reproduce the problem you've reported, then it is very unlikely to be fixed.
|
||||||
|
Either the problem is device-specific, or there is not enough information given for me to be able to reproduce it.
|
||||||
|
|
||||||
|
I may attempt to change some code if I think it will make the issue less likely to occur, but without knowing for sure, the issue cannot be considered truly "fixed".
|
||||||
|
As I cannot make any further progress on the problem, there is no reason to keep it open. If it is a common bug/crash, other people will come along with information that may shed some light on the issue.
|
||||||
@@ -253,18 +253,22 @@ project(":ios"){
|
|||||||
|
|
||||||
task incrementConfig{
|
task incrementConfig{
|
||||||
def vfile = file('robovm.properties')
|
def vfile = file('robovm.properties')
|
||||||
|
def bversion = getBuildVersion()
|
||||||
def props = new Properties()
|
def props = new Properties()
|
||||||
if(vfile.exists()){
|
if(vfile.exists()){
|
||||||
props.load(new FileInputStream(vfile))
|
props.load(new FileInputStream(vfile))
|
||||||
}else{
|
}else{
|
||||||
props['app.id'] = 'io.anuke.mindustry'
|
props['app.id'] = 'io.anuke.mindustry'
|
||||||
props['app.version'] = '5.0'
|
props['app.version'] = '6.0'
|
||||||
props['app.mainclass'] = 'mindustry.IOSLauncher'
|
props['app.mainclass'] = 'mindustry.IOSLauncher'
|
||||||
props['app.executable'] = 'IOSLauncher'
|
props['app.executable'] = 'IOSLauncher'
|
||||||
props['app.name'] = 'Mindustry'
|
props['app.name'] = 'Mindustry'
|
||||||
}
|
}
|
||||||
|
|
||||||
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
||||||
|
if(bversion != "custom build"){
|
||||||
|
props['app.version'] = versionNumber + "." + bversion + (bversion.contains(".") ? "" : ".0")
|
||||||
|
}
|
||||||
props.store(vfile.newWriter(), null)
|
props.store(vfile.newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ stat.delivered = Resources Launched:
|
|||||||
stat.playtime = Time Played:[accent] {0}
|
stat.playtime = Time Played:[accent] {0}
|
||||||
stat.rank = Final Rank: [accent]{0}
|
stat.rank = Final Rank: [accent]{0}
|
||||||
|
|
||||||
globalitems = [accent]Global Items
|
globalitems = [accent]Total Items
|
||||||
map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
|
map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
|
||||||
level.highscore = High Score: [accent]{0}
|
level.highscore = High Score: [accent]{0}
|
||||||
level.select = Level Select
|
level.select = Level Select
|
||||||
@@ -196,6 +196,7 @@ servers.local = Local Servers
|
|||||||
servers.remote = Remote Servers
|
servers.remote = Remote Servers
|
||||||
servers.global = Community Servers
|
servers.global = Community Servers
|
||||||
|
|
||||||
|
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
|
||||||
servers.showhidden = Show Hidden Servers
|
servers.showhidden = Show Hidden Servers
|
||||||
server.shown = Shown
|
server.shown = Shown
|
||||||
server.hidden = Hidden
|
server.hidden = Hidden
|
||||||
@@ -1279,6 +1280,9 @@ hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a pay
|
|||||||
hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires.
|
hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires.
|
||||||
hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[].
|
hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[].
|
||||||
hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down.
|
hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down.
|
||||||
|
hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a [accent]Foundation[] core over the [accent]Shard[] core. Make sure it is free from nearby obstructions.
|
||||||
|
hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[].
|
||||||
|
hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[].
|
||||||
|
|
||||||
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.
|
||||||
@@ -1473,7 +1477,7 @@ unit.zenith.description = Fires salvos of missiles at all nearby enemies.
|
|||||||
unit.antumbra.description = Fires a barrage of bullets at all nearby enemies.
|
unit.antumbra.description = Fires a barrage of bullets at all nearby enemies.
|
||||||
unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies.
|
unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies.
|
||||||
unit.mono.description = Automatically mines copper and lead, depositing it into the core.
|
unit.mono.description = Automatically mines copper and lead, depositing it into the core.
|
||||||
unit.poly.description = Automatically rebuilds damaged structures and assists other units in construction.
|
unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction.
|
||||||
unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units.
|
unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units.
|
||||||
unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units.
|
unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units.
|
||||||
unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units.
|
unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units.
|
||||||
|
|||||||
@@ -1251,7 +1251,7 @@ hint.mine = \uf8c4 주변의 구리광석을 수동으로 채굴하려면 광
|
|||||||
hint.desktopShoot = [accent][[마우스 왼클릭][]으로 발사할수 있습니다.
|
hint.desktopShoot = [accent][[마우스 왼클릭][]으로 발사할수 있습니다.
|
||||||
hint.depositItems = 아이템을 코어로 옮기려면, 당신의 기체의 아이템을 코어로 끌어놓으세요.
|
hint.depositItems = 아이템을 코어로 옮기려면, 당신의 기체의 아이템을 코어로 끌어놓으세요.
|
||||||
hint.respawn = 당신의 기체를 떠나려면 [accent][[V][]를 누르십시오.
|
hint.respawn = 당신의 기체를 떠나려면 [accent][[V][]를 누르십시오.
|
||||||
hint.respawn.mobile = 당신은 유닛과 구조물을 바꿔가며 조종할 수 있습니다. 당신의 기체를 떠나려면 [accent]왼쪽 위에 있는 아바타를 누르십시오.[]
|
hint.respawn.mobile = 당신은 유닛 혹은 포탑을 조종할 수 있습니다. 당신의 기체를 떠나려면 [accent]왼쪽 위에 있는 아바타를 누르십시오.[]
|
||||||
hint.desktopPause = 게임을 일시정지/재시작 하기 위해 [accent][[Space][]를 누르십시오.
|
hint.desktopPause = 게임을 일시정지/재시작 하기 위해 [accent][[Space][]를 누르십시오.
|
||||||
hint.placeDrill = 드릴을 설치하려면 오른쪽 아래의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[]을 선택해서 구리 광석 위를 누르십시오.
|
hint.placeDrill = 드릴을 설치하려면 오른쪽 아래의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[]을 선택해서 구리 광석 위를 누르십시오.
|
||||||
hint.placeDrill.mobile = 오른쪽 아래 메뉴의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[] 를 선택해서 구리 광석 위를 누르십시오.\n\n설치를 완료하려면 오른쪽 아래의 \ue800 [accent]완료 버튼[]을 누르십시오.
|
hint.placeDrill.mobile = 오른쪽 아래 메뉴의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[] 를 선택해서 구리 광석 위를 누르십시오.\n\n설치를 완료하려면 오른쪽 아래의 \ue800 [accent]완료 버튼[]을 누르십시오.
|
||||||
@@ -1263,7 +1263,7 @@ hint.breaking.mobile = 블럭을 부수려면 오른쪽 아래의 \ue817 [accent
|
|||||||
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
|
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
|
||||||
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
|
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
|
||||||
hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른채로 [accent]클릭[] 하십시오.
|
hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른채로 [accent]클릭[] 하십시오.
|
||||||
hint.unitControl.mobile = 아군 유닛과 포탑을 조종하려면 [accent]빠르게 두번 누르십시오[].
|
hint.unitControl.mobile = 아군 유닛과 포탑을 조종하려면 해당 개체를 [accent]빠르게 두번 누르십시오[].
|
||||||
hint.launch = 충분한 자원을 모았으면, 오른쪽 아래의 \ue827 [accent]Map[]에서 주변 지역을 선택해서 [accent]Launch[]할 수 있습니다.
|
hint.launch = 충분한 자원을 모았으면, 오른쪽 아래의 \ue827 [accent]Map[]에서 주변 지역을 선택해서 [accent]Launch[]할 수 있습니다.
|
||||||
hint.launch.mobile = 충분한 자원을 모았으면, 오른쪽 아래의 \ue88c [accent]메뉴[]에 있는 \ue827 [accent]Map[]에서 주변 지역을 선택해서 [accent]Launch[]할 수 있습니다.
|
hint.launch.mobile = 충분한 자원을 모았으면, 오른쪽 아래의 \ue88c [accent]메뉴[]에 있는 \ue827 [accent]Map[]에서 주변 지역을 선택해서 [accent]Launch[]할 수 있습니다.
|
||||||
hint.schematicSelect = 블록을 복사하고 붙여넣으려면 [accent][[F][]를 누른채로 끌어서 구역을 지정하십시오. \n\n [accent][[마우스 휠][]을 누르면 한개의 블록만 복사할 수 있습니다.
|
hint.schematicSelect = 블록을 복사하고 붙여넣으려면 [accent][[F][]를 누른채로 끌어서 구역을 지정하십시오. \n\n [accent][[마우스 휠][]을 누르면 한개의 블록만 복사할 수 있습니다.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
credits.text = Створив [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nМаєте питання по грі або знайшли помилки в перекладі?\nДолучайтеся до офіційного сервера Mindustry у Discord\nв канал #українська.\nУкраїнський перекладач — Prosta4ok_ua#6336.
|
credits.text = Створив [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nМаєте питання за грою або знайшли помилки в перекладі?\nДолучайтеся до офіційного сервера Mindustry у Discord\nв канал #українська.\nУкраїнський перекладач — Prosta4ok_ua#6336.
|
||||||
credits = Творці
|
credits = Творці
|
||||||
contributors = Перекладачі та помічники
|
contributors = Перекладачі та помічники
|
||||||
discord = Офіційний сервер Mindustry в Discord
|
discord = Офіційний сервер Mindustry в Discord
|
||||||
@@ -22,9 +22,8 @@ gameover.pvp = [accent]{0}[] команда перемогла!
|
|||||||
gameover.waiting = [accent]Очікуємо наступно мапу…
|
gameover.waiting = [accent]Очікуємо наступно мапу…
|
||||||
highscore = [accent]Новий рекорд!
|
highscore = [accent]Новий рекорд!
|
||||||
copied = Скопійовано.
|
copied = Скопійовано.
|
||||||
indev.popup = Наразі [accent]6.0[] знаходиться у стадії [accent]бета-тестування[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення кампанії;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord.
|
|
||||||
indev.notready = Ця частина гри ще не готова.
|
indev.notready = Ця частина гри ще не готова.
|
||||||
|
indev.campaign = [accent]Вітання! Ви досягли кінця кампанії![]\n\nНаразі це все, що може запропонувати вам гра. Міжпланетні подорожі зʼявляться в наступних оновленнях.
|
||||||
load.sound = Звуки
|
load.sound = Звуки
|
||||||
load.map = Мапи
|
load.map = Мапи
|
||||||
load.image = Зображення
|
load.image = Зображення
|
||||||
@@ -32,14 +31,12 @@ load.content = Зміст
|
|||||||
load.system = Система
|
load.system = Система
|
||||||
load.mod = Модифікації
|
load.mod = Модифікації
|
||||||
load.scripts = Скрипти
|
load.scripts = Скрипти
|
||||||
|
|
||||||
be.update = Доступна нова збірка Bleeding Edge:
|
be.update = Доступна нова збірка Bleeding Edge:
|
||||||
be.update.confirm = Завантажити та перезавантажити зараз?
|
be.update.confirm = Завантажити та перезавантажити зараз?
|
||||||
be.updating = Оновлення…
|
be.updating = Оновлення…
|
||||||
be.ignore = Ігнорувати
|
be.ignore = Ігнорувати
|
||||||
be.noupdates = Оновлень не знайдено.
|
be.noupdates = Оновлень не знайдено.
|
||||||
be.check = Перевірити на наявність оновлень
|
be.check = Перевірити на наявність оновлень
|
||||||
|
|
||||||
schematic = Схема
|
schematic = Схема
|
||||||
schematic.add = Зберегти схему…
|
schematic.add = Зберегти схему…
|
||||||
schematics = Схеми
|
schematics = Схеми
|
||||||
@@ -58,7 +55,6 @@ schematic.delete.confirm = Ви справді хочете видалити ц
|
|||||||
schematic.rename = Перейменувати схему
|
schematic.rename = Перейменувати схему
|
||||||
schematic.info = {0}x{1}, блоків: {2}
|
schematic.info = {0}x{1}, блоків: {2}
|
||||||
schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері.
|
schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері.
|
||||||
|
|
||||||
stats = Статистика
|
stats = Статистика
|
||||||
stat.wave = Хвиль відбито:[accent] {0}
|
stat.wave = Хвиль відбито:[accent] {0}
|
||||||
stat.enemiesDestroyed = Противників знищено:[accent] {0}
|
stat.enemiesDestroyed = Противників знищено:[accent] {0}
|
||||||
@@ -68,7 +64,6 @@ stat.deconstructed = Будівель деконструйовано:[accent] {0
|
|||||||
stat.delivered = Ресурсів запущено:
|
stat.delivered = Ресурсів запущено:
|
||||||
stat.playtime = Час у грі:[accent] {0}
|
stat.playtime = Час у грі:[accent] {0}
|
||||||
stat.rank = Фінальний рахунок:[accent] {0}
|
stat.rank = Фінальний рахунок:[accent] {0}
|
||||||
|
|
||||||
globalitems = [accent]Глобальні предмети
|
globalitems = [accent]Глобальні предмети
|
||||||
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
||||||
level.highscore = Рекорд: [accent]{0}
|
level.highscore = Рекорд: [accent]{0}
|
||||||
@@ -102,7 +97,6 @@ uploadingpreviewfile = Вивантаження файлу попередньо
|
|||||||
committingchanges = Здійснення змін
|
committingchanges = Здійснення змін
|
||||||
done = Зроблено
|
done = Зроблено
|
||||||
feature.unsupported = Ваш пристрій не підтримує цю функцію
|
feature.unsupported = Ваш пристрій не підтримує цю функцію
|
||||||
|
|
||||||
mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord.
|
mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord.
|
||||||
mods = Модифікації
|
mods = Модифікації
|
||||||
mods.none = [lightgray]Модифікацій не знайдено!
|
mods.none = [lightgray]Модифікацій не знайдено!
|
||||||
@@ -138,7 +132,6 @@ mod.missing = Це збереження містить модифікації,
|
|||||||
mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову.
|
mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову.
|
||||||
mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації.
|
mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації.
|
||||||
mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри.
|
mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри.
|
||||||
|
|
||||||
about.button = Про гру
|
about.button = Про гру
|
||||||
name = Ім’я:
|
name = Ім’я:
|
||||||
noname = Спочатку придумайте[accent] собі ім’я[].
|
noname = Спочатку придумайте[accent] собі ім’я[].
|
||||||
@@ -146,8 +139,12 @@ planetmap = Планетна мапа
|
|||||||
launchcore = Запустити ядро
|
launchcore = Запустити ядро
|
||||||
filename = Назва файлу:
|
filename = Назва файлу:
|
||||||
unlocked = Доступний новий вміст!
|
unlocked = Доступний новий вміст!
|
||||||
|
available = Нове дослідження доступно!
|
||||||
completed = [accent]Завершено
|
completed = [accent]Завершено
|
||||||
techtree = Дерево технологій
|
techtree = Дерево технологій
|
||||||
|
research.legacy = Були знайдені дослідження з [accent]5.0[].\nЧи бажаєте ви [accent]завантажити ці дані[] або [accent]ви хочете відмовитися від цього[] і почати досліджувати із самого початку в новій кампанії (рекомендовано)?
|
||||||
|
research.load = Завантажити
|
||||||
|
research.discard = Відмовитися
|
||||||
research.list = [lightgray]Дослідження:
|
research.list = [lightgray]Дослідження:
|
||||||
research = Дослідження
|
research = Дослідження
|
||||||
researched = [lightgray]{0} досліджено.
|
researched = [lightgray]{0} досліджено.
|
||||||
@@ -174,7 +171,7 @@ server.kicked.customClient = Цей сервер не підтримує кор
|
|||||||
server.kicked.gameover = Гру завершено!
|
server.kicked.gameover = Гру завершено!
|
||||||
server.kicked.serverRestarting = Сервер перезавантажується
|
server.kicked.serverRestarting = Сервер перезавантажується
|
||||||
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
||||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[].\nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер.
|
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[].\nКористувачі, які перебувають у тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер.
|
||||||
join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip.
|
join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip.
|
||||||
hostserver = Запустити багатокористувацький сервер
|
hostserver = Запустити багатокористувацький сервер
|
||||||
invitefriends = Запросити друзів
|
invitefriends = Запросити друзів
|
||||||
@@ -187,15 +184,12 @@ hosts.discovering.any = Пошук ігор
|
|||||||
server.refreshing = Оновлення сервера
|
server.refreshing = Оновлення сервера
|
||||||
hosts.none = [lightgray]Локальних ігор не знайдено
|
hosts.none = [lightgray]Локальних ігор не знайдено
|
||||||
host.invalid = [scarlet]Не вдалося під’єднатися до сервера.
|
host.invalid = [scarlet]Не вдалося під’єднатися до сервера.
|
||||||
|
|
||||||
servers.local = Локальні сервери
|
servers.local = Локальні сервери
|
||||||
servers.remote = Віддалені сервери
|
servers.remote = Віддалені сервери
|
||||||
servers.global = Глобальні сервери
|
servers.global = Глобальні сервери
|
||||||
|
|
||||||
servers.showhidden = Показати приховані сервери
|
servers.showhidden = Показати приховані сервери
|
||||||
server.shown = Показано
|
server.shown = Показано
|
||||||
server.hidden = Приховано
|
server.hidden = Приховано
|
||||||
|
|
||||||
trace = Стежити за гравцем
|
trace = Стежити за гравцем
|
||||||
trace.playername = Ім’я гравця: [accent]{0}
|
trace.playername = Ім’я гравця: [accent]{0}
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = IP: [accent]{0}
|
||||||
@@ -229,6 +223,7 @@ disconnect.timeout = Час вийшов.
|
|||||||
disconnect.data = Не вдалося завантажити світові дані!
|
disconnect.data = Не вдалося завантажити світові дані!
|
||||||
cantconnect = Не вдалося під’єднатися до гри ([accent]{0}[]).
|
cantconnect = Не вдалося під’єднатися до гри ([accent]{0}[]).
|
||||||
connecting = [accent]Приєднання…
|
connecting = [accent]Приєднання…
|
||||||
|
reconnecting = [accent]Повторне зʼєднання…
|
||||||
connecting.data = [accent]Завантаження даних світу…
|
connecting.data = [accent]Завантаження даних світу…
|
||||||
server.port = Порт:
|
server.port = Порт:
|
||||||
server.addressinuse = Ця адреса вже використовується!
|
server.addressinuse = Ця адреса вже використовується!
|
||||||
@@ -284,7 +279,7 @@ data.exported = Дані вивантажено.
|
|||||||
data.invalid = Це не дійсні ігрові дані.
|
data.invalid = Це не дійсні ігрові дані.
|
||||||
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється.
|
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється.
|
||||||
quit.confirm = Ви дійсно хочете вийти?
|
quit.confirm = Ви дійсно хочете вийти?
|
||||||
quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[]
|
quit.confirm.tutorial = Ви впевнені, що знаєте, що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[]
|
||||||
loading = [accent]Завантаження…
|
loading = [accent]Завантаження…
|
||||||
reloading = [accent]Перезавантаження модифікацій…
|
reloading = [accent]Перезавантаження модифікацій…
|
||||||
saving = [accent]Збереження…
|
saving = [accent]Збереження…
|
||||||
@@ -329,7 +324,6 @@ publishing = [accent]Публікація…
|
|||||||
publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
|
publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
|
||||||
publish.error = Виникла помилка під час публікації предмета: {0}
|
publish.error = Виникла помилка під час публікації предмета: {0}
|
||||||
steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
|
steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
|
||||||
|
|
||||||
editor.brush = Пензлик
|
editor.brush = Пензлик
|
||||||
editor.openin = Відкрити в редакторі
|
editor.openin = Відкрити в редакторі
|
||||||
editor.oregen = Генерація руд
|
editor.oregen = Генерація руд
|
||||||
@@ -362,12 +356,9 @@ waves.load = Завантажити з буфера обміну
|
|||||||
waves.invalid = Недійсні хвилі в буфері обміну.
|
waves.invalid = Недійсні хвилі в буфері обміну.
|
||||||
waves.copied = Хвилі скопійовані.
|
waves.copied = Хвилі скопійовані.
|
||||||
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
||||||
|
|
||||||
#these are intentionally in lower case
|
|
||||||
wavemode.counts = кількість
|
wavemode.counts = кількість
|
||||||
wavemode.totals = усього
|
wavemode.totals = усього
|
||||||
wavemode.health = здоров’я
|
wavemode.health = здоров’я
|
||||||
|
|
||||||
editor.default = [lightgray]<За замовчуванням>
|
editor.default = [lightgray]<За замовчуванням>
|
||||||
details = Подробиці…
|
details = Подробиці…
|
||||||
edit = Редагувати…
|
edit = Редагувати…
|
||||||
@@ -414,7 +405,6 @@ editor.overwrite = [accent]Попередження!\nЦе перезапису
|
|||||||
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]»
|
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]»
|
||||||
editor.exists = Мапа з такою назвою вже є.
|
editor.exists = Мапа з такою назвою вже є.
|
||||||
editor.selectmap = Виберіть мапу для завантаження:
|
editor.selectmap = Виберіть мапу для завантаження:
|
||||||
|
|
||||||
toolmode.replace = Замінити
|
toolmode.replace = Замінити
|
||||||
toolmode.replace.description = Малює тільки\nна суцільних блоках.
|
toolmode.replace.description = Малює тільки\nна суцільних блоках.
|
||||||
toolmode.replaceall = Замінити все
|
toolmode.replaceall = Замінити все
|
||||||
@@ -429,7 +419,6 @@ toolmode.fillteams = Змінити блок у команді
|
|||||||
toolmode.fillteams.description = Змінює належність\nблоків до команди.
|
toolmode.fillteams.description = Змінює належність\nблоків до команди.
|
||||||
toolmode.drawteams = Змінити команду блока
|
toolmode.drawteams = Змінити команду блока
|
||||||
toolmode.drawteams.description = Змінює належність\nблока до команди.
|
toolmode.drawteams.description = Змінює належність\nблока до команди.
|
||||||
|
|
||||||
filters.empty = [lightgray]Немає фільтрів! Додайте хоча б один за допомогою кнопки нижче.
|
filters.empty = [lightgray]Немає фільтрів! Додайте хоча б один за допомогою кнопки нижче.
|
||||||
filter.distort = Спотворення
|
filter.distort = Спотворення
|
||||||
filter.noise = Шум
|
filter.noise = Шум
|
||||||
@@ -466,7 +455,6 @@ filter.option.floor2 = Друга поверхня
|
|||||||
filter.option.threshold2 = Вторинний граничний поріг
|
filter.option.threshold2 = Вторинний граничний поріг
|
||||||
filter.option.radius = Радіус
|
filter.option.radius = Радіус
|
||||||
filter.option.percentile = Спад
|
filter.option.percentile = Спад
|
||||||
|
|
||||||
width = Ширина:
|
width = Ширина:
|
||||||
height = Висота:
|
height = Висота:
|
||||||
menu = Меню
|
menu = Меню
|
||||||
@@ -484,7 +472,6 @@ tutorial = Навчання
|
|||||||
tutorial.retake = Пройти навчання ще раз
|
tutorial.retake = Пройти навчання ще раз
|
||||||
editor = Редактор
|
editor = Редактор
|
||||||
mapeditor = Редактор мап
|
mapeditor = Редактор мап
|
||||||
|
|
||||||
abandon = Покинути
|
abandon = Покинути
|
||||||
abandon.text = Ця зона і всі її ресурси будуть утрачені.
|
abandon.text = Ця зона і всі її ресурси будуть утрачені.
|
||||||
locked = Заблоковано
|
locked = Заблоковано
|
||||||
@@ -494,28 +481,20 @@ requirement.core = Знищте вороже ядро в зоні «{0}»
|
|||||||
requirement.research = Дослідіть {0}
|
requirement.research = Дослідіть {0}
|
||||||
requirement.produce = Виробіть {0}
|
requirement.produce = Виробіть {0}
|
||||||
requirement.capture = Захопіть {0}
|
requirement.capture = Захопіть {0}
|
||||||
bestwave = [lightgray]Найкраща хвиля: {0}
|
|
||||||
launch.text = Запуск
|
launch.text = Запуск
|
||||||
research.multiplayer = Лише власник сервера має змогу досліджувати предмети.
|
research.multiplayer = Лише власник сервера має змогу досліджувати предмети.
|
||||||
|
map.multiplayer = Лише власник може переглядати сектори.
|
||||||
uncover = Розкрити
|
uncover = Розкрити
|
||||||
configure = Налаштувати вивантаження
|
configure = Налаштувати вивантаження
|
||||||
|
|
||||||
#TODO
|
|
||||||
loadout = Вивантаження
|
loadout = Вивантаження
|
||||||
resources = Ресурси
|
resources = Ресурси
|
||||||
bannedblocks = Заборонені блоки
|
bannedblocks = Заборонені блоки
|
||||||
addall = Додати все
|
addall = Додати все
|
||||||
|
launch.from = Запуск з [accent]{0}
|
||||||
launch.destination = Пункт призначення: {0}
|
launch.destination = Пункт призначення: {0}
|
||||||
configure.invalid = Кількість має бути числом між 0 та {0}.
|
configure.invalid = Кількість має бути числом між 0 та {0}.
|
||||||
zone.unlocked = Зона «[lightgray]{0}» тепер розблокована.
|
|
||||||
zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1}
|
|
||||||
zone.resources = [lightgray]Виявлені ресурси:
|
|
||||||
zone.objective = [lightgray]Мета: [accent]{0}
|
|
||||||
zone.objective.survival = вижити
|
|
||||||
zone.objective.attack = знищити вороже ядро
|
|
||||||
add = Додати…
|
add = Додати…
|
||||||
boss.health = Здоров’я Вартового
|
boss.health = Здоров’я Вартового
|
||||||
|
|
||||||
connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0}
|
connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0}
|
||||||
error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса?
|
error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса?
|
||||||
error.invalidaddress = Некоректна адреса.
|
error.invalidaddress = Некоректна адреса.
|
||||||
@@ -526,13 +505,11 @@ error.mapnotfound = Файл мапи не знайдено!
|
|||||||
error.io = Мережева помилка введення-виведення.
|
error.io = Мережева помилка введення-виведення.
|
||||||
error.any = Невідома мережева помилка
|
error.any = Невідома мережева помилка
|
||||||
error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це.
|
error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це.
|
||||||
|
|
||||||
weather.rain.name = Дощ
|
weather.rain.name = Дощ
|
||||||
weather.snow.name = Сніг
|
weather.snow.name = Сніг
|
||||||
weather.sandstorm.name = Піщана буря
|
weather.sandstorm.name = Піщана буря
|
||||||
weather.sporestorm.name = Спорова буря
|
weather.sporestorm.name = Спорова буря
|
||||||
weather.fog.name = Туман
|
weather.fog.name = Туман
|
||||||
|
|
||||||
sectors.unexplored = [lightgray]Не досліджено
|
sectors.unexplored = [lightgray]Не досліджено
|
||||||
sectors.resources = Ресурси:
|
sectors.resources = Ресурси:
|
||||||
sectors.production = Виробництво:
|
sectors.production = Виробництво:
|
||||||
@@ -545,27 +522,26 @@ sectors.resume = Продовжити
|
|||||||
sectors.launch = Запустити
|
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} хвиль
|
||||||
|
sectors.go = Перейти
|
||||||
sector.curcapture = Сектор захоплено
|
sector.curcapture = Сектор захоплено
|
||||||
sector.missingresources = [scarlet]Недостатньо ресурсів в ядрі
|
sector.curlost = Сектор втрачено
|
||||||
|
sector.missingresources = [scarlet]Недостатньо ресурсів у ядрі
|
||||||
sector.attacked = Сектор [accent]{0}[white] під атакою!
|
sector.attacked = Сектор [accent]{0}[white] під атакою!
|
||||||
sector.lost = Сектор [accent]{0}[white] втрачено!
|
sector.lost = Сектор [accent]{0}[white] втрачено!
|
||||||
#note: the missing space in the line below is intentional
|
|
||||||
sector.captured = Сектор [accent]{0}[white]захоплено!
|
sector.captured = Сектор [accent]{0}[white]захоплено!
|
||||||
|
|
||||||
threat.low = низька
|
threat.low = низька
|
||||||
threat.medium = середня
|
threat.medium = середня
|
||||||
threat.high = висока
|
threat.high = висока
|
||||||
threat.extreme = екстремальна
|
threat.extreme = екстремальна
|
||||||
threat.eradication = викорінювальна
|
threat.eradication = викорінювальна
|
||||||
|
|
||||||
planets = Планети
|
planets = Планети
|
||||||
|
|
||||||
planet.serpulo.name = Cерпуло
|
planet.serpulo.name = Cерпуло
|
||||||
#TODO better name
|
|
||||||
planet.sun.name = Сонце
|
planet.sun.name = Сонце
|
||||||
|
|
||||||
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
|
|
||||||
sector.impact0078.name = Аварійне приземлення 0078
|
sector.impact0078.name = Аварійне приземлення 0078
|
||||||
sector.groundZero.name = Відправний пункт
|
sector.groundZero.name = Відправний пункт
|
||||||
sector.craters.name = Кратери
|
sector.craters.name = Кратери
|
||||||
@@ -581,22 +557,23 @@ sector.fungalPass.name = Грибний перевал
|
|||||||
sector.biomassFacility.name = Центр дослідження синтезу біомаси
|
sector.biomassFacility.name = Центр дослідження синтезу біомаси
|
||||||
sector.windsweptIslands.name = Вітряні острови
|
sector.windsweptIslands.name = Вітряні острови
|
||||||
sector.extractionOutpost.name = Видобувна застава
|
sector.extractionOutpost.name = Видобувна застава
|
||||||
|
sector.planetaryTerminal.name = Термінал планетарного запуску
|
||||||
#unused
|
sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗберіть якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі.
|
||||||
#sector.crags.name = Crags
|
sector.frozenForest.description = Навіть тут, ближче до гір, уже поширилися спори. Холодна температура не змогла стримати їх назавжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами.
|
||||||
|
sector.saltFlats.description = На околицях пустелі лежать Соляні рівнини. У цьому місці небагато ресурсів.\n\nСаме тут противники спорудили комплекс зі зберігання ресурсів. Викорініть їхнє ядро. Не лишайте нічого цінного.
|
||||||
sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗбирайте якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі.
|
sector.craters.description = У цьому кратері накопичилася вода — пережиток старих воєн. Відновіть місцевість. Видобудьте пісок. Виплавте метаскло. Качайте воду, щоб охолоджувати башти та бури.
|
||||||
sector.frozenForest.description = Спори поширилися навіть тут, ближче до гір. Холодна температура не може стримувати їх завжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами.
|
sector.ruinousShores.description = Повз пусток — берегова лінія. Колись у цьому місці розташувався береговий оборонний масив. Проте з тих давніх залишилося не дуже й багато чого. Тільки основні оборонні споруди лишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Дослідіть повторно забуті технології.
|
||||||
sector.saltFlats.description = На околицях пустелі лежать Соляні рівнини. У цьому місці можна знайти небагато ресурсів.\n\nСаме тут противники спорудили комплекс сховищ ресурсів. Викорініть їхнє ядро. Не залишайте нічого цінного.
|
sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, що ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості й дізнайтеся як використовувати його.\n\nВорожа присутність у цій місцевості значно більша. Не дайте ворогам часу надіслати свої найсильніші одиниці.
|
||||||
sector.craters.description = У цьому кратері накопичилася вода, пережиток старих воєн. Відновіть місцевість. Зберіть пісок. Виплавте метаскло. Качайте воду, щоб охолодити турелі та бури.
|
sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nПротивник установив тут свій форпост. Побудуйте Титанів. Зруйнуйте укріплення.
|
||||||
sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології.
|
sector.tarFields.description = Між горами та пустелею простягається край зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами дьогтю.\nНе зважаючи на те, що ця територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]За можливістю дослідіть технологію перероблювання нафти.
|
||||||
sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці.
|
sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту ворога.
|
||||||
sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам.
|
|
||||||
sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти.
|
|
||||||
sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника.
|
|
||||||
sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією.
|
sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією.
|
||||||
sector.fungalPass.description = Перехідна зона між високими і низькими горами, що заповнені спорами. A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
sector.fungalPass.description = Перехідна зона між високими й низькими горами, що заповнені спорами. Тут розташована невелика розвідувальна база противника.\nЗнищте її.\nВикористовуйте Кинджалів і Плазунів. Зруйнуйте два ядра.
|
||||||
|
sector.biomassFacility.description = Батьківщина спор. Це саме той обʼєкт, у якому вони вперше були досліджені та виготовлені.\nДослідіть технологію, що міститься всередині. Вирощуйте спори для виробництва палива та пластмас. \n\n[lightgray]Після руйнації цього обʼєкта спори стали вільними. Ніщо в місцевій екосистемі не змогло скласти конкуренцію такому загарбницькому організму.
|
||||||
|
sector.windsweptIslands.description = Далі, за береговою лінією, розташовується цей віддалений ланцюжок островів. Записи чітко вказують на те, що колись вони мали структури, що виробляли [accent]пластаній[] \n\nВідбивайтесь від морських підрозділів противника. Створіть базу на островах. Дослідіть ці заводи.
|
||||||
|
sector.extractionOutpost.description = Віддалений форпост, побудований ворогом для запуску ресурсів в інші сектори. \n\nМіжсекторна транспортна технологія має важливе значення для подальшого завоювання. Знищте базу. Дослідіть їхні пускові майданчики.
|
||||||
|
sector.impact0078.description = Тут лежать залишки міжзоряного транспортного судна, яке вперше потрапило в цю систему. \n\nВилучіть якомога більше корисного з уламків. Дослідіть будь-яку вцілілу технологію.
|
||||||
|
sector.planetaryTerminal.description = Кінцева мета.\n\nЦя прибережна база містить структуру, здатну запускати ядра на навколишні планети. Надзвичайно добре охороняється.\n\nВиробляє військово-морські підрозділи. Усуньте ворога якомога швидше. Дослідіть структуру запуску.
|
||||||
settings.language = Мова
|
settings.language = Мова
|
||||||
settings.data = Ігрові дані
|
settings.data = Ігрові дані
|
||||||
settings.reset = За замовчуванням
|
settings.reset = За замовчуванням
|
||||||
@@ -608,7 +585,7 @@ settings.sound = Звук
|
|||||||
settings.graphics = Графіка
|
settings.graphics = Графіка
|
||||||
settings.cleardata = Очистити дані…
|
settings.cleardata = Очистити дані…
|
||||||
settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати!
|
settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати!
|
||||||
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється.
|
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно зі збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється.
|
||||||
settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження?
|
settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження?
|
||||||
settings.clearsaves = Очистити збереження
|
settings.clearsaves = Очистити збереження
|
||||||
settings.clearresearch = Очистити дослідження
|
settings.clearresearch = Очистити дослідження
|
||||||
@@ -626,7 +603,6 @@ error.crashtitle = Виникла помилка
|
|||||||
unit.nobuild = [scarlet]Ця одиниця не може будувати
|
unit.nobuild = [scarlet]Ця одиниця не може будувати
|
||||||
lastaccessed = [lightgray]Остання зміна від {0}
|
lastaccessed = [lightgray]Остання зміна від {0}
|
||||||
block.unknown = [lightgray]???
|
block.unknown = [lightgray]???
|
||||||
|
|
||||||
stat.description = Призначення
|
stat.description = Призначення
|
||||||
stat.input = Ввід
|
stat.input = Ввід
|
||||||
stat.output = Вивід
|
stat.output = Вивід
|
||||||
@@ -679,26 +655,24 @@ stat.lightningchance = Шанс удару блискавки
|
|||||||
stat.lightningdamage = Шкода від удару блискавки
|
stat.lightningdamage = Шкода від удару блискавки
|
||||||
stat.flammability = Займистість
|
stat.flammability = Займистість
|
||||||
stat.radioactivity = Радіоактивність
|
stat.radioactivity = Радіоактивність
|
||||||
stat.heatcapacity = Теплоємність
|
stat.heatcapacity = Тепломісткість
|
||||||
stat.viscosity = В’язкість
|
stat.viscosity = В’язкість
|
||||||
stat.temperature = Температура
|
stat.temperature = Температура
|
||||||
stat.speed = Швидкість
|
stat.speed = Швидкість
|
||||||
stat.buildspeed = Швидкість будування
|
stat.buildspeed = Швидкість будування
|
||||||
stat.minespeed = Швидкість видобутку
|
stat.minespeed = Швидкість видобутку
|
||||||
stat.minetier = Рівень видобутку
|
stat.minetier = Рівень видобутку
|
||||||
stat.payloadcapacity = Вантажопідйомність
|
stat.payloadcapacity = Вантажність
|
||||||
stat.commandlimit = Максимум в загоні
|
stat.commandlimit = Максимум у загоні
|
||||||
stat.abilities = Здібності
|
stat.abilities = Здібності
|
||||||
stat.canboost = Можна прискорити
|
stat.canboost = Можна прискорити
|
||||||
stat.flying = Літає
|
stat.flying = Літає
|
||||||
|
|
||||||
ability.forcefield = Щитове поле
|
ability.forcefield = Щитове поле
|
||||||
ability.repairfield = Ремонтувальне поле
|
ability.repairfield = Ремонтувальне поле
|
||||||
ability.statusfield = Поле підсилення
|
ability.statusfield = Поле підсилення
|
||||||
ability.unitspawn = Завод одиниць «{0}»
|
ability.unitspawn = Завод одиниць «{0}»
|
||||||
ability.shieldregenfield = Поле, що відновлює щити
|
ability.shieldregenfield = Поле, що відновлює щити
|
||||||
ability.movelightning = Блискавки при русі
|
ability.movelightning = Блискавки під час руху
|
||||||
|
|
||||||
bar.drilltierreq = Потребується кращий бур
|
bar.drilltierreq = Потребується кращий бур
|
||||||
bar.noresources = Бракує ресурсів
|
bar.noresources = Бракує ресурсів
|
||||||
bar.corereq = Необхідне основне ядро
|
bar.corereq = Необхідне основне ядро
|
||||||
@@ -720,9 +694,7 @@ bar.power = Енергія
|
|||||||
bar.progress = Хід будування
|
bar.progress = Хід будування
|
||||||
bar.input = Ввід
|
bar.input = Ввід
|
||||||
bar.output = Вивід
|
bar.output = Вивід
|
||||||
|
|
||||||
units.processorcontrol = [lightgray]Керується процесором
|
units.processorcontrol = [lightgray]Керується процесором
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] шкода
|
bullet.damage = [stat]{0}[lightgray] шкода
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] плиток
|
bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] плиток
|
||||||
bullet.incendiary = [stat]запальний
|
bullet.incendiary = [stat]запальний
|
||||||
@@ -738,7 +710,6 @@ bullet.freezing = [stat]заморожування
|
|||||||
bullet.tarred = [stat]дьогтьовий
|
bullet.tarred = [stat]дьогтьовий
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x патронів
|
bullet.multiplier = [stat]{0}[lightgray]x патронів
|
||||||
bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання
|
bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання
|
||||||
|
|
||||||
unit.blocks = блоки
|
unit.blocks = блоки
|
||||||
unit.blockssquared = блоків²
|
unit.blockssquared = блоків²
|
||||||
unit.powersecond = одиниць енергії за секунду
|
unit.powersecond = одиниць енергії за секунду
|
||||||
@@ -772,7 +743,7 @@ setting.blockreplace.name = Пропонування щодо автоматич
|
|||||||
setting.linear.name = Лінійна фільтрація
|
setting.linear.name = Лінійна фільтрація
|
||||||
setting.hints.name = Підказки
|
setting.hints.name = Підказки
|
||||||
setting.flow.name = Показувати темп швидкості ресурсів
|
setting.flow.name = Показувати темп швидкості ресурсів
|
||||||
setting.backgroundpause.name = Пауза при згортанн
|
setting.backgroundpause.name = Пауза в разі згортанні
|
||||||
setting.buildautopause.name = Автоматичне призупинення будування
|
setting.buildautopause.name = Автоматичне призупинення будування
|
||||||
setting.animatedwater.name = Анімаційні рідини
|
setting.animatedwater.name = Анімаційні рідини
|
||||||
setting.animatedshields.name = Анімаційні щити
|
setting.animatedshields.name = Анімаційні щити
|
||||||
@@ -801,7 +772,6 @@ setting.conveyorpathfinding.name = Пошук шляху для встановл
|
|||||||
setting.sensitivity.name = Чутливість контролера
|
setting.sensitivity.name = Чутливість контролера
|
||||||
setting.saveinterval.name = Інтервал збереження
|
setting.saveinterval.name = Інтервал збереження
|
||||||
setting.seconds = {0} секунд
|
setting.seconds = {0} секунд
|
||||||
setting.blockselecttimeout.name = Час вибору блока
|
|
||||||
setting.milliseconds = {0} мілісекунд
|
setting.milliseconds = {0} мілісекунд
|
||||||
setting.fullscreen.name = Повноекранний режим
|
setting.fullscreen.name = Повноекранний режим
|
||||||
setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску)
|
setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску)
|
||||||
@@ -840,8 +810,8 @@ category.blocks.name = Вибір блока
|
|||||||
command.attack = Атака
|
command.attack = Атака
|
||||||
command.rally = Точка збору
|
command.rally = Точка збору
|
||||||
command.retreat = Відступити
|
command.retreat = Відступити
|
||||||
command.idle = Бездіяти
|
command.idle = Бездіяльність
|
||||||
placement.blockselectkeys = \n[lightgray]Ключ: [{0},
|
placement.blockselectkeys = \n[lightgray]Клавіши: [{0},
|
||||||
keybind.respawn.name = Відродження
|
keybind.respawn.name = Відродження
|
||||||
keybind.control.name = Контролювання одиниці
|
keybind.control.name = Контролювання одиниці
|
||||||
keybind.clear_building.name = Очистити план будування
|
keybind.clear_building.name = Очистити план будування
|
||||||
@@ -850,15 +820,15 @@ keybind.press.axis = Натисніть клавішу…
|
|||||||
keybind.screenshot.name = Зняток мапи
|
keybind.screenshot.name = Зняток мапи
|
||||||
keybind.toggle_power_lines.name = Показувати лазери енергопостачання
|
keybind.toggle_power_lines.name = Показувати лазери енергопостачання
|
||||||
keybind.toggle_block_status.name = Показувати стан блоків
|
keybind.toggle_block_status.name = Показувати стан блоків
|
||||||
keybind.move_x.name = Рух по осі X
|
keybind.move_x.name = Рух за віссю X
|
||||||
keybind.move_y.name = Рух по осі Y
|
keybind.move_y.name = Рух за віссю Y
|
||||||
keybind.mouse_move.name = Рухатися за мишею
|
keybind.mouse_move.name = Рухатися за мишею
|
||||||
keybind.pan.name = Політ камери за мишею
|
keybind.pan.name = Політ камери за мишею
|
||||||
keybind.boost.name = Прискорення
|
keybind.boost.name = Прискорення
|
||||||
keybind.schematic_select.name = Вибрати ділянку
|
keybind.schematic_select.name = Вибрати ділянку
|
||||||
keybind.schematic_menu.name = Меню схем
|
keybind.schematic_menu.name = Меню схем
|
||||||
keybind.schematic_flip_x.name = Віддзеркалити по осі X
|
keybind.schematic_flip_x.name = Віддзеркалити за віссю X
|
||||||
keybind.schematic_flip_y.name = Віддзеркалити по осі Y
|
keybind.schematic_flip_y.name = Віддзеркалити за віссю Y
|
||||||
keybind.category_prev.name = Попередня категорія
|
keybind.category_prev.name = Попередня категорія
|
||||||
keybind.category_next.name = Наступна категорія
|
keybind.category_next.name = Наступна категорія
|
||||||
keybind.block_select_left.name = Вибрати блок ліворуч
|
keybind.block_select_left.name = Вибрати блок ліворуч
|
||||||
@@ -890,6 +860,8 @@ 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.research.name = Дослідження
|
||||||
keybind.chat.name = Чат
|
keybind.chat.name = Чат
|
||||||
keybind.player_list.name = Список гравців
|
keybind.player_list.name = Список гравців
|
||||||
keybind.console.name = Консоль
|
keybind.console.name = Консоль
|
||||||
@@ -912,7 +884,6 @@ mode.pvp.description = Боріться проти інших гравців.\n[
|
|||||||
mode.attack.name = Атака
|
mode.attack.name = Атака
|
||||||
mode.attack.description = Зруйнуйте ворожу базу. \n[gray]Потрібно червоне ядро на мапі для гри.
|
mode.attack.description = Зруйнуйте ворожу базу. \n[gray]Потрібно червоне ядро на мапі для гри.
|
||||||
mode.custom = Користувацькі правила
|
mode.custom = Користувацькі правила
|
||||||
|
|
||||||
rules.infiniteresources = Нескінченні ресурси
|
rules.infiniteresources = Нескінченні ресурси
|
||||||
rules.reactorexplosions = Вибухи реактора
|
rules.reactorexplosions = Вибухи реактора
|
||||||
rules.schematic = Використання схем дозволено
|
rules.schematic = Використання схем дозволено
|
||||||
@@ -930,7 +901,7 @@ rules.enemycorebuildradius = Радіус оборони для ворожого
|
|||||||
rules.wavespacing = Інтервал хвиль:[lightgray] (секунди)
|
rules.wavespacing = Інтервал хвиль:[lightgray] (секунди)
|
||||||
rules.buildcostmultiplier = Множник затрат на будування
|
rules.buildcostmultiplier = Множник затрат на будування
|
||||||
rules.buildspeedmultiplier = Множник швидкості будування
|
rules.buildspeedmultiplier = Множник швидкості будування
|
||||||
rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу
|
rules.deconstructrefundmultiplier = Множник відшкодування в разі демонтажу
|
||||||
rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої
|
rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої
|
||||||
rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках)
|
rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках)
|
||||||
rules.unitammo = Бойові одиниці потребують боєприпасів
|
rules.unitammo = Бойові одиниці потребують боєприпасів
|
||||||
@@ -948,12 +919,11 @@ rules.ambientlight = Навколишнє світло
|
|||||||
rules.weather = Погода
|
rules.weather = Погода
|
||||||
rules.weather.frequency = Повторюваність:
|
rules.weather.frequency = Повторюваність:
|
||||||
rules.weather.duration = Тривалість:
|
rules.weather.duration = Тривалість:
|
||||||
|
|
||||||
content.item.name = Предмети
|
content.item.name = Предмети
|
||||||
content.liquid.name = Рідини
|
content.liquid.name = Рідини
|
||||||
content.unit.name = Бойові одиниці
|
content.unit.name = Бойові одиниці
|
||||||
content.block.name = Блоки
|
content.block.name = Блоки
|
||||||
|
content.sector.name = Cектори
|
||||||
item.copper.name = Мідь
|
item.copper.name = Мідь
|
||||||
item.lead.name = Свинець
|
item.lead.name = Свинець
|
||||||
item.coal.name = Вугілля
|
item.coal.name = Вугілля
|
||||||
@@ -974,7 +944,6 @@ liquid.water.name = Вода
|
|||||||
liquid.slag.name = Шлак
|
liquid.slag.name = Шлак
|
||||||
liquid.oil.name = Нафта
|
liquid.oil.name = Нафта
|
||||||
liquid.cryofluid.name = Кріогенна рідина
|
liquid.cryofluid.name = Кріогенна рідина
|
||||||
|
|
||||||
unit.dagger.name = Кинджал
|
unit.dagger.name = Кинджал
|
||||||
unit.mace.name = Булава
|
unit.mace.name = Булава
|
||||||
unit.fortress.name = Фортеця
|
unit.fortress.name = Фортеця
|
||||||
@@ -1008,11 +977,11 @@ unit.scepter.name = Верховна влада
|
|||||||
unit.reign.name = Верховний Порядок
|
unit.reign.name = Верховний Порядок
|
||||||
unit.vela.name = Пульсар Вітрил
|
unit.vela.name = Пульсар Вітрил
|
||||||
unit.corvus.name = Ворон
|
unit.corvus.name = Ворон
|
||||||
|
|
||||||
block.resupply-point.name = Пункт постачання
|
block.resupply-point.name = Пункт постачання
|
||||||
block.parallax.name = Паралакс
|
block.parallax.name = Паралакс
|
||||||
block.cliff.name = Скеля
|
block.cliff.name = Скеля
|
||||||
block.sand-boulder.name = Пісочний валун
|
block.sand-boulder.name = Пісочний валун
|
||||||
|
block.basalt-boulder.name = Базальтовий валун
|
||||||
block.grass.name = Трава
|
block.grass.name = Трава
|
||||||
block.slag.name = Шлак
|
block.slag.name = Шлак
|
||||||
block.space.name = Космос
|
block.space.name = Космос
|
||||||
@@ -1196,8 +1165,8 @@ block.spectre.name = Спектр
|
|||||||
block.meltdown.name = Розплавлювач
|
block.meltdown.name = Розплавлювач
|
||||||
block.foreshadow.name = Передвісник
|
block.foreshadow.name = Передвісник
|
||||||
block.container.name = Сховище
|
block.container.name = Сховище
|
||||||
block.launch-pad.name = Стартовий майданчик
|
block.launch-pad.name = Пусковий майданчик
|
||||||
block.launch-pad-large.name = Великий стартовий майданчик
|
block.launch-pad-large.name = Великий пусковий майданчик
|
||||||
block.segment.name = Сегмент
|
block.segment.name = Сегмент
|
||||||
block.command-center.name = Командний центр
|
block.command-center.name = Командний центр
|
||||||
block.ground-factory.name = Наземний завод
|
block.ground-factory.name = Наземний завод
|
||||||
@@ -1212,11 +1181,10 @@ block.payload-router.name = Розвантажувальний маршрути
|
|||||||
block.disassembler.name = Розбирач
|
block.disassembler.name = Розбирач
|
||||||
block.silicon-crucible.name = Кремнієвий тигель
|
block.silicon-crucible.name = Кремнієвий тигель
|
||||||
block.overdrive-dome.name = Великий прискорювач
|
block.overdrive-dome.name = Великий прискорювач
|
||||||
#experimental, may be removed
|
|
||||||
block.block-forge.name = Блок-кузня
|
block.block-forge.name = Блок-кузня
|
||||||
block.block-loader.name = Блок-завантажувач
|
block.block-loader.name = Блок-завантажувач
|
||||||
block.block-unloader.name = Блок-вивантажувач
|
block.block-unloader.name = Блок-вивантажувач
|
||||||
|
block.interplanetary-accelerator.name = Міжпланетний прискорювач
|
||||||
block.switch.name = Перемикач
|
block.switch.name = Перемикач
|
||||||
block.micro-processor.name = Мікропроцесор
|
block.micro-processor.name = Мікропроцесор
|
||||||
block.logic-processor.name = Логічний процесор
|
block.logic-processor.name = Логічний процесор
|
||||||
@@ -1225,7 +1193,6 @@ block.logic-display.name = Логічний дисплей
|
|||||||
block.large-logic-display.name = Великий логічний дисплей
|
block.large-logic-display.name = Великий логічний дисплей
|
||||||
block.memory-cell.name = Комірка пам’яті
|
block.memory-cell.name = Комірка пам’яті
|
||||||
block.memory-bank.name = Блок пам’яті
|
block.memory-bank.name = Блок пам’яті
|
||||||
|
|
||||||
team.blue.name = Синя
|
team.blue.name = Синя
|
||||||
team.crux.name = Червона
|
team.crux.name = Червона
|
||||||
team.sharded.name = Помаранчева
|
team.sharded.name = Помаранчева
|
||||||
@@ -1233,45 +1200,57 @@ team.orange.name = Помаранчева
|
|||||||
team.derelict.name = Знедолена
|
team.derelict.name = Знедолена
|
||||||
team.green.name = Зелена
|
team.green.name = Зелена
|
||||||
team.purple.name = Фіолетова
|
team.purple.name = Фіолетова
|
||||||
|
hint.skip = Пропустити
|
||||||
tutorial.next = [lightgray]<Натисніть для продовження>
|
hint.desktopMove = Використовуйте [accent][[WASD][], щоби рухатися.
|
||||||
tutorial.intro = Ви розпочали[scarlet] навчання з Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді
|
hint.zoom = [accent]Прокручуйте коліщатком миші[], щоби збільшити чи зменшити масштаб мапи.
|
||||||
tutorial.intro.mobile = Ви розпочали[scarlet] навчання з Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді
|
hint.mine = Наблизьтесь до мідної руди і [accent]торкніться[] її, щоби видобувати вручну.
|
||||||
tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від розгорнутої вкладки.\n[accent]Натисніть ПКМ[], щоби зупинити будування.
|
hint.desktopShoot = [accent][[ЛКМ][] для стрільби.
|
||||||
tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоби підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоби скасувати розміщення.
|
hint.depositItems = Для передачі предметів просто перетягніть із корабля в ядро.
|
||||||
tutorial.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[]
|
hint.respawn = Для відродження кораблем натисніть [accent][[V][].
|
||||||
tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення в лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро.
|
hint.respawn.mobile = Ви контролюєте одиницю чи структуру. Щоби відродитися як корабель, [accent]торкніться свого аватара вгорі ліворуч.[]
|
||||||
tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро.
|
hint.desktopPause = Натисніть [accent][[Пробіл][], щоби зупинити чи продовжити гру.
|
||||||
tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази.
|
hint.placeDrill = Виберіть у меню внизу праворуч вкладку [accent]Бур[], потім виберіть [accent]Механічний бур[] та натисніть на мідний клаптик для його розміщення.
|
||||||
tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоби заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1
|
hint.placeDrill.mobile = Виберіть у меню внизу праворуч вкладку [accent]Бур[], потім виберіть [accent]Механічний бур[] та натисніть на мідний клаптик для його розміщення.\n\nНатисніть внизу праворуч [accent]галку[] для підтвердження.
|
||||||
tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи.
|
hint.placeConveyor = Конвеєри переміщують предмети з бурів до інших блоків. Виберіть [accent]конвеєр[] з вкладки [accent]Транспортування[].\n\nНатисніть і тягніть, щоби розмістити декілька конвеєрів.\n[accent]Прокручуйте коліщатком миші[], щоб обертати їх.
|
||||||
tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи.
|
hint.placeConveyor.mobile = Конвеєри переміщують предмети з бурів до інших блоків. Виберіть [accent]конвеєр[] з вкладки [accent]Транспортування[].\n\nУтримуйте палець протягом секунди і протягніть, щоби розмістити декілька конвеєрів.
|
||||||
tutorial.unpause = Призупиніть гру, натиснувши на пробіл.
|
hint.placeTurret = Розмістіть [accent]башти[], щоби захистити базу від ворогів.\n\nБашти потребують боєприпасів. У цьому випадку мідь.\nДля її подачі використовуйте конвеєри та бури.
|
||||||
tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу.
|
hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби зруйнувати блоки.
|
||||||
tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні.
|
hint.breaking.mobile = Активуйте [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене.
|
||||||
tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоби зламати його.\nВидаліть ділянку, утримуючи палець упродовж декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоби підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні.
|
hint.research = Використовуйте кнопку [accent]Дослідження[] для дослідження нової технології.
|
||||||
tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з ядра.[]
|
hint.research.mobile = Використовуйте [accent]Дослідження[] в [accent]меню[] для дослідження нової технології.
|
||||||
tutorial.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[]
|
hint.unitControl = Утримуйте [accent][[лівий Ctrl][] і [accent]натисніть[] на одиницю чи башту, щоби контролювати її.
|
||||||
tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоби стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді.
|
hint.unitControl.mobile = [accent][Торкніться двічі[], щоби контролювати союзні одиниці чи башти.
|
||||||
tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді.
|
hint.launch = Як тільки буде зібрано достатньо ресурсів, ви зможете зробити [accent]Запуск[] за допомогою вибору найближчих секторів [accent]мапи[] внизу праворуч.
|
||||||
tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску.
|
hint.launch.mobile = Як тільки буде зібрано достатньо ресурсів, ви зможете зробити [accent]Запуск[] за допомогою вибору найближчих секторів з [accent]мапи[] у [accent]меню[].
|
||||||
|
hint.schematicSelect = Утримуйте [accent][[F][] і тягніть, щоби вибрати блоки для їхнього подальшого копіювання і вставлення.\n\nНатисніть [accent][[СКМ][], щоби скопіювати певний тип блоку.
|
||||||
|
hint.conveyorPathfind = Утримуйте [accent][[лівий Ctrl][], коли тягнете конвеєри, щоб автоматично прокласти шлях.
|
||||||
|
hint.conveyorPathfind.mobile = Увімкніть [accent]діагональний режим[] і тягніть конвеєри, щоб автоматично прокласти шлях.
|
||||||
|
hint.boost = Утримуйте [accent][[лівий Shift][], щоби літати над перешкодами поточною одиницею.\n\nЛише декілька наземних одиниць мають цю перевагу.
|
||||||
|
hint.command = Натисніть [accent][[G][], щоб узяти командування над найближчими одиницями [accent]схожого типу[] і сформувати загін.\n\nЩоб командувати наземними одиницями, ви мусите спершу взяти контроль над іншою наземною одиницею.
|
||||||
|
hint.command.mobile = [accent][[Торкніться двічі][] своєї одиниці, щоб узяти командування над найближчими союзними одиницями і сформувати загін.
|
||||||
|
hint.payloadPickup = Натисніть [accent][[[], щоби підібрати невеличкі блоки чи одиниці.
|
||||||
|
hint.payloadPickup.mobile = [accent]Торкніться й утримуйте[] невеличкий блок чи одиницю, щоби підібрати їх.
|
||||||
|
hint.payloadDrop = Натисніть [accent]][], щоби вивантажити вантаж.
|
||||||
|
hint.payloadDrop.mobile = [accent]Торкніться[] вільного місця й [accent]утримуйте[], щоби вивантажити туди вантаж.
|
||||||
|
hint.waveFire = Башта [accent]Хвиля[] з водою буде автоматично гасити найближчі пожежі.
|
||||||
|
hint.generator = [accent]Генератори внутрішнього згорання[] спалюють вугілля і передають енергію прилеглим блокам.\n\nРадіус передачі енергії можна збільшити за допомогою [accent]силових вузлів[].
|
||||||
|
hint.guardian = [accent]Вартові[] одиниці броньовані. Слабкі боєприпаси, як-от [accent]мідь[] чи [accent]свинець[], [scarlet]не є ефективними[].\n\nВикористовуйте башти вищого рангу чи [accent]графітові боєприпаси[] для Подвійної башти чиЗалпу, щоб убити Вартових.
|
||||||
item.copper.description = Використовується у всіх типах блоків і боєприпасах.
|
item.copper.description = Використовується у всіх типах блоків і боєприпасах.
|
||||||
item.copper.details = Мідь. Напрочуд багато жил цієї руди на Серпуло. За своєю структурою слабка, якщо не зміцнена.
|
item.copper.details = Мідь. Напрочуд багато жил цієї руди на Серпуло. За своєю структурою слабка, якщо не зміцнена.
|
||||||
item.lead.description = Широко використовується в електроніці та в транспортуванні рідин.
|
item.lead.description = Широко використовується в електроніці та в транспортуванні рідин.
|
||||||
item.lead.details = Сплав. Інертний. Широко використовується в акумуляторах.\nПримітка. Мабуть, токсичний для біологічних форм життя. Не те щоб тут залишилося багато...
|
item.lead.details = Сплав. Інертний. Широко використовується в акумуляторах.\nПримітка. Мабуть, токсичний для біологічних форм життя. Не те щоби тут залишилося багато…
|
||||||
item.metaglass.description = Використовується для розподілу чи зберігання рідини.
|
item.metaglass.description = Використовується для розподілу чи зберігання рідини.
|
||||||
item.graphite.description = Використовується для боєприпасів та електричних компонентів.
|
item.graphite.description = Використовується для боєприпасів та електричних компонентів.
|
||||||
item.sand.description = Використовується для виробництва інших удосконалених матеріалів.
|
item.sand.description = Використовується для виробництва інших удосконалених матеріалів.
|
||||||
item.coal.description = Використовується для виробництва палива і вдосноналених матеріалів.
|
item.coal.description = Використовується для виробництва палива і вдосконалених матеріалів.
|
||||||
item.coal.details = Виглядає скам’янілою рослинною речовиною, утвореною задовго до Сівби.
|
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 = Використовується в передовій електроніці й технології самовідновлення.
|
||||||
item.surge-alloy.description = Використовується в передовій зброї та реактивних захисних конструкціях.
|
item.surge-alloy.description = Використовується в передовій зброї та реактивних захисних конструкціях.
|
||||||
item.spore-pod.description = Використовується для перетворення на нафту, вибухівку та паливо.
|
item.spore-pod.description = Використовується для перетворення на нафту, вибухівку та паливо.
|
||||||
item.spore-pod.details = Спори. Найімовірніше, синтетична форма життя. Виділяють гази, токсичні для іншого біологічного життя. Надзвичайно загарбницька поведінка. Легкозаймисті при певних умовах.
|
item.spore-pod.details = Спори. Найімовірніше, синтетична форма життя. Виділяють гази, токсичні для іншого біологічного життя. Надзвичайно загарбницька поведінка. Легкозаймисті при певних умовах.
|
||||||
@@ -1280,20 +1259,20 @@ item.pyratite.description = Використовується в запальні
|
|||||||
liquid.water.description = Використовується для охолодження машин та перероблювання відходів.
|
liquid.water.description = Використовується для охолодження машин та перероблювання відходів.
|
||||||
liquid.slag.description = Переробляється у відокремлювачах у складові метали або розпорошується на ворогів як зброя.
|
liquid.slag.description = Переробляється у відокремлювачах у складові метали або розпорошується на ворогів як зброя.
|
||||||
liquid.oil.description = Використовується у виробництві передових матеріалів і як запальні боєприпаси.
|
liquid.oil.description = Використовується у виробництві передових матеріалів і як запальні боєприпаси.
|
||||||
liquid.cryofluid.description = Використовується як теплоносій в реакторах, баштах і заводах.
|
liquid.cryofluid.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 = Зберігає повідомлення для комунікації між союзниками.
|
||||||
block.graphite-press.description = Стискає вугілля в графіт.
|
block.graphite-press.description = Стискає вугілля в графіт.
|
||||||
block.multi-press.description = Стискає вугілля в графіт. Потребує воду для охолодження.
|
block.multi-press.description = Стискає вугілля в графіт. Потребує воду для охолодження.
|
||||||
block.silicon-smelter.description = Синтезує пісок з вугіллям для отримання кремнію.
|
block.silicon-smelter.description = Синтезує пісок із вугіллям для отримання кремнію.
|
||||||
block.kiln.description = Виплавляє пісок та свинець у метаскло.
|
block.kiln.description = Виплавляє пісок та свинець у метаскло.
|
||||||
block.plastanium-compressor.description = Виробляє пластаній із нафти і титану.
|
block.plastanium-compressor.description = Виробляє пластаній із нафти й титану.
|
||||||
block.phase-weaver.description = Синтезує фазову тканину з торію та піску.
|
block.phase-weaver.description = Синтезує фазову тканину з торію та піску.
|
||||||
block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву.
|
block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву.
|
||||||
block.cryofluid-mixer.description = Змішує воду і подрібнений титан, щоб виробити кріогенну рідину.
|
block.cryofluid-mixer.description = Змішує воду й подрібнений титан, щоби виробити кріогенну рідину.
|
||||||
block.blast-mixer.description = Виробляє вибухову суміш з піратиту і спорових стручків.
|
block.blast-mixer.description = Виробляє вибухову суміш із піратиту і спорових стручків.
|
||||||
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий пиротит.
|
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий пиротит.
|
||||||
block.melter.description = Розплавляє брухт у шлак.
|
block.melter.description = Розплавляє брухт у шлак.
|
||||||
block.separator.description = Відокремлює шлак на його мінеральні компоненти.
|
block.separator.description = Відокремлює шлак на його мінеральні компоненти.
|
||||||
@@ -1311,21 +1290,21 @@ block.copper-wall.description = Захищає споруди від ворож
|
|||||||
block.copper-wall-large.description = Захищає споруди від ворожих снарядів.
|
block.copper-wall-large.description = Захищає споруди від ворожих снарядів.
|
||||||
block.titanium-wall.description = Захищає споруди від ворожих снарядів.
|
block.titanium-wall.description = Захищає споруди від ворожих снарядів.
|
||||||
block.titanium-wall-large.description = Захищає споруди від ворожих снарядів.
|
block.titanium-wall-large.description = Захищає споруди від ворожих снарядів.
|
||||||
block.plastanium-wall.description = Захищає споруди від ворожих снарядів. Поглинає електричні дуги і лазери. Блокує автоматичні з’єднання енергетичних вузлів.
|
block.plastanium-wall.description = Захищає споруди від ворожих снарядів. Поглинає електричні дуги й лазери. Блокує автоматичні з’єднання енергетичних вузлів.
|
||||||
block.plastanium-wall-large.description = Захищає споруди від ворожих снарядів. Поглинає електричні дуги і лазери. Блокує автоматичні з’єднання енергетичних вузлів.
|
block.plastanium-wall-large.description = Захищає споруди від ворожих снарядів. Поглинає електричні дуги й лазери. Блокує автоматичні з’єднання енергетичних вузлів.
|
||||||
block.thorium-wall.description = Захищає споруди від ворожих снарядів.
|
block.thorium-wall.description = Захищає споруди від ворожих снарядів.
|
||||||
block.thorium-wall-large.description = Захищає споруди від ворожих снарядів.
|
block.thorium-wall-large.description = Захищає споруди від ворожих снарядів.
|
||||||
block.phase-wall.description = Захищає споруди від ворожих снарядів, відбиває більшість куль при зіткненні.
|
block.phase-wall.description = Захищає споруди від ворожих снарядів, відбиває більшість куль у разі зіткненні.
|
||||||
block.phase-wall-large.description = Захищає споруди від ворожих снарядів, відбиває більшість куль при зіткненні.
|
block.phase-wall-large.description = Захищає споруди від ворожих снарядів, відбиває більшість куль у разі зіткненні.
|
||||||
block.surge-wall.description = Захищає споруди від ворожих снарядів, періодично випускає електричні дуги при зіткненні.
|
block.surge-wall.description = Захищає споруди від ворожих снарядів, періодично випускає електричні дуги в разі зіткненні.
|
||||||
block.surge-wall-large.description = Захищає споруди від ворожих снарядів, періодично випускає електричні дуги при зіткненні.
|
block.surge-wall-large.description = Захищає споруди від ворожих снарядів, періодично випускає електричні дуги в разі зіткненні.
|
||||||
block.door.description = Стіна, яку можна відкрити і закрити.
|
block.door.description = Стіна, яку можна відчинити й зачинити.
|
||||||
block.door-large.description = Стіна, яку можна відкрити і закрити.
|
block.door-large.description = Стіна, яку можна відчинити й зачинити.
|
||||||
block.mender.description = Періодично ремонтує блоки в своєму радіусі дії.\nЗа бажанням можна використати кремній задля підвищення радіусу дії й ефективності.
|
block.mender.description = Періодично ремонтує блоки у своєму радіусі дії.\nЗа бажанням можна використати кремній задля підвищення радіусу дії й ефективності.
|
||||||
block.mend-projector.description = Ремонтує блоки в своєму радіусі дії.\nЗа бажанням можна використати фазову тканину задля підвищення радіусу дії й ефективності.
|
block.mend-projector.description = Ремонтує блоки у своєму радіусі дії.\nЗа бажанням можна використати фазову тканину задля підвищення радіусу дії й ефективності.
|
||||||
block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням можна використати фазову тканину задля підвищення радіусу дії й ефективності.
|
block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням можна використати фазову тканину задля підвищення радіусу дії й ефективності.
|
||||||
block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
|
block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
|
||||||
block.shock-mine.description = Випускає електричні дуги при контакті з ворогом.
|
block.shock-mine.description = Випускає електричні дуги в разі контакту з ворогом.
|
||||||
block.conveyor.description = Переміщує елементи вперед.
|
block.conveyor.description = Переміщує елементи вперед.
|
||||||
block.titanium-conveyor.description = Переміщує предмети швидше, ніж звичайний конвеєр.
|
block.titanium-conveyor.description = Переміщує предмети швидше, ніж звичайний конвеєр.
|
||||||
block.plastanium-conveyor.description = Переміщує предмети партіями. Приймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. Потребує кілька точок завантаження та розвантаження для максимальної пропускної здатності.
|
block.plastanium-conveyor.description = Переміщує предмети партіями. Приймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. Потребує кілька точок завантаження та розвантаження для максимальної пропускної здатності.
|
||||||
@@ -1350,7 +1329,7 @@ block.liquid-router.description = Приймає рідини з одного н
|
|||||||
block.liquid-tank.description = Зберігає велику кількість рідини. Виводить воду на всі сторони, через це схожий на рідинний маршрутизатор.
|
block.liquid-tank.description = Зберігає велику кількість рідини. Виводить воду на всі сторони, через це схожий на рідинний маршрутизатор.
|
||||||
block.liquid-junction.description = Діє як міст для двох трубопроводів.
|
block.liquid-junction.description = Діє як міст для двох трубопроводів.
|
||||||
block.bridge-conduit.description = Транспортує рідину через місцевість і будівлі.
|
block.bridge-conduit.description = Транспортує рідину через місцевість і будівлі.
|
||||||
block.phase-conduit.description = Транспортує рідину через місцевість і будівлі. Діапазон дії більший ніж у мостового трубопровода
|
block.phase-conduit.description = Транспортує рідину через місцевість і будівлі. Діапазон дії більший ніж у мостового трубопроводу
|
||||||
block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них.
|
block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них.
|
||||||
block.power-node-large.description = Передовий вузол живлення з більшим радіусом дії.
|
block.power-node-large.description = Передовий вузол живлення з більшим радіусом дії.
|
||||||
block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії.
|
block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії.
|
||||||
@@ -1358,20 +1337,20 @@ block.diode.description = Живлення акумулятора може пр
|
|||||||
block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту.
|
block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту.
|
||||||
block.battery-large.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. Більша ємність ніж у звичайного акумулятора.
|
block.battery-large.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. Більша ємність ніж у звичайного акумулятора.
|
||||||
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, як-от вугілля.
|
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, як-от вугілля.
|
||||||
block.thermal-generator.description = Виробляє енергію при розміщенні в спекотних місцях.
|
block.thermal-generator.description = Виробляє енергію в разі розміщення в спекотних місцях.
|
||||||
block.steam-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали і перетворює воду в пару.
|
block.steam-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали й перетворює воду в пару.
|
||||||
block.differential-generator.description = Виробляє велику кількість енергії. Використовує різницю температур між кріогенною рідиною й пиротитом, що горить.
|
block.differential-generator.description = Виробляє велику кількість енергії. Використовує різницю температур між кріогенною рідиною й пиротитом, що горить.
|
||||||
block.rtg-generator.description = Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
|
block.rtg-generator.description = Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
|
||||||
block.solar-panel.description = Забезпечує невелику кількість енергії від сонця.
|
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 = Найкращий бур. Потребує великої кількості енергії.
|
||||||
block.water-extractor.description = Викачує підземні води. Використовується в місцях, де немає поверхневої води.
|
block.water-extractor.description = Викачує підземні води. Використовується в місцях, де немає поверхневої води.
|
||||||
block.cultivator.description = Культивує невеликі концентрації спор в стручки.
|
block.cultivator.description = Культивує невеликі концентрації спор у стручки.
|
||||||
block.cultivator.details = Відновлена технологія. Використовується для отримання величезної кількості біомаси якомога ефективніше. Ймовірно, початковий інкубатор спор, що зараз покриває Серпуло.
|
block.cultivator.details = Відновлена технологія. Використовується для отримання величезної кількості біомаси якомога ефективніше. Ймовірно, початковий інкубатор спор, що зараз покриває Серпуло.
|
||||||
block.oil-extractor.description = Використовується велика кількість енергії, піску та води для отримання нафти.
|
block.oil-extractor.description = Використовується велика кількість енергії, піску та води для отримання нафти.
|
||||||
block.core-shard.description = Ядро бази. Після знищення сектор втрачається. Найперша версія капсули ядра. Після його знищення всі контакти з регіоном втрачаються. Не допустіть цього.
|
block.core-shard.description = Ядро бази. Після знищення сектор втрачається. Найперша версія капсули ядра. Після його знищення всі контакти з регіоном втрачаються. Не допустіть цього.
|
||||||
@@ -1384,28 +1363,28 @@ block.vault.description = Зберігає велику кількість пр
|
|||||||
block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
|
block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
|
||||||
block.unloader.description = Вивантажує предмети з найближчих блоків
|
block.unloader.description = Вивантажує предмети з найближчих блоків
|
||||||
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра.
|
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра.
|
||||||
block.duo.description = Вистрілює по черзі кулями по ворогах.
|
block.duo.description = Вистрілює чергами куль у ворогів.
|
||||||
block.scatter.description = Вистрілює скупченням свинцю, брухту чи метаскла в повітряних противників.
|
block.scatter.description = Вистрілює скупченням свинцю, брухту чи метаскла в повітряних противників.
|
||||||
block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані.
|
block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані.
|
||||||
block.hail.description = Вистрілює невеликі снаряди в наземних ворогів на великі відстані.
|
block.hail.description = Вистрілює невеликі снаряди в наземних ворогів на великі відстані.
|
||||||
block.wave.description = Вистрілює потоки рідин в ворогів. Автоматично гасить пожежі при постачанні води.
|
block.wave.description = Вистрілює потоки рідин у ворогів. Автоматично гасить пожежі в разі постачання води.
|
||||||
block.lancer.description = Заряджає і вистрілює потужні пучки енергії в наземних противників.
|
block.lancer.description = Заряджає і вистрілює потужні пучки енергії в наземних противників.
|
||||||
block.arc.description = Вистрілює дугами електрики в наземних противників.
|
block.arc.description = Вистрілює дугами електрики в наземних противників.
|
||||||
block.swarmer.description = Запускає ракети, що автоматично наводяться у противників.
|
block.swarmer.description = Запускає ракети, що автоматично наводяться в противників.
|
||||||
block.salvo.description = Вистрілює швидкий залп куль у противника.
|
block.salvo.description = Вистрілює швидкий залп куль у противника.
|
||||||
block.fuse.description = Вистрілює трьома променями, що пронизують броню, у малому радіусі у противників.
|
block.fuse.description = Вистрілює трьома променями, що пронизують броню, у малому радіусі в противників.
|
||||||
block.ripple.description = Вистрілює скупченням снарядів у противників.
|
block.ripple.description = Вистрілює скупченням снарядів у противників.
|
||||||
block.cyclone.description = Підпалює вибухові грудки скупчення противників.
|
block.cyclone.description = Підпалює вибухові грудки скупчення противників.
|
||||||
block.spectre.description = Вистрілює великі бронебійні кулі у повітряні та наземні цілі.
|
block.spectre.description = Вистрілює великі бронебійні кулі в повітряні та наземні цілі.
|
||||||
block.meltdown.description = Заряджає і вистріляє лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
|
block.meltdown.description = Заряджає і вистрілює лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
|
||||||
block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію
|
block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію
|
||||||
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії.
|
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії.
|
||||||
block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних.
|
block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних.
|
||||||
block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх в процесі.
|
block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх у процесі.
|
||||||
block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі при постачанні води.
|
block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі в разі постачання води.
|
||||||
block.silicon-crucible.description = Очищує кремній від піску та вугілля, використовуючи пиратит як додаткове джерело тепла. Більш ефективний у жарких місцях.
|
block.silicon-crucible.description = Очищає кремній від піску та вугілля, використовуючи пиратит як додаткове джерело тепла. Більш ефективний у жарких місцях.
|
||||||
block.disassembler.description = Поділяє шлак на незначні кількості екзотичних мінеральних компонентів при низькій ефективності. Може виробляти торій.
|
block.disassembler.description = Поділяє шлак на незначні кількості екзотичних мінеральних компонентів за низькою ефективності. Може виробляти торій.
|
||||||
block.overdrive-dome.description = Збільшує швидкість найближчих будівль. Потребує фазову тканину і кремній.
|
block.overdrive-dome.description = Збільшує швидкість найближчих будівель. Потребує фазову тканину і кремній.
|
||||||
block.payload-conveyor.description = Переміщує великі вантажі, як-от одиниці з заводів.
|
block.payload-conveyor.description = Переміщує великі вантажі, як-от одиниці з заводів.
|
||||||
block.payload-router.description = Розділяє вантажі, що надходять, у 3 різні сторони.
|
block.payload-router.description = Розділяє вантажі, що надходять, у 3 різні сторони.
|
||||||
block.command-center.description = Контролює поведінку одиниць за допомогою декількох різних команд.
|
block.command-center.description = Контролює поведінку одиниць за допомогою декількох різних команд.
|
||||||
@@ -1416,45 +1395,45 @@ block.additive-reconstructor.description = Поліпшує введених о
|
|||||||
block.multiplicative-reconstructor.description = Поліпшує введених одиниць до третього рівня.
|
block.multiplicative-reconstructor.description = Поліпшує введених одиниць до третього рівня.
|
||||||
block.exponential-reconstructor.description = Поліпшує введених одиниць до четвертого рівня.
|
block.exponential-reconstructor.description = Поліпшує введених одиниць до четвертого рівня.
|
||||||
block.tetrative-reconstructor.description = Поліпшує введених одиниць до п’ятого і фінального рівня.
|
block.tetrative-reconstructor.description = Поліпшує введених одиниць до п’ятого і фінального рівня.
|
||||||
block.switch.description = Перемикач. Стан можна читати і контролювати за допомогою логічних процесорів.
|
block.switch.description = Перемикач. Стан можна читати й контролювати за допомогою логічних процесорів.
|
||||||
block.micro-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель.
|
block.micro-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель.
|
||||||
block.logic-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Мікропроцесор.
|
block.logic-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Мікропроцесор.
|
||||||
block.hyper-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Логічний процесор
|
block.hyper-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Логічний процесор
|
||||||
block.memory-cell.description = Зберігає інформацію для логічного процесора.
|
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 = Велика електромагнітна башта-рейкотрон. Прискорює ядра, щоби подолати планетне тяжіння для міжпланетного розгортання.
|
||||||
unit.dagger.description = Вистрілює стандартними кулями по найближчих ворогах.
|
unit.dagger.description = Вистрілює стандартними кулями в найближчих ворогах.
|
||||||
unit.mace.description = Вистрілює потоками полум'я у найближчих ворогів.
|
unit.mace.description = Вистрілює потоками полум’я в найближчих ворогів.
|
||||||
unit.fortress.description = Вистрілює з дальнобійної артилерії по наземних цілях.
|
unit.fortress.description = Вистрілює з дальнобійної артилерії в наземних цілей.
|
||||||
unit.scepter.description = Вистрілює шквалом заряджених куль у найближчих ворогів.
|
unit.scepter.description = Вистрілює шквалом заряджених куль у найближчих ворогів.
|
||||||
unit.reign.description = Вистрілює шквалом масивних пронизливих куль по найближчих ворогах.
|
unit.reign.description = Вистрілює шквалом масивних пронизливих куль у найближчих ворогів.
|
||||||
unit.nova.description = Вистрілює лазерними болтами, які пошкоджують ворогів та відновлюють союзні споруди. Здатний до польоту.
|
unit.nova.description = Вистрілює лазерними болтами, які пошкоджують ворогів та відновлюють союзні споруди. Здатний до польоту.
|
||||||
unit.pulsar.description = Випускає дуги електрики, які завдають шкоди ворогам та відновлюють союзні споруди. Здатний до польоту.
|
unit.pulsar.description = Випускає дуги електрики, які завдають шкоди ворогам та відновлюють союзні споруди. Здатний до польоту.
|
||||||
unit.quasar.description = Вистрілює пробивними лазерними промені, які пошкоджують ворогів та відновлюють споріднені конструкції. Здатний до польоту. Захищений.
|
unit.quasar.description = Вистрілює пробивними лазерними промені, які пошкоджують ворогів та відновлюють споріднені конструкції. Здатний до польоту. Захищений.
|
||||||
unit.vela.description = Вистрілює масивним безперервним лазерним промінем, який завдає шкоди ворогам, спричиняє пожежі та відновлює союзні споруди. Здатний до польоту.
|
unit.vela.description = Вистрілює масивним безперервним лазерним променем, який завдає шкоди ворогам, спричиняє пожежі та відновлює союзні споруди. Здатний до польоту.
|
||||||
unit.corvus.description = Спричиняє масивний лазерний вибух, який завдає шкоди ворогам та відновлює споріднені споруди. Може переступати через більшість місцевості.
|
unit.corvus.description = Спричиняє масивний лазерний вибух, який завдає шкоди ворогам та відновлює споріднені споруди. Може переступати через більшість місцевості.
|
||||||
unit.crawler.description = Біжить до ворогів і самознищується, викликаючи великий вибух.
|
unit.crawler.description = Біжить до ворогів і самознищується, викликаючи великий вибух.
|
||||||
unit.atrax.description = Випалює виснажливі шари шлаку в наземних цілях. Може переступити більшість місцевості.
|
unit.atrax.description = Випалює виснажливі шари шлаку в наземних цілях. Може переступити більшість місцевості.
|
||||||
unit.spiroct.description = Вистрілює виснажливими лазерними променями у ворогів, відновлюючись при цьому. Може переступати через більшість місцевості.
|
unit.spiroct.description = Вистрілює виснажливими лазерними променями у ворогів, відновлюючись водночас. Може переступати через більшість місцевості.
|
||||||
unit.arkyid.description = Вистрілює у ворогів великими виснажливими лазерними променями, відновлюючись при цьому.
|
unit.arkyid.description = Вистрілює у ворогів великими виснажливими лазерними променями, відновлюючись при цьому.
|
||||||
unit.toxopid.description = Вистрілює у ворогів великими електричними касетними снарядами та пробивними лазерами. Може переступати через більшість місцевості.
|
unit.toxopid.description = Вистрілює у ворогів великими електричними касетними снарядами та пробивними лазерами. Може переступати через більшість місцевості.
|
||||||
unit.flare.description = Вистрілює стандартними кулями в найближчі цілі.
|
unit.flare.description = Вистрілює стандартними кулями в найближчі цілі.
|
||||||
unit.horizon.description = Кидає купу бомб на наземні цілі.
|
unit.horizon.description = Кидає купу бомб на наземні цілі.
|
||||||
unit.zenith.description = Вистрілює залпи ракет по всіх найближчих ворогів.
|
unit.zenith.description = Вистрілює залпи ракет у всіх найближчих ворогів.
|
||||||
unit.antumbra.description = Вистрілює шквал куль у всіх найближчих ворогів.
|
unit.antumbra.description = Вистрілює шквал куль у всіх найближчих ворогів.
|
||||||
unit.eclipse.description = Вистрілює два пронизливі лазери та шквал луски по всіх найближчих ворогах.
|
unit.eclipse.description = Вистрілює двома пронизливими лазерами та шквалом куль у всіх найближчих ворогів.
|
||||||
unit.mono.description = Автоматично видобуває мідь і свинець і кладе їх в ядро.
|
unit.mono.description = Автоматично видобуває мідь і свинець і кладе їх у ядро.
|
||||||
unit.poly.description = Автоматично перебудовує зруйновані споруди та допомагає іншим одиницям у будівництві.
|
unit.poly.description = Автоматично перебудовує зруйновані споруди та допомагає іншим одиницям у будівництві.
|
||||||
unit.mega.description = Автоматично відновлює пошкоджені конструкції. Здатний нести блоки та невеликі наземні блоки.
|
unit.mega.description = Автоматично відновлює пошкоджені конструкції. Здатний нести блоки та невеликі наземні блоки.
|
||||||
unit.quad.description = Кидає великі бомби на наземні цілі, відновлюючи союзні споруди та завдаючи шкоди ворогам. Здатний нести середні наземні одиниці.
|
unit.quad.description = Кидає великі бомби на наземні цілі, відновлюючи союзні споруди та завдаючи шкоди ворогам. Здатний нести середні наземні одиниці.
|
||||||
unit.oct.description = Захищає найближчих союзників своїм відновлювальним щитом. Здатний нести більшість наземних одиниць.
|
unit.oct.description = Захищає найближчих союзників своїм відновлювальним щитом. Здатний нести більшість наземних одиниць.
|
||||||
unit.risso.description = Вистрілює шквалом ракет і куль по всіх найближчих ворогах.
|
unit.risso.description = Вистрілює шквалом ракет і куль по всіх найближчих ворогах.
|
||||||
unit.minke.description = Вистрілює запальними снарядами та стандартнами кулями по найближчих наземних цілях.
|
unit.minke.description = Вистрілює запальними снарядами та стандартними кулями по найближчих наземних цілях.
|
||||||
unit.bryde.description = Вистрілює по ворогам артилерійськими снарядами та ракетами великої дальності.
|
unit.bryde.description = Вистрілює у ворогів артилерійськими снарядами та ракетами великої дальності.
|
||||||
unit.sei.description = Вистрілює по ворогам шквалом ракет і бронебійних куль.
|
unit.sei.description = Вистрілює у ворогів шквалом ракет і бронебійних куль.
|
||||||
unit.omura.description = Вистрілює по ворогах дальнобійним болтом, що пробиває броню. Виробляє повітряних Фальшфеєрів.
|
unit.omura.description = Вистрілює у ворогів далекобійним болтом, що пробиває броню. Виробляє повітряних Фальшфеєрів.
|
||||||
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
|
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
|
||||||
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
|
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
|
||||||
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
|
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
|
||||||
|
|||||||
1490
core/assets/bundles/bundle_vi.properties
Normal file
1490
core/assets/bundles/bundle_vi.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -93,6 +93,8 @@ sk7725
|
|||||||
The Slaylord
|
The Slaylord
|
||||||
ThePlayerA
|
ThePlayerA
|
||||||
YellOw139
|
YellOw139
|
||||||
|
NgLamVN
|
||||||
|
JINODK
|
||||||
PetrGasparik
|
PetrGasparik
|
||||||
LeoDog896
|
LeoDog896
|
||||||
Summet
|
Summet
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public class Liquids implements ContentList{
|
|||||||
|
|
||||||
water = new Liquid("water", Color.valueOf("596ab8")){{
|
water = new Liquid("water", Color.valueOf("596ab8")){{
|
||||||
heatCapacity = 0.4f;
|
heatCapacity = 0.4f;
|
||||||
|
alwaysUnlocked = true;
|
||||||
effect = StatusEffects.wet;
|
effect = StatusEffects.wet;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,7 @@ public class TechTree implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
node(kiln, Seq.with(new SectorComplete(craters)), () -> {
|
node(kiln, Seq.with(new SectorComplete(craters)), () -> {
|
||||||
|
node(pulverizer, () -> {
|
||||||
node(incinerator, () -> {
|
node(incinerator, () -> {
|
||||||
node(melter, () -> {
|
node(melter, () -> {
|
||||||
node(surgeSmelter, () -> {
|
node(surgeSmelter, () -> {
|
||||||
@@ -161,12 +162,10 @@ public class TechTree implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
node(separator, () -> {
|
node(separator, () -> {
|
||||||
node(pulverizer, () -> {
|
|
||||||
node(disassembler, () -> {
|
node(disassembler, () -> {
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
node(cryofluidMixer, () -> {
|
node(cryofluidMixer, () -> {
|
||||||
|
|
||||||
@@ -174,6 +173,7 @@ public class TechTree implements ContentList{
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
node(microProcessor, () -> {
|
node(microProcessor, () -> {
|
||||||
node(switchBlock, () -> {
|
node(switchBlock, () -> {
|
||||||
@@ -714,8 +714,14 @@ public class TechTree implements ContentList{
|
|||||||
finishedRequirements[i] = new ItemStack(requirements[i].item, Core.settings == null ? 0 : Core.settings.getInt("req-" + content.name + "-" + requirements[i].item.name));
|
finishedRequirements[i] = new ItemStack(requirements[i].item, Core.settings == null ? 0 : Core.settings.getInt("req-" + content.name + "-" + requirements[i].item.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var used = new ObjectSet<Content>();
|
||||||
|
|
||||||
//add dependencies as objectives.
|
//add dependencies as objectives.
|
||||||
content.getDependencies(d -> objectives.add(new Research(d)));
|
content.getDependencies(d -> {
|
||||||
|
if(used.add(d)){
|
||||||
|
objectives.add(new Research(d));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
map.put(content, this);
|
map.put(content, this);
|
||||||
all.add(this);
|
all.add(this);
|
||||||
|
|||||||
@@ -1624,7 +1624,7 @@ public class UnitTypes implements ContentList{
|
|||||||
xRand = 8f;
|
xRand = 8f;
|
||||||
shotDelay = 1f;
|
shotDelay = 1f;
|
||||||
|
|
||||||
bullet = new MissileBulletType(4.2f, 40){{
|
bullet = new MissileBulletType(4.2f, 42){{
|
||||||
homingPower = 0.12f;
|
homingPower = 0.12f;
|
||||||
width = 8f;
|
width = 8f;
|
||||||
height = 8f;
|
height = 8f;
|
||||||
@@ -1634,7 +1634,7 @@ public class UnitTypes implements ContentList{
|
|||||||
keepVelocity = false;
|
keepVelocity = false;
|
||||||
splashDamageRadius = 35f;
|
splashDamageRadius = 35f;
|
||||||
splashDamage = 45f;
|
splashDamage = 45f;
|
||||||
lifetime = 56f;
|
lifetime = 62f;
|
||||||
trailColor = Pal.bulletYellowBack;
|
trailColor = Pal.bulletYellowBack;
|
||||||
backColor = Pal.bulletYellowBack;
|
backColor = Pal.bulletYellowBack;
|
||||||
frontColor = Pal.bulletYellow;
|
frontColor = Pal.bulletYellow;
|
||||||
@@ -1662,11 +1662,11 @@ public class UnitTypes implements ContentList{
|
|||||||
shots = 3;
|
shots = 3;
|
||||||
shotDelay = 4f;
|
shotDelay = 4f;
|
||||||
inaccuracy = 1f;
|
inaccuracy = 1f;
|
||||||
bullet = new BasicBulletType(7f, 55){{
|
bullet = new BasicBulletType(7f, 57){{
|
||||||
width = 13f;
|
width = 13f;
|
||||||
height = 19f;
|
height = 19f;
|
||||||
shootEffect = Fx.shootBig;
|
shootEffect = Fx.shootBig;
|
||||||
lifetime = 30f;
|
lifetime = 35f;
|
||||||
}};
|
}};
|
||||||
}});
|
}});
|
||||||
}};
|
}};
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ public class Weathers implements ContentList{
|
|||||||
attrs.set(Attribute.spores, 1f);
|
attrs.set(Attribute.spores, 1f);
|
||||||
attrs.set(Attribute.light, -0.15f);
|
attrs.set(Attribute.light, -0.15f);
|
||||||
status = StatusEffects.sporeSlowed;
|
status = StatusEffects.sporeSlowed;
|
||||||
opacityMultiplier = 0.75f;
|
opacityMultiplier = 0.5f;
|
||||||
force = 0.1f;
|
force = 0.1f;
|
||||||
sound = Sounds.wind;
|
sound = Sounds.wind;
|
||||||
soundVol = 0.7f;
|
soundVol = 0.7f;
|
||||||
|
|||||||
@@ -10,21 +10,22 @@ import arc.scene.style.*;
|
|||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.*;
|
||||||
import mindustry.audio.*;
|
import mindustry.audio.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.content.TechTree.*;
|
import mindustry.content.TechTree.*;
|
||||||
import mindustry.core.GameState.*;
|
import mindustry.core.GameState.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
|
||||||
import mindustry.game.Objectives.*;
|
import mindustry.game.Objectives.*;
|
||||||
|
import mindustry.game.*;
|
||||||
import mindustry.game.Saves.*;
|
import mindustry.game.Saves.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
import mindustry.io.SaveIO.*;
|
import mindustry.io.SaveIO.*;
|
||||||
import mindustry.maps.*;
|
|
||||||
import mindustry.maps.Map;
|
import mindustry.maps.Map;
|
||||||
|
import mindustry.maps.*;
|
||||||
import mindustry.net.*;
|
import mindustry.net.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
@@ -506,6 +507,13 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
settings.put("fullscreen", !full);
|
settings.put("fullscreen", !full);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Float.isNaN(Vars.player.x) || Float.isNaN(Vars.player.y)){
|
||||||
|
player.set(0, 0);
|
||||||
|
if(!player.dead()) player.unit().kill();
|
||||||
|
}
|
||||||
|
if(Float.isNaN(camera.position.x)) camera.position.x = world.unitWidth()/2f;
|
||||||
|
if(Float.isNaN(camera.position.y)) camera.position.y = world.unitHeight()/2f;
|
||||||
|
|
||||||
if(state.isGame()){
|
if(state.isGame()){
|
||||||
input.update();
|
input.update();
|
||||||
|
|
||||||
|
|||||||
@@ -705,9 +705,9 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
@Remote(targets = Loc.client, called = Loc.server)
|
@Remote(targets = Loc.client, called = Loc.server)
|
||||||
public static void adminRequest(Player player, Player other, AdminAction action){
|
public static void adminRequest(Player player, Player other, AdminAction action){
|
||||||
if(!player.admin){
|
if(!player.admin && !player.isLocal()){
|
||||||
warn("ACCESS DENIED: Player @ / @ attempted to perform admin action '@' on '@' without proper security access.",
|
warn("ACCESS DENIED: Player @ / @ attempted to perform admin action '@' on '@' without proper security access.",
|
||||||
player.name, player.con.address, action.name(), other == null ? null : other.name);
|
player.name, player.con == null ? "null" : player.con.address, action.name(), other == null ? null : other.name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,12 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
Core.scene = new Scene();
|
Core.scene = new Scene();
|
||||||
Core.input.addProcessor(Core.scene);
|
Core.input.addProcessor(Core.scene);
|
||||||
|
|
||||||
|
int[] insets = Core.graphics.getSafeInsets();
|
||||||
|
Core.scene.marginLeft = insets[0];
|
||||||
|
Core.scene.marginRight = insets[1];
|
||||||
|
Core.scene.marginTop = insets[2];
|
||||||
|
Core.scene.marginBottom = insets[3];
|
||||||
|
|
||||||
Tex.load();
|
Tex.load();
|
||||||
Icon.load();
|
Icon.load();
|
||||||
Styles.load();
|
Styles.load();
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import arc.graphics.g2d.*;
|
|||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
|
import mindustry.content.*;
|
||||||
|
import mindustry.content.TechTree.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
@@ -42,6 +44,11 @@ public abstract class UnlockableContent extends MappableContent{
|
|||||||
this.unlocked = Core.settings != null && Core.settings.getBool(this.name + "-unlocked", false);
|
this.unlocked = Core.settings != null && Core.settings.getBool(this.name + "-unlocked", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return the tech node for this content. may be null. */
|
||||||
|
public @Nullable TechNode node(){
|
||||||
|
return TechTree.get(this);
|
||||||
|
}
|
||||||
|
|
||||||
public String displayDescription(){
|
public String displayDescription(){
|
||||||
return minfo.mod == null ? description : description + "\n" + Core.bundle.format("mod.display", minfo.mod.meta.displayName());
|
return minfo.mod == null ? description : description + "\n" + Core.bundle.format("mod.display", minfo.mod.meta.displayName());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ public abstract class BulletType extends Content{
|
|||||||
bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier();
|
bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier();
|
||||||
bullet.add();
|
bullet.add();
|
||||||
|
|
||||||
if(keepVelocity && owner instanceof Velc) bullet.vel.add(((Velc)owner).vel().x, ((Velc)owner).vel().y);
|
if(keepVelocity && owner instanceof Velc v) bullet.vel.add(v.vel().x, v.vel().y);
|
||||||
return bullet;
|
return bullet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,6 +357,7 @@ public abstract class BulletType extends Content{
|
|||||||
|
|
||||||
@Remote(called = Loc.server, unreliable = true)
|
@Remote(called = Loc.server, unreliable = true)
|
||||||
public static void createBullet(BulletType type, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl){
|
public static void createBullet(BulletType type, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl){
|
||||||
|
if(type == null) return;
|
||||||
type.create(null, team, x, y, angle, damage, velocityScl, lifetimeScl, null);
|
type.create(null, team, x, y, angle, damage, velocityScl, lifetimeScl, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ public class ContinuousLaserBulletType extends BulletType{
|
|||||||
@Override
|
@Override
|
||||||
public float estimateDPS(){
|
public float estimateDPS(){
|
||||||
//assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method
|
//assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method
|
||||||
return damage * 100f / 5f;
|
//assume it pierces 3 blocks/units
|
||||||
|
return damage * 100f / 5f * 3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import mindustry.gen.*;
|
|||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
|
|
||||||
public class LaserBoltBulletType extends BasicBulletType{
|
public class LaserBoltBulletType extends BasicBulletType{
|
||||||
protected float height = 7f, width = 2f;
|
public float width = 2f, height = 7f;
|
||||||
|
|
||||||
public LaserBoltBulletType(float speed, float damage){
|
public LaserBoltBulletType(float speed, float damage){
|
||||||
super(speed, damage);
|
super(speed, damage);
|
||||||
|
|||||||
@@ -40,9 +40,10 @@ public class LaserBulletType extends BulletType{
|
|||||||
this(1f);
|
this(1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//assume it pierces at least 3 blocks
|
||||||
@Override
|
@Override
|
||||||
public float estimateDPS(){
|
public float estimateDPS(){
|
||||||
return super.estimateDPS() * 2f;
|
return super.estimateDPS() * 3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
|
|||||||
plans.removeFirst();
|
plans.removeFirst();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}else if(tile.team() != team){
|
}else if(tile.team() != team && tile.team() != Team.derelict){
|
||||||
plans.removeFirst();
|
plans.removeFirst();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
//region utility methods
|
//region utility methods
|
||||||
|
|
||||||
public void addPlan(boolean checkPrevious){
|
public void addPlan(boolean checkPrevious){
|
||||||
if(!block.rebuildable) return;
|
if(!block.rebuildable || (team == state.rules.defaultTeam && state.isCampaign() && !block.isVisible())) return;
|
||||||
|
|
||||||
if(self() instanceof ConstructBuild entity){
|
if(self() instanceof ConstructBuild entity){
|
||||||
//update block to reflect the fact that something was being constructed
|
//update block to reflect the fact that something was being constructed
|
||||||
@@ -929,7 +929,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
//null is of type void.class; anonymous classes use their superclass.
|
//null is of type void.class; anonymous classes use their superclass.
|
||||||
Class<?> type = value == null ? void.class : value.getClass().isAnonymousClass() || value.getClass().getSimpleName().startsWith("adapter") ? value.getClass().getSuperclass() : value.getClass();
|
Class<?> type = value == null ? void.class : value.getClass().isAnonymousClass() || value.getClass().getSimpleName().startsWith("adapter") ? value.getClass().getSuperclass() : value.getClass();
|
||||||
|
|
||||||
|
if(value instanceof Item) type = Item.class;
|
||||||
if(value instanceof Block) type = Block.class;
|
if(value instanceof Block) type = Block.class;
|
||||||
|
if(value instanceof Liquid) type = Liquid.class;
|
||||||
|
|
||||||
if(builder != null && builder.isPlayer()){
|
if(builder != null && builder.isPlayer()){
|
||||||
lastAccessed = builder.getPlayer().name;
|
lastAccessed = builder.getPlayer().name;
|
||||||
@@ -1097,8 +1099,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
public void displayBars(Table table){
|
public void displayBars(Table table){
|
||||||
for(Func<Building, Bar> bar : block.bars.list()){
|
for(Func<Building, Bar> bar : block.bars.list()){
|
||||||
|
//TODO fix conclusively
|
||||||
|
try{
|
||||||
table.add(bar.get(self())).growX();
|
table.add(bar.get(self())).growX();
|
||||||
table.row();
|
table.row();
|
||||||
|
}catch(ClassCastException e){
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,13 +68,12 @@ public class Schematics implements Loadable{
|
|||||||
shadowBuffer.dispose();
|
shadowBuffer.dispose();
|
||||||
if(errorTexture != null){
|
if(errorTexture != null){
|
||||||
errorTexture.dispose();
|
errorTexture.dispose();
|
||||||
|
errorTexture = null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Events.on(ClientLoadEvent.class, event -> {
|
Events.on(ClientLoadEvent.class, event -> {
|
||||||
Pixmap pixmap = Core.atlas.getPixmap("error").crop();
|
errorTexture = new Texture("sprites/error.png");
|
||||||
errorTexture = new Texture(pixmap);
|
|
||||||
pixmap.dispose();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class SectorInfo{
|
|||||||
public boolean shown = false;
|
public boolean shown = false;
|
||||||
|
|
||||||
/** Special variables for simulation. */
|
/** Special variables for simulation. */
|
||||||
public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope, bossHealth, bossDps;
|
public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope, bossHealth, bossDps, curEnemyHealth, curEnemyDps;
|
||||||
/** Wave where first boss shows up. */
|
/** Wave where first boss shows up. */
|
||||||
public int bossWave = -1;
|
public int bossWave = -1;
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import mindustry.type.*;
|
|||||||
import static mindustry.content.UnitTypes.*;
|
import static mindustry.content.UnitTypes.*;
|
||||||
|
|
||||||
public class Waves{
|
public class Waves{
|
||||||
public static final int waveVersion = 4;
|
public static final int waveVersion = 5;
|
||||||
|
|
||||||
private Seq<SpawnGroup> spawns;
|
private Seq<SpawnGroup> spawns;
|
||||||
|
|
||||||
@@ -277,7 +277,7 @@ public class Waves{
|
|||||||
int cap = 150;
|
int cap = 150;
|
||||||
|
|
||||||
float shieldStart = 30, shieldsPerWave = 20 + difficulty*30f;
|
float shieldStart = 30, shieldsPerWave = 20 + difficulty*30f;
|
||||||
float[] scaling = {1, 1.5f, 3f, 4f, 5f};
|
float[] scaling = {1, 2f, 3f, 4f, 5f};
|
||||||
|
|
||||||
Intc createProgression = start -> {
|
Intc createProgression = start -> {
|
||||||
//main sequence
|
//main sequence
|
||||||
|
|||||||
@@ -35,11 +35,18 @@ public class LoadRenderer implements Disposable{
|
|||||||
private Mesh mesh = MeshBuilder.buildHex(colorRed, 2, true, 1f);
|
private Mesh mesh = MeshBuilder.buildHex(colorRed, 2, true, 1f);
|
||||||
private Camera3D cam = new Camera3D();
|
private Camera3D cam = new Camera3D();
|
||||||
private int lastLength = -1;
|
private int lastLength = -1;
|
||||||
private FxProcessor fx = new FxProcessor(Format.rgba8888, 2, 2, false, true);
|
private FxProcessor fx;
|
||||||
private WindowedMean renderTimes = new WindowedMean(20);
|
private WindowedMean renderTimes = new WindowedMean(20);
|
||||||
private long lastFrameTime;
|
private long lastFrameTime;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
//some systems don't support rgba8888 w/ a stencil buffer
|
||||||
|
try{
|
||||||
|
fx = new FxProcessor(Format.rgba8888, 2, 2, false, true);
|
||||||
|
}catch(Exception e){
|
||||||
|
fx = new FxProcessor(Format.rgb565, 2, 2, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
//vignetting is probably too much
|
//vignetting is probably too much
|
||||||
//fx.addEffect(new VignettingFilter(false));
|
//fx.addEffect(new VignettingFilter(false));
|
||||||
fx.addEffect(new BloomFilter());
|
fx.addEffect(new BloomFilter());
|
||||||
|
|||||||
@@ -836,7 +836,6 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
if(type == null) return;
|
if(type == null) return;
|
||||||
|
|
||||||
boolean omni = unit.type.omniMovement;
|
boolean omni = unit.type.omniMovement;
|
||||||
boolean ground = unit.isGrounded();
|
|
||||||
boolean allowHealing = type.canHeal;
|
boolean allowHealing = type.canHeal;
|
||||||
boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team &&
|
boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team &&
|
||||||
((Building)target).damaged() && target.within(unit, type.range);
|
((Building)target).damaged() && target.within(unit, type.range);
|
||||||
|
|||||||
@@ -83,8 +83,9 @@ public class JsonIO{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Sector read(Json json, JsonValue jsonData, Class type){
|
public Sector read(Json json, JsonValue jsonData, Class type){
|
||||||
String[] split = jsonData.asString().split("-");
|
String name = jsonData.asString();
|
||||||
return Vars.content.<Planet>getByName(ContentType.planet, split[0]).sectors.get(Integer.parseInt(split[1]));
|
int idx = name.lastIndexOf('-');
|
||||||
|
return Vars.content.<Planet>getByName(ContentType.planet, name.substring(0, idx)).sectors.get(Integer.parseInt(name.substring(idx + 1)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ public class TypeIO{
|
|||||||
if(control instanceof Player p){
|
if(control instanceof Player p){
|
||||||
write.b(0);
|
write.b(0);
|
||||||
write.i(p.id);
|
write.i(p.id);
|
||||||
}else if(control instanceof FormationAI form){
|
}else if(control instanceof FormationAI form && form.leader != null){
|
||||||
write.b(1);
|
write.b(1);
|
||||||
write.i(form.leader.id);
|
write.i(form.leader.id);
|
||||||
}else if(control instanceof LogicAI logic && logic.controller != null){
|
}else if(control instanceof LogicAI logic && logic.controller != null){
|
||||||
|
|||||||
@@ -73,6 +73,11 @@ public class SectorDamage{
|
|||||||
enemyHealth += info.bossHealth;
|
enemyHealth += info.bossHealth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(i == waveBegin){
|
||||||
|
enemyDps += info.curEnemyDps;
|
||||||
|
enemyHealth += info.curEnemyHealth;
|
||||||
|
}
|
||||||
|
|
||||||
//happens due to certain regressions
|
//happens due to certain regressions
|
||||||
if(enemyHealth < 0 || enemyDps < 0) continue;
|
if(enemyHealth < 0 || enemyDps < 0) continue;
|
||||||
|
|
||||||
@@ -293,18 +298,19 @@ public class SectorDamage{
|
|||||||
//skip player
|
//skip player
|
||||||
if(unit.isPlayer()) continue;
|
if(unit.isPlayer()) continue;
|
||||||
|
|
||||||
if(unit.team == state.rules.defaultTeam){
|
|
||||||
//scale health based on armor - yes, this is inaccurate, but better than nothing
|
//scale health based on armor - yes, this is inaccurate, but better than nothing
|
||||||
float healthMult = 1f + Mathf.clamp(unit.armor / 20f);
|
float healthMult = 1f + Mathf.clamp(unit.armor / 20f);
|
||||||
|
|
||||||
|
if(unit.team == state.rules.defaultTeam){
|
||||||
sumHealth += unit.health*healthMult + unit.shield;
|
sumHealth += unit.health*healthMult + unit.shield;
|
||||||
sumDps += unit.type.dpsEstimate;
|
sumDps += unit.type.dpsEstimate;
|
||||||
if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){
|
if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){
|
||||||
sumRps += h.amount / h.reload * 60f;
|
sumRps += h.amount / h.reload * 60f;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
curEnemyDps += unit.type.dpsEstimate;
|
float bossMult = unit.isBoss() ? 3f : 1f;
|
||||||
curEnemyHealth += unit.health;
|
curEnemyDps += unit.type.dpsEstimate * unit.damageMultiplier() * bossMult;
|
||||||
|
curEnemyHealth += unit.health * healthMult * unit.healthMultiplier() * bossMult + unit.shield;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,12 +322,6 @@ public class SectorDamage{
|
|||||||
for(int wave = state.wave; wave < state.wave + 10; wave ++){
|
for(int wave = state.wave; wave < state.wave + 10; wave ++){
|
||||||
float sumWaveDps = 0f, sumWaveHealth = 0f;
|
float sumWaveDps = 0f, sumWaveHealth = 0f;
|
||||||
|
|
||||||
//first wave has to take into account current dps
|
|
||||||
if(wave == state.wave){
|
|
||||||
sumWaveDps += curEnemyDps;
|
|
||||||
sumWaveHealth += curEnemyHealth;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(SpawnGroup group : state.rules.spawns){
|
for(SpawnGroup group : state.rules.spawns){
|
||||||
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
||||||
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
||||||
@@ -340,7 +340,7 @@ public class SectorDamage{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(bossGroup != null){
|
if(bossGroup != null){
|
||||||
float bossMult = 1.1f;
|
float bossMult = 1.2f;
|
||||||
//calculate first boss appearaance
|
//calculate first boss appearaance
|
||||||
for(int wave = state.wave; wave < state.wave + 60; wave++){
|
for(int wave = state.wave; wave < state.wave + 60; wave++){
|
||||||
int spawned = bossGroup.getSpawned(wave - 1);
|
int spawned = bossGroup.getSpawned(wave - 1);
|
||||||
@@ -369,6 +369,11 @@ public class SectorDamage{
|
|||||||
info.sumDps = sumDps * 1.05f;
|
info.sumDps = sumDps * 1.05f;
|
||||||
info.sumRps = sumRps;
|
info.sumRps = sumRps;
|
||||||
|
|
||||||
|
float cmult = 1.5f;
|
||||||
|
|
||||||
|
info.curEnemyDps = curEnemyDps*cmult;
|
||||||
|
info.curEnemyHealth = curEnemyHealth*cmult;
|
||||||
|
|
||||||
info.wavesSurvived = getWavesSurvived(info);
|
info.wavesSurvived = getWavesSurvived(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ public class UnitType extends UnlockableContent{
|
|||||||
occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion;
|
occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion;
|
||||||
public TextureRegion[] wreckRegions;
|
public TextureRegion[] wreckRegions;
|
||||||
|
|
||||||
|
protected @Nullable ItemStack[] cachedRequirements;
|
||||||
|
|
||||||
public UnitType(String name){
|
public UnitType(String name){
|
||||||
super(name);
|
super(name);
|
||||||
|
|
||||||
@@ -193,6 +195,10 @@ public class UnitType extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(ItemStack stack : researchRequirements()){
|
||||||
|
cons.get(stack.item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -357,6 +363,10 @@ public class UnitType extends UnlockableContent{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack[] researchRequirements(){
|
public ItemStack[] researchRequirements(){
|
||||||
|
if(cachedRequirements != null){
|
||||||
|
return cachedRequirements;
|
||||||
|
}
|
||||||
|
|
||||||
ItemStack[] stacks = null;
|
ItemStack[] stacks = null;
|
||||||
|
|
||||||
//calculate costs based on reconstructors or factories found
|
//calculate costs based on reconstructors or factories found
|
||||||
@@ -377,6 +387,8 @@ public class UnitType extends UnlockableContent{
|
|||||||
out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50)));
|
out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cachedRequirements = out;
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.ui.dialogs;
|
package mindustry.ui.dialogs;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
|
import arc.Net.*;
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.input.*;
|
import arc.input.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
@@ -355,8 +356,9 @@ public class JoinDialog extends BaseDialog{
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Table[] groupTable = {null};
|
||||||
|
|
||||||
//table containing all groups
|
//table containing all groups
|
||||||
global.table(g -> {
|
|
||||||
for(String address : group.addresses){
|
for(String address : group.addresses){
|
||||||
String resaddress = address.contains(":") ? address.split(":")[0] : address;
|
String resaddress = address.contains(":") ? address.split(":")[0] : address;
|
||||||
int resport = address.contains(":") ? Strings.parseInt(address.split(":")[1]) : port;
|
int resport = address.contains(":") ? Strings.parseInt(address.split(":")[1]) : port;
|
||||||
@@ -365,8 +367,10 @@ public class JoinDialog extends BaseDialog{
|
|||||||
res.port = resport;
|
res.port = resport;
|
||||||
|
|
||||||
//add header
|
//add header
|
||||||
if(g.getChildren().isEmpty()){
|
if(groupTable[0] == null){
|
||||||
g.table(head -> {
|
global.table(t -> groupTable[0] = t).row();
|
||||||
|
|
||||||
|
groupTable[0].table(head -> {
|
||||||
if(!group.name.isEmpty()){
|
if(!group.name.isEmpty()){
|
||||||
head.add(group.name).color(Color.lightGray).padRight(4);
|
head.add(group.name).color(Color.lightGray).padRight(4);
|
||||||
}
|
}
|
||||||
@@ -378,20 +382,19 @@ public class JoinDialog extends BaseDialog{
|
|||||||
group.setHidden(!group.hidden());
|
group.setHidden(!group.hidden());
|
||||||
image[0].getStyle().imageUp = group.hidden() ? Icon.eyeOffSmall : Icon.eyeSmall;
|
image[0].getStyle().imageUp = group.hidden() ? Icon.eyeOffSmall : Icon.eyeSmall;
|
||||||
if(group.hidden() && !showHidden){
|
if(group.hidden() && !showHidden){
|
||||||
g.remove();
|
groupTable[0].remove();
|
||||||
}
|
}
|
||||||
}).size(40f).get();
|
}).size(40f).get();
|
||||||
image[0].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden")));
|
image[0].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden")));
|
||||||
}).width(targetWidth()).padBottom(-2).row();
|
}).width(targetWidth()).padBottom(-2).row();
|
||||||
}
|
}
|
||||||
|
|
||||||
addGlobalHost(res, g);
|
addGlobalHost(res, groupTable[0]);
|
||||||
|
|
||||||
g.margin(5f);
|
groupTable[0].margin(5f);
|
||||||
g.pack();
|
groupTable[0].pack();
|
||||||
}, e -> {});
|
}, e -> {});
|
||||||
}
|
}
|
||||||
}).row();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,7 +404,16 @@ public class JoinDialog extends BaseDialog{
|
|||||||
|
|
||||||
container.button(b -> buildServer(host, b), Styles.cleart, () -> {
|
container.button(b -> buildServer(host, b), Styles.cleart, () -> {
|
||||||
Events.fire(new ClientPreConnectEvent(host));
|
Events.fire(new ClientPreConnectEvent(host));
|
||||||
|
if(!Core.settings.getBool("server-disclaimer", false)){
|
||||||
|
ui.showCustomConfirm("@warning", "@servers.disclaimer", "@ok", "@back", () -> {
|
||||||
|
Core.settings.put("server-disclaimer", true);
|
||||||
safeConnect(host.address, host.port, host.version);
|
safeConnect(host.address, host.port, host.version);
|
||||||
|
}, () -> {
|
||||||
|
Core.settings.put("server-disclaimer", false);
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
safeConnect(host.address, host.port, host.version);
|
||||||
|
}
|
||||||
}).width(w).row();
|
}).width(w).row();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,9 +513,16 @@ public class JoinDialog extends BaseDialog{
|
|||||||
Core.settings.remove("server-list");
|
Core.settings.remove("server-list");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var url = becontrol.active() ? serverJsonBeURL : serverJsonV6URL;
|
||||||
|
Log.info("Fetching community servers at @", url);
|
||||||
|
|
||||||
//get servers
|
//get servers
|
||||||
Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> {
|
Core.net.httpGet(url, result -> {
|
||||||
try{
|
try{
|
||||||
|
if(result.getStatus() != HttpStatus.OK){
|
||||||
|
Log.warn("Failed to fetch community servers: @", result.getStatus());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Jval val = Jval.read(result.getResultAsString());
|
Jval val = Jval.read(result.getResultAsString());
|
||||||
Core.app.post(() -> {
|
Core.app.post(() -> {
|
||||||
@@ -519,8 +538,8 @@ public class JoinDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
defaultServers.add(new ServerGroup(name, addresses));
|
defaultServers.add(new ServerGroup(name, addresses));
|
||||||
});
|
});
|
||||||
Log.info("Fetched @ global servers.", defaultServers.size);
|
Log.info("Fetched @ community servers.", defaultServers.size);
|
||||||
}catch(Throwable ignored){
|
}catch(Throwable e){
|
||||||
Log.err("Failed to parse community servers.");
|
Log.err("Failed to parse community servers.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -15,8 +15,10 @@ import arc.scene.ui.layout.*;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
|
import mindustry.content.TechTree.*;
|
||||||
import mindustry.core.*;
|
import mindustry.core.*;
|
||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
|
import mindustry.game.Objectives.*;
|
||||||
import mindustry.game.SectorInfo.*;
|
import mindustry.game.SectorInfo.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -144,7 +146,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
//load legacy research
|
//load legacy research
|
||||||
if(Core.settings.has("unlocks") && !Core.settings.has("junction-unlocked")){
|
if(Core.settings.has("unlocks") && !Core.settings.has("junction-unlocked")){
|
||||||
Core.app.post(() -> {
|
Core.app.post(() -> {
|
||||||
ui.showCustomConfirm("@research", "@research.legacy", "@research.load", "@research.discard", LegacyIO::readResearch, () -> Core.settings.remove("unlocks"));
|
ui.showCustomConfirm("@research", "@research.legacy", "@research.load", "@research.discard", () -> {
|
||||||
|
LegacyIO.readResearch();
|
||||||
|
Core.settings.remove("unlocks");
|
||||||
|
}, () -> Core.settings.remove("unlocks"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,7 +255,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
boolean canSelect(Sector sector){
|
boolean canSelect(Sector sector){
|
||||||
if(mode == select) return sector.hasBase();
|
if(mode == select) return sector.hasBase();
|
||||||
//preset sectors can only be selected once unlocked
|
//preset sectors can only be selected once unlocked
|
||||||
if(sector.preset != null) return sector.preset.unlocked() || sector.hasBase();
|
if(sector.preset != null){
|
||||||
|
TechNode node = sector.preset.node();
|
||||||
|
return node == null || node.parent == null || node.parent.content.unlocked();
|
||||||
|
}
|
||||||
|
|
||||||
return sector.hasBase() || sector.near().contains(Sector::hasBase); //near an occupied sector
|
return sector.hasBase() || sector.near().contains(Sector::hasBase); //near an occupied sector
|
||||||
}
|
}
|
||||||
@@ -288,7 +296,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
|
|
||||||
Color color =
|
Color color =
|
||||||
sec.hasBase() ? Tmp.c2.set(Team.sharded.color).lerp(Team.crux.color, sec.hasEnemyBase() ? 0.5f : 0f) :
|
sec.hasBase() ? Tmp.c2.set(Team.sharded.color).lerp(Team.crux.color, sec.hasEnemyBase() ? 0.5f : 0f) :
|
||||||
sec.preset != null ? Tmp.c2.set(Team.derelict.color).lerp(Color.white, Mathf.absin(Time.time, 10f, 1f)) :
|
sec.preset != null ?
|
||||||
|
sec.preset.unlocked() ? Tmp.c2.set(Team.derelict.color).lerp(Color.white, Mathf.absin(Time.time, 10f, 1f)) :
|
||||||
|
Color.gray :
|
||||||
sec.hasEnemyBase() ? Team.crux.color :
|
sec.hasEnemyBase() ? Team.crux.color :
|
||||||
null;
|
null;
|
||||||
|
|
||||||
@@ -349,7 +359,12 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
for(Sector sec : planet.sectors){
|
for(Sector sec : planet.sectors){
|
||||||
if(sec != hovered){
|
if(sec != hovered){
|
||||||
var preficon = sec.icon();
|
var preficon = sec.icon();
|
||||||
var icon = (sec.isAttacked() ? Fonts.getLargeIcon("warning") : !sec.hasBase() && sec.preset != null && sec.preset.unlocked() && preficon == null ? Fonts.getLargeIcon("terrain") : preficon);
|
var icon =
|
||||||
|
sec.isAttacked() ? Fonts.getLargeIcon("warning") :
|
||||||
|
!sec.hasBase() && sec.preset != null && sec.preset.unlocked() && preficon == null ?
|
||||||
|
Fonts.getLargeIcon("terrain") :
|
||||||
|
sec.preset != null && sec.preset.locked() && sec.preset.node() != null && !sec.preset.node().parent.content.locked() ? Fonts.getLargeIcon("lock") :
|
||||||
|
preficon;
|
||||||
var color = sec.preset != null && !sec.hasBase() ? Team.derelict.color : Team.sharded.color;
|
var color = sec.preset != null && !sec.hasBase() ? Team.derelict.color : Team.sharded.color;
|
||||||
|
|
||||||
if(icon != null){
|
if(icon != null){
|
||||||
@@ -490,7 +505,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
hoverLabel.touchable = Touchable.disabled;
|
hoverLabel.touchable = Touchable.disabled;
|
||||||
|
|
||||||
Vec3 pos = planets.cam.project(Tmp.v31.set(hovered.tile.v).setLength(PlanetRenderer.outlineRad).rotate(Vec3.Y, -planets.planet.getRotation()).add(planets.planet.position));
|
Vec3 pos = planets.cam.project(Tmp.v31.set(hovered.tile.v).setLength(PlanetRenderer.outlineRad).rotate(Vec3.Y, -planets.planet.getRotation()).add(planets.planet.position));
|
||||||
hoverLabel.setPosition(pos.x, pos.y, Align.center);
|
hoverLabel.setPosition(pos.x, pos.y - Core.scene.marginBottom, Align.center);
|
||||||
|
|
||||||
hoverLabel.getText().setLength(0);
|
hoverLabel.getText().setLength(0);
|
||||||
if(hovered != null){
|
if(hovered != null){
|
||||||
@@ -687,7 +702,21 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
|
|
||||||
stable.image().color(Pal.accent).fillX().height(3f).pad(3f).row();
|
stable.image().color(Pal.accent).fillX().height(3f).pad(3f).row();
|
||||||
|
|
||||||
if(!sector.hasBase()){
|
boolean locked = sector.preset != null && sector.preset.locked() && sector.preset.node() != null;
|
||||||
|
|
||||||
|
if(locked){
|
||||||
|
stable.table(r -> {
|
||||||
|
r.add("@complete").colspan(2).left();
|
||||||
|
r.row();
|
||||||
|
for(Objective o : sector.preset.node().objectives){
|
||||||
|
if(o.complete()) continue;
|
||||||
|
|
||||||
|
r.add("> " + o.display()).color(Color.lightGray).left();
|
||||||
|
r.image(o.complete() ? Icon.ok : Icon.cancel, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3);
|
||||||
|
r.row();
|
||||||
|
}
|
||||||
|
}).row();
|
||||||
|
}else if(!sector.hasBase()){
|
||||||
stable.add(Core.bundle.get("sectors.threat") + " [accent]" + sector.displayThreat()).row();
|
stable.add(Core.bundle.get("sectors.threat") + " [accent]" + sector.displayThreat()).row();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -727,13 +756,23 @@ 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.isBeingPlayed() ? "@sectors.resume" : sector.hasBase() ? "@sectors.go" : "@sectors.launch", Icon.play, () -> {
|
stable.button(
|
||||||
|
mode == select ? "@sectors.select" :
|
||||||
|
sector.isBeingPlayed() ? "@sectors.resume" :
|
||||||
|
sector.hasBase() ? "@sectors.go" :
|
||||||
|
locked ? "@locked" : "@sectors.launch",
|
||||||
|
locked ? Icon.lock :Icon.play, () -> {
|
||||||
|
|
||||||
if(sector.isBeingPlayed()){
|
if(sector.isBeingPlayed()){
|
||||||
//already at this sector
|
//already at this sector
|
||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(sector.preset != null && sector.preset.locked()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
boolean shouldHide = true;
|
boolean shouldHide = true;
|
||||||
|
|
||||||
//save before launch.
|
//save before launch.
|
||||||
@@ -775,7 +814,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(shouldHide) hide();
|
if(shouldHide) hide();
|
||||||
}).growX().height(54f).minWidth(170f).padTop(4);
|
}).growX().height(54f).minWidth(170f).padTop(4).disabled(locked);
|
||||||
}
|
}
|
||||||
|
|
||||||
stable.pack();
|
stable.pack();
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ public class ChatFragment extends Table{
|
|||||||
Draw.color(shadowColor);
|
Draw.color(shadowColor);
|
||||||
|
|
||||||
if(shown){
|
if(shown){
|
||||||
Fill.crect(offsetx, chatfield.y, chatfield.getWidth() + 15f, chatfield.getHeight() - 1);
|
Fill.crect(offsetx, chatfield.y + scene.marginBottom, chatfield.getWidth() + 15f, chatfield.getHeight() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.draw();
|
super.draw();
|
||||||
@@ -137,7 +137,7 @@ public class ChatFragment extends Table{
|
|||||||
Draw.color(shadowColor);
|
Draw.color(shadowColor);
|
||||||
Draw.alpha(shadowColor.a * opacity);
|
Draw.alpha(shadowColor.a * opacity);
|
||||||
|
|
||||||
float theight = offsety + spacing + getMarginBottom();
|
float theight = offsety + spacing + getMarginBottom() + scene.marginBottom;
|
||||||
for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || shown); i++){
|
for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || shown); i++){
|
||||||
|
|
||||||
layout.setText(font, messages.get(i).formattedMessage, Color.white, textWidth, Align.bottomLeft, true);
|
layout.setText(font, messages.get(i).formattedMessage, Color.white, textWidth, Align.bottomLeft, true);
|
||||||
|
|||||||
@@ -162,6 +162,17 @@ public class HintsFragment extends Fragment{
|
|||||||
waveFire(() -> Groups.fire.size() > 0 && Blocks.wave.unlockedNow(), () -> indexer.getAllied(state.rules.defaultTeam, BlockFlag.extinguisher).size() > 0),
|
waveFire(() -> Groups.fire.size() > 0 && Blocks.wave.unlockedNow(), () -> indexer.getAllied(state.rules.defaultTeam, BlockFlag.extinguisher).size() > 0),
|
||||||
generator(() -> control.input.block == Blocks.combustionGenerator, () -> ui.hints.placedBlocks.contains(Blocks.combustionGenerator)),
|
generator(() -> control.input.block == Blocks.combustionGenerator, () -> ui.hints.placedBlocks.contains(Blocks.combustionGenerator)),
|
||||||
guardian(() -> state.boss() != null && state.boss().armor >= 4, () -> state.boss() == null),
|
guardian(() -> state.boss() != null && state.boss().armor >= 4, () -> state.boss() == null),
|
||||||
|
coreUpgrade(() -> state.isCampaign() && Blocks.coreFoundation.unlocked()
|
||||||
|
&& state.rules.defaultTeam.core() != null
|
||||||
|
&& state.rules.defaultTeam.core().block == Blocks.coreShard
|
||||||
|
&& state.rules.defaultTeam.core().items.has(Blocks.coreFoundation.requirements),
|
||||||
|
() -> ui.hints.placedBlocks.contains(Blocks.coreFoundation)),
|
||||||
|
presetLaunch(() -> state.isCampaign()
|
||||||
|
&& state.getSector().preset == null
|
||||||
|
&& SectorPresets.frozenForest.unlocked()
|
||||||
|
&& SectorPresets.frozenForest.sector.save == null,
|
||||||
|
() -> state.isCampaign() && state.getSector().preset == SectorPresets.frozenForest),
|
||||||
|
coreIncinerate(() -> state.isCampaign() && state.rules.defaultTeam.core() != null && state.rules.defaultTeam.core().items.get(Items.copper) >= state.rules.defaultTeam.core().storageCapacity - 10, () -> false),
|
||||||
;
|
;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package mindustry.ui.fragments;
|
package mindustry.ui.fragments;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
|
import arc.graphics.g2d.*;
|
||||||
import arc.scene.*;
|
import arc.scene.*;
|
||||||
import arc.scene.actions.*;
|
import arc.scene.actions.*;
|
||||||
import arc.scene.event.*;
|
import arc.scene.event.*;
|
||||||
@@ -18,7 +20,12 @@ public class LoadingFragment extends Fragment{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Group parent){
|
public void build(Group parent){
|
||||||
parent.fill(Styles.black8, t -> {
|
parent.fill(t -> {
|
||||||
|
//rect must fill screen completely.
|
||||||
|
t.rect((x, y, w, h) -> {
|
||||||
|
Draw.alpha(t.color.a);
|
||||||
|
Styles.black8.draw(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight());
|
||||||
|
});
|
||||||
t.visible = false;
|
t.visible = false;
|
||||||
t.touchable = Touchable.enabled;
|
t.touchable = Touchable.enabled;
|
||||||
t.add().height(133f).row();
|
t.add().height(133f).row();
|
||||||
|
|||||||
@@ -77,12 +77,13 @@ public class MenuFragment extends Fragment{
|
|||||||
String versionText = ((Version.build == -1) ? "[#fc8140aa]" : "[#ffffffba]") + Version.combined();
|
String versionText = ((Version.build == -1) ? "[#fc8140aa]" : "[#ffffffba]") + Version.combined();
|
||||||
parent.fill((x, y, w, h) -> {
|
parent.fill((x, y, w, h) -> {
|
||||||
TextureRegion logo = Core.atlas.find("logo");
|
TextureRegion logo = Core.atlas.find("logo");
|
||||||
|
float width = Core.graphics.getWidth(), height = Core.graphics.getHeight() - Core.scene.marginTop;
|
||||||
float logoscl = Scl.scl(1);
|
float logoscl = Scl.scl(1);
|
||||||
float logow = Math.min(logo.width * logoscl, Core.graphics.getWidth() - Scl.scl(20));
|
float logow = Math.min(logo.width * logoscl, Core.graphics.getWidth() - Scl.scl(20));
|
||||||
float logoh = logow * (float)logo.height / logo.width;
|
float logoh = logow * (float)logo.height / logo.width;
|
||||||
|
|
||||||
float fx = (int)(Core.graphics.getWidth() / 2f);
|
float fx = (int)(width / 2f);
|
||||||
float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? Scl.scl(30f) : 0f);
|
float fy = (int)(height - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? Scl.scl(30f) : 0f);
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.rect(logo, fx, fy, logow, logoh);
|
Draw.rect(logo, fx, fy, logow, logoh);
|
||||||
@@ -230,7 +231,7 @@ public class MenuFragment extends Fragment{
|
|||||||
submenu.clearChildren();
|
submenu.clearChildren();
|
||||||
fadeInMenu();
|
fadeInMenu();
|
||||||
//correctly offset the button
|
//correctly offset the button
|
||||||
submenu.add().height((Core.graphics.getHeight() - out[0].getY(Align.topLeft)) / Scl.scl(1f));
|
submenu.add().height((Core.graphics.getHeight() - Core.scene.marginTop - Core.scene.marginBottom - out[0].getY(Align.topLeft)) / Scl.scl(1f));
|
||||||
submenu.row();
|
submenu.row();
|
||||||
buttons(submenu, b.submenu);
|
buttons(submenu, b.submenu);
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class MinimapFragment extends Fragment{
|
|||||||
float size = baseSize * zoom * world.width();
|
float size = baseSize * zoom * world.width();
|
||||||
|
|
||||||
Draw.color(Color.black);
|
Draw.color(Color.black);
|
||||||
Fill.crect(x, y, w, h);
|
Fill.crect(0, 0, w, h);
|
||||||
|
|
||||||
if(renderer.minimap.getTexture() != null){
|
if(renderer.minimap.getTexture() != null){
|
||||||
Draw.color();
|
Draw.color();
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public class ScriptConsoleFragment extends Table{
|
|||||||
Draw.color(shadowColor);
|
Draw.color(shadowColor);
|
||||||
|
|
||||||
if(open){
|
if(open){
|
||||||
Fill.crect(offsetx, chatfield.y, chatfield.getWidth() + 15f, chatfield.getHeight() - 1);
|
Fill.crect(offsetx, chatfield.y + scene.marginBottom, chatfield.getWidth() + 15f, chatfield.getHeight() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.draw();
|
super.draw();
|
||||||
@@ -125,7 +125,7 @@ public class ScriptConsoleFragment extends Table{
|
|||||||
Draw.color(shadowColor);
|
Draw.color(shadowColor);
|
||||||
Draw.alpha(shadowColor.a * opacity);
|
Draw.alpha(shadowColor.a * opacity);
|
||||||
|
|
||||||
float theight = offsety + spacing + getMarginBottom();
|
float theight = offsety + spacing + getMarginBottom() + scene.marginBottom;
|
||||||
for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos; i++){
|
for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos; i++){
|
||||||
|
|
||||||
layout.setText(font, messages.get(i), Color.white, textWidth, Align.bottomLeft, true);
|
layout.setText(font, messages.get(i), Color.white, textWidth, Align.bottomLeft, true);
|
||||||
|
|||||||
@@ -193,6 +193,8 @@ public class Block extends UnlockableContent{
|
|||||||
public BuildVisibility buildVisibility = BuildVisibility.hidden;
|
public BuildVisibility buildVisibility = BuildVisibility.hidden;
|
||||||
/** Multiplier for speed of building this block. */
|
/** Multiplier for speed of building this block. */
|
||||||
public float buildCostMultiplier = 1f;
|
public float buildCostMultiplier = 1f;
|
||||||
|
/** Build completion at which deconstruction finishes. */
|
||||||
|
public float deconstructThreshold = 0f;
|
||||||
/** Multiplier for cost of research in tech tree. */
|
/** Multiplier for cost of research in tech tree. */
|
||||||
public float researchCostMultiplier = 1;
|
public float researchCostMultiplier = 1;
|
||||||
/** Whether this block has instant transfer.*/
|
/** Whether this block has instant transfer.*/
|
||||||
@@ -634,6 +636,8 @@ public class Block extends UnlockableContent{
|
|||||||
|
|
||||||
//also requires inputs
|
//also requires inputs
|
||||||
consumes.each(c -> {
|
consumes.each(c -> {
|
||||||
|
if(c.isOptional()) return;
|
||||||
|
|
||||||
if(c instanceof ConsumeItems i){
|
if(c instanceof ConsumeItems i){
|
||||||
for(ItemStack stack : i.items){
|
for(ItemStack stack : i.items){
|
||||||
cons.get(stack.item);
|
cons.get(stack.item);
|
||||||
|
|||||||
@@ -37,8 +37,12 @@ public class Build{
|
|||||||
Block previous = tile.block();
|
Block previous = tile.block();
|
||||||
Block sub = ConstructBlock.get(previous.size);
|
Block sub = ConstructBlock.get(previous.size);
|
||||||
|
|
||||||
|
Seq<Building> prevBuild = new Seq<>(1);
|
||||||
|
if(tile.build != null) prevBuild.add(tile.build);
|
||||||
|
|
||||||
tile.setBlock(sub, team, rotation);
|
tile.setBlock(sub, team, rotation);
|
||||||
tile.<ConstructBuild>bc().setDeconstruct(previous);
|
tile.<ConstructBuild>bc().setDeconstruct(previous);
|
||||||
|
tile.<ConstructBuild>bc().prevBuild = prevBuild;
|
||||||
tile.build.health = tile.build.maxHealth * prevPercent;
|
tile.build.health = tile.build.maxHealth * prevPercent;
|
||||||
if(unit != null && unit.isPlayer()) tile.build.lastAccessed = unit.getPlayer().name;
|
if(unit != null && unit.isPlayer()) tile.build.lastAccessed = unit.getPlayer().name;
|
||||||
|
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ public class ConstructBlock extends Block{
|
|||||||
|
|
||||||
progress = Mathf.clamp(progress - amount);
|
progress = Mathf.clamp(progress - amount);
|
||||||
|
|
||||||
if(progress <= 0 || state.rules.infiniteResources){
|
if(progress <= (previous == null ? 0 : previous.deconstructThreshold) || state.rules.infiniteResources){
|
||||||
if(lastBuilder == null) lastBuilder = builder;
|
if(lastBuilder == null) lastBuilder = builder;
|
||||||
Call.deconstructFinish(tile, this.cblock == null ? previous : this.cblock, lastBuilder);
|
Call.deconstructFinish(tile, this.cblock == null ? previous : this.cblock, lastBuilder);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -255,7 +255,7 @@ public class Conveyor extends Block implements Autotiler{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean pass(Item item){
|
public boolean pass(Item item){
|
||||||
if(next != null && next.team == team && next.acceptItem(this, item)){
|
if(item != null && next != null && next.team == team && next.acceptItem(this, item)){
|
||||||
next.handleItem(this, item);
|
next.handleItem(this, item);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ public class MassDriver extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptItem(Building source, Item item){
|
public boolean acceptItem(Building source, Item item){
|
||||||
//mass drivers that ouput only cannot accept items
|
//mass drivers that output only cannot accept items
|
||||||
return items.total() < itemCapacity && linkValid();
|
return items.total() < itemCapacity && linkValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,12 @@ public class Router extends Block{
|
|||||||
noUpdateDisabled = true;
|
noUpdateDisabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canReplace(Block other){
|
||||||
|
if(other.alwaysReplace) return true;
|
||||||
|
return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group && size >= other.size;
|
||||||
|
}
|
||||||
|
|
||||||
public class RouterBuild extends Building implements ControlBlock{
|
public class RouterBuild extends Building implements ControlBlock{
|
||||||
public Item lastItem;
|
public Item lastItem;
|
||||||
public Tile lastInput;
|
public Tile lastInput;
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ public class Boulder extends Block{
|
|||||||
super(name);
|
super(name);
|
||||||
breakable = true;
|
breakable = true;
|
||||||
alwaysReplace = true;
|
alwaysReplace = true;
|
||||||
|
|
||||||
|
deconstructThreshold = 0.35f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class BlockForge extends PayloadAcceptor{
|
|||||||
public void setBars(){
|
public void setBars(){
|
||||||
super.setBars();
|
super.setBars();
|
||||||
|
|
||||||
bars.add("progress", entity -> new Bar("bar.progress", Pal.ammo, () -> ((BlockForgeBuild)entity).progress));
|
bars.add("progress", (BlockForgeBuild entity) -> new Bar("bar.progress", Pal.ammo, () -> entity.recipe == null ? 0f : (float)(entity.progress / entity.recipe.buildCost)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -83,6 +83,7 @@ public class BlockForge extends PayloadAcceptor{
|
|||||||
if(progress >= recipe.buildCost){
|
if(progress >= recipe.buildCost){
|
||||||
consume();
|
consume();
|
||||||
payload = new BuildPayload(recipe, team);
|
payload = new BuildPayload(recipe, team);
|
||||||
|
payVector.setZero();
|
||||||
progress = 0f;
|
progress = 0f;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import java.util.zip.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class LogicBlock extends Block{
|
public class LogicBlock extends Block{
|
||||||
|
private static final int maxByteLen = 1024 * 500;
|
||||||
|
|
||||||
public int maxInstructionScale = 5;
|
public int maxInstructionScale = 5;
|
||||||
public int instructionsPerTick = 1;
|
public int instructionsPerTick = 1;
|
||||||
public float range = 8 * 10;
|
public float range = 8 * 10;
|
||||||
@@ -137,6 +139,9 @@ public class LogicBlock extends Block{
|
|||||||
stream.read();
|
stream.read();
|
||||||
|
|
||||||
int bytelen = stream.readInt();
|
int bytelen = stream.readInt();
|
||||||
|
|
||||||
|
if(bytelen > maxByteLen) throw new RuntimeException("Malformed logic data! Length: " + bytelen);
|
||||||
|
|
||||||
byte[] bytes = new byte[bytelen];
|
byte[] bytes = new byte[bytelen];
|
||||||
stream.readFully(bytes);
|
stream.readFully(bytes);
|
||||||
|
|
||||||
@@ -197,6 +202,7 @@ public class LogicBlock extends Block{
|
|||||||
int version = stream.read();
|
int version = stream.read();
|
||||||
|
|
||||||
int bytelen = stream.readInt();
|
int bytelen = stream.readInt();
|
||||||
|
if(bytelen > maxByteLen) throw new RuntimeException("Malformed logic data! Length: " + bytelen);
|
||||||
byte[] bytes = new byte[bytelen];
|
byte[] bytes = new byte[bytelen];
|
||||||
stream.readFully(bytes);
|
stream.readFully(bytes);
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,13 @@ public class Reconstructor extends UnitBlock{
|
|||||||
return capacities[item.id];
|
return capacities[item.id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void overwrote(Seq<Building> builds){
|
||||||
|
if(builds.first().block == block){
|
||||||
|
items.add(builds.first().items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
Draw.rect(region, x, y);
|
Draw.rect(region, x, y);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class DesktopLauncher extends ClientLauncher{
|
|||||||
new SdlApplication(new DesktopLauncher(arg), new SdlConfig(){{
|
new SdlApplication(new DesktopLauncher(arg), new SdlConfig(){{
|
||||||
title = "Mindustry";
|
title = "Mindustry";
|
||||||
maximized = true;
|
maximized = true;
|
||||||
stencil = 8;
|
stencil = 1;
|
||||||
width = 900;
|
width = 900;
|
||||||
height = 700;
|
height = 700;
|
||||||
setWindowIcon(FileType.internal, "icons/icon_64.png");
|
setWindowIcon(FileType.internal, "icons/icon_64.png");
|
||||||
|
|||||||
23
fastlane/metadata/android/en-US/changelogs/29736.txt
Normal file
23
fastlane/metadata/android/en-US/changelogs/29736.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
After more than 9 months of development, 6.0 is finally here. There have been far too many changes to reasonably list here, so I'll go over the highlights.
|
||||||
|
|
||||||
|
Units:
|
||||||
|
|
||||||
|
- The unit system has been completely reworked
|
||||||
|
- All unit sprites have been re-drawn and cleaned up
|
||||||
|
- Many new unit types have been added
|
||||||
|
- Player-specific pads and unit-specific factories have been removed
|
||||||
|
|
||||||
|
|
||||||
|
Campaign:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Maps:
|
||||||
|
|
||||||
23
fastlane/metadata/android/en-US/changelogs/29738.txt
Normal file
23
fastlane/metadata/android/en-US/changelogs/29738.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
After more than 9 months of development, 6.0 is finally here. There have been far too many changes to reasonably list here, so I'll go over the highlights.
|
||||||
|
|
||||||
|
Units:
|
||||||
|
|
||||||
|
- The unit system has been completely reworked
|
||||||
|
- All unit sprites have been re-drawn and cleaned up
|
||||||
|
- Many new unit types have been added
|
||||||
|
- Player-specific pads and unit-specific factories have been removed
|
||||||
|
|
||||||
|
|
||||||
|
Campaign:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Maps:
|
||||||
|
|
||||||
5
fastlane/metadata/android/en-US/changelogs/29741.txt
Normal file
5
fastlane/metadata/android/en-US/changelogs/29741.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
- Fixed two rare crashes
|
||||||
|
- Made units depend on their production materials in tech tree
|
||||||
|
- Made conveyors replaceable by distributors
|
||||||
|
- Translation updates
|
||||||
5
fastlane/metadata/android/en-US/changelogs/29744.txt
Normal file
5
fastlane/metadata/android/en-US/changelogs/29744.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
Yeah, it's another hotfix. I missed these during earlier testing.
|
||||||
|
|
||||||
|
- Fixed research deadlock caused by blocks requiring optional inputs as research
|
||||||
|
- Possible fix for "Unsupported combination of formats" startup error
|
||||||
8
fastlane/metadata/android/en-US/changelogs/29747.txt
Normal file
8
fastlane/metadata/android/en-US/changelogs/29747.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
- Added disclaimer for community servers
|
||||||
|
- Added hints concerning core upgrades and numbered sectors
|
||||||
|
- Decreased spore storm opacity
|
||||||
|
- Made items stay inside reconstructors when rebuilding (Contributed by @Quezler)
|
||||||
|
- Made early game procedural sectors slightly easier
|
||||||
|
- Fixed some blocks having duplicate research dependencies
|
||||||
|
- Fixed legacy research not being cleared after first import
|
||||||
@@ -56,21 +56,21 @@
|
|||||||
"NEW_ACHIEVEMENT_21_3_NAME" "Swarm"
|
"NEW_ACHIEVEMENT_21_3_NAME" "Swarm"
|
||||||
"NEW_ACHIEVEMENT_21_3_DESC" "Have 100 units active at once."
|
"NEW_ACHIEVEMENT_21_3_DESC" "Have 100 units active at once."
|
||||||
"NEW_ACHIEVEMENT_21_4_NAME" "Flock"
|
"NEW_ACHIEVEMENT_21_4_NAME" "Flock"
|
||||||
"NEW_ACHIEVEMENT_21_4_DESC" "Have 10 Phantom Poly drones active at once."
|
"NEW_ACHIEVEMENT_21_4_DESC" "Have 10 Poly drones active at once."
|
||||||
"NEW_ACHIEVEMENT_21_5_NAME" "Roboticist"
|
"NEW_ACHIEVEMENT_21_5_NAME" "Roboticist"
|
||||||
"NEW_ACHIEVEMENT_21_5_DESC" "Build every type of unit."
|
"NEW_ACHIEVEMENT_21_5_DESC" "Build every type of unit."
|
||||||
"NEW_ACHIEVEMENT_21_6_NAME" "Legions"
|
"NEW_ACHIEVEMENT_21_6_NAME" "Legions"
|
||||||
"NEW_ACHIEVEMENT_21_6_DESC" "Build 1000 units total."
|
"NEW_ACHIEVEMENT_21_6_DESC" "Build 1000 units total."
|
||||||
"NEW_ACHIEVEMENT_21_9_NAME" "You Should've Listened"
|
"NEW_ACHIEVEMENT_21_9_NAME" "You Should've Listened"
|
||||||
"NEW_ACHIEVEMENT_21_9_DESC" "Die in the drop point exclusion zone."
|
"NEW_ACHIEVEMENT_21_9_DESC" "Die in the drop point exclusion zone."
|
||||||
"NEW_ACHIEVEMENT_21_10_NAME" "There are naval units for that."
|
"NEW_ACHIEVEMENT_21_10_NAME" "There Are Naval Units For That"
|
||||||
"NEW_ACHIEVEMENT_21_10_DESC" "Drown."
|
"NEW_ACHIEVEMENT_21_10_DESC" "Drown."
|
||||||
"NEW_ACHIEVEMENT_21_11_NAME" "Collector"
|
"NEW_ACHIEVEMENT_21_11_NAME" "Collector"
|
||||||
"NEW_ACHIEVEMENT_21_11_DESC" "Fill the core to maximum capacity with every type of material."
|
"NEW_ACHIEVEMENT_21_11_DESC" "Fill the core to maximum capacity with every type of material."
|
||||||
"NEW_ACHIEVEMENT_21_12_NAME" "Crowd"
|
"NEW_ACHIEVEMENT_21_12_NAME" "Crowd"
|
||||||
"NEW_ACHIEVEMENT_21_12_DESC" "Host a server with 10 players on it."
|
"NEW_ACHIEVEMENT_21_12_DESC" "Host a server with 10 players on it."
|
||||||
"NEW_ACHIEVEMENT_21_13_NAME" "Invulnerable"
|
"NEW_ACHIEVEMENT_21_13_NAME" "Invulnerable"
|
||||||
"NEW_ACHIEVEMENT_21_13_DESC" "Build the Meltdown and, Spectre and Foreshadow.."
|
"NEW_ACHIEVEMENT_21_13_DESC" "Build the Meltdown, Spectre and Foreshadow."
|
||||||
"NEW_ACHIEVEMENT_21_14_NAME" "Liftoff"
|
"NEW_ACHIEVEMENT_21_14_NAME" "Liftoff"
|
||||||
"NEW_ACHIEVEMENT_21_14_DESC" "Use the Launch Pad."
|
"NEW_ACHIEVEMENT_21_14_DESC" "Use the Launch Pad."
|
||||||
"NEW_ACHIEVEMENT_21_16_NAME" "Heresy"
|
"NEW_ACHIEVEMENT_21_16_NAME" "Heresy"
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
"NEW_ACHIEVEMENT_21_23_NAME" "Ignition"
|
"NEW_ACHIEVEMENT_21_23_NAME" "Ignition"
|
||||||
"NEW_ACHIEVEMENT_21_23_DESC" "Power up an Impact Reactor."
|
"NEW_ACHIEVEMENT_21_23_DESC" "Power up an Impact Reactor."
|
||||||
"NEW_ACHIEVEMENT_21_24_NAME" "Acceleration"
|
"NEW_ACHIEVEMENT_21_24_NAME" "Acceleration"
|
||||||
"NEW_ACHIEVEMENT_21_24_DESC" "Activate the Interplanteary Accelerator."
|
"NEW_ACHIEVEMENT_21_24_DESC" "Activate the Interplanetary Accelerator."
|
||||||
"NEW_ACHIEVEMENT_21_25_NAME" "The Spiral"
|
"NEW_ACHIEVEMENT_21_25_NAME" "The Spiral"
|
||||||
"NEW_ACHIEVEMENT_21_25_DESC" "Round and round it goes..."
|
"NEW_ACHIEVEMENT_21_25_DESC" "Round and round it goes..."
|
||||||
"NEW_ACHIEVEMENT_21_26_NAME" "Escalation"
|
"NEW_ACHIEVEMENT_21_26_NAME" "Escalation"
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
[list]
|
[list]
|
||||||
[*] 16 built in maps for custom games, in addition to campaign
|
[*] 16 built in maps for custom games, in addition to campaign
|
||||||
[*] Play Co-op, PvP or sandbox
|
[*] Play co-op, PvP or sandbox
|
||||||
[*] Join a public dedicated server, or invite friends to your own private session
|
[*] Join a public dedicated server, or invite friends to your own private session
|
||||||
[*] Customizable game rules: Change block costs, enemy stats, starting items, wave timing and more
|
[*] Customizable game rules: Change block costs, enemy stats, starting items, wave timing and more
|
||||||
[*] Mix & match gamemodes: Combine PvP and PvE gamemodes together
|
[*] Mix & match gamemodes: Combine PvP and PvE gamemodes together
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||||
archash=e13f9a192be0bad00766ff15a6bf7d2897ba00d1
|
archash=d44cbae08716cfe97012c84399a1e61854d6b16c
|
||||||
|
|||||||
12
servers.json
12
servers.json
@@ -17,18 +17,6 @@
|
|||||||
{
|
{
|
||||||
"address": "Mindustry.pl"
|
"address": "Mindustry.pl"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"address": "mindustry.io"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"address": "mindustry.io:1000"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"address": "mindustry.io:2000"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"address": "mindustry.io:3000"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"address": "aamindustry.play.ai"
|
"address": "aamindustry.play.ai"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,9 +5,6 @@
|
|||||||
{
|
{
|
||||||
"address": "nydustry.nydus.app:6060"
|
"address": "nydustry.nydus.app:6060"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"address": "md.surrealment.com"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"address": "routerchain.ddns.net:6568"
|
"address": "routerchain.ddns.net:6568"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "mindustry.pl",
|
"name": "mindustry.pl",
|
||||||
"address": ["mindustry.pl:6000", "mindustry.pl:6666"]
|
"address": ["mindustry.pl:6000", "mindustry.pl:6666", "91.134.217.10:6006"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "{AA}",
|
||||||
|
"address": ["aamindustry.play.ai", "aamindustry.play.ai:6571", "aamindustry.play.ai:6572", "aamindustry.play.ai:6573"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Atanner",
|
"name": "Atanner",
|
||||||
@@ -11,6 +15,10 @@
|
|||||||
"name": "C.A.M.S.",
|
"name": "C.A.M.S.",
|
||||||
"address": ["routerchain.ddns.net", "pandorum.su:8000"]
|
"address": ["routerchain.ddns.net", "pandorum.su:8000"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "io",
|
||||||
|
"address": ["mindustry.io", "mindustry.io:1000", "mindustry.io:2000", "mindustry.io:3000"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "ECAN",
|
"name": "ECAN",
|
||||||
"address": ["mindustry.ecansol.com:6597", "mindustry.ecansol.com:6499", "mindustry.ecansol.com:6599"]
|
"address": ["mindustry.ecansol.com:6597", "mindustry.ecansol.com:6499", "mindustry.ecansol.com:6599"]
|
||||||
@@ -30,5 +38,13 @@
|
|||||||
{
|
{
|
||||||
"name": "mindustry.ddns.net",
|
"name": "mindustry.ddns.net",
|
||||||
"address": ["mindustry.ddns.net:1000", "mindustry.ddns.net:2000", "mindustry.ddns.net:3000", "mindustry.ddns.net:4000"]
|
"address": ["mindustry.ddns.net:1000", "mindustry.ddns.net:2000", "mindustry.ddns.net:3000", "mindustry.ddns.net:4000"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Gearblock",
|
||||||
|
"address": ["attack.gearblock.app"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Surrealment",
|
||||||
|
"address": ["md.surrealment.com"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ public class ApplicationTests{
|
|||||||
add(netServer = new NetServer());
|
add(netServer = new NetServer());
|
||||||
|
|
||||||
content.init();
|
content.init();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,9 +78,15 @@ public class ApplicationTests{
|
|||||||
}
|
}
|
||||||
Thread.sleep(10);
|
Thread.sleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Block block = content.getByName(ContentType.block, "build2");
|
||||||
|
assertEquals("build2", block == null ? null : block.name, "2x2 construct block doesn't exist?");
|
||||||
}catch(Throwable r){
|
}catch(Throwable r){
|
||||||
fail(r);
|
fail(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.info("init app");
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
@@ -496,8 +503,8 @@ public class ApplicationTests{
|
|||||||
void buildingOverlap(){
|
void buildingOverlap(){
|
||||||
initBuilding();
|
initBuilding();
|
||||||
|
|
||||||
Builderc d1 = (Builderc)UnitTypes.poly.create(Team.sharded);
|
Unit d1 = UnitTypes.poly.create(Team.sharded);
|
||||||
Builderc d2 = (Builderc)UnitTypes.poly.create(Team.sharded);
|
Unit d2 = UnitTypes.poly.create(Team.sharded);
|
||||||
|
|
||||||
//infinite build range
|
//infinite build range
|
||||||
state.rules.editor = true;
|
state.rules.editor = true;
|
||||||
@@ -523,8 +530,8 @@ public class ApplicationTests{
|
|||||||
void buildingDestruction(){
|
void buildingDestruction(){
|
||||||
initBuilding();
|
initBuilding();
|
||||||
|
|
||||||
Builderc d1 = (Builderc)UnitTypes.poly.create(Team.sharded);
|
Builderc d1 = UnitTypes.poly.create(Team.sharded);
|
||||||
Builderc d2 = (Builderc)UnitTypes.poly.create(Team.sharded);
|
Builderc d2 = UnitTypes.poly.create(Team.sharded);
|
||||||
|
|
||||||
d1.set(10f, 20f);
|
d1.set(10f, 20f);
|
||||||
d2.set(10f, 20f);
|
d2.set(10f, 20f);
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{
|
|||||||
public void createGenerator(InputType inputType){
|
public void createGenerator(InputType inputType){
|
||||||
Vars.state = new GameState();
|
Vars.state = new GameState();
|
||||||
Vars.state.rules = new Rules();
|
Vars.state.rules = new Rules();
|
||||||
generator = new ItemLiquidGenerator(inputType != InputType.liquids, inputType != InputType.items, "fakegen"){
|
generator = new ItemLiquidGenerator(inputType != InputType.liquids, inputType != InputType.items, "fakegen" + System.nanoTime()){
|
||||||
{
|
{
|
||||||
powerProduction = 0.1f;
|
powerProduction = 0.1f;
|
||||||
itemDuration = fakeItemDuration;
|
itemDuration = fakeItemDuration;
|
||||||
|
|||||||
@@ -25,38 +25,46 @@ public class PowerTestFixture{
|
|||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
static void initializeDependencies(){
|
static void initializeDependencies(){
|
||||||
|
Log.info("init power test fixture");
|
||||||
headless = true;
|
headless = true;
|
||||||
Core.graphics = new FakeGraphics();
|
Core.graphics = new FakeGraphics();
|
||||||
Core.files = new MockFiles();
|
Core.files = new MockFiles();
|
||||||
|
|
||||||
|
boolean make = content == null;
|
||||||
|
|
||||||
|
if(make){
|
||||||
Vars.content = new ContentLoader(){
|
Vars.content = new ContentLoader(){
|
||||||
@Override
|
@Override
|
||||||
public void handleMappableContent(MappableContent content){
|
public void handleMappableContent(MappableContent content){
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
Vars.state = new GameState();
|
Vars.state = new GameState();
|
||||||
Vars.tree = new FileTree();
|
Vars.tree = new FileTree();
|
||||||
|
if(make){
|
||||||
content.createBaseContent();
|
content.createBaseContent();
|
||||||
|
}
|
||||||
Log.useColors = false;
|
Log.useColors = false;
|
||||||
Time.setDeltaProvider(() -> 0.5f);
|
Time.setDeltaProvider(() -> 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static PowerGenerator createFakeProducerBlock(float producedPower){
|
protected static PowerGenerator createFakeProducerBlock(float producedPower){
|
||||||
return new PowerGenerator("fakegen"){{
|
return new PowerGenerator("fakegen" + System.nanoTime()){{
|
||||||
buildType = () -> new GeneratorBuild();
|
buildType = () -> new GeneratorBuild();
|
||||||
powerProduction = producedPower;
|
powerProduction = producedPower;
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Battery createFakeBattery(float capacity){
|
protected static Battery createFakeBattery(float capacity){
|
||||||
return new Battery("fakebattery"){{
|
return new Battery("fakebattery" + System.nanoTime()){{
|
||||||
buildType = () -> new BatteryBuild();
|
buildType = () -> new BatteryBuild();
|
||||||
consumes.powerBuffered(capacity);
|
consumes.powerBuffered(capacity);
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Block createFakeDirectConsumer(float powerPerTick){
|
protected static Block createFakeDirectConsumer(float powerPerTick){
|
||||||
return new PowerBlock("fakedirectconsumer"){{
|
return new PowerBlock("fakedirectconsumer" + System.nanoTime()){{
|
||||||
buildType = Building::create;
|
buildType = Building::create;
|
||||||
consumes.power(powerPerTick);
|
consumes.power(powerPerTick);
|
||||||
}};
|
}};
|
||||||
|
|||||||
Reference in New Issue
Block a user