Compare commits

...

334 Commits
v123.1 ... v126

Author SHA1 Message Date
Anuken
24195dac81 Added Voz-Duh's large launch pad sprite (#4861) 2021-03-05 14:27:15 -05:00
Joshua Fan
830fe03898 Add buildSpeedMultiplier status effect (#4816)
* Make disarmed status effect prevent building

* Revert disarmed changes, add buildSpeedMultiplier status

* Add buildSpeedMultiplier to StatusComp
2021-03-05 14:09:46 -05:00
Anuken
4690aae197 Fixed cores being replaceable 2021-03-05 14:00:53 -05:00
Anuken
b82dca89b3 Merge remote-tracking branch 'origin/master' 2021-03-05 12:06:44 -05:00
Anuken
dce79a621a Close connections immediately on kick 2021-03-05 12:06:40 -05:00
buthed010203
d6f00a5d2d Remove dead servers from v5 server list (#4858)
From what I can see, atnanner is the only network that still hosts any v5 servers, all the others are either on v6 or are offline.
2021-03-05 11:59:44 -05:00
Anuken
545b75a091 [Модификация] Доступен -> Доступна 2021-03-05 11:38:57 -05:00
Anuken
979daca221 Merge remote-tracking branch 'origin/master' 2021-03-05 11:36:15 -05:00
Anuken
fb2fed7c28 mod.multiplayer.compatible RU 2021-03-05 11:36:11 -05:00
YellOw139
0ec71750b7 [Bundle][RO] Update (#4750)
* [Bundle][RO] Update

This PR was tested in-game and is ready to merge at any time.

Changelog:

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

* WIP

* typo

* Speaking logically

* Update core/assets/bundles/bundle_ro.properties

Co-authored-by: MLGTASTICa <61350382+MLGTASTICa@users.noreply.github.com>

* Opted for a better term: controlor, not controller

* double-tap

* Times joined & kicked

Co-authored-by: MLGTASTICa <61350382+MLGTASTICa@users.noreply.github.com>
2021-03-05 11:30:55 -05:00
BlueTechno
51f7858b78 Added "armor" and "buildingdamage" stats (#4794)
Also fixed the description of the separator (so it matches the english description)
2021-03-05 11:30:45 -05:00
PolgarSasa
ab83b872a2 Update bundle_hu.properties (#4790) 2021-03-05 11:30:39 -05:00
Sharlotte
879adb7458 [KO] Update bundle_ko.properties (#4803)
* Update bundle_ko.properties

* translated recent changing

* https://github.com/Anuken/Mindustry/pull/4844

* Update bundle_ko.properties

* Add files via upload

* unofficial details
2021-03-05 11:29:26 -05:00
Catchears
39cbd607ef update german translation (#4826)
* update german translation to 781410ea04

* change from stuffyAI

* update german translation to ae838b9392
2021-03-05 11:29:18 -05:00
Antsiferov Andrew
7478cdf4a4 [Bundle][RU] actual L10n (#4748)
* 3 new, 1 deleted

New:
rules.unitcapvariable
rules.unitcap
laccess.color

Deleted:
lenum.color

* 1 line changed

rules.unitcap

* 2 new, 1 deleted

New:
mods.initfailed
setting.modcrashdisable.name

Deleted:
mods.alphainfo
-
Отключение модов после вылета на старте

* Fixed #4715

* Content parser class discovery improvements

* Use github build status (#4718)

Why does this still use travis? It was ditched months ago

* Make status colors the same (#4719)

It bothers me ok

* Better splash damage handling for small radii

* Fixed #4729

* Uncap content names in resolution

* Fixed UnitReq parsing

* Fixed #4732

* Allow JSON mod content types from other class loaders

* Better JSON null validation / Disable mods on startup crash

* Logic tooltips on mobile devices w/ long-press

* Add Survival and PvP servers (#4736)

* Update servers_v6.json (#4735)

add 1 more server for CxZx

* arc

* Balance tweaks

* Fixing remaining typos\errors in bundle_fr (#4397)

* Fixing remaining typos errors in bundle_fr

There are some errors that had managed to get through the verification. Imma chase them down!

* added logic hints and some typo fixes

* Fixing 2 typos in bundle.properties

L1548: Color statement affects every following draw operations.

* smolfixes

* Fixed "fix" in #4397

* [Bundle][RO] Update (#4725)

* [Bundle][RO] Update

This PR was tested in-game and is ready to merge at any time.

Changelog:

- New strings/changes up to commit 1ef7ae7079
- Typo fixes & various other improvements

* Reducing confusion

* Update bundle_ro.properties

* Fixing typos and descriptions [bundle_es.properties] (#4727)

* Fixing and descriptions [bundle_es.properties]

* Forgot something

* Update Logic Draw Hints (#4734)

Wrapped up some previous logic hints, too.

* german translation for build 125, full android translation (#4703)

* update german translation to 631e4d9eef

* update android translation to e816f6110d

with regard to 5ec5f1aa93

* improve translation with ideas from others

* update german steam discription to e86a3e9d09

* update german translation to 1ef7ae7079 (diff-5e346bcec4e8e1d545e035b1e438472bc51937398ac3e8e81308605ec82aea2c)

* changes from stuffyAI

* cross-platform as suggested by stuffyAI

* stuffyAI

genau, hast recht

Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>

Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>

* Update bundle_vi.properties (#4724)

* Fixed mod crash disable setting name

* Various fixes

* Steam icon changes

* arc

* Update Vietnamese Translation. (#4660)

* Update translation, fix some typo

* About 150 lines to do left.

* Typos fix #_1

* Typos fix + add trans

* Update to lastest commit.

* Base logic translation.

* a lot of typo ...

* some update from main bundle.

* Add more logic hint.

* translated recent update (#4742)

* Move update function of resupply point 5x1 spaces back (#4746)

* Remove stray spaces from accelerator (#4465)

* 10 new lines
graphicstype.clear
graphicstype.color
graphicstype.stroke
graphicstype.line
graphicstype.rect
graphicstype.linerect
graphicstype.poly
graphicstype.linepoly
graphicstype.triangle
graphicstype.image

* 1 line changed
lenum.stop (typo)

* 6 new lines

logic.nounitbuild
laccess.controller
laccess.dead
laccess.controlled
laccess.commanded
lenum.idle

* 1 new line

setting.doubletapmine.name

* 2 new, 2 changed

New:
trace.times.joined
trace.times.kicked

Changed:
unit.seconds
unit.minutes

* 1 line changed

trace.times.joined

* 1 new line

mod.multiplayercompatable
-
quick commit before potential merge, might fix it later

Co-authored-by: Vanguard <55051135+XEN0PHIL@users.noreply.github.com>
Co-authored-by: Anuken <arnukren@gmail.com>
Co-authored-by: buthed010203 <naguiar010203@gmail.com>
Co-authored-by: Fatonndev <56699208+Fatonndev@users.noreply.github.com>
Co-authored-by: CxZxRainzz <78591136+CxZxRainzz@users.noreply.github.com>
Co-authored-by: Phinner <62483793+Phinner@users.noreply.github.com>
Co-authored-by: YellOw139 <70975516+YellOw139@users.noreply.github.com>
Co-authored-by: BlueThecno <69437358+BlueThecno@users.noreply.github.com>
Co-authored-by: 彭瑞暄 <raymondpeng0725@gmail.com>
Co-authored-by: Catchears <57631841+Catchears@users.noreply.github.com>
Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>
Co-authored-by: Arnyyx <74717260+Arnyyx@users.noreply.github.com>
Co-authored-by: Ngọc Lam <33188123+NgLamVN@users.noreply.github.com>
Co-authored-by: Sharlotte <60801210+Sharlottes@users.noreply.github.com>
Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>
2021-03-05 11:28:28 -05:00
Patrick 'Quezler' Mounier
b75a8d5260 Fix typo to preserve sanity (#4857)
* compatable > compatible

* compatable > compatible
2021-03-05 11:27:51 -05:00
MEEP of Faith
120c694a42 Mention Foreshadow's special targeting in its description. (#4419)
* Mention Foreshadow special targetting.

* Better wording
2021-03-05 11:25:58 -05:00
MEEP of Faith
569293e577 Shadow with width/height (#4609) 2021-03-05 11:21:23 -05:00
Anuken
4f0f2499be mod.multiplayercompatable in gray 2021-03-05 11:19:55 -05:00
MEEP of Faith
d34dd0c603 Add message for mods that have hidden = true (#4717)
* Multiplayer compatability message

* Make more sense?
2021-03-05 11:17:55 -05:00
Anuken
b6c645b701 Better DefenderAI / Vela building / Anuken/Mindustry-Suggestions/issues/2074 2021-03-05 11:10:12 -05:00
MEEP of Faith
0c28bb7dcf DefenderAI that makes octs follow units (#4757) 2021-03-05 10:21:26 -05:00
Anuken
2bb303e709 Fixed #4856 2021-03-04 18:41:30 -05:00
Anuken
cc65feb392 Added ConnectionEvent 2021-03-04 18:39:47 -05:00
Anuken
c12b9ee3e3 Minor network packet handling tweaks 2021-03-04 17:58:28 -05:00
Anuken
d863c971c2 Gradle update / Mech animation fixes / Formation movement tweaks 2021-03-04 13:40:50 -05:00
MEEP of Faith
3ccdf45ed1 Is this what you wanted sk? (#4848) 2021-03-04 10:38:47 -05:00
Javier Domingo Cansino
efa5c5db7b Enable client to use a different data dir through env MINDUSTRY_DATA_DIR (#4851) 2021-03-04 10:34:23 -05:00
Anuken
d73cf9fcff Prevent early return in PowerNode config render 2021-03-03 14:42:41 -05:00
Anuken
93dafc82eb Fixed #4847 2021-03-03 12:44:56 -05:00
Anuken
87142b06c3 Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-03-03 10:49:57 -05:00
Anuken
3075616b03 arc 2021-03-03 10:49:52 -05:00
buthed010203
019898dfc3 Turrets can properly replace eachother, cores can replace conveyors and minor cleanup. (#4841) 2021-03-03 09:15:50 -05:00
Patrick 'Quezler' Mounier
ae838b9392 Trace times joined & kicked (#4844)
* Trace times joined & kicked

* Make mindustry.* import obsolete
2021-03-03 09:09:05 -05:00
Anuken
4d9a30b7c7 Merge remote-tracking branch 'origin/master' 2021-03-02 18:45:22 -05:00
Anuken
ea82773157 Non-overdriveable core / Spurious mod warning fix 2021-03-02 18:45:18 -05:00
buthed010203
8289da1415 Nuclear reactor schem priority of -5 (#4840)
* Nuclear reactor schem priority of -5
2021-03-02 10:49:22 -05:00
Anuken
19eb6334b7 Merge remote-tracking branch 'origin/master' 2021-03-02 09:28:42 -05:00
Anuken
e992be1bfb Higher LogicBlock schem priority 2021-03-02 09:28:38 -05:00
MEEP of Faith
7e216d198e Remove duplicates and mild formatting. (#4837)
* Remove duplicate definitions in UnitTypes

* If Tsunami is indented, so should the others

It looks nicer as well.
2021-03-02 09:28:04 -05:00
MEEP of Faith
a89d50e74d Cursor should not change for other teams when hovering over doors and construction. (#4838)
* Cursor should not change for other teams.

* Use Built-in interaction check

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>

* Building should use built-in check, same treatment for ConstructBlock

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>
2021-03-02 09:25:15 -05:00
Anuken
05dc13c922 Fixed #4830 2021-03-01 13:06:47 -05:00
Patrick 'Quezler' Mounier
1de4dd1bfe Call super.drawPlace for menders & overdrives (#4831) 2021-03-01 13:02:27 -05:00
Anuken
72aa87128e Merge remote-tracking branch 'origin/master' 2021-03-01 11:58:59 -05:00
Anuken
8f91576f85 Fixed script loading for Turkish locale 2021-03-01 11:58:53 -05:00
Patrick 'Quezler' Mounier
4019c49fff Log who skipped the wave to the console (#4825) 2021-03-01 09:47:23 -05:00
Anuken
5f83c92829 Fixed #4824 / Fixed #4827 / Fixed #4829 2021-03-01 09:45:40 -05:00
Anuken
4c9cda7e40 Cleanup 2021-02-28 17:33:08 -05:00
Sunny Kim
01f7b1c9a6 New overdrive visuals for colorblind users (#4807) 2021-02-28 17:32:28 -05:00
Anuken
1a30edc55f Merge remote-tracking branch 'origin/master' 2021-02-28 17:17:08 -05:00
Anuken
49bccffd7c Link previews for power blocks near nodes 2021-02-28 17:17:03 -05:00
Patrick 'Quezler' Mounier
526157a514 Draw to-be affected blocks when placing projectors (#4818) 2021-02-28 13:58:06 -05:00
FiliusPatris
d025ba63e1 Display map names with underscores (#4819)
This makes it obvious how to specify map names with spaces. It also
allows for copy-pasting form the output of `maps`.
2021-02-28 13:27:47 -05:00
genNAowl
662515ce2e Make RepairPoints implement Ranged (#4813)
Co-authored-by: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com>
2021-02-28 09:19:35 -05:00
Joshua Fan
c55ff4ad5e Desktop double-click mining: fix click on mined tile to cancel (#4815) 2021-02-28 09:19:27 -05:00
Anuken
666c0f3582 Merge remote-tracking branch 'origin/master' 2021-02-27 15:10:39 -05:00
Anuken
0c00760ae0 Fixed result duplication in logic UI 2021-02-27 15:10:34 -05:00
Patrick 'Quezler' Mounier
2146b35e5a eacho ther (#4810)
* eacho ther

* Update Tile.java
2021-02-27 10:21:11 -05:00
Anuken
44d10a355e Improved power node link preview check 2021-02-27 10:16:54 -05:00
buthed010203
5037c4e00e Fix a few issues w/ double tap mining (#4798)
Currently, double tap mining consumes clicks so it prevents the player from configuring any block if they click twice within 500ms. The double tap mining was also using the `selected` var which could have been null causing a crash. This is a very messy solution but it does the job good enough
2021-02-27 10:12:00 -05:00
buthed010203
e4ecfc4ee7 Fixed #4791 since it is 100% a bug (#4801)
* Fixed #4719 since it is 100% a bug

This fix is somewhat janky as it checks if the rotation matches the exact original rotation but the likelihood of someone needing bridges along a belt rotated 1 or -1 times is super low. https://aethex.is-a.fail/t13ETd.webm

* unjank rotation

* fix potential crash, styling

* Use mathf.mod
2021-02-26 19:06:27 -05:00
Anuken
ae6be1db3b UnitSpawnAbility 'type' field JSON compat / Fixed health bar out of bounds 2021-02-26 18:51:14 -05:00
Anuken
d06eee99ba Merge remote-tracking branch 'origin/master' 2021-02-26 13:13:41 -05:00
Anuken
8349c8a5b8 Fixed #4802 2021-02-26 13:13:37 -05:00
Darkness6030
2df7484649 Add servers to global list (#4761)
* Add servers to global list
2021-02-26 11:13:51 -05:00
Anuken
1bb97cae39 Fixed #4792 2021-02-25 18:34:24 -05:00
Anuken
f5ac3ff7b0 null controller for dead units 2021-02-25 10:54:05 -05:00
Anuken
f6eba3edae Synchronized settings / Dead units sense as non-controlled 2021-02-25 09:12:17 -05:00
Joshua Fan
781410ea04 Double-tap to mine, tap anywhere to cancel (#4469)
* Double-tap to mine, tap anywhere to cancel

* Make comment consistent

* Remove desktop left-click mining cancel, prioritize mobile unit control over mining

* Mobile: double-tap doesn't configure blocks if unit was double-tapped; control unit detected in first tap of double-tap

* Add 'double-tap to mine' setting (default off)

* Desktop: cancel mining when mined tile is clicked

* Comment typo

* Prevent redundant condition check

* Cleanup

Co-authored-by: Anuken <arnukren@gmail.com>
2021-02-25 08:43:40 -05:00
Anuken
c0d9712beb Fixed #4784 2021-02-25 08:39:35 -05:00
Anuken
0672878920 Fixed #4781 2021-02-24 15:27:22 -05:00
Anuken
b0cdac59f0 Merge remote-tracking branch 'origin/master' 2021-02-24 15:01:48 -05:00
Anuken
4b6a83dd82 Improved auto-bridging with conveyors 2021-02-24 15:01:44 -05:00
Minxyzgo
25ae7b97aa schematic uses camera position (#4775)
* Update InputHandler.java

* Update InputHandler.java

* Update MobileInput.java

* Update InputHandler.java

* Update MobileInput.java
2021-02-24 12:25:38 -05:00
Anuken
afbde49fa2 Fixed #4776 / Fixed #4772 2021-02-24 09:52:53 -05:00
Anuken
befda9baaa Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-02-23 17:07:45 -05:00
Anuken
502c7eb388 arc 2021-02-23 17:07:40 -05:00
Antsiferov Andrew
ad2a18f929 Fix player.locale to be default (#4768)
* fix player.locale == default

* Update NetClient.java
2021-02-23 14:53:23 -05:00
Anuken
830eb86a0f Better power node linking visualization 2021-02-23 12:53:43 -05:00
Anuken
e5413cebdc Fixed #4766 2021-02-23 11:29:51 -05:00
Anuken
1a75951840 Merge remote-tracking branch 'origin/master' 2021-02-23 10:47:58 -05:00
Anuken
08e36aca98 Crafter progress modulo / Segment buff 2021-02-23 10:47:54 -05:00
Patrick 'Quezler' Mounier
aabbfd624a Add disarmed status effect that disarms (#4762)
* Add disarmed status effect that disarms

* Update core/src/mindustry/entities/comp/StatusComp.java

Co-authored-by: Anuken <arnukren@gmail.com>

* Rename disarms -> disarm

Co-authored-by: Anuken <arnukren@gmail.com>
2021-02-23 09:51:43 -05:00
Anuken
2f836d779a Update servers_v6.json 2021-02-22 10:22:28 -05:00
Anuken
d7f848f8cd contXXXXX constants -> ctrl 2021-02-22 10:18:42 -05:00
Anuken
6f7f980563 Merge remote-tracking branch 'origin/master' 2021-02-22 10:15:43 -05:00
Anuken
e2515fc4bf Automatic conveyor/conduit bridging 2021-02-22 10:15:40 -05:00
UnCaughT
d06a7bb7a2 Update servers_v6.json (#4756)
The server now has a new domain.
2021-02-22 10:09:55 -05:00
Sharlotte
dbdfdac94b translated yesterday update (#4755)
* translated newest bundle updates
* ps. why did i forgot 1ef7ae7079 (diff-5e346bcec4e8e1d545e035b1e438472bc51937398ac3e8e81308605ec82aea2c) this commit previous translation update?
2021-02-22 09:19:46 -05:00
Anuken
3b2a0cfd66 Removed RCR due to lack of moderation 2021-02-22 09:05:27 -05:00
Anuken
5b652ae51f Added guidelines for inappropriate server content 2021-02-22 09:04:22 -05:00
Anuken
9e8a2b8296 Minor bridge linking fix 2021-02-21 20:07:20 -05:00
Anuken
e6787c5146 Controlled sensor improvements 2021-02-21 12:28:00 -05:00
Anuken
d8552915f7 Cleanup 2021-02-21 10:35:33 -05:00
Anuken
61d9dea487 Logic config replication / logicUnitBuild rule / Copy-able ConstructBlocks 2021-02-21 10:23:46 -05:00
Anuken
02d8f679b5 Merge remote-tracking branch 'origin/master' 2021-02-21 09:22:05 -05:00
Anuken
544828d9fb Logic controller & dead`` sensors 2021-02-21 09:22:02 -05:00
liuxilu
ca726d579e unit boosting sensor (#4738) 2021-02-21 09:20:36 -05:00
Anuken
8257fb5e11 Merge remote-tracking branch 'origin/master' 2021-02-21 08:54:10 -05:00
Anuken
0d287e6d59 Water Extractor: Use metaglass to be consistent with pumps 2021-02-21 08:53:47 -05:00
Patrick 'Quezler' Mounier
4d9dc66a96 Remove stray spaces from accelerator (#4465) 2021-02-20 12:52:56 -05:00
Patrick 'Quezler' Mounier
868d4e05f7 Move update function of resupply point 5x1 spaces back (#4746) 2021-02-20 12:51:12 -05:00
Anuken
a3bf39d86b Minor cleanup 2021-02-20 10:08:15 -05:00
Sharlotte
d76795e0ae translated recent update (#4742) 2021-02-20 10:07:29 -05:00
Ngọc Lam
a2e075ee54 Update Vietnamese Translation. (#4660)
* Update translation, fix some typo

* About 150 lines to do left.

* Typos fix #_1

* Typos fix + add trans

* Update to lastest commit.

* Base logic translation.

* a lot of typo ...

* some update from main bundle.

* Add more logic hint.
2021-02-20 10:07:19 -05:00
Anuken
2df2a0971a arc 2021-02-20 09:49:49 -05:00
Anuken
158e23bd5e Steam icon changes 2021-02-19 19:43:37 -05:00
Anuken
467402ef73 Various fixes 2021-02-19 19:20:04 -05:00
Anuken
f78719afc0 Fixed mod crash disable setting name 2021-02-19 19:10:27 -05:00
Antsiferov Andrew
e6513702d6 [Bundle][RU] actual L10n (#4726)
* 3 new, 1 deleted

New:
rules.unitcapvariable
rules.unitcap
laccess.color

Deleted:
lenum.color

* 1 line changed

rules.unitcap

Co-authored-by: Vanguard <55051135+XEN0PHIL@users.noreply.github.com>
2021-02-19 18:33:43 -05:00
Arnyyx
aeddf7014c Update bundle_vi.properties (#4724) 2021-02-19 18:32:52 -05:00
Catchears
1613f49c16 german translation for build 125, full android translation (#4703)
* update german translation to 631e4d9eef

* update android translation to e816f6110d

with regard to 5ec5f1aa93

* improve translation with ideas from others

* update german steam discription to e86a3e9d09

* update german translation to 1ef7ae7079 (diff-5e346bcec4e8e1d545e035b1e438472bc51937398ac3e8e81308605ec82aea2c)

* changes from stuffyAI

* cross-platform as suggested by stuffyAI

* stuffyAI

genau, hast recht

Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>

Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>
2021-02-19 18:32:44 -05:00
彭瑞暄
57a833c2fb Update Logic Draw Hints (#4734)
Wrapped up some previous logic hints, too.
2021-02-19 18:32:32 -05:00
BlueThecno
6de53343a4 Fixing typos and descriptions [bundle_es.properties] (#4727)
* Fixing and descriptions [bundle_es.properties]

* Forgot something
2021-02-19 18:32:17 -05:00
YellOw139
7bb4b09308 [Bundle][RO] Update (#4725)
* [Bundle][RO] Update

This PR was tested in-game and is ready to merge at any time.

Changelog:

- New strings/changes up to commit 1ef7ae7079
- Typo fixes & various other improvements

* Reducing confusion

* Update bundle_ro.properties
2021-02-19 18:32:07 -05:00
Anuken
68020fa7d4 Fixed "fix" in #4397 2021-02-19 18:31:34 -05:00
Phinner
b94aba0301 Fixing remaining typos\errors in bundle_fr (#4397)
* Fixing remaining typos errors in bundle_fr

There are some errors that had managed to get through the verification. Imma chase them down!

* added logic hints and some typo fixes

* Fixing 2 typos in bundle.properties

L1548: Color statement affects every following draw operations.

* smolfixes
2021-02-19 18:30:49 -05:00
Anuken
0316009a9c Balance tweaks 2021-02-19 18:28:51 -05:00
Anuken
820f7f0ef2 arc 2021-02-19 17:25:37 -05:00
Anuken
6d105ad3e7 Merge remote-tracking branch 'origin/master' 2021-02-19 17:18:23 -05:00
Anuken
f043a5f340 Logic tooltips on mobile devices w/ long-press 2021-02-19 17:18:17 -05:00
CxZxRainzz
73d6f95d2e Update servers_v6.json (#4735)
add 1 more server for CxZx
2021-02-19 17:11:51 -05:00
Fatonndev
fb48070388 Add Survival and PvP servers (#4736) 2021-02-19 17:04:48 -05:00
Anuken
fa7697fc40 Better JSON null validation / Disable mods on startup crash 2021-02-19 13:28:31 -05:00
Anuken
b46a5c0bda Allow JSON mod content types from other class loaders 2021-02-19 09:45:51 -05:00
Anuken
1072c310ad Fixed #4732 2021-02-19 09:04:13 -05:00
Anuken
d5448b59a2 Fixed UnitReq parsing 2021-02-18 21:07:48 -05:00
Anuken
78317e6126 Uncap content names in resolution 2021-02-18 20:15:46 -05:00
Anuken
5a58f9c71a Fixed #4729 2021-02-18 17:00:23 -05:00
Anuken
06b8dd61c7 Better splash damage handling for small radii 2021-02-18 15:02:09 -05:00
Anuken
a81b5778a0 Merge remote-tracking branch 'origin/master' 2021-02-18 13:11:37 -05:00
Anuken
a7188c4884 Content parser class discovery improvements 2021-02-18 13:11:20 -05:00
buthed010203
0bf0d48a02 Make status colors the same (#4719)
It bothers me ok
2021-02-18 10:24:52 -05:00
buthed010203
dc5cd196ed Use github build status (#4718)
Why does this still use travis? It was ditched months ago
2021-02-17 19:44:04 -05:00
Anuken
f8f9bf228b Merge remote-tracking branch 'origin/master' 2021-02-17 17:12:36 -05:00
Anuken
d0dc1ea132 Fixed #4715 2021-02-17 17:12:32 -05:00
RebornTrack970
ff9fad6a2c One last server for the Omega (#4714)
* One last server for the Omega

Added the Annexation server from the OmegaHub to the list as it is the final server people actualy play on.

* Update servers_v6.json

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>

Co-authored-by: Anuken <arnukren@gmail.com>
Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>
2021-02-17 11:05:16 -05:00
Anuken
76dbdb59ce Draw cells for unit payloads 2021-02-17 11:02:49 -05:00
Anuken
0013402962 Merge remote-tracking branch 'origin/master' 2021-02-17 09:49:08 -05:00
Anuken
1ef7ae7079 Logic hints for draw operations 2021-02-17 09:49:01 -05:00
buthed010203
07a39d0da8 V6 servers arent BE last i checked (#4713)
This has been bothering me the last few days and i assumed someone else would fix it and i wouldnt have to make a pr for something so tiny but here i am
2021-02-17 09:36:31 -05:00
Anuken
b8bfb30c56 Merge remote-tracking branch 'origin/master' 2021-02-17 09:15:21 -05:00
Anuken
00342ddaae Misc cleanup 2021-02-17 09:15:17 -05:00
Sharlotte
fb40c0b9de cursed typo (#4705)
cursed typocursed typocursed typocursed typocursed typocursed typocursed typocursed typo
2021-02-17 09:12:49 -05:00
Patrick 'Quezler' Mounier
5d9506eb12 Reshuffle nydus servers (#4708) 2021-02-17 09:12:20 -05:00
Anuken
080fe8c3c4 Decreased impact reactor explosion radius 2021-02-16 15:54:20 -05:00
Anuken
48745d7380 Steam crash fix 2021-02-16 13:40:34 -05:00
YellOw139
41b50d67af [Bundle][RO] Update (#4696)
This PR was tested in-game and is ready to merge at any time.

Changelog:

- New strings/changes up to commit 631e4d9eef
- Typo fixes & various other improvements
2021-02-16 13:12:29 -05:00
Vanguard
b65dffca9d 4 new, 1 changed (#4688)
New:
enablebuilding
stat.armor
setting.logichints.name
(newline between radar.output and unitradar.target)

Changed:
lenum.turret
2021-02-16 13:12:17 -05:00
Sharlotte
66bdfcf877 [KO] Update bundles again (#4695)
*translated updated new logic hint
*translated new rule
*typo
2021-02-16 13:12:06 -05:00
Anuken
b0082c92c5 Fixed green line bug - Removed stencil+depth buffers 2021-02-16 13:02:15 -05:00
Anuken
fdd1c01ac3 Merge remote-tracking branch 'origin/master' 2021-02-16 12:20:37 -05:00
Anuken
1ffdd9fd99 Fixed #4701 2021-02-16 12:20:30 -05:00
Patrick 'Quezler' Mounier
f64ad2db9f Remove another dead server (#4699) 2021-02-16 11:46:51 -05:00
Anuken
7bfe9bf914 Merge remote-tracking branch 'origin/master' 2021-02-16 10:57:32 -05:00
Anuken
214f3bb9b5 Improved data file zipping 2021-02-16 10:57:20 -05:00
키에르
3f51149883 Remove dead server (#4669) 2021-02-16 09:50:52 -05:00
Anuken
2c368953f9 Merge remote-tracking branch 'origin/master' 2021-02-16 09:13:49 -05:00
Anuken
9d5454e5ce Fixed #4694 2021-02-16 09:13:44 -05:00
TranquillyUnpleasant
631e4d9eef Unit cap (#4689)
* Add unit caps as a map setting.

* Use int and add maximum and minimum handling.

* Put a lower limit of 0 for unit cap
2021-02-15 20:15:56 -05:00
Anuken
957583071d Splash damage tweaks 2021-02-15 18:42:24 -05:00
Anuken
c942331117 New splash damage algorithm 2021-02-15 18:00:47 -05:00
Anuken
710a55dc2d Reverted pixmap blending rename 2021-02-15 11:08:56 -05:00
Anuken
4bbb4b9a19 Reorder NaN check 2021-02-15 11:00:49 -05:00
彭瑞暄
a2e5dae27f Updated zh-TW translations of Logic Hints (#4666)
* Logic Hint pt.1

Some Logic Hints and minor tweaks in previous translations

* Logic Hints pt.2

* Logic Hints pt. 3/3
2021-02-15 10:46:19 -05:00
YellOw139
d5645b8a7b [Bundle][RO] Update (#4631)
* [Bundle][RO][124.1] Update

This PR was tested in-game and is ready to merge at any time.

Changelog:
- New strings/changes up to commit 64acd6c1e4
- Fixed ancient mod-related bundles not fitting the new install button
- Typo fixes & various other improvements

* Logic tooltips - initial English commit

* Block flags

* Romanian logic hints

* polishing

* Since when is this missing

* Polishing
2021-02-15 10:43:34 -05:00
Sharlotte
a9f9946a39 [KO] TYPO (#4665)
* [KO] i got typo!

* typo
2021-02-15 10:42:28 -05:00
Antsiferov Andrew
561deacce4 [Bundle][RU] Logic Popups L10n (#4677)
* Logic popups

* Block flag documentation

* Распознование -> Распознавание (@Prosta4okua)

* Сбрсывание -> Сбрасывание (@XEN0PHIL)

* нахдиться -> находиться (@XEN0PHIL)

* распознования -> распознавания (@XEN0PHIL)

* распознования -> распознавания (@XEN0PHIL)

* распозновать -> распознавать (@XEN0PHIL)

* распознования -> распознавания (@XEN0PHIL)

* Включен -> Включён (@XEN0PHIL)

* - -> - (@XEN0PHIL)

* lst.unitradar (@XEN0PHIL)

* единиц -> единицы (@XEN0PHIL)
2021-02-15 10:42:01 -05:00
Joshua Fan
e528e35e06 Add sector icon picker back button (#4682) 2021-02-15 10:41:56 -05:00
Anuken
af39d6a6ee Fixed #4685 2021-02-15 10:37:24 -05:00
Patrick 'Quezler' Mounier
7a21c02476 Makes the top sprite visible on liquid turret icons (#4683)
* Add top region to liquid turret icons

* Attempt to change outline icon generation

* Draw regions above the outlined icon over it

* Draw regions **above** the outlined icon over it

* Add clarrifying comment

* Implement backwards compatibility for mods

* an -> any
2021-02-15 09:32:46 -05:00
Patrick 'Quezler' Mounier
557e5710cd Fixes BuilderAI & RepairAI retreat nullpointers (#4681)
* Update BuilderAI.java

* Update RepairAI.java
2021-02-15 09:31:27 -05:00
Anuken
fa52255d04 Fixed #4680 2021-02-15 09:30:57 -05:00
Anuken
e16622afcc Automatic retreat AI for builders/repair units 2021-02-14 20:44:40 -05:00
Anuken
f2468f0b3d Cleanup of #4678 2021-02-14 19:14:02 -05:00
Anuken
30c9231df6 Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-02-14 19:02:55 -05:00
Joshua Fan
7532aadaf8 Add enable building hint, combine building and respawn hints (#4678) 2021-02-14 19:02:28 -05:00
Anuken
3d226246b9 Labyrinth core fix 2021-02-14 09:15:12 -05:00
Skin
d6c852a082 remove-pandorum (#4676)
Good luck!
2021-02-14 08:54:25 -05:00
Anuken
07a27e913c Added UnitBuild transition class 2021-02-14 08:47:53 -05:00
Anuken
092d152bdc Force-link effect classes on iOS 2021-02-13 18:24:22 -05:00
Anuken
8b756d221b Un-broke scripts 2021-02-13 16:28:49 -05:00
Anuken
f33d684dce Merge remote-tracking branch 'origin/master' 2021-02-13 11:56:44 -05:00
Anuken
56e41309b1 Updated global script 2021-02-13 11:56:40 -05:00
RebornTrack970
91b24433b9 Added the 2R2T and Rush server to Omega. (#4667) 2021-02-13 10:37:44 -05:00
Anuken
9050937900 Name cleanup 2021-02-12 19:40:29 -05:00
Anuken
2e6b90d4d5 Serializable -> JsonSerializable 2021-02-12 15:41:28 -05:00
Anuken
146b2589e2 Fixed rare network error 2021-02-12 14:54:10 -05:00
Anuken
abd07e1525 Fixed chat not working while paused 2021-02-12 12:55:31 -05:00
Anuken
541da5c0c9 Block flag documentation & cleanup 2021-02-12 09:09:10 -05:00
Anuken
21f642ad0c Merge remote-tracking branch 'origin/master' 2021-02-12 08:56:44 -05:00
Anuken
0d084d380d Fixed map resize not preserving links 2021-02-12 08:56:40 -05:00
Sharlotte
0fe158d080 [KO] i got typo! (#4662)
* [KO] i got typo!

* typo
2021-02-12 08:42:35 -05:00
Anuken
0cc64c6a8d Fixed #4658 2021-02-12 08:41:36 -05:00
Anuken
cd684996e1 Cleanup & Steam crash fix 2021-02-11 16:31:44 -05:00
Anuken
0350e6bbf4 Validate teams with power links 2021-02-11 12:03:11 -05:00
Anuken
4fe5972d89 Merge remote-tracking branch 'origin/master' 2021-02-11 10:12:17 -05:00
Anuken
27c8efc672 Better targeting range calculation 2021-02-11 10:12:07 -05:00
Catchears
aef0faf79c update german translation to include logic hints (#4654)
* update german bundle to "force projector heat issues"

ea2b57ec4b
ea2b57ec4b

* Gebäude -> Block to prevent confusion
2021-02-11 10:01:03 -05:00
Sharlotte
ea7d1dd91e [KO] UPDATED KO Translation (#4656)
* translated all without logic hint

* typo typo typo typo everywhere typo oh hi typo

* Update logic hint

* typo

* translated changed android description

* android changelog
2021-02-11 09:55:02 -05:00
Anuken
ea2b57ec4b Force projector heat sense 2021-02-10 14:42:30 -05:00
Anuken
949f5eccd7 Damage distance check fix 2021-02-10 09:46:30 -05:00
키에르
e525d89e43 Add missing properties (#4649)
* Add missing properties

* oh no formatting
2021-02-10 09:37:47 -05:00
Patrick 'Quezler' Mounier
6498ce3c4f Remove double indentation of the io server group (#4650) 2021-02-10 09:21:21 -05:00
MEEP of Faith
cbf30c599b If a building and unit are found within the line, target the closer one. (#4646) 2021-02-10 09:16:49 -05:00
Anuken
54c406f83d Cleanup 2021-02-09 18:28:11 -05:00
Anuken
7b2957ab41 More logic tooltips 2021-02-09 15:04:50 -05:00
Anuken
e22fccf5b1 Logic hint tooltips 2021-02-09 14:52:23 -05:00
Anuken
ce8b32f022 Merge remote-tracking branch 'origin/master' 2021-02-09 12:10:22 -05:00
Anuken
0d0aef3dea Logic layout bugfixes 2021-02-09 12:10:15 -05:00
MEEP of Faith
386da22f6e remove space in perShot (#4640) 2021-02-09 09:52:00 -05:00
SachaTending
f76b514892 Update servers_v6.json (#4615)
Add RCR
2021-02-09 09:44:01 -05:00
Anuken
77dc959e4a Merge remote-tracking branch 'origin/master' 2021-02-09 09:35:03 -05:00
Anuken
a99151441c Fixed #4642 / Logic op reorganization 2021-02-09 09:34:58 -05:00
buthed010203
852b0a97fe 60 * 60 > Time.toMinutes (#4634)
It already exists in other places in the code, doesn't make sense to not use it.
2021-02-08 16:49:14 -05:00
Anuken
38843c25fb Merge remote-tracking branch 'origin/master' 2021-02-08 16:44:22 -05:00
Anuken
ce2750ba60 Rail bullet fix 2021-02-08 16:29:41 -05:00
Fatonndev
1d3dbddaef add player.locale (#4633) 2021-02-08 15:26:48 -05:00
Anuken
d8177daada Merge remote-tracking branch 'origin/master' 2021-02-08 14:55:18 -05:00
Anuken
3cbcd779eb Better strict equality implementation 2021-02-08 14:55:14 -05:00
Nexort23
33fc36a2d4 hub minplay.ru (#4600)
* hub minplay.ru
2021-02-08 14:52:11 -05:00
Anuken
c06146110d Better bullet homing (#4630) 2021-02-08 13:03:08 -05:00
Anuken
1802aab683 isNull op / Return null for null block sense/NaNs 2021-02-08 12:48:39 -05:00
Anuken
49fe47f1f8 Comment fix 2021-02-08 12:23:56 -05:00
Anuken
a13c9d0761 Fixed F-Droid build string not updating on deploy 2021-02-08 10:58:05 -05:00
Anuken
3d8479355c Fixed random key 2021-02-08 10:45:08 -05:00
MEEP of Faith
86c702861e Remove NullPointerExeption error (#4624) 2021-02-08 10:44:08 -05:00
CxZxRainzz
47ec13eef4 Update servers_v6.json (#4628)
Add CxZx
2021-02-08 10:39:41 -05:00
Anuken
d8cd0d867c Merge remote-tracking branch 'origin/master' 2021-02-08 10:37:09 -05:00
Anuken
d5ede6b1bb Un-blacklisted arc.net 2021-02-08 10:37:06 -05:00
키에르
fd931564aa Add sources jar (#4612)
* Add sources jar

* Update build.gradle

* Fix classes not found

* :core

* formatting

Co-authored-by: Anuken <arnukren@gmail.com>
2021-02-08 09:59:11 -05:00
Anuken
6b19178a13 Fixed #4620 2021-02-08 09:52:41 -05:00
Anuken
64acd6c1e4 Merge remote-tracking branch 'origin/master' 2021-02-08 09:42:57 -05:00
Anuken
560914bebe Added more unit stats to database 2021-02-08 09:42:49 -05:00
Anuken
2edec90dfb Cleanup 2021-02-08 09:25:46 -05:00
Catchears
10c1305eae update german translation for build 124 (#4618)
* update german translation for build 124

* shorten text to fit on the button without newline
2021-02-07 17:16:56 -05:00
Joshua Fan
852c98f004 "[E] to enable building" hint while building is paused (#3857)
* Show building hints while building is paused

* Add hint: [E] to enable building

* Remove .left()

* Fix build enable hint display inconsistencies when changing build auto-pause setting

* Combine building hint tables

* Fix indentation
2021-02-07 16:58:42 -05:00
Patrick 'Quezler' Mounier
292f771eb1 Draws team regions during schematic placement (#4588)
* Draw team regions during schematic placement

* Fall back to sharded for headless

* Only draw team regions if the schematic is in-world

This seems better than `player != null && req.worldContext` since it wouldn't really result in any visual changes but saves some draw operations.

* This seems cleaner

Although the order of the 1st and 2nd if argument is debatable for performance reasons.
2021-02-07 13:27:09 -05:00
Anuken
1acc771edc 'Fixed' some iOS warnings 2021-02-07 13:08:10 -05:00
Anuken
ee61d0dcfa Cleanup 2021-02-07 13:01:30 -05:00
Anuken
e5f2073de2 Minor unit balance tweaks 2021-02-07 12:49:26 -05:00
Anuken
816be9e9bd Force projector visual cleanup 2021-02-07 12:38:24 -05:00
Sunny Kim
2107af1f0f Force projection disappearing visuals (#4504)
* forceShrink

* forceShrink

* more quicker to tell it apart from a shield down
2021-02-07 12:36:29 -05:00
MEEP of Faith
3bb85b4bda Custom shadow offset (#4472) 2021-02-07 12:34:54 -05:00
YellOw139
e86a3e9d09 [Bundle][RO][Ready-for-Stable] Translation & metadata update + minor fix (#4409)
* #3958 hotfix

* update Romanian Steam desc count

* Create title.txt

* Add files via upload

* Sorter gates

* charge

* Polishing

* More mod browser
2021-02-07 12:33:51 -05:00
Szczepan Zalega
957426c27f Fix some typos in Polish translation (#4411)
* Fix some typos in Polish translation

* Update bundle_pl.properties

(fixup)
2021-02-07 12:33:45 -05:00
Vanguard
8bc90a19d2 [bundle] update bundle_ru.properties (#4477)
* 1 line changed

- noname

* 1 line changed

- hint.placeTurret

* 3 new lines

- servers.disclaimer
- hint.coreUpgrade
- hint.presetLaunch

----
NOTE from Felix Corvus (@Remint32)

This commit and PR are the last ones I made to the repository.
I want to sincerely thank the people I worked with to enhance the game and translate it into Russian.

I want to thank you separately:
Prosta4ok_ua (@Prosta4okua), Vanguard (@XEN0PHIL), BasedUser (@BasedUser), Summet (@summetdev), Anuke (@Anuken), The_Slaylord (@TheSlaylord), Lonely_Ymomfe (@ymomfe), and XZimur (@XZimur)

* 5 changed lines; 2 new lines

Changed:
globalitems
sector.extractionOutpost.description
hint.launch
hint.launch.mobile
hint.presetLaunch

New:
hint.coreIncinerate
hint.coopCampaign

* 2 changed line

hint.coopCampaign
item.spore-pod.details
-
В споровом стручке всё же множественное число в описании, говорится про сами споры. THEY EMIT - они выделяют, IT EMITS - он выделяет.

* 2 changed lines

hint.coreIncinerate
block.interplanetary-accelerator.description

* 3 new line; 1 changed line

New:
setting.showweather.name
link.bug.description
rules.weather.always

Changed:
keybinds.mobile

* 4 new lines; 1 changed line; 1 deleted line

New:
public.confirm.really
bullet.buildingdamage
stat.ammouse
unit.pershot

Changed:
bullet.knockback

Deleted:
bar.limitreached

* Update bundle_ru.properties

падежи

* Update bundle_ru.properties

мелочи

* 1 changed line

stat.ammouse

* 1 new line

none.found

* 6 changed; 1 deleted

Changed:
mod.featured.dialog.title
mods.browser.add
mods.github.open
mod.import.github
mod.jarwarn
mods.guide

Deleted:
mod.featured.title

* 2 changed lines

link.bug.description
mod.scripts.disable

* Update achievements.vdf

* Update description.txt

* 1 changed line

item.thorium.description

* 1 new line

rules.coreincinerates

* 1 new line

bar.boost

* 1 new line

max

* Update bundle_ru.properties

* Update bundle_ru.properties

* rip v3.5 maps

* Update bundle_ru.properties

* Update bundle_ru.properties

* Update bundle_ru.properties

* Prosta4ok obnovi repository

* взлЁт

* 3 new lines

mods.browser.sortdate
mods.browser.sortstars
stat.charge

* Update description.txt

* Update description.txt

* 3 changed, 3 new, 1 deleted

Changed:
mods.browser.sortdate
unit.sei.description
unit.risso.description

New:
mods.browser.reinstall
mods.viewcontent
mods.browser

Deleted:
mod.featured.dialog.title

* 1 line changed

mods.github.open
-
"Репо" is not commonly used and "Репозиторий" does not fit in the button

* 1 new line

mod.installed

Co-authored-by: Felix Corvus <remint32@yandex.ru>
Co-authored-by: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com>
Co-authored-by: Antsiferov Andrew <summet.dev@gmail.com>
2021-02-07 12:33:18 -05:00
Prosta4okua
668144cf2a [Bundle]Update bundle_uk_UA.properties (#4434)
* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties
2021-02-07 12:32:57 -05:00
Anuken
c5ed056601 Removed unused fx 2021-02-07 12:12:15 -05:00
Anuken
ea9d415b92 iOS inset rotation fix 2021-02-07 11:43:34 -05:00
Anuken
c181204700 Fixed mod descriptions going off-screen 2021-02-07 10:44:45 -05:00
Anuken
ca78cb1a3f Fixed #4616 2021-02-07 10:21:38 -05:00
Anuken
fdafa0933f Mod browser layout tweaks 2021-02-07 10:04:46 -05:00
Anuken
ae92813169 Merge remote-tracking branch 'origin/master' 2021-02-07 09:50:37 -05:00
Anuken
8a248dc787 Mod browser layout fixes 2021-02-07 09:50:33 -05:00
Leonid Skorospelov
f90f611a6d plastanium-wall-large schematicPriority should also be 10 (#4613)
plastanium-wall has it, makes sense to put for large one as well
2021-02-07 09:14:19 -05:00
Xasmedy
1c0d148607 Removed same if statement. (#4607)
Removed an if statement that was the same of the one up.
2021-02-06 18:13:48 -05:00
Anuken
95c8b7ae60 Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-02-06 12:06:03 -05:00
Anuken
25d013b768 Mod browser icon support 2021-02-06 12:05:59 -05:00
Patrick 'Quezler' Mounier
9de8c4d8ac Update servers_be.json (#4602) 2021-02-06 09:09:56 -05:00
Anuken
7e4ffe6a7d Fixed builds failing without Android project 2021-02-06 08:43:15 -05:00
Anuken
b90372a226 Testing bloom on iOS 2021-02-06 08:37:02 -05:00
Anuken
9adbfcac0f Re-added jcenter repo 2021-02-05 14:11:52 -05:00
Anuken
d1eb7743ad Better mod browser horizontal layout 2021-02-05 12:12:08 -05:00
Anuken
fc3352bcb1 Java mod import support / Moved mod browser button 2021-02-05 11:21:27 -05:00
Anuken
9b3360d932 Mod content lists 2021-02-04 21:02:57 -05:00
Anuken
3784bfac77 Allow mod re-import / Save mod repo on import 2021-02-04 19:30:52 -05:00
Anuken
54754cd177 Don't reset processors when links change 2021-02-04 18:19:56 -05:00
Anuken
c48034e420 Merge remote-tracking branch 'origin/master' 2021-02-04 14:12:07 -05:00
Anuken
3299279c89 Removed jcenter repositories 2021-02-04 14:12:03 -05:00
Patrick 'Quezler' Mounier
a6c3ebc467 Save rotation of repair points (#4586) 2021-02-04 10:23:17 -05:00
Anuken
9f510f61c7 Fixed #4584 2021-02-04 09:25:52 -05:00
Anuken
3ae48b8753 Merge remote-tracking branch 'origin/master' 2021-02-03 19:17:14 -05:00
Anuken
f41725b8dc Minimap unit rendering fix 2021-02-03 19:17:07 -05:00
Fatonndev
115df3aedd Add obvilionnetwork.ru Recapture and Attack servers (#4582)
* Add obvilionnetwork.ru Recapture and Attack servers

* Update servers_v6.json

* Update servers_v6.json
2021-02-03 17:04:55 -05:00
buthed010203
3c136ad0ba add transportation group to container and vault (#4499)
this allows for them to be placed over belts so that people no longer have to clear an area around the core when placing vaults around it.
2021-02-02 15:32:52 -05:00
Patrick 'Quezler' Mounier
48ee3d255d Make timescale accessible to logic (#4503) 2021-02-02 15:20:36 -05:00
QmelZ
b05f867800 add rotation to ParticleEffect (#4501)
* add rotation to ParticleEffect

* add offset
2021-02-02 13:14:47 -05:00
Anuken
55b790a0d4 Merge remote-tracking branch 'origin/master' 2021-02-02 13:13:45 -05:00
Anuken
57f6c9dfd9 Mech rebalancing 2021-02-02 13:13:38 -05:00
Nikopol
2f9c95afd0 Moving server to C.A.M.S. (#4497)
NikoCHIO now in C.A.M.S.
2021-02-02 09:22:54 -05:00
彭瑞暄
4fe1457d96 Updated zh-TW translations (#4449)
* Update bundle_zh_TW.properties

mod sorting & charge

* Changed "Charge"

A better translation came to mind
2021-02-01 09:29:03 -05:00
Folker
2589a27cb5 Create FileTreeInitEvent (#4489)
* filetree init event

* actions do your thing
2021-02-01 09:27:24 -05:00
Anuken
8704e14fd7 Fixed #4493 / Fixed #4492 / Fixed #4490 2021-02-01 09:24:39 -05:00
Anuken
2b17dbe390 #4487 but properly implemented 2021-01-31 19:44:29 -05:00
Anuken
919012608a Merge remote-tracking branch 'origin/master' 2021-01-31 16:35:17 -05:00
Anuken
5675a5b035 F 2021-01-31 16:35:13 -05:00
RebornTrack970
6724752980 Added server Omega (#4435)
* Added server Omega

This is the hub of my servers. The other ip for it is: omega.my.to:25906 but that one sometimes doesnt work.

* changed the ip to dns version

* the ip seems more useable

some devices cant seem to connet to dns.

Co-authored-by: Anuken <arnukren@gmail.com>
2021-01-31 15:58:26 -05:00
UnCaughT
0e078a9c60 Update servers_v6.json (#4452)
Русскоязычный сервер с Hex сражениями.
2021-01-31 15:57:08 -05:00
_owler_#0954
c0b1dfc55a closed. (#4481) 2021-01-31 15:52:55 -05:00
Anuken
3d201f7042 Fixed #4474 / Fixed #4475 / Fixed #4476 / Fixed #4483 2021-01-31 15:51:42 -05:00
Anuken
f1a5aae30a Merge remote-tracking branch 'origin/master' 2021-01-29 12:02:36 -05:00
Anuken
9142da2b70 Stop shooting upon crawler death 2021-01-29 12:02:31 -05:00
Vajda Simon
022c76bf45 bundle_hu.properties (#4464)
They spoke on Discord because of an incorrect translation.
2021-01-29 09:40:07 -05:00
Patrick 'Quezler' Mounier
bc6db72df0 Make fillitems fill the core to the brim (#4462)
Instead of just setting all items to the capacity of the first found core.
2021-01-29 09:38:26 -05:00
Anuken
d512aa5b21 Fixed #4463 2021-01-29 09:32:29 -05:00
Anuken
7cdf7a21fe Minor power graph optimizations 2021-01-28 12:07:50 -05:00
Anuken
9a5a6e1ce2 Merge remote-tracking branch 'origin/master' 2021-01-28 10:23:07 -05:00
Anuken
5a258d2830 Fixed #4461 2021-01-28 10:23:02 -05:00
Patrick 'Quezler' Mounier
96ee32f8ed Custom Game Underline 2: Electric Boogaloo (#4457)
* Update CustomGameDialog.java

* Remove .row() for consistensy
2021-01-28 09:06:30 -05:00
Joshua Fan
a667a94c8e Draw plastanium conveyors on conveyors layer (#4446) 2021-01-27 12:08:51 -05:00
Anuken
d0572a2a0d Merge remote-tracking branch 'origin/master' 2021-01-27 11:49:08 -05:00
Anuken
47eea79b60 Fixed #4453 / Fixed #4450 2021-01-27 11:49:04 -05:00
Patrick 'Quezler' Mounier
03b37235b3 producer -> generator (#4441) 2021-01-26 11:35:48 -05:00
Patrick 'Quezler' Mounier
6969fbb1e7 Give tsunami the extinguisher flag as well (#4442) 2021-01-26 11:31:36 -05:00
Anuken
ccc59aa61b Minor wave task tweaks 2021-01-26 10:37:36 -05:00
Anuken
c658865907 Dynamic lightning damage tweaks 2021-01-25 17:21:12 -05:00
Sunny Kim
a13d51e09a Charge stat for Item (#4392)
* Stat.discharge, discharge

* Update Items.java

* item.discharge

* full container = somewhat more than 4 full batteries

* Stat.discharge

* stat.discharge = Discharge

* Update core/src/mindustry/type/Item.java

Co-authored-by: Antsiferov Andrew <summet.dev@gmail.com>

* removed dis

* oops

* unit zap

Co-authored-by: Antsiferov Andrew <summet.dev@gmail.com>
2021-01-25 17:10:34 -05:00
Anuken
f827337259 Merge remote-tracking branch 'origin/master' 2021-01-25 16:16:45 -05:00
Anuken
b83c76f728 Improved liquid bridge throughput 2021-01-25 16:16:38 -05:00
Thomas Widyantoko
5666fd4999 new update in_ID translation (#4437)
yes
2021-01-25 14:32:35 -05:00
Anuken
5930e3c350 Cleanup 2021-01-25 12:53:27 -05:00
Anuken
4630e5b3a4 Wave spawning improvements 2021-01-25 10:28:36 -05:00
Anuken
f16990edcb Reconstructors: Accept unit dropped payload when disabled 2021-01-24 20:20:03 -05:00
FrederickDoering
13896589c2 Made disabling payload conveyors output from routers more reliable. (#4433)
Prevented reconstructors from being roughted to when disabled.

Co-authored-by: frederick_efd <frederick.doering@nordson.com>
2021-01-24 20:18:09 -05:00
Anuken
8b5cf5309a Reactive effect flag 2021-01-24 15:22:41 -05:00
Anuken
baedba0d5b Mutual status effect transitions 2021-01-24 14:20:48 -05:00
Anuken
9f926ef71e Merge remote-tracking branch 'origin/master' 2021-01-24 13:08:05 -05:00
Anuken
18a3f8bb68 Fixed #4431 2021-01-24 13:08:01 -05:00
genNAowl
623b7ada11 Let Logic Sense Range (#4425)
Co-authored-by: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com>
2021-01-24 09:23:12 -05:00
_owler_#0954
6b6d52e2fd Add new minigame (#4427)
PvP version of tower defence
2021-01-24 09:22:44 -05:00
MEEP of Faith
fc91b6b135 Colored construct (#4417) 2021-01-23 15:29:36 -05:00
Anuken
f9c33453f2 Merge remote-tracking branch 'origin/master' 2021-01-23 10:33:10 -05:00
Anuken
ad4650f408 Fixed #4420 / Fixed #4418 / Fixed #4416 2021-01-23 10:33:06 -05:00
Joshua Fan
8ca08a0f14 Make schematics build insulated blocks first, power nodes last (#4414)
* Make schematics build insulated blocks first, power nodes last

* Add schematicPriority property to sort by

* Assign schematicPriority of 10 to power diode
2021-01-23 10:28:26 -05:00
Anuken
792fdef95d Minor parse fix 2021-01-21 21:25:04 -05:00
Anuken
457514a2c8 Fixed #4407 2021-01-21 21:21:02 -05:00
Anuken
027d080c55 Fixed #4403 2021-01-21 16:10:16 -05:00
Anuken
bf8f059c25 Merge remote-tracking branch 'origin/master' 2021-01-21 14:45:51 -05:00
Anuken
a73165353f Fixed #4402 2021-01-21 14:45:43 -05:00
Nikopol
613b5a7703 Update servers_v6.json (#4401) 2021-01-21 10:54:24 -05:00
genNAowl
988791f18d Let Logic set (and read) Illuminator Color (#4374)
* illluminator color logic control

* remove sense

Co-authored-by: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com>
2021-01-21 09:30:36 -05:00
Patrick 'Quezler' Mounier
1fb608220f Make impact reactor warmup sensable as heat (#4399)
* Make impact reactor warmup sensable as heat

* Update ImpactReactor.java
2021-01-21 09:30:25 -05:00
키에르
56b87a2141 Add kr server (#4378)
* Add kr server

* Update servers_v6.json

Co-authored-by: Blockzilla101 <48705529+Blockzilla101@users.noreply.github.com>

Co-authored-by: Blockzilla101 <48705529+Blockzilla101@users.noreply.github.com>
2021-01-21 09:13:07 -05:00
238 changed files with 5954 additions and 2399 deletions

View File

@@ -17,21 +17,6 @@ jobs:
java-version: 14 java-version: 14
- name: Set env - name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Create artifacts
run: |
./gradlew desktop:dist server:dist core:javadoc -Pbuildversion=${RELEASE_VERSION:1}
- name: Update docs
run: |
cd ../
git config --global user.email "cli@github.com"
git config --global user.name "Github Actions"
git clone --depth=1 https://github.com/MindustryGame/docs.git
cp -a Mindustry/core/build/docs/javadoc/. docs/
cd docs
git add .
git commit -m "Update ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/MindustryGame/docs
cd ../Mindustry
- name: Add Arc release - name: Add Arc release
run: | run: |
git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
@@ -39,6 +24,24 @@ jobs:
git tag ${RELEASE_VERSION} git tag ${RELEASE_VERSION}
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/Arc ${RELEASE_VERSION}; git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/Arc ${RELEASE_VERSION};
cd ../Mindustry cd ../Mindustry
- name: Create artifacts
run: |
./gradlew desktop:dist server:dist core:mergedJavadoc -Pbuildversion=${RELEASE_VERSION:1}
- name: Update docs
run: |
cd ../
git config --global user.email "cli@github.com"
git config --global user.name "Github Actions"
git clone --depth=1 https://github.com/MindustryGame/docs.git
cd docs
find . -maxdepth 1 ! -name ".git" ! -name . -exec rm -r {} \;
cd ../
cp -a Mindustry/core/build/javadoc/. docs/
cd docs
git add .
git commit -m "Update ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/MindustryGame/docs
cd ../Mindustry
- name: Update F-Droid build string - name: Update F-Droid build string
run: | run: |
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
@@ -47,6 +50,7 @@ jobs:
echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt
git add . git add .
git commit -m "Updating to build ${RELEASE_VERSION:1}" git commit -m "Updating to build ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds
cd ../Mindustry cd ../Mindustry
- name: Upload client artifacts - name: Upload client artifacts
uses: svenstaro/upload-release-action@v2 uses: svenstaro/upload-release-action@v2

1
.gitignore vendored
View File

@@ -43,6 +43,7 @@ ios/robovm.properties
packr-out/ packr-out/
config/ config/
*.gif *.gif
/tests/out
/core/assets/basepartnames /core/assets/basepartnames
version.properties version.properties

View File

@@ -1,7 +1,7 @@
![Logo](core/assets-raw/sprites/ui/logo.png) ![Logo](core/assets-raw/sprites/ui/logo.png)
[![Build Status](https://travis-ci.org/Anuken/Mindustry.svg?branch=master)](https://travis-ci.org/Anuken/Mindustry) [![Build Status](https://github.com/Anuken/Mindustry/workflows/Tests/badge.svg?event=push)](https://github.com/Anuken/Mindustry/actions)
[![Discord](https://img.shields.io/discord/391020510269669376.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord)](https://discord.gg/mindustry) [![Discord](https://img.shields.io/discord/391020510269669376.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord&color=17cf48)](https://discord.gg/mindustry)
A sandbox tower defense game written in Java. A sandbox tower defense game written in Java.

View File

@@ -8,14 +8,15 @@ You may want to add your server to this list. The steps for getting this done ar
1. **Ensure your server is properly moderated.** For the most part, this applies to survival servers, but PvP servers can be affected as well. 1. **Ensure your server is properly moderated.** For the most part, this applies to survival servers, but PvP servers can be affected as well.
You'll need to either hire some moderators, or make use of (currently non-existent) anti-grief and anti-curse plugins. You'll need to either hire some moderators, or make use of (currently non-existent) anti-grief and anti-curse plugins.
*Consider enabling a rate limit:* `config messageRateLimit 2` will make it so that players can only send messages every 2 seconds, for example. *Consider enabling a rate limit:* `config messageRateLimit 2` will make it so that players can only send messages every 2 seconds, for example.
2. **Set an appropriate MOTD, name and description.** This is set with `config <name/desc/motd> <value>`. "Appropriate" means that: 2. Make sure that your server is able to handle inappropriate content - this includes NSFW display/sorter art and abusive messages. **Servers that allow such content will be removed immediately.** Consider banning display blocks if it is a problem for your server: `rules add bannedBlocks ["logic-display", "large-logic-display"]`.
3. **Set an appropriate MOTD, name and description.** This is set with `config <name/desc/motd> <value>`. "Appropriate" means that:
- Your name or description must reflect the type of server you're hosting. - Your name or description must reflect the type of server you're hosting.
Since new players may be exposed to the server list early on, put in a phrase like "Co-op survival" or "PvP" so players know what they're getting into. Yes, this is also displayed in the server mode info text, but having extra info in the name doesn't hurt. Since new players may be exposed to the server list early on, put in a phrase like "Co-op survival" or "PvP" so players know what they're getting into. Yes, this is also displayed in the server mode info text, but having extra info in the name doesn't hurt.
- Make sure players know where to refer to for server support. It should be fairly clear that the server owner is not me, but you. - Make sure players know where to refer to for server support. It should be fairly clear that the server owner is not me, but you.
- Try to be professional in your text; use common sense. - Try to be professional in your text; use common sense.
3. **Get some good maps.** *(optional, but highly recommended)*. Add some maps to your server and set the map rotation to custom-only. You can get maps from the Steam workshop by subscribing and exporting them; using the `#maps` channel on Discord is also an option. 4. **Get some good maps.** *(optional, but highly recommended)*. Add some maps to your server and set the map rotation to custom-only. You can get maps from the Steam workshop by subscribing and exporting them; using the `#maps` channel on Discord is also an option.
4. **Check your server configuration.** *(optional)* I would recommend adding a message rate limit of 1 second (`config messageRateLimit 1`), and disabling connect/disconnect messages to reduce spam (`config showConnectMessages false`). 5. **Check your server configuration.** *(optional)* I would recommend adding a message rate limit of 1 second (`config messageRateLimit 1`), and disabling connect/disconnect messages to reduce spam (`config showConnectMessages false`).
5. Finally, **submit a pull request** to add your server's IP to the list. 6. Finally, **submit a pull request** to add your server's IP to the list.
This should be fairly straightforward: Press the edit button on the [server file](https://github.com/Anuken/Mindustry/blob/master/servers_v6.json), then add a JSON object with a single key, indicating your server address. This should be fairly straightforward: Press the edit button on the [server file](https://github.com/Anuken/Mindustry/blob/master/servers_v6.json), then add a JSON object with a single key, indicating your server address.
For example, if your server address is `google.com`, you would add a comma after the last entry and insert: For example, if your server address is `google.com`, you would add a comma after the last entry and insert:
```json ```json

View File

@@ -4,7 +4,6 @@ buildscript{
mavenCentral() mavenCentral()
google() google()
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
jcenter()
} }
dependencies{ dependencies{
@@ -20,8 +19,8 @@ configurations{ natives }
repositories{ repositories{
mavenCentral() mavenCentral()
jcenter()
maven{ url "https://maven.google.com" } maven{ url "https://maven.google.com" }
jcenter() //remove later once google fixes the dependency
} }
dependencies{ dependencies{

View File

@@ -72,9 +72,8 @@ public class AndroidLauncher extends AndroidApplication{
} }
@Override @Override
public Class<?> loadJar(Fi jar, String mainClass) throws Exception{ public ClassLoader loadJar(Fi jar, String mainClass) throws Exception{
DexClassLoader loader = new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader()); return new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader());
return Class.forName(mainClass, true, loader);
} }
@Override @Override
@@ -162,7 +161,6 @@ public class AndroidLauncher extends AndroidApplication{
}, new AndroidApplicationConfiguration(){{ }, new AndroidApplicationConfiguration(){{
useImmersiveMode = true; useImmersiveMode = true;
hideStatusBar = true; hideStatusBar = true;
stencil = 8;
}}); }});
checkFiles(getIntent()); checkFiles(getIntent());

View File

@@ -63,7 +63,7 @@ public class RemoteProcess extends BaseProcessor{
classes = new Seq<>(); classes = new Seq<>();
Seq<Smethod> orderedElements = elements.copy(); Seq<Smethod> orderedElements = elements.copy();
orderedElements.sortComparing(Object::toString); orderedElements.sort((a, b) -> -a.toString().compareTo(b.toString()));
//create methods //create methods
for(Smethod element : orderedElements){ for(Smethod element : orderedElements){
@@ -71,12 +71,12 @@ public class RemoteProcess extends BaseProcessor{
//check for static //check for static
if(!element.is(Modifier.STATIC) || !element.is(Modifier.PUBLIC)){ if(!element.is(Modifier.STATIC) || !element.is(Modifier.PUBLIC)){
err("All @Remote methods must be public and static: ", element); err("All @Remote methods must be public and static", element);
} }
//can't generate none methods //can't generate none methods
if(annotation.targets() == Loc.none){ if(annotation.targets() == Loc.none){
err("A @Remote method's targets() cannot be equal to 'none':", element); err("A @Remote method's targets() cannot be equal to 'none'", element);
} }
//get and create class entry if needed //get and create class entry if needed

View File

@@ -12,7 +12,6 @@ buildscript{
mavenCentral() mavenCentral()
google() google()
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
jcenter()
maven{ url 'https://jitpack.io' } maven{ url 'https://jitpack.io' }
} }
@@ -36,7 +35,7 @@ allprojects{
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
rhinoVersion = '2617981f706e50b8753155d8e15e326308be3b22' rhinoVersion = '378626d8abc552bba57864358358045d2f2dbe9b'
loadVersionProps = { loadVersionProps = {
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
@@ -184,7 +183,6 @@ allprojects{
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven{ url "https://oss.sonatype.org/content/repositories/releases/" } maven{ url "https://oss.sonatype.org/content/repositories/releases/" }
maven{ url 'https://jitpack.io' } maven{ url 'https://jitpack.io' }
jcenter()
} }
task clearCache{ task clearCache{
@@ -320,6 +318,15 @@ project(":core"){
} }
} }
task sourcesJar(type: Jar, dependsOn: classes){
classifier = 'sources'
from sourceSets.main.allSource
}
artifacts{
archives sourcesJar
}
dependencies{ dependencies{
compileJava.dependsOn(preGen) compileJava.dependsOn(preGen)
@@ -337,6 +344,28 @@ project(":core"){
annotationProcessor 'com.github.Anuken:jabel:34e4c172e65b3928cd9eabe1993654ea79c409cd' annotationProcessor 'com.github.Anuken:jabel:34e4c172e65b3928cd9eabe1993654ea79c409cd'
} }
afterEvaluate{
task mergedJavadoc(type: Javadoc){
def blacklist = [project(":ios"), project(":desktop"), project(":server"), project(":annotations")]
if(findProject(":android") != null){
blacklist += project(":android")
}
source rootProject.subprojects.collect{ project ->
if(!blacklist.contains(project) && project.hasProperty("sourceSets")){
return project.sourceSets.main.allJava
}
}
classpath = files(rootProject.subprojects.collect { project ->
if(!blacklist.contains(project) && project.hasProperty("sourceSets")){
return project.sourceSets.main.compileClasspath
}
})
destinationDir = new File(buildDir, 'javadoc')
}
}
} }
project(":server"){ project(":server"){

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -41,10 +41,11 @@ be.ignore = Ignore
be.noupdates = No updates found. be.noupdates = No updates found.
be.check = Check for updates be.check = Check for updates
mod.featured.dialog.title = Mod Browser (WIP) mods.browser = Mod Browser
mods.browser.selected = Selected mod mods.browser.selected = Selected mod
mods.browser.add = Install mods.browser.add = Install
mods.github.open = View mods.browser.reinstall = Reinstall
mods.github.open = Repo
mods.browser.sortdate = Sort by recent mods.browser.sortdate = Sort by recent
mods.browser.sortstars = Sort by stars mods.browser.sortstars = Sort by stars
@@ -112,17 +113,20 @@ committingchanges = Committing Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub. mods.initfailed = [red]⚠[] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[]\n\nTo disable this feature, turn it off in [accent]Settings->Game->Disable Mods On Startup Crash[].
mods = Mods mods = Mods
mods.none = [lightgray]No mods found! mods.none = [lightgray]No mods found!
mods.guide = Modding Guide mods.guide = Modding Guide
mods.report = Report Bug mods.report = Report Bug
mods.openfolder = Open Folder mods.openfolder = Open Folder
mods.viewcontent = View Content
mods.reload = Reload mods.reload = Reload
mods.reloadexit = The game will now exit, to reload mods. mods.reloadexit = The game will now exit, to reload mods.
mod.installed = [[Installed]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Enabled mod.enabled = [lightgray]Enabled
mod.disabled = [scarlet]Disabled mod.disabled = [scarlet]Disabled
mod.multiplayer.compatible = [gray]Multiplayer Compatible
mod.disable = Disable mod.disable = Disable
mod.content = Content: mod.content = Content:
mod.delete.error = Unable to delete mod. File may be in use. mod.delete.error = Unable to delete mod. File may be in use.
@@ -213,9 +217,11 @@ server.hidden = Hidden
trace = Trace Player trace = Trace Player
trace.playername = Player name: [accent]{0} trace.playername = Player name: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = Unique ID: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = Mobile Client: [accent]{0} trace.mobile = Mobile Client: [accent]{0}
trace.modclient = Custom Client: [accent]{0} trace.modclient = Custom Client: [accent]{0}
trace.times.joined = Times Joined: [accent]{0}
trace.times.kicked = Times Kicked: [accent]{0}
invalidid = Invalid client ID! Submit a bug report. invalidid = Invalid client ID! Submit a bug report.
server.bans = Bans server.bans = Bans
server.bans.none = No banned players found! server.bans.none = No banned players found!
@@ -309,6 +315,7 @@ cancelbuilding = [accent][[{0}][] to clear plan
selectschematic = [accent][[{0}][] to select+copy selectschematic = [accent][[{0}][] to select+copy
pausebuilding = [accent][[{0}][] to pause building pausebuilding = [accent][[{0}][] to pause building
resumebuilding = [scarlet][[{0}][] to resume building resumebuilding = [scarlet][[{0}][] to resume building
enablebuilding = [scarlet][[{0}][] to enable building
showui = UI hidden.\nPress [accent][[{0}][] to show UI. showui = UI hidden.\nPress [accent][[{0}][] to show UI.
wave = [accent]Wave {0} wave = [accent]Wave {0}
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]Wave {0}/{1}
@@ -680,6 +687,7 @@ stat.drillspeed = Base Drill Speed
stat.boosteffect = Boost Effect stat.boosteffect = Boost Effect
stat.maxunits = Max Active Units stat.maxunits = Max Active Units
stat.health = Health stat.health = Health
stat.armor = Armor
stat.buildtime = Build Time stat.buildtime = Build Time
stat.maxconsecutive = Max Consecutive stat.maxconsecutive = Max Consecutive
stat.buildcost = Build Cost stat.buildcost = Build Cost
@@ -695,6 +703,7 @@ stat.lightningchance = Lightning Chance
stat.lightningdamage = Lightning Damage stat.lightningdamage = Lightning Damage
stat.flammability = Flammability stat.flammability = Flammability
stat.radioactivity = Radioactivity stat.radioactivity = Radioactivity
stat.charge = Charge
stat.heatcapacity = Heat Capacity stat.heatcapacity = Heat Capacity
stat.viscosity = Viscosity stat.viscosity = Viscosity
stat.temperature = Temperature stat.temperature = Temperature
@@ -790,9 +799,12 @@ setting.shadows.name = Shadows
setting.blockreplace.name = Automatic Block Suggestions setting.blockreplace.name = Automatic Block Suggestions
setting.linear.name = Linear Filtering setting.linear.name = Linear Filtering
setting.hints.name = Hints setting.hints.name = Hints
setting.logichints.name = Logic Hints
setting.flow.name = Display Resource Flow Rate setting.flow.name = Display Resource Flow Rate
setting.backgroundpause.name = Pause In Background setting.backgroundpause.name = Pause In Background
setting.buildautopause.name = Auto-Pause Building setting.buildautopause.name = Auto-Pause Building
setting.doubletapmine.name = Double-Tap to Mine
setting.modcrashdisable.name = Disable Mods On Startup Crash
setting.animatedwater.name = Animated Surfaces setting.animatedwater.name = Animated Surfaces
setting.animatedshields.name = Animated Shields setting.animatedshields.name = Animated Shields
setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.antialias.name = Antialias[lightgray] (requires restart)[]
@@ -950,6 +962,8 @@ rules.blockdamagemultiplier = Block Damage Multiplier
rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier
rules.unithealthmultiplier = Unit Health Multiplier rules.unithealthmultiplier = Unit Health Multiplier
rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier
rules.unitcapvariable = Cores Contribute To Unit Cap
rules.unitcap = Base Unit Cap
rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles)
rules.wavespacing = Wave Spacing:[lightgray] (sec) rules.wavespacing = Wave Spacing:[lightgray] (sec)
rules.buildcostmultiplier = Build Cost Multiplier rules.buildcostmultiplier = Build Cost Multiplier
@@ -1446,7 +1460,7 @@ block.ripple.description = Shoots clusters of shells at ground enemies over long
block.cyclone.description = Fires explosive clumps of flak at nearby enemies. block.cyclone.description = Fires explosive clumps of flak at nearby enemies.
block.spectre.description = Fires large armor-piercing bullets at air and ground targets. block.spectre.description = Fires large armor-piercing bullets at air and ground targets.
block.meltdown.description = Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.meltdown.description = Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
block.foreshadow.description = Fires a large single-target bolt over long distances. block.foreshadow.description = Fires a large single-target bolt over long distances. Prioritizes enemies with higher max health.
block.repair-point.description = Continuously repairs the closest damaged unit in its vicinity. block.repair-point.description = Continuously repairs the closest damaged unit in its vicinity.
block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted.
block.parallax.description = Fires a tractor beam that pulls in air targets, damaging them in the process. block.parallax.description = Fires a tractor beam that pulls in air targets, damaging them in the process.
@@ -1507,3 +1521,146 @@ unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Co
unit.alpha.description = Defends the Shard core from enemies. Builds structures. unit.alpha.description = Defends the Shard core from enemies. Builds structures.
unit.beta.description = Defends the Foundation core from enemies. Builds structures. unit.beta.description = Defends the Foundation core from enemies. Builds structures.
unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. unit.gamma.description = Defends the Nucleus core from enemies. Builds structures.
lst.read = Read a number from a linked memory cell.
lst.write = Write a number to a linked memory cell.
lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used.
lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used.
lst.drawflush = Flush queued [accent]Draw[] operations to a display.
lst.printflush = Flush queued [accent]Print[] operations to a message block.
lst.getlink = Get a processor link by index. Starts at 0.
lst.control = Control a building.
lst.radar = Locate units around a building with range.
lst.sensor = Get data from a building or unit.
lst.set = Set a variable.
lst.operation = Perform an operation on 1-2 variables.
lst.end = Jump to the top of the instruction stack.
lst.jump = Conditionally jump to another statement.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around the currently bound unit.
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
logic.nounitbuild = [red]Unit building logic is not allowed here.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
lenum.shoot = Shoot at a position.
lenum.shootp = Shoot at a unit/building with velocity prediction.
lenum.configure = Building configuration, e.g. sorter item.
lenum.enabled = Whether the block is enabled.
laccess.color = Illuminator color.
laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself.
laccess.dead = Whether a unit/building is dead or no longer valid.
laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0.
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead.
graphicstype.clear = Fill the display with a color.
graphicstype.color = Set color for next drawing operations.
graphicstype.stroke = Set line width.
graphicstype.line = Draw line segment.
graphicstype.rect = Fill a rectangle.
graphicstype.linerect = Draw a rectangle outline.
graphicstype.poly = Fill a regular polygon.
graphicstype.linepoly = Draw a regular polygon outline.
graphicstype.triangle = Fill a triangle.
graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[].
lenum.always = Always true.
lenum.idiv = Integer division.
lenum.div = Division.\nReturns [accent]null[] on divide-by-zero.
lenum.mod = Modulo.
lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0.
lenum.notequal = Not equal. Coerces types.
lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[].
lenum.shl = Bit-shift left.
lenum.shr = Bit-shift right.
lenum.or = Bitwise OR.
lenum.land = Logical AND.
lenum.and = Bitwise AND.
lenum.not = Bitwise flip.
lenum.xor = Bitwise XOR.
lenum.min = Minimum of two numbers.
lenum.max = Maximum of two numbers.
lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector.
lenum.sin = Sine, in degrees.
lenum.cos = Cosine, in degrees.
lenum.tan = Tangent, in degrees.
#not a typo, look up 'range notation'
lenum.rand = Random decimal in range [0, value).
lenum.log = Natural logarithm (ln).
lenum.log10 = Base 10 logarithm.
lenum.noise = 2D simplex noise.
lenum.abs = Absolute value.
lenum.sqrt = Square root.
lenum.any = Any unit.
lenum.ally = Ally unit.
lenum.attacker = Unit with a weapon.
lenum.enemy = Enemy unit.
lenum.boss = Guardian unit.
lenum.flying = Flying unit.
lenum.ground = Ground unit.
lenum.player = Unit controlled by a player.
lenum.ore = Ore deposit.
lenum.damaged = Damaged ally building.
lenum.spawn = Enemy spawn point.\nMay be a core or a position.
lenum.building = Building in a specific group.
lenum.core = Any core.
lenum.storage = Storage building, e.g. Vault.
lenum.generator = Buildings that generate power.
lenum.factory = Buildings that transform resources.
lenum.repair = Repair points.
lenum.rally = Command center.
lenum.battery = Any battery.
lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled.
lenum.reactor = Impact/Thorium reactor.
lenum.turret = Any turret.
sensor.in = The building/unit to sense.
radar.from = Building to sense from.\nSensor range is limited by building range.
radar.target = Filter for units to sense.
radar.and = Additional filters.
radar.order = Sorting order. 0 to reverse.
radar.sort = Metric to sort results by.
radar.output = Variable to write output unit to.
unitradar.target = Filter for units to sense.
unitradar.and = Additional filters.
unitradar.order = Sorting order. 0 to reverse.
unitradar.sort = Metric to sort results by.
unitradar.output = Variable to write output unit to.
control.of = Building to control.
control.unit = Unit/building to aim at.
control.shoot = Whether to shoot.
unitlocate.enemy = Whether to locate enemy buildings.
unitlocate.found = Whether the object was found.
unitlocate.building = Output variable for located building.
unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for.
lenum.idle = Don't move, but keep building/mining.\nThe default state.
lenum.stop = Stop moving/mining/building.
lenum.move = Move to exact position.
lenum.approach = Approach a position with a radius.
lenum.pathfind = Pathfind to the enemy spawn.
lenum.target = Shoot a position.
lenum.targetp = Shoot a target with velocity prediction.
lenum.itemdrop = Drop an item.
lenum.itemtake = Take an item from a building.
lenum.paydrop = Drop current payload.
lenum.paytake = Pick up payload at current location.
lenum.flag = Numeric unit flag.
lenum.mine = Mine at a position.
lenum.build = Build a structure.
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[].
lenum.within = Check if unit is near a position.
lenum.boost = Start/stop boosting.

View File

@@ -41,10 +41,13 @@ be.ignore = Ignorieren
be.noupdates = Keine Aktualisierungen gefunden. be.noupdates = Keine Aktualisierungen gefunden.
be.check = Auf Aktualisierungen prüfen be.check = Auf Aktualisierungen prüfen
mod.featured.dialog.title = Mod Browser (unfertig) mod.featured.dialog.title = Mod Browser
mods.browser.selected = Ausgewählter Mod mods.browser.selected = Ausgewählter Mod
mods.browser.add = Installieren mods.browser.add = Installieren
mods.github.open = Ansehen mods.browser.reinstall = Neu Installieren
mods.github.open = Github
mods.browser.sortdate = Nach neusten sortieren
mods.browser.sortstars = Nach Sternen sortieren
schematic = Entwurf schematic = Entwurf
schematic.add = Entwurf speichern... schematic.add = Entwurf speichern...
@@ -68,9 +71,9 @@ schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[
stats = Statistiken stats = Statistiken
stat.wave = Wellen besiegt:[accent] {0} stat.wave = Wellen besiegt:[accent] {0}
stat.enemiesDestroyed = Gegner zerstört:[accent] {0} stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
stat.built = Gebäude gebaut:[accent] {0} stat.built = Blöcke gebaut:[accent] {0}
stat.destroyed = Gebäude zerstört:[accent] {0} stat.destroyed = Blöcke zerstört:[accent] {0}
stat.deconstructed = Gebäude abgebaut:[accent] {0} stat.deconstructed = Blöcke abgebaut:[accent] {0}
stat.delivered = Übertragene Ressourcen: stat.delivered = Übertragene Ressourcen:
stat.playtime = Spielzeit:[accent] {0} stat.playtime = Spielzeit:[accent] {0}
stat.rank = Finaler Rang:[accent] {0} stat.rank = Finaler Rang:[accent] {0}
@@ -110,14 +113,16 @@ committingchanges = Veränderungen werden übernommen
done = Fertig done = Fertig
feature.unsupported = Dein System unterstützt dieses Feature nicht. feature.unsupported = Dein System unterstützt dieses Feature nicht.
mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind und[scarlet] sehr fehlerhaft sein können[].\nMelde alle Probleme auf GitHub oder Discord. mods.initfailed = [red]⚠[] Die vorherige Mindustry-Instanz konnte nicht starten. Dies lag wahrscheinlich an fehlerhaften Mods.\n\nDamit das Spiel starten kann, [red]wurden alle Mods deaktiviert.[]\n\nWenn du nicht willst, dass das passiert, kannst du es unter [accent]Einstellungen->Spiel->Mods bei Absturz deaktivieren[] ändern.
mods = Mods mods = Mods
mods.none = [lightgray]Keine Mods gefunden! mods.none = [lightgray]Keine Mods gefunden!
mods.guide = Modding-Anleitung mods.guide = Modding-Anleitung
mods.report = Problem melden mods.report = Problem melden
mods.openfolder = Mod-Verzeichnis öffnen mods.openfolder = Mod-Verzeichnis öffnen
mods.viewcontent = Inhalt ansehen
mods.reload = Neu laden mods.reload = Neu laden
mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden. mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden.
mod.installed = [[Installiert]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Aktiviert mod.enabled = [lightgray]Aktiviert
mod.disabled = [scarlet]Deaktiviert mod.disabled = [scarlet]Deaktiviert
@@ -211,9 +216,11 @@ server.hidden = Versteckt
trace = Spieler verfolgen trace = Spieler verfolgen
trace.playername = Spielername: [accent]{0} trace.playername = Spielername: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = Eindeutige ID: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = Mobiler Client: [accent]{0} trace.mobile = Mobiler Client: [accent]{0}
trace.modclient = Gemoddeter Client: [accent]{0} trace.modclient = Gemoddeter Client: [accent]{0}
trace.times.joined = Beigetreten: [accent]{0}[] Mal
trace.times.kicked = Rausgeworfen: [accent]{0}[] Mal
invalidid = Ungültige Client-ID! Berichte den Fehler. invalidid = Ungültige Client-ID! Berichte den Fehler.
server.bans = Verbannungen server.bans = Verbannungen
server.bans.none = Keine verbannten Spieler gefunden! server.bans.none = Keine verbannten Spieler gefunden!
@@ -287,6 +294,7 @@ cancel = Abbruch
openlink = Link öffnen openlink = Link öffnen
copylink = Link kopieren copylink = Link kopieren
back = Zurück back = Zurück
max = Max
crash.export = Crash-Logs exportieren crash.export = Crash-Logs exportieren
crash.none = Keine Crash-Logs gefunden. crash.none = Keine Crash-Logs gefunden.
crash.exported = Crash-Logs wurden erfolgreich exportiert. crash.exported = Crash-Logs wurden erfolgreich exportiert.
@@ -306,6 +314,7 @@ cancelbuilding = [accent][[{0}][] um den Plan zu leeren
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
pausebuilding = [accent][[{0}][] um das Bauen zu pausieren pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
enablebuilding = [scarlet][[{0}][] um zu bauen
showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen. showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen.
wave = [accent]Welle {0} wave = [accent]Welle {0}
wave.cap = [accent]Welle {0}/{1} wave.cap = [accent]Welle {0}/{1}
@@ -361,7 +370,6 @@ editor.center = Zur Mitte
workshop = Workshop workshop = Workshop
waves.title = Wellen waves.title = Wellen
waves.remove = Entfernen waves.remove = Entfernen
waves.never = <nie>
waves.every = alle waves.every = alle
waves.waves = Welle(n) waves.waves = Welle(n)
waves.perspawn = pro Spawn waves.perspawn = pro Spawn
@@ -390,7 +398,7 @@ editor.removeunit = Bereich entfernen
editor.teams = Teams editor.teams = Teams
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0} editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0} editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
editor.errorimage = Das ist ein Bild, keine Karte. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 'v3.5/build 40'-Karte importieren möchtest, benutze den 'Importiere Terrainbild'-Knopf im Editor. editor.errorimage = Das ist ein Bild, keine Karte.
editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird. editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
editor.errornot = Dies ist keine Kartendatei. editor.errornot = Dies ist keine Kartendatei.
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt. editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
@@ -678,6 +686,7 @@ stat.drillspeed = Bohrgeschwindigkeit
stat.boosteffect = Verstärkungseffekt stat.boosteffect = Verstärkungseffekt
stat.maxunits = Max. aktive Einheiten stat.maxunits = Max. aktive Einheiten
stat.health = Lebenspunkte stat.health = Lebenspunkte
stat.armour = Panzer
stat.buildtime = Baudauer stat.buildtime = Baudauer
stat.maxconsecutive = Max. Konsekutive stat.maxconsecutive = Max. Konsekutive
stat.buildcost = Baukosten stat.buildcost = Baukosten
@@ -693,6 +702,7 @@ stat.lightningchance = Blitzwahr­schein­lich­keit
stat.lightningdamage = Blitzschaden stat.lightningdamage = Blitzschaden
stat.flammability = Brennbarkeit stat.flammability = Brennbarkeit
stat.radioactivity = Radioaktivität stat.radioactivity = Radioaktivität
stat.charge = Ladung
stat.heatcapacity = Hitzekapazität stat.heatcapacity = Hitzekapazität
stat.viscosity = Viskosität stat.viscosity = Viskosität
stat.temperature = Temperatur stat.temperature = Temperatur
@@ -720,6 +730,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.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}
@@ -787,9 +798,12 @@ setting.shadows.name = Schatten
setting.blockreplace.name = Automatische Blockvorschläge setting.blockreplace.name = Automatische Blockvorschläge
setting.linear.name = Lineare Filterung setting.linear.name = Lineare Filterung
setting.hints.name = Tipps setting.hints.name = Tipps
setting.logichints.name = Logiktipps
setting.flow.name = Ressourcen-Fluss anzeigen setting.flow.name = Ressourcen-Fluss anzeigen
setting.backgroundpause.name = Im Hintergrund pausieren setting.backgroundpause.name = Im Hintergrund pausieren
setting.buildautopause.name = Bauen automatisch pausieren setting.buildautopause.name = Bauen automatisch pausieren
setting.doubletapmine.name = Doppeltippen zum Abbauen
setting.modcrashdisable.name = Mods bei Absturz deaktivieren
setting.animatedwater.name = Animiertes Wasser setting.animatedwater.name = Animiertes Wasser
setting.animatedshields.name = Animierte Schilde setting.animatedshields.name = Animierte Schilde
setting.antialias.name = Antialias[lightgray] (Neustart erforderlich)[] setting.antialias.name = Antialias[lightgray] (Neustart erforderlich)[]
@@ -935,6 +949,7 @@ mode.custom = Angepasste Regeln
rules.infiniteresources = Unbegrenzte Ressourcen rules.infiniteresources = Unbegrenzte Ressourcen
rules.reactorexplosions = Reaktor-Explosionen rules.reactorexplosions = Reaktor-Explosionen
rules.coreincinerates = Kern verbrennt überflüssige Materialien
rules.schematic = Entwürfe erlaubt rules.schematic = Entwürfe erlaubt
rules.wavetimer = Wellen-Timer rules.wavetimer = Wellen-Timer
rules.waves = Wellen rules.waves = Wellen
@@ -946,6 +961,8 @@ rules.blockdamagemultiplier = Block-Schaden-Multiplikator
rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator
rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
rules.unitcapvariable = Kerne zählen zum Einheiten-Limit dazu
rules.unitcap = Einheiten-Limit
rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln) rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln)
rules.wavespacing = Wellen-Abstand:[lightgray] (Sek) rules.wavespacing = Wellen-Abstand:[lightgray] (Sek)
rules.buildcostmultiplier = Bau-Kosten Multiplikator rules.buildcostmultiplier = Bau-Kosten Multiplikator
@@ -955,7 +972,7 @@ rules.waitForWaveToEnd = Warten bis Welle endet
rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln) rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln)
rules.unitammo = Einheiten benötigen Munition rules.unitammo = Einheiten benötigen Munition
rules.title.waves = Wellen rules.title.waves = Wellen
rules.title.resourcesbuilding = Ressourcen & Gebäude rules.title.resourcesbuilding = Ressourcen & Blöcke
rules.title.enemy = Gegner rules.title.enemy = Gegner
rules.title.unit = Einheiten rules.title.unit = Einheiten
rules.title.experimental = Experimentell rules.title.experimental = Experimentell
@@ -1031,7 +1048,7 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Korvus unit.corvus.name = Korvus
block.resupply-point.name = Nachlade-Punkt block.resupply-point.name = Munitionsvorrat
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Klippe block.cliff.name = Klippe
block.sand-boulder.name = Sandbrocken block.sand-boulder.name = Sandbrocken
@@ -1310,7 +1327,7 @@ item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon l
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt. item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt.
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet. item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet. item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet.
item.scrap.details = Übriggebliebene Reste alter Gebäude oder Einheiten. item.scrap.details = Übriggebliebene Reste alter Blöcke oder Einheiten.
item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet. item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet.
item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt. item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt.
item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden. item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden.
@@ -1381,8 +1398,8 @@ block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das au
block.router.description = Verteilt Materialien auf bis zu drei Richtungen. block.router.description = Verteilt Materialien auf bis zu drei Richtungen.
block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann. block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen. block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen.
block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden. block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist.
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden. block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind.
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger. block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt. block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
block.rotary-pump.description = Eine Pumpe, die Strom verbraucht. block.rotary-pump.description = Eine Pumpe, die Strom verbraucht.
@@ -1503,3 +1520,146 @@ unit.omura.description = Schießt eine Railgun mit hoher Reichweite, um Gegner z
unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke. unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke.
unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke. unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke.
unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke. unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke.
lst.read = Liest einen Wert aus einer verbundenen Spiecherzelle.
lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle.
lst.print = Fügt Text zum Textspeicher hinzu.\nZeigt nichts an, bis [accent]Print Flush[] verwendet wird.
lst.draw = Fügt eine [accent]Draw[]-Aufgabe zum Bildspeicher hinzu.\nZeigt nichts an, bis [accent]Draw Flush[] verwendet wird.
lst.drawflush = Druckt [accent]Draw[]-Aufgaben aus dem Bildspeicher auf einen Bildschirm.
lst.printflush = Druckt [accent]Print[]-Aufgaben aus dem Textspeicher auf einen Nachrichtenblock.
lst.getlink = Gibt ein verbundenen Block wieder. Fängt bei 0 an.
lst.control = Steuert einen Block.
lst.radar = Findet Einheiten.
lst.sensor = Gibt Daten über einen Block oder eine Einheit wieder.
lst.set = Setzt eine Variable fest.
lst.operation = Verändert eine Variable.
lst.end = Springt wieder nach oben.
lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht.
lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[].
lst.unitcontrol = Steuert [accent]@unit[].
lst.unitradar = Findet Einheiten in der Nähe von [accent]@unit[].
lst.unitlocate = Findet mit [accent]@unit[] bestimmte Positionen / Blöcke auf der ganzen Karte.
logic.nounitbuild = [red]Logik, die Blöcke baut, ist hier nicht erlaubt.
lenum.type = Englischer Name eines Blocks / einer Einheit. Ein Verteiler gibt [accent]@router[] wieder.\nKein string.
lenum.shoot = Schießt auf eine Position.
lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus.
lenum.configure = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer.
lenum.enabled = Ob der Block an oder aus ist.
laccess.color = Illuminiererfarbe.
laccess.controller = Einheitensteurer. Gibt "processor" zurück, wenn die Einheit prozessorgesteuert ist,.\nGibt den Steuerer zurück, wenn die Einheit Teil einer Formation ist.\nSonst wird einfach die Einheit zurückgegeben.
laccess.dead = Ob ein Block / eine Einheit tot oder nicht mehr gültig ist.
laccess.controlled = Gibt zurück:\n[accent]@ctrlProcessor[] wenn die Einheit prozessorgesteuert ist\n[accent]@ctrlPlayer[] wenn die Einheit / der Block von einem Spieler gesteuert wird\n[accent]@ctrlFormation[] wenn die Einheit Teil einer Formation ist\nSonst 0.
laccess.commanded = [red]Veraltet. Wird bald entfernt![]\nBenutze stattdessen [accent]controlled[].
graphicstype.stroke = Setzt die Linienbreite fest.
graphicstype.line = Zeichnet eine Linie.
graphicstype.clear = Füllt den Bildschirm mit einer Farbe.
graphicstype.color = Wählt eine Farbe aus.
graphicstype.rect = Zeichnet ein Rechteck.
graphicstype.linerect = Zeichnet den Umriss eines Rechtecks.
graphicstype.poly = Füllt ein gleichmäßiges Polygon.
graphicstype.linepoly = Zeichnet den Umriss eines gleichmäßigen Polygons.
graphicstype.triangle = Zeichnet ein Dreieck.
graphicstype.image = Zeichnet ein Bild von einem englischen Namen.\nz.B. [accent]@router[] oder [accent]@dagger[].
lenum.always = Immer.
lenum.idiv = Division mit ganzen Zahlen.
lenum.div = Division.\nGibt bei Teilung durch null [accent]null[] zurück.
lenum.mod = Modulo.
lenum.equal = Prüft Gleichheit.\nNicht-"null" Objekte, die mit Zahlen verglichen werden, werden 1.
lenum.notequal = Prüft Ungleichheit.
lenum.strictequal = Prüft strenge Gleichheit.\nKann verwendet werden, um "null" zu finden.
lenum.shl = Bit-shift nacht links.
lenum.shr = Bit-shift nach rechts.
lenum.or = Bitwise ODER.
lenum.land = Logisches AND.
lenum.and = Bitwise UND.
lenum.not = Bitwise NOT.
lenum.xor = Bitwise XOR.
lenum.min = Die Größte von zwei Zahlen.
lenum.max = Die Kleinste von zwei Zahlen.
lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector.
lenum.sin = Sinus in Grad.
lenum.cos = Cosinus in Grad.
lenum.tan = Tangens in Grad.
#not a typo, look up 'range notation'
lenum.rand = Zufällige Zahl zwischen [0, <wert>).
lenum.log = Logarithmus (ln).
lenum.log10 = Logarithmus zur Basis 10.
lenum.noise = 2D rauschen.
lenum.abs = Betrag.
lenum.sqrt = Quadratwurzel.
lenum.any = Irgendeine Einheit.
lenum.ally = Freundliche Einheit.
lenum.attacker = Einheit mit Waffe.
lenum.enemy = Gegnerische Einheit.
lenum.boss = Bosseinheit.
lenum.flying = Lufteinheit.
lenum.ground = Bodeneinheit.
lenum.player = Spielergesteuerte Einheit.
lenum.ore = Erz.
lenum.damaged = Beschädigter, alliierter Block.
lenum.spawn = Gegnerischer Spawnpunkt.\nKann ein Kern oder eine Position sein.
lenum.building = Ein Block einer bestimmten Sorte.
lenum.core = Irgendein Kern.
lenum.storage = Speicherblock, z.B. ein Tresor.
lenum.generator = Blöcke, die Strom generieren.
lenum.factory = Blöcke, die Ressourcen verarbeiten.
lenum.repair = Reperaturpunkt.
lenum.rally = Kommandozentrale
lenum.battery = Irgendeine Batterie.
lenum.resupply = Munitionsvorrat.\nNur wichtig, wenn [accent]"Einheiten benötigen Munition"[] an ist.
lenum.reactor = Schlag- / Thoriumreaktor.
lenum.turret = Irgendein Geschütz.
sensor.in = Der Block / die Einheit.
radar.from = Block zu benutzen. [accent]Sensor[]-Reichweite hängt von der Blockreichweite ab.
radar.target = Einheitenfilter.
radar.and = Weitere Filter.
radar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts.
radar.sort = Sortiermethode der Ergebnisse.
radar.output = Variable für das Ergebnis.
unitradar.target = Einheitenfilter.
unitradar.and = Weitere Filter.
unitradar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts.
unitradar.sort = Sortiermethode der Ergebnisse.
unitradar.output = Variable für das Ergebnis.
control.of = Block, der gesteuert werden soll.
control.unit = Zieleinheit / Zielblock.
control.shoot = Ob geschossen werden soll.
unitlocate.enemy = Ob gegnerische Blöcke gesucht werden sollen.
unitlocate.found = Ob der Block gefunden wurde.
unitlocate.building = Variable für das Ergebnis.
unitlocate.outx = Variable für die X-Koordinate.
unitlocate.outy = Variable für die Y-Koordinate.
unitlocate.group = Gesuchter Blocktyp.
lenum.idle = Bewegt sich nicht, baut aber weiter ab.\nDer normale Zustand.
lenum.stop = Bewegung / Abbau / Bau abbrechen.
lenum.move = Geht zu diese Position.
lenum.approach = Geht auf einen Punkt mit einem bestimmten Radius zu.
lenum.pathfind = Geht zum gegnerischen Spawnpunkt.
lenum.target = Schießt auf eine Position.
lenum.targetp = Schießt auf eine Einheit und sagt deren Position voraus.
lenum.itemdrop = Items abwerfen.
lenum.itemtake = Items aus einem Block nehmen.
lenum.paydrop = Lässt einen Block / eine Einheit wieder fallen.
lenum.paytake = Hebt einen Block / eine kleine Einheit auf.
lenum.flag = Zahl, mit der eine Einheit identifiziert werden kann.
lenum.mine = Erz von einer Position abbauen.
lenum.build = Einen Block bauen.
lenum.getblock = Gibt den Blocktyp an den Koordinaten zurück.\nEinheiten müssen nah genug dran sein.\nFeste nicht-Blöcke sind [accent]@solid[].
lenum.within = Prüft, ob eine Einheit in einem Radius um einen Punkt ist.
lenum.boost = Aktiviert / deaktiviert den Boost.

View File

@@ -678,6 +678,7 @@ stat.drillspeed = Velocidad del Taladro
stat.boosteffect = Efecto de Potenciador stat.boosteffect = Efecto de Potenciador
stat.maxunits = Máximo de Unidades Activas stat.maxunits = Máximo de Unidades Activas
stat.health = Vida stat.health = Vida
stat.armor = Armadura
stat.buildtime = Tiempo de construcción stat.buildtime = Tiempo de construcción
stat.maxconsecutive = Máximo consecutivo stat.maxconsecutive = Máximo consecutivo
stat.buildcost = Coste de construcción stat.buildcost = Coste de construcción
@@ -693,7 +694,8 @@ stat.lightningchance = Probabilidad de descarga
stat.lightningdamage = Daño por rayo stat.lightningdamage = Daño por rayo
stat.flammability = Inflamabilidad stat.flammability = Inflamabilidad
stat.radioactivity = Radioactividad stat.radioactivity = Radioactividad
stat.heatcapacity = Resistencia temperatura stat.charge = Carga eléctrica
stat.heatcapacity = Resistencia a la temperatura
stat.viscosity = Viscosidad stat.viscosity = Viscosidad
stat.temperature = Temperatura stat.temperature = Temperatura
stat.speed = Velocidad stat.speed = Velocidad
@@ -744,6 +746,7 @@ bullet.sapping = [stat]Oxidante
bullet.homing = [stat]Rastreadora bullet.homing = [stat]Rastreadora
bullet.shock = [stat]Electrizante bullet.shock = [stat]Electrizante
bullet.frag = [stat]De fragmentación bullet.frag = [stat]De fragmentación
bullet.buildingdamage = [stat]{0}%[lightgray]daño a estructuras
bullet.knockback = [stat]{0}[lightgray] Empuje bullet.knockback = [stat]{0}[lightgray] Empuje
bullet.pierce = [stat]{0}[lightgray]x penetración bullet.pierce = [stat]{0}[lightgray]x penetración
bullet.infinitepierce = [stat]Penetrante bullet.infinitepierce = [stat]Penetrante
@@ -1116,7 +1119,7 @@ block.plastanium-wall.name = Muro de Plastanio
block.plastanium-wall-large.name = Muro de Plastanio grande block.plastanium-wall-large.name = Muro de Plastanio grande
block.phase-wall.name = Muro de Fase grande block.phase-wall.name = Muro de Fase grande
block.phase-wall-large.name = Muro de Fase grande block.phase-wall-large.name = Muro de Fase grande
block.thorium-wall.name = Pared de Torio block.thorium-wall.name = Muro de Torio
block.thorium-wall-large.name = Muro de Torio grande block.thorium-wall-large.name = Muro de Torio grande
block.door.name = Puerta block.door.name = Puerta
block.door-large.name = Puerta Grande block.door-large.name = Puerta Grande
@@ -1329,16 +1332,16 @@ block.graphite-press.description = Comprime carbón en piezas de grafito puro.
block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente. block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente.
block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio. block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio.
block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar. block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar.
block.plastanium-compressor.description = Produce plastanio con aceite y titanio. block.plastanium-compressor.description = Produce plastanio con petróleo y titanio.
block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena. block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena.
block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre. block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre.
block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar.
block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo. block.blast-mixer.description = Usa esporas para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo.
block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable.
block.melter.description = Calienta piedra a temperaturas muy altas para obtener lava. block.melter.description = Calienta chatarra a temperaturas muy altas para obtener magma.
block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra. block.separator.description = Separa el magma en sus componentes minerales.
block.spore-press.description = Comprime esporas en petróleo. block.spore-press.description = Comprime esporas en petróleo.
block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay arena natural. block.pulverizer.description = Despedaza la chatarra en arena. Útil cuando no hay arena natural.
block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón. block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón.
block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso. block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso.
block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre. block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre.
@@ -1351,7 +1354,7 @@ block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender
block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas. block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas.
block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos. block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.
block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas. block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas.
block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.. block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.
block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas. block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas.
block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos. block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.
block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas. block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas.
@@ -1359,8 +1362,8 @@ block.phase-wall.description = No es tan fuerte como un muro de torio pero hace
block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas. block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas.
block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante. block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.
block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas. block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas.
block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella. block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.
block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas. block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas.
block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia. block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia.
block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas. block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas.
block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores. block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores.
@@ -1388,7 +1391,7 @@ block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Tr
block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos. block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos.
block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos. block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos.
block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales. block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales.
block.liquid-junction.description = Actúa como un puente para dos condusctos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares. block.liquid-junction.description = Actúa como un puente para dos conductos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares.
block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción. block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción.
block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas. block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas.
block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente. block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente.
@@ -1398,7 +1401,7 @@ block.diode.description = La energía de la batería puede fluir a través de es
block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía. block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía.
block.battery-large.description = Almacena mucha más energía que una batería normal. block.battery-large.description = Almacena mucha más energía que una batería normal.
block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo. block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo.
block.thermal-generator.description = Genera una gran cantidad de energía con la lava. block.thermal-generator.description = Genera una gran cantidad de energía con el magma.
block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional.
block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita. block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita.
block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio. block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio.
@@ -1444,7 +1447,7 @@ block.segment.description = Daña y destruye proyectiles que se acerquen. No afe
block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso. block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso.
block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua. block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua.
block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos. block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos.
block.disassembler.description = Separa magma cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio. block.disassembler.description = Separa magma en cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio.
block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar. block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar.
block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas. block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas.
block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida. block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida.
@@ -1487,7 +1490,7 @@ unit.zenith.description = Dispara ráfagas de misiles a enemigos cercanos.
unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano. unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano.
unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación. unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación.
unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo. unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo.
unit.poly.description = Recosntruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción. unit.poly.description = Reconstruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción.
unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas. unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas.
unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio. unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio.
unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres. unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres.

View File

@@ -6,7 +6,7 @@ link.discord.description = Discord officiel de Mindustry
link.reddit.description = Subreddit de Mindustry link.reddit.description = Subreddit de Mindustry
link.github.description = Code source du jeu link.github.description = Code source du jeu
link.changelog.description = Liste des mises à jour link.changelog.description = Liste des mises à jour
link.dev-builds.description = Versions expérimentale du jeu link.dev-builds.description = Versions expérimentales du jeu
link.trello.description = Trello officiel pour les nouvelles fonctionalités planifiées link.trello.description = Trello officiel pour les nouvelles fonctionalités planifiées
link.itch.io.description = Page itch.io avec les différentes versions du jeu. link.itch.io.description = Page itch.io avec les différentes versions du jeu.
link.google-play.description = Page Google Play du jeu link.google-play.description = Page Google Play du jeu
@@ -41,17 +41,20 @@ be.ignore = Ignorer
be.noupdates = Aucune mise à jour trouvée. be.noupdates = Aucune mise à jour trouvée.
be.check = Chercher des mises à jour be.check = Chercher des mises à jour
mod.featured.dialog.title = Navigateur de Mods (WIP) mods.browser = Navigateur de Mods
mods.browser.selected = Mod sélectionné mods.browser.selected = Mod sélectionné
mods.browser.add = Installer mods.browser.add = Installer
mods.github.open = Voir mods.browser.reinstall = Reinstaller
mods.github.open = Voir sur Github
mods.browser.sortdate = Classer par date
mods.browser.sortstars = Classer par étoiles
schematic = Schéma schematic = Schéma
schematic.add = Enregistrer le Schéma... schematic.add = Enregistrer le Schéma
schematics = Schémas schematics = Schémas
schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer ? schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer?
schematic.exists = Un schéma avec ce nom existe déjà. schematic.exists = Un schéma avec ce nom existe déjà.
schematic.import = Importer un schéma... schematic.import = Importer un schéma
schematic.exportfile = Exporter le fichier schematic.exportfile = Exporter le fichier
schematic.importfile = Importer un fichier schematic.importfile = Importer un fichier
schematic.browseworkshop = Consulter le Steam Workshop schematic.browseworkshop = Consulter le Steam Workshop
@@ -63,7 +66,7 @@ schematic.saved = Schéma enregistré.
schematic.delete.confirm = Ce schéma sera supprimé définitivement. schematic.delete.confirm = Ce schéma sera supprimé définitivement.
schematic.rename = Renommer le Schéma schematic.rename = Renommer le Schéma
schematic.info = {0}x{1}, {2} blocs schematic.info = {0}x{1}, {2} blocs
schematic.disabled = [scarlet] Schémas désactivés![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]cartemap[] ou ce [accent]serveur. schematic.disabled = [scarlet]Schémas désactivés![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]carte[] ou dans ce [accent]serveur.
stats = Stats stats = Stats
stat.wave = Vagues vaincues:[accent] {0} stat.wave = Vagues vaincues:[accent] {0}
@@ -84,8 +87,8 @@ 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
savegame = Sauvegarder la partie savegame = Sauvegarder la partie
loadgame = Charger la partie loadgame = Charger une partie
joingame = Rejoindre la partie joingame = Rejoindre une partie
customgame = Partie personnalisée customgame = Partie personnalisée
newgame = Nouvelle partie newgame = Nouvelle partie
none = <Vide> none = <Vide>
@@ -116,8 +119,10 @@ mods.none = [lightgray]Aucun Mod trouvé!
mods.guide = Guide de Modding mods.guide = Guide de Modding
mods.report = Signaler un Bug mods.report = Signaler un Bug
mods.openfolder = Ouvrir le Dossier mods.openfolder = Ouvrir le Dossier
mods.viewcontent = Voir le Contenu
mods.reload = Relancer mods.reload = Relancer
mods.reloadexit = Le jeu va se fermer pour relancer les mods. mods.reloadexit = Le jeu va se fermer pour relancer les mods.
mod.installed = [[Installé]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Activé mod.enabled = [lightgray]Activé
mod.disabled = [scarlet]Désactivé mod.disabled = [scarlet]Désactivé
@@ -125,7 +130,7 @@ mod.disable = Désactiver
mod.content = Contenu: mod.content = Contenu:
mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation. mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation.
mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0} mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0}
mod.outdated = [scarlet]non compatible avec la V6 (no minGameVersion: 105) mod.outdated = [scarlet]Non compatible avec la V6 (no minGameVersion: 105)
mod.missingdependencies = [scarlet]Dépendances manquantes: {0} mod.missingdependencies = [scarlet]Dépendances manquantes: {0}
mod.erroredcontent = [scarlet]Erreurs de contenu mod.erroredcontent = [scarlet]Erreurs de contenu
mod.errors = Des erreurs se sont produites lors du chargement du contenu. mod.errors = Des erreurs se sont produites lors du chargement du contenu.
@@ -137,7 +142,7 @@ mod.reloadrequired = [scarlet]Redémarrage requis
mod.import = Importer un mod mod.import = Importer un mod
mod.import.file = Importer un fichier mod.import.file = Importer un fichier
mod.import.github = Importer un mod depuis GitHub mod.import.github = Importer un mod depuis GitHub
mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'Importer ce mod depuis une source digne de confiance. mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'importer ce mod depuis une source digne de confiance.
mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question. mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question.
mod.remove.confirm = Ce mod sera supprimé. mod.remove.confirm = Ce mod sera supprimé.
mod.author = [lightgray]Auteur:[] {0} mod.author = [lightgray]Auteur:[] {0}
@@ -148,7 +153,7 @@ mod.scripts.disable = Votre appareil ne prend pas an charge les mods avec des sc
about.button = À propos about.button = À propos
name = Nom: name = Nom:
noname = Commencez par choisir un[accent] pseudo[]. noname = Commencez par choisir un[accent] nom[].
planetmap = Carte de la planète planetmap = Carte de la planète
launchcore = Lancer le Noyau launchcore = Lancer le Noyau
filename = Nom du fichier: filename = Nom du fichier:
@@ -156,8 +161,8 @@ unlocked = Nouveau contenu débloqué!
available = Nouvelle recherche disponible! available = Nouvelle recherche disponible!
completed = [accent]Complété completed = [accent]Complété
techtree = Arbre technologique techtree = Arbre technologique
research.legacy = Données de recherche de la [accent]5.0[] trouvées.\nVoulez-vous [accent]charger les 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é)
research.load = Chargement research.load = Charger
research.discard = Ignorer research.discard = Ignorer
research.list = [lightgray]Recherche: research.list = [lightgray]Recherche:
research = Rechercher research = Rechercher
@@ -176,7 +181,7 @@ server.kicked.clientOutdated = Client obsolète! Mettez votre jeu à jour!
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour! server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
server.kicked.banned = Vous avez été banni de ce serveur. server.kicked.banned = Vous avez été banni de ce serveur.
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu. server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libére. server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libère.
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter. server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter.
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur. server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
server.kicked.nameEmpty = Votre nom est invalide. server.kicked.nameEmpty = Votre nom est invalide.
@@ -203,9 +208,9 @@ servers.local = Serveurs locaux
servers.remote = Serveurs distants servers.remote = Serveurs distants
servers.global = Serveurs communautaires servers.global = Serveurs communautaires
servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés ou controllés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tout les âges. servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés, ni controllés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tout les âges.
servers.showhidden = Montrer les serveurs cachés servers.showhidden = Montrer les serveurs cachés
server.shown = Montré server.shown = Visible
server.hidden = Caché server.hidden = Caché
trace = Suivre le joueur trace = Suivre le joueur
@@ -307,6 +312,7 @@ cancelbuilding = [accent][[{0}][] pour effacer le plan
selectschematic = [accent][[{0}][] pour sélectionner+copier selectschematic = [accent][[{0}][] pour sélectionner+copier
pausebuilding = [accent][[{0}][] pour mettre la construction en pause pausebuilding = [accent][[{0}][] pour mettre la construction en pause
resumebuilding = [scarlet][[{0}][] pour reprendre la construction resumebuilding = [scarlet][[{0}][] pour reprendre la construction
enablebuilding = [scarlet][[{0}][] pour activer la construction
showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface. showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface.
wave = [accent]Vague {0} wave = [accent]Vague {0}
wave.cap = [accent]Vague {0}/{1} wave.cap = [accent]Vague {0}/{1}
@@ -327,9 +333,9 @@ custom = Personnalisé
builtin = Pré-fait builtin = Pré-fait
map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura pas de retour en arrière! map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura pas de retour en arrière!
map.random = [accent]Carte aléatoire map.random = [accent]Carte aléatoire
map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître! Ajouter un [royalNoyau orange[] sur cette carte dans l'éditeur. map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître! Ajouter un [accent]Noyau orange[] sur cette carte dans l'éditeur.
map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins une base [scarlet] non-orange[] dans l'éditeur. map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins un Noyau[scarlet] non-orange[] dans l'éditeur.
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[scarlet] rouge[] sur cette carte dans l'éditeur. map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter un Noyau[scarlet] rouge[] sur cette carte dans l'éditeur.
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
workshop.update = Mettre à jour workshop.update = Mettre à jour
workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0} workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0}
@@ -487,7 +493,7 @@ play = Jouer
campaign = Campagne campaign = Campagne
load = Charger load = Charger
save = Sauvegarder save = Sauvegarder
fps = IPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
@@ -601,9 +607,9 @@ sector.craters.description = Ce cratère est une relique d'anciennes guerres. De
sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il nen reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie. sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il nen reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie.
sector.stainedMountains.description = Plus loin, à lintérieur des terres, se trouvent des montagnes qui n'ont pas touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps denvoyer leurs unités les plus fortes. sector.stainedMountains.description = Plus loin, à lintérieur des terres, se trouvent des montagnes qui n'ont pas touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps denvoyer leurs unités les plus fortes.
sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le. sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le.
sector.tarFields.description = La périphérie dune zone de production de pétrole, situé entre les montagnes et le désert. Lune des rares avec des réserves de goudron utilisables.\nBien quabandonnée, cette zone a quelques forces ennemies dangereuses à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible. sector.tarFields.description = La périphérie dune zone de production de pétrole, situé entre les montagnes et le désert. Lune des rares avec des réserves de goudron utilisables.\nBien quabandonnée, quelques forces ennemies dangereuses se trouvent à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible.
sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu despace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquerez de le regretter. sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu despace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquerez de le regretter.
sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nLennemi est présent ici en grand nombre, recherchant constamment des attaquants. sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur ce minerai et ses nombreuses utilisations.\n\nLennemi est présent ici en grand nombre, recherchant constamment des attaquants.
sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poingnards et des Rampeurs. sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poingnards et des Rampeurs.
sector.biomassFacility.description = Lorigine des spores. Il sagit de linstallation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans lécosystème local ne pouvait concurrencer un organisme aussi envahissant. sector.biomassFacility.description = Lorigine des spores. Il sagit de linstallation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans lécosystème local ne pouvait concurrencer un organisme aussi envahissant.
sector.windsweptIslands.description = Au delà du rivage se trouve cette chaîne dîles reculées. Les registres montrent quil y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines. sector.windsweptIslands.description = Au delà du rivage se trouve cette chaîne dîles reculées. Les registres montrent quil y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines.
@@ -631,17 +637,17 @@ settings.clearcampaignsaves = Supprimer la Campagne
settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne? settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne?
paused = [accent]< Pause > paused = [accent]< Pause >
clear = Effacer clear = Effacer
banned = [scarlet]Bannis banned = [scarlet]Banni
yes = Oui yes = Oui
no = Non no = Non
info.title = Info info.title = Info
error.title = [scarlet]Une erreur s'est produite error.title = [scarlet]Une erreur s'est produite
error.crashtitle = Une erreur s'est produite error.crashtitle = Une erreur s'est produite
unit.nobuild = [scarlet]Cette unité ne peut construire unit.nobuild = [scarlet]Cette unité ne peut pas construire
lastaccessed = [lightgray]Dernier accès: {0} lastaccessed = [lightgray]Dernier accès: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.description = But stat.description = Description
stat.input = Ressource(s) requise(s) stat.input = Ressource(s) requise(s)
stat.output = Ressource(s) produite(s) stat.output = Ressource(s) produite(s)
stat.booster = Boosteur stat.booster = Boosteur
@@ -678,6 +684,7 @@ stat.drillspeed = Vitesse de forage de Base
stat.boosteffect = Effet(s) du Boost stat.boosteffect = Effet(s) du Boost
stat.maxunits = Max d'Unités Actives stat.maxunits = Max d'Unités Actives
stat.health = Santé stat.health = Santé
stat.armor = Armure
stat.buildtime = Durée de construction stat.buildtime = Durée de construction
stat.maxconsecutive = Max Consécutif stat.maxconsecutive = Max Consécutif
stat.buildcost = Coût de construction stat.buildcost = Coût de construction
@@ -693,6 +700,7 @@ stat.lightningchance = Chance d'Éclairs
stat.lightningdamage = Dégats des Éclairs stat.lightningdamage = Dégats des Éclairs
stat.flammability = Inflammabilité stat.flammability = Inflammabilité
stat.radioactivity = Radioactivité stat.radioactivity = Radioactivité
stat.charge = Charge
stat.heatcapacity = Capacité Thermique stat.heatcapacity = Capacité Thermique
stat.viscosity = Viscosité stat.viscosity = Viscosité
stat.temperature = Température stat.temperature = Température
@@ -709,7 +717,7 @@ stat.ammouse = Utilisation de munitions
ability.forcefield = Champ de Force ability.forcefield = Champ de Force
ability.repairfield = Champ de Réparation ability.repairfield = Champ de Réparation
ability.statusfield = Champ de statut ability.statusfield = Champ d'Amélioration
ability.unitspawn = Usine de {0} ability.unitspawn = Usine de {0}
ability.shieldregenfield = Champ de regénération de bouclier ability.shieldregenfield = Champ de regénération de bouclier
ability.movelightning = Déplacement éclair ability.movelightning = Déplacement éclair
@@ -736,7 +744,7 @@ bar.progress = Construction en cours
bar.input = Entrée bar.input = Entrée
bar.output = Sortie bar.output = Sortie
units.processorcontrol = [lightgray]Contrôlée par un processeur units.processorcontrol = [lightgray]Contrôlé par un processeur
bullet.damage = [stat]{0}[lightgray] dégâts bullet.damage = [stat]{0}[lightgray] dégâts
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
@@ -775,8 +783,8 @@ unit.thousands = k
unit.millions = mil unit.millions = mil
unit.billions = Md unit.billions = Md
unit.pershot = /tirs unit.pershot = /tirs
category.purpose = But category.purpose = Description
category.general = Général category.general = Caractéristiques
category.power = Énergie category.power = Énergie
category.liquids = Liquides category.liquids = Liquides
category.items = Objets category.items = Objets
@@ -788,6 +796,7 @@ setting.shadows.name = Ombres
setting.blockreplace.name = Suggestion automatique des Blocs setting.blockreplace.name = Suggestion automatique des Blocs
setting.linear.name = Filtrage linéaire setting.linear.name = Filtrage linéaire
setting.hints.name = Astuces setting.hints.name = Astuces
setting.logichints.name = Astuces pour les commandes des processeurs
setting.flow.name = Afficher le Débit des ressources setting.flow.name = Afficher le Débit des ressources
setting.backgroundpause.name = Pause en Arrière-plan setting.backgroundpause.name = Pause en Arrière-plan
setting.buildautopause.name = Confirmation avant construction setting.buildautopause.name = Confirmation avant construction
@@ -799,10 +808,10 @@ setting.indicators.name = Indicateurs ennemis
setting.autotarget.name = Visée automatique setting.autotarget.name = Visée automatique
setting.keyboard.name = Contrôles Souris+Clavier setting.keyboard.name = Contrôles Souris+Clavier
setting.touchscreen.name = Commandes d'écran tactile setting.touchscreen.name = Commandes d'écran tactile
setting.fpscap.name = Max IPS setting.fpscap.name = Max FPS
setting.fpscap.none = Illimité setting.fpscap.none = Illimité
setting.fpscap.text = {0} IPS setting.fpscap.text = {0} FPS
Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[] setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[]
setting.swapdiagonal.name = Autoriser le placement en diagonale setting.swapdiagonal.name = Autoriser le placement en diagonale
setting.difficulty.training = Entraînement setting.difficulty.training = Entraînement
setting.difficulty.easy = Facile setting.difficulty.easy = Facile
@@ -821,7 +830,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être sans bords[lightgray] (peut nécessiter le redémarrage du jeu) setting.borderlesswindow.name = Fenêtre sans bords[lightgray] (peut nécessiter le redémarrage du jeu)
setting.fps.name = Afficher IPS 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
setting.vsync.name = Synchronisation Verticale setting.vsync.name = Synchronisation Verticale
setting.pixelate.name = Pixeliser setting.pixelate.name = Pixeliser
@@ -858,7 +867,7 @@ category.blocks.name = Sélection des blocs
command.attack = Attaquer command.attack = Attaquer
command.rally = Rallier command.rally = Rallier
command.retreat = Retraite command.retreat = Retraite
command.idle = Pause command.idle = Inactif
placement.blockselectkeys = \n[lightgray]Raccourci: [{0}, placement.blockselectkeys = \n[lightgray]Raccourci: [{0},
keybind.respawn.name = Réapparaître keybind.respawn.name = Réapparaître
keybind.control.name = Controler une Unité keybind.control.name = Controler une Unité
@@ -948,6 +957,8 @@ rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs
rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités
rules.unithealthmultiplier = Multiplicateur de Santé des Unités rules.unithealthmultiplier = Multiplicateur de Santé des Unités
rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités
rules.unitcapvariable = Les Noyaux contribuent à la limite d'Unités actives
rules.unitcap = Limite d'Unités actives de Base
rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi:[lightgray] (blocs) rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi:[lightgray] (blocs)
rules.wavespacing = Temps entre les Vagues:[lightgray] (sec) rules.wavespacing = Temps entre les Vagues:[lightgray] (sec)
rules.buildcostmultiplier = Multiplicateur du prix de construction rules.buildcostmultiplier = Multiplicateur du prix de construction
@@ -1140,7 +1151,7 @@ block.router.name = Routeur
block.distributor.name = Distributeur block.distributor.name = Distributeur
block.sorter.name = Trieur block.sorter.name = Trieur
block.inverted-sorter.name = Trieur Inversé block.inverted-sorter.name = Trieur Inversé
block.message.name = Message block.message.name = Bloc de Message
block.illuminator.name = Illuminateur block.illuminator.name = Illuminateur
block.overflow-gate.name = Barrière de Débordement block.overflow-gate.name = Barrière de Débordement
block.underflow-gate.name = Barrière de Refoulement block.underflow-gate.name = Barrière de Refoulement
@@ -1249,7 +1260,7 @@ block.logic-processor.name = Processeur
block.hyper-processor.name = Hyper Processeur block.hyper-processor.name = Hyper Processeur
block.logic-display.name = Écran block.logic-display.name = Écran
block.large-logic-display.name = Grand Écran block.large-logic-display.name = Grand Écran
block.memory-cell.name = Bloc de mémoire block.memory-cell.name = Cellule de mémoire
block.memory-bank.name = Banque de mémoire block.memory-bank.name = Banque de mémoire
team.blue.name = bleu team.blue.name = bleu
@@ -1286,8 +1297,8 @@ hint.schematicSelect = Retenez [accent][[F][] pour sélectionner des blocs dans
hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement. hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement.
hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement. hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement.
hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler. hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler.
hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger une formation.\n\nSeules les unités terrestres peuvent controller d'autres unités terrestres. hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.\n\nSeules les unités terrestres peuvent controller d'autres unités terrestres.
hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger une formation. hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.
hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités. hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités.
hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités. hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités.
hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement. hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement.
@@ -1363,8 +1374,8 @@ block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très
block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies. block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies.
block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance de créer des éclairs vers les ennemis. block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance de créer des éclairs vers les ennemis. block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité. block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité.
@@ -1374,7 +1385,7 @@ block.force-projector.description = Crée un champ de force hexagonal autour de
block.shock-mine.description = Blesse les ennemis qui marchent dessus. block.shock-mine.description = Blesse les ennemis qui marchent dessus.
block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné. block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné.
block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards. block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards.
block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les déchargent par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne. block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les décharge par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne.
block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits. block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits.
block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment. block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée. block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée.
@@ -1393,13 +1404,13 @@ block.conduit.description = Bloc de transport de liquide de base, faisant avance
block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards. block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards.
block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire. block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire.
block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide. block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide.
block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la sortie quand la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants. block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants.
block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits. block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits.
block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment. block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance. block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance.
block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement. block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement.
block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions. block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions.
block.surge-tower.description = Un transmetteur énergétique de très grande portée mais avec moins de connections disponibles. block.surge-tower.description = Un transmetteur énergétique à très grande portée mais avec moins de connections disponibles.
block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si lautre côté présente moins dénergie en stock. Idéal pour protéger les lieux de production d'énergie. block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si lautre côté présente moins dénergie en stock. Idéal pour protéger les lieux de production d'énergie.
block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin. block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin.
block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale.
@@ -1418,7 +1429,7 @@ block.laser-drill.description = Permet de forer bien plus vite grâce à la tech
block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner. block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner.
block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité. block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité.
block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères. block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères.
block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement lincubateur initial des spores qui couvrent maintenant Serpulo. block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement lincubateur initial des spores, qui couvrent maintenant Serpulo.
block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité. block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité.
block.core-shard.description = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver. block.core-shard.description = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver.
block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équippé de propulseurs de lancement à usage unique. Equipped with single-use launch thrusters. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire. block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équippé de propulseurs de lancement à usage unique. Equipped with single-use launch thrusters. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire.
@@ -1445,7 +1456,7 @@ block.cyclone.description = Une grande tourelle qui tire rapidement des balles e
block.spectre.description = Une tourelle massive à double cannon qui tire de puissantes balles perçantes. block.spectre.description = Une tourelle massive à double cannon qui tire de puissantes balles perçantes.
block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement. block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement.
block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité. block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité.
block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. block.repair-point.description = Soigne l'unité endommagée la plus proche.
block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés. block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés.
block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts. block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts.
block.tsunami.description = Tire un puissant jet de liquide aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau. block.tsunami.description = Tire un puissant jet de liquide aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau.
@@ -1453,7 +1464,7 @@ block.silicon-crucible.description = Raffine du silicium avec du sable et du cha
block.disassembler.description = Cette verion avancée du séparateur peut produire du thorium. block.disassembler.description = Cette verion avancée du séparateur peut produire du thorium.
block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner. block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner.
block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unité depuis leurs usines ou bien des conteneurs. block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unité depuis leurs usines ou bien des conteneurs.
block.payload-router.description = Distribue les chargements qui entrent dans 3 directions différentes. block.payload-router.description = Distribue les chargements qui entrent jusqu'à 3 directions différentes.
block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes. block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes.
block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
@@ -1479,21 +1490,21 @@ unit.scepter.description = Tire un barrage de balles superchargées aux ennemis
unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches. unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches.
unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler. unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler. unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est dotée d'un champ de force. unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est doté d'un champ de force.
unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler. unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler.
unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur de la plupart des terrains. unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur la plupart des terrains.
unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion. unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion.
unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur de la plupart des terrains. unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur la plupart des terrains.
unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur de la plupart des terrains. unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains.
unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur de la plupart des terrains. unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains.
unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur de la plupart des terrains. unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur la plupart des terrains.
unit.flare.description = Tire des balles normales cibles terrestres. unit.flare.description = Tire des balles normales aux cibles terrestres.
unit.horizon.description = Largue des bombes sur des cibles terrestres. unit.horizon.description = Largue des bombes sur des cibles terrestres.
unit.zenith.description = Tire des salves de missiles sur les ennemis proches. unit.zenith.description = Tire des salves de missiles sur les ennemis proches.
unit.antumbra.description = Tire un barrage de balles aux ennemis proches. unit.antumbra.description = Tire un barrage de balles aux ennemis proches.
unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches. unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches.
unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche. unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche.
unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs au thorium) et assiste les autres unités lorsqu'elles construisent. unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs à thorium) et assiste les autres unités lorsqu'elles construisent.
unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres. unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres.
unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne. unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne.
unit.oct.description = Protège les alliés proches avec son champ de force auto-regénérant. Capable de transporter des blocs et de grosses unités terrestres. unit.oct.description = Protège les alliés proches avec son champ de force auto-regénérant. Capable de transporter des blocs et de grosses unités terrestres.
@@ -1505,3 +1516,139 @@ unit.omura.description = Tire avec un canon à rails à longue portée, une puis
unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures. unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures.
unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures. unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures.
unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures. unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures.
lst.read = Lit un nombre depuis un bloc de mémoire relié au processeur.
lst.write = Écrit un nombre dans un bloc de mémoire relié au processeur.
lst.print = Ajoute du texte dans la mémoire tampon de l'imprimante.\nNe montrera aucun texte tant que [accent]Print Flush[] ne sera pas utilisé.
lst.draw = Ajoute une opération dans la mémoire tampon de dessin.\nNe montrera aucune image tant que [accent]Draw Flush[] ne sera pas utilisé.
lst.drawflush = Affiche les opérations [accent]Draw[] en file d'attente vers un écran.
lst.printflush = Affiche les opérations [accent]Print[] en file d'attente vers un bloc de message.
lst.getlink = Obtient un lien de processeur par index. Commence à 0.
lst.control = Contrôle un bâtiment.
lst.radar = Localise des unités dans la portée d'un bâtiment.
lst.sensor = Récupère des données depuis un bâtiment ou une unité.
lst.set = Définit une variable.
lst.operation = Éffectue une opération sur 1 ou 2 variables.
lst.end = Saute au sommet de la série dinstructions.
lst.jump = Saute conditionnelement vers une autre instruction.
lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[].
lst.unitcontrol = Contrôle l'unité actuellement liée.
lst.unitradar = Localise des unités dans la portée de l'unité actuellement liée.
lst.unitlocate = Localise une position ou un type spécifique de bâtiment, n'importe où sur la carte.\nRequiert une unité reliée.
lenum.type = Type de bâtiment/unité.\nPar exemple, pour tout routeur, cela retournera [accent]@router[].\nPas en texte.
lenum.shoot = Tire à une position donnée.
lenum.shootp = Tire à une unité/bâtiment avec la prédiction de mouvement.
lenum.configure = La configuration d'un bâtiment. Par exemple, l'objet sélectionné dans un trieur.
lenum.enabled = Retourne si le bloc est activé ou pas.
laccess.color = La couleur d'un illuminateur.
graphicstype.clear = Remplit lécran dune couleur.
graphicstype.color = Définit une couleur pour les prochaines opérations de dessin.
graphicstype.stroke = Définit la largeur d'une ligne.
graphicstype.line = Dessine un segment de droite.
graphicstype.rect = Dessine un rectangle.
graphicstype.linerect = Dessine le contour d'un rectangle.
graphicstype.poly = Dessine un polygone régulier.
graphicstype.linepoly = Dessine le contour un polygone régulier.
graphicstype.triangle = Dessine un triangle.
graphicstype.image = Dessine une image venant du contenu du jeu.\nex: [accent]@router[] ou [accent]@dagger[].
lenum.always = Toujours [accent]true[].
lenum.idiv = Division entière.
lenum.div = Division.\nRetourne [accent]null[] lors d'une division par zéro.
lenum.mod = Modulo.
lenum.equal = Égalité. Conversion des types.\nLes objets non-nuls comparés avec des nombres deviennent 1, sinon 0.
lenum.notequal = Inégalité. Conversion des types.
lenum.strictequal = Égalité stricte. Ne convertit pas les types.\nPeut être utilisé pour vérifier les valeurs [accent]null[].
lenum.shl = Décalage de bits gauche.
lenum.shr = Décalage de bits droite.
lenum.or = Opération binaire OR.
lenum.land = Opération logique AND.
lenum.and = Opération binaire AND.
lenum.not = Opération binaire flip.
lenum.xor = Opération binaire XOR.
lenum.min = Le minimum des 2 nombres.
lenum.max = Le maximum des 2 nombres.
lenum.angle = Angle d'un vecteur en degrés.
lenum.len = Longueur d'un vecteur.
lenum.sin = Sinus, en degrés.
lenum.cos = Cosinus, en degrés.
lenum.tan = Tangente, en degrés.
#not a typo, look up 'range notation'
lenum.rand = Nombre aléatoire dans la plage [0, valeur].
lenum.log = Logarithme naturel (ln).
lenum.log10 = Logarithme de base 10.
lenum.noise = Bruit simplex 2D.
lenum.abs = Valeur absolue.
lenum.sqrt = Racine carrée.
lenum.any = N'importe quelle unité.
lenum.ally = Unité alliée.
lenum.attacker = Unité avec des armes.
lenum.enemy = Unité ennemie.
lenum.boss = Gardien.
lenum.flying = Unité volante.
lenum.ground = Unité terrestre.
lenum.player = Unité controllée par un joueur.
lenum.ore = Gisement de minerai.
lenum.damaged = Bâtiments alliés endommagés.
lenum.spawn = Point d'apparition ennemi.\nPeut être un noyau ou une position.
lenum.building = Bâtiment dans un groupe spécifique.
lenum.core = N'importe quel noyau.
lenum.storage = Bâtiments de stockage, un coffre-fort par exemple.
lenum.generator = Bâtiments générant de l'énergie.
lenum.factory = Bâtiments traitant des ressources.
lenum.repair = Points de réparation.
lenum.rally = Centres de commandes.
lenum.battery = N'importe quelle batterie.
lenum.resupply = Points de rechargement.\nUtile seulement lorsque [accent]"munitions"[] sont limitées.
lenum.reactor = Réacteur à Impact/Thorium.
lenum.turret = N'importe quelle tourelle.
sensor.in = Les bâtiments/unités à analyser.
radar.from = Bâtiment de détection.\nLa portée du détecteur est limitée à la portée du bâtiment.
radar.target = Filtre pour les unités à détecter.
radar.and = Filtres additionnels
radar.order = Ordre de filtrage. 0 pour inverser.
radar.sort = Valeur par laquelle les résultats sont triés.
radar.output = Variable dans laquelle écrire l'unité retournée.
unitradar.target = Filtre pour les unités à détecter.
unitradar.and = Filtres additionnels
unitradar.order = Ordre de filtrage. 0 pour inverser.
unitradar.sort = Valeur par laquelle les résultats sont triés.
unitradar.output = Variable dans laquelle écrire l'unité retournée.
control.of = Bâtiment à contrôler.
control.unit = Unité/bâtiment à viser.
control.shoot = Sil faut tirer ou non.
unitlocate.enemy = S'il faut détecter les bâtiments ennemis au non.
unitlocate.found = Retourne un boolean s'il l'objet a été trouvé ou non.
unitlocate.building = Retourne une variable pour le bâtiment localisé.
unitlocate.outx = Retourne la coordonnée X.
unitlocate.outy = Retourne la coordonnée Y.
unitlocate.group = Le groupe de bâtiments à rechercher.
lenum.stop = Empêche l'unité de bouger/miner/construire.
lenum.move = Bouge vers la position exacte.
lenum.approach = Approche une position avec un rayon.
lenum.pathfind = Détermine un itinéraire et bouge vers le point d'apparition ennemi.
lenum.target = Tire vers la position donnée.
lenum.targetp = Tire sur un cible avec la prédiction de mouvement.
lenum.itemdrop = Lâche un objet.
lenum.itemtake = Prend un objet depuis un bâtiment.
lenum.paydrop = Lâche le chargement actuel.
lenum.paytake = Prend un chargement à la position actuelle.
lenum.flag = Drapeau numérique d'une unité.
lenum.mine = Mine à une position donnée.
lenum.build = Construit une structure.
lenum.getblock = Récupère des données sur un bâtiment et son type aux coordonnées données.\nL'unité doit se trouver dans la portée de la position.\nLes blocs solides qui ne sont pas des bâtiments auront le type [accent]@solid[].
lenum.within = Vérifie si l'unité est près de la position.
lenum.boost = Active/Désactive le boost.

File diff suppressed because it is too large Load Diff

View File

@@ -41,11 +41,12 @@ be.ignore = Abaikan
be.noupdates = Tidak ada pembaruan yang ditemukan. be.noupdates = Tidak ada pembaruan yang ditemukan.
be.check = Cek versi baru be.check = Cek versi baru
mod.featured.title = Browser mod
mod.featured.dialog.title = Browser Mod mod.featured.dialog.title = Browser Mod
mods.browser.selected = Mod yang Dipilih mods.browser.selected = Mod yang Dipilih
mods.browser.add = Unduh Mod mods.browser.add = Unduh Mod
mods.github.open = Buka di GitHub mods.github.open = Buka di GitHub
mods.browser.sortdate = Urut berdasarkan waktu
mods.browser.sortstars = Urut berdasarkan bintang
schematic = Skema schematic = Skema
schematic.add = Menyimpan skema... schematic.add = Menyimpan skema...
@@ -90,6 +91,7 @@ joingame = Bermain Bersama
customgame = Permainan Modifikasi customgame = Permainan Modifikasi
newgame = Permainan Baru newgame = Permainan Baru
none = <kosong> none = <kosong>
none.found = [lightgray]<tidak ditemukan>
minimap = Peta Kecil minimap = Peta Kecil
position = Posisi position = Posisi
close = Tutup close = Tutup
@@ -1383,7 +1385,7 @@ block.inverted-sorter.description = Sama seperti penyortir, melainkan mengeluark
block.router.description = Menerima bahan dari satu arah dan mengeluarkannya ke 3 arah yang sama. Bisa juga menyimpan sejumlah bahan. Berguna untuk memisahkan bahan dari satu sumber ke target yang banyak. block.router.description = Menerima bahan dari satu arah dan mengeluarkannya ke 3 arah yang sama. Bisa juga menyimpan sejumlah bahan. Berguna untuk memisahkan bahan dari satu sumber ke target yang banyak.
block.router.details = Bisa sangat menggangu. Jangan meletakannya disamping input produksi, karena bisa tersumbat oleh output. block.router.details = Bisa sangat menggangu. Jangan meletakannya disamping input produksi, karena bisa tersumbat oleh output.
block.distributor.description = Pemisah canggih yang memisah item ke 7 arah berbeda bersamaan. block.distributor.description = Pemisah canggih yang memisah item ke 7 arah berbeda bersamaan.
block.overflow-gate.description = Kombinasi antara pemisah dan penyortir yang hanya mengeluarkan item ke kiri dan/atau ke kanan jika bagian depan tertutup. block.overflow-gate.description = Hanya mengeluarkan item ke kiri dan/atau ke kanan jika bagian depan tertutup.
block.underflow-gate.description = Kebalikan dari gerbang luap. Mengeluarkan ke depan jika kanan dan kiri tertutup. block.underflow-gate.description = Kebalikan dari gerbang luap. Mengeluarkan ke depan jika kanan dan kiri tertutup.
block.mass-driver.description = Blok item transportasi tercanggih. Membawa beberapa item dan menembaknya ke penggerak massal lainnya dari arah yang jauh. block.mass-driver.description = Blok item transportasi tercanggih. Membawa beberapa item dan menembaknya ke penggerak massal lainnya dari arah yang jauh.
block.mechanical-pump.description = Pompa murah dengan pengeluaran yang pelan, tetapi tidak mengkonsumsi tenaga. block.mechanical-pump.description = Pompa murah dengan pengeluaran yang pelan, tetapi tidak mengkonsumsi tenaga.

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@ link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
link.google-play.description = Strona w sklepie Google Play link.google-play.description = Strona w sklepie Google Play
link.f-droid.description = Wykaz Katalogu F-Droid link.f-droid.description = Wykaz Katalogu F-Droid
link.wiki.description = Oficjana Wiki Mindustry link.wiki.description = Oficjalna Wiki Mindustry
link.suggestions.description = Zaproponuj nowe funkcje link.suggestions.description = Zaproponuj nowe funkcje
link.bug.description = Znalazłeś błąd? Zgłoś go tutaj link.bug.description = Znalazłeś błąd? Zgłoś go tutaj
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
@@ -1277,7 +1277,7 @@ hint.placeTurret = Postaw \uf861 [accent]Działka[] by bronić się przed wrogam
hint.breaking = Użyj [accent]Prawego przycisku myszy[] i przeciągnij by zniszczyć bloki. hint.breaking = Użyj [accent]Prawego przycisku myszy[] i przeciągnij by zniszczyć bloki.
hint.breaking.mobile = Aktywuj \ue817 [accent]ikonę młota[] w dolnym prawym rogu by zniszczyć bloki.\n\nPrzytrymaj swój palec i przeciągij by wybrać wiele bloków do zniszczenia. hint.breaking.mobile = Aktywuj \ue817 [accent]ikonę młota[] w dolnym prawym rogu by zniszczyć bloki.\n\nPrzytrymaj swój palec i przeciągij by wybrać wiele bloków do zniszczenia.
hint.research = Klikij przycisk \ue875 [accent]Badań[] by odkrwyać nowe technologie. hint.research = Klikij przycisk \ue875 [accent]Badań[] by odkrwyać nowe technologie.
hint.research.mobile = Użyj przycisku \ue875 [accent]Badań[] w \ue88c [accent]Menu[] by odkrwyać nowe technologie. hint.research.mobile = Użyj przycisku \ue875 [accent]Badań[] w \ue88c [accent]Menu[] by odkrywać nowe technologie.
hint.unitControl = Przytrzymaj [accent][[Lewy CTRL][] i [accent]kliknij[] by kontrolować sojusznicze jednostki i działka. hint.unitControl = Przytrzymaj [accent][[Lewy CTRL][] i [accent]kliknij[] by kontrolować sojusznicze jednostki i działka.
hint.unitControl.mobile = [accent][Kliknij dwukrotnie[] by kontrolować sojusznicze jednostki i działka. hint.unitControl.mobile = [accent][Kliknij dwukrotnie[] by kontrolować sojusznicze jednostki i działka.
hint.launch = Gdy zebrałeś wystarczająco materiałów możesz [accent]Wystrzelić[] wybierając \ue827 [accent]Mapę[] w dolnym prawym rogu. hint.launch = Gdy zebrałeś wystarczająco materiałów możesz [accent]Wystrzelić[] wybierając \ue827 [accent]Mapę[] w dolnym prawym rogu.
@@ -1290,10 +1290,10 @@ hint.command = Kliknij [accent][[G][] by ukształtować formacje z pobliskich je
hint.command.mobile = [accent][[Podwójne kliknięcie][] kształtuje formacje z pobliskich jednostek. hint.command.mobile = [accent][[Podwójne kliknięcie][] kształtuje formacje z pobliskich jednostek.
hint.payloadPickup = Kliknij [accent][[[] by podnieść małe bloki lub jednostki. hint.payloadPickup = Kliknij [accent][[[] by podnieść małe bloki lub jednostki.
hint.payloadPickup.mobile = [accent]Kliknij i przytrzymaj[] mały blok by go podnieść. hint.payloadPickup.mobile = [accent]Kliknij i przytrzymaj[] mały blok by go podnieść.
hint.payloadDrop = Kliknij [accent]][] by opuścić podniesoiny towar. hint.payloadDrop = Kliknij [accent]][] by opuścić podniesiony towar.
hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuścić podniesoiny towar. hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuścić podniesiony towar.
hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary. hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary.
hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekuzują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzły Prądu[]. hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekazują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzły Prądu[].
hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] oraz [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak \uf835 [accent]Naładowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć się strażników. hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] oraz [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak \uf835 [accent]Naładowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć się strażników.
hint.coreUpgrade = Rdzenie mogą być ulepszone poprzez [accent]płożenie na nich rdzeń wyższego poziomu[].\n\nPołóż  rdzeń [accent]Fundacji[] na  rdzeń:[accent]Odłamek[] core. Żadna przeszkoda ani blok nie może stać na miejscu rdzenia. hint.coreUpgrade = Rdzenie mogą być ulepszone poprzez [accent]płożenie na nich rdzeń wyższego poziomu[].\n\nPołóż  rdzeń [accent]Fundacji[] na  rdzeń:[accent]Odłamek[] core. Żadna przeszkoda ani blok nie może stać na miejscu rdzenia.
hint.presetLaunch = Szare [accent]sektory[], takie jak [accent]Zamrożony Las[], to sektory do których możesz dotrzeć z każdego miejsca. Nie wymagają podbicia pobliskiego terenu.\n\n[accent]Ponumerowane sektory[], takie jak ten, [accent]są dodatkowe[]. hint.presetLaunch = Szare [accent]sektory[], takie jak [accent]Zamrożony Las[], to sektory do których możesz dotrzeć z każdego miejsca. Nie wymagają podbicia pobliskiego terenu.\n\n[accent]Ponumerowane sektory[], takie jak ten, [accent]są dodatkowe[].
@@ -1357,8 +1357,8 @@ block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia
block.copper-wall-large.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.\nObejmuje wiele kratek. block.copper-wall-large.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.\nObejmuje wiele kratek.
block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami. block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.
block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek. block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek.
block.plastanium-wall.description = Specjajny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów. block.plastanium-wall.description = Specjalny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów.
block.plastanium-wall-large.description = Specjajny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów.\nObejmuje wiele kratek. block.plastanium-wall-large.description = Specjalny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów.\nObejmuje wiele kratek.
block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami. block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami.
block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek. block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek.
block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków. block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków.

View File

@@ -41,11 +41,13 @@ be.ignore = Ignoră
be.noupdates = Niciun update disponibil. be.noupdates = Niciun update disponibil.
be.check = Verifică updateurile be.check = Verifică updateurile
mod.featured.title = Mod browser mods.browser = Browser de Moduri
mod.featured.dialog.title = Mod Browser (Neterminat)
mods.browser.selected = Mod selectat mods.browser.selected = Mod selectat
mods.browser.add = Instalează mods.browser.add = Instalare
mods.github.open = Vezi mods.browser.reinstall = Reinstal.
mods.github.open = Github
mods.browser.sortdate = Cele mai recente
mods.browser.sortstars = Cele mai multe stele
schematic = Schemă schematic = Schemă
schematic.add = Salvează Schema... schematic.add = Salvează Schema...
@@ -111,14 +113,16 @@ committingchanges = Se Încarcă Schimbările
done = Gata done = Gata
feature.unsupported = Dispozitivul tău nu suportă această funcție. feature.unsupported = Dispozitivul tău nu suportă această funcție.
mods.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportează orice probleme apărute pe Githubul Mindustry. mods.initfailed = [red]⚠[] Instanța Mindustry precedentă a eșuat la inițializare. De obicei se întâmplă din cauza unui mod care nu se acționează cum trebuie.\n\nPt a preveni un lanț de crashuri continue, [red]toate modurile au fost dezactivate.[]\n\nPoți dezactiva asta din [accent]Setări->Joc->Dezactivează Modurile în Cazul unui Crash la Pornire[].
mods = Moduri mods = Moduri
mods.none = [lightgray]Nu s-au găsit moduri! mods.none = [lightgray]Nu s-au găsit moduri!
mods.guide = Ghid de Modding mods.guide = Ghid de Modding
mods.report = Raportează Bug mods.report = Raportează Bug
mods.openfolder = Deschide Folder mods.openfolder = Deschide Folder
mods.viewcontent = Vezi Conținut
mods.reload = Reîncarcă mods.reload = Reîncarcă
mods.reloadexit = Jocul se va opri ca să reîncarce modurile. mods.reloadexit = Jocul se va opri ca să reîncarce modurile.
mod.installed = [[Instalat]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Activat mod.enabled = [lightgray]Activat
mod.disabled = [scarlet]Dezactivat mod.disabled = [scarlet]Dezactivat
@@ -212,9 +216,11 @@ server.hidden = Ascunse
trace = Urmărește Jucător trace = Urmărește Jucător
trace.playername = Nume jucător: [accent]{0} trace.playername = Nume jucător: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = ID unic: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = Client Mobil: [accent]{0} trace.mobile = Client Mobil: [accent]{0}
trace.modclient = Client Personalizat: [accent]{0} trace.modclient = Client Personalizat: [accent]{0}
trace.times.joined = A Intrat: de [accent]{0}[] ori
trace.times.kicked = Dat Afară: de [accent]{0}[] ori
invalidid = ID client invalid! Raportează bugul. invalidid = ID client invalid! Raportează bugul.
server.bans = Interziși server.bans = Interziși
server.bans.none = Nu s-au găsit jucători intreziși! server.bans.none = Nu s-au găsit jucători intreziși!
@@ -308,6 +314,7 @@ cancelbuilding = [accent][[{0}][] pt a curăța planul
selectschematic = [accent][[{0}][] pt selectare+copiere selectschematic = [accent][[{0}][] pt selectare+copiere
pausebuilding = [accent][[{0}][] pt a face o pauză de la construit pausebuilding = [accent][[{0}][] pt a face o pauză de la construit
resumebuilding = [scarlet][[{0}][] pt a continua construitul resumebuilding = [scarlet][[{0}][] pt a continua construitul
enablebuilding = [scarlet][[{0}][] pt a construi
showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața. showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața.
wave = [accent]Valul {0} wave = [accent]Valul {0}
wave.cap = [accent]Valul {0}/{1} wave.cap = [accent]Valul {0}/{1}
@@ -679,6 +686,7 @@ stat.drillspeed = Viteză Burghiu (Bază)
stat.boosteffect = Efect de Îmbunătățire stat.boosteffect = Efect de Îmbunătățire
stat.maxunits = Maxim Unități Active stat.maxunits = Maxim Unități Active
stat.health = Viață stat.health = Viață
stat.armor = Armură
stat.buildtime = Timp Construcție stat.buildtime = Timp Construcție
stat.maxconsecutive = Maxim Consecutive stat.maxconsecutive = Maxim Consecutive
stat.buildcost = Cost Construcție stat.buildcost = Cost Construcție
@@ -697,6 +705,7 @@ stat.radioactivity = Radioactivitate
stat.heatcapacity = Capacitate de Căldură stat.heatcapacity = Capacitate de Căldură
stat.viscosity = Vâscozitate stat.viscosity = Vâscozitate
stat.temperature = Temperatură stat.temperature = Temperatură
stat.charge = Sarcină Electrică
stat.speed = Viteză stat.speed = Viteză
stat.buildspeed = Viteză Construcție stat.buildspeed = Viteză Construcție
stat.minespeed = Viteză Minare stat.minespeed = Viteză Minare
@@ -789,9 +798,12 @@ setting.shadows.name = Umbre
setting.blockreplace.name = Sugestii Plasare Automats setting.blockreplace.name = Sugestii Plasare Automats
setting.linear.name = Filtrare Liniară setting.linear.name = Filtrare Liniară
setting.hints.name = Indicii setting.hints.name = Indicii
setting.logichints.name = Indicii Procesoare Logice
setting.flow.name = Afișează Rata de Curgere a lichidelor setting.flow.name = Afișează Rata de Curgere a lichidelor
setting.buildautopause.name = Autopauză de la Construit setting.buildautopause.name = Autopauză de la Construit
setting.backgroundpause.name = Pune Pauză în Fundal setting.backgroundpause.name = Pune Pauză în Fundal
setting.doubletapmine.name = Dublu-Click pt a Mina
setting.modcrashdisable.name = Dezactivează Modurile în Cazul unui Crash la Pornire
setting.animatedwater.name = Suprafețe Animate setting.animatedwater.name = Suprafețe Animate
setting.animatedshields.name = Scuturi Animate setting.animatedshields.name = Scuturi Animate
setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[] setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[]
@@ -949,6 +961,8 @@ rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor
rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților
rules.unithealthmultiplier = Multiplicatorul Vieții Unităților rules.unithealthmultiplier = Multiplicatorul Vieții Unităților
rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților
rules.unitcapvariable = Nucleele Contribuie la Limita Unităților
rules.unitcap = Limita de Bază a Unităților
rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate)
rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec) rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec)
rules.buildcostmultiplier = Multiplicatorul Costului Construcției rules.buildcostmultiplier = Multiplicatorul Costului Construcției
@@ -1029,7 +1043,7 @@ unit.omura.name = Omura
unit.alpha.name = Alpha unit.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
unit.scepter.name = Septer unit.scepter.name = Scepter
unit.reign.name = Reign unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
@@ -1139,10 +1153,6 @@ block.armored-conveyor.name = Bandă Armată
block.junction.name = Intersecție block.junction.name = Intersecție
block.router.name = Router block.router.name = Router
block.distributor.name = Distributor block.distributor.name = Distributor
#experimental, pot fi șterse în viitor
block.block-forge.name = Forjă de Blocuri
block.block-loader.name = Încărcător de Blocuri
block.block-unloader.name = Descărcător de Blocuri
block.sorter.name = Sortator block.sorter.name = Sortator
block.inverted-sorter.name = Sortator Invers block.inverted-sorter.name = Sortator Invers
block.message.name = Mesaj block.message.name = Mesaj
@@ -1222,7 +1232,7 @@ block.overdrive-projector.name = Proiector de Suprasolicitare
block.force-projector.name = Proiector de Forță block.force-projector.name = Proiector de Forță
block.arc.name = Arc block.arc.name = Arc
block.rtg-generator.name = Generator RTG block.rtg-generator.name = Generator RTG
block.spectre.name = Specter block.spectre.name = Spectre
block.meltdown.name = Meltdown block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Container block.container.name = Container
@@ -1243,6 +1253,10 @@ block.disassembler.name = Dezasamblator
block.silicon-crucible.name = Creuzet de Silicon block.silicon-crucible.name = Creuzet de Silicon
block.overdrive-dome.name = Dom de Suprasolicitare block.overdrive-dome.name = Dom de Suprasolicitare
block.interplanetary-accelerator.name = Accelerator Interplanetar block.interplanetary-accelerator.name = Accelerator Interplanetar
#experimental, pot fi șterse în viitor
block.block-forge.name = Forjă de Blocuri
block.block-loader.name = Încărcător de Blocuri
block.block-unloader.name = Descărcător de Blocuri
block.switch.name = Întrerupător block.switch.name = Întrerupător
block.micro-processor.name = Microprocesor block.micro-processor.name = Microprocesor
@@ -1384,8 +1398,8 @@ block.inverted-sorter.description = Similar sortatorului standard, dar materialu
block.router.description = Distribuie materialele primite în alte 3 direcții în mod egal. block.router.description = Distribuie materialele primite în alte 3 direcții în mod egal.
block.router.details = Un rău necesar. Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produșii blocurilor. block.router.details = Un rău necesar. Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produșii blocurilor.
block.distributor.description = Distribuie materialele primite în alte 7 direcții în mod egal. block.distributor.description = Distribuie materialele primite în alte 7 direcții în mod egal.
block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat. Nu poate fi folosită lângă alte porți. block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat.
block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate. Nu poate fi folosită lângă alte porți. block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate.
block.mass-driver.description = Dispozitiv folosit pt transportul materialelor pe distanțe mari. Adună mai multe materiale și apoi le lansează până la un alt distributor în masă pe o rază mare. block.mass-driver.description = Dispozitiv folosit pt transportul materialelor pe distanțe mari. Adună mai multe materiale și apoi le lansează până la un alt distributor în masă pe o rază mare.
block.mechanical-pump.description = Pompează lichide din mediul înconjurător. Nu necesită electricitate. block.mechanical-pump.description = Pompează lichide din mediul înconjurător. Nu necesită electricitate.
block.rotary-pump.description = Pompează lichide din mediul înconjurător. Necesită electricitate. block.rotary-pump.description = Pompează lichide din mediul înconjurător. Necesită electricitate.
@@ -1445,6 +1459,7 @@ block.ripple.description = Lovește cu capsule către inamici pe distanțe mari.
block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere. block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere.
block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere. block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere.
block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera.
block.foreshadow.description = Trage către o țintă cu un glonț imens pe distanțe lungi.
block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate.
block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate. block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate.
block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le. block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le.
@@ -1505,3 +1520,146 @@ unit.omura.description = Trage cu un railgun cu gloanțe care penetrează scutur
unit.alpha.description = Apără nucleul Shard de inamici. Construiește structuri. unit.alpha.description = Apără nucleul Shard de inamici. Construiește structuri.
unit.beta.description = Apără nucleul Foundation de inamici. Construiește structuri. unit.beta.description = Apără nucleul Foundation de inamici. Construiește structuri.
unit.gamma.description = Apără nucleul Core de inamici. Construiește structuri. unit.gamma.description = Apără nucleul Core de inamici. Construiește structuri.
lst.read = Citește un număr dintr-o celulă de memorie conectată.
lst.write = Scrie un număr într-o celulă de memorie conectată.
lst.print = Adaugă text în bufferul de tipărire.\nNu tipărește decât când se execută [accent]Print Flush[].
lst.draw = Adaugă o operație în bufferul de desenare.\nNu afișează decât când se execută [accent]Draw Flush[].
lst.drawflush = Afișează pe un monitor instrucțiunile [accent]Draw[] aflate în așteptare.
lst.printflush = Tipărește într-un bloc Mesaj instrucțiunile [accent]Print[] aflate în așteptare.
lst.getlink = Obține o conexiune a procesorului după index. Începe de la 0.
lst.control = Controlează o clădire.
lst.radar = Localizează unitățile aflate în jurul unei clădiri. Are o anumită rază de acțiune.
lst.sensor = Obține date de la o clădire sau unitate.
lst.set = Setează o variabilă.
lst.operation = Efectuează o operație pe 1-2 variabile.
lst.end = Sari la începutul listei de instrucțiuni.
lst.jump = Dacă condiția este adevărată, mergi la o altă instrucțiune.
lst.unitbind = Controlează următoarea unitate de tipul selectat și reține-o în [accent]@unit[].
lst.unitcontrol = Controlează unitatea controlată de procesor.
lst.unitradar = Localizează unitățile din jurul unității controlate de procesor.
lst.unitlocate = Localizează o poziție/clădire specifică oriunde pe hartă.\nNecesită o unitate controlată de procesor.
logic.nounitbuild = [red]Nu ai voie să construiești cu unitățile folosind procesoare.
lenum.type = Tipul clădirii/unității.\nde ex.: pt orice Router, va returna [accent]@router[].\nNu e un șir de caractere.
lenum.shoot = Lovește către o locație.
lenum.shootp = Lovește către o unitate/clădire. Anticipează viteza țintei și a proiectilului.
lenum.configure = Configurația clădirii, de ex. materialul selectat pt Sortator.
lenum.enabled = Specifică dacă clădirea este pornită.
laccess.color = Culoarea iluminatorului.
laccess.controller = Controlorul unității. Dacă e controlată de procesor, returnează procesorul.\nDacă e într-o formație, returnează liderul.\nAltfel, returnează unitatea însăși.
laccess.dead = Specifică dacă o unitate sau clădire a murit/nu mai e validă.
laccess.controlled = Returnează:\n[accent]@ctrlProcessor[] dacă controlorul unității e procesor\n[accent]@ctrlPlayer[] dacă controlorul unității/clădirii e jucător\n[accent]@ctrlFormation[] dacă unitatea e într-o formație\nAltfel dă 0.
laccess.commanded = [red]Învechit. Se va șterge![]\nFolosește [accent]controlled[].
graphicstype.clear = Umple monitorul cu o culoare.
graphicstype.color = Setează culoarea pt următoarele instrucțiuni Draw.
graphicstype.stroke = Setează grosimea liniei.
graphicstype.line = Desenează un segment de linie.
graphicstype.rect = Desenează un dreptunghi.
graphicstype.linerect = Desenează conturul unui dreptunghi.
graphicstype.poly = Desenează un poligon regulat.
graphicstype.linepoly = Desenează conturul unui poligon regulat.
graphicstype.triangle = Desenează un triunghi.
graphicstype.image = Desenează imaginea unui obiect din joc.\nde ex.: [accent]@router[] sau [accent]@dagger[].
lenum.always = Mereu adevărat.
lenum.idiv = Împărțirea naturală a numerelor (int).
lenum.div = Împărțirea.\nReturnează [accent]null[] dacă împarți la 0.
lenum.mod = Modulo (restul împărțirii).
lenum.equal = Egal. Convertește tipurile variabilelor.\nObiectele nenule comparate cu numere devin 1, cele nule devin 0.
lenum.notequal = Nu e egal. Convertește tipurile variabilelor.
lenum.strictequal = Egalitate strictă. Nu convertește tipurile variabilelor.\nPoate fi folosit pt a verifica dacă ceva este [accent]null[].
lenum.shl = Shift left pe biți.
lenum.shr = Shift right pe biți.
lenum.or = OR/SAU. Ține cont de biți.
lenum.land = Logical AND/ȘI logic. Nu ține cont de biți.
lenum.and = AND/ȘI. Ține cont de biți.
lenum.not = NOT. Inversează biții.
lenum.xor = XOR/disjuncție exclusivă. Ține cont de biți.
lenum.min = Minimul a două numere.
lenum.max = Maximul a două numere.
lenum.angle = Unghiul unui vector în grade.
lenum.len = Lungimea unui vector.
lenum.sin = Sinus în grade.
lenum.cos = Cosinus în grade.
lenum.tan = Tangentă în grade.
#cea de mai jos nu-i o greșeală, caută pe net notarea intervalelor în matematică
lenum.rand = Număr natural aleatoriu în intervalul [0, val).
lenum.log = Logaritm natural (ln).
lenum.log10 = Logaritm în baza 10.
lenum.noise = 2D simplex noise.
lenum.abs = Valoarea absolută.
lenum.sqrt = Radical/rădăcina pătrată.
lenum.any = Orice unitate.
lenum.ally = Unitate aliată.
lenum.attacker = Unitate cu armă.
lenum.enemy = Unitate inamică.
lenum.boss = Unitate gardian.
lenum.flying = Unitate care zboară.
lenum.ground = Unitate de artilerie.
lenum.player = Unitate controlată de un jucător.
lenum.ore = Depozit de minereu.
lenum.damaged = Clădire aliată deteriorată.
lenum.spawn = Punct de lansare inamic.\nPoate fi un nucleu sau o poziție.
lenum.building = Clădire dintr-un grup specific.
lenum.core = Orice nucleu.
lenum.storage = Clădire de stocare, de ex. Containerul.
lenum.generator = Clădiri care generează electricitate.
lenum.factory = Clădiri care transformă resurse.
lenum.repair = Puncte de Reparare.
lenum.rally = Centre de Comandă.
lenum.battery = Orice baterie.
lenum.resupply = Puncte de Realimentare.\nRelevant doar când [accent]"Unitățile Necesită Muniție"[] este activată.
lenum.reactor = Reactor de Toriu/Impact.
lenum.turret = Orice armă.
sensor.in = Clădirea/unitatea care trebuie detectată.
radar.from = Clădirea de la care detectăm.\nRaza senzorului e limitată de raza de costrucție.
radar.target = Filtru pt unitățile care trebuie detectate.
radar.and = Adaugă filtre.
radar.order = Ordinea de sortare. 0 pt a inversa ordinea.
radar.sort = Modul cum sortăm rezultatele.
radar.output = Variabila în care se va scrie unitatea detectată.
unitradar.target = Filtru pt unitățile care trebuie detectate.
unitradar.and = Adaugă filtre.
unitradar.order = Ordinea de sortare. 0 pt a inversa ordinea.
unitradar.sort = Modul cum sortăm rezultatele.
unitradar.output = Variabila în care se reține unitatea detectată.
control.of = Clădirea de controlat.
control.unit = Unitatea/clădirea către care se țintește.
control.shoot = Specifică dacă armele trag.
unitlocate.enemy = Specifică dacă se detectează clădirile inamice.
unitlocate.found = Specifică dacă obiectul a fost găsit.
unitlocate.building = Clădirea detectată.
unitlocate.outx = Coordonata X a obiectului detectat.
unitlocate.outy = Coordonata Y a obiectului detectat.
unitlocate.group = Grupul clădirilor de detectat.
lenum.idle = Nu mișca, dar continuă să construiești/minezi.\nModul prestabilit.
lenum.stop = Oprește acțiunea curentă. Nu mișca/mina/construi.
lenum.move = Mergi la această poziție.
lenum.approach = Apropie-te la o anumită distanță de poziție.
lenum.pathfind = Găsește ruta către punctul de lansare inamic. Poate fi un nucleu.
lenum.target = Lovește către o poziție.
lenum.targetp = Lovește o țintă. Anticipează viteza țintei și a proiectilului.
lenum.itemdrop = Descarcă o bucată de material.
lenum.itemtake = Ia o bucată de material dintr-o clădire.
lenum.paydrop = Descarcă încărcătura curentă.
lenum.paytake = Ia o încărcătură de la locația curentă.
lenum.flag = Oferă o etichetă numerică unității.
lenum.mine = Minează din această locație.
lenum.build = Construiește o structură.
lenum.getblock = Obține clădirea și tipul clădirii aflate la coordonatele specificate.\nUnitatea trebuie să se afle în raza poziției.\nBlocurile solide care nu sunt clădiri vor avea tipul [accent]@solid[].
lenum.within = Verifică dacă unitatea se află în apropierea poziției.
lenum.boost = Pornește/oprește propulsorul.

View File

@@ -41,10 +41,13 @@ be.ignore = Игнорировать
be.noupdates = Обновления не найдены. be.noupdates = Обновления не найдены.
be.check = Проверить обновления be.check = Проверить обновления
mod.featured.dialog.title = Браузер модификаций mods.browser = Браузер\nмодификаций
mods.browser.selected = Выбранный мод mods.browser.selected = Выбранный мод
mods.browser.add = Скачать mods.browser.add = Скачать
mods.github.open = Открыть mods.browser.reinstall = Переустановить
mods.github.open = Сайт
mods.browser.sortdate = Сортировка по дате
mods.browser.sortstars = Сортировка по звёздам
schematic = Схема schematic = Схема
schematic.add = Сохранить схему… schematic.add = Сохранить схему…
@@ -110,17 +113,20 @@ committingchanges = Внесение изменений
done = Готово done = Готово
feature.unsupported = Ваше устройство не поддерживает эту возможность. feature.unsupported = Ваше устройство не поддерживает эту возможность.
mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и [scarlet]могут содержать много ошибок[]. Докладывайте о любых проблемах, которые вы найдете в Mindustry Github. mods.initfailed = [red]⚠[] Не удалось инициализировать предыдущий запуск Mindustry. Это могло быть вызвано неисправными модификациями.\n\nЧтобы предотвратить зацикленные вылеты игры, [red]все модификации были отключены.[]\n\nЧтобы отключить эту функцию, выключите её в [accent]Настройки->Игра->Отключение модификаций после вылета при запуске[].
mods = Модификации mods = Модификации
mods.none = [lightgray]Модификации не найдены! mods.none = [lightgray]Модификации не найдены!
mods.guide = Руководство по модификациям mods.guide = Руководство по модификациям
mods.report = Доложить об ошибке mods.report = Доложить об ошибке
mods.openfolder = Открыть папку с модификациями mods.openfolder = Открыть папку с модификациями
mods.viewcontent = Просмотреть содержимое
mods.reload = Перезагрузить mods.reload = Перезагрузить
mods.reloadexit = Игра будет закрыта для перезагрузки модификаций. mods.reloadexit = Игра будет закрыта для перезагрузки модификаций.
mod.installed = [[Установлено]
mod.display = [gray]Модификация:[orange] {0} mod.display = [gray]Модификация:[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.delete.error = Невозможно удалить модификацию. Возможно, файл используется.
@@ -212,6 +218,8 @@ 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.times.joined = Присоединялся раз: [accent]{0}
trace.times.kicked = Был выгнан раз: [accent]{0}
trace.mobile = Мобильный клиент: [accent]{0} trace.mobile = Мобильный клиент: [accent]{0}
trace.modclient = Пользовательский клиент: [accent]{0} trace.modclient = Пользовательский клиент: [accent]{0}
invalidid = Недопустимый ID клиента! Отправьте отчёт об ошибке. invalidid = Недопустимый ID клиента! Отправьте отчёт об ошибке.
@@ -307,6 +315,7 @@ cancelbuilding = [accent][[{0}][] для очистки плана
selectschematic = [accent][[{0}][] выделить и скопировать selectschematic = [accent][[{0}][] выделить и скопировать
pausebuilding = [accent][[{0}][] для приостановки строительства pausebuilding = [accent][[{0}][] для приостановки строительства
resumebuilding = [scarlet][[{0}][] для продолжения строительства resumebuilding = [scarlet][[{0}][] для продолжения строительства
enablebuilding = [scarlet][[{0}][] для включения строительства
showui = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса. showui = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса.
wave = [accent]Волна {0} wave = [accent]Волна {0}
wave.cap = [accent]Волна {0}/{1} wave.cap = [accent]Волна {0}/{1}
@@ -327,9 +336,9 @@ custom = Пользовательская
builtin = Встроенная 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 = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте [scarlet]не оранжевое[] ядро на эту карту в редакторе.
map.nospawn.attack = У этой карты нет вражеских ядер для атаки игроком! Добавьте[scarlet] красное[] ядро на эту карту в редакторе. map.nospawn.attack = У этой карты нет вражеских ядер для атаки игроком! Добавьте [scarlet]красное[] ядро на эту карту в редакторе.
map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты. map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты.
workshop.update = Обновить содержимое workshop.update = Обновить содержимое
workshop.error = Ошибка загрузки информации из Мастерской: {0} workshop.error = Ошибка загрузки информации из Мастерской: {0}
@@ -678,6 +687,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 +703,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 = Температура
@@ -763,8 +774,8 @@ unit.itemssecond = предметов/секунду
unit.liquidunits = жидкостных единиц unit.liquidunits = жидкостных единиц
unit.powerunits = энерг. единиц unit.powerunits = энерг. единиц
unit.degrees = ° unit.degrees = °
unit.seconds = сек. unit.seconds = сек
unit.minutes = мин. unit.minutes = мин
unit.persecond = /сек unit.persecond = /сек
unit.perminute = /мин unit.perminute = /мин
unit.timesspeed = x скорость unit.timesspeed = x скорость
@@ -788,9 +799,12 @@ 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.flow.name = Показывать скорость потока ресурсов setting.flow.name = Показывать скорость потока ресурсов
setting.backgroundpause.name = Фоновая пауза setting.backgroundpause.name = Фоновая пауза
setting.buildautopause.name = Автоматическая приостановка строительства setting.buildautopause.name = Автоматическая приостановка строительства
setting.doubletapmine.name = Добыча руды двойным нажатием
setting.modcrashdisable.name = Отключение модификаций после вылета при запуске
setting.animatedwater.name = Анимированные поверхности setting.animatedwater.name = Анимированные поверхности
setting.animatedshields.name = Анимированные щиты setting.animatedshields.name = Анимированные щиты
setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[] setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[]
@@ -948,6 +962,8 @@ 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 = Множитель затрат на строительство
@@ -1383,8 +1399,8 @@ 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 = Перекачивает и выводит жидкости. Требует энергию. block.rotary-pump.description = Перекачивает и выводит жидкости. Требует энергию.
@@ -1497,11 +1513,154 @@ unit.poly.description = Автоматически восстанавливае
unit.mega.description = Автоматически ремонтирует повреждённые постройки. Может переносить блоки и небольшие единицы. unit.mega.description = Автоматически ремонтирует повреждённые постройки. Может переносить блоки и небольшие единицы.
unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера. unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера.
unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц. unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц.
unit.risso.description = Стреляет залпом ракет и пуль по всем врагам поблизости. unit.risso.description = Стреляет залпами ракет и пуль по всем врагам поблизости.
unit.minke.description = Стреляет зажигательными снарядами и стандартными пулями по наземным целям. unit.minke.description = Стреляет зажигательными снарядами и стандартными пулями по наземным целям.
unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам. unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам.
unit.sei.description = Стреляет залпом ракет и бронебойных пуль по врагам. unit.sei.description = Стреляет залпами ракет и бронебойных пуль по врагам.
unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка». unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка».
unit.alpha.description = Защищает ядро «Осколок» от врагов. Основная строительная единица. unit.alpha.description = Защищает ядро «Осколок» от врагов. Основная строительная единица.
unit.beta.description = Защищает ядро «Штаб» от врагов. Основная строительная единица. unit.beta.description = Защищает ядро «Штаб» от врагов. Основная строительная единица.
unit.gamma.description = Защищает ядро «Атом» от врагов. Основная строительная единица. unit.gamma.description = Защищает ядро «Атом» от врагов. Основная строительная единица.
lst.read = Считывает число из соединённой ячейки памяти.
lst.write = Записывает число в соединённую ячейку памяти.
lst.print = Добавляет текст в текстовый буфер. Ничего не отображает, пока не будет вызван [accent]Print Flush[].
lst.draw = Добавляет операцию в буфер отрисовки. Ничего не отображает, пока не будет вызван [accent]Draw Flush[].
lst.drawflush = Сбрасывает буфер [accent]Draw[] операций на дисплей.
lst.printflush = Сбрасывает буфер [accent]Print[] операций в блок-сообщение.
lst.getlink = Получает соединение процессора по индексу. Начинает с 0.
lst.control = Контролирует блок.
lst.radar = Обнаруживает единицы вокруг постройки с заданным радиусом.
lst.sensor = Получает данные из постройки или единицы.
lst.set = Устанавливает переменную.
lst.operation = Совершает операцию над 1-2 переменными.
lst.end = Переходит к началу стека операций.
lst.jump = Условно переходит к другой операции.
lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[].
lst.unitcontrol = Управляет привязанной в данный момент единицей.
lst.unitradar = Обнаруживает единицы вокруг привязанной в данный момент единицы.
lst.unitlocate = Обнаруживает позицию/постройку определённого типа где-либо на карте. Требует привязанную единицу.
logic.nounitbuild = [red]Строительство с помощью процессоров здесь запрещено.
lenum.type = Тип постройки/единицы. \nНапример, для маршрутизатора это будет [accent]@router[].\nНе строка.
lenum.shoot = Стрельба в определённую позицию.
lenum.shootp = Стрельба в единицу/постройку с расчётом скорости.
lenum.configure = Конфигурация постройки, например, предмет сортировки.
lenum.enabled = Включён ли блок.
laccess.color = Цвет осветителя.
laccess.controller = Командующий единицей. Если единица управляется процессором, возвращает процессор. Если в строю, возращает командуещего.\nВ противном случае возвращает саму единицу.
laccess.dead = Является ли единица/постройка неработающей или несуществующей.
laccess.controlled = Возвращает:\n[accent]@ctrlProcessor[] если единица управляется процессором\n[accent]@ctrlPlayer[] если единица/постройка управляется игроком\n[accent]@ctrlFormation[] если единица в строю\nВ противном случае — 0.
laccess.commanded = [red]Устарело. Будет удалено![]\nВместо этого, используйте [accent]controlled[].
graphicstype.clear = Заливка дисплея цветом.
graphicstype.color = Установка цвета для следующих операций отрисовки.
graphicstype.stroke = Установка толщины линии.
graphicstype.line = Отрисовка отрезка.
graphicstype.rect = Отрисовка закрашенного прямоугольника.
graphicstype.linerect = Отрисовка контура прямоугольника.
graphicstype.poly = Отрисовка закрашенного правильного многоугольника.
graphicstype.linepoly = Отрисовка контура правильного многоугольника.
graphicstype.triangle = Отрисовка закрашенного треугольника.
graphicstype.image = Отрисовка внутриигровых спрайтов.\nНапример: [accent]@router[] или [accent]@dagger[].
lenum.always = Всегда истина.
lenum.idiv = Целочисленное деление.
lenum.div = Деление.\nВозвращает [accent]null[] при делении на ноль.
lenum.mod = Остаток от деления.
lenum.equal = Равно. Приводит типы.\nНе-null объекты, по сравнению с числами, становятся 1, иначе — 0.
lenum.notequal = Не равно. Приводит типы.
lenum.strictequal = Строгое равенство. Не приводит типы.\nМожет быть использовано для проверки на [accent]null[].
lenum.shl = Побитовый сдвиг влево.
lenum.shr = Побитовый сдвиг вправо.
lenum.or = Побитовое ИЛИ.
lenum.land = Булевое И.
lenum.and = Побитовое И.
lenum.not = Побитовое НЕ.
lenum.xor = Побитовое исключающее ИЛИ.
lenum.min = Минимальное из двух чисел.
lenum.max = Максимальное из двух чисел.
lenum.angle = Угол вектора в градусах.
lenum.len = Длина вектора.
lenum.sin = Синус, в градусах.
lenum.cos = Косинус, в градусах.
lenum.tan = Тангенс, в градусах.
#это не ошибка, поищите 'обозначение диапазонов'
lenum.rand = Случайное число в диапазоне [0, значение).
lenum.log = Натуральный логарифм (ln).
lenum.log10 = Логарифм по основанию 10.
lenum.noise = Симплексный шум, 2D.
lenum.abs = Абсолютная величина.
lenum.sqrt = Квадратный корень.
lenum.any = Любая единица.
lenum.ally = Дружеская единица.
lenum.attacker = Единица с оружием.
lenum.enemy = Вражеская единица.
lenum.boss = Страж.
lenum.flying = Летающая единица.
lenum.ground = Наземная единица.
lenum.player = Единица, управляемая игроком.
lenum.ore = Источник руды.
lenum.damaged = Повреждённая дружеская постройка.
lenum.spawn = Точка появления врагов.\nМожет быть ядром или позицией на карте.
lenum.building = Постройка определённой группы.
lenum.core = Любое ядро.
lenum.storage = Здание хранения, например, хранилище.
lenum.generator = Постройки, вырабатывающие энергию.
lenum.factory = Постройки, перерабатывающие предметы.
lenum.repair = Ремонтные пункты.
lenum.rally = Командный центр.
lenum.battery = Любой аккумулятор.
lenum.resupply = Пункты снабжения.\nАктуально только при включённом [accent]"Боев. ед. требуют боеприпасы"[].
lenum.reactor = Импульсный/ториевый реактор.
lenum.turret = Любая турель.
sensor.in = Постройка/единица для распознавания.
radar.from = Постройка, от которой распознавать.\nДальность сенсора ограничена дальностью постройки.
radar.target = Фильтр для распознавания единиц.
radar.and = Дополнительные фильтры.
radar.order = Порядок сортировки. 0 для обратного.
radar.sort = Показатель для сортировки результатов.
radar.output = Переменная для записи конечной единицы.
unitradar.target = Фильтр для распознавания единиц.
unitradar.and = Дополнительные фильтры.
unitradar.order = Порядок сортировки. 0 для обратного.
unitradar.sort = Показатель для сортировки результатов.
unitradar.output = Переменная для записи конечной единицы.
control.of = Постройка для контролирования.
control.unit = Единица/постройка для прицеливания.
control.shoot = Стрелять ли.
unitlocate.enemy = Обнаруживать ли вражеские постройки.
unitlocate.found = Найден ли объект.
unitlocate.building = Переменная для записи обнаруженной постройки.
unitlocate.outx = Вывод X координаты.
unitlocate.outy = Вывод Y координаты.
unitlocate.group = Группа построек для поиска.
lenum.idle = Остановка движения, но продолжение строительства/копания.\nСостояние по умолчанию.
lenum.stop = Остановка передвижения/копания/строительства.
lenum.move = Перемещение в определённую позицию.
lenum.approach = Приближение к позиции с указанным радиусом.
lenum.pathfind = Перемещение к точке появления врагов.
lenum.target = Стрельба в определённую позицию.
lenum.targetp = Стрельба в единицу/постройку с расчётом скорости.
lenum.itemdrop = Сбрасывание предметов.
lenum.itemtake = Взятие предметов из постройки.
lenum.paydrop = Сбрасывание текущего груза.
lenum.paytake = Взятие груза на текущей позиции.
lenum.flag = Числовой флаг единицы.
lenum.mine = Копание в позиции.
lenum.build = Строительство структур.
lenum.getblock = Распознавание блока и его типа на координатах.\nЕдиница должна находиться в пределах досягаемости.\nТвёрдые не-постройки будут иметь тип [accent]@solid[].
lenum.within = Проверка на нахождение единицы рядом с позицией.
lenum.boost = Включение/выключение полёта.

View File

@@ -59,8 +59,10 @@ schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не доз
mod.featured.title = Переглядач модифікацій mod.featured.title = Переглядач модифікацій
mod.featured.dialog.title = Переглядач модифікацій mod.featured.dialog.title = Переглядач модифікацій
mods.browser.selected = Обрана модифікація mods.browser.selected = Обрана модифікація
mods.browser.add = Установити модифікацію mods.browser.add = Установити
mods.github.open = Відкрити в Github mods.github.open = Відкрити
mods.browser.sortdate = Сортувати за давністю
mods.browser.sortstars = Сортувати за кількостю зірок
stats = Статистика stats = Статистика
stat.wave = Хвиль відбито:[accent] {0} stat.wave = Хвиль відбито:[accent] {0}
@@ -85,6 +87,7 @@ joingame = Мережева гра
customgame = Користувацька гра customgame = Користувацька гра
newgame = Нова гра newgame = Нова гра
none = <нічого> none = <нічого>
none.found = [lightgray]<нічого не знайдено>
minimap = Мінімапа minimap = Мінімапа
position = Місцезнаходження position = Місцезнаходження
close = Закрити close = Закрити
@@ -278,6 +281,7 @@ cancel = Скасувати
openlink = Перейти за посиланням openlink = Перейти за посиланням
copylink = Скопіювати посилання copylink = Скопіювати посилання
back = Назад back = Назад
max = Макс.
crash.export = Експортувати аварійні звіти crash.export = Експортувати аварійні звіти
crash.none = Аварійних звітів не знайдено crash.none = Аварійних звітів не знайдено
crash.exported = Аварійні звіти експортовано crash.exported = Аварійні звіти експортовано
@@ -351,7 +355,6 @@ 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 = за появу
@@ -377,7 +380,7 @@ editor.removeunit = Видалити бойову одиницю
editor.teams = Команди editor.teams = Команди
editor.errorload = Помилка завантаження зображення. editor.errorload = Помилка завантаження зображення.
editor.errorsave = Помилка збереження зображення. editor.errorsave = Помилка збереження зображення.
editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі. editor.errorimage = Це зображення, а не мапа.
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
editor.errornot = Це не мапа. editor.errornot = Це не мапа.
editor.errorheader = Цей файл мапи недійсний або пошкоджений. editor.errorheader = Цей файл мапи недійсний або пошкоджений.
@@ -676,6 +679,7 @@ stat.commandlimit = Максимум у загоні
stat.abilities = Здібності stat.abilities = Здібності
stat.canboost = Можна прискорити stat.canboost = Можна прискорити
stat.flying = Літає stat.flying = Літає
stat.ammouse = Патронів використовує
ability.forcefield = Щитове поле ability.forcefield = Щитове поле
ability.repairfield = Ремонтувальне поле ability.repairfield = Ремонтувальне поле
ability.statusfield = Поле підсилення ability.statusfield = Поле підсилення
@@ -688,6 +692,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.powerbalance = Енергія: {0} за с. bar.powerbalance = Енергія: {0} за с.
bar.powerstored = Зберігає: {0}/{1} bar.powerstored = Зберігає: {0}/{1}
bar.poweramount = Енергія: {0} bar.poweramount = Енергія: {0}
@@ -696,7 +701,6 @@ bar.powerlines = З’єднань: {0}/{1}
bar.items = Предмети: {0} bar.items = Предмети: {0}
bar.capacity = Місткість: {0} bar.capacity = Місткість: {0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[одиниця вимкнена]
bar.liquid = Рідина bar.liquid = Рідина
bar.heat = Нагрівання bar.heat = Нагрівання
bar.power = Енергія bar.power = Енергія
@@ -711,6 +715,7 @@ bullet.sapping = [stat]виснажує
bullet.homing = [stat]самонаведення bullet.homing = [stat]самонаведення
bullet.shock = [stat]шок bullet.shock = [stat]шок
bullet.frag = [stat]шкода по ділянці bullet.frag = [stat]шкода по ділянці
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 пробиття
bullet.infinitepierce = [stat]пробиття bullet.infinitepierce = [stat]пробиття
@@ -738,6 +743,7 @@ unit.items = предм.
unit.thousands = тис unit.thousands = тис
unit.millions = млн unit.millions = млн
unit.billions = млрд unit.billions = млрд
unit.pershot = за постріл
category.purpose = Призначення category.purpose = Призначення
category.general = Загальне category.general = Загальне
category.power = Енергія category.power = Енергія
@@ -806,6 +812,7 @@ setting.lasersopacity.name = Непрозорість лазерів енерг
setting.bridgeopacity.name = Непрозорість мостів setting.bridgeopacity.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.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри.
uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд…
uiscale.cancel = Скасувати і вийти uiscale.cancel = Скасувати і вийти
@@ -880,6 +887,7 @@ keybind.toggle_menus.name = Меню перемикання
keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_prev.name = Попередня історія чату
keybind.chat_history_next.name = Наступна історія чату keybind.chat_history_next.name = Наступна історія чату
keybind.chat_scroll.name = Прокрутка чату keybind.chat_scroll.name = Прокрутка чату
keybind.chat_mode.name = Змінити режим чату
keybind.drop_unit.name = Скинути бойову одиницю keybind.drop_unit.name = Скинути бойову одиницю
keybind.zoom_minimap.name = Збільшити мінімапу keybind.zoom_minimap.name = Збільшити мінімапу
mode.help.title = Опис режимів гри mode.help.title = Опис режимів гри
@@ -895,6 +903,7 @@ mode.attack.description = Зруйнуйте ворожу базу. \n[gray]По
mode.custom = Користувацькі правила mode.custom = Користувацькі правила
rules.infiniteresources = Нескінченні ресурси rules.infiniteresources = Нескінченні ресурси
rules.reactorexplosions = Вибухи реактора rules.reactorexplosions = Вибухи реактора
rules.coreincinerates = Ядро спалює надлишкові предмети
rules.schematic = Використання схем дозволено rules.schematic = Використання схем дозволено
rules.wavetimer = Таймер для хвиль rules.wavetimer = Таймер для хвиль
rules.waves = Хвилі rules.waves = Хвилі

View File

@@ -13,6 +13,7 @@ link.google-play.description = Google Play store listing
link.f-droid.description = F-Droid listing link.f-droid.description = F-Droid listing
link.wiki.description = Mindustry wiki chính thức link.wiki.description = Mindustry wiki chính thức
link.suggestions.description = Đề xuất các tính năng mới link.suggestions.description = Đề xuất các tính năng mới
link.bug.description = Tìm thấy lỗi? Báo cáo nó ở đây
linkfail = Không mở được liên kết!\nURL đã được sao chép vào bộ nhớ tạm. linkfail = Không mở được liên kết!\nURL đã được sao chép vào bộ nhớ tạm.
screenshot = Ảnh chụp màn hình được lưu vào {0} screenshot = Ảnh chụp màn hình được lưu vào {0}
screenshot.invalid = Bản đồ quá lớn, có khả năng không đủ bộ nhớ để chụp ảnh màn hình. screenshot.invalid = Bản đồ quá lớn, có khả năng không đủ bộ nhớ để chụp ảnh màn hình.
@@ -40,24 +41,32 @@ be.ignore = Bỏ qua
be.noupdates = Không tìm thấy bản cập nhật mới. be.noupdates = Không tìm thấy bản cập nhật mới.
be.check = Kiểm tra các bản cập nhật. be.check = Kiểm tra các bản cập nhật.
schematic = Schematic mods.browser = Duyệt mod
schematic.add = Lưu Schematic... mods.browser.selected = Mod Đã chọn
schematics = Schematics mods.browser.add = Cài đặt
schematic.replace = Schematics có tên đó đã tồn tại. Thay thế nó? mods.browser.reinstall = Cài đặt lại
schematic.exists = Schematics có tên đó đã tồn tại. mods.github.open = Repo
schematic.import = Nhập Schematic... mods.browser.sortdate = Sắp xếp theo gần đây
mods.browser.sortstars = Sắp xếp theo sao
schematic = Bản thiết kế
schematic.add = Lưu bản thiết kế...
schematics = Các bản thiết kế
schematic.replace = Bản thiết kế có tên đó đã tồn tại. Thay thế nó?
schematic.exists = Bản thiết kế có tên đó đã tồn tại.
schematic.import = Nhập Bản thiết kế...
schematic.exportfile = Xuất tệp schematic.exportfile = Xuất tệp
schematic.importfile = Nhập tệp schematic.importfile = Nhập tệp
schematic.browseworkshop = Duyệt qua Workshop schematic.browseworkshop = Duyệt qua Workshop
schematic.copy = Sao chép vào bộ nhớ tạm schematic.copy = Sao chép vào bộ nhớ tạm
schematic.copy.import = Nhập từ bộ nhớ tạm schematic.copy.import = Thêm từ bộ nhớ tạm
schematic.shareworkshop = Chia sẻ từ Workshop schematic.shareworkshop = Chia sẻ từ Workshop
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật Schematic schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật bản thiết kế
schematic.saved = Đã lưu Schematic. schematic.saved = Đã lưu bản thiết kế.
schematic.delete.confirm = Schematic này sẽ bị xóa hoàn toàn. schematic.delete.confirm = Bản thiết kế này sẽ bị xóa hoàn toàn.
schematic.rename = Đổi tên Schematic schematic.rename = Đổi tên bản thiết kế
schematic.info = {0}x{1}, {2} khối schematic.info = {0}x{1}, {2} khối
schematic.disabled = [scarlet]Tính năng Schematics đã bị tắt[]\nBạn không được sử dụng schematic trong [accent]bản đồ[] hoặc [accent]máy chủ. schematic.disabled = [scarlet]Tính năng bản thiết kế đã bị tắt[]\nBạn không được sử dụng bản thiết kế trong [accent]bản đồ[] hoặc [accent]máy chủ.
stats = Thống kê stats = Thống kê
stat.wave = Đợt đã vượt qua:[accent] {0} stat.wave = Đợt đã vượt qua:[accent] {0}
@@ -75,14 +84,15 @@ level.highscore = Điểm cao nhất: [accent]{0}
level.select = Chọn cấp độ level.select = Chọn cấp độ
level.mode = Chế độ: level.mode = Chế độ:
coreattack = < Căn cứ đang bị tấn công! > coreattack = < Căn cứ đang bị tấn công! >
nearpoint = [[ [scarlet]RỜI KHỎI ĐIỂM THẢ NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra nearpoint = [[ [scarlet]RỜI KHỎI KHU VỰC ĐÁP NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra
database = Cơ sở dữ liệu căn cứ database = Cơ sở dữ liệu
savegame = Lưu trò chơi savegame = Lưu trò chơi
loadgame = Tải trò chơi loadgame = Tải lại màn chơi
joingame = Tham gia trò chơi joingame = Tham gia trò chơi
customgame = Tùy chỉnh customgame = Tùy chỉnh
newgame = Trò chơi mới newgame = Trò chơi mới
none = <trống> none = <trống>
none.found = [lightgray]<không tìm thấy>
minimap = Bản đồ nhỏ minimap = Bản đồ nhỏ
position = Vị trí position = Vị trí
close = Đóng close = Đóng
@@ -90,9 +100,9 @@ website = Website
quit = Thoát quit = Thoát
save.quit = Lưu & Thoát save.quit = Lưu & Thoát
maps = Bản đồ maps = Bản đồ
maps.browse = Duyệt bản đồ maps.browse = Chọn bản đồ
continue = Tiếp tục continue = Tiếp tục
maps.none = [lightgray]Không có bản đồ nào được tìm thấy! maps.none = [lightgray]Không tìm thấy bản đồ!
invalid = Không hợp lệ invalid = Không hợp lệ
pickcolor = Chọn màu pickcolor = Chọn màu
preparingconfig = Đang chuẩn bị cấu hình preparingconfig = Đang chuẩn bị cấu hình
@@ -103,14 +113,16 @@ committingchanges = Đang cập nhật các thay đổi
done = Hoàn tất done = Hoàn tất
feature.unsupported = Thiết bị của bạn không hỗ trợ tính năng này. feature.unsupported = Thiết bị của bạn không hỗ trợ tính năng này.
mods.alphainfo = Hãy nhớ rằng các bản mod đang ở giai đoạn alpha, và[scarlet] có thể chứa rất rất lỗi[].\nBáo cáo bất kỳ vấn đề nào bạn gặp phải tại Mindustry GitHub. mods.initfailed = [red]⚠[] Mindustry không khởi chạy được. Điều này có thể do các mod bị lỗi.\n\nĐể tránh gặp sự cố liên tiếp, [red]tất cả các mod đã bị tắt.[]\n\nĐể tắt tính năng này, vào [accent]Cài đặt->Trò chơi->Tắt các mod khi gặp sự cố trong khởi động[].
mods = Mods mods = Mods
mods.none = [lightgray]Không có mod nào được tìm thấy! mods.none = [lightgray]Không tìm thấy mod!
mods.guide = Hướng dẫn mod mods.guide = Hướng dẫn mod
mods.report = Báo lỗi mods.report = Báo lỗi
mods.openfolder = Mở thư mục mods.openfolder = Mở thư mục
mods.viewcontent = Xem nội dung
mods.reload = Tải lại mods.reload = Tải lại
mods.reloadexit = Trò chơi sẽ đóng để tải lại mod. mods.reloadexit = Trò chơi sẽ đóng để mod được tải.
mod.installed = [[Đã cài đặt]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Đã Bật mod.enabled = [lightgray]Đã Bật
mod.disabled = [scarlet]Đã Tắt mod.disabled = [scarlet]Đã Tắt
@@ -122,21 +134,21 @@ mod.outdated = [scarlet]Không tương thích với V6 (no minGameVersion: 105)
mod.missingdependencies = [scarlet]Thiếu phụ thuộc: {0} mod.missingdependencies = [scarlet]Thiếu phụ thuộc: {0}
mod.erroredcontent = [scarlet]Lỗi nội dung mod.erroredcontent = [scarlet]Lỗi nội dung
mod.errors = Đã xảy ra lỗi khi tải nội dung. mod.errors = Đã xảy ra lỗi khi tải nội dung.
mod.noerrorplay = [scarlet]Bạn có mod bị lỗi.[]Tắt các mod bị ảnh hưởng hoặc sửa chữa các lỗi trước khi chơi. mod.noerrorplay = [scarlet]Bạn có mod bị lỗi.[]Tắt các mod bị lỗi hoặc sửa các lỗi trước khi chơi.
mod.nowdisabled = [scarlet]Mod '{0}' cần mod này để chạy:[accent] {1}\n[lightgray]Trước tiên bạn cần tải các mod này xuống.\nBản mod này sẽ tự động tắt. mod.nowdisabled = [scarlet]Mod '{0}' cần mod này để chạy:[accent] {1}\n[lightgray]Trước tiên bạn cần tải các mod này xuống.\nBản mod này sẽ tự động tắt.
mod.enable = Bật mod.enable = Bật
mod.requiresrestart = Trò chơi sẽ đóng để áp dụng các thay đổi của mod. mod.requiresrestart = Trò chơi sẽ đóng để áp dụng các thay đổi của mod.
mod.reloadrequired = [scarlet]Yêu cầu khởi động lại mod.reloadrequired = [scarlet]Yêu cầu khởi động lại
mod.import = Nhập Mod mod.import = Thêm Mod
mod.import.file = Nhập tệp mod.import.file = Thêm từ tệp
mod.import.github = Nhập từ GitHub mod.import.github = Thêm từ GitHub
mod.jarwarn = [scarlet]JAR mod vốn dĩ không an toàn.[]\nĐảm bảo rằng bạn đang nhập bản mod này từ một nguồn đáng tin cậy! mod.jarwarn = [scarlet]Các JAR mod vốn dĩ không an toàn.[]\nĐảm bảo rằng bạn đang thêm mod này từ một nguồn đáng tin cậy!
mod.item.remove = Mục này là một phần của[accent] '{0}'[] mod. Để xóa nó, hãy gỡ cài đặt mod này. mod.item.remove = Mục này là một phần của[accent] '{0}'[] mod. Để xóa nó, hãy gỡ cài đặt mod này.
mod.remove.confirm = Mod này sẽ bị xóa. mod.remove.confirm = Mod này sẽ bị xóa.
mod.author = [lightgray]Tác giả:[] {0} mod.author = [lightgray]Tác giả:[] {0}
mod.missing = Bản lưu này chứa các mod mà bạn đã cập nhật gần đây hoặc không còn cài đặt nữa. Có thể gây ra lỗi khi mở. Bạn có chắc muốn mở nó?\n[lightgray]Mods:\n{0} mod.missing = Bản lưu này chứa các mod mà bạn đã cập nhật gần đây hoặc không được cài đặt. Có thể gây ra lỗi khi mở. Bạn có chắc muốn mở nó?\n[lightgray]Mods:\n{0}
mod.preview.missing = Trước khi xuất bản bản mod này lên workshop, bạn phải thêm hình ảnh xem trước.\nĐặt một hình ảnh có tên[accent] preview.png[] vào thư mục của mod và thử lại. mod.preview.missing = Trước khi đăng bản mod này lên workshop, bạn phải thêm hình ảnh xem trước.\nĐặt một hình ảnh có tên[accent] preview.png[] vào thư mục của mod và thử lại.
mod.folder.missing = Chỉ có thể xuất bản các mod ở dạng thư mục lên workshop.\nĐể chuyển đổi bất kỳ mod nào thành một thư mục, chỉ cần giải nén tệp của nó vào một thư mục và xóa tệp nén cũ, sau đó khởi động lại trò chơi của bạn hoặc tải lại các bản mod của bạn. mod.folder.missing = Chỉ có thể đăng các mod ở dạng thư mục lên workshop.\nĐể chuyển đổi bất kỳ mod nào thành một thư mục, chỉ cần giải nén tệp của nó vào một thư mục và xóa tệp nén cũ, sau đó khởi động lại trò chơi của bạn hoặc tải lại các bản mod của bạn.
mod.scripts.disable = Thiết bị của bạn không hổ trợ mod chứa scripts này. Bạn phải tắt các mod này để chơi trò chơi. mod.scripts.disable = Thiết bị của bạn không hổ trợ mod chứa scripts này. Bạn phải tắt các mod này để chơi trò chơi.
about.button = Thông tin about.button = Thông tin
@@ -196,6 +208,7 @@ servers.local = Máy chủ cục bộ
servers.remote = Máy chủ tùy chỉnh servers.remote = Máy chủ tùy chỉnh
servers.global = Máy chủ từ cộng đồng servers.global = Máy chủ từ cộng đồng
servers.disclaimer = Nhà phát triển [accent]không[] sở hữu và kiểm soát máy chủ cộng đồng.\n\nMáy chủ có thể chứa nội dung do người dùng tạo và không phù hợp với mọi lứa tuổi.
servers.showhidden = Hiển thị Máy chủ Ẩn servers.showhidden = Hiển thị Máy chủ Ẩn
server.shown = Hiện server.shown = Hiện
server.hidden = Ẩn server.hidden = Ẩn
@@ -279,6 +292,7 @@ cancel = Hủy
openlink = Mở link openlink = Mở link
copylink = Sao chép link copylink = Sao chép link
back = Quay lại back = Quay lại
max = Tối đa
crash.export = Xuất Crash Logs crash.export = Xuất Crash Logs
crash.none = Không có Crash Logs nào được tìm thấy. crash.none = Không có Crash Logs nào được tìm thấy.
crash.exported = Crash logs đã được xuất. crash.exported = Crash logs đã được xuất.
@@ -298,6 +312,7 @@ cancelbuilding = [accent][[{0}][] để hủy xây
selectschematic = [accent][[{0}][] to để chọn+sao chép selectschematic = [accent][[{0}][] to để chọn+sao chép
pausebuilding = [accent][[{0}][] để tạm dừng xây dựng pausebuilding = [accent][[{0}][] để tạm dừng xây dựng
resumebuilding = [scarlet][[{0}][] để tiếp tục xây dựng resumebuilding = [scarlet][[{0}][] để tiếp tục xây dựng
enablebuilding = [scarlet][[{0}][] để bật xây dựng
showui = UI hidden.\nPress [accent][[{0}][] để hiện UI. showui = UI hidden.\nPress [accent][[{0}][] để hiện UI.
wave = [accent]Đợt {0} wave = [accent]Đợt {0}
wave.cap = [accent]Đợt {0}/{1} wave.cap = [accent]Đợt {0}/{1}
@@ -353,7 +368,6 @@ editor.center = Trung tâm
workshop = Workshop workshop = Workshop
waves.title = Đợt waves.title = Đợt
waves.remove = Xóa waves.remove = Xóa
waves.never = <vô hạn>
waves.every = mỗi waves.every = mỗi
waves.waves = đợt waves.waves = đợt
waves.perspawn = mỗi lần xuất hiện waves.perspawn = mỗi lần xuất hiện
@@ -382,7 +396,7 @@ editor.removeunit = Xóa kẻ địch
editor.teams = Đội editor.teams = Đội
editor.errorload = Lỗi khi tải tệp. editor.errorload = Lỗi khi tải tệp.
editor.errorsave = Lỗi khi lưu tệp. editor.errorsave = Lỗi khi lưu tệp.
editor.errorimage = Đó là một hình ảnh, không phải bản đồ.\n\nNếu bạn muốn nhập một bản đồ 3.5/build 40, sử dụng nút 'Nhập bản đồ thay thế' trong trình chỉnh sửa. editor.errorimage = Đó là một hình ảnh, không phải bản đồ.
editor.errorlegacy = Bản đồ này quá cũ, và sử dụng định dạng bản đồ cũ không còn được hỗ trợ. editor.errorlegacy = Bản đồ này quá cũ, và sử dụng định dạng bản đồ cũ không còn được hỗ trợ.
editor.errornot = Đây không phải là tệp bản đồ. editor.errornot = Đây không phải là tệp bản đồ.
editor.errorheader = Tệp bản đồ này không hợp lệ hoặc bị hỏng. editor.errorheader = Tệp bản đồ này không hợp lệ hoặc bị hỏng.
@@ -672,9 +686,10 @@ stat.drillspeed = Tốc độ khoang cơ bản
stat.boosteffect = Hiệu ứng tăng cường stat.boosteffect = Hiệu ứng tăng cường
stat.maxunits = Số quân lính hoạt động tối đa stat.maxunits = Số quân lính hoạt động tối đa
stat.health = Độ bền stat.health = Độ bền
stat.armor = Giáp
stat.buildtime = Thời gian xây stat.buildtime = Thời gian xây
stat.maxconsecutive = Đầu ra tối đa stat.maxconsecutive = Đầu ra tối đa
stat.buildcost = Chi phí stat.buildcost = Yêu cầu
stat.inaccuracy = Độ lệch stat.inaccuracy = Độ lệch
stat.shots = Phát bắn stat.shots = Phát bắn
stat.reload = Phát bắn/Giây stat.reload = Phát bắn/Giây
@@ -687,6 +702,7 @@ stat.lightningchance = Tỷ lệ phóng điện
stat.lightningdamage = Sát thương tia điện stat.lightningdamage = Sát thương tia điện
stat.flammability = Dễ cháy stat.flammability = Dễ cháy
stat.radioactivity = Phóng xạ stat.radioactivity = Phóng xạ
stat.charge = Phóng điện
stat.heatcapacity = Nhiệt dung stat.heatcapacity = Nhiệt dung
stat.viscosity = Độ nhớt stat.viscosity = Độ nhớt
stat.temperature = Nhiệt độ stat.temperature = Nhiệt độ
@@ -699,12 +715,13 @@ stat.commandlimit = Giới hạn lệnh
stat.abilities = Khả năng stat.abilities = Khả năng
stat.canboost = Nâng cấp stat.canboost = Nâng cấp
stat.flying = Bay stat.flying = Bay
stat.ammouse = Sử dụng đạn
ability.forcefield = Force Field ability.forcefield = Tạo khiên
ability.repairfield = Repair Field ability.repairfield = Sửa chữa/Xây dựng
ability.statusfield = Status Field ability.statusfield = Status Field
ability.unitspawn = {0} Factory ability.unitspawn = Sản xuất {0}
ability.shieldregenfield = Shield Regen Field ability.shieldregenfield = Tạo khiên nhỏ
ability.movelightning = Movement Lightning ability.movelightning = Movement Lightning
bar.drilltierreq = Cần máy khoan tốt hơn bar.drilltierreq = Cần máy khoan tốt hơn
@@ -713,6 +730,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.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}
@@ -721,7 +739,6 @@ bar.powerlines = Số lượng kết nối: {0}/{1}
bar.items = Vật phẩm: {0} bar.items = Vật phẩm: {0}
bar.capacity = Sức chứa: {0} bar.capacity = Sức chứa: {0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[quân lính bị vô hiệu hóa]
bar.liquid = Chất lỏng bar.liquid = Chất lỏng
bar.heat = Nhiệt độ bar.heat = Nhiệt độ
bar.power = Năng lượng bar.power = Năng lượng
@@ -735,12 +752,13 @@ bullet.damage = [stat]{0}[lightgray] sát thương
bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô
bullet.incendiary = [stat]cháy bullet.incendiary = [stat]cháy
bullet.sapping = [stat]sapping bullet.sapping = [stat]sapping
bullet.homing = [stat]homing bullet.homing = [stat]truy đuổi
bullet.shock = [stat]sốc bullet.shock = [stat]sốc
bullet.frag = [stat]frag bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối
bullet.frag = [stat]phá mảnh
bullet.knockback = [stat]{0}[lightgray] bật lùi bullet.knockback = [stat]{0}[lightgray] bật lùi
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
bullet.infinitepierce = [stat]pierce bullet.infinitepierce = [stat]xuyên thấu
bullet.healpercent = [stat]{0}[lightgray]% sửa chửa bullet.healpercent = [stat]{0}[lightgray]% sửa chửa
bullet.freezing = [stat]đóng băng bullet.freezing = [stat]đóng băng
bullet.tarred = [stat]tarred bullet.tarred = [stat]tarred
@@ -763,9 +781,10 @@ unit.timesspeed = x tốc độ
unit.percent = % unit.percent = %
unit.shieldhealth = độ bền khiên unit.shieldhealth = độ bền khiên
unit.items = vật phẩm unit.items = vật phẩm
unit.thousands = nghìn unit.thousands = k
unit.millions = triệu unit.millions = mil
unit.billions = tỷ unit.billions = b
unit.pershot = /shot
category.purpose = Mô tả category.purpose = Mô tả
category.general = Chung category.general = Chung
category.power = Năng lượng category.power = Năng lượng
@@ -782,14 +801,15 @@ setting.hints.name = Gợi ý
setting.flow.name = Hiện thị tốc độ chuyền tài nguyên setting.flow.name = Hiện thị tốc độ chuyền tài nguyên
setting.backgroundpause.name = Tạm dừng trong nền setting.backgroundpause.name = Tạm dừng trong nền
setting.buildautopause.name = Tự động dừng xây dựng setting.buildautopause.name = Tự động dừng xây dựng
setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động
setting.animatedwater.name = Hiệu ứng nước setting.animatedwater.name = Hiệu ứng nước
setting.animatedshields.name = Hiệu ứng khiên setting.animatedshields.name = Hiệu ứng khiên
setting.antialias.name = Khử răng cưa[lightgray] (yêu cầu khởi động lại)[] setting.antialias.name = Khử răng cưa[lightgray] (yêu cầu khởi động lại)[]
setting.playerindicators.name = Hướng người chơi setting.playerindicators.name = Hướng người chơi
setting.indicators.name = Hướng kẻ địch setting.indicators.name = Hướng kẻ địch
setting.autotarget.name = Tự động nhắm mục tiêu setting.autotarget.name = Tự động nhắm mục tiêu
setting.keyboard.name = Điều khiển bằng chuột+bàn phím setting.keyboard.name = Điều khiển bằng chuột + bàn phím
setting.touchscreen.name = Điều khiển bằng màng hình cảm ứng setting.touchscreen.name = Điều khiển bằng màn hình cảm ứng
setting.fpscap.name = FPS tối đa setting.fpscap.name = FPS tối đa
setting.fpscap.none = Không giới hạn setting.fpscap.none = Không giới hạn
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
@@ -810,13 +830,13 @@ setting.sensitivity.name = Độ nhạy điều khiển
setting.saveinterval.name = Khoảng thời gian lưu setting.saveinterval.name = Khoảng thời gian lưu
setting.seconds = {0} giây setting.seconds = {0} giây
setting.milliseconds = {0} mili giây setting.milliseconds = {0} mili giây
setting.fullscreen.name = Toàn màng hình setting.fullscreen.name = Toàn màn hình
setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại) setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại)
setting.fps.name = Hiển thị FPS & Ping setting.fps.name = Hiển thị FPS & Ping
setting.smoothcamera.name = Chế độ mượt mà setting.smoothcamera.name = Chế độ mượt mà
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Đồ họa pixel setting.pixelate.name = Đồ họa pixel
setting.minimap.name = Hiển thị bảng đồ mini setting.minimap.name = Hiển thị bản đồ mini
setting.coreitems.name = Hiển thị vật phẩm trong căn cứ setting.coreitems.name = Hiển thị vật phẩm trong căn cứ
setting.position.name = Hiển thị vị trí người chơi setting.position.name = Hiển thị vị trí người chơi
setting.musicvol.name = Âm lượng nhạc setting.musicvol.name = Âm lượng nhạc
@@ -833,7 +853,9 @@ setting.chatopacity.name = Độ mờ trò chuyện
setting.lasersopacity.name = Độ mờ kết nối năng lượng setting.lasersopacity.name = Độ mờ kết nối năng lượng
setting.bridgeopacity.name = Độ mờ cầu setting.bridgeopacity.name = Độ mờ cầu
setting.playerchat.name = Hiển thị bong bóng trò chuyện của người chơi setting.playerchat.name = Hiển thị bong bóng trò chuyện của người chơi
setting.showweather.name = Hiển thị đồ họa thời tiết
public.confirm = Bạn có muốn công khai trò chơi của mình không?\n[accent]Bất kỳ ai cũng có thể tham gia trò chơi của bạn.\n[lightgray]Điều này có thể được thay đổi sau trong Cài đặt-> Trò chơi-> Hiển thị trò chơi công khai. public.confirm = Bạn có muốn công khai trò chơi của mình không?\n[accent]Bất kỳ ai cũng có thể tham gia trò chơi của bạn.\n[lightgray]Điều này có thể được thay đổi sau trong Cài đặt-> Trò chơi-> Hiển thị trò chơi công khai.
public.confirm.really = Nếu bạn muốn chơi với bạn bè, sử dụng [green]Invite Friend[] thay vì [scarlet]Public server[]!\nBạn có chắc chắn muốn làm trò chơi của mình [scarlet]công khai[]?
public.beta = Lưu ý rằng phiên bản beta của trò chơi không thể tạo sảnh công khai. public.beta = Lưu ý rằng phiên bản beta của trò chơi không thể tạo sảnh công khai.
uiscale.reset = Kích thước UI đã được thay đổi.\nNhấn "OK" để xác nhận.\n[scarlet]Hoàn lại và thoát trong[accent] {0}[] giây... uiscale.reset = Kích thước UI đã được thay đổi.\nNhấn "OK" để xác nhận.\n[scarlet]Hoàn lại và thoát trong[accent] {0}[] giây...
uiscale.cancel = Hủy & Thoát uiscale.cancel = Hủy & Thoát
@@ -855,17 +877,17 @@ keybind.clear_building.name = Xóa công trình
keybind.press = Nhấn một phím... keybind.press = Nhấn một phím...
keybind.press.axis = Nhấn một tổ hợp phím hoặc một phím... keybind.press.axis = Nhấn một tổ hợp phím hoặc một phím...
keybind.screenshot.name = Chụp ảnh bản đồ keybind.screenshot.name = Chụp ảnh bản đồ
keybind.toggle_power_lines.name = Toggle Power Lasers keybind.toggle_power_lines.name = Ẩn/Hiện đường truyền năng lượng
keybind.toggle_block_status.name = Toggle Block Statuses keybind.toggle_block_status.name = Ẩn/Hiện trạng thái khối
keybind.move_x.name = Di chuyển X keybind.move_x.name = Di chuyển X
keybind.move_y.name = Di chuyển Y keybind.move_y.name = Di chuyển Y
keybind.mouse_move.name = Theo chuột keybind.mouse_move.name = Theo chuột
keybind.pan.name = Xem Pan keybind.pan.name = Di chuyển góc nhìn
keybind.boost.name = Tăng tốc keybind.boost.name = Tăng tốc
keybind.schematic_select.name = Chọn khu vực keybind.schematic_select.name = Chọn khu vực
keybind.schematic_menu.name = Menu Schematic keybind.schematic_menu.name = Menu bản thiết kế
keybind.schematic_flip_x.name = Lật Schematic X keybind.schematic_flip_x.name = Lật bản thiết kế X
keybind.schematic_flip_y.name = Lật Schematic Y keybind.schematic_flip_y.name = Lật bản thiết kế Y
keybind.category_prev.name = Danh mục trước keybind.category_prev.name = Danh mục trước
keybind.category_next.name = Danh mục tiếp theo keybind.category_next.name = Danh mục tiếp theo
keybind.block_select_left.name = Chọn khối trái keybind.block_select_left.name = Chọn khối trái
@@ -903,11 +925,12 @@ keybind.chat.name = Trò chuyện
keybind.player_list.name = Danh sách người chơi keybind.player_list.name = Danh sách người chơi
keybind.console.name = Bảng điều khiển keybind.console.name = Bảng điều khiển
keybind.rotate.name = Xoay keybind.rotate.name = Xoay
keybind.rotateplaced.name = Xoay hiện có (Giữ) keybind.rotateplaced.name = Xoay khối (Giữ)
keybind.toggle_menus.name = Chuyển đổi Menus keybind.toggle_menus.name = Ẩn/Hiện Menus
keybind.chat_history_prev.name = Lịch sử trò chuyện trước keybind.chat_history_prev.name = Lịch sử trò chuyện trước
keybind.chat_history_next.name = Lịch sử trò chuyện sau keybind.chat_history_next.name = Lịch sử trò chuyện sau
keybind.chat_scroll.name = Cuộn trò chuyện keybind.chat_scroll.name = Cuộn trò chuyện
keybind.chat_mode.name = Thay đổi chế độ trò chuyện
keybind.drop_unit.name = Thả quân keybind.drop_unit.name = Thả quân
keybind.zoom_minimap.name = Thu phóng bản đồ mini keybind.zoom_minimap.name = Thu phóng bản đồ mini
mode.help.title = Mô tả chế độ mode.help.title = Mô tả chế độ
@@ -924,7 +947,8 @@ mode.custom = Tùy chỉnh luật
rules.infiniteresources = Tài nguyên vô hạn rules.infiniteresources = Tài nguyên vô hạn
rules.reactorexplosions = Nổ lò phản ứng rules.reactorexplosions = Nổ lò phản ứng
rules.schematic = Cho phép dùng schematic rules.coreincinerates = Hủy vật phẩm khi căn cứ đầy
rules.schematic = Cho phép dùng bản thiết kế
rules.wavetimer = Đếm ngược đợt rules.wavetimer = Đếm ngược đợt
rules.waves = Đợt rules.waves = Đợt
rules.attack = Chế độ tấn công rules.attack = Chế độ tấn công
@@ -935,6 +959,8 @@ rules.blockdamagemultiplier = Hệ số sát thương của khối
rules.unitbuildspeedmultiplier = Hệ số tốc độ sản xuất lính rules.unitbuildspeedmultiplier = Hệ số tốc độ sản xuất lính
rules.unithealthmultiplier = Hệ số máu của quân lính rules.unithealthmultiplier = Hệ số máu của quân lính
rules.unitdamagemultiplier = Hệ số sát thương của quân lính rules.unitdamagemultiplier = Hệ số sát thương của quân lính
rules.unitcapvariable = Căn cứ tăng giới hạn quân lính
rules.unitcap = Giới hạn quân lính
rules.enemycorebuildradius = Bán kính không xây dựng trong căn cứ của kẻ địch:[lightgray] (ô) rules.enemycorebuildradius = Bán kính không xây dựng trong căn cứ của kẻ địch:[lightgray] (ô)
rules.wavespacing = Thời gian giữa các đợt:[lightgray] (giây) rules.wavespacing = Thời gian giữa các đợt:[lightgray] (giây)
rules.buildcostmultiplier = Hệ số chi phí xây dựng rules.buildcostmultiplier = Hệ số chi phí xây dựng
@@ -956,6 +982,7 @@ rules.explosions = Sát thương nổ của Khối/Quân lính
rules.ambientlight = Ánh sáng môi trường rules.ambientlight = Ánh sáng môi trường
rules.weather = Thời tiết rules.weather = Thời tiết
rules.weather.frequency = Tần suất: rules.weather.frequency = Tần suất:
rules.weather.always = Luôn luôn
rules.weather.duration = Thời gian: rules.weather.duration = Thời gian:
content.item.name = Vật phẩm content.item.name = Vật phẩm
@@ -977,7 +1004,7 @@ item.surge-alloy.name = Hợp kim
item.spore-pod.name = Vỏ bào tử item.spore-pod.name = Vỏ bào tử
item.sand.name = Cát item.sand.name = Cát
item.blast-compound.name = Chất nổ item.blast-compound.name = Chất nổ
item.pyratite.name = Tiền chất nổ item.pyratite.name = Nhiệt thạch
item.metaglass.name = Thuỷ tinh item.metaglass.name = Thuỷ tinh
item.scrap.name = Phế liệu item.scrap.name = Phế liệu
liquid.water.name = Nước liquid.water.name = Nước
@@ -1044,7 +1071,7 @@ block.moss.name = Rêu
block.shrubs.name = Bụi cây block.shrubs.name = Bụi cây
block.spore-moss.name = Rêu bào tử block.spore-moss.name = Rêu bào tử
block.shale-wall.name = Tường đá phiến sét block.shale-wall.name = Tường đá phiến sét
block.scrap-wall.name = Tường sắt vụn block.scrap-wall.name = Tường phế liệu
block.scrap-wall-large.name = Tường phế liệu lớn block.scrap-wall-large.name = Tường phế liệu lớn
block.scrap-wall-huge.name = Tường phế liệu khổng lồ block.scrap-wall-huge.name = Tường phế liệu khổng lồ
block.scrap-wall-gigantic.name = Tường phế liệu siêu khổng lồ block.scrap-wall-gigantic.name = Tường phế liệu siêu khổng lồ
@@ -1105,8 +1132,8 @@ block.copper-wall.name = Tường đồng
block.copper-wall-large.name = Tường đồng lớn block.copper-wall-large.name = Tường đồng lớn
block.titanium-wall.name = Tường titan block.titanium-wall.name = Tường titan
block.titanium-wall-large.name = Tường titan lớn block.titanium-wall-large.name = Tường titan lớn
block.plastanium-wall.name = Tường Plastanium block.plastanium-wall.name = Tường Nhựa
block.plastanium-wall-large.name = Tường Plastanium lớn block.plastanium-wall-large.name = Tường Nhựa lớn
block.phase-wall.name = Tường Phase block.phase-wall.name = Tường Phase
block.phase-wall-large.name = Tường Phase lớn block.phase-wall-large.name = Tường Phase lớn
block.thorium-wall.name = Tường Thorium block.thorium-wall.name = Tường Thorium
@@ -1122,9 +1149,9 @@ block.conveyor.name = Băng chuyền
block.titanium-conveyor.name = Băng chuyền titan block.titanium-conveyor.name = Băng chuyền titan
block.plastanium-conveyor.name = Băng chuyền nhựa block.plastanium-conveyor.name = Băng chuyền nhựa
block.armored-conveyor.name = Băng chuyền bọc giáp block.armored-conveyor.name = Băng chuyền bọc giáp
block.junction.name = Junction block.junction.name = Giao điểm
block.router.name = Bộ định tuyến block.router.name = Bộ phân phát
block.distributor.name = Bộ phân phát block.distributor.name = Bộ phân phát lớn
block.sorter.name = Bộ lọc block.sorter.name = Bộ lọc
block.inverted-sorter.name = Bộ lọc ngược block.inverted-sorter.name = Bộ lọc ngược
block.message.name = Thông điệp block.message.name = Thông điệp
@@ -1134,8 +1161,8 @@ block.underflow-gate.name = Cổng tràn ngược
block.silicon-smelter.name = Máy nấu silicon block.silicon-smelter.name = Máy nấu silicon
block.phase-weaver.name = Máy tạo Phase block.phase-weaver.name = Máy tạo Phase
block.pulverizer.name = Máy nghiền block.pulverizer.name = Máy nghiền
block.cryofluid-mixer.name = Máy sản xuất chất làm mát block.cryofluid-mixer.name = Máy sản xuất chất làm lạnh
block.melter.name = Máy nung chảy block.melter.name = nung chảy
block.incinerator.name = Máy phân hủy block.incinerator.name = Máy phân hủy
block.spore-press.name = Máy nén bào tử block.spore-press.name = Máy nén bào tử
block.separator.name = Máy phân tách block.separator.name = Máy phân tách
@@ -1162,7 +1189,7 @@ block.item-void.name = Hủy vật phẩm
block.liquid-source.name = Nguồn chất lỏng block.liquid-source.name = Nguồn chất lỏng
block.liquid-void.name = Hủy chất lỏng block.liquid-void.name = Hủy chất lỏng
block.power-void.name = Hủy năng lượng block.power-void.name = Hủy năng lượng
block.power-source.name = Vô hạn năng lượng block.power-source.name = Nguồn năng lượng
block.unloader.name = Điểm dỡ hàng block.unloader.name = Điểm dỡ hàng
block.vault.name = Nhà kho block.vault.name = Nhà kho
block.wave.name = Wave block.wave.name = Wave
@@ -1171,9 +1198,9 @@ block.swarmer.name = Swarmer
block.salvo.name = Salvo block.salvo.name = Salvo
block.ripple.name = Ripple block.ripple.name = Ripple
block.phase-conveyor.name = Phase Conveyor block.phase-conveyor.name = Phase Conveyor
block.bridge-conveyor.name = Bridge Conveyor block.bridge-conveyor.name = Cầu dẫn
block.plastanium-compressor.name = Máy sản xuất nhựa block.plastanium-compressor.name = Máy sản xuất nhựa
block.pyratite-mixer.name = Máy trộn tiền chất nổ block.pyratite-mixer.name = Máy trộn nhiệt thạch
block.blast-mixer.name = Máy trộn chất nổ block.blast-mixer.name = Máy trộn chất nổ
block.solar-panel.name = Pin mặt trời block.solar-panel.name = Pin mặt trời
block.solar-panel-large.name = Pin mặt trời lớn block.solar-panel-large.name = Pin mặt trời lớn
@@ -1182,10 +1209,10 @@ block.repair-point.name = Điểm sửa chữa
block.pulse-conduit.name = Ống dẫn titan block.pulse-conduit.name = Ống dẫn titan
block.plated-conduit.name = Ống dẫn bọc giáp block.plated-conduit.name = Ống dẫn bọc giáp
block.phase-conduit.name = Ống dẫn Phase block.phase-conduit.name = Ống dẫn Phase
block.liquid-router.name = Bộ định tuyến chất lỏng block.liquid-router.name = Bộ phân phát chất lỏng
block.liquid-tank.name = Thùng chất lỏng block.liquid-tank.name = Thùng chất lỏng
block.liquid-junction.name = Liquid Junction block.liquid-junction.name = Giao điểm chất lỏng
block.bridge-conduit.name = Bridge Conduit block.bridge-conduit.name = Cầu dẫn chất lỏng
block.rotary-pump.name = Bơm điện block.rotary-pump.name = Bơm điện
block.thorium-reactor.name = Lò phản ứng Thorium block.thorium-reactor.name = Lò phản ứng Thorium
block.mass-driver.name = Máy phóng điện từ block.mass-driver.name = Máy phóng điện từ
@@ -1227,11 +1254,11 @@ block.overdrive-dome.name = Máy tăng tốc lớn
#experimental, may be removed #experimental, may be removed
block.block-forge.name = Block Forge block.block-forge.name = Block Forge
block.block-loader.name = Block Loader block.block-loader.name = Block Loader
block.block-unloader.name = Block Unloader block.block-unloader.name = Điểm dỡ hàng
block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh
block.switch.name = Công tắc block.switch.name = Công tắc
block.micro-processor.name = Bộ xử lí mini block.micro-processor.name = Bộ xử lí nhỏ
block.logic-processor.name = Bộ xử lý block.logic-processor.name = Bộ xử lý
block.hyper-processor.name = Bộ xử lý lớn block.hyper-processor.name = Bộ xử lý lớn
block.logic-display.name = Màn hình block.logic-display.name = Màn hình
@@ -1282,6 +1309,9 @@ hint.payloadDrop.mobile = [accent]Nhấn và giữ[] tại một khu vực trố
hint.waveFire = [accent]Wave[] súng có nước làm đạn dược sẽ tự động dập tắt các đám cháy gần đó. hint.waveFire = [accent]Wave[] súng có nước làm đạn dược sẽ tự động dập tắt các đám cháy gần đó.
hint.generator = \uf879 [accent]Máy phát điện đốt cháy[] đốt than và truyền năng lượng cho các khối liền kề.\n\nPhạm vi truyền tải năng lượng có thể được mở rộng với \uf87f [accent]Chốt điện[]. hint.generator = \uf879 [accent]Máy phát điện đốt cháy[] đốt than và truyền năng lượng cho các khối liền kề.\n\nPhạm vi truyền tải năng lượng có thể được mở rộng với \uf87f [accent]Chốt điện[].
hint.guardian = [accent]Boss[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng súng tiên tiến hơn hoặc sử dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss. hint.guardian = [accent]Boss[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng súng tiên tiến hơn hoặc sử dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss.
hint.coreUpgrade = Các căn cứ có thể được nâng cấp bằng cách [accent]đặt căn cứ cấp cao hơn trên chúng[].\n\nĐặt một căn cứ  [accent]Trụ sở[] trên căn cứ  [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó.
hint.presetLaunch = Khác khu vực đáp [accent] xám[], như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các khu vực lân cận.\n\n[accent]Các khu vực được đánh số[], chẳng hạn như cái này, là [accent]không bắt buộc[].
hint.coopCampaign = Khi chơi chiến dịch[accent]co-op[], các vật phẩm được sản xuất trong bản đồ hiện tại cũng sẽ được gửi [accent]đến các khu vực của bạn[].\n\nBất kỳ nghiên cứu mới nào được thực hiện đều được lưu lại.
item.copper.description = Dùng trong tất cả các khu xây dựng và các loại đạn dược. item.copper.description = Dùng trong tất cả các khu xây dựng và các loại đạn dược.
item.copper.details = Đồng, là kim loại phổ biến trên Serpulo. Có cấu trúc yếu trừ khi được tôi luyện. item.copper.details = Đồng, là kim loại phổ biến trên Serpulo. Có cấu trúc yếu trừ khi được tôi luyện.
@@ -1315,15 +1345,15 @@ block.armored-conveyor.description = Vận chuyển vật phẩm về phía. Kh
block.illuminator.description = Phát sáng. block.illuminator.description = Phát sáng.
block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội. block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội.
block.graphite-press.description = Nén than thành than chì. block.graphite-press.description = Nén than thành than chì.
block.multi-press.description = Nén than thành than chì. Cần nước làm chất làm mát. block.multi-press.description = Nén than thành than chì. Cần nước làm mát.
block.silicon-smelter.description = Tinh chế silicon từ cát và than. block.silicon-smelter.description = Tinh chế silicon từ cát và than.
block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh. block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh.
block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan. block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan.
block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát. block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát.
block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim. block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim.
block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát. block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát.
block.blast-mixer.description = Tạo ra hợp chất nổ từ tiền chất nổ và vỏ bào tử. block.blast-mixer.description = Tạo ra hợp chất nổ từ nhiệt thạch và vỏ bào tử.
block.pyratite-mixer.description = Trộn than, chì và cát thành tiền chất nổ. block.pyratite-mixer.description = Trộn than, chì và cát thành nhiệt thạch.
block.melter.description = Nung phế liệu thành xỉ. block.melter.description = Nung phế liệu thành xỉ.
block.separator.description = Tách xỉ thành các thành phần khoáng của nó. block.separator.description = Tách xỉ thành các thành phần khoáng của nó.
block.spore-press.description = Nén vỏ bào tử thành dầu. block.spore-press.description = Nén vỏ bào tử thành dầu.
@@ -1350,10 +1380,10 @@ block.surge-wall.description = Bảo vệ công trình khỏi đạn của kẻ
block.surge-wall-large.description = Bảo vệ nhiều công trình khỏi đạn của kẻ thù, đôi khi tạo ra tia điện khi bị bắn. block.surge-wall-large.description = Bảo vệ nhiều công trình khỏi đạn của kẻ thù, đôi khi tạo ra tia điện khi bị bắn.
block.door.description = Một bức tường có thể đóng mở. block.door.description = Một bức tường có thể đóng mở.
block.door-large.description = Một bức tường có thể đóng mở. block.door-large.description = Một bức tường có thể đóng mở.
block.mender.description = Sửa chữa định kỳ các khối trong vùng lân cận.\nSử dụng silicon để tăng phạm vi và hiệu quả. block.mender.description = Sửa chữa định kỳ các khối trong vùng lân cận.\nSử dụng Phase Fabric để tăng phạm vi và hiệu quả.
block.mend-projector.description = Sửa chữa các khối lân cận.\nSử dụng silicon để tăng phạm vi và hiệu quả. block.mend-projector.description = Sửa chữa các khối lân cận.\nSử dụng Phase Fabric để tăng phạm vi và hiệu quả.
block.overdrive-projector.description = Tăng tốc độ làm việc của các công trình lân cận.\nSử dụng phase fabric để tăng phạm vi và hiệu quả. block.overdrive-projector.description = Tăng tốc độ làm việc của các công trình lân cận.\nSử dụng phase fabric để tăng phạm vi và hiệu quả.
block.force-projector.description = Tạo ra một trường lực lục giác xung quanh nó, bảo vệ các tòa nhà và quân lính bên trong khỏi bị hư hại.\nQuá nóng nếu chịu quá nhiều sát thương. Sử dụng chất làm mát để giảm nhiệt độ. Sử dụng Phase fabric để tăng kích thước lá chắn. block.force-projector.description = Tạo ra một trường lực lục giác xung quanh nó, bảo vệ các công trình và quân lính bên trong khỏi bị hư hại.\nQuá nóng nếu chịu quá nhiều sát thương. Sử dụng chất làm mát để giảm nhiệt độ. Sử dụng Phase fabric để tăng kích thước lá chắn.
block.shock-mine.description = Giải phóng tia điện khi tiếp xúc với quân lính đối phương. block.shock-mine.description = Giải phóng tia điện khi tiếp xúc với quân lính đối phương.
block.conveyor.description = Vận chuyển vật phẩm về phía trước. block.conveyor.description = Vận chuyển vật phẩm về phía trước.
block.titanium-conveyor.description = Vận chuyển vật phẩm về phía trước. Nhanh hơn băng chuyền tiêu chuẩn. block.titanium-conveyor.description = Vận chuyển vật phẩm về phía trước. Nhanh hơn băng chuyền tiêu chuẩn.
@@ -1366,9 +1396,9 @@ block.inverted-sorter.description = Giống như máy phân loại, nhưng vật
block.router.description = Phân phối các vật phẩm đầu vào thành 3 hướng đầu ra như nhau. block.router.description = Phân phối các vật phẩm đầu vào thành 3 hướng đầu ra như nhau.
block.router.details = Không khuyên dùng cạnh đầu vào dây chuyền vì sẽ bị kẹt bởi đầu ra. block.router.details = Không khuyên dùng cạnh đầu vào dây chuyền vì sẽ bị kẹt bởi đầu ra.
block.distributor.description = Phân phối các vật phẩm đầu vào thành 7 hướng đầu ra như nhau. block.distributor.description = Phân phối các vật phẩm đầu vào thành 7 hướng đầu ra như nhau.
block.overflow-gate.description = Chỉ đưa vật phẩm ra 2 phía nếu phía trước bị chặn, không thể đặt cạnh nhau. block.overflow-gate.description = Chỉ đưa vật phẩm ra 2 phía nếu phía trước bị chặn.
block.underflow-gate.description = Ngược với cổng tràn, chỉ đưa vật phẩm đến trước khi hai bên bị chặn, không thể đặt cạnh nhau. block.underflow-gate.description = Ngược với cổng tràn, chỉ đưa vật phẩm đến trước khi hai bên bị chặn.
block.mass-driver.description = Cấu trúc vận chuyển vật phẩm tầm xa. Thu thập các lô vật phẩm và bắn chúng cho các mass driver khác. block.mass-driver.description = Cấu trúc vận chuyển vật phẩm tầm xa. Thu thập các lô vật phẩm và bắn chúng cho các máy phóng điện từ khác.
block.mechanical-pump.description = Bơm chất lỏng, không yêu cầu năng lượng. block.mechanical-pump.description = Bơm chất lỏng, không yêu cầu năng lượng.
block.rotary-pump.description = Bơm chất lỏng, yêu cầu năng lượng. block.rotary-pump.description = Bơm chất lỏng, yêu cầu năng lượng.
block.thermal-pump.description = Bơm chất lỏng. block.thermal-pump.description = Bơm chất lỏng.
@@ -1389,7 +1419,7 @@ block.battery-large.description = Tích trữ năng lượng khi dư thừa. Xu
block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dễ cháy như than. block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dễ cháy như than.
block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nơi nóng. block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nơi nóng.
block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dễ cháy và chuyển nước thành hơi nước. block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dễ cháy và chuyển nước thành hơi nước.
block.differential-generator.description = Tạo ra một lượng lớn năng lượng. Sử dụng sự chênh lệch nhiệt độ giữa cryofluid và pyratite đang cháy. block.differential-generator.description = Tạo ra một lượng lớn năng lượng. Sử dụng sự chênh lệch nhiệt độ giữa chất làm lạnh và nhiệt thạch đang cháy.
block.rtg-generator.description = Sử dụng nhiệt của các hợp chất phóng xạ đang phân hủy để tạo ra năng lượng với tốc độ chậm. block.rtg-generator.description = Sử dụng nhiệt của các hợp chất phóng xạ đang phân hủy để tạo ra năng lượng với tốc độ chậm.
block.solar-panel.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. block.solar-panel.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời.
block.solar-panel-large.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. Hiệu quả hơn pin mặt trời tiêu chuẩn. block.solar-panel-large.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. Hiệu quả hơn pin mặt trời tiêu chuẩn.
@@ -1405,10 +1435,10 @@ block.cultivator.details = Công nghệ được phục hồi. Được sử d
block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu. block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu.
block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất. block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất.
block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh. block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh.
block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Stores more resources than a Shard. block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Chứa được nhiều tài nguyên hơn Căn cứ: Cơ sỏ.
block.core-foundation.details = The second iteration. block.core-foundation.details = Căn cứ cấp 2.
block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên. block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên.
block.core-nucleus.details = Lần thử thứ ba và lần thử cuối. block.core-nucleus.details = Căn cứ cấp 3 và cũng là cấp cao nhất.
block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng. block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
block.container.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng. block.container.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
block.unloader.description = Lấy các vật phẩm được chọn từ các ô gần đó. block.unloader.description = Lấy các vật phẩm được chọn từ các ô gần đó.
@@ -1421,17 +1451,17 @@ block.wave.description = Phóng một tia chất lỏng vào kẻ địch. Tự
block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất. block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất.
block.arc.description = Phóng tia điện vào kẻ địch trên mặt đất. block.arc.description = Phóng tia điện vào kẻ địch trên mặt đất.
block.swarmer.description = Bắn tên lửa truy đuổi vào kẻ địch. block.swarmer.description = Bắn tên lửa truy đuổi vào kẻ địch.
block.salvo.description = Bắn đạn salvo vào kẻ địch. block.salvo.description = Bắn loạt đạn vào kẻ địch.
block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch. block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch.
block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa. block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa.
block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần. block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần.
block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất. block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất.
block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động. block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động.
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa.
block.repair-point.description = Liên tục sửa chữa robot ở gần trong phạm vi hoạt động. block.repair-point.description = Liên tục sửa chữa robot ở trong phạm vi hoạt động.
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser. block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo. block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước. block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước hoặc chất làm mát.
block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng. block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng.
block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium. block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium.
block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động. block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động.
@@ -1447,12 +1477,12 @@ block.exponential-reconstructor.description = Nâng cấp quân của bạn lên
block.tetrative-reconstructor.description = Nâng cấp quân của bạn nên cấp năm (cuối cùng). block.tetrative-reconstructor.description = Nâng cấp quân của bạn nên cấp năm (cuối cùng).
block.switch.description = Công tắc, trạng thái có thể được đọc và điều khiển với vi xử lí logic. block.switch.description = Công tắc, trạng thái có thể được đọc và điều khiển với vi xử lí logic.
block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình.
block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn vi xử lí micro. block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn bộ xử lí nhỏ.
block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn vi xử lí logic. block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn bộ xử lí.
block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí logic. block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí.
block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí logic. Dung lượng cao. block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí. Dung lượng cao.
block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic. block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic. block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh. block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh.
unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh. unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh.
@@ -1466,7 +1496,7 @@ unit.quasar.description = Bắn tia laser xuyên giáp làm tổn hại kẻ đ
unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sửa chữa các tòa nhà. Có khả năng bay. unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sửa chữa các tòa nhà. Có khả năng bay.
unit.corvus.description = Bắn đia laser đánh bật kẻ địch và sửa chữa các tòa nhà. Có thể đi qua đa số địa hình. unit.corvus.description = Bắn đia laser đánh bật kẻ địch và sửa chữa các tòa nhà. Có thể đi qua đa số địa hình.
unit.crawler.description = Chạy đến kẻ địch và nổ. unit.crawler.description = Chạy đến kẻ địch và nổ.
unit.atrax.description = Bắn cục xỉ vào kẻ địch trên mặt đất. Có thể đi qua đa số địa hình. unit.atrax.description = Phun xỉ nóng chảy vào kẻ địch trên mặt đất. Có thể đi qua đa số địa hình.
unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tự sửa chữa nó. Có thể đi qua đa số địa hình. unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tự sửa chữa nó. Có thể đi qua đa số địa hình.
unit.arkyid.description = Bắn tia laser lớn vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình. unit.arkyid.description = Bắn tia laser lớn vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
unit.toxopid.description = Bắn chùm đạn điện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình. unit.toxopid.description = Bắn chùm đạn điện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
@@ -1479,12 +1509,148 @@ unit.mono.description = Tự động khai thác đồng và chì, và vận chuy
unit.poly.description = Tự động xây dựng lại các công trình bị hỏng và hỗ trợ các quân lính khác thi công. unit.poly.description = Tự động xây dựng lại các công trình bị hỏng và hỗ trợ các quân lính khác thi công.
unit.mega.description = Tự động sửa chữa các công trình bị hỏng. Có khả năng mang bộ binh nhỏ. unit.mega.description = Tự động sửa chữa các công trình bị hỏng. Có khả năng mang bộ binh nhỏ.
unit.quad.description = Thả bom to lên kẻ địch, sửa chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bộ binh vừa. unit.quad.description = Thả bom to lên kẻ địch, sửa chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bộ binh vừa.
unit.oct.description = Bảo vệ đồng minh với giáp. Có kả năng mang đa số bộ binh. unit.oct.description = Bảo vệ đồng minh với giáp. Có khả năng mang đa số bộ binh.
unit.risso.description = Bắn chùm tên lửa và đạn lên kẻ địch tầm gần. unit.risso.description = Bắn chùm tên lửa và đạn lên kẻ địch tầm gần.
unit.minke.description = Bắn đạn và đạn thường lên kẻ địch tầm gần trên mặt đất. unit.minke.description = Bắn đạn và đạn thường lên kẻ địch tầm gần trên mặt đất.
unit.bryde.description = Bắn đạn tầm xa và tên lửa vào kẻ địch. unit.bryde.description = Bắn đạn tầm xa và tên lửa vào kẻ địch.
unit.sei.description = Bắn chùm tên lửa và đạn xuyên giáp vào kẻ địch. unit.sei.description = Bắn chùm tên lửa và đạn xuyên giáp vào kẻ địch.
unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào kẻ địch. Tạo nên drone báo hiệu. unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào kẻ địch. Tạo nên Flare.
unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng. unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng.
unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng. unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng.
unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng. unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng.
lst.read = Đọc một số từ bộ nhớ được liên kết.
lst.write = Ghi một số vào bộ nhớ được liên kết.
lst.print = Thêm văn bản vào bộ nhớ in.\nKhông hiển thị gì cho đến khi sử dụng [accent]Print Flush[].
lst.draw = Thêm một thao tác vào bộ nhớ vẽ.\nKhông hiển thị gì cho đến khi sử dụng [accent]Draw Flush[].
lst.drawflush = Chuyển các thao tác [accent]Draw[] đến màng hình.
lst.printflush = Chuyển các thao tác [accent]Print[] đến khối tin nhắn.
lst.getlink = Nhận liên kết bộ xử lý theo thứ tự. Bắt đầu từ 0.
lst.control = Điều khiển một khối.
lst.radar = Định vị các quân lính trong phạm vi xung quanh một khối.
lst.sensor = Lấy dữ liệu từ một khối hoặc quân lính.
lst.set = Đặt một biến.
lst.operation = Thực hiện thao tác trên 1-2 biến.
lst.end = Chuyển đến lệnh đầu tiên.
lst.jump = Chuyển qua lệnh khác nếu điều kiện đúng.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around the currently bound unit.
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
lenum.shoot = Bắn vào vị trí xác định.
lenum.shootp = Shoot at a unit/building with velocity prediction.
lenum.configure = Building configuration, e.g. sorter item.
lenum.enabled = Bất cứ khi nào khối hoạt động.
laccess.color = Màu đèn chiếu sáng.
graphicstype.clear = Tô màu cho màn hình.
graphicstype.color = Đặt màu cho thao tác vẽ tiếp theo.
graphicstype.stroke = Đặt chiều rộng đoạn thẳng.
graphicstype.line = Vẽ đoạn thẳng.
graphicstype.rect = Tô một hình chữ nhật.
graphicstype.linerect = Vẽ đường viền hình chữ nhật.
graphicstype.poly = Tô vào đa giác đều.
graphicstype.linepoly = Vẽ đường viền đa giác đều.
graphicstype.triangle = Tô một hình tam giác.
graphicstype.image = Vẽ hình ảnh một số nội dung.\nVd: [accent]@router[] hoặc [accent]@dagger[].
lenum.always = Luôn đúng.
lenum.idiv = Chia lấy phần nguyên.
lenum.div = Phép chia.\nTrả về [accent]null[] khi chia cho 0.
lenum.mod = Chia lấy phần dư.
lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0.
lenum.notequal = Not equal. Coerces types.
lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[].
lenum.shl = Bit-shift left.
lenum.shr = Bit-shift right.
lenum.or = Bitwise OR.
lenum.land = Logical AND.
lenum.and = Bitwise AND.
lenum.not = Bitwise flip.
lenum.xor = Bitwise XOR.
lenum.min = Số nhỏ nhất giữa hai số.
lenum.max = Số lớn nhất giữa hai số.
lenum.angle = Góc của vectơ tính bằng độ.
lenum.len = Chiều dài của vectơ.
lenum.sin = Sin, tính bằng độ.
lenum.cos = Cos, tính bằng độ.
lenum.tan = Tan, tính bằng độ.
#not a typo, look up 'range notation'
lenum.rand = Số ngẫu nhiên trong phạm vi [0, giá trị).
lenum.log = Lôgarit tự nhiên (ln).
lenum.log10 = Lôgarit cơ số 10.
lenum.noise = 2D simplex noise.
lenum.abs = Giá trị tuyệt đối.
lenum.sqrt = Căn bậc hai.
lenum.any = Bất kì quân lính.
lenum.ally = Quân lính cùng đội.
lenum.attacker = Quân lính với vũ khí.
lenum.enemy = Quân lính địch.
lenum.boss = Boss.
lenum.flying = Không quân.
lenum.ground = Bộ binh.
lenum.player = Quân lính do người chơi điều khiển.
lenum.ore = Ore deposit.
lenum.damaged = Damaged ally building.
lenum.spawn = Enemy spawn point.\nMay be a core or a position.
lenum.building = Building in a specific group.
lenum.core = Bất kì căn cứ.
lenum.storage = Khối lưu trữ, Ví dụ Nhà kho.
lenum.generator = Khối có thể tạo ra năng lượng.
lenum.factory = Khối có thể biến đổi vật phẩm.
lenum.repair = Điểm sửa chữa.
lenum.rally = Trung tâm chỉ huy.
lenum.battery = Bất kì pin.
lenum.resupply = Điểm tiếp tế.\nChỉ phù hợp khi [accent]"Quân lính cần đạn"[] được bật.
lenum.reactor = Lò phản ứng Thorium\Nhiệt hạch.
lenum.turret = Bất kì súng.
sensor.in = The building/unit to sense.
radar.from = Building to sense from.\nSensor range is limited by building range.
radar.target = Filter for units to sense.
radar.and = Additional filters.
radar.order = Sorting order. 0 to reverse.
radar.sort = Metric to sort results by.
radar.output = Variable to write output unit to.
unitradar.target = Filter for units to sense.
unitradar.and = Additional filters.
unitradar.order = Sorting order. 0 to reverse.
unitradar.sort = Metric to sort results by.
unitradar.output = Variable to write output unit to.
control.of = Building to control.
control.unit = Unit/building to aim at.
control.shoot = Whether to shoot.
unitlocate.enemy = Whether to locate enemy buildings.
unitlocate.found = Whether the object was found.
unitlocate.building = Output variable for located building.
unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for.
lenum.stop = Dừng di chuyển/Đào/Xây dựng.
lenum.move = Di chuyển đến vị trí xác định.
lenum.approach = Approach a position with a radius.
lenum.pathfind = Tìm đường đến nơi tạo ra kẻ địch.
lenum.target = Bắn vào vị trí xác định.
lenum.targetp = Shoot a target with velocity prediction.
lenum.itemdrop = Thả vật phẩm.
lenum.itemtake = Lấy vật phẩm từ khối.
lenum.paydrop = Thả khối hàng hiện tại.
lenum.paytake = Nhất khối hàng tại vị trí hiện tại.
lenum.flag = Numeric unit flag.
lenum.mine = Đào tại vị trí.
lenum.build = Xây công trình.
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[].
lenum.within = Kiểm tra xem quân lính có gần vị trí không.
lenum.boost = Start/stop boosting.

View File

@@ -41,10 +41,13 @@ be.ignore = 忽略
be.noupdates = 沒有新的更新。 be.noupdates = 沒有新的更新。
be.check = 檢查是否有新的更新 be.check = 檢查是否有新的更新
mod.featured.dialog.title = 模組瀏覽器 (尚未完成) mods.browser = 模組瀏覽器
mods.browser.selected = 已選模組 mods.browser.selected = 已選模組
mods.browser.add = 安裝 mods.browser.add = 安裝
mods.github.open = 查看 mods.github.reinstall = 重新安裝
mods.github.open = 查看Github
mods.browser.sortdate = 以最近篩選
mods.browser.sortstars = 以星數篩選
schematic = 藍圖 schematic = 藍圖
schematic.add = 儲存藍圖…… schematic.add = 儲存藍圖……
@@ -116,9 +119,11 @@ mods.none = [lightgray]找不到模組!
mods.guide = 模組指南 mods.guide = 模組指南
mods.report = 回報錯誤 mods.report = 回報錯誤
mods.openfolder = 開啟模組資料夾 mods.openfolder = 開啟模組資料夾
mods.viewcontent = 查看內容
mods.reload = 重新載入 mods.reload = 重新載入
mods.reloadexit = 遊戲將會結束以重新載入模組。 mods.reloadexit = 遊戲將會結束以重新載入模組。
mod.display = [gray]模組:[orange]{0} mod.display = [gray]模組:[orange]{0}
mod.installed = [[已安裝]
mod.enabled = [lightgray]已啟用 mod.enabled = [lightgray]已啟用
mod.disabled = [scarlet]已禁用 mod.disabled = [scarlet]已禁用
mod.disable = 禁用 mod.disable = 禁用
@@ -307,6 +312,7 @@ cancelbuilding = [accent][[{0}][]清除計畫
selectschematic = [accent][[{0}][]選擇並複製 selectschematic = [accent][[{0}][]選擇並複製
pausebuilding = [accent][[{0}][]暫停建造 pausebuilding = [accent][[{0}][]暫停建造
resumebuilding = [scarlet][[{0}][]繼續建造 resumebuilding = [scarlet][[{0}][]繼續建造
enablebuilding = [scarlet][[{0}][]啟用建造
showui = 已隱藏介面。\n按[accent][[{0}][]顯示介面。 showui = 已隱藏介面。\n按[accent][[{0}][]顯示介面。
wave = [accent]第{0}波 wave = [accent]第{0}波
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]Wave {0}/{1}
@@ -420,7 +426,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]警告!這將會覆蓋現有的地圖。 editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
@@ -678,6 +684,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 +700,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 = 溫度
@@ -788,6 +796,7 @@ 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.flow.name = 顯示資源輸送速度 setting.flow.name = 顯示資源輸送速度
setting.backgroundpause.name = 背景執行時暫停 setting.backgroundpause.name = 背景執行時暫停
setting.buildautopause.name = 自動暫停建築 setting.buildautopause.name = 自動暫停建築
@@ -948,6 +957,8 @@ 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 = 建設成本倍數
@@ -1505,3 +1516,139 @@ unit.omura.description = 對敵人發射遠程穿透型砲彈。建造曳光戰
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。 unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。 unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。 unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。
lst.read = [accent]讀取[]記憶體中的一項數值
lst.write = [accent]寫入[]一項數值到記憶體中
lst.print = 將文字加入輸出的暫存中,搭配[accent]Print Flush[]使用
lst.draw = 將圖形加入顯示的暫存中,搭配[accent]Draw Flush[]使用
lst.drawflush = 將所有暫存的[accent]Draw[]指令推到顯示器上
lst.printflush = 將所有暫存的[accent]Print[]指令推到訊息板上
lst.getlink = 由連接順序回傳連接的建築,第一個從"0"開始
lst.control = 控制一個建築
lst.radar = 偵測建築範圍內的單位
lst.sensor = 獲取該建築或單位的數據
lst.set = 設一個變數
lst.operation = 加減乘除和計算機概論
lst.end = 跳到第一個重頭開始執行
lst.jump = 條件式跳到其他指令執行
lst.unitbind = 綁定下一同種單位,存入[accent]@unit[]中.
lst.unitcontrol = 控制現在綁定的單位
lst.unitradar = 偵測綁定單位附近的單位
lst.unitlocate = 尋找整個地圖上特定的位置/建築\n需要綁定的單位
lenum.type = 建築/單位種類。\n例操控單位建造光矛砲應使用[accent]@lancer[],而非字串
lenum.shoot = 對該位置開火
lenum.shootp = 對指定單位/建築開火,具自瞄功能
lenum.configure = 建築設定,如分類器、兵器工廠
lenum.enabled = 確認該建築是否啟用
laacess.color = 設定照明燈的顏色
graphicstype.clear = 重製版面為指定顏色
graphicstype.color = 為接下來的圖畫指令設定顏色
graphicstype.stroke = 為接下來的圖畫指令設定直線寬度
graphicstype.line = 畫一直線
graphicstype.rect = 畫實心長方形
graphicstype.linerect = 畫空心長方形
graphicstype.poly = 畫實心正多邊形
graphicstype.linepoly = 畫空心正多邊形
graphicstype.triangle = 畫實心三角形
graphicstype.image = 繪製內建圖畫\n如: [accent]@router[]或[accent]@dagger[].
lenum.always = 永遠 true (直接跳).
lenum.idiv = 整數除法,無條件捨去.
lenum.div = 除法.\n除以零時回傳 [accent]null[]
lenum.mod = Modulo求餘數
lenum.equal = 是否相等,不管資料型態。\n非null 物件和數值相比時回傳1
lenum.notequal = 不相等,不管資料型態.
lenum.strictequal = 嚴格檢查是否相等,會看資料型態。\n可用來檢查[accent]null[]
lenum.shl = Bit-shift left.
lenum.shr = Bit-shift right.
lenum.or = Bitwise OR.
lenum.land = Logical AND.
lenum.and = Bitwise AND.
lenum.not = Bitwise flip.
lenum.xor = Bitwise XOR.
lenum.min = 兩數取小
lenum.max = 兩數取大
lenum.angle = 向量與x軸夾角
lenum.len = 向量長度
lenum.sin = 度數Sin值
lenum.cos = 度數Cos值
lenum.tan = 度數Tan值
#not a typo, look up 'range notation'
lenum.rand = 產生隨機數值: [0, 值).
lenum.log = 自然對數(ln、log_e).
lenum.log10 = 高中數學.
lenum.noise = 2D simplex noise.
lenum.abs = 取絕對值
lenum.sqrt = 開根號
lenum.any = 任何單位
lenum.ally = 友方單位
lenum.attacker = 具武器的單位
lenum.enemy = 敵方單位
lenum.boss = 頭目單位
lenum.flying = 飛行單位
lenum.ground = 陸上單位
lenum.player = 玩家單位
lenum.ore = 尋找礦物
lenum.damaged = 尋找受損友方建築
lenum.spawn = 敵方重生點\n可以是核心或一個位置
lenum.building = 尋找特定建築
lenum.core = 任何核心
lenum.storage = 儲藏建築
lenum.generator = 會發電的建築
lenum.factory = 生產加工資源的建築,如煉矽場
lenum.repair = 維修點
lenum.rally = 指揮中心
lenum.battery = 電池
lenum.resupply = 補給點\n只有在[accent]"單位需要彈藥"[]被啟用時才有效果
lenum.reactor = 衝擊/釷反應爐
lenum.turret = 任何砲塔
sensor.in = 想查閱的建築/單位
radar.from = 作為雷達的建築\n偵測範圍同該建築的範圍
radar.target = 搜索條件
radar.and = 額外條件
radar.order = 輸出順序1距離最近、血量最大
radar.sort = 篩選方式
radar.output = 回傳該單位為變數
unitradar.target = 搜索條件
unitradar.and = 額外條件
unitradar.order = 輸出順序1距離最近、血量最大
unitradar.sort = 篩選方式
unitradar.output = 存該單位的變數
control.of = 要控制的建築
control.unit = 指定的建築/單位
control.shoot = 是否開火
unitlocate.enemy = 搜索敵方或友方建築
unitlocate.found = 回傳是否找到建築
unitlocate.building = 回傳找到的建築為變數
unitlocate.outx = 回傳 X 座標
unitlocate.outy = 回傳 Y 座標
unitlocate.group = 搜索建築種類
lenum.stop = 停止移動/挖礦/建造
lenum.move = 移動到指定位置
lenum.approach = 移動到距離指定位置一段距離的地方
lenum.pathfind = 由內建AI前往敵方重生點
lenum.target = 射擊指定區域
lenum.targetp = 帶自瞄射擊指定的目標
lenum.itemdrop = 放下物品
lenum.itemtake = 從建築拿取物品
lenum.paydrop = 放下拾取的負載
lenum.paytake = 拾取船身下方的單位/建築
lenum.flag = 單位編號(可異)
lenum.mine = 挖指定位置的礦物
lenum.build = 建造一個建築
lenum.getblock = 獲取指定位置的建築種類和該建築\n必須在單位的範圍內\n實體障礙物如高山會回傳[accent]@solid[]
lenum.within = 單位是否在指定範圍內
lenum.boost = 使用推進器

View File

@@ -14,7 +14,6 @@
63730=magmarock|block-magmarock-medium 63730=magmarock|block-magmarock-medium
63729=sand|block-sand-medium 63729=sand|block-sand-medium
63728=darksand|block-darksand-medium 63728=darksand|block-darksand-medium
63727=holostone|block-holostone-medium
63726=grass|block-grass-medium 63726=grass|block-grass-medium
63725=salt|block-salt-medium 63725=salt|block-salt-medium
63724=snow|block-snow-medium 63724=snow|block-snow-medium
@@ -285,7 +284,6 @@
63451=scepter|unit-scepter-medium 63451=scepter|unit-scepter-medium
63450=reign|unit-reign-medium 63450=reign|unit-reign-medium
63449=dirt|block-dirt-medium 63449=dirt|block-dirt-medium
63448=dirtwall|block-dirtwall-medium
63447=stone-wall|block-stone-wall-medium 63447=stone-wall|block-stone-wall-medium
63446=spore-wall|block-spore-wall-medium 63446=spore-wall|block-spore-wall-medium
63445=ice-wall|block-ice-wall-medium 63445=ice-wall|block-ice-wall-medium
@@ -295,7 +293,6 @@
63441=salt-wall|block-salt-wall-medium 63441=salt-wall|block-salt-wall-medium
63440=shale-wall|block-shale-wall-medium 63440=shale-wall|block-shale-wall-medium
63439=dirt-wall|block-dirt-wall-medium 63439=dirt-wall|block-dirt-wall-medium
63438=holostone-wall|block-holostone-wall-medium
63437=basalt|block-basalt-medium 63437=basalt|block-basalt-medium
63436=dacite|block-dacite-medium 63436=dacite|block-dacite-medium
63435=boulder|block-boulder-medium 63435=boulder|block-boulder-medium

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -133,6 +133,7 @@ const PlayerLeave = Packages.mindustry.game.EventType.PlayerLeave
const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect
const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin
const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent
const UnitUnloadEvent = Packages.mindustry.game.EventType.UnitUnloadEvent
const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent
const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent
const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent
@@ -161,6 +162,7 @@ const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent
const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent
const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent
const FileTreeInitEvent = Packages.mindustry.game.EventType.FileTreeInitEvent
const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent
const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent
const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent

Binary file not shown.

View File

@@ -34,6 +34,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override @Override
public void setup(){ public void setup(){
String dataDir = OS.env("MINDUSTRY_DATA_DIR");
if(dataDir != null){
Core.settings.setDataDirectory(files.absolute(dataDir));
}
checkLaunch();
loadLogger(); loadLogger();
loader = new LoadRenderer(); loader = new LoadRenderer();
@@ -145,7 +151,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
finished = true; finished = true;
Events.fire(new ClientLoadEvent()); Events.fire(new ClientLoadEvent());
super.resize(graphics.getWidth(), graphics.getHeight()); super.resize(graphics.getWidth(), graphics.getHeight());
app.post(() -> app.post(() -> app.post(() -> app.post(() -> super.resize(graphics.getWidth(), graphics.getHeight()))))); app.post(() -> app.post(() -> app.post(() -> app.post(() -> {
super.resize(graphics.getWidth(), graphics.getHeight());
//mark initialization as complete
finishLaunch();
}))));
} }
}else{ }else{
asyncCore.begin(); asyncCore.begin();
@@ -168,6 +179,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
lastTime = Time.nanos(); lastTime = Time.nanos();
} }
@Override
public void exit(){
//on graceful exit, finish the launch normally.
Vars.finishLaunch();
}
@Override @Override
public void init(){ public void init(){
setup(); setup();
@@ -182,6 +199,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override @Override
public void pause(){ public void pause(){
//when the user tabs out on mobile, the exit() event doesn't fire reliably - in that case, just assume they're about to kill the app
//this isn't 100% reliable but it should work for most cases
if(mobile){
Vars.finishLaunch();
}
if(finished){ if(finished){
super.pause(); super.pause();
} }

View File

@@ -32,12 +32,16 @@ import java.util.*;
import static arc.Core.*; import static arc.Core.*;
public class Vars implements Loadable{ public class Vars implements Loadable{
/** Whether the game failed to launch last time. */
public static boolean failedToLaunch = false;
/** Whether to load locales.*/ /** Whether to load locales.*/
public static boolean loadLocales = true; public static boolean loadLocales = true;
/** Whether the logger is loaded. */ /** Whether the logger is loaded. */
public static boolean loadedLogger = false, loadedFileLogger = false; public static boolean loadedLogger = false, loadedFileLogger = false;
/** Whether to enable various experimental features (e.g. cliffs) */ /** Whether to enable various experimental features (e.g. cliffs) */
public static boolean experimental = false; public static boolean experimental = false;
/** Name of current Steam player. */
public static String steamPlayerName = "";
/** Maximum extra padding around deployment schematics. */ /** Maximum extra padding around deployment schematics. */
public static final int maxLoadoutSchematicPad = 5; public static final int maxLoadoutSchematicPad = 5;
/** Maximum schematic size.*/ /** Maximum schematic size.*/
@@ -50,20 +54,18 @@ public class Vars implements Loadable{
public static final Charset charset = Charset.forName("UTF-8"); public static final Charset charset = Charset.forName("UTF-8");
/** main application name, capitalized */ /** main application name, capitalized */
public static final String appName = "Mindustry"; public static final String appName = "Mindustry";
/** URL for itch.io donations. */ /** Github API URL. */
public static final String donationURL = "https://anuke.itch.io/mindustry/purchase"; public static final String ghApi = "https://api.github.com";
/** URL for discord invite. */ /** URL for discord invite. */
public static final String discordURL = "https://discord.gg/mindustry"; public static final String discordURL = "https://discord.gg/mindustry";
/** URL for sending crash reports to */ /** URL for sending crash reports to. Currently offline. */
public static final String crashReportURL = "http://192.99.169.18/report"; public static final String crashReportURL = "http://192.99.169.18/report";
/** URL the links to the wiki's modding guide.*/ /** URL the links to the wiki's modding guide.*/
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/"; public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/";
/** URL to the JSON file containing all the global, public servers. Not queried in BE. */
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
/** URL to the JSON file containing all the BE servers. Only queried in BE. */ /** URL to the JSON file containing all the BE servers. Only queried in BE. */
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */ /** URL to the JSON file containing all the stable servers. */
public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
/** URL of the github issue report template.*/ /** URL of the github issue report template.*/
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
/** list of built-in servers.*/ /** list of built-in servers.*/
@@ -172,6 +174,8 @@ public class Vars implements Loadable{
public static Fi schematicDirectory; public static Fi schematicDirectory;
/** data subdirectory used for bleeding edge build versions */ /** data subdirectory used for bleeding edge build versions */
public static Fi bebuildDirectory; public static Fi bebuildDirectory;
/** file used to store launch ID */
public static Fi launchIDFile;
/** empty map, indicates no current map */ /** empty map, indicates no current map */
public static Map emptyMap; public static Map emptyMap;
/** map file extension */ /** map file extension */
@@ -284,6 +288,27 @@ public class Vars implements Loadable{
maps.load(); maps.load();
} }
/** Checks if a launch failure occurred.
* If this is the case, failedToLaunch is set to true. */
public static void checkLaunch(){
settings.setAppName(appName);
launchIDFile = settings.getDataDirectory().child("launchid.dat");
if(launchIDFile.exists()){
failedToLaunch = true;
}else{
failedToLaunch = false;
launchIDFile.writeString("go away");
}
}
/** Cleans up after a successful launch. */
public static void finishLaunch(){
if(launchIDFile != null){
launchIDFile.delete();
}
}
public static void loadLogger(){ public static void loadLogger(){
if(loadedLogger) return; if(loadedLogger) return;
@@ -345,7 +370,7 @@ public class Vars implements Loadable{
} }
public static void loadSettings(){ public static void loadSettings(){
settings.setJson(JsonIO.json()); settings.setJson(JsonIO.json);
settings.setAppName(appName); settings.setAppName(appName);
if(steam || (Version.modifier != null && Version.modifier.contains("steam"))){ if(steam || (Version.modifier != null && Version.modifier.contains("steam"))){

View File

@@ -209,6 +209,16 @@ public class BaseAI{
} }
Tile wtile = world.tile(realX, realY); Tile wtile = world.tile(realX, realY);
if(tile.block instanceof PayloadConveyor || tile.block instanceof PayloadAcceptor){
//near a building
for(Point2 point : Edges.getEdges(tile.block.size)){
var t = world.build(tile.x + point.x, tile.y + point.y);
if(t != null){
return false;
}
}
}
//may intersect AI path //may intersect AI path
tmpTiles.clear(); tmpTiles.clear();
if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){ if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){

View File

@@ -269,7 +269,6 @@ public class BlockIndexer{
public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred, boolean usePriority){ public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred, boolean usePriority){
Building closest = null; Building closest = null;
float dst = 0; float dst = 0;
float range2 = range * range;
for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){ for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){
for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){ for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){
@@ -282,13 +281,13 @@ public class BlockIndexer{
if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue; if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue;
float ndst = e.dst2(x, y); float bdst = e.dst(x, y) - e.hitSize() / 2f;
if(ndst < range2 && (closest == null || if(bdst < range && (closest == null ||
//this one is closer, and it is at least of equal priority //this one is closer, and it is at least of equal priority
(ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) || (bdst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) ||
//priority is used, and new block has higher priority regardless of range //priority is used, and new block has higher priority regardless of range
(usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
dst = ndst; dst = bdst;
closest = e; closest = e;
} }
} }

View File

@@ -23,7 +23,6 @@ public class Pathfinder implements Runnable{
private static final int updateFPS = 60; private static final int updateFPS = 60;
private static final int updateInterval = 1000 / updateFPS; private static final int updateInterval = 1000 / updateFPS;
private static final int impassable = -1; private static final int impassable = -1;
private static final int fieldTimeout = 1000 * 60 * 2;
public static final int public static final int
fieldCore = 0, fieldCore = 0,
@@ -192,31 +191,6 @@ public class Pathfinder implements Runnable{
//total update time no longer than maxUpdate //total update time no longer than maxUpdate
for(Flowfield data : threadList){ for(Flowfield data : threadList){
updateFrontier(data, maxUpdate / threadList.size); updateFrontier(data, maxUpdate / threadList.size);
//TODO implement timeouts... or don't
/*
//remove flowfields that have 'timed out' so they can be garbage collected and no longer waste space
if(data.refreshRate > 0 && Time.timeSinceMillis(data.lastUpdateTime) > fieldTimeout){
//make sure it doesn't get removed twice
data.lastUpdateTime = Time.millis();
Team team = data.team;
Core.app.post(() -> {
//remove its used state
if(fieldMap[team.id] != null){
fieldMap[team.id].remove(data.target);
fieldMapUsed[team.id].remove(data.target);
}
//remove from main thread list
mainList.remove(data);
});
queue.post(() -> {
//remove from this thread list with a delay
threadList.remove(data);
});
}*/
} }
} }

View File

@@ -73,7 +73,7 @@ public class WaveSpawner{
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));
unit.add(); spawnEffect(unit);
} }
}); });
}else{ }else{
@@ -92,7 +92,7 @@ public class WaveSpawner{
} }
} }
Time.runTask(121f, () -> spawning = false); Time.run(121f, () -> spawning = false);
} }
public void doShockwave(float x, float y){ public void doShockwave(float x, float y){
@@ -148,8 +148,7 @@ public class WaveSpawner{
private void eachFlyerSpawn(Floatc2 cons){ private void eachFlyerSpawn(Floatc2 cons){
for(Tile tile : spawns){ for(Tile tile : spawns){
float angle = Angles.angle(world.width() / 2, world.height() / 2, tile.x, tile.y); float angle = Angles.angle(world.width() / 2f, world.height() / 2f, tile.x, tile.y);
float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize; float 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);
float spawnY = Mathf.clamp(world.height() * tilesize / 2f + Angles.trnsy(angle, trns), -margin, world.height() * tilesize + margin); float spawnY = Mathf.clamp(world.height() * tilesize / 2f + Angles.trnsy(angle, trns), -margin, world.height() * tilesize + margin);
@@ -168,6 +167,7 @@ public class WaveSpawner{
} }
private void reset(){ private void reset(){
spawning = false;
spawns.clear(); spawns.clear();
for(Tile tile : world.tiles){ for(Tile tile : world.tiles){
@@ -178,8 +178,11 @@ public class WaveSpawner{
} }
private void spawnEffect(Unit unit){ private void spawnEffect(Unit unit){
Call.spawnEffect(unit.x, unit.y, unit.type); unit.rotation = unit.angleTo(world.width()/2f * tilesize, world.height()/2f * tilesize);
Time.run(30f, unit::add); unit.apply(StatusEffects.unmoving, 30f);
unit.add();
Call.spawnEffect(unit.x, unit.y, unit.rotation, unit.type);
} }
private interface SpawnConsumer{ private interface SpawnConsumer{
@@ -187,8 +190,8 @@ public class WaveSpawner{
} }
@Remote(called = Loc.server, unreliable = true) @Remote(called = Loc.server, unreliable = true)
public static void spawnEffect(float x, float y, UnitType type){ public static void spawnEffect(float x, float y, float rotation, UnitType u){
Fx.unitSpawn.at(x, y, 0f, type); Fx.unitSpawn.at(x, y, rotation, u);
Time.run(30f, () -> Fx.spawn.at(x, y)); Time.run(30f, () -> Fx.spawn.at(x, y));
} }

View File

@@ -13,9 +13,12 @@ import mindustry.world.blocks.ConstructBlock.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class BuilderAI extends AIController{ public class BuilderAI extends AIController{
float buildRadius = 1500; public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f;
boolean found = false; boolean found = false;
@Nullable Unit following; @Nullable Unit following;
@Nullable Teamc enemy;
float retreatTimer;
@Override @Override
public void updateMovement(){ public void updateMovement(){
@@ -27,6 +30,7 @@ public class BuilderAI extends AIController{
unit.updateBuilding = true; unit.updateBuilding = true;
if(following != null){ if(following != null){
retreatTimer = 0f;
//try to follow and mimic someone //try to follow and mimic someone
//validate follower //validate follower
@@ -39,9 +43,25 @@ public class BuilderAI extends AIController{
//set to follower's first build plan, whatever that is //set to follower's first build plan, whatever that is
unit.plans.clear(); unit.plans.clear();
unit.plans.addFirst(following.buildPlan()); unit.plans.addFirst(following.buildPlan());
}else if(unit.buildPlan() == null){
//not following anyone or building
if(timer.get(timerTarget4, 40)){
enemy = target(unit.x, unit.y, fleeRange, true, true);
}
//fly away from enemy when not doing anything, but only after a delay
if((retreatTimer += Time.delta) >= retreatDelay){
if(enemy != null){
var core = unit.closestCore();
if(core != null && !unit.within(core, retreatDst)){
moveTo(core, retreatDst);
}
}
}
} }
if(unit.buildPlan() != null){ if(unit.buildPlan() != null){
retreatTimer = 0f;
//approach request if building //approach request if building
BuildPlan req = unit.buildPlan(); BuildPlan req = unit.buildPlan();

View File

@@ -0,0 +1,40 @@
package mindustry.ai.types;
import arc.math.*;
import mindustry.entities.*;
import mindustry.entities.comp.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.world.meta.*;
public class DefenderAI extends AIController{
@Override
public void updateMovement(){
if(target != null){
moveTo(target, (target instanceof Sized s ? s.hitSize()/2f * 1.1f : 0f) + unit.hitSize/2f + 15f, 50f);
unit.lookAt(target);
}
}
@Override
protected void updateTargeting(){
if(retarget()) target = findTarget(unit.x, unit.y, unit.range(), true, true);
}
@Override
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
//find unit to follow if not in rally mode
if(command() != UnitCommand.rally){
//Sort by max health and closer target.
var result = Units.closest(unit.team, x, y, Math.max(range, 400f), u -> !u.dead() && u.type != unit.type, (u, tx, ty) -> -u.maxHealth + Mathf.dst2(u.x, u.y, tx, ty) / 800f);
if(result != null) return result;
}
//find rally point
var block = targetFlag(unit.x, unit.y, BlockFlag.rally, false);
if(block != null) return block;
//return core if found
return unit.closestCore();
}
}

View File

@@ -13,7 +13,7 @@ public class FlyingAI extends AIController{
public void updateMovement(){ public void updateMovement(){
if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){ if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){
if(!unit.type.circleTarget){ if(!unit.type.circleTarget){
moveTo(target, unit.range() * 0.8f); moveTo(target, unit.type.range * 0.8f);
unit.lookAt(target); unit.lookAt(target);
}else{ }else{
attack(120f); attack(120f);
@@ -49,10 +49,10 @@ public class FlyingAI extends AIController{
float ang = unit.angleTo(target); float ang = unit.angleTo(target);
float diff = Angles.angleDist(ang, unit.rotation()); float diff = Angles.angleDist(ang, unit.rotation());
if(diff > 100f && vec.len() < circleLength){ if(diff > 70f && vec.len() < circleLength){
vec.setAngle(unit.vel().angle()); vec.setAngle(unit.vel().angle());
}else{ }else{
vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f)); vec.setAngle(Angles.moveToward(unit.vel().angle(), vec.angle(), 6f));
} }
vec.setLength(unit.speed()); vec.setLength(unit.speed());

View File

@@ -48,7 +48,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() * unit.floorSpeedMultiplier() * Time.delta; float speed = unit.realSpeed() * Time.delta;
unit.approach(Mathf.arrive(unit.x, unit.y, realtarget.x, realtarget.y, unit.vel, speed, 0f, speed, 1f).scl(1f / Time.delta)); 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

@@ -19,7 +19,7 @@ public class LogicAI extends AIController{
/** Time after which the unit resets its controlled and reverts to a normal unit. */ /** Time after which the unit resets its controlled and reverts to a normal unit. */
public static final float logicControlTimeout = 10f * 60f; public static final float logicControlTimeout = 10f * 60f;
public LUnitControl control = LUnitControl.stop; public LUnitControl control = LUnitControl.idle;
public float moveX, moveY, moveRad; public float moveX, moveY, moveRad;
public float itemTimer, payTimer, controlTimer = logicControlTimeout, targetTimer; public float itemTimer, payTimer, controlTimer = logicControlTimeout, targetTimer;
@Nullable @Nullable
@@ -128,6 +128,9 @@ public class LogicAI extends AIController{
vec.setZero(); vec.setZero();
} }
//do not move when infinite vectors are used.
if(vec.isNaN() || vec.isInfinite()) return;
unit.approach(vec); unit.approach(vec);
} }

View File

@@ -1,11 +1,16 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.util.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.ConstructBlock.*;
public class RepairAI extends AIController{ public class RepairAI extends AIController{
public static float retreatDst = 160f, fleeRange = 310f, retreatDelay = Time.toSeconds * 3f;
@Nullable Teamc avoid;
float retreatTimer;
@Override @Override
protected void updateMovement(){ protected void updateMovement(){
@@ -29,6 +34,25 @@ public class RepairAI extends AIController{
unit.lookAt(target); unit.lookAt(target);
} }
//not repairing
if(!(target instanceof Building)){
if(timer.get(timerTarget4, 40)){
avoid = target(unit.x, unit.y, fleeRange, true, true);
}
if((retreatTimer += Time.delta) >= retreatDelay){
//fly away from enemy when not doing anything
if(avoid != null){
var core = unit.closestCore();
if(core != null && !unit.within(core, retreatDst)){
moveTo(core, retreatDst);
}
}
}
}else{
retreatTimer = 0f;
}
} }
@Override @Override

View File

@@ -1,5 +1,6 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.math.geom.*;
import mindustry.*; import mindustry.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.entities.*; import mindustry.entities.*;
@@ -47,14 +48,17 @@ public class SuicideAI extends GroundAI{
//raycast for target //raycast for target
boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> {
Tile tile = Vars.world.tile(x, y); for(Point2 p : Geometry.d4c){
if(tile != null && tile.build == target) return false; Tile tile = Vars.world.tile(x + p.x, y + p.y);
if(tile != null && tile.build != null && tile.build.team != unit.team()){ if(tile != null && tile.build == target) return false;
blockedByBlock = true; if(tile != null && tile.build != null && tile.build.team != unit.team()){
return true; blockedByBlock = true;
}else{ return true;
return tile == null || tile.solid(); }else{
return tile == null || tile.solid();
}
} }
return false;
}); });
//shoot when there's an enemy block in the way //shoot when there's an enemy block in the way

View File

@@ -37,8 +37,9 @@ public class PhysicsProcess implements AsyncProcess{
//find Unit without bodies and assign them //find Unit without bodies and assign them
for(Unit entity : group){ for(Unit entity : group){
if(entity.type == null) continue;
if(entity.physref() == null){ if(entity.physref == null){
PhysicsBody body = new PhysicsBody(); PhysicsBody body = new PhysicsBody();
body.x = entity.x(); body.x = entity.x();
body.y = entity.y(); body.y = entity.y();
@@ -48,13 +49,13 @@ public class PhysicsProcess implements AsyncProcess{
PhysicRef ref = new PhysicRef(entity, body); PhysicRef ref = new PhysicRef(entity, body);
refs.add(ref); refs.add(ref);
entity.physref(ref); entity.physref = ref;
physics.add(body); physics.add(body);
} }
//save last position //save last position
PhysicRef ref = entity.physref(); PhysicRef ref = entity.physref;
ref.body.layer = ref.body.layer =
entity.type.allowLegStep ? layerLegs : entity.type.allowLegStep ? layerLegs :

View File

@@ -1,8 +1,6 @@
package mindustry.content; package mindustry.content;
import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.struct.*; import arc.struct.*;
import mindustry.*; import mindustry.*;
import mindustry.ctype.*; import mindustry.ctype.*;
@@ -97,36 +95,9 @@ public class Blocks implements ContentList{
public void load(){ public void load(){
//region environment //region environment
air = new Floor("air"){ air = new AirBlock("air");
{
alwaysReplace = true;
hasShadow = false;
useColor = false;
wall = this;
}
@Override public void drawBase(Tile tile){} spawn = new SpawnBlock("spawn");
@Override public void load(){}
@Override public void init(){}
@Override public boolean isHidden(){ return true; }
@Override
public TextureRegion[] variantRegions(){
if(variantRegions == null){
variantRegions = new TextureRegion[]{Core.atlas.find("clear")};
}
return variantRegions;
}
};
spawn = new OverlayFloor("spawn"){
{
variants = 0;
needsSurface = false;
}
@Override
public void drawBase(Tile tile){}
};
cliff = new Cliff("cliff"){{ cliff = new Cliff("cliff"){{
inEditor = false; inEditor = false;
@@ -676,10 +647,10 @@ public class Blocks implements ContentList{
separator = new Separator("separator"){{ separator = new Separator("separator"){{
requirements(Category.crafting, with(Items.copper, 30, Items.titanium, 25)); requirements(Category.crafting, with(Items.copper, 30, Items.titanium, 25));
results = with( results = with(
Items.copper, 5, Items.copper, 5,
Items.lead, 3, Items.lead, 3,
Items.graphite, 2, Items.graphite, 2,
Items.titanium, 2 Items.titanium, 2
); );
hasPower = true; hasPower = true;
craftTime = 35f; craftTime = 35f;
@@ -692,10 +663,10 @@ public class Blocks implements ContentList{
disassembler = new Separator("disassembler"){{ disassembler = new Separator("disassembler"){{
requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgeAlloy, 70)); requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgeAlloy, 70));
results = with( results = with(
Items.sand, 4, Items.sand, 4,
Items.graphite, 2, Items.graphite, 2,
Items.titanium, 2, Items.titanium, 2,
Items.thorium, 1 Items.thorium, 1
); );
hasPower = true; hasPower = true;
craftTime = 15f; craftTime = 15f;
@@ -788,6 +759,7 @@ public class Blocks implements ContentList{
health = 130 * wallHealthMultiplier; health = 130 * wallHealthMultiplier;
insulated = true; insulated = true;
absorbLasers = true; absorbLasers = true;
schematicPriority = 10;
}}; }};
plastaniumWallLarge = new Wall("plastanium-wall-large"){{ plastaniumWallLarge = new Wall("plastanium-wall-large"){{
@@ -796,6 +768,7 @@ public class Blocks implements ContentList{
size = 2; size = 2;
insulated = true; insulated = true;
absorbLasers = true; absorbLasers = true;
schematicPriority = 10;
}}; }};
thoriumWall = new Wall("thorium-wall"){{ thoriumWall = new Wall("thorium-wall"){{
@@ -1312,7 +1285,7 @@ public class Blocks implements ContentList{
}}; }};
waterExtractor = new SolidPump("water-extractor"){{ waterExtractor = new SolidPump("water-extractor"){{
requirements(Category.production, with(Items.copper, 30, Items.graphite, 30, Items.lead, 30)); requirements(Category.production, with(Items.metaglass, 30, Items.graphite, 30, Items.lead, 30));
result = Liquids.water; result = Liquids.water;
pumpAmount = 0.11f; pumpAmount = 0.11f;
size = 2; size = 2;
@@ -1397,14 +1370,12 @@ public class Blocks implements ContentList{
requirements(Category.effect, with(Items.titanium, 250, Items.thorium, 125)); requirements(Category.effect, with(Items.titanium, 250, Items.thorium, 125));
size = 3; size = 3;
itemCapacity = 1000; itemCapacity = 1000;
flags = EnumSet.of(BlockFlag.storage);
}}; }};
container = new StorageBlock("container"){{ container = new StorageBlock("container"){{
requirements(Category.effect, with(Items.titanium, 100)); requirements(Category.effect, with(Items.titanium, 100));
size = 2; size = 2;
itemCapacity = 300; itemCapacity = 300;
flags = EnumSet.of(BlockFlag.storage);
}}; }};
unloader = new Unloader("unloader"){{ unloader = new Unloader("unloader"){{
@@ -1419,10 +1390,10 @@ public class Blocks implements ContentList{
duo = new ItemTurret("duo"){{ duo = new ItemTurret("duo"){{
requirements(Category.turret, with(Items.copper, 35), true); requirements(Category.turret, with(Items.copper, 35), true);
ammo( ammo(
Items.copper, Bullets.standardCopper, Items.copper, Bullets.standardCopper,
Items.graphite, Bullets.standardDense, Items.graphite, Bullets.standardDense,
Items.pyratite, Bullets.standardIncendiary, Items.pyratite, Bullets.standardIncendiary,
Items.silicon, Bullets.standardHoming Items.silicon, Bullets.standardHoming
); );
spread = 4f; spread = 4f;
@@ -1441,9 +1412,9 @@ public class Blocks implements ContentList{
scatter = new ItemTurret("scatter"){{ scatter = new ItemTurret("scatter"){{
requirements(Category.turret, with(Items.copper, 85, Items.lead, 45)); requirements(Category.turret, with(Items.copper, 85, Items.lead, 45));
ammo( ammo(
Items.scrap, Bullets.flakScrap, Items.scrap, Bullets.flakScrap,
Items.lead, Bullets.flakLead, Items.lead, Bullets.flakLead,
Items.metaglass, Bullets.flakGlass Items.metaglass, Bullets.flakGlass
); );
reloadTime = 18f; reloadTime = 18f;
range = 160f; range = 160f;
@@ -1464,8 +1435,8 @@ public class Blocks implements ContentList{
scorch = new ItemTurret("scorch"){{ scorch = new ItemTurret("scorch"){{
requirements(Category.turret, with(Items.copper, 25, Items.graphite, 22)); requirements(Category.turret, with(Items.copper, 25, Items.graphite, 22));
ammo( ammo(
Items.coal, Bullets.basicFlame, Items.coal, Bullets.basicFlame,
Items.pyratite, Bullets.pyraFlame Items.pyratite, Bullets.pyraFlame
); );
recoilAmount = 0f; recoilAmount = 0f;
reloadTime = 6f; reloadTime = 6f;
@@ -1481,9 +1452,9 @@ public class Blocks implements ContentList{
hail = new ItemTurret("hail"){{ hail = new ItemTurret("hail"){{
requirements(Category.turret, with(Items.copper, 40, Items.graphite, 17)); requirements(Category.turret, with(Items.copper, 40, Items.graphite, 17));
ammo( ammo(
Items.graphite, Bullets.artilleryDense, Items.graphite, Bullets.artilleryDense,
Items.silicon, Bullets.artilleryHoming, Items.silicon, Bullets.artilleryHoming,
Items.pyratite, Bullets.artilleryIncendiary Items.pyratite, Bullets.artilleryIncendiary
); );
targetAir = false; targetAir = false;
reloadTime = 60f; reloadTime = 60f;
@@ -1498,10 +1469,10 @@ public class Blocks implements ContentList{
wave = new LiquidTurret("wave"){{ wave = new LiquidTurret("wave"){{
requirements(Category.turret, with(Items.metaglass, 45, Items.lead, 75)); requirements(Category.turret, with(Items.metaglass, 45, Items.lead, 75));
ammo( ammo(
Liquids.water, Bullets.waterShot, Liquids.water, Bullets.waterShot,
Liquids.slag, Bullets.slagShot, Liquids.slag, Bullets.slagShot,
Liquids.cryofluid, Bullets.cryoShot, Liquids.cryofluid, Bullets.cryoShot,
Liquids.oil, Bullets.oilShot Liquids.oil, Bullets.oilShot
); );
size = 2; size = 2;
recoilAmount = 0f; recoilAmount = 0f;
@@ -1587,9 +1558,9 @@ public class Blocks implements ContentList{
swarmer = new ItemTurret("swarmer"){{ swarmer = new ItemTurret("swarmer"){{
requirements(Category.turret, with(Items.graphite, 35, Items.titanium, 35, Items.plastanium, 45, Items.silicon, 30)); requirements(Category.turret, with(Items.graphite, 35, Items.titanium, 35, Items.plastanium, 45, Items.silicon, 30));
ammo( ammo(
Items.blastCompound, Bullets.missileExplosive, Items.blastCompound, Bullets.missileExplosive,
Items.pyratite, Bullets.missileIncendiary, Items.pyratite, Bullets.missileIncendiary,
Items.surgeAlloy, Bullets.missileSurge Items.surgeAlloy, Bullets.missileSurge
); );
reloadTime = 30f; reloadTime = 30f;
shots = 4; shots = 4;
@@ -1605,11 +1576,11 @@ public class Blocks implements ContentList{
salvo = new ItemTurret("salvo"){{ salvo = new ItemTurret("salvo"){{
requirements(Category.turret, with(Items.copper, 100, Items.graphite, 90, Items.titanium, 60)); requirements(Category.turret, with(Items.copper, 100, Items.graphite, 90, Items.titanium, 60));
ammo( ammo(
Items.copper, Bullets.standardCopper, Items.copper, Bullets.standardCopper,
Items.graphite, Bullets.standardDense, Items.graphite, Bullets.standardDense,
Items.pyratite, Bullets.standardIncendiary, Items.pyratite, Bullets.standardIncendiary,
Items.silicon, Bullets.standardHoming, Items.silicon, Bullets.standardHoming,
Items.thorium, Bullets.standardThorium Items.thorium, Bullets.standardThorium
); );
size = 2; size = 2;
@@ -1631,12 +1602,12 @@ public class Blocks implements ContentList{
requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phaseFabric, 40)); requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phaseFabric, 40));
health = 250 * size * size; health = 250 * size * size;
range = 160f; range = 180f;
hasPower = true; hasPower = true;
consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null); consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null);
size = 2; size = 2;
shootLength = 5f; shootLength = 5f;
bulletDamage = 25f; bulletDamage = 30f;
reloadTime = 9f; reloadTime = 9f;
}}; }};
@@ -1649,7 +1620,6 @@ public class Blocks implements ContentList{
Liquids.oil, Bullets.heavyOilShot Liquids.oil, Bullets.heavyOilShot
); );
size = 3; size = 3;
recoilAmount = 0f;
reloadTime = 2f; reloadTime = 2f;
shots = 2; shots = 2;
velocityInaccuracy = 0.1f; velocityInaccuracy = 0.1f;
@@ -1661,6 +1631,7 @@ public class Blocks implements ContentList{
shootEffect = Fx.shootLiquid; shootEffect = Fx.shootLiquid;
range = 190f; range = 190f;
health = 250 * size * size; health = 250 * size * size;
flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher);
}}; }};
fuse = new ItemTurret("fuse"){{ fuse = new ItemTurret("fuse"){{
@@ -1682,31 +1653,31 @@ public class Blocks implements ContentList{
float brange = range + 10f; float brange = range + 10f;
ammo( ammo(
Items.titanium, new ShrapnelBulletType(){{ Items.titanium, new ShrapnelBulletType(){{
length = brange; length = brange;
damage = 66f; damage = 66f;
ammoMultiplier = 4f; ammoMultiplier = 4f;
width = 17f; width = 17f;
reloadMultiplier = 1.3f; reloadMultiplier = 1.3f;
}}, }},
Items.thorium, new ShrapnelBulletType(){{ Items.thorium, new ShrapnelBulletType(){{
length = brange; length = brange;
damage = 105f; damage = 105f;
ammoMultiplier = 5f; ammoMultiplier = 5f;
toColor = Pal.thoriumPink; toColor = Pal.thoriumPink;
shootEffect = smokeEffect = Fx.thoriumShoot; shootEffect = smokeEffect = Fx.thoriumShoot;
}} }}
); );
}}; }};
ripple = new ItemTurret("ripple"){{ ripple = new ItemTurret("ripple"){{
requirements(Category.turret, with(Items.copper, 150, Items.graphite, 135, Items.titanium, 60)); requirements(Category.turret, with(Items.copper, 150, Items.graphite, 135, Items.titanium, 60));
ammo( ammo(
Items.graphite, Bullets.artilleryDense, Items.graphite, Bullets.artilleryDense,
Items.silicon, Bullets.artilleryHoming, Items.silicon, Bullets.artilleryHoming,
Items.pyratite, Bullets.artilleryIncendiary, Items.pyratite, Bullets.artilleryIncendiary,
Items.blastCompound, Bullets.artilleryExplosive, Items.blastCompound, Bullets.artilleryExplosive,
Items.plastanium, Bullets.artilleryPlastic Items.plastanium, Bullets.artilleryPlastic
); );
targetAir = false; targetAir = false;
@@ -1732,10 +1703,10 @@ public class Blocks implements ContentList{
cyclone = new ItemTurret("cyclone"){{ cyclone = new ItemTurret("cyclone"){{
requirements(Category.turret, with(Items.copper, 200, Items.titanium, 125, Items.plastanium, 80)); requirements(Category.turret, with(Items.copper, 200, Items.titanium, 125, Items.plastanium, 80));
ammo( ammo(
Items.metaglass, Bullets.fragGlass, Items.metaglass, Bullets.fragGlass,
Items.blastCompound, Bullets.fragExplosive, Items.blastCompound, Bullets.fragExplosive,
Items.plastanium, Bullets.fragPlastic, Items.plastanium, Bullets.fragPlastic,
Items.surgeAlloy, Bullets.fragSurge Items.surgeAlloy, Bullets.fragSurge
); );
xRand = 4f; xRand = 4f;
reloadTime = 8f; reloadTime = 8f;
@@ -1755,19 +1726,19 @@ public class Blocks implements ContentList{
requirements(Category.turret, with(Items.copper, 1000, Items.metaglass, 600, Items.surgeAlloy, 300, Items.plastanium, 200, Items.silicon, 600)); requirements(Category.turret, with(Items.copper, 1000, Items.metaglass, 600, Items.surgeAlloy, 300, Items.plastanium, 200, Items.silicon, 600));
ammo( ammo(
Items.surgeAlloy, new PointBulletType(){{ Items.surgeAlloy, new PointBulletType(){{
shootEffect = Fx.instShoot; shootEffect = Fx.instShoot;
hitEffect = Fx.instHit; hitEffect = Fx.instHit;
smokeEffect = Fx.smokeCloud; smokeEffect = Fx.smokeCloud;
trailEffect = Fx.instTrail; trailEffect = Fx.instTrail;
despawnEffect = Fx.instBomb; despawnEffect = Fx.instBomb;
trailSpacing = 20f; trailSpacing = 20f;
damage = 1350; damage = 1350;
buildingDamageMultiplier = 0.3f; buildingDamageMultiplier = 0.3f;
speed = brange; speed = brange;
hitShake = 6f; hitShake = 6f;
ammoMultiplier = 1f; ammoMultiplier = 1f;
}} }}
); );
maxAmmo = 40; maxAmmo = 40;
@@ -1796,9 +1767,9 @@ public class Blocks implements ContentList{
spectre = new ItemTurret("spectre"){{ spectre = new ItemTurret("spectre"){{
requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgeAlloy, 250, Items.plastanium, 175, Items.thorium, 250)); requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgeAlloy, 250, Items.plastanium, 175, Items.thorium, 250));
ammo( ammo(
Items.graphite, Bullets.standardDenseBig, Items.graphite, Bullets.standardDenseBig,
Items.pyratite, Bullets.standardIncendiaryBig, Items.pyratite, Bullets.standardIncendiaryBig,
Items.thorium, Bullets.standardThoriumBig Items.thorium, Bullets.standardThoriumBig
); );
reloadTime = 6f; reloadTime = 6f;
coolantMultiplier = 0.5f; coolantMultiplier = 0.5f;
@@ -2071,6 +2042,7 @@ public class Blocks implements ContentList{
hasPower = true; hasPower = true;
consumes.power(10f); consumes.power(10f);
buildCostMultiplier = 0.5f; buildCostMultiplier = 0.5f;
health = size * size * 80;
}}; }};
//endregion campaign //endregion campaign

View File

@@ -63,7 +63,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 11f; width = height = 11f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 25f; splashDamageRadius = 25f * 0.75f;
splashDamage = 33f; splashDamage = 33f;
}}; }};
@@ -84,7 +84,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 13f; width = height = 13f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 35f; splashDamageRadius = 35f * 0.75f;
splashDamage = 45f; splashDamage = 45f;
fragBullet = artilleryPlasticFrag; fragBullet = artilleryPlasticFrag;
fragBullets = 10; fragBullets = 10;
@@ -98,7 +98,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 11f; width = height = 11f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 25f; splashDamageRadius = 25f * 0.75f;
splashDamage = 33f; splashDamage = 33f;
reloadMultiplier = 1.2f; reloadMultiplier = 1.2f;
ammoMultiplier = 3f; ammoMultiplier = 3f;
@@ -112,7 +112,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 13f; width = height = 13f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 25f; splashDamageRadius = 25f * 0.75f;
splashDamage = 35f; splashDamage = 35f;
status = StatusEffects.burning; status = StatusEffects.burning;
frontColor = Pal.lightishOrange; frontColor = Pal.lightishOrange;
@@ -128,7 +128,7 @@ public class Bullets implements ContentList{
width = height = 14f; width = height = 14f;
collidesTiles = false; collidesTiles = false;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 45f; splashDamageRadius = 45f * 0.75f;
splashDamage = 50f; splashDamage = 50f;
backColor = Pal.missileYellowBack; backColor = Pal.missileYellowBack;
frontColor = Pal.missileYellow; frontColor = Pal.missileYellow;

View File

@@ -26,17 +26,23 @@ public class Fx{
none = new Effect(0, 0f, e -> {}), none = new Effect(0, 0f, e -> {}),
unitSpawn = new Effect(30f, e -> { unitSpawn = new Effect(30f, e -> {
if(!(e.data instanceof UnitType)) return; if(!(e.data instanceof UnitType unit)) return;
alpha(e.fin());
float scl = 1f + e.fout() * 2f; float scl = 1f + e.fout() * 2f;
UnitType unit = e.data();
TextureRegion region = unit.icon(Cicon.full); TextureRegion region = unit.icon(Cicon.full);
alpha(e.fout());
mixcol(Color.white, e.fin());
rect(region, e.x, e.y, 180f);
reset();
alpha(e.fin());
rect(region, e.x, e.y, rect(region, e.x, e.y,
region.width * Draw.scl * scl, region.height * Draw.scl * scl, 180f); region.width * Draw.scl * scl, region.height * Draw.scl * scl, e.rotation - 90);
}), }),
@@ -718,6 +724,19 @@ public class Fx{
Lines.circle(e.x, e.y, 5f * e.fout()); Lines.circle(e.x, e.y, 5f * e.fout());
}), }),
forceShrink = new Effect(20, e -> {
color(e.color, e.fout());
if(renderer.animateShields){
Fill.poly(e.x, e.y, 6, e.rotation * e.fout());
}else{
stroke(1.5f);
Draw.alpha(0.09f);
Fill.poly(e.x, e.y, 6, e.rotation * e.fout());
Draw.alpha(1f);
Lines.poly(e.x, e.y, 6, e.rotation * e.fout());
}
}).layer(Layer.shields),
flakExplosionBig = new Effect(30, e -> { flakExplosionBig = new Effect(30, e -> {
color(Pal.bulletYellowBack); color(Pal.bulletYellowBack);
@@ -1590,6 +1609,12 @@ public class Fx{
Fill.square(e.x, e.y, e.rotation * tilesize / 2f); Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
}), }),
lightBlock = new Effect(60, e -> {
color(e.color);
alpha(e.fout() * 1);
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
}),
overdriveBlockFull = new Effect(60, e -> { overdriveBlockFull = new Effect(60, e -> {
color(e.color); color(e.color);
alpha(e.fslope() * 0.4f); alpha(e.fslope() * 0.4f);

View File

@@ -74,6 +74,7 @@ public class Items implements ContentList{
surgeAlloy = new Item("surge-alloy", Color.valueOf("f3e979")){{ surgeAlloy = new Item("surge-alloy", Color.valueOf("f3e979")){{
cost = 1.2f; cost = 1.2f;
charge = 0.75f;
}}; }};
sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{ sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{

View File

@@ -12,7 +12,7 @@ import mindustry.graphics.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class StatusEffects implements ContentList{ public class StatusEffects implements ContentList{
public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed, disarmed;
@Override @Override
public void load(){ public void load(){
@@ -21,7 +21,7 @@ public class StatusEffects implements ContentList{
burning = new StatusEffect("burning"){{ burning = new StatusEffect("burning"){{
color = Pal.lightFlame; color = Pal.lightFlame;
damage = 0.12f; //over 8 seconds, this would be 60 damage damage = 0.12f; //over 8 seconds, this would be ~60 damage
effect = Fx.burning; effect = Fx.burning;
init(() -> { init(() -> {
@@ -29,7 +29,7 @@ public class StatusEffects implements ContentList{
trans(tarred, ((unit, time, newTime, result) -> { trans(tarred, ((unit, time, newTime, result) -> {
unit.damagePierce(8f); unit.damagePierce(8f);
Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f));
result.set(this, Math.min(time + newTime, 300f)); result.set(burning, Math.min(time + newTime, 300f));
})); }));
}); });
}}; }};
@@ -45,7 +45,7 @@ public class StatusEffects implements ContentList{
trans(blasted, ((unit, time, newTime, result) -> { trans(blasted, ((unit, time, newTime, result) -> {
unit.damagePierce(18f); unit.damagePierce(18f);
result.set(this, time); result.set(freezing, time);
})); }));
}); });
}}; }};
@@ -72,7 +72,7 @@ public class StatusEffects implements ContentList{
if(unit.team == state.rules.waveTeam){ if(unit.team == state.rules.waveTeam){
Events.fire(Trigger.shock); Events.fire(Trigger.shock);
} }
result.set(this, time); result.set(wet, time);
})); }));
opposite(burning); opposite(burning);
}); });
@@ -97,7 +97,7 @@ public class StatusEffects implements ContentList{
trans(tarred, ((unit, time, newTime, result) -> { trans(tarred, ((unit, time, newTime, result) -> {
unit.damagePierce(8f); unit.damagePierce(8f);
Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f));
result.set(this, Math.min(time + newTime, 200f)); result.set(melting, Math.min(time + newTime, 200f));
})); }));
}); });
}}; }};
@@ -161,15 +161,22 @@ public class StatusEffects implements ContentList{
shocked = new StatusEffect("shocked"){{ shocked = new StatusEffect("shocked"){{
color = Pal.lancerLaser; color = Pal.lancerLaser;
reactive = true;
}}; }};
blasted = new StatusEffect("blasted"){{ blasted = new StatusEffect("blasted"){{
color = Color.valueOf("ff795e"); color = Color.valueOf("ff795e");
reactive = true;
}}; }};
corroded = new StatusEffect("corroded"){{ corroded = new StatusEffect("corroded"){{
color = Pal.plastanium; color = Pal.plastanium;
damage = 0.1f; damage = 0.1f;
}}; }};
disarmed = new StatusEffect("disarmed"){{
color = Color.valueOf("e9ead3");
disarm = true;
}};
} }
} }

View File

@@ -117,7 +117,7 @@ public class UnitTypes implements ContentList{
hitSize = 13f; hitSize = 13f;
rotateSpeed = 3f; rotateSpeed = 3f;
targetAir = false; targetAir = false;
health = 790; health = 800;
armor = 9f; armor = 9f;
mechFrontSway = 0.55f; mechFrontSway = 0.55f;
@@ -137,8 +137,8 @@ public class UnitTypes implements ContentList{
width = height = 14f; width = height = 14f;
collides = true; collides = true;
collidesTiles = true; collidesTiles = true;
splashDamageRadius = 24f; splashDamageRadius = 28f;
splashDamage = 45f; splashDamage = 54f;
backColor = Pal.bulletYellowBack; backColor = Pal.bulletYellowBack;
frontColor = Pal.bulletYellow; frontColor = Pal.bulletYellow;
}}; }};
@@ -150,7 +150,7 @@ public class UnitTypes implements ContentList{
hitSize = 20f; hitSize = 20f;
rotateSpeed = 2.1f; rotateSpeed = 2.1f;
health = 9000; health = 9000;
armor = 11f; armor = 10f;
canDrown = false; canDrown = false;
mechFrontSway = 1f; mechFrontSway = 1f;
@@ -173,7 +173,7 @@ public class UnitTypes implements ContentList{
inaccuracy = 3f; inaccuracy = 3f;
shotDelay = 4f; shotDelay = 4f;
bullet = new BasicBulletType(7f, 50){{ bullet = new BasicBulletType(7f, 45){{
width = 11f; width = 11f;
height = 20f; height = 20f;
lifetime = 25f; lifetime = 25f;
@@ -182,7 +182,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 = 20; lightningDamage = 19;
}}; }};
}}, }},
@@ -230,7 +230,7 @@ public class UnitTypes implements ContentList{
ejectEffect = Fx.casing4; ejectEffect = Fx.casing4;
shootSound = Sounds.bang; shootSound = Sounds.bang;
bullet = new BasicBulletType(13f, 60){{ bullet = new BasicBulletType(13f, 65){{
pierce = true; pierce = true;
pierceCap = 10; pierceCap = 10;
width = 14f; width = 14f;
@@ -240,14 +240,14 @@ public class UnitTypes implements ContentList{
fragVelocityMin = 0.4f; fragVelocityMin = 0.4f;
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;
splashDamage = 18f; splashDamage = 16f;
splashDamageRadius = 30f; splashDamageRadius = 13f;
fragBullets = 2; fragBullets = 2;
fragLifeMin = 0f; fragLifeMin = 0f;
fragCone = 30f; fragCone = 30f;
fragBullet = new BasicBulletType(9f, 15){{ fragBullet = new BasicBulletType(9f, 18){{
width = 10f; width = 10f;
height = 10f; height = 10f;
pierce = true; pierce = true;
@@ -257,7 +257,7 @@ public class UnitTypes implements ContentList{
lifetime = 20f; lifetime = 20f;
hitEffect = Fx.flakExplosion; hitEffect = Fx.flakExplosion;
splashDamage = 15f; splashDamage = 15f;
splashDamageRadius = 15f; splashDamageRadius = 10f;
}}; }};
}}; }};
}} }}
@@ -322,9 +322,8 @@ public class UnitTypes implements ContentList{
x = 5f; x = 5f;
shake = 2.2f; shake = 2.2f;
y = 0.5f; y = 0.5f;
shootY = 5f;
shootY = 2.5f; shootY = 2.5f;
reload = 38f; reload = 38f;
shots = 3; shots = 3;
inaccuracy = 35; inaccuracy = 35;
@@ -359,7 +358,6 @@ public class UnitTypes implements ContentList{
quasar = new UnitType("quasar"){{ quasar = new UnitType("quasar"){{
mineTier = 3; mineTier = 3;
hitSize = 12f;
boostMultiplier = 2f; boostMultiplier = 2f;
health = 650f; health = 650f;
buildSpeed = 1.7f; buildSpeed = 1.7f;
@@ -407,19 +405,20 @@ public class UnitTypes implements ContentList{
rotateSpeed = 1.6f; rotateSpeed = 1.6f;
canDrown = false; canDrown = false;
mechFrontSway = 1f; mechFrontSway = 1f;
buildSpeed = 3f;
mechStepParticles = true; mechStepParticles = true;
mechStepShake = 0.15f; mechStepShake = 0.15f;
ammoType = AmmoTypes.powerHigh; ammoType = AmmoTypes.powerHigh;
speed = 0.35f; speed = 0.38f;
boostMultiplier = 2.1f; boostMultiplier = 2.2f;
engineOffset = 12f; engineOffset = 12f;
engineSize = 6f; engineSize = 6f;
lowAltitude = true; lowAltitude = true;
health = 7000f; health = 7500f;
armor = 7f; armor = 9f;
canBoost = true; canBoost = true;
landShake = 4f; landShake = 4f;
immunities = ObjectSet.with(StatusEffects.burning); immunities = ObjectSet.with(StatusEffects.burning);
@@ -435,7 +434,7 @@ public class UnitTypes implements ContentList{
firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f; firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f;
reload = 160f; reload = 155f;
recoil = 0f; recoil = 0f;
chargeSound = Sounds.lasercharge2; chargeSound = Sounds.lasercharge2;
shootSound = Sounds.beam; shootSound = Sounds.beam;
@@ -443,8 +442,8 @@ public class UnitTypes implements ContentList{
cooldownTime = 200f; cooldownTime = 200f;
bullet = new ContinuousLaserBulletType(){{ bullet = new ContinuousLaserBulletType(){{
damage = 23f; damage = 28f;
length = 160f; length = 175f;
hitEffect = Fx.hitMeltHeal; hitEffect = Fx.hitMeltHeal;
drawSize = 420f; drawSize = 420f;
lifetime = 160f; lifetime = 160f;
@@ -454,7 +453,7 @@ public class UnitTypes implements ContentList{
shootEffect = Fx.greenLaserChargeSmall; shootEffect = Fx.greenLaserChargeSmall;
incendChance = 0.075f; incendChance = 0.09f;
incendSpread = 5f; incendSpread = 5f;
incendAmount = 1; incendAmount = 1;
@@ -471,7 +470,6 @@ public class UnitTypes implements ContentList{
}}; }};
corvus = new UnitType("corvus"){{ corvus = new UnitType("corvus"){{
mineTier = 1;
hitSize = 29f; hitSize = 29f;
health = 18000f; health = 18000f;
armor = 9f; armor = 9f;
@@ -565,9 +563,9 @@ public class UnitTypes implements ContentList{
hitEffect = Fx.pulverize; hitEffect = Fx.pulverize;
lifetime = 10f; lifetime = 10f;
speed = 1f; speed = 1f;
splashDamageRadius = 70f; splashDamageRadius = 58f;
instantDisappear = true; instantDisappear = true;
splashDamage = 80f; splashDamage = 85f;
killShooter = true; killShooter = true;
hittable = false; hittable = false;
collidesAir = true; collidesAir = true;
@@ -769,7 +767,7 @@ public class UnitTypes implements ContentList{
width = height = 19f; width = height = 19f;
collidesTiles = true; collidesTiles = true;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 95f; splashDamageRadius = 70f;
splashDamage = 65f; splashDamage = 65f;
backColor = Pal.sapBulletBack; backColor = Pal.sapBulletBack;
frontColor = lightningColor = Pal.sapBullet; frontColor = lightningColor = Pal.sapBullet;
@@ -867,7 +865,7 @@ public class UnitTypes implements ContentList{
width = height = 25f; width = height = 25f;
collidesTiles = collides = true; collidesTiles = collides = true;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 90f; splashDamageRadius = 80f;
splashDamage = 75f; splashDamage = 75f;
backColor = Pal.sapBulletBack; backColor = Pal.sapBulletBack;
frontColor = lightningColor = Pal.sapBullet; frontColor = lightningColor = Pal.sapBullet;
@@ -888,7 +886,7 @@ public class UnitTypes implements ContentList{
lifetime = 90f; lifetime = 90f;
width = height = 20f; width = height = 20f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 80f; splashDamageRadius = 70f;
splashDamage = 40f; splashDamage = 40f;
backColor = Pal.sapBulletBack; backColor = Pal.sapBulletBack;
frontColor = lightningColor = Pal.sapBullet; frontColor = lightningColor = Pal.sapBullet;
@@ -1366,13 +1364,15 @@ public class UnitTypes implements ContentList{
collides = false; collides = false;
healPercent = 15f; healPercent = 15f;
splashDamage = 230f; splashDamage = 220f;
splashDamageRadius = 120f; splashDamageRadius = 80f;
}}; }};
}}); }});
}}; }};
oct = new UnitType("oct"){{ oct = new UnitType("oct"){{
defaultController = DefenderAI::new;
armor = 16f; armor = 16f;
health = 24000; health = 24000;
speed = 0.8f; speed = 0.8f;
@@ -1537,7 +1537,7 @@ public class UnitTypes implements ContentList{
width = 15f; width = 15f;
collidesTiles = false; collidesTiles = false;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 60f; splashDamageRadius = 40f;
splashDamage = 80f; splashDamage = 80f;
backColor = Pal.missileYellowBack; backColor = Pal.missileYellowBack;
frontColor = Pal.missileYellow; frontColor = Pal.missileYellow;
@@ -1590,7 +1590,7 @@ public class UnitTypes implements ContentList{
}}; }};
sei = new UnitType("sei"){{ sei = new UnitType("sei"){{
health = 10000; health = 10500;
armor = 12f; armor = 12f;
speed = 0.73f; speed = 0.73f;

View File

@@ -59,6 +59,15 @@ public class Control implements ApplicationListener, Loadable{
saves = new Saves(); saves = new Saves();
sound = new SoundControl(); sound = new SoundControl();
//show dialog saying that mod loading was skipped.
Events.on(ClientLoadEvent.class, e -> {
if(Vars.mods.skipModLoading() && Vars.mods.list().any()){
Time.runTask(4f, () -> {
ui.showInfo("@mods.initfailed");
});
}
});
Events.on(StateChangeEvent.class, event -> { Events.on(StateChangeEvent.class, event -> {
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){ if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
Time.runTask(5f, platform::updateRPC); Time.runTask(5f, platform::updateRPC);

View File

@@ -200,7 +200,7 @@ public class Logic implements ApplicationListener{
} }
public void skipWave(){ public void skipWave(){
state.wavetime = 0; runWave();
} }
public void runWave(){ public void runWave(){

View File

@@ -26,6 +26,7 @@ import mindustry.world.*;
import mindustry.world.modules.*; import mindustry.world.modules.*;
import java.io.*; import java.io.*;
import java.util.*;
import java.util.zip.*; import java.util.zip.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -65,6 +66,13 @@ public class NetClient implements ApplicationListener{
reset(); reset();
//connection after reset
if(!net.client()){
Log.info("Connection canceled.");
disconnectQuietly();
return;
}
ui.loadfrag.hide(); ui.loadfrag.hide();
ui.loadfrag.show("@connecting.data"); ui.loadfrag.show("@connecting.data");
@@ -73,8 +81,14 @@ public class NetClient implements ApplicationListener{
disconnectQuietly(); disconnectQuietly();
}); });
ConnectPacket c = new ConnectPacket(); String locale = Core.settings.getString("locale");
if(locale.equals("default")){
locale = Locale.getDefault().toString();
}
var c = new ConnectPacket();
c.name = player.name; c.name = player.name;
c.locale = locale;
c.mods = mods.getModStrings(); c.mods = mods.getModStrings();
c.mobile = mobile; c.mobile = mobile;
c.versionType = Version.type; c.versionType = Version.type;
@@ -174,6 +188,10 @@ public class NetClient implements ApplicationListener{
//called when a server receives a chat message from a player //called when a server receives a chat message from a player
@Remote(called = Loc.server, targets = Loc.client) @Remote(called = Loc.server, targets = Loc.client)
public static void sendChatMessage(Player player, String message){ public static void sendChatMessage(Player player, String message){
//do not receive chat messages from clients that are too young or not registered
if(Time.timeSinceMillis(player.con.connectTime) < 500 || !player.con.hasConnected || !player.isAdded()) return;
if(message.length() > maxTextLength){ if(message.length() > maxTextLength){
throw new ValidateException(player, "Player has sent a message above the text limit."); throw new ValidateException(player, "Player has sent a message above the text limit.");
} }
@@ -184,7 +202,7 @@ public class NetClient implements ApplicationListener{
CommandResponse response = netServer.clientCommands.handleMessage(message, player); CommandResponse response = netServer.clientCommands.handleMessage(message, player);
if(response.type == ResponseType.noCommand){ //no command to handle if(response.type == ResponseType.noCommand){ //no command to handle
message = netServer.admins.filterMessage(player, message); message = netServer.admins.filterMessage(player, message);
//supress chat message if it's filtered out //suppress chat message if it's filtered out
if(message == null){ if(message == null){
return; return;
} }
@@ -396,7 +414,6 @@ public class NetClient implements ApplicationListener{
netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen)); netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen));
DataInputStream input = netClient.dataStream; DataInputStream input = netClient.dataStream;
//go through each entity
for(int j = 0; j < amount; j++){ for(int j = 0; j < amount; j++){
int id = input.readInt(); int id = input.readInt();
byte typeID = input.readByte(); byte typeID = input.readByte();
@@ -445,11 +462,16 @@ public class NetClient implements ApplicationListener{
for(int i = 0; i < amount; i++){ for(int i = 0; i < amount; i++){
int pos = input.readInt(); int pos = input.readInt();
short block = input.readShort();
Tile tile = world.tile(pos); Tile tile = world.tile(pos);
if(tile == null || tile.build == null){ if(tile == null || tile.build == null){
Log.warn("Missing entity at @. Skipping block snapshot.", tile); Log.warn("Missing entity at @. Skipping block snapshot.", tile);
break; break;
} }
if(tile.build.block.id != block){
Log.warn("Block ID mismatch at @: @ != @. Skipping block snapshot.", tile, tile.build.block.id, block);
break;
}
tile.build.readAll(Reads.get(input), tile.build.version()); tile.build.readAll(Reads.get(input), tile.build.version());
} }
}catch(Exception e){ }catch(Exception e){
@@ -476,7 +498,7 @@ public class NetClient implements ApplicationListener{
netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen)); netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen));
DataInputStream input = netClient.dataStream; DataInputStream input = netClient.dataStream;
byte cores = input.readByte(); int cores = input.readInt();
for(int i = 0; i < cores; i++){ for(int i = 0; i < cores; i++){
int pos = input.readInt(); int pos = input.readInt();
Tile tile = world.tile(pos); Tile tile = world.tile(pos);
@@ -615,7 +637,7 @@ public class NetClient implements ApplicationListener{
lastSent++, lastSent++,
uid, uid,
player.dead(), player.dead(),
unit.x, unit.y, player.dead() ? player.x : unit.x, player.dead() ? player.y : unit.y,
player.unit().aimX(), player.unit().aimY(), player.unit().aimX(), player.unit().aimY(),
unit.rotation, unit.rotation,
unit instanceof Mechc m ? m.baseRotation() : 0, unit instanceof Mechc m ? m.baseRotation() : 0,

View File

@@ -81,6 +81,8 @@ public class NetServer implements ApplicationListener{
public NetServer(){ public NetServer(){
net.handleServer(Connect.class, (con, connect) -> { net.handleServer(Connect.class, (con, connect) -> {
Events.fire(new ConnectionEvent(con));
if(admins.isIPBanned(connect.addressTCP) || admins.isSubnetBanned(connect.addressTCP)){ if(admins.isIPBanned(connect.addressTCP) || admins.isSubnetBanned(connect.addressTCP)){
con.kick(KickReason.banned); con.kick(KickReason.banned);
} }
@@ -93,10 +95,14 @@ public class NetServer implements ApplicationListener{
}); });
net.handleServer(ConnectPacket.class, (con, packet) -> { net.handleServer(ConnectPacket.class, (con, packet) -> {
if(con.kicked) return;
if(con.address.startsWith("steam:")){ if(con.address.startsWith("steam:")){
packet.uuid = con.address.substring("steam:".length()); packet.uuid = con.address.substring("steam:".length());
} }
con.connectTime = Time.millis();
String uuid = packet.uuid; String uuid = packet.uuid;
byte[] buuid = Base64Coder.decode(uuid); byte[] buuid = Base64Coder.decode(uuid);
CRC32 crc = new CRC32(); CRC32 crc = new CRC32();
@@ -155,7 +161,7 @@ public class NetServer implements ApplicationListener{
if(!extraMods.isEmpty()){ if(!extraMods.isEmpty()){
result.append("Unnecessary mods:[lightgray]\n").append("> ").append(extraMods.toString("\n> ")); result.append("Unnecessary mods:[lightgray]\n").append("> ").append(extraMods.toString("\n> "));
} }
con.kick(result.toString()); con.kick(result.toString(), 0);
} }
if(!admins.isWhitelisted(packet.uuid, packet.usid)){ if(!admins.isWhitelisted(packet.uuid, packet.usid)){
@@ -195,6 +201,10 @@ public class NetServer implements ApplicationListener{
return; return;
} }
if(packet.locale == null){
packet.locale = "en";
}
String ip = con.address; String ip = con.address;
admins.updatePlayerJoined(uuid, ip, packet.name); admins.updatePlayerJoined(uuid, ip, packet.name);
@@ -215,6 +225,7 @@ public class NetServer implements ApplicationListener{
player.con.uuid = uuid; player.con.uuid = uuid;
player.con.mobile = packet.mobile; player.con.mobile = packet.mobile;
player.name = packet.name; player.name = packet.name;
player.locale = packet.locale;
player.color.set(packet.color).a(1f); player.color.set(packet.color).a(1f);
//save admin ID but don't overwrite it //save admin ID but don't overwrite it
@@ -244,7 +255,8 @@ public class NetServer implements ApplicationListener{
}); });
net.handleServer(InvokePacket.class, (con, packet) -> { net.handleServer(InvokePacket.class, (con, packet) -> {
if(con.player == null) return; if(con.player == null || con.kicked) return;
try{ try{
RemoteReadServer.readPacket(packet.reader(), packet.type, con.player); RemoteReadServer.readPacket(packet.reader(), packet.type, con.player);
}catch(ValidateException e){ }catch(ValidateException e){
@@ -720,6 +732,7 @@ public class NetServer implements ApplicationListener{
//no verification is done, so admins can hypothetically spam waves //no verification is done, so admins can hypothetically spam waves
//not a real issue, because server owners may want to do just that //not a real issue, because server owners may want to do just that
logic.skipWave(); logic.skipWave();
info("&lc@ has skipped the wave.", player.name);
}else if(action == AdminAction.ban){ }else if(action == AdminAction.ban){
netServer.admins.banPlayerIP(other.con.address); netServer.admins.banPlayerIP(other.con.address);
netServer.admins.banPlayerID(other.con.uuid); netServer.admins.banPlayerID(other.con.uuid);
@@ -729,7 +742,8 @@ public class NetServer implements ApplicationListener{
other.kick(KickReason.kick); other.kick(KickReason.kick);
info("&lc@ has kicked @.", player.name, other.name); info("&lc@ has kicked @.", player.name, other.name);
}else if(action == AdminAction.trace){ }else if(action == AdminAction.trace){
TraceInfo info = new TraceInfo(other.con.address, other.uuid(), other.con.modclient, other.con.mobile); PlayerInfo stats = netServer.admins.getInfo(other.uuid());
TraceInfo info = new TraceInfo(other.con.address, other.uuid(), other.con.modclient, other.con.mobile, stats.timesJoined, stats.timesKicked);
if(player.con != null){ if(player.con != null){
Call.traceInfo(player.con, other, info); Call.traceInfo(player.con, other, info);
}else{ }else{
@@ -741,6 +755,8 @@ public class NetServer implements ApplicationListener{
@Remote(targets = Loc.client) @Remote(targets = Loc.client)
public static void connectConfirm(Player player){ public static void connectConfirm(Player player){
if(player.con.kicked) return;
player.add(); player.add();
if(player.con == null || player.con.hasConnected) return; if(player.con == null || player.con.hasConnected) return;
@@ -824,6 +840,7 @@ public class NetServer implements ApplicationListener{
sent ++; sent ++;
dataStream.writeInt(entity.pos()); dataStream.writeInt(entity.pos());
dataStream.writeShort(entity.block.id);
entity.writeAll(Writes.get(dataStream)); entity.writeAll(Writes.get(dataStream));
if(syncStream.size() > maxSnapshotSize){ if(syncStream.size() > maxSnapshotSize){
@@ -844,13 +861,15 @@ public class NetServer implements ApplicationListener{
public void writeEntitySnapshot(Player player) throws IOException{ public void writeEntitySnapshot(Player player) throws IOException{
syncStream.reset(); syncStream.reset();
Seq<CoreBuild> cores = state.teams.cores(player.team()); int sum = state.teams.present.sum(t -> t.cores.size);
dataStream.writeByte(cores.size); dataStream.writeInt(sum);
for(CoreBuild entity : cores){ for(TeamData data : state.teams.present){
dataStream.writeInt(entity.tile.pos()); for(CoreBuild entity : data.cores){
entity.items.write(Writes.get(dataStream)); dataStream.writeInt(entity.tile.pos());
entity.items.write(Writes.get(dataStream));
}
} }
dataStream.close(); dataStream.close();

View File

@@ -20,10 +20,9 @@ import static mindustry.Vars.*;
public interface Platform{ public interface Platform{
/** Dynamically loads a jar file. */ /** Dynamically creates a class loader for a jar file. */
default Class<?> loadJar(Fi jar, String mainClass) throws Exception{ default ClassLoader loadJar(Fi jar, String mainClass) throws Exception{
URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, getClass().getClassLoader()); return new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, getClass().getClassLoader());
return Class.forName(mainClass, true, classLoader);
} }
/** Steam: Update lobby visibility.*/ /** Steam: Update lobby visibility.*/

View File

@@ -2,7 +2,6 @@ package mindustry.core;
import arc.*; import arc.*;
import arc.files.*; import arc.files.*;
import arc.fx.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.graphics.gl.*; import arc.graphics.gl.*;
@@ -38,13 +37,8 @@ public class Renderer implements ApplicationListener{
public float minZoom = 1.5f, maxZoom = 6f; public float minZoom = 1.5f, maxZoom = 6f;
private @Nullable CoreBuild landCore; private @Nullable CoreBuild landCore;
//TODO unused
private FxProcessor fx = new FxProcessor();
private Color clearColor = new Color(0f, 0f, 0f, 1f); private Color clearColor = new Color(0f, 0f, 0f, 1f);
private float targetscale = Scl.scl(4); private float targetscale = Scl.scl(4), camerascale = targetscale, landscale, landTime, weatherAlpha, minZoomScl = Scl.scl(0.01f);
private float camerascale = targetscale;
private float landscale = 0f, landTime, weatherAlpha;
private float minZoomScl = Scl.scl(0.01f);
private float shakeIntensity, shaketime; private float shakeIntensity, shaketime;
public Renderer(){ public Renderer(){
@@ -73,7 +67,6 @@ public class Renderer implements ApplicationListener{
@Override @Override
public void update(){ public void update(){
Color.white.set(1f, 1f, 1f, 1f); Color.white.set(1f, 1f, 1f, 1f);
Gl.clear(Gl.stencilBufferBit);
float dest = Mathf.round(targetscale, 0.5f); float dest = Mathf.round(targetscale, 0.5f);
camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f);
@@ -136,11 +129,6 @@ public class Renderer implements ApplicationListener{
Events.fire(new DisposeEvent()); Events.fire(new DisposeEvent());
} }
@Override
public void resize(int width, int height){
fx.resize(width, height);
}
@Override @Override
public void resume(){ public void resume(){
if(settings.getBool("bloom") && bloom != null){ if(settings.getBool("bloom") && bloom != null){
@@ -175,23 +163,6 @@ public class Renderer implements ApplicationListener{
} }
} }
void beginFx(){
if(!fx.hasEnabledEffects()) return;
Draw.flush();
fx.clear();
fx.begin();
}
void endFx(){
if(!fx.hasEnabledEffects()) return;
Draw.flush();
fx.end();
fx.applyEffects();
fx.render(0, 0, fx.getWidth(), fx.getHeight());
}
void updateShake(float scale){ void updateShake(float scale){
if(shaketime > 0){ if(shaketime > 0){
float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * scale; float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * scale;
@@ -236,7 +207,7 @@ public class Renderer implements ApplicationListener{
Draw.draw(Layer.background, this::drawBackground); Draw.draw(Layer.background, this::drawBackground);
Draw.draw(Layer.floor, blocks.floor::drawFloor); Draw.draw(Layer.floor, blocks.floor::drawFloor);
Draw.draw(Layer.block - 1, blocks::drawShadows); Draw.draw(Layer.block - 1, blocks::drawShadows);
Draw.draw(Layer.block, () -> { Draw.draw(Layer.block - 0.09f, () -> {
blocks.floor.beginDraw(); blocks.floor.beginDraw();
blocks.floor.drawLayer(CacheLayer.walls); blocks.floor.drawLayer(CacheLayer.walls);
blocks.floor.endDraw(); blocks.floor.endDraw();

View File

@@ -108,7 +108,7 @@ public class UI implements ApplicationListener, Loadable{
Dialog.setHideAction(() -> sequence(fadeOut(0.1f))); Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
Tooltips.getInstance().animations = false; Tooltips.getInstance().animations = false;
Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black5).margin(4f).add(text)); Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black6).margin(4f).add(text));
Core.settings.setErrorHandler(e -> { Core.settings.setErrorHandler(e -> {
Log.err(e); Log.err(e);
@@ -214,6 +214,13 @@ public class UI implements ApplicationListener, Loadable{
@Override @Override
public void resize(int width, int height){ public void resize(int width, int height){
if(Core.scene == null) return; if(Core.scene == null) return;
int[] insets = Core.graphics.getSafeInsets();
Core.scene.marginLeft = insets[0];
Core.scene.marginRight = insets[1];
Core.scene.marginTop = insets[2];
Core.scene.marginBottom = insets[3];
Core.scene.resize(width, height); Core.scene.resize(width, height);
Events.fire(new ResizeEvent()); Events.fire(new ResizeEvent());
} }
@@ -363,6 +370,16 @@ public class UI implements ApplicationListener, Loadable{
}}.show(); }}.show();
} }
public void showInfoOnHidden(String info, Runnable listener){
new Dialog(""){{
getCell(cont).growX();
cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center);
buttons.button("@ok", this::hide).size(110, 50).pad(4);
hidden(listener);
closeOnBack();
}}.show();
}
public void showStartupInfo(String info){ public void showStartupInfo(String info){
new Dialog(""){{ new Dialog(""){{
getCell(cont).growX(); getCell(cont).growX();

View File

@@ -4,6 +4,7 @@ import arc.*;
import arc.func.*; import arc.func.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.math.geom.Geometry.*;
import arc.struct.*; import arc.struct.*;
import arc.struct.ObjectIntMap.*; import arc.struct.ObjectIntMap.*;
import arc.util.*; import arc.util.*;
@@ -554,10 +555,6 @@ public class World{
return dark; return dark;
} }
public interface Raycaster{
boolean accept(int x, int y);
}
private class Context implements WorldContext{ private class Context implements WorldContext{
Context(){ Context(){

View File

@@ -8,6 +8,7 @@ import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.editor.DrawOperation.*; import mindustry.editor.DrawOperation.*;
import mindustry.entities.units.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.io.*; import mindustry.io.*;
@@ -259,7 +260,7 @@ public class MapEditor{
clearOp(); clearOp();
Tiles previous = world.tiles; Tiles previous = world.tiles;
int offsetX = -(width - width()) / 2, offsetY = -(height - height()) / 2; int offsetX = (width() - width) / 2, offsetY = (height() - height) / 2;
loading = true; loading = true;
Tiles tiles = world.resize(width, height); Tiles tiles = world.resize(width, height);
@@ -275,7 +276,17 @@ public class MapEditor{
if(tile.build != null && tile.isCenter()){ if(tile.build != null && tile.isCenter()){
tile.build.x = x * tilesize + tile.block().offset; tile.build.x = x * tilesize + tile.block().offset;
tile.build.y = y * tilesize + tile.block().offset; tile.build.y = y * tilesize + tile.block().offset;
//shift links to account for map resize
Object config = tile.build.config();
if(config != null){
Object out = BuildPlan.pointConfig(tile.block(), config, p -> p.sub(offsetX, offsetY));
if(out != config){
tile.build.configureAny(out);
}
}
} }
}else{ }else{
tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0)); tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0));
} }

View File

@@ -156,7 +156,10 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
platform.publish(map); platform.publish(map);
}).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.tags.containsKey("steamid") ? editor.tags.get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); }).padTop(-3).size(swidth * 2f + 10, 60f).update(b ->
b.setText(editor.tags.containsKey("steamid") ?
editor.tags.get("author", "").equals(steamPlayerName) ? "@workshop.listing" : "@view.workshop" :
"@editor.publish.workshop"));
menu.cont.row(); menu.cont.row();
} }
@@ -263,7 +266,9 @@ public class MapEditorDialog extends Dialog implements Disposable{
if(player.team().core() == null){ if(player.team().core() == null){
player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); player.set(world.width() * tilesize/2f, world.height() * tilesize/2f);
player.unit(UnitTypes.alpha.spawn(player.team(), player.x, player.y)); var unit = UnitTypes.alpha.spawn(player.team(), player.x, player.y);
unit.spawnedByCore = true;
player.unit(unit);
} }
}); });
} }

View File

@@ -285,29 +285,31 @@ public class MapGenerateDialog extends BaseDialog{
void showAdd(){ void showAdd(){
BaseDialog selection = new BaseDialog("@add"); BaseDialog selection = new BaseDialog("@add");
selection.setFillParent(false); selection.cont.pane(p -> {
selection.cont.defaults().size(210f, 60f); p.marginRight(14);
int i = 0; p.defaults().size(210f, 60f);
for(Prov<GenerateFilter> gen : filterTypes){ int i = 0;
GenerateFilter filter = gen.get(); for(Prov<GenerateFilter> gen : filterTypes){
GenerateFilter filter = gen.get();
if((filter.isPost() && applied)) continue; if((filter.isPost() && applied)) continue;
selection.cont.button(filter.name(), () -> { p.button(filter.name(), () -> {
filters.add(filter); filters.add(filter);
rebuildFilters();
update();
selection.hide();
});
if(++i % 2 == 0) p.row();
}
p.button("@filter.defaultores", () -> {
maps.addDefaultOres(filters);
rebuildFilters(); rebuildFilters();
update(); update();
selection.hide(); selection.hide();
}); });
if(++i % 2 == 0) selection.cont.row(); }).get().setScrollingDisabled(true, false);
}
selection.cont.button("@filter.defaultores", () -> {
maps.addDefaultOres(filters);
rebuildFilters();
update();
selection.hide();
});
selection.addCloseButton(); selection.addCloseButton();
selection.show(); selection.show();

View File

@@ -6,7 +6,6 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
@@ -25,11 +24,10 @@ public class Damage{
private static Rect hitrect = new Rect(); private static Rect hitrect = new Rect();
private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2(); private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2();
private static Seq<Unit> units = new Seq<>(); private static Seq<Unit> units = new Seq<>();
private static GridBits bits = new GridBits(30, 30);
private static IntQueue propagation = new IntQueue();
private static IntSet collidedBlocks = new IntSet(); private static IntSet collidedBlocks = new IntSet();
private static Building tmpBuilding; private static Building tmpBuilding;
private static Unit tmpUnit; private static Unit tmpUnit;
private static IntFloatMap damages = new IntFloatMap();
/** Creates a dynamic explosion based on specified parameters. */ /** Creates a dynamic explosion based on specified parameters. */
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){
@@ -39,9 +37,9 @@ public class Damage{
/** Creates a dynamic explosion based on specified parameters. */ /** Creates a dynamic explosion based on specified parameters. */
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam){ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam){
if(damage){ if(damage){
for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){ for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){
int branches = 5 + Mathf.clamp((int)(power / 30), 1, 20); int length = 5 + Mathf.clamp((int)(power / 500), 1, 20);
Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2))); Time.run(i * 0.8f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), length + Mathf.range(2)));
} }
if(fire){ if(fire){
@@ -116,7 +114,15 @@ public class Damage{
* Only enemies of the specified team are damaged. * Only enemies of the specified team are damaged.
*/ */
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){
length = findLaserLength(hitter, length); collideLine(hitter, team, effect, x, y, angle, length, large, true);
}
/**
* Damages entities in a line.
* Only enemies of the specified team are damaged.
*/
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large, boolean laser){
if(laser) length = findLaserLength(hitter, length);
collidedBlocks.clear(); collidedBlocks.clear();
tr.trns(angle, length); tr.trns(angle, length);
@@ -207,9 +213,9 @@ public class Damage{
public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){ public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){
tr.trns(angle, length); tr.trns(angle, length);
if(hitter.type.collidesGround){ tmpBuilding = null;
tmpBuilding = null;
if(hitter.type.collidesGround){
world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> { world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> {
Building tile = world.build(cx, cy); Building tile = world.build(cx, cy);
if(tile != null && tile.team != hitter.team){ if(tile != null && tile.team != hitter.team){
@@ -218,8 +224,6 @@ public class Damage{
} }
return false; return false;
}); });
if(tmpBuilding != null) return tmpBuilding;
} }
rect.setPosition(x, y).setSize(tr.x, tr.y); rect.setPosition(x, y).setSize(tr.x, tr.y);
@@ -263,6 +267,14 @@ public class Damage{
Units.nearbyEnemies(hitter.team, rect, cons); Units.nearbyEnemies(hitter.team, rect, cons);
if(tmpBuilding != null && tmpUnit != null){
if(Mathf.dst2(x, y, tmpUnit.getX(), tmpUnit.getY()) <= Mathf.dst2(x, y, tmpBuilding.getX(), tmpBuilding.getY())){
return tmpUnit;
}
}else if(tmpBuilding != null){
return tmpBuilding;
}
return tmpUnit; return tmpUnit;
} }
@@ -351,64 +363,84 @@ public class Damage{
if(ground){ if(ground){
if(!complete){ if(!complete){
int trad = (int)(radius / tilesize); tileDamage(team, World.toTile(x), World.toTile(y), radius / tilesize, damage);
Tile tile = world.tileWorld(x, y);
if(tile != null){
tileDamage(team, tile.x, tile.y, trad, damage);
}
}else{ }else{
completeDamage(team, x, y, radius, damage); completeDamage(team, x, y, radius, damage);
} }
} }
} }
public static void tileDamage(Team team, int startx, int starty, int baseRadius, float baseDamage){ public static void tileDamage(Team team, int x, int y, float baseRadius, float damage){
//tile damage is posted, so that destroying a block that causes a chain explosion will run in the next frame
//this prevents recursive damage calls from messing up temporary variables
Core.app.post(() -> { Core.app.post(() -> {
bits.clear(); var in = world.build(x, y);
propagation.clear(); //spawned inside a multiblock. this means that damage needs to be dealt directly.
int bitOffset = bits.width() / 2; //why? because otherwise the building would absorb everything in one cell, which means much less damage than a nearby explosion.
//this needs to be compensated
if(in != null && in.team != team && in.block.size > 1 && in.health > damage){
//deal the damage of an entire side, to be equivalent with maximum 'standard' damage
in.damage(damage * Math.min((in.block.size), baseRadius * 0.45f));
//no need to continue with the explosion
return;
}
propagation.addFirst(PropCell.get((byte)0, (byte)0, (short)baseDamage)); //cap radius to prevent lag
//clamp radius to fit bits float radius = Math.min(baseRadius, 30), rad2 = radius * radius;
int radius = Math.min(baseRadius, bits.width() / 2); int rays = Mathf.ceil(radius * 2 * Mathf.pi);
double spacing = Math.PI * 2.0 / rays;
damages.clear();
while(!propagation.isEmpty()){ //raycast from each angle
int prop = propagation.removeLast(); for(int i = 0; i <= rays; i++){
int x = PropCell.x(prop); float dealt = 0f;
int y = PropCell.y(prop); int startX = x;
int damage = PropCell.damage(prop); int startY = y;
//manhattan distance used for calculating falloff, results in a diamond pattern int endX = x + (int)(Math.cos(spacing * i) * radius), endY = y + (int)(Math.sin(spacing * i) * radius);
int dst = Math.abs(x) + Math.abs(y);
int scaledDamage = (int)(damage * (1f - (float)dst / radius)); int xDist = Math.abs(endX - startX);
int yDist = -Math.abs(endY - startY);
int xStep = (startX < endX ? +1 : -1);
int yStep = (startY < endY ? +1 : -1);
int error = xDist + yDist;
bits.set(bitOffset + x, bitOffset + y); while(startX != endX || startY != endY){
Tile tile = world.tile(startx + x, starty + y); var build = world.build(startX, startY);
if(build != null && build.team != team){
//damage dealt at circle edge
float edgeScale = 0.6f;
float mult = (1f-(Mathf.dst2(startX, startY, x, y) / rad2) + edgeScale) / (1f + edgeScale);
float next = damage * mult - dealt;
//register damage dealt
int p = Point2.pack(startX, startY);
damages.put(p, Math.max(damages.get(p), next));
//register as hit
dealt += build.health;
if(scaledDamage <= 0 || tile == null) continue; if(next - dealt <= 0){
break;
//apply damage to entity if needed }
if(tile.build != null && tile.build.team != team){
int health = (int)(tile.build.health / (tile.block().size * tile.block().size));
if(tile.build.health > 0){
tile.build.damage(scaledDamage);
scaledDamage -= health;
if(scaledDamage <= 0) continue;
} }
}
for(Point2 p : Geometry.d4){ if(2 * error - yDist > xDist - 2 * error){
if(!bits.get(bitOffset + x + p.x, bitOffset + y + p.y)){ error += yDist;
propagation.addFirst(PropCell.get((byte)(x + p.x), (byte)(y + p.y), (short)scaledDamage)); startX += xStep;
}else{
error += xDist;
startY += yStep;
} }
} }
} }
});
//apply damage
for(var e : damages){
int cx = Point2.x(e.key), cy = Point2.y(e.key);
var build = world.build(cx, cy);
if(build != null){
build.damage(e.value);
}
}
});
} }
private static void completeDamage(Team team, float x, float y, float radius, float damage){ private static void completeDamage(Team team, float x, float y, float radius, float damage){
@@ -429,11 +461,4 @@ public class Damage{
float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff); float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff);
return damage * scaled; return damage * scaled;
} }
@Struct
static class PropCellStruct{
byte x;
byte y;
short damage;
}
} }

View File

@@ -3,6 +3,7 @@ package mindustry.entities;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import mindustry.content.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.*; import mindustry.world.*;
@@ -126,7 +127,7 @@ public class EntityCollisions{
public static boolean legsSolid(int x, int y){ public static boolean legsSolid(int x, int y){
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
return tile == null || tile.staticDarkness() >= 2 || tile.floor().solid; return tile == null || tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air);
} }
public static boolean waterSolid(int x, int y){ public static boolean waterSolid(int x, int y){
@@ -190,14 +191,10 @@ public class EntityCollisions{
yInvExit = y2 - (y1 + h1); yInvExit = y2 - (y1 + h1);
} }
float xEntry, yEntry; float xEntry = xInvEntry / vx1;
float xExit, yExit; float xExit = xInvExit / vx1;
float yEntry = yInvEntry / vy1;
xEntry = xInvEntry / vx1; float yExit = yInvExit / vy1;
xExit = xInvExit / vx1;
yEntry = yInvEntry / vy1;
yExit = yInvExit / vy1;
float entryTime = Math.max(xEntry, yEntry); float entryTime = Math.max(xEntry, yEntry);
float exitTime = Math.min(xExit, yExit); float exitTime = Math.min(xExit, yExit);

View File

@@ -6,6 +6,7 @@ import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.comp.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -75,7 +76,7 @@ public class Units{
if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){ if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){
return Integer.MAX_VALUE; return Integer.MAX_VALUE;
} }
return state.rules.unitCap + indexer.getExtraUnits(team); return Math.max(0, state.rules.unitCapVariable ? state.rules.unitCap + indexer.getExtraUnits(team) : state.rules.unitCap);
} }
/** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/ /** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/
@@ -93,7 +94,7 @@ public class Units{
* @return whether the target is invalid * @return whether the target is invalid
*/ */
public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){ public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){
return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range)) || (target instanceof Teamc && ((Teamc)target).team() == team) || (target instanceof Healthc && !((Healthc)target).isValid()); return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range + (target instanceof Sized hb ? hb.hitSize()/2f : 0f))) || (target instanceof Teamc t && t.team() == team) || (target instanceof Healthc h && !h.isValid());
} }
/** See {@link #invalidateTarget(Posc, Team, float, float, float)} */ /** See {@link #invalidateTarget(Posc, Team, float, float, float)} */
@@ -217,7 +218,7 @@ public class Units{
cdist = 0f; cdist = 0f;
nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> {
if(e.dead() || !predicate.get(e) || !e.within(x, y, range)) return; if(e.dead() || !predicate.get(e) || !e.within(x, y, range + e.hitSize/2f)) return;
float cost = sort.cost(e, x, y); float cost = sort.cost(e, x, y);
if(result == null || cost < cdist){ if(result == null || cost < cdist){
@@ -247,7 +248,7 @@ public class Units{
return result; return result;
} }
/** Returns the closest ally of this team. Filter by predicate. */ /** Returns the closest ally of this team in a range. Filter by predicate. */
public static Unit closest(Team team, float x, float y, float range, Boolf<Unit> predicate){ public static Unit closest(Team team, float x, float y, float range, Boolf<Unit> predicate){
result = null; result = null;
cdist = 0f; cdist = 0f;
@@ -265,6 +266,24 @@ public class Units{
return result; return result;
} }
/** Returns the closest ally of this team in a range. Filter by predicate. */
public static Unit closest(Team team, float x, float y, float range, Boolf<Unit> predicate, Sortf sort){
result = null;
cdist = 0f;
nearby(team, x, y, range, e -> {
if(!predicate.get(e)) return;
float dist = sort.cost(e, x, y);
if(result == null || dist < cdist){
result = e;
cdist = dist;
}
});
return result;
}
/** Returns the closest ally of this team. Filter by predicate. /** Returns the closest ally of this team. Filter by predicate.
* Unlike the closest() function, this only guarantees that unit hitboxes overlap the range. */ * Unlike the closest() function, this only guarantees that unit hitboxes overlap the range. */
public static Unit closestOverlap(Team team, float x, float y, float range, Boolf<Unit> predicate){ public static Unit closestOverlap(Team team, float x, float y, float range, Boolf<Unit> predicate){
@@ -292,7 +311,7 @@ public class Units{
/** Iterates over all units in a circle around this position. */ /** Iterates over all units in a circle around this position. */
public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){ public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){
nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> { nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> {
if(unit.within(x, y, radius)){ if(unit.within(x, y, radius + unit.hitSize/2f)){
cons.get(unit); cons.get(unit);
} }
}); });

View File

@@ -15,14 +15,14 @@ import mindustry.ui.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class UnitSpawnAbility extends Ability{ public class UnitSpawnAbility extends Ability{
public UnitType type; public UnitType unit;
public float spawnTime = 60f, spawnX, spawnY; public float spawnTime = 60f, spawnX, spawnY;
public Effect spawnEffect = Fx.spawn; public Effect spawnEffect = Fx.spawn;
protected float timer; protected float timer;
public UnitSpawnAbility(UnitType type, float spawnTime, float spawnX, float spawnY){ public UnitSpawnAbility(UnitType unit, float spawnTime, float spawnX, float spawnY){
this.type = type; this.unit = unit;
this.spawnTime = spawnTime; this.spawnTime = spawnTime;
this.spawnX = spawnX; this.spawnX = spawnX;
this.spawnY = spawnY; this.spawnY = spawnY;
@@ -35,10 +35,10 @@ public class UnitSpawnAbility extends Ability{
public void update(Unit unit){ public void update(Unit unit){
timer += Time.delta * state.rules.unitBuildSpeedMultiplier; timer += Time.delta * state.rules.unitBuildSpeedMultiplier;
if(timer >= spawnTime && Units.canCreate(unit.team, type)){ if(timer >= spawnTime && Units.canCreate(unit.team, this.unit)){
float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX);
spawnEffect.at(x, y); spawnEffect.at(x, y);
Unit u = type.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;
if(!Vars.net.client()){ if(!Vars.net.client()){
@@ -51,16 +51,16 @@ public class UnitSpawnAbility extends Ability{
@Override @Override
public void draw(Unit unit){ public void draw(Unit unit){
if(Units.canCreate(unit.team, type)){ if(Units.canCreate(unit.team, this.unit)){
Draw.draw(Draw.z(), () -> { Draw.draw(Draw.z(), () -> {
float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX);
Drawf.construct(x, y, type.icon(Cicon.full), unit.rotation - 90, timer / spawnTime, 1f, timer); Drawf.construct(x, y, this.unit.icon(Cicon.full), unit.rotation - 90, timer / spawnTime, 1f, timer);
}); });
} }
} }
@Override @Override
public String localized(){ public String localized(){
return Core.bundle.format("ability.unitspawn", type.localizedName); return Core.bundle.format("ability.unitspawn", unit.localizedName);
} }
} }

View File

@@ -273,7 +273,7 @@ public abstract class BulletType extends Content{
if(homingPower > 0.0001f && b.time >= homingDelay){ if(homingPower > 0.0001f && b.time >= homingDelay){
Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround); Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround);
if(target != null){ if(target != null){
b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), homingPower)); b.vel.setAngle(Angles.moveToward(b.rotation(), b.angleTo(target), homingPower * Time.delta * 50f));
} }
} }

View File

@@ -8,8 +8,8 @@ import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
public class LightningBulletType extends BulletType{ public class LightningBulletType extends BulletType{
protected Color lightningColor = Pal.lancerLaser; public Color lightningColor = Pal.lancerLaser;
protected int lightningLength = 25, lightningLengthRand = 0; public int lightningLength = 25, lightningLengthRand = 0;
public LightningBulletType(){ public LightningBulletType(){
super(0.0001f, 1f); super(0.0001f, 1f);

View File

@@ -54,7 +54,7 @@ public class RailBulletType extends BulletType{
super.init(b); super.init(b);
b.fdata = length; b.fdata = length;
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false); Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false);
float resultLen = b.fdata; float resultLen = b.fdata;
Vec2 nor = Tmp.v1.set(b.vel).nor(); Vec2 nor = Tmp.v1.set(b.vel).nor();

View File

@@ -26,10 +26,10 @@ import java.util.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@Component @Component
abstract class BuilderComp implements Posc, Teamc, Rotc{ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{
static final Vec2[] vecs = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()}; static final Vec2[] vecs = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()};
@Import float x, y, rotation; @Import float x, y, rotation, buildSpeedMultiplier;
@Import UnitType type; @Import UnitType type;
@Import Team team; @Import Team team;
@@ -41,7 +41,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
private transient float buildAlpha = 0f; private transient float buildAlpha = 0f;
public boolean canBuild(){ public boolean canBuild(){
return type.buildSpeed > 0; return type.buildSpeed > 0 && buildSpeedMultiplier > 0;
} }
@Override @Override
@@ -126,9 +126,9 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
//otherwise, update it. //otherwise, update it.
if(current.breaking){ if(current.breaking){
entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * state.rules.buildSpeedMultiplier); entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * buildSpeedMultiplier * state.rules.buildSpeedMultiplier);
}else{ }else{
entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * state.rules.buildSpeedMultiplier, current.config); entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * buildSpeedMultiplier * state.rules.buildSpeedMultiplier, current.config);
} }
current.stuck = Mathf.equal(current.progress, entity.progress); current.stuck = Mathf.equal(current.progress, entity.progress);

View File

@@ -43,7 +43,7 @@ import static mindustry.Vars.*;
@EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false) @EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false)
@Component(base = true) @Component(base = true)
abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable{ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable, Sized{
//region vars and initialization //region vars and initialization
static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6; static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6;
static final ObjectSet<Building> tmpTiles = new ObjectSet<>(); static final ObjectSet<Building> tmpTiles = new ObjectSet<>();
@@ -536,6 +536,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
public void dumpLiquid(Liquid liquid){ public void dumpLiquid(Liquid liquid){
dumpLiquid(liquid, 2f);
}
public void dumpLiquid(Liquid liquid, float scaling){
int dump = this.cdump; int dump = this.cdump;
if(liquids.get(liquid) <= 0.0001f) return; if(liquids.get(liquid) <= 0.0001f) return;
@@ -551,10 +555,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
float ofract = other.liquids.get(liquid) / other.block.liquidCapacity; float ofract = other.liquids.get(liquid) / other.block.liquidCapacity;
float fract = liquids.get(liquid) / block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity;
if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / 2f, liquid); if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid);
} }
} }
} }
public boolean canDumpLiquid(Building to, Liquid liquid){ public boolean canDumpLiquid(Building to, Liquid liquid){
@@ -789,6 +792,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
for(Building other : proximity){ for(Building other : proximity){
if(other != null && other.power != null if(other != null && other.power != null
&& other.team == team
&& !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower) && !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower)
&& conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){ && conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){
out.add(other); out.add(other);
@@ -797,7 +801,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
for(int i = 0; i < power.links.size; i++){ for(int i = 0; i < power.links.size; i++){
Tile link = world.tile(power.links.get(i)); Tile link = world.tile(power.links.get(i));
if(link != null && link.build != null && link.build.power != null) out.add(link.build); if(link != null && link.build != null && link.build.power != null && link.build.team == team) out.add(link.build);
} }
return out; return out;
} }
@@ -906,24 +910,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
public void placed(){ public void placed(){
if(net.client()) return; if(net.client()) return;
if(block.consumesPower || block.outputsPower){ if((block.consumesPower || block.outputsPower) && block.hasPower){
int range = 10; PowerNode.getNodeLinks(tile, block, team, other -> {
tempTiles.clear(); if(!other.power.links.contains(pos())){
Geometry.circle(tileX(), tileY(), range, (x, y) -> { other.configureAny(pos());
Building other = world.build(x, y);
if(other != null && other.block instanceof PowerNode node && node.linkValid(other, self()) && !PowerNode.insulated(other, self())
&& !other.proximity().contains(this.<Building>self()) &&
!(block.outputsPower && proximity.contains(p -> p.power != null && p.power.graph == other.power.graph))){
tempTiles.add(other.tile);
} }
}); });
tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile)));
if(!tempTiles.isEmpty()){
Tile toLink = tempTiles.first();
if(!toLink.build.power.links.contains(pos())){
toLink.build.configureAny(pos());
}
}
} }
} }
@@ -960,6 +952,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
if(block.configurations.containsKey(type)){ if(block.configurations.containsKey(type)){
block.configurations.get(type).get(this, value); block.configurations.get(type).get(this, value);
}else if(value instanceof Building build){
//copy config of another building
var conf = build.config();
if(conf != null && !(conf instanceof Building)){
configured(builder, conf);
}
} }
} }
@@ -979,6 +977,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
int amount = items.get(item); int amount = items.get(item);
explosiveness += item.explosiveness * amount; explosiveness += item.explosiveness * amount;
flammability += item.flammability * amount; flammability += item.flammability * amount;
power += item.charge * amount * 100f;
} }
} }
@@ -1143,7 +1142,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
/** Returns whether or not a hand cursor should be shown over this block. */ /** Returns whether or not a hand cursor should be shown over this block. */
public Cursor getCursor(){ public Cursor getCursor(){
return block.configurable && team == player.team() ? SystemCursor.hand : SystemCursor.arrow; return block.configurable && interactable(player.team()) ? SystemCursor.hand : SystemCursor.arrow;
} }
/** /**
@@ -1273,6 +1272,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return tile.build == self() && !dead(); return tile.build == self() && !dead();
} }
@Override
public float hitSize(){
return tile.block().size * tilesize;
}
@Replace @Replace
@Override @Override
public void kill(){ public void kill(){
@@ -1302,10 +1306,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return switch(sensor){ return switch(sensor){
case x -> World.conv(x); case x -> World.conv(x);
case y -> World.conv(y); case y -> World.conv(y);
case dead -> !isValid() ? 1 : 0;
case team -> team.id; case team -> team.id;
case health -> health; case health -> health;
case maxHealth -> maxHealth; case maxHealth -> maxHealth;
case efficiency -> efficiency(); case efficiency -> efficiency();
case timescale -> timeScale;
case range -> this instanceof Ranged r ? r.range() / tilesize : 0;
case rotation -> rotation; case rotation -> rotation;
case totalItems -> items == null ? 0 : items.total(); case totalItems -> items == null ? 0 : items.total();
case totalLiquids -> liquids == null ? 0 : liquids.total(); case totalLiquids -> liquids == null ? 0 : liquids.total();
@@ -1318,9 +1325,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
case powerNetStored -> power == null ? 0 : power.graph.getLastPowerStored(); case powerNetStored -> power == null ? 0 : power.graph.getLastPowerStored();
case powerNetCapacity -> power == null ? 0 : power.graph.getLastCapacity(); case powerNetCapacity -> power == null ? 0 : power.graph.getLastCapacity();
case enabled -> enabled ? 1 : 0; case enabled -> enabled ? 1 : 0;
case controlled -> this instanceof ControlBlock c ? c.isControlled() ? 1 : 0 : 0; case controlled -> this instanceof ControlBlock c && c.isControlled() ? GlobalConstants.ctrlPlayer : 0;
case payloadCount -> getPayload() != null ? 1 : 0; case payloadCount -> getPayload() != null ? 1 : 0;
default -> 0; case size -> block.size;
default -> Float.NaN; //gets converted to null in logic
}; };
} }
@@ -1333,14 +1341,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null; case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null;
default -> noSensed; default -> noSensed;
}; };
} }
@Override @Override
public double sense(Content content){ public double sense(Content content){
if(content instanceof Item && items != null) return items.get((Item)content); if(content instanceof Item i && items != null) return items.get(i);
if(content instanceof Liquid && liquids != null) return liquids.get((Liquid)content); if(content instanceof Liquid l && liquids != null) return liquids.get(l);
return 0; return Float.NaN; //invalid sense
} }
@Override @Override

View File

@@ -80,6 +80,7 @@ abstract class CommanderComp implements Entityc, Posc{
void command(Formation formation, Seq<Unit> units){ void command(Formation formation, Seq<Unit> units){
clearCommand(); clearCommand();
units.shuffle();
float spacing = hitSize * 0.8f; float spacing = hitSize * 0.8f;
minFormationSpeed = type.speed; minFormationSpeed = type.speed;

View File

@@ -8,7 +8,7 @@ import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@Component @Component
abstract class HitboxComp implements Posc, QuadTreeObject{ abstract class HitboxComp implements Posc, Sized, QuadTreeObject{
@Import float x, y; @Import float x, y;
transient float lastX, lastY, deltaX, deltaY, hitSize; transient float lastX, lastY, deltaX, deltaY, hitSize;
@@ -28,6 +28,11 @@ abstract class HitboxComp implements Posc, QuadTreeObject{
updateLastPosition(); updateLastPosition();
} }
@Override
public float hitSize(){
return hitSize;
}
void getCollisions(Cons<QuadTree> consumer){ void getCollisions(Cons<QuadTree> consumer){
} }

View File

@@ -78,16 +78,16 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati
@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
if(!vector.isZero()){ if(!vector.isZero()){
//mark walking state when moving in a controlled manner
walked = true; walked = true;
} }
} }
@Override @Override
public void approach(Vec2 vector){ public void approach(Vec2 vector){
if(!vector.isZero(0.09f)){ //mark walking state when moving in a controlled manner
//mark walking state when moving in a controlled manner if(!vector.isZero(0.001f)){
walked = true; walked = true;
} }
} }

View File

@@ -43,6 +43,8 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
String name = "noname"; String name = "noname";
Color color = new Color(); Color color = new Color();
//locale should not be synced.
transient String locale = "en";
transient float deathTimer; transient float deathTimer;
transient String lastText = ""; transient String lastText = "";
transient float textFadeTime; transient float textFadeTime;

View File

@@ -0,0 +1,5 @@
package mindustry.entities.comp;
public interface Sized{
float hitSize();
}

View File

@@ -19,7 +19,8 @@ abstract class StatusComp implements Posc, Flyingc{
private Seq<StatusEntry> statuses = new Seq<>(); private Seq<StatusEntry> statuses = new Seq<>();
private transient Bits applied = new Bits(content.getBy(ContentType.status).size); private transient Bits applied = new Bits(content.getBy(ContentType.status).size);
@ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1; @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1, buildSpeedMultiplier = 1;
@ReadOnly transient boolean disarmed = false;
@Import UnitType type; @Import UnitType type;
@@ -55,10 +56,16 @@ abstract class StatusComp implements Posc, Flyingc{
} }
} }
//otherwise, no opposites found, add direct effect if(!effect.reactive){
StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); //otherwise, no opposites found, add direct effect
entry.set(effect, duration); StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new);
statuses.add(entry); entry.set(effect, duration);
statuses.add(entry);
}
}
void clearStatuses(){
statuses.clear();
} }
/** Removes a status effect. */ /** Removes a status effect. */
@@ -104,7 +111,8 @@ abstract class StatusComp implements Posc, Flyingc{
} }
applied.clear(); applied.clear();
speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = 1f; speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = buildSpeedMultiplier = 1f;
disarmed = false;
if(statuses.isEmpty()) return; if(statuses.isEmpty()) return;
@@ -126,6 +134,10 @@ abstract class StatusComp implements Posc, Flyingc{
healthMultiplier *= entry.effect.healthMultiplier; healthMultiplier *= entry.effect.healthMultiplier;
damageMultiplier *= entry.effect.damageMultiplier; damageMultiplier *= entry.effect.damageMultiplier;
reloadMultiplier *= entry.effect.reloadMultiplier; reloadMultiplier *= entry.effect.reloadMultiplier;
buildSpeedMultiplier *= entry.effect.buildSpeedMultiplier;
disarmed |= entry.effect.disarm;
entry.effect.update(self(), entry.time); entry.effect.update(self(), entry.time);
} }
} }

View File

@@ -32,7 +32,7 @@ import static mindustry.Vars.*;
@Component(base = true) @Component(base = true)
abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc, Builderc{ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc, Builderc{
@Import boolean hovering, dead; @Import boolean hovering, dead, disarmed;
@Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed; @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed;
@Import Team team; @Import Team team;
@Import int id; @Import int id;
@@ -53,7 +53,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
} }
public void approach(Vec2 vector){ public void approach(Vec2 vector){
vel.approachDelta(vector, type.accel * realSpeed() * floorSpeedMultiplier()); vel.approachDelta(vector, type.accel * realSpeed());
} }
public void aimLook(Position pos){ public void aimLook(Position pos){
@@ -82,7 +82,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
/** @return speed with boost multipliers factored in. */ /** @return speed with boost multipliers factored in. */
public float realSpeed(){ public float realSpeed(){
return Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, elevation) * speed(); return Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, elevation) * speed() * floorSpeedMultiplier();
} }
/** Iterates through this unit and everything it is controlling. */ /** Iterates through this unit and everything it is controlling. */
@@ -128,18 +128,26 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case ammoCapacity -> type.ammoCapacity; case ammoCapacity -> type.ammoCapacity;
case x -> World.conv(x); case x -> World.conv(x);
case y -> World.conv(y); case y -> World.conv(y);
case dead -> dead || !isAdded() ? 1 : 0;
case team -> team.id; case team -> team.id;
case shooting -> isShooting() ? 1 : 0; case shooting -> isShooting() ? 1 : 0;
case boosting -> type.canBoost && isFlying() ? 1 : 0;
case range -> range() / tilesize;
case shootX -> World.conv(aimX()); case shootX -> World.conv(aimX());
case shootY -> World.conv(aimY()); case shootY -> World.conv(aimY());
case mining -> mining() ? 1 : 0; case mining -> mining() ? 1 : 0;
case mineX -> mining() ? mineTile.x : -1; case mineX -> mining() ? mineTile.x : -1;
case mineY -> mining() ? mineTile.y : -1; case mineY -> mining() ? mineTile.y : -1;
case flag -> flag; case flag -> flag;
case controlled -> controller instanceof LogicAI || controller instanceof Player ? 1 : 0; case controlled -> !isValid() ? 0 :
case commanded -> controller instanceof FormationAI ? 1 : 0; controller instanceof LogicAI ? GlobalConstants.ctrlProcessor :
controller instanceof Player ? GlobalConstants.ctrlPlayer :
controller instanceof FormationAI ? GlobalConstants.ctrlFormation :
0;
case commanded -> controller instanceof FormationAI && isValid() ? 1 : 0;
case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0; case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0;
default -> 0; case size -> hitSize / tilesize;
default -> Float.NaN;
}; };
} }
@@ -149,6 +157,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case type -> type; case type -> type;
case name -> controller instanceof Player p ? p.name : null; case name -> controller instanceof Player p ? p.name : null;
case firstItem -> stack().amount == 0 ? null : item(); case firstItem -> stack().amount == 0 ? null : item();
case controller -> !isValid() ? null : controller instanceof LogicAI log ? log.controller : controller instanceof FormationAI form ? form.leader : this;
case payloadType -> self() instanceof Payloadc pay ? case payloadType -> self() instanceof Payloadc pay ?
(pay.payloads().isEmpty() ? null : (pay.payloads().isEmpty() ? null :
pay.payloads().peek() instanceof UnitPayload p1 ? p1.unit.type : pay.payloads().peek() instanceof UnitPayload p1 ? p1.unit.type :
@@ -161,7 +170,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Override @Override
public double sense(Content content){ public double sense(Content content){
if(content == stack().item) return stack().amount; if(content == stack().item) return stack().amount;
return 0; return Float.NaN;
} }
@Override @Override
@@ -174,7 +183,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Replace @Replace
public boolean canShoot(){ public boolean canShoot(){
//cannot shoot while boosting //cannot shoot while boosting
return !(type.canBoost && isFlying()); return !disarmed && !(type.canBoost && isFlying());
} }
@Override @Override
@@ -410,9 +419,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
float explosiveness = 2f + item().explosiveness * stack().amount * 1.53f; float explosiveness = 2f + item().explosiveness * stack().amount * 1.53f;
float flammability = item().flammability * stack().amount / 1.9f; float flammability = item().flammability * stack().amount / 1.9f;
float power = item().charge * stack().amount * 150f;
if(!spawnedByCore){ if(!spawnedByCore){
Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team); Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team);
} }
float shake = hitSize / 3f; float shake = hitSize / 3f;

View File

@@ -1,6 +1,5 @@
package mindustry.entities.comp; package mindustry.entities.comp;
import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
@@ -22,7 +21,7 @@ abstract class VelComp implements Posc{
@Override @Override
public void update(){ public void update(){
move(vel.x * Time.delta, vel.y * Time.delta); move(vel.x * Time.delta, vel.y * Time.delta);
vel.scl(Mathf.clamp(1f - drag * Time.delta)); vel.scl(Math.max(1f - drag * Time.delta, 0));
} }
/** @return function to use for check solid state. if null, no checking is done. */ /** @return function to use for check solid state. if null, no checking is done. */

View File

@@ -16,6 +16,7 @@ import static mindustry.Vars.*;
@Component @Component
abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{
@Import float x, y, rotation, reloadMultiplier; @Import float x, y, rotation, reloadMultiplier;
@Import boolean disarmed;
@Import Vec2 vel; @Import Vec2 vel;
@Import UnitType type; @Import UnitType type;
@@ -81,7 +82,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{
} }
boolean canShoot(){ boolean canShoot(){
return true; return !disarmed;
} }
@Override @Override

View File

@@ -19,13 +19,19 @@ public class MultiEffect extends Effect{
public void init(){ public void init(){
for(Effect f : effects){ for(Effect f : effects){
clip = Math.max(clip, f.clip); clip = Math.max(clip, f.clip);
lifetime = Math.max(lifetime, f.lifetime);
} }
} }
@Override @Override
public void render(EffectContainer e){ public void render(EffectContainer e){
int index = 0;
for(Effect f : effects){ for(Effect f : effects){
e.scaled(f.lifetime, f::render); int i = ++index;
e.scaled(f.lifetime, cont -> {
cont.id = e.id + i;
f.render(cont);
});
clip = Math.max(clip, f.clip); clip = Math.max(clip, f.clip);
} }
} }

View File

@@ -16,6 +16,7 @@ public class ParticleEffect extends Effect{
//region only //region only
public float sizeFrom = 2f, sizeTo = 0f; public float sizeFrom = 2f, sizeTo = 0f;
public float offset = 0;
public String region = "circle"; public String region = "circle";
//line only //line only
@@ -48,7 +49,7 @@ public class ParticleEffect extends Effect{
}); });
}else{ }else{
Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> {
Draw.rect(tex, e.x + x, e.y + y, rad, rad); Draw.rect(tex, e.x + x, e.y + y, rad, rad, e.rotation + offset);
}); });
} }
} }

View File

@@ -15,7 +15,7 @@ import static mindustry.Vars.*;
public class AIController implements UnitController{ public class AIController implements UnitController{
protected static final Vec2 vec = new Vec2(); protected static final Vec2 vec = new Vec2();
protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2; protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2, timerTarget4 = 3;
protected Unit unit; protected Unit unit;
protected Interval timer = new Interval(4); protected Interval timer = new Interval(4);
@@ -167,7 +167,7 @@ public class AIController implements UnitController{
} }
protected boolean retarget(){ protected boolean retarget(){
return timer.get(timerTarget, 40); return timer.get(timerTarget, target == null ? 40 : 90);
} }
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){

View File

@@ -62,6 +62,10 @@ public class BuildPlan implements Position{
} }
public boolean placeable(Team team){
return Build.validPlace(block, team, x, y, rotation);
}
public boolean isRotation(Team team){ public boolean isRotation(Team team){
if(breaking) return false; if(breaking) return false;
Tile tile = tile(); Tile tile = tile();

View File

@@ -68,6 +68,8 @@ public class EventType{
public static class ContentInitEvent{} public static class ContentInitEvent{}
/** Called when the client game is first loaded. */ /** Called when the client game is first loaded. */
public static class ClientLoadEvent{} public static class ClientLoadEvent{}
/** Called *after* all the modded files have been added into Vars.tree */
public static class FileTreeInitEvent{}
/** Called when a game begins and the world is loaded. */ /** Called when a game begins and the world is loaded. */
public static class WorldLoadEvent{} public static class WorldLoadEvent{}
@@ -381,6 +383,15 @@ public class EventType{
} }
} }
/** Called when a connection is established to a client. */
public static class ConnectionEvent{
public final NetConnection connection;
public ConnectionEvent(NetConnection connection){
this.connection = connection;
}
}
/** Called after connecting; when a player receives world data and is ready to play.*/ /** Called after connecting; when a player receives world data and is ready to play.*/
public static class PlayerJoin{ public static class PlayerJoin{
public final Player player; public final Player player;

View File

@@ -44,10 +44,14 @@ public class Rules{
public boolean fire = true; public boolean fire = true;
/** Whether units use and require ammo. */ /** Whether units use and require ammo. */
public boolean unitAmmo = false; public boolean unitAmmo = false;
/** Whether cores add to unit limit */
public boolean unitCapVariable = true;
/** How fast unit pads build units. */ /** How fast unit pads build units. */
public float unitBuildSpeedMultiplier = 1f; public float unitBuildSpeedMultiplier = 1f;
/** How much damage any other units deal. */ /** How much damage any other units deal. */
public float unitDamageMultiplier = 1f; public float unitDamageMultiplier = 1f;
/** Whether to allow units to build with logic. */
public boolean logicUnitBuild = true;
/** How much health blocks start with. */ /** How much health blocks start with. */
public float blockHealthMultiplier = 1f; public float blockHealthMultiplier = 1f;
/** How much damage blocks (turrets) deal. */ /** How much damage blocks (turrets) deal. */
@@ -63,7 +67,7 @@ public class Rules{
/** Radius around enemy wave drop zones.*/ /** Radius around enemy wave drop zones.*/
public float dropZoneRadius = 300f; public float dropZoneRadius = 300f;
/** Time between waves in ticks. */ /** Time between waves in ticks. */
public float waveSpacing = 60 * 60 * 2; public float waveSpacing = 2 * Time.toMinutes;
/** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */ /** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */
public int winWave = 0; public int winWave = 0;
/** Base unit cap. Can still be increased by blocks. */ /** Base unit cap. Can still be increased by blocks. */
@@ -137,7 +141,7 @@ public class Rules{
} }
/** A simple map for storing TeamRules in an efficient way without hashing. */ /** A simple map for storing TeamRules in an efficient way without hashing. */
public static class TeamRules implements Serializable{ public static class TeamRules implements JsonSerializable{
final TeamRule[] values = new TeamRule[Team.all.length]; final TeamRule[] values = new TeamRule[Team.all.length];
public TeamRule get(Team team){ public TeamRule get(Team team){

View File

@@ -27,6 +27,7 @@ import mindustry.input.Placement.*;
import mindustry.io.*; import mindustry.io.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.blocks.ConstructBlock.*;
import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.distribution.*;
import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.legacy.*;
import mindustry.world.blocks.power.*; import mindustry.world.blocks.power.*;
@@ -285,7 +286,7 @@ public class Schematics implements Loadable{
/** Creates an array of build requests from a schematic's data, centered on the provided x+y coordinates. */ /** Creates an array of build requests from a schematic's data, centered on the provided x+y coordinates. */
public Seq<BuildPlan> toRequests(Schematic schem, int x, int y){ public Seq<BuildPlan> toRequests(Schematic schem, int x, int y){
return schem.tiles.map(t -> new BuildPlan(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block, t.config).original(t.x, t.y, schem.width, schem.height)) return schem.tiles.map(t -> new BuildPlan(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block, t.config).original(t.x, t.y, schem.width, schem.height))
.removeAll(s -> (!s.block.isVisible() && !(s.block instanceof CoreBlock)) || !s.block.unlockedNow()); .removeAll(s -> (!s.block.isVisible() && !(s.block instanceof CoreBlock)) || !s.block.unlockedNow()).sort(Structs.comparingInt(s -> -s.block.schematicPriority));
} }
/** @return all the valid loadouts for a specific core type. */ /** @return all the valid loadouts for a specific core type. */
@@ -357,10 +358,11 @@ public class Schematics implements Loadable{
for(int cx = x; cx <= x2; cx++){ for(int cx = x; cx <= x2; cx++){
for(int cy = y; cy <= y2; cy++){ for(int cy = y; cy <= y2; cy++){
Building linked = world.build(cx, cy); Building linked = world.build(cx, cy);
Block realBlock = linked == null ? null : linked instanceof ConstructBuild cons ? cons.cblock : linked.block;
if(linked != null && (linked.block.isVisible() || linked.block() instanceof CoreBlock) && !(linked.block instanceof ConstructBlock)){ if(linked != null && (realBlock.isVisible() || realBlock instanceof CoreBlock)){
int top = linked.block.size/2; int top = realBlock.size/2;
int bot = linked.block.size % 2 == 1 ? -linked.block.size/2 : -(linked.block.size - 1)/2; int bot = realBlock.size % 2 == 1 ? -realBlock.size/2 : -(realBlock.size - 1)/2;
minx = Math.min(linked.tileX() + bot, minx); minx = Math.min(linked.tileX() + bot, minx);
miny = Math.min(linked.tileY() + bot, miny); miny = Math.min(linked.tileY() + bot, miny);
maxx = Math.max(linked.tileX() + top, maxx); maxx = Math.max(linked.tileX() + top, maxx);
@@ -385,12 +387,13 @@ public class Schematics implements Loadable{
for(int cx = ox; cx <= ox2; cx++){ for(int cx = ox; cx <= ox2; cx++){
for(int cy = oy; cy <= oy2; cy++){ for(int cy = oy; cy <= oy2; cy++){
Building tile = world.build(cx, cy); Building tile = world.build(cx, cy);
Block realBlock = tile == null ? null : tile instanceof ConstructBuild cons ? cons.cblock : tile.block;
if(tile != null && !counted.contains(tile.pos()) && !(tile.block instanceof ConstructBlock) if(tile != null && !counted.contains(tile.pos())
&& (tile.block.isVisible() || tile.block instanceof CoreBlock)){ && (realBlock.isVisible() || realBlock instanceof CoreBlock)){
Object config = tile.config(); Object config = tile instanceof ConstructBuild cons ? cons.lastConfig : tile.config();
tiles.add(new Stile(tile.block, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); tiles.add(new Stile(realBlock, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation));
counted.add(tile.pos()); counted.add(tile.pos());
} }
} }

View File

@@ -18,7 +18,7 @@ import static mindustry.Vars.*;
* weapon equipped, ammo used, and status effects. * weapon equipped, ammo used, and status effects.
* Each spawn group can have multiple sub-groups spawned in different areas of the map. * Each spawn group can have multiple sub-groups spawned in different areas of the map.
*/ */
public class SpawnGroup implements Serializable{ public class SpawnGroup implements JsonSerializable{
public static final int never = Integer.MAX_VALUE; public static final int never = Integer.MAX_VALUE;
/** The unit type spawned */ /** The unit type spawned */

View File

@@ -123,6 +123,7 @@ public class Universe{
} }
/** @return the last selected loadout for this specific core type. */ /** @return the last selected loadout for this specific core type. */
@Nullable
public Schematic getLoadout(CoreBlock core){ public Schematic getLoadout(CoreBlock core){
//for tools - schem //for tools - schem
if(schematics == null) return Loadouts.basicShard; if(schematics == null) return Loadouts.basicShard;
@@ -134,7 +135,7 @@ public class Universe{
Seq<Schematic> all = schematics.getLoadouts(core); Seq<Schematic> all = schematics.getLoadouts(core);
Schematic schem = all.find(s -> s.file != null && s.file.nameWithoutExtension().equals(file)); Schematic schem = all.find(s -> s.file != null && s.file.nameWithoutExtension().equals(file));
return schem == null ? all.first() : schem; return schem == null ? all.any() ? all.first() : null : schem;
} }
/** Runs possible events. Resets event counter. */ /** Runs possible events. Resets event counter. */

View File

@@ -112,6 +112,12 @@ public class Drawf{
Draw.color(); Draw.color();
} }
public static void shadow(TextureRegion region, float x, float y, float width, float height, float rotation){
Draw.color(Pal.shadow);
Draw.rect(region, x, y, width, height, rotation);
Draw.color();
}
public static void liquid(TextureRegion region, float x, float y, float alpha, Color color, float rotation){ public static void liquid(TextureRegion region, float x, float y, float alpha, Color color, float rotation){
Draw.color(color, alpha); Draw.color(color, alpha);
Draw.rect(region, x, y, rotation); Draw.rect(region, x, y, rotation);
@@ -221,9 +227,13 @@ public class Drawf{
} }
public static void construct(float x, float y, TextureRegion region, float rotation, float progress, float speed, float time){ public static void construct(float x, float y, TextureRegion region, float rotation, float progress, float speed, float time){
construct(x, y, region, Pal.accent, rotation, progress, speed, time);
}
public static void construct(float x, float y, TextureRegion region, Color color, float rotation, float progress, float speed, float time){
Shaders.build.region = region; Shaders.build.region = region;
Shaders.build.progress = progress; Shaders.build.progress = progress;
Shaders.build.color.set(Pal.accent); Shaders.build.color.set(color);
Shaders.build.color.a = speed; Shaders.build.color.a = speed;
Shaders.build.time = -time / 20f; Shaders.build.time = -time / 20f;
@@ -235,9 +245,13 @@ public class Drawf{
} }
public static void construct(Building t, TextureRegion region, float rotation, float progress, float speed, float time){ public static void construct(Building t, TextureRegion region, float rotation, float progress, float speed, float time){
construct(t, region, Pal.accent, rotation, progress, speed, time);
}
public static void construct(Building t, TextureRegion region, Color color, float rotation, float progress, float speed, float time){
Shaders.build.region = region; Shaders.build.region = region;
Shaders.build.progress = progress; Shaders.build.progress = progress;
Shaders.build.color.set(Pal.accent); Shaders.build.color.set(color);
Shaders.build.color.a = speed; Shaders.build.color.a = speed;
Shaders.build.time = -time / 20f; Shaders.build.time = -time / 20f;

View File

@@ -119,6 +119,7 @@ public class FloorRenderer implements Disposable{
return; return;
} }
Draw.flush();
cbatch.setProjection(Core.camera.mat); cbatch.setProjection(Core.camera.mat);
cbatch.beginDraw(); cbatch.beginDraw();

View File

@@ -54,7 +54,7 @@ public class LoadRenderer implements Disposable{
bars = new Bar[]{ bars = new Bar[]{
new Bar("s_proc#", OS.cores / 16f, OS.cores < 4), new Bar("s_proc#", OS.cores / 16f, OS.cores < 4),
new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false), new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false),
new Bar("g_vtype", graphics.getGLVersion().type == Type.GLES ? 0.5f : 1f, graphics.getGLVersion().type == Type.GLES), new Bar("g_vtype", graphics.getGLVersion().type == GlType.GLES ? 0.5f : 1f, graphics.getGLVersion().type == GlType.GLES),
new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110), new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110),
new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")), new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")),
new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac), new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac),

View File

@@ -96,7 +96,8 @@ public class MinimapRenderer implements Disposable{
Draw.mixcol(unit.team().color, 1f); Draw.mixcol(unit.team().color, 1f);
float scale = Scl.scl(1f) / 2f * scaling * 32f; float scale = Scl.scl(1f) / 2f * scaling * 32f;
Draw.rect(unit.type.icon(Cicon.full), x + rx, y + ry, scale, scale, unit.rotation() - 90); var region = unit.type.icon(Cicon.full);
Draw.rect(region, x + rx, y + ry, scale, scale * (float)region.height / region.width, unit.rotation() - 90);
Draw.reset(); Draw.reset();
} }

View File

@@ -15,10 +15,10 @@ import mindustry.type.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class Shaders{ public class Shaders{
public static BlockBuild blockbuild; public static BlockBuildShader blockbuild;
public static @Nullable ShieldShader shield; public static @Nullable ShieldShader shield;
public static BuildBeamShader buildBeam; public static BuildBeamShader buildBeam;
public static UnitBuild build; public static UnitBuildShader build;
public static DarknessShader darkness; public static DarknessShader darkness;
public static LightShader light; public static LightShader light;
public static SurfaceShader water, mud, tar, slag, space; public static SurfaceShader water, mud, tar, slag, space;
@@ -31,7 +31,7 @@ public class Shaders{
public static void init(){ public static void init(){
mesh = new MeshShader(); mesh = new MeshShader();
blockbuild = new BlockBuild(); blockbuild = new BlockBuildShader();
try{ try{
shield = new ShieldShader(); shield = new ShieldShader();
}catch(Throwable t){ }catch(Throwable t){
@@ -40,7 +40,7 @@ public class Shaders{
t.printStackTrace(); t.printStackTrace();
} }
buildBeam = new BuildBeamShader(); buildBeam = new BuildBeamShader();
build = new UnitBuild(); build = new UnitBuildShader();
darkness = new DarknessShader(); darkness = new DarknessShader();
light = new LightShader(); light = new LightShader();
water = new SurfaceShader("water"); water = new SurfaceShader("water");
@@ -142,12 +142,16 @@ public class Shaders{
} }
} }
public static class UnitBuild extends LoadShader{ /** @deprecated transition class for mods; use UnitBuildShader instead. */
@Deprecated
public static class UnitBuild extends UnitBuildShader{}
public static class UnitBuildShader extends LoadShader{
public float progress, time; public float progress, time;
public Color color = new Color(); public Color color = new Color();
public TextureRegion region; public TextureRegion region;
public UnitBuild(){ public UnitBuildShader(){
super("unitbuild", "default"); super("unitbuild", "default");
} }
@@ -162,11 +166,11 @@ public class Shaders{
} }
} }
public static class BlockBuild extends LoadShader{ public static class BlockBuildShader extends LoadShader{
public float progress; public float progress;
public TextureRegion region = new TextureRegion(); public TextureRegion region = new TextureRegion();
public BlockBuild(){ public BlockBuildShader(){
super("blockbuild", "default"); super("blockbuild", "default");
} }

View File

@@ -8,7 +8,6 @@ import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.event.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
@@ -45,35 +44,41 @@ public class DesktopInput extends InputHandler{
public boolean deleting = false, shouldShoot = false, panning = false; public boolean deleting = false, shouldShoot = false, panning = false;
/** Mouse pan speed. */ /** Mouse pan speed. */
public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f; public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f;
/** Delta time between consecutive clicks. */
public long selectMillis = 0;
/** Previously selected tile. */
public Tile prevSelected;
boolean showHint(){
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() &&
(!isBuilding && !Core.settings.getBool("buildautopause") || player.unit().isBuilding() || !player.dead() && !player.unit().spawnedByCore());
}
@Override @Override
public void buildUI(Group group){ public void buildUI(Group group){
//respawn hints //building and respawn hints
group.fill(t -> { group.fill(t -> {
t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); t.color.a = 0f;
t.visible(() -> (t.color.a = Mathf.lerpDelta(t.color.a, Mathf.num(showHint()), 0.15f)) > 0.001f);
t.bottom(); t.bottom();
t.table(Styles.black6, b -> { t.table(Styles.black6, b -> {
StringBuilder str = new StringBuilder();
b.defaults().left(); b.defaults().left();
b.label(() -> Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())).style(Styles.outlineLabel); b.label(() -> {
}).margin(6f); if(!showHint()) return str;
}); str.setLength(0);
if(!isBuilding && !Core.settings.getBool("buildautopause") && !player.unit().isBuilding()){
//building hints str.append(Core.bundle.format("enablebuilding", Core.keybinds.get(Binding.pause_building).key.toString()));
group.fill(t -> { }else if(player.unit().isBuilding()){
t.bottom(); str.append(Core.bundle.format(isBuilding ? "pausebuilding" : "resumebuilding", Core.keybinds.get(Binding.pause_building).key.toString()))
t.visible(() -> { .append("\n").append(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString()))
t.color.a = Mathf.lerpDelta(t.color.a, player.unit().isBuilding() ? 1f : 0f, 0.15f); .append("\n").append(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString()));
}
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() && t.color.a > 0.01f; if(!player.dead() && !player.unit().spawnedByCore()){
}); str.append(str.length() != 0 ? "\n" : "").append(Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString()));
t.touchable(() -> t.color.a < 0.1f ? Touchable.disabled : Touchable.childrenOnly); }
t.table(Styles.black6, b -> { return str;
b.defaults().left(); }).style(Styles.outlineLabel);
b.label(() -> Core.bundle.format(!isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel);
b.row();
b.label(() -> Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel);
b.row();
b.label(() -> Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel);
}).margin(10f); }).margin(10f);
}); });
@@ -204,7 +209,6 @@ public class DesktopInput extends InputHandler{
if(input.keyDown(Binding.mouse_move)){ if(input.keyDown(Binding.mouse_move)){
panCam = true; panCam = true;
} }
panning = false;
Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(camSpeed)); Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(camSpeed));
}else if(!player.dead() && !panning){ }else if(!player.dead() && !panning){
@@ -489,13 +493,15 @@ public class DesktopInput extends InputHandler{
deleting = true; deleting = true;
}else if(selected != null){ }else if(selected != null){
//only begin shooting if there's no cursor event //only begin shooting if there's no cursor event
if(!tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !tileTapped(selected.build) && !player.unit().activelyBuilding() && !droppingItem && if(!tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !tileTapped(selected.build) && !player.unit().activelyBuilding() && !droppingItem
!tryBeginMine(selected) && player.unit().mineTile == null && !Core.scene.hasKeyboard()){ && !(tryStopMine(selected) || (!settings.getBool("doubletapmine") || selected == prevSelected && Time.timeSinceMillis(selectMillis) < 500) && tryBeginMine(selected)) && !Core.scene.hasKeyboard()){
player.shooting = shouldShoot; player.shooting = shouldShoot;
} }
}else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine }else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine
player.shooting = shouldShoot; player.shooting = shouldShoot;
} }
selectMillis = Time.millis();
prevSelected = selected;
}else if(Core.input.keyTap(Binding.deselect) && isPlacing()){ }else if(Core.input.keyTap(Binding.deselect) && isPlacing()){
block = null; block = null;
mode = none; mode = none;

View File

@@ -30,11 +30,10 @@ import mindustry.net.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.fragments.*; import mindustry.ui.fragments.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.*;
import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.ConstructBlock.*;
import mindustry.world.blocks.*;
import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.distribution.*;
import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.payloads.*;
import mindustry.world.blocks.power.*;
import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.blocks.storage.CoreBlock.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -68,6 +67,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
public Seq<BuildPlan> lineRequests = new Seq<>(); public Seq<BuildPlan> lineRequests = new Seq<>();
public Seq<BuildPlan> selectRequests = new Seq<>(); public Seq<BuildPlan> selectRequests = new Seq<>();
public InputHandler(){
Events.on(UnitDestroyEvent.class, e -> {
if(e.unit != null && e.unit.isPlayer() && e.unit.getPlayer().isLocal() && e.unit.type.weapons.contains(w -> w.bullet.killShooter)){
player.shooting = false;
}
});
}
//methods to override //methods to override
@Remote(called = Loc.server, unreliable = true) @Remote(called = Loc.server, unreliable = true)
@@ -763,7 +770,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Draw.reset(); Draw.reset();
Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime, 6f, 0.28f)); Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime, 6f, 0.28f));
Draw.alpha(1f); Draw.alpha(1f);
request.block.drawRequestConfigTop(request, selectRequests); request.block.drawRequestConfigTop(request, cons -> {
selectRequests.each(cons);
lineRequests.each(cons);
});
Draw.reset(); Draw.reset();
} }
@@ -859,6 +869,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
req.block = replace; req.block = replace;
} }
}); });
block.handlePlacementLine(lineRequests);
} }
} }
@@ -936,8 +948,24 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
/** Tries to begin mining a tile, returns true if successful. */ /** Tries to begin mining a tile, returns true if successful. */
boolean tryBeginMine(Tile tile){ boolean tryBeginMine(Tile tile){
if(canMine(tile)){ if(canMine(tile)){
//if a block is clicked twice, reset it player.unit().mineTile = tile;
player.unit().mineTile = player.unit().mineTile == tile ? null : tile; return true;
}
return false;
}
/** Tries to stop mining, returns true if mining was stopped. */
boolean tryStopMine(){
if(player.unit().mining()){
player.unit().mineTile = null;
return true;
}
return false;
}
boolean tryStopMine(Tile tile){
if(player.unit().mineTile == tile){
player.unit().mineTile = null;
return true; return true;
} }
return false; return false;

View File

@@ -71,6 +71,8 @@ public class MobileInput extends InputHandler implements GestureListener{
public Teamc target; public Teamc target;
/** Payload target being moved to. Can be a position (for dropping), or a unit/block. */ /** Payload target being moved to. Can be a position (for dropping), or a unit/block. */
public Position payloadTarget; public Position payloadTarget;
/** Unit last tapped, or null if last tap was not on a unit. */
public Unit unitTapped;
//region utility methods //region utility methods
@@ -314,6 +316,7 @@ public class MobileInput extends InputHandler implements GestureListener{
request.block.drawPlan(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(request.x, request.y, request.block.size, null) == null); request.block.drawPlan(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(request.x, request.y, request.block.size, null) == null);
drawSelected(request.x, request.y, request.block, Pal.accent); drawSelected(request.x, request.y, request.block, Pal.accent);
} }
lineRequests.each(this::drawOverRequest);
}else if(mode == breaking){ }else if(mode == breaking){
drawBreakSelection(lineStartX, lineStartY, tileX, tileY); drawBreakSelection(lineStartX, lineStartY, tileX, tileY);
} }
@@ -423,7 +426,7 @@ public class MobileInput extends InputHandler implements GestureListener{
@Override @Override
public void useSchematic(Schematic schem){ public void useSchematic(Schematic schem){
selectRequests.clear(); selectRequests.clear();
selectRequests.addAll(schematics.toRequests(schem, player.tileX(), player.tileY())); selectRequests.addAll(schematics.toRequests(schem, World.toTile(Core.camera.position.x), World.toTile(Core.camera.position.y)));
lastSchematic = schem; lastSchematic = schem;
} }
@@ -598,11 +601,7 @@ public class MobileInput extends InputHandler implements GestureListener{
//add to selection queue if it's a valid BREAK position //add to selection queue if it's a valid BREAK position
selectRequests.add(new BuildPlan(linked.x, linked.y)); selectRequests.add(new BuildPlan(linked.x, linked.y));
}else{ }else{
if(!canTapPlayer(worldx, worldy) && !tileTapped(linked.build)){ //control units
tryBeginMine(cursor);
}
//control units.
if(count == 2){ if(count == 2){
//reset payload target //reset payload target
payloadTarget = null; payloadTarget = null;
@@ -610,12 +609,20 @@ public class MobileInput extends InputHandler implements GestureListener{
if(!player.dead() && Mathf.within(worldx, worldy, player.unit().x, player.unit().y, player.unit().hitSize * 0.6f + 8f) && player.unit().type.commandLimit > 0){ if(!player.dead() && Mathf.within(worldx, worldy, player.unit().x, player.unit().y, player.unit().hitSize * 0.6f + 8f) && player.unit().type.commandLimit > 0){
Call.unitCommand(player); Call.unitCommand(player);
}else{ }else{
//control a unit/block //control a unit/block detected on first tap of double-tap
Unit on = selectedUnit(); if(unitTapped != null){
if(on != null){ Call.unitControl(player, unitTapped);
Call.unitControl(player, on); }else if(!tryBeginMine(cursor)){
tileTapped(linked.build);
} }
} }
return false;
}
unitTapped = selectedUnit();
//prevent mining if placing/breaking blocks
if(!tryStopMine() && !canTapPlayer(worldx, worldy) && !tileTapped(linked.build) && mode == none && !Core.settings.getBool("doubletapmine")){
tryBeginMine(cursor);
} }
} }

View File

@@ -6,22 +6,24 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.pooling.*; import arc.util.pooling.*;
import mindustry.entities.units.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.distribution.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class Placement{ public class Placement{
private final static Seq<Point2> tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>(); private static final Seq<BuildPlan> plans1 = new Seq<>();
private static final Seq<Point2> tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>();
private static final NormalizeResult result = new NormalizeResult(); private static final NormalizeResult result = new NormalizeResult();
private static final NormalizeDrawResult drawResult = new NormalizeDrawResult(); private static final NormalizeDrawResult drawResult = new NormalizeDrawResult();
private static Bresenham2 bres = new Bresenham2(); private static final Bresenham2 bres = new Bresenham2();
private static Seq<Point2> points = new Seq<>(); private static final Seq<Point2> points = new Seq<>();
//for pathfinding //for pathfinding
private static IntFloatMap costs = new IntFloatMap(); private static final IntFloatMap costs = new IntFloatMap();
private static IntIntMap parents = new IntIntMap(); private static final IntIntMap parents = new IntIntMap();
private static IntSet closed = new IntSet(); private static final IntSet closed = new IntSet();
/** Normalize a diagonal line into points. */ /** Normalize a diagonal line into points. */
public static Seq<Point2> pathfindLine(boolean conveyors, int startX, int startY, int endX, int endY){ public static Seq<Point2> pathfindLine(boolean conveyors, int startX, int startY, int endX, int endY){
@@ -75,7 +77,7 @@ public class Placement{
var base = tmpPoints2; var base = tmpPoints2;
var result = tmpPoints.clear(); var result = tmpPoints.clear();
base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation, false)); base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation));
boolean addedLast = false; boolean addedLast = false;
outer: outer:
@@ -100,12 +102,73 @@ public class Placement{
i ++; i ++;
} }
if(!addedLast) result.add(base.peek()); if(!addedLast && !base.isEmpty()) result.add(base.peek());
points.clear(); points.clear();
points.addAll(result); points.addAll(result);
} }
public static void calculateBridges(Seq<BuildPlan> plans, ItemBridge bridge){
//check for orthogonal placement + unlocked state
if(!(plans.first().x == plans.peek().x || plans.first().y == plans.peek().y || !bridge.unlockedNow())){
return;
}
Boolf<BuildPlan> placeable = plan -> (plan.placeable(player.team())) ||
(plan.tile() != null && plan.tile().block() == plan.block); //don't count the same block as inaccessible
var result = plans1.clear();
var team = player.team();
var rotated = plans.first().tile() != null && plans.first().tile().absoluteRelativeTo(plans.peek().x, plans.peek().y) == Mathf.mod(plans.first().rotation + 2, 4);
outer:
for(int i = 0; i < plans.size;){
var cur = plans.get(i);
result.add(cur);
//gap found
if(i < plans.size - 1 && placeable.get(cur) && !placeable.get(plans.get(i + 1))){
//find the closest valid position within range
for(int j = i + 1; j < plans.size; j++){
var other = plans.get(j);
//out of range now, set to current position and keep scanning forward for next occurrence
if(!bridge.positionsValid(cur.x, cur.y, other.x, other.y)){
//add 'missed' conveyors
for(int k = i + 1; k < j; k++){
result.add(plans.get(k));
}
i = j;
continue outer;
}else if(other.placeable(team)){
//found a link, assign bridges
cur.block = bridge;
other.block = bridge;
if(rotated){
other.config = new Point2(cur.x - other.x, cur.y - other.y);
}else{
cur.config = new Point2(other.x - cur.x, other.y - cur.y);
}
i = j;
continue outer;
}
}
//if it got here, that means nothing was found. this likely means there's a bunch of stuff at the end; add it and bail out
for(int j = i + 1; j < plans.size; j++){
result.add(plans.get(j));
}
break;
}else{
i ++;
}
}
plans.set(result);
}
private static float tileHeuristic(Tile tile, Tile other){ private static float tileHeuristic(Tile tile, Tile other){
Block block = control.input.block; Block block = control.input.block;

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