Compare commits

...

57 Commits
v122 ... v122.1

Author SHA1 Message Date
Anuken
8d10cafc99 Merge remote-tracking branch 'origin/master' 2020-12-29 19:48:36 -05:00
Anuken
6e1eedc1ab Cleanup 2020-12-29 19:48:30 -05:00
Thomas Widyantoko
f5ce75e962 yet another in_ID translation update (#4086)
* yet another in_ID translation update

* more id translate

Co-authored-by: Quick-Korc <68910156+Quick-korkc@users.noreply.github.com>
2020-12-29 17:40:59 -05:00
YellOw139
0d643a3ece [Bundle][RO] Translation update (#4115)
* [Bundle][RO] Translation update

This PR was tested in-game and is _**ready to merge at any time**_ (unless marked as draft).

Changelog:
- New strings/changes up to commit 43757a247e
- Typo fixes & various other improvements

* no
2020-12-29 17:40:22 -05:00
Vajda Simon
9632fc5f1f bundle_hu.properties (#4170)
I'am continue translating and adding lines to v6.
2020-12-29 17:39:55 -05:00
Sunny Kim
84bb3ee3de [KO] Small fix (#4133)
* why

* Update bundle_ko.properties
2020-12-29 17:39:19 -05:00
Anuken
83b20a90e6 Merge remote-tracking branch 'origin/master' 2020-12-29 11:40:57 -05:00
Anuken
f89f1e2346 critical fix 2020-12-29 11:40:53 -05:00
Sharlotte
cc6b0c328f update KO bundles (#3956)
* Update steam description for 6.0 update

* Update achievements.vdf

* oops.

* Update full_description.txt

* Update summary.txt

* add recent changelog

* Update bundle_ko.properties

* last update on this week

(well, sunday)

* upload android recent change-log
2020-12-29 10:44:19 -05:00
Catchears
e17bcd6a01 fix german translation for editor.unsaved (#4169) 2020-12-29 10:40:29 -05:00
Anuken
6357c17f8a Fixed #4164 / Fixed #4159 2020-12-29 10:13:27 -05:00
Anuken
add3fd9fb3 Merge remote-tracking branch 'origin/master' 2020-12-28 14:52:33 -05:00
Anuken
98e6303765 Bugfixes 2020-12-28 14:51:50 -05:00
Patrick 'Quezler' Mounier
0e1e399788 Draw reconstructor in region during placement & unconnected (#4143)
* Draw reconstructor in region during placement & unconnected

* Same as the previous commit, but for block loaders & unloaders
2020-12-28 12:23:06 -05:00
Patrick 'Quezler' Mounier
d84a36b8ee Block loader/unloader progress bar changes (#4138)
* Change block loader/unloader progess bar color & bundle

ammo -> items

* Make block unloader bar go down
2020-12-28 10:44:59 -05:00
Anuken
db40f154c5 Sector damage tweaks 2020-12-28 10:42:51 -05:00
Patrick 'Quezler' Mounier
e714d44a0e Return large launchpad item costs (#4134)
* Return large launchpad item costs

hidden -> debugonly

* Remove the 4 orange squares from the large launch pad

Leaving the lights and launchpod alignments alone since that is campaign only.
2020-12-28 09:38:58 -05:00
Patrick 'Quezler' Mounier
6eb604585b Removed packed sprite section from CONTRIBUTING.md (#4152) 2020-12-28 09:38:34 -05:00
alex
7555d43418 Update servers_v6.json (#4148)
changed the port number for our attack server.
sorry for the inconvenience, i don't have control over the port number of this "alexmindustryattac.ddns.net" hosted server.
2020-12-27 22:29:35 -05:00
Anuken
3ef67cab69 Fixed #4147 2020-12-27 20:41:29 -05:00
Anuken
72686b3ef8 Merge remote-tracking branch 'origin/master' 2020-12-27 16:20:17 -05:00
Anuken
990562dd71 Use sector preset name for maps if possible 2020-12-27 16:20:06 -05:00
Patrick 'Quezler' Mounier
2239ca6372 Remove 4 square blocks from the accelerator (#4139)
* Normalize rule comment line endings

Just so i can get a new patch-## branch where i can drag my accelerator sprite on since github isn't smart enough yet to see that as a possible pull request by itself.

* Add files via upload

* Add files via upload
2020-12-27 13:32:04 -05:00
Anuken
f174d1b2b4 Faster power graph reload / Fixed iOS editor margin 2020-12-27 12:59:49 -05:00
Anuken
a04e7d5612 Merge remote-tracking branch 'origin/master' 2020-12-27 10:16:39 -05:00
Anuken
16778ea16c Fixed #4141 / Fixed #4136 2020-12-27 10:16:34 -05:00
Sunny Kim
a606d9d85c bugfixes, call me the mother of the block forge (#4135)
(anuke is the father)
2020-12-27 10:04:19 -05:00
Sunny Kim
8d18649323 Block (un)loader major improvements (#4127)
* make it consider consVaild

* make this too

* pattern style and max block size

* Is there a better way to do this?

* Update BlockUnloader.java

* do not the /0

* prevent /0

* test 1

* yup it works for enabled
2020-12-26 22:10:37 -05:00
Anuken
c02d603a7a Search bar cleanup 2020-12-26 11:39:58 -05:00
DeltaNedas
8e4b35eb07 SearchBar class - add search bars to mods (#3267)
* Create SearchBar and make ModsDialog use it

* add search bar to servers

* Update core/src/mindustry/ui/SearchBar.java

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

* a

* fix mods menu not rowing

* remove search bar for remote servers

* h

* hide searchbar on landscape mobile

* anukes feedback

* Update core/src/mindustry/ui/SearchBar.java

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

* java dumb

Co-authored-by: Antsiferov Andrew <summet.dev@gmail.com>
Co-authored-by: Anuken <arnukren@gmail.com>
2020-12-26 11:22:11 -05:00
Anuken
fda9357b4b Fixed #4128 2020-12-26 09:49:03 -05:00
Anuken
4517b55f76 Building priority fix 2020-12-26 09:43:45 -05:00
Anuken
f014339dbc Don't render weather in full map screenshots 2020-12-25 21:51:25 -05:00
Anuken
9f8fce72d3 Better build beam visuals 2020-12-25 21:49:10 -05:00
Anuken
834e4f175b Fixed #4122 2020-12-25 15:56:53 -05:00
Anuken
bba52e99e0 Fixed #4121 2020-12-25 12:34:02 -05:00
Anuken
42d350f87f Merge remote-tracking branch 'origin/master' 2020-12-25 10:58:01 -05:00
Anuken
4339042078 Fixed #4120 2020-12-25 10:57:54 -05:00
Volas171
946bfa1bfd Update servers_v6.json (#4095)
* Update servers_v6.json

the ip changed to not make users confuse

* Update servers_v6.json
2020-12-25 10:13:38 -05:00
Anuken
f86291c587 Merge remote-tracking branch 'origin/master' 2020-12-25 01:26:24 -05:00
Anuken
da96b23441 Higher power source output 2020-12-25 01:26:20 -05:00
彭瑞暄
d2ae9cf809 Up-to-date zh-TW translations (#4083)
* Update bundle_zh_TW.properties

Corrected some machine translations. Modified some others for more clear understanding.

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

new translations 1

* Update bundle_zh_TW.properties

New translations 2

* Update bundle_zh_TW.properties

New translations 3

* New translations 1-3

Removed "zones" from v121.4: "Fixed sectors not auto-unlocking".
衝擊反應堆 -->動能反應爐

* New translations 1-4

* New translations 1-5

* New translations 1-6

up to line 1250

* Indexing finished. Translations 1-7

lines are now matching with English bundle.

* update bundle_zh_TW.properties

* edit zh_TW

* zh-tw

* community server disclaimer

* Finished sector descriptions, slight modifications

up to line 606

* zh-TW

* Many translations, include Always-on weather rule

* corrected missing character

* Update achievements.vdf

Oct not translated

* Update description.txt

* bundle_zh_TW.properties

* Bullet stats update, hints finished

* added line: public confirm really

* contributors

* Merging conflicts

Almost done...

* Synced

* Update ammo-stat translation

* Update contributors

* Unit names

* Update bundle_zh_TW.properties

* Unit names

* Update bundle_zh_TW.properties

* Review (#15)

* Update bundle_zh_TW.properties

* Unit names

* Update bundle_zh_TW.properties

* Finished

Please review

* minor correction

* minor correction

Hopefully there are no more "minor corrections" required.

* Review

* Close inspection

* Revisions, change chat mode

* Sapping Correction

Co-authored-by: simba-fs <simba.fs@gmail.com>
Co-authored-by: Simba-Fs <39305460+simba-fs@users.noreply.github.com>
2020-12-25 00:03:35 -05:00
Sunny Kim
beed2e0b8f Block Forge improvements (#4112)
* minBlockSize, maxBlockSize, icon

* removed fixed size

* same line

* revert to 3

* I almost forgot
2020-12-25 00:02:15 -05:00
Anuken
92e7cec198 Merge remote-tracking branch 'origin/master' 2020-12-24 23:17:42 -05:00
Anuken
eda6770e11 Fixed mined item flashing on clients 2020-12-24 23:17:35 -05:00
fuzzbuck
7cc3e23e9a typo (#4110) 2020-12-24 18:28:08 -05:00
fuzzbuck
7bf263fdfa add new io server (#4109)
soon to be up gamemode
2020-12-24 16:16:19 -05:00
Antsiferov Andrew
43757a247e [QoL] Chat modes (#3869)
Credits: Remint32 (idea); sk7725 (korean i18n); Volas171 (spanish i18n).
2020-12-24 16:05:41 -05:00
Anuken
1e8621d9d4 Merge remote-tracking branch 'origin/master' 2020-12-24 11:43:08 -05:00
Anuken
0940abe98c Fixed #4108 2020-12-24 11:43:04 -05:00
younggam
4a71564d03 mod version check fix (#4100)
* Update Version.java

* Update contributors
2020-12-24 10:36:55 -05:00
Patrick 'Quezler' Mounier
9397bd57c4 Prevents plastanium conveyor unload exploit (#4098)
* Prevent unloaders from unloading plast loading dock

* Use overridable boolean method unloadable instead

* unloadable -> canUnload
2020-12-24 10:33:40 -05:00
Patrick 'Quezler' Mounier
85a668c202 Prevent visual plastanium conveyor glitch when disabled (#4101) 2020-12-24 09:47:43 -05:00
Anuken
90372171b2 Fixed #4104 2020-12-24 09:44:24 -05:00
Anuken
2523088b4c Merge remote-tracking branch 'origin/master' 2020-12-23 20:39:25 -05:00
Anuken
f5c270347c Version parse fix 2020-12-23 14:37:39 -05:00
QmelZ
032b254e93 fix typo (#4093) 2020-12-23 14:28:58 -05:00
84 changed files with 1492 additions and 775 deletions

View File

@@ -15,9 +15,6 @@ If you are submitting a new block, make sure it has a name and description, and
If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*). If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*).
For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it. For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it.
### Do not include packed sprites in your pull request.
When making a pull request that changes or adds new sprites, do not add the modified atlas & `spritesX.png` files to your final pull request. These are a frequent source of conflicts.
## Style Guidelines ## Style Guidelines

View File

@@ -107,7 +107,7 @@ public class RemoteReadGenerator{
} }
readBlock.nextControlFlow("catch (java.lang.Exception e)"); readBlock.nextControlFlow("catch (java.lang.Exception e)");
readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to to read remote method '" + entry.element.getSimpleName() + "'!\", e)"); readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to read remote method '" + entry.element.getSimpleName() + "'!\", e)");
readBlock.endControlFlow(); readBlock.endControlFlow();
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@@ -89,6 +89,7 @@ joingame = Join Game
customgame = Custom Game customgame = Custom Game
newgame = New Game newgame = New Game
none = <none> none = <none>
none.found = [lightgray]<none found>
minimap = Minimap minimap = Minimap
position = Position position = Position
close = Close close = Close
@@ -917,6 +918,7 @@ keybind.toggle_menus.name = Toggle Menus
keybind.chat_history_prev.name = Chat History Prev keybind.chat_history_prev.name = Chat History Prev
keybind.chat_history_next.name = Chat History Next keybind.chat_history_next.name = Chat History Next
keybind.chat_scroll.name = Chat Scroll keybind.chat_scroll.name = Chat Scroll
keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Drop Unit keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom Minimap keybind.zoom_minimap.name = Zoom Minimap
mode.help.title = Description of modes mode.help.title = Description of modes

View File

@@ -420,7 +420,7 @@ editor.exportimage = Export in Terrainbild-Datei
editor.exportimage.description = Exportiere in ein Kartenbild editor.exportimage.description = Exportiere in ein Kartenbild
editor.loadimage = Bild\nladen editor.loadimage = Bild\nladen
editor.saveimage = Bild\nspeichern editor.saveimage = Bild\nspeichern
editor.unsaved = [crimson] Einige Änderungen wurden noch nicht gespeichert! [] Möchtest du den Editor wirklich verlassen? editor.unsaved = Möchtest du den Editor wirklich verlassen? [crimson] Alle ungespeicherten Änderungen werden dann verworfen!
editor.resizemap = Größe der Karte ändern editor.resizemap = Größe der Karte ändern
editor.mapname = Kartenname editor.mapname = Kartenname
editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte. editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte.

View File

@@ -915,6 +915,7 @@ keybind.toggle_menus.name = Ocultar menús
keybind.chat_history_prev.name = Historial de chat - Anterior keybind.chat_history_prev.name = Historial de chat - Anterior
keybind.chat_history_next.name = Historial de chat - Siguiente keybind.chat_history_next.name = Historial de chat - Siguiente
keybind.chat_scroll.name = Desplazar el chat keybind.chat_scroll.name = Desplazar el chat
keybind.chat_mode.name = Cambiar modo de chat
keybind.drop_unit.name = Soltar unidad keybind.drop_unit.name = Soltar unidad
keybind.zoom_minimap.name = Zoom del minimapa keybind.zoom_minimap.name = Zoom del minimapa
mode.help.title = Descripción de modos mode.help.title = Descripción de modos

File diff suppressed because it is too large Load Diff

View File

@@ -705,6 +705,7 @@ stat.commandlimit = Batas Perintah
stat.abilities = Kemampuan stat.abilities = Kemampuan
stat.canboost = Dapat dipercepat stat.canboost = Dapat dipercepat
stat.flying = Terbang stat.flying = Terbang
stat.ammouse = Penggunaan Amunisi
ability.forcefield = Bidang Kekuatan ability.forcefield = Bidang Kekuatan
ability.repairfield = Bidang Perbaikan ability.repairfield = Bidang Perbaikan
@@ -727,7 +728,6 @@ bar.powerlines = Sambungan: {0}/{1}
bar.items = Item: {0} bar.items = Item: {0}
bar.capacity = Kapasitas: {0} bar.capacity = Kapasitas: {0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled]
bar.liquid = Zat Cair bar.liquid = Zat Cair
bar.heat = Panas bar.heat = Panas
bar.power = Tenaga bar.power = Tenaga
@@ -744,6 +744,7 @@ bullet.sapping = [stat]sapping
bullet.homing = [stat]mengejar bullet.homing = [stat]mengejar
bullet.shock = [stat]mengkejut bullet.shock = [stat]mengkejut
bullet.frag = [stat]menyebar bullet.frag = [stat]menyebar
bullet.buildingdamage = [stat]{0}%[lightgray] kerusakan bangunan
bullet.knockback = [stat]{0}[lightgray] pantulan kembali bullet.knockback = [stat]{0}[lightgray] pantulan kembali
bullet.pierce = [stat]{0}[lightgray]x tembus bullet.pierce = [stat]{0}[lightgray]x tembus
bullet.infinitepierce = [stat]menembus bullet.infinitepierce = [stat]menembus
@@ -772,6 +773,7 @@ unit.items = item
unit.thousands = rb unit.thousands = rb
unit.millions = jt unit.millions = jt
unit.billions = m unit.billions = m
unit.pershot = /tembakan
category.purpose = Kegunaan category.purpose = Kegunaan
category.general = Umum category.general = Umum
category.power = Tenaga category.power = Tenaga
@@ -841,6 +843,7 @@ setting.bridgeopacity.name = Jelas-Beningnya Jembatan
setting.playerchat.name = Tunjukkan Pesan dalam Permainan setting.playerchat.name = Tunjukkan Pesan dalam Permainan
setting.showweather.name = Perlihatkan Cuaca setting.showweather.name = Perlihatkan Cuaca
public.confirm = Apakah kamu ingin mempublikasi permainanmu?\n[accent]Siapa saja bisa masuk ke permainanmu.\n[lightgray]Ini bisa diganti di Peraturan->Permainan->Visibilitas Game Publik. public.confirm = Apakah kamu ingin mempublikasi permainanmu?\n[accent]Siapa saja bisa masuk ke permainanmu.\n[lightgray]Ini bisa diganti di Peraturan->Permainan->Visibilitas Game Publik.
public.confirm.really = Jika kamu ingin bermain dengan temanmu, gunakan [green]Undang Teman[] daripada [scarlet]server publik[]!\nApakah kamu yakin ingin membuat permainanmu [scarlet]publik[]?
public.beta = Ingat bahwa game versi beta tidak dapat membuat lobi publik. public.beta = Ingat bahwa game versi beta tidak dapat membuat lobi publik.
uiscale.reset = Skala UI telah diubah.\nTekan "OK" untuk mengonfirmasi.\n[scarlet]Kembali dan keluar di[accent] {0}[] pengaturan... uiscale.reset = Skala UI telah diubah.\nTekan "OK" untuk mengonfirmasi.\n[scarlet]Kembali dan keluar di[accent] {0}[] pengaturan...
uiscale.cancel = Batal & Keluar uiscale.cancel = Batal & Keluar
@@ -963,6 +966,7 @@ rules.explosions = Kekuatan Ledakan Blok/Unit
rules.ambientlight = Sinar Disekeliling rules.ambientlight = Sinar Disekeliling
rules.weather = Cuaca rules.weather = Cuaca
rules.weather.frequency = Frekuensi: rules.weather.frequency = Frekuensi:
rules.weather.always = Selalu
rules.weather.duration = Durasi: rules.weather.duration = Durasi:
content.item.name = Item content.item.name = Item
@@ -1139,7 +1143,7 @@ block.overflow-gate.name = Gerbang Luap
block.underflow-gate.name = Gerbang Luap Terbalik block.underflow-gate.name = Gerbang Luap Terbalik
block.silicon-smelter.name = Pelebur Silikon block.silicon-smelter.name = Pelebur Silikon
block.phase-weaver.name = Pengrajut Phase block.phase-weaver.name = Pengrajut Phase
block.pulverizer.name = Pulverisator block.pulverizer.name = Penghancur
block.cryofluidmixer.name = Penyampur Cairan Dingin block.cryofluidmixer.name = Penyampur Cairan Dingin
block.melter.name = Pencair block.melter.name = Pencair
block.incinerator.name = Penghangus block.incinerator.name = Penghangus
@@ -1171,19 +1175,19 @@ block.power-void.name = Penghilang Tenaga
block.power-source.name = Sumber Tenaga block.power-source.name = Sumber Tenaga
block.unloader.name = Pembongkar Muatan block.unloader.name = Pembongkar Muatan
block.vault.name = Gudang block.vault.name = Gudang
block.wave.name = Wave block.wave.name = Penyemprot
block.tsunami.name = Tsunami block.tsunami.name = Tsunami
block.swarmer.name = Peluncur Misil block.swarmer.name = Peluncur Misil
block.salvo.name = Salvo block.salvo.name = Salvo
block.ripple.name = Ripple block.ripple.name = Mortir
block.phase-conveyor.name = Pengantar Berbahan Phase block.phase-conveyor.name = Pengantar Berbahan Phase
block.bridge-conveyor.name = Jembatan Pengantar block.bridge-conveyor.name = Jembatan Pengantar
block.plastanium-compressor.name = Kompresor Plastanium block.plastanium-compressor.name = Kompresor Plastanium
block.pyratite-mixer.name = Penyampur Pyratit block.pyratite-mixer.name = Penyampur Pyratit
block.blast-mixer.name = Penyampur Peledak block.blast-mixer.name = Penyampur Bahan Peledak
block.solar-panel.name = Panel Surya block.solar-panel.name = Panel Surya
block.solar-panel-large.name = Panel Surya Besar block.solar-panel-large.name = Panel Surya Besar
block.oil-extractor.name = Penggali Minyak block.oil-extractor.name = Pengekstrak Minyak
block.repair-point.name = Tempat Perbaikan block.repair-point.name = Tempat Perbaikan
block.pulse-conduit.name = Selang Denyut block.pulse-conduit.name = Selang Denyut
block.plated-conduit.name = Pipa Terlapis block.plated-conduit.name = Pipa Terlapis
@@ -1197,8 +1201,8 @@ block.thorium-reactor.name = Reaktor Thorium
block.mass-driver.name = Penggerak Massal block.mass-driver.name = Penggerak Massal
block.blast-drill.name = Bor Ledakan Udara block.blast-drill.name = Bor Ledakan Udara
block.thermal-pump.name = Pompa Suhu Panas block.thermal-pump.name = Pompa Suhu Panas
block.thermal-generator.name = Generator Suhu Panas block.thermal-generator.name = Generator Panas
block.alloy-smelter.name = Pelebur Paduan Listrik block.alloy-smelter.name = Pelebur Paduan Logam
block.mender.name = Mender block.mender.name = Mender
block.mend-projector.name = Mender Projektor block.mend-projector.name = Mender Projektor
block.surge-wall.name = Dinding Listrik block.surge-wall.name = Dinding Listrik
@@ -1206,21 +1210,20 @@ block.surge-wall-large.name = Dinding Listrik Besar
block.cyclone.name = Cyclone block.cyclone.name = Cyclone
block.fuse.name = Fuse block.fuse.name = Fuse
block.shock-mine.name = Ranjau Listrik block.shock-mine.name = Ranjau Listrik
block.overdrive-projector.name = Proyeksi Pencepat block.overdrive-projector.name = Projektor Pemercepat
block.force-projector.name = Proyeksi Medan Gaya block.force-projector.name = Projektor Pelindung
block.arc.name = Arc block.arc.name = Busur Petir
block.rtg-generator.name = Generator RTG block.rtg-generator.name = Generator Radiasi
block.spectre.name = Spectre block.spectre.name = Meriam Raksasa
block.meltdown.name = Meltdown block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Kontainer block.container.name = Kontainer
block.launch-pad.name = Alas Peluncur block.launch-pad.name = Alas Peluncur
block.launch-pad-large.name = Alas Peluncur Besar
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Pusat Perintah block.command-center.name = Pusat Perintah
block.ground-factory.name = Pabrik Angkatan Darat block.ground-factory.name = Pabrik Unit Darat
block.air-factory.name = Pabrik Angkatan Udara block.air-factory.name = Pabrik Unit Udara
block.naval-factory.name = Pabrik Angkatan Laut block.naval-factory.name = Pabrik Unit Laut
block.additive-reconstructor.name = Rekonstruktor Aditif block.additive-reconstructor.name = Rekonstruktor Aditif
block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatif block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatif
block.exponential-reconstructor.name = Rekonstruktor Eksponensial block.exponential-reconstructor.name = Rekonstruktor Eksponensial
@@ -1228,8 +1231,8 @@ block.tetrative-reconstructor.name = Rekonstruktor Tetratif
block.payload-conveyor.name = Pengantar Massa block.payload-conveyor.name = Pengantar Massa
block.payload-router.name = Pengarah Massa block.payload-router.name = Pengarah Massa
block.disassembler.name = Pembongkar block.disassembler.name = Pembongkar
block.silicon-crucible.name = Multi-Lebur block.silicon-crucible.name = Pelebur Raksasa
block.overdrive-dome.name = Kubah Proyeksi Percepat block.overdrive-dome.name = Kubah Projektor Pemercepat
#experimental, may be removed #experimental, may be removed
block.block-forge.name = Pemadu Blok block.block-forge.name = Pemadu Blok
block.block-loader.name = Pemuat Blok block.block-loader.name = Pemuat Blok
@@ -1312,10 +1315,10 @@ item.phase-fabric.description = Digunakan di elektronik canggih dan teknologi pe
item.surge-alloy.description = Digunakan di pertahanan yang lebih canggih dan struktur pertahanan reaktif. item.surge-alloy.description = Digunakan di pertahanan yang lebih canggih dan struktur pertahanan reaktif.
item.spore-pod.description = Digunakan untuk produksi minyak, bahan peledak dan bahan bakar. item.spore-pod.description = Digunakan untuk produksi minyak, bahan peledak dan bahan bakar.
item.spore-pod.details = Spora. Sepertinya bentuk kehidupan sintetis. Menghasilkan gas beracun yang meracuni kehidupan biologis lainnya. Sangat mudah menyebar. Sangat mudah terbakar dalam kondisi tertentu. item.spore-pod.details = Spora. Sepertinya bentuk kehidupan sintetis. Menghasilkan gas beracun yang meracuni kehidupan biologis lainnya. Sangat mudah menyebar. Sangat mudah terbakar dalam kondisi tertentu.
item.blast-compound.description = Senyawa yang digunakan di bom dan amunisi peledak. item.blast-compound.description = Senyawa yang digunakan sebagai bom dan amunisi peledak.
item.pyratite.description = Digunakan di senjata pembakar dan generator yang membutuhkan bahan mudah terbakar. item.pyratite.description = Digunakan di senjata pembakar dan generator yang membutuhkan bahan mudah terbakar.
liquid.water.description = Umumnya digunakan untuk mendinginkan mesin-mesin dan pendaur ulang. liquid.water.description = Umumnya digunakan untuk mendinginkan bor dan turret.
liquid.slag.description = Berbagai campuran tipe logam yang meleleh. Dapat dipisahkan menjadi mineral masing-masing, atau disemprotkan ke musuh sebagai senjata. liquid.slag.description = Berbagai campuran tipe logam yang meleleh. Dapat dipisahkan menjadi mineral masing-masing, atau disemprotkan ke musuh sebagai senjata.
liquid.oil.description = Digunakan di produksi material lanjutan dan sebagai amunisi yang mudah terbakar. liquid.oil.description = Digunakan di produksi material lanjutan dan sebagai amunisi yang mudah terbakar.
liquid.cryofluid.description = Digunakan sebagai pendingin di reaktor, turret, dan pabrik. liquid.cryofluid.description = Digunakan sebagai pendingin di reaktor, turret, dan pabrik.
@@ -1325,8 +1328,8 @@ block.armored-conveyor.description = Memindahkan barang sama cepatnya dengan pen
block.illuminator.description = Sebuah lampu kecil untuk menerangi daerah sekitar. Perlu listrik untuk bekerja. block.illuminator.description = Sebuah lampu kecil untuk menerangi daerah sekitar. Perlu listrik untuk bekerja.
block.message.description = Menyimpan pesan. Digunakan untuk komunikasi antar sekutu. block.message.description = Menyimpan pesan. Digunakan untuk komunikasi antar sekutu.
block.graphite-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit murni. block.graphite-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit murni.
block.multi-press.description = Versi pemadat grafit yang lebih bagus. Membutuhkan air dan tenaga untuk memproses batu bara lebih cepat dan efisien. block.multi-press.description = Versi pemadat grafit yang lebih bagus. Membutuhkan air sebagai pendingin.
block.silicon-smelter.description = Mengubah pasir dengan batu bara untuk memproduksi silikon. block.silicon-smelter.description = Melebur pasir dengan batu bara untuk memproduksi silikon.
block.kiln.description = Membakar pasir dan timah menjadi kaca meta. Membutuhkan tenaga. block.kiln.description = Membakar pasir dan timah menjadi kaca meta. Membutuhkan tenaga.
block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium. block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium.
block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir.
@@ -1399,18 +1402,18 @@ block.battery-large.description = Menyimpan lebih banyak tenaga daripada baterai
block.combustion-generator.description = Menghasilkan tenaga dengan membakar minyak atau bahan bakar. block.combustion-generator.description = Menghasilkan tenaga dengan membakar minyak atau bahan bakar.
block.thermal-generator.description = Menghasilkan tenaga disaat ditaruh di lokasi yang panas. block.thermal-generator.description = Menghasilkan tenaga disaat ditaruh di lokasi yang panas.
block.steam-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air. block.steam-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air.
block.differential-generator.description = Menghasilkan banyak sekali tenaga. Memanfaatkan perbedaan suhu dingin cairan pendingin dan suhu panas pyratite. block.differential-generator.description = Menghasilkan tenaga dalam jumlah banyak. Memanfaatkan perbedaan suhu dingin cairan pendingin dan suhu panas pyratite.
block.rtg-generator.description = Generator yang tidak membutuhkan pendiginan tetapi lebih memberi sedikit tenaga daripada reaktor thorium. block.rtg-generator.description = Generator yang tidak membutuhkan pendiginan tetapi lebih memberi sedikit tenaga daripada reaktor thorium.
block.solar-panel.description = Menghasilkan jumlah tenaga kecil dari matahari. block.solar-panel.description = Menghasilkan tenaga dalam jumlah kecil dari sinar matahari.
block.solar-panel-large.description = Menghasilkan lebih banyak tenaga dari panel surya biasa, tapi lebih mahal untuk dibangun. block.solar-panel-large.description = Menghasilkan lebih banyak tenaga dari panel surya biasa, tapi lebih mahal untuk dibangun.
block.thorium-reactor.description = Menghasilkan tenaga yang besar dari konsumsi thorium. Membutuhkan pendinginan konstan. Akan meledak jika tidak cukup pendingin . Pengeluaran tenaga tergantung kepenuhan. block.thorium-reactor.description = Menghasilkan tenaga yang besar dari konsumsi thorium. Membutuhkan pendinginan konstan. Akan meledak jika tidak cukup pendingin . Pengeluaran tenaga tergantung kepenuhan.
block.impact-reactor.description = Sebuah generator yang lebih maju, dapat menghasilkan tenaga dengan jumlah yang sangat banyak. Memerlukan tenaga untuk menyelakan reaktor terlebih dahulu. block.impact-reactor.description = Sebuah generator yang lebih maju, dapat menghasilkan tenaga dengan jumlah yang sangat banyak. Memerlukan tenaga untuk menyalakan reaktor terlebih dahulu.
block.mechanical-drill.description = Bor murah. Saat ditaruh ditempat yang sesuai, mengeluarkan item dengan pelan tanpa batas. block.mechanical-drill.description = Bor murah. Saat ditaruh ditempat yang sesuai, mengeluarkan item dengan pelan tanpa batas.
block.pneumatic-drill.description = Bor lebih cepat dari bor mekanik dan bisa memproses bahan lebih keras dengan menggunakan tekanan udara. block.pneumatic-drill.description = Bor lebih cepat dari bor mekanik dan bisa memproses bahan lebih keras dengan menggunakan tekanan udara.
block.laser-drill.description = Mengebor lebih cepat lewat teknologi laser, tapi membutuhkan tenaga. Bisa menambang thorium dengan bor ini. block.laser-drill.description = Mengebor lebih cepat lewat teknologi laser, tapi membutuhkan tenaga. Bisa menambang thorium dengan bor ini.
block.blast-drill.description = Bor tercanggih. Membutuhkan banyak tenaga. block.blast-drill.description = Bor tercanggih. Membutuhkan banyak tenaga.
block.water-extractor.description = Mengekstrak air dari tanah. Gunakan jika tidak ada sumber air disekitar. block.water-extractor.description = Mengekstrak air dari tanah. Gunakan jika tidak ada sumber air disekitar.
block.cultivator.description = Membudidaya spora kecil menjadi polong siap diolah. block.cultivator.description = Menumbuhkan konsentrasi spora yang kecil di atmosfer menjadi polong spora.
block.cultivator.details = Teknologi yang dipulihkan. Digunakan untuk memproduksi biomassa secara efesien. Kemungkinan merupakan inkubator awal dari spora yang sekarang menutupi Serpulo. block.cultivator.details = Teknologi yang dipulihkan. Digunakan untuk memproduksi biomassa secara efesien. Kemungkinan merupakan inkubator awal dari spora yang sekarang menutupi Serpulo.
block.oil-extractor.description = Menggunakan tenaga cukup besar untuk mengekstrak minyak dari pasir. Gunakan jika tidak ada sumber minyak disekitar. block.oil-extractor.description = Menggunakan tenaga cukup besar untuk mengekstrak minyak dari pasir. Gunakan jika tidak ada sumber minyak disekitar.
block.core-shard.description = Versi pertama dari pengulangan kapsul inti. Jika hancur, Semua kontak dengan daerah akan hilang. Jangan biarkan ini terjadi. block.core-shard.description = Versi pertama dari pengulangan kapsul inti. Jika hancur, Semua kontak dengan daerah akan hilang. Jangan biarkan ini terjadi.
@@ -1428,7 +1431,7 @@ block.scatter.description = Menembakkan gumpalan timah, rongsokan atau metaglass
block.scorch.description = Membakar musuh darat yang dekat dengannya. Sangat efektif dalam jarak dekat. block.scorch.description = Membakar musuh darat yang dekat dengannya. Sangat efektif dalam jarak dekat.
block.hail.description = Menembakkan peluru kecil ke musuh darat dari jarak jauh. block.hail.description = Menembakkan peluru kecil ke musuh darat dari jarak jauh.
block.wave.description = Menembakkan aliran cairan ke musuh. Secara otomatis memadamkan api saat disuplai dengan air. block.wave.description = Menembakkan aliran cairan ke musuh. Secara otomatis memadamkan api saat disuplai dengan air.
block.lancer.description = Mengisi dan menembakkan sinar energi yang kuat ke target darat. block.lancer.description = Memuat dan menembakkan sinar energi yang kuat ke target darat.
block.arc.description = Menembak petir ke musuh darat. block.arc.description = Menembak petir ke musuh darat.
block.swarmer.description = Menembakkan misil yang mengejar ke arah musuh. block.swarmer.description = Menembakkan misil yang mengejar ke arah musuh.
block.salvo.description = Menembakkan peluru cepat ke arah musuh. block.salvo.description = Menembakkan peluru cepat ke arah musuh.

View File

@@ -41,8 +41,7 @@ be.ignore = 무시
be.noupdates = 업데이트가 없습니다. be.noupdates = 업데이트가 없습니다.
be.check = 업데이트 확인 be.check = 업데이트 확인
mod.featured.title = 모드 탐색 mod.featured.dialog.title = 모드 탐색 (WIP)
mod.featured.dialog.title = 모드 탐색
mods.browser.selected = 선택된 모드 mods.browser.selected = 선택된 모드
mods.browser.add = 모드 설치 mods.browser.add = 모드 설치
mods.github.open = 깃허브 사이트 열기 mods.github.open = 깃허브 사이트 열기
@@ -90,6 +89,7 @@ joingame = 게임 참여
customgame = 사용자 지정 게임 customgame = 사용자 지정 게임
newgame = 새 게임 newgame = 새 게임
none = < 없음 > none = < 없음 >
none.found = [lightgray]< 찾을 수 없음 >
minimap = 미니맵 minimap = 미니맵
position = 위치 position = 위치
close = 닫기 close = 닫기
@@ -705,6 +705,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 = 수리 필드
@@ -727,7 +728,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 = 전력
@@ -737,21 +737,22 @@ bar.output = 출력
units.processorcontrol = [lightgray]프로세서 제어 중 units.processorcontrol = [lightgray]프로세서 제어 중
bullet.damage = 기본 피해량 : [stat]{0}[lightgray] bullet.damage = [stat]{0}[lightgray] 데미지
bullet.splashdamage = 범위 피해량 : [stat]{0}[lightgray] ~ [stat]{1}[lightgray] 타일 bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~ [stat] {1}[lightgray] 타일
bullet.incendiary = [stat]방화 bullet.incendiary = [stat]방화
bullet.sapping = [stat]흡혈 bullet.sapping = [stat]흡혈
bullet.homing = [stat]유도 bullet.homing = [stat]유도
bullet.shock = [stat]전격 bullet.shock = [stat]전격
bullet.frag = [stat]파편 bullet.frag = [stat]파편
bullet.knockback = 넉백 피해량 : [stat]{0}[lightgray] bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량
bullet.pierce = 관통 피해량 : [stat]{0}[lightgray] bullet.knockback = [stat]{0}[lightgray] 넉백
bullet.pierce = [stat]{0}[lightgray]배 관통
bullet.infinitepierce = [stat]관통 bullet.infinitepierce = [stat]관통
bullet.healpercent = 회복량 : [stat]{0}[lightgray]% / 1발 bullet.healpercent = [stat]{0}[lightgray]% 회복
bullet.freezing = [stat]빙결 bullet.freezing = [stat]빙결
bullet.tarred = [stat]타르 bullet.tarred = [stat]타르
bullet.multiplier = 탄약 소모량 : [stat]{0}[lightgray]개 / 1발 bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수
bullet.reload = 발사 속도 : [stat]{0}[lightgray] / s bullet.reload = [stat]{0}[lightgray]배 발사 속도
unit.blocks = 블록 unit.blocks = 블록
unit.blockssquared = 블록² unit.blockssquared = 블록²
@@ -767,11 +768,12 @@ unit.persecond = /초
unit.perminute = /분 unit.perminute = /분
unit.timesspeed = x 배 unit.timesspeed = x 배
unit.percent = % unit.percent = %
unit.shieldhealth = 방어막 체력 unit.shieldhealth = 보호막 체력
unit.items = 자원 unit.items = 자원
unit.thousands = k unit.thousands = k
unit.millions = m unit.millions = m
unit.billions = b unit.billions = b
unit.pershot = /발
category.purpose = 기능 / 목적 category.purpose = 기능 / 목적
category.general = 일반 category.general = 일반
category.power = 전력 category.power = 전력
@@ -841,6 +843,7 @@ setting.bridgeopacity.name = 터널 투명도
setting.playerchat.name = 채팅 말풍선 표시 setting.playerchat.name = 채팅 말풍선 표시
setting.showweather.name = 날씨 그래픽 표시 setting.showweather.name = 날씨 그래픽 표시
public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모든 플레이어가 게임에 참여할 수 있습니다.\n[lightgray]설정->게임->멀티플레이 공용 서버로 표시에서 나중에 변경할 수 있습니다.\n\n[sky]번역자 추가[]\n[accent]친구끼리 하려고 이 기능을 활성화 한 뒤에, 친구 외에 다른 플레이어가 들어왔을 때\n해당 플레이어를 차단하는 행위는 비매너를 넘어서는 얌체 행위 그 자체입니다.\n정말로 [scarlet]많은 다른 플레이어들이 오길 원한다[]면 확인하세요. public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모든 플레이어가 게임에 참여할 수 있습니다.\n[lightgray]설정->게임->멀티플레이 공용 서버로 표시에서 나중에 변경할 수 있습니다.\n\n[sky]번역자 추가[]\n[accent]친구끼리 하려고 이 기능을 활성화 한 뒤에, 친구 외에 다른 플레이어가 들어왔을 때\n해당 플레이어를 차단하는 행위는 비매너를 넘어서는 얌체 행위 그 자체입니다.\n정말로 [scarlet]많은 다른 플레이어들이 오길 원한다[]면 확인하세요.
public.confirm.really = [red]친구하고 플레이 하고 싶으면 [scarlet]공용 서버[] 대신에 [green]친구 초대[] 를 사용하세요. 정말로 [scarlet]공용 서버[] 를 열겠습니까?[]
public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다.
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다...
uiscale.cancel = 취소 후 나가기 uiscale.cancel = 취소 후 나가기
@@ -915,6 +918,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 = 대화 대상 변경
keybind.drop_unit.name = 유닛 떨구기 keybind.drop_unit.name = 유닛 떨구기
keybind.zoom_minimap.name = 미니맵 확대 keybind.zoom_minimap.name = 미니맵 확대
mode.help.title = 모드 설명 mode.help.title = 모드 설명
@@ -963,6 +967,7 @@ rules.explosions = 블록/유닛 폭발 데미지
rules.ambientlight = 자연 조명 rules.ambientlight = 자연 조명
rules.weather = 날씨 rules.weather = 날씨
rules.weather.frequency = 빈도: rules.weather.frequency = 빈도:
rules.weather.always = 항상
rules.weather.duration = 지속 시간: rules.weather.duration = 지속 시간:
content.item.name = 자원 content.item.name = 자원
@@ -1231,9 +1236,9 @@ block.disassembler.name = 광재 분해기
block.silicon-crucible.name = 실리콘 도가니 block.silicon-crucible.name = 실리콘 도가니
block.overdrive-dome.name = 대형 과부하 프로젝터 block.overdrive-dome.name = 대형 과부하 프로젝터
#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들입니다. #experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들입니다.
block.block-forge.name = [테스트] 공장 블록 block.block-forge.name = 블록 제작대
block.block-loader.name = [테스트] 로더 블록 block.block-loader.name = 블록 로더
block.block-unloader.name = [테스트] 언로더 블록 block.block-unloader.name = 블록 언로더
block.interplanetary-accelerator.name = 성간 코어 가속기 block.interplanetary-accelerator.name = 성간 코어 가속기
block.switch.name = 스위치 block.switch.name = 스위치

View File

@@ -41,6 +41,12 @@ 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
mod.featured.dialog.title = Mod Browser (Neterminat)
mods.browser.selected = Mod selectat
mods.browser.add = Instalează
mods.github.open = Vezi
schematic = Schemă schematic = Schemă
schematic.add = Salvează Schema... schematic.add = Salvează Schema...
schematics = Scheme schematics = Scheme
@@ -83,6 +89,7 @@ loadgame = Încarcă Jocul
joingame = Intră în Joc joingame = Intră în Joc
customgame = Personalizat customgame = Personalizat
newgame = Joc Nou newgame = Joc Nou
none.found = [lightgray]<nu s-a găsit nimic>
none = <nimic> none = <nimic>
minimap = Minihartă minimap = Minihartă
position = Poziție position = Poziție
@@ -912,6 +919,7 @@ keybind.toggle_menus.name = Pornește/Oprește Meniuri
keybind.chat_history_prev.name = Istoric Chat Înapoi keybind.chat_history_prev.name = Istoric Chat Înapoi
keybind.chat_history_next.name = Istoric Chat Mai Departe keybind.chat_history_next.name = Istoric Chat Mai Departe
keybind.chat_scroll.name = Scroll Chat keybind.chat_scroll.name = Scroll Chat
keybind.chat_mode.name = Schimbă Modul Chatului
keybind.drop_unit.name = Lasă Unitatea keybind.drop_unit.name = Lasă Unitatea
keybind.zoom_minimap.name = Zoom Minihartă keybind.zoom_minimap.name = Zoom Minihartă
mode.help.title = Descrierea modurilor mode.help.title = Descrierea modurilor

View File

@@ -918,6 +918,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 = Описание режимов

View File

@@ -13,15 +13,18 @@ link.google-play.description = Google Play 商店頁面
link.f-droid.description = F-Droid 目錄頁面 link.f-droid.description = F-Droid 目錄頁面
link.wiki.description = 官方 Mindustry 維基 link.wiki.description = 官方 Mindustry 維基
link.suggestions.description = 建議新功能 link.suggestions.description = 建議新功能
link.bug.description = 找到臭蟲?在這裡回報
linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。
screenshot = 截圖儲存到{0} screenshot = 截圖儲存到{0}
screenshot.invalid = 地圖太大了,可能沒有足夠的記憶體用於截圖。 screenshot.invalid = 地圖太大了,可能沒有足夠的記憶體用於截圖。
gameover = 遊戲結束 gameover = 遊戲結束
gameover.disconnect = 斷線
gameover.pvp = [accent]{0}[]隊獲勝! gameover.pvp = [accent]{0}[]隊獲勝!
gameover.waiting = [accent]等待下一張地圖中……
highscore = [accent]新的高分紀錄! highscore = [accent]新的高分紀錄!
copied = 已複製。 copied = 已複製。
indev.popup = [accent]v6[] 目前仍在 in [accent]alpha[]。\n[lightgray]這代表了:[]\n[scarlet]- 戰役尚未完成[]\n- 部份內容遺失\n - 大多數的 [scarlet]單位 AI[] 無法正常運作\n- 許多單位仍未完成\n- 您看到的所有內容均可能變更或移除。\n\n請在 [accent]Github[] 上回報臭蟲或當機。
indev.notready = 這部份的遊戲尚未完成 indev.notready = 這部份的遊戲尚未完成
indev.campaign = [accent]恭喜你完成戰役了![]\n\n這是截至目前的遊戲內容。星際旅行會在未來的更新加入遊戲~
load.sound = 音效載入中 load.sound = 音效載入中
load.map = 地圖載入中 load.map = 地圖載入中
@@ -38,6 +41,11 @@ be.ignore = 忽略
be.noupdates = 沒有新的更新。 be.noupdates = 沒有新的更新。
be.check = 檢查是否有新的更新 be.check = 檢查是否有新的更新
mod.featured.dialog.title = 模組瀏覽器 (尚未完成)
mods.browser.selected = 已選模組
mods.browser.add = 安裝
mods.github.open = 查看
schematic = 藍圖 schematic = 藍圖
schematic.add = 儲存藍圖…… schematic.add = 儲存藍圖……
schematics = 藍圖 schematics = 藍圖
@@ -57,6 +65,7 @@ schematic.rename = 重新命名藍圖
schematic.info = {0}x{1}, {2}方塊 schematic.info = {0}x{1}, {2}方塊
schematic.disabled = [scarlet]藍圖被進用[]\n你不能在這個[accent]地圖[] 或 [accent]伺服器中使用藍圖. schematic.disabled = [scarlet]藍圖被進用[]\n你不能在這個[accent]地圖[] 或 [accent]伺服器中使用藍圖.
stats = 統計
stat.wave = 打敗的波次:[accent]{0} stat.wave = 打敗的波次:[accent]{0}
stat.enemiesDestroyed = 摧毀的敵人:[accent]{0} stat.enemiesDestroyed = 摧毀的敵人:[accent]{0}
stat.built = 建設的建築:[accent]{0} stat.built = 建設的建築:[accent]{0}
@@ -115,7 +124,7 @@ mod.disable = 禁用
mod.content = 內容: mod.content = 內容:
mod.delete.error = 無法刪除模組,檔案可能在使用中。 mod.delete.error = 無法刪除模組,檔案可能在使用中。
mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0} mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0}
mod.outdated = [scarlet]與 V6 不相容(無 最低遊戲版本: 105 mod.outdated = [scarlet]與 V6 不相容(無 最低遊戲版本105
mod.missingdependencies = [scarlet]缺少依賴關係:{0} mod.missingdependencies = [scarlet]缺少依賴關係:{0}
mod.erroredcontent = [scarlet]內容錯誤 mod.erroredcontent = [scarlet]內容錯誤
mod.errors = 載入內容時發生錯誤 mod.errors = 載入內容時發生錯誤
@@ -143,8 +152,12 @@ planetmap = 星球地圖
launchcore = 發射核心 launchcore = 發射核心
filename = 檔案名稱︰ filename = 檔案名稱︰
unlocked = 已解鎖新內容! unlocked = 已解鎖新內容!
available = 可研究新科技!
completed = [accent]完成 completed = [accent]完成
techtree = 科技樹 techtree = 科技樹
research.legacy = [accent]5.0[] 偵測到舊有科技資料。\n請問要[accent]載入[]資料,還是[accent]放棄[]並重置新戰役的科技樹(建議)
research.load = 載入
research.discard = 放棄
research.list = [lightgray]研究︰ research.list = [lightgray]研究︰
research = 研究 research = 研究
researched = [lightgray]{0}研究完成。 researched = [lightgray]{0}研究完成。
@@ -189,6 +202,11 @@ servers.local = 區域伺服器
servers.remote = 遠端伺服器 servers.remote = 遠端伺服器
servers.global = 社群伺服器 servers.global = 社群伺服器
servers.disclaimer = 社群伺服器[accent]不是[]由開發者擁有或管理。\n\n伺服器可能會出現由其他玩家製作的不適當內容。
servers.showhidden = 顯示被隱藏的伺服器
server.shown = 已顯示
server.hidden = 已隱藏
trace = 追蹤玩家 trace = 追蹤玩家
trace.playername = 玩家名稱:[accent]{0} trace.playername = 玩家名稱:[accent]{0}
trace.ip = IP[accent]{0} trace.ip = IP[accent]{0}
@@ -222,6 +240,7 @@ disconnect.timeout = 連線逾時。
disconnect.data = 無法載入地圖資料! disconnect.data = 無法載入地圖資料!
cantconnect = 無法加入遊戲 ([accent]{0}[]). cantconnect = 無法加入遊戲 ([accent]{0}[]).
connecting = [accent]連線中…… connecting = [accent]連線中……
reconnecting = [accent]重新連接中……
connecting.data = [accent]地圖資料載入中…… connecting.data = [accent]地圖資料載入中……
server.port = 連接埠: server.port = 連接埠:
server.addressinuse = 該位置已被使用! server.addressinuse = 該位置已被使用!
@@ -245,16 +264,16 @@ save.rename.text = 新名稱:
selectslot = 選取一個存檔。 selectslot = 選取一個存檔。
slot = [accent]存檔{0} slot = [accent]存檔{0}
editmessage = 編輯訊息 editmessage = 編輯訊息
save.corrupted = [accent]此存檔無效或已損毀!\n如果你剛剛升級了遊戲那麼這可能是因為存檔格式改變了而[scarlet]不是[]錯誤。 save.corrupted = 此存檔無效或已損毀!
empty = 〈空白〉 empty = 〈空白〉
on = 開啟 on = 開啟
off = 關閉 off = 關閉
save.autosave = 自動存檔:{0} save.autosave = 自動存檔:{0}
save.map = 地圖:{0} save.map = 地圖:{0}
save.wave = 波次:{0} save.wave = 波次:{0}
save.mode = 遊戲模式: {0} save.mode = 遊戲模式{0}
save.date = 最後存檔時間:{0} save.date = 最後存檔時間:{0}
save.playtime = 遊玩時間:{0} save.playtime = 遊玩時間{0}
warning = 警告。 warning = 警告。
confirm = 確認 confirm = 確認
delete = 刪除 delete = 刪除
@@ -267,6 +286,9 @@ cancel = 取消
openlink = 開啟連結 openlink = 開啟連結
copylink = 複製連結 copylink = 複製連結
back = 返回 back = 返回
crash.export = 匯出當機報告。
crash.none = 無當機報告。
crash.exported = 已匯出當機報告。
data.export = 匯出數據 data.export = 匯出數據
data.import = 匯入數據 data.import = 匯入數據
data.openfolder = 開啟檔案資料夾 data.openfolder = 開啟檔案資料夾
@@ -283,6 +305,7 @@ cancelbuilding = [accent][[{0}][]清除計畫
selectschematic = [accent][[{0}][]選擇並複製 selectschematic = [accent][[{0}][]選擇並複製
pausebuilding = [accent][[{0}][]暫停建造 pausebuilding = [accent][[{0}][]暫停建造
resumebuilding = [scarlet][[{0}][]繼續建造 resumebuilding = [scarlet][[{0}][]繼續建造
showui = 已隱藏介面。\n按[accent][[{0}][]顯示介面。
wave = [accent]第{0}波 wave = [accent]第{0}波
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]Wave {0}/{1}
wave.waiting = [lightgray]將於{0}秒後抵達 wave.waiting = [lightgray]將於{0}秒後抵達
@@ -290,9 +313,11 @@ wave.waveInProgress = [lightgray]波次進行中
waiting = [lightgray]等待中…… waiting = [lightgray]等待中……
waiting.players = 等待玩家中…… waiting.players = 等待玩家中……
wave.enemies = [lightgray]剩下{0}個敵人 wave.enemies = [lightgray]剩下{0}個敵人
wave.enemycores = [accent]{0}[lightgray]個敵方核心
wave.enemycore = [accent]{0}[lightgray]個敵方核心
wave.enemy = [lightgray]剩下{0}個敵人 wave.enemy = [lightgray]剩下{0}個敵人
wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. wave.guardianwarn = 頭目將在[accent]{0}[]波後抵達。
wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. wave.guardianwarn.one = 頭目將在[accent]{0}[]波後抵達。
loadimage = 載入圖片 loadimage = 載入圖片
saveimage = 儲存圖片 saveimage = 儲存圖片
unknown = 未知 unknown = 未知
@@ -305,7 +330,7 @@ map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯
map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[scarlet]紅色[]的核心。 map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[scarlet]紅色[]的核心。
map.invalid = 地圖載入錯誤:地圖可能已經損毀。 map.invalid = 地圖載入錯誤:地圖可能已經損毀。
workshop.update = 更新項目 workshop.update = 更新項目
workshop.error = 擷取工作坊詳細資訊時出錯: {0} workshop.error = 擷取工作坊詳細資訊時出錯{0}
map.publish.confirm = 您確定要發布此地圖嗎?\n\n[lightgray]首先請先確定您同意 Steam 工作坊的 EULA否則您的地圖將不會顯示 map.publish.confirm = 您確定要發布此地圖嗎?\n\n[lightgray]首先請先確定您同意 Steam 工作坊的 EULA否則您的地圖將不會顯示
workshop.menu = 選擇您要對此項目執行的動作。 workshop.menu = 選擇您要對此項目執行的動作。
workshop.info = 項目資訊 workshop.info = 項目資訊
@@ -317,17 +342,17 @@ publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意 W
publish.error = 發佈項目時發生問題:{0} publish.error = 發佈項目時發生問題:{0}
steam.error = Steam 服務初始化失敗。\n錯誤{0} steam.error = Steam 服務初始化失敗。\n錯誤{0}
editor.brush = editor.brush =
editor.openin = 在編輯器中開啟 editor.openin = 在編輯器中開啟
editor.oregen = 礦石生成 editor.oregen = 礦石生成
editor.oregen.info = 礦石生成: editor.oregen.info = 礦石生成:
editor.mapinfo = 地圖資訊 editor.mapinfo = 地圖資訊
editor.author = 作者: editor.author = 作者:
editor.description = 描述: editor.description = 描述:
editor.nodescription = 在地圖發佈前必須有至少四個字以上的述。 editor.nodescription = 在地圖發佈前必須有至少四個字以上的述。
editor.waves = 波次: editor.waves = 波次:
editor.rules = 規則: editor.rules = 規則:
editor.generation = 篩選器: editor.generation = 自動生成:
editor.ingame = 在遊戲中編輯 editor.ingame = 在遊戲中編輯
editor.publish.workshop = 在工作坊上發佈 editor.publish.workshop = 在工作坊上發佈
editor.newmap = 新地圖 editor.newmap = 新地圖
@@ -335,21 +360,22 @@ editor.center = 中心
workshop = 工作坊 workshop = 工作坊
waves.title = 波次 waves.title = 波次
waves.remove = 移除 waves.remove = 移除
waves.never = 〈永 waves.never = 〈永
waves.every = waves.every =
waves.waves = 波次 waves.waves = 波次
waves.perspawn = 每次生成 waves.perspawn = 每次生成
waves.shields = 護盾/波次 waves.shields = 護盾/波次
waves.to = waves.to =
waves.guardian = 守衛者 waves.guardian = 頭目
waves.preview = 預覽 waves.preview = 預覽
waves.edit = 編輯…… waves.edit = 編輯……
waves.copy = 複製到剪貼簿 waves.copy = 複製到剪貼簿
waves.load = 從剪貼簿載入 waves.load = 從剪貼簿載入
waves.invalid = 剪貼簿中的波次無效。 waves.invalid = 剪貼簿中的波次無效。
waves.copied = 波次已複製。 waves.copied = 波次已複製。
waves.none = 無自訂敵人。\n請注意佈局將自動替換為預設佈局。 waves.none = 無自訂敵人。\n請注意若沒有波次佈局將自動替換為預設佈局。
#校正用空行
wavemode.counts = 數量 wavemode.counts = 數量
wavemode.totals = 總數 wavemode.totals = 總數
wavemode.health = 生命值 wavemode.health = 生命值
@@ -361,8 +387,8 @@ editor.name = 名稱:
editor.spawn = 重生單位 editor.spawn = 重生單位
editor.removeunit = 移除單位 editor.removeunit = 移除單位
editor.teams = 隊伍 editor.teams = 隊伍
editor.errorload = 載入檔案時發生問題\n[accent]{0} editor.errorload = 載入檔案時發生問題
editor.errorsave = 儲存檔案時發生問題\n[accent]{0} editor.errorsave = 儲存檔案時發生問題
editor.errorimage = 這是圖片檔,而非地圖。不要試圖修改副檔名讓它可以使用。\n\n如果要匯入地形圖片檔請使用編輯器中的「匯入地形圖片檔」按鈕。 editor.errorimage = 這是圖片檔,而非地圖。不要試圖修改副檔名讓它可以使用。\n\n如果要匯入地形圖片檔請使用編輯器中的「匯入地形圖片檔」按鈕。
editor.errorlegacy = 此地圖太舊,並使用不支援的舊地圖格式。 editor.errorlegacy = 此地圖太舊,並使用不支援的舊地圖格式。
editor.errornot = 這不是地圖檔。 editor.errornot = 這不是地圖檔。
@@ -462,6 +488,8 @@ load = 載入
save = 儲存 save = 儲存
fps = FPS{0} fps = FPS{0}
ping = 延遲:{0}毫秒 ping = 延遲:{0}毫秒
memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = 請重新啟動遊戲以使選取的語言生效。 language.restart = 請重新啟動遊戲以使選取的語言生效。
settings = 設定 settings = 設定
tutorial = 教學 tutorial = 教學
@@ -476,31 +504,28 @@ complete = [lightgray]完成:
requirement.wave = 在{1}到達第{0}波 requirement.wave = 在{1}到達第{0}波
requirement.core = 在{0}摧毀敵人核心 requirement.core = 在{0}摧毀敵人核心
requirement.research = 研究 {0} requirement.research = 研究 {0}
requirement.produce = 生產 {0}
requirement.capture = 捕獲 {0} requirement.capture = 捕獲 {0}
bestwave = [lightgray]最高波次:{0} bestwave = [lightgray]最高波次:{0}
launch.text = 發射 launch.text = 發射
research.multiplayer = 只有管理者可以使用這個物品 research.multiplayer = 只有管理者可以使用這個物品
uncover = 探索 uncover = 探索
configure = 設定 configure = 設定
loadout = 裝載 loadout = 裝載
resources = 資源 resources = 資源
bannedblocks = 停用方塊 bannedblocks = 停用方塊
addall = 全部加入 addall = 全部加入
launch.from = 發射來源:[accent]{0}
launch.destination = 目的地:{0} launch.destination = 目的地:{0}
configure.invalid = 數值必須介於 0 到 {0}。 configure.invalid = 數值必須介於 0 到 {0}。
zone.unlocked = [lightgray]{0}已解鎖。
zone.requirement.complete = 到達波次{0}\n滿足{1}區域要求。
zone.resources = [lightgray]檢測到的資源:
zone.objective = [lightgray]目標: [accent]{0}
zone.objective.survival = 生存
zone.objective.attack = 摧毀敵人核心
add = 新增…… add = 新增……
boss.health = 頭目血量 boss.health = 頭目血量
connectfail = [crimson]伺服器連線錯誤:[accent]{0} connectfail = [scarlet]伺服器連線錯誤:\n\n[accent]{0}
error.unreachable = 無法連線到伺服器。請確認位置是否正確? error.unreachable = 無法連線到伺服器。請確認拼字是否正確?
error.invalidaddress = 無效的位置 error.invalidaddress = 無效的網址
error.timedout = 連線逾時!\n確保伺服器設置了連接埠轉發且位置正確! error.timedout = 連線逾時!\n確保伺服器設置了連接埠轉發且網址正確!
error.mismatch = 封包錯誤:\n客戶端/伺服器版本可能不相符。\n確保客戶端和伺服器都有最新版本的 Mindustry error.mismatch = 封包錯誤:\n客戶端/伺服器版本可能不相符。\n確保客戶端和伺服器都有最新版本的 Mindustry
error.alreadyconnected = 已連線。 error.alreadyconnected = 已連線。
error.mapnotfound = 找不到地圖! error.mapnotfound = 找不到地圖!
@@ -517,28 +542,56 @@ weather.fog.name = 霧
sectors.unexplored = [lightgray]未探索 sectors.unexplored = [lightgray]未探索
sectors.resources = 資源: sectors.resources = 資源:
sectors.production = 生產: sectors.production = 生產:
sectors.export = 出口:
sectors.time = 佔領時間:
sectors.threat = 危險性:
sectors.wave = 波次:
sectors.stored = 儲存: sectors.stored = 儲存:
sectors.resume = 繼續 sectors.resume = 繼續
sectors.launch = 發射 sectors.launch = 發射
sectors.select = 選取 sectors.select = 選取
sectors.nonelaunch = [lightgray]無(太陽) sectors.nonelaunch = [lightgray]無(太陽)
sectors.rename = 重新命名區域 sectors.rename = 重新命名區域
sectors.enemybase = [scarlet]敵方基地
sectors.vulnerable = [scarlet]易受攻擊
sectors.underattack = [scarlet]敵軍來襲! [accent]{0}% 受損
sectors.survives = [accent]存活 {0} 波次
sectors.go = 進入
sector.curcapture = 已佔領地區
sector.curlost = 已失去該地區
sector.missingresources = [scarlet]核心資源不足 sector.missingresources = [scarlet]核心資源不足
sector.attacked = 地區 [accent]{0}[white] 遭受攻擊!
sector.lost = 地區 [accent]{0}[white] 戰敗!
#note: 校正用空行
sector.captured = 成功佔領地區[accent]{0}[white]
planet.serpulo.name = Serpulo threat.low =
threat.medium =
threat.high =
threat.extreme = 極高
threat.eradication = 毀滅性
planets = 行星
planet.serpulo.name = 蕈孢星
planet.sun.name = 太陽 planet.sun.name = 太陽
sector.impact0078.name = 衝擊0078
sector.groundZero.name = 原點 sector.groundZero.name = 原點
sector.craters.name = 火山島 sector.craters.name = 隕石坑
sector.frozenForest.name = 冰封森林 sector.frozenForest.name = 冰封森林
sector.ruinousShores.name = 廢墟海岸 sector.ruinousShores.name = 廢墟海岸
sector.stainedMountains.name = 彩繪山 sector.stainedMountains.name = 多色山脈
sector.desolateRift.name = 荒谷 sector.desolateRift.name = 荒谷
sector.nuclearComplex.name = 核能生產複合體 sector.nuclearComplex.name = 核能電網
sector.overgrowth.name = 雜草叢生 sector.overgrowth.name = 雜草叢生
sector.tarFields.name = 油田 sector.tarFields.name = 油田
sector.saltFlats.name = 鹽灘 sector.saltFlats.name = 鹽灘
sector.fungalPass.name = 真菌橫行 sector.fungalPass.name = 真菌走廊
sector.biomassFacility.name = 生物質合成工廠
sector.windsweptIslands.name = 風之島
sector.extractionOutpost.name = 萃取哨站
sector.planetaryTerminal.name = 星際發射站
sector.groundZero.description = 再次開始的最佳位置。敵人威脅程度低。資源少。\n盡可能地採集鉛與銅。\n繼續前進。 sector.groundZero.description = 再次開始的最佳位置。敵人威脅程度低。資源少。\n盡可能地採集鉛與銅。\n繼續前進。
sector.frozenForest.description = 即使是在如此靠近山脈的地方,孢子也已經擴散了。如此低溫也無法永遠遏止它們。\n\n開始冒險發電。建造火力發電機。並學習使用修理單位。 sector.frozenForest.description = 即使是在如此靠近山脈的地方,孢子也已經擴散了。如此低溫也無法永遠遏止它們。\n\n開始冒險發電。建造火力發電機。並學習使用修理單位。
@@ -551,6 +604,11 @@ sector.tarFields.description = 產油區的外圍,在山脈與沙漠之間。
sector.desolateRift.description = 非常危險的區域。資源豐富,但空間狹小。有高破壞風險。盡快離開。不要被敵人的攻擊間距太長而被愚弄。 sector.desolateRift.description = 非常危險的區域。資源豐富,但空間狹小。有高破壞風險。盡快離開。不要被敵人的攻擊間距太長而被愚弄。
sector.nuclearComplex.description = 曾是釷的生產與加工設施,但現在已成廢墟。\n[lightgray]研究釷及其許多用途。\n\n敵人非常多不斷搜尋可攻擊的對象。 sector.nuclearComplex.description = 曾是釷的生產與加工設施,但現在已成廢墟。\n[lightgray]研究釷及其許多用途。\n\n敵人非常多不斷搜尋可攻擊的對象。
sector.fungalPass.description = 高山與滿是孢子的低谷間的過渡區域。這裡有敵人的小型偵察基地。\n摧毀它。\n使用匕首機甲與爬行機甲。拿下兩個核心。 sector.fungalPass.description = 高山與滿是孢子的低谷間的過渡區域。這裡有敵人的小型偵察基地。\n摧毀它。\n使用匕首機甲與爬行機甲。拿下兩個核心。
sector.biomassFacility.description = 「孢子」的發源地。這項設施是過去研究和生產該生物質的地方。\n研究遺留於此的技術。培養孢子以加工成燃料和聚合物。\n\n[lightgray]在設施損毀後,孢子散播了出去。面對如此強勢的外來種,當地生態系中沒有任何物種能與之匹敵……
sector.windsweptIslands.description = 坐落於海岸線外的一串群島。紀錄顯示此地過去有生產[accent]塑鋼[]的建築物。抵禦敵方的海軍進攻。在島嶼上建造基地。研究這些工廠。
sector.extractionOutpost.description = 由敵方建造的遠端哨站,用來發射資源到其他地區。\n\n跨地區運輸是征服星球不可或缺的技術。摧毀該基地。研究他們的發射台。
sector.impact0078.description = 沉睡在此的是第一個進入本星系的星際運輸船。\n\n回收任何能利用的東西。研究任何含有的科技。
sector.planetaryTerminal.description = 最終目標。\n\n這麼濱海基地具有能夠發射核心到其他行星的建築。 其防禦非常嚴密。\n\n生產海上單位。盡速摧毀敵人。研究該發射建築。
settings.language = 語言 settings.language = 語言
settings.data = 遊戲資料 settings.data = 遊戲資料
@@ -573,16 +631,16 @@ settings.clearcampaignsaves.confirm = 你確定要清除所有戰役紀錄?
paused = [accent](已暫停) paused = [accent](已暫停)
clear = 清除 clear = 清除
banned = [scarlet]已被封鎖 banned = [scarlet]已被封鎖
unplaceable.sectorcaptured = [scarlet]需要已占領的地區
yes = yes =
no = no =
info.title = 資訊 info.title = 資訊
error.title = [crimson]發生錯誤 error.title = [crimson]發生錯誤
error.crashtitle = 發生錯誤 error.crashtitle = 發生錯誤
unit.nobuild = [scarlet]單位不能建造 unit.nobuild = [scarlet]單位不能建造
lastaccessed = [lightgray]Last Accessed: {0} lastaccessed = [lightgray]最後使用:{0}
block.unknown = [lightgray] block.unknown = [lightgray]
stat.description = 用途
stat.input = 輸入 stat.input = 輸入
stat.output = 輸出 stat.output = 輸出
stat.booster = 強化 stat.booster = 強化
@@ -601,7 +659,7 @@ stat.displaysize = 顯示大小
stat.liquidcapacity = 液體容量 stat.liquidcapacity = 液體容量
stat.powerrange = 輸出範圍 stat.powerrange = 輸出範圍
stat.linkrange = 連結範圍 stat.linkrange = 連結範圍
stat.instructions = 介紹 stat.instructions = 指令
stat.powerconnections = 最大連結數 stat.powerconnections = 最大連結數
stat.poweruse = 能量使用 stat.poweruse = 能量使用
stat.powerdamage = 能量/傷害 stat.powerdamage = 能量/傷害
@@ -610,6 +668,8 @@ stat.memorycapacity = 記憶體容量
stat.basepowergeneration = 基礎能量生產 stat.basepowergeneration = 基礎能量生產
stat.productiontime = 生產時間 stat.productiontime = 生產時間
stat.repairtime = 方塊完全修復時間 stat.repairtime = 方塊完全修復時間
stat.weapons = 武器
stat.bullet = 子彈
stat.speedincrease = 速度提升 stat.speedincrease = 速度提升
stat.range = 範圍 stat.range = 範圍
stat.drilltier = 可鑽取礦物 stat.drilltier = 可鑽取礦物
@@ -642,28 +702,31 @@ stat.minetier = 挖掘等級
stat.payloadcapacity = 負荷量 stat.payloadcapacity = 負荷量
stat.commandlimit = 指令限制 stat.commandlimit = 指令限制
stat.abilities = 能力 stat.abilities = 能力
stat.canboost = 可加速
stat.flying = 飛行中
stat.ammouse = 彈藥使用
ability.forcefield = Force Field ability.forcefield = 防護罩
ability.repairfield = Repair Field ability.repairfield = 維修力場
ability.statusfield = Status Field ability.statusfield = 狀態力場
ability.unitspawn = {0} Factory ability.unitspawn = {0}工廠
ability.shieldregenfield = Shield Regen Field ability.shieldregenfield = 護盾充能力場
ability.movelightning = 移動閃電
bar.drilltierreq = 需要更好的鑽頭 bar.drilltierreq = 需要更好的鑽頭
bar.noresources = 缺少資源 bar.noresources = 缺少資源
bar.corereq = 核心基礎需求 bar.corereq = 需由核心升級
bar.drillspeed = 鑽頭速度:{0}/秒 bar.drillspeed = 鑽頭速度:{0}/秒
bar.pumpspeed = 液體泵送速度:{0}/秒 bar.pumpspeed = 液體泵送速度:{0}/秒
bar.efficiency = 效率:{0}% bar.efficiency = 效率:{0}%
bar.powerbalance = 能量變化:{0} bar.powerbalance = 能量變化:{0}
bar.powerstored = 能量存量: {0}/{1} bar.powerstored = 能量存量{0}/{1}
bar.poweramount = 能量:{0} bar.poweramount = 能量:{0}
bar.poweroutput = 能量輸出:{0} bar.poweroutput = 能量輸出:{0}
bar.powerlines = 連線: {0}/{1} 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][[unit disabled]
bar.liquid = 液體 bar.liquid = 液體
bar.heat = bar.heat =
bar.power = 能量 bar.power = 能量
@@ -676,12 +739,15 @@ units.processorcontrol = [lightgray]由微處理器控制
bullet.damage = [stat]{0}[lightgray]傷害 bullet.damage = [stat]{0}[lightgray]傷害
bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格 bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格
bullet.incendiary = [stat]燃燒 bullet.incendiary = [stat]燃燒
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]×穿刺 bullet.pierce = [stat]{0}[lightgray]×穿刺
bullet.infinitepierce = [stat]穿刺 bullet.infinitepierce = [stat]穿刺
bullet.healpercent = [stat]{0}[lightgray]% 回復
bullet.freezing = [stat]冷凍 bullet.freezing = [stat]冷凍
bullet.tarred = [stat]焦油 bullet.tarred = [stat]焦油
bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數 bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數
@@ -706,6 +772,8 @@ unit.items = 物品
unit.thousands = unit.thousands =
unit.millions = 百萬 unit.millions = 百萬
unit.billions = 十億 unit.billions = 十億
unit.pershot = /發
category.purpose = 用途
category.general = 一般 category.general = 一般
category.power = 能量 category.power = 能量
category.liquids = 液體 category.liquids = 液體
@@ -718,7 +786,8 @@ setting.shadows.name = 陰影
setting.blockreplace.name = 方塊建造建議 setting.blockreplace.name = 方塊建造建議
setting.linear.name = 線性過濾 setting.linear.name = 線性過濾
setting.hints.name = 提示 setting.hints.name = 提示
setting.flow.name = 顯示資源輸送速度[scarlet] setting.flow.name = 顯示資源輸送速度
setting.backgroundpause.name = 背景執行時暫停
setting.buildautopause.name = 自動暫停建築 setting.buildautopause.name = 自動暫停建築
setting.animatedwater.name = 液體動畫 setting.animatedwater.name = 液體動畫
setting.animatedshields.name = 護盾動畫 setting.animatedshields.name = 護盾動畫
@@ -747,16 +816,15 @@ setting.conveyorpathfinding.name = 自動輸送帶放置規劃
setting.sensitivity.name = 控制器靈敏度 setting.sensitivity.name = 控制器靈敏度
setting.saveinterval.name = 自動存檔間隔 setting.saveinterval.name = 自動存檔間隔
setting.seconds = {0}秒 setting.seconds = {0}秒
setting.blockselecttimeout.name = 跳過方塊建造時距
setting.milliseconds = {0}毫秒 setting.milliseconds = {0}毫秒
setting.fullscreen.name = 全螢幕 setting.fullscreen.name = 全螢幕
setting.borderlesswindow.name = 無邊框視窗[lightgray](可能需要重新啟動遊戲) setting.borderlesswindow.name = 無邊框視窗[lightgray](可能需要重新啟動遊戲)
setting.fps.name = 顯示FPS與Ping setting.fps.name = 顯示FPS與延遲
setting.smoothcamera.name = 平滑攝影機 setting.smoothcamera.name = 平滑攝影機
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
setting.pixelate.name = 像素化 setting.pixelate.name = 像素化
setting.minimap.name = 顯示小地圖 setting.minimap.name = 顯示小地圖
setting.coreitems.name = 顯示核心時間(開發中) setting.coreitems.name = 顯示核心物品
setting.position.name = 顯示玩家位置 setting.position.name = 顯示玩家位置
setting.musicvol.name = 音樂音量 setting.musicvol.name = 音樂音量
setting.atmosphere.name = 顯示星球大氣層 setting.atmosphere.name = 顯示星球大氣層
@@ -772,7 +840,9 @@ setting.chatopacity.name = 聊天框不透明度
setting.lasersopacity.name = 雷射不透明度 setting.lasersopacity.name = 雷射不透明度
setting.bridgeopacity.name = 橋透明度 setting.bridgeopacity.name = 橋透明度
setting.playerchat.name = 在遊戲中顯示聊天視窗 setting.playerchat.name = 在遊戲中顯示聊天視窗
setting.showweather.name = 顯示天氣動畫
public.confirm = 您想公開遊戲嗎?\n[accent]任何人都可以加入您的遊戲。\n[lightgray]之後可以在「設定」→「遊戲」→「公開遊戲可見度」中進行更改。 public.confirm = 您想公開遊戲嗎?\n[accent]任何人都可以加入您的遊戲。\n[lightgray]之後可以在「設定」→「遊戲」→「公開遊戲可見度」中進行更改。
public.confirm.really = 如果你想和朋友一起遊玩,可利用[green]邀請好友[]而不是[scarlet]公開伺服器[]\n你確定要將伺服設為[scarlet]公開[]
public.beta = 請注意該遊戲的Beta版本無法公開遊戲大廳。 public.beta = 請注意該遊戲的Beta版本無法公開遊戲大廳。
uiscale.reset = 使用者介面縮放已變更\n按下「確定」確認這個比例\n[scarlet][accent] {0}[] 秒後退出並還原設定 uiscale.reset = 使用者介面縮放已變更\n按下「確定」確認這個比例\n[scarlet][accent] {0}[] 秒後退出並還原設定
uiscale.cancel = 取消並退出 uiscale.cancel = 取消並退出
@@ -799,8 +869,8 @@ keybind.toggle_block_status.name = 開啟方塊狀態顯示
keybind.move_x.name = 水平移動 keybind.move_x.name = 水平移動
keybind.move_y.name = 垂直移動 keybind.move_y.name = 垂直移動
keybind.mouse_move.name = 跟隨滑鼠 keybind.mouse_move.name = 跟隨滑鼠
keybind.pan.name = Pan View keybind.pan.name = 平移鏡頭
keybind.boost.name = 噴射 keybind.boost.name = 加速
keybind.schematic_select.name = 選擇區域 keybind.schematic_select.name = 選擇區域
keybind.schematic_menu.name = 藍圖目錄 keybind.schematic_menu.name = 藍圖目錄
keybind.schematic_flip_x.name = X軸翻轉 keybind.schematic_flip_x.name = X軸翻轉
@@ -836,6 +906,8 @@ keybind.menu.name = 主選單
keybind.pause.name = 暫停遊戲 keybind.pause.name = 暫停遊戲
keybind.pause_building.name = 暫停/繼續建造 keybind.pause_building.name = 暫停/繼續建造
keybind.minimap.name = 小地圖 keybind.minimap.name = 小地圖
keybind.planet_map.name = 行星地圖
keybind.research.name = 研究
keybind.chat.name = 聊天 keybind.chat.name = 聊天
keybind.player_list.name = 玩家列表 keybind.player_list.name = 玩家列表
keybind.console.name = 終端機 keybind.console.name = 終端機
@@ -845,6 +917,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 = 模式說明
@@ -865,7 +938,7 @@ rules.schematic = 允許使用藍圖
rules.wavetimer = 波次時間 rules.wavetimer = 波次時間
rules.waves = 波次 rules.waves = 波次
rules.attack = 攻擊模式 rules.attack = 攻擊模式
rules.buildai = 電腦建築 rules.buildai = 電腦自動建築
rules.enemyCheat = 電腦無限資源 rules.enemyCheat = 電腦無限資源
rules.blockhealthmultiplier = 建築物耐久度倍數 rules.blockhealthmultiplier = 建築物耐久度倍數
rules.blockdamagemultiplier = 建築物傷害倍數 rules.blockdamagemultiplier = 建築物傷害倍數
@@ -887,18 +960,20 @@ rules.title.unit = 單位
rules.title.experimental = 實驗中 rules.title.experimental = 實驗中
rules.title.environment = 環境 rules.title.environment = 環境
rules.lighting = 光照 rules.lighting = 光照
rules.enemyLights = Enemy Lights rules.enemyLights = 敵方發光
rules.fire = rules.fire =
rules.explosions = 方塊/單位爆炸傷害 rules.explosions = 方塊/單位爆炸傷害
rules.ambientlight = 環境光照 rules.ambientlight = 環境光照
rules.weather = 天氣 rules.weather = 天氣
rules.weather.frequency = 頻率: rules.weather.frequency = 頻率:
rules.weather.always = 永遠
rules.weather.duration = 持續時間: rules.weather.duration = 持續時間:
content.item.name = 物品 content.item.name = 物品
content.liquid.name = 液體 content.liquid.name = 液體
content.unit.name = 單位 content.unit.name = 單位
content.block.name = 方塊 content.block.name = 方塊
content.sector.name = 地區
item.copper.name = item.copper.name =
item.lead.name = item.lead.name =
@@ -922,46 +997,47 @@ liquid.oil.name = 原油
liquid.cryofluid.name = 冷凍液 liquid.cryofluid.name = 冷凍液
unit.dagger.name = 匕首機甲 unit.dagger.name = 匕首機甲
unit.mace.name = 權杖 unit.mace.name = 甩棍
unit.fortress.name = 要塞 unit.fortress.name = 要塞
unit.nova.name = 超新星 unit.nova.name = 超新星
unit.pulsar.name = 脈衝星 unit.pulsar.name = 脈衝星
unit.quasar.name = 類星體 unit.quasar.name = 類星體
unit.crawler.name = 爬行機甲 unit.crawler.name = 爬行機甲
unit.atrax.name = Atrax unit.atrax.name = 火毒機甲
unit.spiroct.name = 尖刺 unit.spiroct.name = 血魔機甲
unit.arkyid.name = Arkyid unit.arkyid.name = 魔毒蛛
unit.toxopid.name = Toxopid unit.toxopid.name = 鬼毒蛛
unit.flare.name = Flare unit.flare.name = 曳光戰機
unit.horizon.name = Horizon unit.horizon.name = 天際轟炸機
unit.zenith.name = Zenith unit.zenith.name = 穹頂飛彈艇
unit.antumbra.name = Antumbra unit.antumbra.name = 環蝕戰艦
unit.eclipse.name = Eclipse unit.eclipse.name = 全蝕戰艦
unit.mono.name = Mono unit.mono.name = 採礦無人機
unit.poly.name = Poly unit.poly.name = 建築衛機
unit.mega.name = Mega unit.mega.name = 修補運輸機
unit.quad.name = Quad unit.quad.name = 重型運輸艦
unit.oct.name = Oct unit.oct.name = 護盾航母
unit.risso.name = Risso unit.risso.name = 海豚號
unit.minke.name = Minke unit.minke.name = 鬚鯨號
unit.bryde.name = Bryde unit.bryde.name = 鯷鯨號
unit.sei.name = Sei unit.sei.name = 塞鯨號
unit.omura.name = Omura unit.omura.name = 角島鯨號
unit.alpha.name = Alpha unit.alpha.name = 阿爾法
unit.beta.name = Beta unit.beta.name = 貝塔
unit.gamma.name = Gamma unit.gamma.name = 伽瑪
unit.scepter.name = Scepter unit.scepter.name = 權杖
unit.reign.name = Reign unit.reign.name = 帝王
unit.vela.name = Vela unit.vela.name = 船帆座
unit.corvus.name = Corvus unit.corvus.name = 烏鴉座
block.resupply-point.name = 補給點 block.resupply-point.name = 補給點
block.parallax.name = 視差 block.parallax.name = 視差
block.cliff.name = 峭壁 block.cliff.name = 峭壁
block.sand-boulder.name = 沙礫 block.sand-boulder.name = 沙礫巨岩
block.basalt-boulder.name = 玄武岩巨石
block.grass.name = block.grass.name =
block.slag.name = 熔渣 block.slag.name = 熔渣
block.space.name = Space block.space.name = 太空
block.salt.name = block.salt.name =
block.salt-wall.name = 鹽牆 block.salt-wall.name = 鹽牆
block.pebbles.name = 卵石 block.pebbles.name = 卵石
@@ -1001,7 +1077,7 @@ block.sand.name = 沙
block.darksand.name = 黑沙 block.darksand.name = 黑沙
block.ice.name = block.ice.name =
block.snow.name = block.snow.name =
block.craters.name = 隕石 block.craters.name =
block.sand-water.name = 沙水 block.sand-water.name = 沙水
block.darksand-water.name = 黑沙水 block.darksand-water.name = 黑沙水
block.char.name = 燒焦 block.char.name = 燒焦
@@ -1032,7 +1108,7 @@ block.dark-panel-4.name = 黑面板 4
block.dark-panel-5.name = 黑面板 5 block.dark-panel-5.name = 黑面板 5
block.dark-panel-6.name = 黑面板 6 block.dark-panel-6.name = 黑面板 6
block.dark-metal.name = 黑金屬 block.dark-metal.name = 黑金屬
block.basalt.name = Basalt block.basalt.name = 玄武岩
block.hotrock.name = 熱岩 block.hotrock.name = 熱岩
block.magmarock.name = 岩漿岩 block.magmarock.name = 岩漿岩
block.copper-wall.name = 銅牆 block.copper-wall.name = 銅牆
@@ -1056,7 +1132,6 @@ block.conveyor.name = 輸送帶
block.titanium-conveyor.name = 鈦輸送帶 block.titanium-conveyor.name = 鈦輸送帶
block.plastanium-conveyor.name = 塑鋼輸送帶 block.plastanium-conveyor.name = 塑鋼輸送帶
block.armored-conveyor.name = 裝甲輸送帶 block.armored-conveyor.name = 裝甲輸送帶
block.armored-conveyor.description = 以與鈦輸送帶相同的速度移動物品,但擁有更高的防禦。除其他傳送帶外,不接受任何從側面輸入的資源。
block.junction.name = 樞紐 block.junction.name = 樞紐
block.router.name = 分配器 block.router.name = 分配器
block.distributor.name = 大型分配器 block.distributor.name = 大型分配器
@@ -1064,7 +1139,6 @@ block.sorter.name = 分類器
block.inverted-sorter.name = 反向分類器 block.inverted-sorter.name = 反向分類器
block.message.name = 訊息板 block.message.name = 訊息板
block.illuminator.name = 照明燈 block.illuminator.name = 照明燈
block.illuminator.description = 小、緊湊而且可調整的光源。需要能源來運作。
block.overflow-gate.name = 溢流器 block.overflow-gate.name = 溢流器
block.underflow-gate.name = 反向溢流器 block.underflow-gate.name = 反向溢流器
block.silicon-smelter.name = 煉矽廠 block.silicon-smelter.name = 煉矽廠
@@ -1098,12 +1172,12 @@ block.item-void.name = 物品虛空
block.liquid-source.name = 液體源 block.liquid-source.name = 液體源
block.liquid-void.name = 液體虛空 block.liquid-void.name = 液體虛空
block.power-void.name = 能量虛空 block.power-void.name = 能量虛空
block.power-source.name = 無限能量源 block.power-source.name = 能量源
block.unloader.name = 裝卸器 block.unloader.name = 裝卸器
block.vault.name = 儲存庫 block.vault.name = 儲存庫
block.wave.name = 波浪砲 block.wave.name = 波浪砲
block.tsunami.name = Tsunami block.tsunami.name = 海嘯
block.swarmer.name = 群集 block.swarmer.name = 蜂擁
block.salvo.name = 齊射砲 block.salvo.name = 齊射砲
block.ripple.name = 波紋砲 block.ripple.name = 波紋砲
block.phase-conveyor.name = 相織傳送帶 block.phase-conveyor.name = 相織傳送帶
@@ -1142,7 +1216,7 @@ block.arc.name = 電弧砲
block.rtg-generator.name = 放射性同位素熱發電機 block.rtg-generator.name = 放射性同位素熱發電機
block.spectre.name = 鬼影砲 block.spectre.name = 鬼影砲
block.meltdown.name = 熔毀砲 block.meltdown.name = 熔毀砲
block.foreshadow.name = Foreshadow block.foreshadow.name = 狙擊砲
block.container.name = 容器 block.container.name = 容器
block.launch-pad.name = 小型發射台 block.launch-pad.name = 小型發射台
block.launch-pad-large.name = 大型發射台 block.launch-pad-large.name = 大型發射台
@@ -1151,15 +1225,20 @@ block.command-center.name = 指揮中心
block.ground-factory.name = 地面工廠 block.ground-factory.name = 地面工廠
block.air-factory.name = 航空工廠 block.air-factory.name = 航空工廠
block.naval-factory.name = 海軍工廠 block.naval-factory.name = 海軍工廠
block.additive-reconstructor.name = 一級升級 block.additive-reconstructor.name = 二級重塑
block.multiplicative-reconstructor.name = 二級升級 block.multiplicative-reconstructor.name = 三級重塑
block.exponential-reconstructor.name = 三級升級 block.exponential-reconstructor.name = 四級重塑
block.tetrative-reconstructor.name = 四級升級 block.tetrative-reconstructor.name = 五級重塑
block.payload-conveyor.name = 原料輸送帶 block.payload-conveyor.name = 原料輸送帶
block.payload-router.name = 原料分配器 block.payload-router.name = 原料分配器
block.disassembler.name = 拆裝 block.disassembler.name = 還原
block.silicon-crucible.name = 矽爐 block.silicon-crucible.name = 矽爐
block.overdrive-dome.name = 高速拱頂 block.overdrive-dome.name = 高速拱頂
#以下為實驗性建築,未來可能移除 experimental, may be removed
block.block-forge.name = 方塊鑄造坊
block.block-loader.name = 方塊裝載器
block.block-unloader.name = 方塊卸載器
block.interplanetary-accelerator.name = 星際加速站
block.switch.name = 按鈕 block.switch.name = 按鈕
block.micro-processor.name = 微處理器 block.micro-processor.name = 微處理器
@@ -1178,56 +1257,83 @@ team.derelict.name = 灰
team.green.name = team.green.name =
team.purple.name = team.purple.name =
tutorial.next = [lightgray]<按下以繼續> hint.skip = 跳過
tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[WASD]來移動.\n滾動滾輪來放大縮小畫面.\n從[accent]開採銅礦[]開始吧靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦 hint.desktopMove = 使用[accent][[WASD][]來移動
tutorial.intro.mobile = 您已進入[scarlet] Mindustry 教學。[]\n滑動螢幕即可移動。\n[accent]用兩指捏[]來縮放畫面。\n從[accent]開採銅礦[]開始吧。靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦 hint.zoom = 滾動 [accent]滾輪[] 來放大縮小畫面。
tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。\n不論在哪個選單您也可以用快速按下按鍵[accent][[2][]然後[accent][[1][]來選擇鑽頭。\n[accent]滑鼠右擊[]停止建造 hint.mine = 靠近並 [accent]點擊[] \uf8c4 銅礦以自行採礦
tutorial.drill.mobile = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n點選右下角的鑽頭選項\n選擇[accent]機械鑽頭[].\n通過點擊將其放置在銅礦上然後按下下方的[accent]確認標誌[]確認您的選擇\n按下[accent] X 按鈕[] 取消放置. hint.desktopShoot = [accent][[點擊左鍵][]射擊。
tutorial.blockinfo = 每個方塊都有不同的屬性。每個鑽頭只能開採特定的礦石。\n查看方塊的資訊和屬性[accent]在建造目錄時按下"?"鈕。[]\n\n[accent]立即訪問機械鑽頭的屬性資料。[] hint.depositItems = 從船身拖曳到核心以存放採完的礦物。
tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶 hint.respawn = [accent][[V][]以重生
tutorial.conveyor.mobile = [accent]輸送帶[]能夠將物品運輸到核心。製作一條從鑽頭開始到核心的輸送帶。\n[accent]長按數秒[]並向一個方向拖動來放置直線。\n\n[accent]{0}/{1} 條輸送帶\n[accent]0/1 交付的物品 hint.respawn.mobile = 你目前在控制單位/建築。[accent]點擊左上角的頭像[]重生。
tutorial.turret = 防禦建築是必須的以擊退[lightgray]敵人[]。\n於核心附近建造一個雙炮 hint.desktopPause = 按[accent][[空白鍵][]暫停、繼續遊戲
tutorial.drillturret = 雙炮需要[accent]銅彈[]以射擊。\n在雙炮旁邊放置一個鑽頭以供應銅 hint.placeDrill = 點選右下介面的 \ue85e [accent]鑽頭[]頁。選擇 \uf870 [accent]鑽頭[]並點擊畫面將鑽頭放到銅礦上
tutorial.pause = 在戰鬥中,你可以[accent]暫停遊戲。[]\n您可以在暫停時規劃建築物並加入建造序列。\n\n[accent]按空白鍵暫停遊戲 hint.placeDrill.mobile = 點選右下介面的 \ue85e [accent]鑽頭[]頁。選擇 \uf870 [accent]鑽頭[]並點擊畫面將鑽頭放到銅礦上。\n\n按下 \ue800 [accent]勾勾[]來確認建造
tutorial.pause.mobile = 在戰鬥中,你可以[accent]暫停遊戲。[]\n您可以在暫停時規劃建築物並加入建造序列。\n\n[accent]按左上角的此按鈕暫停 hint.placeConveyor = [accent]輸送帶[]能夠將物品運到其他地方。從 \ue814 [accent]運輸[]頁中點選 \uf896 [accent]輸送帶[]\n\n按住並拖曳以建造多個輸送帶。\n[accent]滑動滾輪[]以旋轉
tutorial.unpause = 現在再次按空格鍵即可取消暫停 hint.placeConveyor.mobile = [accent]輸送帶[]能夠將物品運到其他地方。從 \ue814 [accent]運輸[]頁中點選 \uf896 [accent]輸送帶[]。\n\n按住畫面超過一秒後拖曳以建造多個輸送帶
tutorial.unpause.mobile = 現在再次按空格鍵即可取消暫停 hint.placeTurret = 建造 \uf861 [accent]砲塔[]抵禦進犯的敵軍。\n\n砲塔需要彈藥現在則是需要 \uf838銅。\n用輸送帶和鑽頭供應砲塔
tutorial.breaking = 方塊經常需要被拆除。\n[accent]按住右鍵[]破壞選擇區域中的所有方塊。[]\n\n[accent]使用區域選擇拆除核心左側的所有廢料方塊。 hint.breaking = [accent]按住右鍵[]並拖曳以破壞方塊。
tutorial.breaking.mobile = 方塊經常需要被拆除。\n[accent]選擇拆除模式[],然後點擊一個方塊以破壞它。\n按住螢幕幾秒鐘並向一個方向拖動以破壞一個範圍內的方塊[]。\n按下確認標記按鈕以確認拆除。\n\n[accent]使用區域選擇拆除核心左側的所有廢料方塊。 hint.breaking.mobile = 點亮右下角的 \ue817 [accent]鐵鎚[]圖案並點擊畫面可直接拆除方塊。\n\n按住畫面超過一秒後拖曳以連續摧毀多個方塊。
tutorial.withdraw = 在某些情況下,直接從方塊中取出物品是必要的。\n[accent]點擊有物品的方塊[],然後[accent]點擊在方框中的物品[]以將其取出。\n可以通過[accent]點擊或長按[]來取出物品。\n\n[accent]從核心中取出一些銅。[] hint.research = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。
tutorial.deposit = 通過將物品從船上拖到目標方塊,將物品放入方塊中。\n\n[accent]將您的銅放到核心中。[] hint.research.mobile = 使用 \ue875 [accent]研究[] 按鈕來研究新科技。
tutorial.waves = [lightgray]敵人[]來臨。\n\n保護核心抵抗兩波攻擊。\n建造更多的砲塔和鑽頭。開採更多的銅 hint.unitControl = 按住[accent][[L-ctrl][]並[accent]點擊[]以控制我方的機甲和砲台
tutorial.waves.mobile = [lightgray]敵人[]來臨。\n\n保護核心抵抗兩波攻擊。您的飛船會自動向敵人開火。\n建造更多的砲塔和鑽頭。開採更多的銅 hint.unitControl.mobile = [accent][[點擊兩下][]以控制我方的機甲和砲台
tutorial.launch = 一旦您達到特定的波數, 您就可以[accent] 發射核心[],放棄防禦並[accent]獲取核心中的所有資源。[]\n這些資源可以用於研究新科技。\n\n[accent]按下發射按鈕 hint.launch = 一旦蒐集到足夠的資源,你可以透過右下角的 \ue827 [accent]地圖[]來選取你要[accent]發射[]的區域
hint.launch.mobile = 一旦蒐集到足夠的資源,你可以透過選單中的 \ue827 [accent]地圖[]來選取你要[accent]發射[]的區域。
hint.schematicSelect = 按住[accent][[F][]並拖曳可以選取方塊並貼上。\n\n按下[accent][[滑鼠中鍵][]可以複製單一方塊。
hint.conveyorPathfind = 在建造輸送帶時按下[accent][[L-Ctrl][]可以自動產生路徑。
hint.conveyorPathfind.mobile = 啟用 \ue844 [accent]對角線模式[]可以在建造輸送帶時自動產生路徑。
hint.boost = 按住[accent][[L-Shift][]可以帶著你的機甲一起飛越障礙物\n\n只有少數陸行機甲有推進器。
hint.command = 按下[accent][[G][]集結附近[accent]相似類別[]的機甲進入編隊。\n\n你要先控制一台陸行機甲才能集結其他陸行機甲。
hint.command.mobile = [accent][[點擊兩下][]你的機甲使其他機甲進入編隊。
hint.payloadPickup = 按下 [accent][[[] 拾起小方塊或機甲。
hint.payloadPickup.mobile = [accent]長按[]一個方塊或單位可將其拾起。
hint.payloadDrop = 按下 [accent]][] 可以放下持有的方塊或單位。
hint.payloadDrop.mobile = [accent]長按[]任何空白處可以放下持有的方塊或單位。
hint.waveFire = 以[accent]水[]裝填的[accent]波浪[]會自動撲滅附近火勢。
hint.generator = \uf879 [accent]燃燒發電機[]消耗煤炭產生能源給相鄰的方塊。\n\n使用 \uf87f [accent]能量節點[]增加電力涵蓋範圍。
hint.guardian = [accent]頭目[]擁有厚實的裝甲。較弱的彈藥如[accent]銅[]和[accent]鉛[]並[scarlet]沒有效果[].\n\n使用更高等的砲臺或以\uf835 [accent]石墨[]配合\uf861雙砲、\uf859齊射砲摧毀頭目。
hint.coreUpgrade = 核心可以透過在上面[accent]覆蓋一個更高等級的核心[]來升級。\n\n放置  [accent]核心:基地[] 到  [accent]核心:碎片[] 上. 確保沒有其他障礙物。
hint.presetLaunch = 灰色的[accent]降落地區[],例如[accent]冰凍森林[],可由任何地區發射。這類地區無須由相鄰地區進攻。\n\n[accent]數字編號地區[],像是這一個,可不是完成戰役的必要條件。
hint.coreIncinerate = 當任一物品的核心庫存滿了後,後續進入的同種資源會被[accent]銷毀[]。
hint.coopCampaign = 遊玩[accent]多人合作戰役[]時,同地圖所生產的資源皆會被送入[accent]自己的地區[]。\n\n任何新科技也會單向同步到自己的科技。
item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。 item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。
item.copper.details = 銅,蕈孢星上異常常見的金屬。加工前結構脆弱。
item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和液體運輸方塊。 item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和液體運輸方塊。
item.lead.details = 密度高、穩定。廣泛用於電池中。\n附記可能對生物有毒性。即便這裡也沒剩多少。
item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分配和儲存。 item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分配和儲存。
item.graphite.description = 礦化的碳,用於彈藥和電氣元件。 item.graphite.description = 礦化的碳,用於彈藥和電氣元件。
item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和作為助熔劑。 item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和作為助熔劑。
item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。 item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。
item.coal.details = 看似植物化石,形成時間遠早於「播種」事件。
item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛行載具。 item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛行載具。
item.thorium.description = 一種高密度的放射性金屬,用作結構支撐和核燃料。 item.thorium.description = 一種高密度的放射性金屬,用作結構支撐和核燃料。
item.scrap.description = 舊結構和單位的殘骸。含有微量的各種金屬。 item.scrap.description = 舊結構和單位的殘骸。含有微量的各種金屬。
item.scrap.details = 古老建築、兵器留下的殘骸。
item.silicon.description = 一種非常有用的半導體,被用於太陽能電池板、很多複雜的電子設備和追蹤導彈彈藥。 item.silicon.description = 一種非常有用的半導體,被用於太陽能電池板、很多複雜的電子設備和追蹤導彈彈藥。
item.plastanium.description = 一種輕量、可延展的材料,用於高級的飛行載具和破片彈藥。 item.plastanium.description = 一種輕量、可延展的材料,用於高級的飛行載具和破片彈藥。
item.phase-fabric.description = 一種近乎無重量的物質,用於先進的電子設備和自修復技術。 item.phase-fabric.description = 一種近乎無重量的物質,用於先進的電子設備和自修復技術。
item.surge-alloy.description = 一種具有獨特電子特性的高級合金。 item.surge-alloy.description = 一種具有獨特電子特性的高級合金。
item.spore-pod.description = 合成的孢子莢。合成大氣濃度的孢子做為工業用途。用於轉化為原油、爆炸物和燃料。 item.spore-pod.description = 合成的孢子莢。合成大氣濃度的孢子做為工業用途。用於轉化為原油、爆炸物和燃料。
item.blast-compound.description = 一種用於炸彈和爆裂物的不穩定混合物。不建議作為燃料 item.spore-pod.details = 充滿孢子。很可能是人造生物。會釋放對其他生物有毒的氣體。極具侵略性。特定情況下極為易燃
item.pyratite.description = 一種在燃燒武器中使用的極易燃物質 item.blast-compound.description = 用於炸彈和高爆彈的混合物
item.pyratite.description = 用於至燃武器和燃燒型發電機的物質。
liquid.water.description = 最有用的液體。常用於冷卻機器和廢物處理。 liquid.water.description = 最有用的液體。常用於冷卻機器和廢物處理。
liquid.slag.description = 各種不同類型的熔融金屬混合在一起的液體。可以被分解成其所組成之礦物,或作為武器向敵方單位噴灑。 liquid.slag.description = 各種不同類型的熔融金屬混合在一起的液體。可以被分解成其所組成之礦物,或作為武器向敵方單位噴灑。
liquid.oil.description = 用於進階材料製造的液體。可以轉化為煤炭作為燃料或噴灑向敵方單位後點燃作為武器。 liquid.oil.description = 用於進階材料製造的液體。可以轉化為煤炭作為燃料或噴灑向敵方單位後點燃作為武器。
liquid.cryofluid.description = 一種安定,無腐蝕性的液體,用水及鈦混合成。具有很高的比熱。廣泛的用作冷卻劑。 liquid.cryofluid.description = 一種安定,無腐蝕性的液體,用水及鈦混合成。具有很高的比熱。廣泛的用作冷卻劑。
block.resupply-point.description = 補給銅礦彈藥給附近的單位。無法用於需要電池電力的單位。
block.armored-conveyor.description = 以與鈦輸送帶相同的速度移動物品,但擁有更高的防禦。不接受任何從側面輸入的資源。
block.illuminator.description = 小而美的光源。
block.message.description = 儲存一條訊息。用於盟友之間的溝通。 block.message.description = 儲存一條訊息。用於盟友之間的溝通。
block.graphite-press.description = 將煤炭壓縮成石墨。 block.graphite-press.description = 將煤炭壓縮成石墨。
block.multi-press.description = 石墨壓縮機的升級版。利用水和電力快速高效地處理煤炭。 block.multi-press.description = 石墨壓縮機的升級版。利用水和電力快速高效地處理煤炭。
block.silicon-smelter.description = 使用高純度焦炭還原沙子以生產矽。 block.silicon-smelter.description = 使用高純度焦炭還原沙子以生產矽。
block.kiln.description = 將沙子和鉛熔煉成鋼化玻璃。需要少量能量。 block.kiln.description = 將沙子和鉛熔煉成鋼化玻璃。需要少量能量。
block.plastanium-compressor.description = 將原油和鈦壓縮製造塑鋼。 block.plastanium-compressor.description = 將原油和鈦壓縮製造塑鋼。
block.phase-weaver.description = 使用放射性的釷和大量的沙子生產相織布。需要巨量能量。 block.phase-weaver.description = 使用放射性的釷和大量的沙子生產相織布。
block.alloy-smelter.description = 使用鈦、鉛、矽和銅以生產波動合金。 block.alloy-smelter.description = 使用鈦、鉛、矽和銅以生產波動合金。
block.cryofluid-mixer.description = 混合水和研磨的鈦粉製造冷卻效率更高的冷凍液。對釷反應堆是必要的。 block.cryofluid-mixer.description = 混合水和研磨的鈦粉製造冷卻效率更高的冷凍液。對釷反應堆是必要的。
block.blast-mixer.description = 混合胞子碎塊將火焰彈變成比較不易燃但更具爆炸性的爆炸混合物。 block.blast-mixer.description = 混合胞子碎塊將火焰彈變成比較不易燃但更具爆炸性的爆炸混合物。
@@ -1236,8 +1342,8 @@ block.melter.description = 將廢料加熱到很高的溫度產生熔渣,用
block.separator.description = 將熔渣分離成各種礦物質。將其冷卻後輸出。 block.separator.description = 將熔渣分離成各種礦物質。將其冷卻後輸出。
block.spore-press.description = 將孢子莢壓縮成原油。 block.spore-press.description = 將孢子莢壓縮成原油。
block.pulverizer.description = 將廢料粉碎成沙子。當缺少天然沙時相當有用。 block.pulverizer.description = 將廢料粉碎成沙子。當缺少天然沙時相當有用。
block.coal-centrifuge.description = 將原油固化成煤 block.coal-centrifuge.description = 將原油固化成煤
block.incinerator.description = 銷毀它接收到的任何多餘物品或液體。 block.incinerator.description = 銷毀所有接收的物品或液體。
block.power-void.description = 銷毀所有輸入的能量。僅限沙盒。 block.power-void.description = 銷毀所有輸入的能量。僅限沙盒。
block.power-source.description = 無限輸出能量。僅限沙盒。 block.power-source.description = 無限輸出能量。僅限沙盒。
block.item-source.description = 無限輸出物品。僅限沙盒。 block.item-source.description = 無限輸出物品。僅限沙盒。
@@ -1262,16 +1368,17 @@ block.mender.description = 定期修復附近的建築物。在每一波之間
block.mend-projector.description = 高級的修理方塊。可選擇使用相織布增加範圍和效率。 block.mend-projector.description = 高級的修理方塊。可選擇使用相織布增加範圍和效率。
block.overdrive-projector.description = 提高附近建築物的速度,如鑽頭和輸送帶。可選擇使用相織布增加範圍和效率。 block.overdrive-projector.description = 提高附近建築物的速度,如鑽頭和輸送帶。可選擇使用相織布增加範圍和效率。
block.force-projector.description = 在自身周圍形成一個六角形能量力場護盾,保護內部的建築物和單位免受傷害。承受太多傷害時會過熱。可選擇用冷卻液避免過熱。可以使用相織布增加護盾範圍。 block.force-projector.description = 在自身周圍形成一個六角形能量力場護盾,保護內部的建築物和單位免受傷害。承受太多傷害時會過熱。可選擇用冷卻液避免過熱。可以使用相織布增加護盾範圍。
block.shock-mine.description = 傷害踩到地雷的敵人。敵人幾乎看不見 block.shock-mine.description = 傷害經過的敵人。敵人無法指定地雷攻擊,但仍會被流彈摧毀
block.conveyor.description = 基本物品傳輸方塊。將物品向前移動並自動將它們放入砲塔或機器中。能夠旋轉方向。 block.conveyor.description = 基本物品傳輸方塊。將物品向前移動並自動將它們放入砲塔或機器中。
block.titanium-conveyor.description = 高級物品傳輸方塊。比標準輸送帶更快地移動物品。 block.titanium-conveyor.description = 高級物品傳輸方塊。比標準輸送帶更快地移動物品。
block.plastanium-conveyor.description = 批量輸送物品。\n從後方接受物品並向三個方向輸出。 block.plastanium-conveyor.description = 批量輸送物品。\n從後方接受物品並向三個方向輸出。
block.junction.description = 作為兩個交叉輸送帶的橋樑。適用於兩條不同輸送帶將不同物品運送到不同位置的情況。 block.junction.description = 作為兩個交叉輸送帶的橋樑。適用於兩條不同輸送帶將不同物品運送到不同位置的情況。
block.bridge-conveyor.description = 高級的物品運輸方塊。允許跨過最多3個任何地形或建築物的方塊運輸物品。 block.bridge-conveyor.description = 高級的物品運輸方塊。允許跨過最多3個任何地形或建築物的方塊運輸物品。
block.phase-conveyor.description = 高級物品傳輸方塊。使用能量將物品傳送到幾個方塊外連接的相織輸送帶。 block.phase-conveyor.description = 高級物品傳輸方塊。使用能量將物品傳送到幾個方塊外連接的相織輸送帶。
block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從左邊和右邊輸出。 block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從兩側輸出。
block.inverted-sorter.description = 處理物品的方式類似於分類器,但將所選擇的物品輸出到側 block.inverted-sorter.description = 處理物品的方式類似於分類器,但將所選擇的物品輸出到側
block.router.description = 接受來自一個方向的物品並將它們平均輸出到最多3個其他方向。用於將物品從一個來源分割為多個目標。\n\n[[scarlet]不建議緊貼在生產型方塊旁使用,可能導致其被產出堵塞。[] block.router.description = 接受來自一個方向的物品並將它們平均輸出到最多3個其他方向。用於將物品從一個來源分割為多個目標。\n\n[[scarlet]不建議緊貼在生產型方塊旁使用,可能導致其被產出堵塞。[]
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 = 反向的溢流器。如果側面被阻擋,則向前方輸出物品。
@@ -1299,26 +1406,29 @@ block.steam-generator.description = 比燃燒發電機更有效率,但需要
block.differential-generator.description = 利用冷卻液和燃燒火焰彈之間的溫差產生大量的能量。 block.differential-generator.description = 利用冷卻液和燃燒火焰彈之間的溫差產生大量的能量。
block.rtg-generator.description = 一種簡單、可靠的發電機,使用放射性化合物衰變所產生的熱產生少量能量。不需要冷卻,但產生的能量比釷反應堆少。 block.rtg-generator.description = 一種簡單、可靠的發電機,使用放射性化合物衰變所產生的熱產生少量能量。不需要冷卻,但產生的能量比釷反應堆少。
block.solar-panel.description = 透過太陽產生少量的能量。 block.solar-panel.description = 透過太陽產生少量的能量。
block.solar-panel-large.description = 比標準太陽能板產生更多的能量,但建造起來昂貴得多 block.solar-panel-large.description = 透過太陽產生少量的能量。效率較普通太陽能板高
block.thorium-reactor.description = 從高度放射性釷產生大量能量。需要持續冷卻。如果供應的冷卻劑不足,會劇烈爆炸。產生的能量取決於釷裝載量,滿載時會達到基礎發電功率。 block.thorium-reactor.description = 從高度放射性釷產生大量能量。需要持續冷卻。如果供應的冷卻劑不足,會劇烈爆炸。產生的能量取決於釷裝載量,滿載時會達到基礎發電功率。
block.impact-reactor.description = 先進的發電機,在尖峰值效率時能產生量能量。需要大量的電源輸入才能啟動該過程 block.impact-reactor.description = 先進的發電機,在最高效率時能產生量能量。需要先消耗大量的能源才能啟動。
block.mechanical-drill.description = 一種便宜的鑽頭。當放置在適當的方塊上時,以緩慢的速度無限期地輸出物品。只能挖掘基本的原料。 block.mechanical-drill.description = 一種便宜的鑽頭。當放置在適當的方塊上時,以緩慢的速度無限期地輸出物品。只能挖掘基本的原料。
block.pneumatic-drill.description = 一種改進的鑽頭,可以挖掘鈦。比機械鑽頭挖掘的更快。 block.pneumatic-drill.description = 一種改進的鑽頭,可以挖掘鈦。比機械鑽頭挖掘的更快。
block.laser-drill.description = 通過雷射技術可以更快地挖掘,但需要能量。此外,這種鑽頭可以挖掘放射性釷。 block.laser-drill.description = 通過雷射技術可以更快地挖掘,但需要能量。此外,這種鑽頭可以挖掘放射性釷。
block.blast-drill.description = 終極的鑽頭。需要大量能量。 block.blast-drill.description = 終極的鑽頭。需要大量能量。
block.water-extractor.description = 從地下提取水。附近沒有湖泊時可以使用 block.water-extractor.description = 從地下提取水。附近沒有地面水源時使用。
block.cultivator.description = 將大氣中微小濃度的胞子培養成工業等級的孢子莢。 block.cultivator.description = 將大氣中微小濃度的胞子培養成工業等級的孢子莢。
block.cultivator.details = 拾回的科技。用以極高效率生產大量的生物質。可能是當初培養現在覆蓋整個蕈孢星的孢子的培養槽。
block.oil-extractor.description = 使用大量的能量、水以及沙子鑽取原油。當附近沒有直接的原油來源時使用它。 block.oil-extractor.description = 使用大量的能量、水以及沙子鑽取原油。當附近沒有直接的原油來源時使用它。
block.core-shard.description = 初代的核心膠囊。一旦被摧毀,會失去對該地區的控制權。不要讓這種情況發生。 block.core-shard.description = 基地的中樞。一旦被摧毀,會失去對該地區的控制權。
block.core-foundation.description = 代核心。有更好的裝甲。可以儲存更多資源 block.core-shard.details = 代核心。輕巧、能自我複製。配備單次使用的推進器。不適合用於星際旅行初代的核心
block.core-nucleus.description = 第三代核心,也是最後一代。裝甲非常好。可以儲存大量資源 block.core-foundation.description = 基地的中樞。裝甲厚實。相較於碎片核心能儲存更多的資源。第二代核心
block.core-foundation.details = 第二代核心。
block.core-nucleus.description = 基地的中樞。裝甲非常厚重。可以儲存極為的大量資源。
block.core-nucleus.details = 第三,也是最後一代核心。
block.vault.description = 儲存大量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從儲存庫提取物品。 block.vault.description = 儲存大量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從儲存庫提取物品。
block.container.description = 儲存少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從容器提取物品。 block.container.description = 儲存少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從容器提取物品。
block.unloader.description = 將物品從容器、倉庫或核心卸載到傳輸帶上或直接卸貨到相鄰的方塊中。透過點擊卸貨器來更改要卸貨的物品類型。 block.unloader.description = 將物品從容器、倉庫或核心卸載到傳輸帶上或直接卸貨到相鄰的方塊中。透過點擊卸貨器來更改要卸貨的物品類型。
block.launch-pad.description = 無需發射核心即可直接發射物品。 block.launch-pad.description = 無需發射核心即可直接發射物品。
block.launch-pad-large.description = 發射台的進階版。可儲存更多物品。更快的發射速度。
block.duo.description = 一種小而便宜的砲塔。 block.duo.description = 一種小而便宜的砲塔。
block.scatter.description = 不可或缺的中型防空砲塔。向敵方單位噴射鉛塊、廢料或是鋼化玻璃片。 block.scatter.description = 不可或缺的中型防空砲塔。向敵方單位噴射鉛塊、廢料或是鋼化玻璃片。
block.scorch.description = 燃燒所有靠近它的地面敵人。在近距離非常有效。 block.scorch.description = 燃燒所有靠近它的地面敵人。在近距離非常有效。
block.hail.description = 一種小型的長距離迫擊砲。 block.hail.description = 一種小型的長距離迫擊砲。
block.wave.description = 一種可以向敵人噴灑液體束的中型砲塔。提供水時可以自動滅火。 block.wave.description = 一種可以向敵人噴灑液體束的中型砲塔。提供水時可以自動滅火。
@@ -1331,5 +1441,64 @@ block.ripple.description = 極為強大的迫擊炮塔。一次向敵人發射
block.cyclone.description = 一種對空和對地的大型砲塔。向附近單位發射爆裂性的碎塊。 block.cyclone.description = 一種對空和對地的大型砲塔。向附近單位發射爆裂性的碎塊。
block.spectre.description = 一種雙炮管的巨型砲塔。向空中及地面敵人發射大型的穿甲彈。 block.spectre.description = 一種雙炮管的巨型砲塔。向空中及地面敵人發射大型的穿甲彈。
block.meltdown.description = 一種巨型雷射砲塔。充電並發射持續性的雷射光束。需要冷卻液以運作。 block.meltdown.description = 一種巨型雷射砲塔。充電並發射持續性的雷射光束。需要冷卻液以運作。
block.foreshadow.description = 在遠方狙擊單一目標。
block.repair-point.description = 持續治療附近最近的受損單位。 block.repair-point.description = 持續治療附近最近的受損單位。
block.segment.description = 傷害並摧毀來襲的砲彈。無法將雷射砲彈作為目標。 block.segment.description = 傷害並摧毀來襲的砲彈。無法將雷射武器的光束作為目標。
block.parallax.description = 發射牽引光束,牽引空中目標,並在此過程中損壞它們。
block.tsunami.description = 向敵人發射強大的液體。如果提供水會自動滅火。
block.silicon-crucible.description = 使用火焰彈作為附加熱源,從沙子和煤炭中提煉矽。在高溫地區效率更高。
block.disassembler.description = 以低效率將熔渣分離成少量的礦物成分。可生產釷。
block.overdrive-dome.description = 用相織布和矽增加附近建築物的速度。
block.payload-conveyor.description = 移動大型物體,像是從工廠出來的機甲。
block.payload-router.description = 把大型物體分配到三個方向。
block.command-center.description = 用幾個不同的指令控制機甲的行為。
block.ground-factory.description = 生產陸行機甲,造好的機甲可以直接使用或者是送進重塑機升級。
block.air-factory.description = 生產空中機甲,造好的機甲可以直接使用或者是送進重塑機升級。
block.naval-factory.description = 生產海上機甲,造好的機甲可以直接使用或者是送進重塑機升級。
block.additive-reconstructor.description = 把送進來的機甲升到第二級。
block.multiplicative-reconstructor.description = 把送進來的機甲升到第三級。
block.exponential-reconstructor.description = 把送進來的機甲升到第四級。
block.tetrative-reconstructor.description = 把送進來的機甲升到第五級。
block.switch.description = 一個能開關的按鈕。狀態能由處理器讀取和控制。
block.micro-processor.description = 反覆執行所有的邏輯指令。能控制機甲和建築。
block.logic-processor.description = 反覆執行所有的邏輯指令。能控制機甲和建築。速度較微處理器快。
block.hyper-processor.description = 反覆執行所有的邏輯指令。能控制機甲和建築。速度較邏輯處理器快。
block.memory-cell.description = 為邏輯處理器儲存資料。
block.memory-bank.description = 為邏輯處理器儲存資料。大容量。
block.logic-display.description = 顯示由處理器輸出的任意圖像。
block.large-logic-display.description = 顯示由處理器輸出的任意圖像。
block.interplanetary-accelerator.description = 巨大的電磁砲塔。將核心加速至脫離速度以在其他星球部署。
unit.dagger.description = 發射普通子彈攻擊所有附近敵人。
unit.mace.description = 噴發烈焰攻擊所有附近敵人。
unit.fortress.description = 發射遠程迫砲攻擊地面目標。
unit.scepter.description = 發射大量續能子彈打擊所有附近敵人。
unit.reign.description = 發射大量穿透型子彈打擊所有附近敵人。
unit.nova.description = 發射雷射槍對敵人造成傷害和回復友方建築。具飛行能力。
unit.pulsar.description = 發射電弧對敵人造成傷害和回復友方建築。具飛行能力。
unit.quasar.description = 發射能穿透的雷射光束對敵人造成傷害和回復友方建築。具飛行能力。 具備護盾。
unit.vela.description = 發射持續數秒的強大雷射光束,能至燃敵方建築和回復友方建築。具飛行能力。
unit.corvus.description = 發射距離極遠的強大恢復光束,在一瞬間摧毀敵方建築、單位或回復友方建築。能越過大部分地形限制。
unit.crawler.description = 跑向敵人並自爆,造成大範圍傷害的自殺機甲。
unit.atrax.description = 對地面目標噴出弱化敵人的熔渣。能越過大部分地形限制。
unit.spiroct.description = 對敵人發射吸血光束。能越過大部分地形限制。
unit.arkyid.description = 對敵人發射大量吸血光束。能越過大部分地形限制。
unit.toxopid.description = 發射大型電爆彈和穿透型雷射。能越過大部分地形限制的大型爬行機甲。
unit.flare.description = 以普通子彈攻擊敵人的高速戰鬥機。
unit.horizon.description = 投放多枚炸彈轟炸地面目標。
unit.zenith.description = 以飛彈攻擊附近敵人的戰機。
unit.antumbra.description = 對敵人發射大量火砲的飛行戰艦。
unit.eclipse.description = 具兩門穿透型雷射砲和大量彈幕的超級戰艦。
unit.mono.description = 自動採集銅和鉛存入核心。
unit.poly.description = 自動重建被摧毀的建築和協助其他單位建造。
unit.mega.description = 自動回復受損的建築。能拾起方塊和小型地面機甲。
unit.quad.description = 以大型炸彈轟炸地面目標,能回復友方建築並傷害敵人。能拾起中型地面機甲。
unit.oct.description = 具保護和回復附近友軍的護盾。能拾起絕大部分地面機甲。
unit.risso.description = 對附近所有敵人發射大量飛彈和子彈的迷你砲艇。
unit.minke.description = 對附近陸上敵人發射大砲和普通子彈的小型迫砲艇。
unit.bryde.description = 對敵人發射遠程高射砲彈以及飛彈的巡邏艇。
unit.sei.description = 對敵人發射大量飛彈和穿甲彈。
unit.omura.description = 對敵人發射遠程穿透型砲彈。建造曳光戰機。
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。

View File

@@ -109,3 +109,6 @@ VolasYouKnow
Quick-Korx Quick-Korx
Ángel Rodríguez Aguilera Ángel Rodríguez Aguilera
Catchears Catchears
younggam
simba-fs
RedRadiation

View File

@@ -1,6 +1,5 @@
uniform sampler2D u_texture; uniform sampler2D u_texture;
uniform vec4 u_color;
uniform vec2 u_texsize; uniform vec2 u_texsize;
uniform vec2 u_uv; uniform vec2 u_uv;
uniform vec2 u_uv2; uniform vec2 u_uv2;
@@ -38,11 +37,11 @@ void main(){
float dst = (abs(center.x - coords.x) + abs(center.y - coords.y))/2.0; float dst = (abs(center.x - coords.x) + abs(center.y - coords.y))/2.0;
if((mod(u_time / 1.5 + value, 20.0) < 15.0 && cont(t, v))){ if((mod(u_time / 1.5 + value, 20.0) < 15.0 && cont(t, v))){
gl_FragColor = u_color; gl_FragColor = v_color;
}else if(dst > (1.0-u_progress) * (center.x)){ }else if(dst > (1.0-u_progress) * (center.x)){
gl_FragColor = color; gl_FragColor = color;
}else if((dst + 1.0 > (1.0-u_progress) * (center.x)) && color.a > 0.1){ }else if((dst + 1.0 > (1.0-u_progress) * (center.x)) && color.a > 0.1){
gl_FragColor = u_color; gl_FragColor = v_color;
}else{ }else{
gl_FragColor = vec4(0.0); gl_FragColor = vec4(0.0);
} }

View File

@@ -0,0 +1,18 @@
#define HIGHP
uniform sampler2D u_texture;
uniform vec2 u_texsize;
uniform vec2 u_invsize;
uniform float u_time;
uniform float u_dp;
uniform vec2 u_offset;
varying vec2 v_texCoords;
void main(){
vec2 T = v_texCoords.xy;
vec2 coords = (T * u_texsize) + u_offset;
vec4 color = texture2D(u_texture, T);
color.a *= (0.37 + abs(sin(u_time / 15.0)) * .05 + 0.2 * (step(mod(coords.x / u_dp + coords.y / u_dp + u_time / 4.0, 10.0), 3.0)));
gl_FragColor = color;
}

View File

@@ -1992,7 +1992,7 @@ public class Blocks implements ContentList{
powerSource = new PowerSource("power-source"){{ powerSource = new PowerSource("power-source"){{
requirements(Category.power, BuildVisibility.sandboxOnly, with()); requirements(Category.power, BuildVisibility.sandboxOnly, with());
powerProduction = 10000f / 60f; powerProduction = 100000f / 60f;
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
@@ -2055,6 +2055,7 @@ public class Blocks implements ContentList{
//TODO remove //TODO remove
launchPadLarge = new LaunchPad("launch-pad-large"){{ launchPadLarge = new LaunchPad("launch-pad-large"){{
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75));
size = 4; size = 4;
itemCapacity = 300; itemCapacity = 300;
launchTime = 60f * 35; launchTime = 60f * 35;
@@ -2146,21 +2147,21 @@ public class Blocks implements ContentList{
//region experimental //region experimental
blockForge = new BlockForge("block-forge"){{ blockForge = new BlockForge("block-forge"){{
requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); requirements(Category.crafting, BuildVisibility.debugOnly, with(Items.thorium, 100));
hasPower = true; hasPower = true;
consumes.power(2f); consumes.power(2f);
size = 3; size = 3;
}}; }};
blockLoader = new BlockLoader("block-loader"){{ blockLoader = new BlockLoader("block-loader"){{
requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.thorium, 100));
hasPower = true; hasPower = true;
consumes.power(2f); consumes.power(2f);
size = 3; size = 3;
}}; }};
blockUnloader = new BlockUnloader("block-unloader"){{ blockUnloader = new BlockUnloader("block-unloader"){{
requirements(Category.production, BuildVisibility.debugOnly, with(Items.thorium, 100)); requirements(Category.distribution, BuildVisibility.debugOnly, with(Items.thorium, 100));
hasPower = true; hasPower = true;
consumes.power(2f); consumes.power(2f);
size = 3; size = 3;

View File

@@ -698,7 +698,6 @@ public class UnitTypes implements ContentList{
legExtension = -15; legExtension = -15;
legBaseOffset = 10f; legBaseOffset = 10f;
landShake = 1f; landShake = 1f;
legSpeed = 0.1f;
legLengthScl = 0.96f; legLengthScl = 0.96f;
rippleScale = 2f; rippleScale = 2f;
legSpeed = 0.2f; legSpeed = 0.2f;
@@ -1318,6 +1317,7 @@ public class UnitTypes implements ContentList{
hitSize = 32f; hitSize = 32f;
payloadCapacity = (3 * 3) * tilePayload; payloadCapacity = (3 * 3) * tilePayload;
buildSpeed = 2.5f; buildSpeed = 2.5f;
buildBeamOffset = 23;
range = 140f; range = 140f;
targetAir = false; targetAir = false;
targetFlag = BlockFlag.battery; targetFlag = BlockFlag.battery;
@@ -1389,6 +1389,7 @@ public class UnitTypes implements ContentList{
drawShields = false; drawShields = false;
commandLimit = 6; commandLimit = 6;
lowAltitude = true; lowAltitude = true;
buildBeamOffset = 43;
ammoCapacity = 1300; ammoCapacity = 1300;
ammoResupplyAmount = 20; ammoResupplyAmount = 20;

View File

@@ -275,16 +275,21 @@ public class Logic implements ApplicationListener{
public static void sectorCapture(){ public static void sectorCapture(){
//the sector has been conquered - waves get disabled //the sector has been conquered - waves get disabled
state.rules.waves = false; state.rules.waves = false;
//disable attack mode
state.rules.attackMode = false;
if(state.rules.sector == null) return; if(state.rules.sector == null){
//disable attack mode
state.rules.attackMode = false;
return;
}
state.rules.sector.info.wasCaptured = true; state.rules.sector.info.wasCaptured = true;
//fire capture event //fire capture event
Events.fire(new SectorCaptureEvent(state.rules.sector)); Events.fire(new SectorCaptureEvent(state.rules.sector));
//disable attack mode
state.rules.attackMode = false;
//save, just in case //save, just in case
if(!headless && !net.client()){ if(!headless && !net.client()){
control.saves.saveSector(state.rules.sector); control.saves.saveSector(state.rules.sector);
@@ -383,7 +388,7 @@ public class Logic implements ApplicationListener{
Time.update(); Time.update();
//weather is serverside //weather is serverside
if(!net.client()){ if(!net.client() && !state.isEditor()){
updateWeather(); updateWeather();
for(TeamData data : state.teams.getActive()){ for(TeamData data : state.teams.getActive()){

View File

@@ -30,6 +30,7 @@ public class Renderer implements ApplicationListener{
public @Nullable Bloom bloom; public @Nullable Bloom bloom;
public FrameBuffer effectBuffer = new FrameBuffer(); public FrameBuffer effectBuffer = new FrameBuffer();
public float laserOpacity = 1f; public float laserOpacity = 1f;
public boolean animateShields, drawWeather = true;
/** minZoom = zooming out, maxZoom = zooming in */ /** minZoom = zooming out, maxZoom = zooming in */
public float minZoom = 1.5f, maxZoom = 6f; public float minZoom = 1.5f, maxZoom = 6f;
@@ -69,7 +70,8 @@ public class Renderer implements ApplicationListener{
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);
if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest; if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest;
laserOpacity = Core.settings.getInt("lasersopacity") / 100f; laserOpacity = settings.getInt("lasersopacity") / 100f;
animateShields = settings.getBool("animatedshields");
if(landTime > 0){ if(landTime > 0){
landTime -= Time.delta; landTime -= Time.delta;
@@ -204,7 +206,7 @@ public class Renderer implements ApplicationListener{
graphics.clear(clearColor); graphics.clear(clearColor);
Draw.reset(); Draw.reset();
if(Core.settings.getBool("animatedwater") || Core.settings.getBool("animatedshields")){ if(Core.settings.getBool("animatedwater") || animateShields){
effectBuffer.resize(graphics.getWidth(), graphics.getHeight()); effectBuffer.resize(graphics.getWidth(), graphics.getHeight());
} }
@@ -248,11 +250,16 @@ public class Renderer implements ApplicationListener{
Draw.draw(Layer.plans, overlays::drawBottom); Draw.draw(Layer.plans, overlays::drawBottom);
if(settings.getBool("animatedshields") && Shaders.shield != null){ if(animateShields && Shaders.shield != null){
Draw.drawRange(Layer.shields, 1f, () -> effectBuffer.begin(Color.clear), () -> { Draw.drawRange(Layer.shields, 1f, () -> effectBuffer.begin(Color.clear), () -> {
effectBuffer.end(); effectBuffer.end();
effectBuffer.blit(Shaders.shield); effectBuffer.blit(Shaders.shield);
}); });
Draw.drawRange(Layer.buildBeam, 1f, () -> effectBuffer.begin(Color.clear), () -> {
effectBuffer.end();
effectBuffer.blit(Shaders.buildBeam);
});
} }
Draw.draw(Layer.overlayUI, overlays::drawTop); Draw.draw(Layer.overlayUI, overlays::drawTop);
@@ -344,6 +351,7 @@ public class Renderer implements ApplicationListener{
FrameBuffer buffer = new FrameBuffer(w, h); FrameBuffer buffer = new FrameBuffer(w, h);
drawWeather = false;
float vpW = camera.width, vpH = camera.height, px = camera.position.x, py = camera.position.y; float vpW = camera.width, vpH = camera.height, px = camera.position.x, py = camera.position.y;
disableUI = true; disableUI = true;
camera.width = w; camera.width = w;
@@ -369,6 +377,7 @@ public class Renderer implements ApplicationListener{
PixmapIO.writePNG(file, fullPixmap); PixmapIO.writePNG(file, fullPixmap);
fullPixmap.dispose(); fullPixmap.dispose();
ui.showInfoFade(Core.bundle.format("screenshot", file.toString())); ui.showInfoFade(Core.bundle.format("screenshot", file.toString()));
drawWeather = true;
buffer.dispose(); buffer.dispose();
} }

View File

@@ -52,8 +52,8 @@ public class Version{
int dot = str.indexOf('.'); int dot = str.indexOf('.');
if(dot != -1){ if(dot != -1){
int major = Strings.parseInt(str.substring(0, dot)), minor = Strings.parseInt(str.substring(dot + 1)); int major = Strings.parseInt(str.substring(0, dot), 0), minor = Strings.parseInt(str.substring(dot + 1), 0);
return build >= major && revision >= minor; return build > major || (build == major && revision >= minor);
}else{ }else{
return build >= Strings.parseInt(str, 0); return build >= Strings.parseInt(str, 0);
} }

View File

@@ -268,7 +268,7 @@ public class World{
} }
private void setSectorRules(Sector sector){ private void setSectorRules(Sector sector){
state.map = new Map(StringMap.of("name", sector.planet.localizedName + "; Sector " + sector.id)); state.map = new Map(StringMap.of("name", sector.preset == null ? sector.planet.localizedName + "; Sector " + sector.id : sector.preset.localizedName));
state.rules.sector = sector; state.rules.sector = sector;
state.rules.weather.clear(); state.rules.weather.clear();

View File

@@ -258,6 +258,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
player.clearUnit(); player.clearUnit();
Groups.unit.clear(); Groups.unit.clear();
Groups.build.clear(); Groups.build.clear();
Groups.weather.clear();
logic.play(); logic.play();
if(player.team().core() == null){ if(player.team().core() == null){
@@ -700,8 +701,6 @@ public class MapEditorDialog extends Dialog implements Disposable{
if(core != 0) return core; if(core != 0) return core;
int synth = Boolean.compare(b1.synthetic(), b2.synthetic()); int synth = Boolean.compare(b1.synthetic(), b2.synthetic());
if(synth != 0) return synth; if(synth != 0) return synth;
int editorVis = Boolean.compare(b1.buildVisibility == BuildVisibility.editorOnly, b2.buildVisibility == BuildVisibility.editorOnly);
if(editorVis != 0) return editorVis;
int ore = Boolean.compare(b1 instanceof OverlayFloor, b2 instanceof OverlayFloor); int ore = Boolean.compare(b1 instanceof OverlayFloor, b2 instanceof OverlayFloor);
if(ore != 0) return ore; if(ore != 0) return ore;
return Integer.compare(b1.id, b2.id); return Integer.compare(b1.id, b2.id);

View File

@@ -243,14 +243,14 @@ public class MapView extends Element implements GestureListener{
image.setImageSize(editor.width(), editor.height()); image.setImageSize(editor.width(), editor.height());
if(!ScissorStack.push(rect.set(x, y, width, height))){ if(!ScissorStack.push(rect.set(x, y + Core.scene.marginBottom, width, height))){
return; return;
} }
Draw.color(Pal.remove); Draw.color(Pal.remove);
Lines.stroke(2f); Lines.stroke(2f);
Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2);
editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2 + Core.scene.marginBottom, sclwidth, sclheight);
Draw.reset(); Draw.reset();
if(grid){ if(grid){

View File

@@ -28,7 +28,7 @@ public class LightningBulletType extends BulletType{
@Override @Override
public float estimateDPS(){ public float estimateDPS(){
return super.estimateDPS() * Math.max(lightningLength / 4f, 1); return super.estimateDPS() * Math.max(lightningLength / 10f, 1);
} }
@Override @Override

View File

@@ -63,6 +63,11 @@ public class RailBulletType extends BulletType{
} }
} }
@Override
public boolean testCollision(Bullet bullet, Building tile){
return bullet.team != tile.team;
}
@Override @Override
public void hitEntity(Bullet b, Hitboxc entity, float initialHealth){ public void hitEntity(Bullet b, Hitboxc entity, float initialHealth){
handle(b, entity, initialHealth); handle(b, entity, initialHealth);

View File

@@ -35,12 +35,25 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
@SyncLocal Queue<BuildPlan> plans = new Queue<>(1); @SyncLocal Queue<BuildPlan> plans = new Queue<>(1);
@SyncLocal boolean updateBuilding = true; @SyncLocal boolean updateBuilding = true;
private transient BuildPlan lastActive;
private transient int lastSize;
private transient float buildAlpha = 0f;
public boolean canBuild(){ public boolean canBuild(){
return type.buildSpeed > 0; return type.buildSpeed > 0;
} }
@Override @Override
public void update(){ public void update(){
if(!headless){
//visual activity update
if(lastActive != null && buildAlpha <= 0.01f){
lastActive = null;
}
buildAlpha = Mathf.lerpDelta(buildAlpha, activelyBuilding() ? 1f : 0f, 0.15f);
}
if(!updateBuilding || !canBuild()) return; if(!updateBuilding || !canBuild()) return;
float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange; float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange;
@@ -64,7 +77,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
if(plans.size > 1){ if(plans.size > 1){
int total = 0; int total = 0;
BuildPlan req; BuildPlan req;
while((dst((req = buildPlan()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < plans.size){ while((!within((req = buildPlan()).tile(), finalPlaceDst) || shouldSkip(req, core)) && total < plans.size){
plans.removeFirst(); plans.removeFirst();
plans.addLast(req); plans.addLast(req);
total++; total++;
@@ -72,10 +85,13 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
} }
BuildPlan current = buildPlan(); BuildPlan current = buildPlan();
Tile tile = current.tile();
if(!within(current.tile(), finalPlaceDst)) return; lastActive = current;
buildAlpha = 1f;
if(current.breaking) lastSize = tile.block().size;
Tile tile = world.tile(current.x, current.y); if(!within(tile, finalPlaceDst)) return;
if(!(tile.build instanceof ConstructBuild cb)){ if(!(tile.build instanceof ConstructBuild cb)){
if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){
@@ -204,7 +220,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
boolean activelyBuilding(){ boolean activelyBuilding(){
//not actively building when not near the build plan //not actively building when not near the build plan
if(isBuilding()){ if(isBuilding()){
if(!within(buildPlan(), state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange)){ if(!state.isEditor() && !within(buildPlan(), state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange)){
return false; return false;
} }
} }
@@ -218,30 +234,31 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
} }
public void draw(){ public void draw(){
if(!activelyBuilding()) return; boolean active = activelyBuilding();
if(!active && lastActive == null) return;
Draw.z(Layer.flyingUnit); Draw.z(Layer.flyingUnit);
BuildPlan plan = buildPlan(); BuildPlan plan = active ? buildPlan() : lastActive;
Tile tile = world.tile(plan.x, plan.y); Tile tile = world.tile(plan.x, plan.y);
var core = team.core(); var core = team.core();
if(tile == null || (!within(tile, buildingRange) && !state.isEditor())){ if(tile == null || !within(plan, state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange)){
return; return;
} }
//draw remote plans. //draw remote plans.
if(core != null && !isLocal() && !(tile.block() instanceof ConstructBlock)){ if(core != null && active && !isLocal() && !(tile.block() instanceof ConstructBlock)){
Draw.z(Layer.plans - 1f); Draw.z(Layer.plans - 1f);
drawPlan(plan, 0.5f); drawPlan(plan, 0.5f);
Draw.z(Layer.flyingUnit); Draw.z(Layer.flyingUnit);
} }
int size = plan.breaking ? tile.block().size : plan.block.size; int size = plan.breaking ? active ? tile.block().size : lastSize : plan.block.size;
float tx = plan.drawx(), ty = plan.drawy(); float tx = plan.drawx(), ty = plan.drawy();
Lines.stroke(1f, Pal.accent); Lines.stroke(1f, plan.breaking ? Pal.remove : Pal.accent);
float focusLen = 3.8f + Mathf.absin(Time.time, 1.1f, 0.6f); float focusLen = type.buildBeamOffset + Mathf.absin(Time.time, 3f, 0.6f);
float px = x + Angles.trnsx(rotation, focusLen); float px = x + Angles.trnsx(rotation, focusLen);
float py = y + Angles.trnsy(rotation, focusLen); float py = y + Angles.trnsy(rotation, focusLen);
@@ -255,16 +272,35 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
Arrays.sort(vecs, Structs.comparingFloat(vec -> -Angles.angleDist(angleTo(vec), ang))); Arrays.sort(vecs, Structs.comparingFloat(vec -> -Angles.angleDist(angleTo(vec), ang)));
Vec2 close = Geometry.findClosest(x, y, vecs);
float x1 = vecs[0].x, y1 = vecs[0].y, float x1 = vecs[0].x, y1 = vecs[0].y,
x2 = close.x, y2 = close.y,
x3 = vecs[1].x, y3 = vecs[1].y; x3 = vecs[1].x, y3 = vecs[1].y;
Draw.alpha(1f); Draw.z(Layer.buildBeam);
Lines.line(px, py, x1, y1); Draw.alpha(buildAlpha);
Lines.line(px, py, x3, y3);
Fill.circle(px, py, 1.6f + Mathf.absin(Time.time, 0.8f, 1.5f)); if(!active && !(tile.build instanceof ConstructBuild)){
Fill.square(plan.drawx(), plan.drawy(), size * tilesize/2f);
}
Draw.color(); if(renderer.animateShields){
if(close != vecs[0] && close != vecs[1]){
Fill.tri(px, py, x1, y1, x2, y2);
Fill.tri(px, py, x3, y3, x2, y2);
}else{
Fill.tri(px, py, x1, y1, x3, y3);
}
}else{
Lines.line(px, py, x1, y1);
Lines.line(px, py, x3, y3);
}
Fill.square(px, py, 1.8f + Mathf.absin(Time.time, 2.2f, 1.1f), rotation + 45);
Draw.reset();
Draw.z(Layer.flyingUnit);
} }
} }

View File

@@ -84,8 +84,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
}else{ }else{
if(block.hasPower){ if(block.hasPower){
//reinit power graph //reinit power graph
power.graph = new PowerGraph(); new PowerGraph().add(self());
power.graph.add(self());
} }
} }
this.rotation = rotation; this.rotation = rotation;
@@ -199,10 +198,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
public void addPlan(boolean checkPrevious){ public void addPlan(boolean checkPrevious){
if(!block.rebuildable || (team == state.rules.defaultTeam && state.isCampaign() && !block.isVisible())) return; if(!block.rebuildable || (team == state.rules.defaultTeam && state.isCampaign() && !block.isVisible())) return;
Object overrideConfig = null;
if(self() instanceof ConstructBuild entity){ if(self() instanceof ConstructBuild entity){
//update block to reflect the fact that something was being constructed //update block to reflect the fact that something was being constructed
if(entity.cblock != null && entity.cblock.synthetic() && entity.wasConstructing){ if(entity.cblock != null && entity.cblock.synthetic() && entity.wasConstructing){
block = entity.cblock; block = entity.cblock;
overrideConfig = entity.lastConfig;
}else{ }else{
//otherwise this was a deconstruction that was interrupted, don't want to rebuild that //otherwise this was a deconstruction that was interrupted, don't want to rebuild that
return; return;
@@ -223,7 +225,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
} }
data.blocks.addFirst(new BlockPlan(tile.x, tile.y, (short)rotation, block.id, config())); data.blocks.addFirst(new BlockPlan(tile.x, tile.y, (short)rotation, block.id, overrideConfig == null ? config() : overrideConfig));
} }
/** Configure with the current, local player. */ /** Configure with the current, local player. */
@@ -384,6 +386,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
//endregion //endregion
//region handler methods //region handler methods
public boolean canUnload(){
return block.unloadable;
}
/** Called when an unloader takes an item. */ /** Called when an unloader takes an item. */
public void itemTaken(Item item){ public void itemTaken(Item item){
@@ -749,9 +755,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
public void powerGraphRemoved(){ public void powerGraphRemoved(){
if(power == null){ if(power == null) return;
return;
}
power.graph.remove(self()); power.graph.remove(self());
for(int i = 0; i < power.links.size; i++){ for(int i = 0; i < power.links.size; i++){

View File

@@ -80,7 +80,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
if(core != null && within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){ if(core != null && within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){
//add item to inventory before it is transferred //add item to inventory before it is transferred
if(item() == item) addItem(item); if(item() == item && !net.client()) addItem(item);
Call.transferItemTo(self(), item, 1, Call.transferItemTo(self(), item, 1,
mineTile.worldx() + Mathf.range(tilesize / 2f), mineTile.worldx() + Mathf.range(tilesize / 2f),
mineTile.worldy() + Mathf.range(tilesize / 2f), core); mineTile.worldy() + Mathf.range(tilesize / 2f), core);

View File

@@ -50,6 +50,7 @@ abstract class ShieldComp implements Healthc, Posc{
float shieldDamage = Math.min(Math.max(shield, 0), amount); float shieldDamage = Math.min(Math.max(shield, 0), amount);
shield -= shieldDamage; shield -= shieldDamage;
hitTime = 1f;
amount -= shieldDamage; amount -= shieldDamage;
if(amount > 0){ if(amount > 0){

View File

@@ -8,6 +8,7 @@ abstract class TimerComp{
transient Interval timer = new Interval(6); transient Interval timer = new Interval(6);
public boolean timer(int index, float time){ public boolean timer(int index, float time){
if(Float.isInfinite(time)) return false;
return timer.get(index, time); return timer.get(index, time);
} }
} }

View File

@@ -109,6 +109,9 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Replace @Replace
public float clipSize(){ public float clipSize(){
if(isBuilding()){
return state.rules.infiniteResources ? Float.MAX_VALUE : Math.max(type.clipSize, type.region.width) + buildingRange + tilesize*4f;
}
return Math.max(type.region.width * 2f, type.clipSize); return Math.max(type.region.width * 2f, type.clipSize);
} }

View File

@@ -28,7 +28,7 @@ public class Rules{
public boolean pvp; public boolean pvp;
/** Whether to pause the wave timer until all enemies are destroyed. */ /** Whether to pause the wave timer until all enemies are destroyed. */
public boolean waitEnemies = false; public boolean waitEnemies = false;
/** Determinates if gamemode is attack mode */ /** Determinates if gamemode is attack mode. */
public boolean attackMode = false; public boolean attackMode = false;
/** Whether this is the editor gamemode. */ /** Whether this is the editor gamemode. */
public boolean editor = false; public boolean editor = false;
@@ -36,7 +36,7 @@ public class Rules{
public boolean canGameOver = true; public boolean canGameOver = true;
/** Whether reactors can explode and damage other blocks. */ /** Whether reactors can explode and damage other blocks. */
public boolean reactorExplosions = true; public boolean reactorExplosions = true;
/** Whether schematics are allowed */ /** Whether schematics are allowed. */
public boolean schematicsAllowed = true; public boolean schematicsAllowed = true;
/** Whether friendly explosions can occur and set fire/damage other blocks. */ /** Whether friendly explosions can occur and set fire/damage other blocks. */
public boolean damageExplosions = true; public boolean damageExplosions = true;
@@ -58,7 +58,7 @@ public class Rules{
public float buildCostMultiplier = 1f; public float buildCostMultiplier = 1f;
/** Multiplier for building speed. */ /** Multiplier for building speed. */
public float buildSpeedMultiplier = 1f; public float buildSpeedMultiplier = 1f;
/** Multiplier for percentage of materials refunded when deconstructing */ /** Multiplier for percentage of materials refunded when deconstructing. */
public float deconstructRefundMultiplier = 0.5f; public float deconstructRefundMultiplier = 0.5f;
/** No-build zone around enemy core radius. */ /** No-build zone around enemy core radius. */
public float enemyCoreBuildRadius = 400f; public float enemyCoreBuildRadius = 400f;
@@ -70,17 +70,17 @@ public class Rules{
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. */
public int unitCap = 0; public int unitCap = 0;
/** Sector for saves that have them.*/ /** Sector for saves that have them. */
public @Nullable Sector sector; public @Nullable Sector sector;
/** Spawn layout. */ /** Spawn layout. */
public Seq<SpawnGroup> spawns = new Seq<>(); public Seq<SpawnGroup> spawns = new Seq<>();
/** Starting items put in cores */ /** Starting items put in cores. */
public Seq<ItemStack> loadout = ItemStack.list(Items.copper, 100); public Seq<ItemStack> loadout = ItemStack.list(Items.copper, 100);
/** Weather events that occur here. */ /** Weather events that occur here. */
public Seq<WeatherEntry> weather = new Seq<>(1); public Seq<WeatherEntry> weather = new Seq<>(1);
/** Blocks that cannot be placed. */ /** Blocks that cannot be placed. */
public ObjectSet<Block> bannedBlocks = new ObjectSet<>(); public ObjectSet<Block> bannedBlocks = new ObjectSet<>();
/** Reveals blocks normally hidden by build visibility */ /** Reveals blocks normally hidden by build visibility. */
public ObjectSet<Block> revealedBlocks = new ObjectSet<>(); public ObjectSet<Block> revealedBlocks = new ObjectSet<>();
/** Unlocked content names. Only used in multiplayer when the campaign is enabled. */ /** Unlocked content names. Only used in multiplayer when the campaign is enabled. */
public ObjectSet<String> researched = new ObjectSet<>(); public ObjectSet<String> researched = new ObjectSet<>();
@@ -91,20 +91,20 @@ public class Rules{
public boolean enemyLights = true; public boolean enemyLights = true;
/** Ambient light color, used when lighting is enabled. */ /** Ambient light color, used when lighting is enabled. */
public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f); public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f);
/** team of the player by default */ /** team of the player by default. */
public Team defaultTeam = Team.sharded; public Team defaultTeam = Team.sharded;
/** team of the enemy in waves/sectors */ /** team of the enemy in waves/sectors. */
public Team waveTeam = Team.crux; public Team waveTeam = Team.crux;
/** name of the custom mode that this ruleset describes, or null. */ /** name of the custom mode that this ruleset describes, or null. */
public @Nullable String modeName; public @Nullable String modeName;
/** special tags for additional info */ /** special tags for additional info. */
public StringMap tags = new StringMap(); public StringMap tags = new StringMap();
/** A team-specific ruleset. */ /** A team-specific ruleset. */
public static class TeamRule{ public static class TeamRule{
/** Whether to use building AI. */ /** Whether to use building AI. */
public boolean ai; public boolean ai;
/** TODO Tier of blocks/designs that the AI uses for building. [0, 1]*/ /** TODO Tier of blocks/designs that the AI uses for building. [0, 1] */
public float aiTier = 1f; public float aiTier = 1f;
/** Whether, when AI is enabled, ships should be spawned from the core. */ /** Whether, when AI is enabled, ships should be spawned from the core. */
public boolean aiCoreSpawn = true; public boolean aiCoreSpawn = true;
@@ -121,7 +121,7 @@ public class Rules{
return JsonIO.copy(this); return JsonIO.copy(this);
} }
/** Returns the gamemode that best fits these rules.*/ /** Returns the gamemode that best fits these rules. */
public Gamemode mode(){ public Gamemode mode(){
if(pvp){ if(pvp){
return Gamemode.pvp; return Gamemode.pvp;

View File

@@ -65,6 +65,9 @@ public class Layer{
//overlaied UI, like block config guides //overlaied UI, like block config guides
overlayUI = 120, overlayUI = 120,
//build beam effects
buildBeam = 122,
//shield effects //shield effects
shields = 125, shields = 125,

View File

@@ -17,6 +17,7 @@ import static mindustry.Vars.*;
public class Shaders{ public class Shaders{
public static BlockBuild blockbuild; public static BlockBuild blockbuild;
public static @Nullable ShieldShader shield; public static @Nullable ShieldShader shield;
public static BuildBeamShader buildBeam;
public static UnitBuild build; public static UnitBuild build;
public static DarknessShader darkness; public static DarknessShader darkness;
public static LightShader light; public static LightShader light;
@@ -38,6 +39,7 @@ public class Shaders{
shield = null; shield = null;
t.printStackTrace(); t.printStackTrace();
} }
buildBeam = new BuildBeamShader();
build = new UnitBuild(); build = new UnitBuild();
darkness = new DarknessShader(); darkness = new DarknessShader();
light = new LightShader(); light = new LightShader();
@@ -161,7 +163,6 @@ public class Shaders{
} }
public static class BlockBuild extends LoadShader{ public static class BlockBuild extends LoadShader{
public Color color = new Color();
public float progress; public float progress;
public TextureRegion region = new TextureRegion(); public TextureRegion region = new TextureRegion();
@@ -172,7 +173,6 @@ public class Shaders{
@Override @Override
public void apply(){ public void apply(){
setUniformf("u_progress", progress); setUniformf("u_progress", progress);
setUniformf("u_color", color);
setUniformf("u_uv", region.u, region.v); setUniformf("u_uv", region.u, region.v);
setUniformf("u_uv2", region.u2, region.v2); setUniformf("u_uv2", region.u2, region.v2);
setUniformf("u_time", Time.time); setUniformf("u_time", Time.time);
@@ -186,6 +186,24 @@ public class Shaders{
super("shield", "screenspace"); super("shield", "screenspace");
} }
@Override
public void apply(){
setUniformf("u_dp", Scl.scl(1f));
setUniformf("u_time", Time.time / Scl.scl(1f));
setUniformf("u_offset",
Core.camera.position.x - Core.camera.width / 2,
Core.camera.position.y - Core.camera.height / 2);
setUniformf("u_texsize", Core.camera.width, Core.camera.height);
setUniformf("u_invsize", 1f/Core.camera.width, 1f/Core.camera.height);
}
}
public static class BuildBeamShader extends LoadShader{
public BuildBeamShader(){
super("buildbeam", "screenspace");
}
@Override @Override
public void apply(){ public void apply(){
setUniformf("u_dp", Scl.scl(1f)); setUniformf("u_dp", Scl.scl(1f));

View File

@@ -69,6 +69,7 @@ public enum Binding implements KeyBind{
chat_history_prev(KeyCode.up), chat_history_prev(KeyCode.up),
chat_history_next(KeyCode.down), chat_history_next(KeyCode.down),
chat_scroll(new Axis(KeyCode.scroll)), chat_scroll(new Axis(KeyCode.scroll)),
chat_mode(KeyCode.tab),
console(KeyCode.f8), console(KeyCode.f8),
; ;

View File

@@ -110,7 +110,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){ for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){
Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {})); Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {}));
} }
build.handleStack(item, amount, unit); if(amount > 0){
build.handleStack(item, amount, unit);
}
} }
public static void createItemTransfer(Item item, int amount, float x, float y, Position to, Runnable done){ public static void createItemTransfer(Item item, int amount, float x, float y, Position to, Runnable done){

View File

@@ -629,8 +629,8 @@ public class MobileInput extends InputHandler implements GestureListener{
} }
@Override @Override
public void update(){ public void updateState(){
super.update(); super.updateState();
if(state.isMenu()){ if(state.isMenu()){
selectRequests.clear(); selectRequests.clear();
@@ -639,6 +639,11 @@ public class MobileInput extends InputHandler implements GestureListener{
manualShooting = false; manualShooting = false;
payloadTarget = null; payloadTarget = null;
} }
}
@Override
public void update(){
super.update();
if(player.dead()){ if(player.dead()){
mode = none; mode = none;

View File

@@ -317,7 +317,11 @@ public class TypeIO{
return player; return player;
}else if(type == 1){ //formation controller }else if(type == 1){ //formation controller
int id = read.i(); int id = read.i();
return prev instanceof FormationAI ? prev : new FormationAI(Groups.unit.getByID(id), null); if(prev instanceof FormationAI f){
f.leader = Groups.unit.getByID(id);
return f;
}
return new FormationAI(Groups.unit.getByID(id), null);
}else if(type == 3){ }else if(type == 3){
int pos = read.i(); int pos = read.i();
if(prev instanceof LogicAI pai){ if(prev instanceof LogicAI pai){

View File

@@ -44,6 +44,7 @@ public class LExecutor{
public LInstruction[] instructions = {}; public LInstruction[] instructions = {};
public Var[] vars = {}; public Var[] vars = {};
public int[] binds;
public LongSeq graphicsBuffer = new LongSeq(); public LongSeq graphicsBuffer = new LongSeq();
public StringBuilder textBuffer = new StringBuilder(); public StringBuilder textBuffer = new StringBuilder();
@@ -182,9 +183,6 @@ public class LExecutor{
public static class UnitBindI implements LInstruction{ public static class UnitBindI implements LInstruction{
public int type; public int type;
//iteration index
private int index;
public UnitBindI(int type){ public UnitBindI(int type){
this.type = type; this.type = type;
} }
@@ -195,17 +193,21 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
if(exec.binds == null || exec.binds.length != content.units().size){
exec.binds = new int[content.units().size];
}
//binding to `null` was previously possible, but was too powerful and exploitable //binding to `null` was previously possible, but was too powerful and exploitable
if(exec.obj(type) instanceof UnitType type){ if(exec.obj(type) instanceof UnitType type){
Seq<Unit> seq = exec.team.data().unitCache(type); Seq<Unit> seq = exec.team.data().unitCache(type);
if(seq != null && seq.any()){ if(seq != null && seq.any()){
index %= seq.size; exec.binds[type.id] %= seq.size;
if(index < seq.size){ if(exec.binds[type.id] < seq.size){
//bind to the next unit //bind to the next unit
exec.setconst(varUnit, seq.get(index)); exec.setconst(varUnit, seq.get(exec.binds[type.id]));
} }
index++; exec.binds[type.id] ++;
}else{ }else{
//no units of this type found //no units of this type found
exec.setconst(varUnit, null); exec.setconst(varUnit, null);

View File

@@ -246,7 +246,7 @@ public class SectorDamage{
//first, calculate the total health of blocks in the path //first, calculate the total health of blocks in the path
//radius around the path that gets counted //radius around the path that gets counted
int radius = 8; int radius = 7;
IntSet counted = new IntSet(); IntSet counted = new IntSet();
for(Tile t : sparse2){ for(Tile t : sparse2){

View File

@@ -427,12 +427,14 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
//actually place the part //actually place the part
if(part != null && BaseGenerator.tryPlace(part, x, y, Team.derelict, (cx, cy) -> { if(part != null && BaseGenerator.tryPlace(part, x, y, Team.derelict, (cx, cy) -> {
Tile other = tiles.getn(cx, cy); Tile other = tiles.getn(cx, cy);
other.setOverlay(Blocks.oreScrap); if(other.floor().hasSurface()){
for(int j = 1; j <= 2; j++){ other.setOverlay(Blocks.oreScrap);
for(Point2 p : Geometry.d8){ for(int j = 1; j <= 2; j++){
Tile t = tiles.get(cx + p.x*j, cy + p.y*j); for(Point2 p : Geometry.d8){
if(t != null && t.floor().hasSurface() && rand.chance(j == 1 ? 0.4 : 0.2)){ Tile t = tiles.get(cx + p.x*j, cy + p.y*j);
t.setOverlay(Blocks.oreScrap); if(t != null && t.floor().hasSurface() && rand.chance(j == 1 ? 0.4 : 0.2)){
t.setOverlay(Blocks.oreScrap);
}
} }
} }
} }

View File

@@ -52,6 +52,7 @@ public class UnitType extends UnlockableContent{
public float groundLayer = Layer.groundUnit; public float groundLayer = Layer.groundUnit;
public float payloadCapacity = 8; public float payloadCapacity = 8;
public float aimDst = -1f; public float aimDst = -1f;
public float buildBeamOffset = 3.8f;
public int commandLimit = 8; public int commandLimit = 8;
public float visualElevation = -1f; public float visualElevation = -1f;
public boolean allowLegStep = false; public boolean allowLegStep = false;

View File

@@ -321,7 +321,7 @@ public class Weather extends UnlockableContent{
@Override @Override
public void draw(){ public void draw(){
if(renderer.weatherAlpha() > 0.0001f && Core.settings.getBool("showweather")){ if(renderer.weatherAlpha() > 0.0001f && renderer.drawWeather && Core.settings.getBool("showweather")){
Draw.draw(Layer.weather, () -> { Draw.draw(Layer.weather, () -> {
weather.rand.setSeed(0); weather.rand.setSeed(0);
Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier);

View File

@@ -0,0 +1,62 @@
package mindustry.ui;
import arc.func.*;
import arc.graphics.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.gen.*;
public class SearchBar{
public static <T> Table add(Table parent, Seq<T> list, Func<String, String> queryf,
Func<T, String> namef, Cons2<Table, T> itemc, boolean show){
Table[] pane = {null};
Cons<String> rebuild = str -> {
String query = queryf.get(str);
pane[0].clear();
boolean any = false;
for(T item : list){
if(query.isEmpty() || matches(query, namef.get(item))){
any = true;
itemc.get(pane[0], item);
}
}
if(!any){
pane[0].add("@none.found").color(Color.lightGray).pad(4);
}
};
if(show){
parent.table(search -> {
search.image(Icon.zoom).padRight(8f);
search.field("", rebuild).growX();
}).fillX().padBottom(4);
}
parent.row();
parent.pane(table -> {
pane[0] = table;
rebuild.get("");
});
return pane[0];
}
public static <T> Table add(Table parent, Seq<T> list, Func<String, String> queryf, Func<T, String> namef, Cons2<Table, T> itemc){
return add(parent, list, queryf, namef, itemc, true);
}
public static <T> Table add(Table parent, Seq<T> list, Func<T, String> namef, Cons2<Table, T> itemc, boolean show){
return add(parent, list, String::toLowerCase, namef, itemc, show);
}
/** Match a list item with the search query, case insensitive */
public static boolean matches(String query, String name){
if(name == null || name.isEmpty()){
return false;
}
return name.toLowerCase().contains(query);
}
}

View File

@@ -140,7 +140,7 @@ public class CustomRulesDialog extends BaseDialog{
title("@rules.title.resourcesbuilding"); title("@rules.title.resourcesbuilding");
check("@rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources); check("@rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources);
check("@rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); check("@rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions);
check("@rules.schematic", b-> rules.schematicsAllowed = b, () -> rules.schematicsAllowed); check("@rules.schematic", b -> rules.schematicsAllowed = b, () -> rules.schematicsAllowed);
number("@rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("@rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources);
number("@rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier, 0.00001f, 10000f); number("@rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier, 0.00001f, 10000f);
number("@rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources); number("@rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources);

View File

@@ -40,7 +40,7 @@ public class DatabaseDialog extends BaseDialog{
for(int j = 0; j < allContent.length; j++){ for(int j = 0; j < allContent.length; j++){
ContentType type = ContentType.all[j]; ContentType type = ContentType.all[j];
Seq<Content> array = allContent[j].select(c -> c instanceof UnlockableContent && !((UnlockableContent)c).isHidden()); Seq<Content> array = allContent[j].select(c -> c instanceof UnlockableContent u && (!u.isHidden() || u.node() != null));
if(array.size == 0) continue; if(array.size == 0) continue;
table.add("@content." + type.name() + ".name").growX().left().color(Pal.accent); table.add("@content." + type.name() + ".name").growX().left().color(Pal.accent);

View File

@@ -37,6 +37,9 @@ public class ModsDialog extends BaseDialog{
buttons.button("@mods.guide", Icon.link, () -> Core.app.openURI(modGuideURL)).size(210, 64f); buttons.button("@mods.guide", Icon.link, () -> Core.app.openURI(modGuideURL)).size(210, 64f);
shown(this::setup); shown(this::setup);
if(mobile){
onResize(this::setup);
}
hidden(() -> { hidden(() -> {
if(mods.requiresReload()){ if(mods.requiresReload()){
@@ -228,14 +231,12 @@ public class ModsDialog extends BaseDialog{
cont.row(); cont.row();
if(!mods.list().isEmpty()){ if(!mods.list().isEmpty()){
cont.pane(table -> { boolean[] anyDisabled = {false};
table.margin(10f).top(); SearchBar.add(cont, mods.list(),
mod -> mod.meta.displayName(),
boolean anyDisabled = false; (table, mod) -> {
for(LoadedMod mod : mods.list()){ if(!mod.enabled() && !anyDisabled[0] && mods.list().size > 0){
anyDisabled[0] = true;
if(!mod.enabled() && !anyDisabled && mods.list().size > 0){
anyDisabled = true;
table.row(); table.row();
table.image().growX().height(4f).pad(6f).color(Pal.gray); table.image().growX().height(4f).pad(6f).color(Pal.gray);
table.row(); table.row();
@@ -309,20 +310,14 @@ public class ModsDialog extends BaseDialog{
}).size(50f); }).size(50f);
} }
}).growX().right().padRight(-8f).padTop(-8f); }).growX().right().padRight(-8f).padTop(-8f);
}, Styles.clearPartialt, () -> showMod(mod)).size(w, h).growX().pad(4f); }, Styles.clearPartialt, () -> showMod(mod)).size(w, h).growX().pad(4f);
table.row(); table.row();
} }, !mobile || Core.graphics.isPortrait()).margin(10f).top();
});
}else{ }else{
cont.table(Styles.black6, t -> t.add("@mods.none")).height(80f); cont.table(Styles.black6, t -> t.add("@mods.none")).height(80f);
} }
cont.row(); cont.row();
} }
private void reload(){ private void reload(){

View File

@@ -121,6 +121,10 @@ public class BlockInventoryFragment extends Fragment{
} }
if(dirty) rebuild(false); if(dirty) rebuild(false);
} }
if(table.getChildren().isEmpty()){
hide();
}
} }
}); });

View File

@@ -2,6 +2,7 @@ package mindustry.ui.fragments;
import arc.*; import arc.*;
import arc.Input.*; import arc.Input.*;
import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
@@ -14,6 +15,7 @@ import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.input.*; import mindustry.input.*;
import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import static arc.Core.*; import static arc.Core.*;
@@ -27,6 +29,7 @@ public class ChatFragment extends Table{
private boolean shown = false; private boolean shown = false;
private TextField chatfield; private TextField chatfield;
private Label fieldlabel = new Label(">"); private Label fieldlabel = new Label(">");
private ChatMode mode = ChatMode.normal;
private Font font; private Font font;
private GlyphLayout layout = new GlyphLayout(); private GlyphLayout layout = new GlyphLayout();
private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50); private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50);
@@ -76,6 +79,9 @@ public class ChatFragment extends Table{
historyPos--; historyPos--;
updateChat(); updateChat();
} }
if(input.keyTap(Binding.chat_mode)){
nextMode();
}
scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown)); scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown));
} }
}); });
@@ -216,14 +222,35 @@ public class ChatFragment extends Table{
} }
public void updateChat(){ public void updateChat(){
chatfield.setText(history.get(historyPos)); chatfield.setText(mode.normalizedPrefix() + history.get(historyPos));
chatfield.setCursorPosition(chatfield.getText().length()); updateCursor();
}
public void nextMode(){
ChatMode prev = mode;
do{
mode = mode.next();
}while(!mode.isValid());
if(chatfield.getText().startsWith(prev.normalizedPrefix())){
chatfield.setText(mode.normalizedPrefix() + chatfield.getText().substring(prev.normalizedPrefix().length()));
}else{
chatfield.setText(mode.normalizedPrefix());
}
updateCursor();
} }
public void clearChatInput(){ public void clearChatInput(){
historyPos = 0; historyPos = 0;
history.set(0, ""); history.set(0, "");
chatfield.setText(""); chatfield.setText(mode.normalizedPrefix());
updateCursor();
}
public void updateCursor(){
chatfield.setCursorPosition(chatfield.getText().length());
} }
public boolean shown(){ public boolean shown(){
@@ -256,4 +283,36 @@ public class ChatFragment extends Table{
} }
} }
private enum ChatMode{
normal(""),
team("/t"),
admin("/a", player::admin)
;
public String prefix;
public Boolp valid;
public static final ChatMode[] all = values();
ChatMode(String prefix){
this.prefix = prefix;
this.valid = () -> true;
}
ChatMode(String prefix, Boolp valid){
this.prefix = prefix;
this.valid = valid;
}
public ChatMode next(){
return all[(ordinal() + 1) % all.length];
}
public String normalizedPrefix(){
return prefix.isEmpty() ? "" : prefix + " ";
}
public boolean isValid(){
return valid.get();
}
}
} }

View File

@@ -69,7 +69,7 @@ public class HudFragment extends Fragment{
} }
}); });
Events.on(SectorCaptureEvent.class, e ->{ Events.on(SectorCaptureEvent.class, e -> {
showToast(Core.bundle.format("sector.captured", e.sector.isBeingPlayed() ? "" : e.sector.name() + " ")); showToast(Core.bundle.format("sector.captured", e.sector.isBeingPlayed() ? "" : e.sector.name() + " "));
}); });

View File

@@ -219,9 +219,8 @@ public interface Autotiler{
/** /**
* Check if a position is facing the secondary position at a rotation * Check if a position is facing the secondary position at a rotation
* *
* @param tile The origin tile that is or is not facing the destinated `otherblock` * @param tile The origin tile that is or is not facing the `otherblock`
* @param rotation The rotation of the tile on (x, y) * @param rotation The rotation of the tile on (x, y)
*
* @param otherx The x coordinate of position 2 * @param otherx The x coordinate of position 2
* @param othery The y coordinate of position 2 * @param othery The y coordinate of position 2
* @return whether this tile is looking at the other tile. * @return whether this tile is looking at the other tile.

View File

@@ -145,8 +145,9 @@ public class ConstructBlock extends Block{
* If a non-recipe block is being deconstructed, this is the block that is being deconstructed. * If a non-recipe block is being deconstructed, this is the block that is being deconstructed.
*/ */
public Block previous; public Block previous;
public Object lastConfig; public @Nullable Object lastConfig;
public boolean wasConstructing; public boolean wasConstructing, activeDeconstruct;
public float constructColor;
@Nullable @Nullable
public Unit lastBuilder; public Unit lastBuilder;
@@ -176,7 +177,7 @@ public class ConstructBlock extends Block{
@Override @Override
public void tapped(){ public void tapped(){
//if the target is constructible, begin constructing //if the target is constructable, begin constructing
if(cblock != null){ if(cblock != null){
if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){ if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){
control.input.isBuilding = true; control.input.isBuilding = true;
@@ -194,6 +195,12 @@ public class ConstructBlock extends Block{
} }
} }
@Override
public void updateTile(){
constructColor = Mathf.lerpDelta(constructColor, activeDeconstruct ? 1f : 0f, 0.2f);
activeDeconstruct = false;
}
@Override @Override
public void draw(){ public void draw(){
if(!(previous == null || cblock == null || previous == cblock) && Core.atlas.isFound(previous.icon(Cicon.full))){ if(!(previous == null || cblock == null || previous == cblock) && Core.atlas.isFound(previous.icon(Cicon.full))){
@@ -201,7 +208,7 @@ public class ConstructBlock extends Block{
} }
Draw.draw(Layer.blockBuilding, () -> { Draw.draw(Layer.blockBuilding, () -> {
Shaders.blockbuild.color = Pal.accent; Draw.color(Pal.accent, Pal.remove, constructColor);
Block target = cblock == null ? previous : cblock; Block target = cblock == null ? previous : cblock;
@@ -214,11 +221,14 @@ public class ConstructBlock extends Block{
Draw.flush(); Draw.flush();
} }
} }
Draw.color();
}); });
} }
public void construct(Unit builder, @Nullable Building core, float amount, Object config){ public void construct(Unit builder, @Nullable Building core, float amount, Object config){
wasConstructing = true; wasConstructing = true;
activeDeconstruct = false;
if(cblock == null){ if(cblock == null){
kill(); kill();
return; return;
@@ -254,6 +264,7 @@ public class ConstructBlock extends Block{
public void deconstruct(Unit builder, @Nullable Building core, float amount){ public void deconstruct(Unit builder, @Nullable Building core, float amount){
wasConstructing = false; wasConstructing = false;
activeDeconstruct = true;
float deconstructMultiplier = state.rules.deconstructRefundMultiplier; float deconstructMultiplier = state.rules.deconstructRefundMultiplier;
if(builder.isPlayer()){ if(builder.isPlayer()){
@@ -333,7 +344,8 @@ public class ConstructBlock extends Block{
} }
public void setConstruct(Block previous, Block block){ public void setConstruct(Block previous, Block block){
wasConstructing = true; this.constructColor = 0f;
this.wasConstructing = true;
this.cblock = block; this.cblock = block;
this.previous = previous; this.previous = previous;
this.accumulator = new float[block.requirements.length]; this.accumulator = new float[block.requirements.length];
@@ -343,7 +355,9 @@ public class ConstructBlock extends Block{
public void setDeconstruct(Block previous){ public void setDeconstruct(Block previous){
if(previous == null) return; if(previous == null) return;
wasConstructing = false;
this.constructColor = 1f;
this.wasConstructing = false;
this.previous = previous; this.previous = previous;
this.progress = 1f; this.progress = 1f;
if(previous.buildCost >= 0.01f){ if(previous.buildCost >= 0.01f){

View File

@@ -12,7 +12,8 @@ public class ArmoredConveyor extends Conveyor{
@Override @Override
public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){
return otherblock.outputsItems() && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock); return (otherblock.outputsItems() && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock)) ||
(lookingAt(tile, rotation, otherx, othery, otherblock) && otherblock.hasItems);
} }
public class ArmoredConveyorBuild extends ConveyorBuild{ public class ArmoredConveyorBuild extends ConveyorBuild{

View File

@@ -179,23 +179,35 @@ public class StackConveyor extends Block implements Autotiler{
} }
} }
@Override
public boolean canUnload(){
return state != stateLoad;
}
@Override
public float efficiency(){
return 1f;
}
@Override @Override
public void updateTile(){ public void updateTile(){
// reel in crater // reel in crater
if(cooldown > 0f) cooldown = Mathf.clamp(cooldown - speed * edelta(), 0f, recharge); if(cooldown > 0f) cooldown = Mathf.clamp(cooldown - speed * edelta(), 0f, recharge);
if(link == -1){ // indicates empty state
return; if(link == -1) return;
}
// crater needs to be centered // crater needs to be centered
if(cooldown > 0f) return; if(cooldown > 0f) return;
// get current item // get current item
if(lastItem == null){ if(lastItem == null || !items.has(lastItem)){
lastItem = items.first(); lastItem = items.first();
} }
// do not continue if disabled, will still allow one to be reeled in to prevent visual stacking
if(!enabled) return;
if(state == stateUnload){ //unload if(state == stateUnload){ //unload
while(lastItem != null && (!splitOut ? moveForward(lastItem) : dump(lastItem))){ while(lastItem != null && (!splitOut ? moveForward(lastItem) : dump(lastItem))){
if(items.empty()) poofOut(); if(items.empty()) poofOut();
@@ -254,6 +266,7 @@ public class StackConveyor extends Block implements Autotiler{
@Override @Override
public void handleStack(Item item, int amount, Teamc source){ public void handleStack(Item item, int amount, Teamc source){
if(amount <= 0) return;
if(items.empty()) poofIn(); if(items.empty()) poofIn();
super.handleStack(item, amount, source); super.handleStack(item, amount, source);
lastItem = item; lastItem = item;

View File

@@ -1,5 +1,6 @@
package mindustry.world.blocks.experimental; package mindustry.world.blocks.experimental;
import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
@@ -18,8 +19,11 @@ import mindustry.world.blocks.payloads.*;
import mindustry.world.blocks.production.*; import mindustry.world.blocks.production.*;
import mindustry.world.consumers.*; import mindustry.world.consumers.*;
import static mindustry.Vars.*;
public class BlockForge extends PayloadAcceptor{ public class BlockForge extends PayloadAcceptor{
public float buildSpeed = 0.4f; public float buildSpeed = 0.4f;
public int minBlockSize = 1, maxBlockSize = 2;
public BlockForge(String name){ public BlockForge(String name){
super(name); super(name);
@@ -32,7 +36,10 @@ public class BlockForge extends PayloadAcceptor{
hasPower = true; hasPower = true;
rotate = true; rotate = true;
config(Block.class, (BlockForgeBuild tile, Block block) -> tile.recipe = block); config(Block.class, (BlockForgeBuild tile, Block block) -> {
if(tile.recipe != block) tile.progress = 0f;
tile.recipe = block;
});
consumes.add(new ConsumeItemDynamic((BlockForgeBuild e) -> e.recipe != null ? e.recipe.requirements : ItemStack.empty)); consumes.add(new ConsumeItemDynamic((BlockForgeBuild e) -> e.recipe != null ? e.recipe.requirements : ItemStack.empty));
} }
@@ -91,8 +98,6 @@ public class BlockForge extends PayloadAcceptor{
payVector.setZero(); payVector.setZero();
progress = 0f; progress = 0f;
} }
}else{
progress = 0;
} }
heat = Mathf.lerpDelta(heat, Mathf.num(produce), 0.3f); heat = Mathf.lerpDelta(heat, Mathf.num(produce), 0.3f);
@@ -103,7 +108,7 @@ public class BlockForge extends PayloadAcceptor{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
Seq<Block> blocks = Vars.content.blocks().select(b -> b.isVisible() && b.size <= 2); Seq<Block> blocks = Vars.content.blocks().select(b -> b.isVisible() && b.size >= minBlockSize && b.size <= maxBlockSize);
ItemSelection.buildTable(table, blocks, () -> recipe, this::configure); ItemSelection.buildTable(table, blocks, () -> recipe, this::configure);
} }
@@ -125,6 +130,19 @@ public class BlockForge extends PayloadAcceptor{
drawPayload(); drawPayload();
} }
@Override
public void drawSelect(){
if(recipe != null){
float dx = x - size * tilesize/2f, dy = y + size * tilesize/2f;
TextureRegion icon = recipe.icon(Cicon.medium);
Draw.mixcol(Color.darkGray, 1f);
//Fixes size because modded content icons are not scaled
Draw.rect(icon, dx - 0.7f, dy - 1f, Draw.scl * Draw.xscl * 24f, Draw.scl * Draw.yscl * 24f);
Draw.reset();
Draw.rect(icon, dx, dy, Draw.scl * Draw.xscl * 24f, Draw.scl * Draw.yscl * 24f);
}
}
@Override @Override
public void write(Writes write){ public void write(Writes write){
super.write(write); super.write(write);

View File

@@ -1,5 +1,6 @@
package mindustry.world.blocks.experimental; package mindustry.world.blocks.experimental;
import arc.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.util.*; import arc.util.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
@@ -18,6 +19,7 @@ public class BlockLoader extends PayloadAcceptor{
public float loadTime = 2f; public float loadTime = 2f;
public int itemsLoaded = 5; public int itemsLoaded = 5;
public float liquidsLoaded = 5f; public float liquidsLoaded = 5f;
public int maxBlockSize = 2;
public BlockLoader(String name){ public BlockLoader(String name){
super(name); super(name);
@@ -45,12 +47,13 @@ public class BlockLoader extends PayloadAcceptor{
public void setBars(){ public void setBars(){
super.setBars(); super.setBars();
bars.add("progress", entity -> new Bar("bar.progress", Pal.ammo, ((BlockLoaderBuild)entity)::fraction)); bars.add("progress", (BlockLoaderBuild entity) -> new Bar(() -> Core.bundle.format("bar.items", entity.payload == null ? 0 : entity.payload.build.items.total()), () -> Pal.items, entity::fraction));
} }
@Override @Override
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){ public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
Draw.rect(region, req.drawx(), req.drawy()); Draw.rect(region, req.drawx(), req.drawy());
Draw.rect(inRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(topRegion, req.drawx(), req.drawy()); Draw.rect(topRegion, req.drawx(), req.drawy());
} }
@@ -60,8 +63,8 @@ public class BlockLoader extends PayloadAcceptor{
@Override @Override
public boolean acceptPayload(Building source, Payload payload){ public boolean acceptPayload(Building source, Payload payload){
return super.acceptPayload(source, payload) && return super.acceptPayload(source, payload) &&
(payload instanceof BuildPayload) && (payload instanceof BuildPayload build) &&
((((BuildPayload)payload).build.block.hasItems && ((BuildPayload)payload).block().unloadable && ((BuildPayload)payload).block().itemCapacity >= 10)/* || ((build.build.block.hasItems && build.block().unloadable && build.block().itemCapacity >= 10 && build.block().size <= maxBlockSize)/* ||
((BlockPayload)payload).entity.block().hasLiquids && ((BlockPayload)payload).block().liquidCapacity >= 10f)*/); ((BlockPayload)payload).entity.block().hasLiquids && ((BlockPayload)payload).block().liquidCapacity >= 10f)*/);
} }
@@ -75,11 +78,14 @@ public class BlockLoader extends PayloadAcceptor{
Draw.rect(region, x, y); Draw.rect(region, x, y);
//draw input //draw input
boolean fallback = true;
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
if(blends(i) && i != rotation){ if(blends(i) && i != rotation){
Draw.rect(inRegion, x, y, (i * 90) - 180); Draw.rect(inRegion, x, y, (i * 90) - 180);
fallback = false;
} }
} }
if(fallback) Draw.rect(inRegion, x, y, rotation * 90);
Draw.rect(outRegion, x, y, rotdeg()); Draw.rect(outRegion, x, y, rotdeg());
@@ -99,7 +105,7 @@ public class BlockLoader extends PayloadAcceptor{
//load up items //load up items
if(payload.block().hasItems && items.any()){ if(payload.block().hasItems && items.any()){
if(timer(timerLoad, loadTime)){ if(efficiency() > 0.01f && timer(timerLoad, loadTime / efficiency())){
//load up items a set amount of times //load up items a set amount of times
for(int j = 0; j < itemsLoaded && items.any(); j++){ for(int j = 0; j < itemsLoaded && items.any(); j++){

View File

@@ -31,7 +31,7 @@ public class BlockUnloader extends BlockLoader{
//load up items //load up items
if(payload.block().hasItems && !full()){ if(payload.block().hasItems && !full()){
if(timer(timerLoad, loadTime)){ if(efficiency() > 0.01f && timer(timerLoad, loadTime / efficiency())){
//load up items a set amount of times //load up items a set amount of times
for(int j = 0; j < itemsLoaded && !full(); j++){ for(int j = 0; j < itemsLoaded && !full(); j++){
for(int i = 0; i < items.length(); i++){ for(int i = 0; i < items.length(); i++){
@@ -54,11 +54,6 @@ public class BlockUnloader extends BlockLoader{
return items.total() >= itemCapacity; return items.total() >= itemCapacity;
} }
@Override
public float fraction(){
return payload == null ? 0f : 1f - payload.build.items.total() / (float)payload.build.block.itemCapacity;
}
@Override @Override
public boolean shouldExport(){ public boolean shouldExport(){
return payload != null && (payload.block().hasItems && payload.build.items.empty()); return payload != null && (payload.block().hasItems && payload.build.items.empty());

View File

@@ -16,7 +16,8 @@ public class ArmoredConduit extends Conduit{
@Override @Override
public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){
return otherblock.outputsLiquid && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock); return (otherblock.outputsLiquid && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock)) ||
(lookingAt(tile, rotation, otherx, othery, otherblock) && otherblock.hasLiquids);
} }
public class ArmoredConduitBuild extends ConduitBuild{ public class ArmoredConduitBuild extends ConduitBuild{
@@ -24,7 +25,7 @@ public class ArmoredConduit extends Conduit{
public void draw(){ public void draw(){
super.draw(); super.draw();
// draw the cap when a conduit would normally leak //draw the cap when a conduit would normally leak
Building next = front(); Building next = front();
if(next != null && next.team == team && next.block.hasLiquids) return; if(next != null && next.team == team && next.block.hasLiquids) return;

View File

@@ -98,7 +98,7 @@ public class ItemLiquidGenerator extends PowerGenerator{
//Power amount is delta'd by PowerGraph class already. //Power amount is delta'd by PowerGraph class already.
float calculationDelta = delta(); float calculationDelta = delta();
heat = Mathf.lerpDelta(heat, generateTime >= 0.001f ? 1f : 0f, 0.05f); heat = Mathf.lerpDelta(heat, generateTime >= 0.001f && enabled ? 1f : 0f, 0.05f);
if(!consValid()){ if(!consValid()){
productionEfficiency = 0.0f; productionEfficiency = 0.0f;

View File

@@ -100,7 +100,7 @@ public class NuclearReactor extends PowerGenerator{
float smoke = 1.0f + (heat - smokeThreshold) / (1f - smokeThreshold); //ranges from 1.0 to 2.0 float smoke = 1.0f + (heat - smokeThreshold) / (1f - smokeThreshold); //ranges from 1.0 to 2.0
if(Mathf.chance(smoke / 20.0 * delta())){ if(Mathf.chance(smoke / 20.0 * delta())){
Fx.reactorsmoke.at(x + Mathf.range(size * tilesize / 2f), Fx.reactorsmoke.at(x + Mathf.range(size * tilesize / 2f),
y + Mathf.random(size * tilesize / 2f)); y + Mathf.range(size * tilesize / 2f));
} }
} }

View File

@@ -13,10 +13,10 @@ public class PowerGraph{
private static final Seq<Building> outArray2 = new Seq<>(); private static final Seq<Building> outArray2 = new Seq<>();
private static final IntSet closedSet = new IntSet(); private static final IntSet closedSet = new IntSet();
private final ObjectSet<Building> producers = new ObjectSet<>(); private final Seq<Building> producers = new Seq<>(false);
private final ObjectSet<Building> consumers = new ObjectSet<>(); private final Seq<Building> consumers = new Seq<>(false);
private final ObjectSet<Building> batteries = new ObjectSet<>(); private final Seq<Building> batteries = new Seq<>(false);
private final ObjectSet<Building> all = new ObjectSet<>(); private final Seq<Building> all = new Seq<>(false);
private final WindowedMean powerBalance = new WindowedMean(60); private final WindowedMean powerBalance = new WindowedMean(60);
private float lastPowerProduced, lastPowerNeeded, lastPowerStored; private float lastPowerProduced, lastPowerNeeded, lastPowerStored;
@@ -209,7 +209,6 @@ public class PowerGraph{
float powerNeeded = getPowerNeeded(); float powerNeeded = getPowerNeeded();
float powerProduced = getPowerProduced(); float powerProduced = getPowerProduced();
float rawProduced = powerProduced;
lastPowerNeeded = powerNeeded; lastPowerNeeded = powerNeeded;
lastPowerProduced = powerProduced; lastPowerProduced = powerProduced;
@@ -244,20 +243,24 @@ public class PowerGraph{
} }
} }
public void add(Building tile){ public void add(Building build){
if(tile == null || tile.power == null) return; if(build == null || build.power == null) return;
tile.power.graph = this;
all.add(tile);
if(tile.block.outputsPower && tile.block.consumesPower && !tile.block.consumes.getPower().buffered){ if(build.power.graph != this || !build.power.init){
producers.add(tile); build.power.graph = this;
consumers.add(tile); build.power.init = true;
}else if(tile.block.outputsPower && tile.block.consumesPower){ all.add(build);
batteries.add(tile);
}else if(tile.block.outputsPower){ if(build.block.outputsPower && build.block.consumesPower && !build.block.consumes.getPower().buffered){
producers.add(tile); producers.add(build);
}else if(tile.block.consumesPower){ consumers.add(build);
consumers.add(tile); }else if(build.block.outputsPower && build.block.consumesPower){
batteries.add(build);
}else if(build.block.outputsPower){
producers.add(build);
}else if(build.block.consumesPower){
consumers.add(build);
}
} }
} }
@@ -278,10 +281,10 @@ public class PowerGraph{
} }
private void removeSingle(Building tile){ private void removeSingle(Building tile){
all.remove(tile); all.remove(tile, true);
producers.remove(tile); producers.remove(tile, true);
consumers.remove(tile); consumers.remove(tile, true);
batteries.remove(tile); batteries.remove(tile, true);
} }
public void remove(Building tile){ public void remove(Building tile){

View File

@@ -318,8 +318,7 @@ public class PowerNode extends PowerBlock{
public void dropped(){ public void dropped(){
power.links.clear(); power.links.clear();
//create new power graph to manually unlink (this may be redundant) //create new power graph to manually unlink (this may be redundant)
power.graph = new PowerGraph(); new PowerGraph().add(this);
power.graph.add(this);
} }
@Override @Override

View File

@@ -61,7 +61,7 @@ public class Unloader extends Block{
int pos = (offset + i) % proximity.size; int pos = (offset + i) % proximity.size;
var other = proximity.get(pos); var other = proximity.get(pos);
if(other.interactable(team) && other.block.unloadable && other.block.hasItems if(other.interactable(team) && other.block.unloadable && other.canUnload() && other.block.hasItems
&& ((sortItem == null && other.items.total() > 0) || (sortItem != null && other.items.has(sortItem)))){ && ((sortItem == null && other.items.total() > 0) || (sortItem != null && other.items.has(sortItem)))){
//make sure the item can't be dumped back into this block //make sure the item can't be dumped back into this block
dumpingTo = other; dumpingTo = other;

View File

@@ -33,6 +33,7 @@ public class Reconstructor extends UnitBlock{
@Override @Override
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){ public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
Draw.rect(region, req.drawx(), req.drawy()); Draw.rect(region, req.drawx(), req.drawy());
Draw.rect(inRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(topRegion, req.drawx(), req.drawy()); Draw.rect(topRegion, req.drawx(), req.drawy());
} }
@@ -127,11 +128,14 @@ public class Reconstructor extends UnitBlock{
Draw.rect(region, x, y); Draw.rect(region, x, y);
//draw input //draw input
boolean fallback = true;
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
if(blends(i) && i != rotation){ if(blends(i) && i != rotation){
Draw.rect(inRegion, x, y, (i * 90) - 180); Draw.rect(inRegion, x, y, (i * 90) - 180);
fallback = false;
} }
} }
if(fallback) Draw.rect(inRegion, x, y, rotation * 90);
Draw.rect(outRegion, x, y, rotdeg()); Draw.rect(outRegion, x, y, rotdeg());

View File

@@ -43,10 +43,12 @@ public class ConsumeItemDynamic extends Consume{
private void rebuild(Building tile, Table table){ private void rebuild(Building tile, Table table){
table.clear(); table.clear();
int i = 0;
for(ItemStack stack : items.get(tile)){ for(ItemStack stack : items.get(tile)){
table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount),
() -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8).left();
if(++i % 4 == 0) table.row();
} }
} }

View File

@@ -34,10 +34,14 @@ public class ConsumeItems extends Consume{
@Override @Override
public void build(Building tile, Table table){ public void build(Building tile, Table table){
for(ItemStack stack : items){ table.table(c -> {
table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), int i = 0;
for(ItemStack stack : items){
c.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount),
() -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8);
} if(++i % 4 == 0) table.row();
}
}).left();
} }
@Override @Override

View File

@@ -47,7 +47,7 @@ public class AmmoListValue<T extends UnlockableContent> implements StatValue{
} }
if(type.buildingDamageMultiplier != 1){ if(type.buildingDamageMultiplier != 1){
sep(bt, Core.bundle.format("bullet.buildingdamage", type.buildingDamageMultiplier * 100)); sep(bt, Core.bundle.format("bullet.buildingdamage", (int)(type.buildingDamageMultiplier * 100)));
} }
if(type.splashDamage > 0){ if(type.splashDamage > 0){

View File

@@ -11,6 +11,7 @@ public class PowerModule extends BlockModule{
* In case of buffered consumers, this is the percentage of power stored in relation to the maximum capacity. * In case of buffered consumers, this is the percentage of power stored in relation to the maximum capacity.
*/ */
public float status = 0.0f; public float status = 0.0f;
public boolean init;
public PowerGraph graph = new PowerGraph(); public PowerGraph graph = new PowerGraph();
public IntSeq links = new IntSeq(); public IntSeq links = new IntSeq();

View File

@@ -0,0 +1,10 @@
[This is a truncated changelog, see Github for full notes]
- Fixed Quad AI
- Fixed crash in conveyor upgrade pathing
- Fixed other various crashes
- Made payload pickups prioritize units in blocks instead of the blocks themselves
- Increased foreshadow coolant effectiveness, but slightly decreased rotation speed
- Improved space skybox scaling
- Added building damage stats to bullets
- Added WIP mod browser for GitHub mods
- Added bridge link preview

View File

@@ -1,6 +1,6 @@
Create elaborate supply chains of conveyor belts to feed ammo into your turrets, produce materials to use for building, and defend your structures from waves of enemies. Play with your friends in cross-platform multiplayer co-op games, or challenge them in team-based PvP matches. Create elaborate supply chains of conveyor belts to feed ammo into your turrets, produce materials to use for building, and defend your structures from waves of enemies. Play with your friends in cross-platform multiplayer co-op games, or challenge them in team-based PvP matches.
Feature include: Features include:
- 24 built-in maps - 24 built-in maps
- A campaign, complete with a tech tree and unlockable areas - A campaign, complete with a tech tree and unlockable areas
- 4 powerful wave bosses to defeat - 4 powerful wave bosses to defeat

View File

@@ -0,0 +1,10 @@
[이 변경점은 몹시 생략되었습니다. 모든 변경점을 볼려면 Github를 보십시오.]
- 코어 옆 창고를 재건설해서 1천의 자원이 사라지는 문제점 수정
- 점령한 지역들이 잠금되는 현상 수정
캠페인 멀티플레이어 변경점:
- 이제 호스트가 새로 해금한 것들은 클라이언트에게도 이어짐
- 이제 클라이언트는 호스트가 가지지 않았더라도 그들이 해금한 콘텐츠를 사용할 수 있음
- 이제 클라이언트는 멀티플레이어에서 새로운 콘텐츠를 해금할 수 있음
- 이 정보를 설명하는 힌트 추가

View File

@@ -0,0 +1,8 @@
[이 변경점은 몹시 생략되었습니다. 모든 변경점을 볼려면 Github를 보십시오.]
- 랜서 건설 비용이 약간 상승됨
- 이제 두 번 터치하면 캠페인 지역으로 들어감 (기여자: @joshuaptfan)
- 부 로직 메모리 최적화 - 더 이상 모든 프로세서에 블록/센서 상수가 저장되지 않음
- 설금 제련소의 아이템 저장량이 2배 상승함
- Fungal Pass 를 약간 쉽게 만듬
- 드문 크래쉬들을 수정
- 유닛 스폰 충격파가 너무 늦게 나오는 문제점 수정

View File

@@ -0,0 +1,2 @@
[이 변경점은 몹시 생략되었습니다. 모든 변경점을 볼려면 Github를 보십시오.]
- 행성 지역과 관련된 흔한 크래쉬 수정

View File

@@ -0,0 +1,10 @@
[이 변경점은 엄청 생략되었습니다. 모든 변경점을 볼려면 Github를 보십시오.]
- 쿼드 AI 고침
- 컨베이어 업그레이드 경로에서 생기는 크래쉬 고침
- 다른 다양한 크래쉬들 고침
- 화물을 픽업할 때, 유닛이 든 블록의 유닛이 블록 자체보다 먼저 집히게 만듬
- 포어쉐도우의 냉각 효율을 증가, 포신 이동속도를 약간 감소
- 우주 스카이박스 스케일링 향상
- 건물 데미지 정보를 탄환에 추가
- 깃허브 모드를 위한 WIP 모드 브라우저 추가
- 다리 연결 미리보기 추가

View File

@@ -1,16 +1,14 @@
민더스트리 Mindustry는 샌드박스형 타워디펜스 게임입니다. 정교한 컨베이어 벨트 공급망을 만들어 포탑에 탄약을 공급하고 건물에 사용할 재료를 생산하여 적의 공격으로부터 기지를 방어하십시오. 이 게임은 크로스플랫폼입니다. 데스크탑, 안드로이드, IOS, 리눅스 등 다양한 플랫폼을 지원합니다. 또한 멀티플레이어도 지원하므로, 대형 혹은 어려운 맵에서 협동을 통해 같이 플레이하시거나 팀 pvp를 통해 실력을 자랑해 보세요. 정교한 컨베이어 벨트 공급망을 만들어 포탑에 탄약을 공급하고 건물에 사용할 재료를 생산하여 적의 공격으로부터 기지를 방어하십시오. 크로스 플렛폼 멀티플레이어에서 친구와 함께 협동 대형 혹은 어려운 맵에서 협동거나, 팀 pvp를 통해 실력을 자랑해 보세요.
포함된 특징들 :
포함된 것들 : - 16개의 기본 맵들
- 24개의 맵들 - 해금 가능 지역과 테크 트리로 구성된 캠페인
- 캠페인, 연구 기록, 잠겨진 지역들과 같은 해금 요소!
- 당신을 파괴하기 위한 강력한 보스 - 당신을 파괴하기 위한 강력한 보스
- 전력, 액체, 자원 등의 수송 시스템 - 전력, 액체, 자원 수송 시스템
- 19가지의 드론, 유닛, 플레이어 기체 - 33가지의 각기 다른 드론, 유닛,
- 120종류가 넘는 블럭들 - 120종류가 넘는 블럭들
- 75가지가 넘는 환경 타일 및 블럭들 - 80가지가 넘는 환경 타일 및 블럭들
- 크로스 플랫폼 : 데스크탑, IOS, 안드로이드, 리눅스 모든 플랫폼 멀티가 가능합니다. - 로컬 네트워크 또는 전용 서버를 통한 크로스 플랫폼 멀티플레이어
- 자유로운 멀티플레이어 : 로컬 멀티플레이어, 서버, VPN 등을 통해 자유로운 멀티플레이가 가능합니다! - 사용자 정의 게임 규칙 : 블록 가격, 적 스텟 변경, 시작 자원, 단계 대기시간 그 이상을 변경해보세요.
- 사용자 정의 게임 규칙 : 블럭 재료 변경, 적 스텟 변경, 단계 대기시간 변경등 규칙 변경을 통해 어려운 모드에 도전해보시거나 쉽게 플레이해보세요. - 맵에 광물, 지형, 장식을 랜덤으로 생성하고, 대칭을 추가해보세요.
- 다양한 기능이 있는 맵 에디터, 작업 도구들을 이용해 맵을 무작위로 생성하거나 아름답게 꾸며 보세요. 인-게임 에디터에서 멀티플레이어를 통해 친구와 같이 맵을 만들수도 있습니다! - 맵 규칙을 마음대로 바꿔보세요.
- 모드 : 새로운 모드를 제작하여 새로운 유닛, 블럭, 타일 등 자유로운 커스터마이징이 가능합니다.

View File

@@ -1 +1 @@
공장에 기반한 샌드박스 타워디펜스 게임입니다! 공장에 기반한 샌드박스 타워디펜스 게임입니다!

View File

@@ -3,16 +3,12 @@
"Language" "tchinese" "Language" "tchinese"
"Tokens" "Tokens"
{ {
"NEW_ACHIEVEMENT_20_0_NAME" "驗證通過"
"NEW_ACHIEVEMENT_20_0_DESC" "完成新手教學。"
"NEW_ACHIEVEMENT_20_1_NAME" "千人斬" "NEW_ACHIEVEMENT_20_1_NAME" "千人斬"
"NEW_ACHIEVEMENT_20_1_DESC" "累計擊敗 1000 名敵人。" "NEW_ACHIEVEMENT_20_1_DESC" "累計擊敗 1000 名敵人。"
"NEW_ACHIEVEMENT_20_2_NAME" "十萬青年十萬肝" "NEW_ACHIEVEMENT_20_2_NAME" "十萬青年十萬肝"
"NEW_ACHIEVEMENT_20_2_DESC" "累計擊敗 100,000 名敵人。" "NEW_ACHIEVEMENT_20_2_DESC" "累計擊敗 100,000 名敵人。"
"NEW_ACHIEVEMENT_20_3_NAME" "大氣輸送"
"NEW_ACHIEVEMENT_20_3_DESC" "累計發射 10,000 個物品。"
"NEW_ACHIEVEMENT_20_5_NAME" "出貨出不完" "NEW_ACHIEVEMENT_20_5_NAME" "出貨出不完"
"NEW_ACHIEVEMENT_20_5_DESC" "累計發射 1,000,000 個物品。" "NEW_ACHIEVEMENT_20_5_DESC" "累計發射 100,000 個物品。"
"NEW_ACHIEVEMENT_20_6_NAME" "征服者" "NEW_ACHIEVEMENT_20_6_NAME" "征服者"
"NEW_ACHIEVEMENT_20_6_DESC" "在 10 場攻擊模式中獲勝。" "NEW_ACHIEVEMENT_20_6_DESC" "在 10 場攻擊模式中獲勝。"
"NEW_ACHIEVEMENT_20_7_NAME" "冠軍" "NEW_ACHIEVEMENT_20_7_NAME" "冠軍"
@@ -23,18 +19,14 @@
"NEW_ACHIEVEMENT_20_9_DESC" "將您的核心發射到一個區域 30 次。" "NEW_ACHIEVEMENT_20_9_DESC" "將您的核心發射到一個區域 30 次。"
"NEW_ACHIEVEMENT_20_10_NAME" "頑強抵抗" "NEW_ACHIEVEMENT_20_10_NAME" "頑強抵抗"
"NEW_ACHIEVEMENT_20_10_DESC" "活過 100 波。" "NEW_ACHIEVEMENT_20_10_DESC" "活過 100 波。"
"NEW_ACHIEVEMENT_20_11_NAME" "不可征服"
"NEW_ACHIEVEMENT_20_11_DESC" "活過 500 波。"
"NEW_ACHIEVEMENT_20_12_NAME" "研究者" "NEW_ACHIEVEMENT_20_12_NAME" "研究者"
"NEW_ACHIEVEMENT_20_12_DESC" "研究所有科技。" "NEW_ACHIEVEMENT_20_12_DESC" "研究所有科技。"
"NEW_ACHIEVEMENT_20_13_NAME" "變形金剛"
"NEW_ACHIEVEMENT_20_13_DESC" "解鎖並變形成所有機甲。"
"NEW_ACHIEVEMENT_20_14_NAME" "超載" "NEW_ACHIEVEMENT_20_14_NAME" "超載"
"NEW_ACHIEVEMENT_20_14_DESC" "以電力攻擊被水覆蓋的敵人。" "NEW_ACHIEVEMENT_20_14_DESC" "以電力攻擊被水覆蓋的敵人。"
"NEW_ACHIEVEMENT_20_15_NAME" "以子之矛,攻子之盾" "NEW_ACHIEVEMENT_20_15_NAME" "以子之矛,攻子之盾"
"NEW_ACHIEVEMENT_20_15_DESC" "用敵人的子彈摧毀它自己。" "NEW_ACHIEVEMENT_20_15_DESC" "用敵人的子彈摧毀它自己。"
"NEW_ACHIEVEMENT_20_17_NAME" "嚴重的錯誤" "NEW_ACHIEVEMENT_20_17_NAME" "你不該這麼做的"
"NEW_ACHIEVEMENT_20_17_DESC" "研究路由器。" "NEW_ACHIEVEMENT_20_17_DESC" "研究分配器。"
"NEW_ACHIEVEMENT_20_18_NAME" "大興土木" "NEW_ACHIEVEMENT_20_18_NAME" "大興土木"
"NEW_ACHIEVEMENT_20_18_DESC" "放置 10,000 個方塊。" "NEW_ACHIEVEMENT_20_18_DESC" "放置 10,000 個方塊。"
"NEW_ACHIEVEMENT_20_19_NAME" "夷為平地" "NEW_ACHIEVEMENT_20_19_NAME" "夷為平地"
@@ -51,8 +43,6 @@
"NEW_ACHIEVEMENT_20_24_DESC" "擊敗一次頭目。" "NEW_ACHIEVEMENT_20_24_DESC" "擊敗一次頭目。"
"NEW_ACHIEVEMENT_20_25_NAME" "探索者" "NEW_ACHIEVEMENT_20_25_NAME" "探索者"
"NEW_ACHIEVEMENT_20_25_DESC" "解鎖戰役模式中的所有區域。" "NEW_ACHIEVEMENT_20_25_DESC" "解鎖戰役模式中的所有區域。"
"NEW_ACHIEVEMENT_20_26_NAME" "完全主義"
"NEW_ACHIEVEMENT_20_26_DESC" "達到所有區域解鎖裝載配置的波次。"
"NEW_ACHIEVEMENT_20_29_NAME" "材料II" "NEW_ACHIEVEMENT_20_29_NAME" "材料II"
"NEW_ACHIEVEMENT_20_29_DESC" "解鎖釷。" "NEW_ACHIEVEMENT_20_29_DESC" "解鎖釷。"
"NEW_ACHIEVEMENT_20_31_NAME" "材料I" "NEW_ACHIEVEMENT_20_31_NAME" "材料I"
@@ -67,28 +57,22 @@
"NEW_ACHIEVEMENT_21_3_DESC" "同時擁有 100 個單位。" "NEW_ACHIEVEMENT_21_3_DESC" "同時擁有 100 個單位。"
"NEW_ACHIEVEMENT_21_4_NAME" "建造大隊" "NEW_ACHIEVEMENT_21_4_NAME" "建造大隊"
"NEW_ACHIEVEMENT_21_4_DESC" "同時擁有 10 個鬼怪無人機。" "NEW_ACHIEVEMENT_21_4_DESC" "同時擁有 10 個鬼怪無人機。"
"NEW_ACHIEVEMENT_21_5_NAME" "不穩定軍隊" "NEW_ACHIEVEMENT_21_5_NAME" "機器人專家"
"NEW_ACHIEVEMENT_21_5_DESC" "同時擁有 50 個爬行者。" "NEW_ACHIEVEMENT_21_5_DESC" "建造每一種單位。"
"NEW_ACHIEVEMENT_21_6_NAME" "軍團" "NEW_ACHIEVEMENT_21_6_NAME" "軍團"
"NEW_ACHIEVEMENT_21_6_DESC" "總共建造 1000 個單位。" "NEW_ACHIEVEMENT_21_6_DESC" "總共建造 1000 個單位。"
"NEW_ACHIEVEMENT_21_7_NAME" "超強"
"NEW_ACHIEVEMENT_21_7_DESC" "在任意區域達到 S 等級。"
"NEW_ACHIEVEMENT_21_8_NAME" "超超強"
"NEW_ACHIEVEMENT_21_8_DESC" "在任意區域達到 SS 等級。"
"NEW_ACHIEVEMENT_21_9_NAME" "誰叫你不聽?" "NEW_ACHIEVEMENT_21_9_NAME" "誰叫你不聽?"
"NEW_ACHIEVEMENT_21_9_DESC" "在敵方空降區死亡。" "NEW_ACHIEVEMENT_21_9_DESC" "在敵方空降區死亡。"
"NEW_ACHIEVEMENT_21_10_NAME" "只要按 Shift" "NEW_ACHIEVEMENT_21_10_NAME" "當海軍吃素的?"
"NEW_ACHIEVEMENT_21_10_DESC" "被淹死。" "NEW_ACHIEVEMENT_21_10_DESC" "被淹死。"
"NEW_ACHIEVEMENT_21_11_NAME" "蒐集者" "NEW_ACHIEVEMENT_21_11_NAME" "蒐集者"
"NEW_ACHIEVEMENT_21_11_DESC" "將核心裝滿所有類型的資源。" "NEW_ACHIEVEMENT_21_11_DESC" "將核心裝滿所有類型的資源。"
"NEW_ACHIEVEMENT_21_12_NAME" "人群" "NEW_ACHIEVEMENT_21_12_NAME" "人群"
"NEW_ACHIEVEMENT_21_12_DESC" "建立一個有 10 個玩家的伺服器。" "NEW_ACHIEVEMENT_21_12_DESC" "建立一個有 10 個玩家的伺服器。"
"NEW_ACHIEVEMENT_21_13_NAME" "無懈可擊" "NEW_ACHIEVEMENT_21_13_NAME" "無懈可擊"
"NEW_ACHIEVEMENT_21_13_DESC" "建造熔毀砲鬼影砲。" "NEW_ACHIEVEMENT_21_13_DESC" "建造熔毀砲鬼影砲和狙擊砲。"
"NEW_ACHIEVEMENT_21_14_NAME" "起飛" "NEW_ACHIEVEMENT_21_14_NAME" "起飛"
"NEW_ACHIEVEMENT_21_14_DESC" "使用發射臺。" "NEW_ACHIEVEMENT_21_14_DESC" "使用發射臺。"
"NEW_ACHIEVEMENT_21_15_NAME" "自業自得"
"NEW_ACHIEVEMENT_21_15_DESC" "跳過兩次發射機會後,核心被敵人摧毀。"
"NEW_ACHIEVEMENT_21_16_NAME" "異端邪說" "NEW_ACHIEVEMENT_21_16_NAME" "異端邪說"
"NEW_ACHIEVEMENT_21_16_DESC" "建造兩個彼此相鄰的路由器。" "NEW_ACHIEVEMENT_21_16_DESC" "建造兩個彼此相鄰的路由器。"
"NEW_ACHIEVEMENT_21_17_NAME" "孤獨的守護者" "NEW_ACHIEVEMENT_21_17_NAME" "孤獨的守護者"
@@ -105,5 +89,27 @@
"NEW_ACHIEVEMENT_21_22_DESC" "攜帶 10,000 或更多的資源進入一個地區。" "NEW_ACHIEVEMENT_21_22_DESC" "攜帶 10,000 或更多的資源進入一個地區。"
"NEW_ACHIEVEMENT_21_23_NAME" "點火" "NEW_ACHIEVEMENT_21_23_NAME" "點火"
"NEW_ACHIEVEMENT_21_23_DESC" "啟動衝擊反應器。" "NEW_ACHIEVEMENT_21_23_DESC" "啟動衝擊反應器。"
"NEW_ACHIEVEMENT_21_24_NAME" "加速"
"NEW_ACHIEVEMENT_21_24_DESC" "啟動行星際加速器。"
"NEW_ACHIEVEMENT_21_25_NAME" "螺旋"
"NEW_ACHIEVEMENT_21_25_DESC" "來跟著我旋轉..."
"NEW_ACHIEVEMENT_21_26_NAME" "情勢升溫"
"NEW_ACHIEVEMENT_21_26_DESC" "建造一個5階單位。"
"NEW_ACHIEVEMENT_21_27_NAME" "建築師"
"NEW_ACHIEVEMENT_21_27_DESC" "做20個藍圖。"
"NEW_ACHIEVEMENT_21_28_NAME" "全球征服"
"NEW_ACHIEVEMENT_21_28_DESC" "佔領蕈孢星上的每一個地區。"
"NEW_ACHIEVEMENT_21_29_NAME" "空運"
"NEW_ACHIEVEMENT_21_29_DESC" "Pick up a T5 unit in an Oct unit carrier."
"NEW_ACHIEVEMENT_21_30_NAME" "最終型態"
"NEW_ACHIEVEMENT_21_30_DESC" "加入它們。"
"NEW_ACHIEVEMENT_21_31_NAME" "工業化 I"
"NEW_ACHIEVEMENT_21_31_DESC" "戰役中總生產量達到 5,000 物品/分鐘。"
"NEW_ACHIEVEMENT_26_0_NAME" "工業化 II"
"NEW_ACHIEVEMENT_26_0_DESC" "戰役中總生產量達到 50,000 物品/分鐘。"
"NEW_ACHIEVEMENT_26_1_NAME" "必定勝利"
"NEW_ACHIEVEMENT_26_1_DESC" "在一個地區遊玩時佔領另外一個地區。"
"NEW_ACHIEVEMENT_26_2_NAME" "小型帝國"
"NEW_ACHIEVEMENT_26_2_DESC" "同時控制 10 個地區。"
} }
} }

View File

@@ -1,44 +1,48 @@
建立精密的輸送帶供應鏈,提供砲塔彈藥,生產建築原料,保護您的建築物並抵禦入侵的敵人。在跨平臺的多人合作遊戲中和朋友一起玩,或在團隊 PvP 比賽中向他們挑戰。
[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] [img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img]
[h2]基本遊戲操作[/h2] [h2]基本遊戲操作[/h2]
[list] [list]
[*] 建造精心設計的鑽頭與輸送帶,將資源轉移到您的核心 [*] 建造精密的供應系統裝填砲塔和生產建造所需的材料
[*] 使用方塊製作進階原料。 [*] 使用製造方塊製作一系列的進階原料。
[*] 製作無人機以自動採礦、協助建造與保護您的基地 [*] 抵禦敵人一波一波的攻擊
[*] 輸送液體並撲滅突發的火災 [*] 和朋友一同跨平台玩多人模式或是邀請進行多人PvP
[*] 可以選擇使用冷卻液與潤滑劑來提升砲塔與生產方塊的效率 [*] 輸送液體應對不同的挑戰,像是突發的火災或敵軍空襲
[*] 利用冷卻液或催化劑達成砲塔與生產方塊的最高效率。
[*] 生產各式各樣的機械達到基地的自動化或侵襲敵方基地。
[/list] [/list]
[img]{STEAM_APP_IMAGE}/extras/ezgif-1-8679abe089cd.gif[/img]
[h2]戰役模式[/h2] [h2]戰役模式[/h2]
[list] [list]
[*] 在 12 張可重複遊玩,並有隨機生成點的內建區域中前進 [*] 探索並征服蕈孢星上250+個地區和16個手作地圖。
[*] 採集並發射資源 [*] 佔領領地、建造工廠,在其他星區遊玩仍持續生產物資。
[*] 研究新科技以持續進步 [*] 抵禦敵方定時侵略,保衛領地。
[*] 配置發射裝載並攜帶資源到每個區域 [*] 運用發射臺分配地區間的資源。
[*] 多樣化的任務與目標 [*] 研究新方塊推進進度。
[*] 邀請友一完成關卡 [*] 邀請友一完成任務。
[*] 研究 120 種以上的科技 [*] 超過 120 種方塊供玩家使用、探索。
[*] 19 種不同類型的無人機、機甲與飛船 [*] 33 種不同類型的無人機、機甲和船艦
[*] 達成 50 種以上的成就 [*] 50+ 個成就可供解鎖
[/list] [/list]
[h2][h2]遊戲模式[/h2][/h2] [h2][h2]遊戲模式[/h2][/h2]
[list] [list]
[*] [b]生存[/b]:建造砲塔來抵禦敵人入侵。生存愈久愈好,選擇發射您的核心並將您採集的資源用來研究新科技。為敵人頭目的到來做好準備。 [*] [b]生存[/b]:建造砲塔來抵禦敵人入侵。生存愈久愈好,選擇發射您的核心並將您採集的資源用來研究新科技。為敵人頭目的到來做好準備。
[*] [b]攻擊[/b]:建造工廠並生產部隊來摧毀敵人的核心,同時保護自己的基地不受敵方單位的攻擊。建立各種不同類型的支援與攻擊單位來協助實現您的目標。 [*] [b]攻擊[/b]:建造工廠並生產部隊來摧毀敵人的核心,同時保護自己的基地不受敵方單位的攻擊。建立各種不同類型的支援與攻擊單位來協助實現您的目標。可選擇啟用自動建築防禦的AI增加難度。
[*] [b]PvP[/b]:與最多四個不同團隊的玩家競爭摧毀其他人的核心。建立單位或直接用您的飛船攻擊其他人的基地。 [*] [b]PvP[/b]:與最多四個不同團隊的玩家競爭摧毀其他人的核心。建立單位或直接用您的飛船攻擊其他人的基地。
[*] [b]沙盒[/b]:在資源無限而且無敵人威脅下盡情遊玩。使用僅在沙盒模式中才有的無限物品與液體來源以測試設計,並根據需要生成敵人。 [*] [b]沙盒[/b]:在資源無限而且無敵人威脅下盡情遊玩。使用僅在沙盒模式中才有的無限物品與液體來源以測試設計,並根據需要生成敵人。
[/list] [/list]
[img]{STEAM_APP_IMAGE}/extras/2020-11-30_10-46-02.gif[/img]
[h2]自訂遊戲與跨平臺多人遊戲[/h2] [h2]自訂遊戲與跨平臺多人遊戲[/h2]
[list] [list]
[*] 除了戰役以外,還有 12 個內建地圖可用於自訂遊戲 [*] 除了戰役以外,還有 16 個內建地圖可用於自訂遊戲
[*] 玩合作、PvP 或沙盒模式 [*] 玩合作、PvP 或沙盒模式
[*] 加入公開的專用伺服器,或邀請朋友加入您的私人伺服器 [*] 加入公開的專用伺服器,或邀請朋友加入您的私人伺服器
[*] 自訂遊戲規則:變更方塊花費、敵方屬性、起始物品、敵人來襲的間隔時間等 [*] 自訂遊戲規則:變更方塊花費、敵方屬性、起始物品、敵人來襲的間隔時間等
@@ -57,5 +61,5 @@
[*] 設定敵人攻擊佈局 [*] 設定敵人攻擊佈局
[*] 在 Steam 工作坊上分享匯出的地圖 [*] 在 Steam 工作坊上分享匯出的地圖
[*] 自訂地圖的基礎規則 [*] 自訂地圖的基礎規則
[*] 使用 75 種以上不同的環境方塊 [*] 使用 80 種以上不同的環境方塊
[/list] [/list]

View File

@@ -3,18 +3,14 @@
"Language" "korean" "Language" "korean"
"Tokens" "Tokens"
{ {
"NEW_ACHIEVEMENT_20_0_NAME" "인증된 플레이어"
"NEW_ACHIEVEMENT_20_0_DESC" "튜토리얼을 수료하세요."
"NEW_ACHIEVEMENT_20_1_NAME" "분쇄자" "NEW_ACHIEVEMENT_20_1_NAME" "분쇄자"
"NEW_ACHIEVEMENT_20_1_DESC" "적 유닛을 1000기 사살하세요" "NEW_ACHIEVEMENT_20_1_DESC" "적 유닛을 1000기 사살하세요"
"NEW_ACHIEVEMENT_20_2_NAME" "파괴자" "NEW_ACHIEVEMENT_20_2_NAME" "파괴자"
"NEW_ACHIEVEMENT_20_2_DESC" "적 유닛을 100,000기 사살하세요." "NEW_ACHIEVEMENT_20_2_DESC" "적 유닛을 100,000기 사살하세요."
"NEW_ACHIEVEMENT_20_3_NAME" "공중 교통 시스템"
"NEW_ACHIEVEMENT_20_3_DESC" "자원을 총 10,000개 출격시키세요."
"NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부" "NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부"
"NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요." "NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 100,000개 출격시키세요."
"NEW_ACHIEVEMENT_20_6_NAME" "정복자" "NEW_ACHIEVEMENT_20_6_NAME" "정복자"
"NEW_ACHIEVEMENT_20_6_DESC" "적 코어 파괴인 지역에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_6_DESC" "공격 모드 매치에서 10번 승리하세요."
"NEW_ACHIEVEMENT_20_7_NAME" "챔피언" "NEW_ACHIEVEMENT_20_7_NAME" "챔피언"
"NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요."
"NEW_ACHIEVEMENT_20_8_NAME" "진격!" "NEW_ACHIEVEMENT_20_8_NAME" "진격!"
@@ -23,12 +19,8 @@
"NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요." "NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요."
"NEW_ACHIEVEMENT_20_10_NAME" "끈질긴" "NEW_ACHIEVEMENT_20_10_NAME" "끈질긴"
"NEW_ACHIEVEMENT_20_10_DESC" "100 단계를 생존하세요." "NEW_ACHIEVEMENT_20_10_DESC" "100 단계를 생존하세요."
"NEW_ACHIEVEMENT_20_11_NAME" "바퀴벌레"
"NEW_ACHIEVEMENT_20_11_DESC" "500 단계를 생존하세요."
"NEW_ACHIEVEMENT_20_12_NAME" "연구원" "NEW_ACHIEVEMENT_20_12_NAME" "연구원"
"NEW_ACHIEVEMENT_20_12_DESC" "연구 기록의 모든 것을 연구하세요" "NEW_ACHIEVEMENT_20_12_DESC" "모든 것을 연구하세요"
"NEW_ACHIEVEMENT_20_13_NAME" "형상변환자"
"NEW_ACHIEVEMENT_20_13_DESC" "캠페인 지역에서 모든 기체로 변신하여 모든 기체를 해금하세요."
"NEW_ACHIEVEMENT_20_14_NAME" "과충전" "NEW_ACHIEVEMENT_20_14_NAME" "과충전"
"NEW_ACHIEVEMENT_20_14_DESC" "물에 젖은 적을 전기로 지져버리세요." "NEW_ACHIEVEMENT_20_14_DESC" "물에 젖은 적을 전기로 지져버리세요."
"NEW_ACHIEVEMENT_20_15_NAME" "무지개 반사" "NEW_ACHIEVEMENT_20_15_NAME" "무지개 반사"
@@ -45,14 +37,12 @@
"NEW_ACHIEVEMENT_20_21_DESC" "새로운 맵을 10개 만드세요." "NEW_ACHIEVEMENT_20_21_DESC" "새로운 맵을 10개 만드세요."
"NEW_ACHIEVEMENT_20_22_NAME" "브라우저" "NEW_ACHIEVEMENT_20_22_NAME" "브라우저"
"NEW_ACHIEVEMENT_20_22_DESC" "워크샵에서 맵을 1개 내려받으세요." "NEW_ACHIEVEMENT_20_22_DESC" "워크샵에서 맵을 1개 내려받으세요."
"NEW_ACHIEVEMENT_20_23_NAME" "Mindustry 크리에이터" "NEW_ACHIEVEMENT_20_23_NAME" "크리에이터"
"NEW_ACHIEVEMENT_20_23_DESC" "워크샵에 맵을 1개 올리세요." "NEW_ACHIEVEMENT_20_23_DESC" "워크샵에 맵을 1개 올리세요."
"NEW_ACHIEVEMENT_20_24_NAME" "슬레이어" "NEW_ACHIEVEMENT_20_24_NAME" "슬레이어"
"NEW_ACHIEVEMENT_20_24_DESC" "보스를 처치하세요." "NEW_ACHIEVEMENT_20_24_DESC" "보스를 처치하세요."
"NEW_ACHIEVEMENT_20_25_NAME" "탐험가" "NEW_ACHIEVEMENT_20_25_NAME" "익스플로러"
"NEW_ACHIEVEMENT_20_25_DESC" "캠페인의 모든 지역을 해금하세요." "NEW_ACHIEVEMENT_20_25_DESC" "캠페인의 모든 지역을 해금하세요."
"NEW_ACHIEVEMENT_20_26_NAME" "완벽주의자"
"NEW_ACHIEVEMENT_20_26_DESC" "모든 캠페인 지역에서 시작자원 설정 기능을 해금시키세요."
"NEW_ACHIEVEMENT_20_29_NAME" "자원 연구 II" "NEW_ACHIEVEMENT_20_29_NAME" "자원 연구 II"
"NEW_ACHIEVEMENT_20_29_DESC" "토륨을 해금하세요." "NEW_ACHIEVEMENT_20_29_DESC" "토륨을 해금하세요."
"NEW_ACHIEVEMENT_20_31_NAME" "자원 연구 I" "NEW_ACHIEVEMENT_20_31_NAME" "자원 연구 I"
@@ -60,43 +50,37 @@
"NEW_ACHIEVEMENT_21_0_NAME" "공포의 자폭 분대" "NEW_ACHIEVEMENT_21_0_NAME" "공포의 자폭 분대"
"NEW_ACHIEVEMENT_21_0_DESC" "당신의 기체를 폭발성이 있는 자원으로 채우고 사망하여 폭발을 일으키세요." "NEW_ACHIEVEMENT_21_0_DESC" "당신의 기체를 폭발성이 있는 자원으로 채우고 사망하여 폭발을 일으키세요."
"NEW_ACHIEVEMENT_21_1_NAME" "이제 시작이야" "NEW_ACHIEVEMENT_21_1_NAME" "이제 시작이야"
"NEW_ACHIEVEMENT_21_1_DESC" "대거 공장을 건설하세요." "NEW_ACHIEVEMENT_21_1_DESC" "지상 공장을 건설하세요."
"NEW_ACHIEVEMENT_21_2_NAME" "폭격 명령" "NEW_ACHIEVEMENT_21_2_NAME" "전군 진격"
"NEW_ACHIEVEMENT_21_2_DESC" "지휘소에서 공격 명령을 내리세요." "NEW_ACHIEVEMENT_21_2_DESC" "지휘소에서 공격 명령을 내리세요."
"NEW_ACHIEVEMENT_21_3_NAME" "물량" "NEW_ACHIEVEMENT_21_3_NAME" "물량"
"NEW_ACHIEVEMENT_21_3_DESC" "100기의 유닛을 한 게임에서 활성화시키세요." "NEW_ACHIEVEMENT_21_3_DESC" "한 게임에서 활성화된 100기의 유닛을 가지세요."
"NEW_ACHIEVEMENT_21_4_NAME" "추종자들" "NEW_ACHIEVEMENT_21_4_NAME" "추종자들"
"NEW_ACHIEVEMENT_21_4_DESC" "팬텀 건설 드론을 한 게임에서 10기 활성화시키세요." "NEW_ACHIEVEMENT_21_4_DESC" "한 게임에서 활성화된 10기의 폴리를 가지세요."
"NEW_ACHIEVEMENT_21_5_NAME" "예민한 군대" "NEW_ACHIEVEMENT_21_5_NAME" "로봇 공학자"
"NEW_ACHIEVEMENT_21_5_DESC" "크롤러 50기를 한 게임에서 활성화시키세요." "NEW_ACHIEVEMENT_21_5_DESC" "모든 타입의 유닛들을 만드세요."
"NEW_ACHIEVEMENT_21_6_NAME" "군단" "NEW_ACHIEVEMENT_21_6_NAME" "군단"
"NEW_ACHIEVEMENT_21_6_DESC" "유닛을 총 1000기 생산하세요." "NEW_ACHIEVEMENT_21_6_DESC" "유닛을 총 1000기 생산하세요."
"NEW_ACHIEVEMENT_21_7_NAME" "강력한"
"NEW_ACHIEVEMENT_21_7_DESC" "캠페인 지역에서 S 랭크를 획득하세요."
"NEW_ACHIEVEMENT_21_8_NAME" "매우 강력한!"
"NEW_ACHIEVEMENT_21_8_DESC" "캠페인 지역에서 SS 랭크를 획득하세요."
"NEW_ACHIEVEMENT_21_9_NAME" "당신은 사시입니다." "NEW_ACHIEVEMENT_21_9_NAME" "당신은 사시입니다."
"NEW_ACHIEVEMENT_21_9_DESC" "적 소환 구역에서 사망하세요." "NEW_ACHIEVEMENT_21_9_DESC" "적 소환 구역에서 사망하세요."
"NEW_ACHIEVEMENT_21_10_NAME" "제발 Shift 버튼좀 눌러" "NEW_ACHIEVEMENT_21_10_NAME" "제발 Shift 버튼좀 눌러"
"NEW_ACHIEVEMENT_21_10_DESC" "익사하세요, 어떻게든" "NEW_ACHIEVEMENT_21_10_DESC" "익사하세요, 어떻게든"
"NEW_ACHIEVEMENT_21_11_NAME" "수집가" "NEW_ACHIEVEMENT_21_11_NAME" "수집가"
"NEW_ACHIEVEMENT_21_11_DESC" "캠페인 지역에서 코어에 넣을 수 있는 자원을 최대치로 넣으세요." "NEW_ACHIEVEMENT_21_11_DESC" "캠페인 지역에서 코어에 넣을 수 있는 모든 자원을 최대치로 넣으세요."
"NEW_ACHIEVEMENT_21_12_NAME" "왕관" "NEW_ACHIEVEMENT_21_12_NAME" "왕관"
"NEW_ACHIEVEMENT_21_12_DESC" "서버를 열고 10명 이상의 플레이어를 유지하세요." "NEW_ACHIEVEMENT_21_12_DESC" "서버를 열고 10명 이상의 플레이어를 유지하세요."
"NEW_ACHIEVEMENT_21_13_NAME" "진입 불가" "NEW_ACHIEVEMENT_21_13_NAME" "진입 불가"
"NEW_ACHIEVEMENT_21_13_DESC" "멜트다운과 스펙터를 건설하세요." "NEW_ACHIEVEMENT_21_13_DESC" "멜트다운과 스펙터 그리고 포어쉐도우를 건설하세요."
"NEW_ACHIEVEMENT_21_14_NAME" "출격!" "NEW_ACHIEVEMENT_21_14_NAME" "출격!"
"NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요." "NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요."
"NEW_ACHIEVEMENT_21_15_NAME" "성급한"
"NEW_ACHIEVEMENT_21_15_DESC" "2번 이상의 출격 기회를 스킵하고, 당신의 코어를 적에게 파괴당하세요."
"NEW_ACHIEVEMENT_21_16_NAME" "2단" "NEW_ACHIEVEMENT_21_16_NAME" "2단"
"NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요." "NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요."
"NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자" "NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자"
"NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블록도 설치하지 않고 생존하세요." "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블록도 설치하지 않고 생존하세요."
"NEW_ACHIEVEMENT_21_18_NAME" "인화성" "NEW_ACHIEVEMENT_21_18_NAME" "인화성"
"NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요." "NEW_ACHIEVEMENT_21_18_DESC" "아무 포탑에 파이라타이트를 사용하세요."
"NEW_ACHIEVEMENT_21_19_NAME" "효율성" "NEW_ACHIEVEMENT_21_19_NAME" "효율성"
"NEW_ACHIEVEMENT_21_19_DESC" "포탑을 물 혹은 냉각수를 사용하여 가속하세요." "NEW_ACHIEVEMENT_21_19_DESC" "포탑을 물 혹은 냉각수를 사용하여 냉각하세요."
"NEW_ACHIEVEMENT_21_20_NAME" "클래식 모드" "NEW_ACHIEVEMENT_21_20_NAME" "클래식 모드"
"NEW_ACHIEVEMENT_21_20_DESC" "픽셀화를 활성화시키세요." "NEW_ACHIEVEMENT_21_20_DESC" "픽셀화를 활성화시키세요."
"NEW_ACHIEVEMENT_21_21_NAME" "학자" "NEW_ACHIEVEMENT_21_21_NAME" "학자"
@@ -105,5 +89,27 @@
"NEW_ACHIEVEMENT_21_22_DESC" "캠페인 지역을 10000개 혹은 그 이상의 시작자원을 설정하고 시작하세요." "NEW_ACHIEVEMENT_21_22_DESC" "캠페인 지역을 10000개 혹은 그 이상의 시작자원을 설정하고 시작하세요."
"NEW_ACHIEVEMENT_21_23_NAME" "점화" "NEW_ACHIEVEMENT_21_23_NAME" "점화"
"NEW_ACHIEVEMENT_21_23_DESC" "핵융합로를 활성화시키세요." "NEW_ACHIEVEMENT_21_23_DESC" "핵융합로를 활성화시키세요."
"NEW_ACHIEVEMENT_21_24_NAME" "행성 탈주!"
"NEW_ACHIEVEMENT_21_24_DESC" "성간 코어 가속기를 활성화시키세요."
"NEW_ACHIEVEMENT_21_25_NAME" "나선형"
"NEW_ACHIEVEMENT_21_25_DESC" "돌고돌아 강강술래"
"NEW_ACHIEVEMENT_21_26_NAME" "상승!"
"NEW_ACHIEVEMENT_21_26_DESC" "5티어 유닛을 만드세요."
"NEW_ACHIEVEMENT_21_27_NAME" "건축가"
"NEW_ACHIEVEMENT_21_27_DESC" "20개의 설계도를 생성하세요."
"NEW_ACHIEVEMENT_21_28_NAME" "글로벌 도미네이션"
"NEW_ACHIEVEMENT_21_28_DESC" "세르플로에 있는 모든 지역들을 점령하세요."
"NEW_ACHIEVEMENT_21_29_NAME" "공수부대"
"NEW_ACHIEVEMENT_21_29_DESC" "옥트 유닛으로 5티어 유닛을 수송하세요."
"NEW_ACHIEVEMENT_21_30_NAME" "궁극의 형태"
"NEW_ACHIEVEMENT_21_30_DESC" "그들과 함께 하십시오."
"NEW_ACHIEVEMENT_21_31_NAME" "생산 I"
"NEW_ACHIEVEMENT_21_31_DESC" "캠페인에서 총합 분당 5000 자원 생산량에 도달하세요."
"NEW_ACHIEVEMENT_26_0_NAME" "생산 II"
"NEW_ACHIEVEMENT_26_0_DESC" "캠페인에서 총합 분당 50000 자원 생산량에 도달하세요."
"NEW_ACHIEVEMENT_26_1_NAME" "확실한 승리"
"NEW_ACHIEVEMENT_26_1_DESC" "다른 지역에서 플레이하는 동안 한 지역을 점령하세요."
"NEW_ACHIEVEMENT_26_2_NAME" "작은 제국"
"NEW_ACHIEVEMENT_26_2_DESC" "한 번에 10개의 지역을 제어하세요."
} }
} }

View File

@@ -1,44 +1,49 @@
정교한 컨베이어 시스템을 설계하여 포탑의 탄약을 준비하고, 건물에 재료를 공급하여 당신의 구조물을 적으로부터 방어하세요. 크로스플랫폼 멀티플레이어 기능을 이용하여 친구와 협동하여 플레이하거나 팀 기반 PvP가 가능합니다.
[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] [img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img]
[h2]게임플레이[/h2] [h2]게임플레이[/h2]
[list] [list]
[*] 드릴을 설치해 자원을 채광하고 컨베이어를 사용하여 자원을 코어로 옮기세요. [*] 정교한 컨베이어 벨트 공급망을 만들어 탄약을 터렛에 공급하고 건축에 사용할 재료를 생산하세요.
[*] 생산 건물을 사용하여 고급 자원을 조합하세요. [*] 생산 건물을 사용하여 고급 자원을 조합하세요.
[*] 드론을 생산하여 자원을 자동으로 채광하거나, 당신의 기지 보호를 돕게끔 해보세요. [*] 단계에서 몰려오는 적들에게서 당신의 기지를 지키세요.
[*] 화재가 났을때 액체를 사용해보세요. [*] 크로스 플랫폼 멀티플레이어 협동 게임에서 친구와 함께 플레이하거나 팀 기반 PvP 게임에서 도전해보세요.
[*] 액체를 활용하여 공장을 활성화하고, 포탑을 가속하거나, 발전기를 냉각해보세요. [*] 액체를 분배하고 화재 발생이나 적의 급습과 같은 끊임없는 도전과 싸워보세요.
[*] 옵션인 냉각수 및 윤활유를 공급하여 생산 효과를 극대화하세요.
[*] 당신의 기지를 자동으로 관리하거나 적 기지를 공격할 수 있는 다양한 유닛을 생산해보세요.
[/list] [/list]
[img]{STEAM_APP_IMAGE}/extras/ezgif-1-8679abe089cd.gif[/img]
[h2]캠페인[/h2] [h2]캠페인[/h2]
[list] [list]
[*] 재도전 가능한 12개의 지역을 무작위 시작 위치에서 도전해보세요. [*] 250개 이상의 자동으로 생성된 지역들과 16개의 수제 맵들을 지나 전진하면서 세르플로 행성을 정복하세요.
[*] 자원들을 출격시켜서 모으세요. [*] 지역을 점령하고 당신이 다른 지역에서 플레이하는 동안 자원을 만들도록 공장을 지으세요.
[*] 고급 연료의 사용을 위해 새로운 블록을 연구하세요. [*] 주기적인 공격에게서 당신의 지역들을 지키세요.
[*] 캠페인 지역에서 일정 조건을 달성시 각 지역의 시작자원을 편집할 수 있습니다. [*] 지역 자원 수송기를 통해 지역간 자원을 조직화하세요.
[*] 다양한 지역 임무가 준비되어 있습니다. [*] 발전을 촉진하기 위해 새로운 블록들을 연구하세요.
[*] 친구를 초대해 지역을 같이 클리어할 수 있습니다. [*] 친구를 초대해서 다같이 미션을 완료하세요.
[*] 120개가 넘는 블록들을 연구해보세요. [*] 120개가 넘는 블록들을 연구해보세요.
[*] 19가지 종류의 드론, 유닛, 기체들이 준비되어 있습니다. [*] 33가지 종류의 각기 다른 드론, 유닛, 그리고 배들이 있습니다.
[*] 50개가 넘는 도전과제들을 달성해보세요. [*] 50개가 넘는 도전과제들을 달성해보세요.
[/list] [/list]
[h2][h2]게임모드[/h2][/h2] [h2][h2]게임모드[/h2][/h2]
[list]
[*] [b]생존[/b]: 포탑을 건설하고, 적의 공격을 방어하는 기본적인 타워디펜스 모드입니다. 더욱 길게 생존하여 연구하기 위한 자원을 모으고 출격하는 것도 가능합니다. 공중 보스의 기습 공격에 대비하세요. [*] [b]생존[/b]: 포탑을 건설하고, 적의 공격을 방어하는 기본적인 타워디펜스 모드입니다. 더욱 길게 생존하여 연구하기 위한 자원을 모으고 출격하는 것도 가능합니다. 공중 보스의 기습 공격에 대비하세요.
[*] [b]공격[/b]: 공장을 건설하여 적의 코어를 파괴하기 위한 유닛들을 생산하고, 동시에 적의 유닛을 방어하기 위한 방어건물도 건설하세요. 당신의 목표를 돕기 위한 다양한 유닛들을 생산하세요. [*] [b]공격[/b]: 공장을 건설하여 적의 코어를 파괴하기 위한 유닛들을 생산하고, 동시에 적의 유닛을 방어하기 위한 방어건물도 건설하세요. 다양한 지원 및 공격 유닛을 만들어서 목표를 달성하세요. 플레이어의 추가 공격을 막기 위한 방어선을 건설하는 적 AI를 선택적으로 활성화할 수 있습니다.
[*] [b]PvP[/b]: 당신을 빼고 총 4개의 팀과의 경쟁이 가능합니다. 다른 팀의 코어를 부숴 승리를 거머쥐세요. 유닛을 생성하, 당신의 기체를 활용해 적의 기지를 공격하세요. [*] [b]PvP[/b]: 서로의 코어를 파괴하는 4개 이상의 다른 팀과의 경쟁 모드입니다. 유닛을 생성하거나, 당신의 기체 적의 기지를 바로 공격하세요.
[*] [b]샌드박스[/b]: 무한한 자원을 사용하여 자유롭게 건설이 가능합니다. 무한 자원, 전기, 액체와 같은 샌드박스 모드 전용 블록들이 준비되어 있으며, 적들은 당신이 요구하기 전까지 출현하지 않습니다. 궁금한 것들을 마음껏 실험해보세요. [*] [b]샌드박스[/b]: 적의 위협 없이 무한한 자원으로 플레이하세요. 디자인을 시험해보기 위해 무한 자원, 전기, 액체와 같은 샌드박스 전용 블록들을 사용해보거나, 원한다면 적을 생성해보세요.
[/list] [/list]
[img]{STEAM_APP_IMAGE}/extras/2020-11-30_10-46-02.gif[/img]
[h2]사용자 정의 게임 & 크로스플랫폼 멀티플레이어[/h2] [h2]사용자 정의 게임 & 크로스플랫폼 멀티플레이어[/h2]
[list] [list]
[*] 캠페인에 더하여 12개의 추가적인 맵들이 준비되어 있습니다. [*] 캠페인에 더하여 커스텀 게임을 위한 16개의 추가적인 맵들이 준비되어 있습니다.
[*] 생존, PvP, 샌드박스 등을 플레이해보세요! [*] 협동, PvP 또는 샌드박스 플레이해보세요!
[*] 유저들이 운영하는 공개되어있는 공용서버에 접속하거나, 당신만의 비공개서버를 만들고 친구들을 초대해보세요. [*] 유저들이 운영하는 공개되어있는 공용서버에 접속하거나, 당신만의 비공개서버를 만들고 친구들을 초대해보세요.
[*] 자유로운 게임 규칙: 블록의 재료 요구량 변경, 적의 능력 수치변경, 시작자원 변경, 단계 대기시간 변경 등 많은 것을 직접 설정할 수 있습니다. [*] 자유로운 게임 규칙: 블록의 재료 요구량 변경, 적의 능력 수치변경, 시작자원 변경, 단계 대기시간 변경 등 많은 것을 직접 설정할 수 있습니다.
[*] 게임모드 혼합!: PvP와 PvE를 합쳐 새로운 컨텐츠를 만들어보세요. [*] 게임모드 혼합!: PvP와 PvE를 합쳐 새로운 컨텐츠를 만들어보세요.
@@ -48,13 +53,13 @@
[list] [list]
[*] 에디터 ui를 사용하여 지형을 그려보세요. [*] 에디터 ui를 사용하여 지형을 그려보세요.
[*] 인-게임 에디터를 사용하여 맵 미리보기와 수정도 가능합니다. [*] 인-게임 에디터를 사용하여 맵 미리보기와 수정을 해보세요.
[*] 자유로운 도구 활용: 편집 도구의 모드를 바꿔 사용이 가능합니다. [*] 도구 모드 설정: 편집 도구의 모드를 바꿔보세요.
[*] 다양한 타입의 필터와 지형 생성 조건을 설정하고, 강력한 맵 생성 시스템을 사용하여 맵을 만들어보세요. [*] 다양한 타입의 필터와 지형 생성 조건을 설정하고, 강력한 맵 생성 시스템을 사용하여 맵을 만들어보세요.
[*] 뿌리기, 왜곡, 매끄러움, 침식, 균형, 자원 생성 그리고 지형 무작위 생성 등을 당신의 맵에 적용해보세요. [*] 뿌리기, 왜곡, 매끄러움, 침식, 균형, 자원 생성 그리고 지형 무작위 생성 등을 당신의 맵에 적용해보세요.
[*] 자원, 강, 사막, 포자지대 등 지형을 무작위로 생성해보세요. [*] 강이나 자원 타일을 배치하는 것 뿐만이 아니라 광물 생성도 랜덤화 하거나, 설정해보세요.
[*] 소환되는 적들도 에디터 내의 맵 규칙에서 편집이 가능합니다! [*] 적 단계 구성을 설정해보세요.
[*] 맵을 제작한 뒤에는 맵을 추출하여 파일로 공유하거나 워크샵에도 올릴 수 있습니다. [*] 스팀 창작마당에 맵을 공유해보세요.
[*] 맵 규칙을 마음대로 바꿔보세요. [*] 맵 규칙을 마음대로 바꿔보세요.
[*] 75개가 넘는 지형 타일, 블록이 준비되어있습니다. [*] 80개 이상의 각기 다른 지형 블록들을 사용해보세요.
[/list] [/list]

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=2b5815edf64d5431dee6ad4ac8ba45f069f66350 archash=2f4ad773823b460478c649352ac40a4f0d57acc6

View File

@@ -17,7 +17,7 @@
}, },
{ {
"name": "io", "name": "io",
"address": ["mindustry.io", "mindustry.io:1000", "mindustry.io:2000", "mindustry.io:3000"] "address": ["mindustry.io", "mindustry.io:1000", "mindustry.io:2000", "mindustry.io:3000", "mindustry.io:4000"]
}, },
{ {
"name": "ECAN", "name": "ECAN",
@@ -53,7 +53,7 @@
}, },
{ {
"name": "ALEX", "name": "ALEX",
"address": ["alexmindustry.ddns.net:6568"] "address": ["alexmindustryhub.ddns.net:6568", "alexmindustry.ddns.net:6568", "alexmindustry.ddns.net:6569", "alexmindustryattac.ddns.net:25800"]
}, },
{ {
"name": "Minty [subzero]", "name": "Minty [subzero]",

View File

@@ -95,14 +95,13 @@ public class PowerTestFixture{
// Simulate the "changed" method. Calling it through reflections would require half the game to be initialized. // Simulate the "changed" method. Calling it through reflections would require half the game to be initialized.
tile.build = block.newBuilding().init(tile, Team.sharded, false, 0); tile.build = block.newBuilding().init(tile, Team.sharded, false, 0);
if(block.hasPower){ if(block.hasPower){
tile.build.power.graph = new PowerGraph(){ new PowerGraph(){
//assume there's always something consuming power //assume there's always something consuming power
@Override @Override
public float getUsageFraction(){ public float getUsageFraction(){
return 1f; return 1f;
} }
}; }.add(tile.build);
tile.build.power.graph.add(tile.build);
} }
// Assign incredibly high health so the block does not get destroyed on e.g. burning Blast Compound // Assign incredibly high health so the block does not get destroyed on e.g. burning Blast Compound