diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 07ae6b09ab..d300e57e24 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -8,12 +8,6 @@ jobs: steps: - 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 if: ${{ github.repository == 'Anuken/Mindustry' }} run: | @@ -23,3 +17,9 @@ jobs: git tag ${BNUM} git config --global user.name "Build Uploader" 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 diff --git a/README.md b/README.md index 109bc42fdb..878649989b 100644 --- a/README.md +++ b/README.md @@ -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). 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 diff --git a/android/proguard-rules.pro b/android/proguard-rules.pro index f25e5e79c5..373c4b9124 100644 --- a/android/proguard-rules.pro +++ b/android/proguard-rules.pro @@ -6,3 +6,4 @@ -keep class arc.** { *; } -keep class net.jpountz.** { *; } -keep class rhino.** { *; } +-keep class com.android.dex.** { *; } \ No newline at end of file diff --git a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java index 00ac5fabac..e21b015a34 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java @@ -30,6 +30,9 @@ public class CallGenerator{ TypeSpec.Builder packet = TypeSpec.classBuilder(ent.packetClassName) .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")); //return the correct priority @@ -41,8 +44,8 @@ public class CallGenerator{ } //implement read & write methods - packet.addMethod(makeWriter(ent, serializer)); - packet.addMethod(makeReader(ent, serializer)); + makeWriter(packet, ent, serializer); + makeReader(packet, ent, serializer); //generate handlers if(ent.where.isClient){ @@ -87,7 +90,7 @@ public class CallGenerator{ 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") .addParameter(Writes.class, "WRITE") .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){ - MethodSpec.Builder builder = MethodSpec.methodBuilder("read") + private static void makeReader(TypeSpec.Builder typespec, MethodEntry ent, ClassSerializer serializer){ + MethodSpec.Builder readbuilder = MethodSpec.methodBuilder("read") .addParameter(Reads.class, "READ") + .addParameter(int.class, "LENGTH") .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 params = ent.element.params(); //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. */ diff --git a/annotations/src/main/resources/revisions/BulletComp/1.json b/annotations/src/main/resources/revisions/BulletComp/1.json new file mode 100644 index 0000000000..59ace7faf8 --- /dev/null +++ b/annotations/src/main/resources/revisions/BulletComp/1.json @@ -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}]} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9c75d7a3c9..85f4e052b6 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,6 @@ buildscript{ dependencies{ 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:arc-core:$arcHash" } diff --git a/core/assets-raw/sprites/blocks/defense/shock-mine-team-top.png b/core/assets-raw/sprites/blocks/defense/shock-mine-team-top.png new file mode 100644 index 0000000000..e215e1a1ea Binary files /dev/null and b/core/assets-raw/sprites/blocks/defense/shock-mine-team-top.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dark-metal-large.png b/core/assets-raw/sprites/blocks/environment/dark-metal-large.png index 42a53db08b..6152bd059b 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dark-metal-large.png and b/core/assets-raw/sprites/blocks/environment/dark-metal-large.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dark-metal2.png b/core/assets-raw/sprites/blocks/environment/dark-metal2.png index 42f7238425..3cf75bb998 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dark-metal2.png and b/core/assets-raw/sprites/blocks/environment/dark-metal2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dark-panel-1.png b/core/assets-raw/sprites/blocks/environment/dark-panel-1.png index ea2d25e43f..3f02f3706f 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dark-panel-1.png and b/core/assets-raw/sprites/blocks/environment/dark-panel-1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dark-panel-2.png b/core/assets-raw/sprites/blocks/environment/dark-panel-2.png index 117c0fddf7..adbc44fdf5 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dark-panel-2.png and b/core/assets-raw/sprites/blocks/environment/dark-panel-2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dark-panel-4.png b/core/assets-raw/sprites/blocks/environment/dark-panel-4.png index a69c9c2da5..9c92f09ef3 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dark-panel-4.png and b/core/assets-raw/sprites/blocks/environment/dark-panel-4.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dark-panel-5.png b/core/assets-raw/sprites/blocks/environment/dark-panel-5.png index b7d3e69c20..2e990695ed 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dark-panel-5.png and b/core/assets-raw/sprites/blocks/environment/dark-panel-5.png differ diff --git a/core/assets-raw/sprites/blocks/environment/metal-floor-damaged1.png b/core/assets-raw/sprites/blocks/environment/metal-floor-damaged1.png index 1cfce7fe86..c7914a00c3 100644 Binary files a/core/assets-raw/sprites/blocks/environment/metal-floor-damaged1.png and b/core/assets-raw/sprites/blocks/environment/metal-floor-damaged1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/metal-floor-damaged2.png b/core/assets-raw/sprites/blocks/environment/metal-floor-damaged2.png index 078e5e7252..8333961067 100644 Binary files a/core/assets-raw/sprites/blocks/environment/metal-floor-damaged2.png and b/core/assets-raw/sprites/blocks/environment/metal-floor-damaged2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/metal-floor-damaged3.png b/core/assets-raw/sprites/blocks/environment/metal-floor-damaged3.png index fbc921711d..01b0616d3e 100644 Binary files a/core/assets-raw/sprites/blocks/environment/metal-floor-damaged3.png and b/core/assets-raw/sprites/blocks/environment/metal-floor-damaged3.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 990e52f2df..8e3ad794b7 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -484,6 +484,7 @@ filter.option.circle-scale = Circle Scale filter.option.octaves = Octaves filter.option.falloff = Falloff filter.option.angle = Angle +filter.option.rotate = Rotate filter.option.amount = Amount filter.option.block = Block filter.option.floor = Floor @@ -1080,6 +1081,11 @@ unit.minke.name = Minke unit.bryde.name = Bryde unit.sei.name = Sei unit.omura.name = Omura +unit.retusa.name = Retusa +unit.oxynoe.name = Oxynoe +unit.cyerce.name = Cyerce +unit.aegires.name = Aegires +unit.navanax.name = Navanax unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma @@ -1291,6 +1297,12 @@ block.exponential-reconstructor.name = Exponential Reconstructor block.tetrative-reconstructor.name = Tetrative Reconstructor block.payload-conveyor.name = Payload Conveyor block.payload-router.name = Payload Router +block.duct.name = Duct +block.duct-router.name = Duct Router +block.duct-bridge.name = Duct Bridge +block.payload-propulsion-tower.name = Payload Propulsion Tower +block.payload-void.name = Payload Void +block.payload-source.name = Payload Source block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Overdrive Dome @@ -1627,9 +1639,15 @@ lenum.min = Minimum of two numbers. lenum.max = Maximum of two numbers. lenum.angle = Angle of vector in degrees. lenum.len = Length of vector. + lenum.sin = Sine, in degrees. lenum.cos = Cosine, in degrees. lenum.tan = Tangent, in degrees. + +lenum.asin = Arc sine, in degrees. +lenum.acos = Arc cosine, in degrees. +lenum.atan = Arc tangent, in degrees. + #not a typo, look up 'range notation' lenum.rand = Random decimal in range [0, value). lenum.log = Natural logarithm (ln). diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index da3a524ae7..437c6a07fc 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -626,6 +626,7 @@ status.wet.name = Basah status.muddy.name = Berlumpur status.melting.name = Meleleh status.sapped.name = Melemahkan +status.electrified.name = Dialiri listrik status.spore-slowed.name = Spora Melambat status.tarred.name = Berminyak status.overclock.name = Melebihi Batas @@ -1060,6 +1061,11 @@ unit.minke.name = Minke unit.bryde.name = Bryde unit.sei.name = Sei unit.omura.name = Omura +unit.retusa.name = Retusa +unit.oxynoe.name = Oxynoe +unit.cyerce.name = Cyerce +unit.aegires.name = Aegires +unit.navanax.name = Navanax unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma @@ -1120,6 +1126,7 @@ block.sand-water.name = Air Pasir block.darksand-water.name = Air Pasir Hitam block.char.name = Bara block.dacite.name = Dasit +block.rhyolite.name = Riolit block.dacite-wall.name = Dinding Dasit block.dacite-boulder.name = Batu Besar Dasit block.ice-snow.name = Salju Es @@ -1227,6 +1234,7 @@ block.solar-panel.name = Panel Surya block.solar-panel-large.name = Panel Surya Besar block.oil-extractor.name = Pengekstrak Minyak block.repair-point.name = Tempat Perbaikan +block.repair-turret.name = Menara Pembaikan block.pulse-conduit.name = Selang Denyut block.plated-conduit.name = Pipa Terlapis block.phase-conduit.name = Selang Phase @@ -1269,6 +1277,12 @@ block.exponential-reconstructor.name = Rekonstruktor Eksponensial block.tetrative-reconstructor.name = Rekonstruktor Tetratif block.payload-conveyor.name = Pengantar Massa block.payload-router.name = Pengarah Massa +block.duct.name = Saluran +block.duct-router.name = Pengarah Saluran +block.duct-bridge.name = Jembatan Saluran +block.payload-propulsion-tower.name = Menara Penggerak Muatan +block.payload-void.name = Penghilang Muatan +block.payload-source.name = Sumber Muatan block.disassembler.name = Pembongkar block.silicon-crucible.name = Pelebur Raksasa block.overdrive-dome.name = Kubah Projektor Pemercepat diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 7b43e80516..df0475b176 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -23,8 +23,8 @@ gameover.pvp = [accent] {0}[] チームの勝利! gameover.waiting = [accent]次のマップを待っています... highscore = [accent]ハイスコアを更新! copied = コピーしました。 -indev.notready = This part of the game isn't ready yet -indev.campaign = [accent]Congratulations! You've reached the end of the campaign![]\n\nThis is as far as the content goes right now. Interplanetary travel will be added in future updates. +indev.notready = ゲームのこの要素はまだ準備中です +indev.campaign = [accent]おめでとう! キャンペーンを達成しました![]\n\n現時点での内容はここまでです。 惑星間旅行は、今後のアップデートで追加される予定です。 load.sound = サウンド load.map = マップ @@ -306,16 +306,16 @@ cancelbuilding = [accent][[{0}][] 選択を解除する selectschematic = [accent][[{0}][] 選択し、コピーする pausebuilding = [accent][[{0}][] 建築を一時的に中断する resumebuilding = [scarlet][[{0}][] 建築を再開する -showui = UI hidden.\nPress [accent][[{0}][] to show UI. +showui = UI 非表示.\nUIを表示するには[accent][[{0}][] を押下 wave = [accent]ウェーブ {0} -wave.cap = [accent]Wave {0}/{1} +wave.cap = [accent]ウェーブ {0}/{1} wave.waiting = [lightgray]次のウェーブまで {0} 秒 wave.waveInProgress = [lightgray]ウェーブ進行中 waiting = [lightgray]待機中... waiting.players = プレイヤーを待っています... wave.enemies = [lightgray]敵は残り {0} 体 -wave.enemycores = [accent]{0}[lightgray] Enemy Cores -wave.enemycore = [accent]{0}[lightgray] Enemy Core +wave.enemycores = [accent]{0}[lightgray] 敵性コア +wave.enemycore = [accent]{0}[lightgray] 敵性コア wave.enemy = [lightgray]敵は残り {0} 体 wave.guardianwarn = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。 wave.guardianwarn.one = [red][[警告][]ガーディアンがあと [accent]{0}[] ウェーブで来ます。 @@ -551,10 +551,10 @@ sectors.stored = 保存済み: sectors.resume = 再開 sectors.launch = 打ち上げ sectors.select = 選択 -sectors.nonelaunch = [lightgray]none (sun) +sectors.nonelaunch = [lightgray]無し (sun) sectors.rename = セクター名を変更 sectors.enemybase = [scarlet]敵基地 -sectors.vulnerable = [scarlet]Vulnerable +sectors.vulnerable = [scarlet]脆弱 sectors.underattack = [scarlet]攻撃を受けます! [accent]{0}% 破損 sectors.survives = [accent]{0} ウェーブ生存 sectors.go = Go @@ -589,27 +589,27 @@ sector.overgrowth.name = オーバーグロウス sector.tarFields.name = ター · フィールズ sector.saltFlats.name = ソルト · フラッツ sector.fungalPass.name = ファングル · パス -sector.biomassFacility.name = Biomass Synthesis Facility -sector.windsweptIslands.name = Windswept Islands -sector.extractionOutpost.name = Extraction Outpost -sector.planetaryTerminal.name = Planetary Launch Terminal +sector.biomassFacility.name = バイオマス シンテシス ファシリティ +sector.windsweptIslands.name = ウインドスイープト アイランズ +sector.extractionOutpost.name = エクストラクション アウトポスト +sector.planetaryTerminal.name = プラネタリー ローンチ ターミナル -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. -sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. -sector.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -sector.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. -sector.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. -sector.biomassFacility.description = The origin of spores. This is the facility in which they were researched and initially produced.\nResearch the technology contained within. Cultivate spores for the production of fuel and plastics.\n\n[lightgray]Upon this facility's demise, the spores were released. Nothing in the local ecosystem could compete with such an invasive organism. -sector.windsweptIslands.description = Further past the shoreline is this remote chain of islands. Records show they once had [accent]Plastanium[]-producing structures.\n\nFend off the enemy's naval units. Establish a base on the islands. Research these factories. -sector.extractionOutpost.description = A remote outpost, constructed by the enemy for the purpose of launching resources to other sectors.\n\nCross-sector transport technology is essential for further conquest. Destroy the base. Research their Launch Pads. -sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology. -sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure. +sector.groundZero.description = 奪回を始めるには最適な場所です。敵脅威が低いが、資源が少ない。\nできるだけ多くの動と鉛を集めます。\n始めましょう。 +sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。極寒の気温もそれらを永遠に封じ込めることはできません。\n\n電気に挑みましょう。火力発電機を建設し、修復機の使い方を学びましょう。 +sector.saltFlats.description = 砂漠のはずれにあるソルト · フラッツです。ここには資源がほとんどありません。\n\n敵はここに資源貯蔵施設を建設しました。彼らのコアを絶ち、掃滅してください。 +sector.craters.description = 過去の戦争の名残であるクレーターに水が溜まっています。エリアを取り戻し、砂を集め、メタガラスを精錬します。タレットとドリルを冷却するために水をポンプで送ります。 +sector.ruinousShores.description = 荒れ地を過ぎると海岸線です。ここにはかつて沿岸防衛隊が配備されていましたが、ほぼ残存していません。最も基本的な防衛施設のみが無傷のまま残っており、それ以外は全て破壊されています。\n外部拡張を続け、テクノロジーを再取得しましょう。 +sector.stainedMountains.description = 更に内陸には、胞子に汚染されていない山があります。\nこの地域にはチタンが豊富にあります。抽出して使い方を学びましょう。\n\nより多くの敵が襲来します。最強のユニットを送る時間を与えないでください。 +sector.overgrowth.description = このエリアは、胞子の発生源に近く生い茂っています。\n敵はここに前哨基地を配備しました。タイタンユニットを生産し、破壊しましょう。失ったものを取り戻すのです。 +sector.tarFields.description = 山と砂漠に挟まれた、石油産出地帯のはずれです。使用可能なタール埋蔵量がある数少ないエリアの1つです。\n放棄されたエリアですが、近くに脅威となる敵がいます。\n\n[lightgray]可能であれば石油抽出機を研究しましょう。 +sector.desolateRift.description = 非常に危険な地帯です。資源は豊富ですが、空間が狭いです。破壊されるリスクが高いため、一刻も早く立ち去りましょう。敵の攻撃間隔が長いですが、気を抜かないでください。 +sector.nuclearComplex.description = 崩壊したトリウム製造・加工施設です。\n[lightgray]トリウムとその多くの用途を研究してください。\n\n多くの敵がここに存在し、常に攻撃を偵察しています。 +sector.fungalPass.description = 高山と、胞子の多い低地との間の遷移地域です。ここには敵の小さな偵察基地があります。\n破壊しましょう。\nダガーとクローラーユニットを使い、2つの敵コアの排除しましょう、 +sector.biomassFacility.description = 胞子の発生源です。これらは、胞子の研究により、最初に建設された施設です。\n内部に残された技術を研究しましょう。燃料とプラスタニウムの生産のために胞子を培養します。\n\n[lightgray]この施設が活動停止したために、胞子が放出されました。地域の生態系には、そのような侵略的生物と競合するものはありません。 +sector.windsweptIslands.description = 海岸をさらに進むと、辺鄙な列島があります。記録によると、ここにはかつて[accent]プラスタニウム[]-を生産するシステムがありました。\n\n敵の海軍ユニットを撃沈しましょう。島々に基地を建造し、これらの工場を調査しましょう。 +sector.extractionOutpost.description = 他のセクターへ資源を輸送するために建設された敵の遠隔地の前哨基地です。\n\nさらなる征伐のためには、セクター感を通ずる輸送技術が不可欠です。基地を破壊しましょう。彼らの発射台を研究してください。 +sector.impact0078.description = ここには、最初にこの星系に入った星間輸送船の残骸があります。\n\n残骸を可能な限り回収し、完全な技術を研究しましょう。 +sector.planetaryTerminal.description = 最終目標です。\n\nこの沿岸基地には、コアを他の惑星に打ち上げることが出来る建造物があります。極めて堅固に守られています。\n\n海軍ユニットを生産し、できるだけ速やかに敵を排除しましょう。発射建造物を研究しましょう。 settings.language = 言語 settings.data = ゲームデータ @@ -679,7 +679,7 @@ stat.boosteffect = ブースト効果 stat.maxunits = 最大ユニット数 stat.health = 耐久値 stat.buildtime = 建設時間 -stat.maxconsecutive = Max Consecutive +stat.maxconsecutive = 最大連鎖 stat.buildcost = 建設費用 stat.inaccuracy = 誤差 stat.shots = ショット @@ -715,8 +715,8 @@ ability.shieldregenfield = シールドリペアフィールド ability.movelightning = ムーブメントライトニング bar.drilltierreq = より高性能なドリルを使用してください -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = 不足している資源 +bar.corereq = コアベースが必要 bar.drillspeed = 採掘速度: {0}/秒 bar.pumpspeed = ポンプの速度: {0}/s bar.efficiency = 効率: {0}% @@ -740,7 +740,7 @@ units.processorcontrol = [lightgray]プロセッサーの制御下 bullet.damage = [stat]{0}[lightgray] ダメージ bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ 約[stat] {1}[lightgray] タイル bullet.incendiary = [stat]焼夷弾 -bullet.sapping = [stat]sapping +bullet.sapping = [stat]吸収弾 bullet.homing = [stat]追尾弾 bullet.shock = [stat]電撃 bullet.frag = [stat]爆発弾 @@ -817,7 +817,7 @@ setting.conveyorpathfinding.name = コンベアー配置経路探索 setting.sensitivity.name = 操作感度 setting.saveinterval.name = 自動保存間隔 setting.seconds = {0} 秒 -setting.milliseconds = {0} milliseconds +setting.milliseconds = {0} ミリ秒 setting.fullscreen.name = フルスクリーン setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります) setting.fps.name = FPSを表示 @@ -843,7 +843,7 @@ setting.bridgeopacity.name = ブリッジの透明度 setting.playerchat.name = ゲーム内にチャットを表示 setting.showweather.name = 天気のグラフィックを表示 public.confirm = ゲームを公開しますか?\n[accent]誰でもゲームに参加できるようになります。\n[lightgray]あとから設定で変更できます。 -public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]? +public.confirm.really = フレンドと遊びたい場合は、[scarlet]公開サーバー[] ではなく [green]フレンド招待[] を使おう!\nゲームを [scarlet]公開[]してもよろしいですか? public.beta = ベータ版では使用できません。 uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります... uiscale.cancel = キャンセル & 終了 @@ -918,7 +918,7 @@ keybind.toggle_menus.name = メニュー切り替え keybind.chat_history_prev.name = 前のチャット履歴 keybind.chat_history_next.name = 次のチャット履歴 keybind.chat_scroll.name = チャットスクロール -keybind.chat_mode.name = Change Chat Mode +keybind.chat_mode.name = チャットモードの変更 keybind.drop_unit.name = ドロップユニット keybind.zoom_minimap.name = ミニマップのズーム mode.help.title = モード説明 @@ -926,7 +926,7 @@ mode.survival.name = サバイバル mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵が出現する必要があります。 mode.sandbox.name = サンドボックス mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。 -mode.editor.name = Editor +mode.editor.name = エディター mode.pvp.name = PvP mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。 mode.attack.name = アタック @@ -1226,10 +1226,10 @@ block.command-center.name = 司令塔 block.ground-factory.name = 陸軍工場 block.air-factory.name = 空軍工場 block.naval-factory.name = 海軍工場 -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor +block.additive-reconstructor.name = 加法式再構成工場 +block.multiplicative-reconstructor.name = 乗法式再構成工場 +block.exponential-reconstructor.name = 指数式再構成工場 +block.tetrative-reconstructor.name = 超冪式再構成工場 block.payload-conveyor.name = マスコンベアー block.payload-router.name = ペイロードルーター block.disassembler.name = ディスアセンブラー @@ -1259,64 +1259,64 @@ team.green.name = グリーン team.purple.name = パープル hint.skip = スキップ -hint.desktopMove = Use [accent][[WASD][] to move. -hint.zoom = [accent]Scroll[] to zoom in or out. -hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually. -hint.desktopShoot = [accent][[Left-click][] to shoot. -hint.depositItems = To transfer items, drag from your ship to the core. -hint.respawn = To respawn as a ship, press [accent][[V][]. -hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[] -hint.desktopPause = Press [accent][[Space][] to pause and unpause the game. -hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it. -hint.placeDrill.mobile = Select the \ue85e[accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm. -hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. -hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors. -hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them. -hint.breaking = [accent]Right-click[] and drag to break blocks. -hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection. -hint.research = Use the \ue875 [accent]Research[] button to research new technology. -hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology. -hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. -hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets. -hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right. -hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[]. -hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type. -hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path. -hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path. -hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters. -hint.command = Press [accent][[G][] to command nearby units of [accent]similar type[] into formation.\n\nTo command ground units, you must first control another ground unit. -hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation. -hint.payloadPickup = Press [accent][[[] to pick up small blocks or units. -hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up. -hint.payloadDrop = Press [accent]][] to drop a payload. -hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. -hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[]. -hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. -hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the  [accent]Shard[] core. Make sure it is free from nearby obstructions. -hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[]. -hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. -hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. +hint.desktopMove = [accent][[WASD][] を使い移動します。 +hint.zoom = [accent]マウスホイール[] でズームイン、ズームアウトをします。 +hint.mine = \uf8c4 銅の近くに移動し、 [accent]タップ[] して手動で採掘します。 +hint.desktopShoot = [accent][[左クリック][] で射撃します。 +hint.depositItems = アイテムを移すには、シップからコアへドラッグします。 +hint.respawn = シップとしてリスポーンするには、 [accent][[V][]を押します。 +hint.respawn.mobile = ユニット/建造物のコントロールを得ました。シップとしてリスポーンするには、 [accent]左上のアイコンをタップします。[] +hint.desktopPause = [accent][[スペース][] を押して、ゲームを一時停止と一時停止の解除ができます。 +hint.placeDrill = 右下のメニューの \ue85e [accent]ドリル[] タブを選択し、 \uf870 [accent]ドリル[] を選択し、銅地域をクリックして配置します。 +hint.placeDrill.mobile = 右下のメニューの \ue85e [accent]ドリル[] タブを選択し、 \uf870 [accent]ドリル[] を選択し、銅地域をタップして配置します。\n\n右下の \ue800 [accent]チェックマーク[] をタップして確認します。 +hint.placeConveyor = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。 \ue814 [accent]運搬[] タブから、 \uf896 [accent]コンベアー[] を選択します。\n\n複数のコンベアーを配置するには、クリックしてドラッグします。\n[accent]マウスホイール[] により回転します。 +hint.placeConveyor.mobile = コンベアーを使い、アイテムをドリルから他のブロックへ移動します。 \ue814 [accent]運搬[] タブから、 \uf896 [accent]コンベアー[] を選択します。\n\n指を1秒間押したままドラッグすると、複数のコンベアーを配置します。 +hint.placeTurret = \uf861 [accent]ターレット[] を配置して、敵から基地を守ります。\n\nターレットには弾薬が必要です。この場合は \uf838銅です。\nコンベアーとドリルを使用して補給します。 +hint.breaking = [accent]右クリック[] と右クリックドラッグによりブロックを壊します。 +hint.breaking.mobile = 右下にある \ue817 [accent]ハンマー[] をアクティブにして、タップしてブロックを壊します。\n\n指を1秒間押したままドラッグすると、範囲選択が出来ます。 +hint.research = \ue875 [accent]研究[] ボタンを押して、新しいテクノロジーを研究します。 +hint.research.mobile = \ue88c [accent]メニュー[] の \ue875 [accent]研究[] ボタンを押して、新しいテクノロジーを研究します。 +hint.unitControl = [accent][[左ctrl][] を押しながら [accent]クリック[] するとターレットや味方ユニットを操作できます。 +hint.unitControl.mobile = [accent][ダブルタップ[] すると味方ユニットやターレットを操作できます。 +hint.launch = 十分な資源を確保できたら、右下の \ue827 [accent]マップ[] から、近くのセクターを選択して [accent]発射[] できます。 +hint.launch.mobile = 十分な資源を確保できたら、 \ue88c [accent]メニュー[] の \ue827 [accent]マップ[] から、近くのセクターを選択して [accent]発射[] できます。 +hint.schematicSelect = [accent][[F][] を押しながらドラッグして、コピー&ペーストするブロックを選択します。\n\n[accent][[ミドルクリック][] により、1つのブロックタイプをコピーします。 +hint.conveyorPathfind = [accent][[左-Ctrl][] を押しながらコンベアーをドラッグすると、経路が自動生成されます。 +hint.conveyorPathfind.mobile = \ue844 [accent]対角線モード[] を有効にし、コンベアーをドラッグすると経路が自動生成します。 +hint.boost = [accent][[左シフト][] を押したままにすると、操作中のユニットは障害物を飛び越えます。\n\n少数の地上ユニットのみがこのブースターを搭載しています。 +hint.command = [accent][[G][] を押して、近くの [accent]同様のタイプ[] のユニットと編隊を組みます。\n\n地上ユニットを指揮するには、まず別個の地上ユニットをコントロールする必要があります。 +hint.command.mobile = [accent][[ダブルタップ][] すると、操作中のユニットは近くのユニットと編隊を組みます。 +hint.payloadPickup = [accent][[[] を押して、小さなブロックまたはユニットを格納します。 +hint.payloadPickup.mobile = [accent]タップ&ホールド[] により、小さなブロックまたはユニットを格納します。 +hint.payloadDrop = [accent]][] を押すと、積載物を降ろします。 +hint.payloadDrop.mobile = 空いている場所を [accent]タップ&ホールド[] して、積載物を降ろします。 +hint.waveFire = [accent]ウェーブ[] ターレットは水を搬入すると、近くの火を自動的に消火します。 +hint.generator = \uf879 [accent]火力発電機[] 石炭を燃やし、隣接するブロックに電力を供給します。\n\n電力供給範囲は \uf87f [accent]電源ノード[]で拡張できます。 +hint.guardian = [accent]ガーディアン[] ユニットは装甲を搭載しています。[accent]銅[] や [accent]鉛[] などの弱い弾薬は [scarlet]効果がありません[]。\n\n強力なターレット、または \uf861デュオ/\uf859サルボー の弾薬に \uf835 [accent]黒鉛[]を使用してガーディアンを撃破してください。 +hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n  [accent]シャード[] コアの上に、  [accent]ファンデーション[] コアを置きます。近くに障害物がないことを確認してください。 +hint.presetLaunch = [accent]フローズン · フォレスト[] などの灰色の [accent]着陸ゾーンセクター[] には、どこからでも発射できます。近くの領土を確保する必要はありません。\n\nこのような [accent]数字のセクター[] は、 [accent]違います[]。 +hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず [accent]破棄[]されます。 +hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは [accent]あなたのセクター[] に移送されます。\n\nホストが行った新しい研究も引き継がれます。 item.copper.description = 便利な鉱石です。様々なブロックの材料として幅広く使われています。 item.copper.details = セルプロに豊富な金属。補強しない限り構造的に弱い。 item.lead.description = 一般的で手軽な鉱石です。機械や液体輸送ブロックなどに使われます。 -item.lead.details = Dense. Inert. Extensively used in batteries.\nNote: Likely toxic to biological life forms. Not that there are many left here. +item.lead.details = 高密度。不活性。バッテリーによく利用される。\nノート: 生物学的に生命に有毒である可能性があります。このあたりには生命が多く残っていません。 item.metaglass.description = とても頑丈な強化ガラスです。液体の輸送やタンクとして幅広く使われています。 item.graphite.description = 弾薬や絶縁体として利用されています。 item.sand.description = 合金や融剤など広く使用されている一般的な材料です。 item.coal.description = 一般的で有用な燃料です。 -item.coal.details = Appears to be fossilized plant matter, formed long before the seeding event. +item.coal.details = 化石化して植物のようで、利用方法が確立されるはるか前に形成されました。 item.titanium.description = 希少で非常に軽量な金属です。液体輸送やドリル、航空機などで使われます。 item.thorium.description = 放射性を持つ高密度な金属です。建造物の支えや核燃料として使われます。 item.scrap.description = 昔の建造物やユニットの残骸です。様々な種類の金属が微量に含まれています。 -item.scrap.details = Leftover remnants of old structures and units. +item.scrap.details = 古い建造物やユニットの残骸です。 item.silicon.description = 非常に有用な半導体でソーラーパネルや多くの複雑な機械に応用できます。 item.plastanium.description = 軽量で伸縮性のある材料です。高度な航空機や分散型の弾薬として使用されます。 item.phase-fabric.description = 極めて軽量な素材です。高度な機械や自己修復技術に使用されます。 item.surge-alloy.description = 電気的特性を持った高度な合金です。 item.spore-pod.description = 石油や爆薬、燃料への転換として使用されます。 -item.spore-pod.details = Spores. Likely a synthetic life form. Emit gases toxic to other biological life. Extremely invasive. Highly flammable in certain conditions. +item.spore-pod.details = 合成生命体と思われる胞子です。他の生物に有毒なガスを放出し、非常に侵略的です。特定の条件下で非常に高い可燃性を持ちます。 item.blast-compound.description = 爆弾や爆発物に使われる不安定な化合物です。胞子と揮発性物質から合成されます。燃料として燃やすこともできますが、お勧めしません。 item.pyratite.description = 焼夷兵器などに使われる非常に燃えやすい物質です。 @@ -1379,7 +1379,7 @@ block.phase-conveyor.description = 改良されたアイテム転送ブロック block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。 block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出されます。他のアイテムが搬入されるとアイテムを通過させます。通常のルーターと反対の動作をします。 block.router.description = 搬入したアイテムをほかの3方向に均等に搬出します。一つの資源から複数に分ける際などに使われます。 -block.router.details = A necessary evil. Using next to production inputs is not advised, as they will get clogged by output. +block.router.details = 最悪の設置は、搬入のために生産施設に隣接させることです。搬出によって詰まる可能性があるためおすすめできません。 block.distributor.description = 高度なルーターです。搬入したアイテムをほかの7方向に均等に分けて搬出します。 block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合に左右にアイテムを搬出します。 block.underflow-gate.description = オーバーフローゲートの反対の機能を持ちます。 左右に出力できない場合、前面に出力します。 @@ -1416,14 +1416,14 @@ block.laser-drill.description = 電力を使用したレーザー技術でより block.blast-drill.description = 上位のドリルです。大量の電力が必要になります。 block.water-extractor.description = 地面から水を汲み上げます。近くに湖がない場合に有用です。 block.cultivator.description = 胞子の小さな集まりを工業用ポッドに培養します。 -block.cultivator.details = Recovered technology. Used to produce massive amounts of biomass as efficiently as possible. Likely the initial incubator of the spores now covering Serpulo. +block.cultivator.details = 取り戻されたテクノロジー。大量のバイオマスを可能な限り効率的に生産します。おそらく最初の培養機により、今セルプロは胞子に覆われています、 block.oil-extractor.description = 大量の電力を使用して、砂から石油を回収します。近くに油田がない場合に有用です。 block.core-shard.description = 基本的なコアです。一度破壊されると、その地域との接続が途絶えます。破壊されないようにしましょう。 -block.core-shard.details = The first iteration. Compact. Self-replicating. Equipped with single-use launch thrusters. Not designed for interplanetary travel. +block.core-shard.details = 最初のバージョンです。コンパクトで自己複製可能、使い捨ての発射スラスターを装備しています。惑星間旅行用には設計されていません。 block.core-foundation.description = バージョンアップしたコアです。より堅く、より多くの資源を格納できます。 -block.core-foundation.details = The second iteration. +block.core-foundation.details = 2番目のバージョンです。 block.core-nucleus.description = さらにバージョンアップしたコアです。優れた耐久性と大量の資源を格納できます。 -block.core-nucleus.details = The third and final iteration. +block.core-nucleus.details = 3番目で最終バージョンです。 block.vault.description = 各種類のアイテムを大量に保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。[lightgray]搬出機[]を使って、ボールトからアイテムを搬出できます。 block.container.description = 各種類のアイテムを少量ずつ保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。 [lightgray]搬出機[]を使って、コンテナーからアイテムを搬出できます。 block.unloader.description = コンテナやボールト、コアからアイテムをコンベアーか隣接するブロックに搬出します。搬出機をタップして搬出するアイテムを変更することができます。 @@ -1470,36 +1470,36 @@ block.logic-display.description = プロセッサからの任意のグラフィ block.large-logic-display.description = プロセッサからの任意のグラフィックを表示します。 block.interplanetary-accelerator.description = 巨大な電磁レールガンタワーです。別惑星への展開のためにコアを重力圏脱出可能速度まで加速します。 -unit.dagger.description = Fires standard bullets at all nearby enemies. -unit.mace.description = Fires streams of flame at all nearby enemies. -unit.fortress.description = Fires long-range artillery at ground targets. -unit.scepter.description = Fires a barrage of charged bullets at all nearby enemies. -unit.reign.description = Fires a barrage of massive piercing bullets at all nearby enemies. -unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight. -unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight. -unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded. -unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight. -unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain. -unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion. -unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain. -unit.spiroct.description = Fires sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. -unit.arkyid.description = Fires large sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. -unit.toxopid.description = Fires large electric cluster-shells and piercing lasers at enemies. Can step over most terrain. -unit.flare.description = Fires standard bullets at nearby ground targets. -unit.horizon.description = Drops clusters of bombs on ground targets. -unit.zenith.description = Fires salvos of missiles at all nearby enemies. -unit.antumbra.description = Fires a barrage of bullets at all nearby enemies. -unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies. -unit.mono.description = Automatically mines copper and lead, depositing it into the core. -unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction. -unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units. -unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units. -unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units. -unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies. -unit.minke.description = Fires shells and standard bullets at nearby ground targets. -unit.bryde.description = Fires long-range artillery shells and missiles at enemies. -unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies. -unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units. -unit.alpha.description = Defends the Shard core from enemies. Builds structures. -unit.beta.description = Defends the Foundation core from enemies. Builds structures. -unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. +unit.dagger.description = 近くの敵に標準的な弾丸を発射します。 +unit.mace.description = 近くの敵に火炎放射を発射します。 +unit.fortress.description = 地上目標に長距離砲を発射します。 +unit.scepter.description = 近くの敵に電撃弾を発射します。 +unit.reign.description = 近くの敵に大口径の貫通弾を発射します。 +unit.nova.description = 敵にダメージを与え、味方の建造物を修復する光線を発射します。飛行可能。 +unit.pulsar.description = 敵にダメージを与え、味方の建造物を修復する電撃攻撃を行います。飛行可能。 +unit.quasar.description = 敵にダメージを与え、味方の建造物を修復するレーザー弾を発射します。飛行可能。シールド形成。 +unit.vela.description = 敵にダメージを与え、火災を引き起こし、味方の建造物を修復するレーザー焼夷弾を発射します。飛行可能。 +unit.corvus.description = 敵にダメージを与え、味方の建造物を修復する大火力のレーザー弾を発射します。ほとんどの地形を無視できます。 +unit.crawler.description = 敵に向かって走り自爆し、大爆発を起こす。 +unit.atrax.description = 地上目標を消耗させるスラグ弾を発射します。ほとんどの地形を無視できます。 +unit.spiroct.description = 敵に吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。 +unit.arkyid.description = 敵に大口径の吸収レーザービームを発射し、与えたダメージを自らの体力として吸収します。ほとんどの地形を無視できます。 +unit.toxopid.description = 敵に大口径の電撃クラスターシェルと貫通レーザーを発射します。ほとんどの地形を無視できます。 +unit.flare.description = 近くの地上目標に標準的な弾丸を発射します。 +unit.horizon.description = 地上目標にクラスター爆弾を投下します。 +unit.zenith.description = 近くの敵にミサイルを一斉発射します。 +unit.antumbra.description = 近くの敵に弾幕のように弾丸を連射します。 +unit.eclipse.description = 近くの敵に2門の貫通レーザーと高射砲の弾幕を発射します。 +unit.mono.description = 銅と鉛を自動的に採掘し、コアに移送します。 +unit.poly.description = 破壊された建造物を自動的に再構築し、さらに建設の支援を行います。 +unit.mega.description = 損傷した建造物を自動的に修復します。小型のブロックと地上ユニットを運搬できます。 +unit.quad.description = 地上目標に大型爆弾を投下し、味方の建造物は修復し、敵にはダメージを与えます。中型の地上ユニットを運搬できます。 +unit.oct.description = シールド形成と修復を行い、付近の味方を守ります。ほとんどの地上ユニットを運搬できます。 +unit.risso.description = 近くの敵にミサイルと弾丸の弾幕を発射します。 +unit.minke.description = 近くの地上目標に砲弾と標準的な弾丸を発射します。 +unit.bryde.description = 敵に長距離砲弾とミサイルを発射します。 +unit.sei.description = 敵にミサイルと徹甲弾の弾幕を発射します。 +unit.omura.description = 敵に長距離かつ貫通性能を持つレールガンボルトを発射します。フレアユニットを生産します。 +unit.alpha.description = シャードコアを敵から守ります。建造物を建築します。 +unit.beta.description = ファンデーションコアを敵から守ります。建造物を建築します。 +unit.gamma.description = ニュークリアスコアを敵から守ります。建造物を建築します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index fbd7d3cdce..3a9f26652e 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -9,7 +9,7 @@ link.changelog.description = 업데이트 내용 목록 link.dev-builds.description = 불안정한 개발 버전 link.trello.description = 출시 예정 기능 계획을 게시한 공식 Trello 보드 link.itch.io.description = PC 다운로드가 있는 itch.io 페이지 -link.google-play.description = oogle Play 스토어 목록 +link.google-play.description = Google Play 스토어 목록 link.f-droid.description = F-Droid 카탈로그 목록 link.wiki.description = 공식 Mindustry 위키 link.suggestions.description = 새 기능 제안하기 @@ -67,6 +67,14 @@ schematic.delete.confirm = 이 설계도는 완전히 삭제될 것입니다. schematic.rename = 설계도 이름 바꾸기 schematic.info = {0}x{1}, {2} 블록 schematic.disabled = [scarlet]설계도 비활성화됨[]\n이 [accent]맵[] 또는 [accent]서버[] 에서는 설계도를 사용할 수 없습니다. +schematic.tags = 태그: +schematic.edittags = 태그 수정하기 +schematic.addtag = 태그 추가하기 +schematic.texttag = 텍스트 태그 +schematic.icontag = 아이콘 태그 +schematic.renametag = 태그 이름바꾸기 +schematic.tagdelconfirm = 이 태그를 완전히 삭제하시겠습니까? +schematic.tagexists = 이 태그는 이미 존재합니다. stats = 전투 결과 stat.wave = 패배한 단계:[accent] {0} @@ -153,11 +161,11 @@ mod.folder.missing = 창작마당에는 폴더 형태의 모드만 게시할 수 mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하지 않습니다. 게임을 플레이하려면 이 모드를 비활성화해야 합니다. about.button = 정보 -name = 닉네임 : +name = 닉네임 : noname = 먼저 [accent]플레이어 이름[]을 설정하세요. planetmap = 행성 지도 launchcore = 코어 출격 -filename = 파일 이름: +filename = 파일 이름: unlocked = 새로운 콘텐츠가 해금되었습니다! available = 새로운 콘텐츠 해금이 가능합니다! completed = [accent]완료됨 @@ -306,7 +314,6 @@ data.exported = 데이터를 내보냈습니다. data.invalid = 유효한 게임 데이터가 아닙니다. data.import.confirm = 외부 데이터를 가져오면 현재 게임 데이터를 [scarlet]모두[] 덮어쓰게 됩니다.\n[accent]이 작업은 취소할 수 없습니다![]\n\n데이터를 가져오면 게임이 즉시 종료됩니다. quit.confirm = 정말로 종료하시겠습니까? -quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은[accent]설정->게임->튜토리얼[]에서 다시 하실 수 있습니다. loading = [accent]불러오는중... reloading = [accent]모드 새로고침하는중... saving = [accent]저장중... @@ -448,7 +455,7 @@ toolmode.square.description = 정사각형 형태의 브러시로 교체합니 toolmode.eraseores = 자원 초기화 toolmode.eraseores.description = 자원만 초기화합니다. toolmode.fillteams = 팀 채우기 -toolmode.fillteams.description = 블록 대신 선택한 팀으로 블록 팀을 채웁니다. +toolmode.fillteams.description = 블록 대신 선택한 팀으로 블록 팀을 채웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록 대신 선택한 팀으로 블록 팀을 그립니다. @@ -477,6 +484,7 @@ filter.option.circle-scale = 원 크기 filter.option.octaves = 옥타브 filter.option.falloff = 경사 filter.option.angle = 각도 +filter.option.rotate = 방향 filter.option.amount = 개수 filter.option.block = 블록 filter.option.floor = 타일 @@ -498,6 +506,7 @@ load = 불러오기 save = 저장하기 fps = FPS: {0} ping = Ping: {0}ms +tps = TPS: {0} memory = Mem: {0}mb memory2 = Mem:\n {0}mb +\n {1}mb language.restart = 언어 설정을 적용하려면 게임을 다시 시작하세요. @@ -530,7 +539,7 @@ launch.from = 출격 출발지 : [accent]{0} launch.destination = 목적지: {0} configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. add = 추가... -boss.health = 수호자 체력 +guardian = 수호자 connectfail = [scarlet]연결 오류:\n\n[accent]{0} error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? @@ -574,6 +583,7 @@ sector.attacked = [accent]{0}[white] 지역이 공격받고 있습니다! sector.lost = [accent]{0}[white] 지역을 잃었습니다! #note: the missing space in the line below is intentional sector.captured = [accent]{0}[white] 지역을 점령했습니다! +sector.changeicon = 아이콘 바꾸기 threat.low = 낮음 threat.medium = 높지 않지만 낮지도 않음 @@ -626,11 +636,12 @@ status.wet.name = 젖음 status.muddy.name = 질척해짐 status.melting.name = 융해 status.sapped.name = 흡혈됨 -status.spore-slowed.name = 포자 느려짐 -status.tarred.name = Tarred +status.electrified.name = 과전류 +status.spore-slowed.name = 포자감속 +status.tarred.name = 타르화 status.overclock.name = 과부하 -status.shocked.name = 충격 -status.blasted.name = 폭파됨 +status.shocked.name = 감전 +status.blasted.name = 파열 status.unmoving.name = 멈춤 settings.language = 언어 @@ -654,6 +665,7 @@ settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠 paused = [accent]< 일시정지 > clear = 초기화 banned = [scarlet]금지됨 +unsupported.environment = [scarlet]지원되지 않는 환경 yes = O no = X info.title = 정보 @@ -668,7 +680,7 @@ stat.input = 입력 stat.output = 출력 stat.booster = 가속 stat.tiles = 필요한 타일 -stat.affinities = 친화력 +stat.affinities = 작용 가능 stat.opposites = 상성 stat.powercapacity = 전력 용량 stat.powershot = 전력/발 @@ -692,6 +704,7 @@ stat.memorycapacity = 변수 용량 stat.basepowergeneration = 기본 전력 발전량 stat.productiontime = 소요 시간 stat.repairtime = 건물 완전 수리 시간 +stat.repairspeed = 수리 속도 stat.weapons = 무기 stat.bullet = 탄환 stat.speedincrease = 속도 증가 @@ -706,7 +719,7 @@ stat.buildtime = 건설 시간 stat.maxconsecutive = 최대 체인 stat.buildcost = 건설 비용 stat.inaccuracy = 오차각 -#stat.shots = 발사 수 (안쓰임) +stat.shots = 발사 수 stat.reload = 초당 발사 수 stat.ammo = 탄약 stat.shieldhealth = 보호막 체력 @@ -717,7 +730,7 @@ stat.lightningchance = 전격 확률 stat.lightningdamage = 전격 피해량 stat.flammability = 인화성 stat.radioactivity = 방사성 -stat.charge = 과충전율 +stat.charge=과충전률 stat.heatcapacity = 열 용량 stat.viscosity = 점성 stat.temperature = 온도 @@ -736,14 +749,16 @@ stat.healthmultiplier = 체력 배수 stat.speedmultiplier = 이동속도 배수 stat.reloadmultiplier = 재장전 배수 stat.buildspeedmultiplier = 건설속도 배수 -stat.reactive = 반응성 +stat.reactive = 작용 받음 +stat.healing = 회복량 ability.forcefield = 보호막 필드 ability.repairfield = 수리 필드 -ability.statusfield = 상태이상 필드 +ability.statusfield = {0} 상태이상 필드 ability.unitspawn = {0} 공장 ability.shieldregenfield = 방어막 복구 필드 ability.movelightning = 가속 전격 +ability.energyfield = 에너지 필드: [accent]{1}[]타일 내 [accent]{2}[]개 목표물에게 [accent]{0}[]피해량 bar.drilltierreq = 더 좋은 드릴 필요 bar.noresources = 자원 부족 @@ -766,6 +781,7 @@ bar.power = 전력 bar.progress = 건설 진행도 bar.input = 입력 bar.output = 출력 +bar.strength = [stat]{0}[lightgray]x 치료 속도 units.processorcontrol = [lightgray]프로세서 제어됨 @@ -780,7 +796,7 @@ bullet.knockback = [stat]{0}[lightgray] 넉백 bullet.pierce = [stat]{0}[lightgray]번 관통 bullet.infinitepierce = [stat]관통 bullet.healpercent = [stat]{0}[lightgray]% 회복 -bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수 +bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수 bullet.reload = [stat]{0}[lightgray]배 발사 속도 unit.blocks = 블록 @@ -898,7 +914,7 @@ keybind.press = 키를 누르세요... keybind.press.axis = 마우스 휠 또는 키를 누르세요... keybind.screenshot.name = 맵 스크린 캡처 keybind.toggle_power_lines.name = 전선 가시도 설정 -keybind.toggle_block_status.name = 블록 상태 가시도 +keybind.toggle_block_status.name = 블록 상태 가시도 keybind.move_x.name = X축 이동 keybind.move_y.name = Y축 이동 keybind.mouse_move.name = 커서를 따라서 이동 @@ -974,6 +990,7 @@ rules.wavetimer = 시간 제한이 있는 단계 rules.waves = 단계 rules.attack = 공격 모드 rules.buildai = AI 건설 +rules.corecapture = 코어 파괴 시 점령 rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.blockhealthmultiplier = 블록 체력 배수 rules.blockdamagemultiplier = 블록 공격력 배수 @@ -1003,7 +1020,7 @@ rules.explosions = 블록/유닛 폭발 데미지 rules.ambientlight = 자연 조명 표시 rules.weather = 날씨 추가 rules.weather.frequency = 빈도: -rules.weather.always = 항상 +rules.weather.always = 항상 rules.weather.duration = 지속 시간: content.item.name = 자원 @@ -1029,6 +1046,7 @@ item.blast-compound.name = 폭발물 item.pyratite.name = 파이라타이트 item.metaglass.name = 강화 유리 item.scrap.name = 고철 + liquid.water.name = 물 liquid.slag.name = 광재 liquid.oil.name = 석유 @@ -1060,6 +1078,11 @@ unit.minke.name = 민케 unit.bryde.name = 브라이드 unit.sei.name = 세이 unit.omura.name = 오무라 +unit.retusa.name = 레투사 +unit.oxynoe.name = 옥시노 +unit.cyerce.name = 사이어스 +unit.aegires.name = 에어리어스 +unit.navanax.name = 나바낙스 unit.alpha.name = 알파 unit.beta.name = 베타 unit.gamma.name = 감마 @@ -1122,6 +1145,7 @@ block.char.name = 숯 block.dacite.name = 석영안산암 block.dacite-wall.name = 석영안산암 벽 block.dacite-boulder.name = 석영안산암 +block.rhyolite.name = 유문암 block.ice-snow.name = 얼음눈 block.stone-wall.name = 돌 벽 block.ice-wall.name = 얼음 벽 @@ -1227,6 +1251,7 @@ block.solar-panel.name = 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판 block.oil-extractor.name = 석유 추출기 block.repair-point.name = 수리 지점 +block.repair-turret.name = 수리 포탑 block.pulse-conduit.name = 펄스 파이프 block.plated-conduit.name = 도금된 파이프 block.phase-conduit.name = 메타 파이프 @@ -1269,10 +1294,16 @@ block.exponential-reconstructor.name = 재구성기 : Exponential block.tetrative-reconstructor.name = 재구성기 : Tetrative block.payload-conveyor.name = 화물 컨베이어 block.payload-router.name = 화물 분배기 +block.duct.name = 도관 +block.duct-router.name = 도관 분배기 +block.duct-bridge.name = 도관 다리 +block.payload-propulsion-tower.name = 화물 추진탑 +block.payload-void.name = 화물 소멸기 +block.payload-source.name = 화물 공급기 block.disassembler.name = 광재 분해기 block.silicon-crucible.name = 실리콘 도가니 block.overdrive-dome.name = 대형 과부하 프로젝터 -#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들입니다. +#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들입니다. block.block-forge.name = 블록 제작대 block.block-loader.name = 블록 로더 block.block-unloader.name = 블록 언로더 @@ -1290,7 +1321,6 @@ block.memory-bank.name = 메모리 보관소 team.blue.name = 파랑색 팀 team.crux.name = 빨강색 팀 team.sharded.name = 주황색 팀 -team.orange.name = 주황색 팀 team.derelict.name = 버려진 팀 team.green.name = 초록색 팀 team.purple.name = 보라색 팀 @@ -1311,6 +1341,7 @@ hint.placeConveyor.mobile = 컨베이어는 자원을 드릴에서 다른 블록 hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[]를 설치하십시오.\n\n포탑 탄약 필요 - 지금은 \uf838 구리가 필요합니다.\n컨베이어를 사용해 드릴에 구리를 공급하십시오. hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오. hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오. +hint.blockInfo = [accent]건설 메뉴[]에서 블록을 선택해서 정보를 보십시오, 그다음 오른쪽의 [accent][[?][] 버튼을 선택하십시오. hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오. hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오. hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오. @@ -1344,7 +1375,7 @@ item.graphite.description = 탄약 및 전기 부품에 사용되는 무기질 item.sand.description = 제련에서 합금 또는 플럭스에서 광범위하게 사용되는 일반적인 재료. item.coal.description = 화석화된 식물 물질. 씨앗이 나오기 훨씬 전에 형성되었습니다. 연료 및 자원 생산에 광범위하게 사용됩니다. item.coal.details = 발화 작용 이전, 오래전에 생성된 화석화 작용을 거친 식물체로 보입니다. -item.titanium.description = 액체 수송, 드릴이나 항공기에 광범위하게 사용되는 희귀 초경량 금속. +item.titanium.description = 액체 수송, 드릴이나 공장에 광범위하게 사용되는 희귀 초경량 금속. item.thorium.description = 구조적 지지 및 핵연료로 사용되는 고밀도의 방사성 금속. item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다. item.scrap.details = 오래된 구조물과 유닛의 잔해. @@ -1505,9 +1536,9 @@ block.memory-cell.description = 프로세서를 위한 데이터를 저장합니 block.memory-bank.description = 프로세서를 위한 데이터를 저장합니다. 저장 공간이 셀보다 큽니다. block.logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. -block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다. +block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다. -unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다. +unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다. unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다. unit.fortress.description = 지상 목표물에 장거리 포탄을 발사합니다. unit.scepter.description = 주변 모든 적에게 장전된 탄환을 일제히 발사합니다. @@ -1522,19 +1553,19 @@ unit.atrax.description = 지상 목표물을 약화하는 광재 구체를 발 unit.spiroct.description = 적에게 흡혈 레이저 빔을 발사하며, 흡혈을 통해 체력을 회복합니다. 대부분의 지형 위를 밟을 수 있습니다. unit.arkyid.description = 적에게 큰 흡혈 레이저 빔을 발사하며, 흡혈을 통해 체력을 회복합니다. 대부분의 지형 위를 밟을 수 있습니다. unit.toxopid.description = 적에게 큰 전격 포탄 무리와 관통 레이저를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다. -unit.flare.description = 지상 목표물에 일반적인 탄환을 발사합니다. -unit.horizon.description = 지상 목표물에 폭탄을 투하합니다. +unit.flare.description = 지상 목표물에 일반적인 탄환을 발사합니다. +unit.horizon.description = 지상 목표물에 폭탄을 투하합니다. unit.zenith.description = 주변 모든 적에게 미사일을 살포합니다. unit.antumbra.description = 주변 모든 적에게 탄환들을 일제히 발사합니다. unit.eclipse.description = 주변 모든 적에게 두 개의 관통 레이저와 대공 탄을 일제히 발사합니다. unit.mono.description = 자동으로 구리와 납을 캐서 코어로 넣습니다. unit.poly.description = 자동으로 부서진 구조물을 재건설하거나 다른 유닛들의 건설을 보조합니다. unit.mega.description = 자동으로 손상된 구조물을 수리합니다. 블록이나 작은 지상 유닛들을 수송할 수 있습니다. -unit.quad.description = 지상 목표물에 적에게 피해를 주고, 아군 구조물을 수리하는 큰 폭탄을 투하합니다. 중간 크기의 지상 유닛들을 수송할 수 있습니다. -unit.oct.description = 주변 아군들을 재생 역장으로 보호합니다. 대부분의 지상 유닛들을 수송할 수 있습니다. -unit.risso.description = 주변 모든 적에게 탄환과 미사일을 일제히 발사합니다. +unit.quad.description = 지상 목표물에 적에게 피해를 주고, 아군 구조물을 수리하는 큰 폭탄을 투하합니다. 중간 크기의 지상 유닛들을 수송할 수 있습니다. +unit.oct.description = 주변 아군들을 재생 역장으로 보호합니다. 대부분의 지상 유닛들을 수송할 수 있습니다. +unit.risso.description = 주변 모든 적에게 탄환과 미사일을 일제히 발사합니다. unit.minke.description = 주변 지상 적에게 일반적인 탄환과 포탄을 발사합니다. -unit.bryde.description = 적에게 장거리 포탄과 미사일을 발사합니다. +unit.bryde.description = 적에게 장거리 포탄과 미사일을 발사합니다. unit.sei.description = 적에게 방어력 관통 탄환과 미사일을 일제히 발사합니다. unit.omura.description = 적에게 장거리 관통 레일건을 발사합니다. 플레어를 생산합니다. unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다. @@ -1549,8 +1580,8 @@ lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출 lst.printflush = 대기중인 [accent]Print[]실행문을 메시지 블록에 출력하기 lst.getlink = 순서별로 프로세서 연결 가져오기. 0부터 시작 lst.control = 건물 조종하기 -lst.radar = 건물 주변의 유닛 검색하기 -lst.sensor = 건물 또는 유닛의 정보 얻기 +lst.radar = 건물 주변의 유닛 검색하기 +lst.sensor = 건물 또는 유닛의 정보 얻기 lst.set = 변수 선언/할당하기 lst.operation = 1~2개의 변수로 연산하기 lst.end = 실행줄의 가장 위로 점프하기 @@ -1565,7 +1596,7 @@ logic.nounitbuild = [red]유닛의 건물 로직은 여기서 허용되지 않 lenum.type = 건물/유닛의 타입\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다. lenum.shoot = 특정 위치에 발사 lenum.shootp = 목표물 속도를 예측하여 발사 -lenum.configure = 필터의 아이템같은 건물의 설정 +lenum.config = 필터의 아이템같은 건물의 설정 lenum.enabled = 블록의 활성 여부 lenum.color = 조명 색 설정 @@ -1573,6 +1604,7 @@ laccess.controller = 유닛 제어자. 프로세서가 제어하면, 프로세 laccess.dead = 유닛 또는 건물 사망/무효 여부 laccess.controlled = 만약 유닛 제어자가 프로세서라면 [accent]@ctrlProcessor[]를 반환합니다.\n만약 유닛/건물 제어자가 플레이어라면 [accent]@ctrlPlayer[]를 반환합니다.\n만약 유닛이 다른 유닛에 의해 지휘되면(G키)[accent]@ctrlFormation[]를 반환합니다.\n그 외에는 0을 반환합니다. laccess.commanded = [red]이제 사용되지 않으며, 곧 제거될 예정입니다![]\n대신 [accent]controlled[]를 사용하세요. +laccess.progress = 작업 진행률, 0 에서 1 로 감.\n포탑 재장전이나 구조물 진행률을 반환합니다. graphicstype.clear = 이 색으로 화면을 채우기 graphicstype.color = 아래 그래픽 실행문들의 색 설정하기 @@ -1581,7 +1613,7 @@ graphicstype.line = 선분 그리기 graphicstype.rect = 직사각형 채우기 graphicstype.linerect = 직사각형 외곽선 그리기 graphicstype.poly = 정다각형 채우기 -graphicstype.linepoly = 정다각형 외곽선 그리기 +graphicstype.linepoly = 정다각형 외곽선 그리기 graphicstype.triangle = 삼각형 채우기 graphicstype.image = 일부 콘텐츠의 이미지 그리기\n예: [accent]@router[] 또는 [accent]@dagger[]. @@ -1604,9 +1636,15 @@ lenum.min = 두 수의 최솟값 lenum.max = 두 수의 최댓값 lenum.angle = 벡터의 각(도) lenum.len = 벡터의 길이 + lenum.sin = 사인(도) lenum.cos = 코사인(도) lenum.tan = 탄젠트(도) + +lenum.asin = 각도상 아크 사인 +lenum.acos = 각도상 아크 코사인 +lenum.atan = 각도상 아크 탄젠트 + #not a typo, look up 'range notation' lenum.rand = 범위 내 십진법 난수[0 ~ 값) lenum.log = 자연 로그(진수) @@ -1683,205 +1721,215 @@ lenum.build = 구조물 건설 lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다. lenum.within = 좌표 주변 유닛 발견 여부 lenum.boost = 이륙 시작/중단 -#1665 줄 매칭 +#1724 line matching / 줄 매칭 -#-------------비공식 번역주------------- +#-------------비공식 번역------------- #팁, 패치 기록, 약간의 관련 드립을 넣는 곳입니다. 이미 쓰여진 줄이 있다면 \n\n를 입력한 다음 작성하고 끝에 깃허브 작성자 닉네임(또는 디스코드)을 적어주세요. -#심각한 노잼, 뇌절, 무례한 말들을 적지 말아주세요, 이는 목적이 어떠하든 공통적으로 적용됩니다(친근함 유도를 위한 평어 x). 다음 패치에 업데이트되어 그 언어를 쓰는 모든 유저가 보게 됩니다. +#심각한 노잼, 뇌절, 무례한 말들을 적지 말아주세요, 이는 목적이 어떠하든 공통적으로 적용됩니다(친근함 유도를 위한 평어 x). 다음 패치에 업데이트되어 한국어를 쓰는 모든 유저가 보게 됩니다. #양이 너무 많으면 사족을 더 붙이는걸 추천하지 않습니다. #이 비공식 번역주는 공식 디테일이 추가되면 언제든지 삭제될 수 있습니다. -#비어있는 디테일은 아래 details가 전부이므로 추가 또는 삭제를 따로 안하셔도 됩니다. +#비어있는 디테일은 아래 details가 전부이므로 추가 또는 삭제를 따로 안하셔도 됩니다. #유색코드가 아닌, 흑백 색코드만 사용 가능합니다. 되도록이면 그냥 안쓰시는걸 추천. -#관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018 +#관련 문의는 공식 디스코드에서 절 불러주세요. Sharlotte#0018 #아이템 -item.metaglass.details = 쓰임세가 가장 적은 아이템 -item.graphite.details = -item.sand.details = -item.titanium.details = -item.thorium.details = -item.silicon.details = -item.plastanium.details = -item.phase-fabric.details = -item.surge-alloy.details = -item.blast-compound.details = 화력 발전기에 넣어보세요. -item.pyratite.details = +item.metaglass.details = [lightgray][비공식][]쓰임세가 가장 적은 아이템 +item.graphite.details = +item.sand.details = +item.titanium.details = +item.thorium.details = +item.silicon.details = +item.plastanium.details = +item.phase-fabric.details = +item.surge-alloy.details = +item.blast-compound.details = [lightgray][비공식][]화력 발전기에 넣어보세요. +item.pyratite.details = #액체 -liquid.water.details = -liquid.slag.details = -liquid.oil.details = -liquid.cryofluid.details = 티타늄을 갈아서 물에 희석했다는 소문이 있다. +liquid.water.details = +liquid.slag.details = +liquid.oil.details = +liquid.cryofluid.details = [lightgray][비공식][]티타늄을 갈아서 물에 희석했다는 소문이 있다. #블록 -block.resupply-point.details = -block.armored-conveyor.details = -block.illuminator.details = -block.message.details = -block.graphite-press.details = -block.multi-press.details = -block.silicon-smelter.details = -block.kiln.details = -block.plastanium-compressor.details = 석유를 정말 많이 먹는다. -block.phase-weaver.details = -block.alloy-smelter.details = -block.cryofluid-mixer.details = -block.blast-mixer.details = -block.pyratite-mixer.details = -block.melter.details = -block.separator.details = -block.spore-press.details = -block.pulverizer.details = -block.coal-centrifuge.details = 가성비가 매우 뛰어나다. -block.incinerator.details = -block.power-void.details = -block.power-source.details = -block.item-source.details = -block.item-void.details = -block.liquid-source.details = -block.liquid-void.details = -block.copper-wall.details = -block.copper-wall-large.details = -block.titanium-wall.details = -block.titanium-wall-large.details = -block.plastanium-wall.details = -block.plastanium-wall-large.details = -block.thorium-wall.details = -block.thorium-wall-large.details = -block.phase-wall.details = -block.phase-wall-large.details = -block.surge-wall.details = -block.surge-wall-large.details = -block.door.details = -block.door-large.details = -block.mender.details = -block.mend-projector.details = -block.overdrive-projector.details = -block.force-projector.details = -block.shock-mine.details = -block.conveyor.details = -block.titanium-conveyor.details = -block.plastanium-conveyor.details = -block.junction.details = -block.bridge-conveyor.details = 티타늄 컨베이어보다 빠르다. -block.phase-conveyor.details = -block.sorter.details = 자원을 분류하여 주변 블록에 건내는 과정이 거의 한순간에 일어난다. -block.inverted-sorter.details = -block.distributor.details = -block.overflow-gate.details = -block.underflow-gate.details = -block.mass-driver.details = 발사할려면 최소 아이템 10개가 필요하다. -block.mechanical-pump.details = -block.rotary-pump.details = -block.thermal-pump.details = -block.conduit.details = -block.pulse-conduit.details = -block.plated-conduit.details = -block.liquid-router.details = -block.liquid-tank.details = -block.liquid-junction.details = -block.bridge-conduit.details = -block.phase-conduit.details = -block.power-node.details = -block.power-node-large.details = -block.surge-tower.details = -block.diode.details = -block.battery.details = -block.battery-large.details = -block.combustion-generator.details = -block.thermal-generator.details = -block.steam-generator.details = +block.resupply-point.details = +block.armored-conveyor.details = +block.illuminator.details = +block.message.details = +block.graphite-press.details = +block.multi-press.details = +block.silicon-smelter.details = +block.kiln.details = +block.plastanium-compressor.details = [lightgray][비공식][]석유를 정말 많이 먹는다. +block.phase-weaver.details = +block.alloy-smelter.details = +block.cryofluid-mixer.details = +block.blast-mixer.details = +block.pyratite-mixer.details = +block.melter.details = +block.separator.details = +block.spore-press.details = +block.pulverizer.details = +block.coal-centrifuge.details = [lightgray][비공식][]가성비가 매우 뛰어나다. +block.incinerator.details = +block.power-void.details = +block.power-source.details = +block.item-source.details = +block.item-void.details = +block.liquid-source.details = +block.liquid-void.details = +block.copper-wall.details = +block.copper-wall-large.details = +block.titanium-wall.details = +block.titanium-wall-large.details = +block.plastanium-wall.details = +block.plastanium-wall-large.details = +block.thorium-wall.details = +block.thorium-wall-large.details = +block.phase-wall.details = +block.phase-wall-large.details = +block.surge-wall.details = +block.surge-wall-large.details = +block.door.details = +block.door-large.details = +block.mender.details = +block.mend-projector.details = +block.overdrive-projector.details = +block.force-projector.details = +block.shock-mine.details = +block.conveyor.details = +block.titanium-conveyor.details = +block.plastanium-conveyor.details = +block.junction.details = +block.bridge-conveyor.details = [lightgray][비공식][]티타늄 컨베이어보다 빠르다. +block.phase-conveyor.details = +block.sorter.details = [lightgray][비공식][]자원을 분류하여 주변 블록에 건내는 과정이 거의 한순간에 일어난다. +block.inverted-sorter.details = +block.distributor.details = +block.overflow-gate.details = +block.underflow-gate.details = +block.mass-driver.details = [lightgray][비공식][]발사할려면 최소 아이템 10개가 필요하다. +block.mechanical-pump.details = +block.rotary-pump.details = +block.thermal-pump.details = +block.conduit.details = +block.pulse-conduit.details = +block.plated-conduit.details = +block.liquid-router.details = +block.liquid-tank.details = +block.liquid-junction.details = +block.bridge-conduit.details = +block.phase-conduit.details = +block.power-node.details = +block.power-node-large.details = +block.surge-tower.details = +block.diode.details = +block.battery.details = +block.battery-large.details = +block.combustion-generator.details = +block.thermal-generator.details = +block.steam-generator.details = block.differential-generator.details = -block.rtg-generator.details = -block.solar-panel.details = -block.solar-panel-large.details = -block.thorium-reactor.details = -block.impact-reactor.details = -block.mechanical-drill.details = -block.pneumatic-drill.details = -block.laser-drill.details = -block.blast-drill.details = -block.water-extractor.details = -block.cultivator.details = -block.cultivator.details = -block.oil-extractor.details = -block.vault.details = -block.container.details = -block.unloader.details = -block.launch-pad.details = -block.duo.details = -block.scatter.details = -block.scorch.details = -block.hail.details = 일점사하면 립플보다 더 뛰어난 정확도와 연사력을 보여준다. -block.wave.details = -block.lancer.details = -block.arc.details = -block.swarmer.details = -block.salvo.details = -block.fuse.details = -block.ripple.details = -block.cyclone.details = -block.spectre.details = -block.meltdown.details = -block.foreshadow.details = -block.repair-point.details = -block.segment.details = -block.parallax.details = -block.tsunami.details = -block.silicon-crucible.details = -block.disassembler.details = -block.overdrive-dome.details = -block.payload-conveyor.details = -block.payload-router.details = -block.command-center.details = -block.ground-factory.details = -block.air-factory.details = 건설&연구 재료는 구리와 납뿐이지만, 정작 유닛을 생산할 땐 실리콘이 필요하다. -block.naval-factory.details = -block.additive-reconstructor.details = -block.multiplicative-reconstructor.details = -block.exponential-reconstructor.details = -block.tetrative-reconstructor.details = -block.switch.details = -block.micro-processor.details = -block.logic-processor.details = -block.hyper-processor.details = -block.memory-cell.details = -block.memory-bank.details = -block.logic-display.details = -block.large-logic-display.details = -block.interplanetary-accelerator.details = +block.rtg-generator.details = +block.solar-panel.details = +block.solar-panel-large.details = +block.thorium-reactor.details = +block.impact-reactor.details = +block.mechanical-drill.details = +block.pneumatic-drill.details = +block.laser-drill.details = +block.blast-drill.details = +block.water-extractor.details = +block.cultivator.details = +block.oil-extractor.details = +block.vault.details = +block.container.details = +block.unloader.details = +block.launch-pad.details = +block.duo.details = +block.scatter.details = +block.scorch.details = +block.hail.details = [lightgray][비공식][]일점사하면 립플보다 더 뛰어난 정확도와 연사력을 보여준다. +block.wave.details = +block.lancer.details = +block.arc.details = +block.swarmer.details = +block.salvo.details = +block.fuse.details = +block.ripple.details = +block.cyclone.details = +block.spectre.details = +block.meltdown.details = +block.foreshadow.details = +block.repair-point.details = +block.segment.details = +block.parallax.details = +block.tsunami.details = +block.silicon-crucible.details = +block.disassembler.details = +block.overdrive-dome.details = +block.payload-conveyor.details = +block.payload-router.details = +block.duct.details = [lightgray][비공식][]무중력 환경에서 쓰일 컨베이어 대체재입니다. +block.duct-router.details = [lightgray][비공식][]교차기가 없어서 루터체인을 할 수 없네요. +block.duct-bridge.details = [lightgray][비공식][]사거리가 3타일입니다. +block.payload-propulsion-tower.details = [lightgray][비공식][]원문이 Turret가 아니라 Tower에요. +block.payload-void.details = [lightgray][비공식][]본격 유닛 쓰래기통 +block.payload-source.details = [lightgray][비공식][]유닛 설정해놓고 방치해두면 나중에 랙걸립니다. +block.command-center.details = +block.ground-factory.details = +block.air-factory.details = [lightgray][비공식][]건설&연구 재료는 구리와 납뿐이지만, 정작 유닛을 생산할 땐 실리콘이 필요하다. +block.naval-factory.details = +block.additive-reconstructor.details = +block.multiplicative-reconstructor.details = +block.exponential-reconstructor.details = +block.tetrative-reconstructor.details = +block.switch.details = +block.micro-processor.details = +block.logic-processor.details = +block.hyper-processor.details = +block.memory-cell.details = +block.memory-bank.details = +block.logic-display.details = +block.large-logic-display.details = +block.interplanetary-accelerator.details = #유닛 -unit.dagger.details = 이전에 디거란 이명으로 종교가 생겼었다. -unit.mace.details = -unit.fortress.details = -unit.scepter.details = -unit.reign.details = -unit.nova.details = -unit.pulsar.details = -unit.quasar.details = -unit.vela.details = -unit.corvus.details = 정말 느리다. -unit.crawler.details = 최근에 자폭 AI가 향상되면서 컨베이어로 자폭을 유도할 수 없게 되었다. -unit.atrax.details = -unit.spiroct.details = -unit.arkyid.details = -unit.toxopid.details = +unit.dagger.details = [lightgray][비공식][]이전에 디거란 이명으로 종교가 생겼었다. +unit.mace.details = +unit.fortress.details = +unit.scepter.details = +unit.reign.details = +unit.nova.details = +unit.pulsar.details = +unit.quasar.details = +unit.vela.details = +unit.corvus.details = [lightgray][비공식][]정말 느리다. +unit.crawler.details = [lightgray][비공식][]최근에 자폭 AI가 향상되면서 컨베이어로 자폭을 유도할 수 없게 되었다. 분배기를 대신 쓰자. +unit.atrax.details = +unit.spiroct.details = +unit.arkyid.details = +unit.toxopid.details = unit.flare.details = -unit.horizon.details = -unit.zenith.details = -unit.antumbra.details = -unit.eclipse.details = -unit.mono.details = -unit.poly.details = -unit.mega.details = -unit.quad.details = -unit.oct.details = -unit.risso.details = 뭉치면 연사력이 무시무시하다. -unit.minke.details = -unit.bryde.details = -unit.sei.details = -unit.omura.details = -unit.alpha.details = -unit.beta.details = -unit.gamma.details = +unit.horizon.details = +unit.zenith.details = +unit.antumbra.details = +unit.eclipse.details = +unit.mono.details = +unit.poly.details = +unit.mega.details = +unit.quad.details = +unit.oct.details = +unit.risso.details = [lightgray][비공식][]뭉치면 연사력이 무시무시하다. +unit.minke.details = +unit.bryde.details = +unit.sei.details = [lightgray][비공식][]세이 sei! +unit.omura.details = +unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮어보죠. +unit.oxynoe.details = +unit.cyerce.details = [lightgray][비공식][]폭죽놀이다! +unit.aegires.details = [lightgray][비공식][]플레이어가 할 수 있는건 운전과 공사뿐... +unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다. +unit.alpha.details = +unit.beta.details = +unit.gamma.details = diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 94bde81323..7cb21b7eab 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -124,8 +124,8 @@ mods.reload = Перезагрузить mods.reloadexit = Игра будет закрыта для перезагрузки модификаций. mod.installed = [[Установлено] mod.display = [gray]Модификация:[orange] {0} -mod.enabled = [lightgray]Включён -mod.disabled = [scarlet]Выключен +mod.enabled = [lightgray]Включено +mod.disabled = [scarlet]Выключено mod.multiplayer.compatible = [gray]Доступна в игре по сети mod.disable = Выкл. mod.content = Содержимое: @@ -620,18 +620,18 @@ sector.extractionOutpost.description = Отдаленный аванпост, п sector.impact0078.description = Здесь лежат остатки межзвездного транспортного судна, первым вошедшего в эту систему.\n\nИзвлеките как можно больше из обломков. Изучите любую уцелевшую технологию. sector.planetaryTerminal.description = Конечная цель.\n\nЭта береговая база содержит сооружение, способное запускать ядра к окрестным планетам. Оно крайне хорошо охраняется.\n\nПроизведите морские единицы. Уничтожьте врага как можно скорее. Изучите пусковую конструкцию. -status.burning.name = Горит -status.freezing.name = Замерзает -status.wet.name = Влажный +status.burning.name = Горение +status.freezing.name = Замерзание +status.wet.name = Влага status.muddy.name = В грязи -status.melting.name = Плавится -status.sapped.name = Истощён -status.spore-slowed.name = Замедлен спорами -status.tarred.name = Покрыт нефтью -status.overclock.name = Ускорен -status.shocked.name = Шокирован -status.blasted.name = Подорван -status.unmoving.name = Неподвижен +status.melting.name = Плавление +status.sapped.name = Истощение +status.spore-slowed.name = Замедление спорами +status.tarred.name = В нефти +status.overclock.name = Разгон +status.shocked.name = Шок +status.blasted.name = Разрыв +status.unmoving.name = Обездвиживание settings.language = Язык settings.data = Игровые данные @@ -737,6 +737,7 @@ stat.speedmultiplier = Множитель скорости stat.reloadmultiplier = Множитель перезарядки stat.buildspeedmultiplier = Множитель скорости строительства stat.reactive = Реактивен +stat.healing = Ремонт ability.forcefield = Силовое поле ability.repairfield = Ремонтирующее поле @@ -779,7 +780,7 @@ bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройка bullet.knockback = [stat]{0}[lightgray] отбрасывания bullet.pierce = [stat]{0}[lightgray]x пробитие bullet.infinitepierce = [stat]бесконечное пробитие -bullet.healpercent = [stat]{0}[lightgray]% лечения +bullet.healpercent = [stat]{0}[lightgray]% ремонта bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов bullet.reload = [stat]{0}[lightgray]x скорость стрельбы @@ -1329,7 +1330,7 @@ hint.payloadDrop = Нажмите [accent]][], чтобы сбросить гр hint.payloadDrop.mobile = [accent]Нажмите и удерживайте[] палец на пустой локации, чтобы сбросить туда груз. hint.waveFire = Турели [accent]Волна[] при подаче воды будут автоматически тушить пожары вокруг. hint.generator = \uf879 [accent]Генераторы внутреннего сгорания[] сжигают уголь и передают энергию рядомстоящим блокам.\n\nДальность передачи энергии может быть увеличена при помощи \uf87f [accent]силовых узлов[]. -hint.guardian = [accent]Стражи[] бронированы. Слабые боеприпасы, такие как [accent]медь[] и [accent]свинец[], [scarlet]не эффективны[].\n\Используйте турели высокого уровня или \uf835 [accent]графитные[] боеприпасы в \uf861двойных турелях/\uf859залпах, чтобы уничтожить Стража. +hint.guardian = [accent]Стражи[] бронированы. Слабые боеприпасы, такие как [accent]медь[] и [accent]свинец[], [scarlet]не эффективны[].\n\nИспользуйте турели высокого уровня или \uf835 [accent]графитные[] боеприпасы в \uf861двойных турелях/\uf859залпах, чтобы уничтожить Стража. hint.coreUpgrade = Ядра могут быть улучшены путем [accent]размещения над ними ядер более высокого уровня[].\n\nПоместите ядро  [accent]Штаб[] поверх ядра  [accent]Осколок[]. Убедитесь, что никакие препятствия не мешают ему. hint.presetLaunch = В серые [accent]секторы с посадочными зонами[], такие как [accent]Ледяной лес[], можно запускаться из любого места. Они не требуют захвата близлежащей территории.\n\n[accent]Нумерованные секторы[], такие как этот, [accent]не обязательны[] для прохождения. hint.coreIncinerate = После того, как ядро будет заполнено предметом до отказа, любые лишние входящие предметы этого типа будут [accent]сожжены[]. @@ -1353,7 +1354,7 @@ item.plastanium.description = Используется в продвинутой item.phase-fabric.description = Используется в продвинутой электронике и самовосстанавливающихся постройках. item.surge-alloy.description = Используется в продвинутом вооружении и реактивных оборонительных постройках. item.spore-pod.description = Используется для переработки в нефть, взрывчатку и топливо. -item.spore-pod.details = Споры. Похоже, являются синтетической формой жизни. Выделяют газы, токсичные для других биологических форм жизни. Чрезвычайно инвазивны. Легко воспламеняются при определенных условиях. +item.spore-pod.details = Споры. Похоже, являются синтетической формой жизни. Выделяют газы, токсичные для других биологических форм жизни. Чрезвычайно инвазивны. Легко воспламеняются при определённых условиях. item.blast-compound.description = Используется в бомбах и взрывчатых веществах. item.pyratite.description = Используется в зажигательном оружии и твердотопливных генераторах. @@ -1427,7 +1428,7 @@ block.thermal-pump.description = Перекачивает и выводит жи block.conduit.description = Перемещает жидкости вперёд. Используется вместе с насосами и другими трубопроводами. block.pulse-conduit.description = Перемещает жидкости вперёд. Работает быстрее и вмещает в себе больше, чем стандартный трубопровод. block.plated-conduit.description = Перемещает жидкости вперёд. Не принимает ввод по бокам. Не протекает. -block.liquid-router.description = Принимает жидкости из одного направления и равномерно распределяет и до 3 других направлений. Также может хранить определенное количество жидкости. +block.liquid-router.description = Принимает жидкости из одного направления и равномерно распределяет их до 3 других. Также может хранить определённое количество жидкости. block.liquid-tank.description = Хранит большое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору. block.liquid-junction.description = Действует как мост для двух пересекающихся трубопроводов. block.bridge-conduit.description = Перемещает жидкости над любой местностью или зданиями. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index bfe05a9828..0969237bfa 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -140,7 +140,7 @@ mod.author = [lightgray]Yayıncı:[] {0} mod.missing = Bu kayıt yakın zamanda güncellediğiniz ya da artık yüklü olmayan modlar içermekte. Kayıt bozulmaları yaşanabilir. Kaydı yüklemek istediğinizden emin misiniz?\n[lightgray]Modlar:\n{0} mod.preview.missing = Bu modu atölyede yayınlamadan önce bir resim önizlemesi eklemelisiniz.\nMod dosyasına [accent]preview.png[] adlı bir resim yerleştirin ve tekrar deneyin. mod.folder.missing = Atölyede sadece klasör halindeki modlar yayınlanabilir.Bir modu klasöre çevirmek için, sadece mod dosyalarını bir klasöre çıkarın ve eski sıkıştırılmış dosyayı silin, sonra da oyunu tekrar başlatın ya da modlarınızı tekrar yükleyin. -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.scripts.disable = Cihazınız kod içeren modları desteklemiyor. \nOyunu oynamak için bu modları devre dışı bırakmalısınız. about.button = Hakkında name = İsim: diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index aae2419fc1..ca6ada0206 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -126,6 +126,7 @@ mod.installed = [[Đã cài đặt] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Đã Bật mod.disabled = [scarlet]Đã Tắt +mod.multiplayer.compatible = [gray]Tương thích với chế độ nhiều người chơi mod.disable = Tắt mod.content = Nội dung: mod.delete.error = Không thể xóa mod. Tệp có thể đang được sử dụng. @@ -216,7 +217,7 @@ server.hidden = Ẩn trace = Tìm người chơi trace.playername = Tên người chơi: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Unique ID: [accent]{0} +trace.id = ID: [accent]{0} trace.mobile = Mobile Client: [accent]{0} trace.modclient = Custom Client: [accent]{0} invalidid = Client ID không hợp lệ! Vui lòng gửi báo cáo lỗi. @@ -601,7 +602,6 @@ sector.windsweptIslands.name = Windswept Islands sector.extractionOutpost.name = Extraction Outpost sector.planetaryTerminal.name = Planetary Launch Terminal -#TODO: The Last sector.groundZero.description = Vị trí tối ưu để bắt đầu một lần nữa. Mối đe dọa của kẻ thù thấp. Ít tài nguyên.\nThu thập càng nhiều chì và đồng càng tốt.\nTiến lên. sector.frozenForest.description = Ngay cả ở đây, gần núi hơn, các bào tử đã phát tán. Nhiệt độ lạnh giá không thể chứa chúng mãi mãi.\n\nBắt đầu tham gia vào quyền lực. Chế tạo máy phát điện đốt. Học cách sử dụng Máy sửa chữa. sector.saltFlats.description = Ở vùng ngoại ô của sa mạc Salt Flats. Có thể tìm thấy ít tài nguyên ở khu vực này.\n\nKẻ thù đã dựng lên một khu phức hợp lưu trữ tài nguyên ở đây. Loại bỏ căn cứ của họ. Không để lại gì. @@ -619,6 +619,19 @@ sector.extractionOutpost.description = Một tiền đồn xa, được kẻ th sector.impact0078.description = Đây là tàn tích của tàu vận chuyển giữa các vì sao lần đầu tiên đi vào hệ thống này.\n\nLấy càng nhiều càng tốt từ đống đổ nát. Nghiên cứu bất kỳ công nghệ nguyên vẹn nào. sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa một cấu trúc có khả năng phóng căn cứ tới các hành tinh địa phương. Nó được bảo vệ cực kỳ cẩn thận.\n\nSản xuất quân lính hải quân. Loại bỏ kẻ thù càng nhanh càng tốt. Nghiên cứu cấu trúc phóng. +status.burning.name = Cháy +status.freezing.name = Đóng băng +status.wet.name = Wet +status.muddy.name = Muddy +status.melting.name = Tan chảy +status.sapped.name = Sapped +status.spore-slowed.name = Spore Slowed +status.tarred.name = Tarred +status.overclock.name = Overclock +status.shocked.name = Shock +status.blasted.name = Nổ +status.unmoving.name = Unmoving + settings.language = Ngôn ngữ settings.data = Dữ liệu trò chơi settings.reset = Khôi phục về mặc định @@ -716,6 +729,12 @@ stat.abilities = Khả năng stat.canboost = Nâng cấp stat.flying = Bay stat.ammouse = Sử dụng đạn +stat.damagemultiplier = Hệ số sát thương +stat.healthmultiplier = Hệ số độ bền +stat.speedmultiplier = Hệ số tốc độ +stat.reloadmultiplier = Reload Multiplier +stat.buildspeedmultiplier = Hệ số tốc độ xây dựng +stat.reactive = Phản ứng. ability.forcefield = Tạo khiên ability.repairfield = Sửa chữa/Xây dựng @@ -751,17 +770,15 @@ units.processorcontrol = [lightgray]Điều khiển bởi bộ xử lý bullet.damage = [stat]{0}[lightgray] sát thương bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô bullet.incendiary = [stat]cháy -bullet.sapping = [stat]sapping bullet.homing = [stat]truy đuổi -bullet.shock = [stat]sốc bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối bullet.frag = [stat]phá mảnh +# I am not sure about this... +bullet.lightning = [stat]{0}[lightgray]x tia chớp ~ [stat]{1}[lightgray] sát thương bullet.knockback = [stat]{0}[lightgray] bật lùi bullet.pierce = [stat]{0}[lightgray]x xuyên giáp bullet.infinitepierce = [stat]xuyên thấu bullet.healpercent = [stat]{0}[lightgray]% sửa chửa -bullet.freezing = [stat]đóng băng -bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x lượng đạn bullet.reload = [stat]{0}[lightgray]x tốc độ bắn @@ -801,6 +818,7 @@ setting.hints.name = Gợi ý setting.flow.name = Hiện thị tốc độ chuyền tài nguyên setting.backgroundpause.name = Tạm dừng trong nền setting.buildautopause.name = Tự động dừng xây dựng +setting.doubletapmine.name = Nhấn đúp để Đào setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động setting.animatedwater.name = Hiệu ứng nước setting.animatedshields.name = Hiệu ứng khiên @@ -921,6 +939,7 @@ keybind.pause_building.name = Tạm dừng/Tiếp tục Xây keybind.minimap.name = Bản đồ mini keybind.planet_map.name = Bản đồ hành tinh keybind.research.name = Nghiên cứu +keybind.block_info.name = Thông tin khối keybind.chat.name = Trò chuyện keybind.player_list.name = Danh sách người chơi keybind.console.name = Bảng điều khiển @@ -1457,7 +1476,7 @@ block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đ block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần. block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất. block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động. -block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. +block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. Ưu tiên kẻ địch có độ bền tối đa cao nhất. block.repair-point.description = Liên tục sửa chữa robot ở trong phạm vi hoạt động. block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser. block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo. @@ -1538,6 +1557,8 @@ lst.unitcontrol = Control the currently bound unit. lst.unitradar = Locate units around the currently bound unit. lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. +logic.nounitbuild = [red]Unit building logic is not allowed here. + lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. lenum.shoot = Bắn vào vị trí xác định. lenum.shootp = Shoot at a unit/building with velocity prediction. @@ -1545,6 +1566,10 @@ lenum.configure = Building configuration, e.g. sorter item. lenum.enabled = Bất cứ khi nào khối hoạt động. laccess.color = Màu đèn chiếu sáng. +laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself. +laccess.dead = Whether a unit/building is dead or no longer valid. +laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0. +laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. graphicstype.clear = Tô màu cho màn hình. graphicstype.color = Đặt màu cho thao tác vẽ tiếp theo. @@ -1580,7 +1605,7 @@ lenum.sin = Sin, tính bằng độ. lenum.cos = Cos, tính bằng độ. lenum.tan = Tan, tính bằng độ. #not a typo, look up 'range notation' -lenum.rand = Số ngẫu nhiên trong phạm vi [0, giá trị). +lenum.rand = Tạo ra số nguyên ngẫu nhiên trong phạm vi [0, giá trị). lenum.log = Lôgarit tự nhiên (ln). lenum.log10 = Lôgarit cơ số 10. lenum.noise = 2D simplex noise. @@ -1638,6 +1663,7 @@ unitlocate.outx = Output X coordinate. unitlocate.outy = Output Y coordinate. unitlocate.group = Building group to look for. +lenum.idle = Không di chuyển, nhưng vẫn xây dựng/đào.\nTrạng thái mặc định. lenum.stop = Dừng di chuyển/Đào/Xây dựng. lenum.move = Di chuyển đến vị trí xác định. lenum.approach = Approach a position with a radius. diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 2c263508cf..001d5c85d6 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -73,7 +73,8 @@ public class Vars implements Loadable{ /** URL to the JSON file containing all the BE servers. Only queried in BE. */ public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; /** URL to the JSON file containing all the stable servers. */ - public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; + //TODO this uses BE servers until full v7 release, there's no point in displaying v6 at all + public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; /** URL of the github issue report template.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; /** list of built-in servers.*/ diff --git a/core/src/mindustry/ai/types/LogicAI.java b/core/src/mindustry/ai/types/LogicAI.java index 8c1128c7e0..b87a22e217 100644 --- a/core/src/mindustry/ai/types/LogicAI.java +++ b/core/src/mindustry/ai/types/LogicAI.java @@ -15,7 +15,7 @@ import static mindustry.Vars.*; public class LogicAI extends AIController{ /** Minimum delay between item transfers. */ - public static final float transferDelay = 60f * 2f; + public static final float transferDelay = 60f * 1.5f; /** Time after which the unit resets its controlled and reverts to a normal unit. */ public static final float logicControlTimeout = 10f * 60f; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 69716edd63..81457f7e20 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1168,22 +1168,24 @@ public class Blocks implements ContentList{ reloadTime = 200f; range = 440f; consumes.power(1.75f); + bullet = new MassDriverBolt(); }}; //special transport blocks duct = new Duct("duct"){{ - requirements(Category.distribution, with(Items.graphite, 5, Items.copper, 5)); - speed = 5f; + requirements(Category.distribution, with(Items.graphite, 5, Items.metaglass, 2)); + speed = 4f; }}; ductRouter = new DuctRouter("duct-router"){{ - requirements(Category.distribution, with(Items.graphite, 10, Items.copper, 5)); - speed = 5f; + requirements(Category.distribution, with(Items.graphite, 10, Items.metaglass, 4)); + speed = 4f; }}; ductBridge = new DuctBridge("duct-bridge"){{ - requirements(Category.distribution, with(Items.graphite, 20, Items.copper, 15)); + requirements(Category.distribution, with(Items.graphite, 20, Items.metaglass, 8)); + speed = 4f; }}; //endregion @@ -2048,7 +2050,7 @@ public class Blocks implements ContentList{ requirements(Category.units, with(Items.copper, 150, Items.lead, 130, Items.metaglass, 120)); plans = Seq.with( new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)), - new UnitPlan(UnitTypes.retusa, 60f * 60f, with(Items.silicon, 15, Items.metaglass, 25, Items.titanium, 20)) + new UnitPlan(UnitTypes.retusa, 60f * 50f, with(Items.silicon, 15, Items.metaglass, 25, Items.titanium, 20)) ); size = 3; consumes.power(1.2f); @@ -2090,7 +2092,8 @@ public class Blocks implements ContentList{ new UnitType[]{UnitTypes.poly, UnitTypes.mega}, new UnitType[]{UnitTypes.minke, UnitTypes.bryde}, new UnitType[]{UnitTypes.pulsar, UnitTypes.quasar}, - new UnitType[]{UnitTypes.atrax, UnitTypes.spiroct} + new UnitType[]{UnitTypes.atrax, UnitTypes.spiroct}, + new UnitType[]{UnitTypes.oxynoe, UnitTypes.cyerce} ); }}; @@ -2111,7 +2114,8 @@ public class Blocks implements ContentList{ new UnitType[]{UnitTypes.fortress, UnitTypes.scepter}, new UnitType[]{UnitTypes.bryde, UnitTypes.sei}, new UnitType[]{UnitTypes.mega, UnitTypes.quad}, - new UnitType[]{UnitTypes.quasar, UnitTypes.vela} + new UnitType[]{UnitTypes.quasar, UnitTypes.vela}, + new UnitType[]{UnitTypes.cyerce, UnitTypes.aegires} ); }}; @@ -2132,7 +2136,8 @@ public class Blocks implements ContentList{ new UnitType[]{UnitTypes.scepter, UnitTypes.reign}, new UnitType[]{UnitTypes.sei, UnitTypes.omura}, new UnitType[]{UnitTypes.quad, UnitTypes.oct}, - new UnitType[]{UnitTypes.vela, UnitTypes.corvus} + new UnitType[]{UnitTypes.vela, UnitTypes.corvus}, + new UnitType[]{UnitTypes.aegires, UnitTypes.navanax} ); }}; @@ -2149,7 +2154,7 @@ public class Blocks implements ContentList{ requirements(Category.units, with(Items.silicon, 70, Items.thorium, 60, Items.plastanium, 60)); size = 2; length = 6f; - repairSpeed = 5f; + repairSpeed = 4f; repairRadius = 140f; powerUse = 5f; beamWidth = 1.1f; diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index e318d80f98..674cb514e2 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -36,7 +36,7 @@ public class Bullets implements ContentList{ waterShot, cryoShot, slagShot, oilShot, heavyWaterShot, heavyCryoShot, heavySlagShot, heavyOilShot, //environment, misc. - damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt; + damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame; @Override public void load(){ @@ -510,7 +510,5 @@ public class Bullets implements ContentList{ statusDuration = 60f * 4f; damage = 0.2f; }}; - - driverBolt = new MassDriverBolt(); } } diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index f0bef945ce..792bae65df 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -855,6 +855,7 @@ public class Fx{ if(Fire.regions[0] == null) return; alpha(e.fout()); rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y); + Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout()); }), fire = new Effect(50f, e -> { @@ -962,7 +963,7 @@ public class Fx{ }), overdriven = new Effect(20f, e -> { - color(Pal.accent); + color(e.color); randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f); @@ -970,7 +971,7 @@ public class Fx{ }), overclocked = new Effect(50f, e -> { - color(Pal.accent); + color(e.color); Fill.square(e.x, e.y, e.fslope() * 2f, 45f); }), diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index d642808c22..dcb1a53b82 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -53,7 +53,9 @@ public class TechTree implements ContentList{ node(titaniumConveyor, Seq.with(new SectorComplete(craters)), () -> { node(phaseConveyor, () -> { node(massDriver, () -> { + node(payloadPropulsionTower, () -> { + }); }); }); @@ -233,7 +235,9 @@ public class TechTree implements ContentList{ }); node(repairPoint, () -> { + node(repairTurret, () -> { + }); }); }); }); @@ -416,6 +420,18 @@ public class TechTree implements ContentList{ }); }); }); + + node(retusa, () -> { + node(oxynoe, () -> { + node(cyerce, () -> { + node(aegires, () -> { + node(navanax, () -> { + + }); + }); + }); + }); + }); }); }); }); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index d54f7cf46f..934546ec78 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1375,7 +1375,7 @@ public class UnitTypes implements ContentList{ shrinkX = shrinkY = 0.7f; - speed = 0.001f; + speed = 0f; collides = false; healPercent = 15f; @@ -1759,7 +1759,7 @@ public class UnitTypes implements ContentList{ armor = 3f; - buildSpeed = 2f; + buildSpeed = 1.5f; weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{ x = 0f; @@ -1810,7 +1810,7 @@ public class UnitTypes implements ContentList{ shrinkX = shrinkY = 0f; - speed = 0.001f; + speed = 0f; splashDamage = 50f; splashDamageRadius = 40f; @@ -1833,7 +1833,7 @@ public class UnitTypes implements ContentList{ trailY = -4f; trailScl = 1.9f; - buildSpeed = 2.5f; + buildSpeed = 2f; weapons.add(new Weapon("plasma-mount-weapon"){{ @@ -1906,7 +1906,7 @@ public class UnitTypes implements ContentList{ trailY = -9f; trailScl = 2f; - buildSpeed = 3f; + buildSpeed = 2f; weapons.add(new RepairBeamWeapon("repair-beam-weapon-center"){{ x = 11f; @@ -1936,7 +1936,6 @@ public class UnitTypes implements ContentList{ ejectEffect = Fx.none; bullet = new FlakBulletType(2.5f, 25){{ sprite = "missile-large"; - collides = false; //for targeting collidesGround = collidesAir = true; explodeRange = 40f; @@ -1950,9 +1949,9 @@ public class UnitTypes implements ContentList{ lightColor = Pal.heal; splashDamageRadius = 30f; - splashDamage = 28f; + splashDamage = 25f; - lifetime = 90f; + lifetime = 80f; backColor = Pal.heal; frontColor = Color.white; @@ -1976,17 +1975,17 @@ public class UnitTypes implements ContentList{ weaveMag = 1f; trailColor = Pal.heal; - trailParam = 5f; - trailInterval = 3f; + trailWidth = 4.5f; + trailLength = 29; fragBullets = 7; fragVelocityMin = 0.3f; - fragBullet = new MissileBulletType(3.9f, 12){{ + fragBullet = new MissileBulletType(3.9f, 11){{ homingPower = 0.2f; weaveMag = 4; weaveScale = 4; - lifetime = 70f; + lifetime = 60f; shootEffect = Fx.shootHeal; smokeEffect = Fx.hitLaser; splashDamage = 13f; @@ -1998,12 +1997,14 @@ public class UnitTypes implements ContentList{ lightRadius = 40f; lightOpacity = 0.7f; - trailInterval = 2f; - trailParam = 3f; + trailColor = Pal.heal; + trailWidth = 2.5f; + trailLength = 20; + trailChance = -1f; + healPercent = 2.8f; collidesTeam = true; backColor = Pal.heal; - trailColor = Pal.heal; despawnEffect = Fx.none; hitEffect = new ExplosionEffect(){{ @@ -2043,7 +2044,7 @@ public class UnitTypes implements ContentList{ trailY = -17f; trailScl = 3.2f; - buildSpeed = 3.5f; + buildSpeed = 3f; abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{ repair = 35f; @@ -2084,7 +2085,7 @@ public class UnitTypes implements ContentList{ trailY = -32f; trailScl = 3.5f; - buildSpeed = 3.8f; + buildSpeed = 3.5f; for(float mountY : new float[]{-117/4f, 50/4f}){ for(float sign : Mathf.signs){ @@ -2112,8 +2113,8 @@ public class UnitTypes implements ContentList{ bullet = new ContinuousLaserBulletType(){{ maxRange = 90f; - damage = 25f; - length = 90f; + damage = 26f; + length = 95f; hitEffect = Fx.hitMeltHeal; drawSize = 200f; lifetime = 155f; @@ -2160,7 +2161,7 @@ public class UnitTypes implements ContentList{ timeIncrease = 3f; timeDuration = 60f * 20f; powerDamageScl = 3f; - damage = 40; + damage = 50; hitColor = lightColor = Pal.heal; lightRadius = 70f; clipSize = 250f; @@ -2176,7 +2177,7 @@ public class UnitTypes implements ContentList{ trailWidth = 6f; trailColor = Pal.heal; trailInterval = 3f; - splashDamage = 40f; + splashDamage = 60f; splashDamageRadius = rad; hitShake = 4f; trailRotation = true; diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index cd9c86810b..169ffcc2b9 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -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(){ diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 83f32408a8..ec10061402 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -385,7 +385,7 @@ public class Renderer implements ApplicationListener{ lines[i + 3] = (byte)255; } Pixmap fullPixmap = new Pixmap(w, h); - Buffers.copy(lines, 0, fullPixmap.getPixels(), lines.length); + Buffers.copy(lines, 0, fullPixmap.pixels, lines.length); Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); PixmapIO.writePng(file, fullPixmap); fullPixmap.dispose(); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 40a09a37f3..70562ee8df 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -401,8 +401,14 @@ public class BulletType extends Content implements Cloneable{ //pierceBuilding is not enabled by default, because a bullet may want to *not* pierce buildings } - if(lightningType == null){ - lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; + if(lightning > 0){ + if(status == StatusEffects.none){ + status = StatusEffects.shocked; + } + + if(lightningType == null){ + lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; + } } } @@ -445,7 +451,7 @@ public class BulletType extends Content implements Cloneable{ bullet.owner = owner; bullet.team = team; bullet.time = 0f; - bullet.vel.trns(angle, speed * velocityScl); + bullet.initVel(angle, speed * velocityScl); if(backMove){ bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); }else{ @@ -462,7 +468,7 @@ public class BulletType extends Content implements Cloneable{ } bullet.add(); - if(keepVelocity && owner instanceof Velc v) bullet.vel.add(v.vel().x, v.vel().y); + if(keepVelocity && owner instanceof Velc v) bullet.vel.add(v.vel()); return bullet; } diff --git a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java index f1c57dcee8..27d5043ba5 100644 --- a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java +++ b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java @@ -23,7 +23,8 @@ public class ContinuousLaserBulletType extends BulletType{ public boolean largeHit = true; public ContinuousLaserBulletType(float damage){ - super(0.001f, damage); + this.damage = damage; + this.speed = 0f; hitEffect = Fx.hitBeam; despawnEffect = Fx.none; diff --git a/core/src/mindustry/entities/bullet/LaserBulletType.java b/core/src/mindustry/entities/bullet/LaserBulletType.java index 0961a91e8c..0ddb733712 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -21,7 +21,8 @@ public class LaserBulletType extends BulletType{ public boolean largeHit = false; public LaserBulletType(float damage){ - super(0.01f, damage); + this.damage = damage; + this.speed = 0f; hitEffect = Fx.hitLaserBlast; hitColor = colors[2]; diff --git a/core/src/mindustry/entities/bullet/LightningBulletType.java b/core/src/mindustry/entities/bullet/LightningBulletType.java index 578f055bae..0f97bbf132 100644 --- a/core/src/mindustry/entities/bullet/LightningBulletType.java +++ b/core/src/mindustry/entities/bullet/LightningBulletType.java @@ -12,8 +12,8 @@ public class LightningBulletType extends BulletType{ public int lightningLength = 25, lightningLengthRand = 0; public LightningBulletType(){ - super(0.0001f, 1f); - + damage = 1f; + speed = 0f; lifetime = 1; despawnEffect = Fx.none; hitEffect = Fx.hitLancer; diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java index d141c69998..f10b221c8f 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -16,6 +16,7 @@ public class RailBulletType extends BulletType{ public float updateEffectSeg = 20f; public RailBulletType(){ + speed = 0f; pierceBuilding = true; pierce = true; reflectable = false; @@ -23,7 +24,6 @@ public class RailBulletType extends BulletType{ despawnEffect = Fx.none; collides = false; lifetime = 1f; - speed = 0.01f; } @Override @@ -57,7 +57,7 @@ public class RailBulletType extends BulletType{ Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false); float resultLen = b.fdata; - Vec2 nor = Tmp.v1.set(b.vel).nor(); + Vec2 nor = Tmp.v1.trns(b.rotation(), 1f).nor(); for(float i = 0; i <= resultLen; i += updateEffectSeg){ updateEffect.at(b.x + nor.x * i, b.y + nor.y * i, b.rotation()); } @@ -70,8 +70,8 @@ public class RailBulletType extends BulletType{ @Override public void hitEntity(Bullet b, Hitboxc entity, float health){ - handle(b, entity, health); super.hitEntity(b, entity, health); + handle(b, entity, health); } @Override diff --git a/core/src/mindustry/entities/bullet/SapBulletType.java b/core/src/mindustry/entities/bullet/SapBulletType.java index ee3cd6699c..8482388071 100644 --- a/core/src/mindustry/entities/bullet/SapBulletType.java +++ b/core/src/mindustry/entities/bullet/SapBulletType.java @@ -17,7 +17,7 @@ public class SapBulletType extends BulletType{ public float width = 0.4f; public SapBulletType(){ - speed = 0.0001f; + speed = 0f; despawnEffect = Fx.none; pierce = true; collides = false; diff --git a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java index ccc5532e7d..40d9b86bf5 100644 --- a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java +++ b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java @@ -19,7 +19,7 @@ public class ShrapnelBulletType extends BulletType{ public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f, serrationFadeOffset = 0.5f; public ShrapnelBulletType(){ - speed = 0.01f; + speed = 0f; hitEffect = Fx.hitLancer; shootEffect = smokeEffect = Fx.lightningShoot; lifetime = 10f; diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index f9fe116008..c967d4dff4 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -2,7 +2,6 @@ package mindustry.entities.comp; import arc.func.*; import arc.graphics.g2d.*; -import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; @@ -22,11 +21,16 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Import Team team; @Import Entityc owner; @Import float x, y, damage; + @Import Vec2 vel; IntSeq collided = new IntSeq(6); Object data; BulletType type; float fdata; + + @ReadOnly + private float rotation; + transient boolean absorbed, hit; transient @Nullable Trail trail; @@ -149,17 +153,20 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw type.drawLight(self()); } + public void initVel(float angle, float amount){ + vel.trns(angle, amount); + rotation = angle; + } + /** Sets the bullet's rotation in degrees. */ @Override public void rotation(float angle){ - vel().setAngle(angle); + vel.setAngle(rotation = angle); } /** @return the bullet's rotation. */ @Override public float rotation(){ - float angle = Mathf.atan2(vel().x, vel().y) * Mathf.radiansToDegrees; - if(angle < 0) angle += 360; - return angle; + return vel.isZero(0.001f) ? rotation : vel.angle(); } } diff --git a/core/src/mindustry/entities/comp/FireComp.java b/core/src/mindustry/entities/comp/FireComp.java index 7439af97c9..3a767fb898 100644 --- a/core/src/mindustry/entities/comp/FireComp.java +++ b/core/src/mindustry/entities/comp/FireComp.java @@ -35,7 +35,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{ baseFlammability = -1, puddleFlammability, damageTimer = Mathf.random(40f), spreadTimer = Mathf.random(spreadDelay), fireballTimer = Mathf.random(fireballDelay), warmup = 0f, - animation = Mathf.random(frames); + animation = Mathf.random(frames - 1); @Override public void update(){ @@ -116,8 +116,10 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{ Draw.alpha(Mathf.clamp(warmup / warmupDuration)); Draw.z(Layer.effect); - Draw.rect(regions[(int)animation], x, y); + Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x, y); Draw.reset(); + + Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration)); } @Replace diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index 0323906021..63c3f5c6a2 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -45,6 +45,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra transient String lastText = ""; transient float textFadeTime; transient private Unit lastReadUnit = Nulls.unit; + transient @Nullable Unit justSwitchFrom, justSwitchTo; public boolean isBuilder(){ return unit.canBuild(); @@ -100,6 +101,16 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Override public void afterSync(){ + //fix rubberbanding: + //when the player recs a unit that they JUST transitioned away from, use the new unit instead + //reason: we know the server is lying here, essentially skip the unit snapshot because we know the client's information is more recent + if(isLocal() && unit == justSwitchFrom && justSwitchFrom != null && justSwitchTo != null){ + unit = justSwitchTo; + }else{ + justSwitchFrom = null; + justSwitchTo = null; + } + //simulate a unit change after sync Unit set = unit; unit = lastReadUnit; @@ -149,6 +160,13 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra } + public void checkSpawn(){ + CoreBuild core = bestCore(); + if(core != null){ + core.requestSpawn(self()); + } + } + @Override public void remove(){ //clear unit upon removal @@ -171,6 +189,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra } public void unit(Unit unit){ + //refuse to switch when the unit was just transitioned from + if(isLocal() && unit == justSwitchFrom && justSwitchFrom != null && justSwitchTo != null){ + return; + } + if(unit == null) throw new IllegalArgumentException("Unit cannot be null. Use clearUnit() instead."); if(this.unit == unit) return; diff --git a/core/src/mindustry/entities/comp/WaterMoveComp.java b/core/src/mindustry/entities/comp/WaterMoveComp.java index 69d178f41d..220386e31d 100644 --- a/core/src/mindustry/entities/comp/WaterMoveComp.java +++ b/core/src/mindustry/entities/comp/WaterMoveComp.java @@ -15,7 +15,8 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -//just a proof of concept +import static mindustry.Vars.*; + @Component abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @Import float x, y, rotation; @@ -32,7 +33,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ int sign = i == 0 ? -1 : 1; float cx = Angles.trnsx(rotation - 90, type.trailX * sign, type.trailY) + x, cy = Angles.trnsy(rotation - 90, type.trailX * sign, type.trailY) + y; - t.update(cx, cy); + t.update(cx, cy, world.floorWorld(cx, cy).isLiquid ? 1 : 0); } } diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index a77face3f4..1a3b7dc7f8 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -144,6 +144,14 @@ public class MinimapRenderer{ public void update(Tile tile){ if(world.isGenerating() || !state.isGame()) return; + if(tile.build != null && tile.isCenter()){ + tile.getLinkedTiles(other -> { + if(!other.isCenter()){ + update(other); + } + }); + } + int color = colorFor(tile); pixmap.set(tile.x, pixmap.height - 1 - tile.y, color); diff --git a/core/src/mindustry/graphics/MultiPacker.java b/core/src/mindustry/graphics/MultiPacker.java index eb823ea991..b286a3f2d6 100644 --- a/core/src/mindustry/graphics/MultiPacker.java +++ b/core/src/mindustry/graphics/MultiPacker.java @@ -26,6 +26,10 @@ public class MultiPacker implements Disposable{ return null; } + public PixmapPacker getPacker(PageType type){ + return packers[type.ordinal()]; + } + public boolean has(String name){ for(var page : PageType.all){ if(packers[page.ordinal()].getRect(name) != null){ @@ -70,8 +74,9 @@ public class MultiPacker implements Disposable{ //main page (sprites.png) - all sprites for units, weapons, placeable blocks, effects, bullets, etc //environment page (sprites2.png) - all sprites for things in the environmental cache layer //editor page (sprites3.png) - all sprites needed for rendering in the editor, including block icons and a few minor sprites - //zone page (sprites4.png) - zone previews - //ui page (sprites5.png) - content icons, white icons and UI elements + //zone page (sprites4.png) - zone preview + //rubble page - scorch textures for unit deaths & wrecks + //ui page (sprites5.png) - content icons, white icons, fonts and UI elements public enum PageType{ main(4096), environment, diff --git a/core/src/mindustry/graphics/Trail.java b/core/src/mindustry/graphics/Trail.java index fc998e64ea..5fc194c51d 100644 --- a/core/src/mindustry/graphics/Trail.java +++ b/core/src/mindustry/graphics/Trail.java @@ -40,6 +40,7 @@ public class Trail{ float[] items = points.items; int i = points.size - 3; float x1 = items[i], y1 = items[i + 1], w1 = items[i + 2], w = w1 * width / (points.size/3) * i/3f * 2f; + if(w1 <= 0.001f) return; Draw.rect("hcircle", x1, y1, w, w, -Mathf.radDeg * lastAngle + 180f); Draw.reset(); } @@ -56,6 +57,7 @@ public class Trail{ float size = width / (points.size/3); float z1 = lastAngle; float z2 = -Angles.angleRad(x2, y2, lx, ly); + if(w1 <= 0.001f || w2 <= 0.001f) continue; float cx = Mathf.sin(z1) * i/3f * size * w1, cy = Mathf.cos(z1) * i/3f * size * w1, nx = Mathf.sin(z2) * (i/3f + 1) * size * w2, ny = Mathf.cos(z2) * (i/3f + 1) * size * w2; diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 3746dae72e..6506db2d34 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -229,8 +229,10 @@ public class DesktopInput extends InputHandler{ if(on != null){ Call.unitControl(player, on); shouldShoot = false; + recentRespawnTimer = 1f; }else if(build != null){ Call.buildingControlSelect(player, build); + recentRespawnTimer = 1f; } } } @@ -238,9 +240,10 @@ public class DesktopInput extends InputHandler{ if(!player.dead() && !state.isPaused() && !scene.hasField()){ updateMovement(player.unit()); - if(Core.input.keyDown(Binding.respawn)){ - Call.unitClear(player); + if(Core.input.keyTap(Binding.respawn)){ controlledType = null; + recentRespawnTimer = 1f; + Call.unitClear(player); } } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index ebabd2523f..cb4ebad970 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -58,6 +58,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public Group uiGroup; public boolean isBuilding = true, buildWasAutoPaused = false, wasShooting = false; public @Nullable UnitType controlledType; + public float recentRespawnTimer; public @Nullable Schematic lastSchematic; public GestureDetector detector; @@ -375,15 +376,27 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ throw new ValidateException(player, "Player cannot control a unit."); } + //TODO problem: + //1. server send snapshot + //2. client requests to control unit, becomes unit locally + //3. snapshot arrives, client now thinks they're in the old unit (!!!) + //4. server gets packet that player is in the right unit + //5. server sends snapshot + //6. client gets snapshot, realizes that they are actually in the unit they selected + //7. client gets switched to new unit -> rubberbanding (!!!) + //clear player unit when they possess a core if(unit == null){ //just clear the unit (is this used?) player.clearUnit(); //make sure it's AI controlled, so players can't overwrite each other }else if(unit.isAI() && unit.team == player.team() && !unit.dead){ - if(!net.client()){ - player.unit(unit); + if(net.client() && player.isLocal()){ + player.justSwitchFrom = player.unit(); + player.justSwitchTo = unit; } + player.unit(unit); + Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit)); if(!player.dead()){ Fx.unitSpirit.at(player.x, player.y, 0f, unit); @@ -393,12 +406,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Events.fire(new UnitControlEvent(player, unit)); } - @Remote(targets = Loc.both, called = Loc.both, forward = true) + @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void unitClear(Player player){ if(player == null) return; + //problem: this gets called on both ends. it shouldn't be. Fx.spawn.at(player); player.clearUnit(); + player.checkSpawn(); player.deathTimer = Player.deathDelay + 1f; //for instant respawn } @@ -419,7 +434,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.unit().commandNearby(new CircleFormation()); Fx.commandSend.at(player, player.unit().type.commandRadius); } - } public Eachable allRequests(){ @@ -434,10 +448,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return !selectRequests.isEmpty(); } - public OverlayFragment getFrag(){ - return frag; - } - public void update(){ player.typing = ui.chatfrag.shown(); @@ -451,7 +461,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ wasShooting = player.shooting; - if(!player.dead()){ + //only reset the controlled type and control a unit after the timer runs out + //essentially, this means the client waits for ~1 second after controlling something before trying to control something else automatically + if(!player.dead() && (recentRespawnTimer -= Time.delta / 70f) <= 0f && player.justSwitchFrom != player.unit()){ controlledType = player.unit().type; } @@ -461,6 +473,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(unit != null){ //only trying controlling once a second to prevent packet spam if(!net.client() || controlInterval.get(0, 70f)){ + recentRespawnTimer = 1f; Call.unitControl(player, unit); } } diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index d037a0d351..55851e5c1c 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -614,8 +614,10 @@ public class MobileInput extends InputHandler implements GestureListener{ //control a unit/block detected on first tap of double-tap if(unitTapped != null){ Call.unitControl(player, unitTapped); + recentRespawnTimer = 1f; }else if(buildingTapped != null){ Call.buildingControlSelect(player, buildingTapped); + recentRespawnTimer = 1f; }else if(!tryBeginMine(cursor)){ tileTapped(linked.build); } @@ -856,8 +858,7 @@ public class MobileInput extends InputHandler implements GestureListener{ boolean omni = unit.type.omniMovement; boolean allowHealing = type.canHeal; - boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team && - ((Building)target).damaged() && target.within(unit, type.range); + boolean validHealTarget = allowHealing && target instanceof Building b && b.isValid() && target.team() == unit.team && b.damaged() && target.within(unit, type.range); boolean boosted = (unit instanceof Mechc && unit.isFlying()); //reset target if: @@ -912,13 +913,8 @@ public class MobileInput extends InputHandler implements GestureListener{ unit.vel.approachDelta(Vec2.ZERO, unit.speed() * type.accel / 2f); } - float expansion = 3f; - unit.hitbox(rect); - rect.x -= expansion; - rect.y -= expansion; - rect.width += expansion * 2f; - rect.height += expansion * 2f; + rect.grow(6f); player.boosting = collisions.overlapsTile(rect) || !unit.within(targetPos, 85f); @@ -927,7 +923,7 @@ public class MobileInput extends InputHandler implements GestureListener{ }else{ unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len())); if(!movement.isZero()){ - unit.vel.rotateTo(movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1)); + unit.rotation = Angles.moveToward(unit.rotation, movement.angle(), unit.type.rotateSpeed * Math.max(Time.delta, 1)); } } diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index ea15b3969c..c5b7986daa 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -8,6 +8,7 @@ import mindustry.ctype.*; import mindustry.game.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.meta.*; import java.io.*; @@ -111,6 +112,18 @@ public class JsonIO{ } }); + json.setSerializer(Attribute.class, new Serializer<>(){ + @Override + public void write(Json json, Attribute object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public Attribute read(Json json, JsonValue jsonData, Class type){ + return Attribute.get(jsonData.asString()); + } + }); + json.setSerializer(Item.class, new Serializer<>(){ @Override public void write(Json json, Item object, Class knownType){ diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index e6ca89e23b..1be513c7de 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -112,7 +112,6 @@ public class LCanvas extends Table{ jumps.cullable = false; }).grow().get(); - //pane.setClip(false); pane.setFlickScroll(false); //load old scroll percent diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java index f7021cc03e..2de33558b9 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -36,13 +36,20 @@ public enum LogicOp{ abs("abs", a -> Math.abs(a)), log("log", Math::log), log10("log10", Math::log10), - sin("sin", d -> Math.sin(d * 0.017453292519943295D)), - cos("cos", d -> Math.cos(d * 0.017453292519943295D)), - tan("tan", d -> Math.tan(d * 0.017453292519943295D)), floor("floor", Math::floor), ceil("ceil", Math::ceil), sqrt("sqrt", Math::sqrt), - rand("rand", d -> Mathf.rand.nextDouble() * d); + rand("rand", d -> Mathf.rand.nextDouble() * d), + + sin("sin", d -> Math.sin(d * Mathf.doubleDegRad)), + cos("cos", d -> Math.cos(d * Mathf.doubleDegRad)), + tan("tan", d -> Math.tan(d * Mathf.doubleDegRad)), + + asin("asin", d -> Math.asin(d) * Mathf.doubleRadDeg), + acos("acos", d -> Math.acos(d) * Mathf.doubleRadDeg), + atan("atan", d -> Math.atan(d) * Mathf.doubleRadDeg), + + ; public static final LogicOp[] all = values(); diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index 4e1b5a5242..786074c3dd 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -3,7 +3,6 @@ package mindustry.maps; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.*; import mindustry.ai.*; import mindustry.content.*; import mindustry.entities.*; @@ -186,7 +185,6 @@ public class SectorDamage{ Tile start = spawns.first(); - Time.mark(); var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore); Seq path = new Seq<>(); boolean found = false; diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index f47d1c3a60..1a6230795f 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -111,4 +111,23 @@ public abstract class FilterOption{ table.add("@filter.option." + name); } } + + static class ToggleOption extends FilterOption{ + final String name; + final Boolp getter; + final Boolc setter; + + ToggleOption(String name, Boolp getter, Boolc setter){ + this.name = name; + this.getter = getter; + this.setter = setter; + } + + @Override + public void build(Table table){ + table.row(); + CheckBox check = table.check("@filter.option." + name, setter).growX().padBottom(5).padTop(5).center().get(); + check.changed(changed); + } + } } diff --git a/core/src/mindustry/maps/filters/MirrorFilter.java b/core/src/mindustry/maps/filters/MirrorFilter.java index ed57af5138..cdb324b0ef 100644 --- a/core/src/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/mindustry/maps/filters/MirrorFilter.java @@ -15,11 +15,13 @@ public class MirrorFilter extends GenerateFilter{ private final Vec2 v1 = new Vec2(), v2 = new Vec2(), v3 = new Vec2(); int angle = 45; + boolean rotate = false; @Override public FilterOption[] options(){ return Structs.arr( - new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45) + new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45), + new ToggleOption("rotate", () -> rotate, f -> rotate = f) ); } @@ -72,8 +74,8 @@ public class MirrorFilter extends GenerateFilter{ } void mirror(Vec2 p, float x0, float y0, float x1, float y1){ - //special case: uneven map mirrored at 45 degree angle - if(in.width != in.height && angle % 90 != 0){ + //special case: uneven map mirrored at 45 degree angle (or someone might just want rotational symmetry) + if((in.width != in.height && angle % 90 != 0) || rotate){ p.x = in.width - p.x - 1; p.y = in.height - p.y - 1; }else{ diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index 720f5c2c02..7c77770cf3 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -61,6 +61,7 @@ public class ContentParser{ }); put(Interp.class, (type, data) -> field(Interp.class, data)); put(CacheLayer.class, (type, data) -> field(CacheLayer.class, data)); + put(Attribute.class, (type, data) -> Attribute.get(data.asString())); put(Schematic.class, (type, data) -> { Object result = fieldOpt(Loadouts.class, data); if(result != null){ diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 073c30f1b6..91dabc5482 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -607,7 +607,8 @@ public class Mods implements Loadable{ if(mod.root.child("content").exists()){ Fi contentRoot = mod.root.child("content"); for(ContentType type : ContentType.all){ - Fi folder = contentRoot.child(type.name().toLowerCase(Locale.ROOT) + "s"); + String lower = type.name().toLowerCase(Locale.ROOT); + Fi folder = contentRoot.child(lower + (lower.endsWith("s") ? "" : "s")); if(folder.exists()){ for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){ runs.add(new LoadRun(type, file, mod)); diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index a18c8d57de..a81376d189 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -385,7 +385,6 @@ public class ArcNetProvider implements NetProvider{ return readFramework(byteBuffer); }else{ //read length int, followed by compressed lz4 data - //TODO not thread safe!!! Packet packet = Net.newPacket(id); var buffer = decompressBuffer.get(); int length = byteBuffer.getShort() & 0xffff; @@ -396,7 +395,7 @@ public class ArcNetProvider implements NetProvider{ buffer.position(0).limit(length); buffer.put(byteBuffer.array(), byteBuffer.position(), length); buffer.position(0); - packet.read(reads.get()); + packet.read(reads.get(), length); //move read packets forward byteBuffer.position(byteBuffer.position() + buffer.position()); }else{ @@ -405,7 +404,7 @@ public class ArcNetProvider implements NetProvider{ buffer.position(0); buffer.limit(length); - packet.read(reads.get()); + packet.read(reads.get(), length); //move buffer forward based on bytes read by decompressor byteBuffer.position(byteBuffer.position() + read); } diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java index 588d35cfc7..318ebe04d0 100644 --- a/core/src/mindustry/net/BeControl.java +++ b/core/src/mindustry/net/BeControl.java @@ -7,6 +7,7 @@ import arc.func.*; import arc.util.*; import arc.util.async.*; import arc.util.serialization.*; +import mindustry.*; import mindustry.core.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -39,7 +40,7 @@ public class BeControl{ public BeControl(){ if(active()){ Timer.schedule(() -> { - if(checkUpdates && !mobile){ + if(Vars.clientLoaded && checkUpdates && !mobile){ checkUpdate(t -> {}); } }, updateInterval, updateInterval); diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 689834c07b..2279c955c0 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -257,6 +257,7 @@ public class Net{ * Call to handle a packet being received for the client. */ public void handleClientReceived(Packet object){ + object.handled(); if(object instanceof StreamBegin b){ streams.put(b.id, currentStream = new StreamBuilder(b)); @@ -291,6 +292,8 @@ public class Net{ * Call to handle a packet being received for the server. */ public void handleServerReceived(NetConnection connection, Packet object){ + object.handled(); + try{ //handle object normally if(serverListeners.get(object.getClass()) != null){ diff --git a/core/src/mindustry/net/Packet.java b/core/src/mindustry/net/Packet.java index a6200547cc..e49b18c572 100644 --- a/core/src/mindustry/net/Packet.java +++ b/core/src/mindustry/net/Packet.java @@ -2,7 +2,14 @@ package mindustry.net; import arc.util.io.*; +import java.io.*; + public abstract class Packet{ + //internally used by generated code + protected static final byte[] NODATA = {}; + protected static final ReusableByteInStream BAIS = new ReusableByteInStream(); + protected static final Reads READ = new Reads(new DataInputStream(BAIS)); + //these are constants because I don't want to bother making an enum to mirror the annotation enum /** Does not get handled unless client is connected. */ @@ -15,6 +22,12 @@ public abstract class Packet{ public void read(Reads read){} public void write(Writes write){} + public void read(Reads read, int length){ + read(read); + } + + public void handled(){} + public int getPriority(){ return priorityNormal; } diff --git a/core/src/mindustry/net/Packets.java b/core/src/mindustry/net/Packets.java index a1cd13670c..10e607ec50 100644 --- a/core/src/mindustry/net/Packets.java +++ b/core/src/mindustry/net/Packets.java @@ -2,7 +2,6 @@ package mindustry.net; import arc.*; import arc.struct.*; -import arc.util.*; import arc.util.io.*; import arc.util.serialization.*; import mindustry.core.*; @@ -131,8 +130,6 @@ public class Packets{ crc.update(Base64Coder.decode(uuid), 0, b.length); buffer.l(crc.getValue()); - Log.info("CRC value sent: @", Long.toHexString(crc.getValue())); - buffer.b(mobile ? (byte)1 : 0); buffer.i(color); buffer.b((byte)mods.size); diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index c173492ab6..6d4c332a37 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -120,7 +120,7 @@ public class StatusEffect extends UnlockableContent{ if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ Tmp.v1.rnd(Mathf.range(unit.type.hitSize/2f)); - effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y); + effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, color); } } diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 1389bd238a..ca002353bc 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -7,6 +7,8 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.audio.*; import mindustry.content.*; @@ -15,6 +17,7 @@ import mindustry.entities.bullet.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -119,6 +122,17 @@ public class Weapon implements Cloneable{ this(""); } + public void addStats(UnitType u, Table t){ + if(inaccuracy > 0){ + t.row(); + t.add("[lightgray]" + Stat.inaccuracy.localized() + ": [white]" + (int)inaccuracy + " " + StatUnit.degrees.localized()); + } + t.row(); + t.add("[lightgray]" + Stat.reload.localized() + ": " + (mirror ? "2x " : "") + "[white]" + Strings.autoFixed(60f / reload * shots, 2)); + + StatValues.ammo(ObjectMap.of(u, bullet)).display(t); + } + public float dps(){ return (bullet.estimateDPS() / reload) * shots * 60f; } diff --git a/core/src/mindustry/type/weapons/RepairBeamWeapon.java b/core/src/mindustry/type/weapons/RepairBeamWeapon.java index c2938207f0..44f76f680f 100644 --- a/core/src/mindustry/type/weapons/RepairBeamWeapon.java +++ b/core/src/mindustry/type/weapons/RepairBeamWeapon.java @@ -5,12 +5,14 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.util.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.blocks.units.*; +import mindustry.world.meta.*; /** * Note that this weapon requires a bullet with a positive maxRange. @@ -47,6 +49,12 @@ public class RepairBeamWeapon extends Weapon{ recoil = 0f; } + @Override + public void addStats(UnitType u, Table w){ + w.row(); + w.add("[lightgray]" + Stat.repairSpeed.localized() + ": " + (mirror ? "2x " : "") + "[white]" + (int)(repairSpeed * 60) + " " + StatUnit.perSecond.localized()); + } + @Override public float dps(){ return 0f; diff --git a/core/src/mindustry/ui/SearchBar.java b/core/src/mindustry/ui/SearchBar.java index 57d1977a9d..8929f45266 100644 --- a/core/src/mindustry/ui/SearchBar.java +++ b/core/src/mindustry/ui/SearchBar.java @@ -40,7 +40,7 @@ public class SearchBar{ parent.pane(table -> { pane[0] = table; rebuild.get(""); - }); + }).get().setScrollingDisabled(true, false); return pane[0]; } @@ -54,9 +54,6 @@ public class SearchBar{ /** Match a list item with the search query, case insensitive */ public static boolean matches(String query, String name){ - if(name == null || name.isEmpty()){ - return false; - } - return name.toLowerCase().contains(query); + return name != null && !name.isEmpty() && name.toLowerCase().contains(query); } } diff --git a/core/src/mindustry/ui/dialogs/BaseDialog.java b/core/src/mindustry/ui/dialogs/BaseDialog.java index 42fb7ac7ff..b99b164ca4 100644 --- a/core/src/mindustry/ui/dialogs/BaseDialog.java +++ b/core/src/mindustry/ui/dialogs/BaseDialog.java @@ -4,6 +4,7 @@ import arc.*; import arc.scene.ui.*; import arc.util.*; import mindustry.core.GameState.*; +import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -43,7 +44,12 @@ public class BaseDialog extends Dialog{ } protected void onResize(Runnable run){ - resized(run); + Events.on(ResizeEvent.class, event -> { + if(isShown() && Core.scene.getDialog() == this){ + run.run(); + updateScrollFocus(); + } + }); } public void addCloseListener(){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index de974ce8d8..0784bfe95d 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -127,7 +127,7 @@ public class ModsDialog extends BaseDialog{ try{ return d.parse(text); }catch(Exception e){ - throw new RuntimeException(e); + return new Date(); } }; @@ -147,12 +147,11 @@ public class ModsDialog extends BaseDialog{ } void setup(){ - boolean squish = Core.graphics.isPortrait(); float h = 110f; - float w = squish ? 410f : 524f; + float w = Math.min(Core.graphics.getWidth() / 1.1f, 520f); cont.clear(); - cont.defaults().width(squish ? 480 : 560f).pad(4); + cont.defaults().width(Math.min(Core.graphics.getWidth() / 1.2f, 520f)).pad(4); cont.add("@mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center); cont.row(); diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 704cf0ec61..2f4061c10a 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -721,6 +721,7 @@ public class HudFragment extends Fragment{ t.clicked(() -> { if(!player.dead() && mobile){ Call.unitClear(player); + control.input.recentRespawnTimer = 1f; control.input.controlledType = null; } }); diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index b231cd2079..d6c907cf2f 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -241,7 +241,6 @@ public class Tile implements Position, QuadTreeObject, Displayable{ //assign entity and type to blocks, so they act as proxies for this one other.build = entity; other.block = block; - } } } diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 6fbf281918..036863d530 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -34,6 +34,8 @@ public class MendProjector extends Block{ group = BlockGroup.projectors; hasPower = true; hasItems = true; + emitLight = true; + lightRadius = 50f; } @Override @@ -129,7 +131,7 @@ public class MendProjector extends Block{ @Override public void drawLight(){ - Drawf.light(team, x, y, 50f * smoothEfficiency, baseColor, 0.7f * smoothEfficiency); + Drawf.light(team, x, y, lightRadius * smoothEfficiency, baseColor, 0.7f * smoothEfficiency); } @Override diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index d11ef77db5..8611801979 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -39,6 +39,8 @@ public class OverdriveProjector extends Block{ hasPower = true; hasItems = true; canOverdrive = false; + emitLight = true; + lightRadius = 50f; } @Override @@ -89,7 +91,7 @@ public class OverdriveProjector extends Block{ @Override public void drawLight(){ - Drawf.light(team, x, y, 50f * smoothEfficiency, baseColor, 0.7f * smoothEfficiency); + Drawf.light(team, x, y, lightRadius * smoothEfficiency, baseColor, 0.7f * smoothEfficiency); } @Override diff --git a/core/src/mindustry/world/blocks/defense/ShockMine.java b/core/src/mindustry/world/blocks/defense/ShockMine.java index 00c805ac48..6cdcac7c3d 100644 --- a/core/src/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/mindustry/world/blocks/defense/ShockMine.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.defense; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -17,6 +18,8 @@ public class ShockMine extends Block{ public int length = 10; public int tendrils = 6; public Color lightningColor = Pal.lancerLaser; + public float teamAlpha = 0.3f; + public @Load("@-team-top") TextureRegion teamRegion; public ShockMine(String name){ super(name); @@ -24,7 +27,6 @@ public class ShockMine extends Block{ destructible = true; solid = false; targetable = false; - rebuildable = false; } public class ShockMineBuild extends Building{ @@ -37,12 +39,16 @@ public class ShockMine extends Block{ @Override public void draw(){ super.draw(); - Draw.color(team.color); - Draw.alpha(0.22f); - Fill.rect(x, y, 2f, 2f); + Draw.color(team.color, teamAlpha); + Draw.rect(teamRegion, x, y); Draw.color(); } + @Override + public void drawCracks(){ + + } + @Override public void unitOn(Unit unit){ if(enabled && unit.team != team && timer(timerDamage, cooldown)){ diff --git a/core/src/mindustry/world/blocks/distribution/Duct.java b/core/src/mindustry/world/blocks/distribution/Duct.java index 6e29f879b5..cf09c02f34 100644 --- a/core/src/mindustry/world/blocks/distribution/Duct.java +++ b/core/src/mindustry/world/blocks/distribution/Duct.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; +import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.units.*; @@ -183,5 +184,25 @@ public class Duct extends Block implements Autotiler{ next = front(); nextc = next instanceof DuctBuild d ? d : null; } + + @Override + public byte version(){ + return 1; + } + + @Override + public void write(Writes write){ + super.write(write); + write.b(recDir); + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + if(revision >= 1){ + recDir = read.b(); + } + current = items.first(); + } } } diff --git a/core/src/mindustry/world/blocks/distribution/DuctBridge.java b/core/src/mindustry/world/blocks/distribution/DuctBridge.java index e040f83879..f71d46514a 100644 --- a/core/src/mindustry/world/blocks/distribution/DuctBridge.java +++ b/core/src/mindustry/world/blocks/distribution/DuctBridge.java @@ -25,7 +25,7 @@ public class DuctBridge extends Block{ public @Load("@-dir") TextureRegion dirRegion; public int range = 4; - public float moveDelay = 5f; + public float speed = 5f; public DuctBridge(String name){ super(name); @@ -37,6 +37,7 @@ public class DuctBridge extends Block{ group = BlockGroup.transportation; noUpdateDisabled = true; envEnabled = Env.space | Env.terrestrial | Env.underwater; + drawArrow = false; } @Override @@ -55,6 +56,37 @@ public class DuctBridge extends Block{ Placement.calculateNodes(points, this, rotation, (point, other) -> Math.max(Math.abs(point.x - other.x), Math.abs(point.y - other.y)) <= range); } + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + super.drawPlace(x, y, rotation, valid); + + int length = range; + Building found = null; + + //find the link + for(int i = 1; i <= range; i++){ + Tile other = world.tile(x + Geometry.d4x(rotation) * i, y + Geometry.d4y(rotation) * i); + + if(other != null && other.build instanceof DuctBridgeBuild build && build.team == player.team()){ + length = i; + found = other.build; + break; + } + } + + Drawf.dashLine(Pal.placing, + x * tilesize + Geometry.d4[rotation].x * (tilesize / 2f + 2), + y * tilesize + Geometry.d4[rotation].y * (tilesize / 2f + 2), + x * tilesize + Geometry.d4[rotation].x * (length) * tilesize, + y * tilesize + Geometry.d4[rotation].y * (length) * tilesize + ); + + if(found != null){ + Drawf.square(found.x, found.y, found.block.size * tilesize/2f + 2.5f, 0f); + } + + } + public boolean positionsValid(int x1, int y1, int x2, int y2){ if(x1 == x2){ return Math.abs(y1 - y2) <= range; @@ -88,7 +120,6 @@ public class DuctBridge extends Block{ Draw.rect(bridgeBotRegion, cx, cy, len, tilesize, angle); Draw.reset(); Draw.alpha(Renderer.bridgeOpacity); - //Draw.rect(bridgeTopRegion, cx, cy, len, tilesize, angle); for(float i = 6f; i <= len + size * tilesize - 5f; i += 5f){ Draw.rect(arrowRegion, x + Geometry.d4x(rotation) * i, y + Geometry.d4y(rotation) * i, angle); @@ -116,12 +147,12 @@ public class DuctBridge extends Block{ link.occupied[rotation % 4] = this; if(items.any() && link.items.total() < link.block.itemCapacity){ progress += edelta(); - while(progress > moveDelay){ + while(progress > speed){ Item next = items.take(); if(next != null && link.items.total() < link.block.itemCapacity){ link.handleItem(this, next); } - progress -= moveDelay; + progress -= speed; } } } diff --git a/core/src/mindustry/world/blocks/distribution/DuctRouter.java b/core/src/mindustry/world/blocks/distribution/DuctRouter.java index b4c78d7ab8..69f90d52d4 100644 --- a/core/src/mindustry/world/blocks/distribution/DuctRouter.java +++ b/core/src/mindustry/world/blocks/distribution/DuctRouter.java @@ -87,7 +87,7 @@ public class DuctRouter extends Block{ if(current == null) return null; for(int i = -1; i <= 1; i++){ - Building other = nearby(Mathf.mod(rotation + i + cdump, 4)); + Building other = nearby(Mathf.mod(rotation + (((i + cdump + 1) % 3) - 1), 4)); if(other != null && other.team == team && other.acceptItem(this, current)){ return other; } diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index b8659c3d89..94b993aa7f 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -12,6 +12,7 @@ import arc.util.pooling.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.bullet.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.logic.*; @@ -28,6 +29,7 @@ public class MassDriver extends Block{ public int minDistribute = 10; public float knockback = 4f; public float reloadTime = 100f; + public MassDriverBolt bullet; public float bulletSpeed = 5.5f; public float bulletLifetime = 200f; public Effect shootEffect = Fx.shootBig2; @@ -287,7 +289,7 @@ public class MassDriver extends Block{ float angle = tile.angleTo(target); - Bullets.driverBolt.create(this, team, + bullet.create(this, team, x + Angles.trnsx(angle, translation), y + Angles.trnsy(angle, translation), angle, -1f, bulletSpeed, bulletLifetime, data); diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index 7e1697f401..523edb9654 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java @@ -57,6 +57,14 @@ public class PayloadConveyor extends Block{ stats.add(Stat.payloadCapacity, (payloadLimit), StatUnit.blocksSquared); } + @Override + public void init(){ + super.init(); + + //increase clip size for oversize loads + clipSize = Math.max(clipSize, size * tilesize * 2.1f); + } + public class PayloadConveyorBuild extends Building{ public @Nullable Payload item; public float progress, itemRotation, animation; diff --git a/core/src/mindustry/world/blocks/payloads/PayloadBlock.java b/core/src/mindustry/world/blocks/payloads/PayloadBlock.java index 20db57c296..b0b1d1c5a8 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadBlock.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadBlock.java @@ -13,7 +13,7 @@ import mindustry.world.*; import static mindustry.Vars.*; public class PayloadBlock extends Block{ - public float payloadSpeed = 0.5f, payloadRotateSpeed = 5f; + public float payloadSpeed = 0.7f, payloadRotateSpeed = 5f; public @Load(value = "@-top", fallback = "factory-top-@size") TextureRegion topRegion; public @Load(value = "@-out", fallback = "factory-out-@size") TextureRegion outRegion; diff --git a/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java b/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java index 50aacfe31f..c24755d89f 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java @@ -122,7 +122,8 @@ public class PayloadMassDriver extends PayloadBlock{ public float turretRotation = 90; public float reload = 0f, charge = 0f; public float targetSize = grabWidth*2f, curSize = targetSize; - public float payLength = 0f; + public float payLength = 0f, effectDelayTimer = -1f; + public PayloadDriverBuild lastOther; public boolean loaded; public boolean charging; public PayloadDriverState state = idle; @@ -151,6 +152,16 @@ public class PayloadMassDriver extends PayloadBlock{ targetSize = payload.size(); } + boolean pos = effectDelayTimer > 0; + effectDelayTimer -= Time.delta; + if(effectDelayTimer <= 0 && pos && lastOther != null){ + var other = lastOther; + float cx = Angles.trnsx(other.turretRotation, length), cy = Angles.trnsy(other.turretRotation, length); + receiveEffect.at(x - cx/2f, y - cy/2f, turretRotation); + reload = 1f; + Effect.shake(shake, shake, this); + } + charging = false; if(hasLink){ @@ -192,7 +203,7 @@ public class PayloadMassDriver extends PayloadBlock{ payVector.setZero(); payRotation = Angles.moveToward(payRotation, turretRotation + 180f, payloadRotateSpeed * delta()); } - }else{ + }else if(effectDelayTimer <= 0){ moveOutPayload(); } } @@ -270,26 +281,22 @@ public class PayloadMassDriver extends PayloadBlock{ transferEffect.at(x + cx, y + cy, turretRotation, new PayloadMassDriverData(x + cx, y + cy, other.x - cx, other.y - cy, payload)); Payload pay = payload; other.recPayload = payload; + other.effectDelayTimer = transferEffect.lifetime; - Time.run(transferEffect.lifetime, () -> { - receiveEffect.at(other.x - cx/2f, other.y - cy/2f, other.turretRotation); - Effect.shake(shake, shake, this); + //transfer payload + other.handlePayload(this, pay); + other.lastOther = this; + other.payVector.set(-cx, -cy); + other.payRotation = turretRotation; + other.payLength = length; + other.loaded = true; + other.updatePayload(); + other.recPayload = null; - //transfer payload - other.reload = 1f; - other.handlePayload(this, pay); - other.payVector.set(-cx, -cy); - other.payRotation = turretRotation; - other.payLength = length; - other.loaded = true; - other.updatePayload(); - other.recPayload = null; - - if(other.waitingShooters.size != 0 && other.waitingShooters.first() == this){ - other.waitingShooters.removeFirst(); - } - other.state = idle; - }); + if(other.waitingShooters.size != 0 && other.waitingShooters.first() == this){ + other.waitingShooters.removeFirst(); + } + other.state = idle; //reset state after shooting immediately payload = null; @@ -341,8 +348,10 @@ public class PayloadMassDriver extends PayloadBlock{ if(payload != null){ updatePayload(); - Draw.z(loaded ? Layer.blockOver + 0.2f : Layer.blockOver); - payload.draw(); + if(effectDelayTimer <= 0){ + Draw.z(loaded ? Layer.blockOver + 0.2f : Layer.blockOver); + payload.draw(); + } } Draw.z(Layer.blockOver + 0.1f); @@ -443,12 +452,22 @@ public class PayloadMassDriver extends PayloadBlock{ return Point2.unpack(link).sub(tile.x, tile.y); } + @Override + public byte version(){ + return 1; + } + @Override public void write(Writes write){ super.write(write); write.i(link); write.f(turretRotation); write.b((byte)state.ordinal()); + + write.f(reload); + write.f(charge); + write.bool(loaded); + write.bool(charging); } @Override @@ -457,6 +476,13 @@ public class PayloadMassDriver extends PayloadBlock{ link = read.i(); turretRotation = read.f(); state = PayloadDriverState.all[read.b()]; + + if(revision >= 1){ + reload = read.f(); + charge = read.f(); + loaded = read.bool(); + charging = read.bool(); + } } } diff --git a/core/src/mindustry/world/blocks/payloads/PayloadSource.java b/core/src/mindustry/world/blocks/payloads/PayloadSource.java index aa6a5c9a6c..52ba318699 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadSource.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadSource.java @@ -24,9 +24,11 @@ public class PayloadSource extends PayloadBlock{ size = 3; update = true; outputsPayload = true; - hasPower = true; + hasPower = false; rotate = true; configurable = true; + //make sure to display large units. + clipSize = 120; config(Block.class, (PayloadSourceBuild build, Block block) -> { if(canProduce(block) && build.block != block){ @@ -45,6 +47,13 @@ public class PayloadSource extends PayloadBlock{ build.scl = 0f; } }); + + configClear((PayloadSourceBuild build) -> { + build.block = null; + build.unit = null; + build.payload = null; + build.scl = 0f; + }); } @Override diff --git a/core/src/mindustry/world/blocks/payloads/PayloadVoid.java b/core/src/mindustry/world/blocks/payloads/PayloadVoid.java index 434753f0ee..e1cb184f48 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadVoid.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadVoid.java @@ -19,6 +19,9 @@ public class PayloadVoid extends PayloadBlock{ update = true; rotate = false; size = 3; + payloadSpeed = 1.2f; + //make sure to display large units. + clipSize = 120; } @Override diff --git a/core/src/mindustry/world/blocks/payloads/UnitPayload.java b/core/src/mindustry/world/blocks/payloads/UnitPayload.java index 2300dba10b..22d11f4b65 100644 --- a/core/src/mindustry/world/blocks/payloads/UnitPayload.java +++ b/core/src/mindustry/world/blocks/payloads/UnitPayload.java @@ -4,10 +4,10 @@ import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.core.*; import mindustry.entities.EntityCollisions.*; import mindustry.entities.*; import mindustry.game.EventType.*; @@ -69,14 +69,12 @@ public class UnitPayload implements Payload{ //check if unit can be dumped here SolidPred solid = unit.solidity(); if(solid != null){ - int tx = unit.tileX(), ty = unit.tileY(); - boolean nearEmpty = !solid.solid(tx, ty); - for(Point2 p : Geometry.d4){ - nearEmpty |= !solid.solid(tx + p.x, ty + p.y); - } + Tmp.v1.trns(unit.rotation, 1f); + + int tx = World.toTile(unit.x + Tmp.v1.x), ty = World.toTile(unit.y + Tmp.v1.y); //cannot dump on solid blocks - if(!nearEmpty) return false; + if(solid.solid(tx, ty)) return false; } //cannnot dump when there's a lot of overlap going on diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index bc3b6e2fd8..b510ef2285 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -49,7 +49,7 @@ public class PowerGraph{ } public float getPowerBalance(){ - return powerBalance.mean(); + return powerBalance.rawMean(); } public float getLastPowerNeeded(){ diff --git a/core/src/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index c57284c667..1c6d7837eb 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -18,6 +18,13 @@ public class ThermalGenerator extends PowerGenerator{ super(name); } + @Override + public void init(){ + super.init(); + //proper light clipping + clipSize = Math.max(clipSize, 45f * size * 2f * 2f); + } + @Override public void setStats(){ super.setStats(); @@ -52,7 +59,7 @@ public class ThermalGenerator extends PowerGenerator{ @Override public void drawLight(){ - Drawf.light(team, x, y, (40f + Mathf.absin(10f, 5f)) * productionEfficiency * size, Color.scarlet, 0.4f); + Drawf.light(team, x, y, (40f + Mathf.absin(10f, 5f)) * Math.min(productionEfficiency, 2f) * size, Color.scarlet, 0.4f); } @Override diff --git a/core/src/mindustry/world/blocks/sandbox/PowerSource.java b/core/src/mindustry/world/blocks/sandbox/PowerSource.java index 8953a595b6..3a8685bb5e 100644 --- a/core/src/mindustry/world/blocks/sandbox/PowerSource.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerSource.java @@ -4,7 +4,6 @@ import mindustry.world.blocks.power.*; import mindustry.world.meta.*; public class PowerSource extends PowerNode{ - public float powerProduction = 10000f; public PowerSource(String name){ diff --git a/core/src/mindustry/world/meta/Attribute.java b/core/src/mindustry/world/meta/Attribute.java index 5114d3c10a..4ade4aa68f 100644 --- a/core/src/mindustry/world/meta/Attribute.java +++ b/core/src/mindustry/world/meta/Attribute.java @@ -1,9 +1,11 @@ package mindustry.world.meta; +import arc.struct.*; import mindustry.*; public class Attribute{ public static Attribute[] all = {}; + public static ObjectMap map = new ObjectMap<>(); public static final Attribute /** Heat content. Used for thermal generator yield. */ @@ -36,6 +38,11 @@ public class Attribute{ return name; } + /** Never returns null, may throw an exception if not found. */ + public static Attribute get(String name){ + return map.getThrow(name, () -> new IllegalArgumentException("Unknown Attribute type: " + name)); + } + /** Automatically registers this attribute for use. Do not call after mod init. */ public static Attribute add(String name){ Attribute a = new Attribute(all.length, name); @@ -43,6 +50,7 @@ public class Attribute{ all = new Attribute[all.length + 1]; System.arraycopy(prev, 0, all, 0, a.id); all[a.id] = a; + map.put(name, a); return a; } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 5499cc1ca1..c3d3141332 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -198,15 +198,10 @@ public class StatValues{ table.image(region).size(60).scaling(Scaling.bounded).right().top(); - table.table(Tex.underline, w -> { + table.table(Tex.underline, w -> { w.left().defaults().padRight(3).left(); - if(weapon.inaccuracy > 0){ - sep(w, "[lightgray]" + Stat.inaccuracy.localized() + ": [white]" + (int)weapon.inaccuracy + " " + StatUnit.degrees.localized()); - } - sep(w, "[lightgray]" + Stat.reload.localized() + ": " + (weapon.mirror ? "2x " : "") + "[white]" + Strings.autoFixed(60f / weapon.reload * weapon.shots, 2)); - - ammo(ObjectMap.of(unit, weapon.bullet)).display(w); + weapon.addStats(unit, w); }).padTop(-9).left(); table.row(); } @@ -275,10 +270,6 @@ public class StatValues{ sep(bt, "@bullet.incendiary"); } - if(type.status != StatusEffects.none){ - sep(bt, (type.minfo.mod == null ? type.status.emoji() : "") + "[stat]" + type.status.localizedName); - } - if(type.homingPower > 0.01f){ sep(bt, "@bullet.homing"); } @@ -290,6 +281,10 @@ public class StatValues{ if(type.fragBullet != null){ sep(bt, "@bullet.frag"); } + + if(type.status != StatusEffects.none){ + sep(bt, (type.minfo.mod == null ? type.status.emoji() : "") + "[stat]" + type.status.localizedName); + } }).padTop(unit ? 0 : -9).left().get().background(unit ? null : Tex.underline); table.row(); @@ -298,7 +293,6 @@ public class StatValues{ } //for AmmoListValue - private static void sep(Table table, String text){ table.row(); table.add(text); diff --git a/desktop/build.gradle b/desktop/build.gradle index 948b5413f9..4c8a14f86f 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -1,7 +1,4 @@ -import com.badlogicgames.packr.Packr -import com.badlogicgames.packr.PackrConfig - -sourceSets.main.java.srcDirs = [ "src/" ] +sourceSets.main.java.srcDirs = ["src/"] project.ext.mainClassName = "mindustry.desktop.DesktopLauncher" project.ext.assetsDir = new File("../core/assets") @@ -9,6 +6,7 @@ project.ext.assetsDir = new File("../core/assets") def enableTemplates = true def JDK_DIR = "$System.env.JDK_DIR" def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns") +def platforms = ["Linux64", "Windows64", "Windows32", "MacOS"] task run(dependsOn: classes, type: JavaExec){ main = project.mainClassName @@ -36,7 +34,6 @@ task run(dependsOn: classes, type: JavaExec){ } } - task dist(type: Jar, dependsOn: configurations.runtimeClasspath){ from files(sourceSets.main.output.classesDirs) from files(sourceSets.main.output.resourcesDir) @@ -72,8 +69,13 @@ task steamtest(dependsOn: dist){ } } -//TODO replace with jpackage templates -PackrConfig.Platform.values().each{ platform -> +//required templates: +//- Windows32: Not provided by Packr! This uses Java 8 +//required JDKs: +//- Windows64 +//- Linux64 +//- Mac +platforms.each{ platform -> task "packr${platform.toString()}"{ dependsOn dist @@ -88,7 +90,8 @@ PackrConfig.Platform.values().each{ platform -> 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{ into "build/packr/output" from "${JDK_DIR}/templates/${platform.toString().toLowerCase()}" @@ -100,30 +103,35 @@ PackrConfig.Platform.values().each{ platform -> from "build/libs/${appName}.jar" } }else{ - def config = new PackrConfig() - config.with{ - 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()] + def jarPath = JDK_DIR + "packr.jar" + def args = ["java", "-jar", jarPath] as String[] - vmArgs = [] - minimizeJre = "$rootDir/desktop/packr_minimize.json".toString() - jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip" + args += [ + "--platform", platform == "MacOS" ? "Mac" : platform.toString(), + "--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){ - vmArgs += "XstartOnFirstThread" - } + if(platform == "MacOS"){ + 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{ into "build/packr/output/jre/" from "build/packr/output/desktop.jar" @@ -133,10 +141,8 @@ PackrConfig.Platform.values().each{ platform -> 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") - } - - if(platform == PackrConfig.Platform.MacOS){ + file("build/packr/output/Mindustry.json").text = file("build/packr/output/Mindustry.json").text.replace("desktop.jar", "jre/desktop.jar") + }else{ copy{ into "build/packr/output/${appName}.app/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{ from "build/packr/output/jre/bin/msvcr100.dll" into "build/packr/output/" @@ -158,12 +164,12 @@ PackrConfig.Platform.values().each{ platform -> if(versionModifier.contains("steam")){ copy{ - def lib = platform == PackrConfig.Platform.MacOS || platform == PackrConfig.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{ - include "${lib}steamworks4j${platform == PackrConfig.Platform.Windows64 ? '64.dll' : platform == PackrConfig.Platform.Windows32 ? '.dll' : platform == PackrConfig.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'}" + def lib = platform == "MacOS" || platform == "Linux64" ? "lib" : "" + from zipTree(platform == "MacOS" ? "build/packr/output/${appName}.app/Contents/Resources/desktop.jar" : "build/packr/output/jre/desktop.jar").matching{ + include "${lib}steamworks4j${platform == "Windows64" ? '64.dll' : platform == "Windows32" ? '.dll' : 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" } } diff --git a/desktop/packr_minimize.json b/desktop/packr_minimize.json deleted file mode 100644 index d18eb478a8..0000000000 --- a/desktop/packr_minimize.json +++ /dev/null @@ -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" - ] - } - ] -} diff --git a/gradle.properties b/gradle.properties index 696bad812c..cf506d1790 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ 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 kapt.incremental.apt = true # Multithreaded @@ -8,4 +9,4 @@ kapt.use.worker.api=true 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 kotlin.stdlib.default.dependency=false -archash=5a9d95001fc988df2681616ebc33152b9c88ea92 +archash=759b136340ea98d4cb9881e340fb219c6d602a66 diff --git a/servers_be.json b/servers_be.json index aa10471809..00d82b09bc 100644 --- a/servers_be.json +++ b/servers_be.json @@ -4,5 +4,17 @@ }, { "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" } ] diff --git a/servers_v6.json b/servers_v6.json index 987414867e..265d294f65 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -21,7 +21,7 @@ }, { "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", @@ -95,12 +95,12 @@ "name": "Mindustry.Party", "address": ["game.mindustry.party"] }, - { - "name": "thedimas", - "address": ["play.thedimas.pp.ua"] - }, { "name": "TSR", "address": ["fifr4.quackhost.uk:20131"] + }, + { + "name": "Sakura", + "address": ["160.16.207.141"] } ] diff --git a/tools/build.gradle b/tools/build.gradle index 3a1141fb1f..c98a6c8525 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -1,7 +1,5 @@ sourceSets.main.java.srcDirs = ["src/"] - - import arc.files.Fi import arc.graphics.Color import arc.graphics.Pixmap