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

 Conflicts:
	core/src/mindustry/content/Blocks.java
This commit is contained in:
Anuken
2021-06-05 11:57:14 -04:00
94 changed files with 1030 additions and 714 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 B

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 B

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 B

After

Width:  |  Height:  |  Size: 227 B

View File

@@ -484,6 +484,7 @@ filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves
filter.option.falloff = Falloff
filter.option.angle = Angle
filter.option.rotate = Rotate
filter.option.amount = Amount
filter.option.block = Block
filter.option.floor = Floor
@@ -1080,6 +1081,11 @@ unit.minke.name = Minke
unit.bryde.name = Bryde
unit.sei.name = Sei
unit.omura.name = Omura
unit.retusa.name = Retusa
unit.oxynoe.name = Oxynoe
unit.cyerce.name = Cyerce
unit.aegires.name = Aegires
unit.navanax.name = Navanax
unit.alpha.name = Alpha
unit.beta.name = Beta
unit.gamma.name = Gamma
@@ -1291,6 +1297,12 @@ block.exponential-reconstructor.name = Exponential Reconstructor
block.tetrative-reconstructor.name = Tetrative Reconstructor
block.payload-conveyor.name = Payload Conveyor
block.payload-router.name = Payload Router
block.duct.name = Duct
block.duct-router.name = Duct Router
block.duct-bridge.name = Duct Bridge
block.payload-propulsion-tower.name = Payload Propulsion Tower
block.payload-void.name = Payload Void
block.payload-source.name = Payload Source
block.disassembler.name = Disassembler
block.silicon-crucible.name = Silicon Crucible
block.overdrive-dome.name = Overdrive Dome
@@ -1627,9 +1639,15 @@ lenum.min = Minimum of two numbers.
lenum.max = Maximum of two numbers.
lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector.
lenum.sin = Sine, in degrees.
lenum.cos = Cosine, in degrees.
lenum.tan = Tangent, in degrees.
lenum.asin = Arc sine, in degrees.
lenum.acos = Arc cosine, in degrees.
lenum.atan = Arc tangent, in degrees.
#not a typo, look up 'range notation'
lenum.rand = Random decimal in range [0, value).
lenum.log = Natural logarithm (ln).

View File

@@ -626,6 +626,7 @@ status.wet.name = Basah
status.muddy.name = Berlumpur
status.melting.name = Meleleh
status.sapped.name = Melemahkan
status.electrified.name = Dialiri listrik
status.spore-slowed.name = Spora Melambat
status.tarred.name = Berminyak
status.overclock.name = Melebihi Batas
@@ -1060,6 +1061,11 @@ unit.minke.name = Minke
unit.bryde.name = Bryde
unit.sei.name = Sei
unit.omura.name = Omura
unit.retusa.name = Retusa
unit.oxynoe.name = Oxynoe
unit.cyerce.name = Cyerce
unit.aegires.name = Aegires
unit.navanax.name = Navanax
unit.alpha.name = Alpha
unit.beta.name = Beta
unit.gamma.name = Gamma
@@ -1120,6 +1126,7 @@ block.sand-water.name = Air Pasir
block.darksand-water.name = Air Pasir Hitam
block.char.name = Bara
block.dacite.name = Dasit
block.rhyolite.name = Riolit
block.dacite-wall.name = Dinding Dasit
block.dacite-boulder.name = Batu Besar Dasit
block.ice-snow.name = Salju Es
@@ -1227,6 +1234,7 @@ block.solar-panel.name = Panel Surya
block.solar-panel-large.name = Panel Surya Besar
block.oil-extractor.name = Pengekstrak Minyak
block.repair-point.name = Tempat Perbaikan
block.repair-turret.name = Menara Pembaikan
block.pulse-conduit.name = Selang Denyut
block.plated-conduit.name = Pipa Terlapis
block.phase-conduit.name = Selang Phase
@@ -1269,6 +1277,12 @@ block.exponential-reconstructor.name = Rekonstruktor Eksponensial
block.tetrative-reconstructor.name = Rekonstruktor Tetratif
block.payload-conveyor.name = Pengantar Massa
block.payload-router.name = Pengarah Massa
block.duct.name = Saluran
block.duct-router.name = Pengarah Saluran
block.duct-bridge.name = Jembatan Saluran
block.payload-propulsion-tower.name = Menara Penggerak Muatan
block.payload-void.name = Penghilang Muatan
block.payload-source.name = Sumber Muatan
block.disassembler.name = Pembongkar
block.silicon-crucible.name = Pelebur Raksasa
block.overdrive-dome.name = Kubah Projektor Pemercepat

View File

@@ -23,8 +23,8 @@ gameover.pvp = [accent] {0}[] チームの勝利!
gameover.waiting = [accent]次のマップを待っています...
highscore = [accent]ハイスコアを更新!
copied = コピーしました。
indev.notready = This part of the game isn't ready yet
indev.campaign = [accent]Congratulations! You've reached the end of the campaign![]\n\nThis is as far as the content goes right now. Interplanetary travel will be added in future updates.
indev.notready = ゲームのこの要素はまだ準備中です
indev.campaign = [accent]おめでとう! キャンペーンを達成しました![]\n\n現時点での内容はここまでです。 惑星間旅行は、今後のアップデートで追加される予定です。
load.sound = サウンド
load.map = マップ
@@ -306,16 +306,16 @@ cancelbuilding = [accent][[{0}][] 選択を解除する
selectschematic = [accent][[{0}][] 選択し、コピーする
pausebuilding = [accent][[{0}][] 建築を一時的に中断する
resumebuilding = [scarlet][[{0}][] 建築を再開する
showui = UI hidden.\nPress [accent][[{0}][] to show UI.
showui = UI 非表示.\nUIを表示するには[accent][[{0}][] を押下
wave = [accent]ウェーブ {0}
wave.cap = [accent]Wave {0}/{1}
wave.cap = [accent]ウェーブ {0}/{1}
wave.waiting = [lightgray]次のウェーブまで {0} 秒
wave.waveInProgress = [lightgray]ウェーブ進行中
waiting = [lightgray]待機中...
waiting.players = プレイヤーを待っています...
wave.enemies = [lightgray]敵は残り {0} 体
wave.enemycores = [accent]{0}[lightgray] Enemy Cores
wave.enemycore = [accent]{0}[lightgray] Enemy Core
wave.enemycores = [accent]{0}[lightgray] 敵性コア
wave.enemycore = [accent]{0}[lightgray] 敵性コア
wave.enemy = [lightgray]敵は残り {0} 体
wave.guardianwarn = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。
wave.guardianwarn.one = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。
@@ -551,10 +551,10 @@ sectors.stored = 保存済み:
sectors.resume = 再開
sectors.launch = 打ち上げ
sectors.select = 選択
sectors.nonelaunch = [lightgray]none (sun)
sectors.nonelaunch = [lightgray]無し (sun)
sectors.rename = セクター名を変更
sectors.enemybase = [scarlet]敵基地
sectors.vulnerable = [scarlet]Vulnerable
sectors.vulnerable = [scarlet]脆弱
sectors.underattack = [scarlet]攻撃を受けます! [accent]{0}% 破損
sectors.survives = [accent]{0} ウェーブ生存
sectors.go = Go
@@ -589,27 +589,27 @@ sector.overgrowth.name = オーバーグロウス
sector.tarFields.name = ター · フィールズ
sector.saltFlats.name = ソルト · フラッツ
sector.fungalPass.name = ファングル · パス
sector.biomassFacility.name = Biomass Synthesis Facility
sector.windsweptIslands.name = Windswept Islands
sector.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal
sector.biomassFacility.name = バイオマス シンテシス ファシリティ
sector.windsweptIslands.name = ウインドスイープト アイランズ
sector.extractionOutpost.name = エクストラクション アウトポスト
sector.planetaryTerminal.name = プラネタリー ローンチ ターミナル
sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing.
sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills.
sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology.
sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units.
sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost.
sector.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible.
sector.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks.
sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers.
sector.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
sector.biomassFacility.description = The origin of spores. This is the facility in which they were researched and initially produced.\nResearch the technology contained within. Cultivate spores for the production of fuel and plastics.\n\n[lightgray]Upon this facility's demise, the spores were released. Nothing in the local ecosystem could compete with such an invasive organism.
sector.windsweptIslands.description = Further past the shoreline is this remote chain of islands. Records show they once had [accent]Plastanium[]-producing structures.\n\nFend off the enemy's naval units. Establish a base on the islands. Research these factories.
sector.extractionOutpost.description = A remote outpost, constructed by the enemy for the purpose of launching resources to other sectors.\n\nCross-sector transport technology is essential for further conquest. Destroy the base. Research their Launch Pads.
sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology.
sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure.
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.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海軍ユニットを生産し、できるだけ速やかに敵を排除しましょう。発射建造物を研究しましょう。
settings.language = 言語
settings.data = ゲームデータ
@@ -679,7 +679,7 @@ stat.boosteffect = ブースト効果
stat.maxunits = 最大ユニット数
stat.health = 耐久値
stat.buildtime = 建設時間
stat.maxconsecutive = Max Consecutive
stat.maxconsecutive = 最大連鎖
stat.buildcost = 建設費用
stat.inaccuracy = 誤差
stat.shots = ショット
@@ -715,8 +715,8 @@ ability.shieldregenfield = シールドリペアフィールド
ability.movelightning = ムーブメントライトニング
bar.drilltierreq = より高性能なドリルを使用してください
bar.noresources = Missing Resources
bar.corereq = Core Base Required
bar.noresources = 不足している資源
bar.corereq = コアベースが必要
bar.drillspeed = 採掘速度: {0}/秒
bar.pumpspeed = ポンプの速度: {0}/s
bar.efficiency = 効率: {0}%
@@ -740,7 +740,7 @@ units.processorcontrol = [lightgray]プロセッサーの制御下
bullet.damage = [stat]{0}[lightgray] ダメージ
bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ 約[stat] {1}[lightgray] タイル
bullet.incendiary = [stat]焼夷弾
bullet.sapping = [stat]sapping
bullet.sapping = [stat]吸収弾
bullet.homing = [stat]追尾弾
bullet.shock = [stat]電撃
bullet.frag = [stat]爆発弾
@@ -817,7 +817,7 @@ setting.conveyorpathfinding.name = コンベアー配置経路探索
setting.sensitivity.name = 操作感度
setting.saveinterval.name = 自動保存間隔
setting.seconds = {0} 秒
setting.milliseconds = {0} milliseconds
setting.milliseconds = {0} ミリ秒
setting.fullscreen.name = フルスクリーン
setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります)
setting.fps.name = FPSを表示
@@ -843,7 +843,7 @@ setting.bridgeopacity.name = ブリッジの透明度
setting.playerchat.name = ゲーム内にチャットを表示
setting.showweather.name = 天気のグラフィックを表示
public.confirm = ゲームを公開しますか?\n[accent]誰でもゲームに参加できるようになります。\n[lightgray]あとから設定で変更できます。
public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]?
public.confirm.really = フレンドと遊びたい場合は、[scarlet]公開サーバー[] ではなく [green]フレンド招待[] を使おう!\nゲームを [scarlet]公開[]してもよろしいですか?
public.beta = ベータ版では使用できません。
uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります...
uiscale.cancel = キャンセル & 終了
@@ -918,7 +918,7 @@ keybind.toggle_menus.name = メニュー切り替え
keybind.chat_history_prev.name = 前のチャット履歴
keybind.chat_history_next.name = 次のチャット履歴
keybind.chat_scroll.name = チャットスクロール
keybind.chat_mode.name = Change Chat Mode
keybind.chat_mode.name = チャットモードの変更
keybind.drop_unit.name = ドロップユニット
keybind.zoom_minimap.name = ミニマップのズーム
mode.help.title = モード説明
@@ -926,7 +926,7 @@ mode.survival.name = サバイバル
mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵が出現する必要があります。
mode.sandbox.name = サンドボックス
mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。
mode.editor.name = Editor
mode.editor.name = エディター
mode.pvp.name = PvP
mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。
mode.attack.name = アタック
@@ -1226,10 +1226,10 @@ block.command-center.name = 司令塔
block.ground-factory.name = 陸軍工場
block.air-factory.name = 空軍工場
block.naval-factory.name = 海軍工場
block.additive-reconstructor.name = Additive Reconstructor
block.multiplicative-reconstructor.name = Multiplicative Reconstructor
block.exponential-reconstructor.name = Exponential Reconstructor
block.tetrative-reconstructor.name = Tetrative Reconstructor
block.additive-reconstructor.name = 加法式再構成工場
block.multiplicative-reconstructor.name = 乗法式再構成工場
block.exponential-reconstructor.name = 指数式再構成工場
block.tetrative-reconstructor.name = 超冪式再構成工場
block.payload-conveyor.name = マスコンベアー
block.payload-router.name = ペイロードルーター
block.disassembler.name = ディスアセンブラー
@@ -1259,64 +1259,64 @@ team.green.name = グリーン
team.purple.name = パープル
hint.skip = スキップ
hint.desktopMove = Use [accent][[WASD][] to move.
hint.zoom = [accent]Scroll[] to zoom in or out.
hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
hint.desktopShoot = [accent][[Left-click][] to shoot.
hint.depositItems = To transfer items, drag from your ship to the core.
hint.respawn = To respawn as a ship, press [accent][[V][].
hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it.
hint.placeDrill.mobile = Select the \ue85e[accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm.
hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate.
hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors.
hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them.
hint.breaking = [accent]Right-click[] and drag to break blocks.
hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection.
hint.research = Use the \ue875 [accent]Research[] button to research new technology.
hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets.
hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right.
hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[].
hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type.
hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path.
hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path.
hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters.
hint.command = Press [accent][[G][] to command nearby units of [accent]similar type[] into formation.\n\nTo command ground units, you must first control another ground unit.
hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation.
hint.payloadPickup = Press [accent][[[] to pick up small blocks or units.
hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up.
hint.payloadDrop = Press [accent]][] to drop a payload.
hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there.
hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires.
hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[].
hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down.
hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the  [accent]Shard[] core. Make sure it is free from nearby obstructions.
hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[].
hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[].
hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over.
hint.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ホストが行った新しい研究も引き継がれます。
item.copper.description = 便利な鉱石です。様々なブロックの材料として幅広く使われています。
item.copper.details = セルプロに豊富な金属。補強しない限り構造的に弱い。
item.lead.description = 一般的で手軽な鉱石です。機械や液体輸送ブロックなどに使われます。
item.lead.details = Dense. Inert. Extensively used in batteries.\nNote: Likely toxic to biological life forms. Not that there are many left here.
item.lead.details = 高密度。不活性。バッテリーによく利用される。\nート: 生物学的に生命に有毒である可能性があります。このあたりには生命が多く残っていません。
item.metaglass.description = とても頑丈な強化ガラスです。液体の輸送やタンクとして幅広く使われています。
item.graphite.description = 弾薬や絶縁体として利用されています。
item.sand.description = 合金や融剤など広く使用されている一般的な材料です。
item.coal.description = 一般的で有用な燃料です。
item.coal.details = Appears to be fossilized plant matter, formed long before the seeding event.
item.coal.details = 化石化して植物のようで、利用方法が確立されるはるか前に形成されました。
item.titanium.description = 希少で非常に軽量な金属です。液体輸送やドリル、航空機などで使われます。
item.thorium.description = 放射性を持つ高密度な金属です。建造物の支えや核燃料として使われます。
item.scrap.description = 昔の建造物やユニットの残骸です。様々な種類の金属が微量に含まれています。
item.scrap.details = Leftover remnants of old structures and units.
item.scrap.details = 古い建造物やユニットの残骸です。
item.silicon.description = 非常に有用な半導体でソーラーパネルや多くの複雑な機械に応用できます。
item.plastanium.description = 軽量で伸縮性のある材料です。高度な航空機や分散型の弾薬として使用されます。
item.phase-fabric.description = 極めて軽量な素材です。高度な機械や自己修復技術に使用されます。
item.surge-alloy.description = 電気的特性を持った高度な合金です。
item.spore-pod.description = 石油や爆薬、燃料への転換として使用されます。
item.spore-pod.details = Spores. Likely a synthetic life form. Emit gases toxic to other biological life. Extremely invasive. Highly flammable in certain conditions.
item.spore-pod.details = 合成生命体と思われる胞子です。他の生物に有毒なガスを放出し、非常に侵略的です。特定の条件下で非常に高い可燃性を持ちます。
item.blast-compound.description = 爆弾や爆発物に使われる不安定な化合物です。胞子と揮発性物質から合成されます。燃料として燃やすこともできますが、お勧めしません。
item.pyratite.description = 焼夷兵器などに使われる非常に燃えやすい物質です。
@@ -1379,7 +1379,7 @@ block.phase-conveyor.description = 改良されたアイテム転送ブロック
block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。
block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出されます。他のアイテムが搬入されるとアイテムを通過させます。通常のルーターと反対の動作をします。
block.router.description = 搬入したアイテムをほかの3方向に均等に搬出します。一つの資源から複数に分ける際などに使われます。
block.router.details = A necessary evil. Using next to production inputs is not advised, as they will get clogged by output.
block.router.details = 最悪の設置は、搬入のために生産施設に隣接させることです。搬出によって詰まる可能性があるためおすすめできません。
block.distributor.description = 高度なルーターです。搬入したアイテムをほかの7方向に均等に分けて搬出します。
block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合に左右にアイテムを搬出します。
block.underflow-gate.description = オーバーフローゲートの反対の機能を持ちます。 左右に出力できない場合、前面に出力します。
@@ -1416,14 +1416,14 @@ block.laser-drill.description = 電力を使用したレーザー技術でより
block.blast-drill.description = 上位のドリルです。大量の電力が必要になります。
block.water-extractor.description = 地面から水を汲み上げます。近くに湖がない場合に有用です。
block.cultivator.description = 胞子の小さな集まりを工業用ポッドに培養します。
block.cultivator.details = Recovered technology. Used to produce massive amounts of biomass as efficiently as possible. Likely the initial incubator of the spores now covering Serpulo.
block.cultivator.details = 取り戻されたテクノロジー。大量のバイオマスを可能な限り効率的に生産します。おそらく最初の培養機により、今セルプロは胞子に覆われています、
block.oil-extractor.description = 大量の電力を使用して、砂から石油を回収します。近くに油田がない場合に有用です。
block.core-shard.description = 基本的なコアです。一度破壊されると、その地域との接続が途絶えます。破壊されないようにしましょう。
block.core-shard.details = The first iteration. Compact. Self-replicating. Equipped with single-use launch thrusters. Not designed for interplanetary travel.
block.core-shard.details = 最初のバージョンです。コンパクトで自己複製可能、使い捨ての発射スラスターを装備しています。惑星間旅行用には設計されていません。
block.core-foundation.description = バージョンアップしたコアです。より堅く、より多くの資源を格納できます。
block.core-foundation.details = The second iteration.
block.core-foundation.details = 2番目のバージョンです。
block.core-nucleus.description = さらにバージョンアップしたコアです。優れた耐久性と大量の資源を格納できます。
block.core-nucleus.details = The third and final iteration.
block.core-nucleus.details = 3番目で最終バージョンです。
block.vault.description = 各種類のアイテムを大量に保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。[lightgray]搬出機[]を使って、ボールトからアイテムを搬出できます。
block.container.description = 各種類のアイテムを少量ずつ保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。 [lightgray]搬出機[]を使って、コンテナーからアイテムを搬出できます。
block.unloader.description = コンテナやボールト、コアからアイテムをコンベアーか隣接するブロックに搬出します。搬出機をタップして搬出するアイテムを変更することができます。
@@ -1470,36 +1470,36 @@ block.logic-display.description = プロセッサからの任意のグラフィ
block.large-logic-display.description = プロセッサからの任意のグラフィックを表示します。
block.interplanetary-accelerator.description = 巨大な電磁レールガンタワーです。別惑星への展開のためにコアを重力圏脱出可能速度まで加速します。
unit.dagger.description = Fires standard bullets at all nearby enemies.
unit.mace.description = Fires streams of flame at all nearby enemies.
unit.fortress.description = Fires long-range artillery at ground targets.
unit.scepter.description = Fires a barrage of charged bullets at all nearby enemies.
unit.reign.description = Fires a barrage of massive piercing bullets at all nearby enemies.
unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight.
unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight.
unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded.
unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight.
unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain.
unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion.
unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain.
unit.spiroct.description = Fires sapping laser beams at enemies, repairing itself in the process. Can step over most terrain.
unit.arkyid.description = Fires large sapping laser beams at enemies, repairing itself in the process. Can step over most terrain.
unit.toxopid.description = Fires large electric cluster-shells and piercing lasers at enemies. Can step over most terrain.
unit.flare.description = Fires standard bullets at nearby ground targets.
unit.horizon.description = Drops clusters of bombs on ground targets.
unit.zenith.description = Fires salvos of missiles at all nearby enemies.
unit.antumbra.description = Fires a barrage of bullets at all nearby enemies.
unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies.
unit.mono.description = Automatically mines copper and lead, depositing it into the core.
unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction.
unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units.
unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units.
unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units.
unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies.
unit.minke.description = Fires shells and standard bullets at nearby ground targets.
unit.bryde.description = Fires long-range artillery shells and missiles at enemies.
unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies.
unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units.
unit.alpha.description = Defends the Shard core from enemies. Builds structures.
unit.beta.description = Defends the Foundation core from enemies. Builds structures.
unit.gamma.description = Defends the Nucleus core from enemies. Builds structures.
unit.dagger.description = 近くの敵に標準的な弾丸を発射します。
unit.mace.description = 近くの敵に火炎放射を発射します。
unit.fortress.description = 地上目標に長距離砲を発射します。
unit.scepter.description = 近くの敵に電撃弾を発射します。
unit.reign.description = 近くの敵に大口径の貫通弾を発射します。
unit.nova.description = 敵にダメージを与え、味方の建造物を修復する光線を発射します。飛行可能。
unit.pulsar.description = 敵にダメージを与え、味方の建造物を修復する電撃攻撃を行います。飛行可能。
unit.quasar.description = 敵にダメージを与え、味方の建造物を修復するレーザー弾を発射します。飛行可能。シールド形成。
unit.vela.description = 敵にダメージを与え、火災を引き起こし、味方の建造物を修復するレーザー焼夷弾を発射します。飛行可能。
unit.corvus.description = 敵にダメージを与え、味方の建造物を修復する大火力のレーザー弾を発射します。ほとんどの地形を無視できます。
unit.crawler.description = 敵に向かって走り自爆し、大爆発を起こす。
unit.atrax.description = 地上目標を消耗させるスラグ弾を発射します。ほとんどの地形を無視できます。
unit.spiroct.description = 敵に吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。
unit.arkyid.description = 敵に大口径の吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。
unit.toxopid.description = 敵に大口径の電撃クラスターシェルと貫通レーザーを発射します。ほとんどの地形を無視できます。
unit.flare.description = 近くの地上目標に標準的な弾丸を発射します。
unit.horizon.description = 地上目標にクラスター爆弾を投下します。
unit.zenith.description = 近くの敵にミサイルを一斉発射します。
unit.antumbra.description = 近くの敵に弾幕のように弾丸を連射します。
unit.eclipse.description = 近くの敵に2門の貫通レーザーと高射砲の弾幕を発射します。
unit.mono.description = 銅と鉛を自動的に採掘し、コアに移送します。
unit.poly.description = 破壊された建造物を自動的に再構築し、さらに建設の支援を行います。
unit.mega.description = 損傷した建造物を自動的に修復します。小型のブロックと地上ユニットを運搬できます。
unit.quad.description = 地上目標に大型爆弾を投下し、味方の建造物は修復し、敵にはダメージを与えます。中型の地上ユニットを運搬できます。
unit.oct.description = シールド形成と修復を行い、付近の味方を守ります。ほとんどの地上ユニットを運搬できます。
unit.risso.description = 近くの敵にミサイルと弾丸の弾幕を発射します。
unit.minke.description = 近くの地上目標に砲弾と標準的な弾丸を発射します。
unit.bryde.description = 敵に長距離砲弾とミサイルを発射します。
unit.sei.description = 敵にミサイルと徹甲弾の弾幕を発射します。
unit.omura.description = 敵に長距離かつ貫通性能を持つレールガンボルトを発射します。フレアユニットを生産します。
unit.alpha.description = シャードコアを敵から守ります。建造物を建築します。
unit.beta.description = ファンデーションコアを敵から守ります。建造物を建築します。
unit.gamma.description = ニュークリアスコアを敵から守ります。建造物を建築します。

View File

@@ -9,7 +9,7 @@ link.changelog.description = 업데이트 내용 목록
link.dev-builds.description = 불안정한 개발 버전
link.trello.description = 출시 예정 기능 계획을 게시한 공식 Trello 보드
link.itch.io.description = PC 다운로드가 있는 itch.io 페이지
link.google-play.description = oogle Play 스토어 목록
link.google-play.description = Google Play 스토어 목록
link.f-droid.description = F-Droid 카탈로그 목록
link.wiki.description = 공식 Mindustry 위키
link.suggestions.description = 새 기능 제안하기
@@ -67,6 +67,14 @@ schematic.delete.confirm = 이 설계도는 완전히 삭제될 것입니다.
schematic.rename = 설계도 이름 바꾸기
schematic.info = {0}x{1}, {2} 블록
schematic.disabled = [scarlet]설계도 비활성화됨[]\n이 [accent]맵[] 또는 [accent]서버[] 에서는 설계도를 사용할 수 없습니다.
schematic.tags = 태그:
schematic.edittags = 태그 수정하기
schematic.addtag = 태그 추가하기
schematic.texttag = 텍스트 태그
schematic.icontag = 아이콘 태그
schematic.renametag = 태그 이름바꾸기
schematic.tagdelconfirm = 이 태그를 완전히 삭제하시겠습니까?
schematic.tagexists = 이 태그는 이미 존재합니다.
stats = 전투 결과
stat.wave = 패배한 단계:[accent] {0}
@@ -153,11 +161,11 @@ mod.folder.missing = 창작마당에는 폴더 형태의 모드만 게시할 수
mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하지 않습니다. 게임을 플레이하려면 이 모드를 비활성화해야 합니다.
about.button = 정보
name = 닉네임 :
name = 닉네임 :
noname = 먼저 [accent]플레이어 이름[]을 설정하세요.
planetmap = 행성 지도
launchcore = 코어 출격
filename = 파일 이름:
filename = 파일 이름:
unlocked = 새로운 콘텐츠가 해금되었습니다!
available = 새로운 콘텐츠 해금이 가능합니다!
completed = [accent]완료됨
@@ -306,7 +314,6 @@ data.exported = 데이터를 내보냈습니다.
data.invalid = 유효한 게임 데이터가 아닙니다.
data.import.confirm = 외부 데이터를 가져오면 현재 게임 데이터를 [scarlet]모두[] 덮어쓰게 됩니다.\n[accent]이 작업은 취소할 수 없습니다![]\n\n데이터를 가져오면 게임이 즉시 종료됩니다.
quit.confirm = 정말로 종료하시겠습니까?
quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은[accent]설정->게임->튜토리얼[]에서 다시 하실 수 있습니다.
loading = [accent]불러오는중...
reloading = [accent]모드 새로고침하는중...
saving = [accent]저장중...
@@ -448,7 +455,7 @@ toolmode.square.description = 정사각형 형태의 브러시로 교체합니
toolmode.eraseores = 자원 초기화
toolmode.eraseores.description = 자원만 초기화합니다.
toolmode.fillteams = 팀 채우기
toolmode.fillteams.description = 블록 대신 선택한 팀으로 블록 팀을 채웁니다.
toolmode.fillteams.description = 블록 대신 선택한 팀으로 블록 팀을 채웁니다.
toolmode.drawteams = 팀 그리기
toolmode.drawteams.description = 블록 대신 선택한 팀으로 블록 팀을 그립니다.
@@ -477,6 +484,7 @@ filter.option.circle-scale = 원 크기
filter.option.octaves = 옥타브
filter.option.falloff = 경사
filter.option.angle = 각도
filter.option.rotate = 방향
filter.option.amount = 개수
filter.option.block = 블록
filter.option.floor = 타일
@@ -498,6 +506,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 = 언어 설정을 적용하려면 게임을 다시 시작하세요.
@@ -530,7 +539,7 @@ launch.from = 출격 출발지 : [accent]{0}
launch.destination = 목적지: {0}
configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다.
add = 추가...
boss.health = 수호자 체력
guardian = 수호자
connectfail = [scarlet]연결 오류:\n\n[accent]{0}
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
@@ -574,6 +583,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 = 높지 않지만 낮지도 않음
@@ -626,11 +636,12 @@ status.wet.name = 젖음
status.muddy.name = 질척해짐
status.melting.name = 융해
status.sapped.name = 흡혈됨
status.spore-slowed.name = 포자 느려짐
status.tarred.name = Tarred
status.electrified.name = 과전류
status.spore-slowed.name = 포자감속
status.tarred.name = 타르화
status.overclock.name = 과부하
status.shocked.name = 충격
status.blasted.name = 폭파됨
status.shocked.name = 감전
status.blasted.name = 파열
status.unmoving.name = 멈춤
settings.language = 언어
@@ -654,6 +665,7 @@ settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠
paused = [accent]< 일시정지 >
clear = 초기화
banned = [scarlet]금지됨
unsupported.environment = [scarlet]지원되지 않는 환경
yes = O
no = X
info.title = 정보
@@ -668,7 +680,7 @@ stat.input = 입력
stat.output = 출력
stat.booster = 가속
stat.tiles = 필요한 타일
stat.affinities = 친화력
stat.affinities = 작용 가능
stat.opposites = 상성
stat.powercapacity = 전력 용량
stat.powershot = 전력/발
@@ -692,6 +704,7 @@ stat.memorycapacity = 변수 용량
stat.basepowergeneration = 기본 전력 발전량
stat.productiontime = 소요 시간
stat.repairtime = 건물 완전 수리 시간
stat.repairspeed = 수리 속도
stat.weapons = 무기
stat.bullet = 탄환
stat.speedincrease = 속도 증가
@@ -706,7 +719,7 @@ stat.buildtime = 건설 시간
stat.maxconsecutive = 최대 체인
stat.buildcost = 건설 비용
stat.inaccuracy = 오차각
#stat.shots = 발사 수 (안쓰임)
stat.shots = 발사 수
stat.reload = 초당 발사 수
stat.ammo = 탄약
stat.shieldhealth = 보호막 체력
@@ -717,7 +730,7 @@ stat.lightningchance = 전격 확률
stat.lightningdamage = 전격 피해량
stat.flammability = 인화성
stat.radioactivity = 방사성
stat.charge = 과충전
stat.charge=과충전
stat.heatcapacity = 열 용량
stat.viscosity = 점성
stat.temperature = 온도
@@ -736,14 +749,16 @@ stat.healthmultiplier = 체력 배수
stat.speedmultiplier = 이동속도 배수
stat.reloadmultiplier = 재장전 배수
stat.buildspeedmultiplier = 건설속도 배수
stat.reactive = 반응성
stat.reactive = 작용 받음
stat.healing = 회복량
ability.forcefield = 보호막 필드
ability.repairfield = 수리 필드
ability.statusfield = 상태이상 필드
ability.statusfield = {0} 상태이상 필드
ability.unitspawn = {0} 공장
ability.shieldregenfield = 방어막 복구 필드
ability.movelightning = 가속 전격
ability.energyfield = 에너지 필드: [accent]{1}[]타일 내 [accent]{2}[]개 목표물에게 [accent]{0}[]피해량
bar.drilltierreq = 더 좋은 드릴 필요
bar.noresources = 자원 부족
@@ -766,6 +781,7 @@ bar.power = 전력
bar.progress = 건설 진행도
bar.input = 입력
bar.output = 출력
bar.strength = [stat]{0}[lightgray]x 치료 속도
units.processorcontrol = [lightgray]프로세서 제어됨
@@ -780,7 +796,7 @@ bullet.knockback = [stat]{0}[lightgray] 넉백
bullet.pierce = [stat]{0}[lightgray]번 관통
bullet.infinitepierce = [stat]관통
bullet.healpercent = [stat]{0}[lightgray]% 회복
bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수
bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수
bullet.reload = [stat]{0}[lightgray]배 발사 속도
unit.blocks = 블록
@@ -898,7 +914,7 @@ keybind.press = 키를 누르세요...
keybind.press.axis = 마우스 휠 또는 키를 누르세요...
keybind.screenshot.name = 맵 스크린 캡처
keybind.toggle_power_lines.name = 전선 가시도 설정
keybind.toggle_block_status.name = 블록 상태 가시도
keybind.toggle_block_status.name = 블록 상태 가시도
keybind.move_x.name = X축 이동
keybind.move_y.name = Y축 이동
keybind.mouse_move.name = 커서를 따라서 이동
@@ -974,6 +990,7 @@ rules.wavetimer = 시간 제한이 있는 단계
rules.waves = 단계
rules.attack = 공격 모드
rules.buildai = AI 건설
rules.corecapture = 코어 파괴 시 점령
rules.enemyCheat = 무한 AI (빨간팀) 자원
rules.blockhealthmultiplier = 블록 체력 배수
rules.blockdamagemultiplier = 블록 공격력 배수
@@ -1003,7 +1020,7 @@ rules.explosions = 블록/유닛 폭발 데미지
rules.ambientlight = 자연 조명 표시
rules.weather = 날씨 추가
rules.weather.frequency = 빈도:
rules.weather.always = 항상
rules.weather.always = 항상
rules.weather.duration = 지속 시간:
content.item.name = 자원
@@ -1029,6 +1046,7 @@ item.blast-compound.name = 폭발물
item.pyratite.name = 파이라타이트
item.metaglass.name = 강화 유리
item.scrap.name = 고철
liquid.water.name =
liquid.slag.name = 광재
liquid.oil.name = 석유
@@ -1060,6 +1078,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 = 감마
@@ -1122,6 +1145,7 @@ block.char.name = 숯
block.dacite.name = 석영안산암
block.dacite-wall.name = 석영안산암 벽
block.dacite-boulder.name = 석영안산암
block.rhyolite.name = 유문암
block.ice-snow.name = 얼음눈
block.stone-wall.name = 돌 벽
block.ice-wall.name = 얼음 벽
@@ -1227,6 +1251,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 = 메타 파이프
@@ -1269,10 +1294,16 @@ block.exponential-reconstructor.name = 재구성기 : Exponential
block.tetrative-reconstructor.name = 재구성기 : Tetrative
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 = 대형 과부하 프로젝터
#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들입니다.
#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들입니다.
block.block-forge.name = 블록 제작대
block.block-loader.name = 블록 로더
block.block-unloader.name = 블록 언로더
@@ -1290,7 +1321,6 @@ block.memory-bank.name = 메모리 보관소
team.blue.name = 파랑색 팀
team.crux.name = 빨강색 팀
team.sharded.name = 주황색 팀
team.orange.name = 주황색 팀
team.derelict.name = 버려진 팀
team.green.name = 초록색 팀
team.purple.name = 보라색 팀
@@ -1311,6 +1341,7 @@ hint.placeConveyor.mobile = 컨베이어는 자원을 드릴에서 다른 블록
hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[]를 설치하십시오.\n\n포탑 탄약 필요 - 지금은 \uf838 구리가 필요합니다.\n컨베이어를 사용해 드릴에 구리를 공급하십시오.
hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오.
hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오.
hint.blockInfo = [accent]건설 메뉴[]에서 블록을 선택해서 정보를 보십시오, 그다음 오른쪽의 [accent][[?][] 버튼을 선택하십시오.
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오.
@@ -1344,7 +1375,7 @@ item.graphite.description = 탄약 및 전기 부품에 사용되는 무기질
item.sand.description = 제련에서 합금 또는 플럭스에서 광범위하게 사용되는 일반적인 재료.
item.coal.description = 화석화된 식물 물질. 씨앗이 나오기 훨씬 전에 형성되었습니다. 연료 및 자원 생산에 광범위하게 사용됩니다.
item.coal.details = 발화 작용 이전, 오래전에 생성된 화석화 작용을 거친 식물체로 보입니다.
item.titanium.description = 액체 수송, 드릴이나 항공기에 광범위하게 사용되는 희귀 초경량 금속.
item.titanium.description = 액체 수송, 드릴이나 공장에 광범위하게 사용되는 희귀 초경량 금속.
item.thorium.description = 구조적 지지 및 핵연료로 사용되는 고밀도의 방사성 금속.
item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다.
item.scrap.details = 오래된 구조물과 유닛의 잔해.
@@ -1505,9 +1536,9 @@ block.memory-cell.description = 프로세서를 위한 데이터를 저장합니
block.memory-bank.description = 프로세서를 위한 데이터를 저장합니다. 저장 공간이 셀보다 큽니다.
block.logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다.
block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다.
block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다.
block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다.
unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다.
unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다.
unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다.
unit.fortress.description = 지상 목표물에 장거리 포탄을 발사합니다.
unit.scepter.description = 주변 모든 적에게 장전된 탄환을 일제히 발사합니다.
@@ -1522,19 +1553,19 @@ unit.atrax.description = 지상 목표물을 약화하는 광재 구체를 발
unit.spiroct.description = 적에게 흡혈 레이저 빔을 발사하며, 흡혈을 통해 체력을 회복합니다. 대부분의 지형 위를 밟을 수 있습니다.
unit.arkyid.description = 적에게 큰 흡혈 레이저 빔을 발사하며, 흡혈을 통해 체력을 회복합니다. 대부분의 지형 위를 밟을 수 있습니다.
unit.toxopid.description = 적에게 큰 전격 포탄 무리와 관통 레이저를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다.
unit.flare.description = 지상 목표물에 일반적인 탄환을 발사합니다.
unit.horizon.description = 지상 목표물에 폭탄을 투하합니다.
unit.flare.description = 지상 목표물에 일반적인 탄환을 발사합니다.
unit.horizon.description = 지상 목표물에 폭탄을 투하합니다.
unit.zenith.description = 주변 모든 적에게 미사일을 살포합니다.
unit.antumbra.description = 주변 모든 적에게 탄환들을 일제히 발사합니다.
unit.eclipse.description = 주변 모든 적에게 두 개의 관통 레이저와 대공 탄을 일제히 발사합니다.
unit.mono.description = 자동으로 구리와 납을 캐서 코어로 넣습니다.
unit.poly.description = 자동으로 부서진 구조물을 재건설하거나 다른 유닛들의 건설을 보조합니다.
unit.mega.description = 자동으로 손상된 구조물을 수리합니다. 블록이나 작은 지상 유닛들을 수송할 수 있습니다.
unit.quad.description = 지상 목표물에 적에게 피해를 주고, 아군 구조물을 수리하는 큰 폭탄을 투하합니다. 중간 크기의 지상 유닛들을 수송할 수 있습니다.
unit.oct.description = 주변 아군들을 재생 역장으로 보호합니다. 대부분의 지상 유닛들을 수송할 수 있습니다.
unit.risso.description = 주변 모든 적에게 탄환과 미사일을 일제히 발사합니다.
unit.quad.description = 지상 목표물에 적에게 피해를 주고, 아군 구조물을 수리하는 큰 폭탄을 투하합니다. 중간 크기의 지상 유닛들을 수송할 수 있습니다.
unit.oct.description = 주변 아군들을 재생 역장으로 보호합니다. 대부분의 지상 유닛들을 수송할 수 있습니다.
unit.risso.description = 주변 모든 적에게 탄환과 미사일을 일제히 발사합니다.
unit.minke.description = 주변 지상 적에게 일반적인 탄환과 포탄을 발사합니다.
unit.bryde.description = 적에게 장거리 포탄과 미사일을 발사합니다.
unit.bryde.description = 적에게 장거리 포탄과 미사일을 발사합니다.
unit.sei.description = 적에게 방어력 관통 탄환과 미사일을 일제히 발사합니다.
unit.omura.description = 적에게 장거리 관통 레일건을 발사합니다. 플레어를 생산합니다.
unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다.
@@ -1549,8 +1580,8 @@ lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출
lst.printflush = 대기중인 [accent]Print[]실행문을 메시지 블록에 출력하기
lst.getlink = 순서별로 프로세서 연결 가져오기. 0부터 시작
lst.control = 건물 조종하기
lst.radar = 건물 주변의 유닛 검색하기
lst.sensor = 건물 또는 유닛의 정보 얻기
lst.radar = 건물 주변의 유닛 검색하기
lst.sensor = 건물 또는 유닛의 정보 얻기
lst.set = 변수 선언/할당하기
lst.operation = 1~2개의 변수로 연산하기
lst.end = 실행줄의 가장 위로 점프하기
@@ -1565,7 +1596,7 @@ logic.nounitbuild = [red]유닛의 건물 로직은 여기서 허용되지 않
lenum.type = 건물/유닛의 타입\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다.
lenum.shoot = 특정 위치에 발사
lenum.shootp = 목표물 속도를 예측하여 발사
lenum.configure = 필터의 아이템같은 건물의 설정
lenum.config = 필터의 아이템같은 건물의 설정
lenum.enabled = 블록의 활성 여부
lenum.color = 조명 색 설정
@@ -1573,6 +1604,7 @@ laccess.controller = 유닛 제어자. 프로세서가 제어하면, 프로세
laccess.dead = 유닛 또는 건물 사망/무효 여부
laccess.controlled = 만약 유닛 제어자가 프로세서라면 [accent]@ctrlProcessor[]를 반환합니다.\n만약 유닛/건물 제어자가 플레이어라면 [accent]@ctrlPlayer[]를 반환합니다.\n만약 유닛이 다른 유닛에 의해 지휘되면(G키)[accent]@ctrlFormation[]를 반환합니다.\n그 외에는 0을 반환합니다.
laccess.commanded = [red]이제 사용되지 않으며, 곧 제거될 예정입니다![]\n대신 [accent]controlled[]를 사용하세요.
laccess.progress = 작업 진행률, 0 에서 1 로 감.\n포탑 재장전이나 구조물 진행률을 반환합니다.
graphicstype.clear = 이 색으로 화면을 채우기
graphicstype.color = 아래 그래픽 실행문들의 색 설정하기
@@ -1581,7 +1613,7 @@ graphicstype.line = 선분 그리기
graphicstype.rect = 직사각형 채우기
graphicstype.linerect = 직사각형 외곽선 그리기
graphicstype.poly = 정다각형 채우기
graphicstype.linepoly = 정다각형 외곽선 그리기
graphicstype.linepoly = 정다각형 외곽선 그리기
graphicstype.triangle = 삼각형 채우기
graphicstype.image = 일부 콘텐츠의 이미지 그리기\n예: [accent]@router[] 또는 [accent]@dagger[].
@@ -1604,9 +1636,15 @@ lenum.min = 두 수의 최솟값
lenum.max = 두 수의 최댓값
lenum.angle = 벡터의 각(도)
lenum.len = 벡터의 길이
lenum.sin = 사인(도)
lenum.cos = 코사인(도)
lenum.tan = 탄젠트(도)
lenum.asin = 각도상 아크 사인
lenum.acos = 각도상 아크 코사인
lenum.atan = 각도상 아크 탄젠트
#not a typo, look up 'range notation'
lenum.rand = 범위 내 십진법 난수[0 ~ 값)
lenum.log = 자연 로그(진수)
@@ -1683,205 +1721,215 @@ lenum.build = 구조물 건설
lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다.
lenum.within = 좌표 주변 유닛 발견 여부
lenum.boost = 이륙 시작/중단
#1665 줄 매칭
#1724 line matching / 줄 매칭
#-------------비공식 번역-------------
#-------------비공식 번역-------------
#팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요.
#심각한 노잼, 뇌절, 무례한 말들을 적지 말아주세요, 이는 목적이 어떠하든 공통적으로 적용됩니다(친근함 유도를 위한 평어 x). 다음 패치에 업데이트되어 그 언어를 쓰는 모든 유저가 보게 됩니다.
#심각한 노잼, 뇌절, 무례한 말들을 적지 말아주세요, 이는 목적이 어떠하든 공통적으로 적용됩니다(친근함 유도를 위한 평어 x). 다음 패치에 업데이트되어 한국어를 쓰는 모든 유저가 보게 됩니다.
#양이 너무 많으면 사족을 더 붙이는걸 추천하지 않습니다.
#이 비공식 번역주는 공식 디테일이 추가되면 언제든지 삭제될 수 있습니다.
#비어있는 디테일은 아래 details가 전부이므로 추가 또는 삭제를 따로 안하셔도 됩니다.
#비어있는 디테일은 아래 details가 전부이므로 추가 또는 삭제를 따로 안하셔도 됩니다.
#유색코드가 아닌, 흑백 색코드만 사용 가능합니다. 되도록이면 그냥 안쓰시는걸 추천.
#관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018
#관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018
#아이템
item.metaglass.details = 쓰임세가 가장 적은 아이템
item.graphite.details =
item.sand.details =
item.titanium.details =
item.thorium.details =
item.silicon.details =
item.plastanium.details =
item.phase-fabric.details =
item.surge-alloy.details =
item.blast-compound.details = 화력 발전기에 넣어보세요.
item.pyratite.details =
item.metaglass.details = [lightgray][비공식][]쓰임세가 가장 적은 아이템
item.graphite.details =
item.sand.details =
item.titanium.details =
item.thorium.details =
item.silicon.details =
item.plastanium.details =
item.phase-fabric.details =
item.surge-alloy.details =
item.blast-compound.details = [lightgray][비공식][]화력 발전기에 넣어보세요.
item.pyratite.details =
#액체
liquid.water.details =
liquid.slag.details =
liquid.oil.details =
liquid.cryofluid.details = 티타늄을 갈아서 물에 희석했다는 소문이 있다.
liquid.water.details =
liquid.slag.details =
liquid.oil.details =
liquid.cryofluid.details = [lightgray][비공식][]티타늄을 갈아서 물에 희석했다는 소문이 있다.
#블록
block.resupply-point.details =
block.armored-conveyor.details =
block.illuminator.details =
block.message.details =
block.graphite-press.details =
block.multi-press.details =
block.silicon-smelter.details =
block.kiln.details =
block.plastanium-compressor.details = 석유를 정말 많이 먹는다.
block.phase-weaver.details =
block.alloy-smelter.details =
block.cryofluid-mixer.details =
block.blast-mixer.details =
block.pyratite-mixer.details =
block.melter.details =
block.separator.details =
block.spore-press.details =
block.pulverizer.details =
block.coal-centrifuge.details = 가성비가 매우 뛰어나다.
block.incinerator.details =
block.power-void.details =
block.power-source.details =
block.item-source.details =
block.item-void.details =
block.liquid-source.details =
block.liquid-void.details =
block.copper-wall.details =
block.copper-wall-large.details =
block.titanium-wall.details =
block.titanium-wall-large.details =
block.plastanium-wall.details =
block.plastanium-wall-large.details =
block.thorium-wall.details =
block.thorium-wall-large.details =
block.phase-wall.details =
block.phase-wall-large.details =
block.surge-wall.details =
block.surge-wall-large.details =
block.door.details =
block.door-large.details =
block.mender.details =
block.mend-projector.details =
block.overdrive-projector.details =
block.force-projector.details =
block.shock-mine.details =
block.conveyor.details =
block.titanium-conveyor.details =
block.plastanium-conveyor.details =
block.junction.details =
block.bridge-conveyor.details = 티타늄 컨베이어보다 빠르다.
block.phase-conveyor.details =
block.sorter.details = 자원을 분류하여 주변 블록에 건내는 과정이 거의 한순간에 일어난다.
block.inverted-sorter.details =
block.distributor.details =
block.overflow-gate.details =
block.underflow-gate.details =
block.mass-driver.details = 발사할려면 최소 아이템 10개가 필요하다.
block.mechanical-pump.details =
block.rotary-pump.details =
block.thermal-pump.details =
block.conduit.details =
block.pulse-conduit.details =
block.plated-conduit.details =
block.liquid-router.details =
block.liquid-tank.details =
block.liquid-junction.details =
block.bridge-conduit.details =
block.phase-conduit.details =
block.power-node.details =
block.power-node-large.details =
block.surge-tower.details =
block.diode.details =
block.battery.details =
block.battery-large.details =
block.combustion-generator.details =
block.thermal-generator.details =
block.steam-generator.details =
block.resupply-point.details =
block.armored-conveyor.details =
block.illuminator.details =
block.message.details =
block.graphite-press.details =
block.multi-press.details =
block.silicon-smelter.details =
block.kiln.details =
block.plastanium-compressor.details = [lightgray][비공식][]석유를 정말 많이 먹는다.
block.phase-weaver.details =
block.alloy-smelter.details =
block.cryofluid-mixer.details =
block.blast-mixer.details =
block.pyratite-mixer.details =
block.melter.details =
block.separator.details =
block.spore-press.details =
block.pulverizer.details =
block.coal-centrifuge.details = [lightgray][비공식][]가성비가 매우 뛰어나다.
block.incinerator.details =
block.power-void.details =
block.power-source.details =
block.item-source.details =
block.item-void.details =
block.liquid-source.details =
block.liquid-void.details =
block.copper-wall.details =
block.copper-wall-large.details =
block.titanium-wall.details =
block.titanium-wall-large.details =
block.plastanium-wall.details =
block.plastanium-wall-large.details =
block.thorium-wall.details =
block.thorium-wall-large.details =
block.phase-wall.details =
block.phase-wall-large.details =
block.surge-wall.details =
block.surge-wall-large.details =
block.door.details =
block.door-large.details =
block.mender.details =
block.mend-projector.details =
block.overdrive-projector.details =
block.force-projector.details =
block.shock-mine.details =
block.conveyor.details =
block.titanium-conveyor.details =
block.plastanium-conveyor.details =
block.junction.details =
block.bridge-conveyor.details = [lightgray][비공식][]티타늄 컨베이어보다 빠르다.
block.phase-conveyor.details =
block.sorter.details = [lightgray][비공식][]자원을 분류하여 주변 블록에 건내는 과정이 거의 한순간에 일어난다.
block.inverted-sorter.details =
block.distributor.details =
block.overflow-gate.details =
block.underflow-gate.details =
block.mass-driver.details = [lightgray][비공식][]발사할려면 최소 아이템 10개가 필요하다.
block.mechanical-pump.details =
block.rotary-pump.details =
block.thermal-pump.details =
block.conduit.details =
block.pulse-conduit.details =
block.plated-conduit.details =
block.liquid-router.details =
block.liquid-tank.details =
block.liquid-junction.details =
block.bridge-conduit.details =
block.phase-conduit.details =
block.power-node.details =
block.power-node-large.details =
block.surge-tower.details =
block.diode.details =
block.battery.details =
block.battery-large.details =
block.combustion-generator.details =
block.thermal-generator.details =
block.steam-generator.details =
block.differential-generator.details =
block.rtg-generator.details =
block.solar-panel.details =
block.solar-panel-large.details =
block.thorium-reactor.details =
block.impact-reactor.details =
block.mechanical-drill.details =
block.pneumatic-drill.details =
block.laser-drill.details =
block.blast-drill.details =
block.water-extractor.details =
block.cultivator.details =
block.cultivator.details =
block.oil-extractor.details =
block.vault.details =
block.container.details =
block.unloader.details =
block.launch-pad.details =
block.duo.details =
block.scatter.details =
block.scorch.details =
block.hail.details = 일점사하면 립플보다 더 뛰어난 정확도와 연사력을 보여준다.
block.wave.details =
block.lancer.details =
block.arc.details =
block.swarmer.details =
block.salvo.details =
block.fuse.details =
block.ripple.details =
block.cyclone.details =
block.spectre.details =
block.meltdown.details =
block.foreshadow.details =
block.repair-point.details =
block.segment.details =
block.parallax.details =
block.tsunami.details =
block.silicon-crucible.details =
block.disassembler.details =
block.overdrive-dome.details =
block.payload-conveyor.details =
block.payload-router.details =
block.command-center.details =
block.ground-factory.details =
block.air-factory.details = 건설&연구 재료는 구리와 납뿐이지만, 정작 유닛을 생산할 땐 실리콘이 필요하다.
block.naval-factory.details =
block.additive-reconstructor.details =
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.memory-cell.details =
block.memory-bank.details =
block.logic-display.details =
block.large-logic-display.details =
block.interplanetary-accelerator.details =
block.rtg-generator.details =
block.solar-panel.details =
block.solar-panel-large.details =
block.thorium-reactor.details =
block.impact-reactor.details =
block.mechanical-drill.details =
block.pneumatic-drill.details =
block.laser-drill.details =
block.blast-drill.details =
block.water-extractor.details =
block.cultivator.details =
block.oil-extractor.details =
block.vault.details =
block.container.details =
block.unloader.details =
block.launch-pad.details =
block.duo.details =
block.scatter.details =
block.scorch.details =
block.hail.details = [lightgray][비공식][]일점사하면 립플보다 더 뛰어난 정확도와 연사력을 보여준다.
block.wave.details =
block.lancer.details =
block.arc.details =
block.swarmer.details =
block.salvo.details =
block.fuse.details =
block.ripple.details =
block.cyclone.details =
block.spectre.details =
block.meltdown.details =
block.foreshadow.details =
block.repair-point.details =
block.segment.details =
block.parallax.details =
block.tsunami.details =
block.silicon-crucible.details =
block.disassembler.details =
block.overdrive-dome.details =
block.payload-conveyor.details =
block.payload-router.details =
block.duct.details = [lightgray][비공식][]무중력 환경에서 쓰일 컨베이어 대체재입니다.
block.duct-router.details = [lightgray][비공식][]교차기가 없어서 루터체인을 할 수 없네요.
block.duct-bridge.details = [lightgray][비공식][]사거리가 3타일입니다.
block.payload-propulsion-tower.details = [lightgray][비공식][]원문이 Turret가 아니라 Tower에요.
block.payload-void.details = [lightgray][비공식][]본격 유닛 쓰래기통
block.payload-source.details = [lightgray][비공식][]유닛 설정해놓고 방치해두면 나중에 랙걸립니다.
block.command-center.details =
block.ground-factory.details =
block.air-factory.details = [lightgray][비공식][]건설&연구 재료는 구리와 납뿐이지만, 정작 유닛을 생산할 땐 실리콘이 필요하다.
block.naval-factory.details =
block.additive-reconstructor.details =
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.memory-cell.details =
block.memory-bank.details =
block.logic-display.details =
block.large-logic-display.details =
block.interplanetary-accelerator.details =
#유닛
unit.dagger.details = 이전에 디거란 이명으로 종교가 생겼었다.
unit.mace.details =
unit.fortress.details =
unit.scepter.details =
unit.reign.details =
unit.nova.details =
unit.pulsar.details =
unit.quasar.details =
unit.vela.details =
unit.corvus.details = 정말 느리다.
unit.crawler.details = 최근에 자폭 AI가 향상되면서 컨베이어로 자폭을 유도할 수 없게 되었다.
unit.atrax.details =
unit.spiroct.details =
unit.arkyid.details =
unit.toxopid.details =
unit.dagger.details = [lightgray][비공식][]이전에 디거란 이명으로 종교가 생겼었다.
unit.mace.details =
unit.fortress.details =
unit.scepter.details =
unit.reign.details =
unit.nova.details =
unit.pulsar.details =
unit.quasar.details =
unit.vela.details =
unit.corvus.details = [lightgray][비공식][]정말 느리다.
unit.crawler.details = [lightgray][비공식][]최근에 자폭 AI가 향상되면서 컨베이어로 자폭을 유도할 수 없게 되었다. 분배기를 대신 쓰자.
unit.atrax.details =
unit.spiroct.details =
unit.arkyid.details =
unit.toxopid.details =
unit.flare.details =
unit.horizon.details =
unit.zenith.details =
unit.antumbra.details =
unit.eclipse.details =
unit.mono.details =
unit.poly.details =
unit.mega.details =
unit.quad.details =
unit.oct.details =
unit.risso.details = 뭉치면 연사력이 무시무시하다.
unit.minke.details =
unit.bryde.details =
unit.sei.details =
unit.omura.details =
unit.alpha.details =
unit.beta.details =
unit.gamma.details =
unit.horizon.details =
unit.zenith.details =
unit.antumbra.details =
unit.eclipse.details =
unit.mono.details =
unit.poly.details =
unit.mega.details =
unit.quad.details =
unit.oct.details =
unit.risso.details = [lightgray][비공식][]뭉치면 연사력이 무시무시하다.
unit.minke.details =
unit.bryde.details =
unit.sei.details = [lightgray][비공식][]세이 sei!
unit.omura.details =
unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮어보죠.
unit.oxynoe.details =
unit.cyerce.details = [lightgray][비공식][]폭죽놀이다!
unit.aegires.details = [lightgray][비공식][]플레이어가 할 수 있는건 운전과 공사뿐...
unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다.
unit.alpha.details =
unit.beta.details =
unit.gamma.details =

View File

@@ -124,8 +124,8 @@ mods.reload = Перезагрузить
mods.reloadexit = Игра будет закрыта для перезагрузки модификаций.
mod.installed = [[Установлено]
mod.display = [gray]Модификация:[orange] {0}
mod.enabled = [lightgray]Включён
mod.disabled = [scarlet]Выключен
mod.enabled = [lightgray]Включено
mod.disabled = [scarlet]Выключено
mod.multiplayer.compatible = [gray]Доступна в игре по сети
mod.disable = Выкл.
mod.content = Содержимое:
@@ -620,18 +620,18 @@ sector.extractionOutpost.description = Отдаленный аванпост, п
sector.impact0078.description = Здесь лежат остатки межзвездного транспортного судна, первым вошедшего в эту систему.\n\nИзвлеките как можно больше из обломков. Изучите любую уцелевшую технологию.
sector.planetaryTerminal.description = Конечная цель.\n\nЭта береговая база содержит сооружение, способное запускать ядра к окрестным планетам. Оно крайне хорошо охраняется.\n\nПроизведите морские единицы. Уничтожьте врага как можно скорее. Изучите пусковую конструкцию.
status.burning.name = Горит
status.freezing.name = Замерзает
status.wet.name = Влажный
status.burning.name = Горение
status.freezing.name = Замерзание
status.wet.name = Влага
status.muddy.name = В грязи
status.melting.name = Плавится
status.sapped.name = Истощён
status.spore-slowed.name = Замедлен спорами
status.tarred.name = Покрыт нефтью
status.overclock.name = Ускорен
status.shocked.name = Шокирован
status.blasted.name = Подорван
status.unmoving.name = Неподвижен
status.melting.name = Плавление
status.sapped.name = Истощение
status.spore-slowed.name = Замедление спорами
status.tarred.name = В нефти
status.overclock.name = Разгон
status.shocked.name = Шок
status.blasted.name = Разрыв
status.unmoving.name = Обездвиживание
settings.language = Язык
settings.data = Игровые данные
@@ -737,6 +737,7 @@ stat.speedmultiplier = Множитель скорости
stat.reloadmultiplier = Множитель перезарядки
stat.buildspeedmultiplier = Множитель скорости строительства
stat.reactive = Реактивен
stat.healing = Ремонт
ability.forcefield = Силовое поле
ability.repairfield = Ремонтирующее поле
@@ -779,7 +780,7 @@ bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройка
bullet.knockback = [stat]{0}[lightgray] отбрасывания
bullet.pierce = [stat]{0}[lightgray]x пробитие
bullet.infinitepierce = [stat]бесконечное пробитие
bullet.healpercent = [stat]{0}[lightgray]% лечения
bullet.healpercent = [stat]{0}[lightgray]% ремонта
bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов
bullet.reload = [stat]{0}[lightgray]x скорость стрельбы
@@ -1329,7 +1330,7 @@ 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\Используйте турели высокого уровня или \uf835 [accent]графитные[] боеприпасы в \uf861двойных турелях/\uf859залпах, чтобы уничтожить Стража.
hint.guardian = [accent]Стражи[] бронированы. Слабые боеприпасы, такие как [accent]медь[] и [accent]свинец[], [scarlet]не эффективны[].\n\nИспользуйте турели высокого уровня или \uf835 [accent]графитные[] боеприпасы в \uf861двойных турелях/\uf859залпах, чтобы уничтожить Стража.
hint.coreUpgrade = Ядра могут быть улучшены путем [accent]размещения над ними ядер более высокого уровня[].\n\nПоместите ядро  [accent]Штаб[] поверх ядра  [accent]Осколок[]. Убедитесь, что никакие препятствия не мешают ему.
hint.presetLaunch = В серые [accent]секторы с посадочными зонами[], такие как [accent]Ледяной лес[], можно запускаться из любого места. Они не требуют захвата близлежащей территории.\n\n[accent]Нумерованные секторы[], такие как этот, [accent]не обязательны[] для прохождения.
hint.coreIncinerate = После того, как ядро будет заполнено предметом до отказа, любые лишние входящие предметы этого типа будут [accent]сожжены[].
@@ -1353,7 +1354,7 @@ item.plastanium.description = Используется в продвинутой
item.phase-fabric.description = Используется в продвинутой электронике и самовосстанавливающихся постройках.
item.surge-alloy.description = Используется в продвинутом вооружении и реактивных оборонительных постройках.
item.spore-pod.description = Используется для переработки в нефть, взрывчатку и топливо.
item.spore-pod.details = Споры. Похоже, являются синтетической формой жизни. Выделяют газы, токсичные для других биологических форм жизни. Чрезвычайно инвазивны. Легко воспламеняются при определенных условиях.
item.spore-pod.details = Споры. Похоже, являются синтетической формой жизни. Выделяют газы, токсичные для других биологических форм жизни. Чрезвычайно инвазивны. Легко воспламеняются при определённых условиях.
item.blast-compound.description = Используется в бомбах и взрывчатых веществах.
item.pyratite.description = Используется в зажигательном оружии и твердотопливных генераторах.
@@ -1427,7 +1428,7 @@ block.thermal-pump.description = Перекачивает и выводит жи
block.conduit.description = Перемещает жидкости вперёд. Используется вместе с насосами и другими трубопроводами.
block.pulse-conduit.description = Перемещает жидкости вперёд. Работает быстрее и вмещает в себе больше, чем стандартный трубопровод.
block.plated-conduit.description = Перемещает жидкости вперёд. Не принимает ввод по бокам. Не протекает.
block.liquid-router.description = Принимает жидкости из одного направления и равномерно распределяет и до 3 других направлений. Также может хранить определенное количество жидкости.
block.liquid-router.description = Принимает жидкости из одного направления и равномерно распределяет их до 3 других. Также может хранить определённое количество жидкости.
block.liquid-tank.description = Хранит большое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору.
block.liquid-junction.description = Действует как мост для двух пересекающихся трубопроводов.
block.bridge-conduit.description = Перемещает жидкости над любой местностью или зданиями.

View File

@@ -140,7 +140,7 @@ mod.author = [lightgray]Yayıncı:[] {0}
mod.missing = Bu kayıt yakın zamanda güncellediğiniz ya da artık yüklü olmayan modlar içermekte. Kayıt bozulmaları yaşanabilir. Kaydı yüklemek istediğinizden emin misiniz?\n[lightgray]Modlar:\n{0}
mod.preview.missing = Bu modu atölyede yayınlamadan önce bir resim önizlemesi eklemelisiniz.\nMod dosyasına [accent]preview.png[] adlı bir resim yerleştirin ve tekrar deneyin.
mod.folder.missing = Atölyede sadece klasör halindeki modlar yayınlanabilir.Bir modu klasöre çevirmek için, sadece mod dosyalarını bir klasöre çıkarın ve eski sıkıştırılmış dosyayı silin, sonra da oyunu tekrar başlatın ya da modlarınızı tekrar yükleyin.
mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game.
mod.scripts.disable = Cihazınız kod içeren modları desteklemiyor. \nOyunu oynamak için bu modları devre dışı bırakmalısınız.
about.button = Hakkında
name = İsim:

View File

@@ -126,6 +126,7 @@ mod.installed = [[Đã cài đặt]
mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Đã Bật
mod.disabled = [scarlet]Đã Tắt
mod.multiplayer.compatible = [gray]Tương thích với chế độ nhiều người chơi
mod.disable = Tắt
mod.content = Nội dung:
mod.delete.error = Không thể xóa mod. Tệp có thể đang được sử dụng.
@@ -216,7 +217,7 @@ server.hidden = Ẩn
trace = Tìm người chơi
trace.playername = Tên người chơi: [accent]{0}
trace.ip = IP: [accent]{0}
trace.id = Unique ID: [accent]{0}
trace.id = ID: [accent]{0}
trace.mobile = Mobile Client: [accent]{0}
trace.modclient = Custom Client: [accent]{0}
invalidid = Client ID không hợp lệ! Vui lòng gửi báo cáo lỗi.
@@ -601,7 +602,6 @@ sector.windsweptIslands.name = Windswept Islands
sector.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal
#TODO: The Last
sector.groundZero.description = Vị trí tối ưu để bắt đầu một lần nữa. Mối đe dọa của kẻ thù thấp. Ít tài nguyên.\nThu thập càng nhiều chì và đồng càng tốt.\nTiến lên.
sector.frozenForest.description = Ngay cả ở đây, gần núi hơn, các bào tử đã phát tán. Nhiệt độ lạnh giá không thể chứa chúng mãi mãi.\n\nBắt đầu tham gia vào quyền lực. Chế tạo máy phát điện đốt. Học cách sử dụng Máy sửa chữa.
sector.saltFlats.description = Ở vùng ngoại ô của sa mạc Salt Flats. Có thể tìm thấy ít tài nguyên ở khu vực này.\n\nKẻ thù đã dựng lên một khu phức hợp lưu trữ tài nguyên ở đây. Loại bỏ căn cứ của họ. Không để lại gì.
@@ -619,6 +619,19 @@ sector.extractionOutpost.description = Một tiền đồn xa, được kẻ th
sector.impact0078.description = Đây là tàn tích của tàu vận chuyển giữa các vì sao lần đầu tiên đi vào hệ thống này.\n\nLấy càng nhiều càng tốt từ đống đổ nát. Nghiên cứu bất kỳ công nghệ nguyên vẹn nào.
sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa một cấu trúc có khả năng phóng căn cứ tới các hành tinh địa phương. Nó được bảo vệ cực kỳ cẩn thận.\n\nSản xuất quân lính hải quân. Loại bỏ kẻ thù càng nhanh càng tốt. Nghiên cứu cấu trúc phóng.
status.burning.name = Cháy
status.freezing.name = Đóng băng
status.wet.name = Wet
status.muddy.name = Muddy
status.melting.name = Tan chảy
status.sapped.name = Sapped
status.spore-slowed.name = Spore Slowed
status.tarred.name = Tarred
status.overclock.name = Overclock
status.shocked.name = Shock
status.blasted.name = Nổ
status.unmoving.name = Unmoving
settings.language = Ngôn ngữ
settings.data = Dữ liệu trò chơi
settings.reset = Khôi phục về mặc định
@@ -716,6 +729,12 @@ stat.abilities = Khả năng
stat.canboost = Nâng cấp
stat.flying = Bay
stat.ammouse = Sử dụng đạn
stat.damagemultiplier = Hệ số sát thương
stat.healthmultiplier = Hệ số độ bền
stat.speedmultiplier = Hệ số tốc độ
stat.reloadmultiplier = Reload Multiplier
stat.buildspeedmultiplier = Hệ số tốc độ xây dựng
stat.reactive = Phản ứng.
ability.forcefield = Tạo khiên
ability.repairfield = Sửa chữa/Xây dựng
@@ -751,17 +770,15 @@ units.processorcontrol = [lightgray]Điều khiển bởi bộ xử lý
bullet.damage = [stat]{0}[lightgray] sát thương
bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô
bullet.incendiary = [stat]cháy
bullet.sapping = [stat]sapping
bullet.homing = [stat]truy đuổi
bullet.shock = [stat]sốc
bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối
bullet.frag = [stat]phá mảnh
# I am not sure about this...
bullet.lightning = [stat]{0}[lightgray]x tia chớp ~ [stat]{1}[lightgray] sát thương
bullet.knockback = [stat]{0}[lightgray] bật lùi
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
bullet.infinitepierce = [stat]xuyên thấu
bullet.healpercent = [stat]{0}[lightgray]% sửa chửa
bullet.freezing = [stat]đóng băng
bullet.tarred = [stat]tarred
bullet.multiplier = [stat]{0}[lightgray]x lượng đạn
bullet.reload = [stat]{0}[lightgray]x tốc độ bắn
@@ -801,6 +818,7 @@ setting.hints.name = Gợi ý
setting.flow.name = Hiện thị tốc độ chuyền tài nguyên
setting.backgroundpause.name = Tạm dừng trong nền
setting.buildautopause.name = Tự động dừng xây dựng
setting.doubletapmine.name = Nhấn đúp để Đào
setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động
setting.animatedwater.name = Hiệu ứng nước
setting.animatedshields.name = Hiệu ứng khiên
@@ -921,6 +939,7 @@ keybind.pause_building.name = Tạm dừng/Tiếp tục Xây
keybind.minimap.name = Bản đồ mini
keybind.planet_map.name = Bản đồ hành tinh
keybind.research.name = Nghiên cứu
keybind.block_info.name = Thông tin khối
keybind.chat.name = Trò chuyện
keybind.player_list.name = Danh sách người chơi
keybind.console.name = Bảng điều khiển
@@ -1457,7 +1476,7 @@ block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đ
block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần.
block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất.
block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động.
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa.
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. Ưu tiên kẻ địch có độ bền tối đa cao nhất.
block.repair-point.description = Liên tục sửa chữa robot ở trong phạm vi hoạt động.
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
@@ -1538,6 +1557,8 @@ lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around the currently bound unit.
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
logic.nounitbuild = [red]Unit building logic is not allowed here.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
lenum.shoot = Bắn vào vị trí xác định.
lenum.shootp = Shoot at a unit/building with velocity prediction.
@@ -1545,6 +1566,10 @@ lenum.configure = Building configuration, e.g. sorter item.
lenum.enabled = Bất cứ khi nào khối hoạt động.
laccess.color = Màu đèn chiếu sáng.
laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself.
laccess.dead = Whether a unit/building is dead or no longer valid.
laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0.
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead.
graphicstype.clear = Tô màu cho màn hình.
graphicstype.color = Đặt màu cho thao tác vẽ tiếp theo.
@@ -1580,7 +1605,7 @@ lenum.sin = Sin, tính bằng độ.
lenum.cos = Cos, tính bằng độ.
lenum.tan = Tan, tính bằng độ.
#not a typo, look up 'range notation'
lenum.rand = Số ngẫu nhiên trong phạm vi [0, giá trị).
lenum.rand = Tạo ra số nguyên ngẫu nhiên trong phạm vi [0, giá trị).
lenum.log = Lôgarit tự nhiên (ln).
lenum.log10 = Lôgarit cơ số 10.
lenum.noise = 2D simplex noise.
@@ -1638,6 +1663,7 @@ unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for.
lenum.idle = Không di chuyển, nhưng vẫn xây dựng/đào.\nTrạng thái mặc định.
lenum.stop = Dừng di chuyển/Đào/Xây dựng.
lenum.move = Di chuyển đến vị trí xác định.
lenum.approach = Approach a position with a radius.

View File

@@ -73,7 +73,8 @@ public class Vars implements Loadable{
/** URL to the JSON file containing all the BE servers. Only queried in BE. */
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL to the JSON file containing all the stable servers. */
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
//TODO this uses BE servers until full v7 release, there's no point in displaying v6 at all
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL of the github issue report template.*/
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
/** list of built-in servers.*/

View File

@@ -15,7 +15,7 @@ import static mindustry.Vars.*;
public class LogicAI extends AIController{
/** Minimum delay between item transfers. */
public static final float transferDelay = 60f * 2f;
public static final float transferDelay = 60f * 1.5f;
/** Time after which the unit resets its controlled and reverts to a normal unit. */
public static final float logicControlTimeout = 10f * 60f;

View File

@@ -1168,22 +1168,24 @@ public class Blocks implements ContentList{
reloadTime = 200f;
range = 440f;
consumes.power(1.75f);
bullet = new MassDriverBolt();
}};
//special transport blocks
duct = new Duct("duct"){{
requirements(Category.distribution, with(Items.graphite, 5, Items.copper, 5));
speed = 5f;
requirements(Category.distribution, with(Items.graphite, 5, Items.metaglass, 2));
speed = 4f;
}};
ductRouter = new DuctRouter("duct-router"){{
requirements(Category.distribution, with(Items.graphite, 10, Items.copper, 5));
speed = 5f;
requirements(Category.distribution, with(Items.graphite, 10, Items.metaglass, 4));
speed = 4f;
}};
ductBridge = new DuctBridge("duct-bridge"){{
requirements(Category.distribution, with(Items.graphite, 20, Items.copper, 15));
requirements(Category.distribution, with(Items.graphite, 20, Items.metaglass, 8));
speed = 4f;
}};
//endregion
@@ -2048,7 +2050,7 @@ public class Blocks implements ContentList{
requirements(Category.units, with(Items.copper, 150, Items.lead, 130, Items.metaglass, 120));
plans = Seq.with(
new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)),
new UnitPlan(UnitTypes.retusa, 60f * 60f, with(Items.silicon, 15, Items.metaglass, 25, Items.titanium, 20))
new UnitPlan(UnitTypes.retusa, 60f * 50f, with(Items.silicon, 15, Items.metaglass, 25, Items.titanium, 20))
);
size = 3;
consumes.power(1.2f);
@@ -2090,7 +2092,8 @@ public class Blocks implements ContentList{
new UnitType[]{UnitTypes.poly, UnitTypes.mega},
new UnitType[]{UnitTypes.minke, UnitTypes.bryde},
new UnitType[]{UnitTypes.pulsar, UnitTypes.quasar},
new UnitType[]{UnitTypes.atrax, UnitTypes.spiroct}
new UnitType[]{UnitTypes.atrax, UnitTypes.spiroct},
new UnitType[]{UnitTypes.oxynoe, UnitTypes.cyerce}
);
}};
@@ -2111,7 +2114,8 @@ public class Blocks implements ContentList{
new UnitType[]{UnitTypes.fortress, UnitTypes.scepter},
new UnitType[]{UnitTypes.bryde, UnitTypes.sei},
new UnitType[]{UnitTypes.mega, UnitTypes.quad},
new UnitType[]{UnitTypes.quasar, UnitTypes.vela}
new UnitType[]{UnitTypes.quasar, UnitTypes.vela},
new UnitType[]{UnitTypes.cyerce, UnitTypes.aegires}
);
}};
@@ -2132,7 +2136,8 @@ public class Blocks implements ContentList{
new UnitType[]{UnitTypes.scepter, UnitTypes.reign},
new UnitType[]{UnitTypes.sei, UnitTypes.omura},
new UnitType[]{UnitTypes.quad, UnitTypes.oct},
new UnitType[]{UnitTypes.vela, UnitTypes.corvus}
new UnitType[]{UnitTypes.vela, UnitTypes.corvus},
new UnitType[]{UnitTypes.aegires, UnitTypes.navanax}
);
}};
@@ -2149,7 +2154,7 @@ public class Blocks implements ContentList{
requirements(Category.units, with(Items.silicon, 70, Items.thorium, 60, Items.plastanium, 60));
size = 2;
length = 6f;
repairSpeed = 5f;
repairSpeed = 4f;
repairRadius = 140f;
powerUse = 5f;
beamWidth = 1.1f;

View File

@@ -36,7 +36,7 @@ public class Bullets implements ContentList{
waterShot, cryoShot, slagShot, oilShot, heavyWaterShot, heavyCryoShot, heavySlagShot, heavyOilShot,
//environment, misc.
damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt;
damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame;
@Override
public void load(){
@@ -510,7 +510,5 @@ public class Bullets implements ContentList{
statusDuration = 60f * 4f;
damage = 0.2f;
}};
driverBolt = new MassDriverBolt();
}
}

View File

@@ -855,6 +855,7 @@ public class Fx{
if(Fire.regions[0] == null) return;
alpha(e.fout());
rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y);
Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout());
}),
fire = new Effect(50f, e -> {
@@ -962,7 +963,7 @@ public class Fx{
}),
overdriven = new Effect(20f, e -> {
color(Pal.accent);
color(e.color);
randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> {
Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f);
@@ -970,7 +971,7 @@ public class Fx{
}),
overclocked = new Effect(50f, e -> {
color(Pal.accent);
color(e.color);
Fill.square(e.x, e.y, e.fslope() * 2f, 45f);
}),

View File

@@ -53,7 +53,9 @@ public class TechTree implements ContentList{
node(titaniumConveyor, Seq.with(new SectorComplete(craters)), () -> {
node(phaseConveyor, () -> {
node(massDriver, () -> {
node(payloadPropulsionTower, () -> {
});
});
});
@@ -233,7 +235,9 @@ public class TechTree implements ContentList{
});
node(repairPoint, () -> {
node(repairTurret, () -> {
});
});
});
});
@@ -416,6 +420,18 @@ public class TechTree implements ContentList{
});
});
});
node(retusa, () -> {
node(oxynoe, () -> {
node(cyerce, () -> {
node(aegires, () -> {
node(navanax, () -> {
});
});
});
});
});
});
});
});

View File

@@ -1375,7 +1375,7 @@ public class UnitTypes implements ContentList{
shrinkX = shrinkY = 0.7f;
speed = 0.001f;
speed = 0f;
collides = false;
healPercent = 15f;
@@ -1759,7 +1759,7 @@ public class UnitTypes implements ContentList{
armor = 3f;
buildSpeed = 2f;
buildSpeed = 1.5f;
weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{
x = 0f;
@@ -1810,7 +1810,7 @@ public class UnitTypes implements ContentList{
shrinkX = shrinkY = 0f;
speed = 0.001f;
speed = 0f;
splashDamage = 50f;
splashDamageRadius = 40f;
@@ -1833,7 +1833,7 @@ public class UnitTypes implements ContentList{
trailY = -4f;
trailScl = 1.9f;
buildSpeed = 2.5f;
buildSpeed = 2f;
weapons.add(new Weapon("plasma-mount-weapon"){{
@@ -1906,7 +1906,7 @@ public class UnitTypes implements ContentList{
trailY = -9f;
trailScl = 2f;
buildSpeed = 3f;
buildSpeed = 2f;
weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{
x = 11f;
@@ -1936,7 +1936,6 @@ public class UnitTypes implements ContentList{
ejectEffect = Fx.none;
bullet = new FlakBulletType(2.5f, 25){{
sprite = "missile-large";
collides = false;
//for targeting
collidesGround = collidesAir = true;
explodeRange = 40f;
@@ -1950,9 +1949,9 @@ public class UnitTypes implements ContentList{
lightColor = Pal.heal;
splashDamageRadius = 30f;
splashDamage = 28f;
splashDamage = 25f;
lifetime = 90f;
lifetime = 80f;
backColor = Pal.heal;
frontColor = Color.white;
@@ -1976,17 +1975,17 @@ public class UnitTypes implements ContentList{
weaveMag = 1f;
trailColor = Pal.heal;
trailParam = 5f;
trailInterval = 3f;
trailWidth = 4.5f;
trailLength = 29;
fragBullets = 7;
fragVelocityMin = 0.3f;
fragBullet = new MissileBulletType(3.9f, 12){{
fragBullet = new MissileBulletType(3.9f, 11){{
homingPower = 0.2f;
weaveMag = 4;
weaveScale = 4;
lifetime = 70f;
lifetime = 60f;
shootEffect = Fx.shootHeal;
smokeEffect = Fx.hitLaser;
splashDamage = 13f;
@@ -1998,12 +1997,14 @@ public class UnitTypes implements ContentList{
lightRadius = 40f;
lightOpacity = 0.7f;
trailInterval = 2f;
trailParam = 3f;
trailColor = Pal.heal;
trailWidth = 2.5f;
trailLength = 20;
trailChance = -1f;
healPercent = 2.8f;
collidesTeam = true;
backColor = Pal.heal;
trailColor = Pal.heal;
despawnEffect = Fx.none;
hitEffect = new ExplosionEffect(){{
@@ -2043,7 +2044,7 @@ public class UnitTypes implements ContentList{
trailY = -17f;
trailScl = 3.2f;
buildSpeed = 3.5f;
buildSpeed = 3f;
abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{
repair = 35f;
@@ -2084,7 +2085,7 @@ public class UnitTypes implements ContentList{
trailY = -32f;
trailScl = 3.5f;
buildSpeed = 3.8f;
buildSpeed = 3.5f;
for(float mountY : new float[]{-117/4f, 50/4f}){
for(float sign : Mathf.signs){
@@ -2112,8 +2113,8 @@ public class UnitTypes implements ContentList{
bullet = new ContinuousLaserBulletType(){{
maxRange = 90f;
damage = 25f;
length = 90f;
damage = 26f;
length = 95f;
hitEffect = Fx.hitMeltHeal;
drawSize = 200f;
lifetime = 155f;
@@ -2160,7 +2161,7 @@ public class UnitTypes implements ContentList{
timeIncrease = 3f;
timeDuration = 60f * 20f;
powerDamageScl = 3f;
damage = 40;
damage = 50;
hitColor = lightColor = Pal.heal;
lightRadius = 70f;
clipSize = 250f;
@@ -2176,7 +2177,7 @@ public class UnitTypes implements ContentList{
trailWidth = 6f;
trailColor = Pal.heal;
trailInterval = 3f;
splashDamage = 40f;
splashDamage = 60f;
splashDamageRadius = rad;
hitShake = 4f;
trailRotation = true;

View File

@@ -184,6 +184,13 @@ public class Logic implements ApplicationListener{
}
}
}
//heal all cores on game start
for(TeamData team : state.teams.getActive()){
for(var entity : team.cores){
entity.heal();
}
}
}
public void reset(){

View File

@@ -385,7 +385,7 @@ public class Renderer implements ApplicationListener{
lines[i + 3] = (byte)255;
}
Pixmap fullPixmap = new Pixmap(w, h);
Buffers.copy(lines, 0, fullPixmap.getPixels(), lines.length);
Buffers.copy(lines, 0, fullPixmap.pixels, lines.length);
Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png");
PixmapIO.writePng(file, fullPixmap);
fullPixmap.dispose();

View File

@@ -401,8 +401,14 @@ public class BulletType extends Content implements Cloneable{
//pierceBuilding is not enabled by default, because a bullet may want to *not* pierce buildings
}
if(lightningType == null){
lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning;
if(lightning > 0){
if(status == StatusEffects.none){
status = StatusEffects.shocked;
}
if(lightningType == null){
lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning;
}
}
}
@@ -445,7 +451,7 @@ public class BulletType extends Content implements Cloneable{
bullet.owner = owner;
bullet.team = team;
bullet.time = 0f;
bullet.vel.trns(angle, speed * velocityScl);
bullet.initVel(angle, speed * velocityScl);
if(backMove){
bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta);
}else{
@@ -462,7 +468,7 @@ public class BulletType extends Content implements Cloneable{
}
bullet.add();
if(keepVelocity && owner instanceof Velc v) bullet.vel.add(v.vel().x, v.vel().y);
if(keepVelocity && owner instanceof Velc v) bullet.vel.add(v.vel());
return bullet;
}

View File

@@ -23,7 +23,8 @@ public class ContinuousLaserBulletType extends BulletType{
public boolean largeHit = true;
public ContinuousLaserBulletType(float damage){
super(0.001f, damage);
this.damage = damage;
this.speed = 0f;
hitEffect = Fx.hitBeam;
despawnEffect = Fx.none;

View File

@@ -21,7 +21,8 @@ public class LaserBulletType extends BulletType{
public boolean largeHit = false;
public LaserBulletType(float damage){
super(0.01f, damage);
this.damage = damage;
this.speed = 0f;
hitEffect = Fx.hitLaserBlast;
hitColor = colors[2];

View File

@@ -12,8 +12,8 @@ public class LightningBulletType extends BulletType{
public int lightningLength = 25, lightningLengthRand = 0;
public LightningBulletType(){
super(0.0001f, 1f);
damage = 1f;
speed = 0f;
lifetime = 1;
despawnEffect = Fx.none;
hitEffect = Fx.hitLancer;

View File

@@ -16,6 +16,7 @@ public class RailBulletType extends BulletType{
public float updateEffectSeg = 20f;
public RailBulletType(){
speed = 0f;
pierceBuilding = true;
pierce = true;
reflectable = false;
@@ -23,7 +24,6 @@ public class RailBulletType extends BulletType{
despawnEffect = Fx.none;
collides = false;
lifetime = 1f;
speed = 0.01f;
}
@Override
@@ -57,7 +57,7 @@ public class RailBulletType extends BulletType{
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false);
float resultLen = b.fdata;
Vec2 nor = Tmp.v1.set(b.vel).nor();
Vec2 nor = Tmp.v1.trns(b.rotation(), 1f).nor();
for(float i = 0; i <= resultLen; i += updateEffectSeg){
updateEffect.at(b.x + nor.x * i, b.y + nor.y * i, b.rotation());
}
@@ -70,8 +70,8 @@ public class RailBulletType extends BulletType{
@Override
public void hitEntity(Bullet b, Hitboxc entity, float health){
handle(b, entity, health);
super.hitEntity(b, entity, health);
handle(b, entity, health);
}
@Override

View File

@@ -17,7 +17,7 @@ public class SapBulletType extends BulletType{
public float width = 0.4f;
public SapBulletType(){
speed = 0.0001f;
speed = 0f;
despawnEffect = Fx.none;
pierce = true;
collides = false;

View File

@@ -19,7 +19,7 @@ public class ShrapnelBulletType extends BulletType{
public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f, serrationFadeOffset = 0.5f;
public ShrapnelBulletType(){
speed = 0.01f;
speed = 0f;
hitEffect = Fx.hitLancer;
shootEffect = smokeEffect = Fx.lightningShoot;
lifetime = 10f;

View File

@@ -2,7 +2,6 @@ package mindustry.entities.comp;
import arc.func.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
@@ -22,11 +21,16 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
@Import Team team;
@Import Entityc owner;
@Import float x, y, damage;
@Import Vec2 vel;
IntSeq collided = new IntSeq(6);
Object data;
BulletType type;
float fdata;
@ReadOnly
private float rotation;
transient boolean absorbed, hit;
transient @Nullable Trail trail;
@@ -149,17 +153,20 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
type.drawLight(self());
}
public void initVel(float angle, float amount){
vel.trns(angle, amount);
rotation = angle;
}
/** Sets the bullet's rotation in degrees. */
@Override
public void rotation(float angle){
vel().setAngle(angle);
vel.setAngle(rotation = angle);
}
/** @return the bullet's rotation. */
@Override
public float rotation(){
float angle = Mathf.atan2(vel().x, vel().y) * Mathf.radiansToDegrees;
if(angle < 0) angle += 360;
return angle;
return vel.isZero(0.001f) ? rotation : vel.angle();
}
}

View File

@@ -35,7 +35,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
baseFlammability = -1, puddleFlammability, damageTimer = Mathf.random(40f),
spreadTimer = Mathf.random(spreadDelay), fireballTimer = Mathf.random(fireballDelay),
warmup = 0f,
animation = Mathf.random(frames);
animation = Mathf.random(frames - 1);
@Override
public void update(){
@@ -116,8 +116,10 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
Draw.alpha(Mathf.clamp(warmup / warmupDuration));
Draw.z(Layer.effect);
Draw.rect(regions[(int)animation], x, y);
Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x, y);
Draw.reset();
Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration));
}
@Replace

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 @Nullable Unit justSwitchFrom, justSwitchTo;
public boolean isBuilder(){
return unit.canBuild();
@@ -100,6 +101,16 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
@Override
public void afterSync(){
//fix rubberbanding:
//when the player recs a unit that they JUST transitioned away from, use the new unit instead
//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;
}else{
justSwitchFrom = null;
justSwitchTo = null;
}
//simulate a unit change after sync
Unit set = unit;
unit = lastReadUnit;
@@ -149,6 +160,13 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
}
public void checkSpawn(){
CoreBuild core = bestCore();
if(core != null){
core.requestSpawn(self());
}
}
@Override
public void remove(){
//clear unit upon removal
@@ -171,6 +189,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
}
public void unit(Unit unit){
//refuse to switch when the unit was just transitioned from
if(isLocal() && unit == justSwitchFrom && justSwitchFrom != null && justSwitchTo != null){
return;
}
if(unit == null) throw new IllegalArgumentException("Unit cannot be null. Use clearUnit() instead.");
if(this.unit == unit) return;

View File

@@ -15,7 +15,8 @@ import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.blocks.environment.*;
//just a proof of concept
import static mindustry.Vars.*;
@Component
abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
@Import float x, y, rotation;
@@ -32,7 +33,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
int sign = i == 0 ? -1 : 1;
float cx = Angles.trnsx(rotation - 90, type.trailX * sign, type.trailY) + x, cy = Angles.trnsy(rotation - 90, type.trailX * sign, type.trailY) + y;
t.update(cx, cy);
t.update(cx, cy, world.floorWorld(cx, cy).isLiquid ? 1 : 0);
}
}

View File

@@ -144,6 +144,14 @@ public class MinimapRenderer{
public void update(Tile tile){
if(world.isGenerating() || !state.isGame()) return;
if(tile.build != null && tile.isCenter()){
tile.getLinkedTiles(other -> {
if(!other.isCenter()){
update(other);
}
});
}
int color = colorFor(tile);
pixmap.set(tile.x, pixmap.height - 1 - tile.y, color);

View File

@@ -26,6 +26,10 @@ public class MultiPacker implements Disposable{
return null;
}
public PixmapPacker getPacker(PageType type){
return packers[type.ordinal()];
}
public boolean has(String name){
for(var page : PageType.all){
if(packers[page.ordinal()].getRect(name) != null){
@@ -70,8 +74,9 @@ public class MultiPacker implements Disposable{
//main page (sprites.png) - all sprites for units, weapons, placeable blocks, effects, bullets, etc
//environment page (sprites2.png) - all sprites for things in the environmental cache layer
//editor page (sprites3.png) - all sprites needed for rendering in the editor, including block icons and a few minor sprites
//zone page (sprites4.png) - zone previews
//ui page (sprites5.png) - content icons, white icons and UI elements
//zone page (sprites4.png) - zone preview
//rubble page - scorch textures for unit deaths & wrecks
//ui page (sprites5.png) - content icons, white icons, fonts and UI elements
public enum PageType{
main(4096),
environment,

View File

@@ -40,6 +40,7 @@ public class Trail{
float[] items = points.items;
int i = points.size - 3;
float x1 = items[i], y1 = items[i + 1], w1 = items[i + 2], w = w1 * width / (points.size/3) * i/3f * 2f;
if(w1 <= 0.001f) return;
Draw.rect("hcircle", x1, y1, w, w, -Mathf.radDeg * lastAngle + 180f);
Draw.reset();
}
@@ -56,6 +57,7 @@ public class Trail{
float size = width / (points.size/3);
float z1 = lastAngle;
float z2 = -Angles.angleRad(x2, y2, lx, ly);
if(w1 <= 0.001f || w2 <= 0.001f) continue;
float cx = Mathf.sin(z1) * i/3f * size * w1, cy = Mathf.cos(z1) * i/3f * size * w1,
nx = Mathf.sin(z2) * (i/3f + 1) * size * w2, ny = Mathf.cos(z2) * (i/3f + 1) * size * w2;

View File

@@ -229,8 +229,10 @@ public class DesktopInput extends InputHandler{
if(on != null){
Call.unitControl(player, on);
shouldShoot = false;
recentRespawnTimer = 1f;
}else if(build != null){
Call.buildingControlSelect(player, build);
recentRespawnTimer = 1f;
}
}
}
@@ -238,9 +240,10 @@ public class DesktopInput extends InputHandler{
if(!player.dead() && !state.isPaused() && !scene.hasField()){
updateMovement(player.unit());
if(Core.input.keyDown(Binding.respawn)){
Call.unitClear(player);
if(Core.input.keyTap(Binding.respawn)){
controlledType = null;
recentRespawnTimer = 1f;
Call.unitClear(player);
}
}

View File

@@ -58,6 +58,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
public Group uiGroup;
public boolean isBuilding = true, buildWasAutoPaused = false, wasShooting = false;
public @Nullable UnitType controlledType;
public float recentRespawnTimer;
public @Nullable Schematic lastSchematic;
public GestureDetector detector;
@@ -375,15 +376,27 @@ 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();
//make sure it's AI controlled, so players can't overwrite each other
}else if(unit.isAI() && unit.team == player.team() && !unit.dead){
if(!net.client()){
player.unit(unit);
if(net.client() && player.isLocal()){
player.justSwitchFrom = player.unit();
player.justSwitchTo = unit;
}
player.unit(unit);
Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit));
if(!player.dead()){
Fx.unitSpirit.at(player.x, player.y, 0f, unit);
@@ -393,12 +406,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Events.fire(new UnitControlEvent(player, unit));
}
@Remote(targets = Loc.both, called = Loc.both, forward = true)
@Remote(targets = Loc.both, called = Loc.server, forward = true)
public static void unitClear(Player player){
if(player == null) return;
//problem: this gets called on both ends. it shouldn't be.
Fx.spawn.at(player);
player.clearUnit();
player.checkSpawn();
player.deathTimer = Player.deathDelay + 1f; //for instant respawn
}
@@ -419,7 +434,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
player.unit().commandNearby(new CircleFormation());
Fx.commandSend.at(player, player.unit().type.commandRadius);
}
}
public Eachable<BuildPlan> allRequests(){
@@ -434,10 +448,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
return !selectRequests.isEmpty();
}
public OverlayFragment getFrag(){
return frag;
}
public void update(){
player.typing = ui.chatfrag.shown();
@@ -451,7 +461,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
wasShooting = player.shooting;
if(!player.dead()){
//only reset the controlled type and control a unit after the timer runs out
//essentially, this means the client waits for ~1 second after controlling something before trying to control something else automatically
if(!player.dead() && (recentRespawnTimer -= Time.delta / 70f) <= 0f && player.justSwitchFrom != player.unit()){
controlledType = player.unit().type;
}
@@ -461,6 +473,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
if(unit != null){
//only trying controlling once a second to prevent packet spam
if(!net.client() || controlInterval.get(0, 70f)){
recentRespawnTimer = 1f;
Call.unitControl(player, unit);
}
}

View File

@@ -614,8 +614,10 @@ public class MobileInput extends InputHandler implements GestureListener{
//control a unit/block detected on first tap of double-tap
if(unitTapped != null){
Call.unitControl(player, unitTapped);
recentRespawnTimer = 1f;
}else if(buildingTapped != null){
Call.buildingControlSelect(player, buildingTapped);
recentRespawnTimer = 1f;
}else if(!tryBeginMine(cursor)){
tileTapped(linked.build);
}
@@ -856,8 +858,7 @@ public class MobileInput extends InputHandler implements GestureListener{
boolean omni = unit.type.omniMovement;
boolean allowHealing = type.canHeal;
boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team &&
((Building)target).damaged() && target.within(unit, type.range);
boolean validHealTarget = allowHealing && target instanceof Building b && b.isValid() && target.team() == unit.team && b.damaged() && target.within(unit, type.range);
boolean boosted = (unit instanceof Mechc && unit.isFlying());
//reset target if:
@@ -912,13 +913,8 @@ public class MobileInput extends InputHandler implements GestureListener{
unit.vel.approachDelta(Vec2.ZERO, unit.speed() * type.accel / 2f);
}
float expansion = 3f;
unit.hitbox(rect);
rect.x -= expansion;
rect.y -= expansion;
rect.width += expansion * 2f;
rect.height += expansion * 2f;
rect.grow(6f);
player.boosting = collisions.overlapsTile(rect) || !unit.within(targetPos, 85f);
@@ -927,7 +923,7 @@ public class MobileInput extends InputHandler implements GestureListener{
}else{
unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len()));
if(!movement.isZero()){
unit.vel.rotateTo(movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1));
unit.rotation = Angles.moveToward(unit.rotation, movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1));
}
}

View File

@@ -8,6 +8,7 @@ import mindustry.ctype.*;
import mindustry.game.*;
import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import java.io.*;
@@ -111,6 +112,18 @@ public class JsonIO{
}
});
json.setSerializer(Attribute.class, new Serializer<>(){
@Override
public void write(Json json, Attribute object, Class knownType){
json.writeValue(object.name);
}
@Override
public Attribute read(Json json, JsonValue jsonData, Class type){
return Attribute.get(jsonData.asString());
}
});
json.setSerializer(Item.class, new Serializer<>(){
@Override
public void write(Json json, Item object, Class knownType){

View File

@@ -112,7 +112,6 @@ public class LCanvas extends Table{
jumps.cullable = false;
}).grow().get();
//pane.setClip(false);
pane.setFlickScroll(false);
//load old scroll percent

View File

@@ -36,13 +36,20 @@ public enum LogicOp{
abs("abs", a -> Math.abs(a)),
log("log", Math::log),
log10("log10", Math::log10),
sin("sin", d -> Math.sin(d * 0.017453292519943295D)),
cos("cos", d -> Math.cos(d * 0.017453292519943295D)),
tan("tan", d -> Math.tan(d * 0.017453292519943295D)),
floor("floor", Math::floor),
ceil("ceil", Math::ceil),
sqrt("sqrt", Math::sqrt),
rand("rand", d -> Mathf.rand.nextDouble() * d);
rand("rand", d -> Mathf.rand.nextDouble() * d),
sin("sin", d -> Math.sin(d * Mathf.doubleDegRad)),
cos("cos", d -> Math.cos(d * Mathf.doubleDegRad)),
tan("tan", d -> Math.tan(d * Mathf.doubleDegRad)),
asin("asin", d -> Math.asin(d) * Mathf.doubleRadDeg),
acos("acos", d -> Math.acos(d) * Mathf.doubleRadDeg),
atan("atan", d -> Math.atan(d) * Mathf.doubleRadDeg),
;
public static final LogicOp[] all = values();

View File

@@ -3,7 +3,6 @@ package mindustry.maps;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import mindustry.ai.*;
import mindustry.content.*;
import mindustry.entities.*;
@@ -186,7 +185,6 @@ public class SectorDamage{
Tile start = spawns.first();
Time.mark();
var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore);
Seq<Tile> path = new Seq<>();
boolean found = false;

View File

@@ -111,4 +111,23 @@ public abstract class FilterOption{
table.add("@filter.option." + name);
}
}
static class ToggleOption extends FilterOption{
final String name;
final Boolp getter;
final Boolc setter;
ToggleOption(String name, Boolp getter, Boolc setter){
this.name = name;
this.getter = getter;
this.setter = setter;
}
@Override
public void build(Table table){
table.row();
CheckBox check = table.check("@filter.option." + name, setter).growX().padBottom(5).padTop(5).center().get();
check.changed(changed);
}
}
}

View File

@@ -15,11 +15,13 @@ public class MirrorFilter extends GenerateFilter{
private final Vec2 v1 = new Vec2(), v2 = new Vec2(), v3 = new Vec2();
int angle = 45;
boolean rotate = false;
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45)
new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45),
new ToggleOption("rotate", () -> rotate, f -> rotate = f)
);
}
@@ -72,8 +74,8 @@ public class MirrorFilter extends GenerateFilter{
}
void mirror(Vec2 p, float x0, float y0, float x1, float y1){
//special case: uneven map mirrored at 45 degree angle
if(in.width != in.height && angle % 90 != 0){
//special case: uneven map mirrored at 45 degree angle (or someone might just want rotational symmetry)
if((in.width != in.height && angle % 90 != 0) || rotate){
p.x = in.width - p.x - 1;
p.y = in.height - p.y - 1;
}else{

View File

@@ -61,6 +61,7 @@ public class ContentParser{
});
put(Interp.class, (type, data) -> field(Interp.class, data));
put(CacheLayer.class, (type, data) -> field(CacheLayer.class, data));
put(Attribute.class, (type, data) -> Attribute.get(data.asString()));
put(Schematic.class, (type, data) -> {
Object result = fieldOpt(Loadouts.class, data);
if(result != null){

View File

@@ -607,7 +607,8 @@ public class Mods implements Loadable{
if(mod.root.child("content").exists()){
Fi contentRoot = mod.root.child("content");
for(ContentType type : ContentType.all){
Fi folder = contentRoot.child(type.name().toLowerCase(Locale.ROOT) + "s");
String lower = type.name().toLowerCase(Locale.ROOT);
Fi folder = contentRoot.child(lower + (lower.endsWith("s") ? "" : "s"));
if(folder.exists()){
for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){
runs.add(new LoadRun(type, file, mod));

View File

@@ -385,7 +385,6 @@ public class ArcNetProvider implements NetProvider{
return readFramework(byteBuffer);
}else{
//read length int, followed by compressed lz4 data
//TODO not thread safe!!!
Packet packet = Net.newPacket(id);
var buffer = decompressBuffer.get();
int length = byteBuffer.getShort() & 0xffff;
@@ -396,7 +395,7 @@ public class ArcNetProvider implements NetProvider{
buffer.position(0).limit(length);
buffer.put(byteBuffer.array(), byteBuffer.position(), length);
buffer.position(0);
packet.read(reads.get());
packet.read(reads.get(), length);
//move read packets forward
byteBuffer.position(byteBuffer.position() + buffer.position());
}else{
@@ -405,7 +404,7 @@ public class ArcNetProvider implements NetProvider{
buffer.position(0);
buffer.limit(length);
packet.read(reads.get());
packet.read(reads.get(), length);
//move buffer forward based on bytes read by decompressor
byteBuffer.position(byteBuffer.position() + read);
}

View File

@@ -7,6 +7,7 @@ import arc.func.*;
import arc.util.*;
import arc.util.async.*;
import arc.util.serialization.*;
import mindustry.*;
import mindustry.core.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@@ -39,7 +40,7 @@ public class BeControl{
public BeControl(){
if(active()){
Timer.schedule(() -> {
if(checkUpdates && !mobile){
if(Vars.clientLoaded && checkUpdates && !mobile){
checkUpdate(t -> {});
}
}, updateInterval, updateInterval);

View File

@@ -257,6 +257,7 @@ public class Net{
* Call to handle a packet being received for the client.
*/
public void handleClientReceived(Packet object){
object.handled();
if(object instanceof StreamBegin b){
streams.put(b.id, currentStream = new StreamBuilder(b));
@@ -291,6 +292,8 @@ public class Net{
* Call to handle a packet being received for the server.
*/
public void handleServerReceived(NetConnection connection, Packet object){
object.handled();
try{
//handle object normally
if(serverListeners.get(object.getClass()) != null){

View File

@@ -2,7 +2,14 @@ package mindustry.net;
import arc.util.io.*;
import java.io.*;
public abstract class Packet{
//internally used by generated code
protected static final byte[] NODATA = {};
protected static final ReusableByteInStream BAIS = new ReusableByteInStream();
protected static final Reads READ = new Reads(new DataInputStream(BAIS));
//these are constants because I don't want to bother making an enum to mirror the annotation enum
/** Does not get handled unless client is connected. */
@@ -15,6 +22,12 @@ public abstract class Packet{
public void read(Reads read){}
public void write(Writes write){}
public void read(Reads read, int length){
read(read);
}
public void handled(){}
public int getPriority(){
return priorityNormal;
}

View File

@@ -2,7 +2,6 @@ package mindustry.net;
import arc.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import arc.util.serialization.*;
import mindustry.core.*;
@@ -131,8 +130,6 @@ public class Packets{
crc.update(Base64Coder.decode(uuid), 0, b.length);
buffer.l(crc.getValue());
Log.info("CRC value sent: @", Long.toHexString(crc.getValue()));
buffer.b(mobile ? (byte)1 : 0);
buffer.i(color);
buffer.b((byte)mods.size);

View File

@@ -120,7 +120,7 @@ public class StatusEffect extends UnlockableContent{
if(effect != Fx.none && Mathf.chanceDelta(effectChance)){
Tmp.v1.rnd(Mathf.range(unit.type.hitSize/2f));
effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y);
effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, color);
}
}

View File

@@ -7,6 +7,8 @@ import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import mindustry.audio.*;
import mindustry.content.*;
@@ -15,6 +17,7 @@ import mindustry.entities.bullet.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -119,6 +122,17 @@ public class Weapon implements Cloneable{
this("");
}
public void addStats(UnitType u, Table t){
if(inaccuracy > 0){
t.row();
t.add("[lightgray]" + Stat.inaccuracy.localized() + ": [white]" + (int)inaccuracy + " " + StatUnit.degrees.localized());
}
t.row();
t.add("[lightgray]" + Stat.reload.localized() + ": " + (mirror ? "2x " : "") + "[white]" + Strings.autoFixed(60f / reload * shots, 2));
StatValues.ammo(ObjectMap.of(u, bullet)).display(t);
}
public float dps(){
return (bullet.estimateDPS() / reload) * shots * 60f;
}

View File

@@ -5,12 +5,14 @@ import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.scene.ui.layout.*;
import arc.util.*;
import mindustry.entities.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.blocks.units.*;
import mindustry.world.meta.*;
/**
* Note that this weapon requires a bullet with a positive maxRange.
@@ -47,6 +49,12 @@ public class RepairBeamWeapon extends Weapon{
recoil = 0f;
}
@Override
public void addStats(UnitType u, Table w){
w.row();
w.add("[lightgray]" + Stat.repairSpeed.localized() + ": " + (mirror ? "2x " : "") + "[white]" + (int)(repairSpeed * 60) + " " + StatUnit.perSecond.localized());
}
@Override
public float dps(){
return 0f;

View File

@@ -40,7 +40,7 @@ public class SearchBar{
parent.pane(table -> {
pane[0] = table;
rebuild.get("");
});
}).get().setScrollingDisabled(true, false);
return pane[0];
}
@@ -54,9 +54,6 @@ public class SearchBar{
/** Match a list item with the search query, case insensitive */
public static boolean matches(String query, String name){
if(name == null || name.isEmpty()){
return false;
}
return name.toLowerCase().contains(query);
return name != null && !name.isEmpty() && name.toLowerCase().contains(query);
}
}

View File

@@ -4,6 +4,7 @@ import arc.*;
import arc.scene.ui.*;
import arc.util.*;
import mindustry.core.GameState.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@@ -43,7 +44,12 @@ public class BaseDialog extends Dialog{
}
protected void onResize(Runnable run){
resized(run);
Events.on(ResizeEvent.class, event -> {
if(isShown() && Core.scene.getDialog() == this){
run.run();
updateScrollFocus();
}
});
}
public void addCloseListener(){

View File

@@ -127,7 +127,7 @@ public class ModsDialog extends BaseDialog{
try{
return d.parse(text);
}catch(Exception e){
throw new RuntimeException(e);
return new Date();
}
};
@@ -147,12 +147,11 @@ public class ModsDialog extends BaseDialog{
}
void setup(){
boolean squish = Core.graphics.isPortrait();
float h = 110f;
float w = squish ? 410f : 524f;
float w = Math.min(Core.graphics.getWidth() / 1.1f, 520f);
cont.clear();
cont.defaults().width(squish ? 480 : 560f).pad(4);
cont.defaults().width(Math.min(Core.graphics.getWidth() / 1.2f, 520f)).pad(4);
cont.add("@mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center);
cont.row();

View File

@@ -721,6 +721,7 @@ public class HudFragment extends Fragment{
t.clicked(() -> {
if(!player.dead() && mobile){
Call.unitClear(player);
control.input.recentRespawnTimer = 1f;
control.input.controlledType = null;
}
});

View File

@@ -241,7 +241,6 @@ public class Tile implements Position, QuadTreeObject, Displayable{
//assign entity and type to blocks, so they act as proxies for this one
other.build = entity;
other.block = block;
}
}
}

View File

@@ -34,6 +34,8 @@ public class MendProjector extends Block{
group = BlockGroup.projectors;
hasPower = true;
hasItems = true;
emitLight = true;
lightRadius = 50f;
}
@Override
@@ -129,7 +131,7 @@ public class MendProjector extends Block{
@Override
public void drawLight(){
Drawf.light(team, x, y, 50f * smoothEfficiency, baseColor, 0.7f * smoothEfficiency);
Drawf.light(team, x, y, lightRadius * smoothEfficiency, baseColor, 0.7f * smoothEfficiency);
}
@Override

View File

@@ -39,6 +39,8 @@ public class OverdriveProjector extends Block{
hasPower = true;
hasItems = true;
canOverdrive = false;
emitLight = true;
lightRadius = 50f;
}
@Override
@@ -89,7 +91,7 @@ public class OverdriveProjector extends Block{
@Override
public void drawLight(){
Drawf.light(team, x, y, 50f * smoothEfficiency, baseColor, 0.7f * smoothEfficiency);
Drawf.light(team, x, y, lightRadius * smoothEfficiency, baseColor, 0.7f * smoothEfficiency);
}
@Override

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.defense;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import mindustry.annotations.Annotations.*;
import mindustry.entities.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@@ -17,6 +18,8 @@ public class ShockMine extends Block{
public int length = 10;
public int tendrils = 6;
public Color lightningColor = Pal.lancerLaser;
public float teamAlpha = 0.3f;
public @Load("@-team-top") TextureRegion teamRegion;
public ShockMine(String name){
super(name);
@@ -24,7 +27,6 @@ public class ShockMine extends Block{
destructible = true;
solid = false;
targetable = false;
rebuildable = false;
}
public class ShockMineBuild extends Building{
@@ -37,12 +39,16 @@ public class ShockMine extends Block{
@Override
public void draw(){
super.draw();
Draw.color(team.color);
Draw.alpha(0.22f);
Fill.rect(x, y, 2f, 2f);
Draw.color(team.color, teamAlpha);
Draw.rect(teamRegion, x, y);
Draw.color();
}
@Override
public void drawCracks(){
}
@Override
public void unitOn(Unit unit){
if(enabled && unit.team != team && timer(timerDamage, cooldown)){

View File

@@ -6,6 +6,7 @@ import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.units.*;
@@ -183,5 +184,25 @@ public class Duct extends Block implements Autotiler{
next = front();
nextc = next instanceof DuctBuild d ? d : null;
}
@Override
public byte version(){
return 1;
}
@Override
public void write(Writes write){
super.write(write);
write.b(recDir);
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
if(revision >= 1){
recDir = read.b();
}
current = items.first();
}
}
}

View File

@@ -25,7 +25,7 @@ public class DuctBridge extends Block{
public @Load("@-dir") TextureRegion dirRegion;
public int range = 4;
public float moveDelay = 5f;
public float speed = 5f;
public DuctBridge(String name){
super(name);
@@ -37,6 +37,7 @@ public class DuctBridge extends Block{
group = BlockGroup.transportation;
noUpdateDisabled = true;
envEnabled = Env.space | Env.terrestrial | Env.underwater;
drawArrow = false;
}
@Override
@@ -55,6 +56,37 @@ public class DuctBridge extends Block{
Placement.calculateNodes(points, this, rotation, (point, other) -> Math.max(Math.abs(point.x - other.x), Math.abs(point.y - other.y)) <= range);
}
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
super.drawPlace(x, y, rotation, valid);
int length = range;
Building found = null;
//find the link
for(int i = 1; i <= range; i++){
Tile other = world.tile(x + Geometry.d4x(rotation) * i, y + Geometry.d4y(rotation) * i);
if(other != null && other.build instanceof DuctBridgeBuild build && build.team == player.team()){
length = i;
found = other.build;
break;
}
}
Drawf.dashLine(Pal.placing,
x * tilesize + Geometry.d4[rotation].x * (tilesize / 2f + 2),
y * tilesize + Geometry.d4[rotation].y * (tilesize / 2f + 2),
x * tilesize + Geometry.d4[rotation].x * (length) * tilesize,
y * tilesize + Geometry.d4[rotation].y * (length) * tilesize
);
if(found != null){
Drawf.square(found.x, found.y, found.block.size * tilesize/2f + 2.5f, 0f);
}
}
public boolean positionsValid(int x1, int y1, int x2, int y2){
if(x1 == x2){
return Math.abs(y1 - y2) <= range;
@@ -88,7 +120,6 @@ public class DuctBridge extends Block{
Draw.rect(bridgeBotRegion, cx, cy, len, tilesize, angle);
Draw.reset();
Draw.alpha(Renderer.bridgeOpacity);
//Draw.rect(bridgeTopRegion, cx, cy, len, tilesize, angle);
for(float i = 6f; i <= len + size * tilesize - 5f; i += 5f){
Draw.rect(arrowRegion, x + Geometry.d4x(rotation) * i, y + Geometry.d4y(rotation) * i, angle);
@@ -116,12 +147,12 @@ public class DuctBridge extends Block{
link.occupied[rotation % 4] = this;
if(items.any() && link.items.total() < link.block.itemCapacity){
progress += edelta();
while(progress > moveDelay){
while(progress > speed){
Item next = items.take();
if(next != null && link.items.total() < link.block.itemCapacity){
link.handleItem(this, next);
}
progress -= moveDelay;
progress -= speed;
}
}
}

View File

@@ -87,7 +87,7 @@ public class DuctRouter extends Block{
if(current == null) return null;
for(int i = -1; i <= 1; i++){
Building other = nearby(Mathf.mod(rotation + i + cdump, 4));
Building other = nearby(Mathf.mod(rotation + (((i + cdump + 1) % 3) - 1), 4));
if(other != null && other.team == team && other.acceptItem(this, current)){
return other;
}

View File

@@ -12,6 +12,7 @@ import arc.util.pooling.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.entities.bullet.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.logic.*;
@@ -28,6 +29,7 @@ public class MassDriver extends Block{
public int minDistribute = 10;
public float knockback = 4f;
public float reloadTime = 100f;
public MassDriverBolt bullet;
public float bulletSpeed = 5.5f;
public float bulletLifetime = 200f;
public Effect shootEffect = Fx.shootBig2;
@@ -287,7 +289,7 @@ public class MassDriver extends Block{
float angle = tile.angleTo(target);
Bullets.driverBolt.create(this, team,
bullet.create(this, team,
x + Angles.trnsx(angle, translation), y + Angles.trnsy(angle, translation),
angle, -1f, bulletSpeed, bulletLifetime, data);

View File

@@ -57,6 +57,14 @@ public class PayloadConveyor extends Block{
stats.add(Stat.payloadCapacity, (payloadLimit), StatUnit.blocksSquared);
}
@Override
public void init(){
super.init();
//increase clip size for oversize loads
clipSize = Math.max(clipSize, size * tilesize * 2.1f);
}
public class PayloadConveyorBuild extends Building{
public @Nullable Payload item;
public float progress, itemRotation, animation;

View File

@@ -13,7 +13,7 @@ import mindustry.world.*;
import static mindustry.Vars.*;
public class PayloadBlock extends Block{
public float payloadSpeed = 0.5f, payloadRotateSpeed = 5f;
public float payloadSpeed = 0.7f, payloadRotateSpeed = 5f;
public @Load(value = "@-top", fallback = "factory-top-@size") TextureRegion topRegion;
public @Load(value = "@-out", fallback = "factory-out-@size") TextureRegion outRegion;

View File

@@ -122,7 +122,8 @@ public class PayloadMassDriver extends PayloadBlock{
public float turretRotation = 90;
public float reload = 0f, charge = 0f;
public float targetSize = grabWidth*2f, curSize = targetSize;
public float payLength = 0f;
public float payLength = 0f, effectDelayTimer = -1f;
public PayloadDriverBuild lastOther;
public boolean loaded;
public boolean charging;
public PayloadDriverState state = idle;
@@ -151,6 +152,16 @@ public class PayloadMassDriver extends PayloadBlock{
targetSize = payload.size();
}
boolean pos = effectDelayTimer > 0;
effectDelayTimer -= Time.delta;
if(effectDelayTimer <= 0 && pos && lastOther != null){
var other = lastOther;
float cx = Angles.trnsx(other.turretRotation, length), cy = Angles.trnsy(other.turretRotation, length);
receiveEffect.at(x - cx/2f, y - cy/2f, turretRotation);
reload = 1f;
Effect.shake(shake, shake, this);
}
charging = false;
if(hasLink){
@@ -192,7 +203,7 @@ public class PayloadMassDriver extends PayloadBlock{
payVector.setZero();
payRotation = Angles.moveToward(payRotation, turretRotation + 180f, payloadRotateSpeed * delta());
}
}else{
}else if(effectDelayTimer <= 0){
moveOutPayload();
}
}
@@ -270,26 +281,22 @@ public class PayloadMassDriver extends PayloadBlock{
transferEffect.at(x + cx, y + cy, turretRotation, new PayloadMassDriverData(x + cx, y + cy, other.x - cx, other.y - cy, payload));
Payload pay = payload;
other.recPayload = payload;
other.effectDelayTimer = transferEffect.lifetime;
Time.run(transferEffect.lifetime, () -> {
receiveEffect.at(other.x - cx/2f, other.y - cy/2f, other.turretRotation);
Effect.shake(shake, shake, this);
//transfer payload
other.handlePayload(this, pay);
other.lastOther = this;
other.payVector.set(-cx, -cy);
other.payRotation = turretRotation;
other.payLength = length;
other.loaded = true;
other.updatePayload();
other.recPayload = null;
//transfer payload
other.reload = 1f;
other.handlePayload(this, pay);
other.payVector.set(-cx, -cy);
other.payRotation = turretRotation;
other.payLength = length;
other.loaded = true;
other.updatePayload();
other.recPayload = null;
if(other.waitingShooters.size != 0 && other.waitingShooters.first() == this){
other.waitingShooters.removeFirst();
}
other.state = idle;
});
if(other.waitingShooters.size != 0 && other.waitingShooters.first() == this){
other.waitingShooters.removeFirst();
}
other.state = idle;
//reset state after shooting immediately
payload = null;
@@ -341,8 +348,10 @@ public class PayloadMassDriver extends PayloadBlock{
if(payload != null){
updatePayload();
Draw.z(loaded ? Layer.blockOver + 0.2f : Layer.blockOver);
payload.draw();
if(effectDelayTimer <= 0){
Draw.z(loaded ? Layer.blockOver + 0.2f : Layer.blockOver);
payload.draw();
}
}
Draw.z(Layer.blockOver + 0.1f);
@@ -443,12 +452,22 @@ public class PayloadMassDriver extends PayloadBlock{
return Point2.unpack(link).sub(tile.x, tile.y);
}
@Override
public byte version(){
return 1;
}
@Override
public void write(Writes write){
super.write(write);
write.i(link);
write.f(turretRotation);
write.b((byte)state.ordinal());
write.f(reload);
write.f(charge);
write.bool(loaded);
write.bool(charging);
}
@Override
@@ -457,6 +476,13 @@ public class PayloadMassDriver extends PayloadBlock{
link = read.i();
turretRotation = read.f();
state = PayloadDriverState.all[read.b()];
if(revision >= 1){
reload = read.f();
charge = read.f();
loaded = read.bool();
charging = read.bool();
}
}
}

View File

@@ -24,9 +24,11 @@ public class PayloadSource extends PayloadBlock{
size = 3;
update = true;
outputsPayload = true;
hasPower = true;
hasPower = false;
rotate = true;
configurable = true;
//make sure to display large units.
clipSize = 120;
config(Block.class, (PayloadSourceBuild build, Block block) -> {
if(canProduce(block) && build.block != block){
@@ -45,6 +47,13 @@ public class PayloadSource extends PayloadBlock{
build.scl = 0f;
}
});
configClear((PayloadSourceBuild build) -> {
build.block = null;
build.unit = null;
build.payload = null;
build.scl = 0f;
});
}
@Override

View File

@@ -19,6 +19,9 @@ public class PayloadVoid extends PayloadBlock{
update = true;
rotate = false;
size = 3;
payloadSpeed = 1.2f;
//make sure to display large units.
clipSize = 120;
}
@Override

View File

@@ -4,10 +4,10 @@ import arc.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.*;
import mindustry.core.*;
import mindustry.entities.EntityCollisions.*;
import mindustry.entities.*;
import mindustry.game.EventType.*;
@@ -69,14 +69,12 @@ public class UnitPayload implements Payload{
//check if unit can be dumped here
SolidPred solid = unit.solidity();
if(solid != null){
int tx = unit.tileX(), ty = unit.tileY();
boolean nearEmpty = !solid.solid(tx, ty);
for(Point2 p : Geometry.d4){
nearEmpty |= !solid.solid(tx + p.x, ty + p.y);
}
Tmp.v1.trns(unit.rotation, 1f);
int tx = World.toTile(unit.x + Tmp.v1.x), ty = World.toTile(unit.y + Tmp.v1.y);
//cannot dump on solid blocks
if(!nearEmpty) return false;
if(solid.solid(tx, ty)) return false;
}
//cannnot dump when there's a lot of overlap going on

View File

@@ -49,7 +49,7 @@ public class PowerGraph{
}
public float getPowerBalance(){
return powerBalance.mean();
return powerBalance.rawMean();
}
public float getLastPowerNeeded(){

View File

@@ -18,6 +18,13 @@ public class ThermalGenerator extends PowerGenerator{
super(name);
}
@Override
public void init(){
super.init();
//proper light clipping
clipSize = Math.max(clipSize, 45f * size * 2f * 2f);
}
@Override
public void setStats(){
super.setStats();
@@ -52,7 +59,7 @@ public class ThermalGenerator extends PowerGenerator{
@Override
public void drawLight(){
Drawf.light(team, x, y, (40f + Mathf.absin(10f, 5f)) * productionEfficiency * size, Color.scarlet, 0.4f);
Drawf.light(team, x, y, (40f + Mathf.absin(10f, 5f)) * Math.min(productionEfficiency, 2f) * size, Color.scarlet, 0.4f);
}
@Override

View File

@@ -4,7 +4,6 @@ import mindustry.world.blocks.power.*;
import mindustry.world.meta.*;
public class PowerSource extends PowerNode{
public float powerProduction = 10000f;
public PowerSource(String name){

View File

@@ -1,9 +1,11 @@
package mindustry.world.meta;
import arc.struct.*;
import mindustry.*;
public class Attribute{
public static Attribute[] all = {};
public static ObjectMap<String, Attribute> map = new ObjectMap<>();
public static final Attribute
/** Heat content. Used for thermal generator yield. */
@@ -36,6 +38,11 @@ public class Attribute{
return name;
}
/** Never returns null, may throw an exception if not found. */
public static Attribute get(String name){
return map.getThrow(name, () -> new IllegalArgumentException("Unknown Attribute type: " + name));
}
/** Automatically registers this attribute for use. Do not call after mod init. */
public static Attribute add(String name){
Attribute a = new Attribute(all.length, name);
@@ -43,6 +50,7 @@ public class Attribute{
all = new Attribute[all.length + 1];
System.arraycopy(prev, 0, all, 0, a.id);
all[a.id] = a;
map.put(name, a);
return a;
}
}

View File

@@ -198,15 +198,10 @@ public class StatValues{
table.image(region).size(60).scaling(Scaling.bounded).right().top();
table.table(Tex.underline, w -> {
table.table(Tex.underline, w -> {
w.left().defaults().padRight(3).left();
if(weapon.inaccuracy > 0){
sep(w, "[lightgray]" + Stat.inaccuracy.localized() + ": [white]" + (int)weapon.inaccuracy + " " + StatUnit.degrees.localized());
}
sep(w, "[lightgray]" + Stat.reload.localized() + ": " + (weapon.mirror ? "2x " : "") + "[white]" + Strings.autoFixed(60f / weapon.reload * weapon.shots, 2));
ammo(ObjectMap.of(unit, weapon.bullet)).display(w);
weapon.addStats(unit, w);
}).padTop(-9).left();
table.row();
}
@@ -275,10 +270,6 @@ public class StatValues{
sep(bt, "@bullet.incendiary");
}
if(type.status != StatusEffects.none){
sep(bt, (type.minfo.mod == null ? type.status.emoji() : "") + "[stat]" + type.status.localizedName);
}
if(type.homingPower > 0.01f){
sep(bt, "@bullet.homing");
}
@@ -290,6 +281,10 @@ public class StatValues{
if(type.fragBullet != null){
sep(bt, "@bullet.frag");
}
if(type.status != StatusEffects.none){
sep(bt, (type.minfo.mod == null ? type.status.emoji() : "") + "[stat]" + type.status.localizedName);
}
}).padTop(unit ? 0 : -9).left().get().background(unit ? null : Tex.underline);
table.row();
@@ -298,7 +293,6 @@ public class StatValues{
}
//for AmmoListValue
private static void sep(Table table, String text){
table.row();
table.add(text);