Merge branch 'master' of https://github.com/Anuken/Mindustry into 7.0-features

 Conflicts:
	core/src/mindustry/ui/dialogs/PlanetDialog.java
This commit is contained in:
Anuken
2021-08-18 15:04:30 -04:00
86 changed files with 942 additions and 740 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

View File

@@ -652,6 +652,7 @@ status.overclock.name = Overclock
status.shocked.name = Shocked
status.blasted.name = Blasted
status.unmoving.name = Unmoving
status.boss.name = Guardian
settings.language = Language
settings.data = Game Data
@@ -1441,6 +1442,8 @@ block.item-source.description = Infinitely outputs items. Sandbox only.
block.item-void.description = Destroys any items. Sandbox only.
block.liquid-source.description = Infinitely outputs liquids. Sandbox only.
block.liquid-void.description = Removes any liquids. Sandbox only.
block.payload-source.description = Infinitely outputs payloads. Sandbox only.
block.payload-void.description = Destroys any payloads. Sandbox only.
block.copper-wall.description = Protects structures from enemy projectiles.
block.copper-wall-large.description = Protects structures from enemy projectiles.
block.titanium-wall.description = Protects structures from enemy projectiles.

View File

@@ -101,6 +101,7 @@ customgame = Permainan Modifikasi
newgame = Permainan Baru
none = <kosong>
none.found = [lightgray]<tidak ditemukan>
none.inmap = [lightgray]<tidak ada di dalam peta>
minimap = Peta Kecil
position = Posisi
close = Tutup
@@ -192,15 +193,15 @@ server.kicked.banned = Anda telah dilarang untuk memasuki server ini.
server.kicked.typeMismatch = Server ini tidak cocok dengan versi build Anda.
server.kicked.playerLimit = Server ini penuh. Tunggu slot kosong.
server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu sesaat sebelum masuk lagi.
server.kicked.nameInUse = Sudah ada pemain dengan nama tersebut \ndi server ini.
server.kicked.nameInUse = Sudah ada pemain dengan nama tersebut\ndi server ini.
server.kicked.nameEmpty = Nama yang dipilih tidak valid.
server.kicked.idInUse = Anda telah berada di server ini! Memasuki dengan dua akun tidak diizinkan.
server.kicked.customClient = Server ini tidak mendukung versi modifikasi. Unduh versi resmi.
server.kicked.gameover = Permainan telah berakhir!
server.kicked.serverRestarting = Server sedang mengulang kembali.
server.versions = Versi Anda:[accent] {0}[]\nVersi server:[accent] {1}[]
host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[]. \nSemua orang yang memiliki [lightgray]Wi-Fi atau jaringan lokal[] akan bisa melihat server anda di daftar server mereka.\n\nJika Anda ingin pemain dari mana saja memasuki servermu dengan IP, dibutuhkan untuk melakukan [accent]port forwarding[].\n\n[lightgray]Diingat: Jika seseorang mengalami masalah memasuki permainan lokalmu, pastikan Anda telah mengizinkan Mindustry akses ke jaringan lokalmu di pengaturan firewall.
join.info = Disini, Anda bisa memasuki [accent]server IP[], atau menemukan [accent]server lokal[] untuk bermain bersama.\nLAN dan WAN mendukung permainan bersama.\n\n[lightgray]Ingat: Tidak ada daftar server global; jika anda ingin bergabung dengan seseorang memakai IP, Anda perlu menanyakan host tentang IP mereka.
host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[]. \nSemua orang yang memiliki [lightgray]Wi-Fi atau jaringan lokal[] akan bisa melihat server Anda di daftar server mereka.\n\nJika Anda ingin pemain dari mana saja memasuki server Anda dengan IP, [accent]port forwarding[] sangat diperlukan.\n\n[lightgray]Catatan: Jika seseorang mengalami masalah memasuki permainan lokal Anda, pastikan Anda telah mengizinkan Mindustry akses ke jaringan lokalmu di pengaturan firewall. Perlu diingat bahwa jaringan publik terkadang tidak mengizinkan pencarian server.
join.info = Disini, Anda bisa memasuki [accent]server IP[], atau menemukan [accent]server lokal[] untuk bermain bersama.\nLAN dan WAN mendukung permainan bersama.\n\n[lightgray]Jika Anda ingin bergabung dengan seseorang dengan IP, Anda perlu menanyakan host tentang IP mereka, yang dapat dicari dengan meng-google "my ip" melalui perangkat mereka.
hostserver = Host Permainan
invitefriends = Undang Teman
hostserver.mobile = Host\nPermainan
@@ -214,6 +215,7 @@ hosts.none = [lightgray]Tidak ditemukan game lokal!
host.invalid = [scarlet]Tidak bisa menyambung dengan pemilik.
servers.local = Server Lokal
servers.local.steam = Permainan Publik & Server Lokal
servers.remote = Server Jarak Jauh (Simpanan)
servers.global = Server Komunitas
@@ -222,10 +224,10 @@ servers.showhidden = Tampilkan Server Tersembunyi
server.shown = Ditampilkan
server.hidden = Disembunyikan
trace = Melacak Pemain
trace = Lacak Pemain
trace.playername = Nama pemain: [accent]{0}
trace.ip = IP: [accent]{0}
trace.id = ID Unik: [accent]{0}
trace.id = ID: [accent]{0}
trace.mobile = Client Mobile: [accent]{0}
trace.modclient = Client Modifikasi: [accent]{0}
trace.times.joined = Total Bergabung: [accent]{0}
@@ -238,9 +240,9 @@ server.admins.none = Tidak ada admin!
server.add = Tambahkan Server
server.delete = Anda yakin ingin menghapus server ini?
server.edit = Sunting Server
server.outdated = [crimson]Server Kadaluarsa![]
server.outdated.client = [crimson]Client Kadaluarsa![]
server.version = [lightgray]Versi: {0} {1}
server.outdated = [scarlet]Server Kadaluarsa![]
server.outdated.client = [scarlet]Client Kadaluarsa![]
server.version = [gray]v{0} {1}
server.custombuild = [accent]Bentuk Modifikasi
confirmban = Anda yakin ingin melarang pemain ini untuk masuk lagi?
confirmkick = Anda yakin ingin mengeluarkan pemain ini?
@@ -353,12 +355,12 @@ map.publish.confirm = Apakah Anda yakin untuk menerbitkan peta ini?\n\n[lightgra
workshop.menu = Pilih apa yang Anda ingin lakukan dengan item ini.
workshop.info = Informasi item
changelog = Catatan Pembaruan (opsional):
eula = Steam EULA
eula = EULA Steam
missing = Item ini telah dihapus atau dipindah.\n[lightgray]Daftar Workshop sekarang telah tidak terhubung secara otomatis.
publishing = [accent]Menerbitkan...
publish.confirm = Apakah Anda yakin untuk menerbitkan item ini?\n\n[lightgray]Pastikan Anda setuju dengan Workshop EULA terlebih dahulu, atau item Anda tidak akan muncul!
publish.confirm = Apakah Anda yakin untuk menerbitkan item ini?\n\n[lightgray]Pastikan Anda setuju dengan EULA Workshop terlebih dahulu, atau item Anda tidak akan muncul!
publish.error = Terjadi kesalahan saat menerbitkan item: {0}
steam.error = Gagal untuk menginisialisasi layanan Steam.\nError: {0}
steam.error = Gagal untuk menjalankan layanan Steam.\nKesalahan: {0}
editor.brush = Kuas
editor.openin = Buka di Penyunting
@@ -464,7 +466,7 @@ filters.empty = [lightgray]Tidak ada filter! Tambahkan dengan tombol dibawah.
filter.distort = Kerusakkan
filter.noise = Kebisingan
filter.enemyspawn = Pilih Munculnya Musuh
filter.spawnpath = Path To Spawn
filter.spawnpath = Jalur ke Titik Muncul
filter.corespawn = Pilih Inti
filter.median = Median
filter.oremedian = Median Bijih
@@ -522,8 +524,8 @@ mapeditor = Penyunting Peta
abandon = Tinggalkan
abandon.text = Zona ini dan semua sumber daya didalamnya akan berada di tangan musuh.
locked = Terkunci
complete = [lightgray]Mencapai:
requirement.wave = Capai gelombang {0} dalam {1}
complete = [lightgray]Selesaikan:
requirement.wave = Raih gelombang {0} dalam {1}
requirement.core = Hancurkan inti musuh dalam {0}
requirement.research = Kembangkan {0}
requirement.produce = Produksi {0}
@@ -541,7 +543,7 @@ addall = Tambah Semua
launch.from = Meluncurkan Dari: [accent]{0}
launch.destination = Destinasi: {0}
configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}.
add = Menambahkan...
add = Tambahkan...
guardian = Penjaga
connectfail = [scarlet]Gagal menyambung ke server:\n\n[accent]{0}
@@ -553,7 +555,7 @@ error.alreadyconnected = Sudah tersambung.
error.mapnotfound = File peta tidak ditemaukan!
error.io = Terjadi kesalahan jaringan I/O.
error.any = Terjadi kesalahan Jaringan tidak diketahui.
error.bloom = Gagal untuk menginisialisasi bloom.\nPerangkat Anda mungkin tidak mendukung fitur ini.
error.bloom = Gagal untuk menjalankan bloom.\nPerangkat Anda mungkin tidak mendukung fitur ini.
weather.rain.name = Hujan
weather.snow.name = Salju
@@ -565,6 +567,7 @@ sectors.unexplored = [lightgray]Belum Ditelusuri
sectors.resources = Sumber Daya:
sectors.production = Produksi:
sectors.export = Ekspor:
sectors.import = Impor:
sectors.time = Waktu:
sectors.threat = Tingkat:
sectors.wave = Gelombang:
@@ -672,7 +675,7 @@ unsupported.environment = [scarlet]Ruang Lingkup Tidak Cocok
yes = Ya
no = Tidak
info.title = Info
error.title = [crimson]Sebuah kesalahan telah terjadi
error.title = [scarlet]Sebuah kesalahan telah terjadi
error.crashtitle = Sebuah kesalahan telah terjadi
unit.nobuild = [scarlet]Unit tidak dapat membangun
lastaccessed = [lightgray]Terakhir Diakses: {0}
@@ -806,6 +809,7 @@ bullet.reload = [stat]{0}[lightgray]x laju tembakan
unit.blocks = blok
unit.blockssquared = blok²
unit.powersecond = unit tenaga/detik
unit.tilessecond = petak/detik
unit.liquidsecond = unit zat cair/detik
unit.itemssecond = bahan/detik
unit.liquidunits = unit zat cair
@@ -831,29 +835,29 @@ category.items = Barang
category.crafting = Pemasukan/Pengeluaran
category.function = Fungsi
category.optional = Peningkatan Opsional
setting.skipcoreanimation.name = Lewati Animasi Peluncuran/Pendaratan Inti
setting.landscape.name = Kunci Pemandangan
setting.shadows.name = Bayangan
setting.blockreplace.name = Usulan Blok Otomatis
setting.linear.name = Filter Bergaris
setting.hints.name = Petunjuk
setting.logichints.name = Petunjuk Logika
setting.flow.name = Tampilan Laju Aliran Sumber Daya
setting.backgroundpause.name = Jeda di Latar
setting.buildautopause.name = Jeda Otomatis saat Membangun
setting.doubletapmine.name = Dua-kali Sentuh untuk Menambang
setting.modcrashdisable.name = Matikan Mod Ketika Ada Masalah Saat Memulai Permainan
setting.animatedwater.name = Animasi Perairan
setting.animatedshields.name = Animasi Perisai
setting.antialias.name = Antialiasi[lightgray] (membutuhkan restart)[]
setting.playerindicators.name = Indikasi Pemain
setting.indicators.name = Indikasi Musuh/Teman Lain
setting.autotarget.name = Target Secara Otomatis
setting.keyboard.name = Kontrol Mouse+Papan Ketik
setting.touchscreen.name = Kontrol Layar Sentuh
setting.fpscap.name = Pembatasan FPS
setting.fpscap.name = Batas FPS
setting.fpscap.none = Tidak Ada
setting.fpscap.text = {0} FPS
setting.uiscale.name = Skala UI[lightgray] (butuh untuk mengulang game)[]
setting.uiscale.name = Skala UI
setting.uiscale.description = Mulai ulang diperlukan untuk menerapkan perubahan.
setting.swapdiagonal.name = Selalu Penaruhan Diagonal
setting.difficulty.training = Latihan
setting.difficulty.easy = Mudah
@@ -871,7 +875,8 @@ setting.saveinterval.name = Jarak Menyimpan
setting.seconds = {0} detik
setting.milliseconds = {0} milidetik
setting.fullscreen.name = Layar Penuh
setting.borderlesswindow.name = Jendela tak Berbatas[lightgray] (mungkin memerlukan mengulang kembali)
setting.borderlesswindow.name = Jendela tak Berbatas[lightgray]
setting.borderlesswindow.description = Mulai ulang mungkin diperlukan untuk menerapkan perubahan.
setting.fps.name = Tunjukkan FPS
setting.smoothcamera.name = Kamera Halus
setting.vsync.name = VSync
@@ -901,7 +906,7 @@ uiscale.reset = Skala UI telah diubah.\nTekan "OK" untuk mengonfirmasi.\n[scarle
uiscale.cancel = Batal & Keluar
setting.bloom.name = Bloom
keybind.title = Ganti Tombol
keybinds.mobile = [scarlet]Mayoritas tombol tidak didukung oleh perangkat ponsel Hanya gerakan dasar yang didukung.
keybinds.mobile = [scarlet]Mayoritas tombol tidak didukung oleh perangkat ponsel. Hanya gerakan dasar yang didukung.
category.general.name = Umum
category.view.name = Melihat
category.multiplayer.name = Bermain Bersama
@@ -994,6 +999,7 @@ rules.wavetimer = Pengaturan Waktu Gelombang
rules.waves = Gelombang
rules.attack = Mode Penyerangan
rules.buildai = Bangunan A.I.
rules.cleanupdeadteams = Bersihkan Bangunan Tim yang Kalah (PvP)
rules.corecapture = Tangkap Inti Saat Kehancuran
rules.polygoncoreprotection = Poligon Pelindung Inti
rules.enemyCheat = Sumber Daya A.I. Musuh (Tim Merah) Tak Terbatas
@@ -1009,7 +1015,7 @@ rules.wavespacing = Jarak Gelombang:[lightgray] (detik)
rules.buildcostmultiplier = Penggandaan Harga Bangunan
rules.buildspeedmultiplier = Penggandaan Waktu Pembuatan Bangunan
rules.deconstructrefundmultiplier = Penggandaan Kembalinya Bahan Bangunan yang Dihancurkan
rules.waitForWaveToEnd = Gelombang menunggu musuh
rules.waitForWaveToEnd = Gelombang Menunggu Musuh
rules.dropzoneradius = Radius Titik Muncul:[lightgray] (Blok)
rules.unitammo = Unit Membutuhkan Amunisi
rules.title.waves = Gelombang
@@ -1288,7 +1294,6 @@ block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow
block.container.name = Kontainer
block.launch-pad.name = Alas Peluncur
block.launch-pad-large.name = Alas Peluncur Besar
block.segment.name = Segment
block.command-center.name = Pusat Perintah
block.ground-factory.name = Pabrik Unit Darat
@@ -1309,11 +1314,11 @@ block.payload-source.name = Sumber Muatan
block.disassembler.name = Pembongkar
block.silicon-crucible.name = Pelebur Raksasa
block.overdrive-dome.name = Kubah Projektor Pemercepat
block.interplanetary-accelerator.name = Akselerator Antarplanet
#experimental, may be removed
block.block-forge.name = Pemadu Blok
block.block-loader.name = Pemuat Blok
block.block-unloader.name = Pembongkar Blok
block.interplanetary-accelerator.name = Akselerator Antarplanet
block.switch.name = Saklar
block.micro-processor.name = Prosesor Mikro
@@ -1348,6 +1353,7 @@ hint.placeTurret = Taruh \uf861 [accent]Menara[] untuk mempertahankan basismu da
hint.breaking = [accent]Klik kanan[] dan tarik untuk menghancurkan blok.
hint.breaking.mobile = Aktifkan \ue817 [accent]palu[] di kanan bawah dan tekan untuk menghancurkan blok.\n\nTahan jari kamu sebentar dan seret untuk menghancurkannya.
hint.blockInfo = Lihat informasi dari sebuah blok dengan memilihnya di [accent]menu bangun[], lalu pilih tombol [accent][[?][] di sebelah kanan.
hint.derelict = Bangunan berwarna [accent]abu-abu[] adalah sisa-sisa dari markas lama yang hancur dan tidak dapat berfungsi kembali.\n\nBangunan tersebut dapat [accent]didekonstruksi[] menjadi sumber daya.
hint.research = Gunakan tombol \ue875 [accent]Riset[] untuk mempelajari teknologi baru.
hint.research.mobile = Gunakan tombol \ue875 [accent]Riset[] di \ue88c [accent]Menu[] untuk mempelajari teknologi baru.
hint.unitControl = Tahan [accent][[L-ctrl][] dan [accent]klik[] untuk mengendalikan unit atau turret teman.
@@ -1399,6 +1405,7 @@ liquid.slag.description = Dapat dipadatkan menjadi logam tertentu, atau disempro
liquid.oil.description = Digunakan di produksi material lanjutan dan sebagai amunisi yang mudah terbakar.
liquid.cryofluid.description = Digunakan sebagai pendingin di reaktor, menara, dan pabrik.
block.derelict = [lightgray] Derelik
block.resupply-point.description = Mengisi ulang amunisi unit terdekat dengan tembaga. Tidak dapat mengisi ulang unit yang menggunakan tenaga baterai.
block.armored-conveyor.description = Memindahkan barang ke depan. Tidak dapat menerima masukan dari samping.
block.illuminator.description = Memancarkan cahaya.
@@ -1543,6 +1550,8 @@ block.memory-bank.description = Menyimpan informasi untuk prosesor. Berkapasitas
block.logic-display.description = Menampilkan grafik sembarang dari prosesor.
block.large-logic-display.description = Menampilkan grafik sembarang dari prosesor. Lebih besar.
block.interplanetary-accelerator.description = Sebuah menara railgun elektromagnetik raksasa. Meluncurkan Inti dengan kecepatan tinggi untuk peluncuran antarplanet.
block.repair-turret.description = Memperbaiki unit terdekat yang sekarat dalam jangkauan secara terus-menerus. Dapat menerima pendingin.
block.payload-propulsion-tower.description = Bangunan transportasi muatan jarak jauh. Menembakkan muatan pada menara penggerak muatan lainnya yang terhubung.
unit.dagger.description = Menembak musuh terdekat dengan amunisi standar.
unit.mace.description = Menyerang musuh terdekat dengan cara membakarnya.
@@ -1552,7 +1561,7 @@ unit.reign.description = Menembak semua musuh terdekat dengan gugusan peluru taj
unit.nova.description = Menembak baut laser yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat terbang.
unit.pulsar.description = Menembak petir yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat terbang.
unit.quasar.description = Menembak sinar laser yang dapat menembus bangunan yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat terbang. Memiliki perisai.
unit.vela.description = Menembak sinar laser besar dan kontinu yang dapat merusak musuh, membakarnya dan memperbaiki bangunan musuh. Dapat terbang.
unit.vela.description = Menembak sinar laser besar dan kontinu yang dapat merusak musuh, membakarnya dan memperbaiki bangunan teman. Dapat terbang.
unit.corvus.description = Menembak sinar laser besar yang dapat merusak musuh dan memperbaiki bangunan teman. Dapat berjalan diatas hampir semua medan.
unit.crawler.description = Berlari menuju musuh dan menghancurkan dirinya, yang dapat menghasilkan ledakan besar.
unit.atrax.description = Menembak musuh dengan cairan lava kepada target darat. Dapat berjalan diatas hampir semua medan.
@@ -1577,6 +1586,11 @@ unit.omura.description = Menembak railgun jarak jauh kepada musuh. Dapat memprod
unit.alpha.description = Melindungi Inti Bagian dari musuh. Dapat membangun.
unit.beta.description = Melindungi Inti Fondasi dari musuh. Dapat membangun.
unit.gamma.description = Melindungi Inti Nukleus dari musuh. Dapat membangun.
unit.retusa.description = Menempatkan ranjau berjarak. Memperbaiki unit teman.
unit.oxynoe.description = Menembak aliran api pada musuh terdekat. Menargetkan proyektil musuh terdekat dengan titik menara pertahanan.
unit.cyerce.description = Menembak misil yang membidik otomatis secara beruntun pada musuh. Memperbaiki unit teman.
unit.aegires.description = Mengkejutkan semua bangunan dan unit musuh yang ada di dalam medan energi. Memperbaiki seluruh unit teman.
unit.navanax.description = Menembak proyektil elektromagnetik yang meledak, memberikan kerusakan yang signifikan pada jaringan tenaga musuh dan memperbaiki bangunan teman. Melelehkan musuh terdekat dengan 4 menara laser secara otomatis.
lst.read = Membaca angka dari memori sel yang dihubungkan.
lst.write = Menulis angka ke memori sel yang dihubungkan.

View File

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

View File

@@ -37,15 +37,15 @@ load.scripts = 스크립트
be.update = 새로운 Bleeding Edge 버전 사용 가능:
be.update.confirm = 지금 내려받고 다시 시작하시겠습니까?
be.updating = 업데이트 중….
be.ignore = 무시
be.ignore = 무시하기
be.noupdates = 업데이트가 없습니다.
be.check = 업데이트 확인
be.check = 업데이트 확인하기
mods.browser = 모드 탐색기
mods.browser.selected = 선택된 모드
mods.browser.add = 설치
mods.browser.reinstall = 재설치
mods.github.open = 레포지토리 보기
mods.github.open = 저장소 보기
mods.browser.sortdate = 최근 업데이트
mods.browser.sortstars = 추천(스타) 수
@@ -92,7 +92,7 @@ level.highscore = 최고 점수: [accent]{0}
level.select = 맵 선택
level.mode = 게임 모드:
coreattack = < 코어가 공격을 받고 있습니다! >
nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 소멸합니다!
nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 파괴됩니다!
database = 코어 데이터베이스
savegame = 게임 저장
loadgame = 게임 불러오기
@@ -122,6 +122,7 @@ committingchanges = 바뀐 점 적용
done = 완료
feature.unsupported = 기기가 이 기능을 지원하지 않습니다.
mods.initfailed = [red]⚠[]이전 민더스트리 실행과정에서 모드를 초기화하지 못했습니다. 잘못된 모드로 인해 발생한 것일 수 있습니다.\n\n 게임 충돌 무한반복을 막기 위해, [red]모든 모드가 비활성화되었습니다.[]\n\n이 시스템을 비활성화하려면, [accent]설정->게임->로딩 중 충돌 시 모드 비활성화[]설정을 끄세요.
mods = 모드
mods.none = [lightgray]모드를 찾을 수 없습니다!
mods.guide = 모드 제작 가이드
@@ -139,7 +140,7 @@ mod.disable = 비활성화
mod.content = 콘텐츠:
mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다.
mod.requiresversion = [scarlet]필요한 최소 게임 버전: [accent]{0}
mod.outdated = [scarlet]V6 버전과 호환되지 않음 (minGameVersion: 105 이상이 아님)
mod.outdated = [scarlet]6.0 버전과 호환되지 않음 (minGameVersion: 105 이상이 아님)
mod.missingdependencies = [scarlet]누락된 필요 모드: {0}
mod.erroredcontent = [scarlet]콘텐츠 오류
mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함.
@@ -214,6 +215,7 @@ hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다!
host.invalid = [scarlet]서버에 연결할 수 없습니다!
servers.local = 로컬 서버
servers.local.steam = 공개 서버 & 로컬 서버
servers.remote = 원격 서버
servers.global = 커뮤니티 서버
@@ -315,7 +317,7 @@ data.invalid = 유효한 게임 데이터가 아닙니다.
data.import.confirm = 외부 데이터를 가져오면 현재 게임 데이터를 [scarlet]모두[] 덮어쓰게 됩니다.\n[accent]이 작업은 취소할 수 없습니다![]\n\n데이터를 가져오면 게임이 즉시 종료됩니다.
quit.confirm = 정말로 종료하시겠습니까?
loading = [accent]불러오는중...
reloading = [accent]모드 새로고침하는중...
downloading = [accent]다운로드중...
saving = [accent]저장중...
respawn = [accent][[{0}][] 키를 눌러 코어에서 부활
cancelbuilding = [accent][[{0}][] 키를 눌러 건설 계획을 초기화
@@ -343,9 +345,9 @@ custom = 사용자 정의
builtin = 내장
map.delete.confirm = 정말로 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다!
map.random = [accent]무작위 맵
map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 편집기에서 [accent]주황색[] 코어를 맵에 추가하세요.
map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 편집기에서 [#{0}]{1}[] 코어를 맵에 추가하세요.
map.nospawn.pvp = 이 맵에는 적 플레이어가 생성될 코어가 없습니다! 편집기에서 [royal]주황색 팀이 아닌[] 코어를 추가하세요.
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적 코어가 없습니다! 편집기에서 [royal]빨간색[] 코어들을 맵에 추가하세요.
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적 코어가 없습니다! 편집기에서 [#{0}]{1}[] 코어들을 맵에 추가하세요.
map.invalid = 맵 로드 오류: 맵 파일이 손상되었거나 잘못된 파일입니다.
workshop.update = 아이템 업데이트
workshop.error = 창작마당 세부 사항을 가져오는 중 오류가 발생했습니다: {0}
@@ -522,7 +524,7 @@ mapeditor = 맵 편집기
abandon = 포기하기
abandon.text = 이 지역과 모든 자원이 적에게 넘어갑니다.
locked = 잠김
complete = [lightgray]해금 조건 :
complete = [lightgray]해금 조건:
requirement.wave = {1} 지역에서 {0}단계 달성
requirement.core = {0} 지역에서 적 코어를 파괴
requirement.research = {0} 연구
@@ -537,14 +539,15 @@ configure = 초기자원 설정
loadout = 출격
resources = 자원
bannedblocks = 금지된 블록들
bannedunits = 금지된 유닛들
addall = 모두 추가
launch.from = 출격 출발지 : [accent]{0}
launch.from = 출격 출발지: [accent]{0}[]
launch.destination = 목적지: {0}
configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다.
add = 추가...
guardian = 수호자
connectfail = [scarlet]연결 오류:\n\n[accent]{0}
connectfail = [scarlet]연결 오류:[]\n\n[][accent]{0}[]
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
error.invalidaddress = 잘못된 주소입니다.
error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하세요.
@@ -561,7 +564,9 @@ weather.sandstorm.name = 모래 폭풍
weather.sporestorm.name = 포자 폭풍
weather.fog.name = 안개
sectors.unexplored = [lightgray]미개척지
sectorlist = 지역 목록
sectorlist.attacked = {0} 공격받는 중
sectors.unexplored = [lightgray]미개척지[]
sectors.resources = 자원:
sectors.production = 생산량:
sectors.export = 수출량:
@@ -573,20 +578,20 @@ sectors.stored = 저장량:
sectors.resume = 재개
sectors.launch = 출격
sectors.select = 선택
sectors.nonelaunch = [lightgray]없음 (sun)
sectors.rename = 지역 이름 변경
sectors.enemybase = [scarlet]적 기지
sectors.vulnerable = [scarlet]취약함
sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% 손상됨.
sectors.survives = [accent]{0} 단계 이상 버티세요.
sectors.nonelaunch = [lightgray]없음 (sun)[]
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.attacked = [accent]{0}[white] 지역이 공격받고 있습니다!
sector.lost = [accent]{0}[white] 지역을 잃었습니다!
sector.missingresources = [scarlet]자원 부족[]
sector.attacked = [accent]{0}[white] 지역이 공격받고 있습니다![]
sector.lost = [accent]{0}[white] 지역을 잃었습니다![]
#note: the missing space in the line below is intentional
sector.captured = [accent]{0}[white] 지역을 점령했습니다!
sector.captured = [accent]{0}[white] 지역을 점령했습니다![]
sector.changeicon = 아이콘 바꾸기
threat.low = 낮음
@@ -634,7 +639,7 @@ sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내
sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[]
status.burning.name = 불탐
status.burning.name = 발화
status.freezing.name = 빙결
status.wet.name = 젖음
status.muddy.name = 질척해짐
@@ -645,8 +650,9 @@ status.spore-slowed.name = 포자감속
status.tarred.name = 침유됨
status.overclock.name = 가속화
status.shocked.name = 감전
status.blasted.name =
status.blasted.name =
status.unmoving.name = 멈춤
status.boss.name = 수호자
settings.language = 언어
settings.data = 게임 데이터
@@ -659,25 +665,25 @@ settings.sound = 소리
settings.graphics = 그래픽
settings.cleardata = 게임 데이터 초기화
settings.clear.confirm = 정말로 이 데이터를 지우시겠습니까?\n되돌릴 수 없습니다!
settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 조작키 설정, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다.
settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 조작키 설정, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다.[]
settings.clearsaves.confirm = 정말로 모든 저장된 파일들을 삭제하시겠습니까?
settings.clearsaves = 저장 초기화
settings.clearresearch = 연구 초기화
settings.clearresearch.confirm = 정말로 모든 연구를 삭제하시겠습니까?
settings.clearcampaignsaves = 캠페인 맵 초기화
settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠습니까?
paused = [accent]< 일시정지 >
paused = [accent]< 일시정지 >[]
clear = 초기화
banned = [scarlet]금지됨
unsupported.environment = [scarlet]지원되지 않는 환경
unsupported.environment = [scarlet]지원되지 않는 환경[]
yes = O
no = X
info.title = 정보
error.title = [scarlet]오류가 발생했습니다
error.title = [scarlet]오류가 발생했습니다[]
error.crashtitle = 오류가 발생했습니다
unit.nobuild = [scarlet]건설 불가
lastaccessed = [lightgray]마지막 접근: {0}
block.unknown = [lightgray]???
unit.nobuild = [scarlet]건설 불가[]
lastaccessed = [lightgray]마지막 접근: {0}[]
block.unknown = [lightgray]???[]
stat.showinmap = <맵을 먼저 불러와야 합니다>
stat.description = 특성
@@ -786,23 +792,23 @@ bar.power = 전력
bar.progress = 건설 진행도
bar.input = 입력
bar.output = 출력
bar.strength = [stat]{0}[lightgray]x 치료 속도
bar.strength = [stat]{0}[lightgray]x 치료 속도[][]
units.processorcontrol = [lightgray]프로세서 제어됨
units.processorcontrol = [lightgray]프로세서 제어됨[]
bullet.damage = [stat]{0}[lightgray] 피해량
bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat]{1}[lightgray] 타일
bullet.incendiary = [stat]방화
bullet.homing = [stat]유도
bullet.frags = [stat]{0}[lightgray]개 파편 탄환:
bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량
bullet.knockback = [stat]{0}[lightgray] 넉백
bullet.pierce = [stat]{0}[lightgray]번 관통
bullet.infinitepierce = [stat]관통
bullet.healpercent = [stat]{0}[lightgray]% 회복
bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수
bullet.reload = [stat]{0}[lightgray]배 발사 속도
bullet.damage = [stat]{0}[lightgray] 피해량[][]
bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat]{1}[lightgray] 타일[][][][]
bullet.incendiary = [stat]방화[]
bullet.homing = [stat]유도[]
bullet.frags = [stat]{0}[lightgray]개 파편 탄환:[][]
bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량[][][][]
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량[][]
bullet.knockback = [stat]{0}[lightgray] 넉백[][]
bullet.pierce = [stat]{0}[lightgray]번 관통[][]
bullet.infinitepierce = [stat]관통[]
bullet.healpercent = [stat]{0}[lightgray]% 회복[][]
bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수[][]
bullet.reload = [stat]{0}[lightgray]배 발사 속도[][]
unit.blocks = 블록
unit.blockssquared = 블록²
@@ -833,13 +839,13 @@ category.items = 자원
category.crafting = 입력/출력
category.function = 기능
category.optional = 선택적 향상
setting.skipcoreanimation.name = 코어 발사/착륙 애니메이션 건너뛰기
setting.landscape.name = 가로화면 잠금
setting.shadows.name = 그림자
setting.blockreplace.name = 자동 블록 제안
setting.linear.name = 선형 필터링
setting.hints.name = 힌트 표시
setting.logichints.name = 로직 힌트 표시
setting.flow.name = 자원 흐름량 표시
setting.backgroundpause.name = 백그라운드에서 일시정지
setting.buildautopause.name = 건설 자동 일시정지
setting.doubletapmine.name = 연속 터치로 채광
@@ -858,9 +864,9 @@ setting.uiscale.name = UI 스케일링
setting.uiscale.description = 적용하려면 재시작이 필요합니다.
setting.swapdiagonal.name = 항상 대각선 배치
setting.difficulty.training = 훈련
setting.difficulty.easy = 무난
setting.difficulty.easy = 쉬움
setting.difficulty.normal = 보통
setting.difficulty.hard = 혼돈
setting.difficulty.hard = 어려움
setting.difficulty.insane = 박멸
setting.difficulty.name = 난이도:
setting.screenshake.name = 화면 흔들림
@@ -874,6 +880,7 @@ setting.seconds = {0} 초
setting.milliseconds = {0} 밀리초
setting.fullscreen.name = 전체 화면
setting.borderlesswindow.name = 테두리 없는 창 모드
setting.borderlesswindow.name.windows = 테두리 없는 전체화면
setting.borderlesswindow.description = 적용하려면 재시작이 필요할 수도 있습니다.
setting.fps.name = FPS와 핑 표시
setting.smoothcamera.name = 부드러운 시점
@@ -997,6 +1004,7 @@ rules.wavetimer = 시간 제한이 있는 단계
rules.waves = 단계
rules.attack = 공격 모드
rules.buildai = AI 건설
rules.aitier = AI 등급
rules.cleanupdeadteams = 패배한 팀 건물 정리하기 (PvP)
rules.corecapture = 코어 파괴 시 점령
rules.polygoncoreprotection = 다각형 코어 건설 금지구역
@@ -1016,12 +1024,15 @@ rules.deconstructrefundmultiplier = 철거 환불 배수
rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기
rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일)
rules.unitammo = 유닛 탄약 필요
rules.enemyteam = 상대 팀
rules.playerteam = 플레이어 팀
rules.title.waves = 단계
rules.title.resourcesbuilding = 자원 & 건축
rules.title.enemy =
rules.title.unit = 유닛
rules.title.experimental = 실험적인 기능
rules.title.environment = 환경
rules.title.teams =
rules.lighting = 조명 표시
rules.enemyLights = 상대에게 조명 표시
rules.fire = 방화 허용
@@ -1100,7 +1111,6 @@ unit.reign.name = 레인
unit.vela.name = 벨라
unit.corvus.name = 코르버스
block.resupply-point.name = 보급 지점
block.parallax.name = 패럴랙스
block.cliff.name = 언덕
block.sand-boulder.name = 사암 바위
@@ -1351,7 +1361,7 @@ hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[
hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오.
hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오.
hint.blockInfo = [accent]건설 메뉴[]에서 블록을 선택해서 정보를 보십시오, 그다음 오른쪽의 [accent][[?][] 버튼을 선택하십시오.
hint.derelict = [accent]버려진[] 구조물들은 더 이상 작동하지 않는 오래된 기지의 부서진 잔해입니다.\n\n이 구조물들은 자원으로 다시 [accent]철거[]될 수 있습니다.
hint.derelict = [accent]잔해[] 구조물들은 더 이상 작동하지 않는 오래된 기지의 부서진 잔해입니다.\n\n이 구조물들은 자원으로 다시 [accent]철거[]될 수 있습니다.
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오.
@@ -1368,7 +1378,7 @@ hint.payloadPickup = 작은 블록이나 유닛을 집으려면 [accent][[[]를
hint.payloadPickup.mobile = 작은 블록이나 유닛을 집으려면 [accent]잠깐 누르십시오[].
hint.payloadDrop = 다시 내려놓으려면 [accent]][]를 누르십시오.
hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 [accent]화면을 잠깐 누르십시오[].
hint.waveFire = [accent]Wave[]포탑에 탄약으로 물을 넣으면 주변의 불을 자동으로 꺼줍니다.
hint.waveFire = [accent]파도[] 포탑에 탄약으로 물을 넣으면 주변의 불을 자동으로 꺼줍니다.
hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]Power Nodes[]를 사용하십시오.
hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오.
hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오.
@@ -1403,8 +1413,7 @@ liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아
liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다.
liquid.cryofluid.description = 물과 티타늄으로 만든 비부식성 액체. 열용량이 매우 높으며 냉각수로 광범위하게 사용됩니다.
block.derelict = [lightgray] 버려짐[]
block.resupply-point.description = 주변 유닛들에 구리 탄약을 보급합니다. 배터리 전력이 필요한 유닛들은 호환되지 않습니다.
block.derelict = [lightgray]잔해
block.armored-conveyor.description = 앞으로 자원들을 운반합니다. 측면에서 자원들을 받아들이지 않습니다.
block.illuminator.description = 발광합니다.
block.message.description = 아군 간의 소통을 위한 메시지를 저장합니다.
@@ -1741,7 +1750,8 @@ lenum.build = 구조물 건설
lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다.
lenum.within = 좌표 주변 유닛 발견 여부
lenum.boost = 이륙 시작/중단
#1730 line matching / 줄 매칭
#1745 line matching / 줄 매칭
#-------------비공식 번역-------------
#팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요.
@@ -1753,7 +1763,7 @@ lenum.boost = 이륙 시작/중단
#관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018
#아이템
item.metaglass.details = [lightgray][비공식][]쓰임가 가장 적은 아이템
item.metaglass.details = [lightgray][비공식][]쓰임가 가장 적은 아이템
item.graphite.details =
item.sand.details =
item.titanium.details =
@@ -1769,7 +1779,7 @@ item.pyratite.details =
liquid.water.details =
liquid.slag.details =
liquid.oil.details =
liquid.cryofluid.details = [lightgray][비공식][]티타늄을 갈아서 물에 희석했다는 소문이 있다.
liquid.cryofluid.details = [lightgray][비공식][]티타늄을 갈아서 물에 희석했다.
#블록
block.resupply-point.details =
@@ -1844,8 +1854,8 @@ block.power-node.details =
block.power-node-large.details =
block.surge-tower.details =
block.diode.details =
block.battery.details =
block.battery-large.details =
block.battery.details = [lightgray][비공식][]아크와 랜서같은 전기먹는하마 옆에 많이 설치해두자.
block.battery-large.details = [lightgray][비공식][]일반 베터리 9개보다 5000만큼의 전력을 더 저장할 수 있다.
block.combustion-generator.details =
block.thermal-generator.details =
block.steam-generator.details =
@@ -1859,7 +1869,7 @@ block.mechanical-drill.details =
block.pneumatic-drill.details =
block.laser-drill.details =
block.blast-drill.details =
block.water-extractor.details =
block.water-extractor.details = [lightgray][비공식][]맨 땅에서 물을 뽑아낸다. 이것이 바로 창조경제
block.oil-extractor.details =
block.vault.details =
block.container.details =
@@ -1904,9 +1914,9 @@ block.multiplicative-reconstructor.details =
block.exponential-reconstructor.details =
block.tetrative-reconstructor.details =
block.switch.details =
block.micro-processor.details =
block.logic-processor.details =
block.hyper-processor.details =
block.micro-processor.details = [lightgray][비공식][]Hello, World!
block.logic-processor.details = [lightgray][비공식][]99병의 맥주가 벽장에 있네, 99병의 맥주라네
block.hyper-processor.details = [lightgray][비공식][]그것을 내려서 넘겼네, 더 이상 벽장에 맥주가 없네
block.memory-cell.details =
block.memory-bank.details =
block.logic-display.details =
@@ -1934,7 +1944,7 @@ unit.horizon.details =
unit.zenith.details =
unit.antumbra.details =
unit.eclipse.details =
unit.mono.details =
unit.mono.details = [lightgray][비공식][]민더스트리 최고 귀요미.
unit.poly.details =
unit.mega.details =
unit.quad.details =
@@ -1943,7 +1953,7 @@ unit.risso.details = [lightgray][비공식][]뭉치면 연사력이 무시무시
unit.minke.details =
unit.bryde.details =
unit.sei.details = [lightgray][비공식][]세이 sei!
unit.omura.details =
unit.omura.details = [lightgray][비공식][]오무라이스?
unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮어보죠.
unit.oxynoe.details =
unit.cyerce.details = [lightgray][비공식][]폭죽놀이다!

View File

@@ -215,6 +215,7 @@ hosts.none = [lightgray]Nu s-au găsit jocuri locale!
host.invalid = [scarlet]Nu s-a putut face conectarea la gazdă!
servers.local = Servere Locale
servers.local.steam = Jocuri Deschise & Servere Locale
servers.remote = Servere de la Distanță
servers.global = Servere ale Comunității
@@ -266,7 +267,7 @@ server.invalidport = Număr de port invalid!
server.error = [scarlet]Eroare la găzduirea serverului.
save.new = Nouă Salvare
save.overwrite = Sigur vrei să scrii peste \nacest slot de salvare?
overwrite = Scrie Peste
overwrite = Scrie peste
save.none = Nu s-au găsit salvări!
savefail = Salvarea jocului a eșuat!
save.delete.confirm = Sigur vrei să ștergi această salvare?
@@ -316,7 +317,7 @@ data.invalid = Aceste date de joc nu sunt valide.
data.import.confirm = Importul de date externe va suprascrie[scarlet] toate[] datele tale de joc curente.\n[accent]Acest proces este ireversibil![]\n\nOdată ce datele sunt importate, jocul tău se va opri imediat.
quit.confirm = Sigur vrei să abandonezi?
loading = [accent]Se încarcă...
reloading = [accent]Se Reîncarcă Modurile...
downloading = [accent]Se descarcă...
saving = [accent]Se salvează...
respawn = [accent][[{0}][] ca să te refaci în nucleu
cancelbuilding = [accent][[{0}][] pt a curăța planul
@@ -344,9 +345,9 @@ custom = Personalizată
builtin = Prestabilită
map.delete.confirm = Ești sigur că vrei să ștergi această hartă? Acțiunea este ireversibilă!
map.random = [accent]Hartă Aleatorie
map.nospawn = Harta asta nu are niciun nucleu în care vor apărea jucătorii! Adaugă un nucleu[accent] portocaliu[] acestei hărți în editor.
map.nospawn = Harta asta nu are niciun nucleu în care vor apărea jucătorii! Adaugă un nucleu [#{0}]{1}[] acestei hărți în editor.
map.nospawn.pvp = Această hartă nu are niciun nucleu inamic în care să apară jucătorii! Adaugă nuclee[scarlet] care nu sunt portocalii[] acestei hărți în editor.
map.nospawn.attack = Această hartă nu are niciun nucleu inamic pe care să îl atace jucătorii! Adaugă un nucleu[scarlet] roșu[] acestei hărți în editor.
map.nospawn.attack = Această hartă nu are niciun nucleu inamic pe care să îl atace jucătorii! Adaugă nuclee [#{0}]{1}[] acestei hărți în editor.
map.invalid = Eroare la încărcarea hărții: fișier corupt sau invalid.
workshop.update = Fă Update la Item
workshop.error = Eroare la preluarea detaliilor din Workshop: {0}
@@ -538,6 +539,7 @@ configure = Configurează Încărcarea
loadout = Încărcare
resources = Resurse
bannedblocks = Blocuri Interzise
bannedunits = Unități Interzise
addall = Adaugă-le pe toate
launch.from = Lansează Din: [accent]{0}
launch.destination = Destinație: {0}
@@ -562,6 +564,8 @@ weather.sandstorm.name = Furtună de nisip
weather.sporestorm.name = Furtună de spori
weather.fog.name = Ceață
sectorlist = Sectoare
sectorlist.attacked = {0} sunt atacate
sectors.unexplored = [lightgray]Neexplorat
sectors.resources = Resurse:
sectors.production = Producție:
@@ -834,13 +838,13 @@ category.items = Materiale
category.crafting = Necesită/Produce
category.function = Funcționare
category.optional = Îmbunătățiri opționale
setting.skipcoreanimation.name = Sari peste Animația de Lansare/Aterizare a Nucleului
setting.landscape.name = Blochează Mod Peisaj
setting.shadows.name = Umbre
setting.blockreplace.name = Sugestii Plasare Automats
setting.linear.name = Filtrare Liniară
setting.hints.name = Indicii
setting.logichints.name = Indicii Procesoare Logice
setting.flow.name = Afișează Rata de Curgere a lichidelor
setting.buildautopause.name = Autopauză de la Construit
setting.backgroundpause.name = Pune Pauză în Fundal
setting.doubletapmine.name = Dublu-Click pt a Mina
@@ -875,6 +879,7 @@ setting.seconds = {0} secunde
setting.milliseconds = {0} millisecunde
setting.fullscreen.name = Ecran Complet
setting.borderlesswindow.name = Fereastră Fără Margine
setting.borderlesswindow.name.windows = Ecran Complet Fără Margine
setting.borderlesswindow.description = Repornirea poate fi necesară pt a aplica schimbările.
setting.fps.name = Vezi FPS & Ping
setting.smoothcamera.name = Cameră Graduală
@@ -961,7 +966,7 @@ keybind.shoot.name = Trage
keybind.zoom.name = Zoom
keybind.menu.name = Meniu
keybind.pause.name = Pauză
keybind.pause_building.name = Pauză/Reia Construit
keybind.pause_building.name = Pauză/Reia Construcție
keybind.minimap.name = Minihartă
keybind.planet_map.name = Harta Planetei
keybind.research.name = Cercetare
@@ -987,7 +992,7 @@ mode.editor.name = Editor
mode.pvp.name = PvP
mode.pvp.description = Luptă împotriva altor jucători local.\n[gray]E nevoie de 2 nuclee colorate diferit pe hartă pt a juca.
mode.attack.name = Atac
mode.attack.description = Distruge baza inamicului. \n[gray]E nevoie de un nucleu roșu pe hartă pt a juca.
mode.attack.description = Distruge baza inamicului. \n[gray]E nevoie de un nucleu Agresor (roșu) pe hartă pt a juca.
mode.custom = Reguli Personalizate
rules.infiniteresources = Resurse Infinite
@@ -998,6 +1003,7 @@ rules.wavetimer = Valuri pe Timp
rules.waves = Valuri
rules.attack = Modul Atac
rules.buildai = AI-ul Construiește
rules.aitier = Nivel AI
rules.cleanupdeadteams = Îndepărtează Clădirile Echipelor Învinse (PvP)
rules.corecapture = Capturează Nucleele Distruse
rules.enemyCheat = Resurse infinite pt AI (echipa roșie)
@@ -1017,12 +1023,15 @@ rules.deconstructrefundmultiplier = Multiplicatorul Recompensei la Deconstrucți
rules.waitForWaveToEnd = Valurile Așteaptă Inamicii
rules.dropzoneradius = Raza Zonei de Lansare:[lightgray] (pătrate)
rules.unitammo = Unitățile Necesită Muniție
rules.enemyteam = Echipa Inamică
rules.playerteam = Echipa Jucătorului
rules.title.waves = Valuri
rules.title.resourcesbuilding = Resurse și Construit
rules.title.resourcesbuilding = Resurse și Construcție
rules.title.enemy = Inamici
rules.title.unit = Unități
rules.title.experimental = Experimental
rules.title.environment = Mediu
rules.title.teams = Echipe
rules.lighting = Luminozitate Ambientală
rules.enemyLights = Inamicii Luminează
rules.fire = Foc
@@ -1101,7 +1110,6 @@ unit.reign.name = Reign
unit.vela.name = Vela
unit.corvus.name = Corvus
block.resupply-point.name = Punct de Realimentare
block.parallax.name = Parallax
block.cliff.name = Deal
block.sand-boulder.name = Bolovan de Nisip
@@ -1134,7 +1142,7 @@ block.kiln.name = Cuptor
block.graphite-press.name = Presă de Grafit
block.multi-press.name = Multi-Presă
block.constructing = {0} [lightgray](În Construcție)
block.spawn.name = Punctul de Lansare Inamic
block.spawn.name = Punct Inamic de Lansare
block.core-shard.name = Nucleu: Shard
block.core-foundation.name = Nucleu: Foundation
block.core-nucleus.name = Nucleu: Core
@@ -1328,12 +1336,12 @@ block.large-logic-display.name = Monitor Logic Mare
block.memory-cell.name = Celulă de Memorie
block.memory-bank.name = Bancă de Memorie
team.blue.name = albastră
team.crux.name = roșie
team.sharded.name = portocalie
team.derelict.name = abandonată
team.green.name = verde
team.purple.name = mov
team.blue.name = Albastru
team.crux.name = Agresor
team.sharded.name = Portocaliu
team.derelict.name = Abandonat
team.green.name = Verde
team.purple.name = Mov
hint.skip = Treci peste
hint.desktopMove = Folosește [accent][[WASD][] ca să te miști.
@@ -1400,12 +1408,11 @@ item.blast-compound.description = Folosit în bombe și muniție explozibilă.
item.pyratite.description = Folosită în armele incendiare și generatoarele pe bază de procese de combustie.
liquid.water.description = Folosită pt răcirea mașinăriilor și procesarea deșeurilor.
liquid.slag.description = Rafinată în separatoare înapoi în materialele constituente, sau pulverizată înspre unitățile inamice ca armă.
liquid.slag.description = Rafinată înapoi în materialele constituente cu ajutorul separatoarelor sau pulverizată înspre unitățile inamice ca armă.
liquid.oil.description = Folosit în producerea avansată de materiale și ca muniție incendiară.
liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici.
block.derelict = [lightgray]Structuri Abandonate
block.resupply-point.description = Realimentează unitățile din apropiere cu muniție de cupru. Nu este compatibil cu unitățile care se încarcă din baterii.
block.derelict = [lightgray]Structură Abandonată
block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi.
block.illuminator.description = Emite lumină.
block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați.

View File

@@ -63,7 +63,7 @@ schematic.copy.import = นำเข้าจากคลิปบอร์ด
schematic.shareworkshop = แชร์บนเวิร์กช็อป
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: กลับแผนผัง
schematic.saved = บันทึกแผนผังแล้ว
schematic.delete.confirm = แผนผังนี้จะถูกกำจัดให้หมดสิ้นโดยสิ้นเชิง
schematic.delete.confirm = แผนผังนี้จะถูกกำจัดให้หมดสิ้นไม่เหลือซาก
schematic.rename = เปลี่ยนชื่อแผนผัง
schematic.info = {0}x{1}, {2} บล็อก
schematic.disabled = [scarlet]การใช้แผนผังถูกปิดไว้[]\nคุณไม่สามารถใช้แผนผังได้ใน[accent]แมพ[]หรือ[accent]เซิร์ฟเวอร์นี้
@@ -71,9 +71,9 @@ schematic.tags = แท็ก:
schematic.edittags = แก้ไขแท็ก
schematic.addtag = เพิ่มแท็ก
schematic.texttag = แท็กข้อความ
schematic.icontag = ไอคอนแท็ก
schematic.icontag = แท็กไอคอน
schematic.renametag = เปลี่ยนชื่อแท็ก
schematic.tagdelconfirm = จะลบแท็กนี้ทั้งหมดใช่ไหม?
schematic.tagdelconfirm = จะลบแท็กนี้ทั่วทั้งหมดเลยใช่ไหม?
schematic.tagexists = แท็กนี้มีอยู่แล้ว
stats = สถิติ
@@ -114,7 +114,7 @@ continue = ต่อ
maps.none = [lightgray]ไม่มีแมพ!
invalid = ไม่ถูกต้อง
pickcolor = เลือกสี
preparingconfig = กำลังเตรียม Config
preparingconfig = กำลังเตรียมค่าปรับแต่ง
preparingcontent = กำลังเตรียมเนื้อหา
uploadingcontent = กำลังอัปโหลดเนื้อหา
uploadingpreviewfile = กำลังอัปโหลดไฟล์พรีวิว
@@ -186,11 +186,11 @@ server.closing = [accent]กำลังปิดเซิร์ฟเวอร
server.kicked.kick = คุณถูกเตะออกจากเซิร์ฟเวอร์!
server.kicked.whitelist = คุณไม่ได้ถูกรับเชิญ\nคนที่ถูกรับเชิญเท่านั้นที่จะเข้าได้
server.kicked.serverClose = เซิร์ฟเวอร์ถูกปิด
server.kicked.vote = คุณถูกโหวตเตะออก บัยบาย
server.kicked.vote = คุณถูกโหวตให้เตะออก บัยบาย
server.kicked.clientOutdated = ไคลเอนต์เก่า! กรุณาอัปเดตเกมของคุณ!
server.kicked.serverOutdated = เซิร์ฟเวอร์เก่า! โปรดถามเจ้าของเซิร์ฟเวอร์เพื่ออัปเดต!
server.kicked.serverOutdated = เซิร์ฟเวอร์เก่า! โปรดถามโฮสต์เพื่อให้อัปเดต!
server.kicked.banned = คุณถูกแบนในเซิร์ฟเวอร์นี้
server.kicked.typeMismatch = เซิร์ฟเวอร์นี้ไม่เข้ากับประเภทบิลด์ของคุณ
server.kicked.typeMismatch = เซิร์ฟเวอร์นี้ไม่เข้ากับประเภทเวอร์ชั่นของคุณ
server.kicked.playerLimit = เซิร์ฟเวอร์เต็ม กรุณารอให้เซิร์ฟเวอร์ว่างก่อน
server.kicked.recentKick = คุณเพิ่งถูกเตะออกจากเซิร์ฟเวอร์นี้\nกรุณารอสักครู่เพื่อเข้าร่วมอีกครั้ง
server.kicked.nameInUse = มีคนที่ใช้ชื่อนี้\nอยู่ในเซิร์ฟเวอร์แล้ว
@@ -229,7 +229,7 @@ trace.playername = ชื่อผู้เล่น: [accent]{0}
trace.ip = IP: [accent]{0}
trace.id = ID: [accent]{0}
trace.mobile = ไคลเอนต์โมบาย: [accent]{0}
trace.modclient = ไคลเอนต์แบบกำหนดเอง: [accent]{0}
trace.modclient = ไคลเอนต์ปรับแต่ง: [accent]{0}
trace.times.joined = เวลาเข้า: [accent]{0}
trace.times.kicked = เวลาโดนเตะ: [accent]{0}
invalidid = client ID ไม่ถูกต้อง! กรุณารายงานบัคนี้
@@ -289,7 +289,7 @@ on = เปิด
off = ปิด
save.autosave = เซฟอัตโนมัติ: {0}
save.map = แมพ: {0}
save.wave = Wave {0}
save.wave = คลื่นที่ {0}
save.mode = เกมโหมด: {0}
save.date = เซฟล่าสุด: {0}
save.playtime = เวลาที่เล่นไป: {0}
@@ -317,7 +317,7 @@ data.invalid = นี่ไม่ใช่ข้อมูลเกมที่
data.import.confirm = การนำเข้าข้อมูลจากภายนอกจะเขียนทับข้อมูลเก่า[scarlet]ทั้งหมด[]\n[accent]และไม่สามารถย้อนกลับได้![]\n\nหลังจากที่นำเข้าข้อมูลแล้วเกมจะปิดลงโดยทันที
quit.confirm = คุณแน่ใจหรือว่าจะออก?
loading = [accent]กำลังโหลด...
reloading = [accent]กำลังรีโหลดม็อด...
downloading = [accent]กำลังดาวน์โหลด...
saving = [accent]กำลังเซฟ...
respawn = กด [accent][[{0}][] เพื่อเกิดใหม่ที่แกนกลาง
cancelbuilding = กด [accent][[{0}][] เพื่อเคลียร์แผน
@@ -345,13 +345,13 @@ custom = กำหนดเอง
builtin = ติดตัว
map.delete.confirm = คุณแน่ใจหรือว่าจะลบแมพนี้? การกระทำครั้งนี้ไม่สามารถย้อนกลับได้!
map.random = [accent]สุ่มแมพ
map.nospawn = แมพนี้ไม่มีแกนกลางให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[accent]สีเหลือง[] ในตัวแก้ไข
map.nospawn.pvp = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[scarlet]ที่ไม่ใช่สีส้ม[] ในตัวแก้ไข
map.nospawn.attack = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นโจมตี! กรุณาใส่แกนกลาง[scarlet]สีแดง[] ในตัวแก้ไข
map.nospawn = แมพนี้ไม่มีแกนกลางให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[#{0}]{1}[] ลงในตัวแก้ไข
map.nospawn.pvp = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[scarlet]ที่ไม่ใช่สีส้ม[] ลงในตัวแก้ไข
map.nospawn.attack = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นโจมตี! กรุณาใส่แกนกลาง[#{0}]{1}[] ลงในตัวแก้ไข
map.invalid = โหลดแมพผิดพลาด: ไฟล์แมพเสียหายหรือไม่ถูกต้อง
workshop.update = อัปเดตไอเท็ม
workshop.error = ผิดพลาดในการนำเวิร์กช็อปมา รายละเอียดดังนี้: {0}
map.publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่แมพนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA, มิฉนั้นแมพจะไม่ปรากฏ!
map.publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่แมพนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA มิฉนั้นแมพจะไม่ปรากฏ!
workshop.menu = เลือกว่าจะทำอะไรกับไอเท็มนี้
workshop.info = ข้อมูลไอเท็ม
changelog = สิ่งที่เปลี่ยนไป (ไม่จำเป็น):
@@ -482,9 +482,9 @@ filter.terrain = พื้นผิว
filter.option.scale = มาตราส่วน
filter.option.chance = โอกาส
filter.option.mag = แม็คนิจู
filter.option.mag = แมนิจู
filter.option.threshold = เกณฑ์
filter.option.circle-scale = สเกลวงกลม
filter.option.circle-scale = อัตราวงกลม
filter.option.octaves = เลอะเลือน
filter.option.falloff = หลุดร่วง
filter.option.angle = มุม
@@ -522,7 +522,7 @@ editor = ตัวแก้ไขแมพ
mapeditor = แก้ไขแมพ
abandon = ละทิ้ง
abandon.text = โซนนี้และทรัพยากรทั้งหมดจะถูกยดไปเป็นของศัตรู
abandon.text = โซนนี้และทรัพยากรทั้งหมดจะถูกยดไปเป็นของศัตรู
locked = ล็อก
complete = [lightgray]ต้องมี:
requirement.wave = ถึงคลื่นที่ {0} ใน {1}
@@ -539,6 +539,7 @@ configure = ตั้งค่าทรัพยากร
loadout = ทรัพยากรเริ่มต้น
resources = ทรัพยากร
bannedblocks = บล็อกต้องห้าม
bannedunits = ยูนิตต้องห้าม
addall = เพิ่มทั้งหมด
launch.from = ลงจอดจากเซ็กเตอร์: [accent]{0}
launch.destination = จุดหมายปลายทาง: {0}
@@ -550,7 +551,7 @@ connectfail = [crimson]การเชื่อมต่อผิดพลาด
error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง?
error.invalidaddress = ที่อยู่ไม่ถูกต้อง
error.timedout = Timed out!\nเช็คให้แน่ใจว่า port forwarding ของโฮสต์เปิดอยู่และที่อยู่นั้นถูกต้อง!
error.mismatch = Packet error:\nอาจเกิดจากเวอร์ชั่นของ ไคลเอนต์/เซิร์ฟเวอร์ ไม่ตรงกัน\nเช็คให้แน่ใจว่าเซิร์ฟเวอร์ใช้ Mindustry เวอร์ชั่นล่าสุด!
error.mismatch = Packet error:\nอาจเกิดจากเวอร์ชั่นของ ไคลเอนต์/เซิร์ฟเวอร์ ไม่ตรงกัน\nเช็คให้แน่ใจว่าคุณและโฮสต์ใช้ Mindustry เวอร์ชั่นล่าสุด!
error.alreadyconnected = เชื่อมต่ออยู่แล้ว
error.mapnotfound = ไม่พบไฟล์แมพ
error.io = Network I/O error
@@ -563,6 +564,8 @@ weather.sandstorm.name = พายุทราย
weather.sporestorm.name = พายุสปอร์
weather.fog.name = หมอก
sectorlist = เซ็กเตอร์
sectorlist.attacked = {0} ถูกโจมตึ
sectors.unexplored = [lightgray]ยังไม่ได้สำรวจ
sectors.resources = ทรัพยากร:
sectors.production = การผลิต:
@@ -620,14 +623,14 @@ sector.extractionOutpost.name = ด่านส่งทรัพยากร
sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน
sector.groundZero.description = ที่ที่ดีที่สุดในการเริ่มต้นอีกครั้ง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ
sector.frozenForest.description = แม้แต่ที่นี่ ที่ที่อยู่ใกล้ภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่ อากาศที่เย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้ เรียนรู้ที่จะใช้เครื่องซ่อมแซม
sector.frozenForest.description = แม้แต่ที่นี่ ที่ที่อยู่ใกล้ภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่\nอากาศอันเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้\nเรียนรู้ที่จะใช้เครื่องซ่อมแซม
sector.saltFlats.description = ณ ขอบของทะเลทราย เป็นที่ตั้งของที่ราบเกลือ สามารถพบทรัพยากรบางอย่างได้ที่นี่\n\nศัตรูได้ตั้งฐานเก็บทรัพยากรไว้ที่นี่ ทำลายแกนกลางของพวกมัน อย่าให้มีอะไรเหลือ
sector.craters.description = น้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ อนุสรณ์สถานของสงครามเก่าแก่ ยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[] ปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ
sector.ruinousShores.description = ถัดจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง ซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน ทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง
sector.craters.description = น้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ อนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ
sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง\nซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน\nทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง
sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา
sector.overgrowth.description = พื้นที่นี้ถูกปกคลุมไปด้วยพืช เข้าใกล้กับแหล่งกำเนิดของสปอร์\nศัตรูได้ตั้งฐานเฝ้าระวังไว้ที่นี่ สร้างยูนิตเมส ทำลายฐานทิ้งซะ\nวิจัย[accent]เครื่องพัฒนารุ่นยกกำลัง[]เพื่อผลิตยูนิตขนาดที่ใหญ่ขึ้น
sector.tarFields.description = ขอบของพื้นที่ผลิตน้ำมัน อยู่ระหว่างภูเขาและทะเลทราย หนึ่งในพื้นที่ที่มีแหล่งน้ำมันดิที่ใช้งานได้\nแม้ว่าจะถูกทิ้งร้าง พื้นที่นี้ยังคงมีฐานทัพของศัตรูอยู่ใกล้ๆ อย่าประมาทกับพวกมัน\n\n[lightgray]วิจัยเทคโนโลยีการแปรรูปน้ำมันหากเป็นไปได้
sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาก ทรัพยากรมากมาย แต่พื้นที่แคบ ความเสี่ยงการโดนทำลายล้างสูง ออกไปจากที่นี่ให้เร็วที่สุด อย่าถูกหลอกโดยระยะเวลาระหว่างการโจมตีของศัตรูที่เว้นไว้นานกว่าปกติ
sector.tarFields.description = ขอบของพื้นที่ผลิตน้ำมัน อยู่ระหว่างภูเขาและทะเลทราย หนึ่งในพื้นที่ที่มีแหล่งน้ำมันดิที่ใช้งานได้\nแม้ว่าจะถูกทิ้งร้าง พื้นที่นี้ยังคงมีฐานทัพของศัตรูอยู่ใกล้ๆ อย่าประมาทกับพวกมัน\n\n[lightgray]วิจัยเทคโนโลยีการแปรรูปน้ำมันหากเป็นไปได้
sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาก ทรัพยากรมากมาย แต่พื้นที่คับแคบ\nความเสี่ยงการโดนทำลายล้างสูง ออกไปจากที่นี่ให้เร็วที่สุด\nอย่าถูกหลอกโดยระยะเวลาระหว่างการโจมตีของศัตรูที่เว้นไว้นานกว่าปกติ
sector.nuclearComplex.description = สถานที่ผลิตและแปรรูปทอเรี่ยมเก่า ถูกทำลายไม่เหลือสิ้น\nวิจัยทอเรี่ยมและวิธีการใช้มัน\n\nศัตรูในบริเวณนี้มีจำนวนมาก คอยตรวจตราหาผู้บุกรุกอยู่ตลอดเวลา
sector.fungalPass.description = ทางผ่านระหว่างพื้นที่สูงและต่ำของภูเขา พื้นที่นี้เต็มไปด้วยสปอร์ ฐานลาดตระเวนขนาดเล็กของศัตรูตั้งอยู่ที่นี่\nทำลายมันซะ\nผลิตยูนิตแด็กเกอร์และครอว์เลอร์ ทำลายแกนกลางทั้งสองไม่ให้เหลือซาก
sector.biomassFacility.description = แหล่งต้นกำเนิดของสปอร์ ที่นี่คือฐานวิจัยและผลิตสปอร์เริ่มแรก\nวิจัยเทคโนโลยีที่อยู่ภายในนั้น เพาะชำ[accent]สปอร์[]เพื่อเป็นเชื้อเพลิงและใช้ในการผลิตพลาสติก\n\n[gray]เมื่อสถานที่นี้ถูกทิ้งร้าง สปอร์ก็ถูกปล่อยออกมา ไม่มีสิ่งใดในระบบนิเวศท้องถิ่นที่สามารถแข่งขันกับสิ่งมีชีวิตที่\nแพร่กระจายเช่นนี้ได้
@@ -824,8 +827,8 @@ unit.percent = %
unit.shieldhealth = พลังชีวิตโล่
unit.items = ไอเท็ม
unit.thousands = k
unit.millions = [] []ล้าน
unit.billions = [] []พันล้าน
unit.millions = [lightgray] []ล้าน
unit.billions = [lightgray] []พันล้าน
unit.pershot = [] []ไอเท็ม/การยิง
category.purpose = วัตถุประสงค์
category.general = ทั่วไป
@@ -863,10 +866,10 @@ setting.difficulty.training = ฝึกซ้อม
setting.difficulty.easy = ง่าย
setting.difficulty.normal = ปานกลาง
setting.difficulty.hard = ยาก
setting.difficulty.insane = ยากมาก
setting.difficulty.insane = โหดเหี้ยม
setting.difficulty.name = ระดับความยาก:
setting.screenshake.name = การสั่นของจอ
setting.effects.name = แสดงเอฟเฟกต์
setting.effects.name = แสดงเอฟเฟกต์
setting.destroyedblocks.name = แสดงบล็อกที่ถูกทำลาย
setting.blockstatus.name = แสดงสถานะของบล็อก
setting.conveyorpathfinding.name = ตรวจสอบเส้นทางการวางอัจฉริยะ
@@ -876,6 +879,7 @@ setting.seconds = {0} วินาที
setting.milliseconds = {0} มิลลิวินาที
setting.fullscreen.name = เต็มจอ
setting.borderlesswindow.name = หน้าต่างแบบไร้ขอบ
setting.borderlesswindow.name.windows = จอเต็มแบบไร้ขอบ
setting.borderlesswindow.description = อาจจะต้องรีสตาร์ทเพื่อใส่การเปลี่ยนแปลง
setting.fps.name = แสดง FPS และ Ping
setting.smoothcamera.name = กล้องแบบลื่นไหล
@@ -922,8 +926,8 @@ keybind.clear_building.name = เคลียร์สิ่งก่อสร
keybind.press = กดปุ่มใดก็ได้...
keybind.press.axis = กดแกนหรือปุ่มใดก็ได้...
keybind.screenshot.name = ถ่ายรูปแมพ
keybind.toggle_power_lines.name = เปิดปิดเลเซอร์พลังงาน
keybind.toggle_block_status.name = เปิดปิดสถานะของบล็อก
keybind.toggle_power_lines.name = เปิด/ปิด เลเซอร์พลังงาน
keybind.toggle_block_status.name = เปิด/ปิด สถานะของบล็อก
keybind.move_x.name = เคลื่อนที่ในแกน x
keybind.move_y.name = เคลี่อนที่ในแกน y
keybind.mouse_move.name = ตามเม้าส์
@@ -999,6 +1003,7 @@ rules.wavetimer = นับถอยหลังการปล่อยคล
rules.waves = คลื่น
rules.attack = โหมดการโจมตี
rules.buildai = AI ก่อสร้าง
rules.aitier = ระดับของ AI
rules.cleanupdeadteams = ลบล้างสิ่งก่อสร้างศัตรูที่พ่ายแพ้ (PvP)
rules.corecapture = ยืดแกนกลางเมื่อทำลาย
rules.polygoncoreprotection = รัศมีปกป้องแกนกลางแบบหลายเหลี่ยม
@@ -1018,12 +1023,15 @@ rules.deconstructrefundmultiplier = พหุคูณการคืนทร
rules.waitForWaveToEnd = คลื่นรอศัตรู
rules.dropzoneradius = รัศมีจุดเกิดของศัตรู:[lightgray] (ช่อง)
rules.unitammo = ยูนิตต้องใช้กระสุน
rules.enemyteam = ทีมศัตรู
rules.playerteam = ทีมผู้เล่น
rules.title.waves = คลื่น
rules.title.resourcesbuilding = ทรัพยากรและสิ่งก่อสร้าง
rules.title.enemy = ศัตรู
rules.title.unit = ยูนิต
rules.title.experimental = ทดลอง
rules.title.environment = สิ่งแวดล้อม
rules.title.teams = ทีม
rules.lighting = แสง
rules.enemyLights = ไฟศัตรู
rules.fire = ไฟ
@@ -1102,13 +1110,12 @@ unit.reign.name = เรน
unit.vela.name = เวล่า
unit.corvus.name = คอร์วัส
block.resupply-point.name = จุดเติมของ
block.parallax.name = พาราแล็คซ์
block.cliff.name = หน้าผา
block.sand-boulder.name = ก้อนหินทราย
block.basalt-boulder.name = ก้อนบะซอลต์
block.grass.name = หญ้า
block.molten-slag.name = แร่หลอม
block.molten-slag.name = แร่หลอมละลาย
block.space.name = อวกาศ
block.salt.name = เกลือ
block.salt-wall.name = กำแพงเกลือ
@@ -1140,10 +1147,10 @@ block.core-shard.name = แกนกลาง: ชาร์ด
block.core-foundation.name = แกนกลาง: ฟาวน์เดชั่น
block.core-nucleus.name = แกนกลาง: นิวเคลียส
block.deep-water.name = น้ำลึก
block.shallow-water.name = น้ำ
block.shallow-water.name = น้ำตื้น
block.tainted-water.name = น้ำเสีย
block.darksand-tainted-water.name = น้ำเสียบนทรายดำ
block.tar.name = น้ำมันดิ
block.tar.name = น้ำมันดิ
block.stone.name = หิน
block.sand.name = ทราย
block.darksand.name = ทรายดำ
@@ -1199,7 +1206,7 @@ block.door.name = ประตู
block.door-large.name = ประตูขนาดใหญ่
block.duo.name = ดูโอ้
block.scorch.name = สคอร์ช
block.scatter.name = สแกตเตอร์
block.scatter.name = สแกตเตอร์
block.hail.name = ลูกเห็บ
block.lancer.name = แลนเซอร์
block.conveyor.name = สายพาน
@@ -1289,7 +1296,7 @@ block.overdrive-projector.name = เครื่องเร่งประส
block.force-projector.name = เครื่องฉายสนามพลัง
block.arc.name = อาร์ค
block.rtg-generator.name = เครื่องกำเนิดไฟฟ้า RTG
block.spectre.name = สเปคเตอร์
block.spectre.name = สเปคเตอร์
block.meltdown.name = เมลท์ดาวน์
block.foreshadow.name = ฟอร์ชาโดว์
block.container.name = ตู้เก็บของ
@@ -1354,8 +1361,8 @@ hint.breaking = [accent]คลิ๊กขวา[] แล้วลากเพ
hint.breaking.mobile = เปิดใช้ \ue817 [accent]ค้อน[] ตรงล่างขวาแล้วเลือกเพื่อทำลายบล็อก\n\nเอานิ้วจิ้มลงไปสักแป๊บนึงแล้วลากเพื่อเลือกหลายๆ อัน
hint.blockInfo = ดูข้อมูลของบล็อกโดยการเลือกจาก[accent]เมนูการสร้าง[] แล้วกดที่รูป [accent][[?][] ตรงด้านขวา
hint.derelict = สิ่งก่อสร้างที่ถูก[accent]ทิ้งร้าง[]คือเศษซากพังทลายของฐานเก่าแก่ที่ไม่สามารถใช้งานได้แล้ว\n\nสิ่งก่อสร้างพวกนี้สามารถ[accent]ทุบทิ้ง[]เพื่อเก็บเกี่ยวทรัพยากรที่อยู่ในนั้นได้
hint.research = ใช้ปุ่ม \ue875 [accent]วิจัย[] เพื่อวิจัยเทคโนโลยีใหม่ๆ
hint.research.mobile = ใช้ปุ่ม \ue875 [accent]วิจัย[] ใน \ue88c [accent]เมนู[] เพื่อวิจัยเทคโนโลยีใหม่ๆ
hint.research = กดปุ่ม \ue875 [accent]วิจัย[] เพื่อวิจัยเทคโนโลยีใหม่ๆ
hint.research.mobile = กดปุ่ม \ue875 [accent]วิจัย[] ใน \ue88c [accent]เมนู[] เพื่อวิจัยเทคโนโลยีใหม่ๆ
hint.unitControl = กด [accent][[L-Ctrl][] ค้างไว้แล้วกด[accent]คลิ๊ก[]เพื่อควบคุมยานพวกพ้องหรือป้อมปืน
hint.unitControl.mobile = [accent][[กดสองครั้ง][]เพื่อควบคุมยานพวกพ้องหรือป้อมปืน
hint.launch = เมื่อเก็บทรัพยากรเยอะพอ คุณสามารถ[accent]ส่งแกนกลาง[]โดยการเลือกเซ็กเตอร์จาก \ue827 [accent]แผนที่[] ตรงขวาล่าง
@@ -1416,9 +1423,8 @@ liquid.oil.details = ของเหลวเฉื่อยพบได้ไ
liquid.cryofluid.description = ใช้ในการหล่อเย็นเตาปฏิกร สิ่งก่อสร้างหรือโรงงานต่างๆ
liquid.cryofluid.details = ของเหลวเฉื่อยและไม่กัดกร่อน ผลิตจากน้ำและไทเทเนี่ยม มีคุณสมบัติการถ่ายเทความร้อนสูง
block.derelict = [lightgray]ถูกทิ้งร้าง
block.resupply-point.description = ติมกระสุนยูนิตรอบข้างด้วยกระสุนทองแดง ใช้กับยูนิตที่ใช้พลังงานเป็นกระสุนไม่ได้
block.armored-conveyor.description = เลื่อนไอเท็มไปข้างหน้า เร็วเท่าสายพานไทเทเนี่ยม แต่มีเกราะที่แข็งแรงกว่า ไม่รับไอเท็มจากด้านข้างยกเว้นเป็นสายพานชนิดเดียวกัน
block.derelict = [lightgray]ถูกทิ้งร้าง
block.armored-conveyor.description = ลื่อนไอเท็มไปข้างหน้า เร็วเท่าสายพานไทเทเนี่ยม แต่มีเกราะที่แข็งแรงกว่า ไม่รับไอเท็มจากด้านข้างยกเว้นเป็นสายพานด้วยกันเอง
block.illuminator.description = ตัวเปล่งแสงขนาดกะทัดรัด ส่องสว่างในที่มืดได้ดี\nแถมยังกำหนดสีของแสงได้ด้วย... เจ๋งใช่มั้ยล่ะ
block.message.description = เก็บข้อความ ใช้สื่อสารกับพันธมิตร
block.graphite-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์

View File

@@ -493,7 +493,7 @@ filter.option.amount = Miktar
filter.option.block = Blok
filter.option.floor = Zemin
filter.option.flooronto = Hedef Zemin
filter.option.target = Target
filter.option.target = Hedef
filter.option.replacement = Değiştirme
filter.option.wall = Duvar
filter.option.ore = Maden
@@ -539,12 +539,13 @@ configure = Ekipmanı Yapılandır
loadout = Yükleme
resources = Kaynaklar
bannedblocks = Yasaklı Bloklar
bannedunits = Yasaklı Elemanlar
addall = Hepsini Ekle
launch.from = [accent]{0} dan fırlatılıyor.
launch.destination = Varış Yeri: {0}
configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı.
add = Ekle...
guardian = Gardian
guardian = Gardiyan
connectfail = [crimson]Bağlantı hatası:\n\n[accent]{0}
error.unreachable = Sunucuya ulaşılamıyor.\nAdresin doğru yazıldığına emin misiniz?
@@ -563,13 +564,15 @@ weather.sandstorm.name = Kum Fırtınası
weather.sporestorm.name = Spor Yağmuru
weather.fog.name = Sis
sectorlist = Sektörler
sectorlist.attacked = {0} saldırı altında
sectors.unexplored = [lightgray]Keşfedilmemiş
sectors.resources = Kaynaklar:
sectors.production = Üretim:
sectors.export = İhracat:
sectors.import = İthalat:
sectors.time = Zaman:
sectors.threat = Tehlike:
sectors.threat = Zorluk:
sectors.wave = Dalga:
sectors.stored = Depolanan:
sectors.resume = Devam Et
@@ -609,8 +612,8 @@ sector.frozenForest.name = Donmuş Orman
sector.ruinousShores.name = Harap Kıyılar
sector.stainedMountains.name = Lekeli Dağlar
sector.desolateRift.name = Issız Kanyon
sector.nuclearComplex.name = Nüleer Santral Kompleksi
sector.overgrowth.name = ırı Büyüme
sector.nuclearComplex.name = kleer Santral Kompleksi
sector.overgrowth.name = Sarmaşık Sporlar
sector.tarFields.name = Katran Çölü
sector.saltFlats.name = Tuz Düzlükleri
sector.fungalPass.name = Mantar Geçidi
@@ -642,7 +645,7 @@ status.wet.name = Islak
status.muddy.name = Çamurlu
status.melting.name = Eriyor
status.sapped.name = Emilmiş
status.electrified.name = Elektirklenmiş
status.electrified.name = Elektriklenmiş
status.spore-slowed.name = Sporlanmış
status.tarred.name = Ziftlenmiş
status.overclock.name = Hızlandırlımış
@@ -876,6 +879,7 @@ setting.seconds = {0} Saniye
setting.milliseconds = {0} milisaniye
setting.fullscreen.name = Tam Ekran
setting.borderlesswindow.name = Kenarsız Pencere
setting.borderlesswindow.name.windows = Kenrasız TamEkran
setting.borderlesswindow.description = Oyunu baştan açman gerekebilir.
setting.fps.name = FPS Göster
setting.smoothcamera.name = Yumuşak Geçişli Kamera
@@ -999,6 +1003,7 @@ rules.wavetimer = Dalga Zamanlayıcısı
rules.waves = Dalgalar
rules.attack = Saldırı Modu
rules.buildai = Yapay Zeka İnşası
rules.aitier = Yapay Zeka Seviyesi
rules.cleanupdeadteams = Kaybeden Takımın Bloklarını Temizle (PvP)
rules.corecapture = Yıkımca Çekirdeği Elegeçir
rules.polygoncoreprotection = Çokgenli Çekirdek Koruması
@@ -1018,12 +1023,15 @@ rules.deconstructrefundmultiplier = Yıkım İade Çarpanı
rules.waitForWaveToEnd = Dalgalar Düşmanı Bekler
rules.dropzoneradius = İniş Noktası Yarıçapı: [lightgray](kare)
rules.unitammo = Birlikler Mermi Gerektiriyor
rules.enemyteam = Düşman Takım
rules.playerteam = Oyuncu Takımı
rules.title.waves = Dalgalar
rules.title.resourcesbuilding = Kaynaklar & İnşa
rules.title.enemy = Düşmanlar
rules.title.unit = Birlikler
rules.title.experimental = Deneysel
rules.title.environment = Çevre
rules.title.teams = Takımlar
rules.lighting = ıklandırma
rules.enemyLights = Enemy Lights
rules.fire = Ateş
@@ -1102,7 +1110,6 @@ unit.reign.name = Reign
unit.vela.name = Vela
unit.corvus.name = Corvus
block.resupply-point.name = İkmal Noktası
block.parallax.name = Parallax
block.cliff.name = Uçurum
block.sand-boulder.name = Kumlu Kaya Parçaları
@@ -1293,7 +1300,7 @@ block.spectre.name = Spectre
block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow
block.container.name = Konteyner
block.launch-pad.name = Kalkış Pisti
block.launch-pad.name = Fıralatış Rampası
block.segment.name = Segment
block.command-center.name = Komuta Merkezi
block.ground-factory.name = Yer Birimi Fabrikası
@@ -1406,7 +1413,6 @@ liquid.oil.description = İleri seviye malzeme üretiminde kullanılan bir sıv
liquid.cryofluid.description = Su ve titanyumdan oluşturulan inaktif bir sıvı. Son derece yüksek ısı kapasitesine sahiptir. Soğutucu olarak yaygın olarak kullanılır.
block.derelict = [lightgray] Sahipsiz
block.resupply-point.description = Yakındaki birimlere mermi verir. Elektikle çalışmaz.
block.armored-conveyor.description = Materyalleri titanyum konveyörlerle aynı hızda taşır ama daha fazla zırha sahiptir. Diğer konveyörler dışında yan taraflardan materyal kabul etmez.
block.illuminator.description = Küçük, kompakt, yapılandırılabilir bir ışık kaynağı. Çalışması için enerji gerekir.
block.message.description = Bir mesajı saklar. Müttefikler arasındaki haberleşmede kullanılır.
@@ -1594,7 +1600,7 @@ unit.navanax.description = Devasa patlayıcı EMP gülleleri fırlatır, düşma
lst.read = Bağlı hafıza kutusundaki numarayı okur.
lst.write = Bağlı hafıza kutuaundaki numaraya yazar.
lst.print = Text yazar.
lst.print = Yazı yazar.
lst.draw = Ekrana Çizer.
lst.drawflush = Ekrana Çizimi Aktarır.
lst.printflush = Mesaj bloğuna texti aktarır,
@@ -1622,7 +1628,7 @@ lenum.config = Bina configurasyonu, örnek: Ayıklayıcı Türü
lenum.enabled = Blok aktif mi?
laccess.color = Aydınlatıcı Rengi.
laccess.controller = Nirim Kontrol edici. Eğer işlemci kontrol ediyorsa işlemci döner.
laccess.controller = Birim Kontrol edici. Eğer işlemci kontrol ediyorsa işlemci döner. \nFormasyon durumundaysa, lider döner.\nDiğer şekilde, birimi kendi döner.
laccess.dead = Bir bina veya birim hala var mı?
laccess.controlled = Bir birim ne tarafından kontrol ediliyor?
laccess.commanded = [red]Bu komut sonradan silicek! Controlled kullan!
@@ -1689,16 +1695,16 @@ lenum.damaged = Hasarlı Aynı Takımdan bir Blok.
lenum.spawn = Düşman Oluşum Noktası
lenum.building = Bir guruptan bir blok.
lenum.core = Herhangi bir Çekirdek.
lenum.storage = Depolama Bloğu,
lenum.generator = Enerji Üreten bir Blok.
lenum.factory = Fabrika Bloğu,
lenum.repair = Tamir Bloğu.
lenum.rally = Komut Bloğu.
lenum.battery = Pil.
lenum.resupply = Mermi Aktarım Bloğu.
lenum.reactor = Patlama/Thorium Reaktör.
lenum.turret = Herhangi bir taret.
lenum.core = Herhangi bir Çekirdek
lenum.storage = Depolama Bloğu
lenum.generator = Enerji Üreten bir Blok
lenum.factory = Fabrika Bloğu
lenum.repair = Tamir Bloğu
lenum.rally = Komut Bloğu
lenum.battery = Pil
lenum.resupply = Mermi Aktarım Bloğu
lenum.reactor = Patlama/Toryum Reaktör
lenum.turret = Herhangi bir taret
sensor.in = Algılanan Blok/Birim.
@@ -1731,13 +1737,13 @@ lenum.stop = Dur!
lenum.move = Tam konuma git.
lenum.approach = Bir Konuma yaklaş.
lenum.pathfind = Düşman Doğuş noktasına git.
lenum.target = Bir alana ateş et,
lenum.target = Bir alana ateş et.
lenum.targetp = Bir cisme ateş et.
lenum.itemdrop = Bir itemi bırak.
lenum.itemtake = Bir binadan item al.
lenum.paydrop = Kargoyu bırak.
lenum.paytake = Kargo al.
lenum.flag = Numara ile işaretle,
lenum.flag = Numara ile işaretle.
lenum.mine = Kaz.
lenum.build = Bina inşa et.
lenum.getblock = Bir bloğun verilerini al.

View File

@@ -87,7 +87,7 @@ public class Vars implements Loadable{
public static final int maxNameLength = 40;
/** displayed item size when ingame. */
public static final float itemSize = 5f;
/** units outside of this bound will die instantly */
/** units outside this bound will die instantly */
public static final float finalWorldBounds = 250;
/** range for building */
public static final float buildingRange = 220f;

View File

@@ -52,6 +52,7 @@ public class BaseAI{
}
public void update(){
if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){
CoreBlock block = (CoreBlock)data.core().block;
int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType);
@@ -90,49 +91,51 @@ public class BaseAI{
}else{
var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore);
int[][] weights = field.weights;
for(int i = 0; i < pathStep; i++){
int minCost = Integer.MAX_VALUE;
int cx = calcTile.x, cy = calcTile.y;
boolean foundAny = false;
for(Point2 p : Geometry.d4){
int nx = cx + p.x, ny = cy + p.y;
if(field.weights != null){
int[][] weights = field.weights;
for(int i = 0; i < pathStep; i++){
int minCost = Integer.MAX_VALUE;
int cx = calcTile.x, cy = calcTile.y;
boolean foundAny = false;
for(Point2 p : Geometry.d4){
int nx = cx + p.x, ny = cy + p.y;
Tile other = world.tile(nx, ny);
if(other != null && weights[nx][ny] < minCost && weights[nx][ny] != -1){
minCost = weights[nx][ny];
calcTile = other;
foundAny = true;
Tile other = world.tile(nx, ny);
if(other != null && weights[nx][ny] < minCost && weights[nx][ny] != -1){
minCost = weights[nx][ny];
calcTile = other;
foundAny = true;
}
}
//didn't find anything, break out of loop, this will trigger a clear later
if(!foundAny){
calcCount = Integer.MAX_VALUE;
break;
}
calcPath.add(calcTile.pos());
for(Point2 p : Geometry.d8){
calcPath.add(Point2.pack(p.x + calcTile.x, p.y + calcTile.y));
}
//found the end.
if(calcTile.build instanceof CoreBuild b && b.team == state.rules.defaultTeam){
//clean up calculations and flush results
calculating = false;
calcCount = 0;
path.clear();
path.addAll(calcPath);
calcPath.clear();
calcTile = null;
totalCalcs ++;
foundPath = true;
break;
}
calcCount ++;
}
//didn't find anything, break out of loop, this will trigger a clear later
if(!foundAny){
calcCount = Integer.MAX_VALUE;
break;
}
calcPath.add(calcTile.pos());
for(Point2 p : Geometry.d8){
calcPath.add(Point2.pack(p.x + calcTile.x, p.y + calcTile.y));
}
//found the end.
if(calcTile.build instanceof CoreBuild b && b.team == state.rules.defaultTeam){
//clean up calculations and flush results
calculating = false;
calcCount = 0;
path.clear();
path.addAll(calcPath);
calcPath.clear();
calcTile = null;
totalCalcs ++;
foundPath = true;
break;
}
calcCount ++;
}
}
}

View File

@@ -21,6 +21,7 @@ import static mindustry.Vars.*;
public class WaveSpawner{
private static final float margin = 40f, coreMargin = tilesize * 2f, maxSteps = 30;
private int tmpCount;
private Seq<Tile> spawns = new Seq<>();
private boolean spawning = false;
private boolean any = false;
@@ -162,6 +163,18 @@ public class WaveSpawner{
}
}
public int countGroundSpawns(){
tmpCount = 0;
eachGroundSpawn((x, y) -> tmpCount ++);
return tmpCount;
}
public int countFlyerSpawns(){
tmpCount = 0;
eachFlyerSpawn((x, y) -> tmpCount ++);
return tmpCount;
}
public boolean isSpawning(){
return spawning && !net.client();
}

View File

@@ -5,21 +5,17 @@ import arc.math.geom.*;
import mindustry.ai.formations.*;
public class CircleFormation extends FormationPattern{
/** Angle offset. */
public float angleOffset = 0;
@Override
public Vec3 calculateSlotLocation(Vec3 outLocation, int slotNumber){
if(slots > 1){
float angle = (360f * slotNumber) / slots;
float angle = (360f * slotNumber) / slots + (slots == 8 ? 22.5f : 0);
float radius = spacing / (float)Math.sin(180f / slots * Mathf.degRad);
outLocation.set(Angles.trnsx(angle, radius), Angles.trnsy(angle, radius), angle);
}else{
outLocation.set(0, spacing * 1.1f, 360f * slotNumber);
}
outLocation.z += angleOffset;
return outLocation;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -111,7 +111,7 @@ public class SuicideAI extends GroundAI{
}
@Override
protected Teamc target(float x, float y, float range, boolean air, boolean ground){
public Teamc target(float x, float y, float range, boolean air, boolean ground){
return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground &&
!(t.block instanceof Conveyor || t.block instanceof Conduit)); //do not target conveyors/conduits
}

View File

@@ -393,12 +393,6 @@ public class Fx{
Lines.circle(e.x, e.y, 2f + e.finpow() * 7f);
}),
healDenamic = new Effect(11, e -> {
color(Pal.heal);
stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 2f + e.finpow() * e.rotation);
}),
shieldWave = new Effect(22, e -> {
color(e.color, 0.7f);
stroke(e.fout() * 2f);
@@ -1000,7 +994,9 @@ public class Fx{
float length = 20f * e.finpow();
float size = 7f * e.fout();
rect(((Item)e.data).fullIcon, e.x + trnsx(e.rotation, length), e.y + trnsy(e.rotation, length), size, size);
if(!(e.data instanceof Item item)) return;
rect(item.fullIcon, e.x + trnsx(e.rotation, length), e.y + trnsy(e.rotation, length), size, size);
}),
shockwave = new Effect(10f, 80f, e -> {

View File

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

View File

@@ -1789,7 +1789,7 @@ public class UnitTypes implements ContentList{
shootY = 6f;
beamWidth = 0.8f;
mirror = false;
repairSpeed = 0.7f;
repairSpeed = 0.75f;
bullet = new BulletType(){{
maxRange = 120f;
@@ -1835,8 +1835,8 @@ public class UnitTypes implements ContentList{
speed = 0f;
splashDamage = 50f;
splashDamageRadius = 40f;
splashDamage = 55f;
splashDamageRadius = 45f;
}};
}});
}};

View File

@@ -383,6 +383,8 @@ public class Control implements ApplicationListener, Loadable{
Groups.fire.clear();
Groups.puddle.clear();
//reset to 0, so replaced cores don't count
state.rules.defaultTeam.data().unitCap = 0;
Schematics.placeLaunchLoadout(spawn.x, spawn.y);
//set up camera/player locations

View File

@@ -105,8 +105,8 @@ public class Renderer implements ApplicationListener{
for(int i = 0; i < splashes.length; i++) splashes[i] = atlas.find("splash-" + i);
assets.load("sprites/clouds.png", Texture.class).loaded = t -> {
((Texture)t).setWrap(TextureWrap.repeat);
((Texture)t).setFilter(TextureFilter.linear);
t.setWrap(TextureWrap.repeat);
t.setFilter(TextureFilter.linear);
};
}

View File

@@ -261,6 +261,7 @@ public class UI implements ApplicationListener, Loadable{
this.numeric = inumeric;
this.maxLength = textLength;
this.accepted = confirmed;
this.allowEmpty = false;
}});
}else{
new Dialog(titleText){{

View File

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

View File

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

View File

@@ -38,7 +38,7 @@ public class MapInfoDialog extends BaseDialog{
TextField name = t.field(tags.get("name", ""), text -> {
tags.put("name", text);
}).size(400, 55f).addInputDialog(50).get();
}).size(400, 55f).maxTextLength(50).get();
name.setMessageText("@unknown");
t.row();
@@ -46,7 +46,7 @@ public class MapInfoDialog extends BaseDialog{
TextArea description = t.area(tags.get("description", ""), Styles.areaField, text -> {
tags.put("description", text);
}).size(400f, 140f).addInputDialog(1000).get();
}).size(400f, 140f).maxTextLength(1000).get();
t.row();
t.add("@editor.author").padRight(8).left();
@@ -54,7 +54,7 @@ public class MapInfoDialog extends BaseDialog{
TextField author = t.field(tags.get("author", Core.settings.getString("mapAuthor", "")), text -> {
tags.put("author", text);
Core.settings.put("mapAuthor", text);
}).size(400, 55f).addInputDialog(50).get();
}).size(400, 55f).maxTextLength(50).get();
author.setMessageText("@unknown");
t.row();

View File

@@ -29,7 +29,7 @@ public class MapResizeDialog extends BaseDialog{
table.field((w ? width : height) + "", TextFieldFilter.digitsOnly, value -> {
int val = Integer.parseInt(value);
if(w) width = val; else height = val;
}).valid(value -> Strings.canParsePositiveInt(value) && Integer.parseInt(value) <= maxSize && Integer.parseInt(value) >= minSize).addInputDialog(3);
}).valid(value -> Strings.canParsePositiveInt(value) && Integer.parseInt(value) <= maxSize && Integer.parseInt(value) >= minSize).maxTextLength(3);
table.row();
}

View File

@@ -189,7 +189,7 @@ public class WaveGraph extends Table{
for(UnitType o : hidden) used.remove(o);
}).update(b -> b.setChecked(hidden.contains(type)));
}
}).get().setScrollingDisabled(false, true);
}).scrollY(false);
for(UnitType type : hidden){
used.remove(type);

View File

@@ -128,7 +128,7 @@ public class WaveInfoDialog extends BaseDialog{
cont.clear();
cont.stack(new Table(Tex.clear, main -> {
main.pane(t -> table = t).growX().growY().padRight(8f).get().setScrollingDisabled(true, false);
main.pane(t -> table = t).growX().growY().padRight(8f).scrollX(false);
main.row();
main.button("@add", () -> {
if(groups == null) groups = new Seq<>();

View File

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

View File

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

View File

@@ -10,6 +10,7 @@ import arc.util.*;
import mindustry.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
@@ -105,7 +106,11 @@ public class EnergyFieldAbility extends Ability{
});
if(hitBuildings){
Units.nearbyBuildings(rx, ry, range, all::add);
Units.nearbyBuildings(rx, ry, range, b -> {
if(b.team != Team.derelict || state.rules.coreCapture){
all.add(b);
}
});
}
all.sort(h -> h.dst2(rx, ry));

View File

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

View File

@@ -45,6 +45,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
transient String lastText = "";
transient float textFadeTime;
transient private Unit lastReadUnit = Nulls.unit;
transient private int wrongReadUnits;
transient @Nullable Unit justSwitchFrom, justSwitchTo;
public boolean isBuilder(){
@@ -104,9 +105,15 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
//reason: we know the server is lying here, essentially skip the unit snapshot because we know the client's information is more recent
if(isLocal() && unit == justSwitchFrom && justSwitchFrom != null && justSwitchTo != null){
unit = justSwitchTo;
//if several snapshots have passed and this unit is still incorrect, something's wrong
if(++wrongReadUnits >= 2){
justSwitchFrom = null;
wrongReadUnits = 0;
}
}else{
justSwitchFrom = null;
justSwitchTo = null;
wrongReadUnits = 0;
}
//simulate a unit change after sync

View File

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

View File

@@ -46,19 +46,19 @@ public class AIController implements UnitController{
}
@Nullable
protected AIController fallback(){
public AIController fallback(){
return null;
}
protected boolean useFallback(){
public boolean useFallback(){
return false;
}
protected UnitCommand command(){
public UnitCommand command(){
return unit.team.data().command;
}
protected void updateVisuals(){
public void updateVisuals(){
if(unit.isFlying()){
unit.wobble();
@@ -66,21 +66,21 @@ public class AIController implements UnitController{
}
}
protected void updateMovement(){
public void updateMovement(){
}
protected void updateTargeting(){
public void updateTargeting(){
if(unit.hasWeapons()){
updateWeapons();
}
}
protected boolean invalid(Teamc target){
public boolean invalid(Teamc target){
return Units.invalidateTarget(target, unit.team, unit.x, unit.y);
}
protected void pathfind(int pathTarget){
public void pathfind(int pathTarget){
int costType = unit.pathType();
Tile tile = unit.tileOn();
@@ -92,7 +92,7 @@ public class AIController implements UnitController{
unit.moveAt(vec.trns(unit.angleTo(targetTile.worldx(), targetTile.worldy()), unit.speed()));
}
protected void updateWeapons(){
public void updateWeapons(){
float rotation = unit.rotation - 90;
boolean ret = retarget();
@@ -146,45 +146,45 @@ public class AIController implements UnitController{
}
}
protected boolean checkTarget(Teamc target, float x, float y, float range){
public boolean checkTarget(Teamc target, float x, float y, float range){
return Units.invalidateTarget(target, unit.team, x, y, range);
}
protected boolean shouldShoot(){
public boolean shouldShoot(){
return true;
}
protected Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){
public Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){
if(unit.team == Team.derelict) return null;
Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag));
return target == null ? null : target.build;
}
protected Teamc target(float x, float y, float range, boolean air, boolean ground){
public Teamc target(float x, float y, float range, boolean air, boolean ground){
return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground);
}
protected boolean retarget(){
public boolean retarget(){
return timer.get(timerTarget, target == null ? 40 : 90);
}
protected Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){
public Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){
return findTarget(x, y, range, air, ground);
}
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
public Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
return target(x, y, range, air, ground);
}
protected void init(){
public void init(){
}
protected @Nullable Tile getClosestSpawner(){
public @Nullable Tile getClosestSpawner(){
return Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns());
}
protected void unloadPayloads(){
public void unloadPayloads(){
if(unit instanceof Payloadc pay && pay.hasPayload() && target instanceof Building && pay.payloads().peek() instanceof UnitPayload){
if(target.within(unit, Math.max(unit.type().range + 1f, 75f))){
pay.dropLastPayload();
@@ -192,11 +192,11 @@ public class AIController implements UnitController{
}
}
protected void circle(Position target, float circleLength){
public void circle(Position target, float circleLength){
circle(target, circleLength, unit.speed());
}
protected void circle(Position target, float circleLength, float speed){
public void circle(Position target, float circleLength, float speed){
if(target == null) return;
vec.set(target).sub(unit);
@@ -210,11 +210,11 @@ public class AIController implements UnitController{
unit.moveAt(vec);
}
protected void moveTo(Position target, float circleLength){
public void moveTo(Position target, float circleLength){
moveTo(target, circleLength, 100f);
}
protected void moveTo(Position target, float circleLength, float smooth){
public void moveTo(Position target, float circleLength, float smooth){
if(target == null) return;
vec.set(target).sub(unit);

View File

@@ -5,8 +5,6 @@ import arc.func.*;
import arc.util.*;
import mindustry.maps.*;
import static mindustry.Vars.*;
/** Defines preset rule sets. */
public enum Gamemode{
survival(rules -> {
@@ -25,7 +23,7 @@ public enum Gamemode{
rules.waveSpacing = 2f * Time.toMinutes;
rules.teams.get(rules.waveTeam).infiniteResources = true;
}, map -> map.teams.contains(state.rules.waveTeam.id)),
}, map -> map.teams.size > 1),
pvp(rules -> {
rules.pvp = true;
rules.enemyCoreBuildRadius = 600f;

View File

@@ -33,6 +33,7 @@ import mindustry.world.blocks.power.*;
import mindustry.world.blocks.production.*;
import mindustry.world.blocks.sandbox.*;
import mindustry.world.blocks.storage.*;
import mindustry.world.blocks.storage.CoreBlock.*;
import mindustry.world.meta.*;
import java.io.*;
@@ -450,6 +451,10 @@ public class Schematics implements Loadable{
if(st.block instanceof Drill){
tile.getLinkedTiles(t -> t.setOverlay(resource));
}
if(tile.build instanceof CoreBuild cb){
state.teams.registerCore(cb);
}
});
}

View File

@@ -48,11 +48,11 @@ public class Teams{
return Geometry.findClosest(x, y, get(team).cores);
}
public boolean eachEnemyCore(Team team, Boolf<CoreBuild> ret){
public boolean anyEnemyCoresWithin(Team team, float x, float y, float radius){
for(TeamData data : active){
if(team != data.team){
for(CoreBuild tile : data.cores){
if(ret.get(tile)){
if(tile.within(x, y, radius)){
return true;
}
}

View File

@@ -261,6 +261,10 @@ public class Waves{
}
public static Seq<SpawnGroup> generate(float difficulty, Rand rand, boolean attack){
return generate(difficulty, rand, attack, false);
}
public static Seq<SpawnGroup> generate(float difficulty, Rand rand, boolean attack, boolean airOnly){
UnitType[][] species = {
{dagger, mace, fortress, scepter, reign},
{nova, pulsar, quasar, vela, corvus},
@@ -268,6 +272,12 @@ public class Waves{
{flare, horizon, zenith, rand.chance(0.5) ? quad : antumbra, rand.chance(0.1) ? quad : eclipse}
};
if(airOnly){
species = Structs.filter(UnitType[].class, species, v -> v[0].flying);
}
UnitType[][] fspec = species;
//required progression:
//- extra periodic patterns
@@ -281,7 +291,7 @@ public class Waves{
Intc createProgression = start -> {
//main sequence
UnitType[] curSpecies = Structs.random(species);
UnitType[] curSpecies = Structs.random(fspec);
int curTier = 0;
for(int i = start; i < cap;){
@@ -326,7 +336,7 @@ public class Waves{
//small chance to switch species
if(rand.chance(0.3)){
curSpecies = Structs.random(species);
curSpecies = Structs.random(fspec);
}
}
};

View File

@@ -235,7 +235,7 @@ public class Shaders{
super(frag);
Core.assets.load("sprites/space.png", Texture.class).loaded = t -> {
texture = (Texture)t;
texture = t;
texture.setFilter(TextureFilter.linear);
texture.setWrap(TextureWrap.mirroredRepeat);
};
@@ -274,8 +274,8 @@ public class Shaders{
public void loadNoise(){
Core.assets.load("sprites/" + textureName() + ".png", Texture.class).loaded = t -> {
((Texture)t).setFilter(TextureFilter.linear);
((Texture)t).setWrap(TextureWrap.repeat);
t.setFilter(TextureFilter.linear);
t.setWrap(TextureWrap.repeat);
};
}

View File

@@ -136,8 +136,12 @@ public class PlanetRenderer implements Disposable{
public void renderPlanet(Planet planet){
if(!planet.visible()) return;
//render planet at offsetted position in the world
planet.draw(cam.combined, planet.getTransform(mat));
cam.update();
if(cam.frustum.containsSphere(planet.position, planet.clipRadius)){
//render planet at offsetted position in the world
planet.draw(cam.combined, planet.getTransform(mat));
}
for(Planet child : planet.children){
renderPlanet(child);
@@ -151,7 +155,7 @@ public class PlanetRenderer implements Disposable{
renderSectors(planet);
}
if(planet.parent != null && planet.hasAtmosphere && Core.settings.getBool("atmosphere")){
if(cam.frustum.containsSphere(planet.position, planet.clipRadius) && planet.parent != null && planet.hasAtmosphere && Core.settings.getBool("atmosphere")){
Gl.depthMask(false);
Blending.additive.apply();

View File

@@ -379,15 +379,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
throw new ValidateException(player, "Player cannot control a unit.");
}
//TODO problem:
//1. server send snapshot
//2. client requests to control unit, becomes unit locally
//3. snapshot arrives, client now thinks they're in the old unit (!!!)
//4. server gets packet that player is in the right unit
//5. server sends snapshot
//6. client gets snapshot, realizes that they are actually in the unit they selected
//7. client gets switched to new unit -> rubberbanding (!!!)
//clear player unit when they possess a core
if(unit == null){ //just clear the unit (is this used?)
player.clearUnit();
@@ -404,6 +395,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
if(!player.dead()){
Fx.unitSpirit.at(player.x, player.y, 0f, unit);
}
}else if(net.server()){
//reject forwarding the packet if the unit was dead, AI or team
throw new ValidateException(player, "Player attempted to control invalid unit.");
}
Events.fire(new UnitControlEvent(player, unit));
@@ -462,7 +456,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
player.unit().updateBuilding(isBuilding);
}
if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && player.unit().ammo <= 0){
if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && !player.team().rules().infiniteAmmo && player.unit().ammo <= 0){
player.unit().type.weapons.first().noAmmoSound.at(player.unit());
}

View File

@@ -86,7 +86,7 @@ public abstract class LStatement{
protected Cell<TextField> field(Table table, String value, Cons<String> setter){
return table.field(value, Styles.nodeField, s -> setter.get(sanitize(s)))
.size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength).addInputDialog();
.size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength);
}
protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){
@@ -175,7 +175,7 @@ public abstract class LStatement{
t.top().pane(inner -> {
inner.top();
hideCons.get(inner, hide);
}).pad(0f).top().get().setScrollingDisabled(true, false);
}).pad(0f).top().scrollX(false);
t.pack();
}

View File

@@ -381,7 +381,7 @@ public class Maps{
//try to load preview
if(map.previewFile().exists()){
//this may fail, but calls queueNewPreview
Core.assets.load(new AssetDescriptor<>(map.previewFile().path() + "." + mapExtension, Texture.class, new MapPreviewParameter(map))).loaded = t -> map.texture = (Texture)t;
Core.assets.load(new AssetDescriptor<>(map.previewFile().path() + "." + mapExtension, Texture.class, new MapPreviewParameter(map))).loaded = t -> map.texture = t;
try{
readCache(map);

View File

@@ -490,7 +490,8 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
state.rules.waves = sector.info.waves = true;
state.rules.enemyCoreBuildRadius = 600f;
state.rules.spawns = Waves.generate(difficulty, new Rand(), state.rules.attackMode);
//spawn air only when spawn is blocked
state.rules.spawns = Waves.generate(difficulty, new Rand(sector.id), state.rules.attackMode, state.rules.attackMode && spawner.countGroundSpawns() == 0);
}
@Override

View File

@@ -77,9 +77,10 @@ public class ContentParser{
}
});
put(StatusEffect.class, (type, data) -> {
Object result = fieldOpt(StatusEffects.class, data);
if(result != null){
return result;
if(data.isString()){
StatusEffect result = locate(ContentType.status, data.asString());
if(result != null) return result;
throw new IllegalArgumentException("Unknown status effect: '" + data.asString() + "'");
}
StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name"));
readFields(effect, data);
@@ -99,7 +100,7 @@ public class ContentParser{
put(AmmoType.class, (type, data) -> {
//string -> item
//if liquid ammo support is added, this should scan for liquids as well
if(data.isString()) return find(ContentType.item, data.asString());
if(data.isString()) return new ItemAmmoType(find(ContentType.item, data.asString()));
//number -> power
if(data.isNumber()) return new PowerAmmoType(data.asFloat());

View File

@@ -267,6 +267,7 @@ public class Mods implements Loadable{
TextureFilter filter = Core.settings.getBool("linear") ? TextureFilter.linear : TextureFilter.nearest;
Time.mark();
//generate new icons
for(Seq<Content> arr : content.getContentMap()){
arr.each(c -> {
@@ -277,6 +278,7 @@ public class Mods implements Loadable{
}
});
}
Log.debug("Time to generate icons: @", Time.elapsed());
//dispose old atlas data
Core.atlas = packer.flush(filter, new TextureAtlas());
@@ -287,7 +289,7 @@ public class Mods implements Loadable{
packer.dispose();
packer = null;
Log.debug("Time to update textures: @", Time.elapsed());
Log.debug("Total time to generate & flush textures synchronously: @", Time.elapsed());
}
private PageType getPage(AtlasRegion region){

View File

@@ -21,10 +21,10 @@ import java.net.*;
import java.util.regex.*;
public class Scripts implements Disposable{
private final Context context;
private final Scriptable scope;
private boolean errored;
public final Context context;
public final Scriptable scope;
private boolean errored;
LoadedMod currentMod = null;
public Scripts(){

View File

@@ -342,24 +342,9 @@ public class ArcNetProvider implements NetProvider{
//for debugging total read/write speeds
private static final boolean debug = false;
ThreadLocal<ByteBuffer> decompressBuffer = new ThreadLocal<>(){
@Override
protected ByteBuffer initialValue(){
return ByteBuffer.allocate(32768);
}
};
ThreadLocal<Reads> reads = new ThreadLocal<>(){
@Override
protected Reads initialValue(){
return new Reads(new ByteBufferInput(decompressBuffer.get()));
}
};
ThreadLocal<Writes> writes = new ThreadLocal<>(){
@Override
protected Writes initialValue(){
return new Writes(new ByteBufferOutput(decompressBuffer.get()));
}
};
ThreadLocal<ByteBuffer> decompressBuffer = Threads.local(() -> ByteBuffer.allocate(32768));
ThreadLocal<Reads> reads = Threads.local(() -> new Reads(new ByteBufferInput(decompressBuffer.get())));
ThreadLocal<Writes> writes = Threads.local(() -> new Writes(new ByteBufferOutput(decompressBuffer.get())));
//for debugging network write counts
static WindowedMean upload = new WindowedMean(5), download = new WindowedMean(5);

View File

@@ -274,6 +274,7 @@ public class Net{
builder.add(c.data);
ui.loadfrag.setProgress(builder.progress());
ui.loadfrag.snapProgress();
netClient.resetTimeout();
if(builder.isDone()){

View File

@@ -41,6 +41,8 @@ public class Planet extends UnlockableContent{
public boolean drawOrbit = true;
/** Atmosphere radius adjustment parameters. */
public float atmosphereRadIn = 0, atmosphereRadOut = 0.3f;
/** Frustrum sphere clip radius. */
public float clipRadius = -1f;
/** Orbital radius around the sun. Do not change unless you know exactly what you are doing.*/
public float orbitRadius;
/** Total radius of this planet and all its children. */
@@ -55,7 +57,7 @@ public class Planet extends UnlockableContent{
public float sectorApproxRadius;
/** Whether this planet is tidally locked relative to its parent - see https://en.wikipedia.org/wiki/Tidal_locking */
public boolean tidalLock = false;
/** Whether or not this planet is listed in the planet access UI. **/
/** Whether this planet is listed in the planet access UI. **/
public boolean accessible = true;
/** If true, a day/night cycle is simulated. */
public boolean updateLighting = true;
@@ -252,6 +254,7 @@ public class Planet extends UnlockableContent{
updateBaseCoverage();
}
clipRadius = Math.max(clipRadius, radius + atmosphereRadOut + 0.5f);
}
/** Gets a sector a tile position. */

View File

@@ -623,9 +623,9 @@ public class UnitType extends UnlockableContent{
Draw.reset();
a.draw(unit);
}
Draw.reset();
}
Draw.reset();
}
public <T extends Unit & Payloadc> void drawPayload(T unit){

View File

@@ -62,6 +62,10 @@ public class Bar extends Element{
update(() -> this.name = name.get());
}
public void snap(){
lastValue = value = fraction.get();
}
public Bar outline(Color color, float stroke){
outlineColor.set(color);
outlineRadius = Scl.scl(stroke);

View File

@@ -74,19 +74,19 @@ public class Fonts{
largeIcons.clear();
FreeTypeFontParameter param = fontParameter();
Core.assets.load("default", Font.class, new FreeTypeFontLoaderParameter(mainFont, param)).loaded = f -> Fonts.def = (Font)f;
Core.assets.load("default", Font.class, new FreeTypeFontLoaderParameter(mainFont, param)).loaded = f -> Fonts.def = f;
Core.assets.load("icon", Font.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{
size = 30;
incremental = true;
characters = "\0";
}})).loaded = f -> Fonts.icon = (Font)f;
}})).loaded = f -> Fonts.icon = f;
Core.assets.load("iconLarge", Font.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{
size = 48;
incremental = false;
characters = "\0" + Iconc.all;
borderWidth = 5f;
borderColor = Color.darkGray;
}})).loaded = f -> Fonts.iconLarge = (Font)f;
}})).loaded = f -> Fonts.iconLarge = f;
}
public static TextureRegion getLargeIcon(String name){

View File

@@ -50,7 +50,7 @@ public class ItemsDisplay extends Table{
label.actions(Actions.color(Color.white, 0.75f, Interp.fade));
}
}
}).get().setScrollingDisabled(true, false), false).setDuration(0.3f);
}).scrollX(false), false).setDuration(0.3f);
c.button("@globalitems", Icon.downOpen, Styles.clearTogglet, col::toggle).update(t -> {
t.setChecked(col.isCollapsed());

View File

@@ -1,59 +1,6 @@
package mindustry.ui;
import arc.func.*;
import arc.graphics.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.gen.*;
//TODO remove, unlikely to be used anywhere else.
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("");
}).get().setScrollingDisabled(true, false);
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){
return name != null && !name.isEmpty() && name.toLowerCase().contains(query);
}
}

View File

@@ -126,7 +126,7 @@ public class CustomRulesDialog extends BaseDialog{
void setup(){
cont.clear();
cont.pane(m -> main = m).get().setScrollingDisabled(true, false);
cont.pane(m -> main = m).scrollX(false);
main.margin(10f);
main.button("@settings.reset", () -> {
rules = resetter.get();
@@ -273,7 +273,7 @@ public class CustomRulesDialog extends BaseDialog{
t.add(text).left().padRight(5);
t.field((prov.get()) + "", s -> cons.get(Strings.parseInt(s)))
.padRight(100f)
.valid(f -> Strings.parseInt(f) >= min && Strings.parseInt(f) <= max).width(120f).left().addInputDialog();
.valid(f -> Strings.parseInt(f) >= min && Strings.parseInt(f) <= max).width(120f).left();
}).padTop(0).row();
}
@@ -285,7 +285,7 @@ public class CustomRulesDialog extends BaseDialog{
t.field((integer ? (int)prov.get() : prov.get()) + "", s -> cons.get(Strings.parseFloat(s)))
.padRight(100f)
.update(a -> a.setDisabled(!condition.get()))
.valid(f -> Strings.canParsePositiveFloat(f) && Strings.parseFloat(f) >= min && Strings.parseFloat(f) <= max).width(120f).left().addInputDialog();
.valid(f -> Strings.canParsePositiveFloat(f) && Strings.parseFloat(f) >= min && Strings.parseFloat(f) <= max).width(120f).left();
}).padTop(0);
main.row();
}
@@ -309,7 +309,7 @@ public class CustomRulesDialog extends BaseDialog{
Cell<TextField> field(Table table, float value, Floatc setter){
return table.field(Strings.autoFixed(value, 2), v -> setter.get(Strings.parseFloat(v)))
.valid(Strings::canParsePositiveFloat)
.size(90f, 40f).pad(2f).addInputDialog();
.size(90f, 40f).pad(2f);
}
void weatherDialog(){

View File

@@ -67,7 +67,7 @@ public class JoinDialog extends BaseDialog{
TextField field = add.cont.field(Core.settings.getString("ip"), text -> {
Core.settings.put("ip", text);
}).size(320f, 54f).maxTextLength(100).addInputDialog().get();
}).size(320f, 54f).maxTextLength(100).get();
add.cont.row();
add.buttons.defaults().size(140f, 60f).pad(4f);
@@ -287,7 +287,7 @@ public class JoinDialog extends BaseDialog{
t.field(Core.settings.getString("name"), text -> {
player.name(text);
Core.settings.put("name", text);
}).grow().pad(8).addInputDialog(maxNameLength);
}).grow().pad(8).maxTextLength(maxNameLength);
ImageButton button = t.button(Tex.whiteui, Styles.clearFulli, 40, () -> {
new PaletteDialog().show(color -> {

View File

@@ -131,7 +131,7 @@ public class LaunchLoadoutDialog extends BaseDialog{
}
}).growX().get().setScrollingDisabled(true, false);
}).growX().scrollX(false);
cont.row();
cont.pane(items);

View File

@@ -69,7 +69,7 @@ public class ModsDialog extends BaseDialog{
browser.cont.pane(tablebrow -> {
tablebrow.margin(10f).top();
browserTable = tablebrow;
}).get().setScrollingDisabled(true, false);
}).scrollX(false);
browser.addCloseButton();
browser.onResize(this::rebuildBrowser);
@@ -208,90 +208,113 @@ public class ModsDialog extends BaseDialog{
if(!mods.list().isEmpty()){
boolean[] anyDisabled = {false};
SearchBar.add(cont, mods.list(),
mod -> mod.meta.displayName(),
(table, mod) -> {
if(!mod.enabled() && !anyDisabled[0] && mods.list().size > 0){
anyDisabled[0] = true;
table.row();
table.image().growX().height(4f).pad(6f).color(Pal.gray);
table.row();
}
Table[] pane = {null};
table.button(t -> {
t.top().left();
t.margin(12f);
Cons<String> rebuild = query -> {
pane[0].clear();
boolean any = false;
for(LoadedMod item : mods.list()){
if(Strings.matches(query, item.meta.displayName())){
any = true;
if(!item.enabled() && !anyDisabled[0] && mods.list().size > 0){
anyDisabled[0] = true;
pane[0].row();
pane[0].image().growX().height(4f).pad(6f).color(Pal.gray).row();
}
t.defaults().left().top();
t.table(title -> {
title.left();
pane[0].button(t -> {
t.top().left();
t.margin(12f);
title.add(new BorderImage(){{
if(mod.iconTexture != null){
setDrawable(new TextureRegion(mod.iconTexture));
}else{
setDrawable(Tex.nomap);
}
border(Pal.accent);
}}).size(h - 8f).padTop(-8f).padLeft(-8f).padRight(8f);
t.defaults().left().top();
t.table(title1 -> {
title1.left();
title.table(text -> {
boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors();
title1.add(new BorderImage(){{
if(item.iconTexture != null){
setDrawable(new TextureRegion(item.iconTexture));
}else{
setDrawable(Tex.nomap);
}
border(Pal.accent);
}}).size(h - 8f).padTop(-8f).padLeft(-8f).padRight(8f);
text.add("[accent]" + Strings.stripColors(mod.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(mod.meta.version)) + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
title1.table(text -> {
boolean hideDisabled = !item.isSupported() || item.hasUnmetDependencies() || item.hasContentErrors();
text.add("[accent]" + Strings.stripColors(item.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(item.meta.version)) + (item.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
.wrap().top().width(300f).growX().left();
text.row();
if(mod.isOutdated()){
text.labelWrap("@mod.outdated").growX();
text.row();
}else if(!mod.isSupported()){
text.labelWrap(Core.bundle.format("mod.requiresversion", mod.meta.minGameVersion)).growX();
text.row();
}else if(mod.hasUnmetDependencies()){
text.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX();
t.row();
}else if(mod.hasContentErrors()){
text.labelWrap("@mod.erroredcontent").growX();
text.row();
}else if(mod.meta.hidden){
text.labelWrap("@mod.multiplayer.compatible").growX();
text.row();
}
}).top().growX();
title.add().growX();
}).growX().growY().left();
if(item.isOutdated()){
text.labelWrap("@mod.outdated").growX();
text.row();
}else if(!item.isSupported()){
text.labelWrap(Core.bundle.format("mod.requiresversion", item.meta.minGameVersion)).growX();
text.row();
}else if(item.hasUnmetDependencies()){
text.labelWrap(Core.bundle.format("mod.missingdependencies", item.missingDependencies.toString(", "))).growX();
t.row();
}else if(item.hasContentErrors()){
text.labelWrap("@mod.erroredcontent").growX();
text.row();
}else if(item.meta.hidden){
text.labelWrap("@mod.multiplayer.compatible").growX();
text.row();
}
}).top().growX();
t.table(right -> {
right.right();
right.button(mod.enabled() ? Icon.downOpen : Icon.upOpen, Styles.clearPartiali, () -> {
mods.setEnabled(mod, !mod.enabled());
setup();
}).size(50f).disabled(!mod.isSupported());
title1.add().growX();
}).growX().growY().left();
right.button(mod.hasSteamID() ? Icon.link : Icon.trash, Styles.clearPartiali, () -> {
if(!mod.hasSteamID()){
ui.showConfirm("@confirm", "@mod.remove.confirm", () -> {
mods.removeMod(mod);
setup();
});
}else{
platform.viewListing(mod);
}
}).size(50f);
t.table(right -> {
right.right();
right.button(item.enabled() ? Icon.downOpen : Icon.upOpen, Styles.clearPartiali, () -> {
mods.setEnabled(item, !item.enabled());
setup();
}).size(50f).disabled(!item.isSupported());
if(steam && !mod.hasSteamID()){
right.row();
right.button(Icon.export, Styles.clearPartiali, () -> {
platform.publish(mod);
right.button(item.hasSteamID() ? Icon.link : Icon.trash, Styles.clearPartiali, () -> {
if(!item.hasSteamID()){
ui.showConfirm("@confirm", "@mod.remove.confirm", () -> {
mods.removeMod(item);
setup();
});
}else{
platform.viewListing(item);
}
}).size(50f);
}
}).growX().right().padRight(-8f).padTop(-8f);
}, Styles.clearPartialt, () -> showMod(mod)).size(w, h).growX().pad(4f);
table.row();
}, !mobile || Core.graphics.isPortrait()).margin(10f).top();
if(steam && !item.hasSteamID()){
right.row();
right.button(Icon.export, Styles.clearPartiali, () -> {
platform.publish(item);
}).size(50f);
}
}).growX().right().padRight(-8f).padTop(-8f);
}, Styles.clearPartialt, () -> showMod(item)).size(w, h).growX().pad(4f);
pane[0].row();
}
}
if(!any){
pane[0].add("@none.found").color(Color.lightGray).pad(4);
}
};
if(!mobile || Core.graphics.isPortrait()){
cont.table(search -> {
search.image(Icon.zoom).padRight(8f);
search.field("", rebuild).growX();
}).fillX().padBottom(4);
}
cont.row();
cont.pane(table1 -> {
pane[0] = table1.margin(10f).top();
rebuild.get("");
}).scrollX(false);
}else{
cont.table(Styles.black6, t -> t.add("@mods.none")).height(80f);
}

View File

@@ -27,7 +27,6 @@ import mindustry.graphics.*;
import mindustry.graphics.g3d.*;
import mindustry.graphics.g3d.PlanetGrid.*;
import mindustry.input.*;
import mindustry.io.legacy.*;
import mindustry.maps.*;
import mindustry.type.*;
import mindustry.ui.*;
@@ -65,7 +64,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
public boolean showed = false, sectorsShown;
public String searchText = "";
public Table sectorTop = new Table(), notifs;
public Table sectorTop = new Table(), notifs = new Table();
public Label hoverLabel = new Label("");
public PlanetDialog(){
@@ -131,7 +130,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
@Override
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
if(event.targetActor == PlanetDialog.this){
zoom = Mathf.clamp(zoom + y / 10f, planets.planet.minZoom, 2f);
zoom = Mathf.clamp(zoom + amountY / 10f, planets.planet.minZoom, 2f);
}
return true;
}
@@ -166,16 +165,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
return this;
}
//load legacy research
if(Core.settings.has("unlocks") && !Core.settings.has("junction-unlocked")){
Core.app.post(() -> {
ui.showCustomConfirm("@research", "@research.legacy", "@research.load", "@research.discard", () -> {
LegacyIO.readResearch();
Core.settings.remove("unlocks");
}, () -> Core.settings.remove("unlocks"));
});
}
rebuildButtons();
mode = look;
selected = hovered = launchSector = null;
@@ -545,7 +534,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
}),
new Table(c -> {
if(!(graphics.isPortrait() && mobile) && planets.planet.sectors.contains(Sector::hasBase)){
c.visible(() -> !(graphics.isPortrait() && mobile));
if(planets.planet.sectors.contains(Sector::hasBase)){
int attacked = planets.planet.sectors.count(Sector::isAttacked);
//sector notifications & search
@@ -571,8 +561,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
})).grow();
}
//TODO
void rebuildList(){
if(notifs == null) return;
notifs.clear();
var all = planets.planet.sectors.select(Sector::hasBase);
@@ -586,7 +577,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
s.field(searchText, t -> {
searchText = t;
readd[0].run();
}).growX().height(50f).addInputDialog();
}).growX().height(50f);
}).growX().row();
Table con = p.table().growX().get();
@@ -632,7 +623,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
};
readd[0].run();
}).grow().get().setScrollingDisabled(true, false);
}).grow().scrollX(false);
}
@Override

View File

@@ -41,7 +41,7 @@ public class SchematicsDialog extends BaseDialog{
public SchematicsDialog(){
super("@schematics");
Core.assets.load("sprites/schematic-background.png", Texture.class).loaded = t -> ((Texture)t).setWrap(TextureWrap.repeat);
Core.assets.load("sprites/schematic-background.png", Texture.class).loaded = t -> t.setWrap(TextureWrap.repeat);
tags = Core.settings.getJson("schematic-tags", Seq.class, String.class, Seq::new);
@@ -69,7 +69,7 @@ public class SchematicsDialog extends BaseDialog{
searchField = s.field(search, res -> {
search = res;
rebuildPane.run();
}).growX().addInputDialog().get();
}).growX().get();
}).fillX().padBottom(4);
cont.row();
@@ -97,7 +97,7 @@ public class SchematicsDialog extends BaseDialog{
}
};
rebuildTags.run();
}).fillX().height(tagh).get().setScrollingDisabled(false, true);
}).fillX().height(tagh).scrollY(false);
in.button(Icon.pencilSmall, () -> {
showAllTags();
@@ -164,12 +164,12 @@ public class SchematicsDialog extends BaseDialog{
cont.table(tags -> buildTags(s, tags, false)).maxWidth(400f).fillX().left().row();
cont.margin(30).add("@name").padRight(6f);
TextField nameField = cont.field(s.name(), null).size(400f, 55f).addInputDialog().left().get();
TextField nameField = cont.field(s.name(), null).size(400f, 55f).left().get();
cont.row();
cont.margin(30).add("@editor.description").padRight(6f);
TextField descField = cont.area(s.description(), Styles.areaField, t -> {}).size(400f, 140f).left().addInputDialog().get();
TextField descField = cont.area(s.description(), Styles.areaField, t -> {}).size(400f, 140f).left().get();
Runnable accept = () -> {
s.tags.put("name", nameField.getText());
@@ -246,7 +246,7 @@ public class SchematicsDialog extends BaseDialog{
};
rebuildPane.run();
}).grow().get().setScrollingDisabled(true, false);
}).grow().scrollX(false);
}
public void showInfo(Schematic schematic){
@@ -573,7 +573,7 @@ public class SchematicsDialog extends BaseDialog{
});
}
}).fillX().left().height(tagh).get().setScrollingDisabled(false, true);
}).fillX().left().height(tagh).scrollY(false);
t.button(Icon.addSmall, () -> {
var dialog = new BaseDialog("@schematic.addtag");

View File

@@ -48,12 +48,12 @@ public class HintsFragment extends Fragment{
}else if(!current.show()){ //current became hidden
hide();
}
}else if(hints.size > 0 && !renderer.isCutscene()){
}else if(hints.size > 0){
//check one hint each frame to see if it should be shown.
Hint hint = hints.find(Hint::show);
if(hint != null && hint.complete()){
hints.remove(hint);
}else if(hint != null){
}else if(hint != null && !renderer.isCutscene() && state.isGame() && control.saves.getTotalPlaytime() > 8000){
display(hint);
}else{
//moused over a derelict structure
@@ -92,7 +92,7 @@ public class HintsFragment extends Fragment{
hints.sort(Hint::order);
Hint first = hints.find(Hint::show);
if(first != null){
if(first != null && !renderer.isCutscene() && state.isGame()){
hints.remove(first);
display(first);
}

View File

@@ -56,6 +56,10 @@ public class LoadingFragment extends Fragment{
bar.set(() -> ((int)(progress.get() * 100) + "%"), progress, Pal.accent);
}
public void snapProgress(){
bar.snap();
}
public void setProgress(float progress){
progValue = progress;
if(!bar.visible){

View File

@@ -52,7 +52,7 @@ public class PlayerListFragment extends Fragment{
search.setMessageText(Core.bundle.get("players.search"));
pane.row();
pane.pane(content).grow().get().setScrollingDisabled(true, false);
pane.pane(content).grow().scrollX(false);
pane.row();
pane.table(menu -> {

View File

@@ -37,8 +37,11 @@ import java.util.*;
import static mindustry.Vars.*;
public class Block extends UnlockableContent{
/** If true, buildings have an ItemModule. */
public boolean hasItems;
/** If true, buildings have a LiquidModule. */
public boolean hasLiquids;
/** If true, buildings have a PowerModule. */
public boolean hasPower;
public boolean outputsLiquid = false;
@@ -46,8 +49,6 @@ public class Block extends UnlockableContent{
public boolean outputsPower = false;
public boolean outputsPayload = false;
public boolean acceptsPayload = false;
public boolean outputFacing = true;
public boolean noSideBlend = false;
public boolean acceptsItems = false;
public int itemCapacity = 10;
@@ -57,6 +58,11 @@ public class Block extends UnlockableContent{
public final BlockBars bars = new BlockBars();
public final Consumers consumes = new Consumers();
/** If true, this block outputs to its facing direction, when applicable.
* Used for blending calculations. */
public boolean outputFacing = true;
/** if true, this block does not accept input from the sides (used for armored conveyors) */
public boolean noSideBlend = false;
/** whether to display flow rate */
public boolean displayFlow = true;
/** whether this block is visible in the editor */

View File

@@ -151,7 +151,7 @@ public class Build{
if(closest != null && closest.team != team){
return false;
}
}else if(state.teams.eachEnemyCore(team, core -> Mathf.dst(x * tilesize + type.offset, y * tilesize + type.offset, core.x, core.y) < state.rules.enemyCoreBuildRadius + type.size * tilesize / 2f)){
}else if(state.teams.anyEnemyCoresWithin(team, x * tilesize + type.offset, y * tilesize + type.offset, state.rules.enemyCoreBuildRadius + tilesize)){
return false;
}
}

View File

@@ -122,7 +122,7 @@ public class LaunchPad extends Block{
if(!state.isCampaign()) return;
//increment launchCounter then launch when full and base conditions are met
if((launchCounter += edelta()) >= launchTime && items.total() >= itemCapacity){
if((launchCounter += edelta()) >= launchTime && edelta() >= 0.001f && items.total() >= itemCapacity){
launchSound.at(x, y);
LaunchPayload entity = LaunchPayload.create();
items.each((item, amount) -> entity.stacks.add(new ItemStack(item, amount)));

View File

@@ -38,8 +38,8 @@ public class LaserTurret extends PowerTurret{
}
public class LaserTurretBuild extends PowerTurretBuild{
Bullet bullet;
float bulletLife;
public Bullet bullet;
public float bulletLife;
@Override
protected void updateCooling(){

View File

@@ -43,6 +43,12 @@ public class DuctBridge extends Block{
drawArrow = false;
}
@Override
public void init(){
clipSize = Math.max(clipSize, (range + 0.5f) * 2 * tilesize);
super.init();
}
@Override
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
Draw.rect(region, req.drawx(), req.drawy());

View File

@@ -113,7 +113,7 @@ public class PayloadConveyor extends Block{
int ntrns = 1 + size/2;
Tile next = tile.nearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns);
blocked = (next != null && next.solid() && !next.block().outputsPayload) || (this.next != null && (this.next.rotation + 2)%4 == rotation);
blocked = (next != null && next.solid() && !(next.block().outputsPayload || next.block().acceptsPayload)) || (this.next != null && this.next.block.rotate && (this.next.rotation + 2) % 4 == rotation);
}
@Override

View File

@@ -23,11 +23,9 @@ import mindustry.world.modules.*;
import static mindustry.Vars.*;
public class PowerNode extends PowerBlock{
protected static boolean returnValue = false;
protected static BuildPlan otherReq;
protected final static ObjectSet<PowerGraph> graphs = new ObjectSet<>();
protected static int returnInt = 0;
protected final static ObjectSet<PowerGraph> graphs = new ObjectSet<>();
public @Load("laser") TextureRegion laser;
public @Load("laser-end") TextureRegion laserEnd;
@@ -134,6 +132,13 @@ public class PowerNode extends PowerBlock{
stats.add(Stat.powerConnections, maxNodes, StatUnit.none);
}
@Override
public void init(){
super.init();
clipSize = Math.max(clipSize, laserRange * tilesize);
}
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
Tile tile = world.tile(x, y);

View File

@@ -50,7 +50,7 @@ public class SolidPump extends Pump{
bars.add("efficiency", (SolidPumpBuild entity) -> new Bar(() -> Core.bundle.formatFloat("bar.pumpspeed",
entity.lastPump / Time.delta * 60, 1),
() -> Pal.ammo,
() -> entity.warmup));
() -> entity.warmup * entity.efficiency()));
}
@Override
@@ -116,7 +116,7 @@ public class SolidPump extends Pump{
lastPump = 0f;
}
pumpTime += warmup * delta();
pumpTime += warmup * edelta();
dumpLiquid(result);
}

View File

@@ -143,10 +143,15 @@ public class UnitFactory extends UnitBlock{
@Override
public Object senseObject(LAccess sensor){
if(sensor == LAccess.config) return currentPlan == -1 ? null : plans.get(currentPlan).unit;
if(sensor == LAccess.progress) return Mathf.clamp(fraction());
return super.senseObject(sensor);
}
@Override
public double sense(LAccess sensor){
if(sensor == LAccess.progress) return Mathf.clamp(fraction());
return super.sense(sensor);
}
@Override
public void buildConfiguration(Table table){
Seq<UnitType> units = Seq.with(plans).map(u -> u.unit).filter(u -> u.unlockedNow() && !u.isBanned());

View File

@@ -45,6 +45,6 @@ public class DrawAnimation extends DrawBlock{
@Override
public TextureRegion[] icons(Block block){
return new TextureRegion[]{block.region, top};
return top.found() ? new TextureRegion[]{block.region, top} : new TextureRegion[]{block.region};
}
}