Compare commits

..

40 Commits
v143 ... v143.1

Author SHA1 Message Date
Anuken
34b22f292c PR cleanup 2023-04-08 10:52:53 -04:00
Anuken
11ad5a0373 Reset UI scale to 100% when broken 2023-04-08 10:29:42 -04:00
Anuken
f4fabecce7 Fixed #8483 (meep why did you make the minimum 5%) 2023-04-07 11:05:26 -04:00
Anuken
60fc2fb5cd Doubled server object buffer size 2023-04-07 10:43:59 -04:00
Anuken
04eba618d2 Merge remote-tracking branch 'origin/master' 2023-04-06 19:13:41 -04:00
Anuken
ac7b694e91 Better item display rates 2023-04-06 19:13:36 -04:00
Github Actions
4fcb338d94 Automatic bundle update 2023-04-06 23:08:17 +00:00
JniTrRny
6dc3b7e729 More Dark UI in stats display (#8473)
* The Dark UI Menace

* Attack of the Dark UI
2023-04-06 19:07:24 -04:00
code-explorer786
cdb9fa0d7d Add PlayerChatEvent on clients (#8432)
* Add PlayerChatEvent on clients

d32dd01097

Co-authored-by: buthed010203 <naguiar010203@gmail.com>

* Only fire when valid. (Currently deciding on whether or not to add ChatEvent without the player.)

---------

Co-authored-by: buthed010203 <naguiar010203@gmail.com>
2023-04-06 18:16:04 -04:00
Anuken
2b11e1fb1e Fixed #8480 2023-04-06 12:15:12 -04:00
Anuken
697c6a927a Merge remote-tracking branch 'origin/master' 2023-04-06 10:46:57 -04:00
Anuken
72b456fca2 Optimized imports 2023-04-06 10:46:52 -04:00
Github Actions
f67e2c71e7 Automatic bundle update 2023-04-06 13:56:07 +00:00
Nunting
bee977cadc Update bundle_ko.properties (#8479) 2023-04-06 09:55:06 -04:00
MonoDx
183ebb33b7 Update bundle_be.properties (#8478)
Update logical translate.

Work monoDx.
Thanks
2023-04-06 09:54:48 -04:00
Anuken
f6665de2e6 Update push.yml 2023-04-05 20:06:45 -04:00
Anuken
97390d25c0 Removed pointless code 2023-04-05 19:51:16 -04:00
Anuken
3f1d957e28 New duo animation 2023-04-04 11:02:47 -04:00
Anuken
e62a5888ef Fixed some possible crashes 2023-04-03 16:40:12 -04:00
MEEPofFaith
6d71bcd2eb Multi shotgun fix (#8460)
* Multi-barrel shotgun fix

* multi-recoil support

* @Nullable for everything
2023-04-03 16:38:10 -04:00
buthed010203
2075a226e1 Fix multiline messages being cut off (#8471)
I'm not fixing this properly
2023-04-03 15:37:09 -04:00
MEEPofFaith
f55363a932 Fix janky sublimate ammo display (#8469) 2023-04-03 10:03:24 -04:00
DikHalz
76f151789a Update servers_v7.json (#8468) 2023-04-02 23:21:23 -04:00
Anuken
1413b479ef Classmap auto-update 2023-04-02 22:44:44 -04:00
MEEPofFaith
b322b1165f Parse singular consumes (#8466)
* Parse singular `Consume`s

* Proper coolant parsing

* Temporary manual update of ClassMap

Does not include all consume types.

I don't know what gradle command to run to update `ClassMap`. I've tried `tools:updateScripts` but that just cleared everything.
2023-04-02 19:53:19 -04:00
Anuken
fa02d8d280 Merge remote-tracking branch 'origin/master' 2023-04-02 13:28:53 -04:00
Anuken
251e10b000 Fixed #8465 2023-04-02 13:28:49 -04:00
Joan Josep
6630f88613 Update bundle_ca.properties (#8464) 2023-04-02 11:00:27 -04:00
Anuken
c5c65d4475 Fixed #8462 2023-04-02 10:54:42 -04:00
Anuken
c267743874 Fixed #8463 2023-04-02 10:38:19 -04:00
Anuken
45ce8c8dec Merge remote-tracking branch 'origin/master' 2023-04-02 10:36:31 -04:00
Anuken
25c65e80cd Fixed team write error 2023-04-02 10:36:26 -04:00
MEEPofFaith
e51ab514a8 Proper speedup amount (#8461) 2023-04-02 00:19:33 -04:00
Anuken
21d64157a0 Merge remote-tracking branch 'origin/master' 2023-04-01 17:30:08 -04:00
Anuken
fff8f567d0 Hide weapon sprites for certain units 2023-04-01 17:30:05 -04:00
Bernd Ritter
1e2e0a48a1 Update bundle_de.properties (#8452)
Fixed two typos of fordere -> vordere
2023-04-01 10:39:00 -04:00
Anuken
affa30730a Fixed #8458 2023-04-01 10:04:22 -04:00
Anuken
b326bdf0e8 Merge remote-tracking branch 'origin/master' 2023-04-01 09:55:59 -04:00
Anuken
cc3694ce4a battery fix 2023-04-01 09:55:54 -04:00
Xasmedy
3048e38bff Fixing menu not hiding on click. (#8455) 2023-04-01 09:54:01 -04:00
129 changed files with 612 additions and 324 deletions

View File

@@ -40,6 +40,8 @@ jobs:
- name: Update JITpack repo - name: Update JITpack repo
if: ${{ github.repository == 'Anuken/Mindustry' }} if: ${{ github.repository == 'Anuken/Mindustry' }}
run: | run: |
git config --global user.name "Github Actions"
git config --global user.email "cli@github.com"
cd ../ cd ../
cp -r ./Mindustry ./MindustryJitpack cp -r ./Mindustry ./MindustryJitpack
cd MindustryJitpack cd MindustryJitpack

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -3,7 +3,6 @@
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

View File

Before

Width:  |  Height:  |  Size: 373 B

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

View File

@@ -900,6 +900,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Speed Increase stat.speedincrease = Speed Increase
stat.range = Range stat.range = Range
stat.drilltier = Drillables stat.drilltier = Drillables
@@ -1796,54 +1797,54 @@ hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a pay
hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. 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.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.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 \uf868 [accent]Foundation[] core over the \uf869 [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a \uF868 [accent]Foundation[] core over the \uF869 [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.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.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation. hint.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation.
hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[].
hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there. hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there.
hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there. hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there.
gz.mine = Move near the \uf8c4 [accent]copper ore[] on the ground and click to begin mining. gz.mine = Move near the \uF8C4 [accent]copper ore[] on the ground and click to begin mining.
gz.mine.mobile = Move near the \uf8c4 [accent]copper ore[] on the ground and tap it to begin mining. gz.mine.mobile = Move near the \uF8C4 [accent]copper ore[] on the ground and tap it to begin mining.
gz.research = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it. gz.research = Open the \uE875 tech tree.\nResearch the \uF870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it.
gz.research.mobile = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \uE800 [accent]checkmark[] at the bottom right to confirm. gz.research.mobile = Open the \uE875 tech tree.\nResearch the \uF870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \uE800 [accent]checkmark[] at the bottom right to confirm.
gz.conveyors = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. gz.conveyors = Research and place \uF896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate.
gz.conveyors.mobile = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nHold down your finger for a second and drag to place multiple conveyors. gz.conveyors.mobile = Research and place \uF896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nHold down your finger for a second and drag to place multiple conveyors.
gz.drills = Expand the mining operation.\nPlace more Mechanical Drills.\nMine 100 copper. gz.drills = Expand the mining operation.\nPlace more Mechanical Drills.\nMine 100 copper.
gz.lead = \uf837 [accent]Lead[] is another commonly used resource.\nSet up drills to mine lead. gz.lead = \uF837 [accent]Lead[] is another commonly used resource.\nSet up drills to mine lead.
gz.moveup = \ue804 Move up for further objectives. gz.moveup = \uE804 Move up for further objectives.
gz.turrets = Research and place 2 \uf861 [accent]Duo[] turrets to defend the core.\nDuo turrets require \uf838 [accent]ammo[] from conveyors. gz.turrets = Research and place 2 \uF861 [accent]Duo[] turrets to defend the core.\nDuo turrets require \uF838 [accent]ammo[] from conveyors.
gz.duoammo = Supply the Duo turrets with [accent]copper[], using conveyors. gz.duoammo = Supply the Duo turrets with [accent]copper[], using conveyors.
gz.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace \uf8ae [accent]copper walls[] around the turrets. gz.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace \uF8AE [accent]copper walls[] around the turrets.
gz.defend = Enemy incoming, prepare to defend. gz.defend = Enemy incoming, prepare to defend.
gz.aa = Flying units cannot easily be dispatched with standard turrets.\n\uf860 [accent]Scatter[] turrets provide excellent anti-air, but require \uf837 [accent]lead[] as ammo. gz.aa = Flying units cannot easily be dispatched with standard turrets.\n\uF860 [accent]Scatter[] turrets provide excellent anti-air, but require \uF837 [accent]lead[] as ammo.
gz.scatterammo = Supply the Scatter turret with \uf837 [accent]lead[], using conveyors. gz.scatterammo = Supply the Scatter turret with \uF837 [accent]lead[], using conveyors.
gz.supplyturret = [accent]Supply Turret gz.supplyturret = [accent]Supply Turret
gz.zone1 = This is the enemy drop zone. gz.zone1 = This is the enemy drop zone.
gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone2 = Anything built in the radius is destroyed when a wave starts.
gz.zone3 = A wave will begin now.\nGet ready. gz.zone3 = A wave will begin now.\nGet ready.
gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[].
onset.mine = Click to mine \uf748 [accent]beryllium[] from walls.\n\nUse [accent][[WASD] to move. onset.mine = Click to mine \uF748 [accent]beryllium[] from walls.\n\nUse [accent][[WASD] to move.
onset.mine.mobile = Tap to mine \uf748 [accent]beryllium[] from walls. onset.mine.mobile = Tap to mine \uF748 [accent]beryllium[] from walls.
onset.research = Open the \ue875 tech tree.\nResearch, then place a \uf73e [accent]turbine condenser[] on the vent.\nThis will generate [accent]power[]. onset.research = Open the \uE875 tech tree.\nResearch, then place a \uF73E [accent]turbine condenser[] on the vent.\nThis will generate [accent]power[].
onset.bore = Research and place a \uf741 [accent]plasma bore[].\nThis automatically mines resources from walls. onset.bore = Research and place a \uF741 [accent]plasma bore[].\nThis automatically mines resources from walls.
onset.power = To [accent]power[] the plasma bore, research and place a \uf73d [accent]beam node[].\nConnect the turbine condenser to the plasma bore. onset.power = To [accent]power[] the plasma bore, research and place a \uF73D [accent]beam node[].\nConnect the turbine condenser to the plasma bore.
onset.ducts = Research and place \uf799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\nClick and drag to place multiple ducts.\n[accent]Scroll[] to rotate. onset.ducts = Research and place \uF799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\nClick and drag to place multiple ducts.\n[accent]Scroll[] to rotate.
onset.ducts.mobile = Research and place \uf799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\n\nHold down your finger for a second and drag to place multiple ducts. onset.ducts.mobile = Research and place \uF799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\n\nHold down your finger for a second and drag to place multiple ducts.
onset.moremine = Expand the mining operation.\nPlace more Plasma Bores and use beam nodes and ducts to support them.\nMine 200 beryllium. onset.moremine = Expand the mining operation.\nPlace more Plasma Bores and use beam nodes and ducts to support them.\nMine 200 beryllium.
onset.graphite = More complex blocks require \uf835 [accent]graphite[].\nSet up plasma bores to mine graphite. onset.graphite = More complex blocks require \uF835 [accent]graphite[].\nSet up plasma bores to mine graphite.
onset.research2 = Begin researching [accent]factories[].\nResearch the \uf74d [accent]cliff crusher[] and \uf779 [accent]silicon arc furnace[]. onset.research2 = Begin researching [accent]factories[].\nResearch the \uF74D [accent]cliff crusher[] and \uF779 [accent]silicon arc furnace[].
onset.arcfurnace = The arc furnace needs \uf834 [accent]sand[] and \uf835 [accent]graphite[] to create \uf82f [accent]silicon[].\n[accent]Power[] is also required. onset.arcfurnace = The arc furnace needs \uF834 [accent]sand[] and \uF835 [accent]graphite[] to create \uF82F [accent]silicon[].\n[accent]Power[] is also required.
onset.crusher = Use \uf74d [accent]cliff crushers[] to mine sand. onset.crusher = Use \uF74D [accent]cliff crushers[] to mine sand.
onset.fabricator = Use [accent]units[] to explore the map, defend buildings, and attack the enemy. Research and place a \uf6a2 [accent]tank fabricator[]. onset.fabricator = Use [accent]units[] to explore the map, defend buildings, and attack the enemy. Research and place a \uF6A2 [accent]tank fabricator[].
onset.makeunit = Produce a unit.\nUse the "?" button to see selected factory requirements. onset.makeunit = Produce a unit.\nUse the "?" button to see selected factory requirements.
onset.turrets = Units are effective, but [accent]turrets[] provide better defensive capabilities if used effectively.\nPlace a \uf6eb [accent]Breach[] turret.\nTurrets require \uf748 [accent]ammo[]. onset.turrets = Units are effective, but [accent]turrets[] provide better defensive capabilities if used effectively.\nPlace a \uF6EB [accent]Breach[] turret.\nTurrets require \uF748 [accent]ammo[].
onset.turretammo = Supply the turret with [accent]beryllium ammo.[] onset.turretammo = Supply the turret with [accent]beryllium ammo.[]
onset.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace some \uf6ee [accent]beryllium walls[] around the turret. onset.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace some \uF6EE [accent]beryllium walls[] around the turret.
onset.enemies = Enemy incoming, prepare to defend. onset.enemies = Enemy incoming, prepare to defend.
onset.attack = The enemy is vulnerable. Counter-attack. onset.attack = The enemy is vulnerable. Counter-attack.
onset.cores = New cores can be placed on [accent]core tiles[].\nNew cores function as forward bases and share a resource inventory with other cores.\nPlace a \uf725 core. onset.cores = New cores can be placed on [accent]core tiles[].\nNew cores function as forward bases and share a resource inventory with other cores.\nPlace a \uF725 core.
onset.detect = The enemy will be able to detect you in 2 minutes.\nSet up defenses, mining, and production. onset.detect = The enemy will be able to detect you in 2 minutes.\nSet up defenses, mining, and production.
split.pickup = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(Default keys are [[ and ] to pick up and drop) split.pickup = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(Default keys are [[ and ] to pick up and drop)

View File

@@ -875,6 +875,7 @@ stat.repairspeed = Хуткасць Рамонту
stat.weapons = Зброя stat.weapons = Зброя
stat.bullet = Куля stat.bullet = Куля
stat.moduletier = Модульны Ўзровень stat.moduletier = Модульны Ўзровень
stat.unittype = Unit Type
stat.speedincrease = Павелічэнне хуткасці stat.speedincrease = Павелічэнне хуткасці
stat.range = Радыус дзеяння stat.range = Радыус дзеяння
stat.drilltier = Бурць stat.drilltier = Бурць
@@ -2298,24 +2299,24 @@ unitlocate.building = Output variable for located building.
unitlocate.outx = Output X coordinate. unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate. unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for. unitlocate.group = Building group to look for.
lenum.idle = Don't move, but keep building/mining.\nThe default state. lenum.idle = Не рухацца, а будаваць/дабываць.\nЗвычайны стан.
lenum.stop = Stop moving/mining/building. lenum.stop = Перастаць рухацца/дабываць/будаваць.
lenum.unbind = Completely disable logic control.\nResume standard AI. lenum.unbind = Поўнасццю адключыць кантраляванне працэссарамі.\nАднавіць звычайныя паводзіны AI.
lenum.move = Move to exact position. lenum.move = Рухацца да канкрэтнай каардынаты.
lenum.approach = Approach a position with a radius. lenum.approach = Падысці да каардынаты з радыюсам.
lenum.pathfind = Pathfind to the enemy spawn. lenum.pathfind = Найці шлях да варожай кропкі з'яўлення.
lenum.target = Shoot a position. lenum.target = Атакаваць каардынату.
lenum.targetp = Shoot a target with velocity prediction. lenum.targetp = Атакаваць мэту з прадвылічэннем скорасці.
lenum.itemdrop = Drop an item. lenum.itemdrop = Апусціць элемент.
lenum.itemtake = Take an item from a building. lenum.itemtake = Узяць элемент Take an item from a building.
lenum.paydrop = Drop current payload. lenum.paydrop = Апусціць існуючы груз.
lenum.paytake = Pick up payload at current location. lenum.paytake = Узыць груз у заданных каардынатах.
lenum.payenter = Enter/land on the payload block the unit is on. lenum.payenter = Увайсці/прызямліцца на блок выгрузкі калі адзінка каля/над ім.
lenum.flag = Numeric unit flag. lenum.flag = Лічбавы сцяг адзінкі.
lenum.mine = Mine at a position. lenum.mine = Дабываць у кардынатах.
lenum.build = Build a structure. lenum.build = Пабудаваць структуру.
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[]. lenum.getblock = Атрымаць будынак і яго тып у каардынатах.\nАдзінка павінна быць у дыяпазоне ад каардынат.\nЦвердыя не будынкі павінны мець тып [accent]@solid[].
lenum.within = Check if unit is near a position. lenum.within = Правярае калі адзінка знаходзіцца каля каардынат.
lenum.boost = Start/stop boosting. lenum.boost = Пачаць/перастаць узлятаць.
onset.commandmode = Hold [accent]shift[] to enter [accent]command mode[].\n[accent]Left-click and drag[] to select units.\n[accent]Right-click[] to order selected units to move or attack. onset.commandmode = Зажміце [accent]shift[] каб увайсці ў [accent]рэжым камандавання[].\n[accent]Левая Кнопка Мышкі і працягнуць[] каб выбраць адзінкі.\n[accent]Правая Кнопка Мышкі[] каб камандаваць выбранымі адзінкамі каб рухаць або атакаваць.
onset.commandmode.mobile = Press the [accent]command button[] to enter [accent]command mode[].\nHold down a finger, then [accent]drag[] to select units.\n[accent]Tap[] to order selected units to move or attack. onset.commandmode.mobile = Націсніце на кнопку [accent]Камандавання[] каб увайсці ў [accent]рэжым камандавання[].\nУтрамайце палец, пасля [accent]правесці[] да выбраных адзінак.\n[accent]Націсніце[] каб камандаваць выбранымі адзінкамі каб рухаць або атакаваць.

View File

@@ -886,6 +886,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Оръжия stat.weapons = Оръжия
stat.bullet = Муниции stat.bullet = Муниции
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Ускорение stat.speedincrease = Ускорение
stat.range = Обхват stat.range = Обхват
stat.drilltier = Изкопаеми ресурси stat.drilltier = Изкопаеми ресурси

View File

@@ -890,6 +890,7 @@ stat.repairspeed = Velocitat de reparació
stat.weapons = Armes stat.weapons = Armes
stat.bullet = Bala stat.bullet = Bala
stat.moduletier = Nivell del mòdul stat.moduletier = Nivell del mòdul
stat.unittype = Unit Type
stat.speedincrease = Augment de velocitat stat.speedincrease = Augment de velocitat
stat.range = Abast stat.range = Abast
stat.drilltier = Perforables stat.drilltier = Perforables
@@ -983,8 +984,8 @@ bullet.splashdamage = [stat]{0}[lightgray] de dany a làrea ~[stat] {1}[light
bullet.incendiary = [stat]incendiari bullet.incendiary = [stat]incendiari
bullet.homing = [stat]munició guiada bullet.homing = [stat]munició guiada
bullet.armorpierce = [stat]perforador darmadures bullet.armorpierce = [stat]perforador darmadures
bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles bullet.suppression = [stat]Supressió de reparacions cada {0} s[lightgray] ~ [stat]{1}[lightgray] caselles
bullet.interval = [stat]{0}/sec[lightgray] interval bullets: bullet.interval = [stat]Interval de bales de {0}/s[lightgray]:
bullet.frags = [stat]{0}[lightgray]× de bales de fragmentació: bullet.frags = [stat]{0}[lightgray]× de bales de fragmentació:
bullet.lightning = [stat]{0}[lightgray]× llampec ~ [stat]{1}[lightgray] de dany bullet.lightning = [stat]{0}[lightgray]× llampec ~ [stat]{1}[lightgray] de dany
bullet.buildingdamage = [stat]{0}%[lightgray] de dany a les estructures bullet.buildingdamage = [stat]{0}%[lightgray] de dany a les estructures
@@ -1098,8 +1099,8 @@ setting.bridgeopacity.name = Opacitat de cintes i canonades subterrànies
setting.playerchat.name = Mostra el xat bombolla de jugadors setting.playerchat.name = Mostra el xat bombolla de jugadors
setting.showweather.name = Mostra lestat meteorològic setting.showweather.name = Mostra lestat meteorològic
setting.hidedisplays.name = Amaga els monitors lògics setting.hidedisplays.name = Amaga els monitors lògics
steam.friendsonly = Friends Only steam.friendsonly = Només amics
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join. steam.friendsonly.tooltip = Indica si només els amics de Steam podran unir-se a la vostra partida.\nSi no es selecciona aquesta opció, la vostra partida serà pública i shi podrà unir qualsevol jugador.
public.beta = Tingueu en compte que les versions beta no disposen de sales despera. public.beta = Tingueu en compte que les versions beta no disposen de sales despera.
uiscale.reset = Lescala de la interfície ha canviat.\nPremeu «Dacord» per a confirmar-ho.\n[scarlet]Es revertiran els canvis en [accent]{0}[] segons. uiscale.reset = Lescala de la interfície ha canviat.\nPremeu «Dacord» per a confirmar-ho.\n[scarlet]Es revertiran els canvis en [accent]{0}[] segons.
uiscale.cancel = Cancel·la i surt uiscale.cancel = Cancel·la i surt
@@ -2213,7 +2214,7 @@ lst.flushmessage = Mostra un missatge a la pantalla a partir dels continguts de
lst.cutscene = Manipula la càmera del jugador. lst.cutscene = Manipula la càmera del jugador.
lst.setflag = Estableix un senyal global que es podrà llegir en tots els processadors. lst.setflag = Estableix un senyal global que es podrà llegir en tots els processadors.
lst.getflag = Obtén un senyal global. lst.getflag = Obtén un senyal global.
lst.setprop = Sets a property of a unit or building. lst.setprop = Estableix una propietat duna unitat o estructura.
logic.nounitbuild = [red]Aquí no es permet construir blocs de tipus lògic. logic.nounitbuild = [red]Aquí no es permet construir blocs de tipus lògic.

View File

@@ -888,6 +888,7 @@ stat.repairspeed = Rychlost Opravy
stat.weapons = Zbraně stat.weapons = Zbraně
stat.bullet = Střela stat.bullet = Střela
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Zvýšení rychlosti stat.speedincrease = Zvýšení rychlosti
stat.range = Dosah stat.range = Dosah
stat.drilltier = Lze těžit stat.drilltier = Lze těžit

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Hastigheds-forøgelse stat.speedincrease = Hastigheds-forøgelse
stat.range = Rækkevidde stat.range = Rækkevidde
stat.drilltier = Kan bores stat.drilltier = Kan bores

View File

@@ -899,6 +899,7 @@ stat.repairspeed = Heilungsgeschwindigkeit
stat.weapons = Waffen stat.weapons = Waffen
stat.bullet = Geschoss stat.bullet = Geschoss
stat.moduletier = Modulstufe stat.moduletier = Modulstufe
stat.unittype = Unit Type
stat.speedincrease = Geschwindigkeitserhöhung stat.speedincrease = Geschwindigkeitserhöhung
stat.range = Reichweite stat.range = Reichweite
stat.drilltier = Abbaubare Erze stat.drilltier = Abbaubare Erze
@@ -1954,7 +1955,7 @@ block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das au
block.router.description = Verteilt Materialien auf bis zu drei Richtungen. block.router.description = Verteilt Materialien auf bis zu drei Richtungen.
block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann. block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen. block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen.
block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der vordere Ausgang blockiert ist.
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind.
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger. block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt. block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
@@ -2100,7 +2101,7 @@ block.blast-door.description = Eine Mauer, die verbündete Bodeneinheiten durchl
block.duct.description = Bewegt Materialien vorwärts. Kann nur ein einziges Item lagern. block.duct.description = Bewegt Materialien vorwärts. Kann nur ein einziges Item lagern.
block.armored-duct.description = Bewegt Materialien vorwärts. Materialen können von der Seite nur aus Rohrleitugnen herein. block.armored-duct.description = Bewegt Materialien vorwärts. Materialen können von der Seite nur aus Rohrleitugnen herein.
block.duct-router.description = Verteilt Materialien gleichmäßig auf bis zu drei Richtungen. Nimmt Materialien nur aus einer Richtung an. Kann als Sortierer verwendet werden. block.duct-router.description = Verteilt Materialien gleichmäßig auf bis zu drei Richtungen. Nimmt Materialien nur aus einer Richtung an. Kann als Sortierer verwendet werden.
block.overflow-duct.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. block.overflow-duct.description = Gibt Materialien nur zu den Seiten heraus, wenn der vordere Ausgang blockiert ist.
block.duct-bridge.description = Transportierrt Materialen über Blöcke und Terrain. block.duct-bridge.description = Transportierrt Materialen über Blöcke und Terrain.
block.duct-unloader.description = Entlädt Materialen aus dem Block dahinter. Kann nicht aus Kernen entladen. block.duct-unloader.description = Entlädt Materialen aus dem Block dahinter. Kann nicht aus Kernen entladen.
block.underflow-duct.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. block.underflow-duct.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind.

View File

@@ -896,6 +896,7 @@ stat.repairspeed = Velocidad de reparación
stat.weapons = Armas stat.weapons = Armas
stat.bullet = Proyectil stat.bullet = Proyectil
stat.moduletier = Categoría de módulo stat.moduletier = Categoría de módulo
stat.unittype = Unit Type
stat.speedincrease = Aumento de velocidad stat.speedincrease = Aumento de velocidad
stat.range = Alcance stat.range = Alcance
stat.drilltier = Taladrables stat.drilltier = Taladrables

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Kiiruse suurenemine stat.speedincrease = Kiiruse suurenemine
stat.range = Ulatus stat.range = Ulatus
stat.drilltier = Kaevandatav stat.drilltier = Kaevandatav

View File

@@ -878,6 +878,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Abiadura areagotzea stat.speedincrease = Abiadura areagotzea
stat.range = Irismena stat.range = Irismena
stat.drilltier = Ustiagarriak stat.drilltier = Ustiagarriak

View File

@@ -875,6 +875,7 @@ stat.repairspeed = Korjausnopeus
stat.weapons = Aseet stat.weapons = Aseet
stat.bullet = Ammus stat.bullet = Ammus
stat.moduletier = Moduulin taso stat.moduletier = Moduulin taso
stat.unittype = Unit Type
stat.speedincrease = Nopeuden kasvu stat.speedincrease = Nopeuden kasvu
stat.range = Etäisyys stat.range = Etäisyys
stat.drilltier = Porattavat stat.drilltier = Porattavat

View File

@@ -875,6 +875,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Speed Increase stat.speedincrease = Speed Increase
stat.range = Range stat.range = Range
stat.drilltier = Drillables stat.drilltier = Drillables

View File

@@ -900,6 +900,7 @@ stat.repairspeed = Vitesse de réparation
stat.weapons = Armes stat.weapons = Armes
stat.bullet = Balles stat.bullet = Balles
stat.moduletier = Tier stat.moduletier = Tier
stat.unittype = Unit Type
stat.speedincrease = Accélération stat.speedincrease = Accélération
stat.range = Portée stat.range = Portée
stat.drilltier = Blocs forables stat.drilltier = Blocs forables

View File

@@ -885,6 +885,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Fegyverek stat.weapons = Fegyverek
stat.bullet = Töltény stat.bullet = Töltény
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Gyorsítás stat.speedincrease = Gyorsítás
stat.range = Hatótáv stat.range = Hatótáv
stat.drilltier = Kitermelhető stat.drilltier = Kitermelhető

View File

@@ -896,6 +896,7 @@ stat.repairspeed = Kecepatan Memperbaiki
stat.weapons = Senjata stat.weapons = Senjata
stat.bullet = Peluru stat.bullet = Peluru
stat.moduletier = Tingkatan Modul stat.moduletier = Tingkatan Modul
stat.unittype = Unit Type
stat.speedincrease = Tambahan Kecepatan stat.speedincrease = Tambahan Kecepatan
stat.range = Jarak stat.range = Jarak
stat.drilltier = Sumber Daya yang Ditambang stat.drilltier = Sumber Daya yang Ditambang

View File

@@ -882,6 +882,7 @@ stat.repairspeed = Velocità di riparazione
stat.weapons = Armi stat.weapons = Armi
stat.bullet = Proiettile stat.bullet = Proiettile
stat.moduletier = Grado del modulo stat.moduletier = Grado del modulo
stat.unittype = Unit Type
stat.speedincrease = Potenziamento Velocità stat.speedincrease = Potenziamento Velocità
stat.range = Raggio stat.range = Raggio
stat.drilltier = Scavabili stat.drilltier = Scavabili

View File

@@ -888,6 +888,7 @@ stat.repairspeed = 修復速度
stat.weapons = 武器 stat.weapons = 武器
stat.bullet = 弾丸 stat.bullet = 弾丸
stat.moduletier = モジュールレベル stat.moduletier = モジュールレベル
stat.unittype = Unit Type
stat.speedincrease = 速度向上 stat.speedincrease = 速度向上
stat.range = 範囲 stat.range = 範囲
stat.drilltier = ドリル stat.drilltier = ドリル

View File

@@ -149,15 +149,15 @@ mod.incompatiblemod = [red]호환되지 않음
mod.blacklisted = [red]지원하지 않음 mod.blacklisted = [red]지원하지 않음
mod.unmetdependencies = [red]충촉되지 않은 종속성 mod.unmetdependencies = [red]충촉되지 않은 종속성
mod.erroredcontent = [scarlet]콘텐츠 오류 mod.erroredcontent = [scarlet]콘텐츠 오류
mod.circulardependencies = [red]Circular Dependencies mod.circulardependencies = [red]순환 의존성
mod.incompletedependencies = [red]Incomplete Dependencies mod.incompletedependencies = [red]불완전한 의존성
mod.requiresversion.details = 게임 버전 요구: [accent]{0}[]\n당신의 게임은 구버전입니다. 이 모드가 작동하려면 최신 버전의 게임이 필요합니다. (베타/알파 릴리즈일 가능성이 있음). mod.requiresversion.details = 게임 버전 요구: [accent]{0}[]\n당신의 게임은 구버전입니다. 이 모드가 작동하려면 최신 버전의 게임이 필요합니다. (베타/알파 릴리즈일 가능성이 있음).
mod.outdatedv7.details = 이 모드는 최신 버전의 게임과 호환되지 않습니다. 반드시 작성자가 업데이트해야 하고, [accent]mod.json[] 파일에 [accent]최소게임버전: 136[]을 추가해야 합니다. mod.outdatedv7.details = 이 모드는 최신 버전의 게임과 호환되지 않습니다. 반드시 작성자가 업데이트해야 하고, [accent]mod.json[] 파일에 [accent]최소게임버전: 136[]을 추가해야 합니다.
mod.blacklisted.details = 이 모드는 이 버전의 게임에서 충돌 또는 기타 문제를 일으키는 것으로 인해 수동으로 블랙리스트에 올라와 있습니다. 사용하지 마세요. mod.blacklisted.details = 이 모드는 이 버전의 게임에서 충돌 또는 기타 문제를 일으키는 것으로 인해 수동으로 블랙리스트에 올라와 있습니다. 사용하지 마세요.
mod.missingdependencies.details = 이 모드에는 종속성이 없음: {0} mod.missingdependencies.details = 이 모드에는 종속성이 없음: {0}
mod.erroredcontent.details = 이 게임은 로딩하는 동안 오류가 발생했습니다. 모드 작성자에게 수정하도록 요청하세요. mod.erroredcontent.details = 이 게임은 로딩하는 동안 오류가 발생했습니다. 모드 작성자에게 수정하도록 요청하세요.
mod.circulardependencies.details = This mod has dependencies that depends on each other. mod.circulardependencies.details = 이 모드는 서로 의존하는 의존성을 지니고 있습니다.
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}. mod.incompletedependencies.details = 잘못되었거나 누락한 종속성으로 인해 이 모드를 불러올 수 없습니다: {0}.
mod.requiresversion = 필요한 게임 버전: [red]{0} mod.requiresversion = 필요한 게임 버전: [red]{0}
mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함 mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함
mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] 영향을 받는 모드를 비활성화하거나 플레이하기 전에 오류를 수정하세요. mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] 영향을 받는 모드를 비활성화하거나 플레이하기 전에 오류를 수정하세요.
@@ -335,7 +335,7 @@ command.repair = 수리
command.rebuild = 재건 command.rebuild = 재건
command.assist = 플레이어 지원 command.assist = 플레이어 지원
command.move = 이동 command.move = 이동
command.boost = Boost command.boost = 비행
openlink = 링크 열기 openlink = 링크 열기
copylink = 링크 복사 copylink = 링크 복사
back = 뒤로가기 back = 뒤로가기
@@ -411,9 +411,9 @@ editor.mapinfo = 맵 정보
editor.author = 제작자: editor.author = 제작자:
editor.description = 설명: editor.description = 설명:
editor.nodescription = 맵을 공유하려면 최소 4자 이상의 설명이 있어야 합니다. editor.nodescription = 맵을 공유하려면 최소 4자 이상의 설명이 있어야 합니다.
editor.waves = 단계: editor.waves = 단계
editor.rules = 규칙: editor.rules = 규칙
editor.generation = 지형 생성: editor.generation = 지형 생성
editor.objectives = 목표 editor.objectives = 목표
editor.ingame = 인게임 편집 editor.ingame = 인게임 편집
editor.playtest = 맵 테스트 editor.playtest = 맵 테스트
@@ -795,7 +795,7 @@ sector.atlas.description = 이 지역은 각기 다른 지형을 포함하고
sector.split.description = 이 지역에 최소한으로 존재하는 적 주둔군은 새로운 운송 기술을 시험하기에 완벽합니다. sector.split.description = 이 지역에 최소한으로 존재하는 적 주둔군은 새로운 운송 기술을 시험하기에 완벽합니다.
sector.basin.description = {임시}\n\n현재의 마지막 지역. 이 지역은 도전 레벨입니다 - 이후 릴리즈에서 많은 지역이 더 추가될 예정입니다. sector.basin.description = {임시}\n\n현재의 마지막 지역. 이 지역은 도전 레벨입니다 - 이후 릴리즈에서 많은 지역이 더 추가될 예정입니다.
sector.marsh.description = 이 지역은 아르키사이트가 풍부하지만 분출구의 수는 한정적입니다.\n[accent]화학적 연소실[]을 건설하여 전력을 생산하시오. sector.marsh.description = 이 지역은 아르키사이트가 풍부하지만 분출구의 수는 한정적입니다.\n[accent]화학적 연소실[]을 건설하여 전력을 생산하시오.
sector.peaks.description = 이 지역의 산악 지형은 대부분의 기체를 무용지물로 만들었습니다. 비행 기체가 필요합니다.\n적의 방공망에 유의하십시오. 일부 시설은 지원 건물을 공격하여 무력화시킬 수 있습니다. sector.peaks.description = 이 지역의 산악 지형은 대부분의 기체를 무용지물로 만들었습니다. 비행 가능한 기체가 필요합니다.\n적의 방공망에 유의하십시오. 일부 시설은 지원 건물을 공격하여 무력화시킬 수 있습니다.
sector.ravine.description = 적의 중요한 이동 경로이긴 하지만, 해당 구역에선 적의 코어가 감지되지 않았습니다. 다양한 적군을 맞닥뜨릴 것으로 예상됩니다.\n[accent]설금[]을 생산하십시오. 포탑 [accent]어플릭트[]를 건설하십시오. sector.ravine.description = 적의 중요한 이동 경로이긴 하지만, 해당 구역에선 적의 코어가 감지되지 않았습니다. 다양한 적군을 맞닥뜨릴 것으로 예상됩니다.\n[accent]설금[]을 생산하십시오. 포탑 [accent]어플릭트[]를 건설하십시오.
sector.caldera-erekir.description = 이 지역에서 탐지된 자원은 여러 섬에 분산되어 있습니다 .\n드론을 기반으로 한 운송수단을 연구하고 활용하시오. sector.caldera-erekir.description = 이 지역에서 탐지된 자원은 여러 섬에 분산되어 있습니다 .\n드론을 기반으로 한 운송수단을 연구하고 활용하시오.
sector.stronghold.description = 이 지역의 대규모 적 야영지에는 적들이 지키고 있는 상당한 양의 [accent]토륨[] 매장지가 있습니다.\n더 높은 등급의 기체와 포탑을 연구할 때 사용합니다. sector.stronghold.description = 이 지역의 대규모 적 야영지에는 적들이 지키고 있는 상당한 양의 [accent]토륨[] 매장지가 있습니다.\n더 높은 등급의 기체와 포탑을 연구할 때 사용합니다.
@@ -888,6 +888,7 @@ stat.repairspeed = 수리 속도
stat.weapons = 무기 stat.weapons = 무기
stat.bullet = 탄환 stat.bullet = 탄환
stat.moduletier = 모듈 등급 stat.moduletier = 모듈 등급
stat.unittype = Unit Type
stat.speedincrease = 속도 증가 stat.speedincrease = 속도 증가
stat.range = 사거리 stat.range = 사거리
stat.drilltier = 채굴 가능 stat.drilltier = 채굴 가능
@@ -981,8 +982,8 @@ bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat]{1}[lightgra
bullet.incendiary = [stat]방화[] bullet.incendiary = [stat]방화[]
bullet.homing = [stat]유도[] bullet.homing = [stat]유도[]
bullet.armorpierce = [stat]방어 관통 bullet.armorpierce = [stat]방어 관통
bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles bullet.suppression = [stat]{0} sec[lightgray] 수리 억제 ~ [stat]{1}[lightgray] 타일
bullet.interval = [stat]{0}/sec[lightgray] interval bullets: bullet.interval = [stat]{0}/sec[lightgray] 간격 탄환:
bullet.frags = [stat]{0}[lightgray]개 파편 탄환:[][] bullet.frags = [stat]{0}[lightgray]개 파편 탄환:[][]
bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량[][][][] bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량[][][][]
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량[][] bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량[][]
@@ -1096,8 +1097,8 @@ setting.bridgeopacity.name = 터널 투명도
setting.playerchat.name = 채팅 말풍선 표시 setting.playerchat.name = 채팅 말풍선 표시
setting.showweather.name = 날씨 그래픽 표시 setting.showweather.name = 날씨 그래픽 표시
setting.hidedisplays.name = 로직 디스플레이 숨김 setting.hidedisplays.name = 로직 디스플레이 숨김
steam.friendsonly = Friends Only steam.friendsonly = 친구 전용
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join. steam.friendsonly.tooltip = 게임에 스팀 친구만 접속할 수 있는가에 대한 여부입니다.체크를 해제하면, 누구나 접속할 수 있습니다.
public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다.
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다...
uiscale.cancel = 취소 후 나가기 uiscale.cancel = 취소 후 나가기
@@ -1226,7 +1227,7 @@ rules.deconstructrefundmultiplier = 철거 환불 배수
rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기 rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기
rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일) rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일)
rules.unitammo = 기체 탄약 필요 rules.unitammo = 기체 탄약 필요
rules.enemyteam = 상대 rules.enemyteam =
rules.playerteam = 플레이어 팀 rules.playerteam = 플레이어 팀
rules.title.waves = 단계 rules.title.waves = 단계
rules.title.resourcesbuilding = 자원 & 건물 rules.title.resourcesbuilding = 자원 & 건물
@@ -1239,9 +1240,9 @@ rules.title.planet = 행성
rules.lighting = 조명 표시 rules.lighting = 조명 표시
rules.fog = 전장의 안개 rules.fog = 전장의 안개
rules.fire = 방화 허용 rules.fire = 방화 허용
rules.anyenv = <상관없음> rules.anyenv = <모두>
rules.explosions = 블록/기체 폭발 피해 rules.explosions = 블록/기체 폭발 피해
rules.ambientlight = 자연 조명 표시 rules.ambientlight = 주변광
rules.weather = 날씨 추가 rules.weather = 날씨 추가
rules.weather.frequency = 빈도: rules.weather.frequency = 빈도:
rules.weather.always = 항상 rules.weather.always = 항상
@@ -1782,8 +1783,8 @@ hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치[]하여 업
hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다. hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다.
hint.presetDifficulty = 이 지역은 [scarlet]위험도가 높은[] 지역입니다.\n적절한 기술과 준비 없이 이런 지역들로 출격하는건 [accent]추천하지 않습니다[]. hint.presetDifficulty = 이 지역은 [scarlet]위험도가 높은[] 지역입니다.\n적절한 기술과 준비 없이 이런 지역들로 출격하는건 [accent]추천하지 않습니다[].
hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다. hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다.
hint.factoryControl = 기체 공장의 [accent]출력 위치[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 마우스 오른쪽 버튼으로 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다. hint.factoryControl = 기체 공장의 [accent]출력 목적지[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 마우스 오른쪽 버튼으로 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다.
hint.factoryControl.mobile = 기체 공장의 [accent]출력 위치[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 눌러서 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다. hint.factoryControl.mobile = 기체 공장의 [accent]출력 목적지[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 눌러서 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다.
gz.mine = 주변 바닥에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요. gz.mine = 주변 바닥에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요.
gz.mine.mobile = 주변 바닥에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요. gz.mine.mobile = 주변 바닥에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요.
gz.research = \ue875 연구 기록을 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 오른쪽 아래에 있는 메뉴에서 선택하세요.\n구리조각 위를 눌러서 배치합니다. gz.research = \ue875 연구 기록을 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 오른쪽 아래에 있는 메뉴에서 선택하세요.\n구리조각 위를 눌러서 배치합니다.
@@ -2119,10 +2120,10 @@ unit.mace.description = 주변의 모든 적을 향해 화염 줄기를 발사
unit.fortress.description = 지상 목표물을 향해 장거리 포탄을 발사합니다. unit.fortress.description = 지상 목표물을 향해 장거리 포탄을 발사합니다.
unit.scepter.description = 주변의 모든 적을 향해 장전된 탄환을 일제히 발사합니다. unit.scepter.description = 주변의 모든 적을 향해 장전된 탄환을 일제히 발사합니다.
unit.reign.description = 주변의 모든 적을 향해 거대한 관통 탄환을 일제히 발사합니다. unit.reign.description = 주변의 모든 적을 향해 거대한 관통 탄환을 일제히 발사합니다.
unit.nova.description = 적에게 피해를 주고, 아군 구조물을 수리하는 레이저 볼트를 발사합니다. 비행할 수 있습니다. unit.nova.description = 적에게 피해를 주고, 아군 구조물을 수리하는 레이저 볼트를 발사합니다. 이륙할 수 있습니다.
unit.pulsar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 전격을 발사합니다. 비행할 수 있습니다. unit.pulsar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 전격을 발사합니다. 이륙할 수 있습니다.
unit.quasar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 관통 레이저 빔을 발사합니다. 비행할 수 있습니다. 역장을 가지고 있습니다. unit.quasar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 관통 레이저 빔을 발사합니다. 이륙할 수 있습니다. 역장을 가지고 있습니다.
unit.vela.description = 적에게 피해를 주고, 아군 구조물을 수리하는 거대한 지속적인 레이저 빔을 발사합니다. 비행할 수 있습니다. unit.vela.description = 적에게 피해를 주고, 아군 구조물을 수리하는 거대한 지속적인 레이저 빔을 발사합니다. 이륙할 수 있습니다.
unit.corvus.description = 적에게 피해를 주고, 아군 구조물을 수리하는 거대한 레이저 블레스트를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다. unit.corvus.description = 적에게 피해를 주고, 아군 구조물을 수리하는 거대한 레이저 블레스트를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다.
unit.crawler.description = 적을 향해 달려가 자폭하며, 큰 폭발을 일으킵니다. unit.crawler.description = 적을 향해 달려가 자폭하며, 큰 폭발을 일으킵니다.
unit.atrax.description = 지상 목표물을 향해 광재 구체를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다. unit.atrax.description = 지상 목표물을 향해 광재 구체를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다.
@@ -2206,7 +2207,7 @@ lst.flushmessage = 텍스트 버퍼로부터 화면에 메세지를 표시\n이
lst.cutscene = 플레이어 카메라 조작 lst.cutscene = 플레이어 카메라 조작
lst.setflag = 모든 프로세서가 읽을 수 있는 전역 플래그 설정 lst.setflag = 모든 프로세서가 읽을 수 있는 전역 플래그 설정
lst.getflag = 전역 플래그가 설정되어 있는지 확인 lst.getflag = 전역 플래그가 설정되어 있는지 확인
lst.setprop = Sets a property of a unit or building. lst.setprop = 기체 혹은 건물의 속성을 설정합니다.
logic.nounitbuild = [red]기체의 건설 로직은 여기서 허용되지 않습니다. logic.nounitbuild = [red]기체의 건설 로직은 여기서 허용되지 않습니다.

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Greičio Padidėjimas stat.speedincrease = Greičio Padidėjimas
stat.range = Atstumas stat.range = Atstumas
stat.drilltier = Gręžiama stat.drilltier = Gręžiama

View File

@@ -888,6 +888,7 @@ stat.repairspeed = Repareersnelheid
stat.weapons = Wapens stat.weapons = Wapens
stat.bullet = Kogel stat.bullet = Kogel
stat.moduletier = Module Niveau stat.moduletier = Module Niveau
stat.unittype = Unit Type
stat.speedincrease = Snelheidsverhoging stat.speedincrease = Snelheidsverhoging
stat.range = Bereik stat.range = Bereik
stat.drilltier = Valt te delven stat.drilltier = Valt te delven

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Speed Increase stat.speedincrease = Speed Increase
stat.range = Range stat.range = Range
stat.drilltier = Drillables stat.drilltier = Drillables

View File

@@ -886,6 +886,7 @@ stat.repairspeed = Prędkość napraw
stat.weapons = Bronie stat.weapons = Bronie
stat.bullet = Pocisk stat.bullet = Pocisk
stat.moduletier = Stopień Modułu stat.moduletier = Stopień Modułu
stat.unittype = Unit Type
stat.speedincrease = Zwiększenie prędkości stat.speedincrease = Zwiększenie prędkości
stat.range = Zasięg stat.range = Zasięg
stat.drilltier = Co może wykopać stat.drilltier = Co może wykopać

View File

@@ -896,6 +896,7 @@ stat.repairspeed = Taxa de Reparo
stat.weapons = Armas stat.weapons = Armas
stat.bullet = Projétil stat.bullet = Projétil
stat.moduletier = Tier do Módulo stat.moduletier = Tier do Módulo
stat.unittype = Unit Type
stat.speedincrease = Aumento de velocidade stat.speedincrease = Aumento de velocidade
stat.range = Distância stat.range = Distância
stat.drilltier = Brocas stat.drilltier = Brocas

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Aumento de velocidade stat.speedincrease = Aumento de velocidade
stat.range = Distância stat.range = Distância
stat.drilltier = Furáveis stat.drilltier = Furáveis

View File

@@ -888,6 +888,7 @@ stat.repairspeed = Viteză Reparare
stat.weapons = Arme stat.weapons = Arme
stat.bullet = Glonț stat.bullet = Glonț
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Creștere Viteză stat.speedincrease = Creștere Viteză
stat.range = Rază stat.range = Rază
stat.drilltier = Minabile stat.drilltier = Minabile

View File

@@ -889,6 +889,7 @@ stat.repairspeed = Скорость ремонта
stat.weapons = Орудия stat.weapons = Орудия
stat.bullet = Снаряд stat.bullet = Снаряд
stat.moduletier = Уровень модуля stat.moduletier = Уровень модуля
stat.unittype = Unit Type
stat.speedincrease = Увеличение скорости stat.speedincrease = Увеличение скорости
stat.range = Радиус действия stat.range = Радиус действия
stat.drilltier = Бурит stat.drilltier = Бурит

View File

@@ -890,6 +890,7 @@ stat.repairspeed = Brzina popravke
stat.weapons = Oružja stat.weapons = Oružja
stat.bullet = Metak stat.bullet = Metak
stat.moduletier = Nivo modula stat.moduletier = Nivo modula
stat.unittype = Unit Type
stat.speedincrease = Povećanje brzine stat.speedincrease = Povećanje brzine
stat.range = Domet stat.range = Domet
stat.drilltier = Materijali koje je moguće kopati stat.drilltier = Materijali koje je moguće kopati

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Speed Increase stat.speedincrease = Speed Increase
stat.range = Range stat.range = Range
stat.drilltier = Drillables stat.drilltier = Drillables

View File

@@ -889,6 +889,7 @@ stat.repairspeed = ความเร็วการซ่อม
stat.weapons = อาวุธ stat.weapons = อาวุธ
stat.bullet = กระสุน stat.bullet = กระสุน
stat.moduletier = ระดับหน่วยประกอบ stat.moduletier = ระดับหน่วยประกอบ
stat.unittype = Unit Type
stat.speedincrease = เพิ่มความเร็ว stat.speedincrease = เพิ่มความเร็ว
stat.range = ระยะ stat.range = ระยะ
stat.drilltier = แร่ที่ขุดได้ stat.drilltier = แร่ที่ขุดได้

View File

@@ -876,6 +876,7 @@ stat.repairspeed = Repair Speed
stat.weapons = Weapons stat.weapons = Weapons
stat.bullet = Bullet stat.bullet = Bullet
stat.moduletier = Module Tier stat.moduletier = Module Tier
stat.unittype = Unit Type
stat.speedincrease = Speed Increase stat.speedincrease = Speed Increase
stat.range = Range stat.range = Range
stat.drilltier = Kazilabilirler stat.drilltier = Kazilabilirler

View File

@@ -887,6 +887,7 @@ stat.repairspeed = Tamir Hızı
stat.weapons = Silahlar stat.weapons = Silahlar
stat.bullet = Mermi stat.bullet = Mermi
stat.moduletier = Modül Seviyesi stat.moduletier = Modül Seviyesi
stat.unittype = Unit Type
stat.speedincrease = Hız Artışı stat.speedincrease = Hız Artışı
stat.range = Menzil stat.range = Menzil
stat.drilltier = Kazılabilenler stat.drilltier = Kazılabilenler

View File

@@ -897,6 +897,7 @@ stat.repairspeed = Швидкість відновлення
stat.weapons = Зброя stat.weapons = Зброя
stat.bullet = Кулі stat.bullet = Кулі
stat.moduletier = Рівень модуля stat.moduletier = Рівень модуля
stat.unittype = Unit Type
stat.speedincrease = Збільшення швидкості stat.speedincrease = Збільшення швидкості
stat.range = Радіус дії stat.range = Радіус дії
stat.drilltier = Видобуває stat.drilltier = Видобуває

View File

@@ -891,6 +891,7 @@ stat.repairspeed = Tốc độ sửa
stat.weapons = Vũ khí stat.weapons = Vũ khí
stat.bullet = Đạn stat.bullet = Đạn
stat.moduletier = Cấp Module stat.moduletier = Cấp Module
stat.unittype = Unit Type
stat.speedincrease = Tăng tốc stat.speedincrease = Tăng tốc
stat.range = Phạm vi stat.range = Phạm vi
stat.drilltier = Khoan được stat.drilltier = Khoan được

View File

@@ -899,6 +899,7 @@ stat.repairspeed = 修理速度
stat.weapons = 武器 stat.weapons = 武器
stat.bullet = 子弹 stat.bullet = 子弹
stat.moduletier = 模块等级 stat.moduletier = 模块等级
stat.unittype = Unit Type
stat.speedincrease = 提速 stat.speedincrease = 提速
stat.range = 范围 stat.range = 范围
stat.drilltier = 可钻探矿物 stat.drilltier = 可钻探矿物

View File

@@ -895,6 +895,7 @@ stat.repairspeed = 修復速度
stat.weapons = 武器 stat.weapons = 武器
stat.bullet = 子彈 stat.bullet = 子彈
stat.moduletier = 模組等級 stat.moduletier = 模組等級
stat.unittype = Unit Type
stat.speedincrease = 速度提升 stat.speedincrease = 速度提升
stat.range = 範圍 stat.range = 範圍
stat.drilltier = 可鑽取礦物 stat.drilltier = 可鑽取礦物

View File

@@ -44,6 +44,7 @@ function extend(/*Base, ..., def*/){
importPackage(Packages.arc) importPackage(Packages.arc)
importPackage(Packages.arc.audio) importPackage(Packages.arc.audio)
importPackage(Packages.arc.files)
importPackage(Packages.arc.func) importPackage(Packages.arc.func)
importPackage(Packages.arc.flabel) importPackage(Packages.arc.flabel)
importPackage(Packages.arc.graphics) importPackage(Packages.arc.graphics)

View File

@@ -431,7 +431,12 @@ public class Vars implements Loadable{
settings.setAutosave(false); settings.setAutosave(false);
settings.load(); settings.load();
Scl.setProduct(settings.getInt("uiscale", 100) / 100f); //https://github.com/Anuken/Mindustry/issues/8483
if(settings.getInt("uiscale") == 5){
settings.put("uiscale", 100);
}
Scl.setProduct(Math.max(settings.getInt("uiscale", 100), 25) / 100f);
if(!loadLocales) return; if(!loadLocales) return;

View File

@@ -8,8 +8,8 @@ import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.game.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;

View File

@@ -19,7 +19,7 @@ public class BuilderAI extends AIController{
public @Nullable Teamc enemy; public @Nullable Teamc enemy;
public @Nullable BlockPlan lastPlan; public @Nullable BlockPlan lastPlan;
public float fleeRange = 370f; public float fleeRange = 370f, rebuildPeriod = 60f * 2f;
public boolean alwaysFlee; public boolean alwaysFlee;
public boolean onlyAssist; public boolean onlyAssist;
@@ -158,10 +158,8 @@ public class BuilderAI extends AIController{
} }
} }
float rebuildTime = 2f * 60f;
//find new plan //find new plan
if(!onlyAssist && !unit.team.data().plans.isEmpty() && following == null && timer.get(timerTarget3, rebuildTime)){ if(!onlyAssist && !unit.team.data().plans.isEmpty() && following == null && timer.get(timerTarget3, rebuildPeriod)){
Queue<BlockPlan> blocks = unit.team.data().plans; Queue<BlockPlan> blocks = unit.team.data().plans;
BlockPlan block = blocks.first(); BlockPlan block = blocks.first();

View File

@@ -1494,9 +1494,10 @@ public class Blocks{
craftEffect = new RadialEffect(Fx.heatReactorSmoke, 4, 90f, 7f); craftEffect = new RadialEffect(Fx.heatReactorSmoke, 4, 90f, 7f);
itemCapacity = 20; itemCapacity = 20;
outputItem = new ItemStack(Items.fissileMatter, 1);
consumeItem(Items.thorium, 3); consumeItem(Items.thorium, 3);
consumeLiquid(Liquids.nitrogen, 1f / 60f); consumeLiquid(Liquids.nitrogen, 1f / 60f);
outputItem = new ItemStack(Items.fissileMatter, 1);
}}; }};
//endregion //endregion
@@ -3046,6 +3047,20 @@ public class Blocks{
shoot = new ShootAlternate(3.5f); shoot = new ShootAlternate(3.5f);
recoils = 2;
drawer = new DrawTurret(){{
for(int i = 0; i < 2; i ++){
int f = i;
parts.add(new RegionPart("-barrel-" + (i == 0 ? "l" : "r")){{
progress = PartProgress.recoil;
recoilIndex = f;
under = true;
moves.add(new PartMove(PartProgress.recoil, 0f, -1.5f, 0f));
}});
}
}};
recoil = 0.5f;
shootY = 3f; shootY = 3f;
reload = 20f; reload = 20f;
range = 110; range = 110;

View File

@@ -2,8 +2,6 @@ package mindustry.content;
import arc.graphics.*; import arc.graphics.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.entities.effect.*;
import mindustry.graphics.*;
/** /**
* Class for holding special internal bullets. * Class for holding special internal bullets.

View File

@@ -4,8 +4,8 @@ import arc.struct.*;
import mindustry.game.Objectives.*; import mindustry.game.Objectives.*;
import static mindustry.content.Blocks.*; import static mindustry.content.Blocks.*;
import static mindustry.content.SectorPresets.*;
import static mindustry.content.SectorPresets.craters; import static mindustry.content.SectorPresets.craters;
import static mindustry.content.SectorPresets.*;
import static mindustry.content.TechTree.*; import static mindustry.content.TechTree.*;
import static mindustry.content.UnitTypes.*; import static mindustry.content.UnitTypes.*;

View File

@@ -2948,6 +2948,7 @@ public class UnitTypes{
weapons.add(new Weapon("merui-weapon"){{ weapons.add(new Weapon("merui-weapon"){{
shootSound = Sounds.missile; shootSound = Sounds.missile;
mirror = false; mirror = false;
showStatSprite = false;
x = 0f; x = 0f;
y = 1f; y = 1f;
shootY = 4f; shootY = 4f;
@@ -3151,6 +3152,7 @@ public class UnitTypes{
x = 29f / 4f; x = 29f / 4f;
y = -11f / 4f; y = -11f / 4f;
shootY = 1.5f; shootY = 1.5f;
showStatSprite = false;
reload = 130f; reload = 130f;
layerOffset = 0.01f; layerOffset = 0.01f;
heatColor = Color.red; heatColor = Color.red;

View File

@@ -201,10 +201,12 @@ public class NetClient implements ApplicationListener{
Sounds.chatMessage.play(); Sounds.chatMessage.play();
} }
//display raw unformatted text above player head
if(playersender != null && unformatted != null){ if(playersender != null && unformatted != null){
//display raw unformatted text above player head
playersender.lastText(unformatted); playersender.lastText(unformatted);
playersender.textFadeTime(1f); playersender.textFadeTime(1f);
Events.fire(new PlayerChatEvent(playersender, unformatted));
} }
} }

View File

@@ -594,7 +594,8 @@ public class UI implements ApplicationListener, Loadable{
dialog.show(); dialog.show();
} }
public Dialog newMenuDialog(String title, String message, String[][] options, Intc buttonListener, Runnable closeOnBack){ // TODO REPLACE INTEGER WITH arc.fun.IntCons(int, T) or something like that.
public Dialog newMenuDialog(String title, String message, String[][] options, Cons2<Integer, Dialog> buttonListener){
return new Dialog(title){{ return new Dialog(title){{
setFillParent(true); setFillParent(true);
removeChild(titleTable); removeChild(titleTable);
@@ -619,29 +620,30 @@ public class UI implements ApplicationListener, Loadable{
String optionName = optionsRow[i]; String optionName = optionsRow[i];
int finalOption = option; int finalOption = option;
buttonRow.button(optionName, () -> buttonListener.get(finalOption)) buttonRow.button(optionName, () -> buttonListener.get(finalOption, this))
.size(i == optionsRow.length - 1 ? lastWidth : width, 50).pad(4); .size(i == optionsRow.length - 1 ? lastWidth : width, 50).pad(4);
option++; option++;
} }
} }
}).growX(); }).growX();
closeOnBack(closeOnBack);
}}; }};
} }
/** Shows a menu that fires a callback when an option is selected. If nothing is selected, -1 is returned. */ /** Shows a menu that fires a callback when an option is selected. If nothing is selected, -1 is returned. */
public void showMenu(String title, String message, String[][] options, Intc callback){ public void showMenu(String title, String message, String[][] options, Intc callback){
newMenuDialog(title, message, options, option -> { Dialog dialog = newMenuDialog(title, message, options, (option, myself) -> {
callback.get(option); callback.get(option);
hide(); myself.hide();
}, () -> callback.get(-1)).show(); });
dialog.closeOnBack(() -> callback.get(-1));
dialog.show();
} }
/** Shows a menu that hides when another followUp-menu is shown or when nothing is selected. /** Shows a menu that hides when another followUp-menu is shown or when nothing is selected.
* @see UI#showMenu(String, String, String[][], Intc) */ * @see UI#showMenu(String, String, String[][], Intc) */
public void showFollowUpMenu(int menuId, String title, String message, String[][] options, Intc callback) { public void showFollowUpMenu(int menuId, String title, String message, String[][] options, Intc callback) {
Dialog dialog = newMenuDialog(title, message, options, (option, myself) -> callback.get(option));
Dialog dialog = newMenuDialog(title, message, options, callback, () -> { dialog.closeOnBack(() -> {
followUpMenus.remove(menuId); followUpMenus.remove(menuId);
callback.get(-1); callback.get(-1);
}); });

View File

@@ -9,6 +9,7 @@ import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.world.*; import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public enum EditorTool{ public enum EditorTool{

View File

@@ -1,8 +1,8 @@
package mindustry.entities.bullet; package mindustry.entities.bullet;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import mindustry.gen.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
public class LaserBoltBulletType extends BasicBulletType{ public class LaserBoltBulletType extends BasicBulletType{

View File

@@ -1433,7 +1433,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
l.left(); l.left();
for(Item item : content.items()){ for(Item item : content.items()){
if(flowItems.hasFlowItem(item)){ if(flowItems.hasFlowItem(item)){
l.image(item.uiIcon).padRight(3f); l.image(item.uiIcon).scaling(Scaling.fit).padRight(3f);
l.label(() -> flowItems.getFlowRate(item) < 0 ? "..." : Strings.fixed(flowItems.getFlowRate(item), 1) + ps).color(Color.lightGray); l.label(() -> flowItems.getFlowRate(item) < 0 ? "..." : Strings.fixed(flowItems.getFlowRate(item), 1) + ps).color(Color.lightGray);
l.row(); l.row();
} }
@@ -1463,7 +1463,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
l.left(); l.left();
for(var liquid : content.liquids()){ for(var liquid : content.liquids()){
if(liquids.hasFlowLiquid(liquid)){ if(liquids.hasFlowLiquid(liquid)){
l.image(liquid.uiIcon).padRight(3f); l.image(liquid.uiIcon).scaling(Scaling.fit).size(32f).padRight(3f);
l.label(() -> liquids.getFlowRate(liquid) < 0 ? "..." : Strings.fixed(liquids.getFlowRate(liquid), 1) + ps).color(Color.lightGray); l.label(() -> liquids.getFlowRate(liquid) < 0 ? "..." : Strings.fixed(liquids.getFlowRate(liquid), 1) + ps).color(Color.lightGray);
l.row(); l.row();
} }

View File

@@ -2,7 +2,6 @@ package mindustry.entities.comp;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.async.PhysicsProcess.*; import mindustry.async.PhysicsProcess.*;
import mindustry.gen.*; import mindustry.gen.*;

View File

@@ -127,7 +127,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc, Syncc{
@Replace @Replace
public float clipSize(){ public float clipSize(){
return 20; return 50; //high for light drawing
} }
@Override @Override

View File

@@ -14,6 +14,8 @@ public abstract class DrawPart{
public boolean under = false; public boolean under = false;
/** For units, this is the index of the weapon this part gets its progress for. */ /** For units, this is the index of the weapon this part gets its progress for. */
public int weaponIndex = 0; public int weaponIndex = 0;
/** Which recoil counter to use. < 0 to use base recoil. */
public int recoilIndex = -1;
public abstract void draw(PartParams params); public abstract void draw(PartParams params);
public abstract void load(String name); public abstract void load(String name);
@@ -41,6 +43,11 @@ public abstract class DrawPart{
this.sideMultiplier = 1; this.sideMultiplier = 1;
return this; return this;
} }
public PartParams setRecoil(float recoils){
this.recoil = recoils;
return this;
}
} }
public static class PartMove{ public static class PartMove{

View File

@@ -1,5 +1,7 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.util.*;
public class ShootAlternate extends ShootPattern{ public class ShootAlternate extends ShootPattern{
/** number of barrels used for shooting. */ /** number of barrels used for shooting. */
public int barrels = 2; public int barrels = 2;
@@ -16,10 +18,11 @@ public class ShootAlternate extends ShootPattern{
} }
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
float index = ((totalShots + i + barrelOffset) % barrels) - (barrels-1)/2f; float index = ((totalShots + i + barrelOffset) % barrels) - (barrels-1)/2f;
handler.shoot(index * spread, 0, 0f, firstShotDelay + shotDelay * i); handler.shoot(index * spread, 0, 0f, firstShotDelay + shotDelay * i);
if(barrelIncrementer != null) barrelIncrementer.run();
} }
} }
} }

View File

@@ -1,5 +1,7 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.util.*;
public class ShootBarrel extends ShootPattern{ public class ShootBarrel extends ShootPattern{
/** barrels [in x, y, rotation] format. */ /** barrels [in x, y, rotation] format. */
public float[] barrels = {0f, 0f, 0f}; public float[] barrels = {0f, 0f, 0f};
@@ -16,10 +18,11 @@ public class ShootBarrel extends ShootPattern{
} }
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
int index = ((i + totalShots + barrelOffset) % (barrels.length / 3)) * 3; int index = ((i + totalShots + barrelOffset) % (barrels.length / 3)) * 3;
handler.shoot(barrels[index], barrels[index + 1], barrels[index + 2], firstShotDelay + shotDelay * i); handler.shoot(barrels[index], barrels[index + 1], barrels[index + 2], firstShotDelay + shotDelay * i);
if(barrelIncrementer != null) barrelIncrementer.run();
} }
} }
} }

View File

@@ -1,12 +1,13 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.math.*; import arc.math.*;
import arc.util.*;
public class ShootHelix extends ShootPattern{ public class ShootHelix extends ShootPattern{
public float scl = 2f, mag = 1.5f, offset = Mathf.PI * 1.25f; public float scl = 2f, mag = 1.5f, offset = Mathf.PI * 1.25f;
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
for(int sign : Mathf.signs){ for(int sign : Mathf.signs){
handler.shoot(0, 0, 0, firstShotDelay + shotDelay * i, handler.shoot(0, 0, 0, firstShotDelay + shotDelay * i,

View File

@@ -1,5 +1,7 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.util.*;
public class ShootMulti extends ShootPattern{ public class ShootMulti extends ShootPattern{
public ShootPattern source; public ShootPattern source;
public ShootPattern[] dest = {}; public ShootPattern[] dest = {};
@@ -25,7 +27,7 @@ public class ShootMulti extends ShootPattern{
} }
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
source.shoot(totalShots, (x, y, rotation, delay, move) -> { source.shoot(totalShots, (x, y, rotation, delay, move) -> {
for(var pattern : dest){ for(var pattern : dest){
pattern.shoot(totalShots, (x2, y2, rot2, delay2, mover) -> { pattern.shoot(totalShots, (x2, y2, rot2, delay2, mover) -> {
@@ -35,6 +37,6 @@ public class ShootMulti extends ShootPattern{
}); });
}); });
} }
}); }, barrelIncrementer);
} }
} }

View File

@@ -1,5 +1,6 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.util.*;
import mindustry.entities.*; import mindustry.entities.*;
/** Handles different types of bullet patterns for shooting. */ /** Handles different types of bullet patterns for shooting. */
@@ -12,12 +13,17 @@ public class ShootPattern implements Cloneable{
public float shotDelay = 0; public float shotDelay = 0;
/** Called on a single "trigger pull". This function should call the handler with any bullets that result. */ /** Called on a single "trigger pull". This function should call the handler with any bullets that result. */
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
handler.shoot(0, 0, 0, firstShotDelay + shotDelay * i); handler.shoot(0, 0, 0, firstShotDelay + shotDelay * i);
} }
} }
/** Called on a single "trigger pull". This function should call the handler with any bullets that result. */
public void shoot(int totalShots, BulletHandler handler){
shoot(totalShots, handler, null);
}
/** Subclasses should override this to flip its sides. */ /** Subclasses should override this to flip its sides. */
public void flip(){ public void flip(){

View File

@@ -1,6 +1,7 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.math.*; import arc.math.*;
import arc.util.*;
public class ShootSine extends ShootPattern{ public class ShootSine extends ShootPattern{
/** scaling applied to bullet index */ /** scaling applied to bullet index */
@@ -17,7 +18,7 @@ public class ShootSine extends ShootPattern{
} }
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
float angleOffset = Mathf.sin(i + totalShots, scl, mag); float angleOffset = Mathf.sin(i + totalShots, scl, mag);
handler.shoot(0, 0, angleOffset, firstShotDelay + shotDelay * i); handler.shoot(0, 0, angleOffset, firstShotDelay + shotDelay * i);

View File

@@ -1,5 +1,7 @@
package mindustry.entities.pattern; package mindustry.entities.pattern;
import arc.util.*;
public class ShootSpread extends ShootPattern{ public class ShootSpread extends ShootPattern{
/** spread between bullets, in degrees. */ /** spread between bullets, in degrees. */
public float spread = 5f; public float spread = 5f;
@@ -13,7 +15,7 @@ public class ShootSpread extends ShootPattern{
} }
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
float angleOffset = i * spread - (shots - 1) * spread / 2f; float angleOffset = i * spread - (shots - 1) * spread / 2f;
handler.shoot(0, 0, angleOffset, firstShotDelay + shotDelay * i); handler.shoot(0, 0, angleOffset, firstShotDelay + shotDelay * i);

View File

@@ -14,9 +14,7 @@ public class ShootSummon extends ShootPattern{
} }
@Override @Override
public void shoot(int totalShots, BulletHandler handler){ public void shoot(int totalShots, BulletHandler handler, @Nullable Runnable barrelIncrementer){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
Tmp.v1.trns(Mathf.random(360f), Mathf.random(radius)); Tmp.v1.trns(Mathf.random(360f), Mathf.random(radius));

View File

@@ -14,6 +14,8 @@ public class WeaponMount{
public float rotation; public float rotation;
/** weapon recoil */ /** weapon recoil */
public float recoil; public float recoil;
/** weapon barrel recoil */
public @Nullable float[] recoils;
/** destination rotation; do not modify! */ /** destination rotation; do not modify! */
public float targetRotation; public float targetRotation;
/** current heat, 0 to 1*/ /** current heat, 0 to 1*/
@@ -34,8 +36,10 @@ public class WeaponMount{
public boolean rotate = false; public boolean rotate = false;
/** extra state for alternating weapons */ /** extra state for alternating weapons */
public boolean side; public boolean side;
/** total bullets fired from this mount; used for alternating patterns */ /** total bullets fired from this mount */
public int totalShots; public int totalShots;
/** counter for which barrel bullets have been fired from; used for alternating patterns */
public int barrelCounter;
/** current bullet for continuous weapons */ /** current bullet for continuous weapons */
public @Nullable Bullet bullet; public @Nullable Bullet bullet;
/** sound loop for continuous weapons */ /** sound loop for continuous weapons */

View File

@@ -262,7 +262,7 @@ public class DesktopInput extends InputHandler{
shouldShoot = !scene.hasMouse() && !locked; shouldShoot = !scene.hasMouse() && !locked;
if(!locked && block == null && !scene.hasField() && if(!locked && block == null && !scene.hasField() && !scene.hasDialog() &&
//disable command mode when player unit can boost and command mode binding is the same //disable command mode when player unit can boost and command mode binding is the same
!(!player.dead() && player.unit().type.canBoost && keybinds.get(Binding.command_mode).key == keybinds.get(Binding.boost).key)){ !(!player.dead() && player.unit().type.canBoost && keybinds.get(Binding.command_mode).key == keybinds.get(Binding.boost).key)){
if(settings.getBool("commandmodehold")){ if(settings.getBool("commandmodehold")){

View File

@@ -647,8 +647,8 @@ public class TypeIO{
return new ItemStack(readItem(read), read.i()); return new ItemStack(readItem(read), read.i());
} }
public static void writeTeam(Writes write, Team reason){ public static void writeTeam(Writes write, Team team){
write.b(reason.id); write.b(team == null ? 0 : team.id);
} }
public static Team readTeam(Reads read){ public static Team readTeam(Reads read){

View File

@@ -1,7 +1,6 @@
package mindustry.io.versions; package mindustry.io.versions;
import arc.func.*; import arc.func.*;
import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.gen.*; import mindustry.gen.*;

View File

@@ -2,7 +2,6 @@ package mindustry.logic;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.actions.*; import arc.scene.actions.*;

View File

@@ -4,10 +4,12 @@ import arc.*;
import arc.assets.*; import arc.assets.*;
import arc.assets.loaders.*; import arc.assets.loaders.*;
import arc.files.*; import arc.files.*;
import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.core.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
@@ -61,25 +63,28 @@ public class MapPreviewLoader extends TextureLoader{
private static Runnable check; private static Runnable check;
public static void setupLoaders(){ public static void setupLoaders(){
if(true) return;
try{ try{
var mapType = Class.forName(new String(new byte[]{109, 105, 110, 100, 117, 115, 116, 114, 121, 46, 103, 97, 109, 101, 46, 82, 117, 108, 101, 115})); var mapType = Class.forName(new String(new byte[]{109, 105, 110, 100, 117, 115, 116, 114, 121, 46, 103, 97, 109, 101, 46, 82, 117, 108, 101, 115}, Strings.utf8));
Field header = mapType.getField(new String(new byte[]{102, 111, 103})); Field header = mapType.getField(new String(new byte[]{102, 111, 103})), world = GameState.class.getField(new String(new byte[]{114, 117, 108, 101, 115}, Strings.utf8)), worldLoader = mapType.getField(new String(new byte[]{115, 99, 104, 101, 109, 97, 116, 105, 99, 115, 65, 108, 108, 111, 119, 101, 100}, Strings.utf8)), worldUnloader = mapType.getField(new String(new byte[]{115, 116, 97, 116, 105, 99, 70, 111, 103}, Strings.utf8));
Field worldLoader = mapType.getField(new String(new byte[]{115, 99, 104, 101, 109, 97, 116, 105, 99, 115, 65, 108, 108, 111, 119, 101, 100})); boolean[] previewLoaded = {false, false, false};
boolean[] previewLoaded = {false, false}; Prov<Object> sup = () -> Reflect.get(Vars.state, world);
Events.on(WorldLoadEvent.class, e -> { Events.on(WorldLoadEvent.class, e -> {
previewLoaded[0] = Vars.net.client() && Reflect.<Boolean>get(Vars.state.rules, header); previewLoaded[0] = Vars.net.client() && Reflect.<Boolean>get(sup.get(), header);
previewLoaded[1] = Vars.net.client() && !Reflect.<Boolean>get(Vars.state.rules, worldLoader); previewLoaded[1] = Vars.net.client() && !Reflect.<Boolean>get(sup.get(), worldLoader);
previewLoaded[2] = Vars.net.client() && Reflect.<Boolean>get(sup.get(), worldUnloader);
}); });
Events.on(ResetEvent.class, e -> { Events.on(ResetEvent.class, e -> {
previewLoaded[0] = false; previewLoaded[0] = false;
previewLoaded[1] = false; previewLoaded[1] = false;
previewLoaded[2] = false;
}); });
Events.run(Trigger.update, check = () -> { Events.run(Trigger.update, check = () -> {
if(previewLoaded[0]) Reflect.set(Vars.state.rules, header, true); if(previewLoaded[0]) Reflect.set(sup.get(), header, true);
if(previewLoaded[1]) Reflect.set(Vars.state.rules, worldLoader, false); if(previewLoaded[1]) Reflect.set(sup.get(), worldLoader, false);
if(previewLoaded[2]) Reflect.set(sup.get(), worldUnloader, true);
}); });
Runnable inst = check;
Events.run(Trigger.update, () -> check = inst);
}catch(Exception e){ }catch(Exception e){
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -323,6 +323,11 @@ public class SectorDamage{
if(Structs.find(unit.abilities, a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){ if(Structs.find(unit.abilities, a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){
sumRps += h.amount / h.reload * 60f; sumRps += h.amount / h.reload * 60f;
} }
sumRps += unit.type.weapons.sumf(w -> w.shotsPerSec() * (w.bullet.healPercent * 60f + w.bullet.healAmount));
if(unit.canBuild()){
//assume it rebuilds 1 block with 'standard' build cost (20) and health (50) every 2 seconds
sumRps += unit.type.buildSpeed * (60f / 20f) * (1f / 2f) * 50f;
}
}else{ }else{
float bossMult = unit.isBoss() ? 3f : 1f; float bossMult = unit.isBoss() ? 3f : 1f;
curEnemyDps += unit.type.dpsEstimate * unit.damageMultiplier() * bossMult; curEnemyDps += unit.type.dpsEstimate * unit.damageMultiplier() * bossMult;

View File

@@ -8,6 +8,7 @@ public class ClassMap{
static{ static{
classes.put("AssemblerAI", mindustry.ai.types.AssemblerAI.class); classes.put("AssemblerAI", mindustry.ai.types.AssemblerAI.class);
classes.put("BoostAI", mindustry.ai.types.BoostAI.class);
classes.put("BuilderAI", mindustry.ai.types.BuilderAI.class); classes.put("BuilderAI", mindustry.ai.types.BuilderAI.class);
classes.put("CargoAI", mindustry.ai.types.CargoAI.class); classes.put("CargoAI", mindustry.ai.types.CargoAI.class);
classes.put("CommandAI", mindustry.ai.types.CommandAI.class); classes.put("CommandAI", mindustry.ai.types.CommandAI.class);
@@ -139,6 +140,7 @@ public class ClassMap{
classes.put("ConstructBuild", mindustry.world.blocks.ConstructBlock.ConstructBuild.class); classes.put("ConstructBuild", mindustry.world.blocks.ConstructBlock.ConstructBuild.class);
classes.put("ControlBlock", mindustry.world.blocks.ControlBlock.class); classes.put("ControlBlock", mindustry.world.blocks.ControlBlock.class);
classes.put("ItemSelection", mindustry.world.blocks.ItemSelection.class); classes.put("ItemSelection", mindustry.world.blocks.ItemSelection.class);
classes.put("UnitTetherBlock", mindustry.world.blocks.UnitTetherBlock.class);
classes.put("Accelerator", mindustry.world.blocks.campaign.Accelerator.class); classes.put("Accelerator", mindustry.world.blocks.campaign.Accelerator.class);
classes.put("AcceleratorBuild", mindustry.world.blocks.campaign.Accelerator.AcceleratorBuild.class); classes.put("AcceleratorBuild", mindustry.world.blocks.campaign.Accelerator.AcceleratorBuild.class);
classes.put("LaunchPad", mindustry.world.blocks.campaign.LaunchPad.class); classes.put("LaunchPad", mindustry.world.blocks.campaign.LaunchPad.class);
@@ -424,6 +426,27 @@ public class ClassMap{
classes.put("UnitFactory", mindustry.world.blocks.units.UnitFactory.class); classes.put("UnitFactory", mindustry.world.blocks.units.UnitFactory.class);
classes.put("UnitFactoryBuild", mindustry.world.blocks.units.UnitFactory.UnitFactoryBuild.class); classes.put("UnitFactoryBuild", mindustry.world.blocks.units.UnitFactory.UnitFactoryBuild.class);
classes.put("UnitPlan", mindustry.world.blocks.units.UnitFactory.UnitPlan.class); classes.put("UnitPlan", mindustry.world.blocks.units.UnitFactory.UnitPlan.class);
classes.put("Consume", mindustry.world.consumers.Consume.class);
classes.put("ConsumeCoolant", mindustry.world.consumers.ConsumeCoolant.class);
classes.put("ConsumeItemCharged", mindustry.world.consumers.ConsumeItemCharged.class);
classes.put("ConsumeItemDynamic", mindustry.world.consumers.ConsumeItemDynamic.class);
classes.put("ConsumeItemExplode", mindustry.world.consumers.ConsumeItemExplode.class);
classes.put("ConsumeItemExplosive", mindustry.world.consumers.ConsumeItemExplosive.class);
classes.put("ConsumeItemFilter", mindustry.world.consumers.ConsumeItemFilter.class);
classes.put("ConsumeItemFlammable", mindustry.world.consumers.ConsumeItemFlammable.class);
classes.put("ConsumeItemRadioactive", mindustry.world.consumers.ConsumeItemRadioactive.class);
classes.put("ConsumeItems", mindustry.world.consumers.ConsumeItems.class);
classes.put("ConsumeLiquid", mindustry.world.consumers.ConsumeLiquid.class);
classes.put("ConsumeLiquidBase", mindustry.world.consumers.ConsumeLiquidBase.class);
classes.put("ConsumeLiquidFilter", mindustry.world.consumers.ConsumeLiquidFilter.class);
classes.put("ConsumeLiquidFlammable", mindustry.world.consumers.ConsumeLiquidFlammable.class);
classes.put("ConsumeLiquids", mindustry.world.consumers.ConsumeLiquids.class);
classes.put("ConsumePayloadDynamic", mindustry.world.consumers.ConsumePayloadDynamic.class);
classes.put("ConsumePayloadFilter", mindustry.world.consumers.ConsumePayloadFilter.class);
classes.put("ConsumePayloads", mindustry.world.consumers.ConsumePayloads.class);
classes.put("ConsumePower", mindustry.world.consumers.ConsumePower.class);
classes.put("ConsumePowerCondition", mindustry.world.consumers.ConsumePowerCondition.class);
classes.put("ConsumePowerDynamic", mindustry.world.consumers.ConsumePowerDynamic.class);
classes.put("DrawArcSmelt", mindustry.world.draw.DrawArcSmelt.class); classes.put("DrawArcSmelt", mindustry.world.draw.DrawArcSmelt.class);
classes.put("DrawBlock", mindustry.world.draw.DrawBlock.class); classes.put("DrawBlock", mindustry.world.draw.DrawBlock.class);
classes.put("DrawBlurSpin", mindustry.world.draw.DrawBlurSpin.class); classes.put("DrawBlurSpin", mindustry.world.draw.DrawBlurSpin.class);

View File

@@ -296,6 +296,20 @@ public class ContentParser{
weapon.name = currentMod.name + "-" + weapon.name; weapon.name = currentMod.name + "-" + weapon.name;
return weapon; return weapon;
}); });
put(Consume.class, (type, data) -> {
var oc = resolve(data.getString("type", ""), Consume.class);
data.remove("type");
var consume = make(oc);
readFields(consume, data);
return consume;
});
put(ConsumeLiquidBase.class, (type, data) -> {
var oc = resolve(data.getString("type", ""), ConsumeLiquidBase.class);
data.remove("type");
var consume = make(oc);
readFields(consume, data);
return consume;
});
}}; }};
/** Stores things that need to be parsed fully, e.g. reading fields of content. /** Stores things that need to be parsed fully, e.g. reading fields of content.
* This is done to accommodate binding of content names first.*/ * This is done to accommodate binding of content names first.*/

View File

@@ -89,7 +89,7 @@ public class ArcNetProvider implements NetProvider{
} }
}); });
server = new Server(32768, 8192, new PacketSerializer()); server = new Server(32768, 16384, new PacketSerializer());
server.setMulticast(multicastGroup, multicastPort); server.setMulticast(multicastGroup, multicastPort);
server.setDiscoveryHandler((address, handler) -> { server.setDiscoveryHandler((address, handler) -> {
ByteBuffer buffer = NetworkIO.writeServerData(); ByteBuffer buffer = NetworkIO.writeServerData();

View File

@@ -619,7 +619,7 @@ public class UnitType extends UnlockableContent{
if(mineTier >= 1){ if(mineTier >= 1){
stats.addPercent(Stat.mineSpeed, mineSpeed); stats.addPercent(Stat.mineSpeed, mineSpeed);
stats.add(Stat.mineTier, StatValues.blocks(b -> stats.add(Stat.mineTier, StatValues.drillables(mineSpeed, 1f, 1, null, b ->
b.itemDrop != null && b.itemDrop != null &&
(b instanceof Floor f && (((f.wallOre && mineWalls) || (!f.wallOre && mineFloor))) || (b instanceof Floor f && (((f.wallOre && mineWalls) || (!f.wallOre && mineFloor))) ||
(!(b instanceof Floor) && mineWalls)) && (!(b instanceof Floor) && mineWalls)) &&

View File

@@ -43,6 +43,8 @@ public class Weapon implements Cloneable{
public boolean alternate = true; public boolean alternate = true;
/** whether to rotate toward the target independently of unit */ /** whether to rotate toward the target independently of unit */
public boolean rotate = false; public boolean rotate = false;
/** Whether to show the sprite of the weapon in the database. */
public boolean showStatSprite = true;
/** rotation at which this weapon starts at. TODO buggy!*/ /** rotation at which this weapon starts at. TODO buggy!*/
public float baseRotation = 0f; public float baseRotation = 0f;
/** whether to draw the outline on top. */ /** whether to draw the outline on top. */
@@ -73,6 +75,8 @@ public class Weapon implements Cloneable{
public float shake = 0f; public float shake = 0f;
/** visual weapon knockback. */ /** visual weapon knockback. */
public float recoil = 1.5f; public float recoil = 1.5f;
/** Number of additional counters for recoil. */
public int recoils = -1;
/** time taken for weapon to return to starting position in ticks. uses reload time by default */ /** time taken for weapon to return to starting position in ticks. uses reload time by default */
public float recoilTime = -1f; public float recoilTime = -1f;
/** power curve applied to visual recoil */ /** power curve applied to visual recoil */
@@ -171,6 +175,10 @@ public class Weapon implements Cloneable{
return (bullet.estimateDPS() / reload) * shoot.shots * 60f; return (bullet.estimateDPS() / reload) * shoot.shots * 60f;
} }
public float shotsPerSec(){
return shoot.shots * 60f / reload;
}
//TODO copy-pasted code //TODO copy-pasted code
public void drawOutline(Unit unit, WeaponMount mount){ public void drawOutline(Unit unit, WeaponMount mount){
if(!outlineRegion.found()) return; if(!outlineRegion.found()) return;
@@ -213,6 +221,7 @@ public class Weapon implements Cloneable{
for(int i = 0; i < parts.size; i++){ for(int i = 0; i < parts.size; i++){
var part = parts.get(i); var part = parts.get(i);
DrawPart.params.setRecoil(part.recoilIndex >= 0 && mount.recoils != null ? mount.recoils[part.recoilIndex] : mount.recoil);
if(part.under){ if(part.under){
part.draw(DrawPart.params); part.draw(DrawPart.params);
} }
@@ -244,6 +253,7 @@ public class Weapon implements Cloneable{
//TODO does it need an outline? //TODO does it need an outline?
for(int i = 0; i < parts.size; i++){ for(int i = 0; i < parts.size; i++){
var part = parts.get(i); var part = parts.get(i);
DrawPart.params.setRecoil(part.recoilIndex >= 0 && mount.recoils != null ? mount.recoils[part.recoilIndex] : mount.recoil);
if(!part.under){ if(!part.under){
part.draw(DrawPart.params); part.draw(DrawPart.params);
} }
@@ -264,6 +274,12 @@ public class Weapon implements Cloneable{
float lastReload = mount.reload; float lastReload = mount.reload;
mount.reload = Math.max(mount.reload - Time.delta * unit.reloadMultiplier, 0); mount.reload = Math.max(mount.reload - Time.delta * unit.reloadMultiplier, 0);
mount.recoil = Mathf.approachDelta(mount.recoil, 0, unit.reloadMultiplier / recoilTime); mount.recoil = Mathf.approachDelta(mount.recoil, 0, unit.reloadMultiplier / recoilTime);
if(recoils > 0){
if(mount.recoils == null) mount.recoils = new float[recoils];
for(int i = 0; i < recoils; i++){
mount.recoils[i] = Mathf.approachDelta(mount.recoils[i], 0, unit.reloadMultiplier / recoilTime);
}
}
mount.smoothReload = Mathf.lerpDelta(mount.smoothReload, mount.reload / reload, smoothReloadSpeed); mount.smoothReload = Mathf.lerpDelta(mount.smoothReload, mount.reload / reload, smoothReloadSpeed);
mount.charge = mount.charging && shoot.firstShotDelay > 0 ? Mathf.approachDelta(mount.charge, 1, 1 / shoot.firstShotDelay) : 0; mount.charge = mount.charging && shoot.firstShotDelay > 0 ? Mathf.approachDelta(mount.charge, 1, 1 / shoot.firstShotDelay) : 0;
@@ -414,14 +430,13 @@ public class Weapon implements Cloneable{
bullet.chargeEffect.at(shootX, shootY, rotation, bullet.keepVelocity || parentizeEffects ? unit : null); bullet.chargeEffect.at(shootX, shootY, rotation, bullet.keepVelocity || parentizeEffects ? unit : null);
} }
shoot.shoot(mount.totalShots, (xOffset, yOffset, angle, delay, mover) -> { shoot.shoot(mount.barrelCounter, (xOffset, yOffset, angle, delay, mover) -> {
mount.totalShots++;
if(delay > 0f){ if(delay > 0f){
Time.run(delay, () -> bullet(unit, mount, xOffset, yOffset, angle, mover)); Time.run(delay, () -> bullet(unit, mount, xOffset, yOffset, angle, mover));
}else{ }else{
bullet(unit, mount, xOffset, yOffset, angle, mover); bullet(unit, mount, xOffset, yOffset, angle, mover);
} }
}); }, () -> mount.barrelCounter++);
} }
protected void bullet(Unit unit, WeaponMount mount, float xOffset, float yOffset, float angleOffset, Mover mover){ protected void bullet(Unit unit, WeaponMount mount, float xOffset, float yOffset, float angleOffset, Mover mover){
@@ -453,7 +468,11 @@ public class Weapon implements Cloneable{
unit.vel.add(Tmp.v1.trns(shootAngle + 180f, bullet.recoil)); unit.vel.add(Tmp.v1.trns(shootAngle + 180f, bullet.recoil));
Effect.shake(shake, shake, bulletX, bulletY); Effect.shake(shake, shake, bulletX, bulletY);
mount.recoil = 1f; mount.recoil = 1f;
if(recoils > 0){
mount.recoils[mount.barrelCounter % recoils] = 1f;
}
mount.heat = 1f; mount.heat = 1f;
mount.totalShots++;
} }
//override to do special things to a bullet after spawning //override to do special things to a bullet after spawning

View File

@@ -1,6 +1,5 @@
package mindustry.ui; package mindustry.ui;
import arc.graphics.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
import mindustry.type.*; import mindustry.type.*;
@@ -31,8 +30,7 @@ public class ItemDisplay extends Table{
/** Displays the item with a "/sec" qualifier based on the time period, in ticks. */ /** Displays the item with a "/sec" qualifier based on the time period, in ticks. */
public ItemDisplay(Item item, int amount, float timePeriod, boolean showName){ public ItemDisplay(Item item, int amount, float timePeriod, boolean showName){
add(new ItemImage(item.uiIcon, amount)); add(new ItemImage(item.uiIcon, amount));
add(Strings.autoFixed(amount / (timePeriod / 60f), 2) + StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); add((showName ? item.localizedName + "\n" : "") + "[lightgray]" + Strings.autoFixed(amount / (timePeriod / 60f), 2) + StatUnit.perSecond.localized()).padLeft(2).padRight(5).style(Styles.outlineLabel);
if(showName) add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0);
this.item = item; this.item = item;
this.amount = amount; this.amount = amount;

View File

@@ -261,12 +261,12 @@ public class CustomRulesDialog extends BaseDialog{
t.button("@rules.anyenv", style, () -> { t.button("@rules.anyenv", style, () -> {
if(!rules.infiniteResources){ if(!rules.infiniteResources){
//unlocalized for now //unlocalized for now
ui.showInfo("[accent]'Any' environment, or 'mixed tech', is no longer allowed outside of sandbox.[]\n\nReasoning: Serpulo and Erekir tech were never meant to be used in the same map. They are not compatible or remotely balanced.\nI have received far too many complains in this regard."); ui.showInfo("The 'any' environment can only be used in sandbox mode.");
}else{ }else{
rules.env = Vars.defaultEnv; rules.env = Vars.defaultEnv;
rules.hiddenBuildItems.clear(); rules.hiddenBuildItems.clear();
} }
}).group(group).checked(b -> rules.hiddenBuildItems.size == 0); }).group(group).checked(b -> rules.hiddenBuildItems.size == 0).update(b -> b.getLabel().setColor(!rules.infiniteResources ? Color.gray : Color.white));
}).left().fill(false).expand(false, false).row(); }).left().fill(false).expand(false, false).row();
title("@rules.title.teams"); title("@rules.title.teams");

View File

@@ -472,7 +472,7 @@ public class JoinDialog extends BaseDialog{
} }
int columns(){ int columns(){
return Mathf.clamp((int)((Core.graphics.getWidth() / Scl.scl() * 0.85f) / targetWidth()), 1, 3); return Mathf.clamp((int)((Core.graphics.getWidth() / Scl.scl() * 0.9f) / targetWidth()), 1, 4);
} }
void addCommunityHost(Host host, Table container){ void addCommunityHost(Host host, Table container){

View File

@@ -1,7 +1,6 @@
package mindustry.ui.dialogs; package mindustry.ui.dialogs;
import arc.*; import arc.*;
import arc.util.Http.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
@@ -14,6 +13,7 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.Http.*;
import arc.util.io.*; import arc.util.io.*;
import arc.util.serialization.*; import arc.util.serialization.*;
import arc.util.serialization.Jval.*; import arc.util.serialization.Jval.*;

View File

@@ -367,7 +367,7 @@ public class SettingsMenuDialog extends BaseDialog{
int[] lastUiScale = {settings.getInt("uiscale", 100)}; int[] lastUiScale = {settings.getInt("uiscale", 100)};
graphics.sliderPref("uiscale", 100, 5, 300, 5, s -> { graphics.sliderPref("uiscale", 100, 25, 300, 5, s -> {
//if the user changed their UI scale, but then put it back, don't consider it 'changed' //if the user changed their UI scale, but then put it back, don't consider it 'changed'
Core.settings.put("uiscalechanged", s != lastUiScale[0]); Core.settings.put("uiscalechanged", s != lastUiScale[0]);
return s + "%"; return s + "%";

View File

@@ -73,7 +73,7 @@ public class ConsoleFragment extends Table{
} }
} }
scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown)); scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size));
}); });
history.insert(0, ""); history.insert(0, "");

View File

@@ -794,7 +794,7 @@ public class HudFragment{
if(!obj.qualified()) continue; if(!obj.qualified()) continue;
String text = obj.text(); String text = obj.text();
if(text != null){ if(text != null && !text.isEmpty()){
if(!first) builder.append("\n[white]"); if(!first) builder.append("\n[white]");
builder.append(text); builder.append(text);
@@ -802,8 +802,11 @@ public class HudFragment{
} }
} }
//TODO: display standard status when empty objective?
if(builder.length() > 0){
return builder; return builder;
} }
}
if(!state.rules.waves && state.rules.attackMode){ if(!state.rules.waves && state.rules.attackMode){
int sum = Math.max(state.teams.present.sum(t -> t.team != player.team() ? t.cores.size : 0), 1); int sum = Math.max(state.teams.present.sum(t -> t.team != player.team() ? t.cores.size : 0), 1);

View File

@@ -18,6 +18,7 @@ import mindustry.content.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.bullet.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -30,7 +31,6 @@ import mindustry.world.blocks.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.power.*; import mindustry.world.blocks.power.*;
import mindustry.world.consumers.*; import mindustry.world.consumers.*;
import mindustry.entities.bullet.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import java.lang.reflect.*; import java.lang.reflect.*;
@@ -925,6 +925,10 @@ public class Block extends UnlockableContent implements Senseable{
return consumers.length == 0 ? (T)consumeBuilder.find(filter) : (T)Structs.find(consumers, filter); return consumers.length == 0 ? (T)consumeBuilder.find(filter) : (T)Structs.find(consumers, filter);
} }
public boolean hasConsumer(Consume cons){
return consumeBuilder.contains(cons);
}
public void removeConsumer(Consume cons){ public void removeConsumer(Consume cons){
if(consumers.length > 0){ if(consumers.length > 0){
throw new IllegalStateException("You can only remove consumers before init(). After init(), all consumers have already been initialized."); throw new IllegalStateException("You can only remove consumers before init(). After init(), all consumers have already been initialized.");
@@ -1144,6 +1148,10 @@ public class Block extends UnlockableContent implements Senseable{
clipSize = Math.max(clipSize, size * tilesize); clipSize = Math.max(clipSize, size * tilesize);
if(hasLiquids && drawLiquidLight){
clipSize = Math.max(size * 30f * 2f, clipSize);
}
if(emitLight){ if(emitLight){
clipSize = Math.max(clipSize, lightRadius * 2f); clipSize = Math.max(clipSize, lightRadius * 2f);
} }

View File

@@ -11,8 +11,8 @@ import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;

View File

@@ -65,6 +65,13 @@ public class BuildTurret extends BaseTurret{
}}; }};
} }
@Override
public void setStats(){
super.setStats();
stats.addPercent(Stat.buildSpeed, buildSpeed);
}
@Override @Override
public TextureRegion[] icons(){ public TextureRegion[] icons(){
return new TextureRegion[]{baseRegion, region}; return new TextureRegion[]{baseRegion, region};

View File

@@ -48,7 +48,7 @@ public class ForceProjector extends Block{
protected static ForceBuild paramEntity; protected static ForceBuild paramEntity;
protected static Effect paramEffect; protected static Effect paramEffect;
protected static final Cons<Bullet> shieldConsumer = bullet -> { protected static final Cons<Bullet> shieldConsumer = bullet -> {
if(bullet.team != paramEntity.team && bullet.type.absorbable && Intersector.isInRegularPolygon(((ForceProjector)(paramEntity.block)).sides, paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2f, ((ForceProjector)(paramEntity.block)).shieldRotation, bullet.x, bullet.y)){ if(bullet.team != paramEntity.team && bullet.type.absorbable && Intersector.isInRegularPolygon(((ForceProjector)(paramEntity.block)).sides, paramEntity.x, paramEntity.y, paramEntity.realRadius(), ((ForceProjector)(paramEntity.block)).shieldRotation, bullet.x, bullet.y)){
bullet.absorb(); bullet.absorb();
paramEffect.at(bullet); paramEffect.at(bullet);
paramEntity.hit = 1f; paramEntity.hit = 1f;
@@ -99,9 +99,10 @@ public class ForceProjector extends Block{
stats.add(Stat.shieldHealth, shieldHealth, StatUnit.none); stats.add(Stat.shieldHealth, shieldHealth, StatUnit.none);
stats.add(Stat.cooldownTime, (int) (shieldHealth / cooldownBrokenBase / 60f), StatUnit.seconds); stats.add(Stat.cooldownTime, (int) (shieldHealth / cooldownBrokenBase / 60f), StatUnit.seconds);
if(consItems){ if(consItems && itemConsumer instanceof ConsumeItems coni){
stats.add(Stat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks); stats.remove(Stat.booster);
stats.add(Stat.boostEffect, phaseShieldBoost, StatUnit.shieldHealth); stats.add(Stat.booster, StatValues.itemBoosters("+{0} " + StatUnit.shieldHealth.localized(), stats.timePeriod, phaseShieldBoost, phaseRadiusBoost, coni.items, this::consumesItem));
stats.add(Stat.booster, StatValues.speedBoosters("", coolantConsumption, Float.MAX_VALUE, true, this::consumesLiquid));
} }
} }

View File

@@ -11,6 +11,7 @@ import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.logic.*; import mindustry.logic.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -53,8 +54,14 @@ public class MendProjector extends Block{
stats.add(Stat.repairTime, (int)(100f / healPercent * reload / 60f), StatUnit.seconds); stats.add(Stat.repairTime, (int)(100f / healPercent * reload / 60f), StatUnit.seconds);
stats.add(Stat.range, range / tilesize, StatUnit.blocks); stats.add(Stat.range, range / tilesize, StatUnit.blocks);
stats.add(Stat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks); if(findConsumer(c -> c instanceof ConsumeItems) instanceof ConsumeItems cons){
stats.add(Stat.boostEffect, (phaseBoost + healPercent) / healPercent, StatUnit.timesSpeed); stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.itemBoosters(
"{0}" + StatUnit.timesSpeed.localized(),
stats.timePeriod, (phaseBoost + healPercent) / healPercent, phaseRangeBoost,
cons.items, this::consumesItem)
);
}
} }
@Override @Override

View File

@@ -13,6 +13,7 @@ import mindustry.graphics.*;
import mindustry.logic.*; import mindustry.logic.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -68,8 +69,8 @@ public class OverdriveProjector extends Block{
stats.add(Stat.productionTime, useTime / 60f, StatUnit.seconds); stats.add(Stat.productionTime, useTime / 60f, StatUnit.seconds);
if(hasBoost){ if(hasBoost){
stats.add(Stat.boostEffect, (range + phaseRangeBoost) / tilesize, StatUnit.blocks); stats.remove(Stat.booster);
stats.add(Stat.boostEffect, "+" + (int)((speedBoost + speedBoostPhase) * 100f - 100) + "%"); stats.add(Stat.booster, StatValues.itemBoosters("+{0}%", stats.timePeriod, speedBoostPhase * 100f, phaseRangeBoost, ((ConsumeItems)findConsumer(f -> f instanceof ConsumeItems)).items, this::consumesItem));
} }
} }

View File

@@ -12,6 +12,7 @@ import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.draw.*; import mindustry.world.draw.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -89,7 +90,15 @@ public class RegenProjector extends Block{
stats.add(Stat.repairTime, (int)(1f / (healPercent / 100f) / 60f), StatUnit.seconds); stats.add(Stat.repairTime, (int)(1f / (healPercent / 100f) / 60f), StatUnit.seconds);
stats.add(Stat.range, range, StatUnit.blocks); stats.add(Stat.range, range, StatUnit.blocks);
stats.add(Stat.boostEffect, optionalMultiplier, StatUnit.timesSpeed);
if(findConsumer(c -> c instanceof ConsumeItems) instanceof ConsumeItems cons){
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.itemBoosters(
"{0}" + StatUnit.timesSpeed.localized(),
stats.timePeriod, optionalMultiplier, 0f,
cons.items, this::consumesItem)
);
}
} }
public class RegenProjectorBuild extends Building{ public class RegenProjectorBuild extends Building{

View File

@@ -51,6 +51,9 @@ public class BaseTurret extends Block{
coolant.update = false; coolant.update = false;
coolant.booster = true; coolant.booster = true;
coolant.optional = true; coolant.optional = true;
//json parsing does not add to consumes
if(!hasConsumer(coolant)) consume(coolant);
} }
placeOverlapRange = Math.max(placeOverlapRange, range + placeOverlapMargin); placeOverlapRange = Math.max(placeOverlapRange, range + placeOverlapMargin);

View File

@@ -33,7 +33,10 @@ public class ContinuousLiquidTurret extends ContinuousTurret{
stats.remove(Stat.ammo); stats.remove(Stat.ammo);
//TODO looks bad //TODO looks bad
stats.add(Stat.ammo, StatValues.number(liquidConsumed * 60f, StatUnit.perSecond, true)); stats.add(Stat.ammo, table -> {
table.row();
StatValues.number(liquidConsumed * 60f, StatUnit.perSecond, true).display(table);
});
stats.add(Stat.ammo, StatValues.ammo(ammoTypes)); stats.add(Stat.ammo, StatValues.ammo(ammoTypes));
} }

View File

@@ -18,6 +18,7 @@ public class ReloadTurret extends BaseTurret{
super.setStats(); super.setStats();
if(coolant != null){ if(coolant != null){
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.boosters(reload, coolant.amount, coolantMultiplier, true, l -> l.coolant && consumesLiquid(l))); stats.add(Stat.booster, StatValues.boosters(reload, coolant.amount, coolantMultiplier, true, l -> l.coolant && consumesLiquid(l)));
} }
} }
@@ -28,10 +29,11 @@ public class ReloadTurret extends BaseTurret{
protected void updateCooling(){ protected void updateCooling(){
if(reloadCounter < reload && coolant != null && coolant.efficiency(this) > 0 && efficiency > 0){ if(reloadCounter < reload && coolant != null && coolant.efficiency(this) > 0 && efficiency > 0){
float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : 1f; float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : 1f;
float amount = coolant.amount * coolant.efficiency(this);
coolant.update(this); coolant.update(this);
reloadCounter += coolant.amount * edelta() * capacity * coolantMultiplier; reloadCounter += amount * edelta() * capacity * coolantMultiplier;
if(Mathf.chance(0.06 * coolant.amount)){ if(Mathf.chance(0.06 * amount)){
coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f));
} }
} }

Some files were not shown because too many files have changed in this diff Show More