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

View File

@@ -8,12 +8,6 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Set up JDK 14
uses: actions/setup-java@v1
with:
java-version: 14
- name: Run unit tests
run: ./gradlew clean cleanTest test
- name: Trigger BE build - name: Trigger BE build
if: ${{ github.repository == 'Anuken/Mindustry' }} if: ${{ github.repository == 'Anuken/Mindustry' }}
run: | run: |
@@ -23,3 +17,9 @@ jobs:
git tag ${BNUM} git tag ${BNUM}
git config --global user.name "Build Uploader" git config --global user.name "Build Uploader"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${BNUM} git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${BNUM}
- name: Set up JDK 14
uses: actions/setup-java@v1
with:
java-version: 14
- name: Run unit tests
run: ./gradlew clean cleanTest test

View File

@@ -18,7 +18,7 @@ See [CONTRIBUTING](CONTRIBUTING.md).
Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases).
If you'd rather compile on your own, follow these instructions. If you'd rather compile on your own, follow these instructions.
First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. **Other JDK versions will not work.** Open a terminal in the Mindustry directory and run the following commands:
### Windows ### Windows

View File

@@ -6,3 +6,4 @@
-keep class arc.** { *; } -keep class arc.** { *; }
-keep class net.jpountz.** { *; } -keep class net.jpountz.** { *; }
-keep class rhino.** { *; } -keep class rhino.** { *; }
-keep class com.android.dex.** { *; }

View File

@@ -30,6 +30,9 @@ public class CallGenerator{
TypeSpec.Builder packet = TypeSpec.classBuilder(ent.packetClassName) TypeSpec.Builder packet = TypeSpec.classBuilder(ent.packetClassName)
.addModifiers(Modifier.PUBLIC); .addModifiers(Modifier.PUBLIC);
//temporary data to deserialize later
packet.addField(FieldSpec.builder(byte[].class, "DATA", Modifier.PRIVATE).initializer("NODATA").build());
packet.superclass(tname("mindustry.net.Packet")); packet.superclass(tname("mindustry.net.Packet"));
//return the correct priority //return the correct priority
@@ -41,8 +44,8 @@ public class CallGenerator{
} }
//implement read & write methods //implement read & write methods
packet.addMethod(makeWriter(ent, serializer)); makeWriter(packet, ent, serializer);
packet.addMethod(makeReader(ent, serializer)); makeReader(packet, ent, serializer);
//generate handlers //generate handlers
if(ent.where.isClient){ if(ent.where.isClient){
@@ -87,7 +90,7 @@ public class CallGenerator{
JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer); JavaFile.builder(packageName, spec).build().writeTo(BaseProcessor.filer);
} }
private static MethodSpec makeWriter(MethodEntry ent, ClassSerializer serializer){ private static void makeWriter(TypeSpec.Builder typespec, MethodEntry ent, ClassSerializer serializer){
MethodSpec.Builder builder = MethodSpec.methodBuilder("write") MethodSpec.Builder builder = MethodSpec.methodBuilder("write")
.addParameter(Writes.class, "WRITE") .addParameter(Writes.class, "WRITE")
.addModifiers(Modifier.PUBLIC).addAnnotation(Override.class); .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class);
@@ -132,13 +135,27 @@ public class CallGenerator{
} }
} }
return builder.build(); typespec.addMethod(builder.build());
} }
private static MethodSpec makeReader(MethodEntry ent, ClassSerializer serializer){ private static void makeReader(TypeSpec.Builder typespec, MethodEntry ent, ClassSerializer serializer){
MethodSpec.Builder builder = MethodSpec.methodBuilder("read") MethodSpec.Builder readbuilder = MethodSpec.methodBuilder("read")
.addParameter(Reads.class, "READ") .addParameter(Reads.class, "READ")
.addParameter(int.class, "LENGTH")
.addModifiers(Modifier.PUBLIC).addAnnotation(Override.class); .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class);
//read only into temporary data buffer
readbuilder.addStatement("DATA = READ.b(LENGTH)");
typespec.addMethod(readbuilder.build());
MethodSpec.Builder builder = MethodSpec.methodBuilder("handled")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class);
//make sure data is present, begin reading it if so
builder.addStatement("BAIS.setBytes(DATA)");
Seq<Svar> params = ent.element.params(); Seq<Svar> params = ent.element.params();
//go through each parameter //go through each parameter
@@ -185,7 +202,7 @@ public class CallGenerator{
} }
} }
return builder.build(); typespec.addMethod(builder.build());
} }
/** Creates a specific variant for a method entry. */ /** Creates a specific variant for a method entry. */

View File

@@ -0,0 +1 @@
{version:1,fields:[{name:collided,type:arc.struct.IntSeq},{name:damage,type:float},{name:data,type:java.lang.Object},{name:fdata,type:float},{name:lifetime,type:float},{name:owner,type:mindustry.gen.Entityc},{name:rotation,type:float},{name:team,type:mindustry.game.Team},{name:time,type:float},{name:type,type:mindustry.entities.bullet.BulletType},{name:x,type:float},{name:y,type:float}]}

View File

@@ -17,7 +17,6 @@ buildscript{
dependencies{ dependencies{
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.11' classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.11'
classpath "com.github.anuken:packr:-SNAPSHOT"
classpath "com.github.Anuken.Arc:packer:$arcHash" classpath "com.github.Anuken.Arc:packer:$arcHash"
classpath "com.github.Anuken.Arc:arc-core:$arcHash" classpath "com.github.Anuken.Arc:arc-core:$arcHash"
} }

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.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.angle = Angle filter.option.angle = Angle
filter.option.rotate = Rotate
filter.option.amount = Amount filter.option.amount = Amount
filter.option.block = Block filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
@@ -1080,6 +1081,11 @@ unit.minke.name = Minke
unit.bryde.name = Bryde unit.bryde.name = Bryde
unit.sei.name = Sei unit.sei.name = Sei
unit.omura.name = Omura 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.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
@@ -1291,6 +1297,12 @@ block.exponential-reconstructor.name = Exponential Reconstructor
block.tetrative-reconstructor.name = Tetrative Reconstructor block.tetrative-reconstructor.name = Tetrative Reconstructor
block.payload-conveyor.name = Payload Conveyor block.payload-conveyor.name = Payload Conveyor
block.payload-router.name = Payload Router 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.disassembler.name = Disassembler
block.silicon-crucible.name = Silicon Crucible block.silicon-crucible.name = Silicon Crucible
block.overdrive-dome.name = Overdrive Dome block.overdrive-dome.name = Overdrive Dome
@@ -1627,9 +1639,15 @@ lenum.min = Minimum of two numbers.
lenum.max = Maximum of two numbers. lenum.max = Maximum of two numbers.
lenum.angle = Angle of vector in degrees. lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector. lenum.len = Length of vector.
lenum.sin = Sine, in degrees. lenum.sin = Sine, in degrees.
lenum.cos = Cosine, in degrees. lenum.cos = Cosine, in degrees.
lenum.tan = Tangent, 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' #not a typo, look up 'range notation'
lenum.rand = Random decimal in range [0, value). lenum.rand = Random decimal in range [0, value).
lenum.log = Natural logarithm (ln). lenum.log = Natural logarithm (ln).

View File

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

View File

@@ -23,8 +23,8 @@ gameover.pvp = [accent] {0}[] チームの勝利!
gameover.waiting = [accent]次のマップを待っています... gameover.waiting = [accent]次のマップを待っています...
highscore = [accent]ハイスコアを更新! highscore = [accent]ハイスコアを更新!
copied = コピーしました。 copied = コピーしました。
indev.notready = This part of the game isn't ready yet indev.notready = ゲームのこの要素はまだ準備中です
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.campaign = [accent]おめでとう! キャンペーンを達成しました![]\n\n現時点での内容はここまでです。 惑星間旅行は、今後のアップデートで追加される予定です。
load.sound = サウンド load.sound = サウンド
load.map = マップ load.map = マップ
@@ -306,16 +306,16 @@ cancelbuilding = [accent][[{0}][] 選択を解除する
selectschematic = [accent][[{0}][] 選択し、コピーする selectschematic = [accent][[{0}][] 選択し、コピーする
pausebuilding = [accent][[{0}][] 建築を一時的に中断する pausebuilding = [accent][[{0}][] 建築を一時的に中断する
resumebuilding = [scarlet][[{0}][] 建築を再開する resumebuilding = [scarlet][[{0}][] 建築を再開する
showui = UI hidden.\nPress [accent][[{0}][] to show UI. showui = UI 非表示.\nUIを表示するには[accent][[{0}][] を押下
wave = [accent]ウェーブ {0} wave = [accent]ウェーブ {0}
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]ウェーブ {0}/{1}
wave.waiting = [lightgray]次のウェーブまで {0} 秒 wave.waiting = [lightgray]次のウェーブまで {0} 秒
wave.waveInProgress = [lightgray]ウェーブ進行中 wave.waveInProgress = [lightgray]ウェーブ進行中
waiting = [lightgray]待機中... waiting = [lightgray]待機中...
waiting.players = プレイヤーを待っています... waiting.players = プレイヤーを待っています...
wave.enemies = [lightgray]敵は残り {0} 体 wave.enemies = [lightgray]敵は残り {0} 体
wave.enemycores = [accent]{0}[lightgray] Enemy Cores wave.enemycores = [accent]{0}[lightgray] 敵性コア
wave.enemycore = [accent]{0}[lightgray] Enemy Core wave.enemycore = [accent]{0}[lightgray] 敵性コア
wave.enemy = [lightgray]敵は残り {0} 体 wave.enemy = [lightgray]敵は残り {0} 体
wave.guardianwarn = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。 wave.guardianwarn = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。
wave.guardianwarn.one = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。 wave.guardianwarn.one = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。
@@ -551,10 +551,10 @@ sectors.stored = 保存済み:
sectors.resume = 再開 sectors.resume = 再開
sectors.launch = 打ち上げ sectors.launch = 打ち上げ
sectors.select = 選択 sectors.select = 選択
sectors.nonelaunch = [lightgray]none (sun) sectors.nonelaunch = [lightgray]無し (sun)
sectors.rename = セクター名を変更 sectors.rename = セクター名を変更
sectors.enemybase = [scarlet]敵基地 sectors.enemybase = [scarlet]敵基地
sectors.vulnerable = [scarlet]Vulnerable sectors.vulnerable = [scarlet]脆弱
sectors.underattack = [scarlet]攻撃を受けます! [accent]{0}% 破損 sectors.underattack = [scarlet]攻撃を受けます! [accent]{0}% 破損
sectors.survives = [accent]{0} ウェーブ生存 sectors.survives = [accent]{0} ウェーブ生存
sectors.go = Go sectors.go = Go
@@ -589,27 +589,27 @@ sector.overgrowth.name = オーバーグロウス
sector.tarFields.name = ター · フィールズ sector.tarFields.name = ター · フィールズ
sector.saltFlats.name = ソルト · フラッツ sector.saltFlats.name = ソルト · フラッツ
sector.fungalPass.name = ファングル · パス sector.fungalPass.name = ファングル · パス
sector.biomassFacility.name = Biomass Synthesis Facility sector.biomassFacility.name = バイオマス シンテシス ファシリティ
sector.windsweptIslands.name = Windswept Islands sector.windsweptIslands.name = ウインドスイープト アイランズ
sector.extractionOutpost.name = Extraction Outpost sector.extractionOutpost.name = エクストラクション アウトポスト
sector.planetaryTerminal.name = Planetary Launch Terminal 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.groundZero.description = 奪回を始めるには最適な場所です。敵脅威が低いが、資源が少ない。\nできるだけ多くの動と鉛を集めます。\n始めましょう。
sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。極寒の気温もそれらを永遠に封じ込めることはできません。\n\n電気に挑みましょう。火力発電機を建設し、修復機の使い方を学びましょう。
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.saltFlats.description = 砂漠のはずれにあるソルト · フラッツです。ここには資源がほとんどありません。\n\n敵はここに資源貯蔵施設を建設しました。彼らのコアを絶ち、掃滅してください。
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.craters.description = 過去の戦争の名残であるクレーターに水が溜まっています。エリアを取り戻し、砂を集め、メタガラスを精錬します。タレットとドリルを冷却するために水をポンプで送ります。
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.ruinousShores.description = 荒れ地を過ぎると海岸線です。ここにはかつて沿岸防衛隊が配備されていましたが、ほぼ残存していません。最も基本的な防衛施設のみが無傷のまま残っており、それ以外は全て破壊されています。\n外部拡張を続け、テクロジーを再取得しましょう。
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.stainedMountains.description = 更に内陸には、胞子に汚染されていない山があります。\nこの地域にはチタンが豊富にあります。抽出して使い方を学びましょう。\n\nより多くの敵が襲来します。最強のユニットを送る時間を与えないでください。
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.overgrowth.description = このエリアは、胞子の発生源に近く生い茂っています。\n敵はここに前哨基地を配備しました。タイタンユニットを生産し、破壊しましょう。失ったものを取り戻すのです。
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.tarFields.description = 山と砂漠に挟まれた、石油産出地帯のはずれです。使用可能なタール埋蔵量がある数少ないエリアの1つです。\n放棄されたエリアですが、近くに脅威となる敵がいます。\n\n[lightgray]可能であれば石油抽出機を研究しましょう。
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.desolateRift.description = 非常に危険な地帯です。資源は豊富ですが、空間が狭いです。破壊されるリスクが高いため、一刻も早く立ち去りましょう。敵の攻撃間隔が長いですが、気を抜かないでください。
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.nuclearComplex.description = 崩壊したトリウム製造・加工施設です。\n[lightgray]トリウムとその多くの用途を研究してください。\n\n多くの敵がここに存在し、常に攻撃を偵察しています。
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.fungalPass.description = 高山と、胞子の多い低地との間の遷移地域です。ここには敵の小さな偵察基地があります。\n破壊しましょう。\nダガーとクローラーユニットを使い、2つの敵コアの排除しましょう、
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.biomassFacility.description = 胞子の発生源です。これらは、胞子の研究により、最初に建設された施設です。\n内部に残された技術を研究しましょう。燃料とプラスタニウムの生産のために胞子を培養します。\n\n[lightgray]この施設が活動停止したために、胞子が放出されました。地域の生態系には、そのような侵略的生物と競合するものはありません。
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.windsweptIslands.description = 海岸をさらに進むと、辺鄙な列島があります。記録によると、ここにはかつて[accent]プラスタニウム[]-を生産するシステムがありました。\n\n敵の海軍ユニットを撃沈しましょう。島々に基地を建造し、これらの工場を調査しましょう。
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.extractionOutpost.description = 他のセクターへ資源を輸送するために建設された敵の遠隔地の前哨基地です。\n\nさらなる征伐のためには、セクター感を通ずる輸送技術が不可欠です。基地を破壊しましょう。彼らの発射台を研究してください。
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.impact0078.description = ここには、最初にこの星系に入った星間輸送船の残骸があります。\n\n残骸を可能な限り回収し、完全な技術を研究しましょう。
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.planetaryTerminal.description = 最終目標です。\n\nこの沿岸基地には、コアを他の惑星に打ち上げることが出来る建造物があります。極めて堅固に守られています。\n\n海軍ユニットを生産し、できるだけ速やかに敵を排除しましょう。発射建造物を研究しましょう。
settings.language = 言語 settings.language = 言語
settings.data = ゲームデータ settings.data = ゲームデータ
@@ -679,7 +679,7 @@ stat.boosteffect = ブースト効果
stat.maxunits = 最大ユニット数 stat.maxunits = 最大ユニット数
stat.health = 耐久値 stat.health = 耐久値
stat.buildtime = 建設時間 stat.buildtime = 建設時間
stat.maxconsecutive = Max Consecutive stat.maxconsecutive = 最大連鎖
stat.buildcost = 建設費用 stat.buildcost = 建設費用
stat.inaccuracy = 誤差 stat.inaccuracy = 誤差
stat.shots = ショット stat.shots = ショット
@@ -715,8 +715,8 @@ ability.shieldregenfield = シールドリペアフィールド
ability.movelightning = ムーブメントライトニング ability.movelightning = ムーブメントライトニング
bar.drilltierreq = より高性能なドリルを使用してください bar.drilltierreq = より高性能なドリルを使用してください
bar.noresources = Missing Resources bar.noresources = 不足している資源
bar.corereq = Core Base Required bar.corereq = コアベースが必要
bar.drillspeed = 採掘速度: {0}/秒 bar.drillspeed = 採掘速度: {0}/秒
bar.pumpspeed = ポンプの速度: {0}/s bar.pumpspeed = ポンプの速度: {0}/s
bar.efficiency = 効率: {0}% bar.efficiency = 効率: {0}%
@@ -740,7 +740,7 @@ units.processorcontrol = [lightgray]プロセッサーの制御下
bullet.damage = [stat]{0}[lightgray] ダメージ bullet.damage = [stat]{0}[lightgray] ダメージ
bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ 約[stat] {1}[lightgray] タイル bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ 約[stat] {1}[lightgray] タイル
bullet.incendiary = [stat]焼夷弾 bullet.incendiary = [stat]焼夷弾
bullet.sapping = [stat]sapping bullet.sapping = [stat]吸収弾
bullet.homing = [stat]追尾弾 bullet.homing = [stat]追尾弾
bullet.shock = [stat]電撃 bullet.shock = [stat]電撃
bullet.frag = [stat]爆発弾 bullet.frag = [stat]爆発弾
@@ -817,7 +817,7 @@ setting.conveyorpathfinding.name = コンベアー配置経路探索
setting.sensitivity.name = 操作感度 setting.sensitivity.name = 操作感度
setting.saveinterval.name = 自動保存間隔 setting.saveinterval.name = 自動保存間隔
setting.seconds = {0} 秒 setting.seconds = {0} 秒
setting.milliseconds = {0} milliseconds setting.milliseconds = {0} ミリ秒
setting.fullscreen.name = フルスクリーン setting.fullscreen.name = フルスクリーン
setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります) setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります)
setting.fps.name = FPSを表示 setting.fps.name = FPSを表示
@@ -843,7 +843,7 @@ setting.bridgeopacity.name = ブリッジの透明度
setting.playerchat.name = ゲーム内にチャットを表示 setting.playerchat.name = ゲーム内にチャットを表示
setting.showweather.name = 天気のグラフィックを表示 setting.showweather.name = 天気のグラフィックを表示
public.confirm = ゲームを公開しますか?\n[accent]誰でもゲームに参加できるようになります。\n[lightgray]あとから設定で変更できます。 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 = ベータ版では使用できません。 public.beta = ベータ版では使用できません。
uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります... uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります...
uiscale.cancel = キャンセル & 終了 uiscale.cancel = キャンセル & 終了
@@ -918,7 +918,7 @@ keybind.toggle_menus.name = メニュー切り替え
keybind.chat_history_prev.name = 前のチャット履歴 keybind.chat_history_prev.name = 前のチャット履歴
keybind.chat_history_next.name = 次のチャット履歴 keybind.chat_history_next.name = 次のチャット履歴
keybind.chat_scroll.name = チャットスクロール keybind.chat_scroll.name = チャットスクロール
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = チャットモードの変更
keybind.drop_unit.name = ドロップユニット keybind.drop_unit.name = ドロップユニット
keybind.zoom_minimap.name = ミニマップのズーム keybind.zoom_minimap.name = ミニマップのズーム
mode.help.title = モード説明 mode.help.title = モード説明
@@ -926,7 +926,7 @@ mode.survival.name = サバイバル
mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵が出現する必要があります。 mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵が出現する必要があります。
mode.sandbox.name = サンドボックス mode.sandbox.name = サンドボックス
mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。 mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。
mode.editor.name = Editor mode.editor.name = エディター
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。 mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。
mode.attack.name = アタック mode.attack.name = アタック
@@ -1226,10 +1226,10 @@ block.command-center.name = 司令塔
block.ground-factory.name = 陸軍工場 block.ground-factory.name = 陸軍工場
block.air-factory.name = 空軍工場 block.air-factory.name = 空軍工場
block.naval-factory.name = 海軍工場 block.naval-factory.name = 海軍工場
block.additive-reconstructor.name = Additive Reconstructor block.additive-reconstructor.name = 加法式再構成工場
block.multiplicative-reconstructor.name = Multiplicative Reconstructor block.multiplicative-reconstructor.name = 乗法式再構成工場
block.exponential-reconstructor.name = Exponential Reconstructor block.exponential-reconstructor.name = 指数式再構成工場
block.tetrative-reconstructor.name = Tetrative Reconstructor block.tetrative-reconstructor.name = 超冪式再構成工場
block.payload-conveyor.name = マスコンベアー block.payload-conveyor.name = マスコンベアー
block.payload-router.name = ペイロードルーター block.payload-router.name = ペイロードルーター
block.disassembler.name = ディスアセンブラー block.disassembler.name = ディスアセンブラー
@@ -1259,64 +1259,64 @@ team.green.name = グリーン
team.purple.name = パープル team.purple.name = パープル
hint.skip = スキップ hint.skip = スキップ
hint.desktopMove = Use [accent][[WASD][] to move. hint.desktopMove = [accent][[WASD][] を使い移動します。
hint.zoom = [accent]Scroll[] to zoom in or out. hint.zoom = [accent]マウスホイール[] でズームイン、ズームアウトをします。
hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually. hint.mine = \uf8c4 銅の近くに移動し、 [accent]タップ[] して手動で採掘します。
hint.desktopShoot = [accent][[Left-click][] to shoot. hint.desktopShoot = [accent][[左クリック][] で射撃します。
hint.depositItems = To transfer items, drag from your ship to the core. hint.depositItems = アイテムを移すには、シップからコアへドラッグします。
hint.respawn = To respawn as a ship, press [accent][[V][]. hint.respawn = シップとしてリスポーンするには、 [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.respawn.mobile = ユニット/建造物のコントロールを得ました。シップとしてリスポーンするには、 [accent]左上のアイコンをタップします。[]
hint.desktopPause = Press [accent][[Space][] to pause and unpause the game. hint.desktopPause = [accent][[スペース][] を押して、ゲームを一時停止と一時停止の解除ができます。
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 = 右下のメニューの \ue85e [accent]ドリル[] タブを選択し、 \uf870 [accent]ドリル[] を選択し、銅地域をクリックして配置します。
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.placeDrill.mobile = 右下のメニューの \ue85e [accent]ドリル[] タブを選択し、 \uf870 [accent]ドリル[] を選択し、銅地域をタップして配置します。\n\n右下の \ue800 [accent]チェックマーク[] をタップして確認します。
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 = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。 \ue814 [accent]運搬[] タブから、 \uf896 [accent]コンベアー[] を選択します。\n\n複数のコンベアーを配置するには、クリックしてドラッグします。\n[accent]マウスホイール[] により回転します。
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.placeConveyor.mobile = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。 \ue814 [accent]運搬[] タブから、 \uf896 [accent]コンベアー[] を選択します。\n\n指を秒間押したままドラッグすると、複数のコンベアーを配置します。
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.placeTurret = \uf861 [accent]ターレット[] を配置して、敵から基地を守ります。\n\nターレットには弾薬が必要です。この場合は \uf838銅です。\nコンベアーとドリルを使用して補給します。
hint.breaking = [accent]Right-click[] and drag to break blocks. hint.breaking = [accent]右クリック[] と右クリックドラッグによりブロックを壊します。
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.breaking.mobile = 右下にある \ue817 [accent]ハンマー[] をアクティブにして、タップしてブロックを壊します。\n\n指を秒間押したままドラッグすると、範囲選択が出来ます。
hint.research = Use the \ue875 [accent]Research[] button to research new technology. hint.research = \ue875 [accent]研究[] ボタンを押して、新しいテクノロジーを研究します。
hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology. hint.research.mobile = \ue88c [accent]メニュー[] の \ue875 [accent]研究[] ボタンを押して、新しいテクノロジーを研究します。
hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. hint.unitControl = [accent][[ctrl][] を押しながら [accent]クリック[] するとターレットや味方ユニットを操作できます。
hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets. hint.unitControl.mobile = [accent][ダブルタップ[] すると味方ユニットやターレットを操作できます。
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 = 十分な資源を確保できたら、右下の \ue827 [accent]マップ[] から、近くのセクターを選択して [accent]発射[] できます。
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.launch.mobile = 十分な資源を確保できたら、 \ue88c [accent]メニュー[] の \ue827 [accent]マップ[] から、近くのセクターを選択して [accent]発射[] できます。
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.schematicSelect = [accent][[F][] を押しながらドラッグして、コピー&ペーストするブロックを選択します。\n\n[accent][[ミドルクリック][] により、1つのブロックタイプをコピーします。
hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path. hint.conveyorPathfind = [accent][[-Ctrl][] を押しながらコンベアーをドラッグすると、経路が自動生成されます。
hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path. hint.conveyorPathfind.mobile = \ue844 [accent]対角線モード[] を有効にし、コンベアーをドラッグすると経路が自動生成します。
hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters. hint.boost = [accent][[左シフト][] を押したままにすると、操作中のユニットは障害物を飛び越えます。\n\n少数の地上ユニットのみがこのブースターを搭載しています。
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 = [accent][[G][] を押して、近くの [accent]同様のタイプ[] のユニットと編隊を組みます。\n\n地上ユニットを指揮するには、まず別個の地上ユニットをコントロールする必要があります。
hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation. hint.command.mobile = [accent][[ダブルタップ][] すると、操作中のユニットは近くのユニットと編隊を組みます。
hint.payloadPickup = Press [accent][[[] to pick up small blocks or units. hint.payloadPickup = [accent][[[] を押して、小さなブロックまたはユニットを格納します。
hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up. hint.payloadPickup.mobile = [accent]タップ&ホールド[] により、小さなブロックまたはユニットを格納します。
hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop = [accent]][] を押すと、積載物を降ろします。
hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.payloadDrop.mobile = 空いている場所を [accent]タップ&ホールド[] して、積載物を降ろします。
hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. hint.waveFire = [accent]ウェーブ[] ターレットは水を搬入すると、近くの火を自動的に消火します。
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.generator = \uf879 [accent]火力発電機[] 石炭を燃やし、隣接するブロックに電力を供給します。\n\n電力供給範囲は \uf87f [accent]電源ノード[]で拡張できます。
hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. hint.guardian = [accent]ガーディアン[] ユニットは装甲を搭載しています。[accent]銅[] や [accent]鉛[] などの弱い弾薬は [scarlet]効果がありません[]\n\n強力なターレット、または \uf861デュオ/\uf859サルボー の弾薬に \uf835 [accent]黒鉛[]を使用してガーディアンを撃破してください。
hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the  [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]\n\n  [accent]シャード[] コアの上に、  [accent]ファンデーション[] コアを置きます。近くに障害物がないことを確認してください。
hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[]. hint.presetLaunch = [accent]フローズン · フォレスト[] などの灰色の [accent]着陸ゾーンセクター[] には、どこからでも発射できます。近くの領土を確保する必要はありません。\n\nこのような [accent]数字のセクター[] は、 [accent]違います[]
hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず [accent]破棄[]されます。
hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは [accent]あなたのセクター[] に移送されます。\n\nホストが行った新しい研究も引き継がれます。
item.copper.description = 便利な鉱石です。様々なブロックの材料として幅広く使われています。 item.copper.description = 便利な鉱石です。様々なブロックの材料として幅広く使われています。
item.copper.details = セルプロに豊富な金属。補強しない限り構造的に弱い。 item.copper.details = セルプロに豊富な金属。補強しない限り構造的に弱い。
item.lead.description = 一般的で手軽な鉱石です。機械や液体輸送ブロックなどに使われます。 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.metaglass.description = とても頑丈な強化ガラスです。液体の輸送やタンクとして幅広く使われています。
item.graphite.description = 弾薬や絶縁体として利用されています。 item.graphite.description = 弾薬や絶縁体として利用されています。
item.sand.description = 合金や融剤など広く使用されている一般的な材料です。 item.sand.description = 合金や融剤など広く使用されている一般的な材料です。
item.coal.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.titanium.description = 希少で非常に軽量な金属です。液体輸送やドリル、航空機などで使われます。
item.thorium.description = 放射性を持つ高密度な金属です。建造物の支えや核燃料として使われます。 item.thorium.description = 放射性を持つ高密度な金属です。建造物の支えや核燃料として使われます。
item.scrap.description = 昔の建造物やユニットの残骸です。様々な種類の金属が微量に含まれています。 item.scrap.description = 昔の建造物やユニットの残骸です。様々な種類の金属が微量に含まれています。
item.scrap.details = Leftover remnants of old structures and units. item.scrap.details = 古い建造物やユニットの残骸です。
item.silicon.description = 非常に有用な半導体でソーラーパネルや多くの複雑な機械に応用できます。 item.silicon.description = 非常に有用な半導体でソーラーパネルや多くの複雑な機械に応用できます。
item.plastanium.description = 軽量で伸縮性のある材料です。高度な航空機や分散型の弾薬として使用されます。 item.plastanium.description = 軽量で伸縮性のある材料です。高度な航空機や分散型の弾薬として使用されます。
item.phase-fabric.description = 極めて軽量な素材です。高度な機械や自己修復技術に使用されます。 item.phase-fabric.description = 極めて軽量な素材です。高度な機械や自己修復技術に使用されます。
item.surge-alloy.description = 電気的特性を持った高度な合金です。 item.surge-alloy.description = 電気的特性を持った高度な合金です。
item.spore-pod.description = 石油や爆薬、燃料への転換として使用されます。 item.spore-pod.description = 石油や爆薬、燃料への転換として使用されます。
item.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.blast-compound.description = 爆弾や爆発物に使われる不安定な化合物です。胞子と揮発性物質から合成されます。燃料として燃やすこともできますが、お勧めしません。
item.pyratite.description = 焼夷兵器などに使われる非常に燃えやすい物質です。 item.pyratite.description = 焼夷兵器などに使われる非常に燃えやすい物質です。
@@ -1379,7 +1379,7 @@ block.phase-conveyor.description = 改良されたアイテム転送ブロック
block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。 block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。
block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出されます。他のアイテムが搬入されるとアイテムを通過させます。通常のルーターと反対の動作をします。 block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出されます。他のアイテムが搬入されるとアイテムを通過させます。通常のルーターと反対の動作をします。
block.router.description = 搬入したアイテムをほかの3方向に均等に搬出します。一つの資源から複数に分ける際などに使われます。 block.router.description = 搬入したアイテムをほかの3方向に均等に搬出します。一つの資源から複数に分ける際などに使われます。
block.router.details = 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.distributor.description = 高度なルーターです。搬入したアイテムをほかの7方向に均等に分けて搬出します。
block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合に左右にアイテムを搬出します。 block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合に左右にアイテムを搬出します。
block.underflow-gate.description = オーバーフローゲートの反対の機能を持ちます。 左右に出力できない場合、前面に出力します。 block.underflow-gate.description = オーバーフローゲートの反対の機能を持ちます。 左右に出力できない場合、前面に出力します。
@@ -1416,14 +1416,14 @@ block.laser-drill.description = 電力を使用したレーザー技術でより
block.blast-drill.description = 上位のドリルです。大量の電力が必要になります。 block.blast-drill.description = 上位のドリルです。大量の電力が必要になります。
block.water-extractor.description = 地面から水を汲み上げます。近くに湖がない場合に有用です。 block.water-extractor.description = 地面から水を汲み上げます。近くに湖がない場合に有用です。
block.cultivator.description = 胞子の小さな集まりを工業用ポッドに培養します。 block.cultivator.description = 胞子の小さな集まりを工業用ポッドに培養します。
block.cultivator.details = 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.oil-extractor.description = 大量の電力を使用して、砂から石油を回収します。近くに油田がない場合に有用です。
block.core-shard.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.description = バージョンアップしたコアです。より堅く、より多くの資源を格納できます。
block.core-foundation.details = The second iteration. block.core-foundation.details = 2番目のバージョンです。
block.core-nucleus.description = さらにバージョンアップしたコアです。優れた耐久性と大量の資源を格納できます。 block.core-nucleus.description = さらにバージョンアップしたコアです。優れた耐久性と大量の資源を格納できます。
block.core-nucleus.details = The third and final iteration. block.core-nucleus.details = 3番目で最終バージョンです。
block.vault.description = 各種類のアイテムを大量に保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。[lightgray]搬出機[]を使って、ボールトからアイテムを搬出できます。 block.vault.description = 各種類のアイテムを大量に保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。[lightgray]搬出機[]を使って、ボールトからアイテムを搬出できます。
block.container.description = 各種類のアイテムを少量ずつ保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。 [lightgray]搬出機[]を使って、コンテナーからアイテムを搬出できます。 block.container.description = 各種類のアイテムを少量ずつ保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。 [lightgray]搬出機[]を使って、コンテナーからアイテムを搬出できます。
block.unloader.description = コンテナやボールト、コアからアイテムをコンベアーか隣接するブロックに搬出します。搬出機をタップして搬出するアイテムを変更することができます。 block.unloader.description = コンテナやボールト、コアからアイテムをコンベアーか隣接するブロックに搬出します。搬出機をタップして搬出するアイテムを変更することができます。
@@ -1470,36 +1470,36 @@ block.logic-display.description = プロセッサからの任意のグラフィ
block.large-logic-display.description = プロセッサからの任意のグラフィックを表示します。 block.large-logic-display.description = プロセッサからの任意のグラフィックを表示します。
block.interplanetary-accelerator.description = 巨大な電磁レールガンタワーです。別惑星への展開のためにコアを重力圏脱出可能速度まで加速します。 block.interplanetary-accelerator.description = 巨大な電磁レールガンタワーです。別惑星への展開のためにコアを重力圏脱出可能速度まで加速します。
unit.dagger.description = Fires standard bullets at all nearby enemies. unit.dagger.description = 近くの敵に標準的な弾丸を発射します。
unit.mace.description = Fires streams of flame at all nearby enemies. unit.mace.description = 近くの敵に火炎放射を発射します。
unit.fortress.description = Fires long-range artillery at ground targets. unit.fortress.description = 地上目標に長距離砲を発射します。
unit.scepter.description = Fires a barrage of charged bullets at all nearby enemies. unit.scepter.description = 近くの敵に電撃弾を発射します。
unit.reign.description = Fires a barrage of massive piercing bullets at all nearby enemies. unit.reign.description = 近くの敵に大口径の貫通弾を発射します。
unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight. unit.nova.description = 敵にダメージを与え、味方の建造物を修復する光線を発射します。飛行可能。
unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight. unit.pulsar.description = 敵にダメージを与え、味方の建造物を修復する電撃攻撃を行います。飛行可能。
unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded. unit.quasar.description = 敵にダメージを与え、味方の建造物を修復するレーザー弾を発射します。飛行可能。シールド形成。
unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight. unit.vela.description = 敵にダメージを与え、火災を引き起こし、味方の建造物を修復するレーザー焼夷弾を発射します。飛行可能。
unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain. unit.corvus.description = 敵にダメージを与え、味方の建造物を修復する大火力のレーザー弾を発射します。ほとんどの地形を無視できます。
unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion. unit.crawler.description = 敵に向かって走り自爆し、大爆発を起こす。
unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain. unit.atrax.description = 地上目標を消耗させるスラグ弾を発射します。ほとんどの地形を無視できます。
unit.spiroct.description = Fires sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. unit.spiroct.description = 敵に吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。
unit.arkyid.description = Fires large sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. unit.arkyid.description = 敵に大口径の吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。
unit.toxopid.description = Fires large electric cluster-shells and piercing lasers at enemies. Can step over most terrain. unit.toxopid.description = 敵に大口径の電撃クラスターシェルと貫通レーザーを発射します。ほとんどの地形を無視できます。
unit.flare.description = Fires standard bullets at nearby ground targets. unit.flare.description = 近くの地上目標に標準的な弾丸を発射します。
unit.horizon.description = Drops clusters of bombs on ground targets. unit.horizon.description = 地上目標にクラスター爆弾を投下します。
unit.zenith.description = Fires salvos of missiles at all nearby enemies. unit.zenith.description = 近くの敵にミサイルを一斉発射します。
unit.antumbra.description = Fires a barrage of bullets at all nearby enemies. unit.antumbra.description = 近くの敵に弾幕のように弾丸を連射します。
unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies. unit.eclipse.description = 近くの敵に2門の貫通レーザーと高射砲の弾幕を発射します。
unit.mono.description = Automatically mines copper and lead, depositing it into the core. unit.mono.description = 銅と鉛を自動的に採掘し、コアに移送します。
unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction. unit.poly.description = 破壊された建造物を自動的に再構築し、さらに建設の支援を行います。
unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units. unit.mega.description = 損傷した建造物を自動的に修復します。小型のブロックと地上ユニットを運搬できます。
unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units. unit.quad.description = 地上目標に大型爆弾を投下し、味方の建造物は修復し、敵にはダメージを与えます。中型の地上ユニットを運搬できます。
unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units. unit.oct.description = シールド形成と修復を行い、付近の味方を守ります。ほとんどの地上ユニットを運搬できます。
unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies. unit.risso.description = 近くの敵にミサイルと弾丸の弾幕を発射します。
unit.minke.description = Fires shells and standard bullets at nearby ground targets. unit.minke.description = 近くの地上目標に砲弾と標準的な弾丸を発射します。
unit.bryde.description = Fires long-range artillery shells and missiles at enemies. unit.bryde.description = 敵に長距離砲弾とミサイルを発射します。
unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies. unit.sei.description = 敵にミサイルと徹甲弾の弾幕を発射します。
unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units. unit.omura.description = 敵に長距離かつ貫通性能を持つレールガンボルトを発射します。フレアユニットを生産します。
unit.alpha.description = Defends the Shard core from enemies. Builds structures. unit.alpha.description = シャードコアを敵から守ります。建造物を建築します。
unit.beta.description = Defends the Foundation core from enemies. Builds structures. unit.beta.description = ファンデーションコアを敵から守ります。建造物を建築します。
unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. unit.gamma.description = ニュークリアスコアを敵から守ります。建造物を建築します。

View File

@@ -9,7 +9,7 @@ link.changelog.description = 업데이트 내용 목록
link.dev-builds.description = 불안정한 개발 버전 link.dev-builds.description = 불안정한 개발 버전
link.trello.description = 출시 예정 기능 계획을 게시한 공식 Trello 보드 link.trello.description = 출시 예정 기능 계획을 게시한 공식 Trello 보드
link.itch.io.description = PC 다운로드가 있는 itch.io 페이지 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.f-droid.description = F-Droid 카탈로그 목록
link.wiki.description = 공식 Mindustry 위키 link.wiki.description = 공식 Mindustry 위키
link.suggestions.description = 새 기능 제안하기 link.suggestions.description = 새 기능 제안하기
@@ -67,6 +67,14 @@ schematic.delete.confirm = 이 설계도는 완전히 삭제될 것입니다.
schematic.rename = 설계도 이름 바꾸기 schematic.rename = 설계도 이름 바꾸기
schematic.info = {0}x{1}, {2} 블록 schematic.info = {0}x{1}, {2} 블록
schematic.disabled = [scarlet]설계도 비활성화됨[]\n이 [accent]맵[] 또는 [accent]서버[] 에서는 설계도를 사용할 수 없습니다. schematic.disabled = [scarlet]설계도 비활성화됨[]\n이 [accent]맵[] 또는 [accent]서버[] 에서는 설계도를 사용할 수 없습니다.
schematic.tags = 태그:
schematic.edittags = 태그 수정하기
schematic.addtag = 태그 추가하기
schematic.texttag = 텍스트 태그
schematic.icontag = 아이콘 태그
schematic.renametag = 태그 이름바꾸기
schematic.tagdelconfirm = 이 태그를 완전히 삭제하시겠습니까?
schematic.tagexists = 이 태그는 이미 존재합니다.
stats = 전투 결과 stats = 전투 결과
stat.wave = 패배한 단계:[accent] {0} stat.wave = 패배한 단계:[accent] {0}
@@ -306,7 +314,6 @@ data.exported = 데이터를 내보냈습니다.
data.invalid = 유효한 게임 데이터가 아닙니다. data.invalid = 유효한 게임 데이터가 아닙니다.
data.import.confirm = 외부 데이터를 가져오면 현재 게임 데이터를 [scarlet]모두[] 덮어쓰게 됩니다.\n[accent]이 작업은 취소할 수 없습니다![]\n\n데이터를 가져오면 게임이 즉시 종료됩니다. data.import.confirm = 외부 데이터를 가져오면 현재 게임 데이터를 [scarlet]모두[] 덮어쓰게 됩니다.\n[accent]이 작업은 취소할 수 없습니다![]\n\n데이터를 가져오면 게임이 즉시 종료됩니다.
quit.confirm = 정말로 종료하시겠습니까? quit.confirm = 정말로 종료하시겠습니까?
quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은[accent]설정->게임->튜토리얼[]에서 다시 하실 수 있습니다.
loading = [accent]불러오는중... loading = [accent]불러오는중...
reloading = [accent]모드 새로고침하는중... reloading = [accent]모드 새로고침하는중...
saving = [accent]저장중... saving = [accent]저장중...
@@ -477,6 +484,7 @@ filter.option.circle-scale = 원 크기
filter.option.octaves = 옥타브 filter.option.octaves = 옥타브
filter.option.falloff = 경사 filter.option.falloff = 경사
filter.option.angle = 각도 filter.option.angle = 각도
filter.option.rotate = 방향
filter.option.amount = 개수 filter.option.amount = 개수
filter.option.block = 블록 filter.option.block = 블록
filter.option.floor = 타일 filter.option.floor = 타일
@@ -498,6 +506,7 @@ load = 불러오기
save = 저장하기 save = 저장하기
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = 언어 설정을 적용하려면 게임을 다시 시작하세요. language.restart = 언어 설정을 적용하려면 게임을 다시 시작하세요.
@@ -530,7 +539,7 @@ launch.from = 출격 출발지 : [accent]{0}
launch.destination = 목적지: {0} launch.destination = 목적지: {0}
configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다.
add = 추가... add = 추가...
boss.health = 수호자 체력 guardian = 수호자
connectfail = [scarlet]연결 오류:\n\n[accent]{0} connectfail = [scarlet]연결 오류:\n\n[accent]{0}
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
@@ -574,6 +583,7 @@ sector.attacked = [accent]{0}[white] 지역이 공격받고 있습니다!
sector.lost = [accent]{0}[white] 지역을 잃었습니다! sector.lost = [accent]{0}[white] 지역을 잃었습니다!
#note: the missing space in the line below is intentional #note: the missing space in the line below is intentional
sector.captured = [accent]{0}[white] 지역을 점령했습니다! sector.captured = [accent]{0}[white] 지역을 점령했습니다!
sector.changeicon = 아이콘 바꾸기
threat.low = 낮음 threat.low = 낮음
threat.medium = 높지 않지만 낮지도 않음 threat.medium = 높지 않지만 낮지도 않음
@@ -626,11 +636,12 @@ status.wet.name = 젖음
status.muddy.name = 질척해짐 status.muddy.name = 질척해짐
status.melting.name = 융해 status.melting.name = 융해
status.sapped.name = 흡혈됨 status.sapped.name = 흡혈됨
status.spore-slowed.name = 포자 느려짐 status.electrified.name = 과전류
status.tarred.name = Tarred status.spore-slowed.name = 포자감속
status.tarred.name = 타르화
status.overclock.name = 과부하 status.overclock.name = 과부하
status.shocked.name = 충격 status.shocked.name = 감전
status.blasted.name = 폭파됨 status.blasted.name = 파열
status.unmoving.name = 멈춤 status.unmoving.name = 멈춤
settings.language = 언어 settings.language = 언어
@@ -654,6 +665,7 @@ settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠
paused = [accent]< 일시정지 > paused = [accent]< 일시정지 >
clear = 초기화 clear = 초기화
banned = [scarlet]금지됨 banned = [scarlet]금지됨
unsupported.environment = [scarlet]지원되지 않는 환경
yes = O yes = O
no = X no = X
info.title = 정보 info.title = 정보
@@ -668,7 +680,7 @@ stat.input = 입력
stat.output = 출력 stat.output = 출력
stat.booster = 가속 stat.booster = 가속
stat.tiles = 필요한 타일 stat.tiles = 필요한 타일
stat.affinities = 친화력 stat.affinities = 작용 가능
stat.opposites = 상성 stat.opposites = 상성
stat.powercapacity = 전력 용량 stat.powercapacity = 전력 용량
stat.powershot = 전력/발 stat.powershot = 전력/발
@@ -692,6 +704,7 @@ stat.memorycapacity = 변수 용량
stat.basepowergeneration = 기본 전력 발전량 stat.basepowergeneration = 기본 전력 발전량
stat.productiontime = 소요 시간 stat.productiontime = 소요 시간
stat.repairtime = 건물 완전 수리 시간 stat.repairtime = 건물 완전 수리 시간
stat.repairspeed = 수리 속도
stat.weapons = 무기 stat.weapons = 무기
stat.bullet = 탄환 stat.bullet = 탄환
stat.speedincrease = 속도 증가 stat.speedincrease = 속도 증가
@@ -706,7 +719,7 @@ stat.buildtime = 건설 시간
stat.maxconsecutive = 최대 체인 stat.maxconsecutive = 최대 체인
stat.buildcost = 건설 비용 stat.buildcost = 건설 비용
stat.inaccuracy = 오차각 stat.inaccuracy = 오차각
#stat.shots = 발사 수 (안쓰임) stat.shots = 발사 수
stat.reload = 초당 발사 수 stat.reload = 초당 발사 수
stat.ammo = 탄약 stat.ammo = 탄약
stat.shieldhealth = 보호막 체력 stat.shieldhealth = 보호막 체력
@@ -717,7 +730,7 @@ stat.lightningchance = 전격 확률
stat.lightningdamage = 전격 피해량 stat.lightningdamage = 전격 피해량
stat.flammability = 인화성 stat.flammability = 인화성
stat.radioactivity = 방사성 stat.radioactivity = 방사성
stat.charge = 과충전 stat.charge=과충전
stat.heatcapacity = 열 용량 stat.heatcapacity = 열 용량
stat.viscosity = 점성 stat.viscosity = 점성
stat.temperature = 온도 stat.temperature = 온도
@@ -736,14 +749,16 @@ stat.healthmultiplier = 체력 배수
stat.speedmultiplier = 이동속도 배수 stat.speedmultiplier = 이동속도 배수
stat.reloadmultiplier = 재장전 배수 stat.reloadmultiplier = 재장전 배수
stat.buildspeedmultiplier = 건설속도 배수 stat.buildspeedmultiplier = 건설속도 배수
stat.reactive = 반응성 stat.reactive = 작용 받음
stat.healing = 회복량
ability.forcefield = 보호막 필드 ability.forcefield = 보호막 필드
ability.repairfield = 수리 필드 ability.repairfield = 수리 필드
ability.statusfield = 상태이상 필드 ability.statusfield = {0} 상태이상 필드
ability.unitspawn = {0} 공장 ability.unitspawn = {0} 공장
ability.shieldregenfield = 방어막 복구 필드 ability.shieldregenfield = 방어막 복구 필드
ability.movelightning = 가속 전격 ability.movelightning = 가속 전격
ability.energyfield = 에너지 필드: [accent]{1}[]타일 내 [accent]{2}[]개 목표물에게 [accent]{0}[]피해량
bar.drilltierreq = 더 좋은 드릴 필요 bar.drilltierreq = 더 좋은 드릴 필요
bar.noresources = 자원 부족 bar.noresources = 자원 부족
@@ -766,6 +781,7 @@ bar.power = 전력
bar.progress = 건설 진행도 bar.progress = 건설 진행도
bar.input = 입력 bar.input = 입력
bar.output = 출력 bar.output = 출력
bar.strength = [stat]{0}[lightgray]x 치료 속도
units.processorcontrol = [lightgray]프로세서 제어됨 units.processorcontrol = [lightgray]프로세서 제어됨
@@ -974,6 +990,7 @@ rules.wavetimer = 시간 제한이 있는 단계
rules.waves = 단계 rules.waves = 단계
rules.attack = 공격 모드 rules.attack = 공격 모드
rules.buildai = AI 건설 rules.buildai = AI 건설
rules.corecapture = 코어 파괴 시 점령
rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.enemyCheat = 무한 AI (빨간팀) 자원
rules.blockhealthmultiplier = 블록 체력 배수 rules.blockhealthmultiplier = 블록 체력 배수
rules.blockdamagemultiplier = 블록 공격력 배수 rules.blockdamagemultiplier = 블록 공격력 배수
@@ -1029,6 +1046,7 @@ item.blast-compound.name = 폭발물
item.pyratite.name = 파이라타이트 item.pyratite.name = 파이라타이트
item.metaglass.name = 강화 유리 item.metaglass.name = 강화 유리
item.scrap.name = 고철 item.scrap.name = 고철
liquid.water.name = liquid.water.name =
liquid.slag.name = 광재 liquid.slag.name = 광재
liquid.oil.name = 석유 liquid.oil.name = 석유
@@ -1060,6 +1078,11 @@ unit.minke.name = 민케
unit.bryde.name = 브라이드 unit.bryde.name = 브라이드
unit.sei.name = 세이 unit.sei.name = 세이
unit.omura.name = 오무라 unit.omura.name = 오무라
unit.retusa.name = 레투사
unit.oxynoe.name = 옥시노
unit.cyerce.name = 사이어스
unit.aegires.name = 에어리어스
unit.navanax.name = 나바낙스
unit.alpha.name = 알파 unit.alpha.name = 알파
unit.beta.name = 베타 unit.beta.name = 베타
unit.gamma.name = 감마 unit.gamma.name = 감마
@@ -1122,6 +1145,7 @@ block.char.name = 숯
block.dacite.name = 석영안산암 block.dacite.name = 석영안산암
block.dacite-wall.name = 석영안산암 벽 block.dacite-wall.name = 석영안산암 벽
block.dacite-boulder.name = 석영안산암 block.dacite-boulder.name = 석영안산암
block.rhyolite.name = 유문암
block.ice-snow.name = 얼음눈 block.ice-snow.name = 얼음눈
block.stone-wall.name = 돌 벽 block.stone-wall.name = 돌 벽
block.ice-wall.name = 얼음 벽 block.ice-wall.name = 얼음 벽
@@ -1227,6 +1251,7 @@ block.solar-panel.name = 태양 전지판
block.solar-panel-large.name = 대형 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판
block.oil-extractor.name = 석유 추출기 block.oil-extractor.name = 석유 추출기
block.repair-point.name = 수리 지점 block.repair-point.name = 수리 지점
block.repair-turret.name = 수리 포탑
block.pulse-conduit.name = 펄스 파이프 block.pulse-conduit.name = 펄스 파이프
block.plated-conduit.name = 도금된 파이프 block.plated-conduit.name = 도금된 파이프
block.phase-conduit.name = 메타 파이프 block.phase-conduit.name = 메타 파이프
@@ -1269,6 +1294,12 @@ block.exponential-reconstructor.name = 재구성기 : Exponential
block.tetrative-reconstructor.name = 재구성기 : Tetrative block.tetrative-reconstructor.name = 재구성기 : Tetrative
block.payload-conveyor.name = 화물 컨베이어 block.payload-conveyor.name = 화물 컨베이어
block.payload-router.name = 화물 분배기 block.payload-router.name = 화물 분배기
block.duct.name = 도관
block.duct-router.name = 도관 분배기
block.duct-bridge.name = 도관 다리
block.payload-propulsion-tower.name = 화물 추진탑
block.payload-void.name = 화물 소멸기
block.payload-source.name = 화물 공급기
block.disassembler.name = 광재 분해기 block.disassembler.name = 광재 분해기
block.silicon-crucible.name = 실리콘 도가니 block.silicon-crucible.name = 실리콘 도가니
block.overdrive-dome.name = 대형 과부하 프로젝터 block.overdrive-dome.name = 대형 과부하 프로젝터
@@ -1290,7 +1321,6 @@ block.memory-bank.name = 메모리 보관소
team.blue.name = 파랑색 팀 team.blue.name = 파랑색 팀
team.crux.name = 빨강색 팀 team.crux.name = 빨강색 팀
team.sharded.name = 주황색 팀 team.sharded.name = 주황색 팀
team.orange.name = 주황색 팀
team.derelict.name = 버려진 팀 team.derelict.name = 버려진 팀
team.green.name = 초록색 팀 team.green.name = 초록색 팀
team.purple.name = 보라색 팀 team.purple.name = 보라색 팀
@@ -1311,6 +1341,7 @@ hint.placeConveyor.mobile = 컨베이어는 자원을 드릴에서 다른 블록
hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[]를 설치하십시오.\n\n포탑 탄약 필요 - 지금은 \uf838 구리가 필요합니다.\n컨베이어를 사용해 드릴에 구리를 공급하십시오. hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[]를 설치하십시오.\n\n포탑 탄약 필요 - 지금은 \uf838 구리가 필요합니다.\n컨베이어를 사용해 드릴에 구리를 공급하십시오.
hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오. hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오.
hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오. hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오.
hint.blockInfo = [accent]건설 메뉴[]에서 블록을 선택해서 정보를 보십시오, 그다음 오른쪽의 [accent][[?][] 버튼을 선택하십시오.
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오. hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오. hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오. hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오.
@@ -1344,7 +1375,7 @@ item.graphite.description = 탄약 및 전기 부품에 사용되는 무기질
item.sand.description = 제련에서 합금 또는 플럭스에서 광범위하게 사용되는 일반적인 재료. item.sand.description = 제련에서 합금 또는 플럭스에서 광범위하게 사용되는 일반적인 재료.
item.coal.description = 화석화된 식물 물질. 씨앗이 나오기 훨씬 전에 형성되었습니다. 연료 및 자원 생산에 광범위하게 사용됩니다. item.coal.description = 화석화된 식물 물질. 씨앗이 나오기 훨씬 전에 형성되었습니다. 연료 및 자원 생산에 광범위하게 사용됩니다.
item.coal.details = 발화 작용 이전, 오래전에 생성된 화석화 작용을 거친 식물체로 보입니다. item.coal.details = 발화 작용 이전, 오래전에 생성된 화석화 작용을 거친 식물체로 보입니다.
item.titanium.description = 액체 수송, 드릴이나 항공기에 광범위하게 사용되는 희귀 초경량 금속. item.titanium.description = 액체 수송, 드릴이나 공장에 광범위하게 사용되는 희귀 초경량 금속.
item.thorium.description = 구조적 지지 및 핵연료로 사용되는 고밀도의 방사성 금속. item.thorium.description = 구조적 지지 및 핵연료로 사용되는 고밀도의 방사성 금속.
item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다. item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다.
item.scrap.details = 오래된 구조물과 유닛의 잔해. item.scrap.details = 오래된 구조물과 유닛의 잔해.
@@ -1565,7 +1596,7 @@ logic.nounitbuild = [red]유닛의 건물 로직은 여기서 허용되지 않
lenum.type = 건물/유닛의 타입\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다. lenum.type = 건물/유닛의 타입\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다.
lenum.shoot = 특정 위치에 발사 lenum.shoot = 특정 위치에 발사
lenum.shootp = 목표물 속도를 예측하여 발사 lenum.shootp = 목표물 속도를 예측하여 발사
lenum.configure = 필터의 아이템같은 건물의 설정 lenum.config = 필터의 아이템같은 건물의 설정
lenum.enabled = 블록의 활성 여부 lenum.enabled = 블록의 활성 여부
lenum.color = 조명 색 설정 lenum.color = 조명 색 설정
@@ -1573,6 +1604,7 @@ laccess.controller = 유닛 제어자. 프로세서가 제어하면, 프로세
laccess.dead = 유닛 또는 건물 사망/무효 여부 laccess.dead = 유닛 또는 건물 사망/무효 여부
laccess.controlled = 만약 유닛 제어자가 프로세서라면 [accent]@ctrlProcessor[]를 반환합니다.\n만약 유닛/건물 제어자가 플레이어라면 [accent]@ctrlPlayer[]를 반환합니다.\n만약 유닛이 다른 유닛에 의해 지휘되면(G키)[accent]@ctrlFormation[]를 반환합니다.\n그 외에는 0을 반환합니다. laccess.controlled = 만약 유닛 제어자가 프로세서라면 [accent]@ctrlProcessor[]를 반환합니다.\n만약 유닛/건물 제어자가 플레이어라면 [accent]@ctrlPlayer[]를 반환합니다.\n만약 유닛이 다른 유닛에 의해 지휘되면(G키)[accent]@ctrlFormation[]를 반환합니다.\n그 외에는 0을 반환합니다.
laccess.commanded = [red]이제 사용되지 않으며, 곧 제거될 예정입니다![]\n대신 [accent]controlled[]를 사용하세요. laccess.commanded = [red]이제 사용되지 않으며, 곧 제거될 예정입니다![]\n대신 [accent]controlled[]를 사용하세요.
laccess.progress = 작업 진행률, 0 에서 1 로 감.\n포탑 재장전이나 구조물 진행률을 반환합니다.
graphicstype.clear = 이 색으로 화면을 채우기 graphicstype.clear = 이 색으로 화면을 채우기
graphicstype.color = 아래 그래픽 실행문들의 색 설정하기 graphicstype.color = 아래 그래픽 실행문들의 색 설정하기
@@ -1604,9 +1636,15 @@ lenum.min = 두 수의 최솟값
lenum.max = 두 수의 최댓값 lenum.max = 두 수의 최댓값
lenum.angle = 벡터의 각(도) lenum.angle = 벡터의 각(도)
lenum.len = 벡터의 길이 lenum.len = 벡터의 길이
lenum.sin = 사인(도) lenum.sin = 사인(도)
lenum.cos = 코사인(도) lenum.cos = 코사인(도)
lenum.tan = 탄젠트(도) lenum.tan = 탄젠트(도)
lenum.asin = 각도상 아크 사인
lenum.acos = 각도상 아크 코사인
lenum.atan = 각도상 아크 탄젠트
#not a typo, look up 'range notation' #not a typo, look up 'range notation'
lenum.rand = 범위 내 십진법 난수[0 ~ 값) lenum.rand = 범위 내 십진법 난수[0 ~ 값)
lenum.log = 자연 로그(진수) lenum.log = 자연 로그(진수)
@@ -1683,11 +1721,11 @@ lenum.build = 구조물 건설
lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다. lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다.
lenum.within = 좌표 주변 유닛 발견 여부 lenum.within = 좌표 주변 유닛 발견 여부
lenum.boost = 이륙 시작/중단 lenum.boost = 이륙 시작/중단
#1665 줄 매칭 #1724 line matching / 줄 매칭
#-------------비공식 번역------------- #-------------비공식 번역-------------
#팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요. #팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요.
#심각한 노잼, 뇌절, 무례한 말들을 적지 말아주세요, 이는 목적이 어떠하든 공통적으로 적용됩니다(친근함 유도를 위한 평어 x). 다음 패치에 업데이트되어 그 언어를 쓰는 모든 유저가 보게 됩니다. #심각한 노잼, 뇌절, 무례한 말들을 적지 말아주세요, 이는 목적이 어떠하든 공통적으로 적용됩니다(친근함 유도를 위한 평어 x). 다음 패치에 업데이트되어 한국어를 쓰는 모든 유저가 보게 됩니다.
#양이 너무 많으면 사족을 더 붙이는걸 추천하지 않습니다. #양이 너무 많으면 사족을 더 붙이는걸 추천하지 않습니다.
#이 비공식 번역주는 공식 디테일이 추가되면 언제든지 삭제될 수 있습니다. #이 비공식 번역주는 공식 디테일이 추가되면 언제든지 삭제될 수 있습니다.
#비어있는 디테일은 아래 details가 전부이므로 추가 또는 삭제를 따로 안하셔도 됩니다. #비어있는 디테일은 아래 details가 전부이므로 추가 또는 삭제를 따로 안하셔도 됩니다.
@@ -1695,7 +1733,7 @@ lenum.boost = 이륙 시작/중단
#관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018 #관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018
#아이템 #아이템
item.metaglass.details = 쓰임세가 가장 적은 아이템 item.metaglass.details = [lightgray][비공식][]쓰임세가 가장 적은 아이템
item.graphite.details = item.graphite.details =
item.sand.details = item.sand.details =
item.titanium.details = item.titanium.details =
@@ -1704,14 +1742,14 @@ item.silicon.details =
item.plastanium.details = item.plastanium.details =
item.phase-fabric.details = item.phase-fabric.details =
item.surge-alloy.details = item.surge-alloy.details =
item.blast-compound.details = 화력 발전기에 넣어보세요. item.blast-compound.details = [lightgray][비공식][]화력 발전기에 넣어보세요.
item.pyratite.details = item.pyratite.details =
#액체 #액체
liquid.water.details = liquid.water.details =
liquid.slag.details = liquid.slag.details =
liquid.oil.details = liquid.oil.details =
liquid.cryofluid.details = 티타늄을 갈아서 물에 희석했다는 소문이 있다. liquid.cryofluid.details = [lightgray][비공식][]티타늄을 갈아서 물에 희석했다는 소문이 있다.
#블록 #블록
block.resupply-point.details = block.resupply-point.details =
@@ -1722,7 +1760,7 @@ block.graphite-press.details =
block.multi-press.details = block.multi-press.details =
block.silicon-smelter.details = block.silicon-smelter.details =
block.kiln.details = block.kiln.details =
block.plastanium-compressor.details = 석유를 정말 많이 먹는다. block.plastanium-compressor.details = [lightgray][비공식][]석유를 정말 많이 먹는다.
block.phase-weaver.details = block.phase-weaver.details =
block.alloy-smelter.details = block.alloy-smelter.details =
block.cryofluid-mixer.details = block.cryofluid-mixer.details =
@@ -1732,7 +1770,7 @@ block.melter.details =
block.separator.details = block.separator.details =
block.spore-press.details = block.spore-press.details =
block.pulverizer.details = block.pulverizer.details =
block.coal-centrifuge.details = 가성비가 매우 뛰어나다. block.coal-centrifuge.details = [lightgray][비공식][]가성비가 매우 뛰어나다.
block.incinerator.details = block.incinerator.details =
block.power-void.details = block.power-void.details =
block.power-source.details = block.power-source.details =
@@ -1763,14 +1801,14 @@ block.conveyor.details =
block.titanium-conveyor.details = block.titanium-conveyor.details =
block.plastanium-conveyor.details = block.plastanium-conveyor.details =
block.junction.details = block.junction.details =
block.bridge-conveyor.details = 티타늄 컨베이어보다 빠르다. block.bridge-conveyor.details = [lightgray][비공식][]티타늄 컨베이어보다 빠르다.
block.phase-conveyor.details = block.phase-conveyor.details =
block.sorter.details = 자원을 분류하여 주변 블록에 건내는 과정이 거의 한순간에 일어난다. block.sorter.details = [lightgray][비공식][]자원을 분류하여 주변 블록에 건내는 과정이 거의 한순간에 일어난다.
block.inverted-sorter.details = block.inverted-sorter.details =
block.distributor.details = block.distributor.details =
block.overflow-gate.details = block.overflow-gate.details =
block.underflow-gate.details = block.underflow-gate.details =
block.mass-driver.details = 발사할려면 최소 아이템 10개가 필요하다. block.mass-driver.details = [lightgray][비공식][]발사할려면 최소 아이템 10개가 필요하다.
block.mechanical-pump.details = block.mechanical-pump.details =
block.rotary-pump.details = block.rotary-pump.details =
block.thermal-pump.details = block.thermal-pump.details =
@@ -1803,7 +1841,6 @@ block.laser-drill.details =
block.blast-drill.details = block.blast-drill.details =
block.water-extractor.details = block.water-extractor.details =
block.cultivator.details = block.cultivator.details =
block.cultivator.details =
block.oil-extractor.details = block.oil-extractor.details =
block.vault.details = block.vault.details =
block.container.details = block.container.details =
@@ -1812,7 +1849,7 @@ block.launch-pad.details =
block.duo.details = block.duo.details =
block.scatter.details = block.scatter.details =
block.scorch.details = block.scorch.details =
block.hail.details = 일점사하면 립플보다 더 뛰어난 정확도와 연사력을 보여준다. block.hail.details = [lightgray][비공식][]일점사하면 립플보다 더 뛰어난 정확도와 연사력을 보여준다.
block.wave.details = block.wave.details =
block.lancer.details = block.lancer.details =
block.arc.details = block.arc.details =
@@ -1833,9 +1870,15 @@ block.disassembler.details =
block.overdrive-dome.details = block.overdrive-dome.details =
block.payload-conveyor.details = block.payload-conveyor.details =
block.payload-router.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.command-center.details =
block.ground-factory.details = block.ground-factory.details =
block.air-factory.details = 건설&연구 재료는 구리와 납뿐이지만, 정작 유닛을 생산할 땐 실리콘이 필요하다. block.air-factory.details = [lightgray][비공식][]건설&연구 재료는 구리와 납뿐이지만, 정작 유닛을 생산할 땐 실리콘이 필요하다.
block.naval-factory.details = block.naval-factory.details =
block.additive-reconstructor.details = block.additive-reconstructor.details =
block.multiplicative-reconstructor.details = block.multiplicative-reconstructor.details =
@@ -1852,7 +1895,7 @@ block.large-logic-display.details =
block.interplanetary-accelerator.details = block.interplanetary-accelerator.details =
#유닛 #유닛
unit.dagger.details = 이전에 디거란 이명으로 종교가 생겼었다. unit.dagger.details = [lightgray][비공식][]이전에 디거란 이명으로 종교가 생겼었다.
unit.mace.details = unit.mace.details =
unit.fortress.details = unit.fortress.details =
unit.scepter.details = unit.scepter.details =
@@ -1861,8 +1904,8 @@ unit.nova.details =
unit.pulsar.details = unit.pulsar.details =
unit.quasar.details = unit.quasar.details =
unit.vela.details = unit.vela.details =
unit.corvus.details = 정말 느리다. unit.corvus.details = [lightgray][비공식][]정말 느리다.
unit.crawler.details = 최근에 자폭 AI가 향상되면서 컨베이어로 자폭을 유도할 수 없게 되었다. unit.crawler.details = [lightgray][비공식][]최근에 자폭 AI가 향상되면서 컨베이어로 자폭을 유도할 수 없게 되었다. 분배기를 대신 쓰자.
unit.atrax.details = unit.atrax.details =
unit.spiroct.details = unit.spiroct.details =
unit.arkyid.details = unit.arkyid.details =
@@ -1877,11 +1920,16 @@ unit.poly.details =
unit.mega.details = unit.mega.details =
unit.quad.details = unit.quad.details =
unit.oct.details = unit.oct.details =
unit.risso.details = 뭉치면 연사력이 무시무시하다. unit.risso.details = [lightgray][비공식][]뭉치면 연사력이 무시무시하다.
unit.minke.details = unit.minke.details =
unit.bryde.details = unit.bryde.details =
unit.sei.details = unit.sei.details = [lightgray][비공식][]세이 sei!
unit.omura.details = 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.alpha.details =
unit.beta.details = unit.beta.details =
unit.gamma.details = unit.gamma.details =

View File

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

View File

@@ -126,6 +126,7 @@ mod.installed = [[Đã cài đặt]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Đã Bật mod.enabled = [lightgray]Đã Bật
mod.disabled = [scarlet]Đã Tắt mod.disabled = [scarlet]Đã Tắt
mod.multiplayer.compatible = [gray]Tương thích với chế độ nhiều người chơi
mod.disable = Tắt mod.disable = Tắt
mod.content = Nội dung: mod.content = Nội dung:
mod.delete.error = Không thể xóa mod. Tệp có thể đang được sử dụng. 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 = Tìm người chơi
trace.playername = Tên người chơi: [accent]{0} trace.playername = Tên người chơi: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = Unique ID: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = Mobile Client: [accent]{0} trace.mobile = Mobile Client: [accent]{0}
trace.modclient = Custom Client: [accent]{0} trace.modclient = Custom Client: [accent]{0}
invalidid = Client ID không hợp lệ! Vui lòng gửi báo cáo lỗi. 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.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal 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.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.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ì. 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.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. 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.language = Ngôn ngữ
settings.data = Dữ liệu trò chơi settings.data = Dữ liệu trò chơi
settings.reset = Khôi phục về mặc định 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.canboost = Nâng cấp
stat.flying = Bay stat.flying = Bay
stat.ammouse = Sử dụng đạn 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.forcefield = Tạo khiên
ability.repairfield = Sửa chữa/Xây dựng 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.damage = [stat]{0}[lightgray] sát thương
bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô
bullet.incendiary = [stat]cháy bullet.incendiary = [stat]cháy
bullet.sapping = [stat]sapping
bullet.homing = [stat]truy đuổi bullet.homing = [stat]truy đuổi
bullet.shock = [stat]sốc
bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối
bullet.frag = [stat]phá mảnh 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.knockback = [stat]{0}[lightgray] bật lùi
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
bullet.infinitepierce = [stat]xuyên thấu bullet.infinitepierce = [stat]xuyên thấu
bullet.healpercent = [stat]{0}[lightgray]% sửa chửa bullet.healpercent = [stat]{0}[lightgray]% sửa chửa
bullet.freezing = [stat]đóng băng
bullet.tarred = [stat]tarred
bullet.multiplier = [stat]{0}[lightgray]x lượng đạn bullet.multiplier = [stat]{0}[lightgray]x lượng đạn
bullet.reload = [stat]{0}[lightgray]x tốc độ bắ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.flow.name = Hiện thị tốc độ chuyền tài nguyên
setting.backgroundpause.name = Tạm dừng trong nền setting.backgroundpause.name = Tạm dừng trong nền
setting.buildautopause.name = Tự động dừng xây dựng setting.buildautopause.name = Tự động dừng xây dựng
setting.doubletapmine.name = Nhấn đúp để Đào
setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động
setting.animatedwater.name = Hiệu ứng nước setting.animatedwater.name = Hiệu ứng nước
setting.animatedshields.name = Hiệu ứng khiên setting.animatedshields.name = Hiệu ứng khiên
@@ -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.minimap.name = Bản đồ mini
keybind.planet_map.name = Bản đồ hành tinh keybind.planet_map.name = Bản đồ hành tinh
keybind.research.name = Nghiên cứu keybind.research.name = Nghiên cứu
keybind.block_info.name = Thông tin khối
keybind.chat.name = Trò chuyện keybind.chat.name = Trò chuyện
keybind.player_list.name = Danh sách người chơi keybind.player_list.name = Danh sách người chơi
keybind.console.name = Bảng điều khiển keybind.console.name = Bảng điều khiển
@@ -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.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần.
block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất. block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất.
block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động. block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động.
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. Ư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.repair-point.description = Liên tục sửa chữa robot ở trong phạm vi hoạt động.
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser. block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo. block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
@@ -1538,6 +1557,8 @@ lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around 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. 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.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.shoot = Bắn vào vị trí xác định.
lenum.shootp = Shoot at a unit/building with velocity prediction. 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. lenum.enabled = Bất cứ khi nào khối hoạt động.
laccess.color = Màu đèn chiếu sá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.clear = Tô màu cho màn hình.
graphicstype.color = Đặt màu cho thao tác vẽ tiếp theo. 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.cos = Cos, tính bằng độ.
lenum.tan = Tan, tính bằng độ. lenum.tan = Tan, tính bằng độ.
#not a typo, look up 'range notation' #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.log = Lôgarit tự nhiên (ln).
lenum.log10 = Lôgarit cơ số 10. lenum.log10 = Lôgarit cơ số 10.
lenum.noise = 2D simplex noise. lenum.noise = 2D simplex noise.
@@ -1638,6 +1663,7 @@ unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate. unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for. 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.stop = Dừng di chuyển/Đào/Xây dựng.
lenum.move = Di chuyển đến vị trí xác định. lenum.move = Di chuyển đến vị trí xác định.
lenum.approach = Approach a position with a radius. 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. */ /** URL to the JSON file containing all the BE servers. Only queried in BE. */
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL to the JSON file containing all the stable servers. */ /** 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.*/ /** URL of the github issue report template.*/
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
/** list of built-in servers.*/ /** list of built-in servers.*/

View File

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

View File

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

View File

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

View File

@@ -855,6 +855,7 @@ public class Fx{
if(Fire.regions[0] == null) return; if(Fire.regions[0] == null) return;
alpha(e.fout()); alpha(e.fout());
rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y); 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 -> { fire = new Effect(50f, e -> {
@@ -962,7 +963,7 @@ public class Fx{
}), }),
overdriven = new Effect(20f, e -> { overdriven = new Effect(20f, e -> {
color(Pal.accent); color(e.color);
randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> {
Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f); 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 -> { overclocked = new Effect(50f, e -> {
color(Pal.accent); color(e.color);
Fill.square(e.x, e.y, e.fslope() * 2f, 45f); 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(titaniumConveyor, Seq.with(new SectorComplete(craters)), () -> {
node(phaseConveyor, () -> { node(phaseConveyor, () -> {
node(massDriver, () -> { node(massDriver, () -> {
node(payloadPropulsionTower, () -> {
});
}); });
}); });
@@ -233,7 +235,9 @@ public class TechTree implements ContentList{
}); });
node(repairPoint, () -> { 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; shrinkX = shrinkY = 0.7f;
speed = 0.001f; speed = 0f;
collides = false; collides = false;
healPercent = 15f; healPercent = 15f;
@@ -1759,7 +1759,7 @@ public class UnitTypes implements ContentList{
armor = 3f; armor = 3f;
buildSpeed = 2f; buildSpeed = 1.5f;
weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{ weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{
x = 0f; x = 0f;
@@ -1810,7 +1810,7 @@ public class UnitTypes implements ContentList{
shrinkX = shrinkY = 0f; shrinkX = shrinkY = 0f;
speed = 0.001f; speed = 0f;
splashDamage = 50f; splashDamage = 50f;
splashDamageRadius = 40f; splashDamageRadius = 40f;
@@ -1833,7 +1833,7 @@ public class UnitTypes implements ContentList{
trailY = -4f; trailY = -4f;
trailScl = 1.9f; trailScl = 1.9f;
buildSpeed = 2.5f; buildSpeed = 2f;
weapons.add(new Weapon("plasma-mount-weapon"){{ weapons.add(new Weapon("plasma-mount-weapon"){{
@@ -1906,7 +1906,7 @@ public class UnitTypes implements ContentList{
trailY = -9f; trailY = -9f;
trailScl = 2f; trailScl = 2f;
buildSpeed = 3f; buildSpeed = 2f;
weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{ weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{
x = 11f; x = 11f;
@@ -1936,7 +1936,6 @@ public class UnitTypes implements ContentList{
ejectEffect = Fx.none; ejectEffect = Fx.none;
bullet = new FlakBulletType(2.5f, 25){{ bullet = new FlakBulletType(2.5f, 25){{
sprite = "missile-large"; sprite = "missile-large";
collides = false;
//for targeting //for targeting
collidesGround = collidesAir = true; collidesGround = collidesAir = true;
explodeRange = 40f; explodeRange = 40f;
@@ -1950,9 +1949,9 @@ public class UnitTypes implements ContentList{
lightColor = Pal.heal; lightColor = Pal.heal;
splashDamageRadius = 30f; splashDamageRadius = 30f;
splashDamage = 28f; splashDamage = 25f;
lifetime = 90f; lifetime = 80f;
backColor = Pal.heal; backColor = Pal.heal;
frontColor = Color.white; frontColor = Color.white;
@@ -1976,17 +1975,17 @@ public class UnitTypes implements ContentList{
weaveMag = 1f; weaveMag = 1f;
trailColor = Pal.heal; trailColor = Pal.heal;
trailParam = 5f; trailWidth = 4.5f;
trailInterval = 3f; trailLength = 29;
fragBullets = 7; fragBullets = 7;
fragVelocityMin = 0.3f; fragVelocityMin = 0.3f;
fragBullet = new MissileBulletType(3.9f, 12){{ fragBullet = new MissileBulletType(3.9f, 11){{
homingPower = 0.2f; homingPower = 0.2f;
weaveMag = 4; weaveMag = 4;
weaveScale = 4; weaveScale = 4;
lifetime = 70f; lifetime = 60f;
shootEffect = Fx.shootHeal; shootEffect = Fx.shootHeal;
smokeEffect = Fx.hitLaser; smokeEffect = Fx.hitLaser;
splashDamage = 13f; splashDamage = 13f;
@@ -1998,12 +1997,14 @@ public class UnitTypes implements ContentList{
lightRadius = 40f; lightRadius = 40f;
lightOpacity = 0.7f; lightOpacity = 0.7f;
trailInterval = 2f; trailColor = Pal.heal;
trailParam = 3f; trailWidth = 2.5f;
trailLength = 20;
trailChance = -1f;
healPercent = 2.8f; healPercent = 2.8f;
collidesTeam = true; collidesTeam = true;
backColor = Pal.heal; backColor = Pal.heal;
trailColor = Pal.heal;
despawnEffect = Fx.none; despawnEffect = Fx.none;
hitEffect = new ExplosionEffect(){{ hitEffect = new ExplosionEffect(){{
@@ -2043,7 +2044,7 @@ public class UnitTypes implements ContentList{
trailY = -17f; trailY = -17f;
trailScl = 3.2f; trailScl = 3.2f;
buildSpeed = 3.5f; buildSpeed = 3f;
abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{ abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{
repair = 35f; repair = 35f;
@@ -2084,7 +2085,7 @@ public class UnitTypes implements ContentList{
trailY = -32f; trailY = -32f;
trailScl = 3.5f; trailScl = 3.5f;
buildSpeed = 3.8f; buildSpeed = 3.5f;
for(float mountY : new float[]{-117/4f, 50/4f}){ for(float mountY : new float[]{-117/4f, 50/4f}){
for(float sign : Mathf.signs){ for(float sign : Mathf.signs){
@@ -2112,8 +2113,8 @@ public class UnitTypes implements ContentList{
bullet = new ContinuousLaserBulletType(){{ bullet = new ContinuousLaserBulletType(){{
maxRange = 90f; maxRange = 90f;
damage = 25f; damage = 26f;
length = 90f; length = 95f;
hitEffect = Fx.hitMeltHeal; hitEffect = Fx.hitMeltHeal;
drawSize = 200f; drawSize = 200f;
lifetime = 155f; lifetime = 155f;
@@ -2160,7 +2161,7 @@ public class UnitTypes implements ContentList{
timeIncrease = 3f; timeIncrease = 3f;
timeDuration = 60f * 20f; timeDuration = 60f * 20f;
powerDamageScl = 3f; powerDamageScl = 3f;
damage = 40; damage = 50;
hitColor = lightColor = Pal.heal; hitColor = lightColor = Pal.heal;
lightRadius = 70f; lightRadius = 70f;
clipSize = 250f; clipSize = 250f;
@@ -2176,7 +2177,7 @@ public class UnitTypes implements ContentList{
trailWidth = 6f; trailWidth = 6f;
trailColor = Pal.heal; trailColor = Pal.heal;
trailInterval = 3f; trailInterval = 3f;
splashDamage = 40f; splashDamage = 60f;
splashDamageRadius = rad; splashDamageRadius = rad;
hitShake = 4f; hitShake = 4f;
trailRotation = true; 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(){ public void reset(){

View File

@@ -385,7 +385,7 @@ public class Renderer implements ApplicationListener{
lines[i + 3] = (byte)255; lines[i + 3] = (byte)255;
} }
Pixmap fullPixmap = new Pixmap(w, h); 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"); Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png");
PixmapIO.writePng(file, fullPixmap); PixmapIO.writePng(file, fullPixmap);
fullPixmap.dispose(); 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 //pierceBuilding is not enabled by default, because a bullet may want to *not* pierce buildings
} }
if(lightningType == null){ if(lightning > 0){
lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; 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.owner = owner;
bullet.team = team; bullet.team = team;
bullet.time = 0f; bullet.time = 0f;
bullet.vel.trns(angle, speed * velocityScl); bullet.initVel(angle, speed * velocityScl);
if(backMove){ if(backMove){
bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta);
}else{ }else{
@@ -462,7 +468,7 @@ public class BulletType extends Content implements Cloneable{
} }
bullet.add(); 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; return bullet;
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,7 +17,7 @@ public class SapBulletType extends BulletType{
public float width = 0.4f; public float width = 0.4f;
public SapBulletType(){ public SapBulletType(){
speed = 0.0001f; speed = 0f;
despawnEffect = Fx.none; despawnEffect = Fx.none;
pierce = true; pierce = true;
collides = false; 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 float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f, serrationFadeOffset = 0.5f;
public ShrapnelBulletType(){ public ShrapnelBulletType(){
speed = 0.01f; speed = 0f;
hitEffect = Fx.hitLancer; hitEffect = Fx.hitLancer;
shootEffect = smokeEffect = Fx.lightningShoot; shootEffect = smokeEffect = Fx.lightningShoot;
lifetime = 10f; lifetime = 10f;

View File

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

View File

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

View File

@@ -45,6 +45,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
transient String lastText = ""; transient String lastText = "";
transient float textFadeTime; transient float textFadeTime;
transient private Unit lastReadUnit = Nulls.unit; transient private Unit lastReadUnit = Nulls.unit;
transient @Nullable Unit justSwitchFrom, justSwitchTo;
public boolean isBuilder(){ public boolean isBuilder(){
return unit.canBuild(); return unit.canBuild();
@@ -100,6 +101,16 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
@Override @Override
public void afterSync(){ 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 //simulate a unit change after sync
Unit set = unit; Unit set = unit;
unit = lastReadUnit; 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 @Override
public void remove(){ public void remove(){
//clear unit upon removal //clear unit upon removal
@@ -171,6 +189,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
} }
public void unit(Unit unit){ 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(unit == null) throw new IllegalArgumentException("Unit cannot be null. Use clearUnit() instead.");
if(this.unit == unit) return; if(this.unit == unit) return;

View File

@@ -15,7 +15,8 @@ import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
//just a proof of concept import static mindustry.Vars.*;
@Component @Component
abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
@Import float x, y, rotation; @Import float x, y, rotation;
@@ -32,7 +33,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
int sign = i == 0 ? -1 : 1; int sign = i == 0 ? -1 : 1;
float cx = Angles.trnsx(rotation - 90, type.trailX * sign, type.trailY) + x, cy = Angles.trnsy(rotation - 90, type.trailX * sign, type.trailY) + y; float cx = Angles.trnsx(rotation - 90, type.trailX * sign, type.trailY) + x, cy = Angles.trnsy(rotation - 90, type.trailX * sign, type.trailY) + y;
t.update(cx, cy); 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){ public void update(Tile tile){
if(world.isGenerating() || !state.isGame()) return; if(world.isGenerating() || !state.isGame()) return;
if(tile.build != null && tile.isCenter()){
tile.getLinkedTiles(other -> {
if(!other.isCenter()){
update(other);
}
});
}
int color = colorFor(tile); int color = colorFor(tile);
pixmap.set(tile.x, pixmap.height - 1 - tile.y, color); pixmap.set(tile.x, pixmap.height - 1 - tile.y, color);

View File

@@ -26,6 +26,10 @@ public class MultiPacker implements Disposable{
return null; return null;
} }
public PixmapPacker getPacker(PageType type){
return packers[type.ordinal()];
}
public boolean has(String name){ public boolean has(String name){
for(var page : PageType.all){ for(var page : PageType.all){
if(packers[page.ordinal()].getRect(name) != null){ 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 //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 //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 //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 //zone page (sprites4.png) - zone preview
//ui page (sprites5.png) - content icons, white icons and UI elements //rubble page - scorch textures for unit deaths & wrecks
//ui page (sprites5.png) - content icons, white icons, fonts and UI elements
public enum PageType{ public enum PageType{
main(4096), main(4096),
environment, environment,

View File

@@ -40,6 +40,7 @@ public class Trail{
float[] items = points.items; float[] items = points.items;
int i = points.size - 3; 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; 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.rect("hcircle", x1, y1, w, w, -Mathf.radDeg * lastAngle + 180f);
Draw.reset(); Draw.reset();
} }
@@ -56,6 +57,7 @@ public class Trail{
float size = width / (points.size/3); float size = width / (points.size/3);
float z1 = lastAngle; float z1 = lastAngle;
float z2 = -Angles.angleRad(x2, y2, lx, ly); 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, 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; 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){ if(on != null){
Call.unitControl(player, on); Call.unitControl(player, on);
shouldShoot = false; shouldShoot = false;
recentRespawnTimer = 1f;
}else if(build != null){ }else if(build != null){
Call.buildingControlSelect(player, build); Call.buildingControlSelect(player, build);
recentRespawnTimer = 1f;
} }
} }
} }
@@ -238,9 +240,10 @@ public class DesktopInput extends InputHandler{
if(!player.dead() && !state.isPaused() && !scene.hasField()){ if(!player.dead() && !state.isPaused() && !scene.hasField()){
updateMovement(player.unit()); updateMovement(player.unit());
if(Core.input.keyDown(Binding.respawn)){ if(Core.input.keyTap(Binding.respawn)){
Call.unitClear(player);
controlledType = null; controlledType = null;
recentRespawnTimer = 1f;
Call.unitClear(player);
} }
} }

View File

@@ -58,6 +58,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
public Group uiGroup; public Group uiGroup;
public boolean isBuilding = true, buildWasAutoPaused = false, wasShooting = false; public boolean isBuilding = true, buildWasAutoPaused = false, wasShooting = false;
public @Nullable UnitType controlledType; public @Nullable UnitType controlledType;
public float recentRespawnTimer;
public @Nullable Schematic lastSchematic; public @Nullable Schematic lastSchematic;
public GestureDetector detector; public GestureDetector detector;
@@ -375,15 +376,27 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
throw new ValidateException(player, "Player cannot control a unit."); 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 //clear player unit when they possess a core
if(unit == null){ //just clear the unit (is this used?) if(unit == null){ //just clear the unit (is this used?)
player.clearUnit(); player.clearUnit();
//make sure it's AI controlled, so players can't overwrite each other //make sure it's AI controlled, so players can't overwrite each other
}else if(unit.isAI() && unit.team == player.team() && !unit.dead){ }else if(unit.isAI() && unit.team == player.team() && !unit.dead){
if(!net.client()){ if(net.client() && player.isLocal()){
player.unit(unit); player.justSwitchFrom = player.unit();
player.justSwitchTo = unit;
} }
player.unit(unit);
Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit)); Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit));
if(!player.dead()){ if(!player.dead()){
Fx.unitSpirit.at(player.x, player.y, 0f, unit); 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)); 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){ public static void unitClear(Player player){
if(player == null) return; if(player == null) return;
//problem: this gets called on both ends. it shouldn't be.
Fx.spawn.at(player); Fx.spawn.at(player);
player.clearUnit(); player.clearUnit();
player.checkSpawn();
player.deathTimer = Player.deathDelay + 1f; //for instant respawn player.deathTimer = Player.deathDelay + 1f; //for instant respawn
} }
@@ -419,7 +434,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
player.unit().commandNearby(new CircleFormation()); player.unit().commandNearby(new CircleFormation());
Fx.commandSend.at(player, player.unit().type.commandRadius); Fx.commandSend.at(player, player.unit().type.commandRadius);
} }
} }
public Eachable<BuildPlan> allRequests(){ public Eachable<BuildPlan> allRequests(){
@@ -434,10 +448,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
return !selectRequests.isEmpty(); return !selectRequests.isEmpty();
} }
public OverlayFragment getFrag(){
return frag;
}
public void update(){ public void update(){
player.typing = ui.chatfrag.shown(); player.typing = ui.chatfrag.shown();
@@ -451,7 +461,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
wasShooting = player.shooting; 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; controlledType = player.unit().type;
} }
@@ -461,6 +473,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
if(unit != null){ if(unit != null){
//only trying controlling once a second to prevent packet spam //only trying controlling once a second to prevent packet spam
if(!net.client() || controlInterval.get(0, 70f)){ if(!net.client() || controlInterval.get(0, 70f)){
recentRespawnTimer = 1f;
Call.unitControl(player, unit); 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 //control a unit/block detected on first tap of double-tap
if(unitTapped != null){ if(unitTapped != null){
Call.unitControl(player, unitTapped); Call.unitControl(player, unitTapped);
recentRespawnTimer = 1f;
}else if(buildingTapped != null){ }else if(buildingTapped != null){
Call.buildingControlSelect(player, buildingTapped); Call.buildingControlSelect(player, buildingTapped);
recentRespawnTimer = 1f;
}else if(!tryBeginMine(cursor)){ }else if(!tryBeginMine(cursor)){
tileTapped(linked.build); tileTapped(linked.build);
} }
@@ -856,8 +858,7 @@ public class MobileInput extends InputHandler implements GestureListener{
boolean omni = unit.type.omniMovement; boolean omni = unit.type.omniMovement;
boolean allowHealing = type.canHeal; boolean allowHealing = type.canHeal;
boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team && boolean validHealTarget = allowHealing && target instanceof Building b && b.isValid() && target.team() == unit.team && b.damaged() && target.within(unit, type.range);
((Building)target).damaged() && target.within(unit, type.range);
boolean boosted = (unit instanceof Mechc && unit.isFlying()); boolean boosted = (unit instanceof Mechc && unit.isFlying());
//reset target if: //reset target if:
@@ -912,13 +913,8 @@ public class MobileInput extends InputHandler implements GestureListener{
unit.vel.approachDelta(Vec2.ZERO, unit.speed() * type.accel / 2f); unit.vel.approachDelta(Vec2.ZERO, unit.speed() * type.accel / 2f);
} }
float expansion = 3f;
unit.hitbox(rect); unit.hitbox(rect);
rect.x -= expansion; rect.grow(6f);
rect.y -= expansion;
rect.width += expansion * 2f;
rect.height += expansion * 2f;
player.boosting = collisions.overlapsTile(rect) || !unit.within(targetPos, 85f); player.boosting = collisions.overlapsTile(rect) || !unit.within(targetPos, 85f);
@@ -927,7 +923,7 @@ public class MobileInput extends InputHandler implements GestureListener{
}else{ }else{
unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len())); unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len()));
if(!movement.isZero()){ 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.game.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.meta.*;
import java.io.*; 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<>(){ json.setSerializer(Item.class, new Serializer<>(){
@Override @Override
public void write(Json json, Item object, Class knownType){ public void write(Json json, Item object, Class knownType){

View File

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

View File

@@ -36,13 +36,20 @@ public enum LogicOp{
abs("abs", a -> Math.abs(a)), abs("abs", a -> Math.abs(a)),
log("log", Math::log), log("log", Math::log),
log10("log10", Math::log10), 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), floor("floor", Math::floor),
ceil("ceil", Math::ceil), ceil("ceil", Math::ceil),
sqrt("sqrt", Math::sqrt), 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(); public static final LogicOp[] all = values();

View File

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

View File

@@ -111,4 +111,23 @@ public abstract class FilterOption{
table.add("@filter.option." + name); 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(); private final Vec2 v1 = new Vec2(), v2 = new Vec2(), v3 = new Vec2();
int angle = 45; int angle = 45;
boolean rotate = false;
@Override @Override
public FilterOption[] options(){ public FilterOption[] options(){
return Structs.arr( 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){ void mirror(Vec2 p, float x0, float y0, float x1, float y1){
//special case: uneven map mirrored at 45 degree angle //special case: uneven map mirrored at 45 degree angle (or someone might just want rotational symmetry)
if(in.width != in.height && angle % 90 != 0){ if((in.width != in.height && angle % 90 != 0) || rotate){
p.x = in.width - p.x - 1; p.x = in.width - p.x - 1;
p.y = in.height - p.y - 1; p.y = in.height - p.y - 1;
}else{ }else{

View File

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

View File

@@ -607,7 +607,8 @@ public class Mods implements Loadable{
if(mod.root.child("content").exists()){ if(mod.root.child("content").exists()){
Fi contentRoot = mod.root.child("content"); Fi contentRoot = mod.root.child("content");
for(ContentType type : ContentType.all){ 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()){ if(folder.exists()){
for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){ for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){
runs.add(new LoadRun(type, file, mod)); runs.add(new LoadRun(type, file, mod));

View File

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

View File

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

View File

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

View File

@@ -2,7 +2,14 @@ package mindustry.net;
import arc.util.io.*; import arc.util.io.*;
import java.io.*;
public abstract class Packet{ 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 //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. */ /** Does not get handled unless client is connected. */
@@ -15,6 +22,12 @@ public abstract class Packet{
public void read(Reads read){} public void read(Reads read){}
public void write(Writes write){} public void write(Writes write){}
public void read(Reads read, int length){
read(read);
}
public void handled(){}
public int getPriority(){ public int getPriority(){
return priorityNormal; return priorityNormal;
} }

View File

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

View File

@@ -120,7 +120,7 @@ public class StatusEffect extends UnlockableContent{
if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ if(effect != Fx.none && Mathf.chanceDelta(effectChance)){
Tmp.v1.rnd(Mathf.range(unit.type.hitSize/2f)); 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.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.audio.*; import mindustry.audio.*;
import mindustry.content.*; import mindustry.content.*;
@@ -15,6 +17,7 @@ import mindustry.entities.bullet.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -119,6 +122,17 @@ public class Weapon implements Cloneable{
this(""); 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(){ public float dps(){
return (bullet.estimateDPS() / reload) * shots * 60f; return (bullet.estimateDPS() / reload) * shots * 60f;
} }

View File

@@ -5,12 +5,14 @@ import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.blocks.units.*; import mindustry.world.blocks.units.*;
import mindustry.world.meta.*;
/** /**
* Note that this weapon requires a bullet with a positive maxRange. * Note that this weapon requires a bullet with a positive maxRange.
@@ -47,6 +49,12 @@ public class RepairBeamWeapon extends Weapon{
recoil = 0f; 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 @Override
public float dps(){ public float dps(){
return 0f; return 0f;

View File

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

View File

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

View File

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

View File

@@ -721,6 +721,7 @@ public class HudFragment extends Fragment{
t.clicked(() -> { t.clicked(() -> {
if(!player.dead() && mobile){ if(!player.dead() && mobile){
Call.unitClear(player); Call.unitClear(player);
control.input.recentRespawnTimer = 1f;
control.input.controlledType = null; 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 //assign entity and type to blocks, so they act as proxies for this one
other.build = entity; other.build = entity;
other.block = block; other.block = block;
} }
} }
} }

View File

@@ -34,6 +34,8 @@ public class MendProjector extends Block{
group = BlockGroup.projectors; group = BlockGroup.projectors;
hasPower = true; hasPower = true;
hasItems = true; hasItems = true;
emitLight = true;
lightRadius = 50f;
} }
@Override @Override
@@ -129,7 +131,7 @@ public class MendProjector extends Block{
@Override @Override
public void drawLight(){ 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 @Override

View File

@@ -39,6 +39,8 @@ public class OverdriveProjector extends Block{
hasPower = true; hasPower = true;
hasItems = true; hasItems = true;
canOverdrive = false; canOverdrive = false;
emitLight = true;
lightRadius = 50f;
} }
@Override @Override
@@ -89,7 +91,7 @@ public class OverdriveProjector extends Block{
@Override @Override
public void drawLight(){ 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 @Override

View File

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

View File

@@ -6,6 +6,7 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
@@ -183,5 +184,25 @@ public class Duct extends Block implements Autotiler{
next = front(); next = front();
nextc = next instanceof DuctBuild d ? d : null; 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 @Load("@-dir") TextureRegion dirRegion;
public int range = 4; public int range = 4;
public float moveDelay = 5f; public float speed = 5f;
public DuctBridge(String name){ public DuctBridge(String name){
super(name); super(name);
@@ -37,6 +37,7 @@ public class DuctBridge extends Block{
group = BlockGroup.transportation; group = BlockGroup.transportation;
noUpdateDisabled = true; noUpdateDisabled = true;
envEnabled = Env.space | Env.terrestrial | Env.underwater; envEnabled = Env.space | Env.terrestrial | Env.underwater;
drawArrow = false;
} }
@Override @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); 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){ public boolean positionsValid(int x1, int y1, int x2, int y2){
if(x1 == x2){ if(x1 == x2){
return Math.abs(y1 - y2) <= range; return Math.abs(y1 - y2) <= range;
@@ -88,7 +120,6 @@ public class DuctBridge extends Block{
Draw.rect(bridgeBotRegion, cx, cy, len, tilesize, angle); Draw.rect(bridgeBotRegion, cx, cy, len, tilesize, angle);
Draw.reset(); Draw.reset();
Draw.alpha(Renderer.bridgeOpacity); Draw.alpha(Renderer.bridgeOpacity);
//Draw.rect(bridgeTopRegion, cx, cy, len, tilesize, angle);
for(float i = 6f; i <= len + size * tilesize - 5f; i += 5f){ 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); 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; link.occupied[rotation % 4] = this;
if(items.any() && link.items.total() < link.block.itemCapacity){ if(items.any() && link.items.total() < link.block.itemCapacity){
progress += edelta(); progress += edelta();
while(progress > moveDelay){ while(progress > speed){
Item next = items.take(); Item next = items.take();
if(next != null && link.items.total() < link.block.itemCapacity){ if(next != null && link.items.total() < link.block.itemCapacity){
link.handleItem(this, next); link.handleItem(this, next);
} }
progress -= moveDelay; progress -= speed;
} }
} }
} }

View File

@@ -87,7 +87,7 @@ public class DuctRouter extends Block{
if(current == null) return null; if(current == null) return null;
for(int i = -1; i <= 1; i++){ 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)){ if(other != null && other.team == team && other.acceptItem(this, current)){
return other; return other;
} }

View File

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

View File

@@ -57,6 +57,14 @@ public class PayloadConveyor extends Block{
stats.add(Stat.payloadCapacity, (payloadLimit), StatUnit.blocksSquared); 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 class PayloadConveyorBuild extends Building{
public @Nullable Payload item; public @Nullable Payload item;
public float progress, itemRotation, animation; public float progress, itemRotation, animation;

View File

@@ -13,7 +13,7 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class PayloadBlock extends Block{ 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 = "@-top", fallback = "factory-top-@size") TextureRegion topRegion;
public @Load(value = "@-out", fallback = "factory-out-@size") TextureRegion outRegion; 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 turretRotation = 90;
public float reload = 0f, charge = 0f; public float reload = 0f, charge = 0f;
public float targetSize = grabWidth*2f, curSize = targetSize; 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 loaded;
public boolean charging; public boolean charging;
public PayloadDriverState state = idle; public PayloadDriverState state = idle;
@@ -151,6 +152,16 @@ public class PayloadMassDriver extends PayloadBlock{
targetSize = payload.size(); 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; charging = false;
if(hasLink){ if(hasLink){
@@ -192,7 +203,7 @@ public class PayloadMassDriver extends PayloadBlock{
payVector.setZero(); payVector.setZero();
payRotation = Angles.moveToward(payRotation, turretRotation + 180f, payloadRotateSpeed * delta()); payRotation = Angles.moveToward(payRotation, turretRotation + 180f, payloadRotateSpeed * delta());
} }
}else{ }else if(effectDelayTimer <= 0){
moveOutPayload(); 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)); transferEffect.at(x + cx, y + cy, turretRotation, new PayloadMassDriverData(x + cx, y + cy, other.x - cx, other.y - cy, payload));
Payload pay = payload; Payload pay = payload;
other.recPayload = payload; other.recPayload = payload;
other.effectDelayTimer = transferEffect.lifetime;
Time.run(transferEffect.lifetime, () -> { //transfer payload
receiveEffect.at(other.x - cx/2f, other.y - cy/2f, other.turretRotation); other.handlePayload(this, pay);
Effect.shake(shake, shake, this); other.lastOther = this;
other.payVector.set(-cx, -cy);
other.payRotation = turretRotation;
other.payLength = length;
other.loaded = true;
other.updatePayload();
other.recPayload = null;
//transfer payload if(other.waitingShooters.size != 0 && other.waitingShooters.first() == this){
other.reload = 1f; other.waitingShooters.removeFirst();
other.handlePayload(this, pay); }
other.payVector.set(-cx, -cy); other.state = idle;
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;
});
//reset state after shooting immediately //reset state after shooting immediately
payload = null; payload = null;
@@ -341,8 +348,10 @@ public class PayloadMassDriver extends PayloadBlock{
if(payload != null){ if(payload != null){
updatePayload(); updatePayload();
Draw.z(loaded ? Layer.blockOver + 0.2f : Layer.blockOver); if(effectDelayTimer <= 0){
payload.draw(); Draw.z(loaded ? Layer.blockOver + 0.2f : Layer.blockOver);
payload.draw();
}
} }
Draw.z(Layer.blockOver + 0.1f); Draw.z(Layer.blockOver + 0.1f);
@@ -443,12 +452,22 @@ public class PayloadMassDriver extends PayloadBlock{
return Point2.unpack(link).sub(tile.x, tile.y); return Point2.unpack(link).sub(tile.x, tile.y);
} }
@Override
public byte version(){
return 1;
}
@Override @Override
public void write(Writes write){ public void write(Writes write){
super.write(write); super.write(write);
write.i(link); write.i(link);
write.f(turretRotation); write.f(turretRotation);
write.b((byte)state.ordinal()); write.b((byte)state.ordinal());
write.f(reload);
write.f(charge);
write.bool(loaded);
write.bool(charging);
} }
@Override @Override
@@ -457,6 +476,13 @@ public class PayloadMassDriver extends PayloadBlock{
link = read.i(); link = read.i();
turretRotation = read.f(); turretRotation = read.f();
state = PayloadDriverState.all[read.b()]; 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; size = 3;
update = true; update = true;
outputsPayload = true; outputsPayload = true;
hasPower = true; hasPower = false;
rotate = true; rotate = true;
configurable = true; configurable = true;
//make sure to display large units.
clipSize = 120;
config(Block.class, (PayloadSourceBuild build, Block block) -> { config(Block.class, (PayloadSourceBuild build, Block block) -> {
if(canProduce(block) && build.block != block){ if(canProduce(block) && build.block != block){
@@ -45,6 +47,13 @@ public class PayloadSource extends PayloadBlock{
build.scl = 0f; build.scl = 0f;
} }
}); });
configClear((PayloadSourceBuild build) -> {
build.block = null;
build.unit = null;
build.payload = null;
build.scl = 0f;
});
} }
@Override @Override

View File

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

View File

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

View File

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

View File

@@ -18,6 +18,13 @@ public class ThermalGenerator extends PowerGenerator{
super(name); super(name);
} }
@Override
public void init(){
super.init();
//proper light clipping
clipSize = Math.max(clipSize, 45f * size * 2f * 2f);
}
@Override @Override
public void setStats(){ public void setStats(){
super.setStats(); super.setStats();
@@ -52,7 +59,7 @@ public class ThermalGenerator extends PowerGenerator{
@Override @Override
public void drawLight(){ 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 @Override

View File

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

View File

@@ -1,9 +1,11 @@
package mindustry.world.meta; package mindustry.world.meta;
import arc.struct.*;
import mindustry.*; import mindustry.*;
public class Attribute{ public class Attribute{
public static Attribute[] all = {}; public static Attribute[] all = {};
public static ObjectMap<String, Attribute> map = new ObjectMap<>();
public static final Attribute public static final Attribute
/** Heat content. Used for thermal generator yield. */ /** Heat content. Used for thermal generator yield. */
@@ -36,6 +38,11 @@ public class Attribute{
return name; 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. */ /** Automatically registers this attribute for use. Do not call after mod init. */
public static Attribute add(String name){ public static Attribute add(String name){
Attribute a = new Attribute(all.length, name); Attribute a = new Attribute(all.length, name);
@@ -43,6 +50,7 @@ public class Attribute{
all = new Attribute[all.length + 1]; all = new Attribute[all.length + 1];
System.arraycopy(prev, 0, all, 0, a.id); System.arraycopy(prev, 0, all, 0, a.id);
all[a.id] = a; all[a.id] = a;
map.put(name, a);
return a; return a;
} }
} }

View File

@@ -198,15 +198,10 @@ public class StatValues{
table.image(region).size(60).scaling(Scaling.bounded).right().top(); 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(); w.left().defaults().padRight(3).left();
if(weapon.inaccuracy > 0){ weapon.addStats(unit, w);
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);
}).padTop(-9).left(); }).padTop(-9).left();
table.row(); table.row();
} }
@@ -275,10 +270,6 @@ public class StatValues{
sep(bt, "@bullet.incendiary"); 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){ if(type.homingPower > 0.01f){
sep(bt, "@bullet.homing"); sep(bt, "@bullet.homing");
} }
@@ -290,6 +281,10 @@ public class StatValues{
if(type.fragBullet != null){ if(type.fragBullet != null){
sep(bt, "@bullet.frag"); 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); }).padTop(unit ? 0 : -9).left().get().background(unit ? null : Tex.underline);
table.row(); table.row();
@@ -298,7 +293,6 @@ public class StatValues{
} }
//for AmmoListValue //for AmmoListValue
private static void sep(Table table, String text){ private static void sep(Table table, String text){
table.row(); table.row();
table.add(text); table.add(text);

View File

@@ -1,7 +1,4 @@
import com.badlogicgames.packr.Packr sourceSets.main.java.srcDirs = ["src/"]
import com.badlogicgames.packr.PackrConfig
sourceSets.main.java.srcDirs = [ "src/" ]
project.ext.mainClassName = "mindustry.desktop.DesktopLauncher" project.ext.mainClassName = "mindustry.desktop.DesktopLauncher"
project.ext.assetsDir = new File("../core/assets") project.ext.assetsDir = new File("../core/assets")
@@ -9,6 +6,7 @@ project.ext.assetsDir = new File("../core/assets")
def enableTemplates = true def enableTemplates = true
def JDK_DIR = "$System.env.JDK_DIR" def JDK_DIR = "$System.env.JDK_DIR"
def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns") def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns")
def platforms = ["Linux64", "Windows64", "Windows32", "MacOS"]
task run(dependsOn: classes, type: JavaExec){ task run(dependsOn: classes, type: JavaExec){
main = project.mainClassName main = project.mainClassName
@@ -36,7 +34,6 @@ task run(dependsOn: classes, type: JavaExec){
} }
} }
task dist(type: Jar, dependsOn: configurations.runtimeClasspath){ task dist(type: Jar, dependsOn: configurations.runtimeClasspath){
from files(sourceSets.main.output.classesDirs) from files(sourceSets.main.output.classesDirs)
from files(sourceSets.main.output.resourcesDir) from files(sourceSets.main.output.resourcesDir)
@@ -72,8 +69,13 @@ task steamtest(dependsOn: dist){
} }
} }
//TODO replace with jpackage templates //required templates:
PackrConfig.Platform.values().each{ platform -> //- Windows32: Not provided by Packr! This uses Java 8
//required JDKs:
//- Windows64
//- Linux64
//- Mac
platforms.each{ platform ->
task "packr${platform.toString()}"{ task "packr${platform.toString()}"{
dependsOn dist dependsOn dist
@@ -88,7 +90,8 @@ PackrConfig.Platform.values().each{ platform ->
delete "build/packr/output/" delete "build/packr/output/"
} }
if(enableTemplates && (platform == PackrConfig.Platform.Windows64)){ //the Windows32 version uses an old java-8 based template, because packr and jpackage don't support win32
if(enableTemplates && (platform == "Windows32")){
copy{ copy{
into "build/packr/output" into "build/packr/output"
from "${JDK_DIR}/templates/${platform.toString().toLowerCase()}" from "${JDK_DIR}/templates/${platform.toString().toLowerCase()}"
@@ -100,30 +103,35 @@ PackrConfig.Platform.values().each{ platform ->
from "build/libs/${appName}.jar" from "build/libs/${appName}.jar"
} }
}else{ }else{
def config = new PackrConfig() def jarPath = JDK_DIR + "packr.jar"
config.with{ def args = ["java", "-jar", jarPath] as String[]
config.executable = appName
config.platform = platform
verbose = true
bundleIdentifier = getPackage() + ".mac"
iconResource = ICON_DIR
outDir = file("$rootDir/desktop/build/packr/output")
mainClass = project.ext.mainClassName
classpath = ["$rootDir/desktop/build/packr/desktop.jar".toString()]
removePlatformLibs = ["$rootDir/desktop/build/packr/desktop.jar".toString()]
vmArgs = [] args += [
minimizeJre = "$rootDir/desktop/packr_minimize.json".toString() "--platform", platform == "MacOS" ? "Mac" : platform.toString(),
jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip" "--jdk", JDK_DIR + "jre-${platform.toString().toLowerCase()}",
"--executable", appName,
"--classpath", "$rootDir/desktop/build/packr/desktop.jar".toString(),
"--mainclass", project.ext.mainClassName,
"--verbose",
"--bundle", getPackage() + ".mac",
"--icon", ICON_DIR,
"--output", "$rootDir/desktop/build/packr/output".toString(),
"--removelibs", "$rootDir/desktop/build/packr/desktop.jar".toString()
]
if(platform == PackrConfig.Platform.MacOS){ if(platform == "MacOS"){
vmArgs += "XstartOnFirstThread" args += ["--vmargs", "XstartOnFirstThread"] as String[]
} }else{
//TODO unneeded for windows?
args += ["--vmargs", "Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1"]
} }
new Packr().pack(config) exec{
commandLine args.toList()
standardOutput = System.out
}
if(platform != PackrConfig.Platform.MacOS){ if(platform != "MacOS"){
copy{ copy{
into "build/packr/output/jre/" into "build/packr/output/jre/"
from "build/packr/output/desktop.jar" from "build/packr/output/desktop.jar"
@@ -133,10 +141,8 @@ PackrConfig.Platform.values().each{ platform ->
delete "build/packr/output/desktop.jar" delete "build/packr/output/desktop.jar"
} }
file("build/packr/output/config.json").text = file("build/packr/output/config.json").text.replace("desktop.jar", "jre/desktop.jar") file("build/packr/output/Mindustry.json").text = file("build/packr/output/Mindustry.json").text.replace("desktop.jar", "jre/desktop.jar")
} }else{
if(platform == PackrConfig.Platform.MacOS){
copy{ copy{
into "build/packr/output/${appName}.app/Contents/" into "build/packr/output/${appName}.app/Contents/"
from "build/packr/output/Contents/" from "build/packr/output/Contents/"
@@ -148,7 +154,7 @@ PackrConfig.Platform.values().each{ platform ->
} }
} }
if((platform == PackrConfig.Platform.Windows64 || platform == PackrConfig.Platform.Windows32)){ if((platform == "Windows64" || platform == "Windows32")){
copy{ copy{
from "build/packr/output/jre/bin/msvcr100.dll" from "build/packr/output/jre/bin/msvcr100.dll"
into "build/packr/output/" into "build/packr/output/"
@@ -158,12 +164,12 @@ PackrConfig.Platform.values().each{ platform ->
if(versionModifier.contains("steam")){ if(versionModifier.contains("steam")){
copy{ copy{
def lib = platform == PackrConfig.Platform.MacOS || platform == PackrConfig.Platform.Linux64 ? "lib" : "" def lib = platform == "MacOS" || platform == "Linux64" ? "lib" : ""
from zipTree(platform == PackrConfig.Platform.MacOS ? "build/packr/output/${appName}.app/Contents/Resources/desktop.jar" : "build/packr/output/jre/desktop.jar").matching{ from zipTree(platform == "MacOS" ? "build/packr/output/${appName}.app/Contents/Resources/desktop.jar" : "build/packr/output/jre/desktop.jar").matching{
include "${lib}steamworks4j${platform == PackrConfig.Platform.Windows64 ? '64.dll' : platform == PackrConfig.Platform.Windows32 ? '.dll' : platform == PackrConfig.Platform.Linux64 ? '.so' : '.dylib'}" include "${lib}steamworks4j${platform == "Windows64" ? '64.dll' : platform == "Windows32" ? '.dll' : platform == "Linux64" ? '.so' : '.dylib'}"
include "${lib}steam_api${platform == PackrConfig.Platform.Windows64 ? '64.dll' : platform == PackrConfig.Platform.Windows32 ? '.dll' : platform == PackrConfig.Platform.Linux64 ? '.so' : '.dylib'}" include "${lib}steam_api${platform == "Windows64" ? '64.dll' : platform == "Windows32" ? '.dll' : platform == "Linux64" ? '.so' : '.dylib'}"
} }
into platform != PackrConfig.Platform.MacOS ? "build/packr/output/" : "build/packr/output/${appName}.app/Contents/Resources" into platform != "MacOS" ? "build/packr/output/" : "build/packr/output/${appName}.app/Contents/Resources"
} }
} }

View File

@@ -1,116 +0,0 @@
{
"reduce": [
{
"archive": "jre/lib/rt.jar",
"paths": [
"javax/transaction",
"javax/tools",
"javax/swing",
"javax/sql",
"javax/smartcardio",
"javax/rmi",
"javax/print",
"javax/naming",
"javax/management",
"javax/lang",
"javax/jws",
"javax/swing",
"javax/imageio",
"javax/annotation",
"javax/activity",
"javax/activation",
"javax/accessibility",
"com/sun/corba",
"com/sun/jmx",
"com/sun/org",
"com/sun/imageio",
"com/sun/jndi",
"com/sun/xml",
"com/sun/script",
"sun/awt",
"sun/java2d",
"sun/font",
"sun/rmi",
"sun/swing",
"com/sun/media",
"sun/print",
"sun/awt",
"sun/instrument",
"sun/security/tools",
"sun/security/smartcardio",
"sun/audio",
"javax/xml",
"javax/sound",
"javax/script",
"java/beans",
"java/applet",
"java/rmi",
"com/sun/naming",
"java/awt",
"com/sun/org/apache/xpath",
"com/sun/rowset",
"com/sun/script",
"sun/applet",
"sun/corba",
"sun/management"
]
},
{
"archive": "jre/lib/charsets.jar",
"paths": [
]
},
{
"archive": "jre/lib/jsse.jar",
"paths": [
]
},
{
"archive": "jre/lib/resources.jar",
"paths": [
]
}
],
"remove": [
{
"platform": "*",
"paths": [
"jre/lib/rhino.jar"
]
},
{
"platform": "linux",
"paths": [
"jre/lib/amd64/libawt.so",
"jre/lib/amd64/libawt_xawt.so",
"jre/lib/amd64/libjawt.so",
"jre/lib/amd64/libhprof.so",
"jre/lib/amd64/libdt_socket.so",
"jre/lib/amd64/libsplashscreen.so",
"jre/lib/amd64/libunpack.so",
"jre/lib/amd64/libnpt.so",
"jre/lib/amd64/libmlib_image.so",
"jre/lib/amd64/libinstrument.so",
"jre/lib/amd64/libjava_crw_demo.so",
"jre/lib/amd64/libfreetype.so",
"jre/lib/amd64/libmanagement.so",
"jre/lib/amd64/libsctp.so",
"jre/lib/amd64/libjpeg.so",
"jre/lib/amd64/libfreetype.so.6",
"jre/lib/amd64/libjsoundalsa.so",
"jre/lib/amd64/libjsound.so",
"jre/lib/amd64/libattach.so",
"jre/lib/amd64/libawt_headless.so",
"jre/lib/amd64/libfontmanager.so"
]
},
{
"platform": "windows",
"paths": [
"jre/bin/*.exe",
"jre/bin/client",
"jre/bin/awt.dll"
]
}
]
}

View File

@@ -1,5 +1,6 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m --illegal-access=permit #--illegal-access=permit
org.gradle.jvmargs=-Xms256m -Xmx1024m
# Don't recompute annotations if sources haven't been changed # Don't recompute annotations if sources haven't been changed
kapt.incremental.apt = true kapt.incremental.apt = true
# Multithreaded # Multithreaded
@@ -8,4 +9,4 @@ kapt.use.worker.api=true
kapt.include.compile.classpath=false kapt.include.compile.classpath=false
# I don't need to use the kotlin stdlib yet, so remove it to prevent extra bloat & method count issues # I don't need to use the kotlin stdlib yet, so remove it to prevent extra bloat & method count issues
kotlin.stdlib.default.dependency=false kotlin.stdlib.default.dependency=false
archash=5a9d95001fc988df2681616ebc33152b9c88ea92 archash=759b136340ea98d4cb9881e340fb219c6d602a66

View File

@@ -4,5 +4,17 @@
}, },
{ {
"address": "be.mindustry.nydus.app:6567" "address": "be.mindustry.nydus.app:6567"
},
{
"address": "157.90.180.53:25777"
},
{
"address": "mindustry.pl:7777"
},
{
"address": "46.17.104.254:9999"
},
{
"address": "mindustrypvp.ml:6000"
} }
] ]

View File

@@ -21,7 +21,7 @@
}, },
{ {
"name": "C.A.M.S.", "name": "C.A.M.S.",
"address": ["routerchain.ddns.net", "nikochio.ddns.net", "easyplay.su"] "address": ["routerchain.ddns.net", "nikochio.ddns.net", "easyplay.su", "play.thedimas.pp.ua"]
}, },
{ {
"name": "BE6.RUN", "name": "BE6.RUN",
@@ -95,12 +95,12 @@
"name": "Mindustry.Party", "name": "Mindustry.Party",
"address": ["game.mindustry.party"] "address": ["game.mindustry.party"]
}, },
{
"name": "thedimas",
"address": ["play.thedimas.pp.ua"]
},
{ {
"name": "TSR", "name": "TSR",
"address": ["fifr4.quackhost.uk:20131"] "address": ["fifr4.quackhost.uk:20131"]
},
{
"name": "Sakura",
"address": ["160.16.207.141"]
} }
] ]

View File

@@ -1,7 +1,5 @@
sourceSets.main.java.srcDirs = ["src/"] sourceSets.main.java.srcDirs = ["src/"]
import arc.files.Fi import arc.files.Fi
import arc.graphics.Color import arc.graphics.Color
import arc.graphics.Pixmap import arc.graphics.Pixmap