More lights

This commit is contained in:
Anuken
2019-11-16 19:57:33 -05:00
96 changed files with 4101 additions and 3582 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ buildscript{
} }
dependencies{ dependencies{
classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.android.tools.build:gradle:3.5.2'
} }
} }
+1 -1
View File
@@ -17,7 +17,7 @@ buildscript{
allprojects{ allprojects{
version = 'release' version = 'release'
apply plugin: 'maven' apply plugin: 'maven-publish'
group = 'com.github.Anuken' group = 'com.github.Anuken'
ext{ ext{
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+22 -15
View File
@@ -86,7 +86,7 @@ committingchanges = Comitting Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -103,7 +103,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
@@ -560,6 +560,8 @@ bar.heat = Heat
bar.power = Power bar.power = Power
bar.progress = Build Progress bar.progress = Build Progress
bar.spawned = Units: {0}/{1} bar.spawned = Units: {0}/{1}
bar.input = Input
bar.output = Output
bullet.damage = [stat]{0}[lightgray] damage bullet.damage = [stat]{0}[lightgray] damage
bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles
@@ -597,7 +599,7 @@ setting.shadows.name = Shadows
setting.blockreplace.name = Automatic Block Suggestions setting.blockreplace.name = Automatic Block Suggestions
setting.linear.name = Linear Filtering setting.linear.name = Linear Filtering
setting.hints.name = Hints setting.hints.name = Hints
setting.buildautopause.name = Auto-pause Building setting.buildautopause.name = Auto-Pause Building
setting.animatedwater.name = Animated Water setting.animatedwater.name = Animated Water
setting.animatedshields.name = Animated Shields setting.animatedshields.name = Animated Shields
setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.antialias.name = Antialias[lightgray] (requires restart)[]
@@ -622,7 +624,7 @@ setting.destroyedblocks.name = Display Destroyed Blocks
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
setting.sensitivity.name = Controller Sensitivity setting.sensitivity.name = Controller Sensitivity
setting.saveinterval.name = Save Interval setting.saveinterval.name = Save Interval
setting.seconds = {0} Seconds setting.seconds = {0} seconds
setting.fullscreen.name = Fullscreen setting.fullscreen.name = Fullscreen
setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart)
setting.fps.name = Show FPS & Ping setting.fps.name = Show FPS & Ping
@@ -658,8 +660,9 @@ keybind.clear_building.name = Clear Building
keybind.press = Press a key... keybind.press = Press a key...
keybind.press.axis = Press an axis or key... keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move X
keybind.move_y.name = Move y keybind.move_y.name = Move Y
keybind.mouse_move.name = Follow Mouse
keybind.schematic_select.name = Select Region keybind.schematic_select.name = Select Region
keybind.schematic_menu.name = Schematic Menu keybind.schematic_menu.name = Schematic Menu
keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_x.name = Flip Schematic X
@@ -679,16 +682,16 @@ keybind.pause_building.name = Pause/Resume Building
keybind.minimap.name = Minimap keybind.minimap.name = Minimap
keybind.dash.name = Dash keybind.dash.name = Dash
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Player list keybind.player_list.name = Player List
keybind.console.name = Console keybind.console.name = Console
keybind.rotate.name = Rotate keybind.rotate.name = Rotate
keybind.rotateplaced.name = Rotate Existing (Hold) keybind.rotateplaced.name = Rotate Existing (Hold)
keybind.toggle_menus.name = Toggle menus keybind.toggle_menus.name = Toggle Menus
keybind.chat_history_prev.name = Chat history prev keybind.chat_history_prev.name = Chat History Prev
keybind.chat_history_next.name = Chat history next keybind.chat_history_next.name = Chat History Next
keybind.chat_scroll.name = Chat scroll keybind.chat_scroll.name = Chat Scroll
keybind.drop_unit.name = Drop Unit keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom minimap keybind.zoom_minimap.name = Zoom Minimap
mode.help.title = Description of modes mode.help.title = Description of modes
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play.
@@ -702,6 +705,7 @@ mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a
mode.custom = Custom Rules mode.custom = Custom Rules
rules.infiniteresources = Infinite Resources rules.infiniteresources = Infinite Resources
rules.reactorexplosions = Reactor Explosions
rules.wavetimer = Wave Timer rules.wavetimer = Wave Timer
rules.waves = Waves rules.waves = Waves
rules.attack = Attack Mode rules.attack = Attack Mode
@@ -717,7 +721,7 @@ rules.respawntime = Respawn Time:[lightgray] (sec)
rules.wavespacing = Wave Spacing:[lightgray] (sec) rules.wavespacing = Wave Spacing:[lightgray] (sec)
rules.buildcostmultiplier = Build Cost Multiplier rules.buildcostmultiplier = Build Cost Multiplier
rules.buildspeedmultiplier = Build Speed Multiplier rules.buildspeedmultiplier = Build Speed Multiplier
rules.waitForWaveToEnd = Waves wait for enemies rules.waitForWaveToEnd = Waves Wait for Enemies
rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles)
rules.respawns = Max respawns per wave rules.respawns = Max respawns per wave
rules.limitedRespawns = Limit Respawns rules.limitedRespawns = Limit Respawns
@@ -888,6 +892,7 @@ block.distributor.name = Distributor
block.sorter.name = Sorter block.sorter.name = Sorter
block.inverted-sorter.name = Inverted Sorter block.inverted-sorter.name = Inverted Sorter
block.message.name = Message block.message.name = Message
block.illuminator.name = Illuminator
block.overflow-gate.name = Overflow Gate block.overflow-gate.name = Overflow Gate
block.silicon-smelter.name = Silicon Smelter block.silicon-smelter.name = Silicon Smelter
block.phase-weaver.name = Phase Weaver block.phase-weaver.name = Phase Weaver
@@ -901,6 +906,7 @@ block.coal-centrifuge.name = Coal Centrifuge
block.power-node.name = Power Node block.power-node.name = Power Node
block.power-node-large.name = Large Power Node block.power-node-large.name = Large Power Node
block.surge-tower.name = Surge Tower block.surge-tower.name = Surge Tower
block.diode.name = Battery Diode
block.battery.name = Battery block.battery.name = Battery
block.battery-large.name = Large Battery block.battery-large.name = Large Battery
block.combustion-generator.name = Combustion Generator block.combustion-generator.name = Combustion Generator
@@ -1004,7 +1010,7 @@ unit.eradicator.name = Eradicator
unit.lich.name = Lich unit.lich.name = Lich
unit.reaper.name = Reaper unit.reaper.name = Reaper
tutorial.next = [lightgray]<Tap to continue> tutorial.next = [lightgray]<Tap to continue>
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [[WASD] to move.\n[accent]Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [accent][[WASD][] to move.\n[accent]Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building. tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building.
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
@@ -1114,7 +1120,7 @@ block.sorter.description = Sorts items. If an item matches the selection, it is
block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead.
block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[]
block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. block.distributor.description = An advanced router. Splits items to up to 7 other directions equally.
block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked. block.overflow-gate.description = Only outputs to the left and right if the front path is blocked.
block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate.
block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. block.mechanical-pump.description = A cheap pump with slow output, but no power consumption.
block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power.
@@ -1129,6 +1135,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to
block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks.
block.power-node-large.description = An advanced power node with greater range. block.power-node-large.description = An advanced power node with greater range.
block.surge-tower.description = An extremely long-range power node with fewer available connections. block.surge-tower.description = An extremely long-range power node with fewer available connections.
block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored.
block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit.
block.battery-large.description = Stores much more power than a regular battery. block.battery-large.description = Stores much more power than a regular battery.
block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.combustion-generator.description = Generates power by burning flammable materials, such as coal.
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Nahrávám prohlížecí soubor
committingchanges = Provádím změny committingchanges = Provádím změny
done = Hotovo done = Hotovo
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+4 -4
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
@@ -1152,9 +1152,9 @@ block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen u
block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen. block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen.
block.wraith-factory.description = Produziert schnelle Abfangjäger. block.wraith-factory.description = Produziert schnelle Abfangjäger.
block.ghoul-factory.description = Produziert schwere Flächenbomber. block.ghoul-factory.description = Produziert schwere Flächenbomber.
block.revenant-factory.description = Produziert schwere Laser-Bodeneinheiten. block.revenant-factory.description = Produziert schwere Raketen basierte Flugeinheiten.
block.dagger-factory.description = Produziert Standard-Bodeneinheiten. block.dagger-factory.description = Produziert Standard-Bodeneinheiten.
block.crawler-factory.description = Produces fast self-destructing swarm units. block.crawler-factory.description = Produziert schnelle selbstzerstörende Schwarmeinheiten.
block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodeneinheiten. block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodeneinheiten.
block.fortress-factory.description = Produziert schwere Artillerie-Bodeneinheiten. block.fortress-factory.description = Produziert schwere Artillerie-Bodeneinheiten.
block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung.
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Hecho done = Hecho
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Eelvaate faili üleslaadimine
committingchanges = Muudatuste teostamine committingchanges = Muudatuste teostamine
done = Valmis done = Valmis
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Aurrebista fitxategia igotzen
committingchanges = Aldaketak aplikatzen committingchanges = Aldaketak aplikatzen
done = Egina done = Egina
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Publication du fichier d'aperçu
committingchanges = Validation des modifications committingchanges = Validation des modifications
done = Fait done = Fait
feature.unsupported = Votre appareil ne supporte pas cette fonctionnalité. feature.unsupported = Votre appareil ne supporte pas cette fonctionnalité.
mods.alphainfo = Gardez à l'esprit que les mods sont en alpha et[scarlet] peuvent être très buggés[].\nMerci de signaler les problèmes que vous rencontrez via le Github ou le Discord Mindustry. mods.alphainfo = Gardez à l'esprit que les mods sont en alpha et[scarlet] peuvent être très buggés[].\nMerci de signaler les problèmes que vous rencontrez via le GitHub ou le Discord Mindustry.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]Aucun mod trouvé! mods.none = [LIGHT_GRAY]Aucun mod trouvé!
@@ -98,7 +98,7 @@ mod.enable = Activer
mod.requiresrestart = Le jeu va maintenant s'arrêter pour appliquer les modifications du mod. mod.requiresrestart = Le jeu va maintenant s'arrêter pour appliquer les modifications du mod.
mod.reloadrequired = [scarlet]Rechargement requis mod.reloadrequired = [scarlet]Rechargement requis
mod.import = Importer un mod mod.import = Importer un mod
mod.import.github = Importer un mod Github mod.import.github = Importer un mod GitHub
mod.remove.confirm = Ce mod sera supprimé. mod.remove.confirm = Ce mod sera supprimé.
mod.author = [LIGHT_GRAY]Auteur:[] {0} mod.author = [LIGHT_GRAY]Auteur:[] {0}
mod.missing = Cette sauvegarde contient des mods que vous avez récemment mis à jour ou que vous avez désinstallés. Votre sauvegarde risque d'être corrompue. Êtes-vous sûr de vouloir l'importer?\n[lightgray]Mods:\n{0} mod.missing = Cette sauvegarde contient des mods que vous avez récemment mis à jour ou que vous avez désinstallés. Votre sauvegarde risque d'être corrompue. Êtes-vous sûr de vouloir l'importer?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Mengupload File Tinjauan
committingchanges = Membuat Perubahan committingchanges = Membuat Perubahan
done = Selesai done = Selesai
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Carico file di anteprima
committingchanges = Applico le modifiche committingchanges = Applico le modifiche
done = Fatto done = Fatto
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Tieni a mente che queste mod sono in alpha, e[scarlet] possono avere molti bug[].\nRiporta tutti i problemi che trovi in Mindustry su Github o Discord. mods.alphainfo = Tieni a mente che queste mod sono in alpha, e[scarlet] possono avere molti bug[].\nRiporta tutti i problemi che trovi in Mindustry su GitHub o Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]Nessuna mod trovata! mods.none = [LIGHT_GRAY]Nessuna mod trovata!
@@ -98,7 +98,7 @@ mod.enable = Abilita
mod.requiresrestart = . mod.requiresrestart = .
mod.reloadrequired = [scarlet]Riavvio necessario mod.reloadrequired = [scarlet]Riavvio necessario
mod.import = Importa una mod mod.import = Importa una mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = Questa mod verrà cancellata. mod.remove.confirm = Questa mod verrà cancellata.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = Questo salvataggio contiene mod che hai recentemente aggiornato o non le hai piu installate. Il salvataggio può essere corrotto. sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} mod.missing = Questo salvataggio contiene mod che hai recentemente aggiornato o non le hai piu installate. Il salvataggio può essere corrotto. sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = プレビューファイルをアップロードしてい
committingchanges = 変更を適応中 committingchanges = 変更を適応中
done = 完了 done = 完了
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Mods機能は実験的なものです。[scarlet] エラーが含まれている可能性があります[]。\n 発見した問題をMindustry Githubに報告してください。 mods.alphainfo = Mods機能は実験的なものです。[scarlet] エラーが含まれている可能性があります[]。\n 発見した問題をMindustry GitHubに報告してください。
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]Modが見つかりませんでした! mods.none = [LIGHT_GRAY]Modが見つかりませんでした!
@@ -98,7 +98,7 @@ mod.enable = 有効化
mod.requiresrestart = このModをインストールするためにはゲームの再起動が必要です。 mod.requiresrestart = このModをインストールするためにはゲームの再起動が必要です。
mod.reloadrequired = [scarlet]Modを有効にするには、この画面を開き直してください。 mod.reloadrequired = [scarlet]Modを有効にするには、この画面を開き直してください。
mod.import = Modをインポート mod.import = Modをインポート
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = このModを削除します。 mod.remove.confirm = このModを削除します。
mod.author = [LIGHT_GRAY]著者:[] {0} mod.author = [LIGHT_GRAY]著者:[] {0}
mod.missing = このセーブには、アップグレードされた可能性があるModsか、ここに存在しないModsが必要です。 メモリのセーブを保存する! ロードしてもよろしいですか?\n[lightgray]MODS:\n{0} mod.missing = このセーブには、アップグレードされた可能性があるModsか、ここに存在しないModsが必要です。 メモリのセーブを保存する! ロードしてもよろしいですか?\n[lightgray]MODS:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+77 -77
View File
@@ -3,16 +3,16 @@ credits = Zasłużeni
contributors = Tłumacze i pomocnicy contributors = Tłumacze i pomocnicy
discord = Odwiedź nasz serwer Discord! discord = Odwiedź nasz serwer Discord!
link.discord.description = Oficjalny serwer Discord Mindustry link.discord.description = Oficjalny serwer Discord Mindustry
link.reddit.description = The Mindustry subreddit link.reddit.description = Subreddit Mindustry
link.github.description = Kod źródłowy gry link.github.description = Kod źródłowy gry
link.changelog.description = Informacje o aktualizacjach link.changelog.description = Historia aktualizacji
link.dev-builds.description = Niestabilne wersje gry link.dev-builds.description = Niestabilne wersje gry
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
link.google-play.description = Strona na sklepie Google Play link.google-play.description = Strona na sklepie Google Play
link.wiki.description = Oficjana Wiki Mindustry link.wiki.description = Oficjana Wiki Mindustry
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
screenshot = Zapisano zdjęcie do {0} screenshot = Zapisano zdjęcie w {0}
screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia. screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia.
gameover = Koniec Gry gameover = Koniec Gry
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
@@ -24,22 +24,22 @@ load.image = Obrazy
load.content = Treść load.content = Treść
load.system = System load.system = System
load.mod = Mody load.mod = Mody
schematic = Schematic schematic = Schemat
schematic.add = Save Schematic... schematic.add = Zapisz schemat...
schematics = Schematics schematics = Schematy
schematic.replace = A schematic by that name already exists. Replace it? schematic.replace = Schemat o takiej nazwie już istnieje. Czy chcesz go zastąpić?
schematic.import = Import Schematic... schematic.import = Importuj Schemat...
schematic.exportfile = Export File schematic.exportfile = Eksportuj plik
schematic.importfile = Import File schematic.importfile = Importuj plik
schematic.browseworkshop = Browse Workshop schematic.browseworkshop = Przeglądaj Warsztat
schematic.copy = Copy to Clipboard schematic.copy = Zapisano w schowku
schematic.copy.import = Import from Clipboard schematic.copy.import = Importuj ze schowka
schematic.shareworkshop = Share on Workshop schematic.shareworkshop = Podziel się na Warsztacie
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Odwróć schemat
schematic.saved = Schematic saved. schematic.saved = Schemat zapisany.
schematic.delete.confirm = This schematic will be utterly eradicated. schematic.delete.confirm = Ten schemat zostanie kompletnie wyeliminowany.
schematic.rename = Rename Schematic schematic.rename = Zmień nazwę schematu
schematic.info = {0}x{1}, {2} blocks schematic.info = {0}x{1}, {2} bloków
stat.wave = Fale powstrzymane:[accent] {0} stat.wave = Fale powstrzymane:[accent] {0}
stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0}
stat.built = Budynki zbudowane:[accent] {0} stat.built = Budynki zbudowane:[accent] {0}
@@ -55,7 +55,7 @@ level.select = Wybrany poziom
level.mode = Tryb gry: level.mode = Tryb gry:
showagain = Nie pokazuj tego więcej showagain = Nie pokazuj tego więcej
coreattack = < Rdzeń jest atakowany! > coreattack = < Rdzeń jest atakowany! >
nearpoint = [[ [scarlet]OPUŚĆ PUNKT ZRZUTU NATYCHMIAST[] ]\nnadciąga zniszczenie nearpoint = [[ [scarlet]NATYCHMIAST OPUŚĆ PUNKT ZRZUTU[] ]\nnadciąga zniszczenie
database = Centralna baza danych database = Centralna baza danych
savegame = Zapisz Grę savegame = Zapisz Grę
loadgame = Wczytaj Grę loadgame = Wczytaj Grę
@@ -64,7 +64,7 @@ customgame = Własna Gra
newgame = Nowa Gra newgame = Nowa Gra
none = <brak> none = <brak>
minimap = Minimapa minimap = Minimapa
position = Position position = Pozycja
close = Zamknij close = Zamknij
website = Strona Gry website = Strona Gry
quit = Wyjdź quit = Wyjdź
@@ -80,30 +80,30 @@ uploadingcontent = Przesyłanie Zawartości
uploadingpreviewfile = Przesyłanie Pliku Podglądu uploadingpreviewfile = Przesyłanie Pliku Podglądu
committingchanges = Zatwierdzanie Zmian committingchanges = Zatwierdzanie Zmian
done = Gotowe done = Gotowe
feature.unsupported = Your device does not support this feature. feature.unsupported = Twoje urządzenie nie wspiera tej funkcji.
mods.alphainfo = Pamiętaj, że mody są wersji alpha, i[scarlet] mogą być pełne błędów[].\nZgłaszaj wszystkie znalezione problemy na Mindustry Github lub Discord. mods.alphainfo = Pamiętaj, że mody są wersji alpha, i[scarlet] mogą być pełne błędów[].\nZgłaszaj wszystkie znalezione problemy na Mindustry GitHub lub Discord.
mods.alpha = [scarlet](Alpha) mods.alpha = [scarlet](Alpha)
mods = Mody mods = Mody
mods.none = [LIGHT_GRAY]Nie znaleziono modów! mods.none = [LIGHT_GRAY]Nie znaleziono modów!
mods.guide = Modding Guide mods.guide = Poradnik do modów
mods.report = Report Bug mods.report = Zgłoś Błąd
mods.openfolder = Open Mod Folder mods.openfolder = Otwórz folder z modami
mod.enabled = [lightgray]Włączony mod.enabled = [lightgray]Włączony
mod.disabled = [scarlet]Wyłączony mod.disabled = [scarlet]Wyłączony
mod.disable = Disable mod.disable = Wyłącz
mod.delete.error = Unable to delete mod. File may be in use. mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu.
mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.missingdependencies = [scarlet]Brakujące zależności: {0}
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony.
mod.enable = Enable mod.enable = Włącz
mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda. mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Wymagany restart
mod.import = Importuj Mod mod.import = Importuj Mod
mod.import.github = Import Github Mod mod.import.github = Importuj mod z GitHuba
mod.remove.confirm = Ten mod zostanie usunięty. mod.remove.confirm = Ten mod zostanie usunięty.
mod.author = [LIGHT_GRAY]Autor:[] {0} mod.author = [LIGHT_GRAY]Autor:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = Ten zapis zawiera mody, które zostały niedawno zaktualizowane, bądź nie są już zainstalowane. Zapis może zostać uszkodzony. Czy jesteś pewien, że chcesz go załadować?\n[lightgray]Mody:\n{0}
mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.preview.missing = Przed opublikowaniem tego moda na Warsztacie musisz dodać zdjęcie podglądowe.\nDodaj zdjęcie o nazwie[accent] preview.png[] do folderu moda i spróbuj jeszcze raz.
mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę bądź załaduj ponownie mody.
about.button = O Grze about.button = O Grze
name = Nazwa: name = Nazwa:
noname = Najpierw wybierz [accent]nazwę gracza[] noname = Najpierw wybierz [accent]nazwę gracza[]
@@ -125,7 +125,7 @@ server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację. server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację.
server.kicked.banned = Zostałeś zbanowany na tym serwerze. server.kicked.banned = Zostałeś zbanowany na tym serwerze.
server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry. server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry.
server.kicked.playerLimit = Serwer pełny. Poczekaj na wolny slot. server.kicked.playerLimit = Serwer pełny. Poczekaj na wolne miejsce.
server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem. server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze. server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze.
server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa. server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
@@ -133,8 +133,8 @@ server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję. server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
server.kicked.gameover = Koniec gry! server.kicked.gameover = Koniec gry!
server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[] server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[]
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci. host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKażdy w tej samej sieci [LIGHT_GRAY]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci.
join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP. join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP.
hostserver = Stwórz Serwer hostserver = Stwórz Serwer
invitefriends = Zaproś Znajomych invitefriends = Zaproś Znajomych
hostserver.mobile = Hostuj\nGrę hostserver.mobile = Hostuj\nGrę
@@ -217,7 +217,7 @@ warning = Uwaga.
confirm = Potwierdź confirm = Potwierdź
delete = Usuń delete = Usuń
view.workshop = Pokaż w Warsztacie view.workshop = Pokaż w Warsztacie
workshop.listing = Edit Workshop Listing workshop.listing = Edytuj pozycję w Warsztacie
ok = OK ok = OK
open = Otwórz open = Otwórz
customize = Dostosuj customize = Dostosuj
@@ -237,10 +237,10 @@ quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zost
loading = [accent]Ładowanie... loading = [accent]Ładowanie...
reloading = [accent]Reloading Mods... reloading = [accent]Reloading Mods...
saving = [accent]Zapisywanie... saving = [accent]Zapisywanie...
cancelbuilding = [accent][[{0}][] to clear plan cancelbuilding = [accent][[{0}][] by wyczyścić plan
selectschematic = [accent][[{0}][] to select+copy selectschematic = [accent][[{0}][] by wybrać+skopiować
pausebuilding = [accent][[{0}][] to pause building pausebuilding = [accent][[{0}][] by wtrzymać budowę
resumebuilding = [scarlet][[{0}][] to resume building resumebuilding = [scarlet][[{0}][] by kontynuować budowę
wave = [accent]Fala {0} wave = [accent]Fala {0}
wave.waiting = Fala za {0} wave.waiting = Fala za {0}
wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie
@@ -259,18 +259,18 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdz
map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze. map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze.
map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze. map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze.
map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy.
workshop.update = Update Item workshop.update = Aktualizuj pozycję
workshop.error = Error fetching workshop details: {0} workshop.error = Błąd podczas wczytywania szczegółów z Warsztatu: {0}
map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! map.publish.confirm = Czy jesteś pewien, że chcesz opublikować tę mapę?\n\n[lightgray]Najpierw upewnij się, że zgadzasz się z umową EULA Warsztatu, w przeciwnym razie twoje mapy nie będą widoczne!
workshop.menu = Select what you would like to do with this item. workshop.menu = Wybierz co chcesz zrobić z tą pozycją.
workshop.info = Item Info workshop.info = Informacja o pozycji
changelog = Changelog (optional): changelog = Historia aktualizacji (opcjonalna):
eula = Steam EULA eula = Umowa EULA Steam
missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. missing = Ta pozycja została przeniesiona bądź usunięta.\n[lightgray]Pozycja na Warsztacie została automatycznie odłączona.
publishing = [accent]Publishing... publishing = [accent]Trwa publikowanie...
publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.confirm = Czy jesteś pewien, że chcesz to opublikować?\n\n[lightgray]Najpierw upewnij się, że zgadzasz się z umową EULA Warsztatu, w przeciwnym razie twoje pozycje nie będą widoczne!
publish.error = Error publishing item: {0} publish.error = Błąd podczas publikowania pozycji: {0}
steam.error = Failed to initialize Steam services.\nError: {0} steam.error = Nie udało się zainicjować serwisów Steam.\nBłąd: {0}
editor.brush = Pędzel editor.brush = Pędzel
editor.openin = Otwórz w Edytorze editor.openin = Otwórz w Edytorze
editor.oregen = Generacja Złóż editor.oregen = Generacja Złóż
@@ -310,7 +310,7 @@ editor.removeunit = Usuń Jednostkę
editor.teams = Drużyny editor.teams = Drużyny
editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0} editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0}
editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0} editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0}
editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze. editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszerzenia, spodziewając się, że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze.
editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany. editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany.
editor.errornot = To nie jest plik mapy. editor.errornot = To nie jest plik mapy.
editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony. editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony.
@@ -357,7 +357,7 @@ toolmode.square = Kwadrat
toolmode.square.description = Kwadratowy pędzel. toolmode.square.description = Kwadratowy pędzel.
toolmode.eraseores = Wymaż Rudy toolmode.eraseores = Wymaż Rudy
toolmode.eraseores.description = Usuń tylko rudy. toolmode.eraseores.description = Usuń tylko rudy.
toolmode.fillteams = Wypełń Drużyny toolmode.fillteams = Wypełnij Drużyny
toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków. toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków.
toolmode.drawteams = Rysuj Drużyny toolmode.drawteams = Rysuj Drużyny
toolmode.drawteams.description = Rysuj drużyny zamiast bloków. toolmode.drawteams.description = Rysuj drużyny zamiast bloków.
@@ -411,9 +411,9 @@ abandon = Opuść
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników.
locked = Zablokowane locked = Zablokowane
complete = [LIGHT_GRAY]Ukończone: complete = [LIGHT_GRAY]Ukończone:
requirement.wave = Reach Wave {0} in {1} requirement.wave = Osiągnij falę {0} w {1}
requirement.core = Destroy Enemy Core in {0} requirement.core = Zniszcz Rdzeń wroga w {0}
requirement.unlock = Unlock {0} requirement.unlock = Odblokuj {0}
resume = Kontynuuj Strefę:\n[LIGHT_GRAY]{0} resume = Kontynuuj Strefę:\n[LIGHT_GRAY]{0}
bestwave = [LIGHT_GRAY]Najwyższa fala: {0} bestwave = [LIGHT_GRAY]Najwyższa fala: {0}
launch = < WYSTRZEL > launch = < WYSTRZEL >
@@ -424,13 +424,13 @@ launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie
launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal. launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal.
uncover = Odkryj uncover = Odkryj
configure = Skonfiguruj Ładunek configure = Skonfiguruj Ładunek
bannedblocks = Banned Blocks bannedblocks = Zabronione bloki
addall = Add All addall = Dodaj wszystkie
configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek. configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek.
configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}.
zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana. zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana.
zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione.
zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.config.unlocked = Ładunek odblokowany:[lightgray]\n{0}
zone.resources = Wykryte Zasoby: zone.resources = Wykryte Zasoby:
zone.objective = [lightgray]Cel: [accent]{0} zone.objective = [lightgray]Cel: [accent]{0}
zone.objective.survival = Przeżyj zone.objective.survival = Przeżyj
@@ -487,8 +487,8 @@ settings.cleardata = Wyczyść Dane Gry...
settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu!
settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się.
paused = [accent]< Wstrzymano > paused = [accent]< Wstrzymano >
clear = Clear clear = Wyczyść
banned = [scarlet]Banned banned = [scarlet]Zbanowano
yes = Tak yes = Tak
no = Nie no = Nie
info.title = Informacje info.title = Informacje
@@ -597,7 +597,7 @@ setting.difficulty.normal = Normalny
setting.difficulty.hard = Trudny setting.difficulty.hard = Trudny
setting.difficulty.insane = Szalony setting.difficulty.insane = Szalony
setting.difficulty.name = Poziom trudności setting.difficulty.name = Poziom trudności
setting.screenshake.name = Trzęsienie się ekranu setting.screenshake.name = Wstrząsy ekranu
setting.effects.name = Wyświetlanie efektów setting.effects.name = Wyświetlanie efektów
setting.destroyedblocks.name = Display Destroyed Blocks setting.destroyedblocks.name = Display Destroyed Blocks
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
@@ -623,7 +623,7 @@ setting.chatopacity.name = Przezroczystość czatu
setting.lasersopacity.name = Przezroczystość laserów zasilających setting.lasersopacity.name = Przezroczystość laserów zasilających
setting.playerchat.name = Wyświetlaj czat w grze setting.playerchat.name = Wyświetlaj czat w grze
public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej. public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej.
public.beta = Note that beta versions of the game cannot make public lobbies. public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi.
uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[] uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
uiscale.cancel = Anuluj i Wyjdź uiscale.cancel = Anuluj i Wyjdź
setting.bloom.name = Bloom setting.bloom.name = Bloom
@@ -631,20 +631,20 @@ keybind.title = Zmień
keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane. keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
category.general.name = Ogólne category.general.name = Ogólne
category.view.name = Wyświetl category.view.name = Wyświetl
category.multiplayer.name = Multiplayer category.multiplayer.name = Wielu graczy
command.attack = Atakuj command.attack = Atakuj
command.rally = Zbierz command.rally = Zbierz
command.retreat = Wycofaj command.retreat = Wycofaj
keybind.clear_building.name = Clear Building keybind.clear_building.name = Wyczyść budynek
keybind.press = Naciśnij wybrany klawisz... keybind.press = Naciśnij wybrany klawisz...
keybind.press.axis = Naciśnij oś lub klawisz... keybind.press.axis = Naciśnij oś lub klawisz...
keybind.screenshot.name = Zrzut ekranu mapy keybind.screenshot.name = Zrzut ekranu mapy
keybind.move_x.name = Poruszanie w poziomie keybind.move_x.name = Poruszanie w poziomie
keybind.move_y.name = Poruszanie w pionie keybind.move_y.name = Poruszanie w pionie
keybind.schematic_select.name = Select Region keybind.schematic_select.name = Wybierz region
keybind.schematic_menu.name = Schematic Menu keybind.schematic_menu.name = Menu schematów
keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_x.name = Obróć schemat horyzontalnie
keybind.schematic_flip_y.name = Flip Schematic Y keybind.schematic_flip_y.name = Obróć schemat wertykalnie
keybind.fullscreen.name = Przełącz Pełny Ekran keybind.fullscreen.name = Przełącz Pełny Ekran
keybind.select.name = Zaznacz keybind.select.name = Zaznacz
keybind.diagonal_placement.name = Budowa po skosie keybind.diagonal_placement.name = Budowa po skosie
@@ -656,7 +656,7 @@ keybind.zoom_hold.name = Inicjator przybliżania
keybind.zoom.name = Przybliżanie keybind.zoom.name = Przybliżanie
keybind.menu.name = Menu keybind.menu.name = Menu
keybind.pause.name = Pauza keybind.pause.name = Pauza
keybind.pause_building.name = Pause/Resume Building keybind.pause_building.name = Wstrzymaj/kontynuuj budowę
keybind.minimap.name = Minimapa keybind.minimap.name = Minimapa
keybind.dash.name = Przyspieszenie keybind.dash.name = Przyspieszenie
keybind.chat.name = Czat keybind.chat.name = Czat
@@ -855,7 +855,7 @@ block.duo.name = Podwójne Działko
block.scorch.name = Płomień block.scorch.name = Płomień
block.scatter.name = Flak block.scatter.name = Flak
block.hail.name = Grad block.hail.name = Grad
block.lancer.name = Lancer block.lancer.name = Lansjer
block.conveyor.name = Przenośnik block.conveyor.name = Przenośnik
block.titanium-conveyor.name = Przenośnik Tytanowy block.titanium-conveyor.name = Przenośnik Tytanowy
block.armored-conveyor.name = Przenośnik Opancerzony block.armored-conveyor.name = Przenośnik Opancerzony
@@ -864,7 +864,7 @@ block.junction.name = Węzeł
block.router.name = Rozdzielacz block.router.name = Rozdzielacz
block.distributor.name = Dystrybutor block.distributor.name = Dystrybutor
block.sorter.name = Sortownik block.sorter.name = Sortownik
block.inverted-sorter.name = Inverted Sorter block.inverted-sorter.name = Odwrotny Sortownik
block.message.name = Wiadomość block.message.name = Wiadomość
block.overflow-gate.name = Brama Przepełnieniowa block.overflow-gate.name = Brama Przepełnieniowa
block.silicon-smelter.name = Huta Krzemu block.silicon-smelter.name = Huta Krzemu
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Enviando ficheiro de pré-visualização
committingchanges = Enviando mudanças committingchanges = Enviando mudanças
done = Feito done = Feito
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Ativar
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Importar Mod mod.import = Importar Mod
mod.import.github = Importar Mod da Github mod.import.github = Importar Mod da GitHub
mod.remove.confirm = Este mod irá ser apagado. mod.remove.confirm = Este mod irá ser apagado.
mod.author = [LIGHT_GRAY]Autor:[] {0} mod.author = [LIGHT_GRAY]Autor:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+129 -129
View File
@@ -1,43 +1,43 @@
credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits.text = Criado por [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
credits = Créditos credits = Créditos
contributors = Tradutores e contribuidores contributors = Tradutores e contribuidores
discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês) discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês)
link.discord.description = O discord oficial do Mindustry link.discord.description = O discord oficial do Mindustry
link.reddit.description = The Mindustry subreddit link.reddit.description = O subreddit do Mindustry
link.github.description = Código fonte do jogo. link.github.description = Código fonte do jogo.
link.changelog.description = Lista de mudanças da atualização link.changelog.description = Lista de mudanças da atualização
link.dev-builds.description = Desenvolvimentos Instáveis link.dev-builds.description = Desenvolvimentos instáveis
link.trello.description = Trello Oficial para Updates Planejados link.trello.description = Trello oficial para atualizações planejadas
link.itch.io.description = Pagina da Itch.io com os Downloads link.itch.io.description = Página da Itch.io com os downloads
link.google-play.description = Listamento do google play store link.google-play.description = Página da google play store
link.wiki.description = Wiki oficial do Mindustry link.wiki.description = Wiki oficial do Mindustry
linkfail = Falha ao abrir o link\nO Url foi copiado linkfail = Falha ao abrir o link\nO Url foi copiado
screenshot = Screenshot salvo para {0} screenshot = Screenshot salvo para {0}
screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura. screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura de tela.
gameover = O núcleo foi destruído. gameover = O núcleo foi destruído.
gameover.pvp = O time[accent] {0}[] ganhou! gameover.pvp = O time[accent] {0}[] ganhou!
highscore = [YELLOW]Novo recorde! highscore = [YELLOW]Novo recorde!
copied = Copied. copied = Copiado
load.sound = Sons load.sound = Sons
load.map = Mapas load.map = Mapas
load.image = Imagens load.image = Imagens
load.content = Conteúdo load.content = Conteúdo
load.system = Sistema load.system = Sistema
load.mod = Mods load.mod = Mods
schematic = Schematic schematic = Esquema
schematic.add = Save Schematic... schematic.add = Salvar Esquema...
schematics = Schematics schematics = Esquemas
schematic.replace = A schematic by that name already exists. Replace it? schematic.replace = Um Esquema com esse nome existe. Substituí-lo?
schematic.import = Import Schematic... schematic.import = Importar Esquema...
schematic.exportfile = Export File schematic.exportfile = Exportar arquivo
schematic.importfile = Import File schematic.importfile = Importar arquivo
schematic.browseworkshop = Browse Workshop schematic.browseworkshop = Navegar pela Oficina
schematic.copy = Copy to Clipboard schematic.copy = Copiar para a área de transferência
schematic.copy.import = Import from Clipboard schematic.copy.import = Importar da área de transferência
schematic.shareworkshop = Share on Workshop schematic.shareworkshop = Compartilhar na Oficina
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema
schematic.saved = Schematic saved. schematic.saved = Esquema salvo.
schematic.delete.confirm = This schematic will be utterly eradicated. schematic.delete.confirm = Esse Esquema será totalmente erradicado.
schematic.rename = Rename Schematic schematic.rename = Rename Schematic
schematic.info = {0}x{1}, {2} blocks schematic.info = {0}x{1}, {2} blocks
stat.wave = Hordas derrotadas:[accent] {0} stat.wave = Hordas derrotadas:[accent] {0}
@@ -46,9 +46,9 @@ stat.built = Construções construídas:[accent] {0}
stat.destroyed = Construções destruídas:[accent] {0} stat.destroyed = Construções destruídas:[accent] {0}
stat.deconstructed = Construções desconstruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0}
stat.delivered = Recursos lançados: stat.delivered = Recursos lançados:
stat.rank = Rank Final: [accent]{0} stat.rank = Classificação Final: [accent]{0}
launcheditems = [accent]Itens lançados launcheditems = [accent]Itens lançados
launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. launchinfo = [unlaunched][[LANCE] seu núcleo para obter os itens indicados em azul.
map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"?
level.highscore = Melhor\npontuação: [accent] {0} level.highscore = Melhor\npontuação: [accent] {0}
level.select = Seleção de Fase level.select = Seleção de Fase
@@ -56,11 +56,11 @@ level.mode = Modo de Jogo:
showagain = Não mostrar na proxima sessão showagain = Não mostrar na proxima sessão
coreattack = < O núcleo está sobre ataque! > coreattack = < O núcleo está sobre ataque! >
nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE
database = banco do núcleo database = Banco de dados
savegame = Salvar Jogo savegame = Salvar Jogo
loadgame = Carregar Jogo loadgame = Carregar Jogo
joingame = Entrar no Jogo joingame = Entrar no Jogo
customgame = Jogo Customi-/nzado customgame = Jogo Customi-\nzado
newgame = Novo Jogo newgame = Novo Jogo
none = <nenhum> none = <nenhum>
minimap = Mini-Mapa minimap = Mini-Mapa
@@ -77,63 +77,63 @@ invalid = Inválido
preparingconfig = Preparando configuração preparingconfig = Preparando configuração
preparingcontent = Preparando conteúdo preparingcontent = Preparando conteúdo
uploadingcontent = Fazendo upload do conteúdo uploadingcontent = Fazendo upload do conteúdo
uploadingpreviewfile = Fazendo upload do arquivo de pré visualização uploadingpreviewfile = Fazendo upload do arquivo de pré-visualização
committingchanges = Enviando mudanças committingchanges = Enviando mudanças
done = Feito done = Feito
feature.unsupported = Your device does not support this feature. feature.unsupported = Seu dispositivo não suporta essa função.
mods.alphainfo = Mantenha em mente que os mods estão em Alpha, e[scarlet] talvez sejam bem bugados[].\nReporte quaisquer problemas no Discord ou Github do Mindustry. mods.alphainfo = Mantenha em mente que os mods estão em Alpha, e[scarlet] talvez sejam bem bugados[].\nReporte quaisquer problemas no Discord ou GitHub do Mindustry.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]Nenhum Mod encontrado!
mods.guide = Modding Guide mods.guide = Guia de Mods
mods.report = Report Bug mods.report = Reportar um Bug
mods.openfolder = Open Mod Folder mods.openfolder = Abrir pasta de Mods
mod.enabled = [lightgray]Enabled mod.enabled = [lightgray]Ativado
mod.disabled = [scarlet]Disabled mod.disabled = [scarlet]Desativado
mod.disable = Disable mod.disable = Desativar
mod.delete.error = Unable to delete mod. File may be in use. mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso.
mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.missingdependencies = [scarlet]Dependências ausentes: {0}
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes :[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente.
mod.enable = Enable mod.enable = Ativar
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Recarregamento necessário
mod.import = Import Mod mod.import = Importar Mod
mod.import.github = Import Github Mod mod.import.github = Importar Mod do GitHub
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = Esse Mod será deletado.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. O jogo salvo pode se corromper. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0}
mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.preview.missing = Antes de publicar esse mod na Oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do Mod e tente novamente.
mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. mod.folder.missing = Somente Mods no formato de pasta serão publicados na Oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os Mods.
about.button = Sobre about.button = Sobre
name = Nome: name = Nome:
noname = Escolha[accent] um nome[] primeiro. noname = Escolha[accent] um nome[] primeiro.
filename = Nome do arquivo: filename = Nome do arquivo:
unlocked = Novo bloco Desbloqueado! unlocked = Novo bloco desbloqueado!
completed = [accent]Completado completed = [accent]Completado
techtree = Árvore de tecnologia techtree = Árvore de tecnologia
research.list = [LIGHT_GRAY]Pesquise: research.list = [LIGHT_GRAY]Pesquise:
research = Pesquisa research = Pesquisar
researched = [LIGHT_GRAY]{0} pesquisado. researched = [LIGHT_GRAY]{0} Pesquisado.
players = {0} Jogadores Ativos players = {0} Jogadores Ativos
players.single = {0} Jogador Ativo players.single = {0} Jogador Ativo
server.closing = [accent]Fechando servidor... server.closing = [accent]Fechando servidor...
server.kicked.kick = Voce foi expulso do servidor! server.kicked.kick = Você foi expulso do servidor!
server.kicked.whitelist = Você não está na lista branca do servidor. server.kicked.whitelist = Você não está na lista branca do servidor.
server.kicked.serverClose = Servidor Fechado. server.kicked.serverClose = Servidor Fechado.
server.kicked.vote = Você foi expulso desse servidor. Adeus. server.kicked.vote = Você foi expulso desse servidor. Adeus.
server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo!
server.kicked.serverOutdated = Servidor desatualiado! Peça ao dono para atualizar! server.kicked.serverOutdated = Servidor desatualizado! Peça ao dono para atualizar!
server.kicked.banned = Você foi banido do servidor. server.kicked.banned = Você foi banido do servidor.
server.kicked.typeMismatch = Este servidor não é compatível com a sua versão. server.kicked.typeMismatch = Este servidor não é compatível com a sua versão.
server.kicked.playerLimit = Este servidor está cheio. Espere por uma vaga. server.kicked.playerLimit = Este servidor está cheio. Espere por uma vaga.
server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para conectar de novo. server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para se conectar de novo.
server.kicked.nameInUse = Este nome já está sendo usado\nneste servidor. server.kicked.nameInUse = Este nome já está sendo usado\nneste servidor.
server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome. server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome.
server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido.
server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original.
server.kicked.gameover = Fim de jogo! server.kicked.gameover = Fim de jogo!
server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[]
host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguém esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall
join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião.
hostserver = Hospedar servidor hostserver = Hospedar servidor
invitefriends = Convidar amigos invitefriends = Convidar amigos
@@ -201,8 +201,8 @@ save.newslot = Nome do salvamento:
save.rename = Renomear save.rename = Renomear
save.rename.text = Novo jogo: save.rename.text = Novo jogo:
selectslot = Selecione um lugar para salvar. selectslot = Selecione um lugar para salvar.
slot = [accent]Slot {0} slot = [accent]Conexões {0}
editmessage = Edit Message editmessage = Editar Mensagem
save.corrupted = [accent]Arquivo corrompido ou inválido! save.corrupted = [accent]Arquivo corrompido ou inválido!
empty = <vazio> empty = <vazio>
on = Ligado on = Ligado
@@ -216,8 +216,8 @@ save.playtime = Tempo De Jogo: {0}
warning = Aviso. warning = Aviso.
confirm = Confirmar confirm = Confirmar
delete = Excluir delete = Excluir
view.workshop = Ver na oficina view.workshop = Ver na Oficina
workshop.listing = Edit Workshop Listing workshop.listing = Editar a lista da Oficina
ok = OK ok = OK
open = Abrir open = Abrir
customize = Customizar customize = Customizar
@@ -235,12 +235,12 @@ classic.export.text = [accent]Mindustry[] acabou de ter uma grande atualização
quit.confirm = Você tem certeza que quer sair? quit.confirm = Você tem certeza que quer sair?
quit.confirm.tutorial = Você tem certeza você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] quit.confirm.tutorial = Você tem certeza você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[]
loading = [accent]Carregando... loading = [accent]Carregando...
reloading = [accent]Reloading Mods... reloading = [accent]Recarregando Mods...
saving = [accent]Salvando... saving = [accent]Salvando...
cancelbuilding = [accent][[{0}][] to clear plan cancelbuilding = [accent][[{0}][] para cancelar a construção
selectschematic = [accent][[{0}][] to select+copy selectschematic = [accent][[{0}][] para selecionar+copiar
pausebuilding = [accent][[{0}][] to pause building pausebuilding = [accent][[{0}][] para parar a construção
resumebuilding = [scarlet][[{0}][] to resume building resumebuilding = [scarlet][[{0}][] para continuar a construção
wave = [accent]Horda {0} wave = [accent]Horda {0}
wave.waiting = Horda em {0} wave.waiting = Horda em {0}
wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso
@@ -259,18 +259,18 @@ map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicio
map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor. map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor.
map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor. map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor.
map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto.
workshop.update = Update Item workshop.update = Atualizar Item
workshop.error = Error fetching workshop details: {0} workshop.error = Erro buscando os detalhes da Oficina: {0}
map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados!
workshop.menu = Select what you would like to do with this item. workshop.menu = Selecione oquê você gostaria de fazer com esse Item.
workshop.info = Item Info workshop.info = Informação do Item
changelog = Changelog (optional): changelog = Changelog (optional):
eula = EULA do Steam eula = EULA da Steam
missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked.
publishing = [accent]Publishing... publishing = [accent]Publishing...
publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.confirm = você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer!
publish.error = Error publishing item: {0} publish.error = Erro publicando o Item: {0}
steam.error = Failed to initialize Steam services.\nError: {0} steam.error = Falha em iniciar os serviços da Steam.\nError: {0}
editor.brush = Pincel editor.brush = Pincel
editor.openin = Abrir no Editor editor.openin = Abrir no Editor
editor.oregen = Geração de minério editor.oregen = Geração de minério
@@ -283,7 +283,7 @@ editor.waves = Hordas:
editor.rules = Regras: editor.rules = Regras:
editor.generation = Geração: editor.generation = Geração:
editor.ingame = Editar em jogo editor.ingame = Editar em jogo
editor.publish.workshop = Publicar na oficina editor.publish.workshop = Publicar na Oficina
editor.newmap = Novo mapa editor.newmap = Novo mapa
workshop = Oficina workshop = Oficina
waves.title = Hordas waves.title = Hordas
@@ -294,7 +294,7 @@ waves.waves = Hordas(s)
waves.perspawn = por spawn waves.perspawn = por spawn
waves.to = para waves.to = para
waves.boss = Chefe waves.boss = Chefe
waves.preview = Pré visualizar waves.preview = Pré-visualizar
waves.edit = Editar... waves.edit = Editar...
waves.copy = Copiar para área de transferência waves.copy = Copiar para área de transferência
waves.load = Carregar da área de transferência waves.load = Carregar da área de transferência
@@ -396,13 +396,13 @@ width = Largura:
height = Altura: height = Altura:
menu = Menu menu = Menu
play = Jogar play = Jogar
campaign = Campa-/nnha campaign = Campa-\nnha
load = Carregar load = Carregar
save = Salvar save = Salvar
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito.
settings = Configu-/nrações settings = Configu-\nrações
tutorial = Tutorial tutorial = Tutorial
tutorial.retake = Refazer Tutorial tutorial.retake = Refazer Tutorial
editor = Editor editor = Editor
@@ -411,9 +411,9 @@ abandon = Abandonar
abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo.
locked = Trancado locked = Trancado
complete = [LIGHT_GRAY]Completo: complete = [LIGHT_GRAY]Completo:
requirement.wave = Reach Wave {0} in {1} requirement.wave = Alcançar a Horda {0} em {1}
requirement.core = Destroy Enemy Core in {0} requirement.core = Destruir o núcleo inimigo em {0}
requirement.unlock = Unlock {0} requirement.unlock = Desbloquear {0}
resume = Resumir Zona:\n[LIGHT_GRAY]{0} resume = Resumir Zona:\n[LIGHT_GRAY]{0}
bestwave = [LIGHT_GRAY]Melhor: {0} bestwave = [LIGHT_GRAY]Melhor: {0}
launch = Lançar launch = Lançar
@@ -425,18 +425,18 @@ launch.skip.confirm = Se você pular a horda agora, você não será capaz de la
uncover = Descobrir uncover = Descobrir
configure = Configurar carregamento configure = Configurar carregamento
bannedblocks = Blocos Banidos bannedblocks = Blocos Banidos
addall = Add All addall = Adicionar Todos
configure.locked = [LIGHT_GRAY]Alcançe a horda {0}\npara configurar o carregamento. configure.locked = [LIGHT_GRAY]Alcançe a horda {0}\npara configurar o carregamento.
configure.invalid = A quantidade deve ser um número entre 0 e {0}. configure.invalid = A quantidade deve ser um número entre 0 e {0}.
zone.unlocked = [LIGHT_GRAY]{0} Desbloqueado. zone.unlocked = [LIGHT_GRAY]{0} Desbloqueado.
zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada.
zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.config.unlocked = Equipamento desbloqueado:[lightgray]\n{0}
zone.resources = Recursos detectados: zone.resources = Recursos detectados:
zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective = [lightgray]Objetivo: [accent]{0}
zone.objective.survival = Sobreviver zone.objective.survival = Sobreviver
zone.objective.attack = Destruir o núcleo inimigo zone.objective.attack = Destruir o núcleo inimigo
add = Adicionar... add = Adicionar...
boss.health = Saúde do chefe boss.health = Vida do chefe
connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} connectfail = [crimson]Falha ao entrar no servidor: [accent]{0}
error.unreachable = Servidor inalcançável. error.unreachable = Servidor inalcançável.
error.invalidaddress = Endereço inválido. error.invalidaddress = Endereço inválido.
@@ -475,7 +475,7 @@ zone.nuclearComplex.description = Uma antiga instalação para produção e proc
zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos. zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos.
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Linguagem settings.language = Idioma
settings.data = Dados do jogo settings.data = Dados do jogo
settings.reset = Restaurar Padrões settings.reset = Restaurar Padrões
settings.rebind = Religar settings.rebind = Religar
@@ -485,7 +485,7 @@ settings.sound = Som
settings.graphics = Gráficos settings.graphics = Gráficos
settings.cleardata = Apagar dados... settings.cleardata = Apagar dados...
settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito!
settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, Incluindo jogos salvos, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente.
paused = Pausado paused = Pausado
clear = Clear clear = Clear
banned = [scarlet]Banido banned = [scarlet]Banido
@@ -501,10 +501,10 @@ block.unknown = [LIGHT_GRAY]???
blocks.powercapacity = Capacidade de Energia blocks.powercapacity = Capacidade de Energia
blocks.powershot = Energia/tiro blocks.powershot = Energia/tiro
blocks.damage = Dano blocks.damage = Dano
blocks.targetsair = Mirar no ar blocks.targetsair = Mira no ar
blocks.targetsground = Mirar no chão blocks.targetsground = Mira no chão
blocks.itemsmoved = Velocidade de movimento blocks.itemsmoved = Velocidade de movimento
blocks.launchtime = Tempo entre tiros blocks.launchtime = Tempo entre Disparos.
blocks.shootrange = Alcance blocks.shootrange = Alcance
blocks.size = Tamanho blocks.size = Tamanho
blocks.liquidcapacity = Capacidade de Líquido blocks.liquidcapacity = Capacidade de Líquido
@@ -519,8 +519,8 @@ blocks.repairtime = Tempo de reparo total do bloco
blocks.speedincrease = Aumento de velocidade blocks.speedincrease = Aumento de velocidade
blocks.range = Distância blocks.range = Distância
blocks.drilltier = Furáveis blocks.drilltier = Furáveis
blocks.drillspeed = Velocidade da broca base blocks.drillspeed = Velocidade base da Broca
blocks.boosteffect = Efeito do Boost blocks.boosteffect = Efeito do Impulso
blocks.maxunits = Máximo de unidades ativas blocks.maxunits = Máximo de unidades ativas
blocks.health = Saúde blocks.health = Saúde
blocks.buildtime = Tempo de construção blocks.buildtime = Tempo de construção
@@ -530,8 +530,8 @@ blocks.shots = Tiros
blocks.reload = Tiros por segundo blocks.reload = Tiros por segundo
blocks.ammo = Munição blocks.ammo = Munição
bar.drilltierreq = Broca melhor necessária. bar.drilltierreq = Broca melhor necessária.
bar.drillspeed = Velocidade da broca: {0}/s bar.drillspeed = Velocidade da Broca: {0}/s
bar.pumpspeed = Pump Speed: {0}/s bar.pumpspeed = Velocidade da Bomna: {0}/s
bar.efficiency = Eficiência: {0}% bar.efficiency = Eficiência: {0}%
bar.powerbalance = Energia: {0} bar.powerbalance = Energia: {0}
bar.powerstored = Armazenada: {0}/{1} bar.powerstored = Armazenada: {0}/{1}
@@ -544,7 +544,7 @@ bar.heat = Aquecimento
bar.power = Poder bar.power = Poder
bar.progress = Progresso da construção bar.progress = Progresso da construção
bar.spawned = Unidades: {0}/{1} bar.spawned = Unidades: {0}/{1}
bullet.damage = [stat]{0}[lightgray] dano bullet.damage = [stat]{0}[lightgray] Dano
bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos
bullet.incendiary = [stat]Incendiário bullet.incendiary = [stat]Incendiário
bullet.homing = [stat]Guiado bullet.homing = [stat]Guiado
@@ -578,7 +578,7 @@ setting.landscape.name = Travar panorama
setting.shadows.name = Sombras setting.shadows.name = Sombras
setting.blockreplace.name = Automatic Block Suggestions setting.blockreplace.name = Automatic Block Suggestions
setting.linear.name = Filtragem linear setting.linear.name = Filtragem linear
setting.hints.name = Hints setting.hints.name = Dicas
setting.animatedwater.name = Água animada setting.animatedwater.name = Água animada
setting.animatedshields.name = Escudos animados setting.animatedshields.name = Escudos animados
setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[]
@@ -599,10 +599,10 @@ setting.difficulty.insane = Insano
setting.difficulty.name = Dificuldade setting.difficulty.name = Dificuldade
setting.screenshake.name = Balanço da Tela setting.screenshake.name = Balanço da Tela
setting.effects.name = Efeitos setting.effects.name = Efeitos
setting.destroyedblocks.name = Display Destroyed Blocks setting.destroyedblocks.name = Mostrar Blocos Destruídos
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.conveyorpathfinding.name = Posicionamento do localizador do Transportador
setting.sensitivity.name = Sensibilidade do Controle setting.sensitivity.name = Sensibilidade do Controle
setting.saveinterval.name = Intervalo de autosalvamento setting.saveinterval.name = Intervalo de Auto Salvamento
setting.seconds = {0} Segundos setting.seconds = {0} Segundos
setting.fullscreen.name = Tela Cheia setting.fullscreen.name = Tela Cheia
setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar)
@@ -610,19 +610,19 @@ setting.fps.name = Mostrar FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace)
setting.minimap.name = Mostrar minimapa setting.minimap.name = Mostrar minimapa
setting.position.name = Show Player Position setting.position.name = Mostrar a posição do Jogador
setting.musicvol.name = Volume da Música setting.musicvol.name = Volume da Música
setting.ambientvol.name = Volume do ambiente setting.ambientvol.name = Volume do Ambiente
setting.mutemusic.name = Desligar Música setting.mutemusic.name = Desligar Música
setting.sfxvol.name = Volume de Efeitos setting.sfxvol.name = Volume de Efeitos
setting.mutesound.name = Desligar Som setting.mutesound.name = Desligar Som
setting.crashreport.name = Enviar denuncias de crash anonimas setting.crashreport.name = Enviar denúncias anônimas de erros
setting.savecreate.name = Criar salvamentos automaticamente setting.savecreate.name = Criar salvamentos automaticamente
setting.publichost.name = Visibilidade do jogo público setting.publichost.name = Visibilidade do jogo público
setting.chatopacity.name = Opacidade do chat setting.chatopacity.name = Opacidade do chat
setting.lasersopacity.name = Power Laser Opacity setting.lasersopacity.name = Opacidade do laser
setting.playerchat.name = Mostrar chat em jogo setting.playerchat.name = Mostrar chat em jogo
public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública.
public.beta = Note that beta versions of the game cannot make public lobbies. public.beta = Note that beta versions of the game cannot make public lobbies.
uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings...
uiscale.cancel = Cancelar e sair uiscale.cancel = Cancelar e sair
@@ -641,10 +641,10 @@ keybind.press.axis = Pressione uma Axis ou tecla...
keybind.screenshot.name = Captura do mapa keybind.screenshot.name = Captura do mapa
keybind.move_x.name = mover_x keybind.move_x.name = mover_x
keybind.move_y.name = mover_y keybind.move_y.name = mover_y
keybind.schematic_select.name = Select Region keybind.schematic_select.name = Selecionar região
keybind.schematic_menu.name = Schematic Menu keybind.schematic_menu.name = Menu de Esquemas
keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_x.name = girar o Esquema X
keybind.schematic_flip_y.name = Flip Schematic Y keybind.schematic_flip_y.name = girar o Esquema Y
keybind.fullscreen.name = Alterar tela cheia keybind.fullscreen.name = Alterar tela cheia
keybind.select.name = selecionar keybind.select.name = selecionar
keybind.diagonal_placement.name = Colocação diagonal keybind.diagonal_placement.name = Colocação diagonal
@@ -652,18 +652,18 @@ keybind.pick.name = Pegar bloco
keybind.break_block.name = Quebrar bloco keybind.break_block.name = Quebrar bloco
keybind.deselect.name = Deselecionar keybind.deselect.name = Deselecionar
keybind.shoot.name = Atirar keybind.shoot.name = Atirar
keybind.zoom_hold.name = segurar_zoom keybind.zoom_hold.name = segurar Zoom
keybind.zoom.name = Zoom keybind.zoom.name = Zoom
keybind.menu.name = Menu keybind.menu.name = Menu
keybind.pause.name = Pausar keybind.pause.name = Pausar
keybind.pause_building.name = Pause/Resume Building keybind.pause_building.name = Parar/Resumir a construção
keybind.minimap.name = Minimapa keybind.minimap.name = Minimapa
keybind.dash.name = Correr keybind.dash.name = Correr
keybind.chat.name = Conversa keybind.chat.name = Conversa
keybind.player_list.name = Lista_de_jogadores keybind.player_list.name = Lista_de_jogadores
keybind.console.name = console keybind.console.name = Console
keybind.rotate.name = Girar keybind.rotate.name = Girar
keybind.rotateplaced.name = Rotate Existing (Hold) keybind.rotateplaced.name = Girar (Segure)
keybind.toggle_menus.name = Ativar menus keybind.toggle_menus.name = Ativar menus
keybind.chat_history_prev.name = Historico do chat anterior keybind.chat_history_prev.name = Historico do chat anterior
keybind.chat_history_next.name = Historico do proximo chat keybind.chat_history_next.name = Historico do proximo chat
@@ -781,11 +781,11 @@ block.rock.name = Rocha
block.snowrock.name = Rocha com neve block.snowrock.name = Rocha com neve
block.snow-pine.name = Pinheiro com neve block.snow-pine.name = Pinheiro com neve
block.shale.name = Xisto block.shale.name = Xisto
block.shale-boulder.name = Pedra de xisto block.shale-boulder.name = Pedra de Xisto
block.moss.name = Musgo block.moss.name = Musgo
block.shrubs.name = Arbusto block.shrubs.name = Arbusto
block.spore-moss.name = Musgo de esporos block.spore-moss.name = Musgo de Esporos
block.shalerocks.name = Rohas de xisto block.shalerocks.name = Rochas de Xisto
block.scrap-wall.name = Muro de sucata block.scrap-wall.name = Muro de sucata
block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-large.name = Muro grande de sucata
block.scrap-wall-huge.name = Muro enorme de sucata block.scrap-wall-huge.name = Muro enorme de sucata
@@ -839,16 +839,16 @@ block.ignarock.name = Rocha ígnea
block.hotrock.name = Rocha quente block.hotrock.name = Rocha quente
block.magmarock.name = Rocha de magma block.magmarock.name = Rocha de magma
block.cliffs.name = Colinas block.cliffs.name = Colinas
block.copper-wall.name = Parede de Cobre block.copper-wall.name = Muro de Cobre
block.copper-wall-large.name = Parede de Cobre Grande block.copper-wall-large.name = Muro de Cobre Grande
block.titanium-wall.name = Parede de titânio block.titanium-wall.name = Muro de Titânio
block.titanium-wall-large.name = Parede de titânio grande block.titanium-wall-large.name = Muro de Titânio grande
block.plastanium-wall.name = Plastanium Wall block.plastanium-wall.name = Muro de Plastânio Grande
block.plastanium-wall-large.name = Large Plastanium Wall block.plastanium-wall-large.name = Muro de Plastânio Grande
block.phase-wall.name = Parede de fase block.phase-wall.name = Muro de Fase
block.phase-wall-large.name = Parde de fase grande block.phase-wall-large.name = Muro de Fase Grande
block.thorium-wall.name = Parede de tório block.thorium-wall.name = Muro de Tório
block.thorium-wall-large.name = Parede de tório grande block.thorium-wall-large.name = Muro de Tório Grande
block.door.name = Porta block.door.name = Porta
block.door-large.name = Porta Grande block.door-large.name = Porta Grande
block.duo.name = Dupla block.duo.name = Dupla
@@ -864,7 +864,7 @@ block.junction.name = Junção
block.router.name = Roteador block.router.name = Roteador
block.distributor.name = Distribuidor block.distributor.name = Distribuidor
block.sorter.name = Ordenador block.sorter.name = Ordenador
block.inverted-sorter.name = Inverted Sorter block.inverted-sorter.name = Ordenador Invertido
block.message.name = Mensagem block.message.name = Mensagem
block.overflow-gate.name = Portão Sobrecarregado block.overflow-gate.name = Portão Sobrecarregado
block.silicon-smelter.name = Fundidora de silicio block.silicon-smelter.name = Fundidora de silicio
@@ -917,7 +917,7 @@ block.pyratite-mixer.name = Misturador de Piratita
block.blast-mixer.name = Misturador de Explosão block.blast-mixer.name = Misturador de Explosão
block.solar-panel.name = Painel Solar block.solar-panel.name = Painel Solar
block.solar-panel-large.name = Painel Solar Grande block.solar-panel-large.name = Painel Solar Grande
block.oil-extractor.name = Extrator de petróleo block.oil-extractor.name = Extrator de Petróleo
block.command-center.name = Centro de comando block.command-center.name = Centro de comando
block.draug-factory.name = Fábrica de drone de mineração Draug block.draug-factory.name = Fábrica de drone de mineração Draug
block.spirit-factory.name = Fábrica de drone de reparo Spirit block.spirit-factory.name = Fábrica de drone de reparo Spirit
@@ -960,12 +960,12 @@ block.container.name = Contâiner
block.launch-pad.name = Plataforma de lançamento block.launch-pad.name = Plataforma de lançamento
block.launch-pad-large.name = Plataforma de lançamento grande block.launch-pad-large.name = Plataforma de lançamento grande
team.blue.name = Azul team.blue.name = Azul
team.crux.name = Vermelho team.crux.name = Vermelha
team.sharded.name = orange team.sharded.name = Estilhaçada
team.orange.name = Laranja team.orange.name = Laranja
team.derelict.name = derelict team.derelict.name = Abandonada
team.green.name = Verde team.green.name = Verde
team.purple.name = Roxo team.purple.name = Roxa
unit.spirit.name = Drone Spirit unit.spirit.name = Drone Spirit
unit.draug.name = Drone minerador Draug unit.draug.name = Drone minerador Draug
unit.phantom.name = Drone Phantom unit.phantom.name = Drone Phantom
@@ -975,7 +975,7 @@ unit.titan.name = Titan
unit.ghoul.name = Bombardeiro Ghoul unit.ghoul.name = Bombardeiro Ghoul
unit.wraith.name = Lutador Wraith unit.wraith.name = Lutador Wraith
unit.fortress.name = Fortaleza unit.fortress.name = Fortaleza
unit.revenant.name = Fantasma unit.revenant.name = Revenã
unit.eruptor.name = Eruptor unit.eruptor.name = Eruptor
unit.chaos-array.name = Arraia do caos unit.chaos-array.name = Arraia do caos
unit.eradicator.name = Erradicador unit.eradicator.name = Erradicador
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Выгрузка файла предпросмотра
committingchanges = Внесение изменений committingchanges = Внесение изменений
done = Готово done = Готово
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и могут содержать много ошибок[]. Докладывайте о любых проблемах, которые Вы найдете в Mindustry Github или Discord. mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и могут содержать много ошибок[]. Докладывайте о любых проблемах, которые Вы найдете в Mindustry GitHub или Discord.
mods.alpha = [accent](Альфа) mods.alpha = [accent](Альфа)
mods = Модификации mods = Модификации
mods.none = [LIGHT_GRAY]Модификации не найдены! mods.none = [LIGHT_GRAY]Модификации не найдены!
@@ -98,7 +98,7 @@ mod.enable = Включить
mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях. mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях.
mod.reloadrequired = [scarlet]Необходим перезапуск mod.reloadrequired = [scarlet]Необходим перезапуск
mod.import = Импортировать модификацию mod.import = Импортировать модификацию
mod.import.github = Импортировать модификацию с Github mod.import.github = Импортировать модификацию с GitHub
mod.remove.confirm = Этот мод будет удалён. mod.remove.confirm = Этот мод будет удалён.
mod.author = [LIGHT_GRAY]Автор:[] {0} mod.author = [LIGHT_GRAY]Автор:[] {0}
mod.missing = Это сохранение содержит модификацию, которое Вы недавно обновили или оно больше не установлено. Может случиться повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.missing = Это сохранение содержит модификацию, которое Вы недавно обновили или оно больше не установлено. Может случиться повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Laddar upp förhandsgranskningsfil
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Klar done = Klar
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes committingchanges = Comitting Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Mods mods = Mods
mods.none = [LIGHT_GRAY]No mods found! mods.none = [LIGHT_GRAY]No mods found!
@@ -98,7 +98,7 @@ mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes. mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod mod.import = Import Mod
mod.import.github = Import Github Mod mod.import.github = Import GitHub Mod
mod.remove.confirm = This mod will be deleted. mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0} mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = Önizleme Dosyası Yükleniyor
committingchanges = Değişiklikler Uygulanıyor committingchanges = Değişiklikler Uygulanıyor
done = Bitti done = Bitti
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Modların alfa aşamasında olduğunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduğunuz sorunları Mindustry Github'ı veya Discord'una bildirin. mods.alphainfo = Modların alfa aşamasında olduğunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduğunuz sorunları Mindustry GitHub'ı veya Discord'una bildirin.
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = Modlar mods = Modlar
mods.none = [LIGHT_GRAY]Hiç mod bulunamadı! mods.none = [LIGHT_GRAY]Hiç mod bulunamadı!
@@ -98,7 +98,7 @@ mod.enable = Etkinleştir
mod.requiresrestart = Oyun mod değişikliklerini uygulamak için kapatılacak. mod.requiresrestart = Oyun mod değişikliklerini uygulamak için kapatılacak.
mod.reloadrequired = [scarlet]Yeniden Yükleme Gerekli mod.reloadrequired = [scarlet]Yeniden Yükleme Gerekli
mod.import = Mod İçeri Aktar mod.import = Mod İçeri Aktar
mod.import.github = Github Modu İçeri Aktar mod.import.github = GitHub Modu İçeri Aktar
mod.remove.confirm = Bu mod silinecek. mod.remove.confirm = Bu mod silinecek.
mod.author = [LIGHT_GRAY]Yayıncı:[] {0} mod.author = [LIGHT_GRAY]Yayıncı:[] {0}
mod.missing = Bu kayıt yakın zamanda güncellediğiniz ya da artık yüklü olmayan modlar içermekte. Kayıt bozulmaları yaşanabilir. Kaydı yüklemek istediğinizden emin misiniz?\n[lightgray]Modlar:\n{0} mod.missing = Bu kayıt yakın zamanda güncellediğiniz ya da artık yüklü olmayan modlar içermekte. Kayıt bozulmaları yaşanabilir. Kaydı yüklemek istediğinizden emin misiniz?\n[lightgray]Modlar:\n{0}
+75 -75
View File
@@ -3,7 +3,7 @@ credits = Творці
contributors = Перекладачі та помічники contributors = Перекладачі та помічники
discord = Приєднуйтесь до Mindustry Discord! discord = Приєднуйтесь до Mindustry Discord!
link.discord.description = Офіційний Discord сервер Mindustry link.discord.description = Офіційний Discord сервер Mindustry
link.reddit.description = Гілка Mindustry на Reddit link.reddit.description = Спільнота Mindustry на Reddit
link.github.description = Вихідний код гри link.github.description = Вихідний код гри
link.changelog.description = Список змін link.changelog.description = Список змін
link.dev-builds.description = Нестабільні версії link.dev-builds.description = Нестабільні версії
@@ -25,17 +25,17 @@ load.content = Зміст
load.system = Система load.system = Система
load.mod = Модифікації load.mod = Модифікації
schematic = Схема schematic = Схема
schematic.add = Зберегти схему... schematic.add = Зберегти схему
schematics = Схеми schematics = Схеми
schematic.replace = Схема з такою ж назвою вже існує. Замінити її? schematic.replace = Схема з такою ж назвою вже існує. Замінити її?
schematic.import = Імпортувати схему... schematic.import = Імпортувати схему
schematic.exportfile = Експортувати файл schematic.exportfile = Експортувати файл
schematic.importfile = Імпортувати файл schematic.importfile = Імпортувати файл
schematic.browseworkshop = Переглянути в Майстерні schematic.browseworkshop = Переглянути в Майстерні
schematic.copy = Копіювати в буфер обміну schematic.copy = Копіювати в буфер обміну
schematic.copy.import = Імпортувати з клавіатури schematic.copy.import = Імпортувати з клавіатури
schematic.shareworkshop = Поширити в Майстерні schematic.shareworkshop = Поширити в Майстерні
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Відобразити схему
schematic.saved = Схема збережена. schematic.saved = Схема збережена.
schematic.delete.confirm = Ця схема буде повністю випалена. schematic.delete.confirm = Ця схема буде повністю випалена.
schematic.rename = Перейменувати схему. schematic.rename = Перейменувати схему.
@@ -48,7 +48,7 @@ stat.deconstructed = Будівель декоструйовано[accent] {0}
stat.delivered = Ресурсів запущено: stat.delivered = Ресурсів запущено:
stat.rank = Фінальний рахунок: [accent]{0} stat.rank = Фінальний рахунок: [accent]{0}
launcheditems = [accent]Запущені предмети launcheditems = [accent]Запущені предмети
launchinfo = [unlaunched][[LAUNCH] ваше ядро для отримання предметів позначено синім кольором. launchinfo = [unlaunched]Натисніть на кнопку «[[ЗАПУСК]», щоб ваше ядро отримало предмети, які виділені синім кольором.
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»? map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
level.highscore = Рекорд: [accent]{0} level.highscore = Рекорд: [accent]{0}
level.select = Вибір мапи level.select = Вибір мапи
@@ -80,25 +80,25 @@ uploadingcontent = Вивантаження вмісту
uploadingpreviewfile = Вивантаження файлу передперегляду uploadingpreviewfile = Вивантаження файлу передперегляду
committingchanges = Здійснення змін committingchanges = Здійснення змін
done = Зроблено done = Зроблено
feature.unsupported = Your device does not support this feature. feature.unsupported = Ваш пристрій не підтримує цю особливість.
mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry GitHub або Discord.
mods.alpha = [scarlet](Альфа) mods.alpha = [scarlet](Альфа)
mods = Модифікації mods = Модифікації
mods.none = [LIGHT_GRAY]Модифікацій не знайдено! mods.none = [LIGHT_GRAY]Модифікацій не знайдено!
mods.guide = Посібник зі створення модифицій mods.guide = Посібник зі створення модифицій
mods.report = Повідомити про ваду mods.report = Повідомити про ваду
mods.openfolder = Open Mod Folder mods.openfolder = Відкрити теку модифікацій
mod.enabled = [lightgray]Увімкнено mod.enabled = [lightgray]Увімкнено
mod.disabled = [scarlet]Вимкнено mod.disabled = [scarlet]Вимкнено
mod.disable = Вимкнути mod.disable = Вимкнути
mod.delete.error = Unable to delete mod. File may be in use. mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.missingdependencies = [scarlet]Відсутні залежності: {0}
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.nowdisabled = [scarlet]Модифікації '{0}' не вистачає залежностей:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буду автоматично вимкнена.
mod.enable = Увімкнути mod.enable = Увімкнути
mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій.
mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.reloadrequired = [scarlet]Потрібно перезавантаження
mod.import = Імпортувати модифікацію mod.import = Імпортувати модифікацію
mod.import.github = Import Github Mod mod.import.github = Імпортувати модификацію з Ґітгаб
mod.remove.confirm = Цю модифікацію буде видалено. mod.remove.confirm = Цю модифікацію буде видалено.
mod.author = [LIGHT_GRAY]Автор:[] {0} mod.author = [LIGHT_GRAY]Автор:[] {0}
mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0}
@@ -229,13 +229,13 @@ data.export = Експортувати дані
data.import = Импортувати дані data.import = Импортувати дані
data.exported = Дані імпортовано. data.exported = Дані імпортовано.
data.invalid = Це не дійсні ігрові дані. data.invalid = Це не дійсні ігрові дані.
data.import.confirm = Імпорт зовнішніх даних видалить[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. data.import.confirm = Імпорт зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється.
classic.export = Експортувати класичні дані classic.export = Експортувати класичні дані
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic? classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic?
quit.confirm = Ви впевнені, що хочете вийти? quit.confirm = Ви впевнені, що хочете вийти?
quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання? quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання?
loading = [accent]Завантаження… loading = [accent]Завантаження…
reloading = [accent]Reloading Mods... reloading = [accent]Перезавантаження модифікацій…
saving = [accent]Збереження… saving = [accent]Збереження…
cancelbuilding = [accent][[{0}][] to clear plan cancelbuilding = [accent][[{0}][] to clear plan
selectschematic = [accent][[{0}][] to select+copy selectschematic = [accent][[{0}][] to select+copy
@@ -259,18 +259,18 @@ map.nospawn = Ця мапа не має жодного ядра для появ
map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]не помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]не помаранчеве[] ядро до цієї мапи в редакторі.
map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]червоне[] ядро до цієї мапи в редакторі. map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]червоне[] ядро до цієї мапи в редакторі.
map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи.
workshop.update = Update Item workshop.update = Оновити предмет
workshop.error = Error fetching workshop details: {0} workshop.error = Помилка при отриманні інформації з Майстерні: {0}
map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Переконайтеся, що спершу ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Переконайтеся, що спершу ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться!
workshop.menu = Select what you would like to do with this item. workshop.menu = Виберіть, що ви хочете зробити з цим предметом.
workshop.info = Item Info workshop.info = Інформація про предмет
changelog = Changelog (optional): changelog = Журнал змін (за бажанням):
eula = Ліцензійна угода eula = Ліцензійна угода
missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано.
publishing = [accent]Publishing... publishing = [accent]Публікація…
publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
publish.error = Error publishing item: {0} publish.error = Сталася помилка при публікації предмета: {0}
steam.error = Failed to initialize Steam services.\nError: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
editor.brush = Пензлик editor.brush = Пензлик
editor.openin = Відкрити в редакторі editor.openin = Відкрити в редакторі
editor.oregen = Генерація руд editor.oregen = Генерація руд
@@ -302,7 +302,7 @@ waves.invalid = Недійсні хвилі у буфері обміну.
waves.copied = Хвилі скопійовані. waves.copied = Хвилі скопійовані.
waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
editor.default = [lightgray]<За замовчуванням> editor.default = [lightgray]<За замовчуванням>
details = Деталі... details = Деталі
edit = Редагувати… edit = Редагувати…
editor.name = Назва: editor.name = Назва:
editor.spawn = Створити бойову одиницю editor.spawn = Створити бойову одиницю
@@ -509,7 +509,7 @@ blocks.shootrange = Діапазон дії
blocks.size = Розмір blocks.size = Розмір
blocks.liquidcapacity = Місткість рідини blocks.liquidcapacity = Місткість рідини
blocks.powerrange = Діапазон передачі енергії blocks.powerrange = Діапазон передачі енергії
blocks.powerconnections = Max Connections blocks.powerconnections = Максимальна кількість з’єднань
blocks.poweruse = Енергії використовує blocks.poweruse = Енергії використовує
blocks.powerdamage = Енергія/урон blocks.powerdamage = Енергія/урон
blocks.itemcapacity = Місткість предметів blocks.itemcapacity = Місткість предметів
@@ -523,17 +523,17 @@ blocks.drillspeed = Базова швидкість буріння
blocks.boosteffect = Прискорювальний ефект blocks.boosteffect = Прискорювальний ефект
blocks.maxunits = Максимальна кількість активних одиниць blocks.maxunits = Максимальна кількість активних одиниць
blocks.health = Здоров’я blocks.health = Здоров’я
blocks.buildtime = Час будівництва blocks.buildtime = Час будування
blocks.buildcost = Вартість будування blocks.buildcost = Вартість будування
blocks.inaccuracy = Розкид blocks.inaccuracy = Розкид
blocks.shots = Постріли blocks.shots = Постріли
blocks.reload = Постріли/секунду blocks.reload = Постріли/секунду
blocks.ammo = Боєприпаси blocks.ammo = Боєприпаси
bar.drilltierreq = Потребується кращий бур bar.drilltierreq = Потребується кращий бур
bar.drillspeed = Швидкість буріння: {0}/с bar.drillspeed = Швидкість буріння: {0} за с.
bar.pumpspeed = Pump Speed: {0}/s bar.pumpspeed = Швидкість викачування: {0} за с.
bar.efficiency = Ефективність: {0}% bar.efficiency = Ефективність: {0}%
bar.powerbalance = Енергія: {0}/с bar.powerbalance = Енергія: {0} за с.
bar.powerstored = Зберігає: {0}/{1} bar.powerstored = Зберігає: {0}/{1}
bar.poweramount = Енергія: {0} bar.poweramount = Енергія: {0}
bar.poweroutput = Вихідна енергія: {0} bar.poweroutput = Вихідна енергія: {0}
@@ -542,7 +542,7 @@ bar.capacity = Місткість: {0}
bar.liquid = Рідина bar.liquid = Рідина
bar.heat = Нагрівання bar.heat = Нагрівання
bar.power = Енергія bar.power = Енергія
bar.progress = Хід будівництва bar.progress = Хід будування
bar.spawned = Бойов. од.: {0}/{1} bar.spawned = Бойов. од.: {0}/{1}
bullet.damage = [stat]{0}[lightgray] шкода bullet.damage = [stat]{0}[lightgray] шкода
bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] блок. bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] блок.
@@ -556,27 +556,27 @@ bullet.tarred = [stat]дьогтьовий
bullet.multiplier = [stat]{0}[lightgray]x патронів bullet.multiplier = [stat]{0}[lightgray]x патронів
bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання
unit.blocks = блоки unit.blocks = блоки
unit.powersecond = одиниць енергії/секунду unit.powersecond = одиниць енергії за секунду
unit.liquidsecond = рідких одиниць/секунду unit.liquidsecond = одиниць рідини за секунду
unit.itemssecond = предметів/секунду unit.itemssecond = предметів за секунду
unit.liquidunits = рідинних одиниць unit.liquidunits = одиниць рідини
unit.powerunits = енергетичних одиниць unit.powerunits = одиниць енергії
unit.degrees = град. unit.degrees = град.
unit.seconds = сек. unit.seconds = с
unit.persecond = /сек unit.persecond = за секунду
unit.timesspeed = x швидкість unit.timesspeed = x швидкість
unit.percent = % unit.percent = %
unit.items = предм. unit.items = предм.
category.general = Загальні category.general = Загальне
category.power = Енергетичні category.power = Енергія
category.liquids = Рідини category.liquids = Рідини
category.items = Предмети category.items = Предмети
category.crafting = Введення/виведення category.crafting = Виробництво
category.shooting = Стрільба category.shooting = Стрільба
category.optional = Додаткові поліпшення category.optional = Додаткові поліпшення
setting.landscape.name = Тільки альбомний(гозинтальний) режим setting.landscape.name = Тільки альбомний(гозинтальний) режим
setting.shadows.name = Тіні setting.shadows.name = Тіні
setting.blockreplace.name = Automatic Block Suggestions setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків
setting.linear.name = Лінійна фільтрація setting.linear.name = Лінійна фільтрація
setting.hints.name = Hints setting.hints.name = Hints
setting.animatedwater.name = Анімована вода setting.animatedwater.name = Анімована вода
@@ -599,18 +599,18 @@ setting.difficulty.insane = Неможлива
setting.difficulty.name = Складність: setting.difficulty.name = Складність:
setting.screenshake.name = Тряска екрану setting.screenshake.name = Тряска екрану
setting.effects.name = Ефекти setting.effects.name = Ефекти
setting.destroyedblocks.name = Display Destroyed Blocks setting.destroyedblocks.name = Показувати зруйновані блоки
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерівConveyor Placement Pathfinding
setting.sensitivity.name = Чутливість контролера setting.sensitivity.name = Чутливість контролера
setting.saveinterval.name = Інтервал збереження setting.saveinterval.name = Інтервал збереження
setting.seconds = {0} сек. setting.seconds = {0} с
setting.fullscreen.name = Повноекранний режим setting.fullscreen.name = Повноекранний режим
setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску) setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску)
setting.fps.name = Показувати FPS setting.fps.name = Показувати FPS і затримку до сервера
setting.vsync.name = Вертикальна синхронізація setting.vsync.name = Вертикальна синхронізація
setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації) setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації)
setting.minimap.name = Показувати міні-мапу setting.minimap.name = Показувати міні-мапу
setting.position.name = Show Player Position setting.position.name = Показувати координати гравця
setting.musicvol.name = Гучність музики setting.musicvol.name = Гучність музики
setting.ambientvol.name = Звуки навколишнього середовища setting.ambientvol.name = Звуки навколишнього середовища
setting.mutemusic.name = Заглушити музику setting.mutemusic.name = Заглушити музику
@@ -635,16 +635,16 @@ category.multiplayer.name = Мережева гра
command.attack = Атакувати command.attack = Атакувати
command.rally = Точка збору command.rally = Точка збору
command.retreat = Відступити command.retreat = Відступити
keybind.clear_building.name = Clear Building keybind.clear_building.name = Очистити план будування
keybind.press = Натисніть клавішу… keybind.press = Натисніть клавішу…
keybind.press.axis = Натисніть клавішу… keybind.press.axis = Натисніть клавішу…
keybind.screenshot.name = Зняток мапи keybind.screenshot.name = Зняток мапи
keybind.move_x.name = Рух по осі x keybind.move_x.name = Рух по осі X
keybind.move_y.name = Рух по осі y keybind.move_y.name = Рух по осі Y
keybind.schematic_select.name = Select Region keybind.schematic_select.name = Вибрати ділянку
keybind.schematic_menu.name = Schematic Menu keybind.schematic_menu.name = Меню схем
keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_x.name = Відобразити по осі X
keybind.schematic_flip_y.name = Flip Schematic Y keybind.schematic_flip_y.name = Відобразити по осі Y
keybind.fullscreen.name = Повноекранний keybind.fullscreen.name = Повноекранний
keybind.select.name = Вибір/Постріл keybind.select.name = Вибір/Постріл
keybind.diagonal_placement.name = Діагональне розміщення keybind.diagonal_placement.name = Діагональне розміщення
@@ -656,14 +656,14 @@ keybind.zoom_hold.name = Керування масштабом
keybind.zoom.name = Приблизити keybind.zoom.name = Приблизити
keybind.menu.name = Меню keybind.menu.name = Меню
keybind.pause.name = Пауза keybind.pause.name = Пауза
keybind.pause_building.name = Pause/Resume Building keybind.pause_building.name = Призупинити/Продовжити будування
keybind.minimap.name = Мінімапа keybind.minimap.name = Мінімапа
keybind.dash.name = Прискоритисяітати keybind.dash.name = Прискоритися & летіітати
keybind.chat.name = Чат keybind.chat.name = Чат
keybind.player_list.name = Список гравців keybind.player_list.name = Список гравців
keybind.console.name = Консоль keybind.console.name = Консоль
keybind.rotate.name = Обертати keybind.rotate.name = Обертати
keybind.rotateplaced.name = Обертати існуюче (утримуйте) keybind.rotateplaced.name = Обертати існуюче (прокручуйте)
keybind.toggle_menus.name = Меню перемикання keybind.toggle_menus.name = Меню перемикання
keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_prev.name = Попередня історія чату
keybind.chat_history_next.name = Наступна історія чату keybind.chat_history_next.name = Наступна історія чату
@@ -695,7 +695,7 @@ rules.unitdamagemultiplier = Множник шкоди бойових одини
rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (блоків) rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (блоків)
rules.respawntime = Час відродження:[lightgray] (sec) rules.respawntime = Час відродження:[lightgray] (sec)
rules.wavespacing = Інтервал хвиль:[lightgray] (sec) rules.wavespacing = Інтервал хвиль:[lightgray] (sec)
rules.buildcostmultiplier = Множник затрат на будівництво rules.buildcostmultiplier = Множник затрат на будування
rules.buildspeedmultiplier = Множник швидкості будування rules.buildspeedmultiplier = Множник швидкості будування
rules.waitForWaveToEnd = Хвилі чекають на ворогів rules.waitForWaveToEnd = Хвилі чекають на ворогів
rules.dropzoneradius = Радіус зони висадки:[lightgray] (блоків) rules.dropzoneradius = Радіус зони висадки:[lightgray] (блоків)
@@ -703,7 +703,7 @@ rules.respawns = Максимальна кількість відроджень
rules.limitedRespawns = Обмеження відроджень rules.limitedRespawns = Обмеження відроджень
rules.title.waves = Хвилі rules.title.waves = Хвилі
rules.title.respawns = Відродження rules.title.respawns = Відродження
rules.title.resourcesbuilding = Ресурси & будівництво rules.title.resourcesbuilding = Ресурси & будування
rules.title.player = Гравці rules.title.player = Гравці
rules.title.enemy = Вороги rules.title.enemy = Вороги
rules.title.unit = Бойов. од. rules.title.unit = Бойов. од.
@@ -836,15 +836,15 @@ block.dark-panel-5.name = Темна панель 5
block.dark-panel-6.name = Темна панель 6 block.dark-panel-6.name = Темна панель 6
block.dark-metal.name = Темний метал block.dark-metal.name = Темний метал
block.ignarock.name = Магматичні гірські породи block.ignarock.name = Магматичні гірські породи
block.hotrock.name = Гарячий Камінь block.hotrock.name = Гарячий камінь
block.magmarock.name = Магмовий камінь block.magmarock.name = Магмовий камінь
block.cliffs.name = Скелі block.cliffs.name = Скелі
block.copper-wall.name = Мідна стіна block.copper-wall.name = Мідна стіна
block.copper-wall-large.name = Велика мідна стіна block.copper-wall-large.name = Велика мідна стіна
block.titanium-wall.name = Титанова стіна block.titanium-wall.name = Титанова стіна
block.titanium-wall-large.name = Велика титанова стіна block.titanium-wall-large.name = Велика титанова стіна
block.plastanium-wall.name = Plastanium Wall block.plastanium-wall.name = Пластанієва стіна
block.plastanium-wall-large.name = Large Plastanium Wall block.plastanium-wall-large.name = Велика пластанієва стіна
block.phase-wall.name = Фазова стіна block.phase-wall.name = Фазова стіна
block.phase-wall-large.name = Велика фазова стіна block.phase-wall-large.name = Велика фазова стіна
block.thorium-wall.name = Торієва стіна block.thorium-wall.name = Торієва стіна
@@ -899,11 +899,11 @@ block.omega-mech-pad.name = Реконструктор «Омега»
block.tau-mech-pad.name = Реконструктор «Тау» block.tau-mech-pad.name = Реконструктор «Тау»
block.conduit.name = Трубопровід block.conduit.name = Трубопровід
block.mechanical-pump.name = Механічна помпа block.mechanical-pump.name = Механічна помпа
block.item-source.name = Джерело предметів block.item-source.name = Нескінченне джерело предметів
block.item-void.name = Предметний вакуум block.item-void.name = Предметний вакуум
block.liquid-source.name = Рідке джерело block.liquid-source.name = Нескінченне джерело рідин
block.power-void.name = Енергетичний вакуум block.power-void.name = Енергетичний вакуум
block.power-source.name = Джерело енергії block.power-source.name = Нескінченне джерело енергії
block.unloader.name = Розвантажувач block.unloader.name = Розвантажувач
block.vault.name = Сховище block.vault.name = Сховище
block.wave.name = Хвиля block.wave.name = Хвиля
@@ -982,8 +982,8 @@ unit.eradicator.name = Випалювач
unit.lich.name = Лич unit.lich.name = Лич
unit.reaper.name = Жнець unit.reaper.name = Жнець
tutorial.next = [lightgray]<Натисніть для продовження> tutorial.next = [lightgray]<Натисніть для продовження>
tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть екраном, щоб рухатися.\n[accent] Зведіть або розведіть 2 пальця [] для приближення і віддалення відповідно.\nз[accent] видобування міді.[] Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді
tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\n[accent]Натисніть ПКМ[], щоб зупинити будування. tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\n[accent]Натисніть ПКМ[], щоб зупинити будування.
tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення to confirm your selection.\nPress the[accent] X button[] to cancel placement. tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення to confirm your selection.\nPress the[accent] X button[] to cancel placement.
tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[]
@@ -991,8 +991,8 @@ tutorial.conveyor = [accent]Конвеєри[] використовуються
tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено
tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башточку «Подвійна»[] біля вашої бази. tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башточку «Подвійна»[] біля вашої бази.
tutorial.drillturret = «Подвійна» потребує [accent] мідні боєприпаси []для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1 tutorial.drillturret = «Подвійна» потребує [accent] мідні боєприпаси []для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1
tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch
tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи.
tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу. tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу.
tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу. tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу.
tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] Ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні. tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] Ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні.
@@ -1022,17 +1022,17 @@ liquid.water.description = Найкорисніша рідина. Зазвича
liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя.
liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля.
liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини. liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини.
mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будівництва. Наносить більше шкоди, ніж «Дротик». mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будування. Наносить більше шкоди, ніж «Дротик».
mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і біжи». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою. mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і біжи». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою.
mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності. mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності.
mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять. mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять.
mech.dart-ship.description = Стандартний корабель управління. Розумно швидкий і легкий, але має мало наступальних можливостей і низьку швидкість видобутку. mech.dart-ship.description = Стандартний корабель управління. Розумно швидкий і легкий, але має мало наступальних можливостей і низьку швидкість видобутку.
mech.javelin-ship.description = Корабель для стратегії атакуй та біжи». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами. mech.javelin-ship.description = Корабель для стратегії атакуй та біжи». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами.
mech.trident-ship.description = Важкий бомбардувальник, побудований для будівництва та знищення ворожих укріплень. Дуже добре броньований. mech.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований.
mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений. mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений.
unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра. unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра.
unit.spirit.description = Модифікований «Драугр», призначений для ремонту замість видобутку. Автоматично відновлює будь-які пошкоджені блоки. unit.spirit.description = Модифікований «Драугр», призначений для ремонту замість видобутку. Автоматично відновлює будь-які пошкоджені блоки.
unit.phantom.description = Вдосконалений безпілотник. Йде за користувачами. Допомагає в будівництві блоків. unit.phantom.description = Вдосконалений безпілотник. Йде за користувачами. Допомагає в будуванні блоків.
unit.dagger.description = Базовий мех(бойова одиниця). Дешевий у виробництві. Нездоланні при використанні в натовпі. unit.dagger.description = Базовий мех(бойова одиниця). Дешевий у виробництві. Нездоланні при використанні в натовпі.
unit.crawler.description = Наземна одиниця, що складається зі стертої рами з високими вибуховими речовинами, прив’язаними зверху. Не особливо міцний. Вибухає при контакті з ворогами. unit.crawler.description = Наземна одиниця, що складається зі стертої рами з високими вибуховими речовинами, прив’язаними зверху. Не особливо міцний. Вибухає при контакті з ворогами.
unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач. unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач.
@@ -1067,8 +1067,8 @@ block.copper-wall.description = Дешевий захисний блок.\nКо
block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.\nОхоплює кілька плиток. block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.\nОхоплює кілька плиток.
block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів. block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.
block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток. block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток.
block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання енергетичних вузлів.
block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання вузлів живлення.\nОхоплює кілька плиток.
block.thorium-wall.description = Сильний захисний блок.\nГідний захист від ворогів. block.thorium-wall.description = Сильний захисний блок.\nГідний захист від ворогів.
block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від ворогів.\nОхоплює кілька плиток. block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від ворогів.\nОхоплює кілька плиток.
block.phase-wall.description = Стіна, покрита спеціальним світловідбиваючим складом, який базується на фазовій тканині. Відхиляє більшість куль при ударі. block.phase-wall.description = Стіна, покрита спеціальним світловідбиваючим складом, який базується на фазовій тканині. Відхиляє більшість куль при ударі.
@@ -1104,7 +1104,7 @@ block.liquid-junction.description = Діє як міст для двох кан
block.bridge-conduit.description = Розширений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.bridge-conduit.description = Розширений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі.
block.phase-conduit.description = Розширений блок транспортування рідини. Використовує енергію для транспортування рідин до підключеного фазового каналу через декілька плиток. block.phase-conduit.description = Розширений блок транспортування рідини. Використовує енергію для транспортування рідин до підключеного фазового каналу через декілька плиток.
block.power-node.description = Передає живлення на підключені вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node.description = Передає живлення на підключені вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них.
block.power-node-large.description = Удосконалений вузол живлення з більшим діапазоном і більшою кількістю підключень. block.power-node-large.description = Удосконалений вузол живлення з більшим діапазоном.
block.surge-tower.description = Надзвичайно дальний вузол живлення з меншою кількістю доступних з’єднань. block.surge-tower.description = Надзвичайно дальний вузол живлення з меншою кількістю доступних з’єднань.
block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту.
block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор.
+2 -2
View File
@@ -81,7 +81,7 @@ uploadingpreviewfile = 正在上传预览文件
committingchanges = 提交更改 committingchanges = 提交更改
done = 已完成 done = 已完成
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = 请注意在测试版本中的模组[scarlet]可能有缺陷[]。\n在 Mindustry Github 或 Discord上报告你发现的问题。 mods.alphainfo = 请注意在测试版本中的模组[scarlet]可能有缺陷[]。\n在 Mindustry GitHub 或 Discord上报告你发现的问题。
mods.alpha = [accent](测试版) mods.alpha = [accent](测试版)
mods = 模组 mods = 模组
mods.none = [LIGHT_GRAY]无模组! mods.none = [LIGHT_GRAY]无模组!
@@ -98,7 +98,7 @@ mod.enable = 启用
mod.requiresrestart = 需要重启使模组生效。 mod.requiresrestart = 需要重启使模组生效。
mod.reloadrequired = [scarlet]需要重启 mod.reloadrequired = [scarlet]需要重启
mod.import = 导入模组 mod.import = 导入模组
mod.import.github = 导入 Github 模组 mod.import.github = 导入 GitHub 模组
mod.remove.confirm = 此模组将被删除。 mod.remove.confirm = 此模组将被删除。
mod.author = [LIGHT_GRAY]作者:[] {0} mod.author = [LIGHT_GRAY]作者:[] {0}
mod.missing = 此存档包含更新后的模组或不再使用的模组。存档可能会损坏。确定要加载它吗?\n[lightgray]模组:\n{0} mod.missing = 此存档包含更新后的模组或不再使用的模组。存档可能会损坏。确定要加载它吗?\n[lightgray]模组:\n{0}
+36 -11
View File
@@ -18,12 +18,14 @@ gameover = 遊戲結束
gameover.pvp = [accent]{0}[]隊獲勝! gameover.pvp = [accent]{0}[]隊獲勝!
highscore = [accent]新的高分紀錄! highscore = [accent]新的高分紀錄!
copied = 已複製。 copied = 已複製。
load.sound = 音效載入中 load.sound = 音效載入中
load.map = 地圖載入中 load.map = 地圖載入中
load.image = 圖片載入中 load.image = 圖片載入中
load.content = 內容載入中 load.content = 內容載入中
load.system = 系統載入中 load.system = 系統載入中
load.mod = 模組載入中 load.mod = 模組載入中
schematic = 藍圖 schematic = 藍圖
schematic.add = 儲存藍圖... schematic.add = 儲存藍圖...
schematics = 藍圖 schematics = 藍圖
@@ -40,6 +42,7 @@ schematic.saved = 藍圖已保存。
schematic.delete.confirm = 該藍圖將被完全清除。 schematic.delete.confirm = 該藍圖將被完全清除。
schematic.rename = 重新命名藍圖 schematic.rename = 重新命名藍圖
schematic.info = {0}x{1}, {2}方塊 schematic.info = {0}x{1}, {2}方塊
stat.wave = 打敗的波次:[accent]{0} stat.wave = 打敗的波次:[accent]{0}
stat.enemiesDestroyed = 摧毀的敵人:[accent]{0} stat.enemiesDestroyed = 摧毀的敵人:[accent]{0}
stat.built = 建設的建築:[accent]{0} stat.built = 建設的建築:[accent]{0}
@@ -47,6 +50,7 @@ stat.destroyed = 摧毀的建築:[accent]{0}
stat.deconstructed = 拆除的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0}
stat.delivered = 發射的核心資源: stat.delivered = 發射的核心資源:
stat.rank = 最終排名:[accent]{0} stat.rank = 最終排名:[accent]{0}
launcheditems = [accent]已發射的物品 launcheditems = [accent]已發射的物品
launchinfo = [unlaunched][[LAUNCH]你的核心以獲得藍字部分的物品。 launchinfo = [unlaunched][[LAUNCH]你的核心以獲得藍字部分的物品。
map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? map.delete = 確認要刪除「[accent]{0}[]」地圖嗎?
@@ -81,29 +85,30 @@ uploadingpreviewfile = 上傳預覽文件
committingchanges = 提交變更 committingchanges = 提交變更
done = 完成 done = 完成
feature.unsupported = 您的設備不支持此功能。 feature.unsupported = 您的設備不支持此功能。
mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry Github或Discord報告發現的任何問題。 mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry GitHub或Discord報告發現的任何問題。
mods.alpha = [accent](Alpha) mods.alpha = [accent](Alpha)
mods = 模組 mods = 模組
mods.none = [lightgray]找不到模組! mods.none = [lightgray]找不到模組!
mods.guide = 模組指南 mods.guide = 模組指南
mods.report = 回報錯誤 mods.report = 回報錯誤
mods.openfolder = Open Mod Folder mods.openfolder = 開啟模組資料夾
mod.enabled = [lightgray]已啟用 mod.enabled = [lightgray]已啟用
mod.disabled = [scarlet]已禁用 mod.disabled = [scarlet]已禁用
mod.enable = 啟用
mod.disable = 禁用 mod.disable = 禁用
mod.delete.error = Unable to delete mod. File may be in use. mod.delete.error = 無法刪除模組,檔案可能在使用中。
mod.missingdependencies = [scarlet]缺少依賴項目: {0} mod.missingdependencies = [scarlet]缺少依賴項目: {0}
mod.nowdisabled = [scarlet]「{0}'」模組缺少依賴項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 mod.nowdisabled = [scarlet]「{0}'」模組缺少依賴項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。
mod.enable = 啟用
mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 mod.requiresrestart = 遊戲將立即關閉以套用模組變更。
mod.reloadrequired = [scarlet]需要重新載入 mod.reloadrequired = [scarlet]需要重新載入
mod.import = 匯入模組 mod.import = 匯入模組
mod.import.github = 匯入Github模組 mod.import.github = 匯入GitHub模組
mod.remove.confirm = 該模組將被刪除。 mod.remove.confirm = 該模組將被刪除。
mod.author = [lightgray]作者:[] {0} mod.author = [lightgray]作者:[] {0}
mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0}
mod.preview.missing = 在工作坊發佈這個模組前,您必須添加預覽圖。\n在該模組的資料夾中放置一個名為[accent] preview.png[]的圖片並重試。 mod.preview.missing = 在工作坊發佈這個模組前,您必須添加預覽圖。\n在該模組的資料夾中放置一個名為[accent] preview.png[]的圖片並重試。
mod.folder.missing = 只有資料夾形式的模組可以在工作坊上發布。\n要將模組轉換為資料夾,只需將其文件解壓縮到資料夾並刪除舊的.zip檔,然後重新啟動遊戲或重新載入模組。 mod.folder.missing = 只有資料夾形式的模組可以在工作坊上發布。\n要將模組轉換為資料夾,只需將其文件解壓縮到資料夾並刪除舊的.zip檔,然後重新啟動遊戲或重新載入模組。
about.button = 關於 about.button = 關於
name = 名稱: name = 名稱:
noname = 請先選擇一個[accent]玩家名稱[]。 noname = 請先選擇一個[accent]玩家名稱[]。
@@ -270,7 +275,7 @@ missing = 此項目已被刪除或移動。\n[lightgray]工作坊列表現在已
publishing = [accent]發佈中... publishing = [accent]發佈中...
publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示! publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示!
publish.error = 發佈項目時出錯: {0} publish.error = 發佈項目時出錯: {0}
steam.error = Failed to initialize Steam services.\nError: {0} steam.error = Steam 服務初始化失敗.\n錯誤: {0}
editor.brush = 粉刷 editor.brush = 粉刷
editor.openin = 在編輯器中開啟 editor.openin = 在編輯器中開啟
editor.oregen = 礦石生成 editor.oregen = 礦石生成
@@ -347,6 +352,7 @@ editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖? editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖?
editor.exists = 具有該名稱的地圖已經存在。 editor.exists = 具有該名稱的地圖已經存在。
editor.selectmap = 選取要載入的地圖: editor.selectmap = 選取要載入的地圖:
toolmode.replace = 取代 toolmode.replace = 取代
toolmode.replace.description = 僅繪製在實體方塊上。 toolmode.replace.description = 僅繪製在實體方塊上。
toolmode.replaceall = 全部取代 toolmode.replaceall = 全部取代
@@ -361,6 +367,7 @@ toolmode.fillteams = 填充團隊
toolmode.fillteams.description = 填充團隊而不是方塊。 toolmode.fillteams.description = 填充團隊而不是方塊。
toolmode.drawteams = Draw Teams toolmode.drawteams = Draw Teams
toolmode.drawteams.description = 繪製團隊而不是方塊。 toolmode.drawteams.description = 繪製團隊而不是方塊。
filters.empty = [lightgray]沒有過濾器!使用下面的按鈕添加一個。 filters.empty = [lightgray]沒有過濾器!使用下面的按鈕添加一個。
filter.distort = 扭曲 filter.distort = 扭曲
filter.noise = 雜訊 filter.noise = 雜訊
@@ -392,6 +399,7 @@ filter.option.floor2 = 次要地板
filter.option.threshold2 = 次要閾值 filter.option.threshold2 = 次要閾值
filter.option.radius = 半徑 filter.option.radius = 半徑
filter.option.percentile = 百分比 filter.option.percentile = 百分比
width = 寬度: width = 寬度:
height = 長度: height = 長度:
menu = 主選單 menu = 主選單
@@ -407,6 +415,7 @@ tutorial = 教學
tutorial.retake = 重置教學 tutorial.retake = 重置教學
editor = 地圖編輯器 editor = 地圖編輯器
mapeditor = 地圖編輯器 mapeditor = 地圖編輯器
abandon = 放棄 abandon = 放棄
abandon.text = 此區域及其所有資源將會丟失給敵人。 abandon.text = 此區域及其所有資源將會丟失給敵人。
locked = 鎖定 locked = 鎖定
@@ -437,6 +446,7 @@ zone.objective.survival = 生存
zone.objective.attack = 摧毀敵人核心 zone.objective.attack = 摧毀敵人核心
add = 新增... add = 新增...
boss.health = 頭目血量 boss.health = 頭目血量
connectfail = [crimson]伺服器連線錯誤:[accent]{0} connectfail = [crimson]伺服器連線錯誤:[accent]{0}
error.unreachable = 無法到達伺服器。請確認位址是否正確? error.unreachable = 無法到達伺服器。請確認位址是否正確?
error.invalidaddress = 無效的位址。 error.invalidaddress = 無效的位址。
@@ -447,6 +457,7 @@ error.mapnotfound = 找不到地圖!
error.io = 網絡輸出入錯誤。 error.io = 網絡輸出入錯誤。
error.any = 未知網絡錯誤。 error.any = 未知網絡錯誤。
error.bloom = 初始化特效失敗.\n您的設備可能不支援它 error.bloom = 初始化特效失敗.\n您的設備可能不支援它
zone.groundZero.name = 零號地區 zone.groundZero.name = 零號地區
zone.desertWastes.name = 沙漠荒原 zone.desertWastes.name = 沙漠荒原
zone.craters.name = 隕石坑 zone.craters.name = 隕石坑
@@ -461,6 +472,7 @@ zone.saltFlats.name = 鹽沼
zone.impact0078.name = 衝擊 0078 zone.impact0078.name = 衝擊 0078
zone.crags.name = 岩壁 zone.crags.name = 岩壁
zone.fungalPass.name = 真菌隘口 zone.fungalPass.name = 真菌隘口
zone.groundZero.description = 再次開始的最佳位置。敵人威脅度低。資源少。\n盡可能的收集更多的鉛和銅。\n繼續前進。 zone.groundZero.description = 再次開始的最佳位置。敵人威脅度低。資源少。\n盡可能的收集更多的鉛和銅。\n繼續前進。
zone.frozenForest.description = 即使這裡更靠近山脈,孢子也已經擴散到這裡了。嚴寒的溫度不可能永遠禁錮它們。\n\n開始進入能源的世界。建造燃燒發電機。學會使用修理方塊。 zone.frozenForest.description = 即使這裡更靠近山脈,孢子也已經擴散到這裡了。嚴寒的溫度不可能永遠禁錮它們。\n\n開始進入能源的世界。建造燃燒發電機。學會使用修理方塊。
zone.desertWastes.description = 這些荒原規模巨大,難以預測,並且與廢棄的結構交錯在一起。\n此地區存在著煤炭。燃燒它以獲得能源或合成石墨。\n\n[lightgray]無法保證此地圖的著陸位置。 zone.desertWastes.description = 這些荒原規模巨大,難以預測,並且與廢棄的結構交錯在一起。\n此地區存在著煤炭。燃燒它以獲得能源或合成石墨。\n\n[lightgray]無法保證此地圖的著陸位置。
@@ -475,6 +487,7 @@ zone.nuclearComplex.description = 以前生產和加工釷的設施已變成廢
zone.fungalPass.description = 高山與被孢子纏繞的低地之間的過渡區域。一個小的敵人偵察基地位於這裡。\n破壞它。\n使用匕首機甲和爬行機甲單位來摧毀兩個核心。 zone.fungalPass.description = 高山與被孢子纏繞的低地之間的過渡區域。一個小的敵人偵察基地位於這裡。\n破壞它。\n使用匕首機甲和爬行機甲單位來摧毀兩個核心。
zone.impact0078.description = <在此處輸入說明> zone.impact0078.description = <在此處輸入說明>
zone.crags.description = <在此輸入說明> zone.crags.description = <在此輸入說明>
settings.language = 語言 settings.language = 語言
settings.data = 遊戲數據 settings.data = 遊戲數據
settings.reset = 重設為預設設定 settings.reset = 重設為預設設定
@@ -509,7 +522,7 @@ blocks.shootrange = 範圍
blocks.size = 尺寸 blocks.size = 尺寸
blocks.liquidcapacity = 液體容量 blocks.liquidcapacity = 液體容量
blocks.powerrange = 輸出範圍 blocks.powerrange = 輸出範圍
blocks.powerconnections = Max Connections blocks.powerconnections = 最大連接數
blocks.poweruse = 能量使用 blocks.poweruse = 能量使用
blocks.powerdamage = 能量/傷害 blocks.powerdamage = 能量/傷害
blocks.itemcapacity = 物品容量 blocks.itemcapacity = 物品容量
@@ -529,9 +542,10 @@ blocks.inaccuracy = 誤差
blocks.shots = 射擊數 blocks.shots = 射擊數
blocks.reload = 射擊次數/秒 blocks.reload = 射擊次數/秒
blocks.ammo = 彈藥 blocks.ammo = 彈藥
bar.drilltierreq = 需要更好的鑽頭 bar.drilltierreq = 需要更好的鑽頭
bar.drillspeed = 鑽頭速度:{0}/秒 bar.drillspeed = 鑽頭速度:{0}/秒
bar.pumpspeed = Pump Speed: {0}/s bar.pumpspeed = 液體泵送速度:{0}/s
bar.efficiency = 效率:{0}% bar.efficiency = 效率:{0}%
bar.powerbalance = 能量變化:{0} bar.powerbalance = 能量變化:{0}
bar.powerstored = 能量存量: {0}/{1} bar.powerstored = 能量存量: {0}/{1}
@@ -544,6 +558,9 @@ bar.heat = 熱
bar.power = 能量 bar.power = 能量
bar.progress = 建造進度 bar.progress = 建造進度
bar.spawned = 單位:{0}/{1} bar.spawned = 單位:{0}/{1}
bar.input = 能量輸入
bar.output = 能量輸出
bullet.damage = [stat]{0}[lightgray]傷害 bullet.damage = [stat]{0}[lightgray]傷害
bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格 bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格
bullet.incendiary = [stat]燃燒 bullet.incendiary = [stat]燃燒
@@ -555,6 +572,7 @@ bullet.freezing = [stat]冷凍
bullet.tarred = [stat]焦油 bullet.tarred = [stat]焦油
bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數 bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數
bullet.reload = [stat]{0}[lightgray]×射擊速率 bullet.reload = [stat]{0}[lightgray]×射擊速率
unit.blocks = 方塊 unit.blocks = 方塊
unit.powersecond = 能量單位/秒 unit.powersecond = 能量單位/秒
unit.liquidsecond = 液體單位/秒 unit.liquidsecond = 液體單位/秒
@@ -574,9 +592,10 @@ category.items = 物品
category.crafting = 需求 category.crafting = 需求
category.shooting = 射擊 category.shooting = 射擊
category.optional = 可選的強化 category.optional = 可選的強化
setting.landscape.name = 鎖定水平畫面 setting.landscape.name = 鎖定水平畫面
setting.shadows.name = 陰影 setting.shadows.name = 陰影
setting.blockreplace.name = Automatic Block Suggestions setting.blockreplace.name = 方塊建造建議
setting.linear.name = 線性過濾 setting.linear.name = 線性過濾
setting.hints.name = 提示 setting.hints.name = 提示
setting.animatedwater.name = 水動畫 setting.animatedwater.name = 水動畫
@@ -599,8 +618,8 @@ setting.difficulty.insane = 瘋狂
setting.difficulty.name = 難度: setting.difficulty.name = 難度:
setting.screenshake.name = 畫面抖動 setting.screenshake.name = 畫面抖動
setting.effects.name = 顯示特效 setting.effects.name = 顯示特效
setting.destroyedblocks.name = Display Destroyed Blocks setting.destroyedblocks.name = 顯示被破壞的方塊
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.conveyorpathfinding.name = 自動輸送帶放置規劃
setting.sensitivity.name = 控制器靈敏度 setting.sensitivity.name = 控制器靈敏度
setting.saveinterval.name = 自動存檔間隔 setting.saveinterval.name = 自動存檔間隔
setting.seconds = {0}秒 setting.seconds = {0}秒
@@ -681,6 +700,7 @@ mode.pvp.description = 和其他玩家競爭、戰鬥。
mode.attack.name = 進攻 mode.attack.name = 進攻
mode.attack.description = 沒有波次,目標是摧毀敵人的基地。 mode.attack.description = 沒有波次,目標是摧毀敵人的基地。
mode.custom = 自訂規則 mode.custom = 自訂規則
rules.infiniteresources = 無限資源 rules.infiniteresources = 無限資源
rules.wavetimer = 波次時間 rules.wavetimer = 波次時間
rules.waves = 波次 rules.waves = 波次
@@ -707,6 +727,7 @@ rules.title.resourcesbuilding = 資源與建築
rules.title.player = 玩家 rules.title.player = 玩家
rules.title.enemy = 敵人 rules.title.enemy = 敵人
rules.title.unit = 單位 rules.title.unit = 單位
content.item.name = 物品 content.item.name = 物品
content.liquid.name = 液體 content.liquid.name = 液體
content.unit.name = 單位 content.unit.name = 單位
@@ -732,6 +753,7 @@ liquid.water.name = 水
liquid.slag.name = 熔渣 liquid.slag.name = 熔渣
liquid.oil.name = 原油 liquid.oil.name = 原油
liquid.cryofluid.name = 冷凍液 liquid.cryofluid.name = 冷凍液
mech.alpha-mech.name = 阿爾法 mech.alpha-mech.name = 阿爾法
mech.alpha-mech.weapon = 重型機關槍 mech.alpha-mech.weapon = 重型機關槍
mech.alpha-mech.ability = 自修復 mech.alpha-mech.ability = 自修復
@@ -879,6 +901,7 @@ block.coal-centrifuge.name = 煤炭離心機
block.power-node.name = 能量節點 block.power-node.name = 能量節點
block.power-node-large.name = 大型能量節點 block.power-node-large.name = 大型能量節點
block.surge-tower.name = 波動塔 block.surge-tower.name = 波動塔
block.diode.name = 二極體
block.battery.name = 電池 block.battery.name = 電池
block.battery-large.name = 大型電池 block.battery-large.name = 大型電池
block.combustion-generator.name = 燃燒發電機 block.combustion-generator.name = 燃燒發電機
@@ -1106,6 +1129,7 @@ block.phase-conduit.description = 高級的液體運輸方塊。使用能量將
block.power-node.description = 將能量傳輸到相連的節點。該節點將從任何相鄰方塊接收能量或向任何相鄰方塊供應能量。 block.power-node.description = 將能量傳輸到相連的節點。該節點將從任何相鄰方塊接收能量或向任何相鄰方塊供應能量。
block.power-node-large.description = 具有更大範圍和更多連接的高級電源節點。 block.power-node-large.description = 具有更大範圍和更多連接的高級電源節點。
block.surge-tower.description = 具有兩個可用連接的超遠程能量節點。 block.surge-tower.description = 具有兩個可用連接的超遠程能量節點。
block.diode.description = 電池中的電力在這個方塊中只能有一個固定的流向,並且只有在另一側的能量較少時才會通過。
block.battery.description = 有能量剩餘時存儲電力並在能量短缺時提供能量。 block.battery.description = 有能量剩餘時存儲電力並在能量短缺時提供能量。
block.battery-large.description = 比普通電池存儲更多的能量。 block.battery-large.description = 比普通電池存儲更多的能量。
block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。 block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。
@@ -1165,3 +1189,4 @@ block.omega-mech-pad.description = 改裝現在的船隻,換成龐大、具有
block.javelin-ship-pad.description = 改裝現在的船隻,換成具有閃電武器、強大而快速的攔截機。\n站在上面雙擊機坪以使用它。 block.javelin-ship-pad.description = 改裝現在的船隻,換成具有閃電武器、強大而快速的攔截機。\n站在上面雙擊機坪以使用它。
block.trident-ship-pad.description = 改裝現在的船隻,換成具有相當不錯裝甲的重型轟炸機。\n站在上面雙擊機坪以使用它。 block.trident-ship-pad.description = 改裝現在的船隻,換成具有相當不錯裝甲的重型轟炸機。\n站在上面雙擊機坪以使用它。
block.glaive-ship-pad.description = 改裝現在的船隻,換成具有重裝甲的砲艇。\n站在上面雙擊機坪以使用它。 block.glaive-ship-pad.description = 改裝現在的船隻,換成具有重裝甲的砲艇。\n站在上面雙擊機坪以使用它。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 738 B

After

Width:  |  Height:  |  Size: 742 B

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 KiB

After

Width:  |  Height:  |  Size: 736 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 KiB

After

Width:  |  Height:  |  Size: 891 KiB

@@ -48,7 +48,7 @@ public class Blocks implements ContentList{
melter, separator, sporePress, pulverizer, incinerator, coalCentrifuge, melter, separator, sporePress, pulverizer, incinerator, coalCentrifuge,
//sandbox //sandbox
powerVoid, powerSource, itemSource, liquidSource, itemVoid, message, light, powerSource, powerVoid, itemSource, itemVoid, liquidSource, message, illuminator,
//defense //defense
scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet
@@ -63,7 +63,7 @@ public class Blocks implements ContentList{
//power //power
combustionGenerator, thermalGenerator, turbineGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor, combustionGenerator, thermalGenerator, turbineGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor,
impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, diode,
//production //production
mechanicalDrill, pneumaticDrill, laserDrill, blastDrill, waterExtractor, oilExtractor, cultivator, mechanicalDrill, pneumaticDrill, laserDrill, blastDrill, waterExtractor, oilExtractor, cultivator,
@@ -537,7 +537,7 @@ public class Blocks implements ContentList{
hasPower = true; hasPower = true;
consumes.power(4f); consumes.power(4f);
consumes.items(new ItemStack(Items.titanium, 2), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.copper, 3)); consumes.items(new ItemStack(Items.copper, 3), new ItemStack(Items.lead, 4), new ItemStack(Items.titanium, 2), new ItemStack(Items.silicon, 3));
}}; }};
cryofluidMixer = new LiquidConverter("cryofluidmixer"){{ cryofluidMixer = new LiquidConverter("cryofluidmixer"){{
@@ -713,11 +713,11 @@ public class Blocks implements ContentList{
//endregion //endregion
//region sandbox //region sandbox
powerVoid = new PowerVoid("power-void"){{ powerSource = new PowerSource("power-source"){{
requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
powerSource = new PowerSource("power-source"){{ powerVoid = new PowerVoid("power-void"){{
requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
@@ -736,8 +736,11 @@ public class Blocks implements ContentList{
message = new MessageBlock("message"){{ message = new MessageBlock("message"){{
requirements(Category.effect, ItemStack.with(Items.graphite, 5)); requirements(Category.effect, ItemStack.with(Items.graphite, 5));
}}; }};
light = new LightBlock("light"){{ illuminator = new LightBlock("illuminator"){{
requirements(Category.effect, ItemStack.with(Items.graphite, 5)); requirements(Category.effect, ItemStack.with(Items.graphite, 5));
color = Color.valueOf("7d93ff");
brightness = 0.6f;
radius = 80f;
consumes.power(0.05f); consumes.power(0.05f);
}}; }};
@@ -1014,6 +1017,7 @@ public class Blocks implements ContentList{
pulseConduit = new Conduit("pulse-conduit"){{ pulseConduit = new Conduit("pulse-conduit"){{
requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 1)); requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 1));
liquidCapacity = 16f; liquidCapacity = 16f;
liquidPressure = 1.025f;
health = 90; health = 90;
}}; }};
@@ -1069,6 +1073,10 @@ public class Blocks implements ContentList{
laserRange = 30f; laserRange = 30f;
}}; }};
diode = new PowerDiode("diode"){{
requirements(Category.power, ItemStack.with(Items.silicon, 10, Items.plastanium, 5, Items.metaglass, 10));
}};
battery = new Battery("battery"){{ battery = new Battery("battery"){{
requirements(Category.power, ItemStack.with(Items.copper, 4, Items.lead, 20)); requirements(Category.power, ItemStack.with(Items.copper, 4, Items.lead, 20));
consumes.powerBuffered(4000f); consumes.powerBuffered(4000f);
@@ -215,10 +215,12 @@ public class TechTree implements ContentList{
node(combustionGenerator, () -> { node(combustionGenerator, () -> {
node(powerNode, () -> { node(powerNode, () -> {
node(powerNodeLarge, () -> { node(powerNodeLarge, () -> {
node(diode, () -> {
node(surgeTower, () -> { node(surgeTower, () -> {
}); });
}); });
});
node(battery, () -> { node(battery, () -> {
node(batteryLarge, () -> { node(batteryLarge, () -> {
@@ -189,7 +189,6 @@ public class Zones implements ContentList{
startingItems = list(copper, 250, lead, 100); startingItems = list(copper, 250, lead, 100);
conditionWave = 15; conditionWave = 15;
launchPeriod = 10; launchPeriod = 10;
requirements = with(new ZoneWave(ruinousShores, 20));
resources = with(copper, scrap, lead, coal, titanium, thorium, sand); resources = with(copper, scrap, lead, coal, titanium, thorium, sand);
requirements = with( requirements = with(
new ZoneWave(ruinousShores, 20), new ZoneWave(ruinousShores, 20),
@@ -103,6 +103,7 @@ public class EditorTile extends Tile{
return; return;
} }
if(floor.isLiquid) return;
if(overlayID() == overlay) return; if(overlayID() == overlay) return;
op(OpType.overlay, this.overlay.id); op(OpType.overlay, this.overlay.id);
super.setOverlayID(overlay); super.setOverlayID(overlay);
@@ -186,7 +186,7 @@ public class WaveInfoDialog extends FloatingDialog{
}).width(80f); }).width(80f);
a.add(" + "); a.add(" + ");
a.addField(Strings.fixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { a.addField(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> {
if(Strings.canParsePositiveFloat(text)){ if(Strings.canParsePositiveFloat(text)){
group.unitScaling = 1f / Strings.parseFloat(text); group.unitScaling = 1f / Strings.parseFloat(text);
updateWaves(); updateWaves();
@@ -217,10 +217,11 @@ public class WaveInfoDialog extends FloatingDialog{
void showUpdate(SpawnGroup group){ void showUpdate(SpawnGroup group){
FloatingDialog dialog = new FloatingDialog(""); FloatingDialog dialog = new FloatingDialog("");
dialog.setFillParent(false); dialog.setFillParent(true);
dialog.cont.pane(p -> {
int i = 0; int i = 0;
for(UnitType type : content.units()){ for(UnitType type : content.units()){
dialog.cont.addButton(t -> { p.addButton(t -> {
t.left(); t.left();
t.addImage(type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(40f).padRight(2f); t.addImage(type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(40f).padRight(2f);
t.add(type.localizedName); t.add(type.localizedName);
@@ -230,8 +231,9 @@ public class WaveInfoDialog extends FloatingDialog{
dialog.hide(); dialog.hide();
buildGroups(); buildGroups();
}).pad(2).margin(12f).fillX(); }).pad(2).margin(12f).fillX();
if(++i % 3 == 0) dialog.cont.row(); if(++i % 3 == 0) p.row();
} }
});
dialog.show(); dialog.show();
} }
@@ -34,39 +34,36 @@ public interface BuilderTrait extends Entity, TeamTrait{
default void updateBuilding(){ default void updateBuilding(){
float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : placeDistance; float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : placeDistance;
Unit unit = (Unit)this; Unit unit = (Unit)this;
//remove already completed build requests //remove already completed build requests
removal.clear(); removal.clear();
for(BuildRequest req : buildQueue()){ removal.addAll(buildQueue());
removal.add(req);
}
buildQueue().clear(); Structs.filter(buildQueue(), req -> {
Tile tile = world.tile(req.x, req.y);
return tile == null || (req.breaking && tile.block() == Blocks.air) || (!req.breaking && (tile.rotation() == req.rotation || !req.block.rotate) && tile.block() == req.block);
});
for(BuildRequest request : removal){ TileEntity core = unit.getClosestCore();
Tile tile = world.tile(request.x, request.y);
if(!(tile == null || (request.breaking && tile.block() == Blocks.air) || //nothing to build.
(!request.breaking && (tile.rotation() == request.rotation || !request.block.rotate) && tile.block() == request.block))){ if(buildRequest() == null) return;
buildQueue().addLast(request);
//find the next build request
if(buildQueue().size > 1){
int total = 0;
BuildRequest req;
while((dst((req = buildRequest()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < buildQueue().size){
buildQueue().removeFirst();
buildQueue().addLast(req);
total++;
} }
} }
BuildRequest current = buildRequest(); BuildRequest current = buildRequest();
if(current == null){
return;
}
Tile tile = world.tile(current.x, current.y); Tile tile = world.tile(current.x, current.y);
if(dst(tile) > finalPlaceDst){
if(buildQueue().size > 1){
buildQueue().removeFirst();
buildQueue().addLast(current);
}
return;
}
if(!(tile.block() instanceof BuildBlock)){ if(!(tile.block() instanceof BuildBlock)){
if(!current.initialized && canCreateBlocks() && !current.breaking && Build.validPlace(getTeam(), current.x, current.y, current.block, current.rotation)){ if(!current.initialized && canCreateBlocks() && !current.breaking && Build.validPlace(getTeam(), current.x, current.y, current.block, current.rotation)){
Call.beginPlace(getTeam(), current.x, current.y, current.block, current.rotation); Call.beginPlace(getTeam(), current.x, current.y, current.block, current.rotation);
@@ -78,8 +75,6 @@ public interface BuilderTrait extends Entity, TeamTrait{
} }
} }
TileEntity core = unit.getClosestCore();
if(tile.entity instanceof BuildEntity && !current.initialized){ if(tile.entity instanceof BuildEntity && !current.initialized){
Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking))); Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking)));
current.initialized = true; current.initialized = true;
@@ -111,9 +106,17 @@ public interface BuilderTrait extends Entity, TeamTrait{
} }
} }
current.stuck = Mathf.equal(current.progress, entity.progress);
current.progress = entity.progress; current.progress = entity.progress;
} }
/** @return whether this request should be skipped, in favor of the next one. */
default boolean shouldSkip(BuildRequest request, @Nullable TileEntity core){
//requests that you have at least *started* are considered
if(state.rules.infiniteResources || request.breaking || !request.initialized || core == null) return false;
return request.stuck && !core.items.has(request.block.requirements);
}
/** Returns the queue for storing build requests. */ /** Returns the queue for storing build requests. */
Queue<BuildRequest> buildQueue(); Queue<BuildRequest> buildQueue();
@@ -287,8 +290,8 @@ public interface BuilderTrait extends Entity, TeamTrait{
/** Last progress.*/ /** Last progress.*/
public float progress; public float progress;
/** Whether construction has started for this request.*/ /** Whether construction has started for this request, and other special variables.*/
public boolean initialized, worldContext = true; public boolean initialized, worldContext = true, stuck;
/** Visual scale. Used only for rendering.*/ /** Visual scale. Used only for rendering.*/
public float animScale = 0f; public float animScale = 0f;
@@ -592,6 +592,11 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
movement.x += xa * speed; movement.x += xa * speed;
} }
if(Core.input.keyDown(Binding.mouse_move)){
movement.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2) * 0.005f, -1, 1) * speed;
movement.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2) * 0.005f, -1, 1) * speed;
}
Vector2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY()); Vector2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY());
pointerX = vec.x; pointerX = vec.x;
pointerY = vec.y; pointerY = vec.y;
@@ -87,6 +87,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
return Time.delta() * timeScale; return Time.delta() * timeScale;
} }
/** Base efficiency. If this entity has non-buffered power, returns the power %, otherwise returns 1. */
public float efficiency(){
return power != null && !block.consumes.getPower().buffered ? power.status : 1f;
}
/** Call when nothing is happening to the entity. This increments the internal sleep timer. */ /** Call when nothing is happening to the entity. This increments the internal sleep timer. */
public void sleep(){ public void sleep(){
sleepTime += Time.delta(); sleepTime += Time.delta();
@@ -27,7 +27,8 @@ public class EventType{
drown, drown,
exclusionDeath, exclusionDeath,
suicideBomb, suicideBomb,
openWiki openWiki,
teamCoreDamage
} }
public static class WinEvent{} public static class WinEvent{}
@@ -30,7 +30,7 @@ public class LoopControl{
data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f);
boolean play = data.curVolume > 0.01f; boolean play = data.curVolume > 0.01f;
float pan = Mathf.isZero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total);
if(data.soundID <= 0){ if(data.soundID <= 0){
if(play){ if(play){
data.soundID = sound.loop(data.curVolume, 1f, pan); data.soundID = sound.loop(data.curVolume, 1f, pan);
@@ -25,6 +25,8 @@ public class Rules{
public boolean pvp; public boolean pvp;
/** Whether enemy units drop random items on death. */ /** Whether enemy units drop random items on death. */
public boolean unitDrops = true; public boolean unitDrops = true;
/** Whether reactors can explode and damage other blocks. */
public boolean reactorExplosions = true;
/** How fast unit pads build units. */ /** How fast unit pads build units. */
public float unitBuildSpeedMultiplier = 1f; public float unitBuildSpeedMultiplier = 1f;
/** How much health units start with. */ /** How much health units start with. */
@@ -20,15 +20,19 @@ public class LightRenderer{
} }
public void add(float x, float y, float radius, Color color, float opacity){ public void add(float x, float y, float radius, Color color, float opacity){
float res = color.toFloatBits();
add(() -> { add(() -> {
Draw.color(color, opacity); Draw.color(res);
Draw.alpha(opacity);
Draw.rect("circle-shadow", x, y, radius * 2, radius * 2); Draw.rect("circle-shadow", x, y, radius * 2, radius * 2);
}); });
} }
public void add(float x, float y, TextureRegion region, Color color, float opacity){ public void add(float x, float y, TextureRegion region, Color color, float opacity){
float res = color.toFloatBits();
add(() -> { add(() -> {
Draw.color(color, opacity); Draw.color(res);
Draw.alpha(opacity);
Draw.rect(region, x, y); Draw.rect(region, x, y);
}); });
} }
@@ -67,7 +67,7 @@ public class OverlayRenderer{
if(!rect.setSize(Core.camera.width * 0.9f, Core.camera.height * 0.9f) if(!rect.setSize(Core.camera.width * 0.9f, Core.camera.height * 0.9f)
.setCenter(Core.camera.position.x, Core.camera.position.y).contains(mechpad.x, mechpad.y)){ .setCenter(Core.camera.position.x, Core.camera.position.y).contains(mechpad.x, mechpad.y)){
Tmp.v1.set(mechpad.worldx(), mechpad.worldy()).sub(Core.camera.position.x, Core.camera.position.y).setLength(indicatorLength); Tmp.v1.set(mechpad.drawx(), mechpad.drawy()).sub(Core.camera.position.x, Core.camera.position.y).setLength(indicatorLength);
Lines.stroke(2f, ((MechPad) mechpad.block()).mech.engineColor); Lines.stroke(2f, ((MechPad) mechpad.block()).mech.engineColor);
Lines.lineAngle(Core.camera.position.x + Tmp.v1.x, Core.camera.position.y + Tmp.v1.y, Tmp.v1.angle(), 0.5f); Lines.lineAngle(Core.camera.position.x + Tmp.v1.x, Core.camera.position.y + Tmp.v1.y, Tmp.v1.angle(), 0.5f);
@@ -9,6 +9,8 @@ import io.anuke.arc.input.KeyCode;
public enum Binding implements KeyBind{ public enum Binding implements KeyBind{
move_x(new Axis(KeyCode.A, KeyCode.D), "general"), move_x(new Axis(KeyCode.A, KeyCode.D), "general"),
move_y(new Axis(KeyCode.S, KeyCode.W)), move_y(new Axis(KeyCode.S, KeyCode.W)),
mouse_move(KeyCode.MOUSE_BACK),
dash(KeyCode.SHIFT_LEFT),
select(KeyCode.MOUSE_LEFT), select(KeyCode.MOUSE_LEFT),
deselect(KeyCode.MOUSE_RIGHT), deselect(KeyCode.MOUSE_RIGHT),
break_block(KeyCode.MOUSE_RIGHT), break_block(KeyCode.MOUSE_RIGHT),
@@ -22,7 +24,6 @@ public enum Binding implements KeyBind{
schematic_flip_x(KeyCode.Z), schematic_flip_x(KeyCode.Z),
schematic_flip_y(KeyCode.X), schematic_flip_y(KeyCode.X),
schematic_menu(KeyCode.T), schematic_menu(KeyCode.T),
dash(KeyCode.SHIFT_LEFT),
zoom_hold(KeyCode.CONTROL_LEFT, "view"), zoom_hold(KeyCode.CONTROL_LEFT, "view"),
zoom(new Axis(KeyCode.SCROLL)), zoom(new Axis(KeyCode.SCROLL)),
menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE), menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE),
@@ -50,9 +50,9 @@ public class DesktopInput extends InputHandler{
b.defaults().left(); b.defaults().left();
b.label(() -> Core.bundle.format(!player.isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel); b.label(() -> Core.bundle.format(!player.isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel);
b.row(); b.row();
b.add(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel); b.label(() -> Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel);
b.row(); b.row();
b.add(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel); b.label(() -> Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel);
}).margin(10f); }).margin(10f);
}); });
@@ -61,7 +61,7 @@ public class DesktopInput extends InputHandler{
t.bottom(); t.bottom();
t.table(Styles.black6, b -> { t.table(Styles.black6, b -> {
b.defaults().left(); b.defaults().left();
b.add(Core.bundle.format("schematic.flip", b.label( () -> Core.bundle.format("schematic.flip",
Core.keybinds.get(Binding.schematic_flip_x).key.toString(), Core.keybinds.get(Binding.schematic_flip_x).key.toString(),
Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel); Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel);
b.row(); b.row();
+5 -1
View File
@@ -4,7 +4,7 @@ import io.anuke.arc.util.serialization.*;
import io.anuke.arc.util.serialization.Json.*; import io.anuke.arc.util.serialization.Json.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.MappableContent; import io.anuke.mindustry.ctype.*;
import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.*;
@@ -31,6 +31,10 @@ public class JsonIO{
} }
}; };
public static Json json(){
return json;
}
public static String write(Object object){ public static String write(Object object){
return json.toJson(object, object.getClass()); return json.toJson(object, object.getClass());
} }
@@ -10,10 +10,9 @@ import io.anuke.arc.func.*;
import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.*;
import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.arc.util.reflect.Field;
import io.anuke.arc.util.reflect.*;
import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.*;
import io.anuke.arc.util.serialization.Json.*; import io.anuke.arc.util.serialization.Json.*;
import io.anuke.arc.util.serialization.Jval.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.content.TechTree.*; import io.anuke.mindustry.content.TechTree.*;
@@ -182,7 +181,7 @@ public class ContentParser{
}else if(child.name.equals("liquid")){ }else if(child.name.equals("liquid")){
block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child)); block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
}else if(child.name.equals("power")){ }else if(child.name.equals("power")){
if(child.isDouble()){ if(child.isNumber()){
block.consumes.power(child.asFloat()); block.consumes.power(child.asFloat());
}else{ }else{
block.consumes.add((Consume)parser.readValue(ConsumePower.class, child)); block.consumes.add((Consume)parser.readValue(ConsumePower.class, child));
@@ -342,10 +341,7 @@ public class ContentParser{
init(); init();
} }
//add comments starting with //, but ignore links JsonValue value = parser.fromJson(null, Jval.read(json).toString(Jformat.plain));
json = json.replace("http://", "http:~~").replace("https://", "https:~~").replaceAll("//.*?\n","\n").replace("http:~~", "http://").replace("https:~~", "https://");
JsonValue value = parser.fromJson(null, json);
if(!parsers.containsKey(type)){ if(!parsers.containsKey(type)){
throw new SerializationException("No parsers for content type '" + type + "'"); throw new SerializationException("No parsers for content type '" + type + "'");
} }
@@ -363,7 +359,7 @@ public class ContentParser{
private <T> T make(Class<T> type){ private <T> T make(Class<T> type){
try{ try{
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor(); Constructor<T> cons = type.getDeclaredConstructor();
cons.setAccessible(true); cons.setAccessible(true);
return cons.newInstance(); return cons.newInstance();
}catch(Exception e){ }catch(Exception e){
@@ -373,7 +369,7 @@ public class ContentParser{
private <T> T make(Class<T> type, String name){ private <T> T make(Class<T> type, String name){
try{ try{
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor(String.class); Constructor<T> cons = type.getDeclaredConstructor(String.class);
cons.setAccessible(true); cons.setAccessible(true);
return cons.newInstance(name); return cons.newInstance(name);
}catch(Exception e){ }catch(Exception e){
@@ -383,7 +379,7 @@ public class ContentParser{
private <T> Prov<T> supply(Class<T> type){ private <T> Prov<T> supply(Class<T> type){
try{ try{
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor(); Constructor<T> cons = type.getDeclaredConstructor();
return () -> { return () -> {
try{ try{
return cons.newInstance(); return cons.newInstance();
@@ -459,7 +455,7 @@ public class ContentParser{
Field field = metadata.field; Field field = metadata.field;
try{ try{
field.set(object, parser.readValue(field.getType(), metadata.elementType, child, metadata.keyType)); field.set(object, parser.readValue(field.getType(), metadata.elementType, child, metadata.keyType));
}catch(ReflectionException ex){ }catch(IllegalAccessException ex){
throw new SerializationException("Error accessing field: " + field.getName() + " (" + type.getName() + ")", ex); throw new SerializationException("Error accessing field: " + field.getName() + " (" + type.getName() + ")", ex);
}catch(SerializationException ex){ }catch(SerializationException ex){
ex.addTrace(field.getName() + " (" + type.getName() + ")"); ex.addTrace(field.getName() + " (" + type.getName() + ")");
+1 -1
View File
@@ -354,7 +354,7 @@ public class Mods implements Loadable{
FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s");
if(folder.exists()){ if(folder.exists()){
for(FileHandle file : folder.list()){ for(FileHandle file : folder.list()){
if(file.extension().equals("json")){ if(file.extension().equals("json") || file.extension().equals("hjson") || file.extension().equals("js")){
runs.add(new LoadRun(type, file, mod)); runs.add(new LoadRun(type, file, mod));
} }
} }
+1 -1
View File
@@ -63,7 +63,7 @@ public class Bar extends Element{
if(fraction == null) return; if(fraction == null) return;
float computed = Mathf.clamp(fraction.get()); float computed = Mathf.clamp(fraction.get());
if(!Mathf.isEqual(lastValue, computed)){ if(!Mathf.equal(lastValue, computed)){
blink = 1f; blink = 1f;
lastValue = computed; lastValue = computed;
} }
@@ -135,13 +135,11 @@ public class CustomRulesDialog extends FloatingDialog{
number("$rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> true); number("$rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> true);
title("$rules.title.respawns"); title("$rules.title.respawns");
//limited respawns don't work on PvP, commented out until they're fixed
//check("$rules.limitedRespawns", b -> rules.limitedRespawns = b, () -> rules.limitedRespawns);
//number("$rules.respawns", true, f -> rules.respawns = (int)f, () -> rules.respawns, () -> rules.limitedRespawns);
number("$rules.respawntime", f -> rules.respawnTime = f * 60f, () -> rules.respawnTime / 60f); number("$rules.respawntime", f -> rules.respawnTime = f * 60f, () -> rules.respawnTime / 60f);
title("$rules.title.resourcesbuilding"); title("$rules.title.resourcesbuilding");
check("$rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources); check("$rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources);
check("$rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions);
number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources);
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier);
@@ -32,14 +32,14 @@ public class JoinDialog extends FloatingDialog{
loadServers(); loadServers();
buttons.add().width(60f); if(!steam) buttons.add().width(60f);
buttons.add().growX(); buttons.add().growX().width(-1);
addCloseButton(); addCloseButton();
buttons.add().growX(); buttons.add().growX().width(-1);
if(!steam){ if(!steam){
buttons.addButton("?", () -> ui.showInfo("$join.info")).size(60f, 64f); buttons.addButton("?", () -> ui.showInfo("$join.info")).size(60f, 64f).width(-1);
} }
add = new FloatingDialog("$joingame.title"); add = new FloatingDialog("$joingame.title");
@@ -271,7 +271,7 @@ public class JoinDialog extends FloatingDialog{
Cell cell = ((Table)pane.getParent()).getCell(button); Cell cell = ((Table)pane.getParent()).getCell(button);
if(!Mathf.isEqual(cell.minWidth(), pw)){ if(!Mathf.equal(cell.minWidth(), pw)){
cell.width(pw); cell.width(pw);
cell.padLeft(pad); cell.padLeft(pad);
pane.getParent().invalidateHierarchy(); pane.getParent().invalidateHierarchy();
@@ -218,7 +218,7 @@ public class SettingsMenuDialog extends SettingsDialog{
control.setInput(new MobileInput()); control.setInput(new MobileInput());
} }
}*/ }*/
game.sliderPref("saveinterval", 60, 10, 5 * 120, i -> Core.bundle.format("setting.seconds", i)); game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i));
if(!mobile){ if(!mobile){
game.checkPref("crashreport", true); game.checkPref("crashreport", true);
@@ -360,8 +360,12 @@ public class SettingsMenuDialog extends SettingsDialog{
keyDown(key -> { keyDown(key -> {
if(key == KeyCode.ESCAPE || key == KeyCode.BACK){ if(key == KeyCode.ESCAPE || key == KeyCode.BACK){
if(prefs.getChildren().first() != menu){
back();
}else{
hide(); hide();
} }
}
}); });
} }
} }
@@ -42,10 +42,6 @@ public class HudFragment extends Fragment{
private boolean shown = true; private boolean shown = true;
private float dsize = 47.2f; private float dsize = 47.2f;
private float coreAttackTime;
private float lastCoreHP;
private Team lastTeam;
private float coreAttackOpacity = 0f;
private long lastToast; private long lastToast;
public void build(Group parent){ public void build(Group parent){
@@ -284,44 +280,29 @@ public class HudFragment extends Fragment{
parent.fill(t -> { parent.fill(t -> {
t.touchable(Touchable.disabled); t.touchable(Touchable.disabled);
float notifDuration = 240f; float notifDuration = 240f;
float[] coreAttackTime = {0};
float[] coreAttackOpacity = {0};
Events.on(StateChangeEvent.class, event -> { Events.on(Trigger.teamCoreDamage, () -> {
if(event.to == State.menu || event.from == State.menu){ coreAttackTime[0] = notifDuration;
coreAttackTime = 0f;
lastCoreHP = Float.NaN;
}
}); });
t.top().visible(() -> { t.top().visible(() -> {
if(state.is(State.menu) || state.teams.get(player.getTeam()).cores.size == 0 || state.teams.get(player.getTeam()).cores.first().entity == null){ if(state.is(State.menu) || state.teams.get(player.getTeam()).cores.size == 0 || state.teams.get(player.getTeam()).cores.first().entity == null){
coreAttackTime = 0f; coreAttackTime[0] = 0f;
return false; return false;
} }
float curr = state.teams.get(player.getTeam()).cores.first().entity.health; t.getColor().a = coreAttackOpacity[0];
if(coreAttackTime[0] > 0){
if(lastTeam != player.getTeam()){ coreAttackOpacity[0] = Mathf.lerpDelta(coreAttackOpacity[0], 1f, 0.1f);
lastCoreHP = curr;
lastTeam = player.getTeam();
return false;
}
if(!Float.isNaN(lastCoreHP) && curr < lastCoreHP){
coreAttackTime = notifDuration;
}
lastCoreHP = curr;
t.getColor().a = coreAttackOpacity;
if(coreAttackTime > 0){
coreAttackOpacity = Mathf.lerpDelta(coreAttackOpacity, 1f, 0.1f);
}else{ }else{
coreAttackOpacity = Mathf.lerpDelta(coreAttackOpacity, 0f, 0.1f); coreAttackOpacity[0] = Mathf.lerpDelta(coreAttackOpacity[0], 0f, 0.1f);
} }
coreAttackTime -= Time.delta(); coreAttackTime[0] -= Time.delta();
lastTeam = player.getTeam();
return coreAttackOpacity > 0; return coreAttackOpacity[0] > 0;
}); });
t.table(Tex.button, top -> top.add("$coreattack").pad(2) t.table(Tex.button, top -> top.add("$coreattack").pad(2)
.update(label -> label.getColor().set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled); .update(label -> label.getColor().set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled);
+16 -9
View File
@@ -207,7 +207,8 @@ public class Block extends BlockStorage{
if(tile == null || tile.entity == null || tile.entity.power == null) return out; if(tile == null || tile.entity == null || tile.entity.power == null) return out;
for(Tile other : tile.entity.proximity()){ for(Tile other : tile.entity.proximity()){
if(other != null && other.entity != null && other.entity.power != null && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) if(other != null && other.entity != null && other.entity.power != null
&& !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower)
&& !tile.entity.power.links.contains(other.pos())){ && !tile.entity.power.links.contains(other.pos())){
out.add(other); out.add(other);
} }
@@ -221,11 +222,7 @@ public class Block extends BlockStorage{
} }
protected float getProgressIncrease(TileEntity entity, float baseTime){ protected float getProgressIncrease(TileEntity entity, float baseTime){
float progressIncrease = 1f / baseTime * entity.delta(); return 1f / baseTime * entity.delta() * entity.efficiency();
if(hasPower){
progressIncrease *= entity.power.satisfaction; // Reduced increase in case of low power
}
return progressIncrease;
} }
/** @return whether this block should play its active sound.*/ /** @return whether this block should play its active sound.*/
@@ -370,6 +367,16 @@ public class Block extends BlockStorage{
return sum; return sum;
} }
public float percentSolid(int x, int y){
Tile tile = world.tile(x, y);
if(tile == null) return 0;
float sum = 0;
for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){
sum += !other.floor.isLiquid ? 1f : 0f;
}
return sum / size / size;
}
@Override @Override
public String localizedName(){ public String localizedName(){
return localizedName; return localizedName;
@@ -536,8 +543,8 @@ public class Block extends BlockStorage{
boolean buffered = cons.buffered; boolean buffered = cons.buffered;
float capacity = cons.capacity; float capacity = cons.capacity;
bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.satisfaction * capacity) ? "<ERROR>" : (int)(entity.power.satisfaction * capacity)) : bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.status * capacity) ? "<ERROR>" : (int)(entity.power.status * capacity)) :
Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.isZero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.satisfaction)); Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.zero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.status));
} }
if(hasItems && configurable){ if(hasItems && configurable){
@@ -598,7 +605,7 @@ public class Block extends BlockStorage{
} }
if(consumes.hasPower() && consumes.getPower().buffered){ if(consumes.hasPower() && consumes.getPower().buffered){
power += tile.entity.power.satisfaction * consumes.getPower().capacity; power += tile.entity.power.status * consumes.getPower().capacity;
} }
if(hasLiquids){ if(hasLiquids){
@@ -28,6 +28,7 @@ public abstract class BlockStorage extends UnlockableContent{
public int itemCapacity = 10; public int itemCapacity = 10;
public float liquidCapacity = 10f; public float liquidCapacity = 10f;
public float liquidPressure = 1f;
public final BlockStats stats = new BlockStats(); public final BlockStats stats = new BlockStats();
public final BlockBars bars = new BlockBars(); public final BlockBars bars = new BlockBars();
@@ -150,7 +151,7 @@ public abstract class BlockStorage extends UnlockableContent{
if(next.block().acceptLiquid(next, tile, liquid, 0f)){ if(next.block().acceptLiquid(next, tile, liquid, 0f)){
float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity; float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity;
float fract = tile.entity.liquids.get(liquid) / liquidCapacity; float fract = tile.entity.liquids.get(liquid) / liquidCapacity * liquidPressure;
float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.entity.liquids.get(liquid)); float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.entity.liquids.get(liquid));
flow = Math.min(flow, next.block().liquidCapacity - next.entity.liquids.get(liquid) - 0.001f); flow = Math.min(flow, next.block().liquidCapacity - next.entity.liquids.get(liquid) - 0.001f);
@@ -318,6 +318,31 @@ public class Tile implements Position, TargetTrait{
return null; return null;
} }
public Tile getNearbyLink(int rotation){
if(rotation == 0) return world.ltile(x + 1, y);
if(rotation == 1) return world.ltile(x, y + 1);
if(rotation == 2) return world.ltile(x - 1, y);
if(rotation == 3) return world.ltile(x, y - 1);
return null;
}
// B A
public Tile front(){
return getNearbyLink((rotation + 4) % 4);
}
public Tile right(){
return getNearbyLink((rotation + 3) % 4);
}
public Tile back(){
return getNearbyLink((rotation + 2) % 4);
}
public Tile left(){
return getNearbyLink((rotation + 1) % 4);
}
public boolean interactable(Team team){ public boolean interactable(Team team){
return getTeam() == Team.derelict || team == getTeam(); return getTeam() == Team.derelict || team == getTeam();
} }
@@ -108,12 +108,12 @@ public class ForceProjector extends Block{
Effects.effect(Fx.reactorsmoke, tile.drawx() + Mathf.range(tilesize / 2f), tile.drawy() + Mathf.range(tilesize / 2f)); Effects.effect(Fx.reactorsmoke, tile.drawx() + Mathf.range(tilesize / 2f), tile.drawy() + Mathf.range(tilesize / 2f));
} }
entity.warmup = Mathf.lerpDelta(entity.warmup, entity.power.satisfaction, 0.1f); entity.warmup = Mathf.lerpDelta(entity.warmup, entity.efficiency(), 0.1f);
/* /*
if(entity.power.satisfaction < relativePowerDraw){ if(entity.power.status < relativePowerDraw){
entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f); entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f);
entity.power.satisfaction = 0f; entity.power.status = 0f;
if(entity.warmup <= 0.09f){ if(entity.warmup <= 0.09f){
entity.broken = true; entity.broken = true;
} }
@@ -70,7 +70,7 @@ public class MendProjector extends Block{
entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f); entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f);
if(entity.cons.optionalValid() && entity.timer.get(timerUse, useTime) && entity.power.satisfaction > 0){ if(entity.cons.optionalValid() && entity.timer.get(timerUse, useTime) && entity.efficiency() > 0){
entity.cons.trigger(); entity.cons.trigger();
} }
@@ -90,7 +90,7 @@ public class MendProjector extends Block{
if(other == null) continue; if(other == null) continue;
if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){
other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat * phaseBoost) / 100f * entity.power.satisfaction); other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat * phaseBoost) / 100f * entity.efficiency());
Effects.effect(Fx.healBlockFull, Tmp.c1.set(color).lerp(phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); Effects.effect(Fx.healBlockFull, Tmp.c1.set(color).lerp(phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size);
healed.add(other.pos()); healed.add(other.pos());
} }
@@ -134,7 +134,7 @@ public class MendProjector extends Block{
@Override @Override
public void drawLight(Tile tile){ public void drawLight(Tile tile){
renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.power.satisfaction, color, 0.7f * tile.entity.power.satisfaction); renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency());
} }
@Override @Override
@@ -68,7 +68,7 @@ public class OverdriveProjector extends Block{
@Override @Override
public void drawLight(Tile tile){ public void drawLight(Tile tile){
renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.power.satisfaction, color, 0.7f * tile.entity.power.satisfaction); renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency());
} }
@Override @Override
@@ -79,13 +79,13 @@ public class OverdriveProjector extends Block{
entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f); entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f);
if(entity.timer.get(timerUse, useTime) && entity.power.satisfaction > 0){ if(entity.timer.get(timerUse, useTime) && entity.efficiency() > 0){
entity.cons.trigger(); entity.cons.trigger();
} }
if(entity.charge >= reload){ if(entity.charge >= reload){
float realRange = range + entity.phaseHeat * phaseRangeBoost; float realRange = range + entity.phaseHeat * phaseRangeBoost;
float realBoost = (speedBoost + entity.phaseHeat * speedBoostPhase) * entity.power.satisfaction; float realBoost = (speedBoost + entity.phaseHeat * speedBoostPhase) * entity.efficiency();
entity.charge = 0f; entity.charge = 0f;
@@ -47,6 +47,6 @@ public class PowerTurret extends CooledTurret{
@Override @Override
protected float baseReloadSpeed(Tile tile){ protected float baseReloadSpeed(Tile tile){
return tile.isEnemyCheat() ? 1f : tile.entity.power.satisfaction; return tile.isEnemyCheat() ? 1f : tile.entity.power.status;
} }
} }
@@ -200,7 +200,7 @@ public class Conveyor extends Block implements Autotiler{
if(maxmove > minmove){ if(maxmove > minmove){
pos.y += maxmove; pos.y += maxmove;
if(Mathf.isEqual(pos.x, 0, 0.1f)){ if(Mathf.equal(pos.x, 0, 0.1f)){
pos.x = 0f; pos.x = 0f;
} }
pos.x = Mathf.lerpDelta(pos.x, 0, 0.1f); pos.x = Mathf.lerpDelta(pos.x, 0, 0.1f);
@@ -45,18 +45,7 @@ public class ItemBridge extends Block{
@Override @Override
public void configured(Tile tile, Player player, int value){ public void configured(Tile tile, Player player, int value){
ItemBridgeEntity entity = tile.entity(); tile.<ItemBridgeEntity>entity().link = value;
if(world.tile(entity.link) != null && world.tile(entity.link).entity instanceof ItemBridgeEntity){
ItemBridgeEntity oe = world.tile(entity.link).entity();
oe.incoming.remove(tile.pos());
}
entity.link = value;
if(world.tile(value) != null && world.tile(value).entity instanceof ItemBridgeEntity){
((ItemBridgeEntity)world.tile(value).entity).incoming.add(tile.pos());
}
} }
@Override @Override
@@ -195,8 +184,9 @@ public class ItemBridge extends Block{
tryDump(tile); tryDump(tile);
entity.uptime = 0f; entity.uptime = 0f;
}else{ }else{
((ItemBridgeEntity)world.tile(entity.link).entity).incoming.add(tile.pos());
if(entity.cons.valid() && (!hasPower || Mathf.isZero(1f - entity.power.satisfaction))){ if(entity.cons.valid() && Mathf.zero(1f - entity.efficiency())){
entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, 0.04f); entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, 0.04f);
}else{ }else{
entity.uptime = Mathf.lerpDelta(entity.uptime, 0f, 0.02f); entity.uptime = Mathf.lerpDelta(entity.uptime, 0f, 0.02f);
@@ -32,7 +32,7 @@ public class LiquidBridge extends ItemBridge{
if(entity.cons.valid()){ if(entity.cons.valid()){
float alpha = 0.04f; float alpha = 0.04f;
if(hasPower){ if(hasPower){
alpha *= entity.power.satisfaction; // Exceed boot time unless power is at max. alpha *= entity.efficiency(); // Exceed boot time unless power is at max.
} }
entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, alpha); entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, alpha);
}else{ }else{
@@ -77,7 +77,7 @@ public class MassDriver extends Block{
//reload regardless of state //reload regardless of state
if(entity.reload > 0f){ if(entity.reload > 0f){
entity.reload = Mathf.clamp(entity.reload - entity.delta() / reloadTime * entity.power.satisfaction); entity.reload = Mathf.clamp(entity.reload - entity.delta() / reloadTime * entity.efficiency());
} }
//cleanup waiting shooters that are not valid //cleanup waiting shooters that are not valid
@@ -113,7 +113,7 @@ public class MassDriver extends Block{
} }
//align to shooter rotation //align to shooter rotation
entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(entity.currentShooter()), rotateSpeed * entity.power.satisfaction); entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(entity.currentShooter()), rotateSpeed * entity.efficiency());
}else if(entity.state == DriverState.shooting){ }else if(entity.state == DriverState.shooting){
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail //if there's nothing to shoot at OR someone wants to shoot at this thing, bail
if(!hasLink || (!entity.waitingShooters.isEmpty() && (itemCapacity - entity.items.total() >= minDistribute))){ if(!hasLink || (!entity.waitingShooters.isEmpty() && (itemCapacity - entity.items.total() >= minDistribute))){
@@ -133,7 +133,7 @@ public class MassDriver extends Block{
if(entity.reload <= 0.0001f){ if(entity.reload <= 0.0001f){
//align to target location //align to target location
entity.rotation = Mathf.slerpDelta(entity.rotation, targetRotation, rotateSpeed * entity.power.satisfaction); entity.rotation = Mathf.slerpDelta(entity.rotation, targetRotation, rotateSpeed * entity.efficiency());
//fire when it's the first in the queue and angles are ready. //fire when it's the first in the queue and angles are ready.
if(other.currentShooter() == tile && if(other.currentShooter() == tile &&
@@ -17,7 +17,7 @@ import io.anuke.mindustry.world.meta.*;
import java.io.*; import java.io.*;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.*;
public class ImpactReactor extends PowerGenerator{ public class ImpactReactor extends PowerGenerator{
protected int timerUse = timers++; protected int timerUse = timers++;
@@ -71,11 +71,11 @@ public class ImpactReactor extends PowerGenerator{
public void update(Tile tile){ public void update(Tile tile){
FusionReactorEntity entity = tile.entity(); FusionReactorEntity entity = tile.entity();
if(entity.cons.valid() && entity.power.satisfaction >= 0.99f){ if(entity.cons.valid() && entity.power.status >= 0.99f){
boolean prevOut = getPowerProduction(tile) <= consumes.getPower().requestedPower(entity); boolean prevOut = getPowerProduction(tile) <= consumes.getPower().requestedPower(entity);
entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, warmupSpeed); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, warmupSpeed);
if(Mathf.isEqual(entity.warmup, 1f, 0.001f)){ if(Mathf.equal(entity.warmup, 1f, 0.001f)){
entity.warmup = 1f; entity.warmup = 1f;
} }
@@ -116,6 +116,12 @@ public class ImpactReactor extends PowerGenerator{
Draw.color(); Draw.color();
} }
@Override
public void drawLight(Tile tile){
float fract = tile.<FusionReactorEntity>entity().warmup;
renderer.lights.add(tile.drawx(), tile.drawy(), (110f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(plasma2).lerp(plasma1, Mathf.absin(7f, 0.2f)), 0.8f * fract);
}
@Override @Override
public TextureRegion[] generateIcons(){ public TextureRegion[] generateIcons(){
return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name)}; return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name)};
@@ -1,22 +1,36 @@
package io.anuke.mindustry.world.blocks.power; package io.anuke.mindustry.world.blocks.power;
import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.*;
import static io.anuke.mindustry.Vars.renderer; import static io.anuke.mindustry.Vars.renderer;
public class LightBlock extends Block{ public class LightBlock extends Block{
protected Color color = Color.royal; protected Color color = Color.royal;
protected float brightness = 0.5f;
protected float radius = 200f; protected float radius = 200f;
protected int topRegion;
public LightBlock(String name){ public LightBlock(String name){
super(name); super(name);
hasPower = true; hasPower = true;
update = true; update = true;
topRegion = reg("-top");
}
@Override
public void draw(Tile tile){
super.draw(tile);
Draw.blend(Blending.additive);
Draw.color(color, tile.entity.efficiency() * 0.3f);
Draw.rect(reg(topRegion), tile.drawx(), tile.drawy());
Draw.color();
Draw.blend();
} }
@Override @Override
public void drawLight(Tile tile){ public void drawLight(Tile tile){
renderer.lights.add(tile.drawx(), tile.drawy(), radius, color, 0.5f * tile.entity.power.satisfaction); renderer.lights.add(tile.drawx(), tile.drawy(), radius, color, brightness * tile.entity.efficiency());
} }
} }
@@ -1,39 +1,37 @@
package io.anuke.mindustry.world.blocks.power; package io.anuke.mindustry.world.blocks.power;
import io.anuke.arc.*; import io.anuke.arc.*;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.*;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.*;
import io.anuke.arc.util.Time; import io.anuke.arc.util.*;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.Damage; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.gen.*; import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.ui.*;
import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.*; import io.anuke.mindustry.world.consumers.*;
import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.*;
import io.anuke.mindustry.world.meta.StatUnit;
import java.io.*; import java.io.*;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.*;
public class NuclearReactor extends PowerGenerator{ public class NuclearReactor extends PowerGenerator{
protected final int timerFuel = timers++; protected final int timerFuel = timers++;
protected final Vector2 tr = new Vector2(); protected final Vector2 tr = new Vector2();
protected Color lightColor = Color.valueOf("b174f1");
protected Color coolColor = new Color(1, 1, 1, 0f); protected Color coolColor = new Color(1, 1, 1, 0f);
protected Color hotColor = Color.valueOf("ff9575a3"); protected Color hotColor = Color.valueOf("ff9575a3");
protected float itemDuration = 120; //time to consume 1 fuel protected float itemDuration = 120; //time to consume 1 fuel
protected float heating = 0.01f; //heating per frame * fullness protected float heating = 0.005f; //heating per frame * fullness
protected float smokeThreshold = 0.3f; //threshold at which block starts smoking protected float smokeThreshold = 0.3f; //threshold at which block starts smoking
protected int explosionRadius = 40; protected int explosionRadius = 40;
protected int explosionDamage = 1350; protected int explosionDamage = 1350;
@@ -127,7 +125,7 @@ public class NuclearReactor extends PowerGenerator{
int fuel = entity.items.get(consumes.<ConsumeItems>get(ConsumeType.item).items[0].item); int fuel = entity.items.get(consumes.<ConsumeItems>get(ConsumeType.item).items[0].item);
if(fuel < 5 && entity.heat < 0.5f) return; if((fuel < 5 && entity.heat < 0.5f) || !state.rules.reactorExplosions) return;
Effects.shake(6f, 16f, tile.worldx(), tile.worldy()); Effects.shake(6f, 16f, tile.worldx(), tile.worldy());
Effects.effect(Fx.nuclearShockwave, tile.worldx(), tile.worldy()); Effects.effect(Fx.nuclearShockwave, tile.worldx(), tile.worldy());
@@ -152,6 +150,13 @@ public class NuclearReactor extends PowerGenerator{
} }
} }
@Override
public void drawLight(Tile tile){
NuclearReactorEntity entity = tile.entity();
float fract = entity.productionEfficiency;
renderer.lights.add(tile.drawx(), tile.drawy(), (90f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(lightColor).lerp(Color.scarlet, entity.heat), 0.6f * fract);
}
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
super.draw(tile); super.draw(tile);
@@ -0,0 +1,89 @@
package io.anuke.mindustry.world.blocks.power;
import io.anuke.arc.Core;
import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.ui.Bar;
import io.anuke.arc.util.Eachable;
import io.anuke.mindustry.ui.Cicon;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.Block;
import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.mindustry.entities.traits.BuilderTrait;
public class PowerDiode extends Block{
protected TextureRegion arrow;
public PowerDiode(String name){
super(name);
rotate = true;
update = true;
solid = true;
insulated = true;
}
@Override
public void update(Tile tile){
super.update(tile);
if(!tile.back().block().hasPower || !tile.front().block().hasPower) return;
PowerGraph backGraph = tile.back().entity.power.graph;
PowerGraph frontGraph = tile.front().entity.power.graph;
if(backGraph == frontGraph) return;
// 0f - 1f of battery capacity in use
float backStored = backGraph.getBatteryStored() / backGraph.getTotalBatteryCapacity();
float frontStored = frontGraph.getBatteryStored() / frontGraph.getTotalBatteryCapacity();
// try to send if the back side has more % capacity stored than the front side
if(backStored > frontStored) {
// send half of the difference
float amount = backGraph.getBatteryStored() * (backStored - frontStored) / 2;
// prevent sending more than the front can handle
amount = Mathf.clamp(amount, 0, frontGraph.getTotalBatteryCapacity() * (1 - frontStored));
backGraph.useBatteries(amount);
frontGraph.chargeBatteries(amount);
}
}
// battery % of the graph on either side, defaults to zero
protected float bar(Tile tile){
return tile.block().hasPower ? tile.entity.power.graph.getBatteryStored() / tile.entity.power.graph.getTotalBatteryCapacity() : 0f;
}
@Override
public void setBars(){
super.setBars();
bars.add("back", entity -> new Bar("bar.input", Pal.lighterOrange, () -> bar(entity.tile.back())) );
bars.add("front", entity -> new Bar("bar.output", Pal.lighterOrange, () -> bar(entity.tile.front())) );
}
@Override
public void load(){
super.load();
arrow = Core.atlas.find(name + "-arrow");
}
@Override
public void draw(Tile tile){
Draw.rect(region, tile.drawx(), tile.drawy(), 0);
Draw.rect(arrow, tile.drawx(), tile.drawy(), rotate ? tile.rotation() * 90 : 0);
}
@Override
public void drawRequestRegion(BuilderTrait.BuildRequest req, Eachable<BuilderTrait.BuildRequest> list) {
TextureRegion reg = icon(Cicon.full);
Draw.rect(icon(Cicon.full), req.drawx(), req.drawy(),
reg.getWidth() * req.animScale * Draw.scl,
reg.getHeight() * req.animScale * Draw.scl,
0);
Draw.rect(arrow, req.drawx(), req.drawy(),
arrow.getWidth() * req.animScale * Draw.scl,
arrow.getHeight() * req.animScale * Draw.scl,
!rotate ? 0 : req.rotation * 90);
}
}
@@ -47,9 +47,9 @@ public class PowerGraph{
} }
public float getSatisfaction(){ public float getSatisfaction(){
if(Mathf.isZero(lastPowerProduced)){ if(Mathf.zero(lastPowerProduced)){
return 0f; return 0f;
}else if(Mathf.isZero(lastPowerNeeded)){ }else if(Mathf.zero(lastPowerNeeded)){
return 1f; return 1f;
} }
return Mathf.clamp(lastPowerProduced / lastPowerNeeded); return Mathf.clamp(lastPowerProduced / lastPowerNeeded);
@@ -83,7 +83,7 @@ public class PowerGraph{
for(Tile battery : batteries){ for(Tile battery : batteries){
Consumers consumes = battery.block().consumes; Consumers consumes = battery.block().consumes;
if(consumes.hasPower()){ if(consumes.hasPower()){
totalAccumulator += battery.entity.power.satisfaction * consumes.getPower().capacity; totalAccumulator += battery.entity.power.status * consumes.getPower().capacity;
} }
} }
return totalAccumulator; return totalAccumulator;
@@ -94,7 +94,7 @@ public class PowerGraph{
for(Tile battery : batteries){ for(Tile battery : batteries){
if(battery.block().consumes.hasPower()){ if(battery.block().consumes.hasPower()){
ConsumePower power = battery.block().consumes.getPower(); ConsumePower power = battery.block().consumes.getPower();
totalCapacity += (1f - battery.entity.power.satisfaction) * power.capacity; totalCapacity += (1f - battery.entity.power.status) * power.capacity;
} }
} }
return totalCapacity; return totalCapacity;
@@ -112,14 +112,14 @@ public class PowerGraph{
public float useBatteries(float needed){ public float useBatteries(float needed){
float stored = getBatteryStored(); float stored = getBatteryStored();
if(Mathf.isEqual(stored, 0f)) return 0f; if(Mathf.equal(stored, 0f)) return 0f;
float used = Math.min(stored, needed); float used = Math.min(stored, needed);
float consumedPowerPercentage = Math.min(1.0f, needed / stored); float consumedPowerPercentage = Math.min(1.0f, needed / stored);
for(Tile battery : batteries){ for(Tile battery : batteries){
Consumers consumes = battery.block().consumes; Consumers consumes = battery.block().consumes;
if(consumes.hasPower()){ if(consumes.hasPower()){
battery.entity.power.satisfaction *= (1f-consumedPowerPercentage); battery.entity.power.status *= (1f-consumedPowerPercentage);
} }
} }
return used; return used;
@@ -129,14 +129,14 @@ public class PowerGraph{
float capacity = getBatteryCapacity(); float capacity = getBatteryCapacity();
//how much of the missing in each battery % is charged //how much of the missing in each battery % is charged
float chargedPercent = Math.min(excess/capacity, 1f); float chargedPercent = Math.min(excess/capacity, 1f);
if(Mathf.isEqual(capacity, 0f)) return 0f; if(Mathf.equal(capacity, 0f)) return 0f;
for(Tile battery : batteries){ for(Tile battery : batteries){
Consumers consumes = battery.block().consumes; Consumers consumes = battery.block().consumes;
if(consumes.hasPower()){ if(consumes.hasPower()){
ConsumePower consumePower = consumes.getPower(); ConsumePower consumePower = consumes.getPower();
if(consumePower.capacity > 0f){ if(consumePower.capacity > 0f){
battery.entity.power.satisfaction += (1f-battery.entity.power.satisfaction) * chargedPercent; battery.entity.power.status += (1f-battery.entity.power.status) * chargedPercent;
} }
} }
} }
@@ -145,26 +145,26 @@ public class PowerGraph{
public void distributePower(float needed, float produced){ public void distributePower(float needed, float produced){
//distribute even if not needed. this is because some might be requiring power but not using it; it updates consumers //distribute even if not needed. this is because some might be requiring power but not using it; it updates consumers
float coverage = Mathf.isZero(needed) && Mathf.isZero(produced) ? 0f : Mathf.isZero(needed) ? 1f : Math.min(1, produced / needed); float coverage = Mathf.zero(needed) && Mathf.zero(produced) ? 0f : Mathf.zero(needed) ? 1f : Math.min(1, produced / needed);
for(Tile consumer : consumers){ for(Tile consumer : consumers){
Consumers consumes = consumer.block().consumes; Consumers consumes = consumer.block().consumes;
if(consumes.hasPower()){ if(consumes.hasPower()){
ConsumePower consumePower = consumes.getPower(); ConsumePower consumePower = consumes.getPower();
if(consumePower.buffered){ if(consumePower.buffered){
if(!Mathf.isZero(consumePower.capacity)){ if(!Mathf.zero(consumePower.capacity)){
// Add an equal percentage of power to all buffers, based on the global power coverage in this graph // Add an equal percentage of power to all buffers, based on the global power coverage in this graph
float maximumRate = consumePower.requestedPower(consumer.entity) * coverage * consumer.entity.delta(); float maximumRate = consumePower.requestedPower(consumer.entity) * coverage * consumer.entity.delta();
consumer.entity.power.satisfaction = Mathf.clamp(consumer.entity.power.satisfaction + maximumRate / consumePower.capacity); consumer.entity.power.status = Mathf.clamp(consumer.entity.power.status + maximumRate / consumePower.capacity);
} }
}else{ }else{
//valid consumers get power as usual //valid consumers get power as usual
if(otherConsumersAreValid(consumer, consumePower)){ if(otherConsumersAreValid(consumer, consumePower)){
consumer.entity.power.satisfaction = coverage; consumer.entity.power.status = coverage;
}else{ //invalid consumers get an estimate, if they were to activate }else{ //invalid consumers get an estimate, if they were to activate
consumer.entity.power.satisfaction = Math.min(1, produced / (needed + consumePower.usage * consumer.entity.delta())); consumer.entity.power.status = Math.min(1, produced / (needed + consumePower.usage * consumer.entity.delta()));
//just in case //just in case
if(Float.isNaN(consumer.entity.power.satisfaction)){ if(Float.isNaN(consumer.entity.power.status)){
consumer.entity.power.satisfaction = 0f; consumer.entity.power.status = 0f;
} }
} }
} }
@@ -176,9 +176,9 @@ public class PowerGraph{
if(Core.graphics.getFrameId() == lastFrameUpdated){ if(Core.graphics.getFrameId() == lastFrameUpdated){
return; return;
}else if(!consumers.isEmpty() && consumers.first().isEnemyCheat()){ }else if(!consumers.isEmpty() && consumers.first().isEnemyCheat()){
//when cheating, just set satisfaction to 1 //when cheating, just set status to 1
for(Tile tile : consumers){ for(Tile tile : consumers){
tile.entity.power.satisfaction = 1f; tile.entity.power.status = 1f;
} }
return; return;
@@ -198,7 +198,7 @@ public class PowerGraph{
return; return;
} }
if(!Mathf.isEqual(powerNeeded, powerProduced)){ if(!Mathf.equal(powerNeeded, powerProduced)){
if(powerNeeded > powerProduced){ if(powerNeeded > powerProduced){
powerProduced += useBatteries(powerNeeded - powerProduced); powerProduced += useBatteries(powerNeeded - powerProduced);
}else if(powerProduced > powerNeeded){ }else if(powerProduced > powerNeeded){
@@ -19,6 +19,8 @@ import io.anuke.mindustry.world.meta.*;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class PowerNode extends PowerBlock{ public class PowerNode extends PowerBlock{
protected static boolean returnValue = false;
protected ObjectSet<PowerGraph> graphs = new ObjectSet<>(); protected ObjectSet<PowerGraph> graphs = new ObjectSet<>();
protected Vector2 t1 = new Vector2(), t2 = new Vector2(); protected Vector2 t1 = new Vector2(), t2 = new Vector2();
protected TextureRegion laser, laserEnd; protected TextureRegion laser, laserEnd;
@@ -305,7 +307,7 @@ public class PowerNode extends PowerBlock{
public boolean overlaps(@Nullable Tile src, @Nullable Tile other){ public boolean overlaps(@Nullable Tile src, @Nullable Tile other){
if(src == null || other == null) return true; if(src == null || other == null) return true;
return overlaps(src.drawx(), src.drawy(), other, laserRange * tilesize); return Intersector.overlaps(Tmp.cr1.set(src.worldx() + offset(), src.worldy() + offset(), laserRange * tilesize), Tmp.r1.setSize(size * tilesize).setCenter(other.worldx() + offset(), other.worldy() + offset()));
} }
protected void drawLaser(Tile tile, Tile target){ protected void drawLaser(Tile tile, Tile target){
@@ -339,11 +341,9 @@ public class PowerNode extends PowerBlock{
} }
public static boolean insulated(int x, int y, int x2, int y2){ public static boolean insulated(int x, int y, int x2, int y2){
final Boolean[] bool = {false}; returnValue = false;
insulators(x, y, x2, y2, cause -> { insulators(x, y, x2, y2, cause -> returnValue = true);
bool[0] = true; return returnValue;
});
return bool[0];
} }
public static void insulators(int x, int y, int x2, int y2, Cons<Tile> iterator){ public static void insulators(int x, int y, int x2, int y2, Cons<Tile> iterator){
@@ -257,9 +257,7 @@ public class Drill extends Block{
speed = liquidBoostIntensity; speed = liquidBoostIntensity;
} }
if(hasPower){ speed *= entity.efficiency(); // Drill slower when not at full power
speed *= entity.power.satisfaction; // Drill slower when not at full power
}
entity.lastDrillSpeed = (speed * entity.dominantItems * entity.warmup) / (drillTime + hardnessDrillMultiplier * entity.dominantItem.hardness); entity.lastDrillSpeed = (speed * entity.dominantItems * entity.warmup) / (drillTime + hardnessDrillMultiplier * entity.dominantItem.hardness);
entity.warmup = Mathf.lerpDelta(entity.warmup, speed, warmupSpeed); entity.warmup = Mathf.lerpDelta(entity.warmup, speed, warmupSpeed);
@@ -79,7 +79,7 @@ public class Fracker extends SolidPump{
} }
super.update(tile); super.update(tile);
entity.accumulator += entity.delta() * entity.power.satisfaction; entity.accumulator += entity.delta() * entity.efficiency();
}else{ }else{
tryDumpLiquid(tile, result); tryDumpLiquid(tile, result);
} }
@@ -38,10 +38,8 @@ public class LiquidConverter extends GenericCrafter{
ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid);
if(tile.entity.cons.valid()){ if(tile.entity.cons.valid()){
float use = Math.min(cl.amount * entity.delta(), liquidCapacity - entity.liquids.get(outputLiquid.liquid)); float use = Math.min(cl.amount * entity.delta(), liquidCapacity - entity.liquids.get(outputLiquid.liquid)) * entity.efficiency();
if(hasPower){
use *= entity.power.satisfaction; // Produce less liquid if power is not maxed
}
useContent(tile, outputLiquid.liquid); useContent(tile, outputLiquid.liquid);
entity.progress += use / cl.amount / craftTime; entity.progress += use / cl.amount / craftTime;
entity.liquids.add(outputLiquid.liquid, use); entity.liquids.add(outputLiquid.liquid, use);
@@ -119,10 +119,7 @@ public class Pump extends LiquidBlock{
} }
if(tile.entity.cons.valid() && liquidDrop != null){ if(tile.entity.cons.valid() && liquidDrop != null){
float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size); float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size) * tile.entity.efficiency();
if(hasPower){
maxPump *= tile.entity.power.satisfaction; // Produce slower if not at full power
}
tile.entity.liquids.add(liquidDrop, maxPump); tile.entity.liquids.add(liquidDrop, maxPump);
} }
@@ -42,7 +42,7 @@ public class SolidPump extends Pump{
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid){ public void drawPlace(int x, int y, int rotation, boolean valid){
if(attribute != null){ if(attribute != null){
drawPlaceText(Core.bundle.formatFloat("bar.efficiency", (sumAttribute(attribute, x, y) + 1f) * 100, 1), x, y, valid); drawPlaceText(Core.bundle.formatFloat("bar.efficiency", (sumAttribute(attribute, x, y) + 1f) * 100 * percentSolid(x, y), 1), x, y, valid);
} }
} }
@@ -51,7 +51,7 @@ public class SolidPump extends Pump{
super.setBars(); super.setBars();
bars.add("efficiency", entity -> new Bar(() -> bars.add("efficiency", entity -> new Bar(() ->
Core.bundle.formatFloat("bar.efficiency", Core.bundle.formatFloat("bar.efficiency",
((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100, 1), ((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100 * percentSolid(entity.tile.x, entity.tile.y), 1),
() -> Pal.ammo, () -> Pal.ammo,
() -> ((SolidPumpEntity)entity).warmup)); () -> ((SolidPumpEntity)entity).warmup));
} }
@@ -101,7 +101,7 @@ public class SolidPump extends Pump{
fraction += entity.boost; fraction += entity.boost;
if(tile.entity.cons.valid() && typeLiquid(tile) < liquidCapacity - 0.001f){ if(tile.entity.cons.valid() && typeLiquid(tile) < liquidCapacity - 0.001f){
float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.power.satisfaction); float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.efficiency());
tile.entity.liquids.add(result, maxPump); tile.entity.liquids.add(result, maxPump);
entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.02f); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.02f);
if(Mathf.chance(entity.delta() * updateEffectChance)) if(Mathf.chance(entity.delta() * updateEffectChance))
@@ -135,6 +135,14 @@ public class CoreBlock extends StorageBlock{
return tile.entity instanceof StorageBlockEntity; return tile.entity instanceof StorageBlockEntity;
} }
@Override
public float handleDamage(Tile tile, float amount){
if(player != null && tile.getTeam() == player.getTeam()){
Events.fire(Trigger.teamCoreDamage);
}
return amount;
}
@Override @Override
public boolean canBreak(Tile tile){ public boolean canBreak(Tile tile){
return false; return false;
@@ -100,7 +100,7 @@ public class RepairPoint extends Block{
if(entity.target != null && (entity.target.isDead() || entity.target.dst(tile) > repairRadius || entity.target.health >= entity.target.maxHealth())){ if(entity.target != null && (entity.target.isDead() || entity.target.dst(tile) > repairRadius || entity.target.health >= entity.target.maxHealth())){
entity.target = null; entity.target = null;
}else if(entity.target != null && entity.cons.valid()){ }else if(entity.target != null && entity.cons.valid()){
entity.target.health += repairSpeed * Time.delta() * entity.strength * entity.power.satisfaction; entity.target.health += repairSpeed * Time.delta() * entity.strength * entity.efficiency();
entity.target.clampHealth(); entity.target.clampHealth();
entity.rotation = Mathf.slerpDelta(entity.rotation, entity.angleTo(entity.target), 0.5f); entity.rotation = Mathf.slerpDelta(entity.rotation, entity.angleTo(entity.target), 0.5f);
targetIsBeingRepaired = true; targetIsBeingRepaired = true;
@@ -159,8 +159,8 @@ public class UnitFactory extends Block{
} }
if(entity.cons.valid() || tile.isEnemyCheat()){ if(entity.cons.valid() || tile.isEnemyCheat()){
entity.time += entity.delta() * entity.speedScl * Vars.state.rules.unitBuildSpeedMultiplier * entity.power.satisfaction; entity.time += entity.delta() * entity.speedScl * Vars.state.rules.unitBuildSpeedMultiplier * entity.efficiency();
entity.buildTime += entity.delta() * entity.power.satisfaction * Vars.state.rules.unitBuildSpeedMultiplier; entity.buildTime += entity.delta() * entity.efficiency() * Vars.state.rules.unitBuildSpeedMultiplier;
entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f);
}else{ }else{
entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f); entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f);
@@ -42,7 +42,7 @@ public class ConsumePower extends Consume{
@Override @Override
public void update(TileEntity entity){ public void update(TileEntity entity){
// Nothing to do since PowerGraph directly updates entity.power.satisfaction // Nothing to do since PowerGraph directly updates entity.power.status
} }
@Override @Override
@@ -50,7 +50,7 @@ public class ConsumePower extends Consume{
if(buffered){ if(buffered){
return true; return true;
}else{ }else{
return entity.power.satisfaction > 0f; return entity.power.status > 0f;
} }
} }
@@ -71,7 +71,7 @@ public class ConsumePower extends Consume{
public float requestedPower(TileEntity entity){ public float requestedPower(TileEntity entity){
if(entity.tile.entity == null) return 0f; if(entity.tile.entity == null) return 0f;
if(buffered){ if(buffered){
return (1f-entity.power.satisfaction)*capacity; return (1f-entity.power.status)*capacity;
}else{ }else{
try{ try{
return usage * Mathf.num(entity.block.shouldConsume(entity.tile)); return usage * Mathf.num(entity.block.shouldConsume(entity.tile));
@@ -41,9 +41,9 @@ public class AmmoListValue<T extends UnlockableContent> implements StatValue{
sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1))); sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1)));
} }
if(!Mathf.isEqual(type.ammoMultiplier, 1f)) if(!Mathf.equal(type.ammoMultiplier, 1f))
sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier)); sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier));
if(!Mathf.isEqual(type.reloadMultiplier, 1f)) if(!Mathf.equal(type.reloadMultiplier, 1f))
sep(bt, Core.bundle.format("bullet.reload", Strings.fixed(type.reloadMultiplier, 1))); sep(bt, Core.bundle.format("bullet.reload", Strings.fixed(type.reloadMultiplier, 1)));
if(type.knockback > 0){ if(type.knockback > 0){
@@ -13,7 +13,7 @@ public class PowerModule extends BlockModule{
* Blocks will work at a reduced efficiency if this is not equal to 1.0f. * Blocks will work at a reduced efficiency if this is not equal to 1.0f.
* In case of buffered consumers, this is the percentage of power stored in relation to the maximum capacity. * In case of buffered consumers, this is the percentage of power stored in relation to the maximum capacity.
*/ */
public float satisfaction = 0.0f; public float status = 0.0f;
public PowerGraph graph = new PowerGraph(); public PowerGraph graph = new PowerGraph();
public IntArray links = new IntArray(); public IntArray links = new IntArray();
@@ -23,7 +23,7 @@ public class PowerModule extends BlockModule{
for(int i = 0; i < links.size; i++){ for(int i = 0; i < links.size; i++){
stream.writeInt(links.get(i)); stream.writeInt(links.get(i));
} }
stream.writeFloat(satisfaction); stream.writeFloat(status);
} }
@Override @Override
@@ -32,7 +32,7 @@ public class PowerModule extends BlockModule{
for(int i = 0; i < amount; i++){ for(int i = 0; i < amount; i++){
links.add(stream.readInt()); links.add(stream.readInt());
} }
satisfaction = stream.readFloat(); status = stream.readFloat();
if(Float.isNaN(satisfaction) || Float.isInfinite(satisfaction)) satisfaction = 0f; if(Float.isNaN(status) || Float.isInfinite(status)) status = 0f;
} }
} }
+3 -3
View File
@@ -40,7 +40,7 @@ task dist(type: Jar, dependsOn: classes){
from {configurations.compile.collect {zipTree(it)}} from {configurations.compile.collect {zipTree(it)}}
from files(project.assetsDir) from files(project.assetsDir)
archiveName = "${appName}.jar" archiveFileName = "${appName}.jar"
manifest{ manifest{
attributes 'Main-Class': project.mainClassName attributes 'Main-Class': project.mainClassName
@@ -163,8 +163,8 @@ PackrConfig.Platform.values().each{ platform ->
task "zip${platform.toString()}"(type: Zip){ task "zip${platform.toString()}"(type: Zip){
from "build/packr/output" from "build/packr/output"
archiveName "${generateDeployName(platform.toString())}.zip" archiveFileName = "${generateDeployName(platform.toString())}.zip"
destinationDir(file("../deploy")) destinationDirectory = (file("../deploy"))
doLast{ doLast{
delete{ delete{
@@ -35,7 +35,6 @@ import java.util.*;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class DesktopLauncher extends ClientLauncher{ public class DesktopLauncher extends ClientLauncher{
public final static String discordID = "610508934456934412"; public final static String discordID = "610508934456934412";
+1 -1
View File
@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=60e1edbc61f05c329019d0c5479672a298a9706c archash=68a64d9e8a3016ad433d0959be78f6acdcdaa385
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
Vendored
+18 -2
View File
@@ -1,4 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
############################################################################## ##############################################################################
## ##
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"` APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS="" DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD="maximum"
Vendored
+17 -1
View File
@@ -1,3 +1,19 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off @if "%DEBUG%" == "" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS= set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe @rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome if defined JAVA_HOME goto findJavaFromJavaHome
+115 -10
View File
@@ -39,7 +39,8 @@ public class IOSLauncher extends IOSApplication.Delegate{
@Override @Override
public void showFileChooser(boolean open, String extension, Cons<FileHandle> cons){ public void showFileChooser(boolean open, String extension, Cons<FileHandle> cons){
UIDocumentBrowserViewController cont = new UIDocumentBrowserViewController((NSArray)null); UIDocumentBrowserViewController cont = new UIDocumentBrowserViewController((NSArray<NSString>)null);
NSArray<UIBarButtonItem> arr = new NSArray<>(new UIBarButtonItem(Core.bundle.get("cancel"), UIBarButtonItemStyle.Plain, NSArray<UIBarButtonItem> arr = new NSArray<>(new UIBarButtonItem(Core.bundle.get("cancel"), UIBarButtonItemStyle.Plain,
uiBarButtonItem -> cont.dismissViewController(true, () -> {}))); uiBarButtonItem -> cont.dismissViewController(true, () -> {})));
@@ -58,6 +59,112 @@ public class IOSLauncher extends IOSApplication.Delegate{
if(documentURLs.size() < 1) return; if(documentURLs.size() < 1) return;
cont.dismissViewController(true, () -> {}); cont.dismissViewController(true, () -> {});
NSFileCoordinator coord = new NSFileCoordinator(null);
try{
coord.coordinateReadingItem(documentURLs.get(0), NSFileCoordinatorReadingOptions.None, url -> {
if(url.startAccessingSecurityScopedResource()){
try{
controller.importDocument(url, new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (result, error) -> {
if(error != null){
ui.showErrorMessage("Import error.\n" + error.getLocalizedFailureReason() + "\n" + error.getLocalizedDescription());
}else{
try{
cons.get(Core.files.absolute(url.getPath()));
}catch(Throwable t){
ui.showException(t);
}
}
});
}catch(Throwable t){
ui.showException(t);
}
/*
try{
int[] tread = {0};
cons.get(new FileHandle(url.getPath()){
@Override
public InputStream read(){
NSInputStream stream = new NSInputStream(url);
return new InputStream(){
byte[] tmp = {0};
@Override
public int read() throws IOException{
read(tmp);
return tmp[0];
}
@Override
public int read(byte[] bytes, int offset, int length){
int read = (int)stream.read(bytes, offset, length);
tread[0] += read;
return read;
}
};
}
});
Core.app.post(() -> Core.app.post(() -> Core.app.post(() -> ui.showInfo("Read " + tread[0]))));
//cons.get(new FileHandle(url.getAbsoluteString()));
}catch(Throwable t){
ui.showException(t);
try{
cons.get(new FileHandle(url.getPath()));
}catch(Throwable t2){
ui.showException(t2);
try{
cons.get(new FileHandle(url.getAbsoluteURL().getPath()));
}catch(Throwable t3){
ui.showException(t3);
}
}
}*/
}else{
ui.showErrorMessage("Failed to access file.");
}
/*
try{
int[] tread = {0};
cons.get(new FileHandle(url.getPath()){
@Override
public InputStream read(){
NSInputStream stream = new NSInputStream(url);
return new InputStream(){
byte[] tmp = {0};
@Override
public int read() throws IOException{
read(tmp);
return tmp[0];
}
@Override
public int read(byte[] bytes, int offset, int length){
int read = (int)stream.read(bytes, offset, length);
tread[0] += read;
return read;
}
};
}
});
Core.app.post(() -> Core.app.post(() -> Core.app.post(() -> ui.showInfo("Read " + tread[0]))));
}catch(Throwable t){
ui.showException(t);
}*/
});
}catch(Throwable t){
ui.showException(t);
}
/*
try{ try{
controller.importDocument(documentURLs.get(0), new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (url, error) -> { controller.importDocument(documentURLs.get(0), new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (url, error) -> {
@@ -73,7 +180,7 @@ public class IOSLauncher extends IOSApplication.Delegate{
}); });
}catch(Throwable t){ }catch(Throwable t){
ui.showException(t); ui.showException(t);
} }*/
} }
@Override @Override
@@ -83,7 +190,7 @@ public class IOSLauncher extends IOSApplication.Delegate{
@Override @Override
public void didImportDocument(UIDocumentBrowserViewController controller, NSURL sourceURL, NSURL destinationURL){ public void didImportDocument(UIDocumentBrowserViewController controller, NSURL sourceURL, NSURL destinationURL){
cons.get(Core.files.absolute(destinationURL.getAbsoluteString())); //cons.get(Core.files.absolute(destinationURL.getAbsoluteString()));
} }
@Override @Override
@@ -104,24 +211,22 @@ public class IOSLauncher extends IOSApplication.Delegate{
cont.setDelegate(new ChooserDelegate()); cont.setDelegate(new ChooserDelegate());
// DispatchQueue.getMainQueue().sync(() -> {
UIApplication.getSharedApplication().getKeyWindow().getRootViewController().presentViewController(cont, true, () -> {}); UIApplication.getSharedApplication().getKeyWindow().getRootViewController().presentViewController(cont, true, () -> {});
// });
} }
@Override @Override
public void shareFile(FileHandle file){ public void shareFile(FileHandle file){
try{
Log.info("Attempting to share file " + file); Log.info("Attempting to share file " + file);
FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name());
file.copyTo(to); file.copyTo(to);
NSURL url = new NSURL(to.file()); NSURL url = new NSURL(to.file());
UIActivityViewController p = new UIActivityViewController(Collections.singletonList(url), null); UIActivityViewController p = new UIActivityViewController(Collections.singletonList(url), null);
UIApplication.getSharedApplication().getKeyWindow().getRootViewController().presentViewController(p, true, () -> Log.info("Success! Presented {0}", to));
//DispatchQueue.getMainQueue().sync(() -> { }catch(Throwable t){
UIApplication.getSharedApplication().getKeyWindow().getRootViewController() ui.showException(t);
.presentViewController(p, true, () -> Log.info("Success! Presented {0}", to)); }
//});
} }
@Override @Override
+2 -2
View File
@@ -51,8 +51,8 @@ task dist(type: Jar){
task dzip(type: Zip){ task dzip(type: Zip){
from getServerFolder() from getServerFolder()
archiveName "${generateDeployName('server')}.zip" archiveFileName = "${generateDeployName('server')}.zip"
destinationDir(file("../deploy/")) destinationDirectory = file("../deploy/")
finalizedBy 'cleanup' finalizedBy 'cleanup'
} }
@@ -8,6 +8,8 @@ import io.anuke.arc.util.*;
import io.anuke.arc.util.Timer; import io.anuke.arc.util.Timer;
import io.anuke.arc.util.CommandHandler.*; import io.anuke.arc.util.CommandHandler.*;
import io.anuke.arc.util.Timer.*; import io.anuke.arc.util.Timer.*;
import io.anuke.arc.util.serialization.*;
import io.anuke.arc.util.serialization.JsonValue.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.GameState.*;
import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.*;
@@ -59,7 +61,8 @@ public class ServerControl implements ApplicationListener{
"crashreport", false, "crashreport", false,
"port", port, "port", port,
"logging", true, "logging", true,
"socket", false "socket", false,
"globalrules", "{reactorExplosions: false}"
); );
Log.setLogger(new LogHandler(){ Log.setLogger(new LogHandler(){
@@ -142,6 +145,7 @@ public class ServerControl implements ApplicationListener{
Events.on(GameOverEvent.class, event -> { Events.on(GameOverEvent.class, event -> {
if(inExtraRound) return; if(inExtraRound) return;
info("Game over!"); info("Game over!");
displayStatus();
if(Core.settings.getBool("shuffle")){ if(Core.settings.getBool("shuffle")){
if(maps.all().size > 0){ if(maps.all().size > 0){
@@ -251,6 +255,7 @@ public class ServerControl implements ApplicationListener{
try{ try{
world.loadMap(result, result.applyRules(lastMode)); world.loadMap(result, result.applyRules(lastMode));
state.rules = result.applyRules(preset); state.rules = result.applyRules(preset);
applyRules();
logic.play(); logic.play();
info("Map loaded."); info("Map loaded.");
@@ -299,29 +304,7 @@ public class ServerControl implements ApplicationListener{
}); });
handler.register("status", "Display server status.", arg -> { handler.register("status", "Display server status.", arg -> {
if(state.is(State.menu)){ displayStatus();
info("Status: &rserver closed");
}else{
info("Status:");
info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1}", Strings.capitalize(world.getMap().name()), state.wave);
if(state.rules.waves){
info("&ly {0} enemies.", unitGroups[Team.crux.ordinal()].size());
}else{
info("&ly {0} seconds until next wave.", (int)(state.wavetime / 60));
}
info(" &ly{0} FPS, {1} MB used.", (int)(60f / Time.delta()), Core.app.getJavaHeap() / 1024 / 1024);
if(playerGroup.size() > 0){
info(" &lyPlayers: {0}", playerGroup.size());
for(Player p : playerGroup.all()){
info(" &y{0} / {1}", p.name, p.uuid);
}
}else{
info(" &lyNo players connected.");
}
}
}); });
handler.register("mods", "Display all loaded mods.", arg -> { handler.register("mods", "Display all loaded mods.", arg -> {
@@ -369,6 +352,58 @@ public class ServerControl implements ApplicationListener{
} }
}); });
handler.register("rules", "[remove/add] [name] [value...]", "List, remove or add global rules. These will apply regardless of map.", arg -> {
String rules = Core.settings.getString("globalrules");
JsonValue base = JsonIO.json().fromJson(null, rules);
if(arg.length == 0){
Log.info("&lyRules:\n{0}", JsonIO.print(rules));
}else if(arg.length == 1){
Log.err("Invalid usage. Specify which rule to remove or add.");
}else{
if(!(arg[0].equals("remove") || arg[0].equals("add"))){
Log.err("Invalid usage. Either add or remove rules.");
return;
}
boolean remove = arg[0].equals("remove");
if(remove){
if(base.has(arg[1])){
Log.info("Rule &lc'{0}'&lg removed.", arg[1]);
base.remove(arg[1]);
}else{
Log.err("Rule not defined, so not removed.");
return;
}
}else{
if(arg.length < 3){
Log.err("Missing last argument. Specify which value to set the rule to.");
return;
}
try{
JsonValue value = new JsonReader().parse(arg[2]);
value.name = arg[1];
JsonValue parent = new JsonValue(ValueType.object);
parent.addChild(value);
JsonIO.json().readField(state.rules, value.name, parent);
if(base.has(value.name)){
base.remove(value.name);
}
base.addChild(arg[1], value);
Log.info("Changed rule: &ly{0}", value.toString().replace("\n", " "));
}catch(Throwable e){
Log.err("Error parsing rule JSON", e);
}
}
Core.settings.putSave("globalrules", base.toString());
Call.onSetRules(state.rules);
}
});
handler.register("fillitems", "[team]", "Fill the core with items.", arg -> { handler.register("fillitems", "[team]", "Fill the core with items.", arg -> {
if(!state.is(State.playing)){ if(!state.is(State.playing)){
err("Not playing. Host first."); err("Not playing. Host first.");
@@ -765,6 +800,41 @@ public class ServerControl implements ApplicationListener{
mods.each(p -> p.registerClientCommands(netServer.clientCommands)); mods.each(p -> p.registerClientCommands(netServer.clientCommands));
} }
private void applyRules(){
try{
JsonValue value = JsonIO.json().fromJson(null, Core.settings.getString("globalrules"));
JsonIO.json().readFields(state.rules, value);
}catch(Throwable t){
Log.err("Error applying custom rules, proceeding without them.", t);
}
}
private void displayStatus() {
if(state.is(State.menu)){
info("Status: &rserver closed");
}else{
info("Status:");
info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1}", Strings.capitalize(world.getMap().name()), state.wave);
if(state.rules.waves){
info("&ly {0} enemies.", unitGroups[Team.crux.ordinal()].size());
}else{
info("&ly {0} seconds until next wave.", (int)(state.wavetime / 60));
}
info(" &ly{0} FPS, {1} MB used.", (int)(60f / Time.delta()), Core.app.getJavaHeap() / 1024 / 1024);
if(playerGroup.size() > 0){
info(" &lyPlayers: {0}", playerGroup.size());
for(Player p : playerGroup.all()){
info(" &y{0} / {1}", p.name, p.uuid);
}
}else{
info(" &lyNo players connected.");
}
}
}
private void readCommands(){ private void readCommands(){
Scanner scan = new Scanner(System.in); Scanner scan = new Scanner(System.in);
@@ -819,6 +889,7 @@ public class ServerControl implements ApplicationListener{
run.run(); run.run();
logic.play(); logic.play();
state.rules = world.getMap().applyRules(lastMode); state.rules = world.getMap().applyRules(lastMode);
applyRules();
for(Player p : players){ for(Player p : players){
if(p.con == null) continue; if(p.con == null) continue;
@@ -50,6 +50,6 @@ public class DirectConsumerTests extends PowerTestFixture{
consumerTile.entity.update(); consumerTile.entity.update();
graph.update(); graph.update();
assertEquals(expectedSatisfaction, consumerTile.entity.power.satisfaction); assertEquals(expectedSatisfaction, consumerTile.entity.power.status);
} }
} }
@@ -20,7 +20,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest;
* All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well.
* Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame.
* Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture.
* Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but satisfaction should not! * Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but status should not!
*/ */
public class ItemLiquidGeneratorTests extends PowerTestFixture{ public class ItemLiquidGeneratorTests extends PowerTestFixture{
+11 -11
View File
@@ -16,7 +16,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest;
* All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well.
* Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame.
* Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture.
* Any power amount (produced, consumed, buffered) should be affected by Time.delta() but satisfaction should not! * Any power amount (produced, consumed, buffered) should be affected by Time.delta() but status should not!
*/ */
public class PowerTests extends PowerTestFixture{ public class PowerTests extends PowerTestFixture{
@@ -29,9 +29,9 @@ public class PowerTests extends PowerTestFixture{
class PowerGraphTests{ class PowerGraphTests{
/** /**
* Tests the satisfaction of a single consumer after a single update of the power graph which contains a single producer. * Tests the status of a single consumer after a single update of the power graph which contains a single producer.
* <p> * <p>
* Assumption: When the consumer requests zero power, satisfaction does not change. Default is 0.0f. * Assumption: When the consumer requests zero power, status does not change. Default is 0.0f.
*/ */
@TestFactory @TestFactory
DynamicTest[] directConsumerSatisfactionIsAsExpected(){ DynamicTest[] directConsumerSatisfactionIsAsExpected(){
@@ -61,13 +61,13 @@ public class PowerTests extends PowerTestFixture{
assertEquals(producedPower * Time.delta(), powerGraph.getPowerProduced(), Mathf.FLOAT_ROUNDING_ERROR); assertEquals(producedPower * Time.delta(), powerGraph.getPowerProduced(), Mathf.FLOAT_ROUNDING_ERROR);
assertEquals(requiredPower * Time.delta(), powerGraph.getPowerNeeded(), Mathf.FLOAT_ROUNDING_ERROR); assertEquals(requiredPower * Time.delta(), powerGraph.getPowerNeeded(), Mathf.FLOAT_ROUNDING_ERROR);
// Update and check for the expected power satisfaction of the consumer // Update and check for the expected power status of the consumer
powerGraph.update(); powerGraph.update();
assertEquals(expectedSatisfaction, directConsumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); assertEquals(expectedSatisfaction, directConsumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match");
} }
/** /**
* Tests the satisfaction of a single direct consumer after a single update of the power graph which contains a single producer and a single battery. * Tests the status of a single direct consumer after a single update of the power graph which contains a single producer and a single battery.
* The used battery is created with a maximum capacity of 100 and receives ten power per tick. * The used battery is created with a maximum capacity of 100 and receives ten power per tick.
*/ */
@TestFactory @TestFactory
@@ -101,14 +101,14 @@ public class PowerTests extends PowerTestFixture{
} }
float maxCapacity = 100f; float maxCapacity = 100f;
Tile batteryTile = createFakeTile(0, 2, createFakeBattery(maxCapacity)); Tile batteryTile = createFakeTile(0, 2, createFakeBattery(maxCapacity));
batteryTile.entity.power.satisfaction = initialBatteryCapacity / maxCapacity; batteryTile.entity.power.status = initialBatteryCapacity / maxCapacity;
powerGraph.add(batteryTile); powerGraph.add(batteryTile);
powerGraph.update(); powerGraph.update();
assertEquals(expectedBatteryCapacity / maxCapacity, batteryTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Expected battery satisfaction did not match"); assertEquals(expectedBatteryCapacity / maxCapacity, batteryTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Expected battery status did not match");
if(directConsumerTile != null){ if(directConsumerTile != null){
assertEquals(expectedSatisfaction, directConsumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); assertEquals(expectedSatisfaction, directConsumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match");
} }
} }
@@ -124,13 +124,13 @@ public class PowerTests extends PowerTestFixture{
powerGraph.add(consumerTile); powerGraph.add(consumerTile);
powerGraph.update(); powerGraph.update();
assertEquals(1.0f, consumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR); assertEquals(1.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR);
powerGraph.remove(producerTile); powerGraph.remove(producerTile);
powerGraph.add(consumerTile); powerGraph.add(consumerTile);
powerGraph.update(); powerGraph.update();
assertEquals(0.0f, consumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR); assertEquals(0.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR);
if(consumerTile.block().consumes.hasPower()){ if(consumerTile.block().consumes.hasPower()){
ConsumePower consumePower = consumerTile.block().consumes.getPower(); ConsumePower consumePower = consumerTile.block().consumes.getPower();
assertFalse(consumePower.valid(consumerTile.entity())); assertFalse(consumePower.valid(consumerTile.entity()));