Compare commits

..

214 Commits
v130 ... v131

Author SHA1 Message Date
Anuken
edbe795aa5 Merge remote-tracking branch 'origin/master' 2021-09-12 20:21:59 -04:00
Anuken
087cd2c55a Cleanup 2021-09-12 20:21:55 -04:00
fuzzbuck
ca62deaaa9 Change io event server (#5981)
(offline at this time) will used for events & seasonal modes
2021-09-12 15:09:52 -04:00
JrTRinny
d33a4f9f87 More Target varieties for energy field ability (#5828)
* more targets for energy field ability

* group booleans
2021-09-12 14:55:26 -04:00
Shockwave
f64d078f29 Update bundle_zh_CN.properties (#5938)
* Update bundle_zh_CN.properties

1. Inherited from <https://github.com/Anuken/Mindustry/pull/5661>
2. Synced latest commit from English bundle.

* Update bundle_zh_CN.properties

Synced cliff support for editor

* Update bundle_zh_CN.properties

Minor optimization

* Update bundle_zh_CN.properties

Minor fix at line 349~

* Update bundle_zh_CN.properties

Synced recent update in English bundle. (Hide All and Show All)

* Update bundle_zh_CN.properties

1. Synced hint for high threat level sector
2. Unified the term "sector"
3. Minor fix on the half-width commas

* Update bundle_zh_CN.properties

Optimized key-pressing descriptions.

* Update bundle_zh_CN.properties

Restore line 934 to half-width comma

* Update bundle_zh_CN.properties

Synced name of new sectors.
2021-09-12 12:54:32 -04:00
RebornTrack970
da465c7786 TR Translate before release (#5980) 2021-09-12 11:34:03 -04:00
NickName73
9c12125e89 Update bundle_ru.properties (#5911) 2021-09-12 11:22:17 -04:00
Sharlotte
2a6d7c5a13 Update bundle_ko.properties (#5892)
* Update bundle_ko.properties

* Update bundle_ko.properties

* Update bundle_ko.properties

* Update bundle_ko.properties
2021-09-12 11:21:53 -04:00
YellOw139
71e38862b9 [Bundle][RO] Update (#5848)
* [Bundle][RO] Update

Changelog:

- New strings/changes up to commit 254284760f
- Typo fixes & various other improvements

* Update full_description.txt

* Update full_description.txt

* killing confusion

* Update bundle_ro.properties

* deep-tainted-water

* should do for now

* sector.name
2021-09-12 11:21:17 -04:00
彭瑞暄
b58a63b200 Update bundle_zh_TW.properties (#5860)
* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

minor correction
2021-09-12 11:21:09 -04:00
VizardAlpha
ee8b4f478d Updates bundle_fr.properties (#5931)
* Updates bundle_fr.properties

* Added rivers on Serpulo / Added deep tainted water

* Error correction

* More campaign map progress .. Added new commits

* Update bundle_fr.properties
2021-09-12 11:09:46 -04:00
JrTRinny
1941f22676 Update bundle_th.properties (#5908)
* Update bundle_th.properties

* Update bundle_th.properties

* Update bundle_th.properties

* more beautiful names

* Update bundle_th.properties
2021-09-12 11:09:40 -04:00
Anuken
35ffbef557 #5932 2021-09-12 11:07:18 -04:00
Anuken
24db94a55b No server category colors 2021-09-12 11:05:05 -04:00
Anuken
46bda97362 Merge remote-tracking branch 'origin/master' 2021-09-12 09:05:23 -04:00
Anuken
a1b9f7d1b3 Fixed #5979 2021-09-12 09:05:18 -04:00
Matthew Peng
32db058dbe Why is the smelter -top drawn between the flame circles? (#5817) 2021-09-11 18:47:30 -04:00
Anuken
2f7c5994a7 Fixed #5978 2021-09-11 15:43:24 -04:00
Anuken
2664bb84be Fixed #5974 2021-09-11 13:30:10 -04:00
Anuken
bdcfb7ab45 Merge remote-tracking branch 'origin/master' 2021-09-11 12:15:39 -04:00
Anuken
5cf47f4198 Clamp sector description in info 2021-09-11 12:15:34 -04:00
Darkness6030
515ee060d2 [RU] Sectors name translation (#5972)
С береговой линией все понятно. 
Но почему я выбрал "Прибрежная крепость"?
Все просто. "Naval" переводится как "Водяной", но "Водяная Крепость" - звучит *не очень*.
Нужен какой-то синоним. Я рассмотрел варианты "Морская", "Береговая", но в конце концов остановился на варианте "Прибрежная".

Если вы думаете иначе, предлагайте свой вариант перевода.
2021-09-11 10:20:57 -04:00
Anuken
90c2473448 Duct bridge crash fix 2021-09-11 10:07:00 -04:00
Anuken
c5a90759e5 Fixed #5971 / Fixed #5973 2021-09-11 08:45:17 -04:00
Anuken
cccce6badd Make Base AI walls correspond to tier 2021-09-10 21:11:57 -04:00
Anuken
decc570867 Slightly denser generated bases 2021-09-10 17:23:17 -04:00
Anuken
caa34c959e More campaign map progress 2021-09-10 17:07:06 -04:00
Anuken
b8fa15e546 Merge remote-tracking branch 'origin/master' 2021-09-10 16:33:30 -04:00
Anuken
47d5be679d Map progress 2021-09-10 16:33:26 -04:00
buthed010203
fc7f689ea4 Named pathfinder thread (#5969) 2021-09-10 15:56:42 -04:00
Anuken
7c028ffcb8 Experimental positional spawn support / WIP map 2021-09-10 13:56:12 -04:00
Anuken
10c3f9e44a River noise target field 2021-09-10 09:22:39 -04:00
Anuken
b2a634e5e7 Untested/WIP naval campaign map 2021-09-10 09:17:25 -04:00
Anuken
ae0a70703b Wave edit dialog cleanup 2021-09-09 22:25:08 -04:00
TranquillyUnpleasant
9076325fa1 Add a copy button to spawn groups (#5957)
* copy button

* rebuild groups on removal

* two factor sorting

* copy method for spawngroup

* implement Clonable

* revert to copy to call clone
2021-09-09 19:38:56 -04:00
Anuken
08d7390775 Merge remote-tracking branch 'origin/master' 2021-09-09 17:05:00 -04:00
Anuken
cbe188abab Map editor bugfixes / Re-added build noise 2021-09-09 17:04:55 -04:00
Matthew Peng
abbc25798d Pull trail updating out into its own method (#5964) 2021-09-09 15:47:08 -04:00
Anuken
a3ede6cf0b Merge remote-tracking branch 'origin/master' 2021-09-09 12:08:38 -04:00
Anuken
e997768a0a d 2021-09-09 12:08:33 -04:00
itcannotbe
671098cc28 Add Build Cost Multiplier to Distributor (#5967)
It just makes sense.
2021-09-09 11:16:47 -04:00
Anuken
1a686c44a1 Fixed editor crash 2021-09-09 09:59:35 -04:00
Anuken
9e737cd3fe Merge remote-tracking branch 'origin/master' 2021-09-08 20:44:31 -04:00
Anuken
deed84f9a3 Public power graph contents 2021-09-08 20:44:26 -04:00
Matthew Peng
868cd4fb0b Just because a generator doesn't have turbines doesn't mean it doesn't have liquid (#5962) 2021-09-08 20:40:56 -04:00
Anuken
a5697a7d4b Fixed mod alpha bleeding not applying correctly 2021-09-08 15:09:05 -04:00
Anuken
2222330b43 Added hint for high threat level sector 2021-09-08 11:23:37 -04:00
Anuken
cde192b59a Added Block#allowConfigInventory 2021-09-08 09:04:04 -04:00
Anuken
c98eb2edd7 Fixed #5958 2021-09-08 08:42:23 -04:00
Anuken
dd7062f0f7 ParticleEffect#sizeInterp / Log usable RAM 2021-09-07 22:32:27 -04:00
Anuken
8adefb7b72 Merge remote-tracking branch 'origin/master' 2021-09-07 17:57:17 -04:00
Anuken
5e13f71fde Minor bugfixes & compatibility fixes 2021-09-07 17:57:03 -04:00
Matthew Peng
d257adf0c1 Show All (#5954) 2021-09-07 15:20:59 -04:00
TranquillyUnpleasant
34d2a0d3a0 Hide all button for units (#5953)
* Hide all button for units

* Add bundle property
2021-09-07 13:38:43 -04:00
Matthew Peng
efae0d3b6a Anuke what is this (#5949) 2021-09-06 20:45:42 -04:00
buthed010203
a393e21326 remove redundant Core.bundle.get (#5947) 2021-09-06 15:08:22 -04:00
Anuken
5641b4901c Easier stained mountains guardian 2021-09-05 23:01:26 -04:00
Anuken
4da21ba363 Added cliff support to editor 2021-09-05 20:08:02 -04:00
Anuken
508abba2ec Merge remote-tracking branch 'origin/master' 2021-09-05 18:00:21 -04:00
Anuken
87ff876db3 Take block timeScale into account for sector damage 2021-09-05 18:00:16 -04:00
CancerGuy
4720f1b876 Add files via upload (#5943) 2021-09-05 17:06:00 -04:00
Anuken
e35d09fe62 Merge remote-tracking branch 'origin/master' 2021-09-05 12:07:20 -04:00
Anuken
fb74dfa02f Default visualElevation for ships 2021-09-05 12:07:15 -04:00
Darkness6030
461d87dbef Add HexPvp server to global V6 list (#5940) 2021-09-05 12:03:57 -04:00
TranquillyUnpleasant
cf5d172922 Wave graph y axis refactor (#5926)
* Y axis refactor

* Fix formatting inconsistencies

* Make style match xml
2021-09-05 11:21:49 -04:00
Anuken
227fb388b8 Update building consume module before main update 2021-09-05 11:18:31 -04:00
Anuken
89d495fdb1 Merge remote-tracking branch 'origin/master' 2021-09-04 23:28:20 -04:00
Anuken
82e659dd80 Planet rendering infrastructure stuff 2021-09-04 23:28:15 -04:00
SoMall-dumpling
f20b9c828c Update Blocks.java (#5939)
simplest integer ratio
2021-09-04 22:30:07 -04:00
Anuken
efe5668c5a Merge remote-tracking branch 'origin/master' 2021-09-04 20:37:31 -04:00
Anuken
0331d8c6c4 Fixed #5937 2021-09-04 20:37:26 -04:00
Volas171
15882016ca 🤦 (#5936) 2021-09-04 18:07:29 -04:00
Anuken
b4b9a44126 Merge remote-tracking branch 'origin/master' 2021-09-04 18:07:15 -04:00
Anuken
063d2ce6c0 Implemented #5905 properly 2021-09-04 18:07:08 -04:00
ZestyLemonade
3985620289 space-begone (#5935)
Co-authored-by: sample-text-here <kjdshkasjhdfkj@jashdkaj.ksdh>
2021-09-04 17:43:03 -04:00
Anuken
23d0dfe6bf Deprecated DoubleOverlayFloor 2021-09-04 16:29:14 -04:00
Anuken
0a5b1d1380 Merge remote-tracking branch 'origin/master' 2021-09-04 15:23:53 -04:00
Anuken
24b0f445b8 Added rivers on Serpulo / Added deep tainted water 2021-09-04 15:23:47 -04:00
Volas171
57cd20e2a1 update mindustry reborn v7 (#5933)
* update mindustry reborn ip

* i forgo-
2021-09-04 12:49:11 -04:00
Anuken
3f49807348 Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-09-04 11:27:29 -04:00
Anuken
13ddca750a arc 2021-09-04 11:27:26 -04:00
buthed010203
c209b0bdaf add statustable name to hudfragment (#5904) 2021-09-04 11:05:06 -04:00
Matthew Peng
264052a95f Remove the slight delay in wind3.ogg (#5909)
* Remove the slight delay in `wind3.ogg`

* Don't need to export the quality that high
2021-09-04 10:26:42 -04:00
Matthew Peng
b004146015 Input liquid drawing for DrawLiquid and DrawMixer (#5906) 2021-09-04 10:18:44 -04:00
CancerGuy
3901ae1720 change (#5923) 2021-09-04 10:14:40 -04:00
RebornTrack970
bcf798c247 Moved All OmegaHub servers from all Nodes to N5 (#5917)
* Moved All OmegaHub servers from all Nodes to N5

* Update servers_v7.json

* v6 life matters!

* Update servers_v6.json

* Update servers_v7.json

Co-authored-by: Volas171 <60143910+Volas171@users.noreply.github.com>
2021-09-04 10:14:16 -04:00
buthed010203
2dffd525a3 remove useless method call (#5912)
sector.hasBase() already checks that save != null
2021-09-04 10:14:04 -04:00
QmelZ
d31389efca remove space (#5929) 2021-09-04 10:12:13 -04:00
Anuken
ee8683c734 Do not display overdrive visual for router/conduit 2021-09-04 10:07:13 -04:00
Anuken
8224cc3fce Fixed #5922 2021-09-04 10:03:40 -04:00
Anuken
94a340d3ee Merge remote-tracking branch 'origin/master' 2021-09-04 09:59:32 -04:00
Anuken
f8048be429 Fixed #5918 2021-09-04 09:59:28 -04:00
Кирилл Алдашкин
3714077fbe Fixed the display of the oil extractor efficiency (#5915) 2021-09-04 09:58:38 -04:00
Anuken
6984be2172 Merge remote-tracking branch 'origin/master' 2021-09-04 09:55:28 -04:00
Anuken
48f359ca9b Fixed #5907 2021-09-04 09:55:23 -04:00
Matthew Peng
9b28eaa3b3 Allow for SingleTypeGenerators to use only liquid. (#5900) 2021-08-30 08:23:58 -04:00
Matthew Peng
2f47f13ef7 Adjustable generateEffect randomness (#5901) 2021-08-29 22:55:52 -04:00
Anuken
80acea4708 #5897 with proper formatting 2021-08-29 16:25:26 -04:00
Anuken
cc689fd114 Fixed #5895 2021-08-29 10:26:39 -04:00
Anuken
be5d9154a7 Merge remote-tracking branch 'origin/master' 2021-08-29 09:12:08 -04:00
Anuken
bb9d7fedf7 Fixed #5894 2021-08-29 09:12:03 -04:00
Matthew Peng
71f064bda1 Shouldn't shorten() also reset the counter? (#5890) 2021-08-29 08:28:38 -04:00
Anuken
e30d7e998d Allow unit icons for sectors 2021-08-28 20:49:39 -04:00
Anuken
a3270dd908 this turned out to be pretty difficult 2021-08-28 16:29:58 -04:00
Anuken
48d568978b Merge remote-tracking branch 'origin/master'
# Conflicts:
#	core/src/mindustry/entities/Damage.java
2021-08-28 14:17:29 -04:00
Anuken
9a7324ce54 Fixed #5887 2021-08-28 14:17:01 -04:00
Darkness6030
d254d971a9 Add unitSpawnEvent (#5876) 2021-08-28 10:53:19 -04:00
SMOLKEYS.exe
800f0f4511 inconspicuous OCD goes to brazil (#5884) 2021-08-28 09:13:57 -04:00
Matthew Peng
60b2842d82 Rotator spinSpeed (#5881) 2021-08-28 08:47:11 -04:00
Matthew Peng
f8c7ff0159 Damage.damage doesn't properly convert cores (#5882)
* `Damage.damage` doesn't properly convert cores

* Well that was a complete failure
2021-08-28 08:46:08 -04:00
Anuken
4d62b0321f Fixed #5885 2021-08-28 08:44:42 -04:00
Anuken
6ca2855365 Fixed RailBulletType effect length 2021-08-27 22:33:56 -04:00
Anuken
ced97888e4 why 2021-08-27 21:51:37 -04:00
Zelaux
9f68fe520b Fixed incorrect work of TextureRegion.found() when creating icons (#5879)
* Fixed incorrect work of TextureRegion.found() when creating icons

* fixed comment text

* fixed comment text
2021-08-27 11:08:04 -04:00
Anuken
8c32acbc30 Fixed #5878 2021-08-27 09:58:08 -04:00
Anuken
bfc9b07651 Redundant cast cleanup 2021-08-27 09:31:18 -04:00
Anuken
e53b578043 Merge remote-tracking branch 'origin/master' 2021-08-27 09:17:31 -04:00
Anuken
b2ed066faa Fixed BE server not updating 2021-08-27 09:17:26 -04:00
Matthew Peng
5cc461edb0 Make hiding details optional (#5871)
* Make hiding details optional

* Sandbox blocks shouldn't have their details hidden.
2021-08-26 20:47:35 -04:00
Anuken
9b22777dfb AGP 7.0.1 2021-08-26 15:15:29 -04:00
Anuken
3bd08bb047 Merge remote-tracking branch 'origin/master' 2021-08-26 15:07:13 -04:00
Anuken
139d6cd5cc Proper #5872 2021-08-26 15:07:08 -04:00
RebornTrack970
309b0adb9e Added Rush and Expansion to Omega Hub (#5868) 2021-08-26 08:33:10 -04:00
Anuken
c25e6b586b Allow empty maps in FileMapGenerator 2021-08-25 21:57:18 -04:00
Anuken
f46b22e4a7 Merge remote-tracking branch 'origin/master' 2021-08-25 13:22:23 -04:00
Anuken
2b6856634c Fixed #5864 2021-08-25 13:22:19 -04:00
Ilya246
20305b5d36 Fix .pl BE server (#5862)
The server is currently up and running BE
2021-08-25 13:06:19 -04:00
Anuken
9e16d7385a Implemented #5853 2021-08-25 10:09:00 -04:00
Anuken
c573fd34a1 Bullet raycast clamp 2021-08-25 09:10:59 -04:00
Anuken
da7873cbd8 #5855 2021-08-25 08:49:41 -04:00
Anuken
a15f8131fa Merge remote-tracking branch 'origin/master' 2021-08-24 19:14:44 -04:00
Anuken
0d27e3afdc Fixed #5856 2021-08-24 19:14:40 -04:00
Leonid Skorospelov
bdcae408e6 Added 2v2, 3v3 ranked gamemode servers to v6 (#5854) 2021-08-24 17:45:14 -04:00
Anuken
bc4783e9cd Implemented #5851 properly 2021-08-24 12:45:28 -04:00
Anuken
8143cb7be0 Unit balancing 2021-08-24 12:10:44 -04:00
Anuken
8e90527609 Chat prefix empty message fix / Call.sound volume limit increase 2021-08-24 10:19:46 -04:00
Anuken
8949fd279e Build error fix / Anuken/Mindustry-Suggestions/issues/2897 2021-08-24 09:28:51 -04:00
Anuken
901d594768 Prevent server sound ear destruction / Particle effect rand param 2021-08-23 20:27:01 -04:00
Anuken
3964c8e826 Merge remote-tracking branch 'origin/master' 2021-08-23 17:41:02 -04:00
Anuken
044a124bc7 Fixed #5847 2021-08-23 17:40:58 -04:00
VizardAlpha
4f22db8db5 Updates bundle_fr.properties (#5663)
* Updates bundle_fr.properties

Final core launch animation / Added option to skip core animations

* Translation end

* Proper name/impl for "borderless windowed" on Windows

* Mod import progress bar

* WIP team icons

* Improved environmental block internal names

* Update core/assets/bundles/bundle_fr.properties

Co-authored-by: Lucien Perregaux <57545107+Luhrel@users.noreply.github.com>

* payload source and void descriptions

* Game stats cleanup

* Added max units field for wave editor

* Added max units

Co-authored-by: Lucien Perregaux <57545107+Luhrel@users.noreply.github.com>
Co-authored-by: Anuken <arnukren@gmail.com>
2021-08-23 16:58:31 -04:00
Anuken
80ef3cee34 Suppress gen deprecatio warning / Anuken/Mindustry-Suggestions/issues/2888 2021-08-23 15:33:28 -04:00
Anuken
254284760f Hid details of locked content 2021-08-23 15:20:56 -04:00
Anuken
71ee7558ab Merge remote-tracking branch 'origin/master' 2021-08-23 14:47:16 -04:00
Anuken
5f4a3e341f #5785 2021-08-23 14:47:11 -04:00
RebornTrack970
81f25b76fd TR Fix (#5781) 2021-08-23 14:41:32 -04:00
Take
649c6ddfb3 Japanese Translation (Steam, Android description & Achivements) (#5805)
* copy English achivement and description file to Japanese folder

* Translate Gameplay, Campaign

* Translate steam achievements

* Translate Gamemodes, Custom&Multiplayer, Editor

* Translate Android desctiption

* Create summary.txt

* remove the sentence to recommend to share in steam workshop

* fix: 個 → 種類

* minor translation change
2021-08-23 14:36:34 -04:00
SoMall-dumpling
3bd3d3aa37 Avoid ambiguity (#5809)
* Avoid ambiguity

When you see 'boost: 150%'
It can be 'increase the speed to 150%' or 'increase the speed to 250%'.
Maybe you will say that the colon has already avoided this ambiguity.
But you know there's always someone who ignores those things, and also translating 'boost' is hard with no 'x' to avoid ambiguity.
With a 'x', it will show 'Boost: x150%', which will never be thought as 250%.

* Update OverdriveProjector.java

When power is low, show 'low power: -{0}%';
When power is high, show 'boost: +{0}%'.

* Update bundle.properties

* Update bundle.properties

* Update OverdriveProjector.java

bugfix(perhaps)

* Update OverdriveProjector.java

what if

* Update OverdriveProjector.java

InTeReStInG

* Update OverdriveProjector.java

back to the past

* Update OverdriveProjector.java

Now using Math.max.

* Update bundle_bg.properties

* Update bundle_de.properties

* Update bundle_fr.properties

* Update bundle_hu.properties

* Update bundle_in_ID.properties

* Update bundle_ja.properties

* Update bundle_ko.properties

* Update bundle_pl.properties

* Update bundle_ro.properties

* Update bundle_ru.properties

* Update bundle_th.properties

* Update bundle_uk_UA.properties

* Update bundle_vi.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_TW.properties

* Update OverdriveProjector.java

Maybe this is necessary.

* Update OverdriveProjector.java

The stats are '+50%' ,etc. now.

* Update OverdriveProjector.java

Necessary, because the previous one is strange.
2.5 does not make sense. 12.5 does.
2021-08-23 12:37:34 -04:00
Prosta4okua
fa9573e6dc [UKR] Translation (#5810)
* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties
2021-08-23 12:27:17 -04:00
Sharlotte
b4d19bf71b Update bundle_ko.properties (#5842) 2021-08-23 12:26:27 -04:00
YellOw139
0f019f58bd [Bundle][RO] Update (#5839)
* [Bundle][RO] Update

Changelog:

- New strings/changes up to commit 5d4ab9ecd7
- Typo fixes & various other improvements

* new button

* derelict changes
2021-08-23 12:26:15 -04:00
kituta
572166b157 Update bundle_ja.properties (#5813)
* Update bundle_ja.properties

Corrections to notational errors. //表記揺れの修正
Change to appropriate wording. //適切な語句への変更

* Update bundle_ja.properties

Add and remove. //追加と削除
2021-08-23 12:26:08 -04:00
JrTRinny
e16dba3336 Update bundle_th.properties (#5845)
* Update bundle_th.properties

* database button
2021-08-23 12:25:59 -04:00
Anuken
b52d645459 #5837 2021-08-23 12:04:54 -04:00
Darkness6030
73b24d2966 Update bundle_ru.properties (#5844) 2021-08-23 10:24:36 -04:00
Anuken
006c796da7 Added database button in menu 2021-08-23 10:03:26 -04:00
Anuken
160fdee596 Consistent tile attribute display 2021-08-23 09:12:36 -04:00
Anuken
5cc50b0ff3 Fixed floorSpeedMultiplier being squared 2021-08-22 15:53:07 -04:00
Anuken
3ba2498815 Removed atrax from archipelago waves 2021-08-22 13:44:55 -04:00
Anuken
0a0ec12e6c Allow logic itemDrop to @air 2021-08-22 11:43:14 -04:00
Anuken
9c826a5fdd Merge remote-tracking branch 'origin/master' 2021-08-22 10:21:24 -04:00
Anuken
50d01ef6f8 FlyingComp cleanup 2021-08-22 10:21:20 -04:00
Matthew Peng
b860b2bbfb Don't show core ghosts (#5834) 2021-08-22 09:45:17 -04:00
JrTRinny
7773a3b17b let payload source/void replace each other (#5835) 2021-08-22 09:45:05 -04:00
Anuken
c605418e33 public Setting constructor 2021-08-22 09:40:55 -04:00
Anuken
55270996ff Cleanup 2021-08-22 00:36:25 -04:00
Anuken
789fcac439 Merge remote-tracking branch 'origin/master' 2021-08-22 00:35:55 -04:00
Anuken
466118319f Fixed naval units with canBoost = true 2021-08-22 00:35:40 -04:00
fuzzbuck
8117aa8046 add 2 new io servers (#5830)
1 new gamemode which will soon come to existance & placeholder slot for events & possible future gamemode
2021-08-21 18:05:43 -04:00
Darkness6030
6847d2f373 Add HexedPvP server to Global v7 list (#5829) 2021-08-21 14:55:41 -04:00
Anuken
f85c078de8 PR cleanup 2021-08-21 11:34:05 -04:00
Matthew Peng
9cc08ada22 Heal Targetting on Turrets (#5820)
* Heal Targetting on Turrets

* Just in case
2021-08-21 11:33:20 -04:00
Sunny Kim
ec1afdfdc4 Hidden blocks only in the Placement UI (#5806)
* placeablePlayer

* placeablePlayer unlocked
2021-08-21 11:29:16 -04:00
Anuken
92d3d3cd9c Fixed #5824 2021-08-21 09:54:05 -04:00
Anuken
8d23e335ae Merge remote-tracking branch 'origin/master' 2021-08-20 23:04:47 -04:00
Anuken
ec61598a52 Minke ability moved to Oxynoe 2021-08-20 23:04:43 -04:00
彭瑞暄
c0c0ebb71f Update bundle_zh_TW.properties (#5739)
1609 lst.lookup not translated for clarity (using original description)
2021-08-20 23:03:17 -04:00
Fatonndev
c22f6a844e add hexed pvp server (#5819) 2021-08-20 14:29:46 -04:00
Anuken
8b4112f705 Check for repo & display name in mod browser search 2021-08-20 13:35:41 -04:00
Anuken
465afc3128 Sound fixes 2021-08-20 08:54:02 -04:00
Anuken
6730954a2e Fixed particle effect icon offset 2021-08-20 00:16:03 -04:00
Anuken
d03049799e Gradle 7.2 2021-08-20 00:06:37 -04:00
Anuken
3a3622bb58 Boss status color fix 2021-08-19 23:42:27 -04:00
Anuken
38ec05807a Disallow logic-building invalid blocks 2021-08-19 23:32:21 -04:00
Anuken
5d4ab9ecd7 Added max units field for wave editor 2021-08-19 23:26:39 -04:00
Anuken
0ab5f5bb14 hide hidden units in menu 2021-08-19 21:29:50 -04:00
Anuken
4b14008080 Fixed #5812 2021-08-19 17:50:31 -04:00
Anuken
e23054d606 Better support for disabling omniMovement 2021-08-19 16:29:49 -04:00
Anuken
dc5ca76df0 Merge remote-tracking branch 'origin/master' 2021-08-19 14:20:22 -04:00
Anuken
a8b423836e Added unit decal system for mods/future units 2021-08-19 14:20:18 -04:00
Volas171
a4bd160995 omegahub ip change (last) (#5807) 2021-08-19 10:43:58 -04:00
Anuken
558ee579e1 BlockIndexer null team fix 2021-08-19 09:37:12 -04:00
Anuken
41829b8660 Fixed #5803 2021-08-18 20:10:14 -04:00
Anuken
b8eaabe0de Fixed #5802 2021-08-18 18:55:36 -04:00
Anuken
a94735c5a5 Remote unlock tweaks 2021-08-18 17:52:59 -04:00
Anuken
ba48373bbc Game stats cleanup 2021-08-18 16:39:20 -04:00
Anuken
512b65a592 Merge remote-tracking branch 'origin/master' 2021-08-18 13:50:05 -04:00
Anuken
103ee371bd Fixed #5800 2021-08-18 13:49:59 -04:00
buthed010203
179f44cd37 // (#5798) 2021-08-18 12:52:12 -04:00
Anuken
1bf173b1ee Merge remote-tracking branch 'origin/master' 2021-08-18 11:41:44 -04:00
Anuken
356c2cfa80 Fixed #5797 2021-08-18 11:41:38 -04:00
kituta
5b61a183cd Update bundle_ja.properties (#5376)
* Update bundle_ja.properties

* Update bundle_ja.properties

Minor corrections and additions

* Update bundle_ja.properties

* Update bundle_ja.properties

Add 2 lines

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update core/assets/bundles/bundle_ja.properties

Co-authored-by: Take <18237819+Takeno-hito@users.noreply.github.com>

* Update core/assets/bundles/bundle_ja.properties

Co-authored-by: Take <18237819+Takeno-hito@users.noreply.github.com>

* Update core/assets/bundles/bundle_ja.properties

Co-authored-by: Take <18237819+Takeno-hito@users.noreply.github.com>

* Update bundle_ja.properties

* Update core/assets/bundles/bundle_ja.properties

Co-authored-by: Take <18237819+Takeno-hito@users.noreply.github.com>

* Update core/assets/bundles/bundle_ja.properties

Co-authored-by: Take <18237819+Takeno-hito@users.noreply.github.com>

Co-authored-by: Take <18237819+Takeno-hito@users.noreply.github.com>
2021-08-18 10:45:39 -04:00
Xasmedy
d5e1b47b52 Adding M.D.N. Hub (#5795) 2021-08-18 10:25:46 -04:00
Anuken
63795d9df8 public AI fields 2021-08-17 22:06:29 -04:00
Anuken
8e179552ec pointless casts begone 2021-08-17 21:45:13 -04:00
Sunny Kim
d1271f3e4b Boss (Guardian) Status Sprite (#5773)
* boss status

* almost forgot

* Update bundle_ko.properties
2021-08-17 18:00:00 -04:00
buthed010203
24e6f5b841 remove stray newline (#5788)
its ugly
2021-08-17 17:59:15 -04:00
Alexander397172YT
7118c972a8 Update servers_v6.json (#5790) 2021-08-17 17:54:29 -04:00
Anuken
e4742133ca Made various fields/methods public 2021-08-17 17:23:02 -04:00
Anuken
ada6ef229c Merge remote-tracking branch 'origin/master' 2021-08-17 11:39:03 -04:00
Anuken
f0c0900770 Lambda memory allocation optimizations 2021-08-17 11:38:57 -04:00
Michael McMahon
a4a6eb6cee Command-line-tools link (#5789)
Link specifically to the `Command line tools only` section instead of the complete Android Studio package.
2021-08-17 08:27:36 -04:00
RebornTrack970
362c7d38a6 Omega Hub Server Update 2 (#5782)
Every Server (exept Rush and expansion) is fixed
2021-08-16 20:22:13 -04:00
Anuken
7b4d488b11 UI cleanup 2021-08-16 20:06:50 -04:00
205 changed files with 3140 additions and 1989 deletions

View File

@@ -38,7 +38,7 @@ Server builds are bundled with each released build (in Releases). If you'd rathe
### Android ### Android
1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required. 1. Install the Android SDK [here.](https://developer.android.com/studio#command-tools) Make sure you're downloading the "Command line tools only", as Android Studio is not required.
2. Set the `ANDROID_HOME` environment variable to point to your unzipped Android SDK directory. 2. Set the `ANDROID_HOME` environment variable to point to your unzipped Android SDK directory.
3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`. 3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`.

View File

@@ -7,8 +7,7 @@ buildscript{
} }
dependencies{ dependencies{
//note that later versions, like alpha05, fail to work correctly classpath 'com.android.tools.build:gradle:7.0.1'
classpath 'com.android.tools.build:gradle:7.1.0-alpha02'
} }
} }

View File

@@ -91,7 +91,7 @@ public abstract class BaseProcessor extends AbstractProcessor{
} }
public static TypeName tname(String pack, String simple){ public static TypeName tname(String pack, String simple){
return ClassName.get(pack, simple ); return ClassName.get(pack, simple);
} }
public static TypeName tname(String name){ public static TypeName tname(String name){

View File

@@ -101,6 +101,8 @@ public class EntityProcess extends BaseProcessor{
inter.addJavadoc("Interface for {@link $L}", component.fullName()); inter.addJavadoc("Interface for {@link $L}", component.fullName());
skipDeprecated(inter);
//implement extra interfaces these components may have, e.g. position //implement extra interfaces these components may have, e.g. position
for(Stype extraInterface : component.interfaces().select(i -> !isCompInterface(i))){ for(Stype extraInterface : component.interfaces().select(i -> !isCompInterface(i))){
//javapoet completely chokes on this if I add `addSuperInterface` or create the type name with TypeName.get //javapoet completely chokes on this if I add `addSuperInterface` or create the type name with TypeName.get
@@ -570,6 +572,8 @@ public class EntityProcess extends BaseProcessor{
.returns(tname(packageName + "." + name)) .returns(tname(packageName + "." + name))
.addStatement(ann.pooled() ? "return Pools.obtain($L.class, " +name +"::new)" : "return new $L()", name).build()); .addStatement(ann.pooled() ? "return Pools.obtain($L.class, " +name +"::new)" : "return new $L()", name).build());
skipDeprecated(builder);
definitions.add(new EntityDefinition(packageName + "." + name, builder, type, typeIsBase ? null : baseClass, components, groups, allFieldSpecs, legacy)); definitions.add(new EntityDefinition(packageName + "." + name, builder, type, typeIsBase ? null : baseClass, components, groups, allFieldSpecs, legacy));
} }
@@ -837,6 +841,8 @@ public class EntityProcess extends BaseProcessor{
TypeSpec.Builder nullBuilder = TypeSpec.classBuilder(className) TypeSpec.Builder nullBuilder = TypeSpec.classBuilder(className)
.addModifiers(Modifier.FINAL); .addModifiers(Modifier.FINAL);
skipDeprecated(nullBuilder);
nullBuilder.addSuperinterface(interf.tname()); nullBuilder.addSuperinterface(interf.tname());
if(superclass != null) nullBuilder.superclass(tname(baseName(superclass))); if(superclass != null) nullBuilder.superclass(tname(baseName(superclass)));
@@ -980,6 +986,11 @@ public class EntityProcess extends BaseProcessor{
throw new IllegalArgumentException("Missing types."); throw new IllegalArgumentException("Missing types.");
} }
void skipDeprecated(TypeSpec.Builder builder){
//deprecations are irrelevant in generated code
builder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"deprecation\"").build());
}
class GroupDefinition{ class GroupDefinition{
final String name; final String name;
final ClassName baseType; final ClassName baseType;

View File

@@ -41,8 +41,8 @@ buildscript{
} }
plugins{ plugins{
id 'org.jetbrains.kotlin.jvm' version '1.4.32' id 'org.jetbrains.kotlin.jvm' version '1.5.21'
id "org.jetbrains.kotlin.kapt" version "1.4.32" id "org.jetbrains.kotlin.kapt" version "1.5.21"
} }
allprojects{ allprojects{
@@ -219,10 +219,16 @@ allprojects{
options.compilerArgs += ["-Xlint:deprecation"] options.compilerArgs += ["-Xlint:deprecation"]
dependsOn clearCache dependsOn clearCache
options.forkOptions.jvmArgs.addAll([ options.forkOptions.jvmArgs += [
'--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED',
'--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED',
'--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED' '--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED',
]) '--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED',
'--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED',
'--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED',
'--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED',
'--add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED'
]
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

View File

@@ -78,13 +78,12 @@ schematic.tagexists = That tag already exists.
stats = Stats stats = Stats
stat.wave = Waves Defeated:[accent] {0} stat.wave = Waves Defeated:[accent] {0}
stat.unitsCreated = Units Created:[accent] {0}
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
stat.built = Buildings Built:[accent] {0} stat.built = Buildings Built:[accent] {0}
stat.destroyed = Buildings Destroyed:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0}
stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0}
stat.delivered = Resources Launched:
stat.playtime = Time Played:[accent] {0} stat.playtime = Time Played:[accent] {0}
stat.rank = Final Rank: [accent]{0}
globalitems = [accent]Total 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}[]"?
@@ -94,6 +93,7 @@ level.mode = Gamemode:
coreattack = < Core is under attack! > coreattack = < Core is under attack! >
nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent
database = Core Database database = Core Database
database.button = Database
savegame = Save Game savegame = Save Game
loadgame = Load Game loadgame = Load Game
joingame = Join Game joingame = Join Game
@@ -169,6 +169,7 @@ launchcore = Launch Core
filename = File Name: filename = File Name:
unlocked = New content unlocked! unlocked = New content unlocked!
available = New research available! available = New research available!
unlock.incampaign = < Unlock in campaign for details >
completed = [accent]Completed completed = [accent]Completed
techtree = Tech Tree techtree = Tech Tree
research.legacy = [accent]5.0[] research data found.\nDo you want to [accent]load this data[], or [accent]discard it[] and restart research in the new campaign (recommended)? research.legacy = [accent]5.0[] research data found.\nDo you want to [accent]load this data[], or [accent]discard it[] and restart research in the new campaign (recommended)?
@@ -362,6 +363,7 @@ publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure
publish.error = Error publishing item: {0} publish.error = Error publishing item: {0}
steam.error = Failed to initialize Steam services.\nError: {0} steam.error = Failed to initialize Steam services.\nError: {0}
editor.cliffs = Walls To Cliffs
editor.brush = Brush editor.brush = Brush
editor.openin = Open In Editor editor.openin = Open In Editor
editor.oregen = Ore Generation editor.oregen = Ore Generation
@@ -385,6 +387,7 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.shields = shields/wave waves.shields = shields/wave
waves.to = to waves.to = to
waves.max = max units
waves.guardian = Guardian waves.guardian = Guardian
waves.preview = Preview waves.preview = Preview
waves.edit = Edit... waves.edit = Edit...
@@ -393,6 +396,13 @@ waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard. waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied. waves.copied = Waves copied.
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
waves.sort = Sort By
waves.sort.reverse = Reverse Sort
waves.sort.begin = Begin
waves.sort.health = Health
waves.sort.type = Type
waves.units.hide = Hide All
waves.units.show = Show All
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = counts wavemode.counts = counts
@@ -621,6 +631,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility
sector.windsweptIslands.name = Windswept Islands sector.windsweptIslands.name = Windswept Islands
sector.extractionOutpost.name = Extraction Outpost sector.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal sector.planetaryTerminal.name = Planetary Launch Terminal
sector.coastline.name = Coastline
sector.navalFortress.name = Naval Fortress
sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
@@ -648,10 +660,12 @@ status.sapped.name = Sapped
status.electrified.name = Electrified status.electrified.name = Electrified
status.spore-slowed.name = Spore Slowed status.spore-slowed.name = Spore Slowed
status.tarred.name = Tarred status.tarred.name = Tarred
status.overdrive.name = Overdrive
status.overclock.name = Overclock status.overclock.name = Overclock
status.shocked.name = Shocked status.shocked.name = Shocked
status.blasted.name = Blasted status.blasted.name = Blasted
status.unmoving.name = Unmoving status.unmoving.name = Unmoving
status.boss.name = Guardian
settings.language = Language settings.language = Language
settings.data = Game Data settings.data = Game Data
@@ -776,7 +790,7 @@ bar.corereq = Core Base Required
bar.drillspeed = Drill Speed: {0}/s bar.drillspeed = Drill Speed: {0}/s
bar.pumpspeed = Pump Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s
bar.efficiency = Efficiency: {0}% bar.efficiency = Efficiency: {0}%
bar.boost = Boost: {0}% bar.boost = Boost: +{0}%
bar.powerbalance = Power: {0}/s bar.powerbalance = Power: {0}/s
bar.powerstored = Stored: {0}/{1} bar.powerstored = Stored: {0}/{1}
bar.poweramount = Power: {0} bar.poweramount = Power: {0}
@@ -1149,6 +1163,7 @@ block.core-nucleus.name = Core: Nucleus
block.deep-water.name = Deep Water block.deep-water.name = Deep Water
block.shallow-water.name = Water block.shallow-water.name = Water
block.tainted-water.name = Tainted Water block.tainted-water.name = Tainted Water
block.deep-tainted-water.name = Deep Tainted Water
block.darksand-tainted-water.name = Dark Sand Tainted Water block.darksand-tainted-water.name = Dark Sand Tainted Water
block.tar.name = Tar block.tar.name = Tar
block.stone.name = Stone block.stone.name = Stone
@@ -1382,6 +1397,7 @@ hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit p
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.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.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.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation.
hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[].
hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over.

View File

@@ -751,7 +751,7 @@ bar.corereq = Необходимо е Ядро за основа
bar.drillspeed = Скорост на свредлото: {0}/сек bar.drillspeed = Скорост на свредлото: {0}/сек
bar.pumpspeed = Скорост на помпата: {0}/сек bar.pumpspeed = Скорост на помпата: {0}/сек
bar.efficiency = Ефективност: {0}% bar.efficiency = Ефективност: {0}%
bar.boost = Усилване: {0}% bar.boost = Усилване: +{0}%
bar.powerbalance = Електроенергия: {0}/сек bar.powerbalance = Електроенергия: {0}/сек
bar.powerstored = Съхранена енергия: {0}/{1} bar.powerstored = Съхранена енергия: {0}/{1}
bar.poweramount = Електроенергия: {0} bar.poweramount = Електроенергия: {0}

View File

@@ -772,7 +772,7 @@ bar.corereq = Kern-Basis erforderlich
bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.drillspeed = Bohrgeschwindigkeit: {0}/s
bar.pumpspeed = Pumpengeschwindigkeit: {0}/s bar.pumpspeed = Pumpengeschwindigkeit: {0}/s
bar.efficiency = Effizienz: {0}% bar.efficiency = Effizienz: {0}%
bar.boost = Beschleunigung: {0}% bar.boost = Beschleunigung: +{0}%
bar.powerbalance = Strom: {0}/s bar.powerbalance = Strom: {0}/s
bar.powerstored = Gespeichert: {0}/{1} bar.powerstored = Gespeichert: {0}/{1}
bar.poweramount = Strom: {0} bar.poweramount = Strom: {0}

View File

@@ -78,13 +78,12 @@ schematic.tagexists = Ce mot-clé existe déjà.
stats = Statistiques stats = Statistiques
stat.wave = Vagues vaincues : [accent] {0} stat.wave = Vagues vaincues : [accent] {0}
stat.unitsCreated = Unités créées :[accent] {0}
stat.enemiesDestroyed = Ennemis détruits : [accent] {0} stat.enemiesDestroyed = Ennemis détruits : [accent] {0}
stat.built = Bâtiments construits : [accent] {0} stat.built = Bâtiments construits : [accent] {0}
stat.destroyed = Bâtiments détruits : [accent] {0} stat.destroyed = Bâtiments détruits : [accent] {0}
stat.deconstructed = Bâtiments déconstruits : [accent] {0} stat.deconstructed = Bâtiments déconstruits : [accent] {0}
stat.delivered = Ressources transférées :
stat.playtime = Temps de jeu : [accent] {0} stat.playtime = Temps de jeu : [accent] {0}
stat.rank = Rang Final : [accent]{0}
globalitems = [accent]Ressources globales globalitems = [accent]Ressources globales
map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]" ? map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]" ?
@@ -94,6 +93,7 @@ level.mode = Mode de jeu :
coreattack = [scarlet]< Le Noyau est attaqué ! > coreattack = [scarlet]< Le Noyau est attaqué ! >
nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
database = Base de données database = Base de données
database.button = Base de données
savegame = Sauvegarder la partie savegame = Sauvegarder la partie
loadgame = Charger une partie loadgame = Charger une partie
joingame = Rejoindre une partie joingame = Rejoindre une partie
@@ -169,6 +169,7 @@ launchcore = Lancer le Noyau
filename = Nom du fichier : filename = Nom du fichier :
unlocked = Nouveau contenu débloqué ! unlocked = Nouveau contenu débloqué !
available = Nouvelle recherche disponible ! available = Nouvelle recherche disponible !
unlock.incampaign = < Débloquer dans la campagne pour plus de détails >
completed = [accent]Complété completed = [accent]Complété
techtree = Arbre technologique techtree = Arbre technologique
research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne ? (recommandé) research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne ? (recommandé)
@@ -215,7 +216,7 @@ hosts.none = [lightgray]Aucune partie en LAN trouvée !
host.invalid = [scarlet]Impossible de se connecter à l'hôte. host.invalid = [scarlet]Impossible de se connecter à l'hôte.
servers.local = Serveurs locaux servers.local = Serveurs locaux
servers.local.steam = Open Games & Serveurs Locaux servers.local.steam = Jeux Libres & Serveurs Locaux
servers.remote = Serveurs distants servers.remote = Serveurs distants
servers.global = Serveurs communautaires servers.global = Serveurs communautaires
@@ -317,7 +318,7 @@ data.invalid = Ce ne sont pas des données de jeu valides.
data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé ![]\n\nUne fois les données importées, le jeu se fermera immédiatement. data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé ![]\n\nUne fois les données importées, le jeu se fermera immédiatement.
quit.confirm = Êtes-vous sûr de vouloir quitter ? quit.confirm = Êtes-vous sûr de vouloir quitter ?
loading = [accent]Chargement... loading = [accent]Chargement...
reloading = [accent]Rechargement des Mods... downloading = [accent]Téléchargement...
saving = [accent]Sauvegarde... saving = [accent]Sauvegarde...
respawn = [accent][[{0}][] pour réapparaître dans le Noyau respawn = [accent][[{0}][] pour réapparaître dans le Noyau
cancelbuilding = [accent][[{0}][] pour effacer le plan cancelbuilding = [accent][[{0}][] pour effacer le plan
@@ -385,6 +386,7 @@ waves.waves = vague(s)
waves.perspawn = par apparition waves.perspawn = par apparition
waves.shields = boucliers/vague waves.shields = boucliers/vague
waves.to = à waves.to = à
waves.max = Unités maximum
waves.guardian = Gardien waves.guardian = Gardien
waves.preview = Prévisualiser waves.preview = Prévisualiser
waves.edit = Modifier... waves.edit = Modifier...
@@ -393,6 +395,13 @@ waves.load = Coller depuis le presse-papiers
waves.invalid = Vagues invalides dans le presse-papiers. waves.invalid = Vagues invalides dans le presse-papiers.
waves.copied = Vagues copiées waves.copied = Vagues copiées
waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut. waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut.
waves.sort = Trier Par
waves.sort.reverse = Tri inversé
waves.sort.begin = Commence par
waves.sort.health = Santé
waves.sort.type = Type
waves.units.hide = Tout masquer
waves.units.show = Tout afficher
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = compte wavemode.counts = compte
@@ -539,6 +548,7 @@ configure = Modifier le chargement
loadout = Chargement loadout = Chargement
resources = Ressources resources = Ressources
bannedblocks = Blocs bannis bannedblocks = Blocs bannis
bannedunits = Unités bannies
addall = Ajouter TOUT addall = Ajouter TOUT
launch.from = Décollage depuis : [accent]{0} launch.from = Décollage depuis : [accent]{0}
launch.destination = Destination: {0} launch.destination = Destination: {0}
@@ -617,6 +627,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility
sector.windsweptIslands.name = Windswept Islands sector.windsweptIslands.name = Windswept Islands
sector.extractionOutpost.name = Extraction Outpost sector.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal sector.planetaryTerminal.name = Planetary Launch Terminal
sector.coastline.name = Coastline
sector.navalFortress.name = Naval Fortress
sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et le peu de ressources disponibles, rassemblez autant de cuivre et de plomb que possible pour continuer votre exploration. sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et le peu de ressources disponibles, rassemblez autant de cuivre et de plomb que possible pour continuer votre exploration.
sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin. sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin.
@@ -645,10 +657,12 @@ status.sapped.name = Sapé
status.electrified.name = Electrifié status.electrified.name = Electrifié
status.spore-slowed.name = Spore ralentie status.spore-slowed.name = Spore ralentie
status.tarred.name = Goudronné status.tarred.name = Goudronné
status.overdrive.name = Surmultiplié
status.overclock.name = Surcadençage status.overclock.name = Surcadençage
status.shocked.name = Étourdie status.shocked.name = Étourdie
status.blasted.name = Foudroyé status.blasted.name = Foudroyé
status.unmoving.name = Immobilisé status.unmoving.name = Immobilisé
status.boss.name = Gardien
settings.language = Langage settings.language = Langage
settings.data = Données du Jeu settings.data = Données du Jeu
@@ -773,7 +787,7 @@ bar.corereq = Noyau de base requis
bar.drillspeed = Vitesse de Forage: {0}/s bar.drillspeed = Vitesse de Forage: {0}/s
bar.pumpspeed = Vitesse de Pompage: {0}/s bar.pumpspeed = Vitesse de Pompage: {0}/s
bar.efficiency = Efficacité: {0}% bar.efficiency = Efficacité: {0}%
bar.boost = Boost: {0}% bar.boost = Boost: +{0}%
bar.powerbalance = Énergie: {0}/s bar.powerbalance = Énergie: {0}/s
bar.powerstored = Réserves d'Énergie: {0}/{1} bar.powerstored = Réserves d'Énergie: {0}/{1}
bar.poweramount = Énergie: {0} bar.poweramount = Énergie: {0}
@@ -838,6 +852,7 @@ category.crafting = Fabrication
category.function = Fonction category.function = Fonction
category.optional = Améliorations facultatives category.optional = Améliorations facultatives
setting.skipcoreanimation.name = Ignorer l'animation du lancement du noyau et de l'atterrissage
setting.landscape.name = Verrouiller la rotation en mode paysage setting.landscape.name = Verrouiller la rotation en mode paysage
setting.shadows.name = Ombres setting.shadows.name = Ombres
setting.blockreplace.name = Suggestion automatique des Blocs setting.blockreplace.name = Suggestion automatique des Blocs
@@ -878,6 +893,7 @@ setting.seconds = {0} secondes
setting.milliseconds = {0} millisecondes setting.milliseconds = {0} millisecondes
setting.fullscreen.name = Plein Écran setting.fullscreen.name = Plein Écran
setting.borderlesswindow.name = Fenêtré sans bordures setting.borderlesswindow.name = Fenêtré sans bordures
setting.borderlesswindow.name.windows = Plein écran sans bordure
setting.borderlesswindow.description = Un redémarrage peut être nécessaire pour appliquer les changements. setting.borderlesswindow.description = Un redémarrage peut être nécessaire pour appliquer les changements.
setting.fps.name = Afficher FPS et Ping setting.fps.name = Afficher FPS et Ping
setting.smoothcamera.name = Lissage de la Caméra setting.smoothcamera.name = Lissage de la Caméra
@@ -1111,7 +1127,6 @@ unit.reign.name = Éradicateur
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
block.resupply-point.name = Point de Rechargement
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Falaise block.cliff.name = Falaise
block.sand-boulder.name = Bloc de Sable block.sand-boulder.name = Bloc de Sable
@@ -1148,9 +1163,10 @@ block.spawn.name = Point d'Apparition Ennemi
block.core-shard.name = Noyau: Fragment block.core-shard.name = Noyau: Fragment
block.core-foundation.name = Noyau: Fondation block.core-foundation.name = Noyau: Fondation
block.core-nucleus.name = Noyau: Épicentre block.core-nucleus.name = Noyau: Épicentre
block.deep-water.name = Eau profonde block.deep-water.name = Eau Profonde
block.shallow-water.name = Eau block.shallow-water.name = Eau
block.tainted-water.name = Eau Contaminée block.tainted-water.name = Eau Contaminée
block.deep-tainted-water.name = Eau Profonde Contaminée
block.darksand-tainted-water.name = Eau Contaminée avec fond de Sable sombre block.darksand-tainted-water.name = Eau Contaminée avec fond de Sable sombre
block.tar.name = Goudron block.tar.name = Goudron
block.stone.name = Roche block.stone.name = Roche
@@ -1384,6 +1400,7 @@ hint.generator = \uf879 Les [accent]Générateurs à combustion[] brûlent du Ch
hint.guardian = Les [accent]Gardiens[] sont protégés par un bouclier. Les munitions faibles telles que le [accent]Cuivre[] et le [accent]Plomb[] ne seront [scarlet]pas efficaces[].\n\nUtilisez des tourelles de plus haut niveau, ou de meilleures munitions comme le \uf835 [accent]Graphite[] avec un \uf861Duo/\uf859Salve pour pouvoir tuer le gardien. hint.guardian = Les [accent]Gardiens[] sont protégés par un bouclier. Les munitions faibles telles que le [accent]Cuivre[] et le [accent]Plomb[] ne seront [scarlet]pas efficaces[].\n\nUtilisez des tourelles de plus haut niveau, ou de meilleures munitions comme le \uf835 [accent]Graphite[] avec un \uf861Duo/\uf859Salve pour pouvoir tuer le gardien.
hint.coreUpgrade = Les Noyaux peuvent être améliorés [accent]en plaçant un Noyau de plus haut niveau sur eux[].\n\nPlacez un  Noyau [accent]Fondation[] sur le  Noyau [accent]Fragment[]. Soyez sûrs que rien n'obstrue la construction. hint.coreUpgrade = Les Noyaux peuvent être améliorés [accent]en plaçant un Noyau de plus haut niveau sur eux[].\n\nPlacez un  Noyau [accent]Fondation[] sur le  Noyau [accent]Fragment[]. Soyez sûrs que rien n'obstrue la construction.
hint.presetLaunch = Les [accent]secteurs[] gris, tels que [accent]Frozen Forest[], peuvent être lançés de n'importe où. Ils ne requièrent pas la capture d'un secteur adjacent.\n\n[accent]Il y a beaucoup de secteurs[] comme celui-ci, qui sont [accent]optionels[]. hint.presetLaunch = Les [accent]secteurs[] gris, tels que [accent]Frozen Forest[], peuvent être lançés de n'importe où. Ils ne requièrent pas la capture d'un secteur adjacent.\n\n[accent]Il y a beaucoup de secteurs[] comme celui-ci, qui sont [accent]optionels[].
hint.presetDifficulty = Ce secteur a un niveau de menace ennemi [scarlet]élevé[].\nIl n'est [accent]pas recommandé[] de se lancer dans de tels secteurs sans la technologie et la préparation appropriées.
hint.coreIncinerate = Lorsqu'un Noyau est rempli d'une ressource en particulier, le surplus qui rentrera dans celui-ci sera [accent]incinéré[]. hint.coreIncinerate = Lorsqu'un Noyau est rempli d'une ressource en particulier, le surplus qui rentrera dans celui-ci sera [accent]incinéré[].
hint.coopCampaign = Quand vous jouez en [accent]campagne multijoueur[], les ressources produites dans le secteur dans lequel vous jouez sera aussi envoyé [accent]dans vos secteurs[].\n\nLes recherches faites par l'hôte sont aussi partagées. hint.coopCampaign = Quand vous jouez en [accent]campagne multijoueur[], les ressources produites dans le secteur dans lequel vous jouez sera aussi envoyé [accent]dans vos secteurs[].\n\nLes recherches faites par l'hôte sont aussi partagées.
@@ -1414,8 +1431,7 @@ liquid.slag.description = Différents types de métaux en fusion mélangés. Peu
liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis, puis enflammé. liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis, puis enflammé.
liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir deau et de titane. Possède une capacité d'absorption de chaleur extrêmement élevée. Largement utilisé comme liquide de refroidissement. liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir deau et de titane. Possède une capacité d'absorption de chaleur extrêmement élevée. Largement utilisé comme liquide de refroidissement.
block.derelict = [lightgray]Vestiges block.derelict = [lightgray]Vestiges
block.resupply-point.description = Approvisionne les unités proches en munitions. Pas compatible avec celles qui ont besoin d'énergie pour tirer.
block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner. block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner.
block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés. block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés.
block.message.description = Enregistre un message. Utilisé pour la communication entre alliés. Le message contenu peut être modifié par un processeur logique. block.message.description = Enregistre un message. Utilisé pour la communication entre alliés. Le message contenu peut être modifié par un processeur logique.
@@ -1441,6 +1457,8 @@ block.item-source.description = Produit des objets à l'infini. Bac à sable uni
block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur. Bac à sable uniquement. block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur. Bac à sable uniquement.
block.liquid-source.description = Source de liquide infinie. Bac à sable uniquement. block.liquid-source.description = Source de liquide infinie. Bac à sable uniquement.
block.liquid-void.description = Détruit n'importe quel liquide. Bac à sable uniquement. block.liquid-void.description = Détruit n'importe quel liquide. Bac à sable uniquement.
block.payload-source.description = Produit des charges utiles à l'infini. Bac à sable uniquement.
block.payload-void.description = Détruit toutes les charges utiles. Bac à sable uniquement.
block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues. block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues.
block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues. block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues.
block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les attaques ennemies. block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les attaques ennemies.

View File

@@ -725,7 +725,7 @@ bar.corereq = Core Base Required
bar.drillspeed = Kitermelés: {0}/s bar.drillspeed = Kitermelés: {0}/s
bar.pumpspeed = Kitermelés: {0}/s bar.pumpspeed = Kitermelés: {0}/s
bar.efficiency = Hatékonyság: {0}% bar.efficiency = Hatékonyság: {0}%
bar.boost = Boost: {0}% bar.boost = Boost: +{0}%
bar.powerbalance = Áram: {0}/s bar.powerbalance = Áram: {0}/s
bar.powerstored = Tárolt: {0}/{1} bar.powerstored = Tárolt: {0}/{1}
bar.poweramount = Áram: {0} bar.poweramount = Áram: {0}

View File

@@ -773,7 +773,7 @@ bar.corereq = Memerlukan Inti Dasar
bar.drillspeed = Kecepatan Bor: {0}/s bar.drillspeed = Kecepatan Bor: {0}/s
bar.pumpspeed = Kecepatan Pompa: {0}/s bar.pumpspeed = Kecepatan Pompa: {0}/s
bar.efficiency = Daya Guna: {0}% bar.efficiency = Daya Guna: {0}%
bar.boost = Percepatan: {0}% bar.boost = Percepatan: +{0}%
bar.powerbalance = Tenaga: {0}/s bar.powerbalance = Tenaga: {0}/s
bar.powerstored = Disimpan: {0}/{1} bar.powerstored = Disimpan: {0}/{1}
bar.poweramount = Tenaga: {0} bar.poweramount = Tenaga: {0}

View File

@@ -1,6 +1,6 @@
credits.text = 制作者 [royal]Anuken[] - [sky]anukendev@gmail.com[] credits.text = 制作者 [royal]Anuken[] - [sky]anukendev@gmail.com[]
credits = クレジット credits = クレジット
contributors = 翻訳や開発に協力してくださった方々 contributors = 翻訳や開発に協力してくださった皆様
discord = MindustryのDiscordに参加! discord = MindustryのDiscordに参加!
link.discord.description = Mindustryの公式Discordグループ link.discord.description = Mindustryの公式Discordグループ
link.reddit.description = Mindustryのsubreddit link.reddit.description = Mindustryのsubreddit
@@ -41,10 +41,13 @@ be.ignore = 無視する
be.noupdates = 更新が見つかりません。 be.noupdates = 更新が見つかりません。
be.check = 更新を確認します。 be.check = 更新を確認します。
mod.featured.dialog.title = Mod ブラウザー (作業中) mods.browser = Modブラウザ
mods.browser.selected = 選択されたmod mods.browser.selected = 選択されたMod
mods.browser.add = インストール mods.browser.add = インストール
mods.browser.reinstall = 再インストール
mods.github.open = 見る mods.github.open = 見る
mods.browser.sortdate = 新しいものから並べる
mods.browser.sortstars = お気に入り数で並べる
schematic = 設計図 schematic = 設計図
schematic.add = 設計図を保存 schematic.add = 設計図を保存
@@ -64,16 +67,23 @@ schematic.delete.confirm = この設計図は完全に削除されます。よ
schematic.rename = 設計図の名前を変更する。 schematic.rename = 設計図の名前を変更する。
schematic.info = {1}x{0}, {2} ブロック schematic.info = {1}x{0}, {2} ブロック
schematic.disabled = [scarlet]設計図使用不可[]\nこの[accent]マップ[]、[accent]サーバー[]では設計図の使用は許可されていません。 schematic.disabled = [scarlet]設計図使用不可[]\nこの[accent]マップ[]、[accent]サーバー[]では設計図の使用は許可されていません。
schematic.tags = タグ:
schematic.edittags = タグ編集
schematic.addtag = タグを追加
schematic.texttag = テキストタグ
schematic.icontag = アイコンタグ
schematic.renametag = タグの名前変更
schematic.tagdelconfirm = このタグをすべて削除しますか?
schematic.tagexists = このタグはすでに存在します。
stats = Stats stats = Stats
stat.wave = 防衛したウェーブ:[accent] {0} stat.wave = 防衛したウェーブ:[accent] {0}
stat.unitsCreated = 生産ユニット数:[accent] {0}
stat.enemiesDestroyed = 敵に破壊された数:[accent] {0} stat.enemiesDestroyed = 敵に破壊された数:[accent] {0}
stat.built = 建設した建造物数:[accent] {0} stat.built = 建設した建造物数:[accent] {0}
stat.destroyed = 破壊した建造物数:[accent] {0} stat.destroyed = 破壊した建造物数:[accent] {0}
stat.deconstructed = 解体した建造物数:[accent] {0} stat.deconstructed = 解体した建造物数:[accent] {0}
stat.delivered = 獲得した資源:
stat.playtime = プレイ時間:[accent] {0} stat.playtime = プレイ時間:[accent] {0}
stat.rank = 最終ランク: [accent]{0}
globalitems = [accent]グローバルアイテム globalitems = [accent]グローバルアイテム
map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか?
@@ -82,7 +92,7 @@ level.select = レベル選択
level.mode = ゲームモード: level.mode = ゲームモード:
coreattack = < コアが攻撃を受けています! > coreattack = < コアが攻撃を受けています! >
nearpoint = [[ [scarlet]直ちに出現ポイントより離脱せよ[] ]\n殲滅されます nearpoint = [[ [scarlet]直ちに出現ポイントより離脱せよ[] ]\n殲滅されます
database = コアデータベース database = コアデータベース
savegame = 保存 savegame = 保存
loadgame = 読み込む loadgame = 読み込む
joingame = マルチプレイ joingame = マルチプレイ
@@ -90,6 +100,7 @@ customgame = カスタムプレイ
newgame = 新しく始める newgame = 新しく始める
none = <なし> none = <なし>
none.found = [lightgray]<見つかりません> none.found = [lightgray]<見つかりません>
none.inmap = [lightgray]<マップ内にありません>
minimap = ミニマップ minimap = ミニマップ
position = 位置 position = 位置
close = 閉じる close = 閉じる
@@ -110,20 +121,23 @@ committingchanges = 変更を適応中
done = 完了 done = 完了
feature.unsupported = あなたのデバイスはこの機能をサポートしていません。 feature.unsupported = あなたのデバイスはこの機能をサポートしていません。
mods.alphainfo = Mod機能は実験的なものです。[scarlet] エラーが含まれている可能性があります[]\n 問題を発見した場合は Mindustry GitHubに報告してください mods.initfailed = [red]⚠[] 以前のMindustryの初期化に失敗しました。おそらくModの誤作動が原因です。\n\nクラッシュループを防ぐために、[red]全てのModが無効になっています[]\n\nこの機能を無効にするのは、[accent]設定->ゲーム->起動時にクラッシュした場合にModを無効にする[]をオフにします
mods = Mods mods = Mods
mods.none = [lightgray]Modが見つかりませんでした! mods.none = [lightgray]Modが見つかりませんでした!
mods.guide = Mod作成ガイド mods.guide = Mod作成ガイド
mods.report = バグを報告する mods.report = バグを報告する
mods.openfolder = MODのフォルダを開く mods.openfolder = Modのフォルダを開く
mods.viewcontent = コンテンツを見る
mods.reload = 再読み込み mods.reload = 再読み込み
mods.reloadexit = Modを読み込む為にゲームを再起動します。 mods.reloadexit = Modを読み込む為にゲームを再起動します。
mod.installed = [[インストール済み]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]有効 mod.enabled = [lightgray]有効
mod.disabled = [scarlet]無効 mod.disabled = [scarlet]無効
mod.multiplayer.compatible = [gray]マルチプレイに対応
mod.disable = 無効化 mod.disable = 無効化
mod.content = コンテンツ: mod.content = コンテンツ:
mod.delete.error = MODを削除することができませんでした。 mod.delete.error = Modを削除することができませんでした。
mod.requiresversion = [scarlet]Modが要求する最低バージョン: [accent]{0} mod.requiresversion = [scarlet]Modが要求する最低バージョン: [accent]{0}
mod.outdated = [scarlet]V6 との互換性がありません (minGameVersion が 105 未満) mod.outdated = [scarlet]V6 との互換性がありません (minGameVersion が 105 未満)
mod.missingdependencies = [scarlet]依存関係がありません。: {0} mod.missingdependencies = [scarlet]依存関係がありません。: {0}
@@ -168,7 +182,7 @@ players.single = {0} 人がオンライン
players.search = 検索 players.search = 検索
players.notfound = [gray]プレイヤーが存在しません players.notfound = [gray]プレイヤーが存在しません
server.closing = [accent]サーバーを閉じています... server.closing = [accent]サーバーを閉じています...
server.kicked.kick = あなたはサーバからキックされました! server.kicked.kick = あなたはサーバからキックされました!
server.kicked.whitelist = あなたはホワイトリストに追加されていません。 server.kicked.whitelist = あなたはホワイトリストに追加されていません。
server.kicked.serverClose = サーバーが閉じられました。 server.kicked.serverClose = サーバーが閉じられました。
server.kicked.vote = あなたはプレイヤーの投票によりサーバーからキックされました。 server.kicked.vote = あなたはプレイヤーの投票によりサーバーからキックされました。
@@ -200,6 +214,7 @@ hosts.none = [lightgray]ローカル上のサーバーが見つかりません
host.invalid = [scarlet]ホストに接続できません。 host.invalid = [scarlet]ホストに接続できません。
servers.local = ローカルサーバー servers.local = ローカルサーバー
servers.local.steam = オープンゲーム & ローカルサーバー
servers.remote = リモートサーバー servers.remote = リモートサーバー
servers.global = コミュニティサーバー servers.global = コミュニティサーバー
@@ -211,9 +226,11 @@ server.hidden = 非表示
trace = プレイヤーの記録 trace = プレイヤーの記録
trace.playername = プレイヤー名: [accent]{0} trace.playername = プレイヤー名: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = ユニークID: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = モバイルクライアント: [accent]{0} trace.mobile = モバイルクライアント: [accent]{0}
trace.modclient = カスタムクライアント: [accent]{0} trace.modclient = カスタムクライアント: [accent]{0}
trace.times.joined = 参加回数: [accent]{0}
trace.times.kicked = キックされた回数: [accent]{0}
invalidid = 無効なクライアントIDです! バグ報告してください。 invalidid = 無効なクライアントIDです! バグ報告してください。
server.bans = Ban server.bans = Ban
server.bans.none = Banされたプレイヤーは見つかりませんでした! server.bans.none = Banされたプレイヤーは見つかりませんでした!
@@ -287,6 +304,7 @@ cancel = キャンセル
openlink = リンクを開く openlink = リンクを開く
copylink = リンクをコピー copylink = リンクをコピー
back = 戻る back = 戻る
max = Max
crash.export = クラッシュログを出力 crash.export = クラッシュログを出力
crash.none = クラッシュログが見つかりません。 crash.none = クラッシュログが見つかりません。
crash.exported = クラッシュログを出力しました。 crash.exported = クラッシュログを出力しました。
@@ -299,9 +317,9 @@ data.import.confirm = ゲームデータをインポートすると、現在の
quit.confirm = 終了してもよろしいですか? quit.confirm = 終了してもよろしいですか?
quit.confirm.tutorial = チュートリアルを終了しますか?\nチュートリアルは [accent]設定->ゲーム->チュートリアル[] から再度受けることができます。 quit.confirm.tutorial = チュートリアルを終了しますか?\nチュートリアルは [accent]設定->ゲーム->チュートリアル[] から再度受けることができます。
loading = [accent]読み込み中... loading = [accent]読み込み中...
reloading = [accent]再読み込み中... downloading = [accent]ダウンロード中...
saving = [accent]保存中... saving = [accent]保存中...
respawn = [accent][[{0}][] to respawn in core respawn = [accent][[{0}][] コアからリスポーンする
cancelbuilding = [accent][[{0}][] 選択を解除する cancelbuilding = [accent][[{0}][] 選択を解除する
selectschematic = [accent][[{0}][] 選択し、コピーする selectschematic = [accent][[{0}][] 選択し、コピーする
pausebuilding = [accent][[{0}][] 建築を一時的に中断する pausebuilding = [accent][[{0}][] 建築を一時的に中断する
@@ -326,9 +344,9 @@ custom = カスタム
builtin = 組み込み builtin = 組み込み
map.delete.confirm = マップを削除してもよろしいですか? これは元に戻すことができません! map.delete.confirm = マップを削除してもよろしいですか? これは元に戻すことができません!
map.random = [accent]ランダムマップ map.random = [accent]ランダムマップ
map.nospawn = このマップにはプレイヤーが出現するためのコアがありません! エディターで[accent]オレンジ色[]のコアをマップに追加してください。 map.nospawn = このマップにはプレイヤーが出現するためのコアがありません! エディターで[#{0}]{1}[]のコアをマップに追加してください。
map.nospawn.pvp = このマップには敵のプレイヤーが出現するためのコアがありません! エディターで[scarlet]オレンジ色ではない[]コアをマップに追加してください。 map.nospawn.pvp = このマップには敵のプレイヤーが出現するためのコアがありません! エディターで[scarlet]オレンジ色ではない[]コアをマップに追加してください。
map.nospawn.attack = このマップには攻撃するための敵のコアがありません! エディターで[scarlet]赤色[]のコアをマップに追加してください。 map.nospawn.attack = このマップには攻撃するための敵のコアがありません! エディターで[#{0}]{1}[]のコアをマップに追加してください。
map.invalid = マップの読み込みエラー: ファイルが無効、または破損しています。 map.invalid = マップの読み込みエラー: ファイルが無効、または破損しています。
workshop.update = 更新 workshop.update = 更新
workshop.error = ワークショップの詳細を取得中にエラーが発生しました: {0} workshop.error = ワークショップの詳細を取得中にエラーが発生しました: {0}
@@ -357,16 +375,16 @@ editor.generation = 生成:
editor.ingame = ゲーム内で編集する editor.ingame = ゲーム内で編集する
editor.publish.workshop = ワークショップで公開 editor.publish.workshop = ワークショップで公開
editor.newmap = 新しいマップ editor.newmap = 新しいマップ
editor.center = Center editor.center = 中心
workshop = ワークショップ workshop = ワークショップ
waves.title = ウェーブ waves.title = ウェーブ
waves.remove = 削除 waves.remove = 削除
waves.never = <永久>
waves.every = ウェーブ waves.every = ウェーブ
waves.waves = ごとに出現 waves.waves = ごとに出現
waves.perspawn = 体出現 waves.perspawn = 体出現
waves.shields = シールド/ウェーブ waves.shields = シールド/ウェーブ
waves.to = から waves.to = から
waves.max = 最大ユニット数
waves.guardian = ガーディアン waves.guardian = ガーディアン
waves.preview = プレビュー waves.preview = プレビュー
waves.edit = 編集... waves.edit = 編集...
@@ -444,39 +462,43 @@ toolmode.drawteams = チームを描く
toolmode.drawteams.description = ブロックの代わりにチームを描きます。 toolmode.drawteams.description = ブロックの代わりにチームを描きます。
filters.empty = [lightgray]フィルターが設定されていません! 下のボタンからフィルターを追加してください。 filters.empty = [lightgray]フィルターが設定されていません! 下のボタンからフィルターを追加してください。
filter.distort = ゆがみ filter.distort = ゆがみ
filter.noise = ノイズ filter.noise = ノイズ
filter.enemyspawn = 敵スポーンセレクト filter.enemyspawn = 敵スポーンセレクト
filter.spawnpath = Path To Spawn filter.spawnpath = Path To Spawn
filter.corespawn = コアセレクト filter.corespawn = コアセレクト
filter.median = メディアン filter.median = 中央値
filter.oremedian = メディアン (鉱石) filter.oremedian = 中央値 (鉱石)
filter.blend = ブレンド filter.blend = ブレンド
filter.defaultores = デフォルトの鉱石 filter.defaultores = デフォルトの鉱石
filter.ore = 鉱石 filter.ore = 鉱石
filter.rivernoise = リバーノイズ filter.rivernoise = 川の生成
filter.mirror = 反転 filter.mirror = 反転
filter.clear = クリアー filter.clear = クリアー
filter.option.ignore = 無視 filter.option.ignore = 無視
filter.scatter = 分散 filter.scatter = 分散
filter.terrain = 地形 filter.terrain = 地形
filter.option.scale = スケール filter.option.scale = スケール
filter.option.chance = 確率 filter.option.chance = 確率
filter.option.mag = マグニチュード filter.option.mag = マグニチュード
filter.option.threshold = スレッシュホールド filter.option.threshold = 閾値
filter.option.circle-scale = サークルスケール filter.option.circle-scale = サークルスケール
filter.option.octaves = オクターブ filter.option.octaves = オクターブ
filter.option.falloff = フォールオフ filter.option.falloff = 減衰
filter.option.angle = 角度 filter.option.angle = 角度
filter.option.amount = filter.option.amount =
filter.option.rotate = 回転
filter.option.block = ブロック filter.option.block = ブロック
filter.option.floor = 地面 filter.option.floor = 地面
filter.option.flooronto = 対象の地面 filter.option.flooronto = 対象の地面
filter.option.target = ターゲット filter.option.target = ターゲット
filter.option.replacement = 置換
filter.option.wall = filter.option.wall =
filter.option.ore = 鉱石 filter.option.ore = 鉱石
filter.option.floor2 = 2番目の地面 filter.option.floor2 = 2番目の地面
filter.option.threshold2 = 2番目のスレッシュホールド filter.option.threshold2 = 2番目の閾値
filter.option.radius = 半径 filter.option.radius = 半径
filter.option.percentile = パーセンタイル filter.option.percentile = パーセンタイル
@@ -489,6 +511,7 @@ load = 読み込む
save = 保存 save = 保存
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = ゲームを再起動後、言語設定が有効になります。 language.restart = ゲームを再起動後、言語設定が有効になります。
@@ -516,12 +539,14 @@ configure = 積み荷の設定
loadout = ロードアウト loadout = ロードアウト
resources = 資源 resources = 資源
bannedblocks = 禁止ブロック bannedblocks = 禁止ブロック
bannedunits = 禁止ユニット
addall = すべて追加 addall = すべて追加
launch.from = [accent]{0}[] からの発射 launch.from = [accent]{0}[] からの発射
launch.destination = Destination: {0} launch.destination = 目的地: {0}
configure.invalid = 値は 0 から {0} の間でなければなりません。 configure.invalid = 値は 0 から {0} の間でなければなりません。
add = 追加... add = 追加...
boss.health = ボスのHP boss.health = ボスのHP
guardian = ガーディアン
connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0} connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0}
error.unreachable = サーバーに到達できません。\nアドレスは正しいですか? error.unreachable = サーバーに到達できません。\nアドレスは正しいですか?
@@ -540,6 +565,8 @@ weather.sandstorm.name = 砂嵐
weather.sporestorm.name = 胞子嵐 weather.sporestorm.name = 胞子嵐
weather.fog.name = weather.fog.name =
sectorlist = セクター
sectorlist.attacked = {0}が攻撃を受けています
sectors.unexplored = [lightgray]未踏査 sectors.unexplored = [lightgray]未踏査
sectors.resources = 資源: sectors.resources = 資源:
sectors.production = 生産: sectors.production = 生産:
@@ -565,6 +592,7 @@ 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 #note: the missing space in the line below is intentional
sector.captured = セクター [accent]{0}[white]制圧! sector.captured = セクター [accent]{0}[white]制圧!
sector.changeicon = アイコンを変更
threat.low = threat.low =
threat.medium = threat.medium =
@@ -589,27 +617,42 @@ sector.overgrowth.name = オーバーグロウス
sector.tarFields.name = ター · フィールズ sector.tarFields.name = ター · フィールズ
sector.saltFlats.name = ソルト · フラッツ sector.saltFlats.name = ソルト · フラッツ
sector.fungalPass.name = ファングル · パス sector.fungalPass.name = ファングル · パス
sector.biomassFacility.name = バイオマス シンテシス ファシリティ sector.biomassFacility.name = バイオマス · シンテシス · ファシリティ
sector.windsweptIslands.name = ウインドスイープト アイランズ sector.windsweptIslands.name = ウインドスイープト · アイランズ
sector.extractionOutpost.name = エクストラクション アウトポスト sector.extractionOutpost.name = エクストラクション · アウトポスト
sector.planetaryTerminal.name = プラネタリー ローンチ ターミナル sector.planetaryTerminal.name = プラネタリー · ローンチ · ターミナル
sector.groundZero.description = 奪回を始めるには最適な場所です。敵脅威低いが、資源が少ない。\nできるだけ多くのと鉛を集めます。\n始めましょう。 sector.groundZero.description = 奪回を始めるには最適な場所です。敵脅威低いですが、資源が乏しいです。\nできるだけ多くのと鉛を集めます。\n始めましょう。
sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。極寒の気温もそれらを永遠に封じ込めることはできません。\n\n電気に挑みましょう。火力発電機を建設し、修復機の使い方を学びましょう。 sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。\n極寒の気温もそれらを永遠に封じ込めることはできませんでした。\n\n電気に挑みましょう。\n火力発電機を建設し、修復機の使い方を学びましょう。
sector.saltFlats.description = 砂漠のはずれにあるソルト · フラッツです。ここには資源がほとんどありません。\n\n敵はここに資源貯蔵施設を建設しました。彼らのコアを絶ち、掃滅してください。 sector.saltFlats.description = 砂漠のはずれにあるソルト · フラッツです。\nここには資源がほとんどありません。\n\n敵はここに資源貯蔵施設を建設しました。\n彼らのコアを絶ち、掃滅してください。
sector.craters.description = 過去の戦争の名残であるクレーターに水が溜まっています。エリアを取り戻し、砂を集め、メタガラスを精錬します。タレットとドリルを冷却するために水をポンプで送ります。 sector.craters.description = 過去の戦争の名残であるクレーターに水が溜まっています。\nエリアを取り戻し、砂を集め、メタガラスを精錬しましょう。\nタレットとドリルを冷却するために水をポンプで送る必要があります。
sector.ruinousShores.description = 荒れ地を過ぎると海岸線です。ここにはかつて沿岸防衛隊が配備されていましたが、ほぼ残存していません。最も基本的な防衛施設のみが無傷のまま残っており、それ以外は全て破壊されています。\n外部拡張を続け、テクロジーを再取得しましょう sector.ruinousShores.description = 荒れ地を過ぎると海岸線です。\nここにはかつて沿岸防衛隊が配備されていましたが、ほぼ残存していません。\n最も基本的な防衛施設のみが無傷のまま残っており、それ以外は全て破壊されています。\n外部拡張を続け、テクロジーを再取得してください
sector.stainedMountains.description = 更に内陸には、胞子に汚染されていない山があります。\nこの地域にはチタンが豊富にあります。抽出して使い方を学びましょう。\n\nより多くの敵が襲来します。最強のユニットを送る時間を与えないでください。 sector.stainedMountains.description = 更に内陸には、胞子に汚染されていない山があります。\nこの地域にはチタンが豊富にあります。抽出して使い方を学びましょう。\n\nここにはより多くの敵が襲来します。強力なユニットを送る時間を与えないでください。
sector.overgrowth.description = このエリアは、胞子の発生源に近く生い茂っています。\n敵はここに前哨基地を配備しました。タイタンユニットを生産し、破壊しましょう。失ったものを取り戻すのです。 sector.overgrowth.description = このエリアは、胞子の発生源に近く生い茂っています。\n敵はここに前哨基地を配備しました。タイタンユニットを生産し、破壊してください。\n失ったものを取り戻すのです。
sector.tarFields.description = 山と砂漠に挟まれた、石油産出地帯のはずれです。使用可能なタール埋蔵量がある数少ないエリアの1つです。\n放棄されたエリアですが、近くに脅威となる敵がいます。\n\n[lightgray]可能であれば石油抽出機を研究しましょう。 sector.tarFields.description = 山と砂漠に挟まれた、石油産出地帯のはずれです。\n使用可能なタール埋蔵量がある数少ないエリアの1つです。\n放棄されたエリアですが、近くに脅威となる敵がいます。\n\n[lightgray]可能であれば石油抽出機を研究しましょう。
sector.desolateRift.description = 非常に危険な地帯です。資源は豊富ですが、空間が狭いです。破壊されるリスクが高いため、一刻も早く立ち去りましょう。敵の攻撃間隔が長いですが、気を抜かないでください。 sector.desolateRift.description = 非常に危険な地帯です。資源は豊富ですが、領域が十分にありません。破壊されるリスクが高いため、一刻も早く立ち去りましょう。\n敵の攻撃間隔が長いですが、気を抜かないでください。
sector.nuclearComplex.description = 崩壊したトリウム製造・加工施設です。\n[lightgray]トリウムとその多くの用途を研究してください。\n\n多くの敵がここに存在し、常に攻撃を偵察しています。 sector.nuclearComplex.description = 崩壊したトリウム製造・加工施設です。\n[lightgray]トリウムとその多くの用途を研究してください。\n\n多くの敵がここに存在し、常に攻撃を偵察しています。
sector.fungalPass.description = 高山と、胞子の多い低地との間の遷移地域です。ここには敵の小さな偵察基地があります。\n破壊しましょう。\nダガーとクローラーユニットを使い、2つの敵コアの排除しましょう、 sector.fungalPass.description = 高山と、胞子の多い低地との間の遷移地域です。\nここには敵の小さな偵察基地があります。\n破壊してください。\nダガーとクローラーユニットを使い、2つの敵コアの排除しましょう、
sector.biomassFacility.description = 胞子の発生源です。これらは胞子の研究により、最初に建設された施設です。\n内部に残された技術を研究しましょう。燃料とプラスタニウムの生産のために胞子を培養します。\n\n[lightgray]この施設が活動停止したために、胞子が放出されました。地域の生態系には、そのような侵略的生物と競合するものはありません。 sector.biomassFacility.description = 胞子の発生源です。\nこれらは胞子の研究のために、最初に建設された施設です。\n内部に残された技術を研究しましょう。燃料とプラスタニウムの生産のために胞子を培養します。\n\n[lightgray]この施設が活動停止したために、胞子が放出されました。地域の生態系には、そのような侵略的生物と競合するものはありません。
sector.windsweptIslands.description = 海岸をさらに進むと、辺鄙な列島があります。記録によると、ここにはかつて[accent]プラスタニウム[]-を生産するシステムがありました。\n\n敵の海軍ユニットを撃沈しましょう。島々に基地を建造し、これらの工場を調査しましょう。 sector.windsweptIslands.description = 海岸をさらに進むと、辺鄙な列島があります。記録によると、ここにはかつて[accent]プラスタニウム[]を生産するシステムがありました。\n\n敵の海軍ユニットを撃沈してください。島々に基地を建造し、これらの工場を調査しましょう。
sector.extractionOutpost.description = 他のセクターへ資源を輸送するために建設された敵の遠隔地の前哨基地です。\n\nさらなる征伐のためには、セクターを通ずる輸送技術が不可欠です。基地を破壊しましょう。彼らの発射台を研究してください sector.extractionOutpost.description = 他のセクターへ資源を輸送するために建設された敵の遠隔地の前哨基地です。\n\nさらなる征伐のためには、セクターを通ずる輸送技術が不可欠です。基地を破壊してください。彼らの発射台を研究しましょう
sector.impact0078.description = ここには、最初にこの星系に入った星間輸送船の残骸があります。\n\n残骸を可能な限り回収し、完全な技術を研究しましょう。 sector.impact0078.description = ここには、最初にこの星系に入った星間輸送船の残骸があります。\n\n残骸を可能な限り回収し、解析可能な技術を研究しましょう。
sector.planetaryTerminal.description = 最終目標です。\n\nこの沿岸基地には、コアを他の惑星に打ち上げることが出来る建造物があります。極めて堅固に守られています。\n\n海軍ユニットを生産し、できるだけ速やかに敵を排除しましょう。発射建造物を研究しましょう。 sector.planetaryTerminal.description = 最終目標です。\n\nこの沿岸基地には、コアを他の惑星に打ち上げることが出来る建造物があります。しかし、極めて堅固に守られています。\n\n海軍ユニットを生産し、可及的速やかに敵を排除してください。\nそして、発射建造物を研究しましょう。
status.burning.name = 燃焼
status.freezing.name = 凍結
status.wet.name = 湿潤
status.muddy.name = Muddy
status.melting.name = 溶解
status.sapped.name = 吸収
status.electrified.name = 帯電
status.spore-slowed.name = 鈍化胞子
status.tarred.name = 石油塗れ
status.overclock.name = オーバークロック
status.shocked.name = 電撃
status.blasted.name = 爆破
status.unmoving.name = 移動阻止
status.boss.name = ガーディアン
settings.language = 言語 settings.language = 言語
settings.data = ゲームデータ settings.data = ゲームデータ
@@ -632,6 +675,7 @@ settings.clearcampaignsaves.confirm = キャンペーンのセーブデータを
paused = [accent]< ポーズ > paused = [accent]< ポーズ >
clear = 消去 clear = 消去
banned = [scarlet]使用禁止 banned = [scarlet]使用禁止
unsupported.environment = [scarlet]サポートされていない環境
yes = はい yes = はい
no = いいえ no = いいえ
info.title = 情報 info.title = 情報
@@ -641,12 +685,14 @@ unit.nobuild = [scarlet]構築不可
lastaccessed = [lightgray]最終アクセス {0} lastaccessed = [lightgray]最終アクセス {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <表示のマップを読み込む>
stat.description = 説明 stat.description = 説明
stat.input = 搬入 stat.input = 搬入
stat.output = 搬出 stat.output = 搬出
stat.booster = ブースト stat.booster = ブースト
stat.tiles = 必要なタイル stat.tiles = 必要なタイル
stat.affinities = 親和性 stat.affinities = 親和性
stat.opposites = 排他性
stat.powercapacity = 電力容量 stat.powercapacity = 電力容量
stat.powershot = 電力/ショット stat.powershot = 電力/ショット
stat.damage = ダメージ stat.damage = ダメージ
@@ -669,6 +715,7 @@ stat.memorycapacity = メモリー容量
stat.basepowergeneration = 基本発電量 stat.basepowergeneration = 基本発電量
stat.productiontime = 製造速度 stat.productiontime = 製造速度
stat.repairtime = ブロックの完全修復速度 stat.repairtime = ブロックの完全修復速度
stat.repairspeed = 修復速度
stat.weapons = 武器 stat.weapons = 武器
stat.bullet = 弾丸 stat.bullet = 弾丸
stat.speedincrease = 速度向上 stat.speedincrease = 速度向上
@@ -678,6 +725,7 @@ stat.drillspeed = 基本採掘速度
stat.boosteffect = ブースト効果 stat.boosteffect = ブースト効果
stat.maxunits = 最大ユニット数 stat.maxunits = 最大ユニット数
stat.health = 耐久値 stat.health = 耐久値
stat.armor = アーマー
stat.buildtime = 建設時間 stat.buildtime = 建設時間
stat.maxconsecutive = 最大連鎖 stat.maxconsecutive = 最大連鎖
stat.buildcost = 建設費用 stat.buildcost = 建設費用
@@ -693,6 +741,7 @@ stat.lightningchance = 電撃確率
stat.lightningdamage = 電撃ダメージ stat.lightningdamage = 電撃ダメージ
stat.flammability = 可燃性 stat.flammability = 可燃性
stat.radioactivity = 放射能 stat.radioactivity = 放射能
stat.charge = 帯電性
stat.heatcapacity = 熱容量 stat.heatcapacity = 熱容量
stat.viscosity = 粘度 stat.viscosity = 粘度
stat.temperature = 温度 stat.temperature = 温度
@@ -706,13 +755,21 @@ stat.abilities = 能力
stat.canboost = ブースト可能 stat.canboost = ブースト可能
stat.flying = 飛行 stat.flying = 飛行
stat.ammouse = 使用弾薬 stat.ammouse = 使用弾薬
stat.damagemultiplier = ダメージ倍率
stat.healthmultiplier = 体力倍率
stat.speedmultiplier = スピード倍率
stat.reloadmultiplier = リロード倍率
stat.buildspeedmultiplier = 建築速度倍率
stat.reactive = 反応
stat.healing = 治癒
ability.forcefield = フォースフィールド ability.forcefield = フォースフィールド
ability.repairfield = リペアフィールド ability.repairfield = リペアフィールド
ability.statusfield = ステータスフィールド ability.statusfield = {0} ステータスフィールド
ability.unitspawn = {0} 生産 ability.unitspawn = {0} 生産
ability.shieldregenfield = シールドリペアフィールド ability.shieldregenfield = シールドリペアフィールド
ability.movelightning = ムーブメントライトニング ability.movelightning = ムーブメントライトニング
ability.energyfield = エネルギー範囲: [accent]{0}[] ダメージ ~ [accent]{1}[] ブロック / [accent]{2}[] ターゲット
bar.drilltierreq = より高性能なドリルを使用してください bar.drilltierreq = より高性能なドリルを使用してください
bar.noresources = 不足している資源 bar.noresources = 不足している資源
@@ -720,6 +777,7 @@ bar.corereq = コアベースが必要
bar.drillspeed = 採掘速度: {0}/秒 bar.drillspeed = 採掘速度: {0}/秒
bar.pumpspeed = ポンプの速度: {0}/s bar.pumpspeed = ポンプの速度: {0}/s
bar.efficiency = 効率: {0}% bar.efficiency = 効率: {0}%
bar.boost = ブースト: +{0}%
bar.powerbalance = 電力均衡: {0}/秒 bar.powerbalance = 電力均衡: {0}/秒
bar.powerstored = 総蓄電量: {0}/{1} bar.powerstored = 総蓄電量: {0}/{1}
bar.poweramount = 蓄電量: {0} bar.poweramount = 蓄電量: {0}
@@ -734,6 +792,7 @@ bar.power = 電力
bar.progress = 建設状況 bar.progress = 建設状況
bar.input = 入力 bar.input = 入力
bar.output = 出力 bar.output = 出力
bar.strength = [stat]{0}[lightgray]x 強化
units.processorcontrol = [lightgray]プロセッサーの制御下 units.processorcontrol = [lightgray]プロセッサーの制御下
@@ -744,6 +803,7 @@ bullet.sapping = [stat]吸収弾
bullet.homing = [stat]追尾弾 bullet.homing = [stat]追尾弾
bullet.shock = [stat]電撃 bullet.shock = [stat]電撃
bullet.frag = [stat]爆発弾 bullet.frag = [stat]爆発弾
bullet.lightning = [stat]{0}[lightgray]x ライトニング ~ [stat]{1}[lightgray] ダメージ
bullet.buildingdamage = [stat]{0}%[lightgray] 対物ダメージ bullet.buildingdamage = [stat]{0}%[lightgray] 対物ダメージ
bullet.knockback = [stat]{0}[lightgray] ノックバック bullet.knockback = [stat]{0}[lightgray] ノックバック
bullet.pierce = [stat]{0}[lightgray]x レーザー弾 bullet.pierce = [stat]{0}[lightgray]x レーザー弾
@@ -757,6 +817,7 @@ bullet.reload = [stat]リロード速度 {0}[lightgray]倍
unit.blocks = ブロック unit.blocks = ブロック
unit.blockssquared = ブロック² unit.blockssquared = ブロック²
unit.powersecond = 電力/秒 unit.powersecond = 電力/秒
unit.tilessecond = タイル/秒
unit.liquidsecond = 液体/秒 unit.liquidsecond = 液体/秒
unit.itemssecond = アイテム/秒 unit.itemssecond = アイテム/秒
unit.liquidunits = 液体 unit.liquidunits = 液体
@@ -782,17 +843,19 @@ category.items = アイテム
category.crafting = 搬入/搬出 category.crafting = 搬入/搬出
category.function = 役割 category.function = 役割
category.optional = 強化オプション category.optional = 強化オプション
setting.skipcoreanimation.name = コアの打ち上げ/着陸アニメーションをスキップ
setting.landscape.name = 横画面で固定 setting.landscape.name = 横画面で固定
setting.shadows.name = setting.shadows.name =
setting.blockreplace.name = 自動ブロック提案 setting.blockreplace.name = 自動ブロック提案
setting.linear.name = リニアフィルター setting.linear.name = リニアフィルター
setting.hints.name = ヒント setting.hints.name = ヒント
setting.flow.name = 資源流通量の表示 setting.logichints.name = ロジックのヒント
setting.backgroundpause.name = バックグラウンド一時停止 setting.backgroundpause.name = バックグラウンド中は一時停止する
setting.buildautopause.name = オートポーズビルディング setting.buildautopause.name = 常に建築一時中断状態にする
setting.doubletapmine.name = ダブルタップで採掘する
setting.modcrashdisable.name = 起動時にクラッシュした場合にModを無効にする
setting.animatedwater.name = 流体のアニメーション setting.animatedwater.name = 流体のアニメーション
setting.animatedshields.name = シールドのアニメーション setting.animatedshields.name = シールドのアニメーション
setting.antialias.name = アンチエイリアス[lightgray] (再起動が必要)[]
setting.playerindicators.name = プレイヤーの方角表示 setting.playerindicators.name = プレイヤーの方角表示
setting.indicators.name = 敵の方角表示 setting.indicators.name = 敵の方角表示
setting.autotarget.name = オートターゲット setting.autotarget.name = オートターゲット
@@ -801,7 +864,8 @@ setting.touchscreen.name = タッチスクリーン操作
setting.fpscap.name = 最大FPS setting.fpscap.name = 最大FPS
setting.fpscap.none = なし setting.fpscap.none = なし
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UIサイズ[lightgray] (再起動が必要)[] setting.uiscale.name = UIサイズ
setting.uiscale.description = 再起動が必要です。
setting.swapdiagonal.name = 常に斜め設置 setting.swapdiagonal.name = 常に斜め設置
setting.difficulty.training = トレーニング setting.difficulty.training = トレーニング
setting.difficulty.easy = イージー setting.difficulty.easy = イージー
@@ -819,7 +883,9 @@ setting.saveinterval.name = 自動保存間隔
setting.seconds = {0} 秒 setting.seconds = {0} 秒
setting.milliseconds = {0} ミリ秒 setting.milliseconds = {0} ミリ秒
setting.fullscreen.name = フルスクリーン setting.fullscreen.name = フルスクリーン
setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります) setting.borderlesswindow.name = ボーダーレスウィンドウ
setting.borderlesswindow.name.windows = ボーダーレスフルスクリーン
setting.borderlesswindow.description = 再起動が必要になる場合があります。
setting.fps.name = FPSを表示 setting.fps.name = FPSを表示
setting.smoothcamera.name = スムーズなカメラ setting.smoothcamera.name = スムーズなカメラ
setting.vsync.name = 垂直同期 setting.vsync.name = 垂直同期
@@ -865,14 +931,14 @@ keybind.clear_building.name = 建築の取り消し
keybind.press = キーを押してください... keybind.press = キーを押してください...
keybind.press.axis = 軸またはキーを押してください... 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 = 左右移動 keybind.move_x.name = 左右移動
keybind.move_y.name = 上下移動 keybind.move_y.name = 上下移動
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座標で反転
@@ -905,10 +971,11 @@ keybind.shoot.name = ショット
keybind.zoom.name = ズーム keybind.zoom.name = ズーム
keybind.menu.name = メニュー 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.planet_map.name = 惑星地図
keybind.research.name = 研究 keybind.research.name = 研究
keybind.block_info.name = ブロック情報
keybind.chat.name = チャット keybind.chat.name = チャット
keybind.player_list.name = プレイヤーリスト keybind.player_list.name = プレイヤーリスト
keybind.console.name = コンソール keybind.console.name = コンソール
@@ -935,17 +1002,24 @@ mode.custom = カスタムルール
rules.infiniteresources = 資源の無限化 rules.infiniteresources = 資源の無限化
rules.reactorexplosions = リアクターの爆発 rules.reactorexplosions = リアクターの爆発
rules.coreincinerates = 余剰アイテムの焼却
rules.schematic = 設計図を許可 rules.schematic = 設計図を許可
rules.wavetimer = ウェーブの自動進行 rules.wavetimer = ウェーブの自動進行
rules.waves = ウェーブ rules.waves = ウェーブ
rules.attack = アタックモード rules.attack = アタックモード
rules.buildai = AI 建築 rules.buildai = AI 建築
rules.aitier = AI 階級
rules.cleanupdeadteams = 敗北したチームの建設物を片付ける (PvP)
rules.corecapture = 破壊時にコアを奪取
rules.polygoncoreprotection = 多角形の建設禁止区域の設定
rules.enemyCheat = 敵(赤チーム)の資源の無限化 rules.enemyCheat = 敵(赤チーム)の資源の無限化
rules.blockhealthmultiplier = ブロックの体力倍率 rules.blockhealthmultiplier = ブロックの体力倍率
rules.blockdamagemultiplier = ブロックのダメージ倍率 rules.blockdamagemultiplier = ブロックのダメージ倍率
rules.unitbuildspeedmultiplier = ユニットの製造速度倍率 rules.unitbuildspeedmultiplier = ユニットの製造速度倍率
rules.unithealthmultiplier = ユニットの体力倍率 rules.unithealthmultiplier = ユニットの体力倍率
rules.unitdamagemultiplier = ユニットのダメージ倍率 rules.unitdamagemultiplier = ユニットのダメージ倍率
rules.unitcapvariable = コア数によってユニット上限を変動
rules.unitcap = ベースのユニット上限数
rules.enemycorebuildradius = 敵コア周辺の建設禁止区域の半径:[lightgray] (タイル) rules.enemycorebuildradius = 敵コア周辺の建設禁止区域の半径:[lightgray] (タイル)
rules.wavespacing = ウェーブ間の待機時間:[lightgray] (秒) rules.wavespacing = ウェーブ間の待機時間:[lightgray] (秒)
rules.buildcostmultiplier = 建設コストの倍率 rules.buildcostmultiplier = 建設コストの倍率
@@ -954,26 +1028,30 @@ rules.deconstructrefundmultiplier = ブロック破壊時の還元倍率
rules.waitForWaveToEnd = 敵が倒されるまでウェーブの進行を中断 rules.waitForWaveToEnd = 敵が倒されるまでウェーブの進行を中断
rules.dropzoneradius = 出現範囲の半径:[lightgray] (タイル) rules.dropzoneradius = 出現範囲の半径:[lightgray] (タイル)
rules.unitammo = ユニットは弾丸が必要 rules.unitammo = ユニットは弾丸が必要
rules.enemyteam = 敵チーム
rules.playerteam = プレイヤーチーム
rules.title.waves = ウェーブ rules.title.waves = ウェーブ
rules.title.resourcesbuilding = 資源 & 建設 rules.title.resourcesbuilding = 資源 & 建設
rules.title.enemy = rules.title.enemy =
rules.title.unit = ユニット rules.title.unit = ユニット
rules.title.experimental = 実験的なゲームプレイ rules.title.experimental = 実験的なゲームプレイ
rules.title.environment = 環境 rules.title.environment = 環境
rules.title.teams = チーム
rules.lighting = rules.lighting =
rules.enemyLights = Enemy Lights rules.enemyLights = 敵を発光させる
rules.fire = Fire rules.fire = 火災
rules.explosions = 爆発ダメージ rules.explosions = 爆発ダメージ
rules.ambientlight = 霧の色 rules.ambientlight = 霧の色
rules.weather = 気象 rules.weather = 気象
rules.weather.frequency = 頻度: rules.weather.frequency = 頻度:
rules.weather.always = Always rules.weather.always = 常時
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.status.name = ステータス効果
content.sector.name = セクター content.sector.name = セクター
item.copper.name = item.copper.name =
@@ -992,6 +1070,7 @@ item.blast-compound.name = 爆発性化合物
item.pyratite.name = ピラタイト item.pyratite.name = ピラタイト
item.metaglass.name = メタガラス item.metaglass.name = メタガラス
item.scrap.name = スクラップ item.scrap.name = スクラップ
liquid.water.name = liquid.water.name =
liquid.slag.name = スラグ liquid.slag.name = スラグ
liquid.oil.name = 石油 liquid.oil.name = 石油
@@ -1023,6 +1102,11 @@ unit.minke.name = ミンク
unit.bryde.name = ブライド unit.bryde.name = ブライド
unit.sei.name = セイ unit.sei.name = セイ
unit.omura.name = オムラ unit.omura.name = オムラ
unit.retusa.name = レトゥーザ
unit.oxynoe.name = オキシノ
unit.cyerce.name = サイラス
unit.aegires.name = エイガース
unit.navanax.name = ナバナックス
unit.alpha.name = アルファ unit.alpha.name = アルファ
unit.beta.name = ベータ unit.beta.name = ベータ
unit.gamma.name = ガンマ unit.gamma.name = ガンマ
@@ -1031,7 +1115,6 @@ unit.reign.name = レイン
unit.vela.name = ヴェラ unit.vela.name = ヴェラ
unit.corvus.name = コーバス unit.corvus.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 = 巨大な礫
@@ -1083,6 +1166,7 @@ block.sand-water.name = 濁った水
block.darksand-water.name = 黒い砂で濁った水 block.darksand-water.name = 黒い砂で濁った水
block.char.name = 焦げ跡 block.char.name = 焦げ跡
block.dacite.name = デイサイト block.dacite.name = デイサイト
block.rhyolite.name = 流紋岩
block.dacite-wall.name = デイサイトの壁 block.dacite-wall.name = デイサイトの壁
block.dacite-boulder.name = デイサイトの礫 block.dacite-boulder.name = デイサイトの礫
block.ice-snow.name = 雪氷 block.ice-snow.name = 雪氷
@@ -1094,12 +1178,13 @@ block.pine.name = 松の木
block.dirt.name = block.dirt.name =
block.dirt-wall.name = 泥の壁 block.dirt-wall.name = 泥の壁
block.mud.name = 汚泥 block.mud.name = 汚泥
block.white-tree-dead.name = 白い枯れた樹木 block.white-tree-dead.name = 枯れた白い樹木
block.white-tree.name = 白い樹木 block.white-tree.name = 白い樹木
block.spore-cluster.name = 胞子の房 block.spore-cluster.name = 胞子の房
block.metal-floor.name = 金属製の地面 1 block.metal-floor.name = 金属製の地面 1
block.metal-floor-2.name = 金属製の地面 2 block.metal-floor-2.name = 金属製の地面 2
block.metal-floor-3.name = 金属製の地面 3 block.metal-floor-3.name = 金属製の地面 3
block.metal-floor-4.name = 金属製の地面 4
block.metal-floor-5.name = 金属製の地面 5 block.metal-floor-5.name = 金属製の地面 5
block.metal-floor-damaged.name = 破壊された金属製の地面 block.metal-floor-damaged.name = 破壊された金属製の地面
block.dark-panel-1.name = ダークパネル 1 block.dark-panel-1.name = ダークパネル 1
@@ -1190,6 +1275,7 @@ block.solar-panel.name = ソーラーパネル
block.solar-panel-large.name = 大型ソーラーパネル block.solar-panel-large.name = 大型ソーラーパネル
block.oil-extractor.name = 石油抽出機 block.oil-extractor.name = 石油抽出機
block.repair-point.name = 修復ポイント block.repair-point.name = 修復ポイント
block.repair-turret.name = 修復ターレット
block.pulse-conduit.name = パルスパイプ block.pulse-conduit.name = パルスパイプ
block.plated-conduit.name = メッキパイプ block.plated-conduit.name = メッキパイプ
block.phase-conduit.name = フェーズパイプ block.phase-conduit.name = フェーズパイプ
@@ -1220,7 +1306,6 @@ 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.segment.name = セグメント block.segment.name = セグメント
block.command-center.name = 司令塔 block.command-center.name = 司令塔
block.ground-factory.name = 陸軍工場 block.ground-factory.name = 陸軍工場
@@ -1232,14 +1317,20 @@ block.exponential-reconstructor.name = 指数式再構成工場
block.tetrative-reconstructor.name = 超冪式再構成工場 block.tetrative-reconstructor.name = 超冪式再構成工場
block.payload-conveyor.name = マスコンベアー block.payload-conveyor.name = マスコンベアー
block.payload-router.name = ペイロードルーター block.payload-router.name = ペイロードルーター
block.duct.name = ダクト
block.duct-router.name = ダクトルーター
block.duct-bridge.name = ダクトブリッジ
block.payload-propulsion-tower.name = ペイロード推進タワー
block.payload-void.name = ペイロードボイド
block.payload-source.name = ペイロードソース
block.disassembler.name = ディスアセンブラー block.disassembler.name = ディスアセンブラー
block.silicon-crucible.name = シリコンクルーシブル block.silicon-crucible.name = シリコンクルーシブル
block.overdrive-dome.name = 加速ドーム block.overdrive-dome.name = 加速ドーム
block.interplanetary-accelerator.name = 惑星間加速器
#experimental, may be removed #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 = マイクロプロセッサー
@@ -1259,73 +1350,75 @@ team.green.name = グリーン
team.purple.name = パープル team.purple.name = パープル
hint.skip = スキップ hint.skip = スキップ
hint.desktopMove = [accent][[WASD][] を使い移動します。 hint.desktopMove = [accent][[WASD][]を使い移動します。
hint.zoom = [accent]マウスホイール[] でズームイン、ズームアウトをします。 hint.zoom = [accent]マウスホイール[]でズームイン、ズームアウトをします。
hint.mine = \uf8c4 銅の近くに移動し、 [accent]タップ[] して手動で採掘します。 hint.mine = \uf8c4 銅の近くに移動し、[accent]タップ[]して手動で採掘します。
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][[スペース][] を押して、ゲームを一時停止と一時停止の解除ができます。 hint.desktopPause = [accent][[スペース][]を押して、ゲームを一時停止と一時停止の解除ができます。
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]チェックマーク[]をタップして確認します。
hint.placeConveyor = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。 \ue814 [accent]運搬[] タブから、 \uf896 [accent]コンベアー[] を選択します。\n\n複数のコンベアーを配置するには、クリックしてドラッグします。\n[accent]マウスホイール[] により回転します。 hint.placeConveyor = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。\ue814 [accent]運搬[]タブから、\uf896 [accent]コンベアー[]を選択します。\n\n複数のコンベアーを配置するには、クリックしてドラッグします。\n[accent]マウスホイール[]により回転します。
hint.placeConveyor.mobile = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。 \ue814 [accent]運搬[] タブから、 \uf896 [accent]コンベアー[] を選択します。\n\n指を秒間押したままドラッグすると、複数のコンベアーを配置します。 hint.placeConveyor.mobile = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。\ue814 [accent]運搬[]タブから、\uf896 [accent]コンベアー[]を選択します。\n\n指を秒間押したままドラッグすると、複数のコンベアーを配置します。
hint.placeTurret = \uf861 [accent]ターレット[] を配置して、敵から基地を守ります。\n\nターレットには弾薬が必要です。この場合は \uf838銅です。\nコンベアーとドリルを使用して補給します。 hint.placeTurret = \uf861 [accent]ターレット[]を配置して、敵から基地を守ります。\n\nターレットには弾薬が必要です。この場合は\uf838銅です。\nコンベアーとドリルを使用して補給します。
hint.breaking = [accent]右クリック[] と右クリックドラッグによりブロックを壊します。 hint.breaking = [accent]右クリック[]と右クリックドラッグによりブロックを壊します。
hint.breaking.mobile = 右下にある \ue817 [accent]ハンマー[] をアクティブにして、タップしてブロックを壊します。\n\n指を秒間押したままドラッグすると、範囲選択が出来ます。 hint.breaking.mobile = 右下にある\ue817 [accent]ハンマー[]をアクティブにして、タップしてブロックを壊します。\n\n指を秒間押したままドラッグすると、範囲選択が出来ます。
hint.research = \ue875 [accent]研究[] ボタンを押して、新しいテクノロジーを研究します。 hint.blockInfo = [accent]建築メニュー[]でブロックを選択し、右側の[accent][[?][]ボタンを押すと、ブロックの情報が表示されます。
hint.research.mobile = \ue88c [accent]メニュー[] の \ue875 [accent]研究[] ボタンを押して、新しいテクノロジーを研究します。 hint.derelict = [accent]放棄[]され、すでに機能を失った古い基地建造物の残骸です。\n\nこれらは[accent]解体[]することにより、資源になります。
hint.unitControl = [accent][[左ctrl][] を押しながら [accent]クリック[] するとターレットや味方ユニットを操作できます。 hint.research = \ue875 [accent]研究[]ボタンを押して、新しいテクノロジーを研究します。
hint.unitControl.mobile = [accent][ダブルタップ[] すると味方ユニットやターレットを操作できます。 hint.research.mobile = \ue88c [accent]メニュー[]の\ue875 [accent]研究[]ボタンを押して、新しいテクノロジーを研究します。
hint.launch = 十分な資源を確保できたら、右下の \ue827 [accent]マップ[] から、近くのセクターを選択して [accent]発射[] できます。 hint.unitControl = [accent][[左ctrl][]を押しながら[accent]クリック[]するとターレットや味方ユニットを操作できます。
hint.launch.mobile = 十分な資源を確保できたら、 \ue88c [accent]メニュー[] の \ue827 [accent]マップ[] から、近くのセクターを選択して [accent]発射[] できます。 hint.unitControl.mobile = [accent][ダブルタップ[]すると味方ユニットやターレットを操作できます。
hint.schematicSelect = [accent][[F][] を押しながらドラッグして、コピー&ペーストするブロックを選択します。\n\n[accent][[ミドルクリック][] により、1つのブロックタイプをコピーします。 hint.launch = 十分な資源を確保できたら、右下の\ue827 [accent]マップ[]から、近くのセクターを選択して[accent]発射[]できます。
hint.conveyorPathfind = [accent][[左-Ctrl][] を押しながらコンベアーをドラッグすると、経路が自動生成されます。 hint.launch.mobile = 十分な資源を確保できたら、\ue88c [accent]メニュー[]の\ue827 [accent]マップ[]から、近くのセクターを選択して[accent]発射[]できます。
hint.conveyorPathfind.mobile = \ue844 [accent]対角線モード[] を有効にし、コンベアーをドラッグすると経路が自動生成します。 hint.schematicSelect = [accent][[F][]を押しながらドラッグして、コピー&ペーストするブロックを選択します。\n\n[accent][[ミドルクリック][]により、1つのブロックタイプをコピーします。
hint.boost = [accent][[左シフト][] を押したままにすると、操作中のユニットは障害物を飛び越えます。\n\n少数の地上ユニットのみがこのブースターを搭載しています。 hint.conveyorPathfind = [accent][[左-Ctrl][]を押しながらコンベアーをドラッグすると、経路が自動生成されます。
hint.command = [accent][[G][] を押して、近くの [accent]同様のタイプ[] のユニットと編隊を組みます。\n\n地上ユニットを指揮するには、まず別個の地上ユニットをコントロールする必要があります。 hint.conveyorPathfind.mobile = \ue844 [accent]対角線モード[]を有効にし、コンベアーをドラッグすると経路が自動生成します。
hint.command.mobile = [accent][[ダブルタップ][] すると、操作中のユニットは近くのユニットと編隊を組みます。 hint.boost = [accent][[左シフト][]を押したままにすると、操作中のユニットは障害物を飛び越えます。\n\n少数の地上ユニットのみがこのブースターを搭載しています。
hint.payloadPickup = [accent][[[] を押して、小さなブロックまたはユニットを格納します。 hint.command = [accent][[G][]を押して、近くの [accent]同様のタイプ[]のユニットと編隊を組みます。\n\n地上ユニットを指揮するには、まず別個の地上ユニットをコントロールする必要があります。
hint.payloadPickup.mobile = [accent]タップ&ホールド[] により、小さなブロックまたはユニットを格納します。 hint.command.mobile = [accent][[ダブルタップ][]すると、操作中のユニットは近くのユニットと編隊を組みます。
hint.payloadDrop = [accent]][] を押すと、積載物を降ろします。 hint.payloadPickup = [accent][[[]を押して、小さなブロックまたはユニットを格納します。
hint.payloadDrop.mobile = 空いている場所を [accent]タップ&ホールド[] して、積載物を降ろします。 hint.payloadPickup.mobile = [accent]タップ&ホールド[]により、小さなブロックまたはユニットを格納します。
hint.waveFire = [accent]ウェーブ[] ターレットは水を搬入すると、近くの火を自動的に消火します。 hint.payloadDrop = [accent]][]を押すと、積載物を降ろします。
hint.generator = \uf879 [accent]火力発電機[] 石炭を燃やし、隣接するブロックに電力を供給します。\n\n電力供給範囲は \uf87f [accent]電源ノード[]で拡張できます。 hint.payloadDrop.mobile = 空いている場所を[accent]タップ&ホールド[]して、積載物を降ろします。
hint.guardian = [accent]ガーディアン[] ユニットは装甲を搭載しています。[accent]銅[] や [accent]鉛[] などの弱い弾薬は [scarlet]効果がありません[]。\n\n強力なターレット、または \uf861デュオ/\uf859サルボー の弾薬に \uf835 [accent]黒鉛[]を使用してガーディアンを撃破してください hint.waveFire = [accent]ウェーブ[]ターレットは水を搬入すると、近くの火を自動的に消火します
hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n  [accent]シャード[] コアの上に、  [accent]ファンデーション[] コアを置きます。近くに障害物がないことを確認してください hint.generator = \uf879 [accent]火力発電機[]石炭を燃やし、隣接するブロックに電力を供給します。\n\n電力供給範囲は\uf87f [accent]電源ノード[]で拡張できます
hint.presetLaunch = [accent]フローズン · フォレスト[] などの灰色の [accent]着陸ゾーンセクター[] には、どこからでも発射できます。近くの領土を確保する必要はありません。\n\nこのような [accent]数字のセクター[] は、 [accent]違います[] hint.guardian = [accent]ガーディアン[]ユニットは装甲を搭載しています。[accent]銅[]や[accent]鉛[]などの弱い弾薬は[scarlet]効果がありません[]。\n\n強力なターレット、または\uf861デュオ/\uf859サルボーの弾薬に\uf835 [accent]黒鉛[]を使用してガーディアンを撃破してください
hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず [accent]破棄[]されます hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n  [accent]シャード[]コアの上に、  [accent]ファンデーション[]コアを置きます。近くに障害物がないことを確認してください
hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは [accent]あなたのセクター[] に移送されます。\n\nホストが行った新しい研究も引き継がれます hint.presetLaunch = [accent]フローズン · フォレスト[]などの灰色の[accent]着陸ゾーンセクター[]には、どこからでも発射できるため近くの領土を確保する必要はありません。\n\nしかし、このような[accent]数字のセクター[]では[accent]この限りではありません[]
hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず[accent]破棄[]されます。
hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは[accent]あなたのセクター[]に移送されます。\n\nホストが行った新しい研究も引き継がれます。
item.copper.description = 便利な鉱石です。様なブロックの材料として幅広く使われています。 item.copper.description = 便利な鉱石です。\n多様なブロックの材料として幅広く使われています。
item.copper.details = セルプロに豊富な金属補強しない限り構造的に弱い。 item.copper.details = セルプロに豊富な金属です。\n補強しない限り構造的に弱いです
item.lead.description = 一般的で手軽な鉱石です。機械や液体輸送ブロックなどに使われます。 item.lead.description = 一般的で手軽な鉱石です。\n機械や液体輸送ブロックなどに使われます。
item.lead.details = 高密度不活性。バッテリーによく利用され。\nート: 生物学的に生命に有毒である可能性があります。このあたりには生命が多く残っていません。 item.lead.details = 高密度不活性です。バッテリーによく利用されます。\nート: 生物学的に有毒である可能性があります。このあたりには生命があまり見られません。
item.metaglass.description = とても頑丈な強化ガラスです。液体の輸送やタンクとして幅広く使われています。 item.metaglass.description = とても頑丈な強化ガラスです。\n液体の輸送やタンク、工場などに幅広く使われています。
item.graphite.description = 弾薬や絶縁体として利用されています。 item.graphite.description = 弾薬や絶縁体として利用されています。
item.sand.description = 合金や融剤など広く使用されている一般的な材料です。 item.sand.description = 合金や融剤など広く使用されている一般的な材料です。
item.coal.description = 一般的で有用な燃料です。 item.coal.description = 一般的で有用な燃料です。
item.coal.details = 化石化し植物のようで利用方法が確立されるはるか前に形成されました。 item.coal.details = 化石化し植物のようで\n利用方法が確立されるはるか前に形成されました。
item.titanium.description = 希少で非常に軽量な金属です。液体輸送やドリル、航空機などで使われます。 item.titanium.description = 希少で非常に軽量な金属です。\n液体輸送やドリル、航空機などで使われます。
item.thorium.description = 放射性を持つ高密度な金属です。建造物の支えや核燃料として使われます。 item.thorium.description = 放射性を持つ高密度な金属です。\n建造物の支えや核燃料として使われます。
item.scrap.description = 昔の建造物やユニットの残骸です。様々な種類の金属が微量に含まれています。 item.scrap.description = 昔の建造物やユニットの残骸です。\n多種多様の金属が微量に含まれています。
item.scrap.details = 古い建造物やユニットの残骸です。 item.scrap.details = 古い建造物やユニットの残骸です。
item.silicon.description = 非常に有用な半導体でソーラーパネルや多くの複雑な機械に応用できます。 item.silicon.description = 非常に有用な半導体でソーラーパネルや多くの複雑な機械に応用できます。
item.plastanium.description = 軽量で伸縮性のある材料です。高度な航空機や分散型の弾薬として使用されます。 item.plastanium.description = 軽量で伸縮性のある材料です。\n高度な航空機や分散型の弾薬として使用されます。
item.phase-fabric.description = 極めて軽量な素材です。高度な機械や自己修復技術に使用されます。 item.phase-fabric.description = 極めて軽量な素材です。\n高度な機械や自己修復技術に使用されます。
item.surge-alloy.description = 電気的特性を持った高度な合金です。 item.surge-alloy.description = 電気的特性を持った高度な合金です。
item.spore-pod.description = 石油や爆薬、燃料への転換として使用されます。 item.spore-pod.description = 石油や爆薬、燃料への転換として使用されます。
item.spore-pod.details = 合成生命体と思われる胞子です。他の生物に有毒なガスを放出し、非常に侵略的です。特定の条件下で非常に高い可燃性を持ちます。 item.spore-pod.details = 人工生命体と思われる胞子です。\n他の生物に有毒なガスを放出し、非常に侵略的です。特定の条件下で非常に高い可燃性を持ちます。
item.blast-compound.description = 爆弾や爆発物に使われる不安定な化合物です。胞子と揮発性物質から合成されます。燃料として燃やすこともできますが、お勧めしません。 item.blast-compound.description = 爆弾や爆発物に使われる不安定な化合物です。\n胞子と揮発性物質から合成されます。燃料として燃やすこともできますが、お勧めしません。
item.pyratite.description = 焼夷兵器などに使われる非常に燃えやすい物質です。 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.derelict =  [lightgray]放棄
block.armored-conveyor.description = チタンコンベアーと同じ速度でアイテムを輸送することができ、耐久性に優れています。\nまた、コンベアー以外による側面への入力を受け入れません。 block.armored-conveyor.description = チタンコンベアーと同じ速度でアイテムを輸送することができ、耐久性に優れています。\nまた、コンベアー以外による側面への入力を受け入れません。
block.illuminator.description = 電力が必要な光源です。 block.illuminator.description = 電力が必要な光源です。
block.message.description = メッセージを保存し、仲間間の通信に使用します。 block.message.description = メッセージを保存し、仲間間の通信に使用します。
@@ -1339,8 +1432,8 @@ 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 = スラグを分離して、多様な鉱石を回収します。
block.spore-press.description = 胞子ポッドを石油に圧縮します。 block.spore-press.description = 胞子ポッドを石油に圧縮します。
block.pulverizer.description = 石を砕いて砂にします。自然の砂がない場合に有用です。 block.pulverizer.description = 石を砕いて砂にします。自然の砂がない場合に有用です。
block.coal-centrifuge.description = 石油を石炭へ加工します。 block.coal-centrifuge.description = 石油を石炭へ加工します。
@@ -1351,14 +1444,16 @@ block.item-source.description = アイテムを無限に搬出します。サン
block.item-void.description = 電力を必要とせずにアイテムを廃棄します。サンドボックスモードのみ使用できます。 block.item-void.description = 電力を必要とせずにアイテムを廃棄します。サンドボックスモードのみ使用できます。
block.liquid-source.description = 液体を無限に搬出します。サンドボックスモードのみ使用できます。 block.liquid-source.description = 液体を無限に搬出します。サンドボックスモードのみ使用できます。
block.liquid-void.description = 液体を破棄できます。サンドボックスモードのみ使用できます。 block.liquid-void.description = 液体を破棄できます。サンドボックスモードのみ使用できます。
block.payload-source.description = ペイロードを無限に搬出します。サンドボックスモードのみ使用できます。
block.payload-void.description = ペイロードを破棄できます。サンドボックスモードのみ使用できます。
block.copper-wall.description = 安価な防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。 block.copper-wall.description = 安価な防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。
block.copper-wall-large.description = 安価な大型防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。 block.copper-wall-large.description = 安価な大型防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。
block.titanium-wall.description = 適度に強力な防壁ブロックです。\n中程度の攻撃から保護します。 block.titanium-wall.description = 適度に強力な防壁ブロックです。\n中程度の攻撃から保護します。
block.titanium-wall-large.description = 適度に強力な大型防壁ブロックです。\n中程度の攻撃から保護します。 block.titanium-wall-large.description = 適度に強力な大型防壁ブロックです。\n中程度の攻撃から保護します。
block.plastanium-wall.description = 電気アークを吸収し、電源ノードの自動接続をブロックする特別な壁です。 block.plastanium-wall.description = 電気アークを吸収し、電源ノードの自動接続をブロックする特別な壁です。
block.plastanium-wall-large.description = 電気アークを吸収し、電源ノードの自動接続をブロックする特別で大型な壁です。 block.plastanium-wall-large.description = 電気アークを吸収し、電源ノードの自動接続をブロックする特別で大型な壁です。
block.thorium-wall.description = 強化された防壁ブロックです。\n敵からの保護により強固です。 block.thorium-wall.description = より強固に強化された防壁ブロックです。
block.thorium-wall-large.description = 強化された大型防壁ブロックです。\n敵からの保護により強固です。 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 = 最も硬い防壁ブロックです。\nたまに攻撃されると敵に電撃を与えます。 block.surge-wall.description = 最も硬い防壁ブロックです。\nたまに攻撃されると敵に電撃を与えます。
@@ -1376,21 +1471,21 @@ block.plastanium-conveyor.description = アイテムをまとめて輸送する
block.junction.description = 十字に交差したコンベアーをそれぞれ前方に搬出します。コンベアーで複雑な構造を組み立てるときに便利です。 block.junction.description = 十字に交差したコンベアーをそれぞれ前方に搬出します。コンベアーで複雑な構造を組み立てるときに便利です。
block.bridge-conveyor.description = 高度な輸送ブロックです。地形や建物を超えて、3ブロック離れた場所にアイテムを輸送することができます。 block.bridge-conveyor.description = 高度な輸送ブロックです。地形や建物を超えて、3ブロック離れた場所にアイテムを輸送することができます。
block.phase-conveyor.description = 改良されたアイテム転送ブロックです。電力を使用して、離れた場所にあるフェーズコンベアーにアイテムを転送することができます。 block.phase-conveyor.description = 改良されたアイテム転送ブロックです。電力を使用して、離れた場所にあるフェーズコンベアーにアイテムを転送することができます。
block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。 block.sorter.description = アイテムを分別して搬出します。設定したアイテムは前面へ搬出します。他のアイテムが搬入されると側面に搬出します。
block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出されます。他のアイテムが搬入されるとアイテムを通過させます。通常のルーターと反対の動作をします。 block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出ます。他のアイテムが搬入されると前面へ搬出します。
block.router.description = 搬入したアイテムをほかの3方向均等に搬出します。一つの資源から複数に分ける際などに使われます。 block.router.description = 搬入したアイテムをほかの3方向均等に搬出します。一つの資源から複数に分ける際などに使われます。
block.router.details = 最悪の設置は、搬入のために生産施設に隣接させることです。搬出によって詰まる可能性があるためおすすめできません。 block.router.details = 最悪の設置は、搬入のために生産施設に隣接させることです。搬出アイテムにより詰まる可能性があるためおすすめできません。
block.distributor.description = 高度なルーターです。搬入したアイテムをほかの7方向均等に分けて搬出します。 block.distributor.description = 高度なルーターです。搬入したアイテムをほかの7方向均等に分けて搬出します。
block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合左右にアイテムを搬出します。 block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合左右にアイテムを搬出します。
block.underflow-gate.description = オーバーフローゲートの反対の機能を持ちます。 左右に出力できない場合、前面に出力します。 block.underflow-gate.description = オーバーフローゲートの反対の機能を持ちます。 左右に出力できない場合、前面に出力します。
block.mass-driver.description = 長距離の輸送が可能な上位アイテム輸送ブロックです。離れた別のマスドライバーにアイテムを発射します。 block.mass-driver.description = 長距離の輸送が可能な上位アイテム輸送ブロックです。離れた別のマスドライバーにアイテムを発射します。
block.mechanical-pump.description = 安価なポンプです。搬出速度は遅いですが、電力を使わず使用できます。 block.mechanical-pump.description = 安価なポンプです。搬出速度は遅いですが、電力を使わず使用できます。
block.rotary-pump.description = 高度なポンプです。電力を使用して2倍速く搬出することができます。 block.rotary-pump.description = 高度なポンプです。電力が必要ですが、より多く搬出することができます。
block.thermal-pump.description = 最高性能のポンプです。 block.thermal-pump.description = 最高性能のポンプです。
block.conduit.description = 一般的な液体輸送ブロックです。液体版のコンベアーです。ポンプや他のパイプに使うことができます。 block.conduit.description = 一般的な液体輸送ブロックです。液体版のコンベアーです。ポンプや他のパイプに使うことができます。
block.pulse-conduit.description = 高度な液体輸送ブロックです。通常のパイプより速くたくさんの液体を輸送することができます。 block.pulse-conduit.description = 高度な液体輸送ブロックです。通常のパイプより速くたくさんの液体を輸送することができます。
block.plated-conduit.description = パルスパイプと同じ速度で液体を輸送することができ、耐久性に優れています。\nまた、パイプ以外による側面への入力を受け入れません。 block.plated-conduit.description = パルスパイプと同じ速度で液体を輸送することができ、耐久性に優れています。\nまた、パイプ以外による側面への入力を受け入れません。
block.liquid-router.description = 搬入したアイテムをほかの3方向均等に搬出します。液体の漏れを防ぐことができます。一つの資源から複数に分ける際などに使われます。 block.liquid-router.description = 搬入したアイテムをほかの3方向均等に搬出します。液体の漏れを防ぐことができます。一つの資源から複数に分ける際などに使われます。
block.liquid-tank.description = 大量の液体を保管しておくことができます。需要が不安定な製造設備や重要な施設の冷却水の予備などとして使用されます。 block.liquid-tank.description = 大量の液体を保管しておくことができます。需要が不安定な製造設備や重要な施設の冷却水の予備などとして使用されます。
block.liquid-junction.description = パイプを他のパイプと交差できるようにします。それぞれ搬入した液体を前方に搬出します。パイプで複雑な構造を組み立てるときなどに使われます。 block.liquid-junction.description = パイプを他のパイプと交差できるようにします。それぞれ搬入した液体を前方に搬出します。パイプで複雑な構造を組み立てるときなどに使われます。
block.bridge-conduit.description = 高度な液体輸送ブロックです。地形や建物を超えて、3ブロック離れた場所に液体を輸送することができます。 block.bridge-conduit.description = 高度な液体輸送ブロックです。地形や建物を超えて、3ブロック離れた場所に液体を輸送することができます。
@@ -1429,7 +1524,7 @@ 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 = バブルの連射攻撃をする中型のターレットです。
@@ -1442,7 +1537,7 @@ block.ripple.description = 同時に複数ショットを発射する大型タ
block.cyclone.description = 大型の連射型ターレットです。 block.cyclone.description = 大型の連射型ターレットです。
block.spectre.description = 一度に2発の強力な弾を放つ大型のターレットです。 block.spectre.description = 一度に2発の強力な弾を放つ大型のターレットです。
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 = 航空ユニットを引き込むビームを発射し、その過程でターゲットにダメージを与えます。
@@ -1469,22 +1564,24 @@ block.memory-bank.description = より多くの情報を格納します。
block.logic-display.description = プロセッサからの任意のグラフィックを表示します。 block.logic-display.description = プロセッサからの任意のグラフィックを表示します。
block.large-logic-display.description = プロセッサからの任意のグラフィックを表示します。 block.large-logic-display.description = プロセッサからの任意のグラフィックを表示します。
block.interplanetary-accelerator.description = 巨大な電磁レールガンタワーです。別惑星への展開のためにコアを重力圏脱出可能速度まで加速します。 block.interplanetary-accelerator.description = 巨大な電磁レールガンタワーです。別惑星への展開のためにコアを重力圏脱出可能速度まで加速します。
block.repair-turret.description = 範囲内の損傷したブロックを近い順に継続的に修復します。オプションで冷却液を活用できます。
block.payload-propulsion-tower.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 = 敵にダメージを与え、味方の建造物を修復する光線を発射します。\n飛行可能。
unit.pulsar.description = 敵にダメージを与え、味方の建造物を修復する電撃攻撃を行います。飛行可能。 unit.pulsar.description = 敵にダメージを与え、味方の建造物を修復する電撃攻撃を行います。\n飛行可能。
unit.quasar.description = 敵にダメージを与え、味方の建造物を修復するレーザー弾を発射します。飛行可能。シールド形成。 unit.quasar.description = 敵にダメージを与え、味方の建造物を修復するレーザー弾を発射します。\n飛行可能。シールド形成。
unit.vela.description = 敵にダメージを与え、火災を引き起こし、味方の建造物を修復するレーザー焼夷弾を発射します。飛行可能。 unit.vela.description = 敵にダメージを与え、火災を引き起こし、味方の建造物を修復するレーザー焼夷弾を発射します。\n飛行可能。
unit.corvus.description = 敵にダメージを与え、味方の建造物を修復する大火力のレーザー弾を発射します。ほとんどの地形を無視できます。 unit.corvus.description = 敵にダメージを与え、味方の建造物を修復する大火力のレーザー弾を発射します。\nほとんどの地形を無視できます。
unit.crawler.description = 敵に向かって走り自爆し、大爆発を起こす。 unit.crawler.description = 敵に向かって走り自爆し、大爆発を起こす。
unit.atrax.description = 地上目標を消耗させるスラグ弾を発射します。ほとんどの地形を無視できます。 unit.atrax.description = 地上目標を消耗させるスラグ弾を発射します。\nほとんどの地形を無視できます。
unit.spiroct.description = 敵に吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。 unit.spiroct.description = 敵に吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。\nほとんどの地形を無視できます。
unit.arkyid.description = 敵に大口径の吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。 unit.arkyid.description = 敵に大口径の吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。\nほとんどの地形を無視できます。
unit.toxopid.description = 敵に大口径の電撃クラスターシェルと貫通レーザーを発射します。ほとんどの地形を無視できます。 unit.toxopid.description = 敵に大口径の電撃クラスターシェルと貫通レーザーを発射します。\nほとんどの地形を無視できます。
unit.flare.description = 近くの地上目標に標準的な弾丸を発射します。 unit.flare.description = 近くの地上目標に標準的な弾丸を発射します。
unit.horizon.description = 地上目標にクラスター爆弾を投下します。 unit.horizon.description = 地上目標にクラスター爆弾を投下します。
unit.zenith.description = 近くの敵にミサイルを一斉発射します。 unit.zenith.description = 近くの敵にミサイルを一斉発射します。
@@ -1492,14 +1589,19 @@ unit.antumbra.description = 近くの敵に弾幕のように弾丸を連射し
unit.eclipse.description = 近くの敵に2門の貫通レーザーと高射砲の弾幕を発射します。 unit.eclipse.description = 近くの敵に2門の貫通レーザーと高射砲の弾幕を発射します。
unit.mono.description = 銅と鉛を自動的に採掘し、コアに移送します。 unit.mono.description = 銅と鉛を自動的に採掘し、コアに移送します。
unit.poly.description = 破壊された建造物を自動的に再構築し、さらに建設の支援を行います。 unit.poly.description = 破壊された建造物を自動的に再構築し、さらに建設の支援を行います。
unit.mega.description = 損傷した建造物を自動的に修復します。小型のブロックと地上ユニットを運搬できます。 unit.mega.description = 損傷した建造物を自動的に修復します。\n小型のブロックと地上ユニットを運搬できます。
unit.quad.description = 地上目標に大型爆弾を投下し、味方の建造物は修復し、敵にはダメージを与えます。中型の地上ユニットを運搬できます。 unit.quad.description = 地上目標に大型爆弾を投下し、味方の建造物は修復し、敵にはダメージを与えます。\n中型の地上ユニットを運搬できます。
unit.oct.description = シールド形成と修復を行い、付近の味方を守ります。ほとんどの地上ユニットを運搬できます。 unit.oct.description = シールド形成と修復を行い、付近の味方を守ります。\nほとんどの地上ユニットを運搬できます。
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 = 敵に長距離かつ貫通性能を持つレールガンボルトを発射します。\nフレアユニットを生産します。
unit.alpha.description = シャードコアを敵から守ります。建造物を建築します。 unit.alpha.description = シャードコアを敵から守ります。\n建造物を建築します。
unit.beta.description = ファンデーションコアを敵から守ります。建造物を建築します。 unit.beta.description = ファンデーションコアを敵から守ります。\n建造物を建築します。
unit.gamma.description = ニュークリアスコアを敵から守ります。建造物を建築します。 unit.gamma.description = ニュークリアスコアを敵から守ります。\n建造物を建築します。
unit.retusa.description = 近接地雷を配置します。\n味方ユニットを修復します。
unit.oxynoe.description = 建造物修復火炎放射を発射します。敵にはダメージを与えます。\n地点防空タレットによって敵の弾丸を撃ち落とします。
unit.cyerce.description = 敵に追尾クラスターミサイルを発射します。\n味方ユニットを修復します。
unit.aegires.description = エネルギーフィールド内の全ての敵ユニットと建造物には電撃を放ち、全ての味方ユニットには修復効果を与えます。
unit.navanax.description = 爆発性のEMP弾を発射し、敵の電力系統には重大な損傷を与え、味方の建造物は修復します。\n4門の自律型レーザータレットで近くの敵を溶かします。

View File

@@ -78,13 +78,12 @@ schematic.tagexists = 이 태그는 이미 존재합니다.
stats = 전투 결과 stats = 전투 결과
stat.wave = 패배한 단계:[accent] {0} stat.wave = 패배한 단계:[accent] {0}
stat.unitsCreated = 생성한 유닛:[accent] {0}
stat.enemiesDestroyed = 파괴된 적:[accent] {0} stat.enemiesDestroyed = 파괴된 적:[accent] {0}
stat.built = 지어진 건물: [accent]{0} stat.built = 지어진 건물: [accent]{0}
stat.destroyed = 파괴된 건물: [accent]{0} stat.destroyed = 파괴된 건물: [accent]{0}
stat.deconstructed = 해체된 건물: [accent]{0} stat.deconstructed = 해체된 건물: [accent]{0}
stat.delivered = 얻은 자원:
stat.playtime = 플레이 시간: [accent] {0} stat.playtime = 플레이 시간: [accent] {0}
stat.rank = 최종 순위: [accent]{0}
globalitems = [accent]전체 자원 globalitems = [accent]전체 자원
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
@@ -94,6 +93,7 @@ level.mode = 게임 모드:
coreattack = < 코어가 공격을 받고 있습니다! > coreattack = < 코어가 공격을 받고 있습니다! >
nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 파괴됩니다! nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 파괴됩니다!
database = 코어 데이터베이스 database = 코어 데이터베이스
database.button = 데이터베이스
savegame = 게임 저장 savegame = 게임 저장
loadgame = 게임 불러오기 loadgame = 게임 불러오기
joingame = 게임 참여 joingame = 게임 참여
@@ -169,6 +169,7 @@ launchcore = 코어 출격
filename = 파일 이름: filename = 파일 이름:
unlocked = 새로운 콘텐츠가 해금되었습니다! unlocked = 새로운 콘텐츠가 해금되었습니다!
available = 새로운 콘텐츠 해금이 가능합니다! available = 새로운 콘텐츠 해금이 가능합니다!
unlock.incampaign = < 해금 후 상세정보 열람이 가능합니다 >
completed = [accent]완료됨 completed = [accent]완료됨
techtree = 연구 기록 techtree = 연구 기록
research.legacy = [accent]5.0[] 연구 데이터를 찾았습니다.\n[accent]이 데이터를 불러오시겠습니까?[], 아니면 이 데이터를 무시하고 캠페인을 새로 시작하시겠습니까? [accent]무시한 데이터는 삭제됩니다.[] (권장됨) research.legacy = [accent]5.0[] 연구 데이터를 찾았습니다.\n[accent]이 데이터를 불러오시겠습니까?[], 아니면 이 데이터를 무시하고 캠페인을 새로 시작하시겠습니까? [accent]무시한 데이터는 삭제됩니다.[] (권장됨)
@@ -362,6 +363,7 @@ publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EUL
publish.error = 아이템 게시 오류: {0} publish.error = 아이템 게시 오류: {0}
steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0}
editor.cliffs = 언덕 전환
editor.brush = 브러쉬 editor.brush = 브러쉬
editor.openin = 편집기 열기 editor.openin = 편집기 열기
editor.oregen = 광물 무작위 생성 editor.oregen = 광물 무작위 생성
@@ -382,9 +384,10 @@ waves.title = 단계
waves.remove = 삭제 waves.remove = 삭제
waves.every = waves.every =
waves.waves = 단계마다 waves.waves = 단계마다
waves.perspawn = 마리씩 생성됨 waves.perspawn = 마리씩
waves.shields = 방어막 hp/단계 waves.shields = 방어막만큼 소환
waves.to = 부터 waves.to = 부터
waves.max = 마리 까지
waves.guardian = 수호자 waves.guardian = 수호자
waves.preview = 미리보기 waves.preview = 미리보기
waves.edit = 편집 waves.edit = 편집
@@ -393,6 +396,13 @@ waves.load = 클립보드에서 불러오기
waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다. waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다.
waves.copied = 단계 복사됨. waves.copied = 단계 복사됨.
waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다. waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다.
waves.sort = 보기 정렬
waves.sort.reverse = 정렬 뒤집기
waves.sort.begin = 시작 단계순
waves.sort.health = 체력순
waves.sort.type = 유닛순
waves.units.hide = 모두 숨기기
waves.units.show = 모두 보이기
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = 마리 wavemode.counts = 마리
@@ -409,7 +419,7 @@ editor.teams = 팀
editor.errorload = 파일을 불러오지 못했습니다. editor.errorload = 파일을 불러오지 못했습니다.
editor.errorsave = 파일을 저장하지 못했습니다. editor.errorsave = 파일을 저장하지 못했습니다.
editor.errorimage = 이것은 맵이 아니라 사진입니다. editor.errorimage = 이것은 맵이 아니라 사진입니다.
editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원지 않는 구형 맵 형식을 사용합니다. editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원지 않는 구형 맵 형식을 사용합니다.
editor.errornot = 맵 파일이 아닙니다. editor.errornot = 맵 파일이 아닙니다.
editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다.
editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요? editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요?
@@ -447,7 +457,7 @@ editor.exists = 이 이름의 맵이 이미 존재합니다.
editor.selectmap = 불러올 맵을 선택하세요: editor.selectmap = 불러올 맵을 선택하세요:
toolmode.replace = 재배치 toolmode.replace = 재배치
toolmode.replace.description = 단단한 블록에만 그립니다. toolmode.replace.description = 지형 블록에만 그립니다.
toolmode.replaceall = 모두 재배치 toolmode.replaceall = 모두 재배치
toolmode.replaceall.description = 맵에 있는 모든 블록을 재배치합니다. toolmode.replaceall.description = 맵에 있는 모든 블록을 재배치합니다.
toolmode.orthogonal = 직각 toolmode.orthogonal = 직각
@@ -639,7 +649,7 @@ sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내
sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요. sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[] sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[]
status.burning.name = 불탐 status.burning.name = 발화
status.freezing.name = 빙결 status.freezing.name = 빙결
status.wet.name = 젖음 status.wet.name = 젖음
status.muddy.name = 질척해짐 status.muddy.name = 질척해짐
@@ -648,10 +658,12 @@ status.sapped.name = 피로
status.electrified.name = 과전류 status.electrified.name = 과전류
status.spore-slowed.name = 포자감속 status.spore-slowed.name = 포자감속
status.tarred.name = 침유됨 status.tarred.name = 침유됨
status.overdrive.name = 과부하
status.overclock.name = 가속화 status.overclock.name = 가속화
status.shocked.name = 감전 status.shocked.name = 감전
status.blasted.name = status.blasted.name =
status.unmoving.name = 멈춤 status.unmoving.name = 멈춤
status.boss.name = 수호자
settings.language = 언어 settings.language = 언어
settings.data = 게임 데이터 settings.data = 게임 데이터
@@ -776,7 +788,7 @@ bar.corereq = 기본 코어 필요
bar.drillspeed = 드릴 속도: {0}/s bar.drillspeed = 드릴 속도: {0}/s
bar.pumpspeed = 펌프 속도: {0}/s bar.pumpspeed = 펌프 속도: {0}/s
bar.efficiency = 효율: {0}% bar.efficiency = 효율: {0}%
bar.boost = 가속: {0}% bar.boost = 가속: +{0}%
bar.powerbalance = 전력: {0}/s bar.powerbalance = 전력: {0}/s
bar.powerstored = 저장량: {0}/{1} bar.powerstored = 저장량: {0}/{1}
bar.poweramount = 전력: {0} bar.poweramount = 전력: {0}
@@ -1149,6 +1161,7 @@ block.core-nucleus.name = 코어: 핵심
block.deep-water.name = 깊은 물 block.deep-water.name = 깊은 물
block.shallow-water.name = block.shallow-water.name =
block.tainted-water.name = 오염된 물 block.tainted-water.name = 오염된 물
block.deep-tainted-water.name = 오염된 깊은 물
block.darksand-tainted-water.name = 오염된 젖은 검은 모래 block.darksand-tainted-water.name = 오염된 젖은 검은 모래
block.tar.name = 타르 block.tar.name = 타르
block.stone.name = 바위 block.stone.name = 바위
@@ -1315,7 +1328,7 @@ block.payload-router.name = 화물 분배기
block.duct.name = 도관 block.duct.name = 도관
block.duct-router.name = 도관 분배기 block.duct-router.name = 도관 분배기
block.duct-bridge.name = 도관 다리 block.duct-bridge.name = 도관 다리
block.payload-propulsion-tower.name = 화물 추진탑 block.payload-propulsion-tower.name = 화물 드라이버
block.payload-void.name = 화물 소멸기 block.payload-void.name = 화물 소멸기
block.payload-source.name = 화물 공급기 block.payload-source.name = 화물 공급기
block.disassembler.name = 광재 분해기 block.disassembler.name = 광재 분해기
@@ -1382,8 +1395,9 @@ hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변
hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오. hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오.
hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오. hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오.
hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다. hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다.
hint.presetDifficulty = 이 지역은 [scarlet]고위험 레벨[] 지역입니다.\n적절한 기술과 준비 없이 이런 지역들로 출격하는건 [accent]비추천[]합니다.
hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다. hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다.
hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 들도 가져갑니다. hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 자원들도 가져갑니다.
item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다. item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다.
item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다. item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다.
@@ -1431,13 +1445,15 @@ block.separator.description = 광재를 광물들로 분리합니다.
block.spore-press.description = 포자를 석유로 압축합니다. block.spore-press.description = 포자를 석유로 압축합니다.
block.pulverizer.description = 고철을 갈아 모래로 만듭니다. block.pulverizer.description = 고철을 갈아 모래로 만듭니다.
block.coal-centrifuge.description = 석유에서 석탄을 추출합니다. block.coal-centrifuge.description = 석유에서 석탄을 추출합니다.
block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. block.incinerator.description = 들어오는 모든 자원 액체를 소각시킵니다.
block.power-void.description = 입력된 모든 전력을 무효로 합니다. 샌드박스 전용. block.power-void.description = 전력을 제거합니다. 샌드박스 전용.
block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. block.power-source.description = 전력을 무한히 출력합니다. 샌드박스 전용.
block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. block.item-source.description = 자원을 무한 출력합니다. 샌드박스 전용.
block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. block.item-void.description = 자원을 제거합니다. 샌드박스 전용.
block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용.
block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용.
block.payload-source.description = 화물을 무한히 출력합니다. 샌드박스 전용.
block.payload-void.description = 화물을 제거합니다. 샌드박스 전용.
block.copper-wall.description = 저렴한 수비 블록.\n초반 단계에서 코어와 포탑을 보호하는 데 유용합니다. block.copper-wall.description = 저렴한 수비 블록.\n초반 단계에서 코어와 포탑을 보호하는 데 유용합니다.
block.copper-wall-large.description = 저렴한 수비 블록.\n초반 단계에서 코어와 포탑을 보호하는 데 유용합니다.\n여러 타일을 차지합니다. block.copper-wall-large.description = 저렴한 수비 블록.\n초반 단계에서 코어와 포탑을 보호하는 데 유용합니다.\n여러 타일을 차지합니다.
block.titanium-wall.description = 적당히 강한 방어 블록.\n적에게서 적절한 보호를 제공합니다. block.titanium-wall.description = 적당히 강한 방어 블록.\n적에게서 적절한 보호를 제공합니다.
@@ -1557,7 +1573,7 @@ block.logic-display.description = 프로세서를 이용해 그래픽을 출력
block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다.
block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다. block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다.
block.repair-turret.description = 가장 가까운 유닛을 지속적으로 수리합니다. 냉각수를 넣을 수 있습니다. block.repair-turret.description = 가장 가까운 유닛을 지속적으로 수리합니다. 냉각수를 넣을 수 있습니다.
block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 추진탑으로 발사합니다. block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 드라이버로 발사합니다.
unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다. unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다.
unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다. unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다.
@@ -1953,10 +1969,10 @@ unit.minke.details =
unit.bryde.details = unit.bryde.details =
unit.sei.details = [lightgray][비공식][]세이 sei! unit.sei.details = [lightgray][비공식][]세이 sei!
unit.omura.details = [lightgray][비공식][]오무라이스? unit.omura.details = [lightgray][비공식][]오무라이스?
unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮보죠. unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮보죠.
unit.oxynoe.details = unit.oxynoe.details =
unit.cyerce.details = [lightgray][비공식][]폭죽놀이다! unit.cyerce.details = [lightgray][비공식][]폭죽놀이다!
unit.aegires.details = [lightgray][비공식][]플레이어가 할 수 있는건 운전과 공사뿐... unit.aegires.details = [lightgray][비공식][]공격 컨트롤을 할 수 없습니다.
unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다. unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다.
unit.alpha.details = unit.alpha.details =
unit.beta.details = unit.beta.details =

View File

@@ -762,7 +762,7 @@ bar.corereq = Wymagany Rdzeń
bar.drillspeed = Prędkość wiertła: {0}/s bar.drillspeed = Prędkość wiertła: {0}/s
bar.pumpspeed = Prędkość pompy: {0}/s bar.pumpspeed = Prędkość pompy: {0}/s
bar.efficiency = Efektywność: {0}% bar.efficiency = Efektywność: {0}%
bar.boost = Przyspieszenie: {0}% bar.boost = Przyspieszenie: +{0}%
bar.powerbalance = Moc: {0} bar.powerbalance = Moc: {0}
bar.powerstored = Zmagazynowano: {0}/{1} bar.powerstored = Zmagazynowano: {0}/{1}
bar.poweramount = Moc: {0} bar.poweramount = Moc: {0}

View File

@@ -78,13 +78,12 @@ schematic.tagexists = Acea etichetă există deja.
stats = Informații stats = Informații
stat.wave = Valuri Învinse:[accent] {0} stat.wave = Valuri Învinse:[accent] {0}
stat.unitsCreated = Unități Create:[accent] {0}
stat.enemiesDestroyed = Inamici Distruși:[accent] {0} stat.enemiesDestroyed = Inamici Distruși:[accent] {0}
stat.built = Structuri Construite:[accent] {0} stat.built = Structuri Construite:[accent] {0}
stat.destroyed = Structuri Distruse:[accent] {0} stat.destroyed = Structuri Distruse:[accent] {0}
stat.deconstructed = Structuri Deconstruite:[accent] {0} stat.deconstructed = Structuri Deconstruite:[accent] {0}
stat.delivered = Resurse Lansate:
stat.playtime = Timp Joc:[accent] {0} stat.playtime = Timp Joc:[accent] {0}
stat.rank = Rang Final: [accent]{0}
globalitems = [accent]Materiale Totale globalitems = [accent]Materiale Totale
map.delete = Sigur vrei să ștergi harta "[accent]{0}[]"? map.delete = Sigur vrei să ștergi harta "[accent]{0}[]"?
@@ -94,6 +93,7 @@ level.mode = Mod de Joc:
coreattack = < Nucleul este atacat! > coreattack = < Nucleul este atacat! >
nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare imminentă nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare imminentă
database = Datele Nucleului database = Datele Nucleului
database.button = Bază de date
savegame = Salvează Jocul savegame = Salvează Jocul
loadgame = Încarcă Jocul loadgame = Încarcă Jocul
joingame = Intră în Joc joingame = Intră în Joc
@@ -169,6 +169,7 @@ launchcore = Lansează Nucleu
filename = Nume Fișier: filename = Nume Fișier:
unlocked = Nou conținut deblocat! unlocked = Nou conținut deblocat!
available = Poți cerceta noi tehnologii! available = Poți cerceta noi tehnologii!
unlock.incampaign = < Deblochează în campanie pt detalii >
completed = [accent]Finalizat completed = [accent]Finalizat
techtree = Cercetează techtree = Cercetează
research.legacy = Au fost găsite date de cercetare din versiunea [accent]5.0[].\n Dorești să [accent]păstrezi aceste date[], sau [accent]să renunți la ele[] și să reîncepi cercetarea în noua campanie (recomandat)? research.legacy = Au fost găsite date de cercetare din versiunea [accent]5.0[].\n Dorești să [accent]păstrezi aceste date[], sau [accent]să renunți la ele[] și să reîncepi cercetarea în noua campanie (recomandat)?
@@ -362,6 +363,7 @@ publish.confirm = Sigur vrei să publici asta?\n\n[lightgray]Asigură-te că ai
publish.error = Eroare la publicarea itemului: {0} publish.error = Eroare la publicarea itemului: {0}
steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0} steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0}
editor.cliffs = Pereți >> Dealuri
editor.brush = Pensulă editor.brush = Pensulă
editor.openin = Deschide în Editor editor.openin = Deschide în Editor
editor.oregen = Generarea Minereurilor editor.oregen = Generarea Minereurilor
@@ -385,6 +387,7 @@ waves.waves = val(uri)
waves.perspawn = per apariție waves.perspawn = per apariție
waves.shields = scuturi/val waves.shields = scuturi/val
waves.to = până la waves.to = până la
waves.max = unități maxime
waves.guardian = Gardian waves.guardian = Gardian
waves.preview = Previzualizare waves.preview = Previzualizare
waves.edit = Editează... waves.edit = Editează...
@@ -393,6 +396,13 @@ waves.load = Încarcă din Clipboard
waves.invalid = Valuri invalide în clipboard. waves.invalid = Valuri invalide în clipboard.
waves.copied = Valuri copiate. waves.copied = Valuri copiate.
waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită. waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită.
waves.sort = Sortează După
waves.sort.reverse = Inversează Sortarea
waves.sort.begin = Început
waves.sort.health = Viață
waves.sort.type = Tip
waves.units.hide = Ascunde
waves.units.show = Vezi Tot
#intenționat cu literă mică #intenționat cu literă mică
wavemode.counts = numere wavemode.counts = numere
@@ -621,6 +631,8 @@ sector.biomassFacility.name = Facilitatea de Sinteză a Biomasei
sector.windsweptIslands.name = Insulele Măturate de Vânt sector.windsweptIslands.name = Insulele Măturate de Vânt
sector.extractionOutpost.name = Avanpostul de Extracție sector.extractionOutpost.name = Avanpostul de Extracție
sector.planetaryTerminal.name = Terminalul de Lansare Planetară sector.planetaryTerminal.name = Terminalul de Lansare Planetară
sector.coastline.name = Zona de Coastă
sector.navalFortress.name = Fortăreața Navală
sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe. sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe.
sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare. sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare.
@@ -648,10 +660,12 @@ status.sapped.name = Slăbește
status.electrified.name = Electrificat status.electrified.name = Electrificat
status.spore-slowed.name = Încetinit de Spori status.spore-slowed.name = Încetinit de Spori
status.tarred.name = Păcurit status.tarred.name = Păcurit
status.overclock.name = Suprasolicitat status.overdrive.name = Suprasolicitat
status.overclock.name = Overclock
status.shocked.name = Electrocutat status.shocked.name = Electrocutat
status.blasted.name = Explozie status.blasted.name = Explozie
status.unmoving.name = Nemișcat status.unmoving.name = Nemișcat
status.boss.name = Gardian
settings.language = Limbă settings.language = Limbă
settings.data = Datele Jocului settings.data = Datele Jocului
@@ -764,9 +778,9 @@ stat.healing = Reparare
ability.forcefield = Câmp de Forță ability.forcefield = Câmp de Forță
ability.repairfield = Câmp de Reparare ability.repairfield = Câmp de Reparare
ability.statusfield = {0} Câmp Suprasolicitare Unități ability.statusfield = {0} Câmp de Stare
ability.unitspawn = Fabrică de {0} ability.unitspawn = Fabrică de {0}
ability.shieldregenfield = Scut Regenerabil ability.shieldregenfield = Câmp Regenerare Scut
ability.movelightning = Mișcare Fulger ability.movelightning = Mișcare Fulger
ability.energyfield = Câmp de Energie: [accent]{0}[] forță pe ~ [accent]{1}[] blocuri / [accent]{2}[] ținte ability.energyfield = Câmp de Energie: [accent]{0}[] forță pe ~ [accent]{1}[] blocuri / [accent]{2}[] ținte
@@ -776,7 +790,7 @@ bar.corereq = Plasare pe Nucleu Necesară
bar.drillspeed = Viteză Minare: {0}/s bar.drillspeed = Viteză Minare: {0}/s
bar.pumpspeed = Viteză Pompare: {0}/s bar.pumpspeed = Viteză Pompare: {0}/s
bar.efficiency = Eficiență: {0}% bar.efficiency = Eficiență: {0}%
bar.boost = Efect Grăbire: {0}% bar.boost = Efect Grăbire: +{0}%
bar.powerbalance = Electricitate: {0}/s bar.powerbalance = Electricitate: {0}/s
bar.powerstored = Stocată: {0}/{1} bar.powerstored = Stocată: {0}/{1}
bar.poweramount = Electricitate: {0} bar.poweramount = Electricitate: {0}
@@ -871,7 +885,7 @@ setting.difficulty.name = Dificultate:
setting.screenshake.name = Agitare Ecran setting.screenshake.name = Agitare Ecran
setting.effects.name = Vezi Efectele setting.effects.name = Vezi Efectele
setting.destroyedblocks.name = Vezi Blocurile Distruse setting.destroyedblocks.name = Vezi Blocurile Distruse
setting.blockstatus.name = Vezi Statusul Blocului setting.blockstatus.name = Vezi Starea Blocului
setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii
setting.sensitivity.name = Sensibilitatea Controlului setting.sensitivity.name = Sensibilitatea Controlului
setting.saveinterval.name = Interval de Salvare setting.saveinterval.name = Interval de Salvare
@@ -926,8 +940,8 @@ keybind.clear_building.name = Șterge Clădirea
keybind.press = Apasă o tastă... keybind.press = Apasă o tastă...
keybind.press.axis = Apasă o axă sau o tastă... keybind.press.axis = Apasă o axă sau o tastă...
keybind.screenshot.name = Captură Hartă keybind.screenshot.name = Captură Hartă
keybind.toggle_power_lines.name = Oprește/Pornește Statusul Electricelor keybind.toggle_power_lines.name = Oprește/Pornește Starea Electricelor
keybind.toggle_block_status.name = Oprește/Pornește Statusul Blocurilor keybind.toggle_block_status.name = Oprește/Pornește Starea Blocurilor
keybind.move_x.name = Mergi pe X keybind.move_x.name = Mergi pe X
keybind.move_y.name = Mergi pe Y keybind.move_y.name = Mergi pe Y
keybind.mouse_move.name = Urmărește Mouseul keybind.mouse_move.name = Urmărește Mouseul
@@ -1046,7 +1060,7 @@ content.item.name = Materiale
content.liquid.name = Lichide content.liquid.name = Lichide
content.unit.name = Unități content.unit.name = Unități
content.block.name = Blocuri content.block.name = Blocuri
content.status.name = Efecte de Status content.status.name = Efecte de Stare
content.sector.name = Sectoare content.sector.name = Sectoare
item.copper.name = Cupru item.copper.name = Cupru
@@ -1149,6 +1163,7 @@ block.core-nucleus.name = Nucleu: Core
block.deep-water.name = Apă Adâncă block.deep-water.name = Apă Adâncă
block.shallow-water.name = Apă block.shallow-water.name = Apă
block.tainted-water.name = Apă Tulbure block.tainted-water.name = Apă Tulbure
block.deep-tainted-water.name = Apă Adâncă și Tulbure
block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru
block.tar.name = Păcură block.tar.name = Păcură
block.stone.name = Piatră block.stone.name = Piatră
@@ -1339,7 +1354,7 @@ block.memory-bank.name = Bancă de Memorie
team.blue.name = Albastru team.blue.name = Albastru
team.crux.name = Agresor team.crux.name = Agresor
team.sharded.name = Portocaliu team.sharded.name = Portocaliu
team.derelict.name = Abandonat team.derelict.name = Ruină
team.green.name = Verde team.green.name = Verde
team.purple.name = Mov team.purple.name = Mov
@@ -1360,7 +1375,7 @@ hint.placeTurret = Construiește \uf861 [accent]Arme[] pt a-ți apăra baza de i
hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri. hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri.
hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată. hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată.
hint.blockInfo = Poți vedea informații despre un bloc selectându-l în [accent]meniul de construcție[] și dând click pe butonul [accent][[?][] din dreapta. hint.blockInfo = Poți vedea informații despre un bloc selectându-l în [accent]meniul de construcție[] și dând click pe butonul [accent][[?][] din dreapta.
hint.derelict = [accent]Structurile abandonate[] sunt rămășițe stricate ale bazelor vechi care nu mai funcționează.\n\nAceste structuri pot fi [accent]deconstruite[] pt resurse. hint.derelict = [accent]Ruinele[] sunt rămășițe deteriorate ale bazelor vechi care nu mai funcționează.\n\nAceste structuri pot fi [accent]deconstruite[] pt resurse.
hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii. hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii.
hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii. hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii.
hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme. hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme.
@@ -1382,6 +1397,7 @@ hint.generator = \uf879 [accent]Generatoarele pe Combustie[] ard cărbunele și
hint.guardian = Unitățile [accent]Gardian[] au armuri puternice. Munițiile slabe precum [accent]Cuprul[] și [accent]Plumbul[] [scarlet]nu sunt eficiente[].\n\nFolosește arme mai bune sau muniție de \uf835 [accent]Grafit[] pt \uf861Duo/\uf859Salvo pt a nimici Gardianul. hint.guardian = Unitățile [accent]Gardian[] au armuri puternice. Munițiile slabe precum [accent]Cuprul[] și [accent]Plumbul[] [scarlet]nu sunt eficiente[].\n\nFolosește arme mai bune sau muniție de \uf835 [accent]Grafit[] pt \uf861Duo/\uf859Salvo pt a nimici Gardianul.
hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu  [accent]Foundation[] peste nucleul  [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea. hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu  [accent]Foundation[] peste nucleul  [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea.
hint.presetLaunch = Poți lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opționale[]. hint.presetLaunch = Poți lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opționale[].
hint.presetDifficulty = Acest sector are un [scarlet]nivel ridicat de amenințare inamică[].\n[accent]Nu e recomandat[] să lansezi în asemenea sectoare fără pregătiri sau tehnologie adecvată.
hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[]. hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[].
hint.coopCampaign = Când joci [accent]campania cooperând cu alți jucători[], materialele produse în sectorul curent vor fi transferate și către [accent]sectoarele tale locale[].\n\nDe asemenea, vei debloca tot ceea ce cercetează gazda. hint.coopCampaign = Când joci [accent]campania cooperând cu alți jucători[], materialele produse în sectorul curent vor fi transferate și către [accent]sectoarele tale locale[].\n\nDe asemenea, vei debloca tot ceea ce cercetează gazda.
@@ -1412,7 +1428,7 @@ liquid.slag.description = Rafinată înapoi în materialele constituente cu ajut
liquid.oil.description = Folosit în producerea avansată de materiale și ca muniție incendiară. liquid.oil.description = Folosit în producerea avansată de materiale și ca muniție incendiară.
liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici. liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici.
block.derelict =  [lightgray]Structură Abandonată block.derelict =  [lightgray]Ruină
block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi. block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi.
block.illuminator.description = Emite lumină. block.illuminator.description = Emite lumină.
block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați. block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați.
@@ -1438,6 +1454,8 @@ block.item-source.description = Generează materiale la infinit. Doar în modul
block.item-void.description = Distruge orice material. Doar în modul sandbox. block.item-void.description = Distruge orice material. Doar în modul sandbox.
block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox. block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox.
block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox. block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox.
block.payload-source.description = Generează încărcături la infinit. Doar în modul sandbox.
block.payload-void.description = Distruge orice încărcătură. Doar în modul sandbox.
block.copper-wall.description = Protejează clădirile de proiectilele inamice. block.copper-wall.description = Protejează clădirile de proiectilele inamice.
block.copper-wall-large.description = Protejează clădirile de proiectilele inamice. block.copper-wall-large.description = Protejează clădirile de proiectilele inamice.
block.titanium-wall.description = Protejează clădirile de proiectilele inamice. block.titanium-wall.description = Protejează clădirile de proiectilele inamice.
@@ -1547,7 +1565,7 @@ block.additive-reconstructor.description = Îmbunătățește unitățile primit
block.multiplicative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel trei. block.multiplicative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel trei.
block.exponential-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel patru. block.exponential-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel patru.
block.tetrative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de ltimă generație: nivelul cinci. block.tetrative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de ltimă generație: nivelul cinci.
block.switch.description = Un întrerupător. Poate fi pornit sau oprit. Statusul său poate fi citit și controlat de procesoarele logice. block.switch.description = Un întrerupător. Poate fi pornit sau oprit. Starea sa poate fi citită și controlată de procesoarele logice.
block.micro-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. block.micro-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri.
block.logic-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât microprocesorul. block.logic-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât microprocesorul.
block.hyper-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât procesorul logic. block.hyper-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât procesorul logic.

View File

@@ -94,6 +94,7 @@ level.mode = Режим игры:
coreattack = < Ядро находится под атакой! > coreattack = < Ядро находится под атакой! >
nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ НЕМЕДЛЕННО[] ]\nаннигиляция неизбежна nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ НЕМЕДЛЕННО[] ]\nаннигиляция неизбежна
database = База данных ядра database = База данных ядра
database.button = База данных
savegame = Сохранить игру savegame = Сохранить игру
loadgame = Загрузить игру loadgame = Загрузить игру
joingame = Сетевая игра joingame = Сетевая игра
@@ -615,6 +616,8 @@ sector.biomassFacility.name = Центр исследования биомасс
sector.windsweptIslands.name = Штормовой архипелаг sector.windsweptIslands.name = Штормовой архипелаг
sector.extractionOutpost.name = Добывающая база sector.extractionOutpost.name = Добывающая база
sector.planetaryTerminal.name = Планетарный пусковой терминал sector.planetaryTerminal.name = Планетарный пусковой терминал
sector.coastline.name = Береговая линия
sector.navalFortress.name = Прибрежная крепость
sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше.
sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором.
@@ -770,7 +773,7 @@ bar.corereq = Требуется основа ядра
bar.drillspeed = Скорость бурения: {0}/с bar.drillspeed = Скорость бурения: {0}/с
bar.pumpspeed = Скорость выкачивания: {0}/с bar.pumpspeed = Скорость выкачивания: {0}/с
bar.efficiency = Эффективность: {0}% bar.efficiency = Эффективность: {0}%
bar.boost = Ускорение: {0}% bar.boost = Ускорение: +{0}%
bar.powerbalance = Энергия: {0}/с bar.powerbalance = Энергия: {0}/с
bar.powerstored = Накоплено: {0}/{1} bar.powerstored = Накоплено: {0}/{1}
bar.poweramount = Энергия: {0} bar.poweramount = Энергия: {0}
@@ -793,7 +796,7 @@ 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]зажигательный
bullet.homing = [stat]самонаводящийся bullet.homing = [stat]самонаводящийся
bullet.frag = [stat]осколочный bullet.frags = [stat]{0}[lightgray]x осколочный(ых) снаряд(ов):
bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона
bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам
bullet.knockback = [stat]{0}[lightgray] отбрасывания bullet.knockback = [stat]{0}[lightgray] отбрасывания
@@ -1543,6 +1546,8 @@ block.memory-bank.description = Хранит информацию для лог
block.logic-display.description = Отображает произвольную графику из логического процессора. block.logic-display.description = Отображает произвольную графику из логического процессора.
block.large-logic-display.description = Отображает произвольную графику из логического процессора. block.large-logic-display.description = Отображает произвольную графику из логического процессора.
block.interplanetary-accelerator.description = Массивная электромагнитная башня-рельсотрон. Ускоряет ядро, позволяя преодолеть гравитацию для межпланетного развёртывания. block.interplanetary-accelerator.description = Массивная электромагнитная башня-рельсотрон. Ускоряет ядро, позволяя преодолеть гравитацию для межпланетного развёртывания.
block.repair-turret.description = Непрерывно ремонтирует ближайшую поврежденную еденицу в своем радиусе. Опционально использует охлаждающую жидкость.
block.payload-propulsion-tower.description = Конструкция для транспортировки больших грузов на большое растояние. Стреляет грузом в другие грузовые катапульты.
unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости. unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости.
unit.mace.description = Стреляет потоками огня по всем врагам поблизости. unit.mace.description = Стреляет потоками огня по всем врагам поблизости.

View File

@@ -78,13 +78,12 @@ schematic.tagexists = แท็กนี้มีอยู่แล้ว
stats = สถิติ stats = สถิติ
stat.wave = จำนวนคลื่นที่อยู่รอด:[accent] {0} stat.wave = จำนวนคลื่นที่อยู่รอด:[accent] {0}
stat.unitsCreated = จำนวนยูนิตที่สร้าง:[accent] {0}
stat.enemiesDestroyed = จำนวนศัตรูที่ทำลาย:[accent] {0} stat.enemiesDestroyed = จำนวนศัตรูที่ทำลาย:[accent] {0}
stat.built = จำนวนสิ่งก่อสร้างที่สร้าง:[accent] {0} stat.built = จำนวนสิ่งก่อสร้างที่สร้าง:[accent] {0}
stat.destroyed = จำนวนสิ่งก่อสร้างที่ถูกทำลาย:[accent] {0} stat.destroyed = จำนวนสิ่งก่อสร้างที่ถูกทำลาย:[accent] {0}
stat.deconstructed = จำนวนสิ่งก่อสร้างที่ลบไป:[accent] {0} stat.deconstructed = จำนวนสิ่งก่อสร้างที่ลบไป:[accent] {0}
stat.delivered = ทรัพยากรที่ส่งไป:
stat.playtime = ระยะเวลาที่เล่นไป:[accent] {0} stat.playtime = ระยะเวลาที่เล่นไป:[accent] {0}
stat.rank = ระดับ: [accent]{0}
globalitems = [accent]ไอเท็มทั้งหมด globalitems = [accent]ไอเท็มทั้งหมด
map.delete = คุณแน่ใจหรือว่าจะลบแมพ "[accent]{0}[]"? map.delete = คุณแน่ใจหรือว่าจะลบแมพ "[accent]{0}[]"?
@@ -94,6 +93,7 @@ level.mode = เกมโหมด:
coreattack = < แกนกลางถูกโจมตี! > coreattack = < แกนกลางถูกโจมตี! >
nearpoint = [[ [scarlet]ออกจากจุดเกิดด่วน![] ]\nการทำลายล้างกำลังใกล้เข้ามา nearpoint = [[ [scarlet]ออกจากจุดเกิดด่วน![] ]\nการทำลายล้างกำลังใกล้เข้ามา
database = ฐานข้อมูลแกนกลาง database = ฐานข้อมูลแกนกลาง
database.button = ฐานข้อมูล
savegame = เซฟเกม savegame = เซฟเกม
loadgame = โหลดเกม loadgame = โหลดเกม
joingame = เข้าร่วมเกม joingame = เข้าร่วมเกม
@@ -169,6 +169,7 @@ launchcore = ส่งแกนกลาง
filename = ชื่อไฟล์: filename = ชื่อไฟล์:
unlocked = เนื้อหาใหม่ปลดล็อก! unlocked = เนื้อหาใหม่ปลดล็อก!
available = มีการวิจัยใหม่พร้อมปลดล็อก! available = มีการวิจัยใหม่พร้อมปลดล็อก!
unlock.incampaign = < ปลดล็อกในแคมเปญเพื่อดูรายละเอียด >
completed = [accent]วิจัยแล้ว completed = [accent]วิจัยแล้ว
techtree = ต้นไม้แห่งเทคโนโลยี techtree = ต้นไม้แห่งเทคโนโลยี
research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ) research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ)
@@ -248,7 +249,7 @@ confirmban = คุณแน่ใจหรือว่าจะแบนผู
confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก? confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก?
confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก? confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก?
confirmunban = คุณแน่ใจหรือว่าจะเลิกแบนผู้เล่นนี้? confirmunban = คุณแน่ใจหรือว่าจะเลิกแบนผู้เล่นนี้?
confirmadmin = คุณแน่ใจหรือว่าจะเปลี่ยนผู้เล่นคนนี้เป็นแอดมิน? confirmadmin = คุณแน่ใจหรือว่าจะแต่งตั้งผู้เล่นคนนี้เป็นแอดมิน?
confirmunadmin = คุณแน่ใจหรือว่าจะลบสถานะการเป็นแอดมินของผู้เล่นนี้? confirmunadmin = คุณแน่ใจหรือว่าจะลบสถานะการเป็นแอดมินของผู้เล่นนี้?
joingame.title = เข้าร่วมเกม joingame.title = เข้าร่วมเกม
joingame.ip = ที่อยู่: joingame.ip = ที่อยู่:
@@ -296,8 +297,8 @@ save.playtime = เวลาที่เล่นไป: {0}
warning = คำเตือน warning = คำเตือน
confirm = ตกลง confirm = ตกลง
delete = ลบ delete = ลบ
view.workshop = เปิดในเวิร์ช็อป view.workshop = เปิดในเวิร์ช็อป
workshop.listing = แก้ไขหน้ารายการเวิร์ช็อป workshop.listing = แก้ไขหน้ารายการเวิร์ช็อป
ok = โอเค ok = โอเค
open = เปิด open = เปิด
customize = ตั้งค่ากฎ customize = ตั้งค่ากฎ
@@ -336,8 +337,8 @@ wave.enemies = ศัตรูคงเหลือ [lightgray]{0} [accent]ต
wave.enemycores = แกนกลางศัตรูเหลือ [accent]{0}[lightgray] แกน wave.enemycores = แกนกลางศัตรูเหลือ [accent]{0}[lightgray] แกน
wave.enemycore = [accent]{0}[lightgray] แกนกลางศัตรู wave.enemycore = [accent]{0}[lightgray] แกนกลางศัตรู
wave.enemy = ศัตรูคงเหลือ [lightgray]{0} [accent]ตัว wave.enemy = ศัตรูคงเหลือ [lightgray]{0} [accent]ตัว
wave.guardianwarn = การ์เดียนจะปรากฏตัวในอีก [accent]{0}[] คลื่น! wave.guardianwarn = ผู้พิทักษ์จะปรากฏตัวในอีก [accent]{0}[] คลื่น!
wave.guardianwarn.one = การ์เดียนจะปรากฏตัวในอีก [accent]{0}[] คลื่น! เตรียมตัวให้พร้อม! wave.guardianwarn.one = ผู้พิทักษ์จะปรากฏตัวในอีก [accent]{0}[] คลื่น! เตรียมตัวให้พร้อม!
loadimage = โหลดรูป loadimage = โหลดรูป
saveimage = เซฟรูป saveimage = เซฟรูป
unknown = ไม่ทราบ unknown = ไม่ทราบ
@@ -362,6 +363,7 @@ publish.confirm = คุณแน่ใจหรือว่าจะเผย
publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0} publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0}
steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0}
editor.cliffs = เปลี่ยนกำแพงเป็นหน้าผา
editor.brush = แปรง editor.brush = แปรง
editor.openin = เปิดในตัวแก้ไข editor.openin = เปิดในตัวแก้ไข
editor.oregen = การเกิดของแร่ editor.oregen = การเกิดของแร่
@@ -374,10 +376,10 @@ editor.waves = คลื่น:
editor.rules = กฎ: editor.rules = กฎ:
editor.generation = เจนเนอเรชั่น: editor.generation = เจนเนอเรชั่น:
editor.ingame = แก้ไขในเกม editor.ingame = แก้ไขในเกม
editor.publish.workshop = เผยแพร่บนเวิร์ช็อป editor.publish.workshop = เผยแพร่บนเวิร์ช็อป
editor.newmap = แมพใหม่ editor.newmap = แมพใหม่
editor.center = ศูนย์กลางแมพ editor.center = ศูนย์กลางแมพ
workshop = เวิร์ช็อป workshop = เวิร์ช็อป
waves.title = คลื่น waves.title = คลื่น
waves.remove = ลบ waves.remove = ลบ
waves.every = ทุกๆ waves.every = ทุกๆ
@@ -385,7 +387,8 @@ waves.waves = คลื่น
waves.perspawn = ต่อการเกิด waves.perspawn = ต่อการเกิด
waves.shields = เกราะ/คลื่น waves.shields = เกราะ/คลื่น
waves.to = ถึง waves.to = ถึง
waves.guardian = การ์เดียน waves.max = ยูนิตสูงสุด
waves.guardian = ผู้พิทักษ์
waves.preview = พรีวิว waves.preview = พรีวิว
waves.edit = แก้ไข... waves.edit = แก้ไข...
waves.copy = คัดลอกไปยังคลิปบอร์ด waves.copy = คัดลอกไปยังคลิปบอร์ด
@@ -393,6 +396,13 @@ waves.load = โหลดจากคลิปบอร์ด
waves.invalid = แบบคลื่นในคลิปบอร์ดไม่ถูกต้อง waves.invalid = แบบคลื่นในคลิปบอร์ดไม่ถูกต้อง
waves.copied = คัดลอกแบบคลื่นแล้ว waves.copied = คัดลอกแบบคลื่นแล้ว
waves.none = ไม่ได้กำหนดศัตรู\nแบบคลื่นเปล่าจะถูกแทนที่โดยแบบคลื่นค่าเริ่มต้นของเกม waves.none = ไม่ได้กำหนดศัตรู\nแบบคลื่นเปล่าจะถูกแทนที่โดยแบบคลื่นค่าเริ่มต้นของเกม
waves.sort = จัดเรียงตาม
waves.sort.reverse = เรียงย้อนกลับ
waves.sort.begin = เริ่มต้น
waves.sort.health = พลังชีวิต
waves.sort.type = ชนิด
waves.units.hide = ซ่อนทั้งหมด
waves.units.show = แสดงทั้งหมด
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = จำนวน wavemode.counts = จำนวน
@@ -438,7 +448,7 @@ editor.exportimage = ส่งออกไฟล์รูปพื้นที
editor.exportimage.description = ส่งออกไฟล์รูปแมพ editor.exportimage.description = ส่งออกไฟล์รูปแมพ
editor.loadimage = นำเข้าแบบพื้นที่ editor.loadimage = นำเข้าแบบพื้นที่
editor.saveimage = ส่งออกแบบพื้นที่ editor.saveimage = ส่งออกแบบพื้นที่
editor.unsaved = [scarlet]คุณมีการเปลี่ยนแปลงที่ยังไม่ได้เซฟ![]\nคุณแน่ใจหรือว่าจะออก? editor.unsaved = คุณแน่ใจหรือว่าจะออก?\n[scarlet]การเปลี่ยนแปลงที่ยังไม่ได้เซฟจะถูกทิ้ง
editor.resizemap = เปลี่ยนขนาดของแมพ editor.resizemap = เปลี่ยนขนาดของแมพ
editor.mapname = ชื่อแมพ: editor.mapname = ชื่อแมพ:
editor.overwrite = [accent]ตำเตือน!\nแมพนี้จะเขียนทับกับแมพที่มีอยู่แล้ว editor.overwrite = [accent]ตำเตือน!\nแมพนี้จะเขียนทับกับแมพที่มีอยู่แล้ว
@@ -545,7 +555,7 @@ launch.from = ลงจอดจากเซ็กเตอร์: [accent]{0}
launch.destination = จุดหมายปลายทาง: {0} launch.destination = จุดหมายปลายทาง: {0}
configure.invalid = จำนวนต้องอยู่ระหว่าง 0 ถึง {0} configure.invalid = จำนวนต้องอยู่ระหว่าง 0 ถึง {0}
add = เพิ่ม... add = เพิ่ม...
guardian = การ์เดียน guardian = ผู้พิทักษ์
connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0} connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0}
error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง? error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง?
@@ -614,29 +624,31 @@ sector.stainedMountains.name = ภูเขาหลากสี
sector.desolateRift.name = เดโซเลต ริฟต์ sector.desolateRift.name = เดโซเลต ริฟต์
sector.nuclearComplex.name = ฐานผลิตนิวเคลียร์ sector.nuclearComplex.name = ฐานผลิตนิวเคลียร์
sector.overgrowth.name = โอเวอร์โกรว์ด sector.overgrowth.name = โอเวอร์โกรว์ด
sector.tarFields.name = ทาร์ ฟิลด์ sector.tarFields.name = ผืนแผ่นแห่งน้ำมัน
sector.saltFlats.name = ที่ราบเกลือ sector.saltFlats.name = ที่ราบเกลือ
sector.fungalPass.name = ทางผ่านฟังกัล sector.fungalPass.name = ทางผ่านฟังกัล
sector.biomassFacility.name = แหล่งสังเคราะห์ชีวมวล sector.biomassFacility.name = แหล่งสังเคราะห์ชีวมวล
sector.windsweptIslands.name = หมู่เกาะวินด์สเวปท์ sector.windsweptIslands.name = หมู่เกาะวินด์สเวปท์
sector.extractionOutpost.name = ด่านส่งทรัพยากร sector.extractionOutpost.name = ด่านส่งทรัพยากร
sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน
sector.coastline.name = แนวชายฝั่ง
sector.navalFortress.name = ปราการแห่งวารี
sector.groundZero.description = ที่ที่ดีที่สุดในการเริ่มต้นอีกครั้ง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ sector.groundZero.description = ที่ที่ดีที่สุดในการเริ่มต้นอีกครั้ง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ
sector.frozenForest.description = แม้แต่ที่นี่ ที่ที่อยู่ใกล้ภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่\nอากาศอันเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้\nเรียนรู้ที่จะใช้เครื่องซ่อมแซม sector.frozenForest.description = แม้แต่ที่นี่ ที่ที่อยู่ใกล้ภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่\nอากาศอันแสนเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้\nเรียนรู้ที่จะใช้เครื่องซ่อมแซม
sector.saltFlats.description = ณ ขอบของทะเลทราย เป็นที่ตั้งของที่ราบเกลือ สามารถพบทรัพยากรบางอย่างได้ที่นี่\n\nศัตรูได้ตั้งฐานเก็บทรัพยากรไว้ที่นี่ ทำลายแกนกลางของพวกมัน อย่าให้มีอะไรเหลือ sector.saltFlats.description = ณ ขอบของทะเลทราย เป็นที่ตั้งของที่ราบเกลือ สามารถพบทรัพยากรบางอย่างได้ที่นี่\n\nศัตรูได้ตั้งฐานเก็บทรัพยากรไว้ที่นี่ ทำลายแกนกลางของพวกมัน อย่าให้มีอะไรเหลือ
sector.craters.description = น้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ อนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ sector.craters.description = มีน้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ เป็นอนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ
sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง\nซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน\nทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง\nซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน\nทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง
sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา
sector.overgrowth.description = พื้นที่นี้ถูกปกคลุมไปด้วยพืช เข้าใกล้กับแหล่งกำเนิดของสปอร์\nศัตรูได้ตั้งฐานเฝ้าระวังไว้ที่นี่ สร้างยูนิตเมส ทำลายฐานทิ้งซะ\nวิจัย[accent]เครื่องพัฒนารุ่นยกกำลัง[]เพื่อผลิตยูนิตขนาดที่ใหญ่ขึ้น sector.overgrowth.description = พื้นที่นี้ถูกปกคลุมไปด้วยพืช เข้าใกล้กับแหล่งกำเนิดของสปอร์\nศัตรูได้ตั้งฐานเฝ้าระวังไว้ที่นี่ สร้างยูนิตเมส ทำลายฐานทิ้งซะ\nวิจัย[accent]เครื่องพัฒนารุ่นยกกำลัง[]เพื่อผลิตยูนิตขนาดที่ใหญ่ขึ้น
sector.tarFields.description = ขอบของพื้นที่ผลิตน้ำมัน อยู่ระหว่างภูเขาและทะเลทราย หนึ่งในพื้นที่ที่มีแหล่งน้ำมันดินที่ใช้งานได้\nแม้ว่าจะถูกทิ้งร้าง พื้นที่นี้ยังคงมีฐานทัพของศัตรูอยู่ใกล้ๆ อย่าประมาทกับพวกมัน\n\n[lightgray]วิจัยเทคโนโลยีการแปรรูปน้ำมันหากเป็นไปได้ sector.tarFields.description = แนวชานขอบของแหล่งผลิตน้ำมัน อยู่ระหว่างภูเขาและทะเลทราย เป็นหนึ่งในพื้นที่ที่มีแหล่งน้ำมันดินที่ใช้งานได้\nแม้ว่าจะถูกทิ้งร้าง พื้นที่นี้ยังคงมีฐานทัพของศัตรูอยู่ใกล้ๆ อย่าประมาทกับพวกมัน\n\n[lightgray]วิจัยเทคโนโลยีการแปรรูปน้ำมันหากเป็นไปได้
sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาก ทรัพยากรมากมาย แต่พื้นที่คับแคบ\nความเสี่ยงการโดนทำลายล้างสูง ออกไปจากที่นี่ให้เร็วที่สุด\nอย่าถูกหลอกโดยระยะเวลาระหว่างการโจมตีของศัตรูที่เว้นไว้นานกว่าปกติ sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาก ทรัพยากรมากมาย แต่พื้นที่คับแคบ\nความเสี่ยงการโดนทำลายล้างสูง ออกไปจากที่นี่ให้เร็วที่สุด\nอย่าถูกหลอกโดยระยะเวลาระหว่างการโจมตีของศัตรูที่เว้นไว้นานกว่าปกติ
sector.nuclearComplex.description = สถานที่ผลิตและแปรรูปทอเรี่ยมเก่า ถูกทำลายไม่เหลือสิ้น\nวิจัยทอเรี่ยมและวิธีการใช้มัน\n\nศัตรูในบริเวณนี้มีจำนวนมาก คอยตรวจตราหาผู้บุกรุกอยู่ตลอดเวลา sector.nuclearComplex.description = สถานที่ผลิตและแปรรูปทอเรี่ยมเก่า ถูกทำลายไม่เหลือสิ้น\nวิจัยทอเรี่ยมและวิธีการใช้มัน\n\nศัตรูในบริเวณนี้มีจำนวนมาก คอยตรวจตราหาผู้บุกรุกอยู่ตลอดเวลา
sector.fungalPass.description = ทางผ่านระหว่างพื้นที่สูงและต่ำของภูเขา พื้นที่นี้เต็มไปด้วยสปอร์ ฐานลาดตระเวนขนาดเล็กของศัตรูตั้งอยู่ที่นี่\nทำลายมันซะ\nผลิตยูนิตแด็กเกอร์และครอว์เลอร์ ทำลายแกนกลางทั้งสองไม่ให้เหลือซาก sector.fungalPass.description = ทางผ่านระหว่างพื้นที่สูงและต่ำของภูเขา พื้นที่นี้เต็มไปด้วยสปอร์ ฐานลาดตระเวนขนาดเล็กของศัตรูตั้งอยู่ที่นี่\nทำลายมันซะ\nผลิตยูนิตแด็กเกอร์และครอว์เลอร์ ทำลายแกนกลางทั้งสองไม่ให้เหลือซาก
sector.biomassFacility.description = แหล่งต้นกำเนิดของสปอร์ ที่นี่คือฐานวิจัยและผลิตสปอร์เริ่มแรก\nวิจัยเทคโนโลยีที่อยู่ภายในนั้น เพาะชำ[accent]สปอร์[]เพื่อเป็นเชื้อเพลิงและใช้ในการผลิตพลาสติก\n\n[gray]เมื่อสถานที่นี้ถูกทิ้งร้าง สปอร์ก็ถูกปล่อยออกมา ไม่มีสิ่งใดในระบบนิเวศท้องถิ่นที่สามารถแข่งขันกับสิ่งมีชีวิตที่\nแพร่กระจายเช่นนี้ได้ sector.biomassFacility.description = แหล่งต้นกำเนิดของสปอร์ ที่นี่คือฐานวิจัยและผลิตสปอร์เริ่มแรก\nวิจัยเทคโนโลยีที่อยู่ภายในนั้น เพาะชำ[accent]สปอร์[]เพื่อเป็นเชื้อเพลิงและใช้ในการผลิตพลาสติก\n\n[gray]เมื่อสถานที่นี้ถูกทิ้งร้าง สปอร์ก็ถูกปล่อยออกมา ไม่มีสิ่งใดในระบบนิเวศท้องถิ่นที่สามารถแข่งขันกับสิ่งมีชีวิตที่\nแพร่กระจายเช่นนี้ได้
sector.windsweptIslands.description = เลยแนวชายฝั่งไปเป็นหมู่เกาะที่ตั้งอยู่ห่างไกล เคยมีบันทึกว่าที่นี่มีโรงงานผลิต[accent]พลาสตาเนี่ยม[]อยู่\n\nทำลายเรือศัตรู สร้างฐานทัพบนเกาะ วิจัยโรงงานพวกนี้ sector.windsweptIslands.description = เลยแนวชายฝั่งไปจะพบกับหมู่เกาะที่ตั้งอยู่ห่างไกลแห่งนี้ เคยมีบันทึกว่าที่นี่มีโรงงานผลิต[accent]พลาสตาเนี่ยม[]อยู่\n\nทำลายเรือศัตรู สร้างฐานทัพบนเกาะ วิจัยโรงงานพวกนี้
sector.extractionOutpost.description = ด่านที่อยู่ห่างไกล สร้างโดยศัตรูเพื่อใช้ในการส่งทรัพยากรไปยังฐานทัพอื่น\n\nเทคโนโลยีการส่งไอเท็มข้ามเซ็กเตอร์เป็นสิ่งจำเป็นสำหรับการพิชิตถัดๆ ไป ทำลายด่าน วิจัยฐานส่งของ sector.extractionOutpost.description = ด่านที่อยู่ห่างไกล สร้างโดยศัตรูเพื่อใช้ในการส่งทรัพยากรไปยังฐานทัพอื่น\n\nเทคโนโลยีการส่งไอเท็มข้ามเซ็กเตอร์เป็นสิ่งจำเป็นสำหรับการพิชิตถัดๆ ไป ทำลายด่าน วิจัยฐานส่งของ
sector.impact0078.description = นีคือเศษซากของเรือขนส่งระหว่างดวงดาวที่เคยเข้ามายังระบบนี้\nเศษเหล็กและหิมะปกคลุมทั่วทั้งพื้นที่\n\nกอบกู้ซากยานให้ได้มากที่สุด วิจัยเทคโนโลยีทั้งหมดที่ยังเหลือรอด\n\n\n[gray]อย่าประมาทกับฐานทัพศัตรูที่อยู่ใกล้ๆ โดยอันขาด\nศัตรูจะส่งกองกำลังมาโจมตีเรื่อยๆ จนกว่าคุณจะพ่ายแพ้ sector.impact0078.description = ณ ที่แห่งนีคือเศษซากของเรือขนส่งระหว่างดวงดาวที่เคยเข้ามายังระบบนี้\nเศษเหล็กและหิมะปกคลุมทั่วทั้งพื้นที่\n\nกอบกู้ซากยานให้ได้มากที่สุด วิจัยเทคโนโลยีทั้งหมดที่ยังเหลือรอด\n\n\n[gray]อย่าประมาทกับฐานทัพศัตรูที่อยู่ใกล้ๆ โดยอันขาด\nศัตรูจะส่งกองกำลังมาโจมตีเรื่อยๆ จนกว่าคุณจะพ่ายแพ้
sector.planetaryTerminal.description = เป้าหมายสุดท้าย\n\nฐานทัพติดชายหาดนี้มีสิ่งประดิษฐ์ที่สามารถส่งแกนกลางไปยังดาวที่อยู่ใกล้ๆ ได้ ฐานทัพมีการป้องกันที่แน่นหนามาก\n\nผลิตยูนิตเรือ กวาดล้างศัตรูให้เร็วที่สุด วิจัยสิ่งประดิษฐ์นั่น sector.planetaryTerminal.description = เป้าหมายสุดท้าย\n\nฐานทัพติดชายหาดนี้มีสิ่งประดิษฐ์ที่สามารถส่งแกนกลางไปยังดาวที่อยู่ใกล้ๆ ได้ ฐานทัพมีการป้องกันที่แน่นหนามาก\n\nผลิตยูนิตเรือ กวาดล้างศัตรูให้เร็วที่สุด วิจัยสิ่งประดิษฐ์นั่น
status.burning.name = เผาไหม้ status.burning.name = เผาไหม้
@@ -648,10 +660,12 @@ status.sapped.name = อ่อนกำลัง
status.electrified.name = ช็อตไฟฟ้า status.electrified.name = ช็อตไฟฟ้า
status.spore-slowed.name = สปอร์สโลว์ status.spore-slowed.name = สปอร์สโลว์
status.tarred.name = เปื้อนน้ำมัน status.tarred.name = เปื้อนน้ำมัน
status.overdrive.name = โอเวอร์ไดรฟ์
status.overclock.name = โอเวอร์คล็อก status.overclock.name = โอเวอร์คล็อก
status.shocked.name = ช็อก status.shocked.name = ช็อก
status.blasted.name = ระเบิด status.blasted.name = ระเบิด
status.unmoving.name = หยุดนิ่ง status.unmoving.name = หยุดนิ่ง
status.boss.name = ผู้พิทักษ์
settings.language = ภาษา settings.language = ภาษา
settings.data = ข้อมูลเกม settings.data = ข้อมูลเกม
@@ -663,7 +677,7 @@ settings.game = เกม
settings.sound = เสียง 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 = เคลียร์เซฟ
@@ -681,7 +695,7 @@ info.title = ข้อมูล
error.title = [crimson]มีบางอย่างผิดพลาดเกิดขึ้น error.title = [crimson]มีบางอย่างผิดพลาดเกิดขึ้น
error.crashtitle = มีบางอย่างผิดพลาดเกิดขึ้น error.crashtitle = มีบางอย่างผิดพลาดเกิดขึ้น
unit.nobuild = [scarlet]ยูนิตนี้ไม่สามารถสร้างได้ unit.nobuild = [scarlet]ยูนิตนี้ไม่สามารถสร้างได้
lastaccessed = [lightgray]:คนที่แตะเป็นคนสุดท้าย {0} lastaccessed = [lightgray]คนสุดท้ายที่แตะ: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <โหลดแมพเพื่อแสดง> stat.showinmap = <โหลดแมพเพื่อแสดง>
@@ -776,7 +790,7 @@ bar.corereq = ต้องวางบนแกนกลาง
bar.drillspeed = ความเร็วการขุด: {0}/วิ bar.drillspeed = ความเร็วการขุด: {0}/วิ
bar.pumpspeed = ความเร็วการปั้ม: {0}/วิ bar.pumpspeed = ความเร็วการปั้ม: {0}/วิ
bar.efficiency = ประสิทธิภาพ: {0}% bar.efficiency = ประสิทธิภาพ: {0}%
bar.boost = เปอร์เซ็นการเร่ง: {0}% bar.boost = เปอร์เซ็นการเร่ง: +{0}%
bar.powerbalance = พลังงาน: {0}/วิ bar.powerbalance = พลังงาน: {0}/วิ
bar.powerstored = เก็บแล้ว: {0}/{1} bar.powerstored = เก็บแล้ว: {0}/{1}
bar.poweramount = พลังงาน: {0} bar.poweramount = พลังงาน: {0}
@@ -1149,6 +1163,7 @@ block.core-nucleus.name = แกนกลาง: นิวเคลียส
block.deep-water.name = น้ำลึก block.deep-water.name = น้ำลึก
block.shallow-water.name = น้ำตื้น block.shallow-water.name = น้ำตื้น
block.tainted-water.name = น้ำเสีย block.tainted-water.name = น้ำเสีย
block.deep-tainted-water.name = น้ำเสียลึก
block.darksand-tainted-water.name = น้ำเสียบนทรายดำ block.darksand-tainted-water.name = น้ำเสียบนทรายดำ
block.tar.name = น้ำมันดิน block.tar.name = น้ำมันดิน
block.stone.name = หิน block.stone.name = หิน
@@ -1379,9 +1394,10 @@ hint.payloadDrop = กด [accent]][] เพื่อปล่อยสิ่ง
hint.payloadDrop.mobile = [accent]กดค้างไว้[]ที่พื้นที่โล่งๆ เพื่อปล่อยสิ่งที่บรรทุกอยู่ hint.payloadDrop.mobile = [accent]กดค้างไว้[]ที่พื้นที่โล่งๆ เพื่อปล่อยสิ่งที่บรรทุกอยู่
hint.waveFire = ป้อมปืน[accent]คลื่นน้ำ[]หากเติมน้ำเข้าไปจะช่วยดับไฟรอบข้างให้อัตโนมัติ hint.waveFire = ป้อมปืน[accent]คลื่นน้ำ[]หากเติมน้ำเข้าไปจะช่วยดับไฟรอบข้างให้อัตโนมัติ
hint.generator = \uf879 [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[]จะเผาถ่านและส่งพลังงานไปยังบล็อกที่อยู่ใกล้ๆ\n\nระยะของพลังงานสามารถขยายได้ด้วย \uf87f [accent]ตัวจ่ายพลังงาน[] hint.generator = \uf879 [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[]จะเผาถ่านและส่งพลังงานไปยังบล็อกที่อยู่ใกล้ๆ\n\nระยะของพลังงานสามารถขยายได้ด้วย \uf87f [accent]ตัวจ่ายพลังงาน[]
hint.guardian = หน่วย[accent]การ์เดียน[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายการ์เดียน hint.guardian = หน่วย[accent]ผู้พิทักษ์[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายผู้พิทักษ์
hint.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง hint.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง
hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง
hint.presetDifficulty = เซ็กเตอร์นี้มี[scarlet]ระดับภัยคุกคามศัตรูสูง[]\n[accent]ไม่แนะนำ[]ให้ลงจอดไปยังเซ็กเซอร์พวกนั้นหากไม่มีการเตรียมพร้อมและเทคโนโลยี
hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[] hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[]
hint.coopCampaign = ตอนที่เล่น[accent]แคมเปญร่วมกัน[]กับเพื่อน ไอเท็มที่ผลิตในแมพนี้จะถูกส่ง[accent]ไปยังเซ็กเตอร์ของคุณด้วย[]\n\nการวิจัยใหม่ที่โฮสต์ได้วิจัยก็เก็บเป็นของคุณด้วย hint.coopCampaign = ตอนที่เล่น[accent]แคมเปญร่วมกัน[]กับเพื่อน ไอเท็มที่ผลิตในแมพนี้จะถูกส่ง[accent]ไปยังเซ็กเตอร์ของคุณด้วย[]\n\nการวิจัยใหม่ที่โฮสต์ได้วิจัยก็เก็บเป็นของคุณด้วย
@@ -1603,7 +1619,7 @@ unit.mega.description = ซ่อมแซมสิ่งก่อสร้า
unit.quad.description = ทิ้งระเบิดขนาดใหญ่ลงบนเป้าหมายพื้นดิน ซ่อมแซมสิ่งก่อสร้างของพวกพ้องและสร้างความเสียหายแก่ศัตรู สามารถบรรทุกยูนิตพื้นดินขนาดกลางได้ unit.quad.description = ทิ้งระเบิดขนาดใหญ่ลงบนเป้าหมายพื้นดิน ซ่อมแซมสิ่งก่อสร้างของพวกพ้องและสร้างความเสียหายแก่ศัตรู สามารถบรรทุกยูนิตพื้นดินขนาดกลางได้
unit.oct.description = ปกป้องพวกพ้องที่อยู่ใกล้เคียงด้วยโล่พลังงาน สามารถบรรทุกยูนิตภาคพื้นดินได้แทบทุกตัว unit.oct.description = ปกป้องพวกพ้องที่อยู่ใกล้เคียงด้วยโล่พลังงาน สามารถบรรทุกยูนิตภาคพื้นดินได้แทบทุกตัว
unit.risso.description = ยิงขีปนาวุธและสาดกระสุนจำนวนมากใส่ศัตรูใกล้เคียง unit.risso.description = ยิงขีปนาวุธและสาดกระสุนจำนวนมากใส่ศัตรูใกล้เคียง
unit.minke.description = ยิงกระสุนหนักและกระสุนธรรมดาไปยังเป้าหมายพื้นดินที่อยู่ใกล้เคียง\nให้สถานะ[accent]โอเวอร์คล็อก[]แก่พวกพ้องรอบข้าง ทำให้ยิงเร็วและแรงขึ้น unit.minke.description = ยิงทั้งกระสุนหนักและกระสุนธรรมดาไปยังเป้าหมายพื้นดินที่อยู่ใกล้เคียง
unit.bryde.description = ยิงกระสุนปืนใหญ่พิสัยไกลและขีปนาวุธติดตามตัวใส่ศัตรู unit.bryde.description = ยิงกระสุนปืนใหญ่พิสัยไกลและขีปนาวุธติดตามตัวใส่ศัตรู
unit.sei.description = ยิงขีปนาวุธติดตามตัวและกระสุนเจาะเกราะใส่ศัตรู unit.sei.description = ยิงขีปนาวุธติดตามตัวและกระสุนเจาะเกราะใส่ศัตรู
unit.omura.description = ยิงลำแสงปืนเรลกันเจาะทะลุระยะไกลใส่ศัตรู สร้างยูนิตแฟลร์ unit.omura.description = ยิงลำแสงปืนเรลกันเจาะทะลุระยะไกลใส่ศัตรู สร้างยูนิตแฟลร์
@@ -1611,7 +1627,7 @@ unit.alpha.description = ปกป้องแกนกลางชาร์ด
unit.beta.description = ปกป้องแกนกลางฟาวน์เดชั่นจากศัตรู สร้างสิ่งต่างๆ unit.beta.description = ปกป้องแกนกลางฟาวน์เดชั่นจากศัตรู สร้างสิ่งต่างๆ
unit.gamma.description = ปกป้องแกนกลางนิวเคลียสจากศัตรู สร้างสิ่งต่างๆ unit.gamma.description = ปกป้องแกนกลางนิวเคลียสจากศัตรู สร้างสิ่งต่างๆ
unit.retusa.description = วางทุ่นระเบิดระยะใกล้ และซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียง unit.retusa.description = วางทุ่นระเบิดระยะใกล้ และซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียง
unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียงและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nทำลายกระสุนที่กำลังเข้ามาด้วยปืนป้องกันจุด unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียงและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nทำลายกระสุนที่กำลังเข้ามาด้วยปืนป้องกันจุด\nให้สถานะ[accent]โอเวอร์คล็อก[]แก่พวกพ้องรอบข้าง ทำให้ยิงเร็วและแรงขึ้น
unit.cyerce.description = ยิงขีปนาวุธพลาสม่าติดตามตัวเป็นกระจุกระเบิดใส่ศัตรู\nซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียงด้วยปืนซ่อมแซม unit.cyerce.description = ยิงขีปนาวุธพลาสม่าติดตามตัวเป็นกระจุกระเบิดใส่ศัตรู\nซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียงด้วยปืนซ่อมแซม
unit.aegires.description = ช็อตทุกสิ่งก่อสร้างและยูนิตศัตรูที่เข้ามาในสนามพลังงานของมัน\nซ่อมแซมสิ่งก่อสร้างและยูนิตพวกพ้อง unit.aegires.description = ช็อตทุกสิ่งก่อสร้างและยูนิตศัตรูที่เข้ามาในสนามพลังงานของมัน\nซ่อมแซมสิ่งก่อสร้างและยูนิตพวกพ้อง
unit.navanax.description = ยิงลูกระเบิดคลื่นชีพจรแม่เหล็กขนาดใหญ่ สร้างความเสียหายอย่างหนักให้กับเครือข่ายพลังงานศัตรู\nและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nหลอมละลายศัตรูที่อยู่ใกล้เคียงด้วยป้อมปืนเลเซอร์อัตโนมัติสี่ป้อม unit.navanax.description = ยิงลูกระเบิดคลื่นชีพจรแม่เหล็กขนาดใหญ่ สร้างความเสียหายอย่างหนักให้กับเครือข่ายพลังงานศัตรู\nและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nหลอมละลายศัตรูที่อยู่ใกล้เคียงด้วยป้อมปืนเลเซอร์อัตโนมัติสี่ป้อม
@@ -1703,7 +1719,7 @@ lenum.any = ยูนิตอะไรก็ได้
lenum.ally = ยูนิตพวกพ้อง lenum.ally = ยูนิตพวกพ้อง
lenum.attacker = ยูนิตติดอาวุธ lenum.attacker = ยูนิตติดอาวุธ
lenum.enemy = ยูนิตศัตรู lenum.enemy = ยูนิตศัตรู
lenum.boss = ยูนิตการ์เดียน lenum.boss = ยูนิตผู้พิทักษ์
lenum.flying = ยูนิตอากาศ lenum.flying = ยูนิตอากาศ
lenum.ground = ยูนิตพื้นดิน lenum.ground = ยูนิตพื้นดิน
lenum.player = ยูนิตที่ถูกควบคุมโดยผู้เล่น lenum.player = ยูนิตที่ถูกควบคุมโดยผู้เล่น
@@ -1759,12 +1775,12 @@ lenum.target = ยิงไปที่ตำแหน่งเป้าหม
lenum.targetp = ยิงเป้าหมายโดยมีการคำนวณความเร็ว lenum.targetp = ยิงเป้าหมายโดยมีการคำนวณความเร็ว
lenum.itemdrop = ปล่อยไอเท็ม lenum.itemdrop = ปล่อยไอเท็ม
lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง
lenum.paydrop = ปล่อยของที่บรรทุกอยู่ lenum.paydrop = ปล่อยสิ่งที่บรรทุกอยู่
lenum.paytake = หยิบของบรรทุกที่จุดที่อยู่ lenum.paytake = หยิบสิ่งบรรทุกจุดที่อยู่
lenum.flag = ปักธงยูนิตเป็นหมายเลข lenum.flag = ปักธงยูนิตเป็นหมายเลข
lenum.mine = ขุดที่ตำแหน่งเป้าหมาย lenum.mine = ขุดที่ตำแหน่งเป้าหมาย
lenum.build = สร้างสิ่งก่อสร้าง lenum.build = สร้างสิ่งก่อสร้าง
lenum.getblock = ดึงข้อมูลสิ่งก่อสร้างและประเภทสิ่งก่อสร้างที่ตำแหน่งเป้าหมาย\nหน่วยต้องอยู่ในช่วงของตำแหน่ง\nของแข็งที่ไม่ใช่สิ่งก่อสร้างจะส่งกลับเป็น [accent]@solid[] lenum.getblock = ดึงข้อมูลสิ่งก่อสร้างและประเภทสิ่งก่อสร้างที่ตำแหน่งเป้าหมาย\nหน่วยต้องอยู่ในช่วงของตำแหน่ง\nของแข็งที่ไม่ใช่สิ่งก่อสร้างจะส่งกลับเป็น [accent]@solid[]
lenum.within = ตรวจสอบว่ายูนิตอยู่ในระยะหรือไม่ lenum.within = ตรวจสอบว่ายูนิตอยู่ในระยะหรือไม่
lenum.boost = เริ่ม/หยุดการบูสต์ lenum.boost = เริ่ม/หยุดการบูสต์
#extra line: 18 => extra descriptions: 4+2 => extra details: (7+4)+1 #extra line: 16 => extra descriptions: 4 => extra details: (7+4)+1

View File

@@ -393,6 +393,13 @@ waves.load = Panodan yükle
waves.invalid = Panoda geçersiz dalga sayısı var. waves.invalid = Panoda geçersiz dalga sayısı var.
waves.copied = Dalgalar kopyalandı. waves.copied = Dalgalar kopyalandı.
waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın
waves.sort = Sıralama Ölçeği:
waves.sort.reverse = Ters Sırala
waves.sort.begin = Başla
waves.sort.health = Can
waves.sort.type = Tür
waves.units.hide = Hepsini Gizle
waves.units.show = Hepsini Göster
#bunlar özellikle küçük başlıyor. #bunlar özellikle küçük başlıyor.
wavemode.counts = miktarlar wavemode.counts = miktarlar
@@ -621,6 +628,8 @@ sector.biomassFacility.name = Sentetik BioMadde Santrali
sector.windsweptIslands.name = Rüzgarlı Adalar sector.windsweptIslands.name = Rüzgarlı Adalar
sector.extractionOutpost.name = Kazı Üssü sector.extractionOutpost.name = Kazı Üssü
sector.planetaryTerminal.name = Gezegenler Arası Terminal sector.planetaryTerminal.name = Gezegenler Arası Terminal
sector.coastline.name = Kıyı Şeridi
sector.navalFortress.name = Deniz Kalesi
sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle. sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle.
sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren.
@@ -1272,7 +1281,7 @@ block.oil-extractor.name = Petrol Çıkarıcı
block.repair-point.name = Tamir Noktası block.repair-point.name = Tamir Noktası
block.repair-turret.name = Tamir Turreti block.repair-turret.name = Tamir Turreti
block.pulse-conduit.name = Dalga Borusu block.pulse-conduit.name = Dalga Borusu
block.plated-conduit.name = Kaplı Boru block.plated-conduit.name = Yalıtımlı Boru
block.phase-conduit.name = Faz Borusu block.phase-conduit.name = Faz Borusu
block.liquid-router.name = Sıvı Yönlendiricisi block.liquid-router.name = Sıvı Yönlendiricisi
block.liquid-tank.name = Sıvı Tankı block.liquid-tank.name = Sıvı Tankı
@@ -1382,6 +1391,7 @@ hint.generator = \uf879 [accent]Termik Jeneratör[] kömür yakarak enerji üret
hint.guardian = [accent]Gardiyan[] birimleri güçlü bir zırha sahiptir. [accent]bakır[] ve [accent]kurşun[] gibi mermilere karşı [scarlet]Dayanıklıdır[].\n\nGardiyanları öldürmek için [accent]salvo[] gibi daha güçlü taretleri ve \uf835 [accent]grafit[] gibi daha çok hasar veren mermileri kullanın. hint.guardian = [accent]Gardiyan[] birimleri güçlü bir zırha sahiptir. [accent]bakır[] ve [accent]kurşun[] gibi mermilere karşı [scarlet]Dayanıklıdır[].\n\nGardiyanları öldürmek için [accent]salvo[] gibi daha güçlü taretleri ve \uf835 [accent]grafit[] gibi daha çok hasar veren mermileri kullanın.
hint.coreUpgrade = Merkezinizi, [accent]merkezinizin üstüne daha gelişmiş bir merkez[] koyarak geliştirebilirsiniz. \n\n[accent]Parçacık[] olarak adlandırılan fakirhanenizin üstüne [accent]Temel[] olarak adlandırılan merkezinizi koyun. Merkezinizin etrafında hiçbir yapı olmamalıdır. hint.coreUpgrade = Merkezinizi, [accent]merkezinizin üstüne daha gelişmiş bir merkez[] koyarak geliştirebilirsiniz. \n\n[accent]Parçacık[] olarak adlandırılan fakirhanenizin üstüne [accent]Temel[] olarak adlandırılan merkezinizi koyun. Merkezinizin etrafında hiçbir yapı olmamalıdır.
hint.presetLaunch = [accent]Donmuş Ormanlar[] gibi [accent]ana sektörlere iniş[] herhangi bir yerden yapılabilir. Yakındaki bir sektörden fırlatma gerektirmez.\n\nBunun gibi [accent]sayı ile isimlendirilmiş[] sektörleri ele geçirmek [accent]isteğe bağlıdır.[]. hint.presetLaunch = [accent]Donmuş Ormanlar[] gibi [accent]ana sektörlere iniş[] herhangi bir yerden yapılabilir. Yakındaki bir sektörden fırlatma gerektirmez.\n\nBunun gibi [accent]sayı ile isimlendirilmiş[] sektörleri ele geçirmek [accent]isteğe bağlıdır.[].
hint.presetDifficulty = Bu sektör, [scarlet]yüksek tehlike[] barındırıyor.\nBöyle bir sektöre hazırlıksız fırlatış yapmak [accent]tavsiye edilmez[].
hint.coreIncinerate = Bir çekirdek ağzına kadar dolduktan sonra, ekstra itemler [accent]eritilir[]. hint.coreIncinerate = Bir çekirdek ağzına kadar dolduktan sonra, ekstra itemler [accent]eritilir[].
hint.coopCampaign = Arkadaşlarınla Multiplayer Campaign oynarken, her yaptığınız Araştırma ve item aktarımı, senin oyun içi Campaign ine de aktarılır. hint.coopCampaign = Arkadaşlarınla Multiplayer Campaign oynarken, her yaptığınız Araştırma ve item aktarımı, senin oyun içi Campaign ine de aktarılır.
#Yukarıdaki bağzı cümleler Anti Dragon tarafından çevirildi. #Yukarıdaki bağzı cümleler Anti Dragon tarafından çevirildi.
@@ -1438,6 +1448,8 @@ block.item-source.description = Seçilen eşyadan sonsuz verir. Sadece Yaratıc
block.item-void.description = Verilen eşyaları yok eder. Sadece Yaratıcı Modda. block.item-void.description = Verilen eşyaları yok eder. Sadece Yaratıcı Modda.
block.liquid-source.description = Seçilen sıvıyı sonsuz verir. Sadece Yaratıcı Modda. block.liquid-source.description = Seçilen sıvıyı sonsuz verir. Sadece Yaratıcı Modda.
block.liquid-void.description = Verilen sıvıları yok eder. Sadece Yaratıcı Modda. block.liquid-void.description = Verilen sıvıları yok eder. Sadece Yaratıcı Modda.
block.payload-source.description = Sınırsız bir şekilde Eleman ve Kargo oluşturur. Sadece Yaratıcı Modda.
block.payload-void.description = Tüm Yük ve Elemanları Yok Eder. Sadece Yaratıcı Modda.
block.copper-wall.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır. block.copper-wall.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır.
block.copper-wall-large.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve taretleri korumak için kullanışlıdır.\nBirçok blok alan kaplar. block.copper-wall-large.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve taretleri korumak için kullanışlıdır.\nBirçok blok alan kaplar.
block.titanium-wall.description = Orta derecede güçlü savunma bloğu.\nDüşmanlardan orta derecede koruma sağlar. block.titanium-wall.description = Orta derecede güçlü savunma bloğu.\nDüşmanlardan orta derecede koruma sağlar.

View File

@@ -18,7 +18,7 @@ screenshot = Зняток мапи збережено до {0}
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
gameover = Гра завершена gameover = Гра завершена
gameover.disconnect = Від’єднатися gameover.disconnect = Від’єднатися
gameover.pvp = [accent]{0}[] команда перемогла! gameover.pvp = [accent]{0}[] перемогли!
gameover.waiting = [accent]Очікуємо наступно мапу… gameover.waiting = [accent]Очікуємо наступно мапу…
highscore = [accent]Новий рекорд! highscore = [accent]Новий рекорд!
copied = Скопійовано. copied = Скопійовано.
@@ -98,6 +98,7 @@ customgame = Користувацька гра
newgame = Нова гра newgame = Нова гра
none = <нічого> none = <нічого>
none.found = [lightgray]<нічого не знайдено> none.found = [lightgray]<нічого не знайдено>
none.inmap = [lightgray]<нічого на мапі не знайдено>
minimap = Мінімапа minimap = Мінімапа
position = Місцезнаходження position = Місцезнаходження
close = Закрити close = Закрити
@@ -208,6 +209,7 @@ server.refreshing = Оновлення сервера
hosts.none = [lightgray]Локальних ігор не знайдено hosts.none = [lightgray]Локальних ігор не знайдено
host.invalid = [scarlet]Не вдалося під’єднатися до сервера. host.invalid = [scarlet]Не вдалося під’єднатися до сервера.
servers.local = Локальні сервери servers.local = Локальні сервери
servers.local.steam = Локальні сервери і сервери від гравців Steam
servers.remote = Віддалені сервери servers.remote = Віддалені сервери
servers.global = Глобальні сервери servers.global = Глобальні сервери
@@ -308,7 +310,7 @@ data.invalid = Це не дійсні ігрові дані.
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється.
quit.confirm = Ви дійсно хочете вийти? quit.confirm = Ви дійсно хочете вийти?
loading = [accent]Завантаження… loading = [accent]Завантаження…
reloading = [accent]Перезавантаження модифікацій downloading = [accent]Завантаження…
saving = [accent]Збереження… saving = [accent]Збереження…
respawn = [accent][[{0}][], щоби відродитися в ядрі respawn = [accent][[{0}][], щоби відродитися в ядрі
cancelbuilding = [accent][[{0}][] для очищення плану cancelbuilding = [accent][[{0}][] для очищення плану
@@ -337,8 +339,8 @@ builtin = Вбудована
map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати!
map.random = [accent]Випадкова мапа map.random = [accent]Випадкова мапа
map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі.
map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [#{0}]{1}[] ядро до цієї мапи в редакторі.
map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [#{0}]{1}[] ядро до цієї мапи в редакторі.
map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи.
workshop.update = Оновити предмет workshop.update = Оновити предмет
workshop.error = Помилка під час отримання інформації з Майстерні: {0} workshop.error = Помилка під час отримання інформації з Майстерні: {0}
@@ -519,6 +521,7 @@ configure = Налаштувати вивантаження
loadout = Вивантаження loadout = Вивантаження
resources = Ресурси resources = Ресурси
bannedblocks = Заборонені блоки bannedblocks = Заборонені блоки
bannedunits = Заборонені одиниці
addall = Додати все addall = Додати все
launch.from = Запуск з [accent]{0} launch.from = Запуск з [accent]{0}
launch.destination = Пункт призначення: {0} launch.destination = Пункт призначення: {0}
@@ -540,10 +543,13 @@ weather.snow.name = Сніг
weather.sandstorm.name = Піщана буря weather.sandstorm.name = Піщана буря
weather.sporestorm.name = Спорова буря weather.sporestorm.name = Спорова буря
weather.fog.name = Туман weather.fog.name = Туман
sectorlist = Сектори
sectorlist.attacked = {0} під атакою
sectors.unexplored = [lightgray]Не досліджено sectors.unexplored = [lightgray]Не досліджено
sectors.resources = Ресурси: sectors.resources = Ресурси:
sectors.production = Виробництво: sectors.production = Виробництво:
sectors.export = Експортування: sectors.export = Експортування:
sectors.import = Імпортування:
sectors.time = Час: sectors.time = Час:
sectors.threat = Загроза: sectors.threat = Загроза:
sectors.wave = Хвиля: sectors.wave = Хвиля:
@@ -696,7 +702,7 @@ stat.maxconsecutive = Максимальна послідовність
stat.buildcost = Вартість будування stat.buildcost = Вартість будування
stat.inaccuracy = Розкид stat.inaccuracy = Розкид
stat.shots = Постріли stat.shots = Постріли
stat.reload = Постріли за сек. stat.reload = Скорострільність
stat.ammo = Боєприпаси stat.ammo = Боєприпаси
stat.shieldhealth = Міцність щита stat.shieldhealth = Міцність щита
stat.cooldowntime = Тривалість охолодження stat.cooldowntime = Тривалість охолодження
@@ -740,7 +746,7 @@ bar.corereq = Необхідне основне ядро
bar.drillspeed = Швидкість буріння: {0} за с. bar.drillspeed = Швидкість буріння: {0} за с.
bar.pumpspeed = Швидкість викачування: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с.
bar.efficiency = Ефективність: {0}% bar.efficiency = Ефективність: {0}%
bar.boost = Підсилення: {0}% bar.boost = Підсилення: +{0}%
bar.powerbalance = Енергія: {0} за с. bar.powerbalance = Енергія: {0} за с.
bar.powerstored = Зберігає: {0}/{1} bar.powerstored = Зберігає: {0}/{1}
bar.poweramount = Енергія: {0} bar.poweramount = Енергія: {0}
@@ -761,7 +767,7 @@ 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]запальний
bullet.homing = [stat]самонаведення bullet.homing = [stat]самонаведення
bullet.frag = [stat]шкода по ділянці bullet.frags = [stat]{0}[lightgray]x шкода по ділянці від снарядів:
bullet.lightning = [stat]{0}[lightgray]x блискавки ~ [stat]{1}[lightgray] шкоди bullet.lightning = [stat]{0}[lightgray]x блискавки ~ [stat]{1}[lightgray] шкоди
bullet.buildingdamage = [stat]{0}%[lightgray] шкода по будівлям bullet.buildingdamage = [stat]{0}%[lightgray] шкода по будівлям
bullet.knockback = [stat]{0}[lightgray] відкидання bullet.knockback = [stat]{0}[lightgray] відкидання
@@ -799,19 +805,19 @@ category.items = Предмети
category.crafting = Виробництво category.crafting = Виробництво
category.function = Стрільба category.function = Стрільба
category.optional = Додаткові поліпшення category.optional = Додаткові поліпшення
setting.skipcoreanimation.name = Пропустити запуск ядра та анімацію приземлення
setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.landscape.name = Тільки альбомний (горизонтальний) режим
setting.shadows.name = Тіні setting.shadows.name = Тіні
setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків
setting.linear.name = Лінійна фільтрація setting.linear.name = Лінійна фільтрація
setting.hints.name = Підказки setting.hints.name = Підказки
setting.flow.name = Показувати темп швидкості ресурсів setting.logichints.name = Підказки при роботі з логікою
setting.backgroundpause.name = Пауза в разі згортанні setting.backgroundpause.name = Пауза в разі згортанні
setting.buildautopause.name = Автоматичне призупинення будування setting.buildautopause.name = Автоматичне призупинення будування
setting.doubletapmine.name = Подвійне торкання для початку видобування setting.doubletapmine.name = Подвійне торкання для початку видобування
setting.modcrashdisable.name = Вимикати модифікації після аварійного запуску setting.modcrashdisable.name = Вимикати модифікації після аварійного запуску
setting.animatedwater.name = Анімаційні рідини setting.animatedwater.name = Анімаційні рідини
setting.animatedshields.name = Анімаційні щити setting.animatedshields.name = Анімаційні щити
setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[]
setting.playerindicators.name = Позначки гравців setting.playerindicators.name = Позначки гравців
setting.indicators.name = Позначки противників setting.indicators.name = Позначки противників
setting.autotarget.name = Автострільба setting.autotarget.name = Автострільба
@@ -820,7 +826,8 @@ setting.touchscreen.name = Керування сенсорним екраном
setting.fpscap.name = Максимальний FPS setting.fpscap.name = Максимальний FPS
setting.fpscap.none = Жодне setting.fpscap.none = Жодне
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Масштабування користувацького інтерфейсу[lightgray] (потребує перезапуску)[] setting.uiscale.name = Масштабування користувацького інтерфейсу
setting.uiscale.description = Потрібен перезапуск для застосування змін.
setting.swapdiagonal.name = Завжди діагональне розміщення setting.swapdiagonal.name = Завжди діагональне розміщення
setting.difficulty.training = Навчання setting.difficulty.training = Навчання
setting.difficulty.easy = Легка setting.difficulty.easy = Легка
@@ -838,7 +845,9 @@ setting.saveinterval.name = Інтервал збереження
setting.seconds = {0} секунд setting.seconds = {0} секунд
setting.milliseconds = {0} мілісекунд setting.milliseconds = {0} мілісекунд
setting.fullscreen.name = Повноекранний режим setting.fullscreen.name = Повноекранний режим
setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску) setting.borderlesswindow.name = Вікно без полів
setting.borderlesswindow.name.windows = Повний екран без полів
setting.borderlesswindow.description = Можливо, потрібен перезапуск для застосування змін.
setting.fps.name = Показувати FPS і затримку до сервера setting.fps.name = Показувати FPS і затримку до сервера
setting.smoothcamera.name = Гладка камера setting.smoothcamera.name = Гладка камера
setting.vsync.name = Вертикальна синхронізація setting.vsync.name = Вертикальна синхронізація
@@ -859,6 +868,7 @@ setting.playerlimit.name = Обмеження гравців
setting.chatopacity.name = Непрозорість чату setting.chatopacity.name = Непрозорість чату
setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.lasersopacity.name = Непрозорість лазерів енергопостачання
setting.bridgeopacity.name = Непрозорість мостів setting.bridgeopacity.name = Непрозорість мостів
setting.showweather.name = Показувати погоду
setting.playerchat.name = Показувати хмару чата над гравцями setting.playerchat.name = Показувати хмару чата над гравцями
public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри.
public.confirm.really = Якщо ви хочете грати з друзями, використовуйте [green]Запросити друзів[] замість [scarlet]Публічного серверу[]!\nВи справді хочете зробити свою гру [scarlet]публічною[]? public.confirm.really = Якщо ви хочете грати з друзями, використовуйте [green]Запросити друзів[] замість [scarlet]Публічного серверу[]!\nВи справді хочете зробити свою гру [scarlet]публічною[]?
@@ -958,6 +968,8 @@ rules.wavetimer = Таймер для хвиль
rules.waves = Хвилі rules.waves = Хвилі
rules.attack = Режим атаки rules.attack = Режим атаки
rules.buildai = Будування ШІ rules.buildai = Будування ШІ
rules.aitier = Рівень складності будівель ШІ [0;1]
rules.cleanupdeadteams = Очистити будівлі переможеної команди (PvP)
rules.corecapture = Захоплення ядра після знищення rules.corecapture = Захоплення ядра після знищення
rules.polygoncoreprotection = Полігональний захист ядер rules.polygoncoreprotection = Полігональний захист ядер
rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ
@@ -977,12 +989,15 @@ rules.deconstructrefundmultiplier = Множник відшкодування в
rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої
rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках)
rules.unitammo = Бойові одиниці потребують боєприпасів rules.unitammo = Бойові одиниці потребують боєприпасів
rules.enemyteam = Ворожа команда
rules.playerteam = Команда гравця
rules.title.waves = Хвилі rules.title.waves = Хвилі
rules.title.resourcesbuilding = Ресурси й будування rules.title.resourcesbuilding = Ресурси й будування
rules.title.enemy = Противники rules.title.enemy = Противники
rules.title.unit = Бойові одиниці rules.title.unit = Бойові одиниці
rules.title.experimental = Експериментальне rules.title.experimental = Експериментальне
rules.title.environment = Середовище rules.title.environment = Середовище
rules.title.teams = Команди
rules.lighting = Світлотінь rules.lighting = Світлотінь
rules.enemyLights = Ворожі вогні rules.enemyLights = Ворожі вогні
rules.fire = Вогонь rules.fire = Вогонь
@@ -1055,7 +1070,6 @@ 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.parallax.name = Паралакс block.parallax.name = Паралакс
block.cliff.name = Скеля block.cliff.name = Скеля
block.sand-boulder.name = Пісочний валун block.sand-boulder.name = Пісочний валун
@@ -1247,7 +1261,6 @@ 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.segment.name = Сегмент block.segment.name = Сегмент
block.command-center.name = Командний центр block.command-center.name = Командний центр
block.ground-factory.name = Наземний завод block.ground-factory.name = Наземний завод
@@ -1268,10 +1281,10 @@ block.payload-source.name = Вантажне джерело
block.disassembler.name = Розбирач block.disassembler.name = Розбирач
block.silicon-crucible.name = Кремнієвий тигель block.silicon-crucible.name = Кремнієвий тигель
block.overdrive-dome.name = Великий прискорювач block.overdrive-dome.name = Великий прискорювач
block.interplanetary-accelerator.name = Міжпланетний прискорювач
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 = Логічний процесор
@@ -1280,13 +1293,13 @@ 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 = Розколоті
team.orange.name = Помаранчева team.orange.name = Помаранчеві
team.derelict.name = Знедолена team.derelict.name = Переможені
team.green.name = Зелена team.green.name = Зелені
team.purple.name = Фіолетова team.purple.name = Фіолетові
hint.skip = Пропустити hint.skip = Пропустити
hint.desktopMove = Використовуйте [accent][[WASD][], щоби рухатися. hint.desktopMove = Використовуйте [accent][[WASD][], щоби рухатися.
hint.zoom = [accent]Прокручуйте коліщатком миші[], щоби збільшити чи зменшити масштаб мапи. hint.zoom = [accent]Прокручуйте коліщатком миші[], щоби збільшити чи зменшити масштаб мапи.
@@ -1305,6 +1318,7 @@ hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби
hint.breaking.mobile = Активуйте  [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене. hint.breaking.mobile = Активуйте  [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене.
hint.blockInfo = Подивіться інформацію про блок. Перейдіть до [accent]меню будівництва[] і натисніть на кнопку [accent][[?][] правпоруч hint.blockInfo = Подивіться інформацію про блок. Перейдіть до [accent]меню будівництва[] і натисніть на кнопку [accent][[?][] правпоруч
hint.research = Використовуйте кнопку  [accent]Дослідження[] для дослідження нової технології. hint.research = Використовуйте кнопку  [accent]Дослідження[] для дослідження нової технології.
hint.derelict = Будівлі [accent]Переможених[] є зламаними залишками старих баз, які більше не функціонують.\n\nЇх можна [accent]деконструювати[] для отримання ресурсів.
hint.research.mobile = Використовуйте  [accent]Дослідження[] в  [accent]меню[] для дослідження нової технології. hint.research.mobile = Використовуйте  [accent]Дослідження[] в  [accent]меню[] для дослідження нової технології.
hint.unitControl = Утримуйте [accent][[лівий Ctrl][] і [accent]натисніть[] на одиницю чи башту, щоби контролювати її. hint.unitControl = Утримуйте [accent][[лівий Ctrl][] і [accent]натисніть[] на одиницю чи башту, щоби контролювати її.
hint.unitControl.mobile = [accent][Торкніться двічі[], щоби контролювати союзні одиниці чи башти. hint.unitControl.mobile = [accent][Торкніться двічі[], щоби контролювати союзні одиниці чи башти.
@@ -1338,7 +1352,7 @@ 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 = Використовується в передових одиницях та у фрагментованих боєприпасах.
@@ -1352,7 +1366,7 @@ 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.derelict =  [lightgray]Переможені
block.armored-conveyor.description = Переміщує предмети вперед. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.armored-conveyor.description = Переміщує предмети вперед. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок.
block.illuminator.description = Випромінює світло. block.illuminator.description = Випромінює світло.
block.message.description = Зберігає повідомлення для комунікації між союзниками. block.message.description = Зберігає повідомлення для комунікації між союзниками.
@@ -1496,6 +1510,8 @@ block.memory-bank.description = Зберігає інформацію для л
block.logic-display.description = Показує довільну графіку з логічного процесора. block.logic-display.description = Показує довільну графіку з логічного процесора.
block.large-logic-display.description = Показує довільну графіку з логічного процесора. block.large-logic-display.description = Показує довільну графіку з логічного процесора.
block.interplanetary-accelerator.description = Велика електромагнітна башта-рейкотрон. Прискорює ядра, щоби подолати планетне тяжіння для міжпланетного розгортання. block.interplanetary-accelerator.description = Велика електромагнітна башта-рейкотрон. Прискорює ядра, щоби подолати планетне тяжіння для міжпланетного розгортання.
block.repair-turret.description = Безпервно ремонтує найближчу пошкоджену одиницю. Для прискорення ремонтування можна охолодити.
block.payload-propulsion-tower.description = Структура транспортування вантажу на великі відстані. Вистрілює вантаж в інші вантажні катапульти.
unit.dagger.description = Вистрілює стандартними кулями в найближчих ворогах. unit.dagger.description = Вистрілює стандартними кулями в найближчих ворогах.
unit.mace.description = Вистрілює потоками полум’я в найближчих ворогів. unit.mace.description = Вистрілює потоками полум’я в найближчих ворогів.
unit.fortress.description = Вистрілює з дальнобійної артилерії в наземних цілей. unit.fortress.description = Вистрілює з дальнобійної артилерії в наземних цілей.
@@ -1529,6 +1545,12 @@ unit.omura.description = Вистрілює у ворогів далекобій
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди. unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди. unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди. unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
unit.retusa.description = Розміщує міни. Ремонтує найближчі одиниці.
unit.oxynoe.description = Вистрілює потоками полум'я, яке ремонтує споруди та наносить шкоду ворогам. Захищає від ворожик снарядів за допомогою башти точкової оборони.
unit.cyerce.description = Вистрілює у ворогів навідними касетними ракетами. Ремонтує найближчі одиниці.
unit.aegires.description = Приголомшлює ворожі одиниці та будівлі, що входять до його енергетичного поля. Ремонтує всіх союзників.
unit.navanax.description = Вистрілює вибухонебезпечні снаряди електромагнітного імпульсу, завдаючи значної шкоди ворожим енергетичним мережам та ремонтуючи союзницькі споруди. Розплавляє сусідніх ворогів за допомогою 4 автономних лазерних веж.
lst.read = Зчитує число із з’єднаної комірки пам’яті. lst.read = Зчитує число із з’єднаної комірки пам’яті.
lst.write = Записує числу у з’єднану комірки пам’яті. lst.write = Записує числу у з’єднану комірки пам’яті.

View File

@@ -770,7 +770,7 @@ bar.corereq = Yêu cầu căn cứ
bar.drillspeed = Tốc độ khoan: {0}/giây bar.drillspeed = Tốc độ khoan: {0}/giây
bar.pumpspeed = Tốc độ bơm: {0}/giây bar.pumpspeed = Tốc độ bơm: {0}/giây
bar.efficiency = Hiệu suất: {0}% bar.efficiency = Hiệu suất: {0}%
bar.boost = Tăng tốc: {0}% bar.boost = Tăng tốc: +{0}%
bar.powerbalance = Năng lượng: {0}/giây bar.powerbalance = Năng lượng: {0}/giây
bar.powerstored = Lưu trữ: {0}/{1} bar.powerstored = Lưu trữ: {0}/{1}
bar.poweramount = Năng lượng: {0} bar.poweramount = Năng lượng: {0}

File diff suppressed because it is too large Load Diff

View File

@@ -78,13 +78,12 @@ schematic.tagexists = 該標籤已存在。
stats = 統計 stats = 統計
stat.wave = 打敗的波次:[accent]{0} stat.wave = 打敗的波次:[accent]{0}
stat.enemiesDestroyed = 摧毀的敵人[accent]{0} stat.unitsCreated = 建造單位數[accent] {0}
stat.enemiesDestroyed = 摧毀敵人數:[accent]{0}
stat.built = 建設的建築:[accent]{0} stat.built = 建設的建築:[accent]{0}
stat.destroyed = 摧毀的建築:[accent]{0} stat.destroyed = 摧毀的建築:[accent]{0}
stat.deconstructed = 拆除的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0}
stat.delivered = 發射的核心資源:
stat.playtime = 遊玩時間:[accent] {0} stat.playtime = 遊玩時間:[accent] {0}
stat.rank = 最終排名:[accent]{0}
globalitems = [accent]全域物品 globalitems = [accent]全域物品
map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? map.delete = 確認要刪除「[accent]{0}[]」地圖嗎?
@@ -93,7 +92,8 @@ level.select = 選擇關卡
level.mode = 遊戲模式: level.mode = 遊戲模式:
coreattack = 〈核心正在受到攻擊!〉 coreattack = 〈核心正在受到攻擊!〉
nearpoint = 【[scarlet]立即離開空降區[]】\n湮滅即將來臨 nearpoint = 【[scarlet]立即離開空降區[]】\n湮滅即將來臨
database = 核心數據 database = 核心資料
database.button = 資料庫
savegame = 儲存遊戲 savegame = 儲存遊戲
loadgame = 載入遊戲 loadgame = 載入遊戲
joingame = 多人連線 joingame = 多人連線
@@ -101,6 +101,7 @@ customgame = 自訂遊戲
newgame = 新遊戲 newgame = 新遊戲
none = 〈沒有〉 none = 〈沒有〉
none.found = [lightgray]〈查無結果〉 none.found = [lightgray]〈查無結果〉
none.inmap = [lightgray]〈地圖中無結果〉
minimap = 小地圖 minimap = 小地圖
position = 位置 position = 位置
close = 關閉 close = 關閉
@@ -168,6 +169,7 @@ launchcore = 發射核心
filename = 檔案名稱︰ filename = 檔案名稱︰
unlocked = 已解鎖新內容! unlocked = 已解鎖新內容!
available = 可研究新科技! available = 可研究新科技!
unlock.incampaign = <在戰役中解鎖>
completed = [accent]完成 completed = [accent]完成
techtree = 科技樹 techtree = 科技樹
research.legacy = [accent]5.0[] 偵測到舊有科技資料。\n請問要[accent]載入[]資料,還是[accent]放棄[]並重置新戰役的科技樹(建議) research.legacy = [accent]5.0[] 偵測到舊有科技資料。\n請問要[accent]載入[]資料,還是[accent]放棄[]並重置新戰役的科技樹(建議)
@@ -214,6 +216,7 @@ hosts.none = [lightgray]找不到區域網路伺服器!
host.invalid = [scarlet]無法連線至伺服器。 host.invalid = [scarlet]無法連線至伺服器。
servers.local = 區域伺服器 servers.local = 區域伺服器
servers.local.steam = 開放遊戲間與區域伺服器
servers.remote = 遠端伺服器 servers.remote = 遠端伺服器
servers.global = 社群伺服器 servers.global = 社群伺服器
@@ -315,7 +318,7 @@ data.invalid = 這不是有效的遊戲資料。
data.import.confirm = 導入外部資料將會覆寫您目前[scarlet]所有的[]遊戲資料,\n[accent]此動作無法復原![]\n\n匯入資料後您的遊戲將立刻結束。 data.import.confirm = 導入外部資料將會覆寫您目前[scarlet]所有的[]遊戲資料,\n[accent]此動作無法復原![]\n\n匯入資料後您的遊戲將立刻結束。
quit.confirm = 您確定要結束嗎? quit.confirm = 您確定要結束嗎?
loading = [accent]載入中…… loading = [accent]載入中……
reloading = [accent]模組重新載入中…… downloading = [accent]下載中……
saving = [accent]儲存中…… saving = [accent]儲存中……
respawn = [accent][[{0}][]重生 respawn = [accent][[{0}][]重生
cancelbuilding = [accent][[{0}][]清除計畫 cancelbuilding = [accent][[{0}][]清除計畫
@@ -343,9 +346,9 @@ custom = 自訂
builtin = 内建 builtin = 内建
map.delete.confirm = 確認要刪除地圖嗎?此動作無法復原! map.delete.confirm = 確認要刪除地圖嗎?此動作無法復原!
map.random = [accent]隨機地圖 map.random = [accent]隨機地圖
map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[accent]橘色[]的核心。 map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[#{0}]{1}[]的核心。
map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯器中添加一個[scarlet]不是橘色[]的核心。 map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯器中添加一個[scarlet]不是橘色[]的核心。
map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[scarlet]紅色[]的核心。 map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[#{0}]{1}[]的核心。
map.invalid = 地圖載入錯誤:地圖可能已經損毀。 map.invalid = 地圖載入錯誤:地圖可能已經損毀。
workshop.update = 更新項目 workshop.update = 更新項目
workshop.error = 擷取工作坊詳細資訊時出錯:{0} workshop.error = 擷取工作坊詳細資訊時出錯:{0}
@@ -383,7 +386,8 @@ waves.waves = 波次
waves.perspawn = 每次生成 waves.perspawn = 每次生成
waves.shields = 護盾/波次 waves.shields = 護盾/波次
waves.to = waves.to =
waves.guardian = 頭目 waves.max = 最大單位數
waves.guardian = 守衛者
waves.preview = 預覽 waves.preview = 預覽
waves.edit = 編輯…… waves.edit = 編輯……
waves.copy = 複製到剪貼簿 waves.copy = 複製到剪貼簿
@@ -391,6 +395,11 @@ waves.load = 從剪貼簿載入
waves.invalid = 剪貼簿中的波次無效。 waves.invalid = 剪貼簿中的波次無效。
waves.copied = 波次已複製。 waves.copied = 波次已複製。
waves.none = 無自訂敵人。\n請注意若沒有波次佈局將自動替換為預設佈局。 waves.none = 無自訂敵人。\n請注意若沒有波次佈局將自動替換為預設佈局。
waves.sort = 分類排序:
waves.sort.reverse = 反向排序
waves.sort.begin = 開始
waves.sort.health = 血量
waves.sort.type = 兵種
#校正用空行 #校正用空行
wavemode.counts = 數量 wavemode.counts = 數量
@@ -460,6 +469,7 @@ toolmode.drawteams = 繪製團隊
toolmode.drawteams.description = 繪製團隊而非方塊。 toolmode.drawteams.description = 繪製團隊而非方塊。
filters.empty = [lightgray]沒有過濾器!使用下面的按鈕新增一個。 filters.empty = [lightgray]沒有過濾器!使用下面的按鈕新增一個。
filter.distort = 扭曲 filter.distort = 扭曲
filter.noise = 雜訊 filter.noise = 雜訊
filter.enemyspawn = 敵人重生選擇 filter.enemyspawn = 敵人重生選擇
@@ -476,6 +486,7 @@ filter.clear = 清除
filter.option.ignore = 忽略 filter.option.ignore = 忽略
filter.scatter = 分散 filter.scatter = 分散
filter.terrain = 地形 filter.terrain = 地形
filter.option.scale = 規模 filter.option.scale = 規模
filter.option.chance = 機會 filter.option.chance = 機會
filter.option.mag = 大小 filter.option.mag = 大小
@@ -490,6 +501,7 @@ filter.option.block = 方塊
filter.option.floor = 地板 filter.option.floor = 地板
filter.option.flooronto = 目標地板 filter.option.flooronto = 目標地板
filter.option.target = 目標 filter.option.target = 目標
filter.option.replacement = 取代
filter.option.wall = filter.option.wall =
filter.option.ore = 礦石 filter.option.ore = 礦石
filter.option.floor2 = 次要地板 filter.option.floor2 = 次要地板
@@ -533,7 +545,8 @@ configure = 設定
loadout = 裝載 loadout = 裝載
resources = 資源 resources = 資源
bannedblocks = 用方塊 bannedblocks = 用方塊
bannedunits = 禁用單位
addall = 全部加入 addall = 全部加入
launch.from = 發射來源:[accent]{0} launch.from = 發射來源:[accent]{0}
launch.destination = 目的地:{0} launch.destination = 目的地:{0}
@@ -558,10 +571,13 @@ weather.sandstorm.name = 沙塵暴
weather.sporestorm.name = 孢子風暴 weather.sporestorm.name = 孢子風暴
weather.fog.name = weather.fog.name =
sectorlist = 地區
sectorlist.attacked = {0} 遭受攻擊
sectors.unexplored = [lightgray]未探索 sectors.unexplored = [lightgray]未探索
sectors.resources = 資源: sectors.resources = 資源:
sectors.production = 生產: sectors.production = 生產:
sectors.export = sectors.export = 出:
sectors.import = 輸入:
sectors.time = 佔領時間: sectors.time = 佔領時間:
sectors.threat = 危險性: sectors.threat = 危險性:
sectors.wave = 波次: sectors.wave = 波次:
@@ -639,10 +655,12 @@ status.sapped.name = 被吸血
status.electrified.name = 觸電 status.electrified.name = 觸電
status.spore-slowed.name = 孢子緩速 status.spore-slowed.name = 孢子緩速
status.tarred.name = 焦油 status.tarred.name = 焦油
status.overdrive.name = 超載
status.overclock.name = 快轉 status.overclock.name = 快轉
status.shocked.name = 電擊 status.shocked.name = 電擊
status.blasted.name = 爆炸 status.blasted.name = 爆炸
status.unmoving.name = 立定 status.unmoving.name = 立定
status.boss.name = 守衛者
settings.language = 語言 settings.language = 語言
settings.data = 遊戲資料 settings.data = 遊戲資料
@@ -675,6 +693,7 @@ unit.nobuild = [scarlet]單位不能建造
lastaccessed = [lightgray]最後使用:{0} lastaccessed = [lightgray]最後使用:{0}
block.unknown = [lightgray] block.unknown = [lightgray]
stat.showinmap = <加載地圖以顯示>
stat.description = 用途 stat.description = 用途
stat.input = 輸入 stat.input = 輸入
stat.output = 輸出 stat.output = 輸出
@@ -720,7 +739,7 @@ stat.maxconsecutive = 最大連續
stat.buildcost = 建造成本 stat.buildcost = 建造成本
stat.inaccuracy = 誤差 stat.inaccuracy = 誤差
stat.shots = 射擊數 stat.shots = 射擊數
stat.reload = 射擊次數/秒 stat.reload = 射擊速率
stat.ammo = 彈藥 stat.ammo = 彈藥
stat.shieldhealth = 護盾生命值 stat.shieldhealth = 護盾生命值
stat.cooldowntime = 冷確時間 stat.cooldowntime = 冷確時間
@@ -766,7 +785,7 @@ bar.corereq = 需由核心升級
bar.drillspeed = 鑽頭速度:{0}/秒 bar.drillspeed = 鑽頭速度:{0}/秒
bar.pumpspeed = 液體泵送速度:{0}/秒 bar.pumpspeed = 液體泵送速度:{0}/秒
bar.efficiency = 效率:{0}% bar.efficiency = 效率:{0}%
bar.boost = 速度加成:{0}% bar.boost = 速度加成:+{0}%
bar.powerbalance = 能量變化:{0} bar.powerbalance = 能量變化:{0}
bar.powerstored = 能量存量:{0}/{1} bar.powerstored = 能量存量:{0}/{1}
bar.poweramount = 能量:{0} bar.poweramount = 能量:{0}
@@ -789,7 +808,7 @@ 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]燃燒
bullet.homing = [stat]追蹤 bullet.homing = [stat]追蹤
bullet.frag = [stat]破片彈 bullet.frag = [stat]{0}[lightgray]x 破片彈
bullet.lightning = [stat]{0}[lightgray]x 電弧 ~ [stat]{1}[lightgray] 傷害 bullet.lightning = [stat]{0}[lightgray]x 電弧 ~ [stat]{1}[lightgray] 傷害
bullet.buildingdamage = [stat]{0}%[lightgray] 建築傷害 bullet.buildingdamage = [stat]{0}%[lightgray] 建築傷害
bullet.knockback = [stat]{0}[lightgray]擊退 bullet.knockback = [stat]{0}[lightgray]擊退
@@ -802,6 +821,7 @@ bullet.reload = [stat]{0}[lightgray]×射擊速率
unit.blocks = 方塊 unit.blocks = 方塊
unit.blockssquared = 方塊² unit.blockssquared = 方塊²
unit.powersecond = 能量單位/秒 unit.powersecond = 能量單位/秒
unit.tilessecond = 方格/秒
unit.liquidsecond = 液體單位/秒 unit.liquidsecond = 液體單位/秒
unit.itemssecond = 物品/秒 unit.itemssecond = 物品/秒
unit.liquidunits = 液體單位 unit.liquidunits = 液體單位
@@ -825,22 +845,21 @@ category.power = 能量
category.liquids = 液體 category.liquids = 液體
category.items = 物品 category.items = 物品
category.crafting = 需求 category.crafting = 需求
category.function = 方法 category.function = 功能
category.optional = 可選的強化 category.optional = 額外的強化效果
setting.skipcoreanimation.name = 跳過核心發射/降落動畫
setting.landscape.name = 鎖定水平畫面 setting.landscape.name = 鎖定水平畫面
setting.shadows.name = 陰影 setting.shadows.name = 陰影
setting.blockreplace.name = 方塊建造建議 setting.blockreplace.name = 方塊建造建議
setting.linear.name = 線性過濾 setting.linear.name = 線性過濾
setting.hints.name = 提示 setting.hints.name = 提示
setting.logichints.name = 邏輯提示 setting.logichints.name = 邏輯提示
setting.flow.name = 顯示資源輸送速度 setting.backgroundpause.name = 背景執行時暫停遊戲
setting.backgroundpause.name = 背景執行時暫停
setting.buildautopause.name = 自動暫停建築 setting.buildautopause.name = 自動暫停建築
setting.doubletapmine.name = 連續點擊以挖礦 setting.doubletapmine.name = 連續點擊以挖礦
setting.modcrashdisable.name = 閃退後停用模組 setting.modcrashdisable.name = 閃退後停用模組
setting.animatedwater.name = 液體動畫 setting.animatedwater.name = 顯示液面動畫
setting.animatedshields.name = 護盾動畫 setting.animatedshields.name = 顯示護盾動畫
setting.antialias.name = 消除鋸齒[lightgray](需要重新啟動遊戲)[]
setting.playerindicators.name = 盟友標示 setting.playerindicators.name = 盟友標示
setting.indicators.name = 敵方標示 setting.indicators.name = 敵方標示
setting.autotarget.name = 自動射擊 setting.autotarget.name = 自動射擊
@@ -849,7 +868,8 @@ setting.touchscreen.name = 觸控螢幕控制
setting.fpscap.name = 最大FPS setting.fpscap.name = 最大FPS
setting.fpscap.none = setting.fpscap.none =
setting.fpscap.text = {0}FPS setting.fpscap.text = {0}FPS
setting.uiscale.name = 使用者介面縮放[lightgray](需要重新啟動遊戲)[] setting.uiscale.name = 操作介面大小
setting.uiscale.description = 需要重新啟動遊戲以更改大小
setting.swapdiagonal.name = 預設對角線放置 setting.swapdiagonal.name = 預設對角線放置
setting.difficulty.training = 訓練 setting.difficulty.training = 訓練
setting.difficulty.easy = 簡單 setting.difficulty.easy = 簡單
@@ -867,7 +887,9 @@ setting.saveinterval.name = 自動存檔間隔
setting.seconds = {0}秒 setting.seconds = {0}秒
setting.milliseconds = {0}毫秒 setting.milliseconds = {0}毫秒
setting.fullscreen.name = 全螢幕 setting.fullscreen.name = 全螢幕
setting.borderlesswindow.name = 無邊框視窗[lightgray](可能需要重新啟動遊戲) setting.borderlesswindow.name = 無邊框視窗
setting.borderlesswindow.name.windows = 無邊框全螢幕
setting.borderlesswindow.description = 可能需重新啟動遊戲以變更
setting.fps.name = 顯示FPS與延遲 setting.fps.name = 顯示FPS與延遲
setting.smoothcamera.name = 平滑攝影機 setting.smoothcamera.name = 平滑攝影機
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
@@ -990,7 +1012,10 @@ rules.wavetimer = 波次時間
rules.waves = 波次 rules.waves = 波次
rules.attack = 攻擊模式 rules.attack = 攻擊模式
rules.buildai = 電腦自動建築 rules.buildai = 電腦自動建築
rules.aitier = AI 等級
rules.cleanupdeadteams = 移除戰敗玩家的建築(對戰)
rules.corecapture = 佔領摧毀的核心 rules.corecapture = 佔領摧毀的核心
rules.polygoncoreprotection = 核心禁築區呈多邊形
rules.enemyCheat = 電腦無限資源 rules.enemyCheat = 電腦無限資源
rules.blockhealthmultiplier = 建築物耐久度倍數 rules.blockhealthmultiplier = 建築物耐久度倍數
rules.blockdamagemultiplier = 建築物傷害倍數 rules.blockdamagemultiplier = 建築物傷害倍數
@@ -1007,12 +1032,15 @@ rules.deconstructrefundmultiplier = 拆除資源返還比例
rules.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次 rules.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次
rules.dropzoneradius = 空降區半徑:[lightgray](格) rules.dropzoneradius = 空降區半徑:[lightgray](格)
rules.unitammo = 單位需要彈藥 rules.unitammo = 單位需要彈藥
rules.enemyteam = 敵方隊伍
rules.playerteam = 玩家隊伍
rules.title.waves = 波次 rules.title.waves = 波次
rules.title.resourcesbuilding = 資源與建築 rules.title.resourcesbuilding = 資源與建築
rules.title.enemy = 敵人 rules.title.enemy = 敵人
rules.title.unit = 單位 rules.title.unit = 單位
rules.title.experimental = 實驗中 rules.title.experimental = 實驗中
rules.title.environment = 環境 rules.title.environment = 環境
rules.title.teams = 分隊
rules.lighting = 光照 rules.lighting = 光照
rules.enemyLights = 敵方發光 rules.enemyLights = 敵方發光
rules.fire = rules.fire =
@@ -1091,7 +1119,6 @@ unit.reign.name = 帝王
unit.vela.name = 船帆座 unit.vela.name = 船帆座
unit.corvus.name = 烏鴉座 unit.corvus.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 = 沙礫巨岩
@@ -1161,6 +1188,7 @@ block.spore-cluster.name = 孢子簇
block.metal-floor.name = 金屬地板 block.metal-floor.name = 金屬地板
block.metal-floor-2.name = 金屬地板 2 block.metal-floor-2.name = 金屬地板 2
block.metal-floor-3.name = 金屬地板 3 block.metal-floor-3.name = 金屬地板 3
block.metal-floor-4.name = 金屬地板 4
block.metal-floor-5.name = 金屬地板 5 block.metal-floor-5.name = 金屬地板 5
block.metal-floor-damaged.name = 損壞的金屬地板 block.metal-floor-damaged.name = 損壞的金屬地板
block.dark-panel-1.name = 黑面板 1 block.dark-panel-1.name = 黑面板 1
@@ -1282,7 +1310,6 @@ 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.segment.name = 片段 block.segment.name = 片段
block.command-center.name = 指揮中心 block.command-center.name = 指揮中心
block.ground-factory.name = 地面工廠 block.ground-factory.name = 地面工廠
@@ -1294,14 +1321,20 @@ block.exponential-reconstructor.name = 四級重塑者
block.tetrative-reconstructor.name = 五級重塑者 block.tetrative-reconstructor.name = 五級重塑者
block.payload-conveyor.name = 原料輸送帶 block.payload-conveyor.name = 原料輸送帶
block.payload-router.name = 原料分配器 block.payload-router.name = 原料分配器
block.duct.name = 類真空管
block.duct-router.name = 真空管分配器
block.duct-bridge.name = 真空管橋
block.payload-propulsion-tower.name = 原料推進塔
block.payload-void.name = 原料虛空
block.payload-source.name = 原料源
block.disassembler.name = 還原機 block.disassembler.name = 還原機
block.silicon-crucible.name = 矽爐 block.silicon-crucible.name = 矽爐
block.overdrive-dome.name = 高速拱頂 block.overdrive-dome.name = 高速拱頂
block.interplanetary-accelerator.name = 星際加速站
#以下為實驗性建築,未來可能移除 experimental, may be removed #以下為實驗性建築,未來可能移除 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 = 微處理器
@@ -1335,6 +1368,8 @@ hint.placeConveyor.mobile = [accent]輸送帶[]能夠將物品運到其他地方
hint.placeTurret = 建造 \uf861 [accent]砲塔[]抵禦進犯的敵軍。\n\n砲塔需要彈藥現在則是需要 \uf838銅。\n用輸送帶和鑽頭供應砲塔。 hint.placeTurret = 建造 \uf861 [accent]砲塔[]抵禦進犯的敵軍。\n\n砲塔需要彈藥現在則是需要 \uf838銅。\n用輸送帶和鑽頭供應砲塔。
hint.breaking = [accent]按住右鍵[]並拖曳以破壞方塊。 hint.breaking = [accent]按住右鍵[]並拖曳以破壞方塊。
hint.breaking.mobile = 點亮右下角的 \ue817 [accent]鐵鎚[]圖案並點擊畫面可直接拆除方塊。\n\n按住畫面超過一秒後拖曳以連續摧毀多個方塊。 hint.breaking.mobile = 點亮右下角的 \ue817 [accent]鐵鎚[]圖案並點擊畫面可直接拆除方塊。\n\n按住畫面超過一秒後拖曳以連續摧毀多個方塊。
hint.blockInfo = 點擊各種方塊的[accent][[][]按鈕以檢視該方塊的資訊
hint.derelict = [accent]Derelict[] 地圖中有先前基地留下的遺骸。\n\n可以[accent]銷毀[]這些建築獲得資源。
hint.research = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。 hint.research = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。
hint.research.mobile = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。 hint.research.mobile = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。
hint.unitControl = 按住[accent][[L-ctrl][]並[accent]點擊[]以控制我方的機甲和砲台。 hint.unitControl = 按住[accent][[L-ctrl][]並[accent]點擊[]以控制我方的機甲和砲台。
@@ -1386,7 +1421,7 @@ liquid.slag.description = 各種不同類型的熔融金屬混合在一起的液
liquid.oil.description = 用於進階材料製造的液體。可以轉化為煤炭作為燃料或噴灑向敵方單位後點燃作為武器。 liquid.oil.description = 用於進階材料製造的液體。可以轉化為煤炭作為燃料或噴灑向敵方單位後點燃作為武器。
liquid.cryofluid.description = 一種安定,無腐蝕性的液體,用水及鈦混合成。具有很高的比熱。廣泛的用作冷卻劑。 liquid.cryofluid.description = 一種安定,無腐蝕性的液體,用水及鈦混合成。具有很高的比熱。廣泛的用作冷卻劑。
block.resupply-point.description = 補給銅礦彈藥給附近的單位。無法用於需要電池電力的單位。 block.derelict = [lightgray]殘骸
block.armored-conveyor.description = 以與鈦輸送帶相同的速度移動物品,但擁有更高的防禦。不接受任何從側面輸入的資源。 block.armored-conveyor.description = 以與鈦輸送帶相同的速度移動物品,但擁有更高的防禦。不接受任何從側面輸入的資源。
block.illuminator.description = 小而美的光源。 block.illuminator.description = 小而美的光源。
block.message.description = 儲存一條訊息。用於盟友之間的溝通。 block.message.description = 儲存一條訊息。用於盟友之間的溝通。
@@ -1412,6 +1447,8 @@ block.item-source.description = 無限輸出物品。僅限沙盒。
block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。 block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。
block.liquid-source.description = 無限輸出液體。僅限沙盒。 block.liquid-source.description = 無限輸出液體。僅限沙盒。
block.liquid-void.description = 銷毀所有輸入的液體。僅限沙盒。 block.liquid-void.description = 銷毀所有輸入的液體。僅限沙盒。
block.payload-source.description = 無限輸出原料。僅限沙盒。
block.payload-void.description = 銷毀所有進入的原料。僅限沙盒。
block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。 block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。
block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。 block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。
block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。 block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。
@@ -1530,6 +1567,8 @@ block.memory-bank.description = 為邏輯處理器儲存資料。大容量。
block.logic-display.description = 顯示由處理器輸出的任意圖像。 block.logic-display.description = 顯示由處理器輸出的任意圖像。
block.large-logic-display.description = 顯示由處理器輸出的任意圖像。 block.large-logic-display.description = 顯示由處理器輸出的任意圖像。
block.interplanetary-accelerator.description = 巨大的電磁砲塔。將核心加速至脫離速度以在其他星球部署。 block.interplanetary-accelerator.description = 巨大的電磁砲塔。將核心加速至脫離速度以在其他星球部署。
block.repair-turret.description = 持續修復最靠近的受損單位。能使用冷卻劑。
block.payload-propulsion-tower.description = 遠程原料輸送建築。發射原料至另一個連接的推進塔。
unit.dagger.description = 發射普通子彈攻擊附近敵人。 unit.dagger.description = 發射普通子彈攻擊附近敵人。
unit.mace.description = 噴發烈焰攻擊所有附近敵人。 unit.mace.description = 噴發烈焰攻擊所有附近敵人。
@@ -1564,6 +1603,11 @@ unit.omura.description = 對敵人發射遠程穿透型砲彈。建造曳光戰
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。 unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。 unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。 unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。
unit.retusa.description = 布置水雷。修復友方單位。
unit.oxynoe.description = 射出帶回復建築的火焰。具小型方陣炮。
unit.cyerce.description = 發射追蹤集束飛彈。修復友方單位。
unit.aegires.description = 電擊所有在能量場內的敵方單位、建築。修復友方單位。
unit.navanax.description = 發射電磁脈衝砲彈。能對敵方電力建築造成大量傷害並修復友方建築。具4座雷射自動砲台攻擊附近敵人。
lst.read = [accent]讀取[]記憶體中的一項數值 lst.read = [accent]讀取[]記憶體中的一項數值
lst.write = [accent]寫入[]一項數值到記憶體中 lst.write = [accent]寫入[]一項數值到記憶體中
@@ -1578,6 +1622,8 @@ lst.sensor = 獲取該建築或單位的數據
lst.set = 設一個變數 lst.set = 設一個變數
lst.operation = 加減乘除和計算機概論 lst.operation = 加減乘除和計算機概論
lst.end = 跳到第一個重頭開始執行 lst.end = 跳到第一個重頭開始執行
lst.wait = 等待特定秒數
lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = 條件式跳到其他指令執行 lst.jump = 條件式跳到其他指令執行
lst.unitbind = 綁定下一同種單位,存入[accent]@unit[]中. lst.unitbind = 綁定下一同種單位,存入[accent]@unit[]中.
lst.unitcontrol = 控制現在綁定的單位 lst.unitcontrol = 控制現在綁定的單位
@@ -1597,6 +1643,7 @@ laccess.controller = 單位的控制者。受處理器控制時回傳處理器
laccess.dead = 單位或建築是否已死亡或不存在。 laccess.dead = 單位或建築是否已死亡或不存在。
laccess.controlled = 將回傳:\n處理器控制[accent]@ctrlProcessor[]\n玩家控制[accent]@ctrlPlayer[]\n在隊形中[accent]@ctrlFormation[]\n其他[accent]0[]。 laccess.controlled = 將回傳:\n處理器控制[accent]@ctrlProcessor[]\n玩家控制[accent]@ctrlPlayer[]\n在隊形中[accent]@ctrlFormation[]\n其他[accent]0[]。
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead.
laccess.progress = 建造、生產進度。以 0 到 1 表示。以及砲台裝填。
graphicstype.clear = 重製版面為指定顏色 graphicstype.clear = 重製版面為指定顏色
graphicstype.color = 為後續所有圖畫指令設定顏色 graphicstype.color = 為後續所有圖畫指令設定顏色
@@ -1628,9 +1675,15 @@ lenum.min = 兩數取小
lenum.max = 兩數取大 lenum.max = 兩數取大
lenum.angle = 向量與x軸夾角 lenum.angle = 向量與x軸夾角
lenum.len = 向量長度 lenum.len = 向量長度
lenum.sin = 度數Sin值 lenum.sin = 度數Sin值
lenum.cos = 度數Cos值 lenum.cos = 度數Cos值
lenum.tan = 度數Tan值 lenum.tan = 度數Tan值
lenum.asin = Arc sin輸出度數
lenum.acos = Arc cos輸出度數
lenum.atan = Arc tan輸出度數
#not a typo, look up 'range notation' #not a typo, look up 'range notation'
lenum.rand = 產生隨機數值: [0, 值). lenum.rand = 產生隨機數值: [0, 值).
lenum.log = 自然對數(ln、log_e). lenum.log = 自然對數(ln、log_e).

View File

@@ -127,3 +127,4 @@ WilloIzCitron
SAMBUYYA SAMBUYYA
genNAowl genNAowl
TranquillyUnpleasant TranquillyUnpleasant
Darkness6030

View File

@@ -1,6 +1,6 @@
63743=spawn|block-spawn-ui 63743=spawn|block-spawn-ui
63742=deepwater|block-deepwater-ui 63742=deepwater|block-deepwater-ui
63741=water|block-water-ui 63741=shallow-water|block-shallow-water-ui
63740=tainted-water|block-tainted-water-ui 63740=tainted-water|block-tainted-water-ui
63739=darksand-tainted-water|block-darksand-tainted-water-ui 63739=darksand-tainted-water|block-darksand-tainted-water-ui
63738=sand-water|block-sand-water-ui 63738=sand-water|block-sand-water-ui
@@ -357,6 +357,6 @@
63357=crux|team-crux 63357=crux|team-crux
63358=derelict|team-derelict 63358=derelict|team-derelict
63350=deep-water|block-deep-water-ui 63350=deep-water|block-deep-water-ui
63349=shallow-water|block-shallow-water-ui
63348=molten-slag|block-molten-slag-ui 63348=molten-slag|block-molten-slag-ui
63347=crater-stone|block-crater-stone-ui 63347=crater-stone|block-crater-stone-ui
63346=deep-tainted-water|block-deep-tainted-water-ui

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -56,6 +56,9 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2"); Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2");
if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues."); if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues.");
Log.info("[JAVA] Version: @", OS.javaVersion); Log.info("[JAVA] Version: @", OS.javaVersion);
long ram = Runtime.getRuntime().maxMemory();
boolean gb = ram >= 1024 * 1024 * 1024;
Log.info("[RAM] Available: @ @", Strings.fixed(gb ? ram / 1024f / 1024 / 1024f : ram / 1024f / 1024f, 1), gb ? "GB" : "MB");
Time.setDeltaProvider(() -> { Time.setDeltaProvider(() -> {
float result = Core.graphics.getDeltaTime() * 60f; float result = Core.graphics.getDeltaTime() * 60f;
@@ -83,7 +86,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Fonts.loadDefaultFont(); Fonts.loadDefaultFont();
//load fallback atlas if max texture size is below 4096 //load fallback atlas if max texture size is below 4096
assets.load(new AssetDescriptor<>(maxTextureSize >= 4096 ? "sprites/sprites.aatls" : "sprites/fallback/sprites.aatls", TextureAtlas.class)).loaded = t -> atlas = (TextureAtlas)t; assets.load(new AssetDescriptor<>(maxTextureSize >= 4096 ? "sprites/sprites.aatls" : "sprites/fallback/sprites.aatls", TextureAtlas.class)).loaded = t -> atlas = t;
assets.loadRun("maps", Map.class, () -> maps.loadPreviews()); assets.loadRun("maps", Map.class, () -> maps.loadPreviews());
Musics.load(); Musics.load();

View File

@@ -45,7 +45,7 @@ public class Vars implements Loadable{
/** Name of current Steam player. */ /** Name of current Steam player. */
public static String steamPlayerName = ""; public static String steamPlayerName = "";
/** Default accessible content types used for player-selectable icons. */ /** Default accessible content types used for player-selectable icons. */
public static final ContentType[] defaultContentIcons = {ContentType.item, ContentType.liquid, ContentType.block}; public static final ContentType[] defaultContentIcons = {ContentType.item, ContentType.liquid, ContentType.block, ContentType.unit};
/** Wall darkness radius. */ /** Wall darkness radius. */
public static final int darkRadius = 4; public static final int darkRadius = 4;
/** Maximum extra padding around deployment schematics. */ /** Maximum extra padding around deployment schematics. */
@@ -87,7 +87,7 @@ public class Vars implements Loadable{
public static final int maxNameLength = 40; public static final int maxNameLength = 40;
/** displayed item size when ingame. */ /** displayed item size when ingame. */
public static final float itemSize = 5f; public static final float itemSize = 5f;
/** units outside of this bound will die instantly */ /** units outside this bound will die instantly */
public static final float finalWorldBounds = 250; public static final float finalWorldBounds = 250;
/** range for building */ /** range for building */
public static final float buildingRange = 220f; public static final float buildingRange = 220f;

View File

@@ -12,6 +12,7 @@ import mindustry.game.*;
import mindustry.game.Schematic.*; import mindustry.game.Schematic.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.maps.generators.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.*;
@@ -25,7 +26,6 @@ import static mindustry.Vars.*;
public class BaseAI{ public class BaseAI{
private static final Vec2 axis = new Vec2(), rotator = new Vec2(); private static final Vec2 axis = new Vec2(), rotator = new Vec2();
private static final float correctPercent = 0.5f;
private static final int attempts = 4; private static final int attempts = 4;
private static final float emptyChance = 0.01f; private static final float emptyChance = 0.01f;
private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2; private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2;
@@ -46,6 +46,7 @@ public class BaseAI{
boolean calculating, startedCalculating; boolean calculating, startedCalculating;
int calcCount = 0; int calcCount = 0;
int totalCalcs = 0; int totalCalcs = 0;
Block wallType;
public BaseAI(TeamData data){ public BaseAI(TeamData data){
this.data = data; this.data = data;
@@ -53,6 +54,10 @@ public class BaseAI{
public void update(){ public void update(){
if(wallType == null){
wallType = BaseGenerator.getDifficultyWall(1, data.team.rules().aiTier / 0.8f);
}
if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){ if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){
CoreBlock block = (CoreBlock)data.core().block; CoreBlock block = (CoreBlock)data.core().block;
int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType); int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType);
@@ -89,7 +94,7 @@ public class BaseAI{
calculating = false; calculating = false;
} }
}else{ }else{
var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore); var field = pathfinder.getField(data.team, Pathfinder.costGround, Pathfinder.fieldCore);
if(field.weights != null){ if(field.weights != null){
int[][] weights = field.weights; int[][] weights = field.weights;
@@ -120,7 +125,7 @@ public class BaseAI{
} }
//found the end. //found the end.
if(calcTile.build instanceof CoreBuild b && b.team == state.rules.defaultTeam){ if(calcTile.build instanceof CoreBuild b && b.team != data.team){
//clean up calculations and flush results //clean up calculations and flush results
calculating = false; calculating = false;
calcCount = 0; calcCount = 0;
@@ -271,7 +276,7 @@ public class BaseAI{
} }
private void tryWalls(){ private void tryWalls(){
Block wall = Blocks.copperWall; Block wall = wallType;
Building spawnt = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core() : data.team.core(); Building spawnt = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core() : data.team.core();
Tile spawn = spawnt == null ? null : spawnt.tile; Tile spawn = spawnt == null ? null : spawnt.tile;

View File

@@ -50,10 +50,12 @@ public class BlockIndexer{
clearFlags(); clearFlags();
Events.on(TilePreChangeEvent.class, event -> { Events.on(TilePreChangeEvent.class, event -> {
if(state.isEditor()) return;
removeIndex(event.tile); removeIndex(event.tile);
}); });
Events.on(TileChangeEvent.class, event -> { Events.on(TileChangeEvent.class, event -> {
if(state.isEditor()) return;
addIndex(event.tile); addIndex(event.tile);
}); });
@@ -109,7 +111,7 @@ public class BlockIndexer{
} }
} }
//update the unit cap when building is remove //update the unit cap when building is removed
data.unitCap -= tile.block().unitCapModifier; data.unitCap -= tile.block().unitCapModifier;
//unregister building from building quadtree //unregister building from building quadtree
@@ -202,15 +204,20 @@ public class BlockIndexer{
} }
public boolean eachBlock(@Nullable Team team, float wx, float wy, float range, Boolf<Building> pred, Cons<Building> cons){ public boolean eachBlock(@Nullable Team team, float wx, float wy, float range, Boolf<Building> pred, Cons<Building> cons){
breturnArray.clear();
if(team == null){ if(team == null){
returnBool = false;
allBuildings(wx, wy, range, b -> { allBuildings(wx, wy, range, b -> {
if(pred.get(b)){ if(pred.get(b)){
breturnArray.add(b); returnBool = true;
cons.get(b);
} }
}); });
return returnBool;
}else{ }else{
breturnArray.clear();
var buildings = team.data().buildings; var buildings = team.data().buildings;
if(buildings == null) return false; if(buildings == null) return false;
buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> { buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> {

View File

@@ -138,7 +138,7 @@ public class Pathfinder implements Runnable{
/** Starts or restarts the pathfinding thread. */ /** Starts or restarts the pathfinding thread. */
private void start(){ private void start(){
stop(); stop();
thread = Threads.daemon(this); thread = Threads.daemon("Pathfinder", this);
} }
/** Stops the pathfinding thread. */ /** Stops the pathfinding thread. */

View File

@@ -56,7 +56,7 @@ public class WaveSpawner{
public void spawnEnemies(){ public void spawnEnemies(){
spawning = true; spawning = true;
eachGroundSpawn((spawnX, spawnY, doShockwave) -> { eachGroundSpawn(-1, (spawnX, spawnY, doShockwave) -> {
if(doShockwave){ if(doShockwave){
doShockwave(spawnX, spawnY); doShockwave(spawnX, spawnY);
} }
@@ -70,7 +70,7 @@ public class WaveSpawner{
if(group.type.flying){ if(group.type.flying){
float spread = margin / 1.5f; float spread = margin / 1.5f;
eachFlyerSpawn((spawnX, spawnY) -> { eachFlyerSpawn(group.spawn, (spawnX, spawnY) -> {
for(int i = 0; i < spawned; i++){ for(int i = 0; i < spawned; i++){
Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1); Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1);
unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread)); unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread));
@@ -80,7 +80,7 @@ public class WaveSpawner{
}else{ }else{
float spread = tilesize * 2; float spread = tilesize * 2;
eachGroundSpawn((spawnX, spawnY, doShockwave) -> { eachGroundSpawn(group.spawn, (spawnX, spawnY, doShockwave) -> {
for(int i = 0; i < spawned; i++){ for(int i = 0; i < spawned; i++){
Tmp.v1.rnd(spread); Tmp.v1.rnd(spread);
@@ -102,12 +102,14 @@ public class WaveSpawner{
} }
public void eachGroundSpawn(Intc2 cons){ public void eachGroundSpawn(Intc2 cons){
eachGroundSpawn((x, y, shock) -> cons.get(World.toTile(x), World.toTile(y))); eachGroundSpawn(-1, (x, y, shock) -> cons.get(World.toTile(x), World.toTile(y)));
} }
private void eachGroundSpawn(SpawnConsumer cons){ private void eachGroundSpawn(int filterPos, SpawnConsumer cons){
if(state.hasSpawns()){ if(state.hasSpawns()){
for(Tile spawn : spawns){ for(Tile spawn : spawns){
if(filterPos != -1 && filterPos != spawn.pos()) continue;
cons.accept(spawn.worldx(), spawn.worldy(), true); cons.accept(spawn.worldx(), spawn.worldy(), true);
} }
} }
@@ -115,6 +117,8 @@ public class WaveSpawner{
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){
Building firstCore = state.teams.playerCores().first(); Building firstCore = state.teams.playerCores().first();
for(Building core : state.rules.waveTeam.cores()){ for(Building core : state.rules.waveTeam.cores()){
if(filterPos != -1 && filterPos != core.pos()) continue;
Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block.size * tilesize /2f * Mathf.sqrt2); Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block.size * tilesize /2f * Mathf.sqrt2);
boolean valid = false; boolean valid = false;
@@ -147,8 +151,10 @@ public class WaveSpawner{
} }
} }
private void eachFlyerSpawn(Floatc2 cons){ private void eachFlyerSpawn(int filterPos, Floatc2 cons){
for(Tile tile : spawns){ for(Tile tile : spawns){
if(filterPos != -1 && filterPos != tile.pos()) continue;
float angle = Angles.angle(world.width() / 2f, world.height() / 2f, tile.x, tile.y); float angle = Angles.angle(world.width() / 2f, world.height() / 2f, tile.x, tile.y);
float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize; float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize;
float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(angle, trns), -margin, world.width() * tilesize + margin); float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(angle, trns), -margin, world.width() * tilesize + margin);
@@ -158,6 +164,8 @@ public class WaveSpawner{
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){
for(Building core : state.rules.waveTeam.data().cores){ for(Building core : state.rules.waveTeam.data().cores){
if(filterPos != -1 && filterPos != core.pos()) continue;
cons.get(core.x, core.y); cons.get(core.x, core.y);
} }
} }
@@ -171,7 +179,7 @@ public class WaveSpawner{
public int countFlyerSpawns(){ public int countFlyerSpawns(){
tmpCount = 0; tmpCount = 0;
eachFlyerSpawn((x, y) -> tmpCount ++); eachFlyerSpawn(-1, (x, y) -> tmpCount ++);
return tmpCount; return tmpCount;
} }
@@ -196,6 +204,7 @@ public class WaveSpawner{
unit.apply(StatusEffects.invincible, 60f); unit.apply(StatusEffects.invincible, 60f);
unit.add(); unit.add();
Events.fire(new UnitSpawnEvent(unit));
Call.spawnEffect(unit.x, unit.y, unit.rotation, unit.type); Call.spawnEffect(unit.x, unit.y, unit.rotation, unit.type);
} }

View File

@@ -15,11 +15,12 @@ import static mindustry.Vars.*;
public class BuilderAI extends AIController{ public class BuilderAI extends AIController{
public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f; public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f;
public @Nullable Unit following;
public @Nullable Teamc enemy;
public @Nullable BlockPlan lastPlan;
boolean found = false; boolean found = false;
@Nullable Unit following;
@Nullable Teamc enemy;
float retreatTimer; float retreatTimer;
@Nullable BlockPlan lastPlan;
@Override @Override
public void updateMovement(){ public void updateMovement(){

View File

@@ -21,12 +21,12 @@ public class DefenderAI extends AIController{
} }
@Override @Override
protected void updateTargeting(){ public void updateTargeting(){
if(retarget()) target = findTarget(unit.x, unit.y, unit.range(), true, true); if(retarget()) target = findTarget(unit.x, unit.y, unit.range(), true, true);
} }
@Override @Override
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ public Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
//find unit to follow if not in rally mode //find unit to follow if not in rally mode
if(command() != UnitCommand.rally){ if(command() != UnitCommand.rally){

View File

@@ -32,7 +32,7 @@ public class FlyingAI extends AIController{
} }
@Override @Override
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ public Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
var result = findMainTarget(x, y, range, air, ground); var result = findMainTarget(x, y, range, air, ground);
//if the main target is in range, use it, otherwise target whatever is closest //if the main target is in range, use it, otherwise target whatever is closest
@@ -40,7 +40,7 @@ public class FlyingAI extends AIController{
} }
@Override @Override
protected Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){ public Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){
var core = targetFlag(x, y, BlockFlag.core, true); var core = targetFlag(x, y, BlockFlag.core, true);
if(core != null && Mathf.within(x, y, core.getX(), core.getY(), range)){ if(core != null && Mathf.within(x, y, core.getX(), core.getY(), range)){

View File

@@ -53,7 +53,7 @@ public class FormationAI extends AIController implements FormationMember{
Vec2 realtarget = vec.set(target).add(leader.vel); Vec2 realtarget = vec.set(target).add(leader.vel);
float speed = unit.realSpeed() * Time.delta; float speed = unit.speed() * Time.delta;
unit.approach(Mathf.arrive(unit.x, unit.y, realtarget.x, realtarget.y, unit.vel, speed, 0f, speed, 1f).scl(1f / Time.delta)); unit.approach(Mathf.arrive(unit.x, unit.y, realtarget.x, realtarget.y, unit.vel, speed, 0f, speed, 1f).scl(1f / Time.delta));
if(unit.canMine() && leader.canMine()){ if(unit.canMine() && leader.canMine()){

View File

@@ -2,7 +2,6 @@ package mindustry.ai.types;
import arc.math.*; import arc.math.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.entities.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.*; import mindustry.world.*;
@@ -49,13 +48,6 @@ public class GroundAI extends AIController{
unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed); unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed);
} }
if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting){ faceTarget();
if(unit.type.hasWeapons()){
unit.lookAt(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed));
}
}else if(unit.moving()){
unit.lookAt(unit.vel().angle());
}
} }
} }

View File

@@ -47,10 +47,10 @@ public class HugAI extends AIController{
})){ })){
if(unit.within(target, (unit.hitSize + (target instanceof Sized s ? s.hitSize() : 1f)) * 0.6f)){ if(unit.within(target, (unit.hitSize + (target instanceof Sized s ? s.hitSize() : 1f)) * 0.6f)){
//circle target //circle target
unit.moveAt(vec.set(target).sub(unit).rotate(90f).setLength(unit.speed())); unit.movePref(vec.set(target).sub(unit).rotate(90f).setLength(unit.speed()));
}else{ }else{
//move toward target in a straight line //move toward target in a straight line
unit.moveAt(vec.set(target).sub(unit).limit(unit.speed())); unit.movePref(vec.set(target).sub(unit).limit(unit.speed()));
} }
}else if(move){ }else if(move){
pathfind(Pathfinder.fieldCore); pathfind(Pathfinder.fieldCore);
@@ -69,13 +69,6 @@ public class HugAI extends AIController{
unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed); unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed);
} }
if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting){ faceTarget();
if(unit.type.hasWeapons()){
unit.lookAt(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed));
}
}else if(unit.moving()){
unit.lookAt(unit.vel().angle());
}
} }
} }

View File

@@ -44,7 +44,7 @@ public class LogicAI extends AIController{
private ObjectSet<Object> radars = new ObjectSet<>(); private ObjectSet<Object> radars = new ObjectSet<>();
@Override @Override
protected void updateMovement(){ public void updateMovement(){
if(itemTimer >= 0) itemTimer -= Time.delta; if(itemTimer >= 0) itemTimer -= Time.delta;
if(payTimer >= 0) payTimer -= Time.delta; if(payTimer >= 0) payTimer -= Time.delta;
@@ -114,14 +114,14 @@ public class LogicAI extends AIController{
} }
@Override @Override
protected void moveTo(Position target, float circleLength, float smooth){ public void moveTo(Position target, float circleLength, float smooth){
if(target == null) return; if(target == null) return;
vec.set(target).sub(unit); vec.set(target).sub(unit);
float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f);
vec.setLength(unit.realSpeed() * length); vec.setLength(unit.speed() * length);
if(length < -0.5f){ if(length < -0.5f){
vec.rotate(180f); vec.rotate(180f);
}else if(length < 0){ }else if(length < 0){
@@ -141,29 +141,29 @@ public class LogicAI extends AIController{
} }
@Override @Override
protected boolean checkTarget(Teamc target, float x, float y, float range){ public boolean checkTarget(Teamc target, float x, float y, float range){
return false; return false;
} }
//always retarget //always retarget
@Override @Override
protected boolean retarget(){ public boolean retarget(){
return true; return true;
} }
@Override @Override
protected boolean invalid(Teamc target){ public boolean invalid(Teamc target){
return false; return false;
} }
@Override @Override
protected boolean shouldShoot(){ public boolean shouldShoot(){
return shoot && !(unit.type.canBoost && boost); return shoot && !(unit.type.canBoost && boost);
} }
//always aim for the main target //always aim for the main target
@Override @Override
protected Teamc target(float x, float y, float range, boolean air, boolean ground){ public Teamc target(float x, float y, float range, boolean air, boolean ground){
return switch(aimControl){ return switch(aimControl){
case target -> posTarget; case target -> posTarget;
case targetp -> mainTarget; case targetp -> mainTarget;

View File

@@ -9,12 +9,12 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class MinerAI extends AIController{ public class MinerAI extends AIController{
boolean mining = true; public boolean mining = true;
Item targetItem; public Item targetItem;
Tile ore; public Tile ore;
@Override @Override
protected void updateMovement(){ public void updateMovement(){
Building core = unit.closestCore(); Building core = unit.closestCore();
if(!(unit.canMine()) || core == null) return; if(!(unit.canMine()) || core == null) return;

View File

@@ -13,7 +13,7 @@ public class RepairAI extends AIController{
float retreatTimer; float retreatTimer;
@Override @Override
protected void updateMovement(){ public void updateMovement(){
if(target instanceof Building){ if(target instanceof Building){
boolean shoot = false; boolean shoot = false;
@@ -56,7 +56,7 @@ public class RepairAI extends AIController{
} }
@Override @Override
protected void updateTargeting(){ public void updateTargeting(){
Building target = Units.findDamagedTile(unit.team, unit.x, unit.y); Building target = Units.findDamagedTile(unit.team, unit.x, unit.y);
if(target instanceof ConstructBuild) target = null; if(target instanceof ConstructBuild) target = null;

View File

@@ -41,10 +41,6 @@ public class SuicideAI extends GroundAI{
shoot = unit.within(target, unit.type.weapons.first().bullet.range() + shoot = unit.within(target, unit.type.weapons.first().bullet.range() +
(target instanceof Building b ? b.block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); (target instanceof Building b ? b.block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f));
if(unit.type.hasWeapons()){
unit.aimLook(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed));
}
//do not move toward walls or transport blocks //do not move toward walls or transport blocks
if(!(target instanceof Building build && !(build.block instanceof CoreBlock) && ( if(!(target instanceof Building build && !(build.block instanceof CoreBlock) && (
build.block.group == BlockGroup.walls || build.block.group == BlockGroup.walls ||
@@ -76,7 +72,7 @@ public class SuicideAI extends GroundAI{
if(!blocked){ if(!blocked){
moveToTarget = true; moveToTarget = true;
//move towards target directly //move towards target directly
unit.moveAt(vec.set(target).sub(unit).limit(unit.speed())); unit.movePref(vec.set(target).sub(unit).limit(unit.speed()));
} }
} }
} }
@@ -103,15 +99,15 @@ public class SuicideAI extends GroundAI{
pathfind(Pathfinder.fieldCore); pathfind(Pathfinder.fieldCore);
} }
} }
if(unit.moving()) unit.lookAt(unit.vel().angle());
} }
unit.controlWeapons(rotate, shoot); unit.controlWeapons(rotate, shoot);
faceTarget();
} }
@Override @Override
protected Teamc target(float x, float y, float range, boolean air, boolean ground){ public Teamc target(float x, float y, float range, boolean air, boolean ground){
return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground && return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground &&
!(t.block instanceof Conveyor || t.block instanceof Conduit)); //do not target conveyors/conduits !(t.block instanceof Conveyor || t.block instanceof Conduit)); //do not target conveyors/conduits
} }

View File

@@ -179,7 +179,7 @@ public class SoundControl{
float avol = Core.settings.getInt("ambientvol", 100) / 100f; float avol = Core.settings.getInt("ambientvol", 100) / 100f;
sounds.each((sound, data) -> { sounds.each((sound, data) -> {
data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.11f);
boolean play = data.curVolume > 0.01f; boolean play = data.curVolume > 0.01f;
float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total);

View File

@@ -35,7 +35,7 @@ public class Blocks implements ContentList{
public static Block public static Block
//environment //environment
air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space, air, spawn, cliff, deepwater, water, taintedWater, deepTaintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space,
dacite, dacite,
stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster,
iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt, iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt,
@@ -142,7 +142,19 @@ public class Blocks implements ContentList{
}}; }};
taintedWater = new Floor("tainted-water"){{ taintedWater = new Floor("tainted-water"){{
speedMultiplier = 0.17f; speedMultiplier = 0.5f;
variants = 0;
status = StatusEffects.wet;
statusDuration = 90f;
liquidDrop = Liquids.water;
isLiquid = true;
cacheLayer = CacheLayer.water;
albedo = 0.5f;
attributes.set(Attribute.spores, 0.15f);
}};
deepTaintedWater = new Floor("deep-tainted-water"){{
speedMultiplier = 0.18f;
variants = 0; variants = 0;
status = StatusEffects.wet; status = StatusEffects.wet;
statusDuration = 140f; statusDuration = 140f;
@@ -313,6 +325,7 @@ public class Blocks implements ContentList{
sporeWall = new StaticWall("spore-wall"){{ sporeWall = new StaticWall("spore-wall"){{
variants = 2; variants = 2;
taintedWater.asFloor().wall = deepTaintedWater.asFloor().wall = this;
}}; }};
dirtWall = new StaticWall("dirt-wall"){{ dirtWall = new StaticWall("dirt-wall"){{
@@ -429,7 +442,7 @@ public class Blocks implements ContentList{
Seq.with(metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6) Seq.with(metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6)
.each(b -> b.asFloor().wall = darkMetal); .each(b -> b.asFloor().wall = darkMetal);
pebbles = new DoubleOverlayFloor("pebbles"); pebbles = new OverlayFloor("pebbles");
tendrils = new OverlayFloor("tendrils"); tendrils = new OverlayFloor("tendrils");
@@ -509,6 +522,8 @@ public class Blocks implements ContentList{
hasPower = true; hasPower = true;
hasLiquids = false; hasLiquids = false;
drawer = new DrawSmelter(Color.valueOf("ffef99")); drawer = new DrawSmelter(Color.valueOf("ffef99"));
ambientSound = Sounds.smelter;
ambientSoundVolume = 0.07f;
consumes.items(with(Items.coal, 1, Items.sand, 2)); consumes.items(with(Items.coal, 1, Items.sand, 2));
consumes.power(0.50f); consumes.power(0.50f);
@@ -525,6 +540,8 @@ public class Blocks implements ContentList{
itemCapacity = 30; itemCapacity = 30;
boostScale = 0.15f; boostScale = 0.15f;
drawer = new DrawSmelter(Color.valueOf("ffef99")); drawer = new DrawSmelter(Color.valueOf("ffef99"));
ambientSound = Sounds.smelter;
ambientSoundVolume = 0.07f;
consumes.items(with(Items.coal, 4, Items.sand, 6, Items.pyratite, 1)); consumes.items(with(Items.coal, 4, Items.sand, 6, Items.pyratite, 1));
consumes.power(4f); consumes.power(4f);
@@ -538,6 +555,8 @@ public class Blocks implements ContentList{
size = 2; size = 2;
hasPower = hasItems = true; hasPower = hasItems = true;
drawer = new DrawSmelter(Color.valueOf("ffc099")); drawer = new DrawSmelter(Color.valueOf("ffc099"));
ambientSound = Sounds.smelter;
ambientSoundVolume = 0.07f;
consumes.items(with(Items.lead, 1, Items.sand, 1)); consumes.items(with(Items.lead, 1, Items.sand, 1));
consumes.power(0.60f); consumes.power(0.60f);
@@ -603,7 +622,7 @@ public class Blocks implements ContentList{
rotate = false; rotate = false;
solid = true; solid = true;
outputsLiquid = true; outputsLiquid = true;
drawer = new DrawMixer(); drawer = new DrawMixer(true);
consumes.power(1f); consumes.power(1f);
consumes.item(Items.titanium); consumes.item(Items.titanium);
@@ -664,10 +683,10 @@ public class Blocks implements ContentList{
disassembler = new Separator("disassembler"){{ disassembler = new Separator("disassembler"){{
requirements(Category.crafting, with(Items.plastanium, 40, Items.titanium, 100, Items.silicon, 150, Items.thorium, 80)); requirements(Category.crafting, with(Items.plastanium, 40, Items.titanium, 100, Items.silicon, 150, Items.thorium, 80));
results = with( results = with(
Items.sand, 4, Items.sand, 2,
Items.graphite, 2, Items.graphite, 1,
Items.titanium, 2, Items.titanium, 1,
Items.thorium, 2 Items.thorium, 1
); );
hasPower = true; hasPower = true;
craftTime = 15f; craftTime = 15f;
@@ -1001,6 +1020,7 @@ public class Blocks implements ContentList{
distributor = new Router("distributor"){{ distributor = new Router("distributor"){{
requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4)); requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4));
buildCostMultiplier = 3f;
size = 2; size = 2;
}}; }};
@@ -1152,12 +1172,14 @@ public class Blocks implements ContentList{
battery = new Battery("battery"){{ battery = new Battery("battery"){{
requirements(Category.power, with(Items.copper, 5, Items.lead, 20)); requirements(Category.power, with(Items.copper, 5, Items.lead, 20));
consumes.powerBuffered(4000f); consumes.powerBuffered(4000f);
baseExplosiveness = 1f;
}}; }};
batteryLarge = new Battery("battery-large"){{ batteryLarge = new Battery("battery-large"){{
requirements(Category.power, with(Items.titanium, 20, Items.lead, 40, Items.silicon, 20)); requirements(Category.power, with(Items.titanium, 20, Items.lead, 40, Items.silicon, 20));
size = 3; size = 3;
consumes.powerBuffered(50000f); consumes.powerBuffered(50000f);
baseExplosiveness = 5f;
}}; }};
combustionGenerator = new BurnerGenerator("combustion-generator"){{ combustionGenerator = new BurnerGenerator("combustion-generator"){{
@@ -1882,7 +1904,7 @@ public class Blocks implements ContentList{
requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 80)); requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 80));
plans = Seq.with( plans = Seq.with(
new UnitPlan(UnitTypes.dagger, 60f * 15, with(Items.silicon, 10, Items.lead, 10)), new UnitPlan(UnitTypes.dagger, 60f * 15, with(Items.silicon, 10, Items.lead, 10)),
new UnitPlan(UnitTypes.crawler, 60f * 12, with(Items.silicon, 10, Items.coal, 20)), new UnitPlan(UnitTypes.crawler, 60f * 10, with(Items.silicon, 8, Items.coal, 10)),
new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20)) new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20))
); );
size = 3; size = 3;
@@ -2077,11 +2099,15 @@ public class Blocks implements ContentList{
payloadSource = new PayloadSource("payload-source"){{ payloadSource = new PayloadSource("payload-source"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
alwaysUnlocked = true;
group = BlockGroup.units;
}}; }};
payloadVoid = new PayloadVoid("payload-void"){{ payloadVoid = new PayloadVoid("payload-void"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
alwaysUnlocked = true;
group = BlockGroup.units;
}}; }};
//TODO move //TODO move

View File

@@ -32,7 +32,9 @@ public class Fx{
//lifetime is how many frames it takes to fade out the trail //lifetime is how many frames it takes to fade out the trail
e.lifetime = trail.length * 1.4f; e.lifetime = trail.length * 1.4f;
trail.shorten(); if(!state.isPaused()){
trail.shorten();
}
trail.drawCap(e.color, e.rotation); trail.drawCap(e.color, e.rotation);
trail.draw(e.color, e.rotation); trail.draw(e.color, e.rotation);
}), }),
@@ -393,12 +395,6 @@ public class Fx{
Lines.circle(e.x, e.y, 2f + e.finpow() * 7f); Lines.circle(e.x, e.y, 2f + e.finpow() * 7f);
}), }),
healDenamic = new Effect(11, e -> {
color(Pal.heal);
stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 2f + e.finpow() * e.rotation);
}),
shieldWave = new Effect(22, e -> { shieldWave = new Effect(22, e -> {
color(e.color, 0.7f); color(e.color, 0.7f);
stroke(e.fout() * 2f); stroke(e.fout() * 2f);
@@ -1000,7 +996,9 @@ public class Fx{
float length = 20f * e.finpow(); float length = 20f * e.finpow();
float size = 7f * e.fout(); float size = 7f * e.fout();
rect(((Item)e.data).fullIcon, e.x + trnsx(e.rotation, length), e.y + trnsy(e.rotation, length), size, size); if(!(e.data instanceof Item item)) return;
rect(item.fullIcon, e.x + trnsx(e.rotation, length), e.y + trnsy(e.rotation, length), size, size);
}), }),
shockwave = new Effect(10f, 80f, e -> { shockwave = new Effect(10f, 80f, e -> {
@@ -1887,7 +1885,7 @@ public class Fx{
rand.setSeed(e.id); rand.setSeed(e.id);
Tmp.v1.trns(e.rotation, e.finpow() * 90f * rand.random(0.2f, 1f)); Tmp.v1.trns(e.rotation, e.finpow() * 90f * rand.random(0.2f, 1f));
Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 8f * rand.random(0.6f, 1f) * e.fout(0.2f)); Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 8f * rand.random(0.6f, 1f) * e.fout(0.2f));
}).layer(Layer.block + 1f), }).layer(Layer.groundUnit + 1f),
unitShieldBreak = new Effect(35, e -> { unitShieldBreak = new Effect(35, e -> {
if(!(e.data instanceof Unitc)) return; if(!(e.data instanceof Unitc)) return;

View File

@@ -10,7 +10,8 @@ public class SectorPresets implements ContentList{
groundZero, groundZero,
craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields, craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields,
fungalPass, extractionOutpost, saltFlats, overgrowth, fungalPass, extractionOutpost, saltFlats, overgrowth,
impact0078, desolateRift, nuclearComplex, planetaryTerminal; impact0078, desolateRift, nuclearComplex, planetaryTerminal,
coastline, navalFortress;
@Override @Override
public void load(){ public void load(){
@@ -64,6 +65,15 @@ public class SectorPresets implements ContentList{
useAI = false; useAI = false;
}}; }};
coastline = new SectorPreset("coastline", serpulo, 108){{
captureWave = 30;
difficulty = 5;
}};
navalFortress = new SectorPreset("navalFortress", serpulo, 216){{
difficulty = 9;
}};
fungalPass = new SectorPreset("fungalPass", serpulo, 21){{ fungalPass = new SectorPreset("fungalPass", serpulo, 21){{
difficulty = 4; difficulty = 4;
useAI = false; useAI = false;

View File

@@ -4,6 +4,7 @@ import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.game.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.graphics.*; import mindustry.graphics.*;
@@ -163,7 +164,7 @@ public class StatusEffects implements ContentList{
}}; }};
boss = new StatusEffect("boss"){{ boss = new StatusEffect("boss"){{
color = Pal.health; color = Team.crux.color;
permanent = true; permanent = true;
damageMultiplier = 1.3f; damageMultiplier = 1.3f;
healthMultiplier = 1.5f; healthMultiplier = 1.5f;

View File

@@ -421,11 +421,11 @@ public class TechTree implements ContentList{
}); });
}); });
node(retusa, () -> { node(retusa, Seq.with(new SectorComplete(windsweptIslands)), () -> {
node(oxynoe, () -> { node(oxynoe, Seq.with(new SectorComplete(coastline)), () -> {
node(cyerce, () -> { node(cyerce, () -> {
node(aegires, () -> { node(aegires, () -> {
node(navanax, () -> { node(navanax, Seq.with(new SectorComplete(navalFortress)), () -> {
}); });
}); });
@@ -531,7 +531,22 @@ public class TechTree implements ContentList{
new Research(airFactory), new Research(airFactory),
new Research(door) new Research(door)
), () -> { ), () -> {
node(coastline, Seq.with(
new SectorComplete(windsweptIslands),
new Research(navalFactory),
new Research(payloadConveyor)
), () -> {
node(navalFortress, Seq.with(
new SectorComplete(coastline),
new SectorComplete(extractionOutpost),
new Research(oxynoe),
new Research(minke),
new Research(cyclone),
new Research(ripple)
), () -> {
});
});
}); });
}); });
}); });

View File

@@ -152,7 +152,7 @@ public class UnitTypes implements ContentList{
}}; }};
scepter = new UnitType("scepter"){{ scepter = new UnitType("scepter"){{
speed = 0.35f; speed = 0.36f;
hitSize = 22f; hitSize = 22f;
rotateSpeed = 2.1f; rotateSpeed = 2.1f;
health = 9000; health = 9000;
@@ -180,7 +180,7 @@ public class UnitTypes implements ContentList{
inaccuracy = 3f; inaccuracy = 3f;
shotDelay = 4f; shotDelay = 4f;
bullet = new BasicBulletType(7f, 45){{ bullet = new BasicBulletType(7f, 50){{
width = 11f; width = 11f;
height = 20f; height = 20f;
lifetime = 25f; lifetime = 25f;
@@ -189,7 +189,7 @@ public class UnitTypes implements ContentList{
lightningLength = 6; lightningLength = 6;
lightningColor = Pal.surge; lightningColor = Pal.surge;
//standard bullet damage is far too much for lightning //standard bullet damage is far too much for lightning
lightningDamage = 19; lightningDamage = 20;
}}; }};
}}, }},
@@ -238,7 +238,7 @@ public class UnitTypes implements ContentList{
ejectEffect = Fx.casing4; ejectEffect = Fx.casing4;
shootSound = Sounds.bang; shootSound = Sounds.bang;
bullet = new BasicBulletType(13f, 65){{ bullet = new BasicBulletType(13f, 70){{
pierce = true; pierce = true;
pierceCap = 10; pierceCap = 10;
width = 14f; width = 14f;
@@ -413,7 +413,7 @@ public class UnitTypes implements ContentList{
vela = new UnitType("vela"){{ vela = new UnitType("vela"){{
hitSize = 24f; hitSize = 24f;
rotateSpeed = 1.7f; rotateSpeed = 1.8f;
canDrown = false; canDrown = false;
mechFrontSway = 1f; mechFrontSway = 1f;
buildSpeed = 3f; buildSpeed = 3f;
@@ -423,7 +423,7 @@ public class UnitTypes implements ContentList{
ammoType = new PowerAmmoType(2500); ammoType = new PowerAmmoType(2500);
speed = 0.44f; speed = 0.44f;
boostMultiplier = 2.2f; boostMultiplier = 2.4f;
engineOffset = 12f; engineOffset = 12f;
engineSize = 6f; engineSize = 6f;
lowAltitude = true; lowAltitude = true;
@@ -436,6 +436,7 @@ public class UnitTypes implements ContentList{
immunities = ObjectSet.with(StatusEffects.burning); immunities = ObjectSet.with(StatusEffects.burning);
commandLimit = 8; commandLimit = 8;
singleTarget = true;
weapons.add(new Weapon("vela-weapon"){{ weapons.add(new Weapon("vela-weapon"){{
mirror = false; mirror = false;
@@ -479,6 +480,18 @@ public class UnitTypes implements ContentList{
shootStatus = StatusEffects.slow; shootStatus = StatusEffects.slow;
shootStatusDuration = bullet.lifetime + firstShotDelay; shootStatusDuration = bullet.lifetime + firstShotDelay;
}}); }});
weapons.add(new RepairBeamWeapon("repair-beam-weapon-center-large"){{
x = 44 / 4f;
y = -30f / 4f;
shootY = 6f;
beamWidth = 0.8f;
repairSpeed = 1.4f;
bullet = new BulletType(){{
maxRange = 120f;
}};
}});
}}; }};
corvus = new UnitType("corvus"){{ corvus = new UnitType("corvus"){{
@@ -1056,7 +1069,7 @@ public class UnitTypes implements ContentList{
rotateSpeed = 1.9f; rotateSpeed = 1.9f;
flying = true; flying = true;
lowAltitude = true; lowAltitude = true;
health = 7000; health = 7200;
armor = 9f; armor = 9f;
engineOffset = 21; engineOffset = 21;
engineSize = 5.3f; engineSize = 5.3f;
@@ -1064,13 +1077,13 @@ public class UnitTypes implements ContentList{
targetFlags = new BlockFlag[]{BlockFlag.generator, BlockFlag.core, null}; targetFlags = new BlockFlag[]{BlockFlag.generator, BlockFlag.core, null};
ammoType = new ItemAmmoType(Items.thorium); ammoType = new ItemAmmoType(Items.thorium);
BulletType missiles = new MissileBulletType(2.7f, 14){{ BulletType missiles = new MissileBulletType(2.7f, 18){{
width = 8f; width = 8f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f; drag = -0.01f;
splashDamageRadius = 20f; splashDamageRadius = 20f;
splashDamage = 34f; splashDamage = 37f;
ammoMultiplier = 4f; ammoMultiplier = 4f;
lifetime = 50f; lifetime = 50f;
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;
@@ -1125,13 +1138,13 @@ public class UnitTypes implements ContentList{
}}; }};
eclipse = new UnitType("eclipse"){{ eclipse = new UnitType("eclipse"){{
speed = 0.52f; speed = 0.54f;
accel = 0.04f; accel = 0.04f;
drag = 0.04f; drag = 0.04f;
rotateSpeed = 1f; rotateSpeed = 1f;
flying = true; flying = true;
lowAltitude = true; lowAltitude = true;
health = 21000; health = 22000;
engineOffset = 38; engineOffset = 38;
engineSize = 7.3f; engineSize = 7.3f;
hitSize = 58f; hitSize = 58f;
@@ -1140,10 +1153,10 @@ public class UnitTypes implements ContentList{
targetFlags = new BlockFlag[]{BlockFlag.reactor, BlockFlag.battery, BlockFlag.core, null}; targetFlags = new BlockFlag[]{BlockFlag.reactor, BlockFlag.battery, BlockFlag.core, null};
ammoType = new ItemAmmoType(Items.thorium); ammoType = new ItemAmmoType(Items.thorium);
BulletType fragBullet = new FlakBulletType(4f, 5){{ BulletType fragBullet = new FlakBulletType(4f, 15){{
shootEffect = Fx.shootBig; shootEffect = Fx.shootBig;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamage = 60f; splashDamage = 65f;
splashDamageRadius = 25f; splashDamageRadius = 25f;
collidesGround = true; collidesGround = true;
lifetime = 47f; lifetime = 47f;
@@ -1166,7 +1179,7 @@ public class UnitTypes implements ContentList{
rotate = true; rotate = true;
bullet = new LaserBulletType(){{ bullet = new LaserBulletType(){{
damage = 110f; damage = 115f;
sideAngle = 20f; sideAngle = 20f;
sideWidth = 1.5f; sideWidth = 1.5f;
sideLength = 80f; sideLength = 80f;
@@ -1335,7 +1348,7 @@ public class UnitTypes implements ContentList{
quad = new UnitType("quad"){{ quad = new UnitType("quad"){{
armor = 8f; armor = 8f;
health = 6000; health = 6000;
speed = 1.3f; speed = 1.2f;
rotateSpeed = 2f; rotateSpeed = 2f;
accel = 0.05f; accel = 0.05f;
drag = 0.017f; drag = 0.017f;
@@ -1444,7 +1457,7 @@ public class UnitTypes implements ContentList{
armor = 2f; armor = 2f;
weapons.add(new Weapon("mount-weapon"){{ weapons.add(new Weapon("mount-weapon"){{
reload = 12f; reload = 13f;
x = 4f; x = 4f;
shootY = 4f; shootY = 4f;
y = 1.5f; y = 1.5f;
@@ -1455,7 +1468,7 @@ public class UnitTypes implements ContentList{
weapons.add(new Weapon("missiles-mount"){{ weapons.add(new Weapon("missiles-mount"){{
mirror = false; mirror = false;
reload = 23f; reload = 25f;
x = 0f; x = 0f;
y = -5f; y = -5f;
rotate = true; rotate = true;
@@ -1498,15 +1511,13 @@ public class UnitTypes implements ContentList{
trailY = -4f; trailY = -4f;
trailScl = 1.9f; trailScl = 1.9f;
abilities.add(new StatusFieldAbility(StatusEffects.overclock, 60f * 6, 60f * 6f, 60f));
weapons.add(new Weapon("mount-weapon"){{ weapons.add(new Weapon("mount-weapon"){{
reload = 15f; reload = 10f;
x = 5f; x = 5f;
y = 3.5f; y = 3.5f;
rotate = true; rotate = true;
rotateSpeed = 5f; rotateSpeed = 5f;
inaccuracy = 10f; inaccuracy = 8f;
ejectEffect = Fx.casing1; ejectEffect = Fx.casing1;
shootSound = Sounds.shoot; shootSound = Sounds.shoot;
bullet = Bullets.flakLead; bullet = Bullets.flakLead;
@@ -1522,7 +1533,15 @@ public class UnitTypes implements ContentList{
shake = 1.5f; shake = 1.5f;
ejectEffect = Fx.casing2; ejectEffect = Fx.casing2;
shootSound = Sounds.bang; shootSound = Sounds.bang;
bullet = Bullets.artilleryDense; bullet = new ArtilleryBulletType(3f, 20, "shell"){{
hitEffect = Fx.flakExplosion;
knockback = 0.8f;
lifetime = 80f;
width = height = 11f;
collidesTiles = false;
splashDamageRadius = 30f * 0.75f;
splashDamage = 40f;
}};
}}); }});
}}; }};
@@ -1561,15 +1580,14 @@ public class UnitTypes implements ContentList{
ejectEffect = Fx.casing3; ejectEffect = Fx.casing3;
shootSound = Sounds.artillery; shootSound = Sounds.artillery;
bullet = new ArtilleryBulletType(3.2f, 12){{ bullet = new ArtilleryBulletType(3.2f, 15){{
trailMult = 0.8f; trailMult = 0.8f;
hitEffect = Fx.massiveExplosion; hitEffect = Fx.massiveExplosion;
knockback = 1.5f; knockback = 1.5f;
lifetime = 80f; lifetime = 84f;
height = 15.5f; height = 15.5f;
width = 15f; width = 15f;
collidesTiles = false; collidesTiles = false;
ammoMultiplier = 4f;
splashDamageRadius = 40f; splashDamageRadius = 40f;
splashDamage = 70f; splashDamage = 70f;
backColor = Pal.missileYellowBack; backColor = Pal.missileYellowBack;
@@ -1857,6 +1875,8 @@ public class UnitTypes implements ContentList{
trailScl = 1.9f; trailScl = 1.9f;
ammoType = new ItemAmmoType(Items.coal); ammoType = new ItemAmmoType(Items.coal);
abilities.add(new StatusFieldAbility(StatusEffects.overclock, 60f * 6, 60f * 6f, 60f));
buildSpeed = 2f; buildSpeed = 2f;
weapons.add(new Weapon("plasma-mount-weapon"){{ weapons.add(new Weapon("plasma-mount-weapon"){{

View File

@@ -8,8 +8,9 @@ import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.game.EventType.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.game.EventType.*;
import mindustry.io.*;
import mindustry.mod.Mods.*; import mindustry.mod.Mods.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
@@ -211,10 +212,16 @@ public class ContentLoader{
} }
public <T extends MappableContent> T getByName(ContentType type, String name){ public <T extends MappableContent> T getByName(ContentType type, String name){
if(contentNameMap[type.ordinal()] == null){ var map = contentNameMap[type.ordinal()];
return null;
if(map == null) return null;
//load fallbacks
if(type == ContentType.block){
name = SaveVersion.modContentNameMap.get(name, name);
} }
return (T)contentNameMap[type.ordinal()].get(name);
return (T)map.get(name);
} }
public <T extends Content> T getByID(ContentType type, int id){ public <T extends Content> T getByID(ContentType type, int id){

View File

@@ -172,13 +172,19 @@ public class Control implements ApplicationListener, Loadable{
Events.on(BlockDestroyEvent.class, e -> { Events.on(BlockDestroyEvent.class, e -> {
if(e.tile.team() == player.team()){ if(e.tile.team() == player.team()){
state.stats.buildingsDestroyed++; state.stats.buildingsDestroyed ++;
} }
}); });
Events.on(UnitDestroyEvent.class, e -> { Events.on(UnitDestroyEvent.class, e -> {
if(e.unit.team() != player.team()){ if(e.unit.team() != player.team()){
state.stats.enemyUnitsDestroyed++; state.stats.enemyUnitsDestroyed ++;
}
});
Events.on(UnitCreateEvent.class, e -> {
if(e.unit.team == state.rules.defaultTeam){
state.stats.unitsCreated++;
} }
}); });

View File

@@ -164,14 +164,14 @@ public class NetClient implements ApplicationListener{
public static void sound(Sound sound, float volume, float pitch, float pan){ public static void sound(Sound sound, float volume, float pitch, float pan){
if(sound == null) return; if(sound == null) return;
sound.play(volume * Core.settings.getInt("sfxvol") / 100f, pitch, pan); sound.play(Mathf.clamp(volume, 0, 4f) * Core.settings.getInt("sfxvol") / 100f, pitch, pan);
} }
@Remote(variants = Variant.both, unreliable = true) @Remote(variants = Variant.both, unreliable = true)
public static void soundAt(Sound sound, float x, float y, float volume, float pitch){ public static void soundAt(Sound sound, float x, float y, float volume, float pitch){
if(sound == null) return; if(sound == null) return;
sound.at(x, y, pitch, volume); sound.at(x, y, pitch, Mathf.clamp(volume, 0, 4f));
} }
@Remote(variants = Variant.both, unreliable = true) @Remote(variants = Variant.both, unreliable = true)

View File

@@ -647,7 +647,7 @@ public class NetServer implements ApplicationListener{
Unit unit = player.unit(); Unit unit = player.unit();
long elapsed = Math.min(Time.timeSinceMillis(con.lastReceivedClientTime), 1500); long elapsed = Math.min(Time.timeSinceMillis(con.lastReceivedClientTime), 1500);
float maxSpeed = unit.realSpeed(); float maxSpeed = unit.speed();
float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.2f; float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.2f;
@@ -896,7 +896,7 @@ public class NetServer implements ApplicationListener{
} }
String fixName(String name){ String fixName(String name){
name = name.trim(); name = name.trim().replace("\n", "").replace("\t", "");
if(name.equals("[") || name.equals("]")){ if(name.equals("[") || name.equals("]")){
return ""; return "";
} }

View File

@@ -105,8 +105,8 @@ public class Renderer implements ApplicationListener{
for(int i = 0; i < splashes.length; i++) splashes[i] = atlas.find("splash-" + i); for(int i = 0; i < splashes.length; i++) splashes[i] = atlas.find("splash-" + i);
assets.load("sprites/clouds.png", Texture.class).loaded = t -> { assets.load("sprites/clouds.png", Texture.class).loaded = t -> {
((Texture)t).setWrap(TextureWrap.repeat); t.setWrap(TextureWrap.repeat);
((Texture)t).setFilter(TextureFilter.linear); t.setFilter(TextureFilter.linear);
}; };
} }
@@ -114,7 +114,7 @@ public class Renderer implements ApplicationListener{
public void update(){ public void update(){
Color.white.set(1f, 1f, 1f, 1f); Color.white.set(1f, 1f, 1f, 1f);
float dest = Mathf.round(targetscale, 0.5f); float dest = Mathf.clamp(Mathf.round(targetscale, 0.5f), minScale(), maxScale());
camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f);
if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest; if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest;
laserOpacity = settings.getInt("lasersopacity") / 100f; laserOpacity = settings.getInt("lasersopacity") / 100f;
@@ -504,6 +504,8 @@ public class Renderer implements ApplicationListener{
public void showLaunch(CoreBlock coreType){ public void showLaunch(CoreBlock coreType){
Vars.ui.hudfrag.showLaunch(); Vars.ui.hudfrag.showLaunch();
Vars.control.input.frag.config.hideConfig();
Vars.control.input.frag.inv.hide();
launchCoreType = coreType; launchCoreType = coreType;
launching = true; launching = true;
landCore = player.team().core(); landCore = player.team().core();

View File

@@ -356,30 +356,23 @@ public class World{
} }
public void raycastEach(int x0f, int y0f, int x1, int y1, Raycaster cons){ public void raycastEach(int x0f, int y0f, int x1, int y1, Raycaster cons){
int x0 = x0f; int x0 = x0f, dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int y0 = y0f; int y0 = y0f, dy = Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int dx = Math.abs(x1 - x0); int e2, err = dx - dy;
int dy = Math.abs(y1 - y0);
int sx = x0 < x1 ? 1 : -1;
int sy = y0 < y1 ? 1 : -1;
int err = dx - dy;
int e2;
while(true){ while(true){
if(cons.accept(x0, y0)) break; if(cons.accept(x0, y0)) break;
if(x0 == x1 && y0 == y1) break; if(x0 == x1 && y0 == y1) break;
e2 = 2 * err; e2 = 2 * err;
if(e2 > -dy){ if(e2 > -dy){
err = err - dy; err -= dy;
x0 = x0 + sx; x0 += sx;
} }
if(e2 < dx){ if(e2 < dx){
err = err + dx; err += dx;
y0 = y0 + sy; y0 += sy;
} }
} }
} }

View File

@@ -27,6 +27,8 @@ public abstract class UnlockableContent extends MappableContent{
public boolean alwaysUnlocked = false; public boolean alwaysUnlocked = false;
/** Whether to show the description in the research dialog preview. */ /** Whether to show the description in the research dialog preview. */
public boolean inlineDescription = true; public boolean inlineDescription = true;
/** Whether details of blocks are hidden in custom games if they haven't been unlocked in campaign mode. */
public boolean hideDetails = true;
/** Special logic icon ID. */ /** Special logic icon ID. */
public int iconId = 0; public int iconId = 0;
/** Icon of the content to use in UI. */ /** Icon of the content to use in UI. */
@@ -149,9 +151,17 @@ public abstract class UnlockableContent extends MappableContent{
} }
} }
public boolean unlockedNowHost(){
if(!state.isCampaign()) return true;
return net != null && net.client() ?
alwaysUnlocked || state.rules.researched.contains(name) :
unlocked || alwaysUnlocked;
}
public boolean unlocked(){ public boolean unlocked(){
if(net != null && net.client()) return alwaysUnlocked || state.rules.researched.contains(name); return net != null && net.client() ?
return unlocked || alwaysUnlocked; alwaysUnlocked || unlocked || state.rules.researched.contains(name) :
unlocked || alwaysUnlocked;
} }
/** Locks this content again. */ /** Locks this content again. */

View File

@@ -18,7 +18,7 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class MapEditor{ public class MapEditor{
public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; public static final float[] brushSizes = {1, 1.5f, 2, 3, 4, 5, 9, 15, 20};
public StringMap tags = new StringMap(); public StringMap tags = new StringMap();
public MapRenderer renderer = new MapRenderer(); public MapRenderer renderer = new MapRenderer();
@@ -28,7 +28,7 @@ public class MapEditor{
private DrawOperation currentOp; private DrawOperation currentOp;
private boolean loading; private boolean loading;
public int brushSize = 1; public float brushSize = 1;
public int rotation; public int rotation;
public Block drawBlock = Blocks.stone; public Block drawBlock = Blocks.stone;
public Team drawTeam = Team.sharded; public Team drawTeam = Team.sharded;
@@ -227,8 +227,9 @@ public class MapEditor{
} }
public void drawCircle(int x, int y, Cons<Tile> drawer){ public void drawCircle(int x, int y, Cons<Tile> drawer){
for(int rx = -brushSize; rx <= brushSize; rx++){ int clamped = (int)brushSize;
for(int ry = -brushSize; ry <= brushSize; ry++){ for(int rx = -clamped; rx <= clamped; rx++){
for(int ry = -clamped; ry <= clamped; ry++){
if(Mathf.within(rx, ry, brushSize - 0.5f + 0.0001f)){ if(Mathf.within(rx, ry, brushSize - 0.5f + 0.0001f)){
int wx = x + rx, wy = y + ry; int wx = x + rx, wy = y + ry;
@@ -243,8 +244,9 @@ public class MapEditor{
} }
public void drawSquare(int x, int y, Cons<Tile> drawer){ public void drawSquare(int x, int y, Cons<Tile> drawer){
for(int rx = -brushSize; rx <= brushSize; rx++){ int clamped = (int)brushSize;
for(int ry = -brushSize; ry <= brushSize; ry++){ for(int rx = -clamped; rx <= clamped; rx++){
for(int ry = -clamped; ry <= clamped; ry++){
int wx = x + rx, wy = y + ry; int wx = x + rx, wy = y + ry;
if(wx < 0 || wy < 0 || wx >= width() || wy >= height()){ if(wx < 0 || wy < 0 || wx >= width() || wy >= height()){

View File

@@ -576,13 +576,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
}).growX().top(); }).growX().top();
} }
if(experimental){ mid.row();
mid.row();
mid.table(t -> { mid.table(t -> {
t.button("Cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f); t.button("@editor.cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f);
}).growX().top(); }).growX().top();
}
}).margin(0).left().growY(); }).margin(0).left().growY();

View File

@@ -232,7 +232,7 @@ public class MapGenerateDialog extends BaseDialog{
}else{ }else{
Core.scene.setScrollFocus(null); Core.scene.setScrollFocus(null);
} }
}).grow().uniformX().get().setScrollingDisabled(true, false); }).grow().uniformX().scrollX(false);
}).grow(); }).grow();
buffer1 = create(); buffer1 = create();
@@ -350,7 +350,7 @@ public class MapGenerateDialog extends BaseDialog{
update(); update();
selection.hide(); selection.hide();
}).with(Table::left).get().getLabelCell().growX().left().padLeft(5).labelAlign(Align.left); }).with(Table::left).get().getLabelCell().growX().left().padLeft(5).labelAlign(Align.left);
}).get().setScrollingDisabled(true, false); }).scrollX(false);
selection.addCloseButton(); selection.addCloseButton();
selection.show(); selection.show();

View File

@@ -10,6 +10,7 @@ import mindustry.content.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -132,6 +133,11 @@ public class MapRenderer implements Disposable{
wall.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, wall.editorVariantRegions().length - 1)] : wall.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, wall.editorVariantRegions().length - 1)] :
wall.editorIcon(); wall.editorIcon();
if(wall == Blocks.cliff){
mesh.setColor(Tmp.c1.set(floor.mapColor).mul(1.6f));
region = ((Cliff)Blocks.cliff).editorCliffs[tile.data & 0xff];
}
offsetX = tilesize / 2f - region.width / 2f * Draw.scl; offsetX = tilesize / 2f - region.width / 2f * Draw.scl;
offsetY = tilesize / 2f - region.height / 2f * Draw.scl; offsetY = tilesize / 2f - region.height / 2f * Draw.scl;
}else if(wall == Blocks.air && !tile.overlay().isAir()){ }else if(wall == Blocks.air && !tile.overlay().isAir()){

View File

@@ -15,6 +15,8 @@ public class MapResizeDialog extends BaseDialog{
public MapResizeDialog(Intc2 cons){ public MapResizeDialog(Intc2 cons){
super("@editor.resizemap"); super("@editor.resizemap");
closeOnBack();
shown(() -> { shown(() -> {
cont.clear(); cont.clear();
width = editor.width(); width = editor.width();

View File

@@ -38,7 +38,8 @@ public class MapView extends Element implements GestureListener{
for(int i = 0; i < MapEditor.brushSizes.length; i++){ for(int i = 0; i < MapEditor.brushSizes.length; i++){
float size = MapEditor.brushSizes[i]; float size = MapEditor.brushSizes[i];
brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Mathf.dst(x, y, index, index) <= index - 0.5f); float mod = size % 1f;
brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Mathf.dst(x, y, index - mod, index - mod) <= size - 0.5f);
} }
Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this)); Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this));

View File

@@ -38,8 +38,14 @@ public class WaveGraph extends Table{
lay.setText(font, "1"); lay.setText(font, "1");
int maxY = switch(mode){
case counts -> nextStep(max);
case health -> nextStep((int)maxHealth);
case totals -> nextStep(maxTotal);
};
float fh = lay.height; float fh = lay.height;
float offsetX = Scl.scl(30f), offsetY = Scl.scl(22f) + fh + Scl.scl(5f); float offsetX = Scl.scl(lay.width * (maxY + "").length() * 2), offsetY = Scl.scl(22f) + fh + Scl.scl(5f);
float graphX = x + offsetX, graphY = y + offsetY, graphW = width - offsetX, graphH = height - offsetY; float graphX = x + offsetX, graphY = y + offsetY, graphW = width - offsetX, graphH = height - offsetY;
float spacing = graphW / (values.length - 1); float spacing = graphW / (values.length - 1);
@@ -53,7 +59,7 @@ public class WaveGraph extends Table{
for(int i = 0; i < values.length; i++){ for(int i = 0; i < values.length; i++){
int val = values[i][type.id]; int val = values[i][type.id];
float cx = graphX + i*spacing, cy = graphY + val * graphH / max; float cx = graphX + i * spacing, cy = graphY + val * graphH / maxY;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -69,7 +75,7 @@ public class WaveGraph extends Table{
sum += values[i][type.id]; sum += values[i][type.id];
} }
float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxTotal; float cx = graphX + i * spacing, cy = graphY + sum * graphH / maxY;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -84,7 +90,7 @@ public class WaveGraph extends Table{
sum += (type.health) * values[i][type.id]; sum += (type.health) * values[i][type.id];
} }
float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxHealth; float cx = graphX + i * spacing, cy = graphY + sum * graphH / maxY;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -92,19 +98,23 @@ public class WaveGraph extends Table{
} }
//how many numbers can fit here //how many numbers can fit here
float totalMarks = (graphH - getMarginBottom() *2f) / (lay.height * 2); float totalMarks = Mathf.clamp(maxY, 1, 10);
int markSpace = Math.max(1, Mathf.ceil(max / totalMarks)); int markSpace = Math.max(1, Mathf.ceil(maxY / totalMarks));
Draw.color(Color.lightGray); Draw.color(Color.lightGray);
for(int i = 0; i < max; i += markSpace){ Draw.alpha(0.1f);
float cy = graphY + i * graphH / max, cx = graphX;
//Lines.line(cx, cy, cx + len, cy); for(int i = 0; i < maxY; i += markSpace){
float cy = graphY + i * graphH / maxY, cx = graphX;
Lines.line(cx, cy, cx + graphW, cy);
lay.setText(font, "" + i); lay.setText(font, "" + i);
font.draw("" + i, cx, cy + lay.height/2f, Align.right); font.draw("" + i, cx, cy + lay.height / 2f, Align.right);
} }
Draw.alpha(1f);
float len = Scl.scl(4f); float len = Scl.scl(4f);
font.setColor(Color.lightGray); font.setColor(Color.lightGray);
@@ -113,7 +123,7 @@ public class WaveGraph extends Table{
float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i; float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i;
Lines.line(cx, cy, cx, cy + len); Lines.line(cx, cy, cx, cy + len);
if(i == values.length/2){ if(i == values.length / 2){
font.draw("" + (i + from + 1), cx, cy - Scl.scl(2f), Align.center); font.draw("" + (i + from + 1), cx, cy - Scl.scl(2f), Align.center);
} }
} }
@@ -164,13 +174,24 @@ public class WaveGraph extends Table{
sum += spawned; sum += spawned;
} }
maxTotal = Math.max(maxTotal, sum); maxTotal = Math.max(maxTotal, sum);
maxHealth = Math.max(maxHealth,healthsum); maxHealth = Math.max(maxHealth, healthsum);
} }
ObjectSet<UnitType> usedCopy = new ObjectSet<>(used); ObjectSet<UnitType> usedCopy = new ObjectSet<>(used);
colors.clear(); colors.clear();
colors.left(); colors.left();
colors.button("@waves.units.hide", Styles.cleart, () -> {
if(hidden.size == usedCopy.size){
hidden.clear();
}else{
hidden.addAll(usedCopy);
}
used.clear();
used.addAll(usedCopy);
for(UnitType o : hidden) used.remove(o);
}).update(b -> b.setText(hidden.size == usedCopy.size ? "@waves.units.show" : "@waves.units.hide")).height(32f).width(130f);
colors.pane(t -> { colors.pane(t -> {
t.left(); t.left();
for(UnitType type : used){ for(UnitType type : used){
@@ -189,7 +210,7 @@ public class WaveGraph extends Table{
for(UnitType o : hidden) used.remove(o); for(UnitType o : hidden) used.remove(o);
}).update(b -> b.setChecked(hidden.contains(type))); }).update(b -> b.setChecked(hidden.contains(type)));
} }
}).get().setScrollingDisabled(false, true); }).scrollY(false);
for(UnitType type : hidden){ for(UnitType type : hidden){
used.remove(type); used.remove(type);
@@ -200,6 +221,23 @@ public class WaveGraph extends Table{
return Tmp.c1.fromHsv(type.id / (float)Vars.content.units().size * 360f, 0.7f, 1f); return Tmp.c1.fromHsv(type.id / (float)Vars.content.units().size * 360f, 0.7f, 1f);
} }
int nextStep(float value){
int order = 1;
while(order < value){
if(order * 2 > value){
return order * 2;
}
if(order * 5 > value){
return order * 5;
}
if(order * 10 > value){
return order * 10;
}
order *= 10;
}
return order;
}
enum Mode{ enum Mode{
counts, totals, health; counts, totals, health;

View File

@@ -1,8 +1,11 @@
package mindustry.editor; package mindustry.editor;
import arc.*; import arc.*;
import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.scene.event.*; import arc.scene.event.*;
import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.TextField.*; import arc.scene.ui.TextField.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
@@ -17,16 +20,21 @@ import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import java.util.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
import static mindustry.game.SpawnGroup.*; import static mindustry.game.SpawnGroup.*;
public class WaveInfoDialog extends BaseDialog{ public class WaveInfoDialog extends BaseDialog{
private int displayed = 20; private int displayed = 20;
Seq<SpawnGroup> groups = new Seq<>(); Seq<SpawnGroup> groups = new Seq<>();
private SpawnGroup expandedGroup;
private Table table; private Table table;
private int start = 0; private int start = 0;
private UnitType lastType = UnitTypes.dagger; private UnitType lastType = UnitTypes.dagger;
private Sort sort = Sort.begin;
private boolean reverseSort = false;
private float updateTimer, updatePeriod = 1f; private float updateTimer, updatePeriod = 1f;
private WaveGraph graph = new WaveGraph(); private WaveGraph graph = new WaveGraph();
@@ -39,37 +47,69 @@ public class WaveInfoDialog extends BaseDialog{
addCloseListener(); addCloseListener();
onResize(this::setup); onResize(this::setup);
buttons.button(Icon.filter, () -> {
BaseDialog dialog = new BaseDialog("@waves.sort");
dialog.setFillParent(false);
dialog.cont.table(Tex.button, t -> {
for(Sort s : Sort.all){
t.button("@waves.sort." + s, Styles.clearTogglet, () -> {
sort = s;
dialog.hide();
buildGroups();
}).size(150f, 60f).checked(s == sort);
}
}).row();
dialog.cont.check("@waves.sort.reverse", b -> {
reverseSort = b;
buildGroups();
}).padTop(4).checked(reverseSort).padBottom(8f);
dialog.addCloseButton();
dialog.show();
buildGroups();
}).size(60f, 64f);
addCloseButton(); addCloseButton();
buttons.button("@waves.edit", () -> { buttons.button("@waves.edit", Icon.pencil, () -> {
BaseDialog dialog = new BaseDialog("@waves.edit"); BaseDialog dialog = new BaseDialog("@waves.edit");
dialog.addCloseButton(); dialog.addCloseButton();
dialog.setFillParent(false); dialog.setFillParent(false);
dialog.cont.defaults().size(210f, 64f); dialog.cont.table(Tex.button, t -> {
dialog.cont.button("@waves.copy", () -> { var style = Styles.cleart;
ui.showInfoFade("@waves.copied"); t.defaults().size(210f, 58f);
Core.app.setClipboardText(maps.writeWaves(groups));
dialog.hide(); t.button("@waves.copy", Icon.copy, style, () -> {
}).disabled(b -> groups == null); ui.showInfoFade("@waves.copied");
dialog.cont.row(); Core.app.setClipboardText(maps.writeWaves(groups));
dialog.cont.button("@waves.load", () -> { dialog.hide();
try{ }).disabled(b -> groups == null).marginLeft(12f).row();
groups = maps.readWaves(Core.app.getClipboardText());
t.button("@waves.load", Icon.download, style, () -> {
try{
groups = maps.readWaves(Core.app.getClipboardText());
buildGroups();
}catch(Exception e){
e.printStackTrace();
ui.showErrorMessage("@waves.invalid");
}
dialog.hide();
}).marginLeft(12f).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()).row();
t.button("@settings.reset", Icon.upload, style, () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> {
groups = JsonIO.copy(waves.get());
buildGroups(); buildGroups();
}catch(Exception e){ dialog.hide();
e.printStackTrace(); })).marginLeft(12f).row();
ui.showErrorMessage("@waves.invalid");
} t.button("@clear", Icon.cancel, style, () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> {
dialog.hide(); groups.clear();
}).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()); buildGroups();
dialog.cont.row(); dialog.hide();
dialog.cont.button("@settings.reset", () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> { })).marginLeft(12f);
groups = JsonIO.copy(waves.get()); });
buildGroups();
dialog.hide();
}));
dialog.show(); dialog.show();
}).size(270f, 64f); }).size(250f, 64f);
buttons.defaults().width(60f); buttons.defaults().width(60f);
@@ -129,11 +169,14 @@ public class WaveInfoDialog extends BaseDialog{
cont.clear(); cont.clear();
cont.stack(new Table(Tex.clear, main -> { cont.stack(new Table(Tex.clear, main -> {
main.pane(t -> table = t).growX().growY().padRight(8f).get().setScrollingDisabled(true, false); main.pane(t -> table = t).growX().growY().padRight(8f).scrollX(false);
main.row(); main.row();
main.button("@add", () -> { main.button("@add", () -> {
if(groups == null) groups = new Seq<>(); if(groups == null) groups = new Seq<>();
groups.add(new SpawnGroup(lastType)); SpawnGroup newGroup = new SpawnGroup(lastType);
groups.add(newGroup);
expandedGroup = newGroup;
showUpdate(newGroup);
buildGroups(); buildGroups();
}).growX().height(70f); }).growX().height(70f);
}), new Label("@waves.none"){{ }), new Label("@waves.none"){{
@@ -154,6 +197,8 @@ public class WaveInfoDialog extends BaseDialog{
table.margin(10f); table.margin(10f);
if(groups != null){ if(groups != null){
groups.sort(sort.sort);
if(reverseSort) groups.reverse();
for(SpawnGroup group : groups){ for(SpawnGroup group : groups){
table.table(Tex.button, t -> { table.table(Tex.button, t -> {
@@ -165,84 +210,138 @@ public class WaveInfoDialog extends BaseDialog{
b.add().growX(); b.add().growX();
b.button(Icon.cancel, () -> { b.label(() -> (group.begin + 1) + "").color(Color.lightGray).minWidth(45f).labelAlign(Align.left).left();
b.button(Icon.copySmall, Styles.emptyi, () -> {
SpawnGroup newGroup = group.copy();
expandedGroup = newGroup;
groups.add(newGroup);
buildGroups();
}).pad(-6).size(46f);
b.button(group.effect != null && group.effect != StatusEffects.none ?
new TextureRegionDrawable(group.effect.uiIcon) :
Icon.logicSmall,
Styles.emptyi, () -> showEffect(group)).pad(-6).size(46f);
b.button(Icon.unitsSmall, Styles.emptyi, () -> showUpdate(group)).pad(-6).size(46f);
b.button(Icon.cancel, Styles.emptyi, () -> {
groups.remove(group); groups.remove(group);
table.getCell(t).pad(0f); table.getCell(t).pad(0f);
t.remove(); t.remove();
updateWaves(); buildGroups();
}).pad(-6).size(46f).padRight(-12f); }).pad(-6).size(46f).padRight(-12f);
}, () -> showUpdate(group)).height(46f).pad(-6f).padBottom(0f); }, () -> {
expandedGroup = expandedGroup == group ? null : group;
buildGroups();
}).height(46f).pad(-6f).padBottom(0f).row();
t.row(); if(expandedGroup == group){
t.table(spawns -> { t.table(spawns -> {
spawns.field("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> { spawns.field("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){ if(Strings.canParsePositiveInt(text)){
group.begin = Strings.parseInt(text) - 1; group.begin = Strings.parseInt(text) - 1;
updateWaves(); updateWaves();
} }
}).width(100f); }).width(100f);
spawns.add("@waves.to").padLeft(4).padRight(4); spawns.add("@waves.to").padLeft(4).padRight(4);
spawns.field(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> { spawns.field(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){ if(Strings.canParsePositiveInt(text)){
group.end = Strings.parseInt(text) - 1; group.end = Strings.parseInt(text) - 1;
updateWaves(); updateWaves();
}else if(text.isEmpty()){ }else if(text.isEmpty()){
group.end = never; group.end = never;
updateWaves(); updateWaves();
} }
}).width(100f).get().setMessageText(""); }).width(100f).get().setMessageText("");
}); }).row();
t.row();
t.table(p -> {
p.add("@waves.every").padRight(4);
p.field(group.spacing + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text) && Strings.parseInt(text) > 0){
group.spacing = Strings.parseInt(text);
updateWaves();
}
}).width(100f);
p.add("@waves.waves").padLeft(4);
});
t.row(); t.table(p -> {
t.table(a -> { p.add("@waves.every").padRight(4);
a.field(group.unitAmount + "", TextFieldFilter.digitsOnly, text -> { p.field(group.spacing + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){ if(Strings.canParsePositiveInt(text) && Strings.parseInt(text) > 0){
group.unitAmount = Strings.parseInt(text); group.spacing = Strings.parseInt(text);
updateWaves(); updateWaves();
} }
}).width(80f); }).width(100f);
p.add("@waves.waves").padLeft(4);
}).row();
a.add(" + "); t.table(a -> {
a.field(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { a.field(group.unitAmount + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveFloat(text)){ if(Strings.canParsePositiveInt(text)){
group.unitScaling = 1f / Strings.parseFloat(text); group.unitAmount = Strings.parseInt(text);
updateWaves(); updateWaves();
} }
}).width(80f); }).width(80f);
a.add("@waves.perspawn").padLeft(4);
});
t.row();
t.table(a -> {
a.field((int)group.shields + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.shields = Strings.parseInt(text);
updateWaves();
}
}).width(80f);
a.add(" + "); a.add(" + ");
a.field((int)group.shieldScaling + "", TextFieldFilter.digitsOnly, text -> { a.field(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> {
if(Strings.canParsePositiveInt(text)){ if(Strings.canParsePositiveFloat(text)){
group.shieldScaling = Strings.parseInt(text); group.unitScaling = 1f / Strings.parseFloat(text);
updateWaves(); updateWaves();
} }
}).width(80f); }).width(80f);
a.add("@waves.shields").padLeft(4); a.add("@waves.perspawn").padLeft(4);
}); }).row();
t.row(); t.table(a -> {
t.check("@waves.guardian", b -> group.effect = (b ? StatusEffects.boss : null)).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)).padBottom(8f); a.field(group.max + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.max = Strings.parseInt(text);
updateWaves();
}
}).width(80f);
a.add("@waves.max").padLeft(5);
}).row();
t.table(a -> {
a.field((int)group.shields + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.shields = Strings.parseInt(text);
updateWaves();
}
}).width(80f);
a.add(" + ");
a.field((int)group.shieldScaling + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.shieldScaling = Strings.parseInt(text);
updateWaves();
}
}).width(80f);
a.add("@waves.shields").padLeft(4);
}).row();
t.check("@waves.guardian", b -> {
group.effect = (b ? StatusEffects.boss : null);
buildGroups();
}).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)).padBottom(8f).row();
//spawn positions are clunky and thus experimental for now
if(experimental){
t.table(a -> {
a.add("spawn at ");
a.field(group.spawn == -1 ? "" : Point2.x(group.spawn) + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.spawn = Point2.pack(Strings.parseInt(text), Point2.y(group.spawn));
Log.info(group.spawn);
}
}).width(70f);
a.add(",");
a.field(group.spawn == -1 ? "" : Point2.y(group.spawn) + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.spawn = Point2.pack(Point2.x(group.spawn), Strings.parseInt(text));
Log.info(group.spawn);
}
}).width(70f);
}).padBottom(8f).padTop(-8f).row();
}
}
}).width(340f).pad(8); }).width(340f).pad(8);
table.row(); table.row();
@@ -274,9 +373,57 @@ public class WaveInfoDialog extends BaseDialog{
if(++i % 3 == 0) p.row(); if(++i % 3 == 0) p.row();
} }
}); });
dialog.addCloseButton();
dialog.show(); dialog.show();
} }
void showEffect(SpawnGroup group){
BaseDialog dialog = new BaseDialog("");
dialog.setFillParent(true);
dialog.cont.pane(p -> {
int i = 0;
for(StatusEffect effect : content.statusEffects()){
if(effect != StatusEffects.none && (effect.isHidden() || effect.reactive)) continue;
p.button(t -> {
t.left();
if(effect.uiIcon != null && effect != StatusEffects.none){
t.image(effect.uiIcon).size(8 * 4).scaling(Scaling.fit).padRight(2f);
}else{
t.image(Icon.none).size(8 * 4).scaling(Scaling.fit).padRight(2f);
}
if(effect != StatusEffects.none){
t.add(effect.localizedName);
}else{
t.add("@settings.resetKey");
}
}, () -> {
group.effect = effect;
dialog.hide();
buildGroups();
}).pad(2).margin(12f).fillX();
if(++i % 3 == 0) p.row();
}
});
dialog.addCloseButton();
dialog.show();
}
enum Sort{
begin(Structs.comps(Structs.comparingFloat(g -> g.begin), Structs.comparingFloat(g -> g.type.id))),
health(Structs.comps(Structs.comparingFloat(g -> g.type.health), Structs.comparingFloat(g -> g.begin))),
type(Structs.comps(Structs.comparingFloat(g -> g.type.id), Structs.comparingFloat(g -> g.begin)));
static final Sort[] all = values();
final Comparator<SpawnGroup> sort;
Sort(Comparator<SpawnGroup> sort){
this.sort = sort;
}
}
void updateWaves(){ void updateWaves(){
graph.groups = groups; graph.groups = groups;
graph.from = start; graph.from = start;

View File

@@ -48,8 +48,8 @@ public class Damage{
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam, Effect explosionFx){ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam, Effect explosionFx){
if(damage){ if(damage){
for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){ for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){
int length = 5 + Mathf.clamp((int)(power / 500), 1, 20); int length = 5 + Mathf.clamp((int)(Mathf.pow(power, 0.98f) / 500), 1, 18);
Time.run(i * 0.8f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), length + Mathf.range(2))); Time.run(i * 0.8f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3 + Mathf.pow(power, 0.35f), x, y, Mathf.random(360f), length + Mathf.range(2)));
} }
if(fire){ if(fire){
@@ -465,8 +465,8 @@ public class Damage{
for(int dx = -trad; dx <= trad; dx++){ for(int dx = -trad; dx <= trad; dx++){
for(int dy = -trad; dy <= trad; dy++){ for(int dy = -trad; dy <= trad; dy++){
Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy); Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy);
if(tile != null && tile.build != null && (team == null ||team.isEnemy(tile.team())) && Mathf.dst(dx, dy) <= trad){ if(tile != null && tile.build != null && (team == null ||team.isEnemy(tile.team())) && dx*dx + dy*dy <= trad){
tile.build.damage(damage); tile.build.damage(team, damage);
} }
} }
} }

View File

@@ -19,7 +19,8 @@ import static mindustry.Vars.*;
public class Effect{ public class Effect{
private static final float shakeFalloff = 10000f; private static final float shakeFalloff = 10000f;
private static final EffectContainer container = new EffectContainer(); private static final EffectContainer container = new EffectContainer();
private static final Seq<Effect> all = new Seq<>();
public static final Seq<Effect> all = new Seq<>();
private boolean initialized; private boolean initialized;

View File

@@ -1,5 +1,6 @@
package mindustry.entities; package mindustry.entities;
import arc.func.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
@@ -23,7 +24,9 @@ public class EntityCollisions{
private Rect r2 = new Rect(); private Rect r2 = new Rect();
//entity collisions //entity collisions
private Seq<Hitboxc> arrOut = new Seq<>(); private Seq<Hitboxc> arrOut = new Seq<>(Hitboxc.class);
private Cons<Hitboxc> hitCons = this::updateCollision;
private Cons<QuadTree> treeCons = tree -> tree.intersect(r2, arrOut);
public void moveCheck(Hitboxc entity, float deltax, float deltay, SolidPred solidCheck){ public void moveCheck(Hitboxc entity, float deltax, float deltay, SolidPred solidCheck){
if(!solidCheck.solid(entity.tileX(), entity.tileY())){ if(!solidCheck.solid(entity.tileX(), entity.tileY())){
@@ -36,7 +39,7 @@ public class EntityCollisions{
} }
public void move(Hitboxc entity, float deltax, float deltay, SolidPred solidCheck){ public void move(Hitboxc entity, float deltax, float deltay, SolidPred solidCheck){
if(Math.abs(deltax) < 0.0001f & Math.abs(deltay) < 0.0001f) return; if(Math.abs(deltax) < 0.0001f & Math.abs(deltay) < 0.0001f) return;
boolean movedx = false; boolean movedx = false;
@@ -132,7 +135,7 @@ public class EntityCollisions{
public static boolean waterSolid(int x, int y){ public static boolean waterSolid(int x, int y){
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
return tile == null || (tile.solid() || !tile.floor().isLiquid); return tile == null || tile.solid() || !tile.floor().isLiquid;
} }
public static boolean solid(int x, int y){ public static boolean solid(int x, int y){
@@ -213,28 +216,34 @@ public class EntityCollisions{
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T extends Hitboxc> void collide(EntityGroup<T> groupa){ public <T extends Hitboxc> void collide(EntityGroup<T> groupa){
groupa.each(solid -> { groupa.each((Cons<T>)hitCons);
solid.hitbox(r1); }
r1.x += (solid.lastX() - solid.getX());
r1.y += (solid.lastY() - solid.getY());
solid.hitbox(r2); private void updateCollision(Hitboxc solid){
r2.merge(r1); solid.hitbox(r1);
r1.x += (solid.lastX() - solid.getX());
r1.y += (solid.lastY() - solid.getY());
arrOut.clear(); solid.hitbox(r2);
r2.merge(r1);
//get all targets based on what entity wants to collide with arrOut.clear();
solid.getCollisions(tree -> tree.intersect(r2, arrOut));
for(Hitboxc sc : arrOut){ //get all targets based on what entity wants to collide with
sc.hitbox(r1); solid.getCollisions(treeCons);
if(r2.overlaps(r1)){
checkCollide(solid, sc); var items = arrOut.items;
//break out of loop when this object hits something int size = arrOut.size;
if(!solid.isAdded()) return;
} for(int i = 0; i < size; i++){
Hitboxc sc = items[i];
sc.hitbox(r1);
if(r2.overlaps(r1)){
checkCollide(solid, sc);
//break out of loop when this object hits something
if(!solid.isAdded()) return;
} }
}); }
} }
public interface SolidPred{ public interface SolidPred{

View File

@@ -10,6 +10,7 @@ import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
@@ -25,7 +26,7 @@ public class EnergyFieldAbility extends Ability{
public Sound shootSound = Sounds.spark; public Sound shootSound = Sounds.spark;
public float statusDuration = 60f * 6f; public float statusDuration = 60f * 6f;
public float x, y; public float x, y;
public boolean hitBuildings = true; public boolean targetGround = true, targetAir = true, hitBuildings = true, hitUnits = true;
public int maxTargets = 25; public int maxTargets = 25;
public float healPercent = 2.5f; public float healPercent = 2.5f;
@@ -98,14 +99,20 @@ public class EnergyFieldAbility extends Ability{
all.clear(); all.clear();
Units.nearby(null, rx, ry, range, other -> { if(hitUnits){
if(other != unit){ Units.nearby(null, rx, ry, range, other -> {
all.add(other); if(other != unit && (other.isFlying() ? targetAir : targetGround)){
} all.add(other);
}); }
});
}
if(hitBuildings){ if(hitBuildings && targetGround){
Units.nearbyBuildings(rx, ry, range, all::add); Units.nearbyBuildings(rx, ry, range, b -> {
if(b.team != Team.derelict || state.rules.coreCapture){
all.add(b);
}
});
} }
all.sort(h -> h.dst2(rx, ry)); all.sort(h -> h.dst2(rx, ry));

View File

@@ -7,6 +7,7 @@ import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.game.EventType.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
@@ -40,6 +41,7 @@ public class UnitSpawnAbility extends Ability{
Unit u = this.unit.create(unit.team); Unit u = this.unit.create(unit.team);
u.set(x, y); u.set(x, y);
u.rotation = unit.rotation; u.rotation = unit.rotation;
Events.fire(new UnitCreateEvent(u, null, unit));
if(!Vars.net.client()){ if(!Vars.net.client()){
u.add(); u.add();
} }

View File

@@ -346,13 +346,7 @@ public class BulletType extends Content implements Cloneable{
} }
public void update(Bullet b){ public void update(Bullet b){
if(!headless && trailLength > 0){ updateTrail(b);
if(b.trail == null){
b.trail = new Trail(trailLength);
}
b.trail.length = trailLength;
b.trail.update(b.x, b.y, trailInterp.apply(b.fin()));
}
if(homingPower > 0.0001f && b.time >= homingDelay){ if(homingPower > 0.0001f && b.time >= homingDelay){
Teamc target; Teamc target;
@@ -387,6 +381,16 @@ public class BulletType extends Content implements Cloneable{
} }
} }
public void updateTrail(Bullet b){
if(!headless && trailLength > 0){
if(b.trail == null){
b.trail = new Trail(trailLength);
}
b.trail.length = trailLength;
b.trail.update(b.x, b.y, trailInterp.apply(b.fin()));
}
}
@Override @Override
public void init(){ public void init(){
if(pierceCap >= 1){ if(pierceCap >= 1){

View File

@@ -7,6 +7,9 @@ import mindustry.entities.*;
import mindustry.gen.*; import mindustry.gen.*;
public class RailBulletType extends BulletType{ public class RailBulletType extends BulletType{
//for calculating the furthest point
static float furthest = 0;
public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none; public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none;
/** Multiplier of damage decreased per health pierced. */ /** Multiplier of damage decreased per health pierced. */
public float pierceDamageFactor = 1f; public float pierceDamageFactor = 1f;
@@ -47,6 +50,11 @@ public class RailBulletType extends BulletType{
//subtract health from each consecutive pierce //subtract health from each consecutive pierce
b.damage -= Math.min(b.damage, sub); b.damage -= Math.min(b.damage, sub);
//bullet was stopped, decrease furthest distance
if(b.damage <= 0f){
furthest = Math.min(furthest, b.dst(pos));
}
} }
@Override @Override
@@ -54,8 +62,9 @@ public class RailBulletType extends BulletType{
super.init(b); super.init(b);
b.fdata = length; b.fdata = length;
furthest = length;
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false); Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false);
float resultLen = b.fdata; float resultLen = furthest;
Vec2 nor = Tmp.v1.trns(b.rotation(), 1f).nor(); Vec2 nor = Tmp.v1.trns(b.rotation(), 1f).nor();
for(float i = 0; i <= resultLen; i += updateEffectSeg){ for(float i = 0; i <= resultLen; i += updateEffectSeg){

View File

@@ -94,6 +94,10 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{
if(!within(tile, finalPlaceDst)) return; if(!within(tile, finalPlaceDst)) return;
if(!headless){
Vars.control.sound.loop(Sounds.build, tile, 0.51f);
}
if(!(tile.build instanceof ConstructBuild cb)){ if(!(tile.build instanceof ConstructBuild cb)){
if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){
boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item, Math.min(Mathf.round(i.amount * state.rules.buildCostMultiplier), 1))); boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item, Math.min(Mathf.round(i.amount * state.rules.buildCostMultiplier), 1)));

View File

@@ -1509,6 +1509,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
} }
if(cons != null){
cons.update();
}
if(enabled || !block.noUpdateDisabled){ if(enabled || !block.noUpdateDisabled){
updateTile(); updateTile();
} }
@@ -1521,10 +1525,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
liquids.update(updateFlow); liquids.update(updateFlow);
} }
if(cons != null){
cons.update();
}
if(power != null){ if(power != null){
power.graph.update(); power.graph.update();
} }

View File

@@ -118,36 +118,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
type.update(self()); type.update(self());
if(type.collidesTiles && type.collides && type.collidesGround){ if(type.collidesTiles && type.collides && type.collidesGround){
world.raycastEach(World.toTile(lastX()), World.toTile(lastY()), tileX(), tileY(), (x, y) -> { tileRaycast(World.toTile(lastX()), World.toTile(lastY()), tileX(), tileY());
Building build = world.build(x, y);
if(build == null || !isAdded()) return false;
if(build.collide(self()) && type.testCollision(self(), build) && !build.dead() && (type.collidesTeam || build.team != team) && !(type.pierceBuilding && hasCollided(build.id))){
boolean remove = false;
float health = build.health;
if(build.team != team){
remove = build.collision(self());
}
if(remove || type.collidesTeam){
if(!type.pierceBuilding){
hit = true;
remove();
}else{
collided.add(build.id);
}
}
type.hitTile(self(), build, health, true);
return !type.pierceBuilding;
}
return false;
});
} }
if(type.pierceCap != -1 && collided.size >= type.pierceCap){ if(type.pierceCap != -1 && collided.size >= type.pierceCap){
@@ -156,6 +127,56 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
} }
} }
//copy-paste of World#raycastEach, inlined for lambda capture performance.
@Override
public void tileRaycast(int x0f, int y0f, int x1, int y1){
int x = x0f, dx = Math.abs(x1 - x), sx = x < x1 ? 1 : -1;
int y = y0f, dy = Math.abs(y1 - y), sy = y < y1 ? 1 : -1;
int e2, err = dx - dy;
int ww = world.width(), wh = world.height();
while(x >= 0 && y >= 0 && x < ww && y < wh){
Building build = world.build(x, y);
if(build != null && isAdded() && build.collide(self()) && type.testCollision(self(), build)
&& !build.dead() && (type.collidesTeam || build.team != team) && !(type.pierceBuilding && hasCollided(build.id))){
boolean remove = false;
float health = build.health;
if(build.team != team){
remove = build.collision(self());
}
if(remove || type.collidesTeam){
if(!type.pierceBuilding){
hit = true;
remove();
}else{
collided.add(build.id);
}
}
type.hitTile(self(), build, health, true);
//stop raycasting when building is hit
if(type.pierceBuilding) return;
}
if(x == x1 && y == y1) break;
e2 = 2 * err;
if(e2 > -dy){
err -= dy;
x += sx;
}
if(e2 < dx){
err += dx;
y += sy;
}
}
}
@Override @Override
public void draw(){ public void draw(){
Draw.z(type.layer); Draw.z(type.layer);

View File

@@ -41,6 +41,10 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{
return isGrounded() && !hovering; return isGrounded() && !hovering;
} }
boolean emitWalkSound(){
return true;
}
void landed(){ void landed(){
} }
@@ -52,7 +56,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{
void moveAt(Vec2 vector, float acceleration){ void moveAt(Vec2 vector, float acceleration){
Vec2 t = tmp1.set(vector); //target vector Vec2 t = tmp1.set(vector); //target vector
tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta * floorSpeedMultiplier()); //delta vector tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta); //delta vector
vel.add(tmp2); vel.add(tmp2);
} }
@@ -80,7 +84,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{
floor.walkEffect.at(x, y, hitSize() / 8f, floor.mapColor); floor.walkEffect.at(x, y, hitSize() / 8f, floor.mapColor);
splashTimer = 0f; splashTimer = 0f;
if(!(this instanceof WaterMovec)){ if(emitWalkSound()){
floor.walkSound.at(x, y, Mathf.random(floor.walkSoundPitchMin, floor.walkSoundPitchMax), floor.walkSoundVolume); floor.walkSound.at(x, y, Mathf.random(floor.walkSoundPitchMin, floor.walkSoundPitchMax), floor.walkSoundVolume);
} }
} }

View File

@@ -76,6 +76,17 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati
return raw; return raw;
} }
@Override
@Replace
public void rotateMove(Vec2 vec){
//mechs use baseRotation to rotate, not rotation.
moveAt(Tmp.v2.trns(baseRotation, vec.len()));
if(!vec.isZero()){
baseRotation = Angles.moveToward(baseRotation, vec.angle(), type.rotateSpeed * Math.max(Time.delta, 1));
}
}
@Override @Override
public void moveAt(Vec2 vector, float acceleration){ public void moveAt(Vec2 vector, float acceleration){
//mark walking state when moving in a controlled manner //mark walking state when moving in a controlled manner

View File

@@ -40,8 +40,8 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{
@Import int id; @Import int id;
@Import float x, y; @Import float x, y;
@Import boolean added;
transient private boolean mismatch = false;
transient float accepting, updateTime, lastRipple = Time.time + Mathf.random(40f); transient float accepting, updateTime, lastRipple = Time.time + Mathf.random(40f);
float amount; float amount;
Tile tile; Tile tile;
@@ -79,9 +79,12 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{
return; return;
} }
if(Puddles.get(tile) != self()){ if(Puddles.get(tile) != self() && added){
mismatch = true; //force removal without pool free
remove(); Groups.all.remove(self());
Groups.draw.remove(self());
Groups.puddle.remove(self());
added = false;
return; return;
} }
@@ -134,9 +137,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{
@Override @Override
public void remove(){ public void remove(){
if(!mismatch){ Puddles.remove(tile);
Puddles.remove(tile);
}
} }
@Override @Override

View File

@@ -11,7 +11,6 @@ import arc.util.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.ai.types.*; import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
@@ -51,6 +50,15 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
private transient boolean wasPlayer; private transient boolean wasPlayer;
private transient boolean wasHealed; private transient boolean wasHealed;
/** Move based on preferred unit movement type. */
public void movePref(Vec2 movement){
if(type.omniMovement){
moveAt(movement);
}else{
rotateMove(movement);
}
}
public void moveAt(Vec2 vector){ public void moveAt(Vec2 vector){
moveAt(vector, type.accel); moveAt(vector, type.accel);
} }
@@ -95,15 +103,18 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
return type.hasWeapons(); return type.hasWeapons();
} }
/** @return speed with boost & floor multipliers factored in. */
public float speed(){ public float speed(){
float strafePenalty = isGrounded() || !isPlayer() ? 1f : Mathf.lerp(1f, type.strafePenalty, Angles.angleDist(vel().angle(), rotation) / 180f); float strafePenalty = isGrounded() || !isPlayer() ? 1f : Mathf.lerp(1f, type.strafePenalty, Angles.angleDist(vel().angle(), rotation) / 180f);
float boost = Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, elevation);
//limit speed to minimum formation speed to preserve formation //limit speed to minimum formation speed to preserve formation
return (isCommanding() ? minFormationSpeed * 0.98f : type.speed) * strafePenalty; return (isCommanding() ? minFormationSpeed * 0.98f : type.speed) * strafePenalty * boost * floorSpeedMultiplier();
} }
/** @return speed with boost multipliers factored in. */ /** @deprecated use speed() instead */
@Deprecated
public float realSpeed(){ public float realSpeed(){
return Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, elevation) * speed() * floorSpeedMultiplier(); return speed();
} }
/** Iterates through this unit and everything it is controlling. */ /** Iterates through this unit and everything it is controlling. */
@@ -469,12 +480,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
if(!spawnedByCore){ if(!spawnedByCore){
Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team, type.deathExplosionEffect); Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team, type.deathExplosionEffect);
}else{
type.deathExplosionEffect.at(x, y, bounds() / 2f / 8f);
} }
float shake = hitSize / 3f; float shake = hitSize / 3f;
Effect.scorch(x, y, (int)(hitSize / 5)); Effect.scorch(x, y, (int)(hitSize / 5));
Fx.explosion.at(this);
Effect.shake(shake, shake, this); Effect.shake(shake, shake, this);
type.deathSound.at(this); type.deathSound.at(this);
@@ -486,7 +498,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
//if this unit crash landed (was flying), damage stuff in a radius //if this unit crash landed (was flying), damage stuff in a radius
if(type.flying && !spawnedByCore){ if(type.flying && !spawnedByCore){
Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true); Damage.damage(team, x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true);
} }
if(!headless){ if(!headless){

View File

@@ -27,13 +27,14 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
@Override @Override
public void update(){ public void update(){
boolean flying = isFlying();
for(int i = 0; i < 2; i++){ for(int i = 0; i < 2; i++){
Trail t = i == 0 ? tleft : tright; Trail t = i == 0 ? tleft : tright;
t.length = type.trailLength; t.length = type.trailLength;
int sign = i == 0 ? -1 : 1; int sign = i == 0 ? -1 : 1;
float cx = Angles.trnsx(rotation - 90, type.trailX * sign, type.trailY) + x, cy = Angles.trnsy(rotation - 90, type.trailX * sign, type.trailY) + y; float cx = Angles.trnsx(rotation - 90, type.trailX * sign, type.trailY) + x, cy = Angles.trnsy(rotation - 90, type.trailX * sign, type.trailY) + y;
t.update(cx, cy, world.floorWorld(cx, cy).isLiquid ? 1 : 0); t.update(cx, cy, world.floorWorld(cx, cy).isLiquid && !flying ? 1 : 0);
} }
} }
@@ -43,6 +44,13 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
return Pathfinder.costNaval; return Pathfinder.costNaval;
} }
//don't want obnoxious splashing
@Override
@Replace
public boolean emitWalkSound(){
return false;
}
@Override @Override
public void add(){ public void add(){
tleft.clear(); tleft.clear();
@@ -71,6 +79,12 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
return isFlying() ? null : EntityCollisions::waterSolid; return isFlying() ? null : EntityCollisions::waterSolid;
} }
@Replace
@Override
public boolean onSolid(){
return EntityCollisions.waterSolid(tileX(), tileY());
}
@Replace @Replace
public float floorSpeedMultiplier(){ public float floorSpeedMultiplier(){
Floor on = isFlying() ? Blocks.air.asFloor() : floorOn(); Floor on = isFlying() ? Blocks.air.asFloor() : floorOn();

View File

@@ -18,6 +18,7 @@ public class MultiEffect extends Effect{
@Override @Override
public void init(){ public void init(){
for(Effect f : effects){ for(Effect f : effects){
f.init();
clip = Math.max(clip, f.clip); clip = Math.max(clip, f.clip);
lifetime = Math.max(lifetime, f.lifetime); lifetime = Math.max(lifetime, f.lifetime);
} }

View File

@@ -4,17 +4,24 @@ import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.graphics.*; import mindustry.graphics.*;
/** The most essential effect class. Can create particles in various shapes. */ /** The most essential effect class. Can create particles in various shapes. */
public class ParticleEffect extends Effect{ public class ParticleEffect extends Effect{
private static final Rand rand = new Rand();
private static final Vec2 rv = new Vec2();
public Color colorFrom = Color.white.cpy(), colorTo = Color.white.cpy(); public Color colorFrom = Color.white.cpy(), colorTo = Color.white.cpy();
public int particles = 6; public int particles = 6;
public boolean randLength = true;
public float cone = 180f, length = 20f, baseLength = 0f; public float cone = 180f, length = 20f, baseLength = 0f;
/** Particle size/length/radius interpolation. */ /** Particle size/length/radius interpolation. */
public Interp interp = Interp.linear; public Interp interp = Interp.linear;
/** Particle size interpolation. Null to use interp. */
public @Nullable Interp sizeInterp = null;
public float offsetX, offsetY; public float offsetX, offsetY;
public float lightScl = 2f, lightOpacity = 0.6f; public float lightScl = 2f, lightOpacity = 0.6f;
public @Nullable Color lightColor; public @Nullable Color lightColor;
@@ -39,6 +46,7 @@ public class ParticleEffect extends Effect{
@Override @Override
public void init(){ public void init(){
clip = Math.max(clip, length + Math.max(sizeFrom, sizeTo)); clip = Math.max(clip, length + Math.max(sizeFrom, sizeTo));
if(sizeInterp == null) sizeInterp = interp;
} }
@Override @Override
@@ -47,25 +55,35 @@ public class ParticleEffect extends Effect{
float rawfin = e.fin(); float rawfin = e.fin();
float fin = e.fin(interp); float fin = e.fin(interp);
float rad = interp.apply(sizeFrom, sizeTo, rawfin) * 2; float rad = sizeInterp.apply(sizeFrom, sizeTo, rawfin) * 2;
float ox = e.x + Angles.trnsx(e.rotation, offsetX, offsetY), oy = e.y + Angles.trnsy(e.rotation, offsetX, offsetY); float ox = e.x + Angles.trnsx(e.rotation, offsetX, offsetY), oy = e.y + Angles.trnsy(e.rotation, offsetX, offsetY);
Draw.color(colorFrom, colorTo, fin); Draw.color(colorFrom, colorTo, fin);
Color lightColor = this.lightColor == null ? Draw.getColor() : this.lightColor; Color lightColor = this.lightColor == null ? Draw.getColor() : this.lightColor;
if(line){ if(line){
Lines.stroke(interp.apply(strokeFrom, strokeTo, rawfin)); Lines.stroke(sizeInterp.apply(strokeFrom, strokeTo, rawfin));
float len = interp.apply(lenFrom, lenTo, rawfin); float len = sizeInterp.apply(lenFrom, lenTo, rawfin);
rand.setSeed(e.id);
for(int i = 0; i < particles; i++){
float l = length * fin + baseLength;
rv.trns(e.rotation + rand.range(cone), !randLength ? l : rand.random(l));
float x = rv.x, y = rv.y;
Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> {
Lines.lineAngle(ox + x, oy + y, Mathf.angle(x, y), len); Lines.lineAngle(ox + x, oy + y, Mathf.angle(x, y), len);
Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity* Draw.getColor().a); Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity * Draw.getColor().a);
}); }
}else{ }else{
Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { rand.setSeed(e.id);
for(int i = 0; i < particles; i++){
float l = length * fin + baseLength;
rv.trns(e.rotation + rand.range(cone), !randLength ? l : rand.random(l));
float x = rv.x, y = rv.y;
Draw.rect(tex, ox + x, oy + y, rad, rad, e.rotation + offset + e.time * spin); Draw.rect(tex, ox + x, oy + y, rad, rad, e.rotation + offset + e.time * spin);
Drawf.light(ox + x, oy + y, rad * lightScl, lightColor, lightOpacity * Draw.getColor().a); Drawf.light(ox + x, oy + y, rad * lightScl, lightColor, lightOpacity * Draw.getColor().a);
}); }
} }
} }
} }

View File

@@ -46,19 +46,19 @@ public class AIController implements UnitController{
} }
@Nullable @Nullable
protected AIController fallback(){ public AIController fallback(){
return null; return null;
} }
protected boolean useFallback(){ public boolean useFallback(){
return false; return false;
} }
protected UnitCommand command(){ public UnitCommand command(){
return unit.team.data().command; return unit.team.data().command;
} }
protected void updateVisuals(){ public void updateVisuals(){
if(unit.isFlying()){ if(unit.isFlying()){
unit.wobble(); unit.wobble();
@@ -66,21 +66,38 @@ public class AIController implements UnitController{
} }
} }
protected void updateMovement(){ public void updateMovement(){
} }
protected void updateTargeting(){ public void updateTargeting(){
if(unit.hasWeapons()){ if(unit.hasWeapons()){
updateWeapons(); updateWeapons();
} }
} }
protected boolean invalid(Teamc target){ /** For ground units: Looks at the target, or the movement position. Does not apply to non-omni units. */
public void faceTarget(){
if(unit.type.omniMovement || unit instanceof Mechc){
if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting && unit.type.hasWeapons()){
unit.lookAt(Predict.intercept(unit, target, unit.type.weapons.first().bullet.speed));
}else if(unit.moving()){
unit.lookAt(unit.vel().angle());
}
}
}
public void faceMovement(){
if((unit.type.omniMovement || unit instanceof Mechc) && unit.moving()){
unit.lookAt(unit.vel().angle());
}
}
public boolean invalid(Teamc target){
return Units.invalidateTarget(target, unit.team, unit.x, unit.y); return Units.invalidateTarget(target, unit.team, unit.x, unit.y);
} }
protected void pathfind(int pathTarget){ public void pathfind(int pathTarget){
int costType = unit.pathType(); int costType = unit.pathType();
Tile tile = unit.tileOn(); Tile tile = unit.tileOn();
@@ -89,10 +106,10 @@ public class AIController implements UnitController{
if(tile == targetTile || (costType == Pathfinder.costNaval && !targetTile.floor().isLiquid)) return; if(tile == targetTile || (costType == Pathfinder.costNaval && !targetTile.floor().isLiquid)) return;
unit.moveAt(vec.trns(unit.angleTo(targetTile.worldx(), targetTile.worldy()), unit.speed())); unit.movePref(vec.trns(unit.angleTo(targetTile.worldx(), targetTile.worldy()), unit.speed()));
} }
protected void updateWeapons(){ public void updateWeapons(){
float rotation = unit.rotation - 90; float rotation = unit.rotation - 90;
boolean ret = retarget(); boolean ret = retarget();
@@ -146,45 +163,45 @@ public class AIController implements UnitController{
} }
} }
protected boolean checkTarget(Teamc target, float x, float y, float range){ public boolean checkTarget(Teamc target, float x, float y, float range){
return Units.invalidateTarget(target, unit.team, x, y, range); return Units.invalidateTarget(target, unit.team, x, y, range);
} }
protected boolean shouldShoot(){ public boolean shouldShoot(){
return true; return true;
} }
protected Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){ public Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){
if(unit.team == Team.derelict) return null; if(unit.team == Team.derelict) return null;
Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag)); Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag));
return target == null ? null : target.build; return target == null ? null : target.build;
} }
protected Teamc target(float x, float y, float range, boolean air, boolean ground){ public Teamc target(float x, float y, float range, boolean air, boolean ground){
return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground); return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground);
} }
protected boolean retarget(){ public boolean retarget(){
return timer.get(timerTarget, target == null ? 40 : 90); return timer.get(timerTarget, target == null ? 40 : 90);
} }
protected Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){ public Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){
return findTarget(x, y, range, air, ground); return findTarget(x, y, range, air, ground);
} }
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ public Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
return target(x, y, range, air, ground); return target(x, y, range, air, ground);
} }
protected void init(){ public void init(){
} }
protected @Nullable Tile getClosestSpawner(){ public @Nullable Tile getClosestSpawner(){
return Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns()); return Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns());
} }
protected void unloadPayloads(){ public void unloadPayloads(){
if(unit instanceof Payloadc pay && pay.hasPayload() && target instanceof Building && pay.payloads().peek() instanceof UnitPayload){ if(unit instanceof Payloadc pay && pay.hasPayload() && target instanceof Building && pay.payloads().peek() instanceof UnitPayload){
if(target.within(unit, Math.max(unit.type().range + 1f, 75f))){ if(target.within(unit, Math.max(unit.type().range + 1f, 75f))){
pay.dropLastPayload(); pay.dropLastPayload();
@@ -192,11 +209,11 @@ public class AIController implements UnitController{
} }
} }
protected void circle(Position target, float circleLength){ public void circle(Position target, float circleLength){
circle(target, circleLength, unit.speed()); circle(target, circleLength, unit.speed());
} }
protected void circle(Position target, float circleLength, float speed){ public void circle(Position target, float circleLength, float speed){
if(target == null) return; if(target == null) return;
vec.set(target).sub(unit); vec.set(target).sub(unit);
@@ -210,18 +227,18 @@ public class AIController implements UnitController{
unit.moveAt(vec); unit.moveAt(vec);
} }
protected void moveTo(Position target, float circleLength){ public void moveTo(Position target, float circleLength){
moveTo(target, circleLength, 100f); moveTo(target, circleLength, 100f);
} }
protected void moveTo(Position target, float circleLength, float smooth){ public void moveTo(Position target, float circleLength, float smooth){
if(target == null) return; if(target == null) return;
vec.set(target).sub(unit); vec.set(target).sub(unit);
float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f);
vec.setLength(unit.realSpeed() * length); vec.setLength(unit.speed() * length);
if(length < -0.5f){ if(length < -0.5f){
vec.rotate(180f); vec.rotate(180f);
}else if(length < 0){ }else if(length < 0){

View File

@@ -0,0 +1,25 @@
package mindustry.entities.units;
import arc.graphics.*;
import mindustry.graphics.*;
/** A sprite drawn in addition to the base unit sprites. */
public class UnitDecal{
public String region = "error";
public float x, y, rotation;
public float layer = Layer.flyingUnit + 1f;
public float xScale = 1f, yScale = 1f;
public Color color = Color.white;
public UnitDecal(String region, float x, float y, float rotation, float layer, Color color){
this.region = region;
this.x = x;
this.y = y;
this.rotation = rotation;
this.layer = layer;
this.color = color;
}
public UnitDecal(){
}
}

View File

@@ -411,14 +411,29 @@ public class EventType{
} }
} }
/** Called when a unit is created in a reconstructor or factory. */ /** Called when a unit is created in a reconstructor, factory or other unit. */
public static class UnitCreateEvent{ public static class UnitCreateEvent{
public final Unit unit; public final Unit unit;
public final Building spawner; public final @Nullable Building spawner;
public final @Nullable Unit spawnerUnit;
public UnitCreateEvent(Unit unit, Building spawner){ public UnitCreateEvent(Unit unit, Building spawner, Unit spawnerUnit){
this.unit = unit; this.unit = unit;
this.spawner = spawner; this.spawner = spawner;
this.spawnerUnit = spawnerUnit;
}
public UnitCreateEvent(Unit unit, Building spawner){
this(unit, spawner, null);
}
}
/** Called when a unit is spawned by wave. */
public static class UnitSpawnEvent{
public final Unit unit;
public UnitSpawnEvent(Unit unit) {
this.unit = unit;
} }
} }

View File

@@ -1,52 +1,16 @@
package mindustry.game; package mindustry.game;
import arc.math.*;
import arc.struct.*;
import mindustry.type.*;
//TODO more stats:
//- units constructed
public class GameStats{ public class GameStats{
/** Total items delivered to global resoure counter. Campaign only. */
public ObjectIntMap<Item> itemsDelivered = new ObjectIntMap<>();
/** Enemy (red team) units destroyed. */ /** Enemy (red team) units destroyed. */
public int enemyUnitsDestroyed; public int enemyUnitsDestroyed;
/** Total waves lasted. */ /** Total waves lasted. */
public int wavesLasted; public int wavesLasted;
/** Total (ms) time lasted in this save/zone. */
public long timeLasted;
/** Friendly buildings fully built. */ /** Friendly buildings fully built. */
public int buildingsBuilt; public int buildingsBuilt;
/** Friendly buildings fully deconstructed. */ /** Friendly buildings fully deconstructed. */
public int buildingsDeconstructed; public int buildingsDeconstructed;
/** Friendly buildings destroyed. */ /** Friendly buildings destroyed. */
public int buildingsDestroyed; public int buildingsDestroyed;
/** Total units created by any means. */
//unused public int unitsCreated;
public RankResult calculateRank(Sector sector){
float score = 0;
int rankIndex = Mathf.clamp((int)score, 0, Rank.all.length - 1);
Rank rank = Rank.all[rankIndex];
String sign = Math.abs((rankIndex + 0.5f) - score) < 0.2f || rank.name().contains("S") ? "" : (rankIndex + 0.5f) < score ? "-" : "+";
return new RankResult(rank, sign);
}
public static class RankResult{
public final Rank rank;
/** + or - */
public final String modifier;
public RankResult(Rank rank, String modifier){
this.rank = rank;
this.modifier = modifier;
}
}
public enum Rank{
F, D, C, B, A, S, SS;
public static final Rank[] all = values();
}
} }

Some files were not shown because too many files have changed in this diff Show More