Merge branch 'master' into master
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -4,4 +4,4 @@ about: Suggest an idea for this project
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Do not make a new issue for feature requests. Instead, post it in #545.
|
**Do not make a new issue for feature requests!** Instead, post it in #545.
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ _[Wiki](https://mindustrygame.github.io/wiki)_
|
|||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://jenkins.hellomouse.net/job/mindustry/).
|
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/).
|
||||||
|
|
||||||
If you'd rather compile on your own, follow these instructions.
|
If you'd rather compile on your own, follow these instructions.
|
||||||
First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
First, make sure you have [Java 8](https://www.java.com/en/download/) and [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
|
|||||||
path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
||||||
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
||||||
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
||||||
|
path = path.replace("%20", " ");
|
||||||
|
|
||||||
processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound");
|
processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound");
|
||||||
processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music");
|
processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music");
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ project(":desktop"){
|
|||||||
compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion"
|
compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion"
|
||||||
|
|
||||||
compile arcModule("backends:backend-sdl")
|
compile arcModule("backends:backend-sdl")
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
core/assets-raw/sprites/blocks/distribution/inverted-sorter.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 200 B After Width: | Height: | Size: 1.4 KiB |
@@ -45,11 +45,11 @@ database = Core Database
|
|||||||
savegame = Save Game
|
savegame = Save Game
|
||||||
loadgame = Load Game
|
loadgame = Load Game
|
||||||
joingame = Join Game
|
joingame = Join Game
|
||||||
addplayers = Add/Remove Players
|
|
||||||
customgame = Custom Game
|
customgame = Custom Game
|
||||||
newgame = New Game
|
newgame = New Game
|
||||||
none = <none>
|
none = <none>
|
||||||
minimap = Minimap
|
minimap = Minimap
|
||||||
|
position = Position
|
||||||
close = Close
|
close = Close
|
||||||
website = Website
|
website = Website
|
||||||
quit = Quit
|
quit = Quit
|
||||||
@@ -70,6 +70,8 @@ mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very b
|
|||||||
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!
|
||||||
|
mods.guide = Modding Guide
|
||||||
|
mods.report = Report Bug
|
||||||
mod.enabled = [lightgray]Enabled
|
mod.enabled = [lightgray]Enabled
|
||||||
mod.disabled = [scarlet]Disabled
|
mod.disabled = [scarlet]Disabled
|
||||||
mod.disable = Disable
|
mod.disable = Disable
|
||||||
@@ -77,6 +79,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.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}
|
||||||
@@ -161,7 +164,6 @@ server.port = Port:
|
|||||||
server.addressinuse = Address already in use!
|
server.addressinuse = Address already in use!
|
||||||
server.invalidport = Invalid port number!
|
server.invalidport = Invalid port number!
|
||||||
server.error = [crimson]Error hosting server.
|
server.error = [crimson]Error hosting server.
|
||||||
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
|
||||||
save.new = New Save
|
save.new = New Save
|
||||||
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
||||||
overwrite = Overwrite
|
overwrite = Overwrite
|
||||||
@@ -215,6 +217,9 @@ quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial c
|
|||||||
loading = [accent]Loading...
|
loading = [accent]Loading...
|
||||||
reloading = [accent]Reloading Mods...
|
reloading = [accent]Reloading Mods...
|
||||||
saving = [accent]Saving...
|
saving = [accent]Saving...
|
||||||
|
cancelbuilding = [accent][[{0}][] to clear plan
|
||||||
|
pausebuilding = [accent][[{0}][] to pause building
|
||||||
|
resumebuilding = [scarlet][[{0}][] to resume building
|
||||||
wave = [accent]Wave {0}
|
wave = [accent]Wave {0}
|
||||||
wave.waiting = [lightgray]Wave in {0}
|
wave.waiting = [lightgray]Wave in {0}
|
||||||
wave.waveInProgress = [lightgray]Wave in progress
|
wave.waveInProgress = [lightgray]Wave in progress
|
||||||
@@ -375,7 +380,6 @@ campaign = Campaign
|
|||||||
load = Load
|
load = Load
|
||||||
save = Save
|
save = Save
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
tps = TPS: {0}
|
|
||||||
ping = Ping: {0}ms
|
ping = Ping: {0}ms
|
||||||
language.restart = Please restart your game for the language settings to take effect.
|
language.restart = Please restart your game for the language settings to take effect.
|
||||||
settings = Settings
|
settings = Settings
|
||||||
@@ -388,8 +392,10 @@ donate = Donate
|
|||||||
abandon = Abandon
|
abandon = Abandon
|
||||||
abandon.text = This zone and all its resources will be lost to the enemy.
|
abandon.text = This zone and all its resources will be lost to the enemy.
|
||||||
locked = Locked
|
locked = Locked
|
||||||
complete = [lightgray]Reach:
|
complete = [lightgray]Complete:
|
||||||
zone.requirement = Wave {0} in zone {1}
|
requirement.wave = Reach Wave {0} in {1}
|
||||||
|
requirement.core = Destroy Enemy Core in {0}
|
||||||
|
requirement.unlock = Unlock {0}
|
||||||
resume = Resume Zone:\n[lightgray]{0}
|
resume = Resume Zone:\n[lightgray]{0}
|
||||||
bestwave = [lightgray]Best Wave: {0}
|
bestwave = [lightgray]Best Wave: {0}
|
||||||
launch = < LAUNCH >
|
launch = < LAUNCH >
|
||||||
@@ -400,11 +406,13 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a
|
|||||||
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
|
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
|
||||||
uncover = Uncover
|
uncover = Uncover
|
||||||
configure = Configure Loadout
|
configure = Configure Loadout
|
||||||
configure.locked = [lightgray]Unlock configuring loadout: Wave {0}.
|
bannedblocks = Banned Blocks
|
||||||
|
addall = Add All
|
||||||
|
configure.locked = [lightgray]Unlock configuring loadout: {0}.
|
||||||
configure.invalid = Amount must be a number between 0 and {0}.
|
configure.invalid = Amount must be a number between 0 and {0}.
|
||||||
zone.unlocked = [lightgray]{0} unlocked.
|
zone.unlocked = [lightgray]{0} unlocked.
|
||||||
zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met.
|
zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1}
|
||||||
zone.config.complete = Wave {0} reached:\nLoadout config unlocked.
|
zone.config.unlocked = Loadout unlocked:[lightgray]\n{0}
|
||||||
zone.resources = [lightgray]Resources Detected:
|
zone.resources = [lightgray]Resources Detected:
|
||||||
zone.objective = [lightgray]Objective: [accent]{0}
|
zone.objective = [lightgray]Objective: [accent]{0}
|
||||||
zone.objective.survival = Survive
|
zone.objective.survival = Survive
|
||||||
@@ -465,12 +473,13 @@ settings.cleardata = Clear Game Data...
|
|||||||
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
|
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
|
||||||
settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit.
|
settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit.
|
||||||
paused = [accent]< Paused >
|
paused = [accent]< Paused >
|
||||||
|
clear = Clear
|
||||||
|
banned = [scarlet]Banned
|
||||||
yes = Yes
|
yes = Yes
|
||||||
no = No
|
no = No
|
||||||
info.title = Info
|
info.title = Info
|
||||||
error.title = [crimson]An error has occured
|
error.title = [crimson]An error has occured
|
||||||
error.crashtitle = An error has occured
|
error.crashtitle = An error has occured
|
||||||
attackpvponly = [scarlet]Only available in Attack/PvP modes
|
|
||||||
blocks.input = Input
|
blocks.input = Input
|
||||||
blocks.output = Output
|
blocks.output = Output
|
||||||
blocks.booster = Booster
|
blocks.booster = Booster
|
||||||
@@ -555,6 +564,7 @@ category.optional = Optional Enhancements
|
|||||||
setting.landscape.name = Lock Landscape
|
setting.landscape.name = Lock Landscape
|
||||||
setting.shadows.name = Shadows
|
setting.shadows.name = Shadows
|
||||||
setting.linear.name = Linear Filtering
|
setting.linear.name = Linear Filtering
|
||||||
|
setting.hints.name = Hints
|
||||||
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)[]
|
||||||
@@ -582,9 +592,9 @@ 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
|
setting.fps.name = Show FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Show Power Lasers
|
|
||||||
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
|
setting.position.name = Show Player Position
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
setting.ambientvol.name = Ambient Volume
|
setting.ambientvol.name = Ambient Volume
|
||||||
setting.mutemusic.name = Mute Music
|
setting.mutemusic.name = Mute Music
|
||||||
@@ -594,8 +604,10 @@ setting.crashreport.name = Send Anonymous Crash Reports
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display Player Bubble Chat
|
setting.playerchat.name = Display Player Bubble Chat
|
||||||
public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
|
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.beta = Note that beta versions of the game cannot make public lobbies.
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
@@ -609,6 +621,7 @@ command.rally = Rally
|
|||||||
command.retreat = Retreat
|
command.retreat = Retreat
|
||||||
keybind.gridMode.name = Block Select
|
keybind.gridMode.name = Block Select
|
||||||
keybind.gridModeShift.name = Category Select
|
keybind.gridModeShift.name = Category Select
|
||||||
|
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
|
||||||
@@ -625,6 +638,7 @@ keybind.zoom_hold.name = Zoom Hold
|
|||||||
keybind.zoom.name = Zoom
|
keybind.zoom.name = Zoom
|
||||||
keybind.menu.name = Menu
|
keybind.menu.name = Menu
|
||||||
keybind.pause.name = Pause
|
keybind.pause.name = Pause
|
||||||
|
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
|
||||||
@@ -833,6 +847,7 @@ block.junction.name = Junction
|
|||||||
block.router.name = Router
|
block.router.name = Router
|
||||||
block.distributor.name = Distributor
|
block.distributor.name = Distributor
|
||||||
block.sorter.name = Sorter
|
block.sorter.name = Sorter
|
||||||
|
block.inverted-sorter.name = Inverted Sorter
|
||||||
block.message.name = Message
|
block.message.name = Message
|
||||||
block.overflow-gate.name = Overflow Gate
|
block.overflow-gate.name = Overflow Gate
|
||||||
block.silicon-smelter.name = Silicon Smelter
|
block.silicon-smelter.name = Silicon Smelter
|
||||||
@@ -1054,6 +1069,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U
|
|||||||
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building.
|
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building.
|
||||||
block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles.
|
block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles.
|
||||||
block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
|
block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
|
||||||
|
block.inverted-sorter.descriptions = 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 = A combination splitter and router. Only outputs to the left and right if the front path is blocked.
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Celá obrazovka
|
|||||||
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
||||||
setting.fps.name = Ukázat snímky/sekundu
|
setting.fps.name = Ukázat snímky/sekundu
|
||||||
setting.vsync.name = Vertikální synchronizace
|
setting.vsync.name = Vertikální synchronizace
|
||||||
setting.lasers.name = Ukázat laser energie
|
|
||||||
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance)
|
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance)
|
||||||
setting.minimap.name = Ukázat minimapu
|
setting.minimap.name = Ukázat minimapu
|
||||||
setting.musicvol.name = Hlasitost hudby
|
setting.musicvol.name = Hlasitost hudby
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Poslat anonymní spis o zhroucení hry
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Vollbild
|
|||||||
setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich)
|
setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich)
|
||||||
setting.fps.name = Zeige FPS
|
setting.fps.name = Zeige FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Zeige Stromlaser
|
|
||||||
setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen)
|
setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen)
|
||||||
setting.minimap.name = Zeige die Minimap
|
setting.minimap.name = Zeige die Minimap
|
||||||
setting.musicvol.name = Musiklautstärke
|
setting.musicvol.name = Musiklautstärke
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Anonyme Absturzberichte senden
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Deckkraft
|
setting.chatopacity.name = Chat Deckkraft
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Chat im Spiel anzeigen
|
setting.playerchat.name = Chat im Spiel anzeigen
|
||||||
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
|
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
|
||||||
uiscale.cancel = Abbrechen & Beenden
|
uiscale.cancel = Abbrechen & Beenden
|
||||||
|
|||||||
@@ -594,6 +594,7 @@ setting.crashreport.name = Enviar informes de fallos anónimos
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Opacidad del Chat
|
setting.chatopacity.name = Opacidad del Chat
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
|
public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Pantaila osoa
|
|||||||
setting.borderlesswindow.name = Ertzik gabeko leihoa[lightgray] (berrabiaraztea behar lezake)
|
setting.borderlesswindow.name = Ertzik gabeko leihoa[lightgray] (berrabiaraztea behar lezake)
|
||||||
setting.fps.name = Erakutsi FPS
|
setting.fps.name = Erakutsi FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Erakutsi energia laserrak
|
|
||||||
setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu)
|
setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu)
|
||||||
setting.minimap.name = Erakutsi mapatxoa
|
setting.minimap.name = Erakutsi mapatxoa
|
||||||
setting.musicvol.name = Musikaren bolumena
|
setting.musicvol.name = Musikaren bolumena
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Bidali kraskatze txosten automatikoak
|
|||||||
setting.savecreate.name = Gorde automatikoki
|
setting.savecreate.name = Gorde automatikoki
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Txataren opakotasuna
|
setting.chatopacity.name = Txataren opakotasuna
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Erakutsi jolas barneko txata
|
setting.playerchat.name = Erakutsi jolas barneko txata
|
||||||
uiscale.reset = Interfazearen eskala aldatu da.\nSakatu "Ados" eskala hau berresteko.\n[scarlet][accent] {0}[] segundo atzera egin eta irteteko...
|
uiscale.reset = Interfazearen eskala aldatu da.\nSakatu "Ados" eskala hau berresteko.\n[scarlet][accent] {0}[] segundo atzera egin eta irteteko...
|
||||||
uiscale.cancel = Utzi eta irten
|
uiscale.cancel = Utzi eta irten
|
||||||
|
|||||||
@@ -10,17 +10,20 @@ link.trello.description = Trello officiel pour les ajouts futurs
|
|||||||
link.itch.io.description = Page itch.io avec lien de téléchargement pour PC
|
link.itch.io.description = Page itch.io avec lien de téléchargement pour PC
|
||||||
link.google-play.description = Google play store
|
link.google-play.description = Google play store
|
||||||
link.wiki.description = Le wiki officiel de Mindustry
|
link.wiki.description = Le wiki officiel de Mindustry
|
||||||
linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copié à votre presse papier.
|
linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copié dans votre presse papier.
|
||||||
screenshot = Capture d'écran sauvegardée à {0}
|
screenshot = Capture d'écran sauvegardée à {0}
|
||||||
screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran.
|
screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran.
|
||||||
gameover = Game over
|
gameover = Game over
|
||||||
gameover.pvp = L'équipe [accent] {0}[] a gagnée !
|
gameover.pvp = L'équipe [accent] {0}[] a gagnée !
|
||||||
highscore = [accent]Nouveau meilleur score!
|
highscore = [accent]Nouveau meilleur score!
|
||||||
|
|
||||||
load.sound = Sons
|
load.sound = Sons
|
||||||
load.map = Cartes
|
load.map = Cartes
|
||||||
load.image = Images
|
load.image = Images
|
||||||
load.content = Contenus
|
load.content = Contenus
|
||||||
load.system = Système
|
load.system = Système
|
||||||
|
load.mod = Mods
|
||||||
|
|
||||||
stat.wave = Vagues vaincues:[accent] {0}
|
stat.wave = Vagues vaincues:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ennemis détruits:[accent] {0}
|
stat.enemiesDestroyed = Ennemis détruits:[accent] {0}
|
||||||
stat.built = Bâtiments construits:[accent] {0}
|
stat.built = Bâtiments construits:[accent] {0}
|
||||||
@@ -28,10 +31,12 @@ stat.destroyed = Bâtiments détruits:[accent] {0}
|
|||||||
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
||||||
stat.delivered = Ressources transférées:
|
stat.delivered = Ressources transférées:
|
||||||
stat.rank = Rang Final: [accent]{0}
|
stat.rank = Rang Final: [accent]{0}
|
||||||
|
|
||||||
launcheditems = [accent]Ressources transférées
|
launcheditems = [accent]Ressources transférées
|
||||||
|
launchinfo = [unlaunched][[LANCER] votre noyau pour obtenir les objets indiquées en bleu.
|
||||||
map.delete = Êtes-vous sûr de vouloir supprimer cette carte "[accent]{0}[]"?
|
map.delete = Êtes-vous sûr de vouloir supprimer cette carte "[accent]{0}[]"?
|
||||||
level.highscore = Meilleur score: [accent]{0}
|
level.highscore = Meilleur score: [accent]{0}
|
||||||
level.select = Sélection de niveau
|
level.select = Sélection du niveau
|
||||||
level.mode = Mode de jeu:
|
level.mode = Mode de jeu:
|
||||||
showagain = Ne pas montrer la prochaine fois
|
showagain = Ne pas montrer la prochaine fois
|
||||||
coreattack = [scarlet]<La base est attaquée>
|
coreattack = [scarlet]<La base est attaquée>
|
||||||
@@ -40,7 +45,6 @@ database = Base de données
|
|||||||
savegame = Sauvegarder la partie
|
savegame = Sauvegarder la partie
|
||||||
loadgame = Charger la partie
|
loadgame = Charger la partie
|
||||||
joingame = Rejoindre une partie
|
joingame = Rejoindre une partie
|
||||||
addplayers = Ajouter/Enlever des joueurs
|
|
||||||
customgame = Partie customisée
|
customgame = Partie customisée
|
||||||
newgame = Nouvelle partie
|
newgame = Nouvelle partie
|
||||||
none = <vide>
|
none = <vide>
|
||||||
@@ -48,18 +52,37 @@ minimap = Minimap
|
|||||||
close = Fermer
|
close = Fermer
|
||||||
website = Site Web
|
website = Site Web
|
||||||
quit = Quitter
|
quit = Quitter
|
||||||
save.quit = Save & Quit
|
save.quit = Sauvegarder et Quitter
|
||||||
maps = Cartes
|
maps = Cartes
|
||||||
maps.browse = Parcourir les Cartes
|
maps.browse = Parcourir les cartes
|
||||||
continue = Continuer
|
continue = Continuer
|
||||||
maps.none = [lightgray]Aucune carte trouvée!
|
maps.none = [lightgray]Aucune carte trouvée!
|
||||||
invalid = Invalide
|
invalid = Invalide
|
||||||
preparingconfig = Préparation de la Configuration
|
preparingconfig = Préparation de la configuration
|
||||||
preparingcontent = Préparation du Contenu
|
preparingcontent = Préparation du contenu
|
||||||
uploadingcontent = Publication du Contenu
|
uploadingcontent = Publication du contenu
|
||||||
uploadingpreviewfile = Publication du Fichier d'Aperçu
|
uploadingpreviewfile = Publication du fichier d'aperçu
|
||||||
committingchanges = Validation des Modifications
|
committingchanges = Validation des modifications
|
||||||
done = Fait
|
done = Fait
|
||||||
|
|
||||||
|
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 = Mods
|
||||||
|
mods.none = [LIGHT_GRAY]Aucun mod trouvé!
|
||||||
|
mods.guide = Guide de Modding
|
||||||
|
mods.report = Signaler un Bug
|
||||||
|
mod.enabled = [lightgray]Activé
|
||||||
|
mod.disabled = [scarlet]Désactivé
|
||||||
|
mod.disable = Désactiver
|
||||||
|
mod.enable = Activer
|
||||||
|
mod.requiresrestart = Le jeu va maintenant s'arrêter pour appliquer les modification du mod.
|
||||||
|
mod.reloadrequired = [scarlet]Rechargement requis
|
||||||
|
mod.import = Importer un mod
|
||||||
|
mod.import.github = Importer un mod Github
|
||||||
|
mod.remove.confirm = Ce mod sera supprimé.
|
||||||
|
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}
|
||||||
|
|
||||||
about.button = À propos
|
about.button = À propos
|
||||||
name = Nom:
|
name = Nom:
|
||||||
noname = Commencer par choisir un[accent] nom de joueur[].
|
noname = Commencer par choisir un[accent] nom de joueur[].
|
||||||
@@ -74,21 +97,21 @@ players = {0} joueurs en ligne
|
|||||||
players.single = {0} joueur en ligne
|
players.single = {0} joueur en ligne
|
||||||
server.closing = [accent]Fermeture du serveur...
|
server.closing = [accent]Fermeture du serveur...
|
||||||
server.kicked.kick = Vous avez été expulsé du serveur!
|
server.kicked.kick = Vous avez été expulsé du serveur!
|
||||||
server.kicked.whitelist = You are not whitelisted here.
|
server.kicked.whitelist = Vous n'êtes pas whitelisté ici.
|
||||||
server.kicked.serverClose = Serveur fermé.
|
server.kicked.serverClose = Serveur fermé.
|
||||||
server.kicked.vote = Vous avez été expulsé suite à un vote. Au revoir.
|
server.kicked.vote = Vous avez été expulsé suite à un vote. Au revoir.
|
||||||
server.kicked.clientOutdated = Client obsolète! Mettez à votre jeu à jour!
|
server.kicked.clientOutdated = Client obsolète! Mettez à votre jeu à jour!
|
||||||
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
|
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
|
||||||
server.kicked.banned = Vous avez été banni sur ce serveur.
|
server.kicked.banned = Vous avez été banni de ce serveur.
|
||||||
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
|
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
|
||||||
server.kicked.playerLimit = Ce serveur est plein. Veuillez attendre qu'une place se libére.
|
server.kicked.playerLimit = Ce serveur est plein. Veuillez attendre qu'une place se libère.
|
||||||
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
|
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
|
||||||
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
|
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
|
||||||
server.kicked.nameEmpty = Votre nom est invalide.
|
server.kicked.nameEmpty = Votre nom est invalide.
|
||||||
server.kicked.idInUse = Vous êtes déjà sur ce serveur! Se connecter avec deux comptes n'est pas permis.
|
server.kicked.idInUse = Vous êtes déjà sur ce serveur! Se connecter avec deux comptes n'est pas permis.
|
||||||
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle.
|
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Game over!
|
||||||
server.versions = Votre version:[accent] {0}[]\nLa version du serveur:[accent] {1}[]
|
server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[accent] {1}[]
|
||||||
host.info = Le bouton [accent]Héberger[] héberge un serveur sur le port [scarlet]6567[]. \nN'importe qui sur le même [lightgray]wifi ou réseau local []devrait voir votre serveur sur leur liste des serveurs.\n\nSi vous voulez que les gens puissent s'y connecter de partout à l'aide de votre IP, [accent]le transfert de port (port forwarding)[] est requis.\n\n[lightgray]Note: Si quelqu'un a des problèmes de connexion à votre partie LAN, vérifiez que vous avez autorisé l'accès à Mindustry sur votre réseau local dans les paramètres de votre pare-feu.
|
host.info = Le bouton [accent]Héberger[] héberge un serveur sur le port [scarlet]6567[]. \nN'importe qui sur le même [lightgray]wifi ou réseau local []devrait voir votre serveur sur leur liste des serveurs.\n\nSi vous voulez que les gens puissent s'y connecter de partout à l'aide de votre IP, [accent]le transfert de port (port forwarding)[] est requis.\n\n[lightgray]Note: Si quelqu'un a des problèmes de connexion à votre partie LAN, vérifiez que vous avez autorisé l'accès à Mindustry sur votre réseau local dans les paramètres de votre pare-feu.
|
||||||
join.info = Ici vous pouvez entrez [accent]l'adresse IP d'un serveur []pour s'y connecter, ou découvrir un serveur en [accent]réseau local[].\nLe multijoueur en LAN ainsi qu'en WAN est supporté.\n\n[lightgray]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connectez à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP.
|
join.info = Ici vous pouvez entrez [accent]l'adresse IP d'un serveur []pour s'y connecter, ou découvrir un serveur en [accent]réseau local[].\nLe multijoueur en LAN ainsi qu'en WAN est supporté.\n\n[lightgray]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connectez à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP.
|
||||||
hostserver = Héberger une partie
|
hostserver = Héberger une partie
|
||||||
@@ -108,7 +131,7 @@ trace.ip = IP: [accent]{0}
|
|||||||
trace.id = ID Unique : [accent]{0}
|
trace.id = ID Unique : [accent]{0}
|
||||||
trace.mobile = Client mobile: [accent]{0}
|
trace.mobile = Client mobile: [accent]{0}
|
||||||
trace.modclient = Client personnalisé: [accent]{0}
|
trace.modclient = Client personnalisé: [accent]{0}
|
||||||
invalidid = ID du client invalide! Veillez soumettre un rapport d'erreur.
|
invalidid = ID du client invalide! Veuillez soumettre un rapport d'erreur.
|
||||||
server.bans = Bannis
|
server.bans = Bannis
|
||||||
server.bans.none = Aucun joueur banni trouvé!
|
server.bans.none = Aucun joueur banni trouvé!
|
||||||
server.admins = Administrateurs
|
server.admins = Administrateurs
|
||||||
@@ -140,7 +163,6 @@ server.port = Port:
|
|||||||
server.addressinuse = Adresse déjà utilisée!
|
server.addressinuse = Adresse déjà utilisée!
|
||||||
server.invalidport = numéro de port invalide!
|
server.invalidport = numéro de port invalide!
|
||||||
server.error = [crimson]Erreur d'hébergement: [accent]{0}
|
server.error = [crimson]Erreur d'hébergement: [accent]{0}
|
||||||
save.old = Cette sauvegarde provient d'une ancienne version du jeu, et ne peut plus être utilisée.\n\n[lightgray]la compatibilité des anciennes sauvegardes sera bientôt ajoutée dans la version 4.0 stable.
|
|
||||||
save.new = Nouvelle sauvegarde
|
save.new = Nouvelle sauvegarde
|
||||||
save.overwrite = Êtes-vous sûr de vouloir\n écraser cette sauvegarde ?
|
save.overwrite = Êtes-vous sûr de vouloir\n écraser cette sauvegarde ?
|
||||||
overwrite = Écraser
|
overwrite = Écraser
|
||||||
@@ -174,27 +196,29 @@ warning = Avertissement.
|
|||||||
confirm = Confirmer
|
confirm = Confirmer
|
||||||
delete = Supprimer
|
delete = Supprimer
|
||||||
view.workshop = Voir dans le Workshop
|
view.workshop = Voir dans le Workshop
|
||||||
|
workshop.listing = Éditer le listing du Workshop
|
||||||
ok = OK
|
ok = OK
|
||||||
open = Ouverture
|
open = Ouverture
|
||||||
customize = Personaliser
|
customize = Personnaliser
|
||||||
cancel = Annuler
|
cancel = Annuler
|
||||||
openlink = Ouvrir le lien
|
openlink = Ouvrir le lien
|
||||||
copylink = Copier le lien
|
copylink = Copier le lien
|
||||||
back = Retour
|
back = Retour
|
||||||
data.export = Exporter les Données
|
data.export = Exporter les données
|
||||||
data.import = Importer les Données
|
data.import = Importer les données
|
||||||
data.exported = Données Exportées.
|
data.exported = Données exportées.
|
||||||
data.invalid = Ce ne sont pas des données de jeu valides.
|
data.invalid = Ce ne sont pas des données de jeu valides.
|
||||||
data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos actuelles données de jeu.\n[accent]Ceci ne pourra pas être annulé![]\n\nUne fois les données importées, le jeu quittera immédiatement.
|
data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos actuelles données de jeu.\n[accent]Ceci ne pourra pas être annulé![]\n\nUne fois les données importées, le jeu quittera immédiatement.
|
||||||
classic.export = Exporter les données Classic
|
classic.export = Exporter les données Classic
|
||||||
classic.export.text = [accent]Mindustry[] vient d'avoir une mise à jour majeure.\nDes sauvegardes et/ou des cartes de la version Classic (v3.5 build 40) ont été détectées. Souhaitez-vous exporter ces sauvegardes dans le dossier accueil de votre télephone, pour les utiliser dans Mindustry Classic ?
|
classic.export.text = [accent]Mindustry[] vient d'avoir une mise à jour majeure.\nDes sauvegardes et/ou des cartes de la version Classic (v3.5 build 40) ont été détectées. Souhaitez-vous exporter ces sauvegardes dans le dossier accueil de votre téléphone, pour les utiliser dans Mindustry Classic ?
|
||||||
quit.confirm = Êtes-vous sûr de vouloir quitter?
|
quit.confirm = Êtes-vous sûr de vouloir quitter?
|
||||||
quit.confirm.tutorial = Êtes-vous sur de ce que vous faites?\nLe tutoriel peut être repris dans [accent]Paramètres->Jeu->Reprendre le tutoriel.[]
|
quit.confirm.tutorial = Êtes-vous sur de ce que vous faites?\nLe tutoriel peut être repris dans [accent]Paramètres->Jeu->Reprendre le tutoriel.[]
|
||||||
loading = [accent]Chargement...
|
loading = [accent]Chargement...
|
||||||
|
reloading = [accent]Rechargement des Mods...
|
||||||
saving = [accent]Sauvegarde...
|
saving = [accent]Sauvegarde...
|
||||||
wave = [accent]Vague {0}
|
wave = [accent]Vague {0}
|
||||||
wave.waiting = [lightgray]Vague dans {0}
|
wave.waiting = [lightgray]Vague dans {0}
|
||||||
wave.waveInProgress = [lightgray]Wave en cours
|
wave.waveInProgress = [lightgray]Vague en cours
|
||||||
waiting = [lightgray]En attente...
|
waiting = [lightgray]En attente...
|
||||||
waiting.players = En attente de joueurs...
|
waiting.players = En attente de joueurs...
|
||||||
wave.enemies = [lightgray]{0} Ennemis restants
|
wave.enemies = [lightgray]{0} Ennemis restants
|
||||||
@@ -210,8 +234,13 @@ map.nospawn = Cette carte n'a pas de base pour qu'un joueur puisse y apparaisse!
|
|||||||
map.nospawn.pvp = Cette carte n'a pas de base ennemies pour qu'un joueur ennemi y apparaisse! Ajouter au moins une base [SCARLET] non-orange[] dans l'éditeur.
|
map.nospawn.pvp = Cette carte n'a pas de base ennemies pour qu'un joueur ennemi y apparaisse! Ajouter au moins une base [SCARLET] non-orange[] dans l'éditeur.
|
||||||
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[SCARLET] rouge[] sur cette carte dans l'éditeur.
|
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[SCARLET] rouge[] sur cette carte dans l'éditeur.
|
||||||
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
|
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
|
||||||
map.publish.error = Erreur de Publication de la Carte: {0}
|
map.publish.error = Erreur de publication de la carte: {0}
|
||||||
|
map.update = Mise à jour de la carte
|
||||||
|
map.load.error = Erreur lors de la récupération des details depuis le workshop: {0}
|
||||||
|
map.missing = Cette carte a été supprimée ou déplacée.\n[lightgray]Cette carte a été automatiquement retirée du listing du workshop.
|
||||||
map.publish.confirm = Êtes-vous sûr de vouloir publier cette carte?\n\n[lightgray]Assurez-vous d’accepter d’abord les CGU du Workshop, sinon vos cartes ne seront pas affichées!
|
map.publish.confirm = Êtes-vous sûr de vouloir publier cette carte?\n\n[lightgray]Assurez-vous d’accepter d’abord les CGU du Workshop, sinon vos cartes ne seront pas affichées!
|
||||||
|
map.menu = Sélectionnez ce que vous voulez faire avec cette carte.
|
||||||
|
map.changelog = Changelog (optionnel):
|
||||||
eula = CGU de Steam
|
eula = CGU de Steam
|
||||||
map.publish = Carte publiée.
|
map.publish = Carte publiée.
|
||||||
map.publishing = [accent]Publication de la carte...
|
map.publishing = [accent]Publication de la carte...
|
||||||
@@ -240,11 +269,11 @@ waves.to = à
|
|||||||
waves.boss = Boss
|
waves.boss = Boss
|
||||||
waves.preview = Prévisualiser
|
waves.preview = Prévisualiser
|
||||||
waves.edit = Modifier...
|
waves.edit = Modifier...
|
||||||
waves.copy = Copier dans le Presse-papiers
|
waves.copy = Copier dans le presse-papiers
|
||||||
waves.load = Coller depuis le Presse-papiers
|
waves.load = Coller depuis le presse-papiers
|
||||||
waves.invalid = Vagues invalides dans le Presse-papiers.
|
waves.invalid = Vagues invalides dans le presse-papiers.
|
||||||
waves.copied = Vagues copiées
|
waves.copied = Vagues copiées
|
||||||
waves.none = Aucun enemies définis.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut.
|
waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut.
|
||||||
editor.default = [lightgray]<par défaut>
|
editor.default = [lightgray]<par défaut>
|
||||||
details = Détails...
|
details = Détails...
|
||||||
edit = Modifier...
|
edit = Modifier...
|
||||||
@@ -254,11 +283,11 @@ editor.removeunit = Enlever l'unité
|
|||||||
editor.teams = Équipe
|
editor.teams = Équipe
|
||||||
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
||||||
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
||||||
editor.errorimage = Ceci est une image, et non une carte. \n\nSi vous voulez importer une carte provenant de la version 3.5 (build 40), utilisez le bouton 'importer une carte obsolète (image)' dans l'éditeur.
|
editor.errorimage = Ceci est une image, et non une carte.\n\nSi vous voulez importer une carte provenant de la version 3.5 (build 40), utilisez le bouton 'importer une carte obsolète (image)' dans l'éditeur.
|
||||||
editor.errorlegacy = Cette carte est trop ancienne, et utilise un format de carte qui n'est plus supporté.
|
editor.errorlegacy = Cette carte est trop ancienne, et utilise un format de carte qui n'est plus supporté.
|
||||||
editor.errornot = Ceci n'est pas un fichier de carte.
|
editor.errornot = Ceci n'est pas un fichier de carte.
|
||||||
editor.errorheader = Le fichier de carte est invalide ou corrompu.
|
editor.errorheader = Le fichier de carte est invalide ou corrompu.
|
||||||
editor.errorname = La carte n'a pas de nom, essayez vous de charger une sauvegarde?
|
editor.errorname = La carte n'a pas de nom, essayez vous de charger une sauvegarde?
|
||||||
editor.update = Mettre à jour
|
editor.update = Mettre à jour
|
||||||
editor.randomize = Rendre aléatoire
|
editor.randomize = Rendre aléatoire
|
||||||
editor.apply = Appliquer
|
editor.apply = Appliquer
|
||||||
@@ -291,6 +320,7 @@ editor.overwrite = [accent]Attention!\nCeci écrase une carte existante.
|
|||||||
editor.overwrite.confirm = [scarlet]Attention![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir l'écraser?
|
editor.overwrite.confirm = [scarlet]Attention![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir l'écraser?
|
||||||
editor.exists = Une carte avec ce nom existe déjà.
|
editor.exists = Une carte avec ce nom existe déjà.
|
||||||
editor.selectmap = Sélectionnez une carte:
|
editor.selectmap = Sélectionnez une carte:
|
||||||
|
|
||||||
toolmode.replace = Remplacer
|
toolmode.replace = Remplacer
|
||||||
toolmode.replace.description = Dessiner seulement sur les blocs solides.
|
toolmode.replace.description = Dessiner seulement sur les blocs solides.
|
||||||
toolmode.replaceall = Tout remplacer
|
toolmode.replaceall = Tout remplacer
|
||||||
@@ -301,10 +331,11 @@ toolmode.square = Carré
|
|||||||
toolmode.square.description = Pinceau carré.
|
toolmode.square.description = Pinceau carré.
|
||||||
toolmode.eraseores = Effacer les minéraux
|
toolmode.eraseores = Effacer les minéraux
|
||||||
toolmode.eraseores.description = Efface seulement les minéraux.
|
toolmode.eraseores.description = Efface seulement les minéraux.
|
||||||
toolmode.fillteams = Remplire les équipes
|
toolmode.fillteams = Remplir les équipes
|
||||||
toolmode.fillteams.description = Rempli les équipes au lieu des blocs.
|
toolmode.fillteams.description = Rempli les équipes au lieu des blocs.
|
||||||
toolmode.drawteams = Dessiner les équipes
|
toolmode.drawteams = Dessiner les équipes
|
||||||
toolmode.drawteams.description = Dessine les équipes au lieu de blocs.
|
toolmode.drawteams.description = Dessine les équipes au lieu de blocs.
|
||||||
|
|
||||||
filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous.
|
filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous.
|
||||||
filter.distort = Déformation
|
filter.distort = Déformation
|
||||||
filter.noise = Bruit
|
filter.noise = Bruit
|
||||||
@@ -336,6 +367,7 @@ filter.option.floor2 = Sol secondaire
|
|||||||
filter.option.threshold2 = Seuil secondaire
|
filter.option.threshold2 = Seuil secondaire
|
||||||
filter.option.radius = Rayon
|
filter.option.radius = Rayon
|
||||||
filter.option.percentile = Centile
|
filter.option.percentile = Centile
|
||||||
|
|
||||||
width = Largeur:
|
width = Largeur:
|
||||||
height = Hauteur:
|
height = Hauteur:
|
||||||
menu = Menu
|
menu = Menu
|
||||||
@@ -344,20 +376,22 @@ campaign = Campagne
|
|||||||
load = Charger
|
load = Charger
|
||||||
save = Sauvegarder
|
save = Sauvegarder
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
tps = TPS: {0}
|
|
||||||
ping = Ping: {0}ms
|
ping = Ping: {0}ms
|
||||||
language.restart = Veuillez redémarrez votre jeu pour le changement de langue prenne effet.
|
language.restart = Veuillez redémarrez votre jeu pour que le changement de langue prenne effet.
|
||||||
settings = Paramètres
|
settings = Paramètres
|
||||||
tutorial = Tutoriel
|
tutorial = Tutoriel
|
||||||
tutorial.retake = Re-Take Tutorial
|
tutorial.retake = Rejouer le Tutoriel
|
||||||
editor = Éditeur
|
editor = Éditeur
|
||||||
mapeditor = Éditeur de carte
|
mapeditor = Éditeur de carte
|
||||||
donate = Faire un\ndon
|
donate = Faire un\ndon
|
||||||
|
|
||||||
abandon = Abandonner
|
abandon = Abandonner
|
||||||
abandon.text = Cette zone et toutes ses ressources vont être perdues.
|
abandon.text = Cette zone et toutes ses ressources vont être perdues.
|
||||||
locked = Verrouillé
|
locked = Verrouillé
|
||||||
complete = [lightgray]Compléter:
|
complete = [lightgray]Compléter:
|
||||||
zone.requirement = Vague {0} dans la zone {1}
|
requirement.wave = Vague {0} dans {1}
|
||||||
|
requirement.core = Détruire le Noyau ennemi dans {0}
|
||||||
|
requirement.unlock = Débloque {0}
|
||||||
resume = Reprendre la partie:\n[lightgray]{0}
|
resume = Reprendre la partie:\n[lightgray]{0}
|
||||||
bestwave = [lightgray]Meilleur: {0}
|
bestwave = [lightgray]Meilleur: {0}
|
||||||
launch = < Lancement >
|
launch = < Lancement >
|
||||||
@@ -368,58 +402,64 @@ launch.confirm = Cela va transférer toutes les ressources de votre noyau.\nVous
|
|||||||
launch.skip.confirm = Si vous passez à la vague suivante, vous ne pourrez pas effectuer le lancement avant les prochaines vagues.
|
launch.skip.confirm = Si vous passez à la vague suivante, vous ne pourrez pas effectuer le lancement avant les prochaines vagues.
|
||||||
uncover = Découvrir
|
uncover = Découvrir
|
||||||
configure = Modifier les ressources emportées.
|
configure = Modifier les ressources emportées.
|
||||||
configure.locked = [lightgray]Atteignez la vague {0}\npour configurer les ressources emportées.
|
bannedblocks = Blocs bannis
|
||||||
|
addall = Ajouter tous
|
||||||
|
configure.locked = [lightgray]Déloquer la configuration des ressources emportées: {0}.
|
||||||
configure.invalid = Le montant doit être un nombre compris entre 0 et {0}.
|
configure.invalid = Le montant doit être un nombre compris entre 0 et {0}.
|
||||||
zone.unlocked = [lightgray]{0} Débloquée.
|
zone.unlocked = [lightgray]{0} Débloquée.
|
||||||
zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées
|
zone.requirement.complete = Exigences pour {0} complétées:[lightgray]\n{1}
|
||||||
zone.config.complete = Vague {0} atteinte:\nConfiguration des ressources emportées possible.
|
zone.config.unlocke = Configuration des ressources emportées débloquée:[lightgray]\n{0}
|
||||||
zone.resources = [lightgray]Ressources détectées:
|
zone.resources = [lightgray]Ressources détectées:
|
||||||
zone.objective = [lightgray]Objective: [accent]{0}
|
zone.objective = [lightgray]Objectif: [accent]{0}
|
||||||
zone.objective.survival = Survivre
|
zone.objective.survival = Survivre
|
||||||
zone.objective.attack = Détruire le noyau ennemi
|
zone.objective.attack = Détruire le noyau ennemi
|
||||||
add = Ajouter...
|
add = Ajouter...
|
||||||
boss.health = Santé du Boss
|
boss.health = Santé du Boss
|
||||||
|
|
||||||
connectfail = [crimson]Échec de la connexion au serveur :\n\n[accent]{0}
|
connectfail = [crimson]Échec de la connexion au serveur :\n\n[accent]{0}
|
||||||
error.unreachable = Serveur injoignable.\nL'adresse IP est correcte?
|
error.unreachable = Serveur injoignable.\nL'adresse IP est correcte?
|
||||||
error.invalidaddress = Adresse invalide.
|
error.invalidaddress = Adresse invalide.
|
||||||
error.timedout = Délai de connexion dépassé!\nAssurez-vous que l'hôte a autorisé l'accès au port (port forwarding), et que l'adresse soit correcte!
|
error.timedout = Délai de connexion dépassé!\nAssurez-vous que l'hôte a autorisé l'accès au port (port forwarding), et que l'adresse soit correcte!
|
||||||
error.mismatch = Erreur de paquet:\nPossible différence de verison entre le client et le serveur .\nVérifiez que vous et l'hôte avez la version de Mindustry la plus recente!
|
error.mismatch = Erreur de paquet:\nPossible différence de version entre le client et le serveur .\nVérifiez que vous et l'hôte avez la version de Mindustry la plus récente!
|
||||||
error.alreadyconnected = Déjà connecté.
|
error.alreadyconnected = Déjà connecté.
|
||||||
error.mapnotfound = Carte introuvable!
|
error.mapnotfound = Carte introuvable!
|
||||||
error.io = Erreur de Réseau (I/O)
|
error.io = Erreur de Réseau (I/O)
|
||||||
error.any = Erreur réseau inconnue
|
error.any = Erreur réseau inconnue
|
||||||
error.bloom = Echec de l'initialisation du flou lumineux.\nVotre appareil peux ne pas le supporter.
|
error.bloom = Échec de l'initialisation du flou lumineux.\nVotre appareil peux ne pas le supporter.
|
||||||
|
|
||||||
zone.groundZero.name = Première Bataille
|
zone.groundZero.name = Première Bataille
|
||||||
zone.desertWastes.name = Désert Sauvage
|
zone.desertWastes.name = Désert Sauvage
|
||||||
zone.craters.name = Les Cratères
|
zone.craters.name = Les Cratères
|
||||||
zone.frozenForest.name = Forêt Glaciale
|
zone.frozenForest.name = Forêt Glaciale
|
||||||
zone.ruinousShores.name = Rives en Ruine
|
zone.ruinousShores.name = Rives en Ruine
|
||||||
zone.stainedMountains.name = Montagnes Tâchetées
|
zone.stainedMountains.name = Montagnes Tachetées
|
||||||
zone.desolateRift.name = Ravin Abandonné
|
zone.desolateRift.name = Ravin Abandonné
|
||||||
zone.nuclearComplex.name = Complexe Nucléaire
|
zone.nuclearComplex.name = Complexe Nucléaire
|
||||||
zone.overgrowth.name = Surcroissance Végétale
|
zone.overgrowth.name = Friche Végétale
|
||||||
zone.tarFields.name = Champs de Pétrole
|
zone.tarFields.name = Champs de Pétrole
|
||||||
zone.saltFlats.name = Marais Salants
|
zone.saltFlats.name = Marais Salants
|
||||||
zone.impact0078.name = Impact 0078
|
zone.impact0078.name = Impact 0078
|
||||||
zone.crags.name = Rochers
|
zone.crags.name = Rochers
|
||||||
zone.fungalPass.name = Passe Fongique
|
zone.fungalPass.name = Passe Fongique
|
||||||
|
|
||||||
zone.groundZero.description = L'emplacement optimal pour débuter. Faible menace ennemie. Peu de ressources. \nRecueillez autant de plomb et de cuivre que possible.\nRien d'autre à signaler.
|
zone.groundZero.description = L'emplacement optimal pour débuter. Faible menace ennemie. Peu de ressources. \nRecueillez autant de plomb et de cuivre que possible.\nRien d'autre à signaler.
|
||||||
zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir pour toujours.\n\nFamiliarisez vous avec l'Énergie. Construisez des générateurs a combustion. Aprenez a utiliser les réparateurs.
|
zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir pour toujours.\n\nFamiliarisez vous avec l'Énergie. Construisez des générateurs a combustion. Apprenez a utiliser les réparateurs.
|
||||||
zone.desertWastes.description = Cette étendue désertique est immense, imprévisibles. On y croise des structures abandonnées.\nLe charbon est présent dans la région. Brulez-le pour générer de l'Énergie ou synthétisez-le en graphite.\n\n[lightgray]Ce lieu d'atterisage est imprévisible.
|
zone.desertWastes.description = Cette étendue désertique est immense, imprévisible. On y croise des structures abandonnées.\nLe charbon est présent dans la région. Brûlez-le pour générer de l'Énergie ou synthétisez-le en graphite.\n\n[lightgray]Ce lieu d'atterisage est imprévisible.
|
||||||
zone.saltFlats.description = Aux abords du désert se trouvent les Marais Salants. Peu de ressources peuvent être trouvées à cet endroit.\n\nL'ennemi y a érigé un stockage de ressources. Éradiquez leur présence.
|
zone.saltFlats.description = Aux abords du désert se trouvent les Marais Salants. Peu de ressources peuvent être trouvées à cet endroit.\n\nL'ennemi y a érigé un stockage de ressources. Éradiquez leur présence.
|
||||||
zone.craters.description = L'eau s'est accumulée dans ce cratère, vestige des guerres anciennes. Récupérez la zone. Recueilliez du sable pour le transformer en verre trempé. Pompez de l'eau pour refroidir les tourelles et les perceuses.
|
zone.craters.description = L'eau s'est accumulée dans ce cratère, vestige des guerres anciennes. Récupérez la zone. Recueilliez du sable pour le transformer en verre trempé. Pompez de l'eau pour refroidir les tourelles et les perceuses.
|
||||||
zone.ruinousShores.description = Passé les contrées désertiques, c'est le rivage. Auparavent, cet endroit a abrité un réseau de défense côtière. Il n'en reste pas beaucoup. Seules les structures de défense les plus élémentaires sont restées indemnes, tout le reste étant réduit à néant.\nÉtendez vous. Redécouvrez la technologie.
|
zone.ruinousShores.description = Passé les contrées désertiques, c'est le rivage. Auparavant, cet endroit a abrité un réseau de défense côtière. Il n'en reste pas grand chose. Seules les structures de défense les plus élémentaires sont restées indemnes, tout le reste étant réduit à néant.\nÉtendez vous. Redécouvrez la technologie.
|
||||||
zone.stainedMountains.description = A l'intérieur des terres se trouvent des montagnes, épargnées par les spores. Extrayez le titane qui abonde dans cette région. Apprenez à vous en servir. La menace ennemi se fait plus présente ici. Ne leur donnez pas le temps de rallier leurs puissantes unités.
|
zone.stainedMountains.description = A l'intérieur des terres se trouvent des montagnes, épargnées par les spores. Extrayez le titane qui abonde dans cette région. Apprenez à vous en servir. La menace ennemi se fait plus présente ici. Ne leur donnez pas le temps de rallier leurs puissantes unités.
|
||||||
zone.overgrowth.description = Cette zone est étouffée par la végétation, et proche de la source des spores.\nL’ennemi a établi une base ici. Construisez des unitées Titan pour le détruire. Reprennez ce qui a été perdu.
|
zone.overgrowth.description = Cette zone est envahie par la végétation, et proche de la source des spores.\nL’ennemi a établi une base ici. Construisez des unités Titan pour le détruire. Reprenez ce qui a été perdu.
|
||||||
zone.tarFields.description = La périphérie d'une zone de puits pétroliers, entre montagnes et désert. Une des rares zones disposant de réserves de Pétrole utilisables. Bien qu'abandonnée, cette zone compte des forces ennemies dangereuses à proximité. Ne les sous-estimez pas.\n\n[lightgray]Si possible, recherchez les technologie de traitement d'huile.
|
zone.tarFields.description = La périphérie d'une zone de puits pétroliers, entre montagnes et désert. Une des rares zones disposant de réserves de Pétrole utilisables. Bien qu'abandonnée, cette zone compte des forces ennemies dangereuses à proximité. Ne les sous-estimez pas.\n\n[lightgray]Si possible, recherchez les technologies de traitement du pétrole
|
||||||
zone.desolateRift.description = Une zone extrêmement dangereuse. Ressources abondantes, mais peu d'espace. Fort risque de destruction. Repartez le plus vite possible. Ne vous laissez pas berner par une longue attente entre deux vagues ennemies.
|
zone.desolateRift.description = Une zone extrêmement dangereuse. Ressources abondantes, mais peu d'espace. Fort risque de destruction. Repartez le plus vite possible. Ne vous laissez pas berner par une longue attente entre deux vagues ennemies.
|
||||||
zone.nuclearComplex.description = Une ancienne installation de production et traitement de thorium réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nL'ennemi est présent ici en grand nombre, à l'affut constant.
|
zone.nuclearComplex.description = Une ancienne installation de production et traitement de thorium réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nL'ennemi est présent ici en grand nombre, constamment à l'affut.
|
||||||
zone.fungalPass.description = Une zone de transition entre les hautes montagnes et les basses régions infestées de spores. Une petite base de reconnaissance ennemie s'y trouve.\nDétruisez la.\nUtilisez les unités Poignard et Rampeurs. Détruisez les deux noyaux.
|
zone.fungalPass.description = Une zone de transition entre les hautes montagnes et les basses régions infestées de spores. Une petite base de reconnaissance ennemie s'y trouve.\nDétruisez la.\nUtilisez les unités Poignard et Rampeurs. Détruisez les deux noyaux.
|
||||||
zone.impact0078.description = <insérer une description ici>
|
zone.impact0078.description = <insérer une description ici>
|
||||||
zone.crags.description = <insérer une description ici>
|
zone.crags.description = <insérer une description ici>
|
||||||
|
|
||||||
settings.language = Langue
|
settings.language = Langue
|
||||||
settings.data = Données du Jeu
|
settings.data = Données du Jeu
|
||||||
settings.reset = Valeurs par Défaut.
|
settings.reset = Valeurs par Défaut
|
||||||
settings.rebind = Réattribuer
|
settings.rebind = Réattribuer
|
||||||
settings.controls = Contrôles
|
settings.controls = Contrôles
|
||||||
settings.game = Jeu
|
settings.game = Jeu
|
||||||
@@ -427,16 +467,15 @@ settings.sound = Son
|
|||||||
settings.graphics = Graphismes
|
settings.graphics = Graphismes
|
||||||
settings.cleardata = Effacer les données du jeu...
|
settings.cleardata = Effacer les données du jeu...
|
||||||
settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour en arrière n'est possible!
|
settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour en arrière n'est possible!
|
||||||
settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données, y conpris les sauvegarges, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'ok' le jeu effacera TOUTES les données et se fermera.
|
settings.clearall.confirm = [scarlet]ATTENTION![]\nCette action effacera toutes les données, y compris les sauvegardes, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'ok' le jeu effacera TOUTES les données et se fermera.
|
||||||
settings.clearunlocks = Effacer la progression
|
|
||||||
settings.clearall = Tout effacer
|
|
||||||
paused = [accent]< Pause >
|
paused = [accent]< Pause >
|
||||||
|
clear = Effacer
|
||||||
|
banned = [scarlet]Bannis
|
||||||
yes = Oui
|
yes = Oui
|
||||||
no = Non
|
no = Non
|
||||||
info.title = Info
|
info.title = Info
|
||||||
error.title = [crimson]Une erreur s'est produite
|
error.title = [crimson]Une erreur s'est produite
|
||||||
error.crashtitle = Une erreur s'est produite
|
error.crashtitle = Une erreur s'est produite
|
||||||
attackpvponly = [scarlet]Seulement disponible dans les modes Attaque et PvP
|
|
||||||
blocks.input = Input
|
blocks.input = Input
|
||||||
blocks.output = Output
|
blocks.output = Output
|
||||||
blocks.booster = Booster
|
blocks.booster = Booster
|
||||||
@@ -458,20 +497,21 @@ blocks.itemcapacity = Stockage
|
|||||||
blocks.basepowergeneration = Taux d'énergie normale
|
blocks.basepowergeneration = Taux d'énergie normale
|
||||||
blocks.productiontime = Durée de production
|
blocks.productiontime = Durée de production
|
||||||
blocks.repairtime = Durée de Réparation Complète du Bloc
|
blocks.repairtime = Durée de Réparation Complète du Bloc
|
||||||
blocks.speedincrease = Accéleration
|
blocks.speedincrease = Accélération
|
||||||
blocks.range = Portée
|
blocks.range = Portée
|
||||||
blocks.drilltier = Forable
|
blocks.drilltier = Forable
|
||||||
blocks.drillspeed = Vitesse de forage de base
|
blocks.drillspeed = Vitesse de forage de base
|
||||||
blocks.boosteffect = Boost Effect
|
blocks.boosteffect = Effet du Boost
|
||||||
blocks.maxunits = Unités actives max
|
blocks.maxunits = Unités actives max
|
||||||
blocks.health = Santé
|
blocks.health = Santé
|
||||||
blocks.buildtime = Durée de construction
|
blocks.buildtime = Durée de construction
|
||||||
blocks.buildcost = Coût de Construction
|
blocks.buildcost = Coût de construction
|
||||||
blocks.inaccuracy = Imprécision
|
blocks.inaccuracy = Imprécision
|
||||||
blocks.shots = Tirs
|
blocks.shots = Tirs
|
||||||
blocks.reload = Tirs/Seconde
|
blocks.reload = Tirs/Seconde
|
||||||
blocks.ammo = Munitions
|
blocks.ammo = Munitions
|
||||||
bar.drilltierreq = Foreuse Ameliorée Requise
|
|
||||||
|
bar.drilltierreq = Foreuse Améliorée Requise
|
||||||
bar.drillspeed = Vitesse de forage: {0}/s
|
bar.drillspeed = Vitesse de forage: {0}/s
|
||||||
bar.efficiency = Efficacité: {0}%
|
bar.efficiency = Efficacité: {0}%
|
||||||
bar.powerbalance = Énergie: {0}/s
|
bar.powerbalance = Énergie: {0}/s
|
||||||
@@ -485,6 +525,7 @@ bar.heat = Chaleur
|
|||||||
bar.power = Énergie
|
bar.power = Énergie
|
||||||
bar.progress = Progression de la construction
|
bar.progress = Progression de la construction
|
||||||
bar.spawned = Unités: {0}/{1}
|
bar.spawned = Unités: {0}/{1}
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] dégâts
|
bullet.damage = [stat]{0}[lightgray] dégâts
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
|
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
|
||||||
bullet.incendiary = [stat]incendiaire
|
bullet.incendiary = [stat]incendiaire
|
||||||
@@ -496,6 +537,7 @@ bullet.freezing = [stat]gel
|
|||||||
bullet.tarred = [stat]goudronné
|
bullet.tarred = [stat]goudronné
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions
|
bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions
|
||||||
bullet.reload = [stat]{0}[lightgray]x vitesse de tir
|
bullet.reload = [stat]{0}[lightgray]x vitesse de tir
|
||||||
|
|
||||||
unit.blocks = blocs
|
unit.blocks = blocs
|
||||||
unit.powersecond = énergie/seconde
|
unit.powersecond = énergie/seconde
|
||||||
unit.liquidsecond = unité de liquide/seconde
|
unit.liquidsecond = unité de liquide/seconde
|
||||||
@@ -520,15 +562,15 @@ setting.shadows.name = Ombres
|
|||||||
setting.linear.name = Filtrage Linéaire
|
setting.linear.name = Filtrage Linéaire
|
||||||
setting.animatedwater.name = Eau animée
|
setting.animatedwater.name = Eau animée
|
||||||
setting.animatedshields.name = Boucliers Animés
|
setting.animatedshields.name = Boucliers Animés
|
||||||
setting.antialias.name = Antialias[lightgray] (redémarrage du jeu nécéssaire)[]
|
setting.antialias.name = Antialias[lightgray] (redémarrage du jeu nécessaire)[]
|
||||||
setting.indicators.name = Indicateurs Alliés/Ennemis
|
setting.indicators.name = Indicateurs Alliés/Ennemis
|
||||||
setting.autotarget.name = Visée automatique
|
setting.autotarget.name = Visée automatique
|
||||||
setting.keyboard.name = Controles Sourie+Clavier
|
setting.keyboard.name = Contrôles Souris+Clavier
|
||||||
setting.touchscreen.name = Commandes d'Écran Tactile
|
setting.touchscreen.name = Commandes d'Écran Tactile
|
||||||
setting.fpscap.name = FPS Max
|
setting.fpscap.name = FPS Max
|
||||||
setting.fpscap.none = Aucun
|
setting.fpscap.none = Aucun
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécéssaire)[]
|
setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[]
|
||||||
setting.swapdiagonal.name = Autoriser le placement en diagonale
|
setting.swapdiagonal.name = Autoriser le placement en diagonale
|
||||||
setting.difficulty.training = Entraînement
|
setting.difficulty.training = Entraînement
|
||||||
setting.difficulty.easy = Facile
|
setting.difficulty.easy = Facile
|
||||||
@@ -542,12 +584,11 @@ setting.sensitivity.name = Sensibilité de la manette
|
|||||||
setting.saveinterval.name = Intervalle des sauvegardes auto
|
setting.saveinterval.name = Intervalle des sauvegardes auto
|
||||||
setting.seconds = {0} secondes
|
setting.seconds = {0} secondes
|
||||||
setting.fullscreen.name = Plein Écran
|
setting.fullscreen.name = Plein Écran
|
||||||
setting.borderlesswindow.name = Fenêtre sans bords (Borderless)[lightgray] (peut requérir le redémarrage du jeu)
|
setting.borderlesswindow.name = Fenêtre sans bords (Borderless)[lightgray] (peut nécessiter le redémarrage du jeu)
|
||||||
setting.fps.name = Afficher FPS
|
setting.fps.name = Afficher FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Afficher les connections Électriques
|
|
||||||
setting.pixelate.name = Pixeliser[lightgray] (désactive les animations)
|
setting.pixelate.name = Pixeliser[lightgray] (désactive les animations)
|
||||||
setting.minimap.name = Montrer la Minimap
|
setting.minimap.name = Afficher la Minimap
|
||||||
setting.musicvol.name = Volume Musique
|
setting.musicvol.name = Volume Musique
|
||||||
setting.ambientvol.name = Volume Ambiant
|
setting.ambientvol.name = Volume Ambiant
|
||||||
setting.mutemusic.name = Couper la Musique
|
setting.mutemusic.name = Couper la Musique
|
||||||
@@ -557,12 +598,14 @@ setting.crashreport.name = Envoyer un Rapport de Crash Anonyme
|
|||||||
setting.savecreate.name = Sauvegardes Auto
|
setting.savecreate.name = Sauvegardes Auto
|
||||||
setting.publichost.name = Visibilité de la Partie Publique
|
setting.publichost.name = Visibilité de la Partie Publique
|
||||||
setting.chatopacity.name = Opacité du Chat
|
setting.chatopacity.name = Opacité du Chat
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Montrer le Chat
|
setting.playerchat.name = Montrer le Chat
|
||||||
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement aux parametres d'avant et fermeture dans [accent] {0}[]...
|
public.confirm = Voulez-vous rendre votre partie publique?\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique
|
||||||
|
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement aux paramètres d'avant et fermeture dans [accent] {0}[]...
|
||||||
uiscale.cancel = Annuler & Quitter
|
uiscale.cancel = Annuler & Quitter
|
||||||
setting.bloom.name = Flou lumineux
|
setting.bloom.name = Flou lumineux
|
||||||
keybind.title = Racourcis Clavier
|
keybind.title = Raccourcis Clavier
|
||||||
keybinds.mobile = [scarlet]La plupart des racourcis claviers ne sont pas fonctionnels sur mobile. Seuls les mouvements basiques sont supportés.
|
keybinds.mobile = [scarlet]La plupart des raccourcis claviers ne sont pas fonctionnels sur mobile. Seuls les mouvements basiques sont supportés.
|
||||||
category.general.name = Général
|
category.general.name = Général
|
||||||
category.view.name = Voir
|
category.view.name = Voir
|
||||||
category.multiplayer.name = Multijoueur
|
category.multiplayer.name = Multijoueur
|
||||||
@@ -580,10 +623,10 @@ keybind.fullscreen.name = Basculer en Plein Écran
|
|||||||
keybind.select.name = Sélectionner/Tirer
|
keybind.select.name = Sélectionner/Tirer
|
||||||
keybind.diagonal_placement.name = Placement en diagonale
|
keybind.diagonal_placement.name = Placement en diagonale
|
||||||
keybind.pick.name = Choisir un bloc
|
keybind.pick.name = Choisir un bloc
|
||||||
keybind.break_block.name = Suppprimer un bloc
|
keybind.break_block.name = Supprimer un bloc
|
||||||
keybind.deselect.name = Désélectionner
|
keybind.deselect.name = Désélectionner
|
||||||
keybind.shoot.name = Tirer
|
keybind.shoot.name = Tirer
|
||||||
keybind.zoom_hold.name = Maintenir le zoom
|
keybind.zoom_hold.name = Maintenir pour zoomer
|
||||||
keybind.zoom.name = Zoom
|
keybind.zoom.name = Zoom
|
||||||
keybind.menu.name = Menu
|
keybind.menu.name = Menu
|
||||||
keybind.pause.name = Pause
|
keybind.pause.name = Pause
|
||||||
@@ -593,6 +636,7 @@ keybind.chat.name = Chat
|
|||||||
keybind.player_list.name = Liste des joueurs
|
keybind.player_list.name = Liste des joueurs
|
||||||
keybind.console.name = Console
|
keybind.console.name = Console
|
||||||
keybind.rotate.name = Tourner
|
keybind.rotate.name = Tourner
|
||||||
|
keybind.rotateplaced.name = Tourner existant (maintenir)
|
||||||
keybind.toggle_menus.name = Cacher/afficher les menus
|
keybind.toggle_menus.name = Cacher/afficher les menus
|
||||||
keybind.chat_history_prev.name = Remonter l'historique du chat
|
keybind.chat_history_prev.name = Remonter l'historique du chat
|
||||||
keybind.chat_history_next.name = Descendre l'historique du chat
|
keybind.chat_history_next.name = Descendre l'historique du chat
|
||||||
@@ -601,14 +645,16 @@ keybind.drop_unit.name = Larguer l'unité
|
|||||||
keybind.zoom_minimap.name = Zoom minimap
|
keybind.zoom_minimap.name = Zoom minimap
|
||||||
mode.help.title = Description des modes de jeu
|
mode.help.title = Description des modes de jeu
|
||||||
mode.survival.name = Survie
|
mode.survival.name = Survie
|
||||||
mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Nécéssite un point d'apparition pour les ennemis.
|
mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Nécessite un point d'apparition pour les ennemis.
|
||||||
mode.sandbox.name = Bac à sable
|
mode.sandbox.name = Bac à sable
|
||||||
mode.sandbox.description = Ressources infinies et pas de minuterie pour les vagues.
|
mode.sandbox.description = Ressources infinies et pas de minuterie pour les vagues.
|
||||||
|
mode.editor.name = Editeur
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = Battez-vous contre d'autres joueurs en local.\n[gray]Requiert aux moins 2 noyaux de couleur différentes dans la carte pour y jouer.
|
mode.pvp.description = Battez-vous contre d'autres joueurs en local.\n[gray]Requiert aux moins 2 noyaux de couleur différentes dans la carte pour y jouer.
|
||||||
mode.attack.name = Attaque
|
mode.attack.name = Attaque
|
||||||
mode.attack.description = Pas de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un noyaux rouge dans la map pour y jouer.
|
mode.attack.description = Pas de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un noyaux rouge dans la map pour y jouer.
|
||||||
mode.custom = Règles personnalisées
|
mode.custom = Règles personnalisées
|
||||||
|
|
||||||
rules.infiniteresources = Ressources infinies
|
rules.infiniteresources = Ressources infinies
|
||||||
rules.wavetimer = Minuterie pour les vagues
|
rules.wavetimer = Minuterie pour les vagues
|
||||||
rules.waves = Vagues
|
rules.waves = Vagues
|
||||||
@@ -619,9 +665,9 @@ rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction d'Uni
|
|||||||
rules.unithealthmultiplier = Multiplicateur de Santé des Unités
|
rules.unithealthmultiplier = Multiplicateur de Santé des Unités
|
||||||
rules.playerhealthmultiplier = Multiplicateur de Santé des Joueurs
|
rules.playerhealthmultiplier = Multiplicateur de Santé des Joueurs
|
||||||
rules.playerdamagemultiplier = Multiplicateur des Dégâts Joueurs
|
rules.playerdamagemultiplier = Multiplicateur des Dégâts Joueurs
|
||||||
rules.unitdamagemultiplier = Multiplicateur des Dégats Unité
|
rules.unitdamagemultiplier = Multiplicateur des dégâts Unité
|
||||||
rules.enemycorebuildradius = Périmètre de non-construction du noyau ennemi:[lightgray] (blocs)
|
rules.enemycorebuildradius = Périmètre de non-construction du noyau ennemi:[lightgray] (blocs)
|
||||||
rules.respawntime = Durée de réaparition:[lightgray] (sec)
|
rules.respawntime = Durée de réapparition:[lightgray] (sec)
|
||||||
rules.wavespacing = Espacement des vagues:[lightgray] (sec)
|
rules.wavespacing = Espacement des vagues:[lightgray] (sec)
|
||||||
rules.buildcostmultiplier = Multiplicateur du prix de construction
|
rules.buildcostmultiplier = Multiplicateur du prix de construction
|
||||||
rules.buildspeedmultiplier = Multiplicateur du temps de construction
|
rules.buildspeedmultiplier = Multiplicateur du temps de construction
|
||||||
@@ -635,6 +681,7 @@ rules.title.resourcesbuilding = Ressources & Construction
|
|||||||
rules.title.player = Joueurs
|
rules.title.player = Joueurs
|
||||||
rules.title.enemy = Ennemis
|
rules.title.enemy = Ennemis
|
||||||
rules.title.unit = Unités
|
rules.title.unit = Unités
|
||||||
|
|
||||||
content.item.name = Objets
|
content.item.name = Objets
|
||||||
content.liquid.name = Liquides
|
content.liquid.name = Liquides
|
||||||
content.unit.name = Unités
|
content.unit.name = Unités
|
||||||
@@ -674,7 +721,7 @@ mech.omega-mech.weapon = Missiles Essaim
|
|||||||
mech.omega-mech.ability = Armure
|
mech.omega-mech.ability = Armure
|
||||||
mech.dart-ship.name = Dard
|
mech.dart-ship.name = Dard
|
||||||
mech.dart-ship.weapon = Mitraillette
|
mech.dart-ship.weapon = Mitraillette
|
||||||
mech.javelin-ship.name = Javelin
|
mech.javelin-ship.name = Javelot
|
||||||
mech.javelin-ship.weapon = Missiles Rafale
|
mech.javelin-ship.weapon = Missiles Rafale
|
||||||
mech.javelin-ship.ability = Décharge de Propulseur
|
mech.javelin-ship.ability = Décharge de Propulseur
|
||||||
mech.trident-ship.name = Trident
|
mech.trident-ship.name = Trident
|
||||||
@@ -696,6 +743,7 @@ mech.buildspeed = [LIGHT_GRAY]Vitesse de Construction: {0}%
|
|||||||
liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Viscosité: {0}
|
liquid.viscosity = [LIGHT_GRAY]Viscosité: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Température: {0}
|
liquid.temperature = [LIGHT_GRAY]Température: {0}
|
||||||
|
|
||||||
block.sand-boulder.name = Bloc de Sable
|
block.sand-boulder.name = Bloc de Sable
|
||||||
block.grass.name = Herbe
|
block.grass.name = Herbe
|
||||||
block.salt.name = Sel
|
block.salt.name = Sel
|
||||||
@@ -706,14 +754,14 @@ block.sandrocks.name = Roches de sable
|
|||||||
block.spore-pine.name = Pin Sporifié
|
block.spore-pine.name = Pin Sporifié
|
||||||
block.sporerocks.name = Roche Sporeuse
|
block.sporerocks.name = Roche Sporeuse
|
||||||
block.rock.name = Roche
|
block.rock.name = Roche
|
||||||
block.snowrock.name = Roches enneigés
|
block.snowrock.name = Roches enneigées
|
||||||
block.snow-pine.name = Pin enneigé
|
block.snow-pine.name = Pin enneigé
|
||||||
block.shale.name = Schiste
|
block.shale.name = Schiste
|
||||||
block.shale-boulder.name = Blocs de Schiste
|
block.shale-boulder.name = Blocs de Schiste
|
||||||
block.moss.name = Mousse
|
block.moss.name = Mousse
|
||||||
block.shrubs.name = Arbustes
|
block.shrubs.name = Arbustes
|
||||||
block.spore-moss.name = Mousse Sporeuse
|
block.spore-moss.name = Mousse Sporeuse
|
||||||
block.shalerocks.name = Rochets de de Schiste Argileux
|
block.shalerocks.name = Rochers de Schiste Argileux
|
||||||
block.scrap-wall.name = Mur de Ferraille
|
block.scrap-wall.name = Mur de Ferraille
|
||||||
block.scrap-wall-large.name = Mur de Ferraille Large
|
block.scrap-wall-large.name = Mur de Ferraille Large
|
||||||
block.scrap-wall-huge.name = Mur de Ferraille Énorme
|
block.scrap-wall-huge.name = Mur de Ferraille Énorme
|
||||||
@@ -729,8 +777,8 @@ block.core-foundation.name = Noyau: Fondation
|
|||||||
block.core-nucleus.name = Noyau: Épicentre
|
block.core-nucleus.name = Noyau: Épicentre
|
||||||
block.deepwater.name = Eau profonde
|
block.deepwater.name = Eau profonde
|
||||||
block.water.name = Eau
|
block.water.name = Eau
|
||||||
block.tainted-water.name = Eau Teintée
|
block.tainted-water.name = Eau Contaminée
|
||||||
block.darksand-tainted-water.name = Sable Teinté d'Eau Sombre
|
block.darksand-tainted-water.name = Sable Sombre Mouillé Contaminé
|
||||||
block.tar.name = Pétrole
|
block.tar.name = Pétrole
|
||||||
block.stone.name = Roche
|
block.stone.name = Roche
|
||||||
block.sand.name = Sable
|
block.sand.name = Sable
|
||||||
@@ -739,7 +787,7 @@ block.ice.name = Glace
|
|||||||
block.snow.name = Neige
|
block.snow.name = Neige
|
||||||
block.craters.name = Cratères
|
block.craters.name = Cratères
|
||||||
block.sand-water.name = Sable Mouillé
|
block.sand-water.name = Sable Mouillé
|
||||||
block.darksand-water.name = Sable Mouillé Sombre
|
block.darksand-water.name = Sable Sombre Mouillé
|
||||||
block.char.name = Cendre
|
block.char.name = Cendre
|
||||||
block.holostone.name = Pierre Holographique
|
block.holostone.name = Pierre Holographique
|
||||||
block.ice-snow.name = Neige Gelée
|
block.ice-snow.name = Neige Gelée
|
||||||
@@ -800,9 +848,9 @@ block.melter.name = Four à Fusion
|
|||||||
block.incinerator.name = Incinérateur
|
block.incinerator.name = Incinérateur
|
||||||
block.spore-press.name = Presse à Spore
|
block.spore-press.name = Presse à Spore
|
||||||
block.separator.name = Séparateur
|
block.separator.name = Séparateur
|
||||||
block.coal-centrifuge.name = Centrifuge à Charbon
|
block.coal-centrifuge.name = Centrifugeur à Charbon
|
||||||
block.power-node.name = Transmetteur Énergétique
|
block.power-node.name = Transmetteur Énergétique
|
||||||
block.power-node-large.name = Gros Transmetteur Énergétique
|
block.power-node-large.name = Grand Transmetteur Énergétique
|
||||||
block.surge-tower.name = Tour de Surtension
|
block.surge-tower.name = Tour de Surtension
|
||||||
block.battery.name = Batterie
|
block.battery.name = Batterie
|
||||||
block.battery-large.name = Grande Batterie
|
block.battery-large.name = Grande Batterie
|
||||||
@@ -817,7 +865,7 @@ block.water-extractor.name = Extracteur d'Eau
|
|||||||
block.cultivator.name = Cultivateur
|
block.cultivator.name = Cultivateur
|
||||||
block.dart-mech-pad.name = Reconstructeur de Mécha Dard
|
block.dart-mech-pad.name = Reconstructeur de Mécha Dard
|
||||||
block.delta-mech-pad.name = Reconstructeur de Mécha Delta
|
block.delta-mech-pad.name = Reconstructeur de Mécha Delta
|
||||||
block.javelin-ship-pad.name = Reconstructeur de Vaisseau Javelin
|
block.javelin-ship-pad.name = Reconstructeur de Vaisseau Javelot
|
||||||
block.trident-ship-pad.name = Reconstructeur de Vaisseau Trident
|
block.trident-ship-pad.name = Reconstructeur de Vaisseau Trident
|
||||||
block.glaive-ship-pad.name = Reconstructeur de Vaisseau Glaive
|
block.glaive-ship-pad.name = Reconstructeur de Vaisseau Glaive
|
||||||
block.omega-mech-pad.name = Reconstructeur de Mécha Oméga
|
block.omega-mech-pad.name = Reconstructeur de Mécha Oméga
|
||||||
@@ -852,7 +900,7 @@ block.ghoul-factory.name = Usine de Bombardiers Goules
|
|||||||
block.dagger-factory.name = Usine de Méchas Poignards
|
block.dagger-factory.name = Usine de Méchas Poignards
|
||||||
block.crawler-factory.name = Usine de Méchas Rampeurs
|
block.crawler-factory.name = Usine de Méchas Rampeurs
|
||||||
block.titan-factory.name = Usine de Méchas Titans
|
block.titan-factory.name = Usine de Méchas Titans
|
||||||
block.fortress-factory.name = Usine de Méchas Forteresse
|
block.fortress-factory.name = Usine de Méchas Forteresses
|
||||||
block.revenant-factory.name = Usine de Combattants Revenants
|
block.revenant-factory.name = Usine de Combattants Revenants
|
||||||
block.repair-point.name = Point de Réparation
|
block.repair-point.name = Point de Réparation
|
||||||
block.pulse-conduit.name = Conduit à Impulsion
|
block.pulse-conduit.name = Conduit à Impulsion
|
||||||
@@ -908,26 +956,27 @@ unit.lich.name = Liche
|
|||||||
unit.reaper.name = Faucheur
|
unit.reaper.name = Faucheur
|
||||||
tutorial.next = [lightgray]<Appuyez pour continuer>
|
tutorial.next = [lightgray]<Appuyez pour continuer>
|
||||||
tutorial.intro = Vous venez de commencer le [scarlet]Tutoriel de Mindustry.[]\nCommence en minant du [accent]cuivre[]. Pour cela, appuyez sur une veine de minerai de cuivre près de votre noyau.\n\n[accent]{0}/{1} cuivre
|
tutorial.intro = Vous venez de commencer le [scarlet]Tutoriel de Mindustry.[]\nCommence en minant du [accent]cuivre[]. Pour cela, appuyez sur une veine de minerai de cuivre près de votre noyau.\n\n[accent]{0}/{1} cuivre
|
||||||
tutorial.drill = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nCliquez sur l'onglet des foreuses en bas à droite.\nSelectionnez la [accent]foreuse mécanique[]. Placez-la sur une veine de cuivre en cliquant.\n[accent]Faite un clique-droit[] pour arrêter la construction.
|
tutorial.drill = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nCliquez sur l'onglet des foreuses en bas à droite.\nSélectionnez la [accent]foreuse mécanique[]. Placez-la sur une veine de cuivre en cliquant.\n[accent]Faite un clique-droit[] pour arrêter la construction.
|
||||||
tutorial.drill.mobile = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nAppuyez sur l'onglet des foreuses en bas à droite.\nSelectionnez la [accent]foreuse mécanique[].\nPlacez-la sur une veine de cuivre en y appuyant, puis en touchant la[accent] coche[] pour confirmer votre placement.\nAppuyez sur le [accent]boutton en forme de croix[] pour annuler le placement.
|
tutorial.drill.mobile = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nAppuyez sur l'onglet des foreuses en bas à droite.\nSélectionnez la [accent]foreuse mécanique[].\nPlacez-la sur une veine de cuivre en y appuyant, puis en touchant la[accent] coche[] pour confirmer votre placement.\nAppuyez sur le [accent]bouton en forme de croix[] pour annuler le placement.
|
||||||
tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut miner que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc, appuyez sur le [accent]bouton "?" tout en le sélectionnant dans le menu de construction.[]\n\n[accent]Maintenant, accédez aux statistiques de la foreuse mécanique.[]
|
tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut miner que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc, appuyez sur le [accent]bouton "?" tout en le sélectionnant dans le menu de construction.[]\n\n[accent]Maintenant, accédez aux statistiques de la foreuse mécanique.[]
|
||||||
tutorial.conveyor = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent]Maintenez votre souris pour les placer en ligne.[]\nGardez la touche[accent] CTRL[] enfoncé pour pouvoir les placer en diagonale.\n\n[accent]{0}/{1} convoyeurs placé en ligne\n[accent]0/1 ressources acheminées
|
tutorial.conveyor = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent]Maintenez votre souris pour les placer en ligne.[]\nGardez la touche[accent] CTRL[] enfoncé pour pouvoir les placer en diagonale.\n\n[accent]{0}/{1} convoyeurs placé en ligne\n[accent]0/1 ressources acheminées
|
||||||
tutorial.conveyor.mobile = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent] Maintenez votre doigt enfoncé[] et deplacez-le pour former une ligne.\n\n[accent]{0}/{1} convoyeurs placé en ligne\n[accent]0/1 ressources acheminées
|
tutorial.conveyor.mobile = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent] Maintenez votre doigt enfoncé[] et déplacez-le pour former une ligne.\n\n[accent]{0}/{1} convoyeurs placé en ligne\n[accent]0/1 ressources acheminées
|
||||||
tutorial.turret = Une fois qu'une ressource rentre dans votre noyau, elle peut être utilisé pour la construction.\nGardez à l'esprit que certaines ressources ne peuvent pas être utilisés pour la construction.\nCes ressources, tel que[accent] le charbon[] ou[accent] la ferraille[], ne peuvent pas rentrer dans votre noyau.\nDes structures défensives doivent être construites pour repousser l'[lightgray] ennemi[].\nConstruisez une [accent]tourrelle Duo[] non loin de votre noyau.
|
tutorial.turret = Une fois qu'une ressource rentre dans votre noyau, elle peut être utilisée pour la construction.\nGardez à l'esprit que certaines ressources ne peuvent pas être utilisées pour la construction.\nCes ressources, tel que[accent] le charbon[] ou[accent] la ferraille[], ne peuvent pas rentrer dans votre noyau.\nDes structures défensives doivent être construites pour repousser l'[lightgray] ennemi[].\nConstruisez une [accent]tourelle Duo[] non loin de votre noyau.
|
||||||
tutorial.drillturret = Les tourrelles Duo ont besoin de[accent] munitions en cuivre []pour tirer.\nPlacez une foreuse près de la tourelle.\nA l'aide de convoyeurs, alimentez la tourelle en cuivre.\n\n[accent]Munitions livrées: 0/1
|
tutorial.drillturret = Les tourelles Duo ont besoin de[accent] munitions en cuivre []pour tirer.\nPlacez une foreuse près de la tourelle.\nA l'aide de convoyeurs, alimentez la tourelle en cuivre.\n\n[accent]Munitions livrées: 0/1
|
||||||
tutorial.pause = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des batiments à construire tout en étant en pause.\n\n[accent]Appuyez sur la barre espace pour pauser.
|
tutorial.pause = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des bâtiments à construire tout en étant en pause.\n\n[accent]Appuyez sur la barre espace pour pauser.
|
||||||
tutorial.pause.mobile = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des batiments à construire tout en étant en pause.\n\n[accent]Appuyez sur ce bouton en haut à gauche pour pauser.
|
tutorial.pause.mobile = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des bâtiments à construire tout en étant en pause.\n\n[accent]Appuyez sur ce bouton en haut à gauche pour pauser.
|
||||||
tutorial.unpause = Maintenant, appuyez à nouveau sur espace pour continuer à jouer.
|
tutorial.unpause = Maintenant, appuyez à nouveau sur espace pour continuer à jouer.
|
||||||
tutorial.unpause.mobile = Appuyez à nouveau dessus pour continuer à jouer.
|
tutorial.unpause.mobile = Appuyez à nouveau dessus pour continuer à jouer.
|
||||||
tutorial.breaking = Les blocs doivent souvent être détruits.\n[accent]Gardez enfoncé le boutton de droite de votre souri[] pour détruire tous les blocs en une sélection.[]\n\n[accent]Détruisez tous les blocs de ferraille situés à gauche de votre noyau à l'aide de la sélection de zone.
|
tutorial.breaking = Les blocs doivent souvent être détruits.\n[accent]Gardez enfoncé le bouton droit de votre souris[] pour détruire tous les blocs en une sélection.[]\n\n[accent]Détruisez tous les blocs de ferraille situés à gauche de votre noyau à l'aide de la sélection de zone.
|
||||||
tutorial.breaking.mobile = Les blocs doivent souvent être détruits.\n[accent]Selectionnez le mode de déconstruction[], puis appuyez sur un bloc pour commencer à le détruire.\nDétruisez une zone en maintenant votre doigt appuyé pendant quelques secondes[] et en le déplacant dans une direction.\nAppuyez sur le bouton coche pour confirmer.\n\n[accent]Détruisez tous les blocs de ferraille situés à gauche de votre noyau à l'aide de la sélection de zone.
|
tutorial.breaking.mobile = Les blocs doivent souvent être détruits.\n[accent]Sélectionnez le mode de déconstruction[], puis appuyez sur un bloc pour commencer à le détruire.\nDétruisez une zone en maintenant votre doigt appuyé pendant quelques secondes[] et en le déplaçant dans une direction.\nAppuyez sur le bouton coche pour confirmer.\n\n[accent]Détruisez tous les blocs de ferraille situés à gauche de votre noyau à l'aide de la sélection de zone.
|
||||||
tutorial.withdraw = Dans certaines situations, il est nécessaire de prendre des éléments directement à partir de blocs.\nPour faire cela, [accent]appuyez sur un bloc[] qui contient des ressources, puis [accent]appuyez sur une ressource[] dans son inventaire.\nPlusieurs ressources peuvent être retirés en [accent]appuyant pendant quelque secondes[].\n\n[accent]Retirez du cuivre du noyau.[]
|
tutorial.withdraw = Dans certaines situations, il est nécessaire de prendre des éléments directement à partir de blocs.\nPour faire cela, [accent]appuyez sur un bloc[] qui contient des ressources, puis [accent]appuyez sur une ressource[] dans son inventaire.\nPlusieurs ressources peuvent être retirées en [accent]appuyant pendant quelques secondes[].\n\n[accent]Retirez du cuivre du noyau.[]
|
||||||
tutorial.deposit = Déposez des ressources dans des blocs en les faisant glisser de votre vaisseau vers le bloc de destination.\n\n[accent]Déposez le cuivre récupéré précedemment dans le noyau.[]
|
tutorial.deposit = Déposez des ressources dans des blocs en les faisant glisser de votre vaisseau vers le bloc de destination.\n\n[accent]Déposez le cuivre récupéré précédemment dans le noyau.[]
|
||||||
tutorial.waves = L'[lightgray] ennemi[] approche.\n\nDefend le noyau pendant 2 vagues.[accent] Clique[] pour tirer.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
tutorial.waves = L'[lightgray] ennemi[] approche.\n\nDéfendez le noyau pendant 2 vagues.[accent] Cliquez[] pour tirer.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
||||||
tutorial.waves.mobile = L'[lightgray] ennemi[] approche.\n\nDefend le noyau pendant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
tutorial.waves.mobile = L'[lightgray] ennemi[] approche.\n\nDéfendez le noyau pendant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
||||||
tutorial.launch = Une fois que vous aurez atteind une vague spécifique, vous aurez la possibilité de[accent] faire décoler le noyau[], abandonant vos défenses mais en [accent]sécurisant toutes les ressources de votre noyau.[]\nCes ressources peuvent ensuite être utilisées pour rechercher de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement.
|
tutorial.launch = Une fois que vous aurez atteint une vague spécifique, vous aurez la possibilité de[accent] faire décoller le noyau[], abandonnant vos défenses mais [accent]sécurisant toutes les ressources stockées dans votre noyau.[]\nCes ressources peuvent ensuite être utilisées pour rechercher de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement.
|
||||||
|
|
||||||
item.copper.description = Le matériau structurel de base. Utilisé intensivement dans tout les blocs.
|
item.copper.description = Le matériau structurel de base. Utilisé intensivement dans tout les blocs.
|
||||||
item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et dans les blocs de trasports de liquides.
|
item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et dans les blocs de transport de liquides.
|
||||||
item.metaglass.description = Un composé de vitre super-résistant. Utilisé largement pour le transport et le stockage de liquides.
|
item.metaglass.description = Un composé de vitre super-résistant. Utilisé largement pour le transport et le stockage de liquides.
|
||||||
item.graphite.description = Du carbone minéralisé, utilisé pour les munitions et l’isolation électrique.
|
item.graphite.description = Du carbone minéralisé, utilisé pour les munitions et l’isolation électrique.
|
||||||
item.sand.description = Un matériau commun utilisé largement dans la fonte, à la fois dans l'alliage et comme un flux.
|
item.sand.description = Un matériau commun utilisé largement dans la fonte, à la fois dans l'alliage et comme un flux.
|
||||||
@@ -938,150 +987,150 @@ item.scrap.description = Restes de vieilles structures et unités. Contient des
|
|||||||
item.silicon.description = Un matériau semi-conducteur extrêmement utile, avec des utilisations dans les panneaux solaires et dans beaucoup d'autre composants électroniques complexes.
|
item.silicon.description = Un matériau semi-conducteur extrêmement utile, avec des utilisations dans les panneaux solaires et dans beaucoup d'autre composants électroniques complexes.
|
||||||
item.plastanium.description = Un matériau léger et ductile utilisé dans l'aviation avancée et dans les munitions à fragmentation.
|
item.plastanium.description = Un matériau léger et ductile utilisé dans l'aviation avancée et dans les munitions à fragmentation.
|
||||||
item.phase-fabric.description = Une substance au poids quasiment inexistant utilisé pour l'électronique avancé et la technologie auto-réparatrice.
|
item.phase-fabric.description = Une substance au poids quasiment inexistant utilisé pour l'électronique avancé et la technologie auto-réparatrice.
|
||||||
item.surge-alloy.description = Un alliage avancé avec des propriétés électriques avancées.
|
item.surge-alloy.description = Un alliage avancé avec des propriétés électriques uniques.
|
||||||
item.spore-pod.description = Une gousse de spores synthétiques, synthétisées à partir de concentrations atmosphériques à des fins industrielles. Utilisé pour la conversion en huile, explosifs et carburant.
|
item.spore-pod.description = Une gousse de spores synthétiques, synthétisées à partir de concentrations atmosphériques à des fins industrielles. Utilisé pour la conversion en pétrole, explosifs et carburant.
|
||||||
item.blast-compound.description = Un composé volatile utilisé dans les bombes et les explosifs. Bien qu'il puisse être utilisé comme carburant, ce n'est pas conseillé.
|
item.blast-compound.description = Un composé volatile utilisé dans les bombes et les explosifs. Bien qu'il puisse être utilisé comme carburant, ce n'est pas conseillé.
|
||||||
item.pyratite.description = Une substance extrêmement inflammable utilisée dans les armes incendiaires.
|
item.pyratite.description = Une substance extrêmement inflammable utilisée dans les armes incendiaires.
|
||||||
liquid.water.description = Le liquide le plus utile. Couramment utilisé pour le refroidissement et le traitement des déchets.
|
liquid.water.description = Le liquide le plus utile. Couramment utilisé pour le refroidissement et le traitement des déchets.
|
||||||
liquid.slag.description = Différents types de métaux en fusion mélangés. Peut être séparé en ses minéraux constitutifs ou tout simplement pulvérisé sur les unités ennemies.
|
liquid.slag.description = Différents types de métaux en fusion mélangés. Peut être séparé en ses minéraux constitutifs ou tout simplement pulvérisé sur les unités ennemies.
|
||||||
liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être brûlé, utilisé comme explosif ou comme liquide de refroidissement.
|
liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis puis enflammé.
|
||||||
liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir d’eau et de titane. A une capacité d'absorption de chaleur extrêmement élevée. Utilisé intensivement comme liquide de refroidissement.
|
liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir d’eau et de titane. A une capacité d'absorption de chaleur extrêmement élevée. Utilisé intensivement comme liquide de refroidissement.
|
||||||
mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poignard, avec une armure améliorée et des capacités de construction. Inflige plus de dégâts qu'un vaisseau Dard.
|
mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poignard, avec une armure améliorée et des capacités de construction. Inflige plus de dégâts qu'un vaisseau Dard.
|
||||||
mech.delta-mech.description = Un mécha rapide, avec une armure légère, concu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques.
|
mech.delta-mech.description = Un mécha rapide, avec une armure légère, conçu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques.
|
||||||
mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence.
|
mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence.
|
||||||
mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts.
|
mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts.
|
||||||
mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger. Il a néanmoins peu d'attaque et une faible vitesse de minage.
|
mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger. Il a néanmoins peu d'attaque et une faible vitesse de minage.
|
||||||
mech.javelin-ship.description = Un vaisseau de frappe qui, bien que lent au départ, peut accélerer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles.
|
mech.javelin-ship.description = Un vaisseau de frappe éclair qui, bien que lent au départ, peut accélérer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles.
|
||||||
mech.trident-ship.description = Un bombardier lourd, concu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé.
|
mech.trident-ship.description = Un bombardier lourd, conçu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé.
|
||||||
mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Equipé avec un fusil automatique à munitions incendiaires. Est très maniable.
|
mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Équipé avec un fusil automatique à munitions incendiaires. Est très maniable.
|
||||||
unit.draug.description = Un drone de minage primitif pas cher à produire. Sacrifiable. Mine automatiquement le cuivre et le plomb dans les environs. Fournit les ressources minées au noyau le plus proche.
|
unit.draug.description = Un drone de minage primitif pas cher à produire. Sacrifiable. Mine automatiquement le cuivre et le plomb dans les environs. Fournit les ressources minées au noyau le plus proche.
|
||||||
unit.spirit.description = Un drone Draug modifié, conçu pour réparer au lieu d’exploiter. Répare automatiquement tous les blocs endommagés dans la zone.
|
unit.spirit.description = Un drone Draug modifié, conçu pour réparer au lieu d’exploiter. Répare automatiquement tous les blocs endommagés dans la zone.
|
||||||
unit.phantom.description = Une unité de drone avancée qui vous suit et vous aide à la construction de blocs.
|
unit.phantom.description = Une unité de drone avancée qui vous suit et vous aide à la construction de blocs.
|
||||||
unit.dagger.description = L'unité de sol de base. Coute pas cher à produire. Est écrasant lorsqu'il est utilisé en essaims.
|
unit.dagger.description = L'unité terrestre de base. Coûte peu cher à produire. Implacable lorsqu'il est utilisé en essaims.
|
||||||
unit.crawler.description = Une unité de sol composée d’un cadre dépouillé sur lequel sont fixés des explosifs puissants. Pas particulièrement durable. Explose au contact des ennemis.
|
unit.crawler.description = Une unité terrestre composée d’un cadre dépouillé sur lequel sont fixés des explosifs puissants. Pas particulièrement durable. Explose au contact des ennemis.
|
||||||
unit.titan.description = Une unité terrestre avancée et blindée. Attaque les cibles aériennes et terrestres. Equipé de deux lance-flammes miniatures de type Brûleur.
|
unit.titan.description = Une unité terrestre avancée et blindée. Attaque les cibles aériennes et terrestres. Équipé de deux lance-flammes miniatures de type Brûleur.
|
||||||
unit.fortress.description = Une unité d'artillerie lourde. Equipé de deux canons de type Grêle modifiés pour l'assaut à longue portée contre les structures et les unités ennemies.
|
unit.fortress.description = Une unité d'artillerie lourde. Équipé de deux canons de type Grêle modifiés pour l'assaut à longue portée contre les structures et les unités ennemies.
|
||||||
unit.eruptor.description = Une unité lourde conçue pour détruire les structures. Tire un flot de scories sur les fortifications ennemies, les faisant fondre et brûler.
|
unit.eruptor.description = Une unité lourde conçue pour détruire les structures. Tire un flot de scories sur les fortifications ennemies, les faisant fondre et brûler.
|
||||||
unit.wraith.description = Une unité d'interception rapide et de frappe. Cible les générateurs d'énergie.
|
unit.wraith.description = Une unité d'interception rapide de harcelement. Cible les générateurs d'énergie.
|
||||||
unit.ghoul.description = Un bombardier lourd de saturation. Déchire a travert les structures ennemies, ciblant les infrastructures critiques.
|
unit.ghoul.description = Un bombardier lourd de barrage. Fend a travers les lignes ennemies, ciblant les infrastructures critiques.
|
||||||
unit.revenant.description = Un arsenal de missiles lourd et planant.
|
unit.revenant.description = Une plateforme aérienne lançant des missiles lourds.
|
||||||
block.message.description = Enregistre un message. Utilisé pour la communication entre alliés.
|
block.message.description = Enregistre un message. Utilisé pour la communication entre alliés.
|
||||||
block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite pur.
|
block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite pur.
|
||||||
block.multi-press.description = Une version améliorée de la presse à graphite. Utilise de l'eau et de l'électricité pour traiter le charbon rapidement et efficacement.
|
block.multi-press.description = Une version améliorée de la presse à graphite. Utilise de l'eau et de l'électricité pour traiter le charbon rapidement et efficacement.
|
||||||
block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicone.
|
block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicone.
|
||||||
block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Nécessite de petites quantités d'énergie.
|
block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Nécessite de petites quantités d'énergie.
|
||||||
block.plastanium-compressor.description = Produit du plastanium à partir d'huile et de titane.
|
block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane.
|
||||||
block.phase-weaver.description = Produit du tissu phasé à partir de thorium et de grandes quantités de sable. Nécessite des quantités massives d'énergie pour fonctionner.
|
block.phase-weaver.description = Produit du tissu phasé à partir de thorium et de grandes quantités de sable. Nécessite des quantités massives d'énergie pour fonctionner.
|
||||||
block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicone et de cuivre.
|
block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicone et de cuivre.
|
||||||
block.cryofluidmixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable pour l'utilisation du réacteur au thorium.
|
block.cryofluidmixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable pour l'utilisation du réacteur au thorium.
|
||||||
block.blast-mixer.description = Écrase et mélange les amas de spores avec de la pyratite pour produire un mélange explosif.
|
block.blast-mixer.description = Écrase et mélange les amas de spores avec de la pyratite pour produire un mélange explosif.
|
||||||
block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable.
|
block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable.
|
||||||
block.melter.description = Fait fondre la ferraille en scories pour un traitement ultérieur ou une utilisation dans des tourelles Vague.
|
block.melter.description = Fait fondre la ferraille en scories pour un traitement ultérieur ou une utilisation dans des tourelles Vague.
|
||||||
block.separator.description = Expose la pierre à de l'eau sous pression afin d'obtenir différents minéraux contenus dans la pierre.
|
block.separator.description = Expose la scorie à de l'eau sous pression afin d'obtenir différents minéraux qu'elle contient.
|
||||||
block.spore-press.description = Compresses spore pods into oil.
|
block.spore-press.description = Compresse les glandes de spore sous une pression extrême pour synthétiser du pétrole.
|
||||||
block.pulverizer.description = Écrase la pierre pour en faire du sable. Utile quand il y a un manque de sable naturel.
|
block.pulverizer.description = Écrase la ferraille pour en faire du sable. Utile quand il y a un manque de sable naturel.
|
||||||
block.coal-centrifuge.description = Solidifes oil into chunks of coal.
|
block.coal-centrifuge.description = Solidifie le pétrole en blocs de charbon.
|
||||||
block.incinerator.description = Permet de se débarasser de n'importe quel objet ou liquide en exces .
|
block.incinerator.description = Permet de se débarrasser de n'importe quel objet ou liquide en excès.
|
||||||
block.power-void.description = Supprime toute l'énergie allant à l'intérieur. Bac à sable uniquement
|
block.power-void.description = Supprime toute l'énergie allant à l'intérieur. Bac à sable uniquement
|
||||||
block.power-source.description = Produit de l'énergie à l'infini. Bac à sable uniquement.
|
block.power-source.description = Produit de l'énergie à l'infini. Bac à sable uniquement.
|
||||||
block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement .
|
block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement .
|
||||||
block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur sans utiliser d'énergie. Bac à sable uniquement.
|
block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur sans utiliser d'énergie. Bac à sable uniquement.
|
||||||
block.liquid-source.description = Source de liquide infinie . Bac à sable uniquement.
|
block.liquid-source.description = Source de liquide infinie . Bac à sable uniquement.
|
||||||
block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.
|
block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.
|
||||||
block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.\nFait du 2 sur 2.
|
block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.\n2 x 2.
|
||||||
block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies.
|
block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis.
|
||||||
block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles.
|
block.titanium-wall-large.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis.\nCouvre plusieurs cases.
|
||||||
block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.
|
block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.
|
||||||
block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.\nFait du 2 sur 2.
|
block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.\nCouvre plusieurs cases.
|
||||||
block.phase-wall.description = Moins puissant qu'un mur en Thorium mais déviera les balles sauf si elles sont trop puissantes.
|
block.phase-wall.description = Moins puissant qu'un mur en Thorium mais déviera les balles sauf si elles sont trop puissantes.
|
||||||
block.phase-wall-large.description = Moins puissant qu'un mur en Thorium mais déviera les balles sauf si elles sont trop puissantes.\nFait du 2 sur 2.
|
block.phase-wall-large.description = Moins puissant qu'un mur en Thorium mais déviera les balles sauf si elles sont trop puissantes.\n2 x 2.
|
||||||
block.surge-wall.description = Le plus puissant bloc défensif .\nA une faible chance de créer des éclairs vers les ennemis .
|
block.surge-wall.description = Le plus puissant bloc défensif .\nA une faible chance de créer des éclairs vers les ennemis .
|
||||||
block.surge-wall-large.description = Le plus puissant bloc défensif .\nA une faible chance de créer des éclairs vers les ennemis .\nFait du 2 sur 2.
|
block.surge-wall-large.description = Le plus puissant bloc défensif .\nA une faible chance de créer des éclairs vers les ennemis .\n2 x 2.
|
||||||
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte les ennemis peuvent tirer et passer à travers.
|
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte les ennemis peuvent tirer et passer à travers.
|
||||||
block.door-large.description = Une large porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte les ennemis peuvent tirer et passer à travers.\nFait du 2 sur 2.
|
block.door-large.description = Une large porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte les ennemis peuvent tirer et passer à travers.\n2 x 2.
|
||||||
block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency.
|
block.mender.description = Soigne périodiquement les bâtiments autour de lui. Permet de garder les défenses en bon état entre les vagues ennemies.\nPeut utiliser de la Silice pour booster la portée et l'efficacié.
|
||||||
block.mend-projector.description = Soigne périodiquement les batiments autour de lui.
|
block.mend-projector.description = Une version améliorée du Réparateur. Soigne périodiquement les bâtiments autour de lui.\nPeut utiliser du tissu phasé pour booster la portée et l'efficacié.
|
||||||
block.overdrive-projector.description = Accélère les batiments autour de lui, notamment les foreuses et les convoyeurs.
|
block.overdrive-projector.description = Accélère les bâtiments autour de lui, notamment les foreuses et les convoyeurs.\nPeut utiliser du tissu phasé pour booster la portée et l'efficacié.
|
||||||
block.force-projector.description = Crée un champ de force hexagonal autour de lui qui protège les batiments et les unités à l'intérieur de prendre des dégâts à cause des balles.
|
block.force-projector.description = Crée un champ de force hexagonal autour de lui qui protège les bâtiments et les unités à l'intérieur des dégâts.\nSurchauffe si trop de dégâts sont reçus. Peut utiliser du liquide réfrigérant pour éviter la surchauffe. Peut utiliser du tissu phasé pour booster la taille du bouclier.
|
||||||
block.shock-mine.description = Blesse les ennemis qui marchent dessus. Quasiment invisble pour l'ennemi.
|
block.shock-mine.description = Blesse les ennemis qui marchent dessus. Quasiment invisible pour l'ennemi.
|
||||||
block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les batiments. Peut être tourné.
|
block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné.
|
||||||
block.titanium-conveyor.description = Convoyeur avancé . Déplace les objets plus rapidement que les convoyeurs standards.
|
block.titanium-conveyor.description = Convoyeur avancé . Déplace les objets plus rapidement que les convoyeurs standards.
|
||||||
block.junction.description = Agit comme un pont pour deux ligne de convoyeurs se croisant. Utile lorsque deux différents convoyeurs déplacent différents matériaux à différents endroits.
|
block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux différents convoyeurs déplacent différents matériaux à différents endroits.
|
||||||
block.bridge-conveyor.description = bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou batiment.
|
block.bridge-conveyor.description = bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou bâtiment.
|
||||||
block.phase-conveyor.description = convoyeur très avancé . Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance .
|
block.phase-conveyor.description = convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance .
|
||||||
block.sorter.description = Trie les articles. Si un article rcorrespond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite.
|
block.sorter.description = Trie les articles. Si un article correspond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite.
|
||||||
block.router.description = Accepte les objets depuis une ou plus directions et le renvoie dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs.[accent]Le seul et l'Unique[]
|
block.router.description = Accepte les objets depuis une ou plus directions et le renvoie dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs.[accent]Le seul et l'Unique[]
|
||||||
block.distributor.description = Un routeur avancé qui sépare les objets jusqu'à 7 autres directions équitablement.
|
block.distributor.description = Un routeur avancé qui sépare les objets jusqu'à 7 autres directions équitablement.
|
||||||
block.overflow-gate.description = C'est la combinaison entre un Routeur et un Diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué.
|
block.overflow-gate.description = C'est la combinaison entre un Routeur et un Diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué.
|
||||||
block.mass-driver.description = Batiment de transport d'objet [accent]ultime[]. Collecte un grand nombre d'objets puis les tire à un autre transporteur de masse sur une très longue distance.
|
block.mass-driver.description = bâtiment de transport d'objet [accent]ultime[]. Collecte un grand nombre d'objets puis les tire à un autre transporteur de masse sur une très longue distance.
|
||||||
block.mechanical-pump.description = Une pompe de faible prix pompant lentement, mais ne consomme pas d'énergie.
|
block.mechanical-pump.description = Une pompe de faible prix pompant lentement, mais ne consomme pas d'énergie.
|
||||||
block.rotary-pump.description = Une pompe avancée qui double sa vitesse en utilisant de l'énergie.
|
block.rotary-pump.description = Une pompe avancée plus rapide mais utilisant de l'énergie.
|
||||||
block.thermal-pump.description = La pompe ultime. Trois fois plus rapide qu'une pompe mécanique et la seule pompe capable de récupérer de la lave.
|
block.thermal-pump.description = La pompe ultime. Beaucoup plus rapide qu'une pompe mécanique et la seule pompe capable de récupérer de la lave.
|
||||||
block.conduit.description = Tuyau basique permettant le transport de liquide . Marche comme un convoyeur mais avec les liquides. Utile si utilisé avec des extracteurs, des pompes ou d'autres conduits.
|
block.conduit.description = Tuyau basique permettant le transport de liquide . Marche comme un convoyeur mais avec les liquides. Utile si utilisé avec des extracteurs, des pompes ou d'autres conduits.
|
||||||
block.pulse-conduit.description = Tuyau avancé permettant le transport de liquide . Transporte les liquides plus rapidement et en stocke plus que les tuyaux standards.
|
block.pulse-conduit.description = Tuyau avancé permettant le transport de liquide . Transporte les liquides plus rapidement et en stocke plus que les tuyaux standards.
|
||||||
block.liquid-router.description = Accepte les liquide en une direction et les rejete de tout les côtés équitablement. Peut aussi stocker une certaine quantité de liquide. Utile pour envoyer un liquide à plusieurs endroits.
|
block.liquid-router.description = Accepte les liquides en une direction et les rejette de tous les côtés équitablement. Peut aussi stocker une certaine quantité de liquide. Utile pour envoyer un liquide à plusieurs endroits.
|
||||||
block.liquid-tank.description = Stocke une grande quantité de liquides . Utile pour réguler la sortie quand la demande est inconstante ou comme sécurité pour refroidir des batiments important.
|
block.liquid-tank.description = Stocke une grande quantité de liquides . Utile pour réguler la sortie quand la demande est inconstante ou comme sécurité pour refroidir des bâtiments important.
|
||||||
block.liquid-junction.description = Agit comme une intersection pour deux conduits se croisant.Utile si deux conduits amènent différents liquides à différents endroits.
|
block.liquid-junction.description = Agit comme une intersection pour deux conduits se croisant.Utile si deux conduits amènent différents liquides à différents endroits.
|
||||||
block.bridge-conduit.description = Bloc de transport de liquide avancé. Permet le transport de liquides jusqu'à 3 blocs de n'importe quel terrain ou batiment .
|
block.bridge-conduit.description = Bloc de transport de liquide avancé. Permet le transport de liquides jusqu'à 3 blocs de n'importe quel terrain ou bâtiment .
|
||||||
block.phase-conduit.description = Tuyau très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre tuyau phasé sur une longue distance.
|
block.phase-conduit.description = Tuyau très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre tuyau phasé sur une longue distance.
|
||||||
block.power-node.description = Transmet l'énergie aux transmetteurs énergétiques connectés . Jusqu'à quatre sources d'énergie, consommateurs ou transmetteurs peuvent être connectés. Le transmetteur recevra de l'énergie ou le transmettra à n'importe quel batiment adjacent.
|
block.power-node.description = Transmet l'énergie aux transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent.
|
||||||
block.power-node-large.description = Possède un rayon plus grand que le transmetteur énergétique standard et jusqu'à six sources d'énergie, consommateurs ou transmetteurs peuvent être connectés.
|
block.power-node-large.description = Possède un rayon plus grand que le transmetteur énergétique standard, connectant d'autant plus de consommateurs ou transmetteurs d'énergie.
|
||||||
block.surge-tower.description = An extremely long-range power node with fewer available connections.
|
block.surge-tower.description = Un transmetteur énergétique de très grande portée mais avec moins de connections disponibles.
|
||||||
block.battery.description = Stocke l'énergie quand elle est en abondance et le distribue si il y a trop peu d'énergie tant qu'il lui reste de l'énergie.
|
block.battery.description = Stocke l'énergie quand elle est en abondance et la redistribue si il y a un deficit d'énergie dans la limite des réserves disponibles.
|
||||||
block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale.
|
block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale.
|
||||||
block.combustion-generator.description = Génère de l'énergie en brûlant du pétrole ou des matériaux inflammables.
|
block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou des matériaux inflammables.
|
||||||
block.thermal-generator.description = Génère une grande quantité d'énergie à partir de lave .
|
block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zone de chaleur .
|
||||||
block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau .
|
block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau .
|
||||||
block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite.
|
block.differential-generator.description = Génère de grande quantité d'energie. Utilise différence de temperature entre le liquide cryogénique et la pyratite brûlante.
|
||||||
block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium.
|
block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium.
|
||||||
block.solar-panel.description = Génère une faible quantité d'énergie .
|
block.solar-panel.description = Génère une faible quantité d'énergie grace au rayons du soleil.
|
||||||
block.solar-panel-large.description = Génère bien plus d'énergie qu'un panneau solaire standard, Mais est aussi bien plus cher à construire.
|
block.solar-panel-large.description = Génère bien plus d'énergie qu'un panneau solaire standard, mais est aussi bien plus cher à construire.
|
||||||
block.thorium-reactor.description = Génère énormément d'énergie à l'aide de la radioactivité du thorium. Requiert néanmoins un refroidissement constant. Explosera violemment en cas de surchauffe.
|
block.thorium-reactor.description = Génère énormément d'énergie à l'aide de la radioactivité du thorium. Requiert néanmoins un refroidissement constant. Explosera violemment en cas de surchauffe.
|
||||||
block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process.
|
block.impact-reactor.description = Un générateur avancé, capable de produire une quantité d'énergie gigantesque lorsqu'il atteint son efficacité maximale. Nécessite une quantité significative d'énergie pour lancer le générateur.
|
||||||
block.mechanical-drill.description = Une foreuse de faible coût. Si elle est placée sur à un endroit approprié, produit des matériaux lentement à l'infini.
|
block.mechanical-drill.description = Une foreuse de faible coût. Si elle est placée sur à un endroit approprié, produit des matériaux lentement à l'infini.
|
||||||
block.pneumatic-drill.description = Une foreuse amélioré plus rapide et capable de forer des matériaux plus dur grâce à l'usage de vérins à air comprimé.
|
block.pneumatic-drill.description = Une foreuse améliorée plus rapide et capable de forer des matériaux plus dur comme le titane grâce à l'usage de vérins à air comprimé.
|
||||||
block.laser-drill.description = Permet de forer bien plus vite grâce à la technologie laser, cela demande néanmoins de l'énergie . Additionnellement, le thorium, un matériau radioactif, peut-être récupéré avec cette foreuse.
|
block.laser-drill.description = Permet de forer bien plus vite grâce à la technologie laser, mais requiert de l'énergie . Permet de miner le Thorium, un matériau radioactif.
|
||||||
block.blast-drill.description = La Foreuse ultime . Demande une grande quantité d'énergie .
|
block.blast-drill.description = La Foreuse ultime . Demande une grande quantité d'énergie.
|
||||||
block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'eau à proximité.
|
block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'eau à proximité.
|
||||||
block.cultivator.description = Cultive le sol avec de l'eau afin d'obtenir de la biomasse.
|
block.cultivator.description = Cultive le sol avec de l'eau afin d'obtenir de la biomasse.
|
||||||
block.oil-extractor.description = Utilise une grande quantité d'énergie afin d'extraire du pétrole du sable . Utile quand il n'y a pas de lacs de pétrole à proximité.
|
block.oil-extractor.description = Utilise une grande quantité d'énergie afin d'extraire du pétrole du sable . Utile quand il n'y a pas de lacs de pétrole à proximité.
|
||||||
block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen.
|
block.core-shard.description = La première version du noyau. Une fois détruite tout contact avec la région est perdu. Ne laissez pas cela se produire.
|
||||||
block.core-foundation.description = La deuxième version du noyau. Meilleur blindage. Stocke plus de ressources.
|
block.core-foundation.description = La deuxième version du noyau. Meilleur blindage. Stocke plus de ressources.
|
||||||
block.core-nucleus.description = La troisième et dernière iteraction de la capsule centrale. Extrêmement bien blindée. Stocke des quantités massive de ressources.
|
block.core-nucleus.description = La troisième et dernière iteration du noyau. Extrêmement bien blindée. Stocke des quantités importante de ressources.
|
||||||
block.vault.description = Stocke un grand nombre d'objets. Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le coffre-fort.
|
block.vault.description = Stocke un grand nombre d'objets. Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le coffre-fort.
|
||||||
block.container.description = Stocke un petit nombre d'objet . Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le conteneur.
|
block.container.description = Stocke un petit nombre d'objet. Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le conteneur.
|
||||||
block.unloader.description = Décharge des objets depuis des conteneurs, coffres-forts ou de la base sur un convoyeur ou directement dans un bloc adjacent . Le type d'objet peut être changé en appuyant sur le déchargeur.
|
block.unloader.description = Décharge des objets depuis des conteneurs, coffres-forts ou de la base sur un convoyeur ou directement dans un bloc adjacent. Le type d'objet peut être changé en appuyant sur le déchargeur.
|
||||||
block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished.
|
block.launch-pad.description = Permet de transférer des ressources sans attendre le lancement du noyau.
|
||||||
block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently.
|
block.launch-pad-large.description = Une version améliorée de la plateforme de lancement. Stocke plus de ressources et les envoies plus fréquemment.
|
||||||
block.duo.description = Une petite tourelle avec un coût faible.
|
block.duo.description = Une petite tourelle avec un coût faible.
|
||||||
block.scatter.description = Une tourrelle anti-aérien de taille moyenne. Sprays clumps of lead or scrap flak at enemy units.
|
block.scatter.description = Une tourelle anti-aérien de taille moyenne. Asperge les ennemis de débris de plomb ou de ferraille.
|
||||||
block.scorch.description = Brûle les ennemis au sol proche de lui. Très efficace a courte portée.
|
block.scorch.description = Brûle les ennemis au sol proche de lui. Très efficace a courte portée.
|
||||||
block.hail.description = Une petite tourelle d'artillerie.
|
block.hail.description = Une petite tourelle d'artillerie.
|
||||||
block.wave.description = Une tourelle de taille moyenne tirant rapidement des bulles de liquide.
|
block.wave.description = Une tourelle de taille moyenne tirant rapidement des bulles de liquide. Peut éteindre les incendies à portée si de l'eau est disponible.
|
||||||
block.lancer.description = Une tourelle de taille moyenne tirant des rayons chargés en électricité.
|
block.lancer.description = Une tourelle de taille moyenne tirant des rayons chargés en électricité.
|
||||||
block.arc.description = Une petite tourelle tirant des arcs électrques vers les ennemis.
|
block.arc.description = Une petite tourelle tirant des arcs électriques vers les ennemis.
|
||||||
block.swarmer.description = Une tourelle de taille moyenne qui tire des missiles qui se dispersent.
|
block.swarmer.description = Une tourelle de taille moyenne attaquant les ennemis terrestres et aériens à l'aide de missiles autoguidés.
|
||||||
block.salvo.description = Une tourelle de taille moyenne qui tire par salves.
|
block.salvo.description = Une tourelle de taille moyenne qui tire par salves.
|
||||||
block.fuse.description = Une grande tourelle qui tire de puissants rayons lasers avec une faible portée.
|
block.fuse.description = Une grande tourelle qui tire de puissants rayons lasers avec une faible portée.
|
||||||
block.ripple.description = Une grande tourelle d'artillerie qui tire plusieurs tirs simultanément.
|
block.ripple.description = Une grande tourelle d'artillerie qui tire plusieurs tirs simultanément.
|
||||||
block.cyclone.description = Une grande tourelle tirant rapidement ... très rapidement.
|
block.cyclone.description = Une grande tourelle tirant rapidement... très rapidement.
|
||||||
block.spectre.description = Une grande tourelle qui tire deux puissantes balles simultanément.
|
block.spectre.description = Une grande tourelle qui tire deux puissantes balles perce-blindage simultanément.
|
||||||
block.meltdown.description = Une grande tourelle tirant de puissants rayons lasers avec une grande portée.
|
block.meltdown.description = Une grande tourelle tirant de puissants rayons lasers avec une grande portée.
|
||||||
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
block.command-center.description = Permet de donner des ordres aux unités alliées sur la carte.\nIndique aux unités de se rallier, d'attaquer un noyau ennemi ou de battre en retraite vers le noyau/l'usine. En l'absence de noyau adverse, les unités patrouilleront par défaut autour de la commande d'attaque.
|
||||||
block.draug-factory.description = Produit des drones Draug mineurs.
|
block.draug-factory.description = Produit des drones Draug mineurs.
|
||||||
block.spirit-factory.description = Produit des petits drones qui réparent les batiments et minent des matériaux.
|
block.spirit-factory.description = Produit des petits drones qui réparent les bâtiments et minent des matériaux.
|
||||||
block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels.
|
block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels.
|
||||||
block.wraith-factory.description = Produit des intercepteurs rapides qui harcèlent l'ennemi.
|
block.wraith-factory.description = Produit des intercepteurs rapides qui harcèlent l'ennemi.
|
||||||
block.ghoul-factory.description = Produit des bombardiers lourds.
|
block.ghoul-factory.description = Produit des bombardiers lourds.
|
||||||
block.revenant-factory.description = Produit des unités terrestres lourdes avec des lasers.
|
block.revenant-factory.description = Produit des unités terrestres lourdes avec des lasers.
|
||||||
block.dagger-factory.description = Produit des unités terrestres basiques.
|
block.dagger-factory.description = Produit des unités terrestres basiques.
|
||||||
block.crawler-factory.description = Produit des unités d'essaims autodestructeurs rapides.
|
block.crawler-factory.description = Produit des unités d'essaims autodestructeurs rapides.
|
||||||
block.titan-factory.description = Produit des unités terrestres avancées et cuirassées.
|
block.titan-factory.description = Produit des unités terrestres avancées et cuirassées.
|
||||||
block.fortress-factory.description = Produit des unités terrestres d'artillerie lourde .
|
block.fortress-factory.description = Produit des unités terrestres d'artillerie lourde.
|
||||||
block.repair-point.description = Soigne en continu l'unité blessée la plus proche tant qu'elle est à sa portée.
|
block.repair-point.description = Soigne en continu l'unité blessée la plus proche tant qu'elle est à sa portée.
|
||||||
block.dart-mech-pad.description = Fournit la transformation en un mécha d'attaque de base .\nUse by tapping while standing on it.
|
block.dart-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha d'attaque de base .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
||||||
block.delta-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha rapide mais peu résistant fait pour les stratégies de harcèlement.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
block.delta-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha rapide mais peu résistant fait pour les stratégies de harcèlement.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
||||||
block.tau-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha de support qui peut soigner les batiments et unités alliées.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
block.tau-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha de support qui peut soigner les bâtiments et unités alliées.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
||||||
block.omega-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha cuirassé et large, fait pour les assauts frontaux .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
block.omega-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha cuirassé et large, fait pour les assauts frontaux .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
||||||
block.javelin-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un intercepteur rapide et puissant avec des armes électriques.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
block.javelin-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un intercepteur rapide et puissant avec des armes électriques.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
||||||
block.trident-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un bombardier lourd raisonnablement cuirassé .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
block.trident-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un bombardier lourd raisonnablement cuirassé .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus.
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Plein écran
|
|||||||
setting.borderlesswindow.name = Fenêtre sans bordure[LIGHT_GRAY] (peut nécessiter un redémarrage)
|
setting.borderlesswindow.name = Fenêtre sans bordure[LIGHT_GRAY] (peut nécessiter un redémarrage)
|
||||||
setting.fps.name = Afficher FPS
|
setting.fps.name = Afficher FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Afficher les rayons des lasers
|
|
||||||
setting.pixelate.name = Pixélisé [LIGHT_GRAY](peut diminuer les performances)[]
|
setting.pixelate.name = Pixélisé [LIGHT_GRAY](peut diminuer les performances)[]
|
||||||
setting.minimap.name = Montrer la minimap
|
setting.minimap.name = Montrer la minimap
|
||||||
setting.musicvol.name = Volume de la musique
|
setting.musicvol.name = Volume de la musique
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Envoyer des rapports d'incident anonymement.
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Opacité du tchat
|
setting.chatopacity.name = Opacité du tchat
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Afficher le tchat en jeu
|
setting.playerchat.name = Afficher le tchat en jeu
|
||||||
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages...
|
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages...
|
||||||
uiscale.cancel = Annuler et quitter
|
uiscale.cancel = Annuler et quitter
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Layar Penuh
|
|||||||
setting.borderlesswindow.name = Jendela tak Berbatas[LIGHT_GRAY] (bisa membutuhkan restart)
|
setting.borderlesswindow.name = Jendela tak Berbatas[LIGHT_GRAY] (bisa membutuhkan restart)
|
||||||
setting.fps.name = Tunjukkan FPS
|
setting.fps.name = Tunjukkan FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Tunjukkan Laser
|
|
||||||
setting.pixelate.name = Mode Pixel[LIGHT_GRAY] (menonaktifkan animasi)
|
setting.pixelate.name = Mode Pixel[LIGHT_GRAY] (menonaktifkan animasi)
|
||||||
setting.minimap.name = Tunjukkan Peta kecil
|
setting.minimap.name = Tunjukkan Peta kecil
|
||||||
setting.musicvol.name = Volume Musik
|
setting.musicvol.name = Volume Musik
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Laporkan Masalah
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Jelas-Beningnya Chat
|
setting.chatopacity.name = Jelas-Beningnya Chat
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Tunjukkan Chat dalam Permainan
|
setting.playerchat.name = Tunjukkan Chat dalam Permainan
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](Nel caso non te ne sia accorto, la traduzione del gioco non è completa.\n Chi di dovere sta lavorando più velocemente possibile per completarla! Un aiutino non sarebbe male!)
|
credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
||||||
credits = Crediti
|
credits = Crediti
|
||||||
contributors = Traduttori e Contributori
|
contributors = Traduttori e Contributori
|
||||||
discord = Entra nel server discord di mindustry!
|
discord = Entra nel server discord di mindustry!
|
||||||
@@ -10,7 +10,7 @@ link.trello.description = Scheda ufficiale trello per funzionalità pianificate
|
|||||||
link.itch.io.description = pagina di itch.io con download per PC e versione web
|
link.itch.io.description = pagina di itch.io con download per PC e versione web
|
||||||
link.google-play.description = Elenco di Google Play Store
|
link.google-play.description = Elenco di Google Play Store
|
||||||
link.wiki.description = wiki ufficiale di Mindustry
|
link.wiki.description = wiki ufficiale di Mindustry
|
||||||
linkfail = Impossibile aprire il link! L'URL è stato copiato nella tua bacheca.
|
linkfail = Impossibile aprire il link! L'URL è stato copiato.
|
||||||
screenshot = Screenshot salvato a {0}
|
screenshot = Screenshot salvato a {0}
|
||||||
screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera.
|
screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera.
|
||||||
gameover = Il nucleo è stato distrutto.
|
gameover = Il nucleo è stato distrutto.
|
||||||
@@ -25,7 +25,7 @@ stat.wave = Ondate sconfitte:[accent] {0}
|
|||||||
stat.enemiesDestroyed = Nemici distrutti:[accent] {0}
|
stat.enemiesDestroyed = Nemici distrutti:[accent] {0}
|
||||||
stat.built = Costruzioni erette:[accent] {0}
|
stat.built = Costruzioni erette:[accent] {0}
|
||||||
stat.destroyed = Costruzioni distrutte:[accent] {0}
|
stat.destroyed = Costruzioni distrutte:[accent] {0}
|
||||||
stat.deconstructed = Costruzioni smontate:[accent] {0}
|
stat.deconstructed = Costruzioni smantellate:[accent] {0}
|
||||||
stat.delivered = Riorse lanciate:
|
stat.delivered = Riorse lanciate:
|
||||||
stat.rank = Livello finale: [accent]{0}
|
stat.rank = Livello finale: [accent]{0}
|
||||||
launcheditems = [accent]Oggetti lanciati
|
launcheditems = [accent]Oggetti lanciati
|
||||||
@@ -48,18 +48,18 @@ minimap = Minimappa
|
|||||||
close = Chiuso
|
close = Chiuso
|
||||||
website = Website
|
website = Website
|
||||||
quit = Esci
|
quit = Esci
|
||||||
save.quit = Save & Quit
|
save.quit = Salva ed esci
|
||||||
maps = Mappe
|
maps = Mappe
|
||||||
maps.browse = Browse Maps
|
maps.browse = Consulta Mappe
|
||||||
continue = Continua
|
continue = Continua
|
||||||
maps.none = [LIGHT_GRAY]Nessuna mappa trovata!
|
maps.none = [LIGHT_GRAY]Nessuna mappa trovata!
|
||||||
invalid = Invalid
|
invalid = Invalido
|
||||||
preparingconfig = Preparing Config
|
preparingconfig = Preparo la configurazione
|
||||||
preparingcontent = Preparing Content
|
preparingcontent = Preparo il contenuto
|
||||||
uploadingcontent = Uploading Content
|
uploadingcontent = Carico il contenuto
|
||||||
uploadingpreviewfile = Uploading Preview File
|
uploadingpreviewfile = Carico file di anteprima
|
||||||
committingchanges = Comitting Changes
|
committingchanges = Applico le modifiche
|
||||||
done = Done
|
done = Fatto
|
||||||
about.button = Info
|
about.button = Info
|
||||||
name = Nome:
|
name = Nome:
|
||||||
noname = Scegli un [accent] nome[] prima di unirti.
|
noname = Scegli un [accent] nome[] prima di unirti.
|
||||||
@@ -74,31 +74,31 @@ players = {0} giocatori online
|
|||||||
players.single = {0} giocatori online
|
players.single = {0} giocatori online
|
||||||
server.closing = [accent]Chiusura server ...
|
server.closing = [accent]Chiusura server ...
|
||||||
server.kicked.kick = Sei stato cacciato dal server!
|
server.kicked.kick = Sei stato cacciato dal server!
|
||||||
server.kicked.whitelist = You are not whitelisted here.
|
server.kicked.whitelist = Non sei presente in questa whitelist.
|
||||||
server.kicked.serverClose = Server chiuso.
|
server.kicked.serverClose = Server chiuso.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Buona giornata.
|
||||||
server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco!
|
server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco!
|
||||||
server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare!
|
server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare!
|
||||||
server.kicked.banned = Sei bannato da questo server.
|
server.kicked.banned = Sei bannato da questo server.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = Questo server non è comparibile con la tua build.
|
||||||
server.kicked.playerLimit = This server is full. Wait for an empty slot.
|
server.kicked.playerLimit = Questo server è pieno. Attendi che si liberi un posto.
|
||||||
server.kicked.recentKick = Sei stato cacciato di recente.\nAspetta prima di riconnetterti.
|
server.kicked.recentKick = Sei stato cacciato di recente.\nAspetta prima di riconnetterti.
|
||||||
server.kicked.nameInUse = C'è già qualcuno con il tuo nome\nsu questo server.
|
server.kicked.nameInUse = C'è già qualcuno con il tuo nome su questo server.
|
||||||
server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere.
|
server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere.
|
||||||
server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account.
|
server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account.
|
||||||
server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito.
|
server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Game over!
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
||||||
host.info = Il pulsante [accent]hos [] ospita un server sulle porte [scarlet]6567[] e [scarlet]656.[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il proprio server nel proprio elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall.
|
host.info = Il pulsante [accent]host [] ospita un server sulla porte [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il proprio server nel proprio elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall.
|
||||||
join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\n Sono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco di server globali automatici; se si desidera connettersi a qualcuno tramite IP, è necessario chiedere all'host il proprio IP.
|
join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\n Sono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco di server globali automatici; se si desidera connettersi a qualcuno tramite IP, è necessario chiedere all'host il proprio IP.
|
||||||
hostserver = Host Server
|
hostserver = Ospita Server
|
||||||
invitefriends = Invite Friends
|
invitefriends = Invita amici
|
||||||
hostserver.mobile = Host\nServer
|
hostserver.mobile = Ospita\nServer
|
||||||
host = Host
|
host = Host
|
||||||
hosting = [accent] Apertura del server ...
|
hosting = [accent] Apertura del server ...
|
||||||
hosts.refresh = Aggiorna
|
hosts.refresh = Aggiorna
|
||||||
hosts.discovering = Ricerca partite LAN
|
hosts.discovering = Ricerca partite LAN
|
||||||
hosts.discovering.any = Discovering games
|
hosts.discovering.any = Ricerca partite
|
||||||
server.refreshing = Aggiornamento del server
|
server.refreshing = Aggiornamento del server
|
||||||
hosts.none = [lightgray]Nessuna partita LAN trovata!
|
hosts.none = [lightgray]Nessuna partita LAN trovata!
|
||||||
host.invalid = [scarlet]Impossibile connettersi all'host.
|
host.invalid = [scarlet]Impossibile connettersi all'host.
|
||||||
@@ -122,7 +122,7 @@ server.version = [lightgray]Versione: {0}
|
|||||||
server.custombuild = [yellow] Costruzione personalizzata
|
server.custombuild = [yellow] Costruzione personalizzata
|
||||||
confirmban = Sei sicuro di voler bandire questo giocatore?
|
confirmban = Sei sicuro di voler bandire questo giocatore?
|
||||||
confirmkick = Sei sicuro di voler espellere questo giocatore?
|
confirmkick = Sei sicuro di voler espellere questo giocatore?
|
||||||
confirmvotekick = Are you sure you want to vote-kick this player?
|
confirmvotekick = Sei sicuro di voler votare per l'espulsione di questo giocatore?
|
||||||
confirmunban = Sei sicuro di voler riammettere questo giocatore?
|
confirmunban = Sei sicuro di voler riammettere questo giocatore?
|
||||||
confirmadmin = Sei sicuro di voler rendere questo giocatore un amministratore?
|
confirmadmin = Sei sicuro di voler rendere questo giocatore un amministratore?
|
||||||
confirmunadmin = Sei sicuro di voler rimuovere lo stato di amministratore da questo giocatore?
|
confirmunadmin = Sei sicuro di voler rimuovere lo stato di amministratore da questo giocatore?
|
||||||
@@ -133,7 +133,7 @@ disconnect.error = Connection error.
|
|||||||
disconnect.closed = Connection closed.
|
disconnect.closed = Connection closed.
|
||||||
disconnect.timeout = Timed out.
|
disconnect.timeout = Timed out.
|
||||||
disconnect.data = Il mondo non si vuole caricare, mi dispiace!
|
disconnect.data = Il mondo non si vuole caricare, mi dispiace!
|
||||||
cantconnect = Unable to join game ([accent]{0}[]).
|
cantconnect = Impossibile unirsi al server ([accent]{0}[]).
|
||||||
connecting = [accent]Connessione in corso ...
|
connecting = [accent]Connessione in corso ...
|
||||||
connecting.data = [accent]Caricamento dei dati del mondo ...
|
connecting.data = [accent]Caricamento dei dati del mondo ...
|
||||||
server.port = Porta:
|
server.port = Porta:
|
||||||
@@ -145,7 +145,7 @@ save.new = Nuovo Salvataggio
|
|||||||
save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio?
|
save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio?
|
||||||
overwrite = Sovrascrivi
|
overwrite = Sovrascrivi
|
||||||
save.none = Nessun salvataggio trovato!
|
save.none = Nessun salvataggio trovato!
|
||||||
saveload = [Accent]Salvataggio ...
|
saveload = [accent]Salvataggio ...
|
||||||
savefail = [crimson]Salvataggio del gioco NON riuscito!
|
savefail = [crimson]Salvataggio del gioco NON riuscito!
|
||||||
save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio?
|
save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio?
|
||||||
save.delete = Elimina
|
save.delete = Elimina
|
||||||
@@ -159,7 +159,7 @@ save.rename = Rinomina
|
|||||||
save.rename.text = Nuovo nome:
|
save.rename.text = Nuovo nome:
|
||||||
selectslot = Seleziona un salvataggio.
|
selectslot = Seleziona un salvataggio.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
editmessage = Edit Message
|
editmessage = Modifica messaggio
|
||||||
save.corrupted = [orang]Salvataggio corrotto o non valido!
|
save.corrupted = [orang]Salvataggio corrotto o non valido!
|
||||||
empty = <Vuoto>
|
empty = <Vuoto>
|
||||||
on = On
|
on = On
|
||||||
@@ -173,7 +173,7 @@ save.playtime = Tempo di gioco: {0}
|
|||||||
warning = Attenzione
|
warning = Attenzione
|
||||||
confirm = Conferma
|
confirm = Conferma
|
||||||
delete = Elimina
|
delete = Elimina
|
||||||
view.workshop = View In Workshop
|
view.workshop = Vedi nel Workshop
|
||||||
ok = OK
|
ok = OK
|
||||||
open = Apri
|
open = Apri
|
||||||
customize = Personalizza
|
customize = Personalizza
|
||||||
@@ -183,17 +183,17 @@ copylink = Copia link
|
|||||||
back = Indietro
|
back = Indietro
|
||||||
data.export = Esporta Salvataggio
|
data.export = Esporta Salvataggio
|
||||||
data.import = Importa Salvataggio
|
data.import = Importa Salvataggio
|
||||||
data.exported = Data exported.
|
data.exported = Dati esportati.
|
||||||
data.invalid = This isn't valid game data.
|
data.invalid = Questi non sono dati di gioco validi.
|
||||||
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
data.import.confirm = Importare dati di gioco esterni eliminerà[scarlet] tutti[] i tuoi progressi attuali.\n[accent]L'operazione è irreversibile![]\n\nUna volta importati i dati, il gioco si chiuderà immediatamente.
|
||||||
classic.export = Esporta dati classici
|
classic.export = Esporta dati classici
|
||||||
classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vorresti esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vorresti esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app?
|
||||||
quit.confirm = Sei sicuro di voler uscire?
|
quit.confirm = Sei sicuro di voler uscire?
|
||||||
quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Impostazioni->Gioco->Ripeti il tutorial.[]
|
quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Gioca > Tutorial.[]
|
||||||
loading = [accent]Caricamento in corso ...
|
loading = [accent]Caricamento in corso ...
|
||||||
saving = [accent]Salvando ...
|
saving = [accent]Salvando ...
|
||||||
wave = [accent]Ondata {0}
|
wave = [accent]Ondata {0}
|
||||||
wave.waiting = Ondata tra {0}
|
wave.waiting = [LIGHT_GRAY]Ondata tra {0}
|
||||||
wave.waveInProgress = [LIGHT_GRAY]Ondata in corso...
|
wave.waveInProgress = [LIGHT_GRAY]Ondata in corso...
|
||||||
waiting = In attesa...
|
waiting = In attesa...
|
||||||
waiting.players = Aspettando giocatori...
|
waiting.players = Aspettando giocatori...
|
||||||
@@ -210,11 +210,11 @@ map.nospawn = Questa mappa non possiede un nucleo in cui spawnare! Aggiungine un
|
|||||||
map.nospawn.pvp = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare.
|
map.nospawn.pvp = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare.
|
||||||
map.nospawn.attack = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare.
|
map.nospawn.attack = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare.
|
||||||
map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido.
|
map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido.
|
||||||
map.publish.error = Error publishing map: {0}
|
map.publish.error = Errore durante la pubblicazione della mappa:\n{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 = Vuoi pubblicare questa mappa?\n\n[lightgray]Assicurati di aver accettato il Workshop EULA, o le tue mappe non saranno visibili!
|
||||||
eula = Steam EULA
|
eula = Steam EULA
|
||||||
map.publish = Map published.
|
map.publish = Mappa pubblicata.
|
||||||
map.publishing = [accent]Publishing map...
|
map.publishing = [accent]Pubblico la mappa...
|
||||||
editor.brush = Pennello
|
editor.brush = Pennello
|
||||||
editor.openin = Apri nell'editor
|
editor.openin = Apri nell'editor
|
||||||
editor.oregen = Generazione dei minerali
|
editor.oregen = Generazione dei minerali
|
||||||
@@ -222,12 +222,12 @@ editor.oregen.info = Generazione dei minerali:
|
|||||||
editor.mapinfo = Informazioni mappa
|
editor.mapinfo = Informazioni mappa
|
||||||
editor.author = Autore:
|
editor.author = Autore:
|
||||||
editor.description = Descrizione:
|
editor.description = Descrizione:
|
||||||
editor.nodescription = A map must have a description of at least 4 characters before being published.
|
editor.nodescription = Una mappa deve avere una descrizione di almeno 4 caratteri per poter essere pubblicata.
|
||||||
editor.waves = Ondate:
|
editor.waves = Ondate:
|
||||||
editor.rules = Regole:
|
editor.rules = Regole:
|
||||||
editor.generation = Generazione:
|
editor.generation = Generazione:
|
||||||
editor.ingame = Modifica in gioco
|
editor.ingame = Modifica in gioco
|
||||||
editor.publish.workshop = Publish On Workshop
|
editor.publish.workshop = Pubblica sul Workshop
|
||||||
editor.newmap = Nuova mappa
|
editor.newmap = Nuova mappa
|
||||||
workshop = Workshop
|
workshop = Workshop
|
||||||
waves.title = Ondate
|
waves.title = Ondate
|
||||||
@@ -246,7 +246,7 @@ waves.invalid = Onde dagli appunti non valide.
|
|||||||
waves.copied = Onde copiate.
|
waves.copied = Onde copiate.
|
||||||
waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita.
|
waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita.
|
||||||
editor.default = [LIGHT_GRAY]<Predefinito>
|
editor.default = [LIGHT_GRAY]<Predefinito>
|
||||||
details = Details...
|
details = Dettagli...
|
||||||
edit = Modifica...
|
edit = Modifica...
|
||||||
editor.name = Nome:
|
editor.name = Nome:
|
||||||
editor.spawn = Piazza un'unità
|
editor.spawn = Piazza un'unità
|
||||||
@@ -256,7 +256,7 @@ editor.errorload = Errore nel caricamento di:\n[accent]{0}
|
|||||||
editor.errorsave = Errore nel salvataggio di:\n[accent]{0}
|
editor.errorsave = Errore nel salvataggio di:\n[accent]{0}
|
||||||
editor.errorimage = Quella è un'immagine, non una mappa. Non cambiare estensioni sperando che funzioni.\n\n Se vuoi importare una mappa vecchia clicca su "importa una mappa vecchia" nell'editor.
|
editor.errorimage = Quella è un'immagine, non una mappa. Non cambiare estensioni sperando che funzioni.\n\n Se vuoi importare una mappa vecchia clicca su "importa una mappa vecchia" nell'editor.
|
||||||
editor.errorlegacy = La mappa è troppo vecchia ed usa un formato che non è più supportato.
|
editor.errorlegacy = La mappa è troppo vecchia ed usa un formato che non è più supportato.
|
||||||
editor.errornot = This is not a map file.
|
editor.errornot = Questo file non è una mappa.
|
||||||
editor.errorheader = Questo file della mappa è invalido o corrotto.
|
editor.errorheader = Questo file della mappa è invalido o corrotto.
|
||||||
editor.errorname = Questa mappa è senza nome.
|
editor.errorname = Questa mappa è senza nome.
|
||||||
editor.update = Aggiorna
|
editor.update = Aggiorna
|
||||||
@@ -280,16 +280,16 @@ editor.importimage.description = Importa immagine esterna terreno
|
|||||||
editor.export = Esportazione...
|
editor.export = Esportazione...
|
||||||
editor.exportfile = Esporta file
|
editor.exportfile = Esporta file
|
||||||
editor.exportfile.description = Esporta file mappa
|
editor.exportfile.description = Esporta file mappa
|
||||||
editor.exportimage = Esporta immagine terreno
|
editor.exportimage = Esporta immagine
|
||||||
editor.exportimage.description = Esporta file immagine mappa
|
editor.exportimage.description = Esporta file immagine mappa
|
||||||
editor.loadimage = Carica\nimmagine
|
editor.loadimage = Carica\nimmagine
|
||||||
editor.saveimage = Salva\nImmagine
|
editor.saveimage = Salva\nImmagine
|
||||||
editor.unsaved = [scarlet]Hai modifiche non salvate![]\nSei sicuro di voler uscire?
|
editor.unsaved = [scarlet]Hai modifiche non salvate![]\nSei sicuro di voler uscire?
|
||||||
editor.resizemap = Ridimensiona la mappa
|
editor.resizemap = Ridimensiona la mappa
|
||||||
editor.mapname = Nome Mappa:
|
editor.mapname = Nome Mappa:
|
||||||
editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente.
|
editor.overwrite = [accent]Attenzione!\nQuesto sovrascrive una mappa esistente.
|
||||||
editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
|
editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
|
||||||
editor.exists = A map with this name already exists.
|
editor.exists = Esiste già una mappa con questo nome.
|
||||||
editor.selectmap = Seleziona una mappa da caricare:
|
editor.selectmap = Seleziona una mappa da caricare:
|
||||||
toolmode.replace = Rimpiazzare
|
toolmode.replace = Rimpiazzare
|
||||||
toolmode.replace.description = Disegna solo su blocchi solidi.
|
toolmode.replace.description = Disegna solo su blocchi solidi.
|
||||||
@@ -369,7 +369,7 @@ launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate
|
|||||||
uncover = Svelare
|
uncover = Svelare
|
||||||
configure = Configura l'equipaggiamento
|
configure = Configura l'equipaggiamento
|
||||||
configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento.
|
configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento.
|
||||||
configure.invalid = Amount must be a number between 0 and {0}.
|
configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}.
|
||||||
zone.unlocked = [LIGHT_GRAY]{0} sbloccata.
|
zone.unlocked = [LIGHT_GRAY]{0} sbloccata.
|
||||||
zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti.
|
zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti.
|
||||||
zone.config.complete = Ondata {0} raggiunta:\nEquipaggiamento personalizzato sbloccato.
|
zone.config.complete = Ondata {0} raggiunta:\nEquipaggiamento personalizzato sbloccato.
|
||||||
@@ -420,7 +420,7 @@ zone.crags.description = <inserisci descrizione>
|
|||||||
settings.language = Lingua
|
settings.language = Lingua
|
||||||
settings.data = Importa/Esporta salvataggio
|
settings.data = Importa/Esporta salvataggio
|
||||||
settings.reset = Resetta Alle Impostazioni Predefinite
|
settings.reset = Resetta Alle Impostazioni Predefinite
|
||||||
settings.rebind = Reimposta
|
settings.rebind = Modifica
|
||||||
settings.controls = Controlli
|
settings.controls = Controlli
|
||||||
settings.game = Gioco
|
settings.game = Gioco
|
||||||
settings.sound = Suoni
|
settings.sound = Suoni
|
||||||
@@ -490,10 +490,10 @@ bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray]
|
|||||||
bullet.incendiary = [stat]incendiario
|
bullet.incendiary = [stat]incendiario
|
||||||
bullet.homing = [stat]autoguidato
|
bullet.homing = [stat]autoguidato
|
||||||
bullet.shock = [stat]stordente
|
bullet.shock = [stat]stordente
|
||||||
bullet.frag = [stat]frammentazione
|
bullet.frag = [stat]a frammentazione
|
||||||
bullet.knockback = [stat]{0}[lightgray] contraccolpo
|
bullet.knockback = [stat]{0}[lightgray] contraccolpo
|
||||||
bullet.freezing = [stat]congelamento
|
bullet.freezing = [stat]congelante
|
||||||
bullet.tarred = [stat]asfaltata
|
bullet.tarred = [stat]viscoso
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni
|
bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni
|
||||||
bullet.reload = [stat]{0}[lightgray]x ricarica
|
bullet.reload = [stat]{0}[lightgray]x ricarica
|
||||||
unit.blocks = blocchi
|
unit.blocks = blocchi
|
||||||
@@ -523,18 +523,18 @@ setting.animatedshields.name = Scudi animati
|
|||||||
setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[]
|
setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[]
|
||||||
setting.indicators.name = Indicatori Alleati
|
setting.indicators.name = Indicatori Alleati
|
||||||
setting.autotarget.name = Mira automatica
|
setting.autotarget.name = Mira automatica
|
||||||
setting.keyboard.name = Controlli Mouse+Tastiera
|
setting.keyboard.name = Tastiera
|
||||||
setting.touchscreen.name = Touchscreen Controls
|
setting.touchscreen.name = Touchscreen Controls
|
||||||
setting.fpscap.name = Limite FPS
|
setting.fpscap.name = Limite FPS
|
||||||
setting.fpscap.none = Niente
|
setting.fpscap.none = Niente
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[]
|
setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[]
|
||||||
setting.swapdiagonal.name = Posizionamento sempre diagonale
|
setting.swapdiagonal.name = Posizionamento sempre diagonale
|
||||||
setting.difficulty.training = formazione
|
setting.difficulty.training = Allenamento
|
||||||
setting.difficulty.easy = facile
|
setting.difficulty.easy = Facile
|
||||||
setting.difficulty.normal = medio
|
setting.difficulty.normal = Medio
|
||||||
setting.difficulty.hard = difficile
|
setting.difficulty.hard = Difficile
|
||||||
setting.difficulty.insane = impossibile
|
setting.difficulty.insane = Impossibile
|
||||||
setting.difficulty.name = Difficoltà:
|
setting.difficulty.name = Difficoltà:
|
||||||
setting.screenshake.name = Movimento dello schermo
|
setting.screenshake.name = Movimento dello schermo
|
||||||
setting.effects.name = Visualizza effetti
|
setting.effects.name = Visualizza effetti
|
||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Schermo Intero
|
|||||||
setting.borderlesswindow.name = Schermo senza bordi[LIGHT_GRAY] (potrebbe richiedere riapertura gioco)
|
setting.borderlesswindow.name = Schermo senza bordi[LIGHT_GRAY] (potrebbe richiedere riapertura gioco)
|
||||||
setting.fps.name = Mostra FPS
|
setting.fps.name = Mostra FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Mostra Laser Energetici
|
|
||||||
setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento)
|
setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento)
|
||||||
setting.minimap.name = Mostra minimappa
|
setting.minimap.name = Mostra minimappa
|
||||||
setting.musicvol.name = Volume Musica
|
setting.musicvol.name = Volume Musica
|
||||||
@@ -554,9 +553,10 @@ setting.mutemusic.name = Silenzia musica
|
|||||||
setting.sfxvol.name = Volume Effetti
|
setting.sfxvol.name = Volume Effetti
|
||||||
setting.mutesound.name = Togli suoni
|
setting.mutesound.name = Togli suoni
|
||||||
setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente
|
setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente
|
||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Autosalvataggio
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Gioco visibile pubblicamente
|
||||||
setting.chatopacity.name = Opacità chat
|
setting.chatopacity.name = Opacità chat
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Mostra Chat in-game
|
setting.playerchat.name = Mostra Chat in-game
|
||||||
uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci dalle impostazioni [accent] {0}[] impostazioni...
|
uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci dalle impostazioni [accent] {0}[] impostazioni...
|
||||||
uiscale.cancel = Annulla ed esci
|
uiscale.cancel = Annulla ed esci
|
||||||
@@ -567,33 +567,33 @@ category.general.name = Generale
|
|||||||
category.view.name = Visualizzazione
|
category.view.name = Visualizzazione
|
||||||
category.multiplayer.name = Multigiocatore
|
category.multiplayer.name = Multigiocatore
|
||||||
command.attack = Attacca
|
command.attack = Attacca
|
||||||
command.rally = Rally
|
command.rally = Guardia
|
||||||
command.retreat = Torna indietro
|
command.retreat = Ritirata
|
||||||
keybind.gridMode.name = Seleziona blocco
|
keybind.gridMode.name = Seleziona blocco
|
||||||
keybind.gridModeShift.name = Seleziona categoria
|
keybind.gridModeShift.name = Seleziona categoria
|
||||||
keybind.press = Premi un tasto...
|
keybind.press = Premi un tasto...
|
||||||
keybind.press.axis = Premi un'asse o un tasto...
|
keybind.press.axis = Premi un'asse o un tasto...
|
||||||
keybind.screenshot.name = Screenshot della mappa
|
keybind.screenshot.name = Screenshot della mappa
|
||||||
keybind.move_x.name = Sposta_x
|
keybind.move_x.name = Muovi orizzontale
|
||||||
keybind.move_y.name = Sposta_y
|
keybind.move_y.name = Muovi verticale
|
||||||
keybind.fullscreen.name = Toggle Fullscreen
|
keybind.fullscreen.name = Schermo Intero
|
||||||
keybind.select.name = seleziona
|
keybind.select.name = Seleziona
|
||||||
keybind.diagonal_placement.name = Posizionamento diagonale
|
keybind.diagonal_placement.name = Posizionamento diagonale
|
||||||
keybind.pick.name = Scegli Blocco
|
keybind.pick.name = Scegli Blocco
|
||||||
keybind.break_block.name = Rompi blocco
|
keybind.break_block.name = Rompi blocco
|
||||||
keybind.deselect.name = Deseleziona
|
keybind.deselect.name = Deseleziona
|
||||||
keybind.shoot.name = spara
|
keybind.shoot.name = Spara
|
||||||
keybind.zoom_hold.name = attiva zoom
|
keybind.zoom_hold.name = Attiva zoom
|
||||||
keybind.zoom.name = esegui zoom
|
keybind.zoom.name = Esegui zoom
|
||||||
keybind.menu.name = menu
|
keybind.menu.name = Apri Menu
|
||||||
keybind.pause.name = pausa
|
keybind.pause.name = Pausa
|
||||||
keybind.minimap.name = Minimappa
|
keybind.minimap.name = Minimappa
|
||||||
keybind.dash.name = Scatto
|
keybind.dash.name = Scatto
|
||||||
keybind.chat.name = Chat
|
keybind.chat.name = Chat
|
||||||
keybind.player_list.name = lista_giocatori
|
keybind.player_list.name = Lista dei Giocatori
|
||||||
keybind.console.name = console
|
keybind.console.name = Console
|
||||||
keybind.rotate.name = Ruotare
|
keybind.rotate.name = Ruotare
|
||||||
keybind.toggle_menus.name = Abilita menù
|
keybind.toggle_menus.name = Mostra/Nascondi HUD
|
||||||
keybind.chat_history_prev.name = Scorri chat vero l'alto
|
keybind.chat_history_prev.name = Scorri chat vero l'alto
|
||||||
keybind.chat_history_next.name = Scorri chatt verso il basso
|
keybind.chat_history_next.name = Scorri chatt verso il basso
|
||||||
keybind.chat_scroll.name = Scorri chat
|
keybind.chat_scroll.name = Scorri chat
|
||||||
@@ -606,7 +606,7 @@ mode.sandbox.name = Creativa
|
|||||||
mode.sandbox.description = Risorse infinite e nessun timer per le ondate.
|
mode.sandbox.description = Risorse infinite e nessun timer per le ondate.
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = Lotta contro altri giocatori.
|
mode.pvp.description = Lotta contro altri giocatori.
|
||||||
mode.attack.name = Attacco
|
mode.attack.name = Schermaglia
|
||||||
mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate
|
mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate
|
||||||
mode.custom = Regole personalizzate
|
mode.custom = Regole personalizzate
|
||||||
rules.infiniteresources = Risorse infinite
|
rules.infiniteresources = Risorse infinite
|
||||||
@@ -614,7 +614,7 @@ rules.wavetimer = Timer ondate
|
|||||||
rules.waves = Ondate
|
rules.waves = Ondate
|
||||||
rules.attack = Modalità attacco
|
rules.attack = Modalità attacco
|
||||||
rules.enemyCheat = Infinite Risorse AI
|
rules.enemyCheat = Infinite Risorse AI
|
||||||
rules.unitdrops = Drops Unità
|
rules.unitdrops = Generazione Unità
|
||||||
rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità
|
rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità
|
||||||
rules.unithealthmultiplier = Moltiplicatore vita unità
|
rules.unithealthmultiplier = Moltiplicatore vita unità
|
||||||
rules.playerhealthmultiplier = Moltiplicatore vita giocatore
|
rules.playerhealthmultiplier = Moltiplicatore vita giocatore
|
||||||
@@ -626,7 +626,7 @@ rules.wavespacing = Tempo fra ondate:[LIGHT_GRAY] (secondi)
|
|||||||
rules.buildcostmultiplier = Moltiplicatore costo costruzione
|
rules.buildcostmultiplier = Moltiplicatore costo costruzione
|
||||||
rules.buildspeedmultiplier = Moltiplicatore velocità costruzione
|
rules.buildspeedmultiplier = Moltiplicatore velocità costruzione
|
||||||
rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce
|
rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce
|
||||||
rules.dropzoneradius = Raggio di drop:[LIGHT_GRAY] (blocchi)
|
rules.dropzoneradius = Raggio di generazione:[LIGHT_GRAY] (blocchi)
|
||||||
rules.respawns = Massimo di rigenerazioni per ondata
|
rules.respawns = Massimo di rigenerazioni per ondata
|
||||||
rules.limitedRespawns = Limite rigenerazioni
|
rules.limitedRespawns = Limite rigenerazioni
|
||||||
rules.title.waves = Ondate
|
rules.title.waves = Ondate
|
||||||
@@ -764,8 +764,8 @@ block.dark-panel-5.name = Pannello scuro 5
|
|||||||
block.dark-panel-6.name = Pannello scuro 6
|
block.dark-panel-6.name = Pannello scuro 6
|
||||||
block.dark-metal.name = Metallo Scuro
|
block.dark-metal.name = Metallo Scuro
|
||||||
block.ignarock.name = Roccia Ignea
|
block.ignarock.name = Roccia Ignea
|
||||||
block.hotrock.name = Roccia bollente
|
block.hotrock.name = Roccia Bollente
|
||||||
block.magmarock.name = Roccia magmatica
|
block.magmarock.name = Roccia Magmatica
|
||||||
block.cliffs.name = Scogliere
|
block.cliffs.name = Scogliere
|
||||||
block.copper-wall.name = Muro di rame
|
block.copper-wall.name = Muro di rame
|
||||||
block.copper-wall-large.name = Muro grande di rame
|
block.copper-wall-large.name = Muro grande di rame
|
||||||
@@ -783,9 +783,9 @@ block.scatter.name = Cannone a dispersione
|
|||||||
block.hail.name = Bombardiere
|
block.hail.name = Bombardiere
|
||||||
block.lancer.name = Lanciere
|
block.lancer.name = Lanciere
|
||||||
block.conveyor.name = Nastro trasportatore
|
block.conveyor.name = Nastro trasportatore
|
||||||
block.titanium-conveyor.name = Nastro trasportatore avanzato
|
block.titanium-conveyor.name = Nastro avanzato
|
||||||
block.armored-conveyor.name = Armored Conveyor
|
block.armored-conveyor.name = Nastro corazzato
|
||||||
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
block.armored-conveyor.description = Trasporta gli oggetti alla stessa velocità del nastro avanzato, ma è più resistente. Accetta input dai lati solo da altri nastri.
|
||||||
block.junction.name = Incrocio
|
block.junction.name = Incrocio
|
||||||
block.router.name = Distributore
|
block.router.name = Distributore
|
||||||
block.distributor.name = Distributore Grande
|
block.distributor.name = Distributore Grande
|
||||||
@@ -820,8 +820,8 @@ block.delta-mech-pad.name = Piattaforma del Mech Delta
|
|||||||
block.javelin-ship-pad.name = Piattaforma della Nave Giavellotto
|
block.javelin-ship-pad.name = Piattaforma della Nave Giavellotto
|
||||||
block.trident-ship-pad.name = Piattaforma della Nave Tridente
|
block.trident-ship-pad.name = Piattaforma della Nave Tridente
|
||||||
block.glaive-ship-pad.name = Piattaforma della Nave Glaive
|
block.glaive-ship-pad.name = Piattaforma della Nave Glaive
|
||||||
block.omega-mech-pad.name = Piattaforma della Nave Omega
|
block.omega-mech-pad.name = Piattaforma del Mech Omega
|
||||||
block.tau-mech-pad.name = Piattaforma della Nave Tau
|
block.tau-mech-pad.name = Piattaforma del Mech Tau
|
||||||
block.conduit.name = Condotta
|
block.conduit.name = Condotta
|
||||||
block.mechanical-pump.name = Pompa meccanica
|
block.mechanical-pump.name = Pompa meccanica
|
||||||
block.item-source.name = Fonte infinita (oggetti)
|
block.item-source.name = Fonte infinita (oggetti)
|
||||||
@@ -875,10 +875,10 @@ block.surge-wall-large.name = Muro di Sovratensione Grande
|
|||||||
block.cyclone.name = Ciclone
|
block.cyclone.name = Ciclone
|
||||||
block.fuse.name = Frantume
|
block.fuse.name = Frantume
|
||||||
block.shock-mine.name = Mina Stordente
|
block.shock-mine.name = Mina Stordente
|
||||||
block.overdrive-projector.name = Generatore di Campo di Overclock
|
block.overdrive-projector.name = Generatore di Campo di Overdrive
|
||||||
block.force-projector.name = Generatore di Campo di Forza
|
block.force-projector.name = Generatore di Campo di Forza
|
||||||
block.arc.name = Arco Elettrico
|
block.arc.name = Arco Elettrico
|
||||||
block.rtg-generator.name = Generatore Termico ai Radioisotopi
|
block.rtg-generator.name = Generatore RTG
|
||||||
block.spectre.name = Spettro
|
block.spectre.name = Spettro
|
||||||
block.meltdown.name = Fusione
|
block.meltdown.name = Fusione
|
||||||
block.container.name = Contenitore
|
block.container.name = Contenitore
|
||||||
@@ -907,25 +907,25 @@ unit.eradicator.name = Estirpatore
|
|||||||
unit.lich.name = Lich
|
unit.lich.name = Lich
|
||||||
unit.reaper.name = Mietitore
|
unit.reaper.name = Mietitore
|
||||||
tutorial.next = [lightgray]<Clicca per continuare>
|
tutorial.next = [lightgray]<Clicca per continuare>
|
||||||
tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia [accent] scavando rame[]. Clicca un minerale di rame vicino al tuo nucleo per farlo.\n\n[accent]{0}/{1} rame
|
tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo nucleo per farlo.\n\n[accent]{0}/{1} rame
|
||||||
tutorial.drill = Minare manualmente.\n[accent]Le trivelle []possono scavare automaticamente\nPiazzane una su un minerale di rame.
|
tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame.
|
||||||
tutorial.drill.mobile = L'estrazione manuale è inefficiente. \n[accent] Le trivelle [] possono estrarre automaticamente. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento.
|
tutorial.drill.mobile = Ora crea una trivella. \n[accent] Le trivelle []scavano da sole e sono più efficienti. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento.
|
||||||
tutorial.blockinfo = Ogni blocco ha statistiche diverse. Ogni trivella può estrarre solo determinati minerali. \n Per controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel menu di creazione. []\n\n[accent] Accedi ora alle statistiche della trivella meccanica. []
|
tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. []
|
||||||
tutorial.conveyor = [accent] I nastri trasportatori [] sono usati per trasportare oggetti al nocciolo. \n Crea una linea di nastri dalla trivella al nocciolo.
|
tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al nucleo. \nCrea una linea di nastri dalla trivella al nucleo.
|
||||||
tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati
|
tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati
|
||||||
tutorial.turret = Strutture difensive devono essere costruite per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta a due vicino alla tua base.
|
tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base.
|
||||||
tutorial.drillturret = Torrette a due richiedono[accent] munizioni di rame[] per sparare.\n Duo turrets require[accent] copper ammo []to shoot.\nPosiziona una trivella vicino alla torretta per rifornirlo di rame estratto.
|
tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto.
|
||||||
tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi spazio per mettere in pausa.
|
tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent]Premi spazio per mettere in pausa.
|
||||||
tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa.
|
tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa.
|
||||||
tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa.
|
tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa.
|
||||||
tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa.
|
tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa.
|
||||||
tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent] Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n\n[accent] Distruggi tutti i blocchi di scarto a sinistra del tuo core usando la selezione dell'area .
|
tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo core usando la selezione dell'area .
|
||||||
tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a romperlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\n Premi il pulsante con il segno di spunta per confermare la rottura. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo nucleo usando la selezione dell'area.
|
tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo nucleo usando la selezione dell'area.
|
||||||
tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi. \n Per fare ciò, [accent] tocca un blocco [] con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPosti multipli possono essere ritirati da [accent] toccando e tenendo premuto []. \n\n[accent] Prelevare un po' di rame dal nucleo. []
|
tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal nucleo. []
|
||||||
tutorial.deposit = Deposita gli oggetti in blocchi trascinandoli dalla tua nave al blocco di destinazione. \n\n[accent] Riporta il rame nel nucleo. []
|
tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel nucleo. []
|
||||||
tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina. \n\n Difendi il tuo nucleo per 2 ondate. Costruisci più torrette.
|
tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse.
|
||||||
tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il nucleo per due ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette e trivelle. Scava più rame
|
tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette.
|
||||||
tutorial.launch = Una volta raggiunta un'onda specifica, sei in grado di [accent] decollare con il nucleo [], lasciando indietro le tue difese ed [accent] ottenendo tutte le risorse nel tuo nucleo. [] \n Queste risorse possono quindi essere utilizzate per ricercare nuove tecnologie.\n\n [accent] Premi il pulsante di avvio.
|
tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial.
|
||||||
item.copper.description = Un utile materiale, usato dappertutto
|
item.copper.description = Un utile materiale, usato dappertutto
|
||||||
item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto.
|
item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto.
|
||||||
item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento.
|
item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento.
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ minimap = ミニマップ
|
|||||||
close = 閉じる
|
close = 閉じる
|
||||||
website = ウェブサイト
|
website = ウェブサイト
|
||||||
quit = 終了
|
quit = 終了
|
||||||
save.quit = Save & Quit
|
save.quit = セーブして終了
|
||||||
maps = マップ
|
maps = マップ
|
||||||
maps.browse = マップを閲覧する
|
maps.browse = マップを閲覧する
|
||||||
continue = 続ける
|
continue = 続ける
|
||||||
@@ -173,7 +173,7 @@ save.playtime = プレイ時間: {0}
|
|||||||
warning = 警告
|
warning = 警告
|
||||||
confirm = 確認
|
confirm = 確認
|
||||||
delete = 削除
|
delete = 削除
|
||||||
view.workshop = View In Workshop
|
view.workshop = ワークショップを見る
|
||||||
ok = OK
|
ok = OK
|
||||||
open = 開く
|
open = 開く
|
||||||
customize = カスタマイズ
|
customize = カスタマイズ
|
||||||
@@ -222,7 +222,7 @@ editor.oregen.info = 鉱石の生成:
|
|||||||
editor.mapinfo = マップ情報
|
editor.mapinfo = マップ情報
|
||||||
editor.author = 作者:
|
editor.author = 作者:
|
||||||
editor.description = 説明:
|
editor.description = 説明:
|
||||||
editor.nodescription = A map must have a description of at least 4 characters before being published.
|
editor.nodescription = マップを公開するには、少なくとも4文字以上の説明が必要です。
|
||||||
editor.waves = ウェーブ:
|
editor.waves = ウェーブ:
|
||||||
editor.rules = ルール:
|
editor.rules = ルール:
|
||||||
editor.generation = 生成:
|
editor.generation = 生成:
|
||||||
@@ -289,7 +289,7 @@ editor.resizemap = マップをリサイズ
|
|||||||
editor.mapname = マップ名:
|
editor.mapname = マップ名:
|
||||||
editor.overwrite = [accent]警告!\nすでに存在するマップを上書きします。
|
editor.overwrite = [accent]警告!\nすでに存在するマップを上書きします。
|
||||||
editor.overwrite.confirm = [scarlet]警告![] すでに同じ名前のマップが存在します。上書きしてもよろしいですか?
|
editor.overwrite.confirm = [scarlet]警告![] すでに同じ名前のマップが存在します。上書きしてもよろしいですか?
|
||||||
editor.exists = A map with this name already exists.
|
editor.exists = すでに同じ名前のマップが存在します。
|
||||||
editor.selectmap = 読み込むマップを選択:
|
editor.selectmap = 読み込むマップを選択:
|
||||||
toolmode.replace = 置きかえ
|
toolmode.replace = 置きかえ
|
||||||
toolmode.replace.description = 固体ブロックのみに描きます。
|
toolmode.replace.description = 固体ブロックのみに描きます。
|
||||||
@@ -340,7 +340,7 @@ width = 幅:
|
|||||||
height = 高さ:
|
height = 高さ:
|
||||||
menu = メニュー
|
menu = メニュー
|
||||||
play = プレイ
|
play = プレイ
|
||||||
campaign = 遠征
|
campaign = プレイ
|
||||||
load = 読み込む
|
load = 読み込む
|
||||||
save = 保存
|
save = 保存
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
@@ -354,18 +354,18 @@ editor = エディター
|
|||||||
mapeditor = マップエディター
|
mapeditor = マップエディター
|
||||||
donate = 寄付
|
donate = 寄付
|
||||||
abandon = 撤退
|
abandon = 撤退
|
||||||
abandon.text = このゾーンとすべての資源が敵に奪われます。
|
abandon.text = このゾーンのすべての資源が敵に奪われます。
|
||||||
locked = ロック
|
locked = ロック
|
||||||
complete = [lightgray]達成済み:
|
complete = [lightgray]達成済み:
|
||||||
zone.requirement = ゾーン {1} でウェーブ {0} を達成
|
zone.requirement = ゾーン {1} でウェーブ {0} を達成
|
||||||
resume = 再開ゾーン:\n[lightgray]{0}
|
resume = 再開ゾーン:\n[lightgray]{0}
|
||||||
bestwave = [lightgray]最高ウェーブ: {0}
|
bestwave = [lightgray]最高ウェーブ: {0}
|
||||||
launch = < 離脱 >
|
launch = < 発射 >
|
||||||
launch.title = 離脱成功
|
launch.title = 発射成功
|
||||||
launch.next = [lightgray]次は ウェーブ {0} で離脱可能です。
|
launch.next = [lightgray]次は ウェーブ {0} で発射可能です。
|
||||||
launch.unable2 = [scarlet]離脱できません。[]
|
launch.unable2 = [scarlet]発射できません。[]
|
||||||
launch.confirm = すべての資源をコアに搬入し、離脱します。\nもうこの基地には戻ってくることはできません。
|
launch.confirm = すべての資源をコアに搬入し、発射します。\nもうこの基地には戻ってくることはできません。
|
||||||
launch.skip.confirm = スキップすると、次の離脱可能なウェーブまで離脱できません。
|
launch.skip.confirm = スキップすると、次の発射可能なウェーブまで発射できません。
|
||||||
uncover = 開放
|
uncover = 開放
|
||||||
configure = 積み荷の設定
|
configure = 積み荷の設定
|
||||||
configure.locked = [lightgray]ウェーブ {0} を達成すると積み荷を設定できるようになります。
|
configure.locked = [lightgray]ウェーブ {0} を達成すると積み荷を設定できるようになります。
|
||||||
@@ -375,14 +375,14 @@ zone.requirement.complete = ウェーブ {0} を達成:\n{1} の開放条件を
|
|||||||
zone.config.complete = ウェーブ {0} を達成:\n積み荷の設定が解除されました。
|
zone.config.complete = ウェーブ {0} を達成:\n積み荷の設定が解除されました。
|
||||||
zone.resources = 発見した資源:
|
zone.resources = 発見した資源:
|
||||||
zone.objective = [lightgray]目標: [accent]{0}
|
zone.objective = [lightgray]目標: [accent]{0}
|
||||||
zone.objective.survival = 生き残る
|
zone.objective.survival = 敵からコアを守り切る
|
||||||
zone.objective.attack = 敵のコアを破壊する
|
zone.objective.attack = 敵のコアを破壊する
|
||||||
add = 追加...
|
add = 追加...
|
||||||
boss.health = ボスのHP
|
boss.health = ボスのHP
|
||||||
connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0}
|
connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0}
|
||||||
error.unreachable = サーバーに到達できません。\nアドレスは正しいですか?
|
error.unreachable = サーバーに到達できません。\nアドレスは正しいですか?
|
||||||
error.invalidaddress = 無効なアドレスです。
|
error.invalidaddress = 無効なアドレスです。
|
||||||
error.timedout = タイムアウトしました!\nホストがポート開放されているかを確認してください。また、このアドレスは無効なアドレスではありません!
|
error.timedout = タイムアウトしました!\nホストがポート開放されているかを確認してください。
|
||||||
error.mismatch = パケットエラー:\n恐らくクライアント/サーバーのバージョンが一致していません。\nゲームとサーバーが最新版のMindustryかどうかを確認してください!
|
error.mismatch = パケットエラー:\n恐らくクライアント/サーバーのバージョンが一致していません。\nゲームとサーバーが最新版のMindustryかどうかを確認してください!
|
||||||
error.alreadyconnected = すでに接続されています。
|
error.alreadyconnected = すでに接続されています。
|
||||||
error.mapnotfound = マップファイルが見つかりません!
|
error.mapnotfound = マップファイルが見つかりません!
|
||||||
@@ -524,7 +524,7 @@ setting.antialias.name = アンチエイリアス[lightgray] (再起動が必要
|
|||||||
setting.indicators.name = 敵/味方の方角表示
|
setting.indicators.name = 敵/味方の方角表示
|
||||||
setting.autotarget.name = オートターゲット
|
setting.autotarget.name = オートターゲット
|
||||||
setting.keyboard.name = マウスとキーボード操作
|
setting.keyboard.name = マウスとキーボード操作
|
||||||
setting.touchscreen.name = Touchscreen Controls
|
setting.touchscreen.name = タッチスクリーン操作
|
||||||
setting.fpscap.name = 最大FPS
|
setting.fpscap.name = 最大FPS
|
||||||
setting.fpscap.none = なし
|
setting.fpscap.none = なし
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = フルスクリーン
|
|||||||
setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります)
|
setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります)
|
||||||
setting.fps.name = FPSを表示
|
setting.fps.name = FPSを表示
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = 電力線を表示
|
|
||||||
setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます)
|
setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます)
|
||||||
setting.minimap.name = ミニマップを表示
|
setting.minimap.name = ミニマップを表示
|
||||||
setting.musicvol.name = 音楽 音量
|
setting.musicvol.name = 音楽 音量
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = 匿名でクラッシュレポートを送信する
|
|||||||
setting.savecreate.name = 自動保存
|
setting.savecreate.name = 自動保存
|
||||||
setting.publichost.name = 誰でもゲームに参加できるようにする
|
setting.publichost.name = 誰でもゲームに参加できるようにする
|
||||||
setting.chatopacity.name = チャットの透明度
|
setting.chatopacity.name = チャットの透明度
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = ゲーム内にチャットを表示
|
setting.playerchat.name = ゲーム内にチャットを表示
|
||||||
uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります...
|
uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります...
|
||||||
uiscale.cancel = キャンセル & 終了
|
uiscale.cancel = キャンセル & 終了
|
||||||
@@ -784,8 +784,8 @@ block.hail.name = ヘイル
|
|||||||
block.lancer.name = ランサー
|
block.lancer.name = ランサー
|
||||||
block.conveyor.name = コンベアー
|
block.conveyor.name = コンベアー
|
||||||
block.titanium-conveyor.name = チタンコンベアー
|
block.titanium-conveyor.name = チタンコンベアー
|
||||||
block.armored-conveyor.name = Armored Conveyor
|
block.armored-conveyor.name = 装甲コンベア
|
||||||
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
block.armored-conveyor.description = チタンコンベアーと同じ速度でアイテムを輸送することができ、耐久性に優れています。\nまた、ほかのコンベアーからの側面からの入力は受け取ることができません。
|
||||||
block.junction.name = ジャンクション
|
block.junction.name = ジャンクション
|
||||||
block.router.name = ルーター
|
block.router.name = ルーター
|
||||||
block.distributor.name = ディストリビューター
|
block.distributor.name = ディストリビューター
|
||||||
@@ -965,7 +965,7 @@ unit.eruptor.description = 建造物を破壊することに特化したユニ
|
|||||||
unit.wraith.description = 高速で突撃攻撃が可能な迎撃ユニットです。
|
unit.wraith.description = 高速で突撃攻撃が可能な迎撃ユニットです。
|
||||||
unit.ghoul.description = 重爆撃機です。敵の重要な建造物を優先して破壊します。
|
unit.ghoul.description = 重爆撃機です。敵の重要な建造物を優先して破壊します。
|
||||||
unit.revenant.description = 空中からミサイルを発射する重爆撃機です。
|
unit.revenant.description = 空中からミサイルを発射する重爆撃機です。
|
||||||
block.message.description = Stores a message. Used for communication between allies.
|
block.message.description = メッセージを保存し、仲間間の通信に使用します。
|
||||||
block.graphite-press.description = 石炭を圧縮し、黒鉛を生成します。
|
block.graphite-press.description = 石炭を圧縮し、黒鉛を生成します。
|
||||||
block.multi-press.description = 黒鉛圧縮機のアップグレード版です。水と電力を使用して、より効率的に石炭を圧縮します。
|
block.multi-press.description = 黒鉛圧縮機のアップグレード版です。水と電力を使用して、より効率的に石炭を圧縮します。
|
||||||
block.silicon-smelter.description = 石炭と砂からシリコンを製造します。
|
block.silicon-smelter.description = 石炭と砂からシリコンを製造します。
|
||||||
@@ -1082,7 +1082,7 @@ block.repair-point.description = 近くの負傷したユニットを修復し
|
|||||||
block.dart-mech-pad.description = 機体を基本的な攻撃性能を備えた機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
block.dart-mech-pad.description = 機体を基本的な攻撃性能を備えた機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
||||||
block.delta-mech-pad.description = 機体を高速で突撃攻撃に向いた軽装備の機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
block.delta-mech-pad.description = 機体を高速で突撃攻撃に向いた軽装備の機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
||||||
block.tau-mech-pad.description = 機体を味方の建造物やユニットの修復が可能な支援型機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
block.tau-mech-pad.description = 機体を味方の建造物やユニットの修復が可能な支援型機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
||||||
block.omega-mech-pad.description = Provides transformation into a heavily-armored missile mech.\nUse by tapping while standing on it.
|
block.omega-mech-pad.description = 機体をミサイルを搭載した重装甲な機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。
|
||||||
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整備台に乗ってタップすることで使用できます。
|
||||||
|
|||||||
@@ -16,11 +16,14 @@ screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가
|
|||||||
gameover = 게임 오버
|
gameover = 게임 오버
|
||||||
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
||||||
highscore = [accent]최고점수 달성!
|
highscore = [accent]최고점수 달성!
|
||||||
|
|
||||||
load.sound = 소리
|
load.sound = 소리
|
||||||
load.map = 맵
|
load.map = 맵
|
||||||
load.image = 사진
|
load.image = 사진
|
||||||
load.content = 컨텐츠
|
load.content = 컨텐츠
|
||||||
load.system = 시스템
|
load.system = 시스템
|
||||||
|
load.mod = 모드
|
||||||
|
|
||||||
stat.wave = 버틴 단계 수 : [accent]{0}
|
stat.wave = 버틴 단계 수 : [accent]{0}
|
||||||
stat.enemiesDestroyed = 파괴한 적 수 : [accent]{0}
|
stat.enemiesDestroyed = 파괴한 적 수 : [accent]{0}
|
||||||
stat.built = 건설한 건물 수 : [accent]{0}
|
stat.built = 건설한 건물 수 : [accent]{0}
|
||||||
@@ -28,7 +31,9 @@ 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 = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 획득합니다.
|
||||||
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
|
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
|
||||||
level.highscore = 최고 점수 : [accent]{0}
|
level.highscore = 최고 점수 : [accent]{0}
|
||||||
level.select = 맵 선택
|
level.select = 맵 선택
|
||||||
@@ -40,7 +45,6 @@ database = 코어 기록보관소
|
|||||||
savegame = 게임 저장
|
savegame = 게임 저장
|
||||||
loadgame = 게임 불러오기
|
loadgame = 게임 불러오기
|
||||||
joingame = 서버 접속
|
joingame = 서버 접속
|
||||||
addplayers = 플레이어 추가/제거
|
|
||||||
customgame = 사용자 정의 게임
|
customgame = 사용자 정의 게임
|
||||||
newgame = 새 게임
|
newgame = 새 게임
|
||||||
none = <없음>
|
none = <없음>
|
||||||
@@ -60,16 +64,35 @@ uploadingcontent = 컨텐츠 업로드
|
|||||||
uploadingpreviewfile = 미리보기 파일 업로드
|
uploadingpreviewfile = 미리보기 파일 업로드
|
||||||
committingchanges = 바뀐 점 적용
|
committingchanges = 바뀐 점 적용
|
||||||
done = 완료
|
done = 완료
|
||||||
|
|
||||||
|
mods.alphainfo = 현재의 모드는 첫 번째 버전이며, 그리고[scarlet] 버그가 매우 많음을 명심하십시오[].\n만약 버그를 발견할경우 Mindustry 깃허브 또는 디스코드로 제보해주세요.
|
||||||
|
mods.alpha = [scarlet](Alpha)
|
||||||
|
mods = 모드
|
||||||
|
mods.none = [LIGHT_GRAY]모드가 발견되지 않았습니다!
|
||||||
|
mods.guide = 모드 가이드
|
||||||
|
mods.report = 버그 신고
|
||||||
|
mod.enabled = [lightgray]활성화
|
||||||
|
mod.disabled = [scarlet]비활성화
|
||||||
|
mod.disable = 비활성화
|
||||||
|
mod.enable = 활성화
|
||||||
|
mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종료합니다.
|
||||||
|
mod.reloadrequired = [scarlet]새로고침 요구됨
|
||||||
|
mod.import = 모드 추가
|
||||||
|
mod.import.github = 깃허브 모드 추가
|
||||||
|
mod.remove.confirm = 모드가 삭제되었습니다.
|
||||||
|
mod.author = [LIGHT_GRAY]제작자:[] {0}
|
||||||
|
mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 것을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0}
|
||||||
|
|
||||||
about.button = 정보
|
about.button = 정보
|
||||||
name = 이름 :
|
name = 이름 :
|
||||||
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
||||||
filename = 파일 이름 :
|
filename = 파일 이름 :
|
||||||
unlocked = 새 건물 잠금 해제됨
|
unlocked = 대상 정보 기록됨
|
||||||
completed = [accent]연구됨
|
completed = [accent]연구됨
|
||||||
techtree = 연구 기록
|
techtree = 연구 기록
|
||||||
research.list = [LIGHT_GRAY]연구:
|
research.list = [LIGHT_GRAY]연구 :
|
||||||
research = 연구
|
research = 연구
|
||||||
researched = [LIGHT_GRAY]{0}연구됨.
|
researched = [LIGHT_GRAY]{0}연구 완료.
|
||||||
players = 현재 {0}명 접속중
|
players = 현재 {0}명 접속중
|
||||||
players.single = 현재 {0}명만 있음.
|
players.single = 현재 {0}명만 있음.
|
||||||
server.closing = [accent]서버 닫는중...
|
server.closing = [accent]서버 닫는중...
|
||||||
@@ -129,7 +152,7 @@ confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까?
|
|||||||
joingame.title = 게임 참가
|
joingame.title = 게임 참가
|
||||||
joingame.ip = 주소:
|
joingame.ip = 주소:
|
||||||
disconnect = 서버와 연결이 해제되었습니다.
|
disconnect = 서버와 연결이 해제되었습니다.
|
||||||
disconnect.error = Connection error.
|
disconnect.error = 연결 .
|
||||||
disconnect.closed = 연결이 끊어졌습니다..
|
disconnect.closed = 연결이 끊어졌습니다..
|
||||||
disconnect.timeout = 연결 시간 한계 도달..
|
disconnect.timeout = 연결 시간 한계 도달..
|
||||||
disconnect.data = 월드 데이터 로딩 실패..
|
disconnect.data = 월드 데이터 로딩 실패..
|
||||||
@@ -140,7 +163,6 @@ server.port = 포트:
|
|||||||
server.addressinuse = 주소가 이미 사용중입니다!
|
server.addressinuse = 주소가 이미 사용중입니다!
|
||||||
server.invalidport = 포트가 올바르지 않습니다!
|
server.invalidport = 포트가 올바르지 않습니다!
|
||||||
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
||||||
save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
|
|
||||||
save.new = 새로 저장
|
save.new = 새로 저장
|
||||||
save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까?
|
save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까?
|
||||||
overwrite = 덮어쓰기
|
overwrite = 덮어쓰기
|
||||||
@@ -160,21 +182,22 @@ save.rename.text = 새 이름:
|
|||||||
selectslot = 저장슬롯을 선택하십시오.
|
selectslot = 저장슬롯을 선택하십시오.
|
||||||
slot = [accent]{0}번째 슬롯
|
slot = [accent]{0}번째 슬롯
|
||||||
editmessage = 글 수정하기
|
editmessage = 글 수정하기
|
||||||
save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[].
|
save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다!
|
||||||
empty = <비어있음>
|
empty = <비어있음>
|
||||||
on = 켜기
|
on = 활성화
|
||||||
off = 끄기
|
off = 비활성화
|
||||||
save.autosave = 자동저장: {0}
|
save.autosave = 자동저장 : {0}
|
||||||
save.map = 맵: {0}
|
save.map = 맵 : {0}
|
||||||
save.wave = 웨이브 {0}
|
save.wave = {0} 단계
|
||||||
save.mode = 게임모드 : {0}
|
save.mode = 게임모드 : {0}
|
||||||
save.date = 마지막 저장날짜: {0}
|
save.date = 마지막 저장일 : {0}
|
||||||
save.playtime = 플레이시간: {0}
|
save.playtime = 플레이타임 : {0}
|
||||||
warning = 경고.
|
warning = 경고.
|
||||||
confirm = 확인
|
confirm = 확인
|
||||||
delete = 삭제
|
delete = 삭제
|
||||||
view.workshop = 워크샵에서 보기
|
view.workshop = 워크샵에서 보기
|
||||||
ok = OK
|
workshop.listing = 워크샵 목록 편집하기
|
||||||
|
ok = 확인
|
||||||
open = 열기
|
open = 열기
|
||||||
customize = 맞춤설정
|
customize = 맞춤설정
|
||||||
cancel = 취소
|
cancel = 취소
|
||||||
@@ -191,7 +214,11 @@ classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또
|
|||||||
quit.confirm = 정말로 종료하시겠습니까?
|
quit.confirm = 정말로 종료하시겠습니까?
|
||||||
quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다.
|
quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다.
|
||||||
loading = [accent]불러오는중...
|
loading = [accent]불러오는중...
|
||||||
|
reloading = [accent]모드 새로고침하는중...
|
||||||
saving = [accent]저장중...
|
saving = [accent]저장중...
|
||||||
|
cancelbuilding = [accent][[{0}][] 를 눌러 설계도 초기화
|
||||||
|
pausebuilding = [accent][[{0}][] 를 눌러 설계모드 진입
|
||||||
|
resumebuilding = [scarlet][[{0}][] 를 눌러 건설 시작
|
||||||
wave = [accent]웨이브 {0}
|
wave = [accent]웨이브 {0}
|
||||||
wave.waiting = [green]{0}초[]후 웨이브 시작
|
wave.waiting = [green]{0}초[]후 웨이브 시작
|
||||||
wave.waveInProgress = [LIGHT_GRAY]웨이브 진행중
|
wave.waveInProgress = [LIGHT_GRAY]웨이브 진행중
|
||||||
@@ -211,7 +238,12 @@ map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [
|
|||||||
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
||||||
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
||||||
map.publish.error = 맵 업로드 오류 : {0}
|
map.publish.error = 맵 업로드 오류 : {0}
|
||||||
|
map.update = 맵 업데이트
|
||||||
|
map.load.error = 워크샵 작업 오류 : {0}
|
||||||
|
map.missing = 해당 맵은 삭제되거나 옮겨졌습니다.\n[lightgray]워크샵 목록은 자동으로 동기화되지 않습니다.
|
||||||
map.publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다!
|
map.publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다!
|
||||||
|
map.menu = 원하는 맵을 선택하세요.
|
||||||
|
map.changelog = 바뀐 점 (선택성):
|
||||||
eula = 스팀 EULA
|
eula = 스팀 EULA
|
||||||
map.publish = 맵 업로드 완료!
|
map.publish = 맵 업로드 완료!
|
||||||
map.publishing = [accent]맵 업로드 중...
|
map.publishing = [accent]맵 업로드 중...
|
||||||
@@ -291,6 +323,7 @@ editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게
|
|||||||
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 = 모두 재배치
|
||||||
@@ -305,6 +338,7 @@ toolmode.fillteams = 팀 채우기
|
|||||||
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
||||||
toolmode.drawteams = 팀 그리기
|
toolmode.drawteams = 팀 그리기
|
||||||
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
||||||
|
|
||||||
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
||||||
filter.distort = 왜곡
|
filter.distort = 왜곡
|
||||||
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
||||||
@@ -336,16 +370,16 @@ filter.option.floor2 = 2번째 바닥
|
|||||||
filter.option.threshold2 = 2번째 한계점
|
filter.option.threshold2 = 2번째 한계점
|
||||||
filter.option.radius = 반경
|
filter.option.radius = 반경
|
||||||
filter.option.percentile = 백분위수
|
filter.option.percentile = 백분위수
|
||||||
width = 넓이:
|
|
||||||
height = 높이:
|
width = 넓이 :
|
||||||
|
height = 높이 :
|
||||||
menu = 메뉴
|
menu = 메뉴
|
||||||
play = 플레이
|
play = 플레이
|
||||||
campaign = 캠페인
|
campaign = 캠페인
|
||||||
load = 불러오기
|
load = 불러오기
|
||||||
save = 저장
|
save = 저장
|
||||||
fps = FPS: {0}
|
fps = FPS : {0}
|
||||||
tps = TPS: {0}
|
ping = Ping : 초당 {0}
|
||||||
ping = Ping: {0}ms
|
|
||||||
language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요.
|
language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요.
|
||||||
settings = 설정
|
settings = 설정
|
||||||
tutorial = 게임 방법
|
tutorial = 게임 방법
|
||||||
@@ -353,32 +387,38 @@ tutorial.retake = 튜토리얼
|
|||||||
editor = 편집기
|
editor = 편집기
|
||||||
mapeditor = 맵 편집기
|
mapeditor = 맵 편집기
|
||||||
donate = 기부
|
donate = 기부
|
||||||
|
|
||||||
abandon = 포기
|
abandon = 포기
|
||||||
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
||||||
locked = 잠김
|
locked = 잠김
|
||||||
complete = [LIGHT_GRAY]완료:
|
complete = [LIGHT_GRAY]완료 :
|
||||||
zone.requirement = 지역 {1} 에서 단계 {0} 달성
|
zone.requirement = 지역 {1} 에서 단계 {0} 달성
|
||||||
resume = 지역 계속 플레이:\n[LIGHT_GRAY]{0}
|
requirement.core = Destroy Enemy Core in {0}
|
||||||
bestwave = [LIGHT_GRAY]최고 점수: {0}
|
requirement.unlock = Unlock {0}
|
||||||
|
resume = 현재 진행 중인 지역 :\n[LIGHT_GRAY]{0}
|
||||||
|
bestwave = [LIGHT_GRAY]최고 점수 : {0}
|
||||||
launch = < 출격 >
|
launch = < 출격 >
|
||||||
launch.title = 출격 성공
|
launch.title = 출격 성공
|
||||||
launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다.
|
launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다.
|
||||||
launch.unable2 = [scarlet]출격할 수 없습니다.[]
|
launch.unable2 = [scarlet]출격할 수 없습니다.[]
|
||||||
launch.confirm = 출격하게 되면 모든 자원이 코어로 들어갑니다.\n또한 성공하기 전까지 기지로 돌아갈 수 없습니다.
|
launch.confirm = 출격하게 되면 코어에 저장된 모든 자원이 창고로 들어갑니다.\n또한 출격한 지역에는 아무것도 남지 않습니다.
|
||||||
launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 단계까지 기다려야 합니다.
|
launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 단계까지 기다려야 합니다.
|
||||||
uncover = 구역 개방
|
uncover = 지역 개방
|
||||||
configure = 코어 시작자원 설정
|
configure = 코어 시작자원 설정
|
||||||
configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다.
|
bannedblocks = 금지된 블럭들
|
||||||
|
addall = 모두 추가
|
||||||
|
configure.locked = 단계를 지역 {0}에서 달성할 시 시작자원 설정이 해금됩니다.
|
||||||
configure.invalid = 해당 0 과 {0} 사이여야 합니다.
|
configure.invalid = 해당 0 과 {0} 사이여야 합니다.
|
||||||
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
||||||
zone.requirement.complete = 단계 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
zone.requirement.complete = 단계 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
||||||
zone.config.complete = 단계 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
zone.config.complete = 단계 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
||||||
zone.resources = 자원이 감지되었습니다 :
|
zone.resources = 감지된 자원 목록 :
|
||||||
zone.objective = [lightgray]게임 모드: [accent]{0}
|
zone.objective = [lightgray]게임 모드 : [accent]{0}
|
||||||
zone.objective.survival = 생존
|
zone.objective.survival = 생존
|
||||||
zone.objective.attack = 적 코어 파괴
|
zone.objective.attack = 적 코어 파괴
|
||||||
add = 추가...
|
add = 추가...
|
||||||
boss.health = 보스 체력
|
boss.health = 보스 체력
|
||||||
|
|
||||||
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
||||||
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
||||||
error.invalidaddress = 잘못된 주소입니다.
|
error.invalidaddress = 잘못된 주소입니다.
|
||||||
@@ -389,6 +429,7 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다!
|
|||||||
error.io = 네트워크 I/O 오류.
|
error.io = 네트워크 I/O 오류.
|
||||||
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 = 크레이터
|
||||||
@@ -403,6 +444,7 @@ zone.saltFlats.name = 소금 사막
|
|||||||
zone.impact0078.name = Impact 0078
|
zone.impact0078.name = Impact 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전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
||||||
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
||||||
@@ -417,6 +459,7 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를
|
|||||||
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
||||||
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||||
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||||
|
|
||||||
settings.language = 언어
|
settings.language = 언어
|
||||||
settings.data = 게임 데이터
|
settings.data = 게임 데이터
|
||||||
settings.reset = 설정 초기화
|
settings.reset = 설정 초기화
|
||||||
@@ -471,20 +514,22 @@ blocks.inaccuracy = 오차각
|
|||||||
blocks.shots = 발포 횟수
|
blocks.shots = 발포 횟수
|
||||||
blocks.reload = 재장전
|
blocks.reload = 재장전
|
||||||
blocks.ammo = 탄약
|
blocks.ammo = 탄약
|
||||||
|
|
||||||
bar.drilltierreq = 더 좋은 드릴이 요구됨
|
bar.drilltierreq = 더 좋은 드릴이 요구됨
|
||||||
bar.drillspeed = 채광 속도 : {0}/s
|
bar.drillspeed = 채광 속도 : {0}/s
|
||||||
bar.efficiency = 효율성 : {0}%
|
bar.efficiency = 효율성 : {0}%
|
||||||
bar.powerbalance = 전력 : {0}/s
|
bar.powerbalance = 전력 : {0}/s
|
||||||
bar.powerstored = 에너지 저장량 : {0}/{1}
|
bar.powerstored = 총 전력 저장량 : {0}/{1}
|
||||||
bar.poweramount = 전력 저장량 : {0}
|
bar.poweramount = 전력 저장량 : {0}
|
||||||
bar.poweroutput = 전력 생산량 : {0}/s
|
bar.poweroutput = 전력 생산량 : {0}/s
|
||||||
bar.items = 최대 120개중 {0}개 중
|
bar.items = 자원량 : {0}
|
||||||
bar.capacity = 저장공간 : {0}
|
bar.capacity = 저장공간 : {0}
|
||||||
bar.liquid = 액체
|
bar.liquid = 액체
|
||||||
bar.heat = 발열
|
bar.heat = 발열
|
||||||
bar.power = 전력
|
bar.power = 전력
|
||||||
bar.progress = 생산 진행도
|
bar.progress = 생산 진행도
|
||||||
bar.spawned = 최대 {1}기 중 {0}기 생산됨
|
bar.spawned = 최대 {1}기 중 {0}기 생산됨
|
||||||
|
|
||||||
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]방화
|
||||||
@@ -496,6 +541,7 @@ bullet.freezing = [stat]동결
|
|||||||
bullet.tarred = [stat]타르
|
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 = 액체/초
|
||||||
@@ -557,8 +603,9 @@ setting.crashreport.name = 오류 보고서 보내기
|
|||||||
setting.savecreate.name = 자동 저장 활성화
|
setting.savecreate.name = 자동 저장 활성화
|
||||||
setting.publichost.name = 공용 서버 보이기
|
setting.publichost.name = 공용 서버 보이기
|
||||||
setting.chatopacity.name = 채팅 투명도
|
setting.chatopacity.name = 채팅 투명도
|
||||||
setting.playerchat.name = 인게임 채팅 표시
|
setting.playerchat.name = 채팅 말풍선 표시
|
||||||
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
public.confirm = 게임을 공개하시겠습니까?\n[lightgray]설정 - 게임 - 게임 서버 공개에서 다시 설정하실 수 있습니다.
|
||||||
|
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet][accent] {0}[]초 후에 예전 설정으로 되돌리고 게임을 종료합니다...
|
||||||
uiscale.cancel = 취소 & 나가기
|
uiscale.cancel = 취소 & 나가기
|
||||||
setting.bloom.name = 발광 효과
|
setting.bloom.name = 발광 효과
|
||||||
keybind.title = 조작키 설정
|
keybind.title = 조작키 설정
|
||||||
@@ -593,22 +640,25 @@ 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.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 = 다음 채팅기록
|
||||||
keybind.chat_scroll.name = 채팅 스크롤
|
keybind.chat_scroll.name = 채팅 스크롤
|
||||||
keybind.drop_unit.name = 유닛 드롭
|
keybind.drop_unit.name = 유닛 처치시 자원획득
|
||||||
keybind.zoom_minimap.name = 미니맵 확대
|
keybind.zoom_minimap.name = 미니맵 확대
|
||||||
mode.help.title = 모드 도움말
|
mode.help.title = 게임모드 도움말
|
||||||
mode.survival.name = 생존
|
mode.survival.name = 생존
|
||||||
mode.survival.description = 이것은 일반 모드입니다. 제한된 자원을 가지고 자동으로 다음 단계가 시작됩니다.
|
mode.survival.description = 이것은 일반 모드입니다. 제한된 자원을 가지고 자동으로 다음 단계가 시작됩니다.
|
||||||
mode.sandbox.name = 샌드박스
|
mode.sandbox.name = 샌드박스
|
||||||
mode.sandbox.description = 무한한 자원을 가지고 자유롭게 다음 단계를 시작할 수 있습니다.
|
mode.sandbox.description = 무한한 자원을 가지고 자유롭게 다음 단계를 시작할 수 있습니다.
|
||||||
|
mode.editor.name = 편집기
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다.
|
mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다.
|
||||||
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 = 웨이브
|
||||||
@@ -635,6 +685,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 = 유닛
|
||||||
@@ -696,6 +747,7 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도: {0}%
|
|||||||
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
||||||
|
|
||||||
block.sand-boulder.name = 사암
|
block.sand-boulder.name = 사암
|
||||||
block.grass.name = 잔디
|
block.grass.name = 잔디
|
||||||
block.salt.name = 소금
|
block.salt.name = 소금
|
||||||
@@ -926,6 +978,7 @@ tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[acc
|
|||||||
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
||||||
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
||||||
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
||||||
|
|
||||||
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
||||||
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
||||||
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]액체를 활용하기 위한 필수품입니다.
|
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]액체를 활용하기 위한 필수품입니다.
|
||||||
@@ -1033,7 +1086,7 @@ block.combustion-generator.description = 인화성 물질을 태워 소량의
|
|||||||
block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다.
|
block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다.
|
||||||
block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]일반 타일에서 물추출기 1개로 2개가 가동가능합니다.
|
block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]일반 타일에서 물추출기 1개로 2개가 가동가능합니다.
|
||||||
block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다.
|
block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다.
|
||||||
block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다.
|
block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 메타를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다.
|
||||||
block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다.
|
block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다.
|
||||||
block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다.
|
block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다.
|
||||||
block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다.
|
block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] -
|
||||||
credits = Credits
|
credits = Credits
|
||||||
contributors = Vertalers en Medewerkers
|
contributors = Vertalers en Medewerkers
|
||||||
discord = Word lid van de Mindustry Discord!
|
discord = Word lid van de Mindustry Discord!
|
||||||
link.discord.description = De officiële Mindustry discord chatroom
|
link.discord.description = De officiële Mindustry discord chatroom
|
||||||
link.github.description = Game broncode
|
link.github.description = Game broncode
|
||||||
link.changelog.description = List of update changes
|
link.changelog.description = Lijst van Updates
|
||||||
link.dev-builds.description = Onstabiele ontwikkeling builds
|
link.dev-builds.description = Onstabiele ontwikkeling builds
|
||||||
link.trello.description = Officiële trello-bord voor geplande functies
|
link.trello.description = Officiële trello-bord voor geplande functies
|
||||||
link.itch.io.description = itch.io pagina met pc-downloads en webversie
|
link.itch.io.description = itch.io pagina met pc-downloads en webversie
|
||||||
@@ -12,15 +12,15 @@ link.google-play.description = Google Play store vermelding
|
|||||||
link.wiki.description = Officiële Mindustry wiki
|
link.wiki.description = Officiële Mindustry wiki
|
||||||
linkfail = Kan link niet openen!\nDe URL is gekopieerd naar je klembord
|
linkfail = Kan link niet openen!\nDe URL is gekopieerd naar je klembord
|
||||||
screenshot = Schermafbeeling opgeslagen in {0}
|
screenshot = Schermafbeeling opgeslagen in {0}
|
||||||
screenshot.invalid = Map too large, potentially not enough memory for screenshot.
|
screenshot.invalid = Map is te groot, Mogelijk niet genoeg ruimte op apparaat.
|
||||||
gameover = Game Over
|
gameover = Spel afgelopen
|
||||||
gameover.pvp = het[accent] {0}[] team heeft gewonnen!
|
gameover.pvp = het[accent] {0}[] team heeft gewonnen!
|
||||||
highscore = [accent]Nieuw topscore!
|
highscore = [accent]Nieuw topscore!
|
||||||
load.sound = Sounds
|
load.sound = Geluid
|
||||||
load.map = Maps
|
load.map = Mappen
|
||||||
load.image = Images
|
load.image = Afbeeldingen
|
||||||
load.content = Content
|
load.content = inhoud
|
||||||
load.system = System
|
load.system = Systeem
|
||||||
stat.wave = Waves Verslagen:[accent] {0}
|
stat.wave = Waves Verslagen:[accent] {0}
|
||||||
stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0}
|
stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0}
|
||||||
stat.built = Gebouwen Gebouwd:[accent] {0}
|
stat.built = Gebouwen Gebouwd:[accent] {0}
|
||||||
@@ -28,69 +28,58 @@ stat.destroyed = Gebouwen Vernietigd:[accent] {0}
|
|||||||
stat.deconstructed = Gebouwen Gesloopt:[accent] {0}
|
stat.deconstructed = Gebouwen Gesloopt:[accent] {0}
|
||||||
stat.delivered = Middelen Gelanceerd:
|
stat.delivered = Middelen Gelanceerd:
|
||||||
stat.rank = Eindrang: [accent]{0}
|
stat.rank = Eindrang: [accent]{0}
|
||||||
launcheditems = [accent]Launched Items
|
launcheditems = [accent]Gelanceerde items
|
||||||
map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"?
|
map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"?
|
||||||
level.highscore = Topscore: [accent]{0}
|
level.highscore = Topscore: [accent]{0}
|
||||||
level.select = Selecteer Level
|
level.select = Selecteer Level
|
||||||
level.mode = Spelmodus:
|
level.mode = Spelmodus:
|
||||||
showagain = Don't show again next session
|
showagain = Niet Laten zien in de volgende sessie
|
||||||
coreattack = < Core is under attack! >
|
coreattack = < Core wordt aangevallen! >
|
||||||
nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent
|
nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent
|
||||||
database = Core Database
|
database = Core Database
|
||||||
savegame = Save Game
|
savegame = Opslaan
|
||||||
loadgame = Load Game
|
loadgame = Laden
|
||||||
joingame = Join Game
|
joingame = Treed toe
|
||||||
addplayers = Add/Remove Players
|
addplayers = Add/Remove Players
|
||||||
customgame = Custom Game
|
customgame = Aangepast spel
|
||||||
newgame = New Game
|
newgame = Nieuw spel
|
||||||
none = <none>
|
none = <none>
|
||||||
minimap = Minimap
|
minimap = Minimap
|
||||||
close = Close
|
close = Aflsuiten
|
||||||
website = Website
|
website = Website
|
||||||
quit = Quit
|
quit = Stoppen
|
||||||
save.quit = Save & Quit
|
maps = Mappen
|
||||||
maps = Maps
|
continue = Ga door
|
||||||
maps.browse = Browse Maps
|
maps.none = [LIGHT_GRAY]Geen map gevonden!
|
||||||
continue = Continue
|
about.button = Over
|
||||||
maps.none = [LIGHT_GRAY]No maps found!
|
name = Naam:
|
||||||
invalid = Invalid
|
noname = Maak eerst een[accent] Speler naam[].
|
||||||
preparingconfig = Preparing Config
|
filename = Bestandsnaam:
|
||||||
preparingcontent = Preparing Content
|
|
||||||
uploadingcontent = Uploading Content
|
|
||||||
uploadingpreviewfile = Uploading Preview File
|
|
||||||
committingchanges = Comitting Changes
|
|
||||||
done = Done
|
|
||||||
about.button = About
|
|
||||||
name = Name:
|
|
||||||
noname = Pick a[accent] player name[] first.
|
|
||||||
filename = File Name:
|
|
||||||
unlocked = New content unlocked!
|
unlocked = New content unlocked!
|
||||||
completed = [accent]Completed
|
completed = [accent]Voltooid
|
||||||
techtree = Tech Tree
|
techtree = Tech boom
|
||||||
research.list = [LIGHT_GRAY]Research:
|
research.list = [LIGHT_GRAY]Onderzoek:
|
||||||
research = Research
|
research = Onderzoek
|
||||||
researched = [LIGHT_GRAY]{0} researched.
|
researched = [LIGHT_GRAY]{0} Onderzocht.
|
||||||
players = {0} players online
|
players = {0} Spelers online
|
||||||
players.single = {0} player online
|
players.single = {0} Speler online
|
||||||
server.closing = [accent]Closing server...
|
server.closing = [accent]Server aan het sluiten...
|
||||||
server.kicked.kick = You have been kicked from the server!
|
server.kicked.kick = Je bent verwijderd van deze sessie.
|
||||||
server.kicked.whitelist = You are not whitelisted here.
|
server.kicked.serverClose = Server afgesloten...
|
||||||
server.kicked.serverClose = Server closed.
|
server.kicked.vote = Je bent ge vote-kicked. Tot ziens.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.clientOutdated = Verouderde versie! Update jouw spel!
|
||||||
server.kicked.clientOutdated = Outdated client! Update your game!
|
server.kicked.serverOutdated = Verouderde server! Vraag de host om te upgraden!
|
||||||
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
server.kicked.banned = Je bent verbannen van deze server.
|
||||||
server.kicked.banned = You are banned on this server.
|
server.kicked.typeMismatch = Deze server is niet compitabel met jouw bouwtype.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.recentKick = Je bent reeds verwijderd.\nWacht voordat je opnieuw verbindt.
|
||||||
server.kicked.playerLimit = This server is full. Wait for an empty slot.
|
server.kicked.nameInUse = Er is al iemand met die naam\nop deze server.
|
||||||
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
server.kicked.nameEmpty = Je gekozen naam is niet geldig.
|
||||||
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
server.kicked.idInUse = Je bent al verbonden met deze server! Verbinden met 2 accounts is verboden.
|
||||||
server.kicked.nameEmpty = Your chosen name is invalid.
|
server.kicked.customClient = Deze server ondersteunt geen aangepaste spellen . Download de officiele versie.
|
||||||
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
server.kicked.gameover = Spel afgelopen
|
||||||
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
server.versions = Jouw versie:[accent] {0}[]\nServer versie:[accent] {1}[]
|
||||||
server.kicked.gameover = Game over!
|
host.info = De [accent]host[] knop hosts `een server op port [scarlet]6567[]. \nIedereen op hetzelfde [LIGHT_GRAY]wifi or locaal netwerk[] zou jouw server in hun serverlijst moeten zien.\n\nAls je wilt dan vrienden vanaf overal kunnen meedoen via IP, [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Note: IAls iemand moeilijkheden heeft met het meedoen aan jouw spel, kijk of je Mindustry in je firewall instellingen toegang hebt gegeven to jouw locaal netwerk.
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
join.info = Hier kan je een [accent]server IP[] invoeren om te verbinden, of om[accent]locale netwerken[] te vinden.\nBeide LAN en WAN multiplayer is ondersteund.\n\n[LIGHT_GRAY]Note: Er is geen automatische globale serverlijst; Als je met iemands IP wil verbinden, Zou je moeten vragen om hun IP.
|
||||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
|
|
||||||
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
|
||||||
hostserver = Host Game
|
hostserver = Host Game
|
||||||
invitefriends = Invite Friends
|
invitefriends = Invite Friends
|
||||||
hostserver.mobile = Host\nGame
|
hostserver.mobile = Host\nGame
|
||||||
@@ -545,7 +534,6 @@ setting.fullscreen.name = Fullscreen
|
|||||||
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
||||||
setting.fps.name = Show FPS
|
setting.fps.name = Show FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Show Power Lasers
|
|
||||||
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance)
|
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance)
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
@@ -557,6 +545,7 @@ setting.crashreport.name = Send Anonymous Crash Reports
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Fullscreen
|
|||||||
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
||||||
setting.fps.name = Show FPS
|
setting.fps.name = Show FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Show Power Lasers
|
|
||||||
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations)
|
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations)
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Send Anonymous Crash Reports
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ 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.github.description = Kod Gry
|
link.github.description = Kod źródłowy gry
|
||||||
link.changelog.description = Informacje o aktualizacjach
|
link.changelog.description = Informacje o aktualizacjach
|
||||||
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
|
||||||
@@ -13,7 +13,7 @@ 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 do {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 = Rdzeń został zniszczony.
|
gameover = Koniec Gry
|
||||||
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
||||||
highscore = [YELLOW] Nowy rekord!
|
highscore = [YELLOW] Nowy rekord!
|
||||||
load.sound = Dźwięki
|
load.sound = Dźwięki
|
||||||
@@ -21,6 +21,7 @@ load.map = Mapy
|
|||||||
load.image = Obrazy
|
load.image = Obrazy
|
||||||
load.content = Treść
|
load.content = Treść
|
||||||
load.system = System
|
load.system = System
|
||||||
|
load.mod = Mody
|
||||||
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}
|
||||||
@@ -29,38 +30,49 @@ stat.deconstructed = Budynki zrekonstruowane:[accent] {0}
|
|||||||
stat.delivered = Surowce wystrzelone:
|
stat.delivered = Surowce wystrzelone:
|
||||||
stat.rank = Ocena: [accent]{0}
|
stat.rank = Ocena: [accent]{0}
|
||||||
launcheditems = [accent]Wystrzelone przedmioty
|
launcheditems = [accent]Wystrzelone przedmioty
|
||||||
|
launchinfo = [unlaunched][[LAUNCH] rdzeń aby uzyskać przedmioty oznaczone na niebiesko.
|
||||||
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
|
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
|
||||||
level.highscore = Rekord: [accent]{0}
|
level.highscore = Rekord: [accent]{0}
|
||||||
level.select = Wybrany poziom
|
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[] ]\nunicestwienie nadchodzi
|
nearpoint = [[ [scarlet]OPUŚĆ PUNKT ZRZUTU NATYCHMIAST[] ]\nnadciąga zniszczenie
|
||||||
database = Centralna baza danych
|
database = Centralna baza danych
|
||||||
savegame = Zapisz Grę
|
savegame = Zapisz Grę
|
||||||
loadgame = Wczytaj grę
|
loadgame = Wczytaj Grę
|
||||||
joingame = Gra wieloosobowa
|
joingame = Dołącz Do Gry
|
||||||
addplayers = Dodaj/Usuń graczy
|
addplayers = Dodaj/Usuń Graczy
|
||||||
customgame = Własna Gra
|
customgame = Własna Gra
|
||||||
newgame = Nowa Gra
|
newgame = Nowa Gra
|
||||||
none = <none>
|
none = <brak>
|
||||||
minimap = Minimapa
|
minimap = Minimapa
|
||||||
close = Zamknij
|
close = Zamknij
|
||||||
website = Strona Gry
|
website = Strona Gry
|
||||||
quit = Wyjdź
|
quit = Wyjdź
|
||||||
save.quit = Save & Quit
|
save.quit = Zapisz & Wyjdź
|
||||||
maps = Mapy
|
maps = Mapy
|
||||||
maps.browse = Browse Maps
|
maps.browse = Przeglądaj Mapy
|
||||||
continue = Kontynuuj
|
continue = Kontynuuj
|
||||||
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
|
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
|
||||||
invalid = Invalid
|
invalid = Nieprawidłowy
|
||||||
preparingconfig = Preparing Config
|
preparingconfig = Przygotowywanie Konfiguracji
|
||||||
preparingcontent = Preparing Content
|
preparingcontent = Przygotowywanie Zawartości
|
||||||
uploadingcontent = Uploading Content
|
uploadingcontent = Przesyłanie Zawartości
|
||||||
uploadingpreviewfile = Uploading Preview File
|
uploadingpreviewfile = Przesyłanie Pliku Podglądu
|
||||||
committingchanges = Comitting Changes
|
committingchanges = Zatwierdzanie Zmian
|
||||||
done = Done
|
done = Gotowe
|
||||||
about.button = O grze
|
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 = Mody
|
||||||
|
mods.none = [LIGHT_GRAY]Nie znaleziono modów!
|
||||||
|
mod.enabled = [lightgray]Włączony
|
||||||
|
mod.disabled = [scarlet]Wyłączony
|
||||||
|
mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda.
|
||||||
|
mod.import = Importuj Mod
|
||||||
|
mod.remove.confirm = Ten mod zostanie usunięty.
|
||||||
|
mod.author = [LIGHT_GRAY]Autor:[] {0}
|
||||||
|
about.button = O Grze
|
||||||
name = Nazwa:
|
name = Nazwa:
|
||||||
noname = Najpierw wybierz [accent]nazwę gracza[]
|
noname = Najpierw wybierz [accent]nazwę gracza[]
|
||||||
filename = Nazwa Pliku:
|
filename = Nazwa Pliku:
|
||||||
@@ -74,7 +86,7 @@ players = {0} graczy online
|
|||||||
players.single = {0} gracz online
|
players.single = {0} gracz online
|
||||||
server.closing = [accent] Zamykanie serwera...
|
server.closing = [accent] Zamykanie serwera...
|
||||||
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
||||||
server.kicked.whitelist = You are not whitelisted here.
|
server.kicked.whitelist = Nie ma cię tu na białej liście.
|
||||||
server.kicked.serverClose = Serwer został zamknięty.
|
server.kicked.serverClose = Serwer został zamknięty.
|
||||||
server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj.
|
server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj.
|
||||||
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
|
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
|
||||||
@@ -92,17 +104,17 @@ server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {
|
|||||||
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.[]\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.
|
||||||
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]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.
|
||||||
hostserver = Stwórz Serwer
|
hostserver = Stwórz Serwer
|
||||||
invitefriends = Invite Friends
|
invitefriends = Zaproś Znajomych
|
||||||
hostserver.mobile = Hostuj\ngrę
|
hostserver.mobile = Hostuj\nGrę
|
||||||
host = Hostuj
|
host = Hostuj
|
||||||
hosting = [accent] Otwieranie serwera...
|
hosting = [accent] Otwieranie serwera...
|
||||||
hosts.refresh = Odśwież
|
hosts.refresh = Odśwież
|
||||||
hosts.discovering = Wyszukiwanie gier w sieci LAN
|
hosts.discovering = Wyszukiwanie gier w sieci LAN
|
||||||
hosts.discovering.any = Discovering games
|
hosts.discovering.any = Wyszukiwanie gier
|
||||||
server.refreshing = Odświeżanie serwera
|
server.refreshing = Odświeżanie serwera
|
||||||
hosts.none = [lightgray] Brak serwerów w sieci LAN!
|
hosts.none = [lightgray] Brak serwerów w sieci LAN!
|
||||||
host.invalid = [scarlet] Nie można połączyć się z hostem.
|
host.invalid = [scarlet] Nie można połączyć się z hostem.
|
||||||
trace = Zlokalizuj gracza
|
trace = Zlokalizuj Gracza
|
||||||
trace.playername = Nazwa gracza: [accent]{0}
|
trace.playername = Nazwa gracza: [accent]{0}
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = IP: [accent]{0}
|
||||||
trace.id = Wyjątkowe ID: [accent]{0}
|
trace.id = Wyjątkowe ID: [accent]{0}
|
||||||
@@ -113,16 +125,16 @@ server.bans = Bany
|
|||||||
server.bans.none = Nie znaleziono zbanowanych osób!
|
server.bans.none = Nie znaleziono zbanowanych osób!
|
||||||
server.admins = Admini
|
server.admins = Admini
|
||||||
server.admins.none = Nie znaleziono adminów!
|
server.admins.none = Nie znaleziono adminów!
|
||||||
server.add = Dodaj serwer
|
server.add = Dodaj Serwer
|
||||||
server.delete = Czy na pewno chcesz usunąć ten serwer?
|
server.delete = Czy na pewno chcesz usunąć ten serwer?
|
||||||
server.edit = Edytuj serwer
|
server.edit = Edytuj Serwer
|
||||||
server.outdated = [crimson]Przestarzały serwer![]
|
server.outdated = [crimson]Przestarzały serwer![]
|
||||||
server.outdated.client = [crimson]Przestarzały klient![]
|
server.outdated.client = [crimson]Przestarzały klient![]
|
||||||
server.version = [lightgray]Wersja: {0}
|
server.version = [lightgray]Wersja: {0}
|
||||||
server.custombuild = [yellow]Zmodowany klient
|
server.custombuild = [yellow]Zmodowany klient
|
||||||
confirmban = Jesteś pewny, że chcesz zbanować tego gracza?
|
confirmban = Jesteś pewny, że chcesz zbanować tego gracza?
|
||||||
confirmkick = Jesteś pewny, że chcesz wyrzucić tego gracza?
|
confirmkick = Jesteś pewny, że chcesz wyrzucić tego gracza?
|
||||||
confirmvotekick = Are you sure you want to vote-kick this player?
|
confirmvotekick = Jesteś pewny, że chcesz głosować za wyrzuceniem tego gracza?
|
||||||
confirmunban = Jesteś pewny, że chcesz odbanować tego gracza?
|
confirmunban = Jesteś pewny, że chcesz odbanować tego gracza?
|
||||||
confirmadmin = Jesteś pewny, że chcesz dać rangę admina temu graczowi?
|
confirmadmin = Jesteś pewny, że chcesz dać rangę admina temu graczowi?
|
||||||
confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina temu graczowi?
|
confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina temu graczowi?
|
||||||
@@ -133,7 +145,7 @@ disconnect.error = Błąd połączenia.
|
|||||||
disconnect.closed = Połączenie zostało zamknięte.
|
disconnect.closed = Połączenie zostało zamknięte.
|
||||||
disconnect.timeout = Przekroczono limit czasu.
|
disconnect.timeout = Przekroczono limit czasu.
|
||||||
disconnect.data = Nie udało się załadować mapy!
|
disconnect.data = Nie udało się załadować mapy!
|
||||||
cantconnect = Unable to join game ([accent]{0}[]).
|
cantconnect = Nie można dołączyć do gry ([accent]{0}[]).
|
||||||
connecting = [accent]Łączenie...
|
connecting = [accent]Łączenie...
|
||||||
connecting.data = [accent]Ładowanie danych świata...
|
connecting.data = [accent]Ładowanie danych świata...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
@@ -153,13 +165,13 @@ save.export = Eksportuj
|
|||||||
save.import.invalid = [accent]Zapis gry jest niepoprawny!
|
save.import.invalid = [accent]Zapis gry jest niepoprawny!
|
||||||
save.import.fail = [crimson]Nie udało się zaimportować zapisu: [accent] {0}
|
save.import.fail = [crimson]Nie udało się zaimportować zapisu: [accent] {0}
|
||||||
save.export.fail = [crimson]Nie można wyeksportować zapisu: [accent] {0}
|
save.export.fail = [crimson]Nie można wyeksportować zapisu: [accent] {0}
|
||||||
save.import = Importuj zapis
|
save.import = Importuj Zapis
|
||||||
save.newslot = Zapisz nazwę:
|
save.newslot = Zapisz nazwę:
|
||||||
save.rename = Zmień nazwę
|
save.rename = Zmień Nazwę
|
||||||
save.rename.text = Nowa nazwa:
|
save.rename.text = Nowa nazwa:
|
||||||
selectslot = Wybierz zapis.
|
selectslot = Wybierz zapis.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
editmessage = Edit Message
|
editmessage = Edytuj Wiadomość
|
||||||
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej jest to zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
|
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej jest to zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
|
||||||
empty = <pusto>
|
empty = <pusto>
|
||||||
on = Włączone
|
on = Włączone
|
||||||
@@ -167,26 +179,26 @@ off = Wyłączone
|
|||||||
save.autosave = Autozapis: {0}
|
save.autosave = Autozapis: {0}
|
||||||
save.map = Mapa: {0}
|
save.map = Mapa: {0}
|
||||||
save.wave = Fala {0}
|
save.wave = Fala {0}
|
||||||
save.mode = Gamemode: {0}
|
save.mode = Tryb Gry: {0}
|
||||||
save.date = Ostatnio zapisano: {0}
|
save.date = Ostatnio Zapisane: {0}
|
||||||
save.playtime = Czas gry: {0}
|
save.playtime = Czas gry: {0}
|
||||||
warning = Uwaga.
|
warning = Uwaga.
|
||||||
confirm = Potwierdź
|
confirm = Potwierdź
|
||||||
delete = Usuń
|
delete = Usuń
|
||||||
view.workshop = View In Workshop
|
view.workshop = Pokaż w Warsztacie
|
||||||
ok = Ok
|
ok = OK
|
||||||
open = Otwórz
|
open = Otwórz
|
||||||
customize = Dostosuj
|
customize = Dostosuj
|
||||||
cancel = Anuluj
|
cancel = Anuluj
|
||||||
openlink = Otwórz link
|
openlink = Otwórz Link
|
||||||
copylink = Kopiuj link
|
copylink = Kopiuj Link
|
||||||
back = Wróć
|
back = Wróć
|
||||||
data.export = Eksportuj Dane
|
data.export = Eksportuj Dane
|
||||||
data.import = Importuj Dane
|
data.import = Importuj Dane
|
||||||
data.exported = Dane wyeksportowane.
|
data.exported = Dane wyeksportowane.
|
||||||
data.invalid = Nieprawidłowe dane gry.
|
data.invalid = Nieprawidłowe dane gry.
|
||||||
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
|
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
|
||||||
classic.export = Eksportuj dane wersji klasycznej
|
classic.export = Eksportuj Dane Wersji Klasycznej
|
||||||
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nClassic (v3.5 build 40) zapis albo mapa zostały wykryte. Czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic?
|
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nClassic (v3.5 build 40) zapis albo mapa zostały wykryte. Czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic?
|
||||||
quit.confirm = Czy na pewno chcesz wyjść?
|
quit.confirm = Czy na pewno chcesz wyjść?
|
||||||
quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[]
|
quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[]
|
||||||
@@ -199,37 +211,40 @@ waiting = [LIGHT_GRAY]Oczekiwanie...
|
|||||||
waiting.players = Oczekiwanie na graczy...
|
waiting.players = Oczekiwanie na graczy...
|
||||||
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
|
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
|
||||||
wave.enemy = Pozostał [LIGHT_GRAY]{0} wróg
|
wave.enemy = Pozostał [LIGHT_GRAY]{0} wróg
|
||||||
loadimage = Załaduj obraz
|
loadimage = Załaduj Obraz
|
||||||
saveimage = Zapisz obraz
|
saveimage = Zapisz Obraz
|
||||||
unknown = Nieznane
|
unknown = Nieznane
|
||||||
custom = Własne
|
custom = Własne
|
||||||
builtin = Wbudowane
|
builtin = Wbudowane
|
||||||
map.delete.confirm = Jesteś pewny, że chcesz usunąć tę mapę? Nie będzie można jej przywrócić.
|
map.delete.confirm = Jesteś pewny, że chcesz usunąć tę mapę? Nie będzie można jej przywrócić.
|
||||||
map.random = [accent]Losowa mapa
|
map.random = [accent]Losowa Mapa
|
||||||
map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdzeń do tej mapy w edytorze.
|
map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdzeń do tej 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.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.
|
||||||
map.publish.error = Błąd podczas publikowania mapy: {0}
|
map.publish.error = Błąd podczas publikowania mapy: {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.update = Aktualizuj Mapę
|
||||||
|
map.load.error = Błąd podczaj pobierania danych z warsztatu: {0}
|
||||||
|
map.menu = Wybierz co chcesz zrobić z tą mapą.
|
||||||
|
map.changelog = Lista Zmian (opcjonalna)
|
||||||
eula = Steam EULA
|
eula = Steam EULA
|
||||||
map.publish = Opublikowano mapę.
|
map.publish = Opublikowano mapę.
|
||||||
map.publishing = [accent]Publikowanie mapy...
|
map.publishing = [accent]Publikowanie mapy...
|
||||||
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łóż
|
||||||
editor.oregen.info = Generacja złóż:
|
editor.oregen.info = Generacja Złóż:
|
||||||
editor.mapinfo = Informacje o mapie
|
editor.mapinfo = Informacje o Mapie
|
||||||
editor.author = Autor:
|
editor.author = Autor:
|
||||||
editor.description = Opis:
|
editor.description = Opis:
|
||||||
editor.nodescription = A map must have a description of at least 4 characters before being published.
|
editor.nodescription = Mapa musi posiadać opis o długości co najmniej 4 znaków zanim zostanie opublikowana.
|
||||||
editor.waves = Fale:
|
editor.waves = Fale:
|
||||||
editor.rules = Zasady:
|
editor.rules = Zasady:
|
||||||
editor.generation = Generacja:
|
editor.generation = Generacja:
|
||||||
editor.ingame = Edytuj w grze
|
editor.ingame = Edytuj w Grze
|
||||||
editor.publish.workshop = Opublikuj w Workshop
|
editor.publish.workshop = Opublikuj w Warsztacie
|
||||||
editor.newmap = Nowa Mapa
|
editor.newmap = Nowa Mapa
|
||||||
workshop = Workshop
|
workshop = Warsztat
|
||||||
waves.title = Fale
|
waves.title = Fale
|
||||||
waves.remove = Usuń
|
waves.remove = Usuń
|
||||||
waves.never = <nigdy>
|
waves.never = <nigdy>
|
||||||
@@ -240,8 +255,8 @@ waves.to = do
|
|||||||
waves.boss = Boss
|
waves.boss = Boss
|
||||||
waves.preview = Podgląd
|
waves.preview = Podgląd
|
||||||
waves.edit = Edytuj...
|
waves.edit = Edytuj...
|
||||||
waves.copy = Kopiuj do schowka
|
waves.copy = Kopiuj Do Schowka
|
||||||
waves.load = Załaduj ze schowka
|
waves.load = Załaduj Ze Schowka
|
||||||
waves.invalid = Nieprawidłowe fale w schowku.
|
waves.invalid = Nieprawidłowe fale w schowku.
|
||||||
waves.copied = Fale zostały skopiowane.
|
waves.copied = Fale zostały skopiowane.
|
||||||
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
||||||
@@ -249,8 +264,8 @@ editor.default = [LIGHT_GRAY]<Domyślne>
|
|||||||
details = Detale...
|
details = Detale...
|
||||||
edit = Edytuj...
|
edit = Edytuj...
|
||||||
editor.name = Nazwa:
|
editor.name = Nazwa:
|
||||||
editor.spawn = Stwórz jednostkę
|
editor.spawn = Stwórz Jednostkę
|
||||||
editor.removeunit = Usuń jednostkę
|
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}
|
||||||
@@ -263,9 +278,9 @@ editor.update = Aktualizuj
|
|||||||
editor.randomize = Losuj
|
editor.randomize = Losuj
|
||||||
editor.apply = Zastosuj
|
editor.apply = Zastosuj
|
||||||
editor.generate = Generuj
|
editor.generate = Generuj
|
||||||
editor.resize = Zmień rozmiar
|
editor.resize = Zmień Rozmiar
|
||||||
editor.loadmap = Załaduj mapę
|
editor.loadmap = Załaduj Mapę
|
||||||
editor.savemap = Zapisz mapę
|
editor.savemap = Zapisz Mapę
|
||||||
editor.saved = Zapisano!
|
editor.saved = Zapisano!
|
||||||
editor.save.noname = Twoja mapa nie ma nazwy! Ustaw ją w 'Informacjach o mapie'.
|
editor.save.noname = Twoja mapa nie ma nazwy! Ustaw ją w 'Informacjach o mapie'.
|
||||||
editor.save.overwrite = Ta mapa nadpisze wbudowaną mapę! Ustaw inną nazwę w 'Informacjach o mapie'.
|
editor.save.overwrite = Ta mapa nadpisze wbudowaną mapę! Ustaw inną nazwę w 'Informacjach o mapie'.
|
||||||
@@ -278,22 +293,22 @@ editor.importfile.description = Importuj zewnętrzny plik mapy
|
|||||||
editor.importimage = Importuj Obraz Terenu
|
editor.importimage = Importuj Obraz Terenu
|
||||||
editor.importimage.description = Importuj zewnętrzny obraz terenu
|
editor.importimage.description = Importuj zewnętrzny obraz terenu
|
||||||
editor.export = Eksportuj...
|
editor.export = Eksportuj...
|
||||||
editor.exportfile = Eksportuj plik
|
editor.exportfile = Eksportuj Plik
|
||||||
editor.exportfile.description = Eksportuj plik mapy
|
editor.exportfile.description = Eksportuj plik mapy
|
||||||
editor.exportimage = Eksportuj Obraz Terenu
|
editor.exportimage = Eksportuj Obraz Terenu
|
||||||
editor.exportimage.description = Eksportuj plik obrazu terenu
|
editor.exportimage.description = Eksportuj plik obrazu terenu
|
||||||
editor.loadimage = Załaduj obraz
|
editor.loadimage = Załaduj Teren
|
||||||
editor.saveimage = Zapisz obraz
|
editor.saveimage = Zapisz Teren
|
||||||
editor.unsaved = [scarlet]Masz niezapisane zmiany![]\nCzy na pewno chcesz wyjść?
|
editor.unsaved = [scarlet]Masz niezapisane zmiany![]\nCzy na pewno chcesz wyjść?
|
||||||
editor.resizemap = Zmień rozmiar mapy
|
editor.resizemap = Zmień Rozmiar Mapy
|
||||||
editor.mapname = Nazwa mapy:
|
editor.mapname = Nazwa Mapy:
|
||||||
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
|
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
|
||||||
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
|
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa o tej nazwie już istnieje. Jesteś pewny, że chcesz ją nadpisać?
|
||||||
editor.exists = A map with this name already exists.
|
editor.exists = Mapa o tej nazwie już istnieje.
|
||||||
editor.selectmap = Wybierz mapę do załadowania:
|
editor.selectmap = Wybierz mapę do załadowania:
|
||||||
toolmode.replace = Zastąp
|
toolmode.replace = Zastąp
|
||||||
toolmode.replace.description = Rysuje tylko na stałych blokach.
|
toolmode.replace.description = Rysuje tylko na stałych blokach.
|
||||||
toolmode.replaceall = Zastąp wszystko
|
toolmode.replaceall = Zastąp Wszystko
|
||||||
toolmode.replaceall.description = Zastąp wszystkie bloki na mapie.
|
toolmode.replaceall.description = Zastąp wszystkie bloki na mapie.
|
||||||
toolmode.orthogonal = Prostokątny
|
toolmode.orthogonal = Prostokątny
|
||||||
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
|
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
|
||||||
@@ -305,15 +320,15 @@ toolmode.fillteams = Wypełń 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.
|
||||||
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
|
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
|
||||||
filter.distort = Zniekształcanie
|
filter.distort = Zniekształcanie
|
||||||
filter.noise = Szum
|
filter.noise = Szum
|
||||||
filter.median = Mediana
|
filter.median = Mediana
|
||||||
filter.oremedian = Mediana rud
|
filter.oremedian = Mediana Rud
|
||||||
filter.blend = Wtopienie
|
filter.blend = Wtopienie
|
||||||
filter.defaultores = Domyślne rudy
|
filter.defaultores = Domyślne Rudy
|
||||||
filter.ore = Ruda
|
filter.ore = Ruda
|
||||||
filter.rivernoise = Szum rzeki
|
filter.rivernoise = Szum Rzeki
|
||||||
filter.mirror = Lustro
|
filter.mirror = Lustro
|
||||||
filter.clear = Oczyść
|
filter.clear = Oczyść
|
||||||
filter.option.ignore = Ignoruj
|
filter.option.ignore = Ignoruj
|
||||||
@@ -323,7 +338,7 @@ filter.option.scale = Skala
|
|||||||
filter.option.chance = Szansa
|
filter.option.chance = Szansa
|
||||||
filter.option.mag = Wielkość
|
filter.option.mag = Wielkość
|
||||||
filter.option.threshold = Próg
|
filter.option.threshold = Próg
|
||||||
filter.option.circle-scale = Skala koła
|
filter.option.circle-scale = Skala Koła
|
||||||
filter.option.octaves = Oktawy
|
filter.option.octaves = Oktawy
|
||||||
filter.option.falloff = Spadek
|
filter.option.falloff = Spadek
|
||||||
filter.option.angle = Kąt
|
filter.option.angle = Kąt
|
||||||
@@ -332,8 +347,8 @@ filter.option.floor = Podłoga
|
|||||||
filter.option.flooronto = Podłoga Docelowa
|
filter.option.flooronto = Podłoga Docelowa
|
||||||
filter.option.wall = Ściana
|
filter.option.wall = Ściana
|
||||||
filter.option.ore = Ruda
|
filter.option.ore = Ruda
|
||||||
filter.option.floor2 = Druga podłoga
|
filter.option.floor2 = Druga Podłoga
|
||||||
filter.option.threshold2 = Drugi próg
|
filter.option.threshold2 = Drugi Próg
|
||||||
filter.option.radius = Zasięg
|
filter.option.radius = Zasięg
|
||||||
filter.option.percentile = Percentyl
|
filter.option.percentile = Percentyl
|
||||||
width = Szerokość:
|
width = Szerokość:
|
||||||
@@ -351,8 +366,8 @@ settings = Ustawienia
|
|||||||
tutorial = Poradnik
|
tutorial = Poradnik
|
||||||
tutorial.retake = Ponów Samouczek
|
tutorial.retake = Ponów Samouczek
|
||||||
editor = Edytor
|
editor = Edytor
|
||||||
mapeditor = Edytor map
|
mapeditor = Edytor Map
|
||||||
donate = Wspomóż nas
|
donate = Wspomóż Nas
|
||||||
abandon = Opuść
|
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
|
||||||
@@ -367,7 +382,7 @@ launch.unable2 = [scarlet]WYSTZRZELENIE niedostępne.[]
|
|||||||
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
|
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
|
||||||
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
|
||||||
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.
|
||||||
@@ -404,7 +419,7 @@ zone.impact0078.name = Uderzenie 0078
|
|||||||
zone.crags.name = Urwisko
|
zone.crags.name = Urwisko
|
||||||
zone.fungalPass.name = Grzybowa Przełęcz
|
zone.fungalPass.name = Grzybowa Przełęcz
|
||||||
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
|
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
|
||||||
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
|
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
|
||||||
zone.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne.
|
zone.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne.
|
||||||
zone.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze.
|
zone.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze.
|
||||||
zone.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić
|
zone.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić
|
||||||
@@ -419,20 +434,20 @@ zone.impact0078.description = <insert description here>
|
|||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Język
|
settings.language = Język
|
||||||
settings.data = Dane Gry
|
settings.data = Dane Gry
|
||||||
settings.reset = Przywróć domyślne
|
settings.reset = Przywróć Domyślne
|
||||||
settings.rebind = Zmień
|
settings.rebind = Zmień
|
||||||
settings.controls = Sterowanie
|
settings.controls = Sterowanie
|
||||||
settings.game = Gra
|
settings.game = Gra
|
||||||
settings.sound = Dźwięk
|
settings.sound = Dźwięk
|
||||||
settings.graphics = Grafika
|
settings.graphics = Grafika
|
||||||
settings.cleardata = Wyczyść dane gry...
|
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ę.
|
||||||
settings.clearunlocks = Wyczyść listę przedmiotów
|
settings.clearunlocks = Wyczyść Listę Przedmiotów
|
||||||
settings.clearall = Wyczyść wszystko
|
settings.clearall = Wyczyść Wszystko
|
||||||
paused = [accent]< Wstrzymano >
|
paused = [accent]< Wstrzymano >
|
||||||
yes = Jasne!
|
yes = Tak
|
||||||
no = Nie ma mowy!
|
no = Nie
|
||||||
info.title = Informacje
|
info.title = Informacje
|
||||||
error.title = [crimson]Wystąpił błąd
|
error.title = [crimson]Wystąpił błąd
|
||||||
error.crashtitle = Wystąpił błąd
|
error.crashtitle = Wystąpił błąd
|
||||||
@@ -475,7 +490,7 @@ bar.drilltierreq = Wymagane Lepsze Wiertło
|
|||||||
bar.drillspeed = Prędkość wiertła: {0}/s
|
bar.drillspeed = Prędkość wiertła: {0}/s
|
||||||
bar.efficiency = Efektywność: {0}%
|
bar.efficiency = Efektywność: {0}%
|
||||||
bar.powerbalance = Moc: {0}
|
bar.powerbalance = Moc: {0}
|
||||||
bar.powerstored = Stored: {0}/{1}
|
bar.powerstored = Zmagazynowano: {0}/{1}
|
||||||
bar.poweramount = Moc: {0}
|
bar.poweramount = Moc: {0}
|
||||||
bar.poweroutput = Wyjście mocy: {0}
|
bar.poweroutput = Wyjście mocy: {0}
|
||||||
bar.items = Przedmiotów: {0}
|
bar.items = Przedmiotów: {0}
|
||||||
@@ -496,7 +511,7 @@ bullet.freezing = [stat]zamrażający
|
|||||||
bullet.tarred = [stat]smolny
|
bullet.tarred = [stat]smolny
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
||||||
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
||||||
unit.blocks = Klocki
|
unit.blocks = bloki
|
||||||
unit.powersecond = jednostek prądu na sekundę
|
unit.powersecond = jednostek prądu na sekundę
|
||||||
unit.liquidsecond = jednostek płynów na sekundę
|
unit.liquidsecond = jednostek płynów na sekundę
|
||||||
unit.itemssecond = przedmiotów na sekundę
|
unit.itemssecond = przedmiotów na sekundę
|
||||||
@@ -520,11 +535,11 @@ setting.shadows.name = Cienie
|
|||||||
setting.linear.name = Filtrowanie Liniowe
|
setting.linear.name = Filtrowanie Liniowe
|
||||||
setting.animatedwater.name = Animowana woda
|
setting.animatedwater.name = Animowana woda
|
||||||
setting.animatedshields.name = Animowana Tarcza
|
setting.animatedshields.name = Animowana Tarcza
|
||||||
setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[]
|
setting.antialias.name = Antyaliasing[LIGHT_GRAY] (wymaga restartu)[]
|
||||||
setting.indicators.name = Wskaźniki Przyjaciół
|
setting.indicators.name = Wskaźniki Przyjaciół
|
||||||
setting.autotarget.name = Automatyczne Celowanie
|
setting.autotarget.name = Automatyczne Celowanie
|
||||||
setting.keyboard.name = Sterowanie Myszka+Klawiatura
|
setting.keyboard.name = Sterowanie - Myszka+Klawiatura
|
||||||
setting.touchscreen.name = Touchscreen Controls
|
setting.touchscreen.name = Sterowanie - Ekran Dotykowy
|
||||||
setting.fpscap.name = Maksymalny FPS
|
setting.fpscap.name = Maksymalny FPS
|
||||||
setting.fpscap.none = Nieograniczone
|
setting.fpscap.none = Nieograniczone
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
@@ -545,7 +560,6 @@ setting.fullscreen.name = Pełny ekran
|
|||||||
setting.borderlesswindow.name = Bezramkowe okno[LIGHT_GRAY] (może wymagać restartu)
|
setting.borderlesswindow.name = Bezramkowe okno[LIGHT_GRAY] (może wymagać restartu)
|
||||||
setting.fps.name = Pokazuj FPS
|
setting.fps.name = Pokazuj FPS
|
||||||
setting.vsync.name = Synchronizacja pionowa
|
setting.vsync.name = Synchronizacja pionowa
|
||||||
setting.lasers.name = Pokaż lasery zasilające
|
|
||||||
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
|
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
|
||||||
setting.minimap.name = Pokaż Minimapę
|
setting.minimap.name = Pokaż Minimapę
|
||||||
setting.musicvol.name = Głośność muzyki
|
setting.musicvol.name = Głośność muzyki
|
||||||
@@ -555,11 +569,13 @@ setting.sfxvol.name = Głośność dźwięków
|
|||||||
setting.mutesound.name = Wycisz dźwięki
|
setting.mutesound.name = Wycisz dźwięki
|
||||||
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
|
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
|
||||||
setting.savecreate.name = Automatyczne tworzenie zapisu
|
setting.savecreate.name = Automatyczne tworzenie zapisu
|
||||||
setting.publichost.name = Widoczność gry publicznej
|
setting.publichost.name = Widoczność Gry Publicznej
|
||||||
setting.chatopacity.name = Przezroczystość czatu
|
setting.chatopacity.name = Przezroczystość czatu
|
||||||
|
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.
|
||||||
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
|
||||||
keybind.title = Zmień
|
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.
|
||||||
@@ -567,7 +583,7 @@ category.general.name = Ogólne
|
|||||||
category.view.name = Wyświetl
|
category.view.name = Wyświetl
|
||||||
category.multiplayer.name = Multiplayer
|
category.multiplayer.name = Multiplayer
|
||||||
command.attack = Atakuj
|
command.attack = Atakuj
|
||||||
command.rally = Rally
|
command.rally = Zbierz
|
||||||
command.retreat = Wycofaj
|
command.retreat = Wycofaj
|
||||||
keybind.gridMode.name = Wybieranie Bloku
|
keybind.gridMode.name = Wybieranie Bloku
|
||||||
keybind.gridModeShift.name = Wybieranie Kategorii
|
keybind.gridModeShift.name = Wybieranie Kategorii
|
||||||
@@ -576,7 +592,7 @@ 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.fullscreen.name = Toggle Fullscreen
|
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
|
||||||
keybind.pick.name = Wybierz Blok
|
keybind.pick.name = Wybierz Blok
|
||||||
@@ -603,28 +619,29 @@ mode.help.title = Opis trybów
|
|||||||
mode.survival.name = Przeżycie
|
mode.survival.name = Przeżycie
|
||||||
mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników.
|
mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników.
|
||||||
mode.sandbox.name = Piaskownica
|
mode.sandbox.name = Piaskownica
|
||||||
mode.sandbox.description = Nieskończone surowce i fale bez odliczania. Dla przedszkolaków!
|
mode.sandbox.description = Nieskończone surowce i fale bez odliczania.
|
||||||
|
mode.editor.name = Edytor
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = Walcz przeciwko innym graczom.
|
mode.pvp.description = Walcz przeciwko innym graczom.
|
||||||
mode.attack.name = Atak
|
mode.attack.name = Atak
|
||||||
mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika.
|
mode.attack.description = Brak fal. Celem jest zniszczenie bazy przeciwnika.
|
||||||
mode.custom = Własny tryb
|
mode.custom = Własny tryb
|
||||||
rules.infiniteresources = Nieskończone zasoby
|
rules.infiniteresources = Nieskończone zasoby
|
||||||
rules.wavetimer = Zegar fal
|
rules.wavetimer = Zegar fal
|
||||||
rules.waves = Fale
|
rules.waves = Fale
|
||||||
rules.attack = Tryb Ataku
|
rules.attack = Tryb ataku
|
||||||
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
||||||
rules.unitdrops = Surowce z zniszczonych jednostek
|
rules.unitdrops = Surowce ze zniszczonych jednostek
|
||||||
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
|
rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek
|
||||||
rules.unithealthmultiplier = Mnożnik Życia Jednostek
|
rules.unithealthmultiplier = Mnożnik życia jednostek
|
||||||
rules.playerhealthmultiplier = Mnożnik Życia Gracza
|
rules.playerhealthmultiplier = Mnożnik życia gracza
|
||||||
rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza
|
rules.playerdamagemultiplier = Mnożnik obrażeń gracza
|
||||||
rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek
|
rules.unitdamagemultiplier = Mnożnik obrażeń jednostek
|
||||||
rules.enemycorebuildradius = Zasięg blokady budowy przy rdżeniu wroga:[LIGHT_GRAY] (kratki)
|
rules.enemycorebuildradius = Zasięg blokady budowy przy rdżeniu wroga:[LIGHT_GRAY] (kratki)
|
||||||
rules.respawntime = Czas Odrodzenia:[LIGHT_GRAY] (sek)
|
rules.respawntime = Czas odrodzenia:[LIGHT_GRAY] (sek)
|
||||||
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
|
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
|
||||||
rules.buildcostmultiplier = Mnożnik Kosztów Budowania
|
rules.buildcostmultiplier = Mnożnik kosztów budowania
|
||||||
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
|
rules.buildspeedmultiplier = Mnożnik prędkości budowania
|
||||||
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
||||||
rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki)
|
rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki)
|
||||||
rules.respawns = Maksymalna ilośc odrodzeń na falę
|
rules.respawns = Maksymalna ilośc odrodzeń na falę
|
||||||
@@ -650,7 +667,7 @@ item.silicon.name = Krzem
|
|||||||
item.plastanium.name = Plastan
|
item.plastanium.name = Plastan
|
||||||
item.phase-fabric.name = Włókno Fazowe
|
item.phase-fabric.name = Włókno Fazowe
|
||||||
item.surge-alloy.name = Elektrum
|
item.surge-alloy.name = Elektrum
|
||||||
item.spore-pod.name = Zarodnia
|
item.spore-pod.name = Kapsuła Zarodników
|
||||||
item.sand.name = Piasek
|
item.sand.name = Piasek
|
||||||
item.blast-compound.name = Wybuchowy związek
|
item.blast-compound.name = Wybuchowy związek
|
||||||
item.pyratite.name = Piratian
|
item.pyratite.name = Piratian
|
||||||
@@ -703,8 +720,8 @@ block.saltrocks.name = Skały Solne
|
|||||||
block.pebbles.name = Kamyczki
|
block.pebbles.name = Kamyczki
|
||||||
block.tendrils.name = Wić
|
block.tendrils.name = Wić
|
||||||
block.sandrocks.name = Skały Piaskowe
|
block.sandrocks.name = Skały Piaskowe
|
||||||
block.spore-pine.name = Sosna Zarodkowa
|
block.spore-pine.name = Sosna Zarodnikowa
|
||||||
block.sporerocks.name = Skała z Zarodkami
|
block.sporerocks.name = Skała Zarodnikowa
|
||||||
block.rock.name = Skały
|
block.rock.name = Skały
|
||||||
block.snowrock.name = Skały śnieżne
|
block.snowrock.name = Skały śnieżne
|
||||||
block.snow-pine.name = Sosna śniegowa
|
block.snow-pine.name = Sosna śniegowa
|
||||||
@@ -712,19 +729,19 @@ block.shale.name = Łupek
|
|||||||
block.shale-boulder.name = Głaz Łupkowy
|
block.shale-boulder.name = Głaz Łupkowy
|
||||||
block.moss.name = Mech
|
block.moss.name = Mech
|
||||||
block.shrubs.name = Krzewy
|
block.shrubs.name = Krzewy
|
||||||
block.spore-moss.name = Mech z Zarodkami
|
block.spore-moss.name = Mech Zarodnikowy
|
||||||
block.shalerocks.name = Skały Łupkowe
|
block.shalerocks.name = Skały Łupkowe
|
||||||
block.scrap-wall.name = Ściana z Złomu
|
block.scrap-wall.name = Ściana ze Złomu
|
||||||
block.scrap-wall-large.name = Duża Ściana z Złomu
|
block.scrap-wall-large.name = Duża Ściana ze Złomu
|
||||||
block.scrap-wall-huge.name = Ogromna Ściana z Złomu
|
block.scrap-wall-huge.name = Ogromna Ściana ze Złomu
|
||||||
block.scrap-wall-gigantic.name = Gigantyczna Ściana z Złomu
|
block.scrap-wall-gigantic.name = Gigantyczna Ściana ze Złomu
|
||||||
block.thruster.name = Silnik
|
block.thruster.name = Silnik
|
||||||
block.kiln.name = Wypalarka
|
block.kiln.name = Wypalarka
|
||||||
block.graphite-press.name = Grafitowa Prasa
|
block.graphite-press.name = Grafitowa Prasa
|
||||||
block.multi-press.name = Multi-Prasa
|
block.multi-press.name = Multi-Prasa
|
||||||
block.constructing = {0} [LIGHT_GRAY](Budowa)
|
block.constructing = {0} [LIGHT_GRAY](Budowa)
|
||||||
block.spawn.name = Spawn wrogów
|
block.spawn.name = Spawn wrogów
|
||||||
block.core-shard.name = Rdzeń: Ułamek
|
block.core-shard.name = Rdzeń: Odłamek
|
||||||
block.core-foundation.name = Rdzeń: Podstawa
|
block.core-foundation.name = Rdzeń: Podstawa
|
||||||
block.core-nucleus.name = Rdzeń: Jądro
|
block.core-nucleus.name = Rdzeń: Jądro
|
||||||
block.deepwater.name = Głęboka Woda
|
block.deepwater.name = Głęboka Woda
|
||||||
@@ -750,7 +767,7 @@ block.dunerocks.name = Skały wydmowe
|
|||||||
block.pine.name = Sosna
|
block.pine.name = Sosna
|
||||||
block.white-tree-dead.name = Białe Drzewo Martwe
|
block.white-tree-dead.name = Białe Drzewo Martwe
|
||||||
block.white-tree.name = Białe Drzewo
|
block.white-tree.name = Białe Drzewo
|
||||||
block.spore-cluster.name = Grono Zarodków
|
block.spore-cluster.name = Skupisko Zarodników
|
||||||
block.metal-floor.name = Metalowa Podłoga
|
block.metal-floor.name = Metalowa Podłoga
|
||||||
block.metal-floor-2.name = Metalowa Podłoga 2
|
block.metal-floor-2.name = Metalowa Podłoga 2
|
||||||
block.metal-floor-3.name = Metalowa Podłoga 3
|
block.metal-floor-3.name = Metalowa Podłoga 3
|
||||||
@@ -768,7 +785,7 @@ block.hotrock.name = Gorący Kamień
|
|||||||
block.magmarock.name = Skała magmowa
|
block.magmarock.name = Skała magmowa
|
||||||
block.cliffs.name = Klify
|
block.cliffs.name = Klify
|
||||||
block.copper-wall.name = Miedziana Ściana
|
block.copper-wall.name = Miedziana Ściana
|
||||||
block.copper-wall-large.name = Duża miedziana ściana
|
block.copper-wall-large.name = Duża Miedziana Ściana
|
||||||
block.titanium-wall.name = Tytanowa Ściana
|
block.titanium-wall.name = Tytanowa Ściana
|
||||||
block.titanium-wall-large.name = Duża Tytanowa Ściana
|
block.titanium-wall-large.name = Duża Tytanowa Ściana
|
||||||
block.phase-wall.name = Fazowa Ściana
|
block.phase-wall.name = Fazowa Ściana
|
||||||
@@ -777,28 +794,28 @@ block.thorium-wall.name = Torowa Ściana
|
|||||||
block.thorium-wall-large.name = Duża Torowa Ściana
|
block.thorium-wall-large.name = Duża Torowa Ściana
|
||||||
block.door.name = Drzwi
|
block.door.name = Drzwi
|
||||||
block.door-large.name = Duże drzwi
|
block.door-large.name = Duże drzwi
|
||||||
block.duo.name = Podwójne działko
|
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 = Lancer
|
||||||
block.conveyor.name = Przenośnik
|
block.conveyor.name = Przenośnik
|
||||||
block.titanium-conveyor.name = Tytanowy przenośnik
|
block.titanium-conveyor.name = Przenośnik Tytanowy
|
||||||
block.armored-conveyor.name = Armored Conveyor
|
block.armored-conveyor.name = Przenośnik Opancerzony
|
||||||
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
block.armored-conveyor.description = Przesyła przedmioty z taką samą szybkością jak Przenośnik Tytanowy, ale jest bardziej odporny. Wejściami bocznymi mogą być tylko inne przenośniki.
|
||||||
block.junction.name = Węzeł
|
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.message.name = Message
|
block.message.name = Wiadomość
|
||||||
block.overflow-gate.name = Brama Przeciwprzepełnieniowa
|
block.overflow-gate.name = Brama Przepełnieniowa
|
||||||
block.silicon-smelter.name = Huta Krzemu
|
block.silicon-smelter.name = Huta Krzemu
|
||||||
block.phase-weaver.name = Fazowa Fabryka
|
block.phase-weaver.name = Fazowa Fabryka
|
||||||
block.pulverizer.name = Rozkruszacz
|
block.pulverizer.name = Rozkruszacz
|
||||||
block.cryofluidmixer.name = Mieszacz Lodocieczy
|
block.cryofluidmixer.name = Mieszacz Lodocieczy
|
||||||
block.melter.name = Przetapiacz
|
block.melter.name = Przetapiacz
|
||||||
block.incinerator.name = Spalacz
|
block.incinerator.name = Spalacz
|
||||||
block.spore-press.name = Prasa Zarodni
|
block.spore-press.name = Prasa Zarodników
|
||||||
block.separator.name = Rozdzielacz
|
block.separator.name = Rozdzielacz
|
||||||
block.coal-centrifuge.name = Wirówka węglowa
|
block.coal-centrifuge.name = Wirówka węglowa
|
||||||
block.power-node.name = Węzeł Prądu
|
block.power-node.name = Węzeł Prądu
|
||||||
@@ -831,11 +848,11 @@ block.power-void.name = Próżnia prądu
|
|||||||
block.power-source.name = Nieskończony Prąd
|
block.power-source.name = Nieskończony Prąd
|
||||||
block.unloader.name = Ekstraktor
|
block.unloader.name = Ekstraktor
|
||||||
block.vault.name = Magazyn
|
block.vault.name = Magazyn
|
||||||
block.wave.name = Strumyk
|
block.wave.name = Strumień
|
||||||
block.swarmer.name = Działo Rojowe
|
block.swarmer.name = Działo Rojowe
|
||||||
block.salvo.name = Działo Salwowe
|
block.salvo.name = Działo Salwowe
|
||||||
block.ripple.name = Działo falowe
|
block.ripple.name = Działo Falowe
|
||||||
block.phase-conveyor.name = Fazowy Transporter
|
block.phase-conveyor.name = Transporter Fazowy
|
||||||
block.bridge-conveyor.name = Most Transportowy
|
block.bridge-conveyor.name = Most Transportowy
|
||||||
block.plastanium-compressor.name = Kompresor Plastanu
|
block.plastanium-compressor.name = Kompresor Plastanu
|
||||||
block.pyratite-mixer.name = Mieszacz Piratianu
|
block.pyratite-mixer.name = Mieszacz Piratianu
|
||||||
@@ -847,13 +864,13 @@ block.command-center.name = Centrum Dowodzenia
|
|||||||
block.draug-factory.name = Fabryka Dronów Draug
|
block.draug-factory.name = Fabryka Dronów Draug
|
||||||
block.spirit-factory.name = Fabryka Dronów Duch
|
block.spirit-factory.name = Fabryka Dronów Duch
|
||||||
block.phantom-factory.name = Fabryka Dronów Widmo
|
block.phantom-factory.name = Fabryka Dronów Widmo
|
||||||
block.wraith-factory.name = Fabryka Wojowników Widmo
|
block.wraith-factory.name = Fabryka Myśliwców Widmo
|
||||||
block.ghoul-factory.name = Fabryka Bombowców Upiór
|
block.ghoul-factory.name = Fabryka Bombowców Upiór
|
||||||
block.dagger-factory.name = Fabryka Mechów Nóż
|
block.dagger-factory.name = Fabryka Mechów Nóż
|
||||||
block.crawler-factory.name = Fabryka Mechów Pełzacz
|
block.crawler-factory.name = Fabryka Mechów Pełzacz
|
||||||
block.titan-factory.name = Fabryka Mechów Tytan
|
block.titan-factory.name = Fabryka Mechów Tytan
|
||||||
block.fortress-factory.name = Fabryka Mechów Forteca
|
block.fortress-factory.name = Fabryka Mechów Forteca
|
||||||
block.revenant-factory.name = Fabryka Wojowników Zjawa
|
block.revenant-factory.name = Fabryka Krążowników Zjawa
|
||||||
block.repair-point.name = Punkt Napraw
|
block.repair-point.name = Punkt Napraw
|
||||||
block.pulse-conduit.name = Rura Pulsacyjna
|
block.pulse-conduit.name = Rura Pulsacyjna
|
||||||
block.phase-conduit.name = Rura Fazowa
|
block.phase-conduit.name = Rura Fazowa
|
||||||
@@ -870,12 +887,12 @@ block.thermal-generator.name = Generator Termalny
|
|||||||
block.alloy-smelter.name = Piec Mieszający
|
block.alloy-smelter.name = Piec Mieszający
|
||||||
block.mender.name = Naprawiacz
|
block.mender.name = Naprawiacz
|
||||||
block.mend-projector.name = Projektor Napraw
|
block.mend-projector.name = Projektor Napraw
|
||||||
block.surge-wall.name = Ściana Elektronu
|
block.surge-wall.name = Ściana Elektrum
|
||||||
block.surge-wall-large.name = Duża Ściana Elektronu
|
block.surge-wall-large.name = Duża Ściana Elektrum
|
||||||
block.cyclone.name = Cyklon
|
block.cyclone.name = Cyklon
|
||||||
block.fuse.name = Lont
|
block.fuse.name = Lont
|
||||||
block.shock-mine.name = Mina
|
block.shock-mine.name = Mina
|
||||||
block.overdrive-projector.name = Projektor Nad-prędkości
|
block.overdrive-projector.name = Projektor Przyśpieszający
|
||||||
block.force-projector.name = Projektor Pola Siłowego
|
block.force-projector.name = Projektor Pola Siłowego
|
||||||
block.arc.name = Piorun
|
block.arc.name = Piorun
|
||||||
block.rtg-generator.name = Generator RTG
|
block.rtg-generator.name = Generator RTG
|
||||||
@@ -891,21 +908,21 @@ team.orange.name = pomarańczowy
|
|||||||
team.derelict.name = szary
|
team.derelict.name = szary
|
||||||
team.green.name = zielony
|
team.green.name = zielony
|
||||||
team.purple.name = fioletowy
|
team.purple.name = fioletowy
|
||||||
unit.spirit.name = Duch
|
unit.spirit.name = Dron Naprawczy Duch
|
||||||
unit.draug.name = Draug
|
unit.draug.name = Dron Wydobywczy Draug
|
||||||
unit.phantom.name = Widmo
|
unit.phantom.name = Dron Budowniczy Widmo
|
||||||
unit.dagger.name = Nóż
|
unit.dagger.name = Nóż
|
||||||
unit.crawler.name = Pełzak
|
unit.crawler.name = Pełzak
|
||||||
unit.titan.name = Tytan
|
unit.titan.name = Tytan
|
||||||
unit.ghoul.name = Upiór
|
unit.ghoul.name = Bombowiec Upiór
|
||||||
unit.wraith.name = Widmo
|
unit.wraith.name = Myśliwiec Widmo
|
||||||
unit.fortress.name = Forteca
|
unit.fortress.name = Forteca
|
||||||
unit.revenant.name = Zjawa
|
unit.revenant.name = Zjawa
|
||||||
unit.eruptor.name = Roztapiacz
|
unit.eruptor.name = Roztapiacz
|
||||||
unit.chaos-array.name = Kolejka Chaosu
|
unit.chaos-array.name = Chaos
|
||||||
unit.eradicator.name = Niszczyciel
|
unit.eradicator.name = Niszczyciel
|
||||||
unit.lich.name = Obudzony
|
unit.lich.name = Obudzony
|
||||||
unit.reaper.name = Żeniec
|
unit.reaper.name = Żniwiarz
|
||||||
tutorial.next = [lightgray]<Kliknij, aby kontynuować>
|
tutorial.next = [lightgray]<Kliknij, aby kontynuować>
|
||||||
tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź
|
tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź
|
||||||
tutorial.drill = Wydobywanie ręczne nie jest efektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować.
|
tutorial.drill = Wydobywanie ręczne nie jest efektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować.
|
||||||
@@ -935,25 +952,25 @@ item.coal.description = Zwykły i łatwo dostępny materiał energetyczny.
|
|||||||
item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan!
|
item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan!
|
||||||
item.thorium.description = Zwarty i radioaktywny materiał używany w strukturach i paliwie nuklearnym. Nie trzymaj go w rękach!
|
item.thorium.description = Zwarty i radioaktywny materiał używany w strukturach i paliwie nuklearnym. Nie trzymaj go w rękach!
|
||||||
item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego.
|
item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego.
|
||||||
item.silicon.description = Niesamowicie przydatny półprzewodnk uźywany w panelach słonecznych i skomplikowanej elektronice. Nie, w Dolinie Krzemowej już nie ma krzemu.
|
item.silicon.description = Niesamowicie przydatny półprzewodnk. Używany w panelach słonecznych, skomplikowanej elektronice i pociskach samonaprowadzających.
|
||||||
item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)!
|
item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)!
|
||||||
item.phase-fabric.description = Niewiarygodnie lekkie włókno używane w zaawansowanej elektronice i technologii samo-naprawiającej się.
|
item.phase-fabric.description = Niewiarygodnie lekkie włókno używane w zaawansowanej elektronice i technologii samo-naprawiającej
|
||||||
item.surge-alloy.description = Zaawansowany materiał z niesłychanymi wartościami energetycznymi.
|
item.surge-alloy.description = Zaawansowany materiał z niesłychanymi wartościami energetycznymi.
|
||||||
item.spore-pod.description = Używany do wyrobu oleju, materiałów wybuchowych i paliwa.
|
item.spore-pod.description = Syntetyczne zarodniki, które mogą być przekształcone na olej, materiały wybuchowe i paliwo.
|
||||||
item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam, ale i tak warto spróbować.
|
item.blast-compound.description = Niestabilny związek używany w materiałach wybuchowych. Powstaje podczas syntezy z zarodników i innych lotnych substancji. Używanie go jako materiał energetyczny jest niewskazane.
|
||||||
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
|
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
|
||||||
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
||||||
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń.
|
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń.
|
||||||
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke.
|
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke.
|
||||||
liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli.
|
liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli.
|
||||||
mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki.
|
mech.alpha-mech.description = Standardowy mech. Bazuje na jednostce Nóż, z ulepszonym pancerzem i zdolnością budowania. Zadaje więcej obrażeń niż Strzałka.
|
||||||
mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkich ataków i ucieczki. Zadaje niewielkie obrażenia strukturom, lecz może bardzo szybko niszczyć spore grupy jednostek wroga przy pomocy jego działek tesli.
|
mech.delta-mech.description = Szybki, lekko opancerzony mech stworzony do ataków typu uderz i uciekaj. Zadaje niewielkie obrażenia strukturom, lecz może bardzo szybko niszczyć spore grupy jednostek wroga przy pomocy jego działek tesli.
|
||||||
mech.tau-mech.description = Mech wsparcia. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół.
|
mech.tau-mech.description = Mech wsparcia. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół.
|
||||||
mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń.
|
mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego pancerz pozwala mu na zablokowanie do 90% obrażeń.
|
||||||
mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie.
|
mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale posiada małe zdolności ofensywne i niską szybkość wydobywania surowców.
|
||||||
mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami.
|
mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami.
|
||||||
mech.trident-ship.description = Ciężki bombowiec, zbudowany do budowy i niszczenia fortyfikacji wroga. Dość dobrze opancerzony.
|
mech.trident-ship.description = Ciężki bombowiec, zbudowany do budowy i niszczenia fortyfikacji wroga. Dość dobrze opancerzony.
|
||||||
mech.glaive-ship.description = Duży, uzbrojony statek. Dobra prędkość i przyspieszenie. Wyposażony w karabin zapalający.
|
mech.glaive-ship.description = Duży, uzbrojony statek. Dobra prędkość i przyspieszenie. Wyposażony w karabin zapalający.
|
||||||
unit.draug.description = Prymitywny dron górniczy. Tani w produkcji. Przeznaczony na stracenie. Automatycznie wydobywa miedź i ołów w pobliżu. Dostarcza wydobyte zasoby do najbliższego rdzenia.
|
unit.draug.description = Prymitywny dron górniczy. Tani w produkcji. Przeznaczony na stracenie. Automatycznie wydobywa miedź i ołów w pobliżu. Dostarcza wydobyte zasoby do najbliższego rdzenia.
|
||||||
unit.spirit.description = Zmodyfikowany dron draug, zaprojektowany do naprawy zamiast do wydobywania. Automatycznie naprawia wszelkie uszkodzone bloki w obszarze.
|
unit.spirit.description = Zmodyfikowany dron draug, zaprojektowany do naprawy zamiast do wydobywania. Automatycznie naprawia wszelkie uszkodzone bloki w obszarze.
|
||||||
unit.phantom.description = Zaawansowana jednostka dronów. Podąża za użytkownikiem. Pomaga w budowie bloków.
|
unit.phantom.description = Zaawansowana jednostka dronów. Podąża za użytkownikiem. Pomaga w budowie bloków.
|
||||||
@@ -965,7 +982,7 @@ unit.eruptor.description = Ciężki mech stworzony do niszczenia struktur. Strze
|
|||||||
unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj Namierza jakiekolwiek źródło prądu.
|
unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj Namierza jakiekolwiek źródło prądu.
|
||||||
unit.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę.
|
unit.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę.
|
||||||
unit.revenant.description = Ciężka, unosząca sie platforma z rakietami.
|
unit.revenant.description = Ciężka, unosząca sie platforma z rakietami.
|
||||||
block.message.description = Stores a message. Used for communication between allies.
|
block.message.description = Przechowuje wiadomość. Wykorzystywane do komunikacji pomiędzy sojusznikami.
|
||||||
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
||||||
block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prądu do kompresowania węgla szybko i efektywnie.
|
block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prądu do kompresowania węgla szybko i efektywnie.
|
||||||
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
|
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
|
||||||
@@ -978,7 +995,7 @@ block.blast-mixer.description = Kruszy i miesza skupiska zarodników z piratytem
|
|||||||
block.pyratite-mixer.description = Miesza węgiel, ołów i piasek tworząc bardzo łatwopalny piratian.
|
block.pyratite-mixer.description = Miesza węgiel, ołów i piasek tworząc bardzo łatwopalny piratian.
|
||||||
block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach
|
block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach
|
||||||
block.separator.description = Oddziela użyteczne materiały z mieszaniny jaką jest żużel.
|
block.separator.description = Oddziela użyteczne materiały z mieszaniny jaką jest żużel.
|
||||||
block.spore-press.description = Kompresuje kapsułki zarodników w olej.
|
block.spore-press.description = Kompresuje kapsuły zarodników pod ogromnym ciśnieniem tworząc olej.
|
||||||
block.pulverizer.description = Mieli złom w drobny piasek. Przydatne, gdy brakuje naturalnego piasku.
|
block.pulverizer.description = Mieli złom w drobny piasek. Przydatne, gdy brakuje naturalnego piasku.
|
||||||
block.coal-centrifuge.description = Zestala olej w kawałki węgla.
|
block.coal-centrifuge.description = Zestala olej w kawałki węgla.
|
||||||
block.incinerator.description = Pozbywa się nadmiaru przedmiotów lub płynu
|
block.incinerator.description = Pozbywa się nadmiaru przedmiotów lub płynu
|
||||||
@@ -993,10 +1010,10 @@ block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umi
|
|||||||
block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek.
|
block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek.
|
||||||
block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami.
|
block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami.
|
||||||
block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek.
|
block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek.
|
||||||
block.phase-wall.description = Nie tak silny jak ściana toru, ale odbije pociski, chyba że będą zbyt potężne.
|
block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków.
|
||||||
block.phase-wall-large.description = Nie tak silny jak ściana toru, ale odbije pociski, chyba że będą zbyt potężne.\nObejmuje wiele kratek.
|
block.phase-wall-large.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków.\nObejmuje wiele kratek.
|
||||||
block.surge-wall.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.
|
block.surge-wall.description = Ekstremalnie wytrzymały blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.
|
||||||
block.surge-wall-large.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek.
|
block.surge-wall-large.description = Ekstremalnie wytrzymały blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek.
|
||||||
block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.
|
block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.
|
||||||
block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek.
|
block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek.
|
||||||
block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje struktury obronne w dobrym stanie.\nOpcjonalnie używa silikonu do zwiększenia zasięgu i szybkości naprawy.
|
block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje struktury obronne w dobrym stanie.\nOpcjonalnie używa silikonu do zwiększenia zasięgu i szybkości naprawy.
|
||||||
@@ -1008,19 +1025,19 @@ block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Auto
|
|||||||
block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Przesyła przedmioty szybciej od zwykłego przenośnika.
|
block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Przesyła przedmioty szybciej od zwykłego przenośnika.
|
||||||
block.junction.description = Używany jako most dla dwóch krzyżujących się przenośników. Przydatne w sytuacjach kiedy dwa różne przenośniki transportują różne surowce do różnych miejsc.
|
block.junction.description = Używany jako most dla dwóch krzyżujących się przenośników. Przydatne w sytuacjach kiedy dwa różne przenośniki transportują różne surowce do różnych miejsc.
|
||||||
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
||||||
block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii przy teleportacji przedmiotów do podłączonego transportera fazowego na spore odległości.
|
block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii do teleportacji przedmiotów do połączonego transportera fazowego na spore odległości.
|
||||||
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
|
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
|
||||||
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.
|
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.
|
||||||
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
|
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
|
||||||
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona
|
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona
|
||||||
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
|
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
|
||||||
block.mechanical-pump.description = Tania pompa o niskiej przepustowości. Nie wymaga prądu.
|
block.mechanical-pump.description = Tania pompa o niskiej wydajności. Nie wymaga prądu.
|
||||||
block.rotary-pump.description = Zaawansowana pompa, dwukrotnie większa przepustowość od mechanicznej pompy. Wymaga prądu.
|
block.rotary-pump.description = Zaawansowana pompa. Pompuje więcej cieczy, ale wymaga zasilania.
|
||||||
block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę.
|
block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę.
|
||||||
block.conduit.description = Podstawowy blok do przenoszenia cieczy. Działa jak transporter, ale na ciecze. Najlepiej używać z ekstraktorami wody, pompami lub innymi rurami.
|
block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami.
|
||||||
block.pulse-conduit.description = Zaawansowany blok do przenoszenia cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury.
|
block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury.
|
||||||
block.liquid-router.description = Akceptuje płyny z jednego kierunku i wyprowadza je do trzech innych kierunków jednakowo. Może również przechowywać pewną ilość płynu. Przydatne do dzielenia płynów z jednego źródła na wiele celów.
|
block.liquid-router.description = Akceptuje płyny z jednego kierunku i wyprowadza je po równo do trzech innych kierunków. Może również przechowywać pewną ilość płynu. Przydatne do dzielenia płynów z jednego źródła do wielu celów.
|
||||||
block.liquid-tank.description = Magazynuje ogromne ilości cieczy. Użyj go do stworzenia buforu, gdy występuje różne zapotrzebowanie na materiały lub jako zabezpieczenie dla chłodzenia ważnych bloków.
|
block.liquid-tank.description = Magazynuje duże ilości cieczy. Użyj go do stworzenia buforu, gdy występuje różne zapotrzebowanie na materiały lub jako zabezpieczenie dla chłodzenia ważnych bloków.
|
||||||
block.liquid-junction.description = Działa jak most dla dwóch krzyżujących się rur. Przydatne w sytuacjach, kiedy dwie rury mają różne ciecze do różnych lokacji.
|
block.liquid-junction.description = Działa jak most dla dwóch krzyżujących się rur. Przydatne w sytuacjach, kiedy dwie rury mają różne ciecze do różnych lokacji.
|
||||||
block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
||||||
block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków.
|
block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków.
|
||||||
@@ -1033,17 +1050,17 @@ block.combustion-generator.description = Wytwarza energię poprzez spalanie łat
|
|||||||
block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła.
|
block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła.
|
||||||
block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody.
|
block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody.
|
||||||
block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem.
|
block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem.
|
||||||
block.rtg-generator.description = Termoelektryczny generator wykorzystujący izotopy promieniotwórcze. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego.
|
block.rtg-generator.description = Generator wykorzystujący ciepło powstałe z rozpadu izotopów promieniotwórczych. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego.
|
||||||
block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną.
|
block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną.
|
||||||
block.solar-panel-large.description = Wytwarza o wiele więcej prądu niż zwykły panel słoneczny, ale jest o wiele droższy w budowie.
|
block.solar-panel-large.description = Wytwarza o wiele więcej prądu niż zwykły panel słoneczny, ale jest o wiele droższy w budowie.
|
||||||
block.thorium-reactor.description = Produkuje bardzo duże ilości prądu z wysoce radioaktywnego toru. Wymaga ciągłego chłodzenia. Silnie eksploduje jeśli nie zostanie dostarczona wystarczająca ilość chłodziwa. Produkcja energii zależy od zapełnienia, produkując bazową ilość energii przy całkowitym zapełnieniu.
|
block.thorium-reactor.description = Produkuje bardzo duże ilości prądu z wysoce radioaktywnego toru. Wymaga ciągłego chłodzenia. Silnie eksploduje jeśli nie zostanie dostarczona wystarczająca ilość chłodziwa. Produkcja energii zależy od zapełnienia, produkując bazową ilość energii przy całkowitym zapełnieniu.
|
||||||
block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych ilości prądu u szczytu swoich możliwości. Wymaga znacznych ilości energii do rozpoczęcia procesu.
|
block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych ilości prądu u szczytu swoich możliwości. Wymaga znacznych ilości energii do rozpoczęcia procesu.
|
||||||
block.mechanical-drill.description = Tanie wiertło. Kiedy położnone na odpowiednich polach, wysyła przedmioty w wolnym tempie.
|
block.mechanical-drill.description = Tanie wiertło. Kiedy zostanie zbudowane na odpowiednich polach, wydobywa surowce w wolnym tempie.
|
||||||
block.pneumatic-drill.description = Ulepszone wiertło, które jest szybsze i może wykopywać twardsze surowce przy użyciu ciśnienia.
|
block.pneumatic-drill.description = Ulepszone wiertło, które jest szybsze i może wykopywać twardsze surowce przy użyciu ciśnienia.
|
||||||
block.laser-drill.description = Pozwala kopać jeszcze szybciej poprzez technologię laserową, ale wymaga energii. Dodatkowo, radioaktywny tor może zostać wydobyty przez to wiertło.
|
block.laser-drill.description = Pozwala kopać jeszcze szybciej poprzez technologię laserową, ale wymaga energii. Zdolne do wydobywania toru.
|
||||||
block.blast-drill.description = Najlepsze wiertło. Wymaga dużych ilości energii.
|
block.blast-drill.description = Najlepsze wiertło. Wymaga dużych ilości energii.
|
||||||
block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora.
|
block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora.
|
||||||
block.cultivator.description = Uprawia małe skupiska zarodników w gotowe do użytku kapsułki.
|
block.cultivator.description = Uprawia małe skupiska zarodników i umieszcza je w gotowych do dalszego przetwarzania kapsułach.
|
||||||
block.oil-extractor.description = Używa bardzo dużych ilości energii do ekstrakcji ropy z piasku. Używaj go w sytuacji kiedy nie ma bezpośredniego źródła ropy w okolicy.
|
block.oil-extractor.description = Używa bardzo dużych ilości energii do ekstrakcji ropy z piasku. Używaj go w sytuacji kiedy nie ma bezpośredniego źródła ropy w okolicy.
|
||||||
block.core-shard.description = Pierwsza wersja rdzenia. Gdy zostaje zniszczony, wszelki kontakt do regionu zostaje utracony. Nie pozwól na to.
|
block.core-shard.description = Pierwsza wersja rdzenia. Gdy zostaje zniszczony, wszelki kontakt do regionu zostaje utracony. Nie pozwól na to.
|
||||||
block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Przechowuje więcej surowców.
|
block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Przechowuje więcej surowców.
|
||||||
@@ -1056,22 +1073,22 @@ block.launch-pad-large.description = Ulepszona wersja wyrzutni. Magazynuje więc
|
|||||||
block.duo.description = Mała, tania wieża. Przydatna przeciwko jednostkom naziemnym.
|
block.duo.description = Mała, tania wieża. Przydatna przeciwko jednostkom naziemnym.
|
||||||
block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga.
|
block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga.
|
||||||
block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości.
|
block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości.
|
||||||
block.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne.
|
block.hail.description = Mała wieża artyleryjska o dużym zasięgu.
|
||||||
block.wave.description = Średniej wielkości szybkostrzelna wieżyczka, która wystrzeliwuje płynne bąbelki. Gasi ogień jeżeli jest w niej woda lub lodociecz
|
block.wave.description = Średniej wielkości wieżyczka, która wystrzeliwuje strumienie cieczy. Automatycznie gasi ogień jeśli zasilana jest wodą.
|
||||||
block.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności.
|
block.lancer.description = Średniej wielkości wieżyczka, która po naładowaniu, wystrzeliwuje silne wiązki energii.
|
||||||
block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje wiązki tesli losowym łukiem w kierunku wroga.
|
block.arc.description = Mała wieża bliskiego zasięgu. Wystrzeliwuje wiązki elektryczne w kierunku wroga.
|
||||||
block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi.
|
block.swarmer.description = Średniej wielkości wieżyczka, która wystrzeliwuje rakiety samonaprowadzające.
|
||||||
block.salvo.description = Średniej wielkości wieża strzelająca salwami.
|
block.salvo.description = Większa, bardziej zaawansowana wersja Podwójnego Działka, strzelająca szybkimi salwami.
|
||||||
block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu.
|
block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu.
|
||||||
block.ripple.description = Duża wieża artyleryjska, która strzela jednocześnie kilkoma strzałami.
|
block.ripple.description = Duża wieża artyleryjska, która strzela jednocześnie kilkoma strzałami.
|
||||||
block.cyclone.description = Duża szybkostrzelna wieża.
|
block.cyclone.description = Duża szybkostrzelna wieża.
|
||||||
block.spectre.description = Duża wieża, która strzela dwoma potężnymi pociskami jednocześnie.
|
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
||||||
block.meltdown.description = Duża wieża, która strzela potężnymi wiązkami dalekiego zasięgu.
|
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
||||||
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia / fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia / fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
||||||
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
||||||
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
||||||
block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie.
|
block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie.
|
||||||
block.wraith-factory.description = Produkuje szybkie jednostki powietrzne typu "uderz-uciekaj".
|
block.wraith-factory.description = Produkuje szybkie jednostki powietrzne typu "uderz i uciekaj".
|
||||||
block.ghoul-factory.description = Produkuje ciężkie bombowce dywanowe.
|
block.ghoul-factory.description = Produkuje ciężkie bombowce dywanowe.
|
||||||
block.revenant-factory.description = Produkuje ciężkie jednostki powietrzne z wyrzutniami rakiet.
|
block.revenant-factory.description = Produkuje ciężkie jednostki powietrzne z wyrzutniami rakiet.
|
||||||
block.dagger-factory.description = Produkuje podstawowe jednostki lądowe.
|
block.dagger-factory.description = Produkuje podstawowe jednostki lądowe.
|
||||||
|
|||||||
@@ -560,7 +560,6 @@ 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)
|
||||||
setting.fps.name = Mostrar FPS
|
setting.fps.name = Mostrar FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Mostrar lasers
|
|
||||||
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.musicvol.name = Volume da Música
|
setting.musicvol.name = Volume da Música
|
||||||
@@ -572,6 +571,7 @@ setting.crashreport.name = Enviar denuncias de crash anonimas
|
|||||||
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.playerchat.name = Mostrar chat em jogo
|
setting.playerchat.name = Mostrar chat em jogo
|
||||||
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
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ 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.lasers.name = Показывать лазеры энергоснабжения
|
|
||||||
setting.pixelate.name = Пикселизация[lightgray] (отключает анимации)
|
setting.pixelate.name = Пикселизация[lightgray] (отключает анимации)
|
||||||
setting.minimap.name = Показать миникарту
|
setting.minimap.name = Показать миникарту
|
||||||
setting.musicvol.name = Громкость музыки
|
setting.musicvol.name = Громкость музыки
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Отправлять анонимные отчёты
|
|||||||
setting.savecreate.name = Автоматическое создание сохранений
|
setting.savecreate.name = Автоматическое создание сохранений
|
||||||
setting.publichost.name = Общедоступность игры
|
setting.publichost.name = Общедоступность игры
|
||||||
setting.chatopacity.name = Непрозрачность чата
|
setting.chatopacity.name = Непрозрачность чата
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Отображать облака чата над игроками
|
setting.playerchat.name = Отображать облака чата над игроками
|
||||||
uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд…
|
uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд…
|
||||||
uiscale.cancel = Отменить & Выйти
|
uiscale.cancel = Отменить & Выйти
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Fullskärm
|
|||||||
setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart)
|
setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart)
|
||||||
setting.fps.name = Show FPS
|
setting.fps.name = Show FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Show Power Lasers
|
|
||||||
setting.pixelate.name = Pixellera[lightgray] (disables animations)
|
setting.pixelate.name = Pixellera[lightgray] (disables animations)
|
||||||
setting.minimap.name = Visa Minikarta
|
setting.minimap.name = Visa Minikarta
|
||||||
setting.musicvol.name = Musikvolym
|
setting.musicvol.name = Musikvolym
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Skicka Anonyma Krashrapporter
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chattgenomskinlighet
|
setting.chatopacity.name = Chattgenomskinlighet
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Visa Chatt
|
setting.playerchat.name = Visa Chatt
|
||||||
uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder...
|
uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder...
|
||||||
uiscale.cancel = Avbryt och Avsluta
|
uiscale.cancel = Avbryt och Avsluta
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = Tam ekran
|
|||||||
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart)
|
||||||
setting.fps.name = FPS'i goster
|
setting.fps.name = FPS'i goster
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Guc lazerlerini goster
|
|
||||||
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance)
|
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance)
|
||||||
setting.minimap.name = Haritayi goster
|
setting.minimap.name = Haritayi goster
|
||||||
setting.musicvol.name = Ses yuksekligi
|
setting.musicvol.name = Ses yuksekligi
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Send Anonymous Crash Reports
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ 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
|
setting.fps.name = Show FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Show Power Lasers
|
|
||||||
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = Send Anonymous Crash Reports
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -551,7 +551,6 @@ 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.lasers.name = Показувати енергію лазерів
|
|
||||||
setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації)
|
setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації)
|
||||||
setting.minimap.name = Показувати міні-мапу
|
setting.minimap.name = Показувати міні-мапу
|
||||||
setting.musicvol.name = Гучність музики
|
setting.musicvol.name = Гучність музики
|
||||||
@@ -563,6 +562,7 @@ setting.crashreport.name = Відсилати анонімні звіти про
|
|||||||
setting.savecreate.name = Автоматичне створення збережень
|
setting.savecreate.name = Автоматичне створення збережень
|
||||||
setting.publichost.name = Загальнодоступність гри
|
setting.publichost.name = Загальнодоступність гри
|
||||||
setting.chatopacity.name = Непрозорість чату
|
setting.chatopacity.name = Непрозорість чату
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = Відображати хмару чата над гравцями
|
setting.playerchat.name = Відображати хмару чата над гравцями
|
||||||
public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування->Гра->Public Game Visibility.
|
public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування->Гра->Public Game Visibility.
|
||||||
uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] …
|
uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] …
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ customgame = 自定义游戏
|
|||||||
newgame = 新游戏
|
newgame = 新游戏
|
||||||
none = <无>
|
none = <无>
|
||||||
minimap = 小地图
|
minimap = 小地图
|
||||||
|
position = 位置
|
||||||
close = 关闭
|
close = 关闭
|
||||||
website = 官网
|
website = 官网
|
||||||
quit = 退出
|
quit = 退出
|
||||||
@@ -183,7 +184,7 @@ copylink = 复制链接
|
|||||||
back = 返回
|
back = 返回
|
||||||
data.export = 导出数据
|
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 = 导出老版本数据
|
||||||
@@ -545,9 +546,9 @@ setting.fullscreen.name = 全屏
|
|||||||
setting.borderlesswindow.name = 无边框窗口[LIGHT_GRAY] (可能需要重启)
|
setting.borderlesswindow.name = 无边框窗口[LIGHT_GRAY] (可能需要重启)
|
||||||
setting.fps.name = 显示 FPS
|
setting.fps.name = 显示 FPS
|
||||||
setting.vsync.name = 垂直同步
|
setting.vsync.name = 垂直同步
|
||||||
setting.lasers.name = 显示能量射线
|
|
||||||
setting.pixelate.name = 像素画面 [LIGHT_GRAY](禁用动画)
|
setting.pixelate.name = 像素画面 [LIGHT_GRAY](禁用动画)
|
||||||
setting.minimap.name = 显示小地图
|
setting.minimap.name = 显示小地图
|
||||||
|
setting.position.name = 显示玩家坐标
|
||||||
setting.musicvol.name = 音乐音量
|
setting.musicvol.name = 音乐音量
|
||||||
setting.ambientvol.name = 环境体积
|
setting.ambientvol.name = 环境体积
|
||||||
setting.mutemusic.name = 静音
|
setting.mutemusic.name = 静音
|
||||||
@@ -557,6 +558,7 @@ setting.crashreport.name = 发送匿名崩溃报告
|
|||||||
setting.savecreate.name = 自动创建存档
|
setting.savecreate.name = 自动创建存档
|
||||||
setting.publichost.name = 公共游戏旁观
|
setting.publichost.name = 公共游戏旁观
|
||||||
setting.chatopacity.name = 聊天界面透明度
|
setting.chatopacity.name = 聊天界面透明度
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = 显示游戏内聊天界面
|
setting.playerchat.name = 显示游戏内聊天界面
|
||||||
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
|
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
|
||||||
uiscale.cancel = 取消并退出
|
uiscale.cancel = 取消并退出
|
||||||
|
|||||||
@@ -545,7 +545,6 @@ setting.fullscreen.name = 全螢幕
|
|||||||
setting.borderlesswindow.name = 無邊框窗口[LIGHT_GRAY](可能需要重啟)
|
setting.borderlesswindow.name = 無邊框窗口[LIGHT_GRAY](可能需要重啟)
|
||||||
setting.fps.name = 顯示FPS
|
setting.fps.name = 顯示FPS
|
||||||
setting.vsync.name = 垂直同步
|
setting.vsync.name = 垂直同步
|
||||||
setting.lasers.name = 顯示雷射光束
|
|
||||||
setting.pixelate.name = 像素化[LIGHT_GRAY](可能降低性能)
|
setting.pixelate.name = 像素化[LIGHT_GRAY](可能降低性能)
|
||||||
setting.minimap.name = 顯示小地圖
|
setting.minimap.name = 顯示小地圖
|
||||||
setting.musicvol.name = 音樂音量
|
setting.musicvol.name = 音樂音量
|
||||||
@@ -557,6 +556,7 @@ setting.crashreport.name = 發送匿名崩潰報告
|
|||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.publichost.name = Public Game Visibility
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = 聊天框不透明度
|
setting.chatopacity.name = 聊天框不透明度
|
||||||
|
setting.lasersopacity.name = Power Laser Opacity
|
||||||
setting.playerchat.name = 在遊戲中顯示聊天框
|
setting.playerchat.name = 在遊戲中顯示聊天框
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
|
|||||||
@@ -78,4 +78,5 @@ itskatt
|
|||||||
Agent-Laevain
|
Agent-Laevain
|
||||||
AzariasB
|
AzariasB
|
||||||
amrsoll
|
amrsoll
|
||||||
|
ねらひかだ
|
||||||
Draco
|
Draco
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 725 B After Width: | Height: | Size: 727 B |
|
Before Width: | Height: | Size: 712 KiB After Width: | Height: | Size: 712 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 893 KiB |
|
Before Width: | Height: | Size: 721 KiB After Width: | Height: | Size: 134 KiB |
@@ -45,6 +45,10 @@ public class Vars implements Loadable{
|
|||||||
public static final String discordURL = "https://discord.gg/mindustry";
|
public static final String discordURL = "https://discord.gg/mindustry";
|
||||||
/** URL for sending crash reports to */
|
/** URL for sending crash reports to */
|
||||||
public static final String crashReportURL = "http://mins.us.to/report";
|
public static final String crashReportURL = "http://mins.us.to/report";
|
||||||
|
/** URL the links to the wiki's modding guide.*/
|
||||||
|
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/";
|
||||||
|
/** URL the links to the wiki's modding guide.*/
|
||||||
|
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md";
|
||||||
/** list of built-in servers.*/
|
/** list of built-in servers.*/
|
||||||
public static final Array<String> defaultServers = Array.with(/*"mins.us.to"*/);
|
public static final Array<String> defaultServers = Array.with(/*"mins.us.to"*/);
|
||||||
/** maximum distance between mine and core that supports automatic transferring */
|
/** maximum distance between mine and core that supports automatic transferring */
|
||||||
@@ -257,7 +261,7 @@ public class Vars implements Loadable{
|
|||||||
public static void loadSettings(){
|
public static void loadSettings(){
|
||||||
Core.settings.setAppName(appName);
|
Core.settings.setAppName(appName);
|
||||||
|
|
||||||
if(steam || "steam".equals(Version.modifier)){
|
if(steam || (Version.modifier != null && Version.modifier.contains("steam"))){
|
||||||
Core.settings.setDataDirectory(Core.files.local("saves/"));
|
Core.settings.setDataDirectory(Core.files.local("saves/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,6 +164,10 @@ public class BlockIndexer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TileEntity findTile(Team team, float x, float y, float range, Predicate<Tile> pred){
|
public TileEntity findTile(Team team, float x, float y, float range, Predicate<Tile> pred){
|
||||||
|
return findTile(team, x, y, range, pred, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TileEntity findTile(Team team, float x, float y, float range, Predicate<Tile> pred, boolean usePriority){
|
||||||
TileEntity closest = null;
|
TileEntity closest = null;
|
||||||
float dst = 0;
|
float dst = 0;
|
||||||
|
|
||||||
@@ -184,7 +188,7 @@ public class BlockIndexer{
|
|||||||
TileEntity e = other.entity;
|
TileEntity e = other.entity;
|
||||||
|
|
||||||
float ndst = Mathf.dst(x, y, e.x, e.y);
|
float ndst = Mathf.dst(x, y, e.x, e.y);
|
||||||
if(ndst < range && (closest == null || ndst < dst)){
|
if(ndst < range && (closest == null || ndst < dst || (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
|
||||||
dst = ndst;
|
dst = ndst;
|
||||||
closest = e;
|
closest = e;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.type.Bullet;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
@@ -29,8 +29,6 @@ import io.anuke.mindustry.world.consumers.*;
|
|||||||
import io.anuke.mindustry.world.meta.*;
|
import io.anuke.mindustry.world.meta.*;
|
||||||
import io.anuke.mindustry.world.modules.*;
|
import io.anuke.mindustry.world.modules.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
|
||||||
|
|
||||||
public class Blocks implements ContentList{
|
public class Blocks implements ContentList{
|
||||||
public static Block
|
public static Block
|
||||||
|
|
||||||
@@ -58,7 +56,7 @@ public class Blocks implements ContentList{
|
|||||||
phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, forceProjector, shockMine,
|
phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, forceProjector, shockMine,
|
||||||
|
|
||||||
//transport
|
//transport
|
||||||
conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, router, overflowGate, massDriver,
|
conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, massDriver,
|
||||||
|
|
||||||
//liquids
|
//liquids
|
||||||
mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit,
|
mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit,
|
||||||
@@ -716,23 +714,23 @@ public class Blocks implements ContentList{
|
|||||||
//region sandbox
|
//region sandbox
|
||||||
|
|
||||||
powerVoid = new PowerVoid("power-void"){{
|
powerVoid = new PowerVoid("power-void"){{
|
||||||
requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
powerSource = new PowerSource("power-source"){{
|
powerSource = new PowerSource("power-source"){{
|
||||||
requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
itemSource = new ItemSource("item-source"){{
|
itemSource = new ItemSource("item-source"){{
|
||||||
requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
itemVoid = new ItemVoid("item-void"){{
|
itemVoid = new ItemVoid("item-void"){{
|
||||||
requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
liquidSource = new LiquidSource("liquid-source"){{
|
liquidSource = new LiquidSource("liquid-source"){{
|
||||||
requirements(Category.liquid, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
message = new MessageBlock("message"){{
|
message = new MessageBlock("message"){{
|
||||||
@@ -745,27 +743,27 @@ public class Blocks implements ContentList{
|
|||||||
int wallHealthMultiplier = 4;
|
int wallHealthMultiplier = 4;
|
||||||
|
|
||||||
scrapWall = new Wall("scrap-wall"){{
|
scrapWall = new Wall("scrap-wall"){{
|
||||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
health = 60 * wallHealthMultiplier;
|
health = 60 * wallHealthMultiplier;
|
||||||
variants = 5;
|
variants = 5;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
scrapWallLarge = new Wall("scrap-wall-large"){{
|
scrapWallLarge = new Wall("scrap-wall-large"){{
|
||||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
health = 60 * 4 * wallHealthMultiplier;
|
health = 60 * 4 * wallHealthMultiplier;
|
||||||
size = 2;
|
size = 2;
|
||||||
variants = 4;
|
variants = 4;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
scrapWallHuge = new Wall("scrap-wall-huge"){{
|
scrapWallHuge = new Wall("scrap-wall-huge"){{
|
||||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
health = 60 * 9 * wallHealthMultiplier;
|
health = 60 * 9 * wallHealthMultiplier;
|
||||||
size = 3;
|
size = 3;
|
||||||
variants = 3;
|
variants = 3;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
scrapWallGigantic = new Wall("scrap-wall-gigantic"){{
|
scrapWallGigantic = new Wall("scrap-wall-gigantic"){{
|
||||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||||
health = 60 * 16 * wallHealthMultiplier;
|
health = 60 * 16 * wallHealthMultiplier;
|
||||||
size = 4;
|
size = 4;
|
||||||
}};
|
}};
|
||||||
@@ -935,7 +933,11 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
sorter = new Sorter("sorter"){{
|
sorter = new Sorter("sorter"){{
|
||||||
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
||||||
|
}};
|
||||||
|
|
||||||
|
invertedSorter = new Sorter("inverted-sorter"){{
|
||||||
|
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
||||||
|
invert = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
router = new Router("router"){{
|
router = new Router("router"){{
|
||||||
@@ -965,12 +967,12 @@ public class Blocks implements ContentList{
|
|||||||
//region liquid
|
//region liquid
|
||||||
|
|
||||||
mechanicalPump = new Pump("mechanical-pump"){{
|
mechanicalPump = new Pump("mechanical-pump"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.copper, 15, Items.lead, 10));
|
requirements(Category.liquid, ItemStack.with(Items.copper, 15, Items.metaglass, 10));
|
||||||
pumpAmount = 0.1f;
|
pumpAmount = 0.1f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
rotaryPump = new Pump("rotary-pump"){{
|
rotaryPump = new Pump("rotary-pump"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.copper, 70, Items.lead, 50, Items.silicon, 20, Items.titanium, 35));
|
requirements(Category.liquid, ItemStack.with(Items.copper, 70, Items.metaglass, 50, Items.silicon, 20, Items.titanium, 35));
|
||||||
pumpAmount = 0.8f;
|
pumpAmount = 0.8f;
|
||||||
consumes.power(0.15f);
|
consumes.power(0.15f);
|
||||||
liquidCapacity = 30f;
|
liquidCapacity = 30f;
|
||||||
@@ -979,7 +981,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
thermalPump = new Pump("thermal-pump"){{
|
thermalPump = new Pump("thermal-pump"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.copper, 80, Items.lead, 65, Items.silicon, 30, Items.titanium, 40, Items.thorium, 35));
|
requirements(Category.liquid, ItemStack.with(Items.copper, 80, Items.metaglass, 70, Items.silicon, 30, Items.titanium, 40, Items.thorium, 35));
|
||||||
pumpAmount = 1.5f;
|
pumpAmount = 1.5f;
|
||||||
consumes.power(0.30f);
|
consumes.power(0.30f);
|
||||||
liquidCapacity = 40f;
|
liquidCapacity = 40f;
|
||||||
@@ -993,13 +995,13 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
pulseConduit = new Conduit("pulse-conduit"){{
|
pulseConduit = new Conduit("pulse-conduit"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.metaglass, 1));
|
requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 1));
|
||||||
liquidCapacity = 16f;
|
liquidCapacity = 16f;
|
||||||
health = 90;
|
health = 90;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
liquidRouter = new LiquidRouter("liquid-router"){{
|
liquidRouter = new LiquidRouter("liquid-router"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 2));
|
requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 2));
|
||||||
liquidCapacity = 20f;
|
liquidCapacity = 20f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1011,11 +1013,11 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
liquidJunction = new LiquidJunction("liquid-junction"){{
|
liquidJunction = new LiquidJunction("liquid-junction"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 2));
|
requirements(Category.liquid, ItemStack.with(Items.graphite, 2, Items.metaglass, 2));
|
||||||
}};
|
}};
|
||||||
|
|
||||||
bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{
|
bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.titanium, 4, Items.metaglass, 4));
|
requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 8));
|
||||||
range = 4;
|
range = 4;
|
||||||
hasPower = false;
|
hasPower = false;
|
||||||
}};
|
}};
|
||||||
@@ -1083,11 +1085,12 @@ public class Blocks implements ContentList{
|
|||||||
size = 2;
|
size = 2;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
differentialGenerator = new SingleTypeGenerator(true, false, "differential-generator"){{
|
differentialGenerator = new SingleTypeGenerator("differential-generator"){{
|
||||||
requirements(Category.power, ItemStack.with(Items.copper, 70, Items.titanium, 50, Items.lead, 100, Items.silicon, 65, Items.metaglass, 50));
|
requirements(Category.power, ItemStack.with(Items.copper, 70, Items.titanium, 50, Items.lead, 100, Items.silicon, 65, Items.metaglass, 50));
|
||||||
powerProduction = 16f;
|
powerProduction = 16f;
|
||||||
itemDuration = 120f;
|
itemDuration = 120f;
|
||||||
hasLiquids = true;
|
hasLiquids = true;
|
||||||
|
hasItems = true;
|
||||||
size = 3;
|
size = 3;
|
||||||
|
|
||||||
consumes.item(Items.pyratite).optional(true, false);
|
consumes.item(Items.pyratite).optional(true, false);
|
||||||
@@ -1230,7 +1233,7 @@ public class Blocks implements ContentList{
|
|||||||
//region storage
|
//region storage
|
||||||
|
|
||||||
coreShard = new CoreBlock("core-shard"){{
|
coreShard = new CoreBlock("core-shard"){{
|
||||||
requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 1000));
|
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000));
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
|
|
||||||
health = 1100;
|
health = 1100;
|
||||||
@@ -1239,7 +1242,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
coreFoundation = new CoreBlock("core-foundation"){{
|
coreFoundation = new CoreBlock("core-foundation"){{
|
||||||
requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 1500, Items.silicon, 1000));
|
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 400, Items.silicon, 3000));
|
||||||
|
|
||||||
health = 2000;
|
health = 2000;
|
||||||
itemCapacity = 9000;
|
itemCapacity = 9000;
|
||||||
@@ -1247,7 +1250,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
coreNucleus = new CoreBlock("core-nucleus"){{
|
coreNucleus = new CoreBlock("core-nucleus"){{
|
||||||
requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 1000));
|
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 3000));
|
||||||
|
|
||||||
health = 4000;
|
health = 4000;
|
||||||
itemCapacity = 13000;
|
itemCapacity = 13000;
|
||||||
@@ -1272,7 +1275,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
launchPad = new LaunchPad("launch-pad"){{
|
launchPad = new LaunchPad("launch-pad"){{
|
||||||
requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.copper, 250, Items.silicon, 75, Items.lead, 100));
|
requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 250, Items.silicon, 75, Items.lead, 100));
|
||||||
size = 3;
|
size = 3;
|
||||||
itemCapacity = 100;
|
itemCapacity = 100;
|
||||||
launchTime = 60f * 16;
|
launchTime = 60f * 16;
|
||||||
@@ -1281,7 +1284,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
launchPadLarge = new LaunchPad("launch-pad-large"){{
|
launchPadLarge = new LaunchPad("launch-pad-large"){{
|
||||||
requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75));
|
requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75));
|
||||||
size = 4;
|
size = 4;
|
||||||
itemCapacity = 250;
|
itemCapacity = 250;
|
||||||
launchTime = 60f * 14;
|
launchTime = 60f * 14;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public class TechTree implements ContentList{
|
|||||||
|
|
||||||
node(distributor);
|
node(distributor);
|
||||||
node(sorter, () -> {
|
node(sorter, () -> {
|
||||||
|
node(invertedSorter);
|
||||||
node(message);
|
node(message);
|
||||||
node(overflowGate);
|
node(overflowGate);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class UnitTypes implements ContentList{
|
|||||||
range = 70f;
|
range = 70f;
|
||||||
itemCapacity = 70;
|
itemCapacity = 70;
|
||||||
health = 400;
|
health = 400;
|
||||||
buildPower = 1f;
|
buildPower = 0.4f;
|
||||||
engineOffset = 6.5f;
|
engineOffset = 6.5f;
|
||||||
toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium);
|
toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium);
|
||||||
weapon = new Weapon("heal-blaster"){{
|
weapon = new Weapon("heal-blaster"){{
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
package io.anuke.mindustry.content;
|
package io.anuke.mindustry.content;
|
||||||
|
|
||||||
import io.anuke.arc.collection.Array;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.ContentList;
|
import io.anuke.mindustry.game.Objectives.*;
|
||||||
import io.anuke.mindustry.game.SpawnGroup;
|
import io.anuke.mindustry.maps.generators.*;
|
||||||
import io.anuke.mindustry.maps.generators.MapGenerator;
|
import io.anuke.mindustry.maps.generators.MapGenerator.*;
|
||||||
import io.anuke.mindustry.maps.generators.MapGenerator.Decoration;
|
import io.anuke.mindustry.maps.zonegen.*;
|
||||||
import io.anuke.mindustry.maps.zonegen.DesertWastesGenerator;
|
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.Block;
|
|
||||||
|
import static io.anuke.arc.collection.Array.with;
|
||||||
|
import static io.anuke.mindustry.content.Items.*;
|
||||||
|
import static io.anuke.mindustry.type.ItemStack.list;
|
||||||
|
|
||||||
public class Zones implements ContentList{
|
public class Zones implements ContentList{
|
||||||
public static Zone
|
public static Zone
|
||||||
@@ -20,28 +22,26 @@ public class Zones implements ContentList{
|
|||||||
public void load(){
|
public void load(){
|
||||||
|
|
||||||
groundZero = new Zone("groundZero", new MapGenerator("groundZero", 1)){{
|
groundZero = new Zone("groundZero", new MapGenerator("groundZero", 1)){{
|
||||||
baseLaunchCost = ItemStack.with(Items.copper, -60);
|
baseLaunchCost = list(copper, -60);
|
||||||
startingItems = ItemStack.list(Items.copper, 60);
|
startingItems = list(copper, 60);
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
conditionWave = 5;
|
conditionWave = 5;
|
||||||
launchPeriod = 5;
|
launchPeriod = 5;
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead};
|
resources = with(copper, scrap, lead);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
desertWastes = new Zone("desertWastes", new DesertWastesGenerator(260, 260)){{
|
desertWastes = new Zone("desertWastes", new DesertWastesGenerator(260, 260)){{
|
||||||
startingItems = ItemStack.list(Items.copper, 120);
|
startingItems = list(copper, 120);
|
||||||
conditionWave = 20;
|
conditionWave = 20;
|
||||||
launchPeriod = 10;
|
launchPeriod = 10;
|
||||||
loadout = Loadouts.advancedShard;
|
loadout = Loadouts.advancedShard;
|
||||||
zoneRequirements = ZoneRequirement.with(groundZero, 20);
|
resources = with(copper, lead, coal, sand);
|
||||||
blockRequirements = new Block[]{Blocks.combustionGenerator};
|
|
||||||
resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.sand};
|
|
||||||
rules = r -> {
|
rules = r -> {
|
||||||
r.waves = true;
|
r.waves = true;
|
||||||
r.waveTimer = true;
|
r.waveTimer = true;
|
||||||
r.launchWaveMultiplier = 3f;
|
r.launchWaveMultiplier = 3f;
|
||||||
r.waveSpacing = 60 * 50f;
|
r.waveSpacing = 60 * 50f;
|
||||||
r.spawns = Array.with(
|
r.spawns = with(
|
||||||
new SpawnGroup(UnitTypes.crawler){{
|
new SpawnGroup(UnitTypes.crawler){{
|
||||||
unitScaling = 3f;
|
unitScaling = 3f;
|
||||||
}},
|
}},
|
||||||
@@ -75,96 +75,140 @@ public class Zones implements ContentList{
|
|||||||
}}
|
}}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
requirements = with(
|
||||||
|
new ZoneWave(groundZero, 20),
|
||||||
|
new Unlock(Blocks.combustionGenerator)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
saltFlats = new Zone("saltFlats", new MapGenerator("saltFlats")){{
|
saltFlats = new Zone("saltFlats", new MapGenerator("saltFlats")){{
|
||||||
startingItems = ItemStack.list(Items.copper, 200, Items.silicon, 200, Items.lead, 200);
|
startingItems = list(copper, 200, Items.silicon, 200, lead, 200);
|
||||||
loadout = Loadouts.basicFoundation;
|
loadout = Loadouts.basicFoundation;
|
||||||
conditionWave = 10;
|
conditionWave = 10;
|
||||||
launchPeriod = 5;
|
launchPeriod = 5;
|
||||||
zoneRequirements = ZoneRequirement.with(desertWastes, 60);
|
configureObjective = new Launched(this);
|
||||||
blockRequirements = new Block[]{Blocks.daggerFactory, Blocks.draugFactory, Blocks.door, Blocks.waterExtractor};
|
resources = with(copper, scrap, lead, coal, sand, titanium);
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand, Items.titanium};
|
requirements = with(
|
||||||
|
new ZoneWave(desertWastes, 60),
|
||||||
|
new Unlock(Blocks.daggerFactory),
|
||||||
|
new Unlock(Blocks.draugFactory),
|
||||||
|
new Unlock(Blocks.door),
|
||||||
|
new Unlock(Blocks.waterExtractor)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
frozenForest = new Zone("frozenForest", new MapGenerator("frozenForest", 1)
|
frozenForest = new Zone("frozenForest", new MapGenerator("frozenForest", 1)
|
||||||
.decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02))){{
|
.decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02))){{
|
||||||
loadout = Loadouts.basicFoundation;
|
loadout = Loadouts.basicFoundation;
|
||||||
baseLaunchCost = ItemStack.with();
|
startingItems = list(copper, 250);
|
||||||
startingItems = ItemStack.list(Items.copper, 250);
|
|
||||||
conditionWave = 10;
|
conditionWave = 10;
|
||||||
blockRequirements = new Block[]{Blocks.junction, Blocks.router};
|
resources = with(copper, lead, coal);
|
||||||
zoneRequirements = ZoneRequirement.with(groundZero, 10);
|
requirements = with(
|
||||||
resources = new Item[]{Items.copper, Items.lead, Items.coal};
|
new ZoneWave(groundZero, 10),
|
||||||
|
new Unlock(Blocks.junction),
|
||||||
|
new Unlock(Blocks.router)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
craters = new Zone("craters", new MapGenerator("craters", 1).decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.004))){{
|
craters = new Zone("craters", new MapGenerator("craters", 1).decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.004))){{
|
||||||
startingItems = ItemStack.list(Items.copper, 100);
|
startingItems = list(copper, 100);
|
||||||
conditionWave = 10;
|
conditionWave = 10;
|
||||||
zoneRequirements = ZoneRequirement.with(frozenForest, 10);
|
resources = with(copper, lead, coal, sand, scrap);
|
||||||
blockRequirements = new Block[]{Blocks.mender, Blocks.combustionGenerator};
|
requirements = with(
|
||||||
resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.sand, Items.scrap};
|
new ZoneWave(frozenForest, 10),
|
||||||
|
new Unlock(Blocks.mender),
|
||||||
|
new Unlock(Blocks.combustionGenerator)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
ruinousShores = new Zone("ruinousShores", new MapGenerator("ruinousShores", 1)){{
|
ruinousShores = new Zone("ruinousShores", new MapGenerator("ruinousShores", 1)){{
|
||||||
loadout = Loadouts.basicFoundation;
|
loadout = Loadouts.basicFoundation;
|
||||||
baseLaunchCost = ItemStack.with();
|
startingItems = list(copper, 140, lead, 50);
|
||||||
startingItems = ItemStack.list(Items.copper, 140, Items.lead, 50);
|
|
||||||
conditionWave = 20;
|
conditionWave = 20;
|
||||||
launchPeriod = 20;
|
launchPeriod = 20;
|
||||||
zoneRequirements = ZoneRequirement.with(desertWastes, 20, craters, 15);
|
resources = with(copper, scrap, lead, coal, sand);
|
||||||
blockRequirements = new Block[]{Blocks.graphitePress, Blocks.combustionGenerator, Blocks.kiln, Blocks.mechanicalPump};
|
requirements = with(
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand};
|
new ZoneWave(desertWastes, 20),
|
||||||
|
new ZoneWave(craters, 15),
|
||||||
|
new Unlock(Blocks.graphitePress),
|
||||||
|
new Unlock(Blocks.combustionGenerator),
|
||||||
|
new Unlock(Blocks.kiln),
|
||||||
|
new Unlock(Blocks.mechanicalPump)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
stainedMountains = new Zone("stainedMountains", new MapGenerator("stainedMountains", 2)
|
stainedMountains = new Zone("stainedMountains", new MapGenerator("stainedMountains", 2)
|
||||||
.decor(new Decoration(Blocks.shale, Blocks.shaleBoulder, 0.02))){{
|
.decor(new Decoration(Blocks.shale, Blocks.shaleBoulder, 0.02))){{
|
||||||
loadout = Loadouts.basicFoundation;
|
loadout = Loadouts.basicFoundation;
|
||||||
startingItems = ItemStack.list(Items.copper, 200, Items.lead, 50);
|
startingItems = list(copper, 200, lead, 50);
|
||||||
conditionWave = 10;
|
conditionWave = 10;
|
||||||
launchPeriod = 10;
|
launchPeriod = 10;
|
||||||
zoneRequirements = ZoneRequirement.with(frozenForest, 15);
|
resources = with(copper, scrap, lead, coal, titanium, sand);
|
||||||
blockRequirements = new Block[]{Blocks.pneumaticDrill, Blocks.powerNode, Blocks.turbineGenerator};
|
requirements = with(
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.sand};
|
new ZoneWave(frozenForest, 15),
|
||||||
|
new Unlock(Blocks.pneumaticDrill),
|
||||||
|
new Unlock(Blocks.powerNode),
|
||||||
|
new Unlock(Blocks.turbineGenerator)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
fungalPass = new Zone("fungalPass", new MapGenerator("fungalPass")){{
|
fungalPass = new Zone("fungalPass", new MapGenerator("fungalPass")){{
|
||||||
startingItems = ItemStack.list(Items.copper, 250, Items.lead, 250, Items.metaglass, 100, Items.graphite, 100);
|
startingItems = list(copper, 250, lead, 250, Items.metaglass, 100, Items.graphite, 100);
|
||||||
zoneRequirements = ZoneRequirement.with(stainedMountains, 15);
|
resources = with(copper, lead, coal, titanium, sand);
|
||||||
blockRequirements = new Block[]{Blocks.daggerFactory, Blocks.crawlerFactory, Blocks.door, Blocks.siliconSmelter};
|
configureObjective = new Launched(this);
|
||||||
resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.titanium, Items.sand};
|
requirements = with(
|
||||||
|
new ZoneWave(stainedMountains, 15),
|
||||||
|
new Unlock(Blocks.daggerFactory),
|
||||||
|
new Unlock(Blocks.crawlerFactory),
|
||||||
|
new Unlock(Blocks.door),
|
||||||
|
new Unlock(Blocks.siliconSmelter)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
overgrowth = new Zone("overgrowth", new MapGenerator("overgrowth")){{
|
overgrowth = new Zone("overgrowth", new MapGenerator("overgrowth")){{
|
||||||
startingItems = ItemStack.list(Items.copper, 1500, Items.lead, 1000, Items.silicon, 500, Items.metaglass, 250);
|
startingItems = list(copper, 1500, lead, 1000, Items.silicon, 500, Items.metaglass, 250);
|
||||||
conditionWave = 12;
|
conditionWave = 12;
|
||||||
launchPeriod = 4;
|
launchPeriod = 4;
|
||||||
loadout = Loadouts.basicNucleus;
|
loadout = Loadouts.basicNucleus;
|
||||||
zoneRequirements = ZoneRequirement.with(craters, 40, fungalPass, 10);
|
configureObjective = new Launched(this);
|
||||||
blockRequirements = new Block[]{Blocks.cultivator, Blocks.sporePress, Blocks.titanFactory, Blocks.wraithFactory};
|
resources = with(copper, lead, coal, titanium, sand, thorium, scrap);
|
||||||
resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.titanium, Items.sand, Items.thorium, Items.scrap};
|
requirements = with(
|
||||||
|
new ZoneWave(craters, 40),
|
||||||
|
new Launched(fungalPass),
|
||||||
|
new Unlock(Blocks.cultivator),
|
||||||
|
new Unlock(Blocks.sporePress),
|
||||||
|
new Unlock(Blocks.titanFactory),
|
||||||
|
new Unlock(Blocks.wraithFactory)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
tarFields = new Zone("tarFields", new MapGenerator("tarFields")
|
tarFields = new Zone("tarFields", new MapGenerator("tarFields")
|
||||||
.decor(new Decoration(Blocks.shale, Blocks.shaleBoulder, 0.02))){{
|
.decor(new Decoration(Blocks.shale, Blocks.shaleBoulder, 0.02))){{
|
||||||
loadout = Loadouts.basicFoundation;
|
loadout = Loadouts.basicFoundation;
|
||||||
startingItems = ItemStack.list(Items.copper, 250, Items.lead, 100);
|
startingItems = list(copper, 250, lead, 100);
|
||||||
conditionWave = 15;
|
conditionWave = 15;
|
||||||
launchPeriod = 10;
|
launchPeriod = 10;
|
||||||
zoneRequirements = ZoneRequirement.with(ruinousShores, 20);
|
requirements = with(new ZoneWave(ruinousShores, 20));
|
||||||
blockRequirements = new Block[]{Blocks.coalCentrifuge, Blocks.conduit, Blocks.wave};
|
resources = with(copper, scrap, lead, coal, titanium, thorium, sand);
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium, Items.sand};
|
requirements = with(
|
||||||
|
new ZoneWave(ruinousShores, 20),
|
||||||
|
new Unlock(Blocks.coalCentrifuge),
|
||||||
|
new Unlock(Blocks.conduit),
|
||||||
|
new Unlock(Blocks.wave)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
desolateRift = new Zone("desolateRift", new MapGenerator("desolateRift")){{
|
desolateRift = new Zone("desolateRift", new MapGenerator("desolateRift")){{
|
||||||
loadout = Loadouts.basicNucleus;
|
loadout = Loadouts.basicNucleus;
|
||||||
baseLaunchCost = ItemStack.with();
|
startingItems = list(copper, 1000, lead, 1000, Items.graphite, 250, titanium, 250, Items.silicon, 250);
|
||||||
startingItems = ItemStack.list(Items.copper, 1000, Items.lead, 1000, Items.graphite, 250, Items.titanium, 250, Items.silicon, 250);
|
|
||||||
conditionWave = 3;
|
conditionWave = 3;
|
||||||
launchPeriod = 2;
|
launchPeriod = 2;
|
||||||
zoneRequirements = ZoneRequirement.with(tarFields, 20);
|
resources = with(copper, scrap, lead, coal, titanium, sand, thorium);
|
||||||
blockRequirements = new Block[]{Blocks.thermalGenerator, Blocks.thoriumReactor};
|
requirements = with(
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.sand, Items.thorium};
|
new ZoneWave(tarFields, 20),
|
||||||
|
new Unlock(Blocks.thermalGenerator),
|
||||||
|
new Unlock(Blocks.thoriumReactor)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -174,21 +218,23 @@ public class Zones implements ContentList{
|
|||||||
startingItems = ItemStack.list(Items.copper, 2000, Items.lead, 2000, Items.graphite, 500, Items.titanium, 500, Items.silicon, 500);
|
startingItems = ItemStack.list(Items.copper, 2000, Items.lead, 2000, Items.graphite, 500, Items.titanium, 500, Items.silicon, 500);
|
||||||
conditionWave = 3;
|
conditionWave = 3;
|
||||||
launchPeriod = 2;
|
launchPeriod = 2;
|
||||||
zoneRequirements = ZoneRequirement.with(stainedMountains, 40);
|
requirements = with(stainedMountains, 40);
|
||||||
blockRequirements = new Block[]{Blocks.thermalGenerator};
|
blockRequirements = new Block[]{Blocks.thermalGenerator};
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand};
|
resources = Array.with(Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand};
|
||||||
}};*/
|
}};*/
|
||||||
|
|
||||||
nuclearComplex = new Zone("nuclearComplex", new MapGenerator("nuclearProductionComplex", 1)
|
nuclearComplex = new Zone("nuclearComplex", new MapGenerator("nuclearProductionComplex", 1)
|
||||||
.decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01))){{
|
.decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01))){{
|
||||||
loadout = Loadouts.basicNucleus;
|
loadout = Loadouts.basicNucleus;
|
||||||
baseLaunchCost = ItemStack.with();
|
startingItems = list(copper, 1250, lead, 1500, Items.silicon, 400, Items.metaglass, 250);
|
||||||
startingItems = ItemStack.list(Items.copper, 1250, Items.lead, 1500, Items.silicon, 400, Items.metaglass, 250);
|
|
||||||
conditionWave = 30;
|
conditionWave = 30;
|
||||||
launchPeriod = 15;
|
launchPeriod = 15;
|
||||||
zoneRequirements = ZoneRequirement.with(fungalPass, 8);
|
resources = with(copper, scrap, lead, coal, titanium, thorium, sand);
|
||||||
blockRequirements = new Block[]{Blocks.thermalGenerator, Blocks.laserDrill};
|
requirements = with(
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium, Items.sand};
|
new Launched(fungalPass),
|
||||||
|
new Unlock(Blocks.thermalGenerator),
|
||||||
|
new Unlock(Blocks.laserDrill)
|
||||||
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -198,9 +244,9 @@ public class Zones implements ContentList{
|
|||||||
startingItems = ItemStack.list(Items.copper, 2000, Items.lead, 2000, Items.graphite, 500, Items.titanium, 500, Items.silicon, 500);
|
startingItems = ItemStack.list(Items.copper, 2000, Items.lead, 2000, Items.graphite, 500, Items.titanium, 500, Items.silicon, 500);
|
||||||
conditionWave = 3;
|
conditionWave = 3;
|
||||||
launchPeriod = 2;
|
launchPeriod = 2;
|
||||||
zoneRequirements = ZoneRequirement.with(nuclearComplex, 40);
|
requirements = with(nuclearComplex, 40);
|
||||||
blockRequirements = new Block[]{Blocks.thermalGenerator};
|
blockRequirements = new Block[]{Blocks.thermalGenerator};
|
||||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium};
|
resources = Array.with(Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium};
|
||||||
}};*/
|
}};*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package io.anuke.mindustry.core;
|
|||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.assets.*;
|
import io.anuke.arc.assets.*;
|
||||||
|
import io.anuke.arc.audio.*;
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
@@ -54,6 +56,9 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
Events.on(StateChangeEvent.class, event -> {
|
Events.on(StateChangeEvent.class, event -> {
|
||||||
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
|
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
|
||||||
Time.runTask(5f, platform::updateRPC);
|
Time.runTask(5f, platform::updateRPC);
|
||||||
|
for(Sound sound : assets.getAll(Sound.class, new Array<>())){
|
||||||
|
sound.stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -146,11 +151,15 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Events.on(ZoneRequireCompleteEvent.class, e -> {
|
Events.on(ZoneRequireCompleteEvent.class, e -> {
|
||||||
ui.hudfrag.showToast(Core.bundle.format("zone.requirement.complete", state.wave, e.zone.localizedName));
|
if(e.objective.display() != null){
|
||||||
|
ui.hudfrag.showToast(Core.bundle.format("zone.requirement.complete", e.zoneForMet.localizedName, e.objective.display()));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Events.on(ZoneConfigureCompleteEvent.class, e -> {
|
Events.on(ZoneConfigureCompleteEvent.class, e -> {
|
||||||
ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave));
|
if(e.zone.configureObjective.display() != null){
|
||||||
|
ui.hudfrag.showToast(Core.bundle.format("zone.config.unlocked", e.zone.configureObjective.display()));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Events.on(Trigger.newGame, () -> {
|
Events.on(Trigger.newGame, () -> {
|
||||||
@@ -166,6 +175,12 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
Effects.shake(5f, 5f, core);
|
Effects.shake(5f, 5f, core);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Events.on(UnitDestroyEvent.class, e -> {
|
||||||
|
if(e.unit instanceof BaseUnit && world.isZone()){
|
||||||
|
data.unlockContent(((BaseUnit)e.unit).getType());
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -401,6 +416,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
music.update();
|
music.update();
|
||||||
loops.update();
|
loops.update();
|
||||||
|
Time.updateGlobal();
|
||||||
|
|
||||||
if(Core.input.keyTap(Binding.fullscreen)){
|
if(Core.input.keyTap(Binding.fullscreen)){
|
||||||
boolean full = settings.getBool("fullscreen");
|
boolean full = settings.getBool("fullscreen");
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package io.anuke.mindustry.core;
|
|||||||
|
|
||||||
import io.anuke.annotations.Annotations.*;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.ObjectSet.*;
|
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
@@ -136,8 +135,7 @@ public class Logic implements ApplicationListener{
|
|||||||
public void runWave(){
|
public void runWave(){
|
||||||
spawner.spawnEnemies();
|
spawner.spawnEnemies();
|
||||||
state.wave++;
|
state.wave++;
|
||||||
state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * state.rules.bossWaveMultiplier :
|
state.wavetime = world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing;
|
||||||
world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing;
|
|
||||||
|
|
||||||
Events.fire(new WaveEvent());
|
Events.fire(new WaveEvent());
|
||||||
}
|
}
|
||||||
@@ -176,12 +174,16 @@ public class Logic implements ApplicationListener{
|
|||||||
ui.hudfrag.showLaunch();
|
ui.hudfrag.showLaunch();
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Tile tile : new ObjectSetIterator<>(state.teams.get(defaultTeam).cores)){
|
for(Tile tile : state.teams.get(defaultTeam).cores){
|
||||||
Effects.effect(Fx.launch, tile);
|
Effects.effect(Fx.launch, tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(world.getZone() != null){
|
||||||
|
world.getZone().setLaunched();
|
||||||
|
}
|
||||||
|
|
||||||
Time.runTask(30f, () -> {
|
Time.runTask(30f, () -> {
|
||||||
for(Tile tile : new ObjectSetIterator<>(state.teams.get(defaultTeam).cores)){
|
for(Tile tile : state.teams.get(defaultTeam).cores){
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
if(tile == null || tile.entity == null || tile.entity.items == null) continue;
|
if(tile == null || tile.entity == null || tile.entity.items == null) continue;
|
||||||
data.addItem(item, tile.entity.items.get(item));
|
data.addItem(item, tile.entity.items.get(item));
|
||||||
|
|||||||
@@ -94,11 +94,6 @@ public class NetServer implements ApplicationListener{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(admins.isIDBanned(uuid)){
|
|
||||||
con.kick(KickReason.banned);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(admins.getPlayerLimit() > 0 && playerGroup.size() >= admins.getPlayerLimit()){
|
if(admins.getPlayerLimit() > 0 && playerGroup.size() >= admins.getPlayerLimit()){
|
||||||
con.kick(KickReason.playerLimit);
|
con.kick(KickReason.playerLimit);
|
||||||
return;
|
return;
|
||||||
@@ -357,6 +352,11 @@ public class NetServer implements ApplicationListener{
|
|||||||
if(currentlyKicking[0] == null){
|
if(currentlyKicking[0] == null){
|
||||||
player.sendMessage("[scarlet]Nobody is being voted on.");
|
player.sendMessage("[scarlet]Nobody is being voted on.");
|
||||||
}else{
|
}else{
|
||||||
|
if(player.isLocal){
|
||||||
|
player.sendMessage("Local players can't vote. Kick the player yourself instead.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//hosts can vote all they want
|
//hosts can vote all they want
|
||||||
if(player.uuid != null && (currentlyKicking[0].voted.contains(player.uuid) || currentlyKicking[0].voted.contains(admins.getInfo(player.uuid).lastIP))){
|
if(player.uuid != null && (currentlyKicking[0].voted.contains(player.uuid) || currentlyKicking[0].voted.contains(admins.getInfo(player.uuid).lastIP))){
|
||||||
player.sendMessage("[scarlet]You've already voted. Sit down.");
|
player.sendMessage("[scarlet]You've already voted. Sit down.");
|
||||||
|
|||||||
@@ -31,11 +31,16 @@ public interface Platform{
|
|||||||
return Array.with();
|
return Array.with();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Steam: Return external workshop mods to be loaded.*/
|
||||||
|
default Array<FileHandle> getExternalMods(){
|
||||||
|
return Array.with();
|
||||||
|
}
|
||||||
|
|
||||||
/** Steam: View a map listing on the workshop.*/
|
/** Steam: View a map listing on the workshop.*/
|
||||||
default void viewMapListing(Map map){}
|
default void viewMapListing(Map map){}
|
||||||
|
|
||||||
/** Steam: View a map listing on the workshop.*/
|
/** Steam: View a listing on the workshop.*/
|
||||||
default void viewMapListing(String mapid){}
|
default void viewListing(String mapid){}
|
||||||
|
|
||||||
/** Steam: View map workshop info, removing the map ID tag if its listing is deleted.
|
/** Steam: View map workshop info, removing the map ID tag if its listing is deleted.
|
||||||
* Also presents the option to update the map. */
|
* Also presents the option to update the map. */
|
||||||
|
|||||||
@@ -238,7 +238,6 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
Core.scene.add(menuGroup);
|
Core.scene.add(menuGroup);
|
||||||
Core.scene.add(hudGroup);
|
Core.scene.add(hudGroup);
|
||||||
|
|
||||||
control.input.getFrag().build(hudGroup);
|
|
||||||
hudfrag.build(hudGroup);
|
hudfrag.build(hudGroup);
|
||||||
menufrag.build(menuGroup);
|
menufrag.build(menuGroup);
|
||||||
chatfrag.container().build(hudGroup);
|
chatfrag.container().build(hudGroup);
|
||||||
@@ -284,7 +283,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
new Dialog(titleText){{
|
new Dialog(titleText){{
|
||||||
cont.margin(30).add(dtext).padRight(6f);
|
cont.margin(30).add(dtext).padRight(6f);
|
||||||
TextFieldFilter filter = inumeric ? TextFieldFilter.digitsOnly : (f, c) -> true;
|
TextFieldFilter filter = inumeric ? TextFieldFilter.digitsOnly : (f, c) -> true;
|
||||||
TextField field = cont.addField(def, t -> {}).size(170f, 50f).get();
|
TextField field = cont.addField(def, t -> {}).size(330f, 50f).get();
|
||||||
field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c));
|
field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c));
|
||||||
buttons.defaults().size(120, 54).pad(4);
|
buttons.defaults().size(120, 54).pad(4);
|
||||||
buttons.addButton("$ok", () -> {
|
buttons.addButton("$ok", () -> {
|
||||||
@@ -339,6 +338,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showException(String text, Throwable exc){
|
public void showException(String text, Throwable exc){
|
||||||
|
loadfrag.hide();
|
||||||
new Dialog(""){{
|
new Dialog(""){{
|
||||||
String message = Strings.getFinalMesage(exc);
|
String message = Strings.getFinalMesage(exc);
|
||||||
|
|
||||||
|
|||||||
@@ -272,6 +272,7 @@ public class World{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void removeBlock(Tile tile){
|
public void removeBlock(Tile tile){
|
||||||
|
if(tile == null) return;
|
||||||
tile.link().getLinkedTiles(other -> other.setBlock(Blocks.air));
|
tile.link().getLinkedTiles(other -> other.setBlock(Blocks.air));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
menu.cont.addImageTextButton("$editor.publish.workshop", Icon.linkSmall, () -> {
|
menu.cont.addImageTextButton("$editor.publish.workshop", Icon.linkSmall, () -> {
|
||||||
Map builtin = maps.all().find(m -> m.name().equals(editor.getTags().get("name", "").trim()));
|
Map builtin = maps.all().find(m -> m.name().equals(editor.getTags().get("name", "").trim()));
|
||||||
if(editor.getTags().containsKey("steamid") && builtin != null && !builtin.custom){
|
if(editor.getTags().containsKey("steamid") && builtin != null && !builtin.custom){
|
||||||
platform.viewMapListing(editor.getTags().get("steamid"));
|
platform.viewListing(editor.getTags().get("steamid"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class MapResizeDialog extends FloatingDialog{
|
|||||||
|
|
||||||
buttons.defaults().size(200f, 50f);
|
buttons.defaults().size(200f, 50f);
|
||||||
buttons.addButton("$cancel", this::hide);
|
buttons.addButton("$cancel", this::hide);
|
||||||
buttons.addButton("$editor.resize", () -> {
|
buttons.addButton("$ok", () -> {
|
||||||
cons.accept(width, height);
|
cons.accept(width, height);
|
||||||
hide();
|
hide();
|
||||||
});
|
});
|
||||||
|
|||||||
6
core/src/io/anuke/mindustry/entities/TargetPriority.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package io.anuke.mindustry.entities;
|
||||||
|
|
||||||
|
public enum TargetPriority{
|
||||||
|
base,
|
||||||
|
turret
|
||||||
|
}
|
||||||
@@ -87,7 +87,7 @@ public class Units{
|
|||||||
if(team == Team.derelict) return null;
|
if(team == Team.derelict) return null;
|
||||||
|
|
||||||
for(Team enemy : state.teams.enemiesOf(team)){
|
for(Team enemy : state.teams.enemiesOf(team)){
|
||||||
TileEntity entity = indexer.findTile(enemy, x, y, range, pred);
|
TileEntity entity = indexer.findTile(enemy, x, y, range, pred, true);
|
||||||
if(entity != null){
|
if(entity != null){
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ public class ArtilleryBulletType extends BasicBulletType{
|
|||||||
hitSound = Sounds.explosion;
|
hitSound = Sounds.explosion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArtilleryBulletType(){
|
||||||
|
this(1f, 1f, "shell");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(io.anuke.mindustry.entities.type.Bullet b){
|
public void update(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ public class BasicBulletType extends BulletType{
|
|||||||
this.bulletSprite = bulletSprite;
|
this.bulletSprite = bulletSprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** For mods. */
|
||||||
|
public BasicBulletType(){
|
||||||
|
this(1f, 1f, "bullet");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
backRegion = Core.atlas.find(bulletSprite + "-back");
|
backRegion = Core.atlas.find(bulletSprite + "-back");
|
||||||
|
|||||||
@@ -17,4 +17,8 @@ public class BombBulletType extends BasicBulletType{
|
|||||||
collidesAir = false;
|
collidesAir = false;
|
||||||
hitSound = Sounds.explosion;
|
hitSound = Sounds.explosion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BombBulletType(){
|
||||||
|
this(1f, 1f, "shell");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ public abstract class FlakBulletType extends BasicBulletType{
|
|||||||
bulletHeight = 10f;
|
bulletHeight = 10f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FlakBulletType(){
|
||||||
|
this(1f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b){
|
public void update(Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ public class HealBulletType extends BulletType{
|
|||||||
collidesTeam = true;
|
collidesTeam = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HealBulletType(){
|
||||||
|
this(1f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean collides(Bullet b, Tile tile){
|
public boolean collides(Bullet b, Tile tile){
|
||||||
return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f;
|
return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.entities.bullet;
|
|||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
@@ -13,14 +14,17 @@ import io.anuke.mindustry.world.*;
|
|||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class LiquidBulletType extends BulletType{
|
public class LiquidBulletType extends BulletType{
|
||||||
Liquid liquid;
|
@NonNull Liquid liquid;
|
||||||
|
|
||||||
public LiquidBulletType(Liquid liquid){
|
public LiquidBulletType(@Nullable Liquid liquid){
|
||||||
super(3.5f, 0);
|
super(3.5f, 0);
|
||||||
this.liquid = liquid;
|
|
||||||
|
if(liquid != null){
|
||||||
|
this.liquid = liquid;
|
||||||
|
this.status = liquid.effect;
|
||||||
|
}
|
||||||
|
|
||||||
lifetime = 74f;
|
lifetime = 74f;
|
||||||
status = liquid.effect;
|
|
||||||
statusDuration = 90f;
|
statusDuration = 90f;
|
||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
hitEffect = Fx.hitLiquid;
|
hitEffect = Fx.hitLiquid;
|
||||||
@@ -30,13 +34,17 @@ public class LiquidBulletType extends BulletType{
|
|||||||
knockback = 0.55f;
|
knockback = 0.55f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LiquidBulletType(){
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float range(){
|
public float range(){
|
||||||
return speed * lifetime / 2f;
|
return speed * lifetime / 2f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(io.anuke.mindustry.entities.type.Bullet b){
|
public void update(Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|
||||||
if(liquid.canExtinguish()){
|
if(liquid.canExtinguish()){
|
||||||
@@ -50,7 +58,7 @@ public class LiquidBulletType extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(io.anuke.mindustry.entities.type.Bullet b){
|
public void draw(Bullet b){
|
||||||
Draw.color(liquid.color, Color.white, b.fout() / 100f);
|
Draw.color(liquid.color, Color.white, b.fout() / 100f);
|
||||||
|
|
||||||
Fill.circle(b.x, b.y, 0.5f + b.fout() * 2.5f);
|
Fill.circle(b.x, b.y, 0.5f + b.fout() * 2.5f);
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ public class MissileBulletType extends BasicBulletType{
|
|||||||
hitSound = Sounds.explosion;
|
hitSound = Sounds.explosion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MissileBulletType(){
|
||||||
|
this(1f, 1f, "missile");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b){
|
public void update(Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import io.anuke.arc.collection.*;
|
|||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.util.*;
|
|
||||||
import io.anuke.arc.util.ArcAnnotate.*;
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
@@ -188,6 +188,11 @@ public interface BuilderTrait extends Entity, TeamTrait{
|
|||||||
|
|
||||||
/** Add another build requests to the tail of the queue, if it doesn't exist there yet. */
|
/** Add another build requests to the tail of the queue, if it doesn't exist there yet. */
|
||||||
default void addBuildRequest(BuildRequest place){
|
default void addBuildRequest(BuildRequest place){
|
||||||
|
addBuildRequest(place, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Add another build requests to the queue, if it doesn't exist there yet. */
|
||||||
|
default void addBuildRequest(BuildRequest place, boolean tail){
|
||||||
for(BuildRequest request : buildQueue()){
|
for(BuildRequest request : buildQueue()){
|
||||||
if(request.x == place.x && request.y == place.y){
|
if(request.x == place.x && request.y == place.y){
|
||||||
return;
|
return;
|
||||||
@@ -197,7 +202,11 @@ public interface BuilderTrait extends Entity, TeamTrait{
|
|||||||
if(tile != null && tile.entity instanceof BuildEntity){
|
if(tile != null && tile.entity instanceof BuildEntity){
|
||||||
place.progress = tile.<BuildEntity>entity().progress;
|
place.progress = tile.<BuildEntity>entity().progress;
|
||||||
}
|
}
|
||||||
buildQueue().addLast(place);
|
if(tail){
|
||||||
|
buildQueue().addLast(place);
|
||||||
|
}else{
|
||||||
|
buildQueue().addFirst(place);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -258,15 +267,19 @@ public interface BuilderTrait extends Entity, TeamTrait{
|
|||||||
|
|
||||||
/** Class for storing build requests. Can be either a place or remove request. */
|
/** Class for storing build requests. Can be either a place or remove request. */
|
||||||
class BuildRequest{
|
class BuildRequest{
|
||||||
public final int x, y, rotation;
|
public int x, y, rotation;
|
||||||
public final Block block;
|
public @Nullable Block block;
|
||||||
public final boolean breaking;
|
public boolean breaking;
|
||||||
public boolean hasConfig;
|
public boolean hasConfig;
|
||||||
public int config;
|
public int config;
|
||||||
|
|
||||||
public float progress;
|
public float progress;
|
||||||
public boolean initialized;
|
public boolean initialized;
|
||||||
|
|
||||||
|
//animation variables
|
||||||
|
public float animScale = 0f;
|
||||||
|
public float animInvalid;
|
||||||
|
|
||||||
/** This creates a build request. */
|
/** This creates a build request. */
|
||||||
public BuildRequest(int x, int y, int rotation, Block block){
|
public BuildRequest(int x, int y, int rotation, Block block){
|
||||||
this.x = x;
|
this.x = x;
|
||||||
@@ -285,13 +298,42 @@ public interface BuilderTrait extends Entity, TeamTrait{
|
|||||||
this.breaking = true;
|
this.breaking = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BuildRequest(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rectangle bounds(Rectangle rect){
|
||||||
|
if(breaking){
|
||||||
|
return rect.set(-100f, -100f, 0f, 0f);
|
||||||
|
}else{
|
||||||
|
return block.bounds(x, y, rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BuildRequest set(int x, int y, int rotation, Block block){
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.rotation = rotation;
|
||||||
|
this.block = block;
|
||||||
|
this.breaking = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float drawx(){
|
||||||
|
return x*tilesize + block.offset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public float drawy(){
|
||||||
|
return y*tilesize + block.offset();
|
||||||
|
}
|
||||||
|
|
||||||
public BuildRequest configure(int config){
|
public BuildRequest configure(int config){
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.hasConfig = true;
|
this.hasConfig = true;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Tile tile(){
|
public @Nullable Tile tile(){
|
||||||
return world.tile(x, y);
|
return world.tile(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,7 @@ import io.anuke.mindustry.entities.*;
|
|||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
|
||||||
import io.anuke.mindustry.input.*;
|
import io.anuke.mindustry.input.*;
|
||||||
import io.anuke.mindustry.input.InputHandler.*;
|
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.net.Administration.*;
|
import io.anuke.mindustry.net.Administration.*;
|
||||||
import io.anuke.mindustry.net.*;
|
import io.anuke.mindustry.net.*;
|
||||||
@@ -51,7 +49,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
public String name = "noname";
|
public String name = "noname";
|
||||||
public @Nullable
|
public @Nullable
|
||||||
String uuid, usid;
|
String uuid, usid;
|
||||||
public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping;
|
public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping, isBuilding = true;
|
||||||
public float boostHeat, shootHeat, destructTime;
|
public float boostHeat, shootHeat, destructTime;
|
||||||
public boolean achievedFlight;
|
public boolean achievedFlight;
|
||||||
public Color color = new Color();
|
public Color color = new Color();
|
||||||
@@ -357,7 +355,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
public void drawOver(){
|
public void drawOver(){
|
||||||
if(dead) return;
|
if(dead) return;
|
||||||
|
|
||||||
drawMechanics();
|
if(isBuilding()){
|
||||||
|
if(!state.isPaused() && isBuilding){
|
||||||
|
drawBuilding();
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
drawMining();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -424,57 +428,17 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
|
|
||||||
/** Draw all current build requests. Does not draw the beam effect, only the positions. */
|
/** Draw all current build requests. Does not draw the beam effect, only the positions. */
|
||||||
public void drawBuildRequests(){
|
public void drawBuildRequests(){
|
||||||
BuildRequest last = null;
|
if(!isLocal) return;
|
||||||
|
|
||||||
for(BuildRequest request : buildQueue()){
|
for(BuildRequest request : buildQueue()){
|
||||||
if(request.progress > 0.01f || (buildRequest() == request && request.initialized && (dst(request.x * tilesize, request.y * tilesize) <= placeDistance || state.isEditor()))) continue;
|
if(request.progress > 0.01f || (buildRequest() == request && request.initialized && (dst(request.x * tilesize, request.y * tilesize) <= placeDistance || state.isEditor()))) continue;
|
||||||
|
|
||||||
|
request.animScale = 1f;
|
||||||
if(request.breaking){
|
if(request.breaking){
|
||||||
Block block = world.ltile(request.x, request.y).block();
|
control.input.drawBreaking(request);
|
||||||
|
|
||||||
//draw removal request
|
|
||||||
Lines.stroke(2f, Pal.removeBack);
|
|
||||||
|
|
||||||
float rad = Mathf.absin(Time.time(), 7f, 1f) + block.size * tilesize / 2f - 1;
|
|
||||||
Lines.square(
|
|
||||||
request.x * tilesize + block.offset(),
|
|
||||||
request.y * tilesize + block.offset() - 1,
|
|
||||||
rad);
|
|
||||||
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
|
|
||||||
Lines.square(
|
|
||||||
request.x * tilesize + block.offset(),
|
|
||||||
request.y * tilesize + block.offset(), rad);
|
|
||||||
}else{
|
}else{
|
||||||
Draw.color();
|
request.block.drawRequest(request, control.input.allRequests(),
|
||||||
PlaceDraw draw = PlaceDraw.instance;
|
Build.validPlace(getTeam(), request.x, request.y, request.block, request.rotation));
|
||||||
|
|
||||||
draw.scalex = 1;
|
|
||||||
draw.scaley = 1;
|
|
||||||
draw.rotation = request.rotation;
|
|
||||||
|
|
||||||
if(last == null){
|
|
||||||
request.block.getPlaceDraw(draw, request.rotation, request.x, request.y, request.rotation);
|
|
||||||
}else{
|
|
||||||
request.block.getPlaceDraw(draw, request.rotation, last.x - request.x, last.y - request.y, last.rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureRegion region = draw.region;
|
|
||||||
|
|
||||||
Draw.rect(region,
|
|
||||||
request.x * tilesize + request.block.offset(), request.y * tilesize + request.block.offset(),
|
|
||||||
region.getWidth() * 1f * Draw.scl * draw.scalex,
|
|
||||||
region.getHeight() * 1f * Draw.scl * draw.scaley, request.block.rotate ? draw.rotation * 90 : 0);
|
|
||||||
|
|
||||||
Draw.color(Pal.accent);
|
|
||||||
for(int i = 0; i < 4; i++){
|
|
||||||
Point2 p = Geometry.d8edge[i];
|
|
||||||
float offset = -Math.max(request.block.size - 1, 0) / 2f * tilesize;
|
|
||||||
Draw.rect("block-select", request.x * tilesize + request.block.offset() + offset * p.x, request.y * tilesize + request.block.offset() + offset * p.y, i * 90);
|
|
||||||
}
|
|
||||||
Draw.color();
|
|
||||||
|
|
||||||
last = request;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -485,6 +449,18 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
|
|
||||||
//region update methods
|
//region update methods
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateMechanics(){
|
||||||
|
if(isBuilding){
|
||||||
|
updateBuilding();
|
||||||
|
}
|
||||||
|
|
||||||
|
//mine only when not building
|
||||||
|
if(buildRequest() == null){
|
||||||
|
updateMining();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
hitTime -= Time.delta();
|
hitTime -= Time.delta();
|
||||||
@@ -517,7 +493,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
}
|
}
|
||||||
|
|
||||||
BuildRequest request = buildRequest();
|
BuildRequest request = buildRequest();
|
||||||
if(isBuilding() && request.tile() != null && (request.tile().withinDst(x, y, placeDistance) || state.isEditor())){
|
if(isBuilding() && isBuilding && request.tile() != null && (request.tile().withinDst(x, y, placeDistance) || state.isEditor())){
|
||||||
loops.play(Sounds.build, request.tile(), 0.75f);
|
loops.play(Sounds.build, request.tile(), 0.75f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -817,6 +793,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
placeQueue.clear();
|
placeQueue.clear();
|
||||||
dead = true;
|
dead = true;
|
||||||
lastText = null;
|
lastText = null;
|
||||||
|
isBuilding = true;
|
||||||
textFadeTime = 0f;
|
textFadeTime = 0f;
|
||||||
target = null;
|
target = null;
|
||||||
moveTarget = null;
|
moveTarget = null;
|
||||||
@@ -910,7 +887,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
public void write(DataOutput buffer) throws IOException{
|
public void write(DataOutput buffer) throws IOException{
|
||||||
super.writeSave(buffer, !isLocal);
|
super.writeSave(buffer, !isLocal);
|
||||||
TypeIO.writeStringData(buffer, name);
|
TypeIO.writeStringData(buffer, name);
|
||||||
buffer.writeByte(Pack.byteValue(isAdmin) | (Pack.byteValue(dead) << 1) | (Pack.byteValue(isBoosting) << 2) | (Pack.byteValue(isTyping) << 3));
|
buffer.writeByte(Pack.byteValue(isAdmin) | (Pack.byteValue(dead) << 1) | (Pack.byteValue(isBoosting) << 2) | (Pack.byteValue(isTyping) << 3)| (Pack.byteValue(isBuilding) << 4));
|
||||||
buffer.writeInt(Color.rgba8888(color));
|
buffer.writeInt(Color.rgba8888(color));
|
||||||
buffer.writeByte(mech.id);
|
buffer.writeByte(mech.id);
|
||||||
buffer.writeInt(mining == null ? noSpawner : mining.pos());
|
buffer.writeInt(mining == null ? noSpawner : mining.pos());
|
||||||
@@ -932,6 +909,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
dead = (bools & 2) != 0;
|
dead = (bools & 2) != 0;
|
||||||
boolean boosting = (bools & 4) != 0;
|
boolean boosting = (bools & 4) != 0;
|
||||||
isTyping = (bools & 8) != 0;
|
isTyping = (bools & 8) != 0;
|
||||||
|
boolean building = (bools & 16) != 0;
|
||||||
color.set(buffer.readInt());
|
color.set(buffer.readInt());
|
||||||
mech = content.getByID(ContentType.mech, buffer.readByte());
|
mech = content.getByID(ContentType.mech, buffer.readByte());
|
||||||
int mine = buffer.readInt();
|
int mine = buffer.readInt();
|
||||||
@@ -950,6 +928,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
|
|||||||
velocity.y = lastvy;
|
velocity.y = lastvy;
|
||||||
}else{
|
}else{
|
||||||
mining = world.tile(mine);
|
mining = world.tile(mine);
|
||||||
|
isBuilding = building;
|
||||||
isBoosting = boosting;
|
isBoosting = boosting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,19 @@
|
|||||||
package io.anuke.mindustry.game;
|
package io.anuke.mindustry.game;
|
||||||
|
|
||||||
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.util.ArcAnnotate.*;
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.mindustry.Vars;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.mod.Mods.*;
|
import io.anuke.mindustry.mod.Mods.*;
|
||||||
import io.anuke.mindustry.type.ContentType;
|
import io.anuke.mindustry.type.*;
|
||||||
|
|
||||||
|
|
||||||
/** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */
|
/** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */
|
||||||
public abstract class Content{
|
public abstract class Content implements Comparable<Content>{
|
||||||
public final short id;
|
public final short id;
|
||||||
/** The mod that loaded this piece of content. */
|
/** The mod that loaded this piece of content. */
|
||||||
public @Nullable LoadedMod mod;
|
public @Nullable LoadedMod mod;
|
||||||
|
/** File that this content was loaded from. */
|
||||||
|
public @Nullable FileHandle sourceFile;
|
||||||
|
|
||||||
public Content(){
|
public Content(){
|
||||||
this.id = (short)Vars.content.getBy(getContentType()).size;
|
this.id = (short)Vars.content.getBy(getContentType()).size;
|
||||||
@@ -34,6 +37,11 @@ public abstract class Content{
|
|||||||
public void load(){
|
public void load(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Content c){
|
||||||
|
return Integer.compare(id, c.id);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return getContentType().name() + "#" + id;
|
return getContentType().name() + "#" + id;
|
||||||
|
|||||||
@@ -61,11 +61,13 @@ public class EventType{
|
|||||||
|
|
||||||
/** Called when a zone's requirements are met. */
|
/** Called when a zone's requirements are met. */
|
||||||
public static class ZoneRequireCompleteEvent{
|
public static class ZoneRequireCompleteEvent{
|
||||||
public final Zone zone, required;
|
public final Zone zoneMet, zoneForMet;
|
||||||
|
public final Objective objective;
|
||||||
|
|
||||||
public ZoneRequireCompleteEvent(Zone zone, Zone required){
|
public ZoneRequireCompleteEvent(Zone zoneMet, Zone zoneForMet, Objective objective){
|
||||||
this.zone = zone;
|
this.zoneMet = zoneMet;
|
||||||
this.required = required;
|
this.zoneForMet = zoneForMet;
|
||||||
|
this.objective = objective;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +132,13 @@ public class EventType{
|
|||||||
|
|
||||||
/** Called when a player deposits items to a block.*/
|
/** Called when a player deposits items to a block.*/
|
||||||
public static class DepositEvent{
|
public static class DepositEvent{
|
||||||
|
public final Tile tile;
|
||||||
|
public final Player player;
|
||||||
|
|
||||||
|
public DepositEvent(Tile tile, Player player){
|
||||||
|
this.tile = tile;
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class GameOverEvent{
|
public static class GameOverEvent{
|
||||||
|
|||||||
@@ -91,12 +91,17 @@ public class GlobalData{
|
|||||||
state.stats.itemsDelivered.getAndIncrement(item, 0, amount);
|
state.stats.itemsDelivered.getAndIncrement(item, 0, amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasItems(Array<ItemStack> stacks){
|
||||||
|
return !stacks.contains(s -> items.get(s.item, 0) < s.amount);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasItems(ItemStack[] stacks){
|
public boolean hasItems(ItemStack[] stacks){
|
||||||
for(ItemStack stack : stacks){
|
for(ItemStack stack : stacks){
|
||||||
if(items.get(stack.item, 0) < stack.amount){
|
if(!has(stack.item, stack.amount)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +112,13 @@ public class GlobalData{
|
|||||||
modified = true;
|
modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeItems(Array<ItemStack> stacks){
|
||||||
|
for(ItemStack stack : stacks){
|
||||||
|
items.getAndIncrement(stack.item, 0, -stack.amount);
|
||||||
|
}
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean has(Item item, int amount){
|
public boolean has(Item item, int amount){
|
||||||
return items.get(item, 0) >= amount;
|
return items.get(item, 0) >= amount;
|
||||||
}
|
}
|
||||||
@@ -150,6 +162,7 @@ public class GlobalData{
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void load(){
|
public void load(){
|
||||||
|
items.clear();
|
||||||
unlocked = Core.settings.getObject("unlocks", ObjectMap.class, ObjectMap::new);
|
unlocked = Core.settings.getObject("unlocks", ObjectMap.class, ObjectMap::new);
|
||||||
for(Item item : Vars.content.items()){
|
for(Item item : Vars.content.items()){
|
||||||
items.put(item, Core.settings.getInt("item-" + item.name, 0));
|
items.put(item, Core.settings.getInt("item-" + item.name, 0));
|
||||||
|
|||||||
27
core/src/io/anuke/mindustry/game/Objective.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package io.anuke.mindustry.game;
|
||||||
|
|
||||||
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
|
import io.anuke.mindustry.game.Objectives.*;
|
||||||
|
import io.anuke.mindustry.type.*;
|
||||||
|
|
||||||
|
/** Defines a specific objective for a game. */
|
||||||
|
public interface Objective{
|
||||||
|
|
||||||
|
/** @return whether this objective is met. */
|
||||||
|
boolean complete();
|
||||||
|
|
||||||
|
/** @return the string displayed when this objective is completed, in imperative form.
|
||||||
|
* e.g. when the objective is 'complete 10 waves', this would display "complete 10 waves".
|
||||||
|
* If this objective should not be displayed, should return null.*/
|
||||||
|
@Nullable String display();
|
||||||
|
|
||||||
|
/** Build a display for this zone requirement.*/
|
||||||
|
default void build(Table table){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
default Zone zone(){
|
||||||
|
return this instanceof ZoneObjective ? ((ZoneObjective)this).zone : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
96
core/src/io/anuke/mindustry/game/Objectives.java
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
package io.anuke.mindustry.game;
|
||||||
|
|
||||||
|
import io.anuke.arc.*;
|
||||||
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
|
import io.anuke.mindustry.type.*;
|
||||||
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
|
/** Holds objective classes. */
|
||||||
|
public class Objectives{
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
public static class Wave implements Objective{
|
||||||
|
public int wave;
|
||||||
|
|
||||||
|
public Wave(int wave){
|
||||||
|
this.wave = wave;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Wave(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean complete(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String display(){
|
||||||
|
//TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Unlock implements Objective{
|
||||||
|
public @NonNull Block block;
|
||||||
|
|
||||||
|
public Unlock(Block block){
|
||||||
|
this.block = block;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Unlock(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean complete(){
|
||||||
|
return block.unlocked();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String display(){
|
||||||
|
return Core.bundle.format("requirement.unlock", block.localizedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ZoneWave extends ZoneObjective{
|
||||||
|
public int wave;
|
||||||
|
|
||||||
|
public ZoneWave(Zone zone, int wave){
|
||||||
|
this.zone = zone;
|
||||||
|
this.wave = wave;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ZoneWave(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean complete(){
|
||||||
|
return zone.bestWave() >= wave;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String display(){
|
||||||
|
return Core.bundle.format("requirement.wave", wave, zone.localizedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Launched extends ZoneObjective{
|
||||||
|
|
||||||
|
public Launched(Zone zone){
|
||||||
|
this.zone = zone;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Launched(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean complete(){
|
||||||
|
return zone.hasLaunched();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String display(){
|
||||||
|
return Core.bundle.format("requirement.core", zone.localizedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract static class ZoneObjective implements Objective{
|
||||||
|
public @NonNull Zone zone;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package io.anuke.mindustry.game;
|
package io.anuke.mindustry.game;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Serialize;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.arc.collection.Array;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.mindustry.content.Items;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.io.JsonIO;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.type.ItemStack;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.type.Zone;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines current rules on how the game should function.
|
* Defines current rules on how the game should function.
|
||||||
@@ -69,6 +69,8 @@ public class Rules{
|
|||||||
public boolean tutorial = false;
|
public boolean tutorial = false;
|
||||||
/** Starting items put in cores */
|
/** Starting items put in cores */
|
||||||
public Array<ItemStack> loadout = Array.with(ItemStack.with(Items.copper, 100));
|
public Array<ItemStack> loadout = Array.with(ItemStack.with(Items.copper, 100));
|
||||||
|
/** Blocks that cannot be placed. */
|
||||||
|
public ObjectSet<Block> bannedBlocks = new ObjectSet<>();
|
||||||
|
|
||||||
/** Copies this ruleset exactly. Not very efficient at all, do not use often. */
|
/** Copies this ruleset exactly. Not very efficient at all, do not use often. */
|
||||||
public Rules copy(){
|
public Rules copy(){
|
||||||
|
|||||||
@@ -31,7 +31,11 @@ public abstract class UnlockableContent extends MappableContent{
|
|||||||
/** Returns a specific content icon, or the region {contentType}-{name} if not found.*/
|
/** Returns a specific content icon, or the region {contentType}-{name} if not found.*/
|
||||||
public TextureRegion icon(Cicon icon){
|
public TextureRegion icon(Cicon icon){
|
||||||
if(cicons[icon.ordinal()] == null){
|
if(cicons[icon.ordinal()] == null){
|
||||||
cicons[icon.ordinal()] = Core.atlas.find(getContentType().name() + "-" + name + "-" + icon.name(), Core.atlas.find(getContentType().name() + "-" + name + "-full", Core.atlas.find(getContentType().name() + "-" + name, Core.atlas.find(name))));
|
cicons[icon.ordinal()] = Core.atlas.find(getContentType().name() + "-" + name + "-" + icon.name(),
|
||||||
|
Core.atlas.find(getContentType().name() + "-" + name + "-full",
|
||||||
|
Core.atlas.find(getContentType().name() + "-" + name,
|
||||||
|
Core.atlas.find(name,
|
||||||
|
Core.atlas.find(name + "1")))));
|
||||||
}
|
}
|
||||||
return cicons[icon.ordinal()];
|
return cicons[icon.ordinal()];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,10 @@ import io.anuke.arc.graphics.glutils.*;
|
|||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.type.base.*;
|
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.Teams.*;
|
import io.anuke.mindustry.game.Teams.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.Block.*;
|
|
||||||
|
|
||||||
import static io.anuke.arc.Core.camera;
|
import static io.anuke.arc.Core.camera;
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -30,6 +28,7 @@ public class BlockRenderer implements Disposable{
|
|||||||
private int lastCamX, lastCamY, lastRangeX, lastRangeY;
|
private int lastCamX, lastCamY, lastRangeX, lastRangeY;
|
||||||
private int requestidx = 0;
|
private int requestidx = 0;
|
||||||
private int iterateidx = 0;
|
private int iterateidx = 0;
|
||||||
|
private float brokenFade = 0f;
|
||||||
private FrameBuffer shadows = new FrameBuffer(2, 2);
|
private FrameBuffer shadows = new FrameBuffer(2, 2);
|
||||||
private FrameBuffer fog = new FrameBuffer(2, 2);
|
private FrameBuffer fog = new FrameBuffer(2, 2);
|
||||||
private Array<Tile> outArray = new Array<>();
|
private Array<Tile> outArray = new Array<>();
|
||||||
@@ -125,13 +124,19 @@ public class BlockRenderer implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void drawBroken(){
|
public void drawBroken(){
|
||||||
if(unitGroups[player.getTeam().ordinal()].all().contains(p -> p instanceof BuilderDrone)){
|
if(control.input.isPlacing() || control.input.isBreaking()){
|
||||||
|
brokenFade = Mathf.lerpDelta(brokenFade, 1f, 0.1f);
|
||||||
|
}else{
|
||||||
|
brokenFade = Mathf.lerpDelta(brokenFade, 0f, 0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(brokenFade > 0.001f){
|
||||||
for(BrokenBlock block : state.teams.get(player.getTeam()).brokenBlocks){
|
for(BrokenBlock block : state.teams.get(player.getTeam()).brokenBlocks){
|
||||||
Block b = content.block(block.block);
|
Block b = content.block(block.block);
|
||||||
if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue;
|
if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue;
|
||||||
|
|
||||||
Draw.alpha(0.5f);
|
Draw.alpha(0.53f * brokenFade);
|
||||||
Draw.mixcol(Pal.accent, 0.2f + Mathf.absin(5f, 0.2f));
|
Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime(), 6f, 0.2f));
|
||||||
Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f);
|
Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f);
|
||||||
}
|
}
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
@@ -242,28 +247,34 @@ public class BlockRenderer implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void drawBlocks(Layer stopAt){
|
public void drawBlocks(Layer stopAt){
|
||||||
|
int startIdx = iterateidx;
|
||||||
for(; iterateidx < requestidx; iterateidx++){
|
for(; iterateidx < requestidx; iterateidx++){
|
||||||
|
BlockRequest request = requests.get(iterateidx);
|
||||||
|
|
||||||
if(iterateidx < requests.size && requests.get(iterateidx).layer.ordinal() > stopAt.ordinal()){
|
if(request.layer.ordinal() > stopAt.ordinal()){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockRequest req = requests.get(iterateidx);
|
if(request.layer == Layer.power){
|
||||||
Block block = req.tile.block();
|
if(iterateidx - startIdx > 0 && request.tile.pos() == requests.get(iterateidx - 1).tile.pos()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(req.layer == Layer.block){
|
Block block = request.tile.block();
|
||||||
block.draw(req.tile);
|
|
||||||
if(req.tile.entity != null && req.tile.entity.damaged()){
|
if(request.layer == Layer.block){
|
||||||
block.drawCracks(req.tile);
|
block.draw(request.tile);
|
||||||
|
if(request.tile.entity != null && request.tile.entity.damaged()){
|
||||||
|
block.drawCracks(request.tile);
|
||||||
}
|
}
|
||||||
if(block.synthetic() && req.tile.getTeam() != player.getTeam()){
|
if(block.synthetic() && request.tile.getTeam() != player.getTeam()){
|
||||||
block.drawTeam(req.tile);
|
block.drawTeam(request.tile);
|
||||||
}
|
}
|
||||||
}else if(req.layer == block.layer){
|
}else if(request.layer == block.layer){
|
||||||
block.drawLayer(req.tile);
|
block.drawLayer(request.tile);
|
||||||
}else if(req.layer == block.layer2){
|
}else if(request.layer == block.layer2){
|
||||||
block.drawLayer2(req.tile);
|
block.drawLayer2(request.tile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -328,7 +339,9 @@ public class BlockRenderer implements Disposable{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(BlockRequest other){
|
public int compareTo(BlockRequest other){
|
||||||
return layer.compareTo(other.layer);
|
int compare = layer.compareTo(other.layer);
|
||||||
|
|
||||||
|
return (compare != 0) ? compare : Integer.compare(tile.pos(), other.tile.pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ public class OverlayRenderer{
|
|||||||
public void drawBottom(){
|
public void drawBottom(){
|
||||||
InputHandler input = control.input;
|
InputHandler input = control.input;
|
||||||
|
|
||||||
if(!input.isDrawing() || player.isDead()) return;
|
if(player.isDead()) return;
|
||||||
|
|
||||||
input.drawOutlined();
|
input.drawBottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawTop(){
|
public void drawTop(){
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ public enum Binding implements KeyBind{
|
|||||||
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),
|
||||||
|
clear_building(KeyCode.Q),
|
||||||
|
pause_building(KeyCode.E),
|
||||||
rotate(new Axis(KeyCode.SCROLL)),
|
rotate(new Axis(KeyCode.SCROLL)),
|
||||||
rotateplaced(KeyCode.R),
|
rotateplaced(KeyCode.R),
|
||||||
diagonal_placement(KeyCode.CONTROL_LEFT),
|
diagonal_placement(KeyCode.CONTROL_LEFT),
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ import io.anuke.arc.Graphics.*;
|
|||||||
import io.anuke.arc.Graphics.Cursor.*;
|
import io.anuke.arc.Graphics.Cursor.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.scene.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.mindustry.content.*;
|
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
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.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.input.PlaceUtils.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import static io.anuke.arc.Core.scene;
|
import static io.anuke.arc.Core.scene;
|
||||||
@@ -23,101 +23,77 @@ import static io.anuke.mindustry.input.PlaceMode.*;
|
|||||||
public class DesktopInput extends InputHandler{
|
public class DesktopInput extends InputHandler{
|
||||||
/** Current cursor type. */
|
/** Current cursor type. */
|
||||||
private Cursor cursorType = SystemCursor.arrow;
|
private Cursor cursorType = SystemCursor.arrow;
|
||||||
|
|
||||||
/** Position where the player started dragging a line. */
|
/** Position where the player started dragging a line. */
|
||||||
private int selectX, selectY;
|
private int selectX, selectY;
|
||||||
|
/** Last known line positions.*/
|
||||||
|
private int lastLineX, lastLineY;
|
||||||
/** Whether selecting mode is active. */
|
/** Whether selecting mode is active. */
|
||||||
private PlaceMode mode;
|
private PlaceMode mode;
|
||||||
/** Animation scale for line. */
|
/** Animation scale for line. */
|
||||||
private float selectScale;
|
private float selectScale;
|
||||||
|
/** Selected build request for movement. */
|
||||||
|
private @Nullable BuildRequest sreq;
|
||||||
|
/** Whether player is currently deleting removal requests. */
|
||||||
|
private boolean deleting = false;
|
||||||
|
|
||||||
private int prevX, prevY, prevRotation;
|
@Override
|
||||||
|
public void buildUI(Group group){
|
||||||
/** Draws a placement icon for a specific block. */
|
group.fill(t -> {
|
||||||
void drawPlace(int x, int y, Block block, int rotation, int prevX, int prevY, int prevRotation){
|
t.bottom().update(() -> t.getColor().a = Mathf.lerpDelta(t.getColor().a, player.isBuilding() ? 1f : 0f, 0.15f));
|
||||||
if(validPlace(x, y, block, rotation)){
|
t.visible(() -> Core.settings.getBool("hints"));
|
||||||
block.getPlaceDraw(placeDraw, rotation, prevX, prevY, prevRotation);
|
t.table(Styles.black6, b -> {
|
||||||
|
b.defaults().left();
|
||||||
Draw.color();
|
b.label(() -> Core.bundle.format(!player.isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.name())).style(Styles.outlineLabel);
|
||||||
Draw.mixcol(Pal.accent, 0.12f + Mathf.absin(Time.time(), 8f, 0.35f));
|
b.row();
|
||||||
Draw.rect(placeDraw.region, x * tilesize + block.offset(), y * tilesize + block.offset(),
|
b.add(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.name())).style(Styles.outlineLabel);
|
||||||
placeDraw.region.getWidth() * selectScale * Draw.scl * placeDraw.scalex,
|
}).margin(10f);
|
||||||
placeDraw.region.getHeight() * selectScale * Draw.scl * placeDraw.scaley,
|
});
|
||||||
block.rotate ? placeDraw.rotation * 90 : 0);
|
|
||||||
|
|
||||||
Draw.color(Pal.accent);
|
|
||||||
for(int i = 0; i < 4; i++){
|
|
||||||
Point2 p = Geometry.d8edge[i];
|
|
||||||
float offset = -Math.max(block.size - 1, 0) / 2f * tilesize;
|
|
||||||
if(i % 2 == 0)
|
|
||||||
Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90);
|
|
||||||
}
|
|
||||||
Draw.color();
|
|
||||||
Draw.mixcol();
|
|
||||||
}else{
|
|
||||||
Draw.color(Pal.removeBack);
|
|
||||||
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset() - 1, block.size * tilesize / 2f - 1);
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset(), block.size * tilesize / 2f - 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDrawing(){
|
public void drawTop(){
|
||||||
return mode != none || block != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawOutlined(){
|
|
||||||
Lines.stroke(1f);
|
Lines.stroke(1f);
|
||||||
int cursorX = tileX(Core.input.mouseX());
|
int cursorX = tileX(Core.input.mouseX());
|
||||||
int cursorY = tileY(Core.input.mouseY());
|
int cursorY = tileY(Core.input.mouseY());
|
||||||
|
|
||||||
//draw selection(s)
|
//draw selection(s)
|
||||||
if(mode == placing && block != null){
|
if(mode == placing && block != null){
|
||||||
prevX = selectX;
|
for(int i = 0; i < lineRequests.size; i++){
|
||||||
prevY = selectY;
|
BuildRequest req = lineRequests.get(i);
|
||||||
prevRotation = rotation;
|
if(i == lineRequests.size - 1 && req.block.rotate){
|
||||||
|
drawArrow(block, req.x, req.y, req.rotation);
|
||||||
iterateLine(selectX, selectY, cursorX, cursorY, l -> {
|
|
||||||
if(l.last && block.rotate){
|
|
||||||
drawArrow(block, l.x, l.y, l.rotation);
|
|
||||||
}
|
|
||||||
drawPlace(l.x, l.y, block, l.rotation, prevX - l.x, prevY - l.y, prevRotation);
|
|
||||||
|
|
||||||
prevX = l.x;
|
|
||||||
prevY = l.y;
|
|
||||||
prevRotation = l.rotation;
|
|
||||||
});
|
|
||||||
|
|
||||||
}else if(mode == breaking){
|
|
||||||
NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, selectX, selectY, cursorX, cursorY, false, maxLength, 1f);
|
|
||||||
NormalizeResult dresult = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength);
|
|
||||||
|
|
||||||
for(int x = dresult.x; x <= dresult.x2; x++){
|
|
||||||
for(int y = dresult.y; y <= dresult.y2; y++){
|
|
||||||
Tile tile = world.ltile(x, y);
|
|
||||||
if(tile == null || !validBreak(tile.x, tile.y)) continue;
|
|
||||||
|
|
||||||
Draw.color(Pal.removeBack);
|
|
||||||
Lines.square(tile.drawx(), tile.drawy() - 1, tile.block().size * tilesize / 2f - 1);
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
Lines.square(tile.drawx(), tile.drawy(), tile.block().size * tilesize / 2f - 1);
|
|
||||||
}
|
}
|
||||||
|
drawRequest(lineRequests.get(i));
|
||||||
}
|
}
|
||||||
|
}else if(mode == breaking){
|
||||||
Draw.color(Pal.removeBack);
|
drawSelection(selectX, selectY, cursorX, cursorY);
|
||||||
Lines.rect(result.x, result.y - 1, result.x2 - result.x, result.y2 - result.y);
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y);
|
|
||||||
}else if(isPlacing()){
|
}else if(isPlacing()){
|
||||||
if(block.rotate){
|
if(block.rotate){
|
||||||
drawArrow(block, cursorX, cursorY, rotation);
|
drawArrow(block, cursorX, cursorY, rotation);
|
||||||
}
|
}
|
||||||
drawPlace(cursorX, cursorY, block, rotation, cursorX, cursorY, rotation);
|
Draw.color();
|
||||||
|
drawRequest(cursorX, cursorY, block, rotation);
|
||||||
block.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, block, rotation));
|
block.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, block, rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(mode == none && !isPlacing()){
|
||||||
|
BuildRequest req = getRequest(cursorX, cursorY);
|
||||||
|
if(req != null){
|
||||||
|
drawSelected(req.x, req.y, req.breaking ? req.tile().block() : req.block, Pal.accent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sreq != null){
|
||||||
|
boolean valid = validPlace(sreq.x, sreq.y, sreq.block, sreq.rotation, sreq);
|
||||||
|
if(sreq.block.rotate){
|
||||||
|
drawArrow(sreq.block, sreq.x, sreq.y, sreq.rotation, valid);
|
||||||
|
}
|
||||||
|
|
||||||
|
sreq.block.drawRequest(sreq, allRequests(), valid);
|
||||||
|
|
||||||
|
drawSelected(sreq.x, sreq.y, sreq.block, getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null ? Pal.remove : Pal.accent);
|
||||||
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,6 +147,14 @@ public class DesktopInput extends InputHandler{
|
|||||||
|
|
||||||
rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4);
|
rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4);
|
||||||
|
|
||||||
|
if(sreq != null){
|
||||||
|
sreq.rotation = Mathf.mod(sreq.rotation + (int)Core.input.axisTap(Binding.rotate), 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0 && isPlacing() && mode == placing){
|
||||||
|
updateLine(selectX, selectY);
|
||||||
|
}
|
||||||
|
|
||||||
Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY());
|
Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY());
|
||||||
|
|
||||||
if(cursor != null){
|
if(cursor != null){
|
||||||
@@ -186,6 +170,10 @@ public class DesktopInput extends InputHandler{
|
|||||||
cursorType = ui.drillCursor;
|
cursorType = ui.drillCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(getRequest(cursor.x, cursor.y) != null && mode == none){
|
||||||
|
cursorType = SystemCursor.hand;
|
||||||
|
}
|
||||||
|
|
||||||
if(canTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y)){
|
if(canTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y)){
|
||||||
cursorType = ui.unloadCursor;
|
cursorType = ui.unloadCursor;
|
||||||
}
|
}
|
||||||
@@ -202,6 +190,11 @@ public class DesktopInput extends InputHandler{
|
|||||||
cursorType = SystemCursor.arrow;
|
cursorType = SystemCursor.arrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBreaking(){
|
||||||
|
return mode == breaking;
|
||||||
|
}
|
||||||
|
|
||||||
void pollInput(){
|
void pollInput(){
|
||||||
Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY());
|
Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY());
|
||||||
int cursorX = tileX(Core.input.mouseX());
|
int cursorX = tileX(Core.input.mouseX());
|
||||||
@@ -211,11 +204,46 @@ public class DesktopInput extends InputHandler{
|
|||||||
player.setMineTile(null);
|
player.setMineTile(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Core.input.keyTap(Binding.clear_building)){
|
||||||
|
player.clearBuilding();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sreq != null){
|
||||||
|
float offset = ((sreq.block.size + 2) % 2) * tilesize / 2f;
|
||||||
|
float x = Core.input.mouseWorld().x + offset;
|
||||||
|
float y = Core.input.mouseWorld().y + offset;
|
||||||
|
sreq.x = (int)(x / tilesize);
|
||||||
|
sreq.y = (int)(y / tilesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(block == null || mode != placing){
|
||||||
|
lineRequests.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Core.input.keyTap(Binding.pause_building)){
|
||||||
|
player.isBuilding = !player.isBuilding;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((cursorX != lastLineX || cursorY != lastLineY) && isPlacing() && mode == placing){
|
||||||
|
updateLine(selectX, selectY);
|
||||||
|
lastLineX = cursorX;
|
||||||
|
lastLineY = cursorY;
|
||||||
|
}
|
||||||
|
|
||||||
if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){
|
if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){
|
||||||
|
BuildRequest req = getRequest(cursorX, cursorY);
|
||||||
|
|
||||||
if(isPlacing()){
|
if(isPlacing()){
|
||||||
selectX = cursorX;
|
selectX = cursorX;
|
||||||
selectY = cursorY;
|
selectY = cursorY;
|
||||||
|
lastLineX = cursorX;
|
||||||
|
lastLineY = cursorY;
|
||||||
mode = placing;
|
mode = placing;
|
||||||
|
updateLine(selectX, selectY);
|
||||||
|
}else if(req != null && !req.breaking && mode == none && !req.initialized){
|
||||||
|
sreq = req;
|
||||||
|
}else if(req != null && req.breaking){
|
||||||
|
deleting = true;
|
||||||
}else if(selected != null){
|
}else if(selected != null){
|
||||||
//only begin shooting if there's no cursor event
|
//only begin shooting if there's no cursor event
|
||||||
if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && player.buildQueue().size == 0 && !droppingItem &&
|
if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && player.buildQueue().size == 0 && !droppingItem &&
|
||||||
@@ -225,23 +253,28 @@ public class DesktopInput extends InputHandler{
|
|||||||
}else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine
|
}else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine
|
||||||
player.isShooting = true;
|
player.isShooting = true;
|
||||||
}
|
}
|
||||||
}else if(Core.input.keyTap(Binding.deselect) && (block != null || mode != none || player.isBuilding()) &&
|
}else if(Core.input.keyTap(Binding.deselect) && block != null){
|
||||||
!(player.buildRequest() != null && player.buildRequest().breaking && Core.keybinds.get(Binding.deselect) == Core.keybinds.get(Binding.break_block))){
|
|
||||||
if(block == null){
|
|
||||||
player.clearBuilding();
|
|
||||||
}
|
|
||||||
|
|
||||||
block = null;
|
block = null;
|
||||||
mode = none;
|
mode = none;
|
||||||
}else if(Core.input.keyTap(Binding.break_block) && !Core.scene.hasMouse()){
|
}else if(Core.input.keyTap(Binding.break_block) && !Core.scene.hasMouse()){
|
||||||
//is recalculated because setting the mode to breaking removes potential multiblock cursor offset
|
//is recalculated because setting the mode to breaking removes potential multiblock cursor offset
|
||||||
|
deleting = false;
|
||||||
mode = breaking;
|
mode = breaking;
|
||||||
selectX = tileX(Core.input.mouseX());
|
selectX = tileX(Core.input.mouseX());
|
||||||
selectY = tileY(Core.input.mouseY());
|
selectY = tileY(Core.input.mouseY());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode == placing && block != null){
|
if(Core.input.keyDown(Binding.select) && mode == none && !isPlacing() && deleting){
|
||||||
if (!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int) Core.input.axisTap(Binding.rotate) != 0)){
|
BuildRequest req = getRequest(cursorX, cursorY);
|
||||||
|
if(req != null && req.breaking){
|
||||||
|
player.buildQueue().remove(req);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
deleting = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mode == placing && block != null){
|
||||||
|
if(!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int) Core.input.axisTap(Binding.rotate) != 0)){
|
||||||
rotation = ((int)((Angles.angle(selectX, selectY, cursorX, cursorY) + 45) / 90f)) % 4;
|
rotation = ((int)((Angles.angle(selectX, selectY, cursorX, cursorY) + 45) / 90f)) % 4;
|
||||||
overrideLineRotation = true;
|
overrideLineRotation = true;
|
||||||
}
|
}
|
||||||
@@ -252,27 +285,24 @@ public class DesktopInput extends InputHandler{
|
|||||||
if(Core.input.keyRelease(Binding.break_block) || Core.input.keyRelease(Binding.select)){
|
if(Core.input.keyRelease(Binding.break_block) || Core.input.keyRelease(Binding.select)){
|
||||||
|
|
||||||
if(mode == placing && block != null){ //touch up while placing, place everything in selection
|
if(mode == placing && block != null){ //touch up while placing, place everything in selection
|
||||||
iterateLine(selectX, selectY, cursorX, cursorY, l -> {
|
flushRequests(lineRequests);
|
||||||
rotation = l.rotation;
|
lineRequests.clear();
|
||||||
tryPlaceBlock(l.x, l.y);
|
|
||||||
});
|
|
||||||
Events.fire(new LineConfirmEvent());
|
Events.fire(new LineConfirmEvent());
|
||||||
}else if(mode == breaking){ //touch up while breaking, break everything in selection
|
}else if(mode == breaking){ //touch up while breaking, break everything in selection
|
||||||
NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength);
|
removeSelection(selectX, selectY, cursorX, cursorY);
|
||||||
for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){
|
|
||||||
for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){
|
|
||||||
int wx = selectX + x * Mathf.sign(cursorX - selectX);
|
|
||||||
int wy = selectY + y * Mathf.sign(cursorY - selectY);
|
|
||||||
|
|
||||||
tryBreakBlock(wx, wy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(selected != null){
|
if(selected != null){
|
||||||
tryDropItems(selected.link(), Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
tryDropItems(selected.link(), Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(sreq != null){
|
||||||
|
if(getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null){
|
||||||
|
player.buildQueue().remove(sreq, true);
|
||||||
|
}
|
||||||
|
sreq = null;
|
||||||
|
}
|
||||||
|
|
||||||
mode = none;
|
mode = none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -298,6 +328,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
droppingItem = false;
|
droppingItem = false;
|
||||||
mode = none;
|
mode = none;
|
||||||
block = null;
|
block = null;
|
||||||
|
sreq = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,11 @@ import io.anuke.arc.function.*;
|
|||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
|
import io.anuke.arc.input.GestureDetector.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
|
import io.anuke.arc.scene.*;
|
||||||
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
@@ -17,21 +20,26 @@ import io.anuke.mindustry.entities.effect.*;
|
|||||||
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
|
import io.anuke.mindustry.game.Teams.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.input.PlaceUtils.*;
|
||||||
import io.anuke.mindustry.net.*;
|
import io.anuke.mindustry.net.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.fragments.*;
|
import io.anuke.mindustry.ui.fragments.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public abstract class InputHandler implements InputProcessor{
|
public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||||
/** Used for dropping items. */
|
/** Used for dropping items. */
|
||||||
final static float playerSelectRange = mobile ? 17f : 11f;
|
final static float playerSelectRange = mobile ? 17f : 11f;
|
||||||
/** Maximum line length. */
|
/** Maximum line length. */
|
||||||
final static int maxLength = 100;
|
final static int maxLength = 100;
|
||||||
final static Vector2 stackTrns = new Vector2();
|
final static Vector2 stackTrns = new Vector2();
|
||||||
|
final static Rectangle r1 = new Rectangle(), r2 = new Rectangle();
|
||||||
/** Distance on the back from where items originate. */
|
/** Distance on the back from where items originate. */
|
||||||
final static float backTrns = 3f;
|
final static float backTrns = 3f;
|
||||||
|
|
||||||
@@ -41,9 +49,14 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
public boolean overrideLineRotation;
|
public boolean overrideLineRotation;
|
||||||
public int rotation;
|
public int rotation;
|
||||||
public boolean droppingItem;
|
public boolean droppingItem;
|
||||||
|
public Group uiGroup;
|
||||||
|
|
||||||
protected PlaceDraw placeDraw = new PlaceDraw();
|
protected GestureDetector detector;
|
||||||
private PlaceLine line = new PlaceLine();
|
protected PlaceLine line = new PlaceLine();
|
||||||
|
protected BuildRequest resultreq;
|
||||||
|
protected BuildRequest brequest = new BuildRequest();
|
||||||
|
protected Array<BuildRequest> lineRequests = new Array<>();
|
||||||
|
protected Array<BuildRequest> selectRequests = new Array<>();
|
||||||
|
|
||||||
//methods to override
|
//methods to override
|
||||||
|
|
||||||
@@ -92,7 +105,7 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
int[] remaining = {accepted, accepted};
|
int[] remaining = {accepted, accepted};
|
||||||
Block block = tile.block();
|
Block block = tile.block();
|
||||||
|
|
||||||
Events.fire(new DepositEvent());
|
Core.app.post(() -> Events.fire(new DepositEvent(tile, player)));
|
||||||
|
|
||||||
for(int i = 0; i < sent; i++){
|
for(int i = 0; i < sent; i++){
|
||||||
boolean end = i == sent - 1;
|
boolean end = i == sent - 1;
|
||||||
@@ -134,6 +147,14 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
tile.block().configured(tile, player, value);
|
tile.block().configured(tile, player, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Eachable<BuildRequest> allRequests(){
|
||||||
|
return cons -> {
|
||||||
|
for(BuildRequest request : player.buildQueue()) cons.accept(request);
|
||||||
|
for(BuildRequest request : selectRequests) cons.accept(request);
|
||||||
|
for(BuildRequest request : lineRequests) cons.accept(request);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public OverlayFragment getFrag(){
|
public OverlayFragment getFrag(){
|
||||||
return frag;
|
return frag;
|
||||||
}
|
}
|
||||||
@@ -150,7 +171,11 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
return Core.input.mouseY();
|
return Core.input.mouseY();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildUI(Table table){
|
public void buildPlacementUI(Table table){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void buildUI(Group group){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +183,7 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawOutlined(){
|
public void drawBottom(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,8 +191,217 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDrawing(){
|
public void drawSelected(int x, int y, Block block, Color color){
|
||||||
return false;
|
Draw.color(color);
|
||||||
|
for(int i = 0; i < 4; i++){
|
||||||
|
Point2 p = Geometry.d8edge[i];
|
||||||
|
float offset = -Math.max(block.size - 1, 0) / 2f * tilesize;
|
||||||
|
Draw.rect("block-select",
|
||||||
|
x*tilesize + block.offset() + offset * p.x,
|
||||||
|
y*tilesize + block.offset() + offset * p.y, i * 90);
|
||||||
|
}
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawBreaking(BuildRequest request){
|
||||||
|
if(request.breaking){
|
||||||
|
drawBreaking(request.x, request.y);
|
||||||
|
}else{
|
||||||
|
drawSelected(request.x, request.y, request.tile().block(), Pal.remove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawBreaking(int x, int y){
|
||||||
|
Tile tile = world.ltile(x, y);
|
||||||
|
if(tile == null) return;
|
||||||
|
Block block = tile.block();
|
||||||
|
|
||||||
|
drawSelected(x, y, block, Pal.remove);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the selection request that overlaps this position, or null. */
|
||||||
|
protected BuildRequest getRequest(int x, int y){
|
||||||
|
return getRequest(x, y, 1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the selection request that overlaps this position, or null. */
|
||||||
|
protected BuildRequest getRequest(int x, int y, int size, BuildRequest skip){
|
||||||
|
float offset = ((size + 1) % 2) * tilesize / 2f;
|
||||||
|
r2.setSize(tilesize * size);
|
||||||
|
r2.setCenter(x * tilesize + offset, y * tilesize + offset);
|
||||||
|
resultreq = null;
|
||||||
|
|
||||||
|
Predicate<BuildRequest> test = req -> {
|
||||||
|
if(req == skip) return false;
|
||||||
|
Tile other = req.tile();
|
||||||
|
|
||||||
|
if(other == null) return false;
|
||||||
|
|
||||||
|
if(!req.breaking){
|
||||||
|
r1.setSize(req.block.size * tilesize);
|
||||||
|
r1.setCenter(other.worldx() + req.block.offset(), other.worldy() + req.block.offset());
|
||||||
|
}else{
|
||||||
|
r1.setSize(other.block().size * tilesize);
|
||||||
|
r1.setCenter(other.worldx() + other.block().offset(), other.worldy() + other.block().offset());
|
||||||
|
}
|
||||||
|
|
||||||
|
return r2.overlaps(r1);
|
||||||
|
};
|
||||||
|
|
||||||
|
for(BuildRequest req : player.buildQueue()){
|
||||||
|
if(test.test(req)) return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(BuildRequest req : selectRequests){
|
||||||
|
if(test.test(req)) return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void drawSelection(int x1, int y1, int x2, int y2){
|
||||||
|
NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f);
|
||||||
|
NormalizeResult dresult = PlaceUtils.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength);
|
||||||
|
|
||||||
|
for(int x = dresult.x; x <= dresult.x2; x++){
|
||||||
|
for(int y = dresult.y; y <= dresult.y2; y++){
|
||||||
|
Tile tile = world.ltile(x, y);
|
||||||
|
if(tile == null || !validBreak(tile.x, tile.y)) continue;
|
||||||
|
|
||||||
|
drawBreaking(tile.x, tile.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Tmp.r1.set(result.x, result.y, result.x2 - result.x, result.y2 - result.y);
|
||||||
|
|
||||||
|
Draw.color(Pal.remove);
|
||||||
|
Lines.stroke(1f);
|
||||||
|
|
||||||
|
for(BuildRequest req : player.buildQueue()){
|
||||||
|
if(req.breaking) continue;
|
||||||
|
if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){
|
||||||
|
drawBreaking(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
for(BuildRequest req : selectRequests){
|
||||||
|
if(req.breaking) continue;
|
||||||
|
if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){
|
||||||
|
drawBreaking(req);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
for(BrokenBlock req : state.teams.get(player.getTeam()).brokenBlocks){
|
||||||
|
Block block = content.block(req.block);
|
||||||
|
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
|
||||||
|
drawSelected(req.x, req.y, content.block(req.block), Pal.remove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Lines.stroke(2f);
|
||||||
|
|
||||||
|
Draw.color(Pal.removeBack);
|
||||||
|
Lines.rect(result.x, result.y - 1, result.x2 - result.x, result.y2 - result.y);
|
||||||
|
Draw.color(Pal.remove);
|
||||||
|
Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void flushSelectRequests(Array<BuildRequest> requests){
|
||||||
|
for(BuildRequest req : requests){
|
||||||
|
if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){
|
||||||
|
selectRequests.add(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void flushRequests(Array<BuildRequest> requests){
|
||||||
|
for(BuildRequest req : requests){
|
||||||
|
if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){
|
||||||
|
player.addBuildRequest(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void drawRequest(BuildRequest request){
|
||||||
|
drawRequest(request.x, request.y, request.block, request.rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Draws a placement icon for a specific block. */
|
||||||
|
protected void drawRequest(int x, int y, Block block, int rotation){
|
||||||
|
brequest.set(x, y, rotation, block);
|
||||||
|
brequest.animScale = 1f;
|
||||||
|
block.drawRequest(brequest, allRequests(), validPlace(x, y, block, rotation));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Remove everything from the queue in a selection. */
|
||||||
|
protected void removeSelection(int x1, int y1, int x2, int y2){
|
||||||
|
removeSelection(x1, y1, x2, y2, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Remove everything from the queue in a selection. */
|
||||||
|
protected void removeSelection(int x1, int y1, int x2, int y2, boolean flush){
|
||||||
|
NormalizeResult result = PlaceUtils.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength);
|
||||||
|
for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){
|
||||||
|
for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){
|
||||||
|
int wx = x1 + x * Mathf.sign(x2 - x1);
|
||||||
|
int wy = y1 + y * Mathf.sign(y2 - y1);
|
||||||
|
|
||||||
|
Tile tile = world.ltile(wx, wy);
|
||||||
|
|
||||||
|
if(tile == null) continue;
|
||||||
|
|
||||||
|
if(!flush){
|
||||||
|
tryBreakBlock(wx, wy);
|
||||||
|
}else if(validBreak(tile.x, tile.y) && !selectRequests.contains(r -> r.tile() != null && r.tile().link() == tile)){
|
||||||
|
selectRequests.add(new BuildRequest(tile.x, tile.y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove build requests
|
||||||
|
Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize);
|
||||||
|
|
||||||
|
Iterator<BuildRequest> it = player.buildQueue().iterator();
|
||||||
|
while(it.hasNext()){
|
||||||
|
BuildRequest req = it.next();
|
||||||
|
if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
it = selectRequests.iterator();
|
||||||
|
while(it.hasNext()){
|
||||||
|
BuildRequest req = it.next();
|
||||||
|
if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
//remove blocks to rebuild
|
||||||
|
Iterator<BrokenBlock> broken = state.teams.get(player.getTeam()).brokenBlocks.iterator();
|
||||||
|
while(broken.hasNext()){
|
||||||
|
BrokenBlock req = broken.next();
|
||||||
|
Block block = content.block(req.block);
|
||||||
|
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
|
||||||
|
broken.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateLine(int x1, int y1, int x2, int y2){
|
||||||
|
lineRequests.clear();
|
||||||
|
iterateLine(x1, y1, x2, y2, l -> {
|
||||||
|
rotation = l.rotation;
|
||||||
|
BuildRequest req = new BuildRequest(l.x, l.y, l.rotation, block);
|
||||||
|
req.animScale = 1f;
|
||||||
|
lineRequests.add(req);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateLine(int x1, int y1){
|
||||||
|
updateLine(x1, y1, tileX(getMouseX()), tileY(getMouseY()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Handles tile tap events that are not platform specific. */
|
/** Handles tile tap events that are not platform specific. */
|
||||||
@@ -214,12 +448,13 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
//clear when the player taps on something else
|
//clear when the player taps on something else
|
||||||
if(!consumed && !mobile && player.isBuilding() && block == null){
|
if(!consumed && !mobile && player.isBuilding() && block == null){
|
||||||
player.clearBuilding();
|
//player.clearBuilding();
|
||||||
block = null;
|
block = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if(!showedInventory){
|
if(!showedInventory){
|
||||||
frag.inv.hide();
|
frag.inv.hide();
|
||||||
@@ -288,6 +523,10 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
return block != null;
|
return block != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isBreaking(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public float mouseAngle(float x, float y){
|
public float mouseAngle(float x, float y){
|
||||||
return Core.input.mouseWorld(getMouseX(), getMouseY()).sub(x, y).angle();
|
return Core.input.mouseWorld(getMouseX(), getMouseY()).sub(x, y).angle();
|
||||||
}
|
}
|
||||||
@@ -301,16 +540,36 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
table.clear();
|
table.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(detector != null){
|
||||||
|
Core.input.removeProcessor(detector);
|
||||||
|
}
|
||||||
|
if(uiGroup != null){
|
||||||
|
uiGroup.remove();
|
||||||
|
uiGroup = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(){
|
public void add(){
|
||||||
|
Core.input.addProcessor(detector = new GestureDetector(20, 0.5f, 0.4f, 0.15f, this));
|
||||||
Core.input.addProcessor(this);
|
Core.input.addProcessor(this);
|
||||||
if(Core.scene != null){
|
if(Core.scene != null){
|
||||||
Table table = (Table)Core.scene.find("inputTable");
|
Table table = (Table)Core.scene.find("inputTable");
|
||||||
if(table != null){
|
if(table != null){
|
||||||
table.clear();
|
table.clear();
|
||||||
buildUI(table);
|
buildPlacementUI(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uiGroup = new WidgetGroup();
|
||||||
|
uiGroup.touchable(Touchable.childrenOnly);
|
||||||
|
uiGroup.setFillParent(true);
|
||||||
|
ui.hudGroup.addChild(uiGroup);
|
||||||
|
buildUI(uiGroup);
|
||||||
|
|
||||||
|
frag.add();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(player != null){
|
||||||
|
player.isBuilding = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,6 +615,15 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean validPlace(int x, int y, Block type, int rotation){
|
public boolean validPlace(int x, int y, Block type, int rotation){
|
||||||
|
return validPlace(x, y, type, rotation, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean validPlace(int x, int y, Block type, int rotation, BuildRequest ignore){
|
||||||
|
for(BuildRequest req : player.buildQueue()){
|
||||||
|
if(req != ignore && !req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2))){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return Build.validPlace(player.getTeam(), x, y, type, rotation);
|
return Build.validPlace(player.getTeam(), x, y, type, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,8 +675,8 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
|
|
||||||
float angle = Angles.angle(startX, startY, endX, endY);
|
float angle = Angles.angle(startX, startY, endX, endY);
|
||||||
int baseRotation = rotation;
|
int baseRotation = rotation;
|
||||||
if (!overrideLineRotation || diagonal){
|
if(!overrideLineRotation || diagonal){
|
||||||
baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4;
|
baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tmp.r3.set(-1, -1, 0, 0);
|
Tmp.r3.set(-1, -1, 0, 0);
|
||||||
@@ -423,7 +691,7 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
Point2 next = i == points.size - 1 ? null : points.get(i + 1);
|
Point2 next = i == points.size - 1 ? null : points.get(i + 1);
|
||||||
line.x = point.x;
|
line.x = point.x;
|
||||||
line.y = point.y;
|
line.y = point.y;
|
||||||
if (!overrideLineRotation || diagonal){
|
if(!overrideLineRotation || diagonal){
|
||||||
line.rotation = next != null ? Tile.relativeTo(point.x, point.y, next.x, next.y) : baseRotation;
|
line.rotation = next != null ? Tile.relativeTo(point.x, point.y, next.x, next.y) : baseRotation;
|
||||||
}else{
|
}else{
|
||||||
line.rotation = rotation;
|
line.rotation = rotation;
|
||||||
@@ -435,13 +703,6 @@ public abstract class InputHandler implements InputProcessor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PlaceDraw{
|
|
||||||
public int rotation, scalex, scaley;
|
|
||||||
public TextureRegion region;
|
|
||||||
|
|
||||||
public static final PlaceDraw instance = new PlaceDraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
class PlaceLine{
|
class PlaceLine{
|
||||||
public int x, y, rotation;
|
public int x, y, rotation;
|
||||||
public boolean last;
|
public boolean last;
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ package io.anuke.mindustry.input;
|
|||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.*;
|
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.input.*;
|
|
||||||
import io.anuke.arc.input.GestureDetector.*;
|
import io.anuke.arc.input.GestureDetector.*;
|
||||||
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
|
import io.anuke.arc.scene.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
@@ -19,7 +19,6 @@ import io.anuke.mindustry.entities.type.*;
|
|||||||
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.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.input.PlaceUtils.*;
|
|
||||||
import io.anuke.mindustry.ui.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
@@ -29,17 +28,15 @@ import static io.anuke.mindustry.input.PlaceMode.*;
|
|||||||
public class MobileInput extends InputHandler implements GestureListener{
|
public class MobileInput extends InputHandler implements GestureListener{
|
||||||
/** Maximum speed the player can pan. */
|
/** Maximum speed the player can pan. */
|
||||||
private static final float maxPanSpeed = 1.3f;
|
private static final float maxPanSpeed = 1.3f;
|
||||||
private static Rectangle r1 = new Rectangle(), r2 = new Rectangle();
|
|
||||||
/** Distance to edge of screen to start panning. */
|
/** Distance to edge of screen to start panning. */
|
||||||
private final float edgePan = Scl.scl(60f);
|
private final float edgePan = Scl.scl(60f);
|
||||||
|
|
||||||
//gesture data
|
//gesture data
|
||||||
private Vector2 vector = new Vector2();
|
private Vector2 vector = new Vector2();
|
||||||
private float lastZoom = -1;
|
private float lastZoom = -1;
|
||||||
private GestureDetector detector;
|
|
||||||
|
|
||||||
/** Position where the player started dragging a line. */
|
/** Position where the player started dragging a line. */
|
||||||
private int lineStartX, lineStartY;
|
private int lineStartX, lineStartY, lastLineX, lastLineY;
|
||||||
|
|
||||||
/** Animation scale for line. */
|
/** Animation scale for line. */
|
||||||
private float lineScale;
|
private float lineScale;
|
||||||
@@ -49,10 +46,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
/** Used for shifting build requests. */
|
/** Used for shifting build requests. */
|
||||||
private float shiftDeltaX, shiftDeltaY;
|
private float shiftDeltaX, shiftDeltaY;
|
||||||
|
|
||||||
/** List of currently selected tiles to place. */
|
|
||||||
private Array<PlaceRequest> selection = new Array<>();
|
|
||||||
/** Place requests to be removed. */
|
/** Place requests to be removed. */
|
||||||
private Array<PlaceRequest> removals = new Array<>();
|
private Array<BuildRequest> removals = new Array<>();
|
||||||
/** Whether or not the player is currently shifting all placed tiles. */
|
/** Whether or not the player is currently shifting all placed tiles. */
|
||||||
private boolean selecting;
|
private boolean selecting;
|
||||||
/** Whether the player is currently in line-place mode. */
|
/** Whether the player is currently in line-place mode. */
|
||||||
@@ -62,9 +57,9 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
/** Whether no recipe was available when switching to break mode. */
|
/** Whether no recipe was available when switching to break mode. */
|
||||||
private Block lastBlock;
|
private Block lastBlock;
|
||||||
/** Last placed request. Used for drawing block overlay. */
|
/** Last placed request. Used for drawing block overlay. */
|
||||||
private PlaceRequest lastPlaced;
|
private BuildRequest lastPlaced;
|
||||||
|
/** Down tracking for panning.*/
|
||||||
private int prevX, prevY, prevRotation;
|
private boolean down = false;
|
||||||
|
|
||||||
//region utility methods
|
//region utility methods
|
||||||
|
|
||||||
@@ -99,10 +94,10 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
r2.setSize(block.size * tilesize);
|
r2.setSize(block.size * tilesize);
|
||||||
r2.setCenter(x * tilesize + block.offset(), y * tilesize + block.offset());
|
r2.setCenter(x * tilesize + block.offset(), y * tilesize + block.offset());
|
||||||
|
|
||||||
for(PlaceRequest req : selection){
|
for(BuildRequest req : selectRequests){
|
||||||
Tile other = req.tile();
|
Tile other = req.tile();
|
||||||
|
|
||||||
if(other == null || req.remove) continue;
|
if(other == null || req.breaking) continue;
|
||||||
|
|
||||||
r1.setSize(req.block.size * tilesize);
|
r1.setSize(req.block.size * tilesize);
|
||||||
r1.setCenter(other.worldx() + req.block.offset(), other.worldy() + req.block.offset());
|
r1.setCenter(other.worldx() + req.block.offset(), other.worldy() + req.block.offset());
|
||||||
@@ -128,16 +123,16 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the selection request that overlaps this tile, or null. */
|
/** Returns the selection request that overlaps this tile, or null. */
|
||||||
PlaceRequest getRequest(Tile tile){
|
BuildRequest getRequest(Tile tile){
|
||||||
r2.setSize(tilesize);
|
r2.setSize(tilesize);
|
||||||
r2.setCenter(tile.worldx(), tile.worldy());
|
r2.setCenter(tile.worldx(), tile.worldy());
|
||||||
|
|
||||||
for(PlaceRequest req : selection){
|
for(BuildRequest req : selectRequests){
|
||||||
Tile other = req.tile();
|
Tile other = req.tile();
|
||||||
|
|
||||||
if(other == null) continue;
|
if(other == null) continue;
|
||||||
|
|
||||||
if(!req.remove){
|
if(!req.breaking){
|
||||||
r1.setSize(req.block.size * tilesize);
|
r1.setSize(req.block.size * tilesize);
|
||||||
r1.setCenter(other.worldx() + req.block.offset(), other.worldy() + req.block.offset());
|
r1.setCenter(other.worldx() + req.block.offset(), other.worldy() + req.block.offset());
|
||||||
|
|
||||||
@@ -156,8 +151,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeRequest(PlaceRequest request){
|
void removeRequest(BuildRequest request){
|
||||||
selection.removeValue(request, true);
|
selectRequests.removeValue(request, true);
|
||||||
removals.add(request);
|
removals.add(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,80 +167,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
//endregion
|
//endregion
|
||||||
//region UI and drawing
|
//region UI and drawing
|
||||||
|
|
||||||
void drawRequest(PlaceRequest request, PlaceRequest prev){
|
|
||||||
Tile tile = request.tile();
|
|
||||||
|
|
||||||
if(!request.remove){
|
|
||||||
if(prev != null){
|
|
||||||
request.block.getPlaceDraw(placeDraw, request.rotation, prev.x - request.x, prev.y - request.y, prev.rotation);
|
|
||||||
}else{
|
|
||||||
request.block.getPlaceDraw(placeDraw, request.rotation, 0, 0, request.rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
//draw placing request
|
|
||||||
float offset = request.block.offset();
|
|
||||||
TextureRegion region = placeDraw.region;
|
|
||||||
|
|
||||||
Draw.mixcol(Pal.accent, Mathf.clamp((1f - request.scale) / 0.5f + 0.12f + Mathf.absin(Time.time(), 8f, 0.35f)));
|
|
||||||
Draw.tint(Color.white, Pal.breakInvalid, request.redness);
|
|
||||||
|
|
||||||
Draw.rect(region, tile.worldx() + offset, tile.worldy() + offset,
|
|
||||||
region.getWidth() * request.scale * Draw.scl * placeDraw.scalex,
|
|
||||||
region.getHeight() * request.scale * Draw.scl * placeDraw.scaley,
|
|
||||||
request.block.rotate ? placeDraw.rotation * 90 : 0);
|
|
||||||
|
|
||||||
Draw.mixcol(Pal.accent, 1f);
|
|
||||||
for(int i = 0; i < 4; i++){
|
|
||||||
Point2 p = Geometry.d8edge[i];
|
|
||||||
float poffset = -Math.max(request.block.size - 1, 0) / 2f * tilesize;
|
|
||||||
TextureRegion find = Core.atlas.find("block-select");
|
|
||||||
if(i % 2 == 0)
|
|
||||||
Draw.rect("block-select", request.tile().x * tilesize + request.block.offset() + poffset * p.x, request.tile().y * tilesize + request.block.offset() + poffset * p.y,
|
|
||||||
find.getWidth() * Draw.scl * request.scale, find.getHeight() * Draw.scl * request.scale, i * 90);
|
|
||||||
}
|
|
||||||
Draw.color();
|
|
||||||
}else{
|
|
||||||
float rad = Math.max((tile.block().size * tilesize / 2f - 1) * request.scale, 1f);
|
|
||||||
|
|
||||||
if(rad <= 1.01f) return;
|
|
||||||
Draw.mixcol();
|
|
||||||
//draw removing request
|
|
||||||
Draw.tint(Pal.removeBack);
|
|
||||||
Lines.square(tile.drawx(), tile.drawy() - 1, rad);
|
|
||||||
Draw.tint(Pal.remove);
|
|
||||||
Lines.square(tile.drawx(), tile.drawy(), rad);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Draws a placement icon for a specific block. */
|
|
||||||
void drawPlace(int x, int y, Block block, int rotation, int prevX, int prevY, int prevRotation){
|
|
||||||
if(validPlace(x, y, block, rotation) && !checkOverlapPlacement(x, y, block)){
|
|
||||||
block.getPlaceDraw(placeDraw, rotation, prevX, prevY, prevRotation);
|
|
||||||
|
|
||||||
Draw.color();
|
|
||||||
Draw.rect(placeDraw.region, x * tilesize + block.offset(), y * tilesize + block.offset(),
|
|
||||||
placeDraw.region.getWidth() * Draw.scl * placeDraw.scalex,
|
|
||||||
placeDraw.region.getHeight() * Draw.scl * placeDraw.scaley,
|
|
||||||
block.rotate ? placeDraw.rotation * 90 : 0);
|
|
||||||
|
|
||||||
Draw.color(Pal.accent);
|
|
||||||
for(int i = 0; i < 4; i++){
|
|
||||||
Point2 p = Geometry.d8edge[i];
|
|
||||||
float offset = -Math.max(block.size - 1, 0) / 2f * tilesize;
|
|
||||||
if(i % 2 == 0)
|
|
||||||
Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90);
|
|
||||||
}
|
|
||||||
Draw.color();
|
|
||||||
}else{
|
|
||||||
Draw.color(Pal.removeBack);
|
|
||||||
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset() - 1, block.size * tilesize / 2f - 1);
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset(), block.size * tilesize / 2f - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildUI(Table table){
|
public void buildPlacementUI(Table table){
|
||||||
table.addImage().color(Pal.gray).height(4f).colspan(4).growX();
|
table.addImage().color(Pal.gray).height(4f).colspan(4).growX();
|
||||||
table.row();
|
table.row();
|
||||||
table.left().margin(0f).defaults().size(48f);
|
table.left().margin(0f).defaults().size(48f);
|
||||||
@@ -267,12 +190,12 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
|
|
||||||
//confirm button
|
//confirm button
|
||||||
table.addImageButton(Icon.checkSmall, Styles.clearPartiali, () -> {
|
table.addImageButton(Icon.checkSmall, Styles.clearPartiali, () -> {
|
||||||
for(PlaceRequest request : selection){
|
for(BuildRequest request : selectRequests){
|
||||||
Tile tile = request.tile();
|
Tile tile = request.tile();
|
||||||
|
|
||||||
//actually place/break all selected blocks
|
//actually place/break all selected blocks
|
||||||
if(tile != null){
|
if(tile != null){
|
||||||
if(!request.remove){
|
if(!request.breaking){
|
||||||
rotation = request.rotation;
|
rotation = request.rotation;
|
||||||
Block before = block;
|
Block before = block;
|
||||||
block = request.block;
|
block = request.block;
|
||||||
@@ -285,25 +208,23 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//move all current requests to removal array so they fade out
|
//move all current requests to removal array so they fade out
|
||||||
removals.addAll(selection);
|
removals.addAll(selectRequests.find(r -> !r.breaking));
|
||||||
selection.clear();
|
selectRequests.clear();
|
||||||
selecting = false;
|
selecting = false;
|
||||||
}).visible(() -> !selection.isEmpty()).name("confirmplace");
|
}).visible(() -> !selectRequests.isEmpty()).name("confirmplace");
|
||||||
|
|
||||||
Core.scene.table(t -> {
|
|
||||||
t.setName("cancelMobile");
|
|
||||||
t.bottom().left().visible(() -> (player.isBuilding() || block != null || mode == breaking) && !state.is(State.menu));
|
|
||||||
t.addImageTextButton("$cancel", Icon.cancelSmall, () -> {
|
|
||||||
player.clearBuilding();
|
|
||||||
mode = none;
|
|
||||||
block = null;
|
|
||||||
}).width(155f);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDrawing(){
|
public void buildUI(Group group){
|
||||||
return selection.size > 0 || removals.size > 0 || lineMode || player.target != null || mode != PlaceMode.none;
|
group.fill(t -> {
|
||||||
|
t.bottom().left().visible(() -> (player.isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !state.is(State.menu));
|
||||||
|
t.addImageTextButton("$cancel", Icon.cancelSmall, () -> {
|
||||||
|
player.clearBuilding();
|
||||||
|
selectRequests.clear();
|
||||||
|
mode = none;
|
||||||
|
block = null;
|
||||||
|
}).width(155f);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -312,55 +233,58 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawOutlined(){
|
public void drawBottom(){
|
||||||
Lines.stroke(1f);
|
Lines.stroke(1f);
|
||||||
|
|
||||||
//draw removals
|
//draw removals
|
||||||
for(PlaceRequest request : removals){
|
for(BuildRequest request : removals){
|
||||||
Tile tile = request.tile();
|
Tile tile = request.tile();
|
||||||
|
|
||||||
if(tile == null) continue;
|
if(tile == null) continue;
|
||||||
|
|
||||||
request.scale = Mathf.lerpDelta(request.scale, 0f, 0.2f);
|
request.animScale = Mathf.lerpDelta(request.animScale, 0f, 0.2f);
|
||||||
request.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f);
|
request.animInvalid = Mathf.lerpDelta(request.animInvalid, 0f, 0.2f);
|
||||||
|
|
||||||
drawRequest(request, null);
|
if(request.breaking){
|
||||||
|
drawSelected(request.x, request.y, tile.block(), Pal.remove);
|
||||||
|
}else{
|
||||||
|
request.block.drawRequest(request, allRequests(), true);
|
||||||
|
}
|
||||||
|
//TODO
|
||||||
|
//drawRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlaceRequest last = null;
|
|
||||||
|
|
||||||
//draw list of requests
|
//draw list of requests
|
||||||
for(PlaceRequest request : selection){
|
for(BuildRequest request : selectRequests){
|
||||||
Tile tile = request.tile();
|
Tile tile = request.tile();
|
||||||
|
|
||||||
if(tile == null) continue;
|
if(tile == null) continue;
|
||||||
|
|
||||||
if((!request.remove && validPlace(tile.x, tile.y, request.block, request.rotation))
|
if((!request.breaking && validPlace(tile.x, tile.y, request.block, request.rotation))
|
||||||
|| (request.remove && validBreak(tile.x, tile.y))){
|
|| (request.breaking && validBreak(tile.x, tile.y))){
|
||||||
request.scale = Mathf.lerpDelta(request.scale, 1f, 0.2f);
|
request.animScale = Mathf.lerpDelta(request.animScale, 1f, 0.2f);
|
||||||
request.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f);
|
request.animInvalid = Mathf.lerpDelta(request.animInvalid, 0f, 0.2f);
|
||||||
}else{
|
}else{
|
||||||
request.scale = Mathf.lerpDelta(request.scale, 0.6f, 0.1f);
|
request.animScale = Mathf.lerpDelta(request.animScale, 0.6f, 0.1f);
|
||||||
request.redness = Mathf.lerpDelta(request.redness, 0.9f, 0.2f);
|
request.animInvalid = Mathf.lerpDelta(request.animInvalid, 0.9f, 0.2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
Tmp.c1.set(Draw.getMixColor());
|
Tmp.c1.set(Draw.getMixColor());
|
||||||
|
|
||||||
if(!request.remove && request == lastPlaced && request.block != null){
|
if(!request.breaking && request == lastPlaced && request.block != null){
|
||||||
Draw.mixcol();
|
Draw.mixcol();
|
||||||
if(request.block.rotate) drawArrow(request.block, tile.x, tile.y, request.rotation);
|
if(request.block.rotate) drawArrow(request.block, tile.x, tile.y, request.rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.mixcol(Tmp.c1, 1f);
|
//Draw.mixcol(Tmp.c1, 1f);
|
||||||
drawRequest(request, last);
|
Draw.reset();
|
||||||
|
drawRequest(request);
|
||||||
|
|
||||||
//draw last placed request
|
//draw last placed request
|
||||||
if(!request.remove && request == lastPlaced && request.block != null){
|
if(!request.breaking && request == lastPlaced && request.block != null){
|
||||||
Draw.mixcol();
|
Draw.mixcol();
|
||||||
request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation));
|
request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
last = request;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.mixcol();
|
Draw.mixcol();
|
||||||
@@ -373,46 +297,16 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
|
|
||||||
if(mode == placing && block != null){
|
if(mode == placing && block != null){
|
||||||
//draw placing
|
//draw placing
|
||||||
|
for(int i = 0; i < lineRequests.size; i++){
|
||||||
prevX = lineStartX;
|
BuildRequest req = lineRequests.get(i);
|
||||||
prevY = lineStartY;
|
if(i == lineRequests.size - 1 && req.block.rotate){
|
||||||
prevRotation = rotation;
|
drawArrow(block, req.x, req.y, req.rotation);
|
||||||
|
|
||||||
iterateLine(lineStartX, lineStartY, tileX, tileY, l -> {
|
|
||||||
if(l.last && block.rotate){
|
|
||||||
drawArrow(block, l.x, l.y, l.rotation);
|
|
||||||
}
|
|
||||||
drawPlace(l.x, l.y, block, l.rotation, prevX - l.x, prevY - l.y, prevRotation);
|
|
||||||
|
|
||||||
rotation = l.rotation;
|
|
||||||
prevX = l.x;
|
|
||||||
prevY = l.y;
|
|
||||||
prevRotation = l.rotation;
|
|
||||||
});
|
|
||||||
}else if(mode == breaking){
|
|
||||||
//draw breaking
|
|
||||||
NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, lineStartX, lineStartY, tileX, tileY, false, maxLength, 1f);
|
|
||||||
NormalizeResult dresult = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, false, maxLength);
|
|
||||||
|
|
||||||
for(int x = dresult.x; x <= dresult.x2; x++){
|
|
||||||
for(int y = dresult.y; y <= dresult.y2; y++){
|
|
||||||
Tile other = world.ltile(x, y);
|
|
||||||
if(other == null || !validBreak(other.x, other.y)) continue;
|
|
||||||
|
|
||||||
Draw.color(Pal.removeBack);
|
|
||||||
Lines.square(other.drawx(), other.drawy() - 1, other.block().size * tilesize / 2f - 1);
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
Lines.square(other.drawx(), other.drawy(), other.block().size * tilesize / 2f - 1);
|
|
||||||
}
|
}
|
||||||
|
drawRequest(lineRequests.get(i));
|
||||||
}
|
}
|
||||||
|
}else if(mode == breaking){
|
||||||
Draw.color(Pal.removeBack);
|
drawSelection(lineStartX, lineStartY, tileX, tileY);
|
||||||
Lines.rect(result.x, result.y - 1, result.x2 - result.x, result.y2 - result.y);
|
|
||||||
Draw.color(Pal.remove);
|
|
||||||
Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetTrait target = player.target;
|
TargetTrait target = player.target;
|
||||||
@@ -438,31 +332,33 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawRequest(BuildRequest request){
|
||||||
|
if(request.tile() == null) return;
|
||||||
|
brequest.animScale = request.animScale = Mathf.lerpDelta(request.animScale, 1f, 0.1f);
|
||||||
|
|
||||||
|
if(request.breaking){
|
||||||
|
drawSelected(request.x, request.y, request.tile().block(), Pal.remove);
|
||||||
|
}else{
|
||||||
|
drawRequest(request.x, request.y, request.block, request.rotation);
|
||||||
|
drawSelected(request.x, request.y, request.block, Pal.accent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
//region input events
|
//region input events
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(){
|
public boolean isBreaking(){
|
||||||
Core.input.addProcessor(detector = new GestureDetector(20, 0.5f, 0.4f, 0.15f, this));
|
return mode == breaking;
|
||||||
super.add();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove(){
|
|
||||||
super.remove();
|
|
||||||
if(detector != null){
|
|
||||||
Core.input.removeProcessor(detector);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Core.scene != null && Core.scene.find("cancelMobile") != null){
|
|
||||||
Core.scene.find("cancelMobile").remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){
|
public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){
|
||||||
if(state.is(State.menu) || player.isDead()) return false;
|
if(state.is(State.menu) || player.isDead()) return false;
|
||||||
|
|
||||||
|
down = true;
|
||||||
|
|
||||||
//get tile on cursor
|
//get tile on cursor
|
||||||
Tile cursor = tileAt(screenX, screenY);
|
Tile cursor = tileAt(screenX, screenY);
|
||||||
|
|
||||||
@@ -489,44 +385,20 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
public boolean touchUp(int screenX, int screenY, int pointer, KeyCode button){
|
public boolean touchUp(int screenX, int screenY, int pointer, KeyCode button){
|
||||||
lastZoom = renderer.getScale();
|
lastZoom = renderer.getScale();
|
||||||
|
|
||||||
|
if(!Core.input.isTouched()){
|
||||||
|
down = false;
|
||||||
|
}
|
||||||
|
|
||||||
//place down a line if in line mode
|
//place down a line if in line mode
|
||||||
if(lineMode){
|
if(lineMode){
|
||||||
int tileX = tileX(screenX);
|
int tileX = tileX(screenX);
|
||||||
int tileY = tileY(screenY);
|
int tileY = tileY(screenY);
|
||||||
|
|
||||||
if(mode == placing && isPlacing()){
|
if(mode == placing && isPlacing()){
|
||||||
iterateLine(lineStartX, lineStartY, tileX, tileY, l -> {
|
flushSelectRequests(lineRequests);
|
||||||
Tile tile = world.tile(l.x, l.y);
|
|
||||||
if(tile != null && checkOverlapPlacement(tile.x, tile.y, block)){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlaceRequest request = new PlaceRequest(l.x, l.y, block, l.rotation);
|
|
||||||
request.scale = 1f;
|
|
||||||
selection.add(request);
|
|
||||||
});
|
|
||||||
Events.fire(new LineConfirmEvent());
|
Events.fire(new LineConfirmEvent());
|
||||||
}else if(mode == breaking){
|
}else if(mode == breaking){
|
||||||
//normalize area
|
removeSelection(lineStartX, lineStartY, tileX, tileY, true);
|
||||||
NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, false, maxLength);
|
|
||||||
|
|
||||||
//break everything in area
|
|
||||||
for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){
|
|
||||||
for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){
|
|
||||||
int wx = lineStartX + x * Mathf.sign(tileX - lineStartX);
|
|
||||||
int wy = lineStartY + y * Mathf.sign(tileY - lineStartY);
|
|
||||||
|
|
||||||
Tile tar = world.ltile(wx, wy);
|
|
||||||
|
|
||||||
if(tar == null) continue;
|
|
||||||
|
|
||||||
if(!hasRequest(world.tile(tar.x, tar.y)) && validBreak(tar.x, tar.y)){
|
|
||||||
PlaceRequest request = new PlaceRequest(tar.x, tar.y);
|
|
||||||
request.scale = 1f;
|
|
||||||
selection.add(request);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lineMode = false;
|
lineMode = false;
|
||||||
@@ -554,11 +426,14 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
//long pressing enables line mode otherwise
|
//long pressing enables line mode otherwise
|
||||||
lineStartX = cursor.x;
|
lineStartX = cursor.x;
|
||||||
lineStartY = cursor.y;
|
lineStartY = cursor.y;
|
||||||
|
lastLineX = cursor.x;
|
||||||
|
lastLineY = cursor.y;
|
||||||
lineMode = true;
|
lineMode = true;
|
||||||
|
|
||||||
if(mode == breaking){
|
if(mode == breaking){
|
||||||
Effects.effect(Fx.tapBlock, cursor.worldx(), cursor.worldy(), 1f);
|
Effects.effect(Fx.tapBlock, cursor.worldx(), cursor.worldy(), 1f);
|
||||||
}else if(block != null){
|
}else if(block != null){
|
||||||
|
updateLine(lineStartX, lineStartY, cursor.x, cursor.y);
|
||||||
Effects.effect(Fx.tapBlock, cursor.worldx() + block.offset(), cursor.worldy() + block.offset(), block.size);
|
Effects.effect(Fx.tapBlock, cursor.worldx() + block.offset(), cursor.worldy() + block.offset(), block.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -584,11 +459,11 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
removeRequest(getRequest(cursor));
|
removeRequest(getRequest(cursor));
|
||||||
}else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){
|
}else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){
|
||||||
//add to selection queue if it's a valid place position
|
//add to selection queue if it's a valid place position
|
||||||
selection.add(lastPlaced = new PlaceRequest(cursor.x, cursor.y, block, rotation));
|
selectRequests.add(lastPlaced = new BuildRequest(cursor.x, cursor.y, rotation, block));
|
||||||
}else if(mode == breaking && validBreak(cursor.link().x, cursor.link().y) && !hasRequest(cursor.link())){
|
}else if(mode == breaking && validBreak(cursor.link().x, cursor.link().y) && !hasRequest(cursor.link())){
|
||||||
//add to selection queue if it's a valid BREAK position
|
//add to selection queue if it's a valid BREAK position
|
||||||
cursor = cursor.link();
|
cursor = cursor.link();
|
||||||
selection.add(new PlaceRequest(cursor.x, cursor.y));
|
selectRequests.add(new BuildRequest(cursor.x, cursor.y));
|
||||||
}else if(!canTapPlayer(worldx, worldy) && !tileTapped(cursor.link())){
|
}else if(!canTapPlayer(worldx, worldy) && !tileTapped(cursor.link())){
|
||||||
tryBeginMine(cursor);
|
tryBeginMine(cursor);
|
||||||
}
|
}
|
||||||
@@ -598,12 +473,16 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
if(state.is(State.menu) || player.isDead()){
|
if(state.is(State.menu) ){
|
||||||
selection.clear();
|
selectRequests.clear();
|
||||||
removals.clear();
|
removals.clear();
|
||||||
mode = none;
|
mode = none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(player.isDead()){
|
||||||
|
mode = none;
|
||||||
|
}
|
||||||
|
|
||||||
//zoom things
|
//zoom things
|
||||||
if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && (Core.input.keyDown(Binding.zoom_hold))){
|
if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && (Core.input.keyDown(Binding.zoom_hold))){
|
||||||
renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
|
renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
|
||||||
@@ -629,8 +508,6 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
if(mode == none){
|
if(mode == none){
|
||||||
selecting = false;
|
selecting = false;
|
||||||
lineMode = false;
|
lineMode = false;
|
||||||
removals.addAll(selection);
|
|
||||||
selection.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lineMode && mode == placing && block == null){
|
if(lineMode && mode == placing && block == null){
|
||||||
@@ -656,7 +533,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
lineScale = Mathf.lerpDelta(lineScale, 1f, 0.1f);
|
lineScale = Mathf.lerpDelta(lineScale, 1f, 0.1f);
|
||||||
|
|
||||||
//When in line mode, pan when near screen edges automatically
|
//When in line mode, pan when near screen edges automatically
|
||||||
if(Core.input.isTouched(0) && lineMode){
|
if(Core.input.isTouched(0)){
|
||||||
float screenX = Core.input.mouseX(), screenY = Core.input.mouseY();
|
float screenX = Core.input.mouseX(), screenY = Core.input.mouseY();
|
||||||
|
|
||||||
float panX = 0, panY = 0;
|
float panX = 0, panY = 0;
|
||||||
@@ -684,15 +561,24 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
Core.camera.position.x += vector.x;
|
Core.camera.position.x += vector.x;
|
||||||
Core.camera.position.y += vector.y;
|
Core.camera.position.y += vector.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lx = tileX(Core.input.mouseX()), ly = tileY(Core.input.mouseY());
|
||||||
|
|
||||||
|
if((lastLineX != lx || lastLineY != ly) && isPlacing()){
|
||||||
|
lastLineX = lx;
|
||||||
|
lastLineY = ly;
|
||||||
|
updateLine(lineStartX, lineStartY, lx, ly);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
|
lineRequests.clear();
|
||||||
lineScale = 0f;
|
lineScale = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove place requests that have disappeared
|
//remove place requests that have disappeared
|
||||||
for(int i = removals.size - 1; i >= 0; i--){
|
for(int i = removals.size - 1; i >= 0; i--){
|
||||||
PlaceRequest request = removals.get(i);
|
BuildRequest request = removals.get(i);
|
||||||
|
|
||||||
if(request.scale <= 0.0001f){
|
if(request.animScale <= 0.0001f){
|
||||||
removals.remove(i);
|
removals.remove(i);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
@@ -712,6 +598,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!down) return false;
|
||||||
|
|
||||||
if(selecting){ //pan all requests
|
if(selecting){ //pan all requests
|
||||||
shiftDeltaX += deltaX;
|
shiftDeltaX += deltaX;
|
||||||
shiftDeltaY += deltaY;
|
shiftDeltaY += deltaY;
|
||||||
@@ -720,8 +608,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
int shiftedY = (int)(shiftDeltaY / tilesize);
|
int shiftedY = (int)(shiftDeltaY / tilesize);
|
||||||
|
|
||||||
if(Math.abs(shiftedX) > 0 || Math.abs(shiftedY) > 0){
|
if(Math.abs(shiftedX) > 0 || Math.abs(shiftedY) > 0){
|
||||||
for(PlaceRequest req : selection){
|
for(BuildRequest req : selectRequests){
|
||||||
if(req.remove) continue; //don't shift removal requests
|
if(req.breaking) continue; //don't shift removal requests
|
||||||
req.x += shiftedX;
|
req.x += shiftedX;
|
||||||
req.y += shiftedY;
|
req.y += shiftedY;
|
||||||
}
|
}
|
||||||
@@ -756,33 +644,4 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
private class PlaceRequest{
|
|
||||||
int x, y;
|
|
||||||
Block block;
|
|
||||||
int rotation;
|
|
||||||
boolean remove;
|
|
||||||
|
|
||||||
//animation variables
|
|
||||||
float scale;
|
|
||||||
float redness;
|
|
||||||
|
|
||||||
PlaceRequest(int x, int y, Block block, int rotation){
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.block = block;
|
|
||||||
this.rotation = rotation;
|
|
||||||
this.remove = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlaceRequest(int x, int y){
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.remove = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Tile tile(){
|
|
||||||
return world.tile(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,27 @@ 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.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class JsonIO{
|
public class JsonIO{
|
||||||
private static CustomJson jsonBase = new CustomJson();
|
private static CustomJson jsonBase = new CustomJson();
|
||||||
private static Json json = new Json(){{
|
private static Json json = new Json(){
|
||||||
apply(this);
|
{ apply(this); }
|
||||||
}};
|
|
||||||
|
@Override
|
||||||
|
public void writeValue(Object value, Class knownType, Class elementType){
|
||||||
|
if(value instanceof MappableContent){
|
||||||
|
try{
|
||||||
|
getWriter().value(((MappableContent)value).name);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
super.writeValue(value, knownType, elementType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public static String write(Object object){
|
public static String write(Object object){
|
||||||
return json.toJson(object, object.getClass());
|
return json.toJson(object, object.getClass());
|
||||||
@@ -66,24 +81,6 @@ public class JsonIO{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//TODO extremely hacky and disgusting
|
|
||||||
for(Block block : Vars.content.blocks()){
|
|
||||||
Class type = block.getClass();
|
|
||||||
if(type.isAnonymousClass()) type = type.getSuperclass();
|
|
||||||
|
|
||||||
json.setSerializer(type, new Serializer<Block>(){
|
|
||||||
@Override
|
|
||||||
public void write(Json json, Block object, Class knownType){
|
|
||||||
json.writeValue(object.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Block read(Json json, JsonValue jsonData, Class type){
|
|
||||||
return Vars.content.getByName(ContentType.block, jsonData.asString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
json.setSerializer(Block.class, new Serializer<Block>(){
|
json.setSerializer(Block.class, new Serializer<Block>(){
|
||||||
@Override
|
@Override
|
||||||
public void write(Json json, Block object, Class knownType){
|
public void write(Json json, Block object, Class knownType){
|
||||||
@@ -96,26 +93,6 @@ public class JsonIO{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
|
||||||
json.setSerializer(TeamData.class, new Serializer<TeamData>(){
|
|
||||||
@Override
|
|
||||||
public void write(Json json, TeamData object, Class knownType){
|
|
||||||
json.writeObjectStart();
|
|
||||||
json.writeValue("brokenBlocks", object.brokenBlocks.toArray());
|
|
||||||
json.writeValue("team", object.team.ordinal());
|
|
||||||
json.writeObjectEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TeamData read(Json json, JsonValue jsonData, Class type){
|
|
||||||
long[] blocks = jsonData.get("brokenBlocks").asLongArray();
|
|
||||||
Team team = Team.all[jsonData.getInt("team", 0)];
|
|
||||||
TeamData out = new TeamData(team, EnumSet.of(new Team[]{}));
|
|
||||||
out.brokenBlocks = new LongQueue(blocks);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
});*/
|
|
||||||
|
|
||||||
json.setSerializer(ItemStack.class, new Serializer<ItemStack>(){
|
json.setSerializer(ItemStack.class, new Serializer<ItemStack>(){
|
||||||
@Override
|
@Override
|
||||||
public void write(Json json, ItemStack object, Class knownType){
|
public void write(Json json, ItemStack object, Class knownType){
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ public abstract class SaveVersion extends SaveFileReader{
|
|||||||
TeamData data = state.teams.get(team);
|
TeamData data = state.teams.get(team);
|
||||||
int blocks = stream.readInt();
|
int blocks = stream.readInt();
|
||||||
for(int j = 0; j < blocks; j++){
|
for(int j = 0; j < blocks; j++){
|
||||||
data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), stream.readShort(), stream.readInt()));
|
data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, stream.readInt()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,14 @@ package io.anuke.mindustry.mod;
|
|||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.audio.*;
|
import io.anuke.arc.audio.*;
|
||||||
|
import io.anuke.arc.collection.Array;
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
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.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.*;
|
||||||
@@ -16,20 +19,35 @@ import io.anuke.mindustry.entities.Effects.*;
|
|||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.game.Objectives.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.mod.Mods.*;
|
import io.anuke.mindustry.mod.Mods.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
import io.anuke.mindustry.world.consumers.*;
|
||||||
|
import io.anuke.mindustry.world.meta.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class ContentParser{
|
public class ContentParser{
|
||||||
private static final boolean ignoreUnknownFields = true;
|
private static final boolean ignoreUnknownFields = true;
|
||||||
private ObjectMap<Class<?>, ContentType> contentTypes = new ObjectMap<>();
|
private ObjectMap<Class<?>, ContentType> contentTypes = new ObjectMap<>();
|
||||||
private ObjectMap<Class<?>, FieldParser> classParsers = new ObjectMap<Class<?>, FieldParser>(){{
|
private ObjectMap<Class<?>, FieldParser> classParsers = new ObjectMap<Class<?>, FieldParser>(){{
|
||||||
put(BulletType.class, (type, data) -> field(Bullets.class, data));
|
|
||||||
put(Effect.class, (type, data) -> field(Fx.class, data));
|
put(Effect.class, (type, data) -> field(Fx.class, data));
|
||||||
put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data));
|
put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data));
|
||||||
|
put(Loadout.class, (type, data) -> field(Loadouts.class, data));
|
||||||
put(Color.class, (type, data) -> Color.valueOf(data.asString()));
|
put(Color.class, (type, data) -> Color.valueOf(data.asString()));
|
||||||
|
put(BulletType.class, (type, data) -> {
|
||||||
|
if(data.isString()){
|
||||||
|
return field(Bullets.class, data);
|
||||||
|
}
|
||||||
|
Class<? extends BulletType> bc = data.has("type") ? resolve(data.getString("type"), "io.anuke.mindustry.entities.bullets") : BasicBulletType.class;
|
||||||
|
data.remove("type");
|
||||||
|
BulletType result = make(bc);
|
||||||
|
readFields(result, data);
|
||||||
|
return result;
|
||||||
|
});
|
||||||
put(Music.class, (type, data) -> {
|
put(Music.class, (type, data) -> {
|
||||||
if(fieldOpt(Musics.class, data) != null) return fieldOpt(Musics.class, data);
|
if(fieldOpt(Musics.class, data) != null) return fieldOpt(Musics.class, data);
|
||||||
|
|
||||||
@@ -47,17 +65,36 @@ public class ContentParser{
|
|||||||
Log.info(Core.assets.get(path));
|
Log.info(Core.assets.get(path));
|
||||||
return Core.assets.get(path);
|
return Core.assets.get(path);
|
||||||
});
|
});
|
||||||
|
put(Objective.class, (type, data) -> {
|
||||||
|
Class<? extends Objective> oc = data.has("type") ? resolve(data.getString("type"), "io.anuke.mindustry.game.Objectives") : ZoneWave.class;
|
||||||
|
data.remove("type");
|
||||||
|
Objective obj = make(oc);
|
||||||
|
readFields(obj, data);
|
||||||
|
return obj;
|
||||||
|
});
|
||||||
}};
|
}};
|
||||||
/** Stores things that need to be parsed fully, e.g. reading fields of content.
|
/** Stores things that need to be parsed fully, e.g. reading fields of content.
|
||||||
* This is done to accomodate binding of content names first.*/
|
* This is done to accomodate binding of content names first.*/
|
||||||
private Array<Runnable> reads = new Array<>();
|
private Array<Runnable> reads = new Array<>();
|
||||||
private LoadedMod currentMod;
|
private LoadedMod currentMod;
|
||||||
|
private Content currentContent;
|
||||||
|
|
||||||
private Json parser = new Json(){
|
private Json parser = new Json(){
|
||||||
public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData){
|
@Override
|
||||||
|
public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData, Class keyType){
|
||||||
|
T t = internalRead(type, elementType, jsonData, keyType);
|
||||||
|
if(t != null) checkNullFields(t);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> T internalRead(Class<T> type, Class elementType, JsonValue jsonData, Class keyType){
|
||||||
if(type != null){
|
if(type != null){
|
||||||
if(classParsers.containsKey(type)){
|
if(classParsers.containsKey(type)){
|
||||||
return (T)classParsers.get(type).parse(type, jsonData);
|
try{
|
||||||
|
return (T)classParsers.get(type).parse(type, jsonData);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Content.class.isAssignableFrom(type)){
|
if(Content.class.isAssignableFrom(type)){
|
||||||
@@ -65,49 +102,64 @@ public class ContentParser{
|
|||||||
String prefix = currentMod != null ? currentMod.name + "-" : "";
|
String prefix = currentMod != null ? currentMod.name + "-" : "";
|
||||||
T one = (T)Vars.content.getByName(ctype, prefix + jsonData.asString());
|
T one = (T)Vars.content.getByName(ctype, prefix + jsonData.asString());
|
||||||
if(one != null) return one;
|
if(one != null) return one;
|
||||||
return (T)Vars.content.getByName(ctype, jsonData.asString());
|
T two = (T)Vars.content.getByName(ctype, jsonData.asString());
|
||||||
|
|
||||||
|
if(two != null) return two;
|
||||||
|
throw new IllegalArgumentException("\"" + jsonData.name + "\": No " + ctype + " found with name '" + jsonData.asString() + "'.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.readValue(type, elementType, jsonData);
|
return super.readValue(type, elementType, jsonData, keyType);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private ObjectMap<ContentType, TypeParser<?>> parsers = ObjectMap.of(
|
private ObjectMap<ContentType, TypeParser<?>> parsers = ObjectMap.of(
|
||||||
ContentType.block, (TypeParser<Block>)(mod, name, value) -> {
|
ContentType.block, (TypeParser<Block>)(mod, name, value) -> {
|
||||||
//TODO generate dynamically instead of doing.. this
|
readBundle(ContentType.block, name, value);
|
||||||
Class<? extends Block> type = resolve(value.getString("type"),
|
|
||||||
"io.anuke.mindustry.world",
|
|
||||||
"io.anuke.mindustry.world.blocks",
|
|
||||||
"io.anuke.mindustry.world.blocks.defense",
|
|
||||||
"io.anuke.mindustry.world.blocks.defense.turrets",
|
|
||||||
"io.anuke.mindustry.world.blocks.distribution",
|
|
||||||
"io.anuke.mindustry.world.blocks.logic",
|
|
||||||
"io.anuke.mindustry.world.blocks.power",
|
|
||||||
"io.anuke.mindustry.world.blocks.production",
|
|
||||||
"io.anuke.mindustry.world.blocks.sandbox",
|
|
||||||
"io.anuke.mindustry.world.blocks.storage",
|
|
||||||
"io.anuke.mindustry.world.blocks.units"
|
|
||||||
);
|
|
||||||
|
|
||||||
Block block = type.getDeclaredConstructor(String.class).newInstance(mod + "-" + name);
|
Block block;
|
||||||
|
|
||||||
|
if(Vars.content.getByName(ContentType.block, name) != null){
|
||||||
|
block = Vars.content.getByName(ContentType.block, name);
|
||||||
|
|
||||||
|
if(value.has("type")){
|
||||||
|
throw new IllegalArgumentException("When overwriting an existing block, you must not re-declared its type. The original type will be used. Block: " + name);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//TODO generate dynamically instead of doing.. this
|
||||||
|
Class<? extends Block> type = resolve(value.getString("type"),
|
||||||
|
"io.anuke.mindustry.world",
|
||||||
|
"io.anuke.mindustry.world.blocks",
|
||||||
|
"io.anuke.mindustry.world.blocks.defense",
|
||||||
|
"io.anuke.mindustry.world.blocks.defense.turrets",
|
||||||
|
"io.anuke.mindustry.world.blocks.distribution",
|
||||||
|
"io.anuke.mindustry.world.blocks.logic",
|
||||||
|
"io.anuke.mindustry.world.blocks.power",
|
||||||
|
"io.anuke.mindustry.world.blocks.production",
|
||||||
|
"io.anuke.mindustry.world.blocks.sandbox",
|
||||||
|
"io.anuke.mindustry.world.blocks.storage",
|
||||||
|
"io.anuke.mindustry.world.blocks.units"
|
||||||
|
);
|
||||||
|
|
||||||
|
block = make(type, mod + "-" + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentContent = block;
|
||||||
read(() -> {
|
read(() -> {
|
||||||
if(value.has("consumes")){
|
if(value.has("consumes")){
|
||||||
for(JsonValue child : value.get("consumes")){
|
for(JsonValue child : value.get("consumes")){
|
||||||
if(child.name.equals("item")){
|
if(child.name.equals("item")){
|
||||||
if(child.isString()){
|
block.consumes.item(find(ContentType.item, child.asString()));
|
||||||
block.consumes.item(Vars.content.getByName(ContentType.item, child.asString()));
|
|
||||||
}else{
|
|
||||||
ItemStack stack = parser.readValue(ItemStack.class, child);
|
|
||||||
block.consumes.item(stack.item, stack.amount);
|
|
||||||
}
|
|
||||||
}else if(child.name.equals("items")){
|
}else if(child.name.equals("items")){
|
||||||
block.consumes.items(parser.readValue(ItemStack[].class, child));
|
block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child));
|
||||||
}else if(child.name.equals("liquid")){
|
}else if(child.name.equals("liquid")){
|
||||||
LiquidStack stack = parser.readValue(LiquidStack.class, child);
|
block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
|
||||||
block.consumes.liquid(stack.liquid, stack.amount);
|
|
||||||
}else if(child.name.equals("power")){
|
}else if(child.name.equals("power")){
|
||||||
block.consumes.power(child.asFloat());
|
if(child.isDouble()){
|
||||||
|
block.consumes.power(child.asFloat());
|
||||||
|
}else{
|
||||||
|
block.consumes.add((Consume)parser.readValue(ConsumePower.class, child));
|
||||||
|
}
|
||||||
}else if(child.name.equals("powerBuffered")){
|
}else if(child.name.equals("powerBuffered")){
|
||||||
block.consumes.powerBuffered(child.asFloat());
|
block.consumes.powerBuffered(child.asFloat());
|
||||||
}else{
|
}else{
|
||||||
@@ -121,20 +173,23 @@ public class ContentParser{
|
|||||||
|
|
||||||
//add research tech node
|
//add research tech node
|
||||||
if(value.has("research")){
|
if(value.has("research")){
|
||||||
TechTree.create(Vars.content.getByName(ContentType.block, value.get("research").asString()), block);
|
TechTree.create(find(ContentType.block, value.get("research").asString()), block);
|
||||||
}
|
}
|
||||||
|
|
||||||
//make block visible
|
//make block visible by default if there are requirements and no visibility set
|
||||||
if(value.has("requirements")){
|
if(value.has("requirements") && block.buildVisibility == BuildVisibility.hidden){
|
||||||
block.buildVisibility = () -> true;
|
block.buildVisibility = BuildVisibility.shown;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
},
|
},
|
||||||
ContentType.unit, (TypeParser<UnitType>)(mod, name, value) -> {
|
ContentType.unit, (TypeParser<UnitType>)(mod, name, value) -> {
|
||||||
|
readBundle(ContentType.unit, name, value);
|
||||||
|
|
||||||
Class<BaseUnit> type = resolve(value.getString("type"), "io.anuke.mindustry.entities.type.base");
|
Class<BaseUnit> type = resolve(value.getString("type"), "io.anuke.mindustry.entities.type.base");
|
||||||
UnitType unit = new UnitType(mod + "-" + name, supply(type));
|
UnitType unit = new UnitType(mod + "-" + name, supply(type));
|
||||||
|
currentContent = unit;
|
||||||
read(() -> readFields(unit, value, true));
|
read(() -> readFields(unit, value, true));
|
||||||
|
|
||||||
return unit;
|
return unit;
|
||||||
@@ -145,24 +200,57 @@ public class ContentParser{
|
|||||||
ContentType.zone, parser(ContentType.zone, Zone::new)
|
ContentType.zone, parser(ContentType.zone, Zone::new)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
private <T extends Content> T find(ContentType type, String name){
|
||||||
|
Content c = Vars.content.getByName(type, name);
|
||||||
|
if(c == null) c = Vars.content.getByName(type, currentMod.name + "-" + name);
|
||||||
|
if(c == null) throw new IllegalArgumentException("No " + type + " found with name '" + name + "'");
|
||||||
|
return (T)c;
|
||||||
|
}
|
||||||
|
|
||||||
private <T extends Content> TypeParser<T> parser(ContentType type, Function<String, T> constructor){
|
private <T extends Content> TypeParser<T> parser(ContentType type, Function<String, T> constructor){
|
||||||
return (mod, name, value) -> {
|
return (mod, name, value) -> {
|
||||||
T item;
|
T item;
|
||||||
if(Vars.content.getByName(type, name) != null){
|
if(Vars.content.getByName(type, name) != null){
|
||||||
item = (T)Vars.content.getByName(type, name);
|
item = (T)Vars.content.getByName(type, name);
|
||||||
|
readBundle(type, name, value);
|
||||||
}else{
|
}else{
|
||||||
|
readBundle(type, name, value);
|
||||||
item = constructor.get(mod + "-" + name);
|
item = constructor.get(mod + "-" + name);
|
||||||
}
|
}
|
||||||
|
currentContent = item;
|
||||||
read(() -> readFields(item, value));
|
read(() -> readFields(item, value));
|
||||||
return item;
|
return item;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void readBundle(ContentType type, String name, JsonValue value){
|
||||||
|
UnlockableContent cont = Vars.content.getByName(type, name) instanceof UnlockableContent ?
|
||||||
|
Vars.content.getByName(type, name) : null;
|
||||||
|
|
||||||
|
String entryName = cont == null ? type + "." + currentMod.name + "-" + name + "." : type + "." + cont.name + ".";
|
||||||
|
I18NBundle bundle = Core.bundle;
|
||||||
|
while(bundle.getParent() != null) bundle = bundle.getParent();
|
||||||
|
|
||||||
|
if(value.has("name")){
|
||||||
|
bundle.getProperties().put(entryName + "name", value.getString("name"));
|
||||||
|
if(cont != null) cont.localizedName = value.getString("name");
|
||||||
|
value.remove("name");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(value.has("description")){
|
||||||
|
bundle.getProperties().put(entryName + "description", value.getString("description"));
|
||||||
|
if(cont != null) cont.description = value.getString("description");
|
||||||
|
value.remove("description");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Call to read a content's extra info later.*/
|
/** Call to read a content's extra info later.*/
|
||||||
private void read(Runnable run){
|
private void read(Runnable run){
|
||||||
|
Content cont = currentContent;
|
||||||
LoadedMod mod = currentMod;
|
LoadedMod mod = currentMod;
|
||||||
reads.add(() -> {
|
reads.add(() -> {
|
||||||
this.currentMod = mod;
|
this.currentMod = mod;
|
||||||
|
this.currentContent = cont;
|
||||||
run.run();
|
run.run();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -173,7 +261,7 @@ public class ContentParser{
|
|||||||
if(!arr.isEmpty()){
|
if(!arr.isEmpty()){
|
||||||
Class<?> c = arr.first().getClass();
|
Class<?> c = arr.first().getClass();
|
||||||
//get base content class, skipping intermediates
|
//get base content class, skipping intermediates
|
||||||
while(!(c.getSuperclass() == Content.class || c.getSuperclass() == UnlockableContent.class || c.getSuperclass() == UnlockableContent.class)){
|
while(!(c.getSuperclass() == Content.class || c.getSuperclass() == UnlockableContent.class || Modifier.isAbstract(c.getSuperclass().getModifiers()))){
|
||||||
c = c.getSuperclass();
|
c = c.getSuperclass();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +271,11 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void finishParsing(){
|
public void finishParsing(){
|
||||||
reads.each(Runnable::run);
|
try{
|
||||||
|
reads.each(Runnable::run);
|
||||||
|
}catch(Exception e){
|
||||||
|
Vars.mods.handleError(new ModLoadException("Error occurred parsing content: " + currentContent, currentContent, e), currentMod);
|
||||||
|
}
|
||||||
reads.clear();
|
reads.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,9 +284,10 @@ public class ContentParser{
|
|||||||
* @param name the name of the file without its extension
|
* @param name the name of the file without its extension
|
||||||
* @param json the json to parse
|
* @param json the json to parse
|
||||||
* @param type the type of content this is
|
* @param type the type of content this is
|
||||||
|
* @param file file that this content is being parsed from
|
||||||
* @return the content that was parsed
|
* @return the content that was parsed
|
||||||
*/
|
*/
|
||||||
public Content parse(LoadedMod mod, String name, String json, ContentType type) throws Exception{
|
public Content parse(LoadedMod mod, String name, String json, FileHandle file, ContentType type) throws Exception{
|
||||||
if(contentTypes.isEmpty()){
|
if(contentTypes.isEmpty()){
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@@ -205,12 +298,35 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentMod = mod;
|
currentMod = mod;
|
||||||
|
boolean exists = Vars.content.getByName(type, name) != null;
|
||||||
Content c = parsers.get(type).parse(mod.name, name, value);
|
Content c = parsers.get(type).parse(mod.name, name, value);
|
||||||
c.mod = mod;
|
if(!exists){
|
||||||
checkNulls(c);
|
c.sourceFile = file;
|
||||||
|
c.mod = mod;
|
||||||
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private <T> T make(Class<T> type){
|
||||||
|
try{
|
||||||
|
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor();
|
||||||
|
cons.setAccessible(true);
|
||||||
|
return cons.newInstance();
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> T make(Class<T> type, String name){
|
||||||
|
try{
|
||||||
|
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor(String.class);
|
||||||
|
cons.setAccessible(true);
|
||||||
|
return cons.newInstance(name);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private <T> Supplier<T> supply(Class<T> type){
|
private <T> Supplier<T> supply(Class<T> type){
|
||||||
try{
|
try{
|
||||||
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor();
|
java.lang.reflect.Constructor<T> cons = type.getDeclaredConstructor();
|
||||||
@@ -243,35 +359,21 @@ public class ContentParser{
|
|||||||
|
|
||||||
private Object fieldOpt(Class<?> type, JsonValue value){
|
private Object fieldOpt(Class<?> type, JsonValue value){
|
||||||
try{
|
try{
|
||||||
Object b = type.getField(value.asString()).get(null);
|
return type.getField(value.asString()).get(null);
|
||||||
if(b == null) return null;
|
|
||||||
return b;
|
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Checks all @NonNull fields in this object, recursively.
|
private void checkNullFields(Object object){
|
||||||
* Throws an exception if any are null.*/
|
if(object instanceof Number || object instanceof String) return;
|
||||||
private void checkNulls(Object object){
|
|
||||||
checkNulls(object, new ObjectSet<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkNulls(Object object, ObjectSet<Object> checked){
|
parser.getFields(object.getClass()).values().toArray().each(field -> {
|
||||||
checked.add(object);
|
|
||||||
|
|
||||||
parser.getFields(object.getClass()).each((name, field) -> {
|
|
||||||
try{
|
try{
|
||||||
if(field.field.getType().isPrimitive()) return;
|
if(field.field.getType().isPrimitive()) return;
|
||||||
|
|
||||||
Object obj = field.field.get(object);
|
|
||||||
if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){
|
if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){
|
||||||
throw new RuntimeException("Field '" + name + "' in " + object.getClass().getSimpleName() + " is missing!");
|
throw new RuntimeException("'" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!");
|
||||||
}
|
|
||||||
|
|
||||||
if(obj != null && !checked.contains(obj)){
|
|
||||||
checkNulls(obj, checked);
|
|
||||||
checked.add(obj);
|
|
||||||
}
|
}
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
@@ -303,7 +405,7 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
Field field = metadata.field;
|
Field field = metadata.field;
|
||||||
try{
|
try{
|
||||||
field.set(object, parser.readValue(field.getType(), metadata.elementType, child));
|
field.set(object, parser.readValue(field.getType(), metadata.elementType, child, metadata.keyType));
|
||||||
}catch(ReflectionException ex){
|
}catch(ReflectionException 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){
|
||||||
@@ -319,18 +421,24 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Tries to resolve a class from a list of potential class names. */
|
/** Tries to resolve a class from a list of potential class names. */
|
||||||
private <T> Class<T> resolve(String base, String... potentials) throws Exception{
|
private <T> Class<T> resolve(String base, String... potentials){
|
||||||
|
if(!base.isEmpty() && Character.isLowerCase(base.charAt(0))) base = Strings.capitalize(base);
|
||||||
|
|
||||||
for(String type : potentials){
|
for(String type : potentials){
|
||||||
try{
|
try{
|
||||||
return (Class<T>)Class.forName(type + '.' + base);
|
return (Class<T>)Class.forName(type + '.' + base);
|
||||||
}catch(Exception ignored){
|
}catch(Exception ignored){
|
||||||
|
try{
|
||||||
|
return (Class<T>)Class.forName(type + '$' + base);
|
||||||
|
}catch(Exception ignored2){
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Type not found: " + potentials[0]);
|
throw new IllegalArgumentException("Types not found: " + base + "." + potentials[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface FieldParser{
|
private interface FieldParser{
|
||||||
Object parse(Class<?> type, JsonValue value);
|
Object parse(Class<?> type, JsonValue value) throws Exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface TypeParser<T extends Content>{
|
private interface TypeParser<T extends Content>{
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import io.anuke.mindustry.game.*;
|
|||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.plugin.*;
|
import io.anuke.mindustry.plugin.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.*;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
@@ -48,8 +47,7 @@ public class Mods implements Loadable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @return the loaded mod found by class, or null if not found. */
|
/** @return the loaded mod found by class, or null if not found. */
|
||||||
public @Nullable
|
public @Nullable LoadedMod getMod(Class<? extends Mod> type){
|
||||||
LoadedMod getMod(Class<? extends Mod> type){
|
|
||||||
return loaded.find(l -> l.mod.getClass() == type);
|
return loaded.find(l -> l.mod.getClass() == type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +60,7 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
file.copyTo(dest);
|
file.copyTo(dest);
|
||||||
try{
|
try{
|
||||||
loaded.add(loadMod(file));
|
loaded.add(loadMod(file, false));
|
||||||
requiresReload = true;
|
requiresReload = true;
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
dest.delete();
|
dest.delete();
|
||||||
@@ -77,6 +75,7 @@ public class Mods implements Loadable{
|
|||||||
@Override
|
@Override
|
||||||
public void loadAsync(){
|
public void loadAsync(){
|
||||||
if(loaded.isEmpty()) return;
|
if(loaded.isEmpty()) return;
|
||||||
|
Time.mark();
|
||||||
|
|
||||||
packer = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true);
|
packer = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true);
|
||||||
|
|
||||||
@@ -105,11 +104,14 @@ public class Mods implements Loadable{
|
|||||||
});
|
});
|
||||||
Log.info("Packed {0} images for mod '{1}'.", packed[0], mod.meta.name);
|
Log.info("Packed {0} images for mod '{1}'.", packed[0], mod.meta.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.info("Time to pack textures: {0}", Time.elapsed());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadSync(){
|
public void loadSync(){
|
||||||
if(packer == null) return;
|
if(packer == null) return;
|
||||||
|
Time.mark();
|
||||||
|
|
||||||
Texture editor = Core.atlas.find("clear-editor").getTexture();
|
Texture editor = Core.atlas.find("clear-editor").getTexture();
|
||||||
PixmapPacker editorPacker = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true);
|
PixmapPacker editorPacker = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true);
|
||||||
@@ -141,6 +143,7 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
packer.dispose();
|
packer.dispose();
|
||||||
packer = null;
|
packer = null;
|
||||||
|
Log.info("Time to update textures: {0}", Time.elapsed());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Removes a mod file and marks it for requiring a restart. */
|
/** Removes a mod file and marks it for requiring a restart. */
|
||||||
@@ -164,16 +167,30 @@ public class Mods implements Loadable{
|
|||||||
if(!file.extension().equals("jar") && !file.extension().equals("zip") && !(file.isDirectory() && file.child("mod.json").exists())) continue;
|
if(!file.extension().equals("jar") && !file.extension().equals("zip") && !(file.isDirectory() && file.child("mod.json").exists())) continue;
|
||||||
|
|
||||||
try{
|
try{
|
||||||
LoadedMod mod = loadMod(file);
|
LoadedMod mod = loadMod(file, false);
|
||||||
if(mod.enabled()){
|
if(mod.enabled()){
|
||||||
loaded.add(mod);
|
loaded.add(mod);
|
||||||
}else{
|
}else{
|
||||||
disabled.add(mod);
|
disabled.add(mod);
|
||||||
}
|
}
|
||||||
}catch(IllegalArgumentException ignored){
|
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Log.err("Failed to load plugin file {0}. Skipping.", file);
|
Log.err("Failed to load mod file {0}. Skipping.", file);
|
||||||
e.printStackTrace();
|
Log.err(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//load workshop mods now
|
||||||
|
for(FileHandle file : platform.getExternalMods()){
|
||||||
|
try{
|
||||||
|
LoadedMod mod = loadMod(file, true);
|
||||||
|
if(mod.enabled()){
|
||||||
|
loaded.add(mod);
|
||||||
|
}else{
|
||||||
|
disabled.add(mod);
|
||||||
|
}
|
||||||
|
}catch(Exception e){
|
||||||
|
Log.err("Failed to load mod workshop file {0}. Skipping.", file);
|
||||||
|
Log.err(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,11 +202,14 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
private void buildFiles(){
|
private void buildFiles(){
|
||||||
for(LoadedMod mod : loaded){
|
for(LoadedMod mod : loaded){
|
||||||
|
boolean zipFolder = !mod.file.isDirectory() && mod.root.parent() != null;
|
||||||
|
String parentName = zipFolder ? mod.root.name() : null;
|
||||||
for(FileHandle file : mod.root.list()){
|
for(FileHandle file : mod.root.list()){
|
||||||
//ignore special folders like bundles or sprites
|
//ignore special folders like bundles or sprites
|
||||||
if(file.isDirectory() && !specialFolders.contains(file.name())){
|
if(file.isDirectory() && !specialFolders.contains(file.name())){
|
||||||
//TODO calling child/parent on these files will give you gibberish; create wrapper class.
|
//TODO calling child/parent on these files will give you gibberish; create wrapper class.
|
||||||
file.walk(f -> tree.addFile(mod.file.isDirectory() ? f.path().substring(1 + mod.file.path().length()) : f.path(), f));
|
file.walk(f -> tree.addFile(mod.file.isDirectory() ? f.path().substring(1 + mod.file.path().length()) :
|
||||||
|
zipFolder ? f.path().substring(parentName.length() + 1) : f.path(), f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,9 +245,6 @@ public class Mods implements Loadable{
|
|||||||
public void reloadContent(){
|
public void reloadContent(){
|
||||||
//epic memory leak
|
//epic memory leak
|
||||||
Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas"));
|
Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas"));
|
||||||
Tex.load();
|
|
||||||
Tex.loadStyles();
|
|
||||||
Styles.load();
|
|
||||||
loaded.clear();
|
loaded.clear();
|
||||||
disabled.clear();
|
disabled.clear();
|
||||||
load();
|
load();
|
||||||
@@ -244,35 +261,41 @@ public class Mods implements Loadable{
|
|||||||
content.init();
|
content.init();
|
||||||
content.load();
|
content.load();
|
||||||
content.loadColors();
|
content.loadColors();
|
||||||
|
data.load();
|
||||||
|
requiresReload = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates all the content found in mod files. */
|
/** Creates all the content found in mod files. */
|
||||||
public void loadContent(){
|
public void loadContent(){
|
||||||
for(LoadedMod mod : loaded){
|
for(LoadedMod mod : loaded){
|
||||||
if(mod.root.child("content").exists()){
|
safeRun(mod, () -> {
|
||||||
FileHandle contentRoot = mod.root.child("content");
|
if(mod.root.child("content").exists()){
|
||||||
for(ContentType type : ContentType.all){
|
FileHandle contentRoot = mod.root.child("content");
|
||||||
FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s");
|
for(ContentType type : ContentType.all){
|
||||||
if(folder.exists()){
|
FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s");
|
||||||
for(FileHandle file : folder.list()){
|
if(folder.exists()){
|
||||||
if(file.extension().equals("json")){
|
for(FileHandle file : folder.list()){
|
||||||
try{
|
if(file.extension().equals("json")){
|
||||||
//this binds the content but does not load it entirely
|
try{
|
||||||
Content loaded = parser.parse(mod, file.nameWithoutExtension(), file.readString(), type);
|
//this binds the content but does not load it entirely
|
||||||
Log.info("[{0}] Loaded '{1}'.", mod.meta.name, loaded);
|
Content loaded = parser.parse(mod, file.nameWithoutExtension(), file.readString("UTF-8"), file, type);
|
||||||
}catch(Exception e){
|
Log.info("[{0}] Loaded '{1}'.", mod.meta.name,
|
||||||
throw new RuntimeException("Failed to parse content file '" + file + "' for mod '" + mod.meta.name + "'.", e);
|
(loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded));
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException("Failed to parse content file '" + file + "' for mod '" + mod.meta.name + "'.", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//this finishes parsing content fields
|
//this finishes parsing content fields
|
||||||
parser.finishParsing();
|
parser.finishParsing();
|
||||||
|
|
||||||
|
//load content for code mods
|
||||||
each(Mod::loadContent);
|
each(Mod::loadContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,13 +349,49 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
/** Iterates through each mod with a main class.*/
|
/** Iterates through each mod with a main class.*/
|
||||||
public void each(Consumer<Mod> cons){
|
public void each(Consumer<Mod> cons){
|
||||||
loaded.each(p -> p.mod != null, p -> cons.accept(p.mod));
|
loaded.each(p -> p.mod != null, p -> safeRun(p, () -> cons.accept(p.mod)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleError(Throwable t, LoadedMod mod){
|
||||||
|
Array<Throwable> causes = Strings.getCauses(t);
|
||||||
|
Content content = null;
|
||||||
|
for(Throwable e : causes){
|
||||||
|
if(e instanceof ModLoadException && ((ModLoadException) e).content != null){
|
||||||
|
content = ((ModLoadException) e).content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String realCause = "<???>";
|
||||||
|
for(int i = causes.size -1 ; i >= 0; i--){
|
||||||
|
if(causes.get(i).getMessage() != null){
|
||||||
|
realCause = causes.get(i).getMessage();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(content != null){
|
||||||
|
throw new ModLoadException(Strings.format("Error loading '{0}' from mod '{1}' ({2}):\n{3}",
|
||||||
|
content, mod.meta.name, content.sourceFile.name(), realCause), content, t);
|
||||||
|
}else{
|
||||||
|
throw new ModLoadException("Error loading mod " + mod.meta.name, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void safeRun(LoadedMod mod, Runnable run){
|
||||||
|
try{
|
||||||
|
run.run();
|
||||||
|
}catch(Throwable t){
|
||||||
|
handleError(t, mod);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Loads a mod file+meta, but does not add it to the list.
|
/** Loads a mod file+meta, but does not add it to the list.
|
||||||
* Note that directories can be loaded as mods.*/
|
* Note that directories can be loaded as mods.*/
|
||||||
private LoadedMod loadMod(FileHandle sourceFile) throws Exception{
|
private LoadedMod loadMod(FileHandle sourceFile, boolean workshop) throws Exception{
|
||||||
FileHandle zip = sourceFile.isDirectory() ? sourceFile : new ZipFileHandle(sourceFile);
|
FileHandle zip = sourceFile.isDirectory() ? sourceFile : new ZipFileHandle(sourceFile);
|
||||||
|
if(zip.list().length == 1 && zip.list()[0].isDirectory()){
|
||||||
|
zip = zip.list()[0];
|
||||||
|
}
|
||||||
|
|
||||||
FileHandle metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("plugin.json");
|
FileHandle metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("plugin.json");
|
||||||
if(!metaf.exists()){
|
if(!metaf.exists()){
|
||||||
@@ -343,6 +402,12 @@ public class Mods implements Loadable{
|
|||||||
ModMeta meta = json.fromJson(ModMeta.class, metaf.readString());
|
ModMeta meta = json.fromJson(ModMeta.class, metaf.readString());
|
||||||
String camelized = meta.name.replace(" ", "");
|
String camelized = meta.name.replace(" ", "");
|
||||||
String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main;
|
String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main;
|
||||||
|
String baseName = meta.name.toLowerCase().replace(" ", "-");
|
||||||
|
|
||||||
|
if(loaded.contains(m -> m.name.equals(baseName)) || disabled.contains(m -> m.name.equals(baseName))){
|
||||||
|
throw new IllegalArgumentException("A mod with the name '" + baseName + "' is already imported.");
|
||||||
|
}
|
||||||
|
|
||||||
Mod mainMod;
|
Mod mainMod;
|
||||||
|
|
||||||
FileHandle mainFile = zip;
|
FileHandle mainFile = zip;
|
||||||
@@ -388,6 +453,8 @@ public class Mods implements Loadable{
|
|||||||
public final String name;
|
public final String name;
|
||||||
/** This mod's metadata. */
|
/** This mod's metadata. */
|
||||||
public final ModMeta meta;
|
public final ModMeta meta;
|
||||||
|
/** The ID of this mod in the workshop.*/
|
||||||
|
public @Nullable String workshopID;
|
||||||
|
|
||||||
public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){
|
public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){
|
||||||
this.root = root;
|
this.root = root;
|
||||||
@@ -400,6 +467,15 @@ public class Mods implements Loadable{
|
|||||||
public boolean enabled(){
|
public boolean enabled(){
|
||||||
return Core.settings.getBool(name + "-enabled", true);
|
return Core.settings.getBool(name + "-enabled", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return "LoadedMod{" +
|
||||||
|
"file=" + file +
|
||||||
|
", root=" + root +
|
||||||
|
", name='" + name + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Plugin metadata information.*/
|
/** Plugin metadata information.*/
|
||||||
@@ -409,4 +485,22 @@ public class Mods implements Loadable{
|
|||||||
/** Hidden mods are only server-side or client-side, and do not support adding new content. */
|
/** Hidden mods are only server-side or client-side, and do not support adding new content. */
|
||||||
public boolean hidden;
|
public boolean hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Thrown when an error occurs while loading a mod.*/
|
||||||
|
public static class ModLoadException extends RuntimeException{
|
||||||
|
public Content content;
|
||||||
|
public LoadedMod mod;
|
||||||
|
|
||||||
|
public ModLoadException(String message, Throwable cause){
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ModLoadException(String message, @Nullable Content content, Throwable cause){
|
||||||
|
super(message, cause);
|
||||||
|
this.content = content;
|
||||||
|
if(content != null){
|
||||||
|
this.mod = content.mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import io.anuke.mindustry.world.blocks.*;
|
|||||||
|
|
||||||
import static io.anuke.mindustry.Vars.content;
|
import static io.anuke.mindustry.Vars.content;
|
||||||
|
|
||||||
public class Item extends UnlockableContent implements Comparable<Item>{
|
public class Item extends UnlockableContent{
|
||||||
public final Color color;
|
public final Color color;
|
||||||
|
|
||||||
/** type of the item; used for tabs and core acceptance. default value is {@link ItemType#resource}. */
|
/** type of the item; used for tabs and core acceptance. default value is {@link ItemType#resource}. */
|
||||||
@@ -61,11 +61,6 @@ public class Item extends UnlockableContent implements Comparable<Item>{
|
|||||||
return localizedName();
|
return localizedName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(Item item){
|
|
||||||
return Integer.compare(id, item.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ContentType getContentType(){
|
public ContentType getContentType(){
|
||||||
return ContentType.item;
|
return ContentType.item;
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ public class ItemStack implements Comparable<ItemStack>{
|
|||||||
item = Items.copper;
|
item = Items.copper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ItemStack copy(){
|
||||||
|
return new ItemStack(item, amount);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean equals(ItemStack other){
|
public boolean equals(ItemStack other){
|
||||||
return other != null && other.item == item && other.amount == amount;
|
return other != null && other.item == item && other.amount == amount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,34 +5,32 @@ import io.anuke.arc.collection.*;
|
|||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
|
||||||
import io.anuke.arc.util.ArcAnnotate.*;
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.game.Objectives.*;
|
||||||
import io.anuke.mindustry.maps.generators.*;
|
import io.anuke.mindustry.maps.generators.*;
|
||||||
import io.anuke.mindustry.world.*;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class Zone extends UnlockableContent{
|
public class Zone extends UnlockableContent{
|
||||||
public @NonNull Generator generator;
|
public @NonNull Generator generator;
|
||||||
public Block[] blockRequirements = {};
|
public @NonNull Objective configureObjective = new ZoneWave(this, 15);
|
||||||
public ZoneRequirement[] zoneRequirements = {};
|
public Array<Objective> requirements = new Array<>();
|
||||||
public Item[] resources = {};
|
//TODO autogenerate
|
||||||
|
public Array<Item> resources = new Array<>();
|
||||||
|
|
||||||
public Consumer<Rules> rules = rules -> {};
|
public Consumer<Rules> rules = rules -> {};
|
||||||
public boolean alwaysUnlocked;
|
public boolean alwaysUnlocked;
|
||||||
public int conditionWave = Integer.MAX_VALUE;
|
public int conditionWave = Integer.MAX_VALUE;
|
||||||
public int configureWave = 15;
|
|
||||||
public int launchPeriod = 10;
|
public int launchPeriod = 10;
|
||||||
public Loadout loadout = Loadouts.basicShard;
|
public Loadout loadout = Loadouts.basicShard;
|
||||||
public TextureRegion preview;
|
public TextureRegion preview;
|
||||||
|
|
||||||
protected ItemStack[] baseLaunchCost = {};
|
protected Array<ItemStack> baseLaunchCost = new Array<>();
|
||||||
protected Array<ItemStack> startingItems = new Array<>();
|
protected Array<ItemStack> startingItems = new Array<>();
|
||||||
protected ItemStack[] launchCost = null;
|
protected Array<ItemStack> launchCost;
|
||||||
|
|
||||||
private Array<ItemStack> defaultStartingItems = new Array<>();
|
private Array<ItemStack> defaultStartingItems = new Array<>();
|
||||||
|
|
||||||
@@ -47,7 +45,7 @@ public class Zone extends UnlockableContent{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
preview = Core.atlas.find("zone-" + name);
|
preview = Core.atlas.find("zone-" + name, Core.atlas.find(name + "-zone"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Rules getRules(){
|
public Rules getRules(){
|
||||||
@@ -60,35 +58,15 @@ public class Zone extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isBossWave(int wave){
|
|
||||||
return wave % configureWave == 0 && wave > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isLaunchWave(int wave){
|
public boolean isLaunchWave(int wave){
|
||||||
return metCondition() && wave % launchPeriod == 0;
|
return metCondition() && wave % launchPeriod == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canUnlock(){
|
public boolean canUnlock(){
|
||||||
if(data.isUnlocked(this)){
|
return data.isUnlocked(this) || !requirements.contains(r -> !r.complete());
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(ZoneRequirement other : zoneRequirements){
|
|
||||||
if(other.zone.bestWave() < other.wave){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Block other : blockRequirements){
|
|
||||||
if(!data.isUnlocked(other)){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemStack[] getLaunchCost(){
|
public Array<ItemStack> getLaunchCost(){
|
||||||
if(launchCost == null){
|
if(launchCost == null){
|
||||||
updateLaunchCost();
|
updateLaunchCost();
|
||||||
}
|
}
|
||||||
@@ -104,30 +82,54 @@ public class Zone extends UnlockableContent{
|
|||||||
defaultStartingItems.each(stack -> startingItems.add(new ItemStack(stack.item, stack.amount)));
|
defaultStartingItems.each(stack -> startingItems.add(new ItemStack(stack.item, stack.amount)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasLaunched(){
|
||||||
|
return Core.settings.getBool(name + "-launched", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLaunched(){
|
||||||
|
updateObjectives(() -> {
|
||||||
|
Core.settings.put(name + "-launched", true);
|
||||||
|
data.modified();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void updateWave(int wave){
|
public void updateWave(int wave){
|
||||||
int value = Core.settings.getInt(name + "-wave", 0);
|
int value = Core.settings.getInt(name + "-wave", 0);
|
||||||
|
|
||||||
if(value < wave){
|
if(value < wave){
|
||||||
Core.settings.put(name + "-wave", wave);
|
updateObjectives(() -> {
|
||||||
data.modified();
|
Core.settings.put(name + "-wave", wave);
|
||||||
|
data.modified();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(Zone zone : content.zones()){
|
public void updateObjectives(Runnable closure){
|
||||||
ZoneRequirement req = Structs.find(zone.zoneRequirements, f -> f.zone == this);
|
Array<ZoneObjective> incomplete = content.zones()
|
||||||
if(req != null && wave == req.wave + 1){
|
.map(z -> z.requirements).<Objective>flatten()
|
||||||
Events.fire(new ZoneRequireCompleteEvent(zone, this));
|
.select(o -> o.zone() == this && !o.complete())
|
||||||
}
|
.as(ZoneObjective.class);
|
||||||
}
|
|
||||||
|
|
||||||
if(wave == configureWave + 1){
|
boolean wasConfig = configureObjective.complete();
|
||||||
Events.fire(new ZoneConfigureCompleteEvent(this));
|
|
||||||
|
closure.run();
|
||||||
|
for(ZoneObjective objective : incomplete){
|
||||||
|
if(objective.complete()){
|
||||||
|
Events.fire(new ZoneRequireCompleteEvent(objective.zone, content.zones().find(z -> z.requirements.contains(objective)), objective));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!wasConfig && configureObjective.complete()){
|
||||||
|
Events.fire(new ZoneConfigureCompleteEvent(this));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int bestWave(){
|
public int bestWave(){
|
||||||
return Core.settings.getInt(name + "-wave", 0);
|
return Core.settings.getInt(name + "-wave", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCompleted(){
|
/** @return whether initial conditions to launch are met. */
|
||||||
|
public boolean isLaunchMet(){
|
||||||
return bestWave() >= conditionWave;
|
return bestWave() >= conditionWave;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +154,7 @@ public class Zone extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
|
|
||||||
stacks.sort();
|
stacks.sort();
|
||||||
launchCost = stacks.toArray(ItemStack.class);
|
launchCost = stacks;
|
||||||
Core.settings.putObject(name + "-starting-items", startingItems);
|
Core.settings.putObject(name + "-starting-items", startingItems);
|
||||||
data.modified();
|
data.modified();
|
||||||
}
|
}
|
||||||
@@ -164,13 +166,13 @@ public class Zone extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean canConfigure(){
|
public boolean canConfigure(){
|
||||||
return bestWave() >= configureWave;
|
return configureObjective.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
generator.init(loadout);
|
generator.init(loadout);
|
||||||
Arrays.sort(resources);
|
resources.sort();
|
||||||
|
|
||||||
for(ItemStack stack : startingItems){
|
for(ItemStack stack : startingItems){
|
||||||
defaultStartingItems.add(new ItemStack(stack.item, stack.amount));
|
defaultStartingItems.add(new ItemStack(stack.item, stack.amount));
|
||||||
@@ -208,22 +210,4 @@ public class Zone extends UnlockableContent{
|
|||||||
return ContentType.zone;
|
return ContentType.zone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ZoneRequirement{
|
|
||||||
public final Zone zone;
|
|
||||||
public final int wave;
|
|
||||||
|
|
||||||
public ZoneRequirement(Zone zone, int wave){
|
|
||||||
this.zone = zone;
|
|
||||||
this.wave = wave;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ZoneRequirement[] with(Object... objects){
|
|
||||||
ZoneRequirement[] out = new ZoneRequirement[objects.length / 2];
|
|
||||||
for(int i = 0; i < objects.length; i += 2){
|
|
||||||
out[i / 2] = new ZoneRequirement((Zone)objects[i], (Integer)objects[i + 1]);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.anuke.mindustry.ui;
|
package io.anuke.mindustry.ui;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.Core;
|
||||||
|
import io.anuke.arc.util.Strings;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.Color;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ public class Links{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class LinkEntry{
|
public static class LinkEntry{
|
||||||
public final String name, description, link;
|
public final String name, title, description, link;
|
||||||
public final Color color;
|
public final Color color;
|
||||||
|
|
||||||
public LinkEntry(String name, String link, Color color){
|
public LinkEntry(String name, String link, Color color){
|
||||||
@@ -37,6 +38,9 @@ public class Links{
|
|||||||
this.color = color;
|
this.color = color;
|
||||||
this.description = Core.bundle.getNotNull("link." + name + ".description");
|
this.description = Core.bundle.getNotNull("link." + name + ".description");
|
||||||
this.link = link;
|
this.link = link;
|
||||||
|
|
||||||
|
String title = Core.bundle.getOrNull("link." + name + ".title");
|
||||||
|
this.title = title != null ? title : Strings.capitalize(name.replace("-", " "));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class AboutDialog extends FloatingDialog{
|
|||||||
}).size(h - 5, h);
|
}).size(h - 5, h);
|
||||||
|
|
||||||
table.table(inset -> {
|
table.table(inset -> {
|
||||||
inset.add("[accent]" + Strings.capitalize(link.name.replace("-", " "))).growX().left();
|
inset.add("[accent]" + link.title).growX().left();
|
||||||
inset.row();
|
inset.row();
|
||||||
inset.labelWrap(link.description).width(w - 100f).color(Color.lightGray).growX();
|
inset.labelWrap(link.description).width(w - 100f).color(Color.lightGray).growX();
|
||||||
}).padLeft(8);
|
}).padLeft(8);
|
||||||
|
|||||||
@@ -1,34 +1,112 @@
|
|||||||
package io.anuke.mindustry.ui.dialogs;
|
package io.anuke.mindustry.ui.dialogs;
|
||||||
|
|
||||||
|
import io.anuke.arc.*;
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.style.*;
|
||||||
|
import io.anuke.arc.scene.ui.*;
|
||||||
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.content.Blocks;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.content.Items;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.Rules;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.type.ItemStack;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.type.ItemType;
|
import io.anuke.mindustry.ui.*;
|
||||||
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.tilesize;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class CustomRulesDialog extends FloatingDialog{
|
public class CustomRulesDialog extends FloatingDialog{
|
||||||
private Table main;
|
private Table main;
|
||||||
private Rules rules;
|
private Rules rules;
|
||||||
private Supplier<Rules> resetter;
|
private Supplier<Rules> resetter;
|
||||||
private LoadoutDialog loadoutDialog;
|
private LoadoutDialog loadoutDialog;
|
||||||
|
private FloatingDialog banDialog;
|
||||||
|
|
||||||
public CustomRulesDialog(){
|
public CustomRulesDialog(){
|
||||||
super("$mode.custom");
|
super("$mode.custom");
|
||||||
|
|
||||||
loadoutDialog = new LoadoutDialog();
|
loadoutDialog = new LoadoutDialog();
|
||||||
|
banDialog = new FloatingDialog("$bannedblocks");
|
||||||
|
banDialog.addCloseButton();
|
||||||
|
|
||||||
|
banDialog.shown(this::rebuildBanned);
|
||||||
|
banDialog.buttons.addImageTextButton("$addall", Icon.arrow16Small, () -> {
|
||||||
|
rules.bannedBlocks.addAll(content.blocks().select(Block::isBuildable));
|
||||||
|
rebuildBanned();
|
||||||
|
}).size(180, 64f);
|
||||||
|
|
||||||
|
banDialog.buttons.addImageTextButton("$clear", Icon.trash16Small, () -> {
|
||||||
|
rules.bannedBlocks.clear();
|
||||||
|
rebuildBanned();
|
||||||
|
}).size(180, 64f);
|
||||||
|
|
||||||
setFillParent(true);
|
setFillParent(true);
|
||||||
shown(this::setup);
|
shown(this::setup);
|
||||||
addCloseButton();
|
addCloseButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void rebuildBanned(){
|
||||||
|
float previousScroll = banDialog.cont.getChildren().isEmpty() ? 0f : ((ScrollPane)banDialog.cont.getChildren().first()).getScrollY();
|
||||||
|
banDialog.cont.clear();
|
||||||
|
banDialog.cont.pane(t -> {
|
||||||
|
t.margin(10f);
|
||||||
|
|
||||||
|
if(rules.bannedBlocks.isEmpty()){
|
||||||
|
t.add("$empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
Array<Block> array = Array.with(rules.bannedBlocks);
|
||||||
|
array.sort();
|
||||||
|
|
||||||
|
int cols = mobile && Core.graphics.isPortrait() ? 1 : mobile ? 2 : 3;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for(Block block : array){
|
||||||
|
t.table(Tex.underline, b -> {
|
||||||
|
b.left().margin(4f);
|
||||||
|
b.addImage(block.icon(Cicon.medium)).size(Cicon.medium.size).padRight(3);
|
||||||
|
b.add(block.localizedName).color(Color.lightGray).padLeft(3).growX().left().wrap();
|
||||||
|
|
||||||
|
b.addImageButton(Icon.cancelSmall, Styles.clearPartiali, () -> {
|
||||||
|
rules.bannedBlocks.remove(block);
|
||||||
|
rebuildBanned();
|
||||||
|
}).size(70f).pad(-4f).padLeft(0f);
|
||||||
|
}).size(300f, 70f).padRight(5);
|
||||||
|
|
||||||
|
if(++i % cols == 0){
|
||||||
|
t.row();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).get().setScrollYForce(previousScroll);
|
||||||
|
banDialog.cont.row();
|
||||||
|
banDialog.cont.addImageTextButton("$add", Icon.addSmall, () -> {
|
||||||
|
FloatingDialog dialog = new FloatingDialog("$add");
|
||||||
|
dialog.cont.pane(t -> {
|
||||||
|
t.left().margin(14f);
|
||||||
|
int[] i = {0};
|
||||||
|
content.blocks().each(b -> !rules.bannedBlocks.contains(b) && b.isBuildable(), b -> {
|
||||||
|
int cols = mobile && Core.graphics.isPortrait() ? 4 : 12;
|
||||||
|
t.addImageButton(new TextureRegionDrawable(b.icon(Cicon.medium)), Styles.cleari, () -> {
|
||||||
|
rules.bannedBlocks.add(b);
|
||||||
|
rebuildBanned();
|
||||||
|
dialog.hide();
|
||||||
|
}).size(60f).get().resizeImage(Cicon.medium.size);
|
||||||
|
|
||||||
|
if(++i[0] % cols == 0){
|
||||||
|
t.row();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.addCloseButton();
|
||||||
|
dialog.show();
|
||||||
|
}).size(300f, 64f);
|
||||||
|
}
|
||||||
|
|
||||||
public void show(Rules rules, Supplier<Rules> resetter){
|
public void show(Rules rules, Supplier<Rules> resetter){
|
||||||
this.rules = rules;
|
this.rules = rules;
|
||||||
this.resetter = resetter;
|
this.resetter = resetter;
|
||||||
@@ -67,27 +145,26 @@ public class CustomRulesDialog extends FloatingDialog{
|
|||||||
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier);
|
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier);
|
||||||
|
|
||||||
main.addButton("$configure",
|
main.addButton("$configure",
|
||||||
() -> loadoutDialog.show(
|
() -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout,
|
||||||
Blocks.coreShard.itemCapacity,
|
() -> {
|
||||||
() -> rules.loadout,
|
rules.loadout.clear();
|
||||||
() -> {
|
rules.loadout.add(new ItemStack(Items.copper, 100));
|
||||||
rules.loadout.clear();
|
}, () -> {}, () -> {}
|
||||||
rules.loadout.add(new ItemStack(Items.copper, 100));
|
|
||||||
},
|
|
||||||
() -> {}, () -> {},
|
|
||||||
item -> item.type == ItemType.material
|
|
||||||
)).left().width(300f);
|
)).left().width(300f);
|
||||||
main.row();
|
main.row();
|
||||||
|
|
||||||
|
main.addButton("$bannedblocks", banDialog::show).left().width(300f);
|
||||||
|
main.row();
|
||||||
|
|
||||||
title("$rules.title.player");
|
title("$rules.title.player");
|
||||||
number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier);
|
|
||||||
number("$rules.playerhealthmultiplier", f -> rules.playerHealthMultiplier = f, () -> rules.playerHealthMultiplier);
|
number("$rules.playerhealthmultiplier", f -> rules.playerHealthMultiplier = f, () -> rules.playerHealthMultiplier);
|
||||||
|
number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier);
|
||||||
|
|
||||||
title("$rules.title.unit");
|
title("$rules.title.unit");
|
||||||
check("$rules.unitdrops", b -> rules.unitDrops = b, () -> rules.unitDrops, () -> true);
|
check("$rules.unitdrops", b -> rules.unitDrops = b, () -> rules.unitDrops, () -> true);
|
||||||
number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier);
|
|
||||||
number("$rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier);
|
number("$rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier);
|
||||||
number("$rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
|
number("$rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
|
||||||
|
number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier);
|
||||||
|
|
||||||
title("$rules.title.enemy");
|
title("$rules.title.enemy");
|
||||||
check("$rules.attack", b -> rules.attackMode = b, () -> rules.attackMode);
|
check("$rules.attack", b -> rules.attackMode = b, () -> rules.attackMode);
|
||||||
|
|||||||
@@ -2,13 +2,14 @@ package io.anuke.mindustry.ui.dialogs;
|
|||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.collection.ObjectSet.*;
|
|
||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.scene.*;
|
import io.anuke.arc.scene.*;
|
||||||
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.style.*;
|
import io.anuke.arc.scene.style.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
@@ -21,10 +22,9 @@ import io.anuke.mindustry.gen.*;
|
|||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.io.SaveIO.*;
|
import io.anuke.mindustry.io.SaveIO.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.type.Zone.*;
|
|
||||||
import io.anuke.mindustry.ui.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.Styles;
|
import io.anuke.mindustry.ui.layout.*;
|
||||||
import io.anuke.mindustry.ui.TreeLayout.*;
|
import io.anuke.mindustry.ui.layout.TreeLayout.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -33,13 +33,14 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
private ObjectSet<ZoneNode> nodes = new ObjectSet<>();
|
private ObjectSet<ZoneNode> nodes = new ObjectSet<>();
|
||||||
private ZoneInfoDialog info = new ZoneInfoDialog();
|
private ZoneInfoDialog info = new ZoneInfoDialog();
|
||||||
private Rectangle bounds = new Rectangle();
|
private Rectangle bounds = new Rectangle();
|
||||||
|
private View view = new View();
|
||||||
|
|
||||||
public DeployDialog(){
|
public DeployDialog(){
|
||||||
super("", Styles.fullDialog);
|
super("", Styles.fullDialog);
|
||||||
|
|
||||||
ZoneNode root = new ZoneNode(Zones.groundZero, null);
|
ZoneNode root = new ZoneNode(Zones.groundZero, null);
|
||||||
|
|
||||||
TreeLayout layout = new TreeLayout();
|
BranchTreeLayout layout = new BranchTreeLayout();
|
||||||
layout.gapBetweenLevels = layout.gapBetweenNodes = Scl.scl(60f);
|
layout.gapBetweenLevels = layout.gapBetweenNodes = Scl.scl(60f);
|
||||||
layout.gapBetweenNodes = Scl.scl(120f);
|
layout.gapBetweenNodes = Scl.scl(120f);
|
||||||
layout.layout(root);
|
layout.layout(root);
|
||||||
@@ -50,6 +51,51 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
buttons.addImageTextButton("$techtree", Icon.tree, () -> ui.tech.show()).size(230f, 64f);
|
buttons.addImageTextButton("$techtree", Icon.tree, () -> ui.tech.show()).size(230f, 64f);
|
||||||
|
|
||||||
shown(this::setup);
|
shown(this::setup);
|
||||||
|
|
||||||
|
//view input.
|
||||||
|
|
||||||
|
addListener(new InputListener(){
|
||||||
|
@Override
|
||||||
|
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
|
||||||
|
view.setScale(Mathf.clamp(view.getScaleX() - amountY / 40f, 0.25f, 1f));
|
||||||
|
view.setOrigin(Align.center);
|
||||||
|
view.setTransform(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseMoved(InputEvent event, float x, float y){
|
||||||
|
view.requestScroll();
|
||||||
|
return super.mouseMoved(event, x, y);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
addListener(new ElementGestureListener(){
|
||||||
|
@Override
|
||||||
|
public void zoom(InputEvent event, float initialDistance, float distance){
|
||||||
|
if(view.lastZoom < 0){
|
||||||
|
view.lastZoom = view.getScaleX();
|
||||||
|
}
|
||||||
|
|
||||||
|
view.setScale(Mathf.clamp(distance / initialDistance * view.lastZoom, 0.25f, 1f));
|
||||||
|
view.setOrigin(Align.center);
|
||||||
|
view.setTransform(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
|
||||||
|
view.lastZoom = view.getScaleX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){
|
||||||
|
view.panX += deltaX / view.getScaleX();
|
||||||
|
view.panY += deltaY / view.getScaleY();
|
||||||
|
view.moved = true;
|
||||||
|
view.clamp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setup(){
|
public void setup(){
|
||||||
@@ -74,7 +120,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
update(() -> {
|
update(() -> {
|
||||||
setOrigin(Align.center);
|
setOrigin(Align.center);
|
||||||
time[0] += Core.graphics.getDeltaTime() * 10f;
|
time[0] += Core.graphics.getDeltaTime() * 10f;
|
||||||
setTranslation(Mathf.sin(time[0], 60f, 70f) + panX / 30f, Mathf.cos(time[0], 140f, 80f) + (panY + 200) / 30f);
|
setTranslation(Mathf.sin(time[0], 60f, 70f) + view.panX / 30f, Mathf.cos(time[0], 140f, 80f) + (view.panY + 200) / 30f);
|
||||||
});
|
});
|
||||||
}}.setScaling(Scaling.fit));
|
}}.setScaling(Scaling.fit));
|
||||||
|
|
||||||
@@ -129,7 +175,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
|
|
||||||
button.defaults().colspan(2);
|
button.defaults().colspan(2);
|
||||||
button.row();
|
button.row();
|
||||||
button.add(Core.bundle.format("save.wave", color + slot.getWave()));
|
button.add(Core.bundle.format("save", color + slot.getWave()));
|
||||||
button.row();
|
button.row();
|
||||||
button.label(() -> Core.bundle.format("save.playtime", color + slot.getPlayTime()));
|
button.label(() -> Core.bundle.format("save.playtime", color + slot.getPlayTime()));
|
||||||
button.row();
|
button.row();
|
||||||
@@ -144,7 +190,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
}).width(size).height(50f).padTop(3);
|
}).width(size).height(50f).padTop(3);
|
||||||
}));
|
}));
|
||||||
}else{
|
}else{
|
||||||
stack.add(new View());
|
stack.add(view = new View());
|
||||||
}
|
}
|
||||||
|
|
||||||
stack.add(new ItemsDisplay());
|
stack.add(new ItemsDisplay());
|
||||||
@@ -155,26 +201,28 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
for(ZoneNode node : nodes){
|
for(ZoneNode node : nodes){
|
||||||
node.allChildren.clear();
|
node.allChildren.clear();
|
||||||
node.allChildren.addAll(node.children);
|
node.allChildren.addAll(node.children);
|
||||||
for(ZoneNode other : new ObjectSetIterator<>(nodes)){
|
for(ZoneNode other : nodes){
|
||||||
if(Structs.contains(other.zone.zoneRequirements, req -> req.zone == node.zone)){
|
if(other.zone.requirements.contains(req -> req.zone() == node.zone)){
|
||||||
node.allChildren.add(other);
|
node.allChildren.add(other);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
view.setOrigin(Align.center);
|
||||||
|
view.setTransform(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hidden(Zone zone){
|
boolean hidden(Zone zone){
|
||||||
for(ZoneRequirement other : zone.zoneRequirements){
|
return zone.requirements.contains(o -> o.zone() != null && o.zone().locked());
|
||||||
if(!data.isUnlocked(other.zone)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void buildButton(Zone zone, Button button){
|
void buildButton(Zone zone, Button button){
|
||||||
button.setDisabled(() -> hidden(zone));
|
button.setDisabled(() -> hidden(zone));
|
||||||
button.clicked(() -> info.show(zone));
|
button.clicked(() -> {
|
||||||
|
if(!view.moved){
|
||||||
|
info.show(zone);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if(zone.unlocked() && !hidden(zone)){
|
if(zone.unlocked() && !hidden(zone)){
|
||||||
button.labelWrap(zone.localizedName()).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center);
|
button.labelWrap(zone.localizedName()).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center);
|
||||||
@@ -186,10 +234,9 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//should be static variables of View, but that's impossible
|
|
||||||
static float panX = 0, panY = -200;
|
|
||||||
|
|
||||||
class View extends Group{
|
class View extends Group{
|
||||||
|
float panX = 0, panY = -200, lastZoom = -1;
|
||||||
|
boolean moved = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
for(ZoneNode node : nodes){
|
for(ZoneNode node : nodes){
|
||||||
@@ -209,11 +256,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
addChild(stack);
|
addChild(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
dragged((x, y) -> {
|
released(() -> moved = false);
|
||||||
panX += x;
|
|
||||||
panY += y;
|
|
||||||
clamp();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clamp(){
|
void clamp(){
|
||||||
@@ -229,9 +272,9 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void drawChildren(){
|
||||||
clamp();
|
clamp();
|
||||||
float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y;
|
float offsetX = panX + width / 2f, offsetY = panY + height / 2f;
|
||||||
|
|
||||||
for(ZoneNode node : nodes){
|
for(ZoneNode node : nodes){
|
||||||
for(ZoneNode child : node.allChildren){
|
for(ZoneNode child : node.allChildren){
|
||||||
@@ -242,7 +285,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
super.draw();
|
super.drawChildren();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +301,7 @@ public class DeployDialog extends FloatingDialog{
|
|||||||
//this.height /= 2f;
|
//this.height /= 2f;
|
||||||
nodes.add(this);
|
nodes.add(this);
|
||||||
|
|
||||||
arr.selectFrom(content.zones(), other -> other.zoneRequirements.length > 0 && other.zoneRequirements[0].zone == zone);
|
arr.selectFrom(content.zones(), other -> other.requirements.size > 0 && other.requirements.first().zone() == zone);
|
||||||
|
|
||||||
children = new ZoneNode[arr.size];
|
children = new ZoneNode[arr.size];
|
||||||
for(int i = 0; i < children.length; i++){
|
for(int i = 0; i < children.length; i++){
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import io.anuke.arc.graphics.*;
|
|||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.ui.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
|
|
||||||
@@ -69,13 +70,19 @@ public class HostDialog extends FloatingDialog{
|
|||||||
player.isAdmin = true;
|
player.isAdmin = true;
|
||||||
|
|
||||||
if(steam){
|
if(steam){
|
||||||
Core.app.post(() -> Core.settings.getBoolOnce("steampublic", () -> {
|
Core.app.post(() -> Core.settings.getBoolOnce("steampublic2", () -> {
|
||||||
ui.showCustomConfirm("$setting.publichost.name", "$public.confirm", "$yes", "$no", () -> {
|
ui.showCustomConfirm("$setting.publichost.name", "$public.confirm", "$yes", "$no", () -> {
|
||||||
Core.settings.putSave("publichost", true);
|
Core.settings.putSave("publichost", true);
|
||||||
platform.updateLobby();
|
platform.updateLobby();
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Version.modifier.contains("beta")){
|
||||||
|
Core.settings.putSave("publichost", false);
|
||||||
|
platform.updateLobby();
|
||||||
|
Core.settings.getBoolOnce("betapublic", () -> ui.showInfo("$public.beta"));
|
||||||
|
}
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showException("$server.error", e);
|
ui.showException("$server.error", e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.anuke.mindustry.ui.dialogs;
|
package io.anuke.mindustry.ui.dialogs;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.Core;
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.Table;
|
||||||
import io.anuke.arc.util.Log;
|
import io.anuke.arc.util.Log;
|
||||||
@@ -14,6 +15,10 @@ import static io.anuke.mindustry.Vars.ui;
|
|||||||
|
|
||||||
public class LanguageDialog extends FloatingDialog{
|
public class LanguageDialog extends FloatingDialog{
|
||||||
private Locale lastLocale;
|
private Locale lastLocale;
|
||||||
|
private ObjectMap<Locale, String> displayNames = ObjectMap.of(
|
||||||
|
Locale.TRADITIONAL_CHINESE, "正體中文",
|
||||||
|
Locale.SIMPLIFIED_CHINESE, "简体中文"
|
||||||
|
);
|
||||||
|
|
||||||
public LanguageDialog(){
|
public LanguageDialog(){
|
||||||
super("$settings.language");
|
super("$settings.language");
|
||||||
@@ -30,7 +35,7 @@ public class LanguageDialog extends FloatingDialog{
|
|||||||
ButtonGroup<TextButton> group = new ButtonGroup<>();
|
ButtonGroup<TextButton> group = new ButtonGroup<>();
|
||||||
|
|
||||||
for(Locale loc : locales){
|
for(Locale loc : locales){
|
||||||
TextButton button = new TextButton(Strings.capitalize(loc.getDisplayName(loc)), Styles.clearTogglet);
|
TextButton button = new TextButton(Strings.capitalize(displayNames.get(loc, loc.getDisplayName(loc))), Styles.clearTogglet);
|
||||||
button.clicked(() -> {
|
button.clicked(() -> {
|
||||||
if(getLocale().equals(loc)) return;
|
if(getLocale().equals(loc)) return;
|
||||||
Core.settings.put("locale", loc.toString());
|
Core.settings.put("locale", loc.toString());
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ package io.anuke.mindustry.ui.dialogs;
|
|||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.function.*;
|
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
@@ -16,10 +14,12 @@ import static io.anuke.mindustry.Vars.*;
|
|||||||
|
|
||||||
public class LoadoutDialog extends FloatingDialog{
|
public class LoadoutDialog extends FloatingDialog{
|
||||||
private Runnable hider;
|
private Runnable hider;
|
||||||
private Supplier<Array<ItemStack>> supplier;
|
//private Supplier<Array<ItemStack>> supplier;
|
||||||
private Runnable resetter;
|
private Runnable resetter;
|
||||||
private Runnable updater;
|
private Runnable updater;
|
||||||
private Predicate<Item> filter;
|
private Array<ItemStack> stacks = new Array<>();
|
||||||
|
private Array<ItemStack> originalStacks = new Array<>();
|
||||||
|
//private Predicate<Item> filter;
|
||||||
private Table items;
|
private Table items;
|
||||||
private int capacity;
|
private int capacity;
|
||||||
|
|
||||||
@@ -33,54 +33,37 @@ public class LoadoutDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cont.add(items = new Table()).left();
|
cont.pane(t -> items = t.margin(10f)).left();
|
||||||
|
|
||||||
shown(this::setup);
|
shown(this::setup);
|
||||||
hidden(() -> {
|
hidden(() -> {
|
||||||
|
originalStacks.selectFrom(stacks, s -> s.amount > 0);
|
||||||
|
updater.run();
|
||||||
if(hider != null){
|
if(hider != null){
|
||||||
hider.run();
|
hider.run();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cont.row();
|
buttons.addImageTextButton("$back", Icon.arrowLeft, this::hide).size(210f, 64f);
|
||||||
|
|
||||||
cont.addButton("$add", () -> {
|
buttons.addImageTextButton("$settings.reset", Icon.refreshSmall, () -> {
|
||||||
FloatingDialog dialog = new FloatingDialog("");
|
|
||||||
dialog.setFillParent(false);
|
|
||||||
for(Item item : content.items().select(item -> filter.test(item) && item.type == ItemType.material && supplier.get().find(stack -> stack.item == item) == null)){
|
|
||||||
TextButton button = dialog.cont.addButton("", Styles.cleart, () -> {
|
|
||||||
dialog.hide();
|
|
||||||
supplier.get().add(new ItemStack(item, 0));
|
|
||||||
updater.run();
|
|
||||||
setup();
|
|
||||||
}).size(300f, 36f).get();
|
|
||||||
button.clearChildren();
|
|
||||||
button.left();
|
|
||||||
button.addImage(item.icon(Cicon.small)).size(8 * 3).pad(4);
|
|
||||||
button.add(item.localizedName);
|
|
||||||
dialog.cont.row();
|
|
||||||
}
|
|
||||||
dialog.show();
|
|
||||||
}).size(100f, 40).left().disabled(b -> !content.items().contains(item -> filter.test(item) && !supplier.get().contains(stack -> stack.item == item)));
|
|
||||||
|
|
||||||
cont.row();
|
|
||||||
cont.addButton("$settings.reset", () -> {
|
|
||||||
resetter.run();
|
resetter.run();
|
||||||
updater.run();
|
updater.run();
|
||||||
setup();
|
setup();
|
||||||
}).size(210f, 64f);
|
}).size(210f, 64f);
|
||||||
|
|
||||||
cont.row();
|
|
||||||
cont.addImageTextButton("$back", Icon.arrowLeft, this::hide).size(210f, 64f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void show(int capacity, Supplier<Array<ItemStack>> supplier, Runnable reseter, Runnable updater, Runnable hider, Predicate<Item> filter){
|
public void show(int capacity, Array<ItemStack> stacks, Runnable reseter, Runnable updater, Runnable hider){
|
||||||
|
this.originalStacks = stacks;
|
||||||
|
this.stacks = stacks.map(ItemStack::copy);
|
||||||
|
this.stacks.addAll(content.items().select(i -> i.type == ItemType.material &&
|
||||||
|
!stacks.contains(stack -> stack.item == i)).map(i -> new ItemStack(i, 0)));
|
||||||
|
this.stacks.sort(Structs.comparingInt(s -> s.item.id));
|
||||||
this.resetter = reseter;
|
this.resetter = reseter;
|
||||||
this.supplier = supplier;
|
|
||||||
this.updater = updater;
|
this.updater = updater;
|
||||||
this.capacity = capacity;
|
this.capacity = capacity;
|
||||||
this.hider = hider;
|
this.hider = hider;
|
||||||
this.filter = filter;
|
//this.filter = filter;
|
||||||
show();
|
show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,41 +71,54 @@ public class LoadoutDialog extends FloatingDialog{
|
|||||||
items.clearChildren();
|
items.clearChildren();
|
||||||
items.left();
|
items.left();
|
||||||
float bsize = 40f;
|
float bsize = 40f;
|
||||||
int step = 50;
|
|
||||||
|
|
||||||
for(ItemStack stack : supplier.get()){
|
int i = 0;
|
||||||
items.addButton("x", Styles.clearPartialt, () -> {
|
|
||||||
supplier.get().remove(stack);
|
|
||||||
updater.run();
|
|
||||||
setup();
|
|
||||||
}).size(bsize);
|
|
||||||
|
|
||||||
items.addButton("-", Styles.clearPartialt, () -> {
|
for(ItemStack stack : stacks){
|
||||||
stack.amount = Math.max(stack.amount - step, 0);
|
items.table(Tex.pane, t -> {
|
||||||
updater.run();
|
t.margin(4).marginRight(8).left();
|
||||||
}).size(bsize);
|
t.addButton("-", Styles.cleart, () -> {
|
||||||
|
stack.amount = Math.max(stack.amount - step(stack.amount), 0);
|
||||||
|
updater.run();
|
||||||
|
}).size(bsize);
|
||||||
|
|
||||||
items.addButton("+", Styles.clearPartialt, () -> {
|
t.addButton("+", Styles.cleart, () -> {
|
||||||
stack.amount = Math.min(stack.amount + step, capacity);
|
stack.amount = Math.min(stack.amount + step(stack.amount), capacity);
|
||||||
updater.run();
|
updater.run();
|
||||||
}).size(bsize);
|
}).size(bsize);
|
||||||
|
|
||||||
items.addImageButton(Icon.pencilSmaller, Styles.clearPartial2i, () -> ui.showTextInput("$configure", stack.item.localizedName, 10, stack.amount + "", true, str -> {
|
t.addImageButton(Icon.pencilSmaller, Styles.cleari, () -> ui.showTextInput("$configure", stack.item.localizedName, 10, stack.amount + "", true, str -> {
|
||||||
if(Strings.canParsePostiveInt(str)){
|
if(Strings.canParsePostiveInt(str)){
|
||||||
int amount = Strings.parseInt(str);
|
int amount = Strings.parseInt(str);
|
||||||
if(amount >= 0 && amount <= capacity){
|
if(amount >= 0 && amount <= capacity){
|
||||||
stack.amount = amount;
|
stack.amount = amount;
|
||||||
updater.run();
|
updater.run();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
ui.showInfo(Core.bundle.format("configure.invalid", capacity));
|
||||||
ui.showInfo(Core.bundle.format("configure.invalid", capacity));
|
})).size(bsize);
|
||||||
})).size(bsize);
|
|
||||||
|
|
||||||
items.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(4).padLeft(4);
|
t.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(4).padLeft(4);
|
||||||
items.label(() -> stack.amount + "").left();
|
t.label(() -> stack.amount + "").left().width(90f);
|
||||||
|
}).pad(2).left().fillX();
|
||||||
|
|
||||||
items.row();
|
|
||||||
|
if(++i % 2 == 0 || (mobile && Core.graphics.isPortrait())){
|
||||||
|
items.row();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int step(int amount){
|
||||||
|
if(amount < 1000){
|
||||||
|
return 100;
|
||||||
|
}else if(amount < 2000){
|
||||||
|
return 200;
|
||||||
|
}else if(amount < 5000){
|
||||||
|
return 500;
|
||||||
|
}else{
|
||||||
|
return 1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.dialogs;
|
|||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.arc.util.io.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.mod.Mods.*;
|
import io.anuke.mindustry.mod.Mods.*;
|
||||||
@@ -17,6 +18,41 @@ public class ModsDialog extends FloatingDialog{
|
|||||||
public ModsDialog(){
|
public ModsDialog(){
|
||||||
super("$mods");
|
super("$mods");
|
||||||
addCloseButton();
|
addCloseButton();
|
||||||
|
|
||||||
|
buttons.addImageTextButton("$mods.report", Icon.link,
|
||||||
|
() -> Core.net.openURI(reportIssueURL))
|
||||||
|
.size(250f, 64f);
|
||||||
|
|
||||||
|
buttons.row();
|
||||||
|
|
||||||
|
buttons.addImageTextButton("$mods.guide", Icon.wiki,
|
||||||
|
() -> Core.net.openURI(modGuideURL))
|
||||||
|
.size(210f, 64f);
|
||||||
|
|
||||||
|
buttons.addImageTextButton("$mod.import.github", Icon.github, () -> {
|
||||||
|
ui.showTextInput("$mod.import.github", "", 64, "Anuken/ExampleMod", text -> {
|
||||||
|
ui.loadfrag.show();
|
||||||
|
Core.net.httpGet("http://api.github.com/repos/" + text + "/zipball/master", loc -> {
|
||||||
|
Core.net.httpGet(loc.getHeader("Location"), result -> {
|
||||||
|
try{
|
||||||
|
Streams.copyStream(result.getResultAsStream(), modDirectory.child(text.replace("/", "") + ".zip").write(false));
|
||||||
|
Core.app.post(() -> {
|
||||||
|
try{
|
||||||
|
mods.reloadContent();
|
||||||
|
setup();
|
||||||
|
ui.loadfrag.hide();
|
||||||
|
}catch(Exception e){
|
||||||
|
ui.showException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}catch(Exception e){
|
||||||
|
ui.showException(e);
|
||||||
|
}
|
||||||
|
}, t -> Core.app.post(() -> ui.showException(t)));
|
||||||
|
}, t -> Core.app.post(() -> ui.showException(t)));
|
||||||
|
});
|
||||||
|
}).size(250f, 64f);
|
||||||
|
|
||||||
shown(this::setup);
|
shown(this::setup);
|
||||||
|
|
||||||
hidden(() -> {
|
hidden(() -> {
|
||||||
@@ -60,15 +96,21 @@ public class ModsDialog extends FloatingDialog{
|
|||||||
title.add("[accent]" + mod.meta.name + "[lightgray] v" + mod.meta.version + (" | " + Core.bundle.get(mod.enabled() ? "mod.enabled" : "mod.disabled")));
|
title.add("[accent]" + mod.meta.name + "[lightgray] v" + mod.meta.version + (" | " + Core.bundle.get(mod.enabled() ? "mod.enabled" : "mod.disabled")));
|
||||||
title.add().growX();
|
title.add().growX();
|
||||||
|
|
||||||
title.addButton(mod.enabled() ? "$mod.disable" : "$mod.enable", Styles.cleart, () -> {
|
title.addImageTextButton(mod.enabled() ? "$mod.disable" : "$mod.enable", mod.enabled() ? Icon.arrowDownSmall : Icon.arrowUpSmall, Styles.cleart, () -> {
|
||||||
mods.setEnabled(mod, !mod.enabled());
|
mods.setEnabled(mod, !mod.enabled());
|
||||||
setup();
|
setup();
|
||||||
}).height(50f).margin(8f).width(100f);
|
}).height(50f).margin(8f).width(130f);
|
||||||
|
|
||||||
title.addImageButton(Icon.trash16Small, Styles.cleari, () -> ui.showConfirm("$confirm", "$mod.remove.confirm", () -> {
|
title.addImageButton(mod.workshopID != null ? Icon.linkSmall : Icon.trash16Small, Styles.cleari, () -> {
|
||||||
mods.removeMod(mod);
|
if(mod.workshopID == null){
|
||||||
setup();
|
ui.showConfirm("$confirm", "$mod.remove.confirm", () -> {
|
||||||
})).size(50f);
|
mods.removeMod(mod);
|
||||||
|
setup();
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
platform.viewListing(mod.workshopID);
|
||||||
|
}
|
||||||
|
}).size(50f);
|
||||||
}).growX().left().padTop(-14f).padRight(-14f);
|
}).growX().left().padTop(-14f).padRight(-14f);
|
||||||
|
|
||||||
t.row();
|
t.row();
|
||||||
@@ -104,4 +146,4 @@ public class ModsDialog extends FloatingDialog{
|
|||||||
});
|
});
|
||||||
}).margin(12f).width(500f);
|
}).margin(12f).width(500f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import io.anuke.arc.scene.ui.TextButton.*;
|
|||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
|
import io.anuke.mindustry.game.*;
|
||||||
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.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
@@ -225,7 +226,9 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
|
|
||||||
game.checkPref("savecreate", true);
|
game.checkPref("savecreate", true);
|
||||||
|
|
||||||
if(steam){
|
game.checkPref("hints", true);
|
||||||
|
|
||||||
|
if(steam && !Version.modifier.contains("beta")){
|
||||||
game.checkPref("publichost", false, i -> {
|
game.checkPref("publichost", false, i -> {
|
||||||
platform.updateLobby();
|
platform.updateLobby();
|
||||||
});
|
});
|
||||||
@@ -252,6 +255,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
});
|
});
|
||||||
graphics.sliderPref("fpscap", 240, 15, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s)));
|
graphics.sliderPref("fpscap", 240, 15, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s)));
|
||||||
graphics.sliderPref("chatopacity", 100, 0, 100, 5, s -> s + "%");
|
graphics.sliderPref("chatopacity", 100, 0, 100, 5, s -> s + "%");
|
||||||
|
graphics.sliderPref("lasersopacity", 100, 0, 100, 5, s -> s + "%");
|
||||||
|
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b));
|
graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b));
|
||||||
@@ -290,6 +294,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
graphics.checkPref("effects", true);
|
graphics.checkPref("effects", true);
|
||||||
graphics.checkPref("playerchat", true);
|
graphics.checkPref("playerchat", true);
|
||||||
graphics.checkPref("minimap", !mobile);
|
graphics.checkPref("minimap", !mobile);
|
||||||
|
graphics.checkPref("position", false);
|
||||||
graphics.checkPref("fps", false);
|
graphics.checkPref("fps", false);
|
||||||
graphics.checkPref("indicators", true);
|
graphics.checkPref("indicators", true);
|
||||||
graphics.checkPref("animatedwater", false);
|
graphics.checkPref("animatedwater", false);
|
||||||
@@ -297,7 +302,6 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
graphics.checkPref("animatedshields", !mobile);
|
graphics.checkPref("animatedshields", !mobile);
|
||||||
}
|
}
|
||||||
graphics.checkPref("bloom", false, val -> renderer.toggleBloom(val));
|
graphics.checkPref("bloom", false, val -> renderer.toggleBloom(val));
|
||||||
graphics.checkPref("lasers", true);
|
|
||||||
graphics.checkPref("pixelate", false, val -> {
|
graphics.checkPref("pixelate", false, val -> {
|
||||||
if(val){
|
if(val){
|
||||||
Events.fire(Trigger.enablePixelation);
|
Events.fire(Trigger.enablePixelation);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import io.anuke.arc.*;
|
|||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.scene.*;
|
import io.anuke.arc.scene.*;
|
||||||
@@ -21,7 +22,8 @@ import io.anuke.mindustry.gen.*;
|
|||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.TreeLayout.*;
|
import io.anuke.mindustry.ui.layout.*;
|
||||||
|
import io.anuke.mindustry.ui.layout.TreeLayout.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -31,13 +33,14 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
private TechTreeNode root = new TechTreeNode(TechTree.root, null);
|
private TechTreeNode root = new TechTreeNode(TechTree.root, null);
|
||||||
private Rectangle bounds = new Rectangle();
|
private Rectangle bounds = new Rectangle();
|
||||||
private ItemsDisplay items;
|
private ItemsDisplay items;
|
||||||
|
private View view;
|
||||||
|
|
||||||
public TechTreeDialog(){
|
public TechTreeDialog(){
|
||||||
super("");
|
super("");
|
||||||
|
|
||||||
titleTable.remove();
|
titleTable.remove();
|
||||||
margin(0f).marginBottom(8);
|
margin(0f).marginBottom(8);
|
||||||
cont.stack(new View(), items = new ItemsDisplay()).grow();
|
cont.stack(view = new View(), items = new ItemsDisplay()).grow();
|
||||||
|
|
||||||
shown(() -> {
|
shown(() -> {
|
||||||
checkNodes(root);
|
checkNodes(root);
|
||||||
@@ -52,16 +55,57 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
hide();
|
hide();
|
||||||
ui.database.show();
|
ui.database.show();
|
||||||
}).size(210f, 64f);
|
}).size(210f, 64f);
|
||||||
|
|
||||||
|
//scaling/drag input
|
||||||
|
|
||||||
|
addListener(new InputListener(){
|
||||||
|
@Override
|
||||||
|
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
|
||||||
|
view.setScale(Mathf.clamp(view.getScaleX() - amountY / 40f, 0.25f, 1f));
|
||||||
|
view.setOrigin(Align.center);
|
||||||
|
view.setTransform(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseMoved(InputEvent event, float x, float y){
|
||||||
|
view.requestScroll();
|
||||||
|
return super.mouseMoved(event, x, y);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
addListener(new ElementGestureListener(){
|
||||||
|
@Override
|
||||||
|
public void zoom(InputEvent event, float initialDistance, float distance){
|
||||||
|
if(view.lastZoom < 0){
|
||||||
|
view.lastZoom = view.getScaleX();
|
||||||
|
}
|
||||||
|
|
||||||
|
view.setScale(Mathf.clamp(distance / initialDistance * view.lastZoom, 0.25f, 1f));
|
||||||
|
view.setOrigin(Align.center);
|
||||||
|
view.setTransform(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
|
||||||
|
view.lastZoom = view.getScaleX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){
|
||||||
|
view.panX += deltaX / view.getScaleX();
|
||||||
|
view.panY += deltaY / view.getScaleY();
|
||||||
|
view.moved = true;
|
||||||
|
view.clamp();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void treeLayout(){
|
void treeLayout(){
|
||||||
TreeLayout layout = new TreeLayout();
|
RadialTreeLayout layout = new RadialTreeLayout();
|
||||||
layout.gapBetweenLevels = Scl.scl(60f);
|
|
||||||
layout.gapBetweenNodes = Scl.scl(40f);
|
|
||||||
LayoutNode node = new LayoutNode(root, null);
|
LayoutNode node = new LayoutNode(root, null);
|
||||||
layout.layout(node);
|
layout.layout(node);
|
||||||
bounds.set(layout.getBounds());
|
//bounds.y += nodeSize*1.5f;
|
||||||
bounds.y += nodeSize*1.5f;
|
|
||||||
copyInfo(node);
|
copyInfo(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +154,7 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.width = this.height = nodeSize;
|
this.width = this.height = nodeSize;
|
||||||
if(node.children != null){
|
if(node.children != null){
|
||||||
children = Array.with(node.children).select(n -> n.visible).map(t -> new LayoutNode(t, this)).toArray(LayoutNode.class);
|
children = Array.with(node.children).map(t -> new LayoutNode(t, this)).toArray(LayoutNode.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,7 +178,7 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
class View extends Group{
|
class View extends Group{
|
||||||
float panX = 0, panY = -200;
|
float panX = 0, panY = -200, lastZoom = -1;
|
||||||
boolean moved = false;
|
boolean moved = false;
|
||||||
ImageButton hoverNode;
|
ImageButton hoverNode;
|
||||||
Table infoTable = new Table();
|
Table infoTable = new Table();
|
||||||
@@ -146,6 +190,8 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
ImageButton button = new ImageButton(node.node.block.icon(Cicon.medium), Styles.nodei);
|
ImageButton button = new ImageButton(node.node.block.icon(Cicon.medium), Styles.nodei);
|
||||||
button.visible(() -> node.visible);
|
button.visible(() -> node.visible);
|
||||||
button.clicked(() -> {
|
button.clicked(() -> {
|
||||||
|
if(moved) return;
|
||||||
|
|
||||||
if(mobile){
|
if(mobile){
|
||||||
hoverNode = button;
|
hoverNode = button;
|
||||||
rebuild();
|
rebuild();
|
||||||
@@ -182,7 +228,6 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
});
|
});
|
||||||
button.touchable(() -> !node.visible ? Touchable.disabled : Touchable.enabled);
|
button.touchable(() -> !node.visible ? Touchable.disabled : Touchable.enabled);
|
||||||
button.setUserObject(node.node);
|
button.setUserObject(node.node);
|
||||||
button.tapped(() -> moved = false);
|
|
||||||
button.setSize(nodeSize);
|
button.setSize(nodeSize);
|
||||||
button.update(() -> {
|
button.update(() -> {
|
||||||
float offset = (Core.graphics.getHeight() % 2) / 2f;
|
float offset = (Core.graphics.getHeight() % 2) / 2f;
|
||||||
@@ -205,12 +250,9 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
dragged((x, y) -> {
|
setOrigin(Align.center);
|
||||||
moved = true;
|
setTransform(true);
|
||||||
panX += x;
|
released(() -> moved = false);
|
||||||
panY += y;
|
|
||||||
clamp();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clamp(){
|
void clamp(){
|
||||||
@@ -308,9 +350,9 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void drawChildren(){
|
||||||
clamp();
|
clamp();
|
||||||
float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y;
|
float offsetX = panX + width / 2f, offsetY = panY + height / 2f;
|
||||||
|
|
||||||
for(TechTreeNode node : nodes){
|
for(TechTreeNode node : nodes){
|
||||||
if(!node.visible) continue;
|
if(!node.visible) continue;
|
||||||
@@ -324,7 +366,7 @@ public class TechTreeDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
super.draw();
|
super.drawChildren();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package io.anuke.mindustry.ui.dialogs;
|
package io.anuke.mindustry.ui.dialogs;
|
||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.game.Objectives.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.type.Zone.*;
|
|
||||||
import io.anuke.mindustry.world.*;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -38,8 +38,7 @@ public class ZoneInfoDialog extends FloatingDialog{
|
|||||||
|
|
||||||
if(!zone.unlocked()) return;
|
if(!zone.unlocked()) return;
|
||||||
|
|
||||||
ItemStack[] stacks = zone.getLaunchCost();
|
for(ItemStack stack : zone.getLaunchCost()){
|
||||||
for(ItemStack stack : stacks){
|
|
||||||
if(stack.amount == 0) continue;
|
if(stack.amount == 0) continue;
|
||||||
|
|
||||||
if(i++ % 2 == 0){
|
if(i++ % 2 == 0){
|
||||||
@@ -62,29 +61,32 @@ public class ZoneInfoDialog extends FloatingDialog{
|
|||||||
cont.table(req -> {
|
cont.table(req -> {
|
||||||
req.defaults().left();
|
req.defaults().left();
|
||||||
|
|
||||||
if(zone.zoneRequirements.length > 0){
|
Array<Objective> zones = zone.requirements.select(o -> !(o instanceof Unlock));
|
||||||
|
|
||||||
|
if(!zones.isEmpty()){
|
||||||
req.table(r -> {
|
req.table(r -> {
|
||||||
r.add("$complete").colspan(2).left();
|
r.add("$complete").colspan(2).left();
|
||||||
r.row();
|
r.row();
|
||||||
for(ZoneRequirement other : zone.zoneRequirements){
|
for(Objective o : zones){
|
||||||
r.addImage(Icon.terrain).padRight(4);
|
r.addImage(Icon.terrain).padRight(4);
|
||||||
r.add(Core.bundle.format("zone.requirement", other.wave, other.zone.localizedName())).color(Color.lightGray);
|
r.add(o.display()).color(Color.lightGray);
|
||||||
r.addImage(other.zone.bestWave() >= other.wave ? Icon.checkSmall : Icon.cancelSmall, other.zone.bestWave() >= other.wave ? Color.lightGray : Color.scarlet).padLeft(3);
|
r.addImage(o.complete() ? Icon.checkSmall : Icon.cancelSmall, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3);
|
||||||
r.row();
|
r.row();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
req.row();
|
req.row();
|
||||||
|
Array<Unlock> blocks = zone.requirements.select(o -> o instanceof Unlock).as(Unlock.class);
|
||||||
|
|
||||||
if(zone.blockRequirements.length > 0){
|
if(!blocks.isEmpty()){
|
||||||
req.table(r -> {
|
req.table(r -> {
|
||||||
r.add("$research.list").colspan(2).left();
|
r.add("$research.list").colspan(2).left();
|
||||||
r.row();
|
r.row();
|
||||||
for(Block block : zone.blockRequirements){
|
for(Unlock blocko : blocks){
|
||||||
r.addImage(block.icon(Cicon.small)).size(8 * 3).padRight(4);
|
r.addImage(blocko.block.icon(Cicon.small)).size(8 * 3).padRight(5);
|
||||||
r.add(block.localizedName).color(Color.lightGray);
|
r.add(blocko.block.localizedName).color(Color.lightGray).left();
|
||||||
r.addImage(data.isUnlocked(block) ? Icon.checkSmall : Icon.cancelSmall, data.isUnlocked(block) ? Color.lightGray : Color.scarlet).padLeft(3);
|
r.addImage(blocko.block.unlocked() ? Icon.checkSmall : Icon.cancelSmall, blocko.block.unlocked() ? Color.lightGray : Color.scarlet).padLeft(3);
|
||||||
r.row();
|
r.row();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +108,7 @@ public class ZoneInfoDialog extends FloatingDialog{
|
|||||||
t.left();
|
t.left();
|
||||||
t.add("$zone.resources").padRight(6);
|
t.add("$zone.resources").padRight(6);
|
||||||
|
|
||||||
if(zone.resources.length > 0){
|
if(zone.resources.size > 0){
|
||||||
t.table(r -> {
|
t.table(r -> {
|
||||||
t.left();
|
t.left();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -135,8 +137,8 @@ public class ZoneInfoDialog extends FloatingDialog{
|
|||||||
|
|
||||||
cont.row();
|
cont.row();
|
||||||
|
|
||||||
cont.addButton(zone.canConfigure() ? "$configure" : Core.bundle.format("configure.locked", zone.configureWave),
|
cont.addButton(zone.canConfigure() ? "$configure" : Core.bundle.format("configure.locked", zone.configureObjective.display()),
|
||||||
() -> loadout.show(zone.loadout.core().itemCapacity, zone::getStartingItems, zone::resetStartingItems, zone::updateLaunchCost, rebuildItems, item -> data.getItem(item) > 0 && item.type == ItemType.material)
|
() -> loadout.show(zone.loadout.core().itemCapacity, zone.getStartingItems(), zone::resetStartingItems, zone::updateLaunchCost, rebuildItems)
|
||||||
).fillX().pad(3).disabled(b -> !zone.canConfigure());
|
).fillX().pad(3).disabled(b -> !zone.canConfigure());
|
||||||
}
|
}
|
||||||
cont.marginRight(12f);
|
cont.marginRight(12f);
|
||||||
@@ -155,7 +157,7 @@ public class ZoneInfoDialog extends FloatingDialog{
|
|||||||
hide();
|
hide();
|
||||||
control.playZone(zone);
|
control.playZone(zone);
|
||||||
}
|
}
|
||||||
}).minWidth(150f).margin(13f).padTop(5).disabled(b -> zone.locked() ? !zone.canUnlock() : !data.hasItems(zone.getLaunchCost())).uniformY().get();
|
}).minWidth(200f).margin(13f).padTop(5).disabled(b -> zone.locked() ? !zone.canUnlock() : !data.hasItems(zone.getLaunchCost())).uniformY().get();
|
||||||
|
|
||||||
button.row();
|
button.row();
|
||||||
button.add(iteminfo);
|
button.add(iteminfo);
|
||||||
|
|||||||
@@ -19,15 +19,14 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.input.*;
|
import io.anuke.mindustry.input.*;
|
||||||
import io.anuke.mindustry.net.Packets.*;
|
import io.anuke.mindustry.net.Packets.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.Styles;
|
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -51,6 +50,7 @@ public class HudFragment extends Fragment{
|
|||||||
|
|
||||||
//menu at top left
|
//menu at top left
|
||||||
parent.fill(cont -> {
|
parent.fill(cont -> {
|
||||||
|
cont.setName("overlaymarker");
|
||||||
cont.top().left();
|
cont.top().left();
|
||||||
|
|
||||||
if(mobile){
|
if(mobile){
|
||||||
@@ -248,9 +248,16 @@ public class HudFragment extends Fragment{
|
|||||||
info.label(() -> ping.get(netClient.getPing())).visible(net::client).left().style(Styles.outlineLabel);
|
info.label(() -> ping.get(netClient.getPing())).visible(net::client).left().style(Styles.outlineLabel);
|
||||||
}).top().left();
|
}).top().left();
|
||||||
});
|
});
|
||||||
|
|
||||||
//minimap
|
parent.fill(t -> {
|
||||||
parent.fill(t -> t.top().right().add(new Minimap()).visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial));
|
//minimap
|
||||||
|
t.add(new Minimap().visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial));
|
||||||
|
t.row();
|
||||||
|
//position
|
||||||
|
t.label(() -> world.toTile(player.x) + "," + world.toTile(player.y))
|
||||||
|
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial);
|
||||||
|
t.top().right();
|
||||||
|
});
|
||||||
|
|
||||||
//spawner warning
|
//spawner warning
|
||||||
parent.fill(t -> {
|
parent.fill(t -> {
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
package io.anuke.mindustry.ui.fragments;
|
package io.anuke.mindustry.ui.fragments;
|
||||||
|
|
||||||
import io.anuke.arc.scene.Group;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.scene.event.Touchable;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.ui.layout.WidgetGroup;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
|
import io.anuke.mindustry.*;
|
||||||
|
|
||||||
/** Fragment for displaying overlays such as block inventories. */
|
/** Fragment for displaying overlays such as block inventories. */
|
||||||
public class OverlayFragment extends Fragment{
|
public class OverlayFragment{
|
||||||
public final BlockInventoryFragment inv;
|
public final BlockInventoryFragment inv;
|
||||||
public final BlockConfigFragment config;
|
public final BlockConfigFragment config;
|
||||||
|
|
||||||
@@ -17,10 +18,9 @@ public class OverlayFragment extends Fragment{
|
|||||||
config = new BlockConfigFragment();
|
config = new BlockConfigFragment();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void add(){
|
||||||
public void build(Group parent){
|
|
||||||
group.setFillParent(true);
|
group.setFillParent(true);
|
||||||
parent.addChild(group);
|
Vars.ui.hudGroup.addChildBefore(Core.scene.find("overlaymarker"), group);
|
||||||
|
|
||||||
inv.build(group);
|
inv.build(group);
|
||||||
config.build(group);
|
config.build(group);
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import io.anuke.arc.scene.event.*;
|
|||||||
import io.anuke.arc.scene.style.*;
|
import io.anuke.arc.scene.style.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
@@ -17,7 +19,7 @@ import io.anuke.mindustry.gen.*;
|
|||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.input.*;
|
import io.anuke.mindustry.input.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.Styles;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -74,17 +76,21 @@ public class PlacementFragment extends Fragment{
|
|||||||
|
|
||||||
boolean gridUpdate(InputHandler input){
|
boolean gridUpdate(InputHandler input){
|
||||||
if(Core.input.keyDown(Binding.pick)){ //mouse eyedropper select
|
if(Core.input.keyDown(Binding.pick)){ //mouse eyedropper select
|
||||||
Tile tile = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
Tile tile = world.ltileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
||||||
|
Block tryRecipe = tile == null ? null : tile.block();
|
||||||
|
|
||||||
if(tile != null){
|
for(BuildRequest req : player.buildQueue()){
|
||||||
tile = tile.link();
|
if(!req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).contains(Core.input.mouseWorld())){
|
||||||
Block tryRecipe = tile.block();
|
tryRecipe = req.block;
|
||||||
if(tryRecipe.isVisible() && unlocked(tryRecipe)){
|
break;
|
||||||
input.block = tryRecipe;
|
|
||||||
currentCategory = input.block.category;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(tryRecipe != null && tryRecipe.isVisible() && unlocked(tryRecipe)){
|
||||||
|
input.block = tryRecipe;
|
||||||
|
currentCategory = input.block.category;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Core.input.keyDown(Binding.gridMode) || ui.chatfrag.chatOpen()) return false;
|
if(!Core.input.keyDown(Binding.gridMode) || ui.chatfrag.chatOpen()) return false;
|
||||||
@@ -151,6 +157,10 @@ public class PlacementFragment extends Fragment{
|
|||||||
Color color = state.rules.infiniteResources || (core != null && (core.items.has(block.requirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources)) ? Color.white : Color.gray;
|
Color color = state.rules.infiniteResources || (core != null && (core.items.has(block.requirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources)) ? Color.white : Color.gray;
|
||||||
button.forEach(elem -> elem.setColor(color));
|
button.forEach(elem -> elem.setColor(color));
|
||||||
button.setChecked(control.input.block == block);
|
button.setChecked(control.input.block == block);
|
||||||
|
|
||||||
|
if(state.rules.bannedBlocks.contains(block)){
|
||||||
|
button.forEach(elem -> elem.setColor(Color.darkGray));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
button.hovered(() -> hovered = block);
|
button.hovered(() -> hovered = block);
|
||||||
@@ -226,6 +236,15 @@ public class PlacementFragment extends Fragment{
|
|||||||
}
|
}
|
||||||
}).growX().left().margin(3);
|
}).growX().left().margin(3);
|
||||||
|
|
||||||
|
if(state.rules.bannedBlocks.contains(lastDisplay)){
|
||||||
|
topTable.row();
|
||||||
|
topTable.table(b -> {
|
||||||
|
b.addImage(Icon.cancelSmall).padRight(2).color(Color.scarlet);
|
||||||
|
b.add("$banned");
|
||||||
|
b.left();
|
||||||
|
}).padTop(2).left();
|
||||||
|
}
|
||||||
|
|
||||||
}else if(tileDisplayBlock() != null){ //show selected tile
|
}else if(tileDisplayBlock() != null){ //show selected tile
|
||||||
lastDisplay = tileDisplayBlock();
|
lastDisplay = tileDisplayBlock();
|
||||||
topTable.table(t -> {
|
topTable.table(t -> {
|
||||||
@@ -250,7 +269,7 @@ public class PlacementFragment extends Fragment{
|
|||||||
blocksSelect.margin(4).marginTop(0);
|
blocksSelect.margin(4).marginTop(0);
|
||||||
blocksSelect.table(blocks -> blockTable = blocks).grow();
|
blocksSelect.table(blocks -> blockTable = blocks).grow();
|
||||||
blocksSelect.row();
|
blocksSelect.row();
|
||||||
blocksSelect.table(control.input::buildUI).name("inputTable").growX();
|
blocksSelect.table(control.input::buildPlacementUI).name("inputTable").growX();
|
||||||
}).fillY().bottom().touchable(Touchable.enabled);
|
}).fillY().bottom().touchable(Touchable.enabled);
|
||||||
frame.table(categories -> {
|
frame.table(categories -> {
|
||||||
categories.defaults().size(50f);
|
categories.defaults().size(50f);
|
||||||
@@ -301,7 +320,11 @@ public class PlacementFragment extends Fragment{
|
|||||||
returnArray.add(block);
|
returnArray.add(block);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
returnArray.sort((b1, b2) -> -Boolean.compare(unlocked(b1), unlocked(b2)));
|
returnArray.sort((b1, b2) -> {
|
||||||
|
int locked = -Boolean.compare(unlocked(b1), unlocked(b2));
|
||||||
|
if(locked != 0) return locked;
|
||||||
|
return Boolean.compare(state.rules.bannedBlocks.contains(b1), state.rules.bannedBlocks.contains(b2));
|
||||||
|
});
|
||||||
return returnArray;
|
return returnArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package io.anuke.mindustry.ui;
|
package io.anuke.mindustry.ui.layout;
|
||||||
|
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
@@ -6,7 +6,7 @@ import io.anuke.arc.math.geom.*;
|
|||||||
/**
|
/**
|
||||||
* Algorithm taken from <a href="https://github.com/abego/treelayout">TreeLayout</a>.
|
* Algorithm taken from <a href="https://github.com/abego/treelayout">TreeLayout</a>.
|
||||||
*/
|
*/
|
||||||
public class TreeLayout{
|
public class BranchTreeLayout implements TreeLayout{
|
||||||
public TreeLocation rootLocation = TreeLocation.top;
|
public TreeLocation rootLocation = TreeLocation.top;
|
||||||
public TreeAlignment alignment = TreeAlignment.awayFromRoot;
|
public TreeAlignment alignment = TreeAlignment.awayFromRoot;
|
||||||
public float gapBetweenLevels = 10;
|
public float gapBetweenLevels = 10;
|
||||||
@@ -18,6 +18,7 @@ public class TreeLayout{
|
|||||||
private float boundsTop = Float.MAX_VALUE;
|
private float boundsTop = Float.MAX_VALUE;
|
||||||
private float boundsBottom = Float.MIN_VALUE;
|
private float boundsBottom = Float.MIN_VALUE;
|
||||||
|
|
||||||
|
@Override
|
||||||
public void layout(TreeNode root){
|
public void layout(TreeNode root){
|
||||||
firstWalk(root, null);
|
firstWalk(root, null);
|
||||||
calcSizeOfLevels(root, 0);
|
calcSizeOfLevels(root, 0);
|
||||||
@@ -288,20 +289,4 @@ public class TreeLayout{
|
|||||||
public enum TreeAlignment{
|
public enum TreeAlignment{
|
||||||
center, towardsRoot, awayFromRoot
|
center, towardsRoot, awayFromRoot
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TreeNode<T extends TreeNode>{
|
|
||||||
public float width, height, x, y;
|
|
||||||
|
|
||||||
//should be initialized by user
|
|
||||||
public T[] children;
|
|
||||||
public T parent;
|
|
||||||
|
|
||||||
private float mode, prelim, change, shift;
|
|
||||||
private int number = -1;
|
|
||||||
private TreeNode thread, ancestor;
|
|
||||||
|
|
||||||
boolean isLeaf(){
|
|
||||||
return children == null || children.length == 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
66
core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package io.anuke.mindustry.ui.layout;
|
||||||
|
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
|
import io.anuke.arc.math.*;
|
||||||
|
|
||||||
|
public class RadialTreeLayout implements TreeLayout{
|
||||||
|
private static ObjectSet<TreeNode> visited = new ObjectSet<>();
|
||||||
|
private static Queue<TreeNode> queue = new Queue<>();
|
||||||
|
|
||||||
|
public float startRadius, delta;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void layout(TreeNode root){
|
||||||
|
startRadius = root.height * 2.4f;
|
||||||
|
delta = root.height * 2.4f;
|
||||||
|
|
||||||
|
bfs(root, true);
|
||||||
|
radialize(root, 0, 360);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radialize(TreeNode root, float from, float to){
|
||||||
|
int depthOfVertex = root.number;
|
||||||
|
float theta = from;
|
||||||
|
float radius = startRadius + (delta * depthOfVertex);
|
||||||
|
|
||||||
|
int leavesNumber = bfs(root, false);
|
||||||
|
for(TreeNode child : root.children){
|
||||||
|
int lambda = bfs(child, false);
|
||||||
|
float mi = theta + ((float)lambda / leavesNumber * (to - from));
|
||||||
|
|
||||||
|
float x = radius * Mathf.cos((theta + mi) / 2f * Mathf.degRad);
|
||||||
|
float y = radius * Mathf.sin((theta + mi) / 2f * Mathf.degRad);
|
||||||
|
|
||||||
|
child.x = x;
|
||||||
|
child.y = y;
|
||||||
|
|
||||||
|
if(child.children.length > 0) radialize(child, theta, mi);
|
||||||
|
theta = mi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int bfs(TreeNode node, boolean assign){
|
||||||
|
visited.clear();
|
||||||
|
queue.clear();
|
||||||
|
if(assign) node.number = 0;
|
||||||
|
int leaves = 0;
|
||||||
|
|
||||||
|
visited.add(node);
|
||||||
|
queue.addFirst(node);
|
||||||
|
|
||||||
|
while(!queue.isEmpty()){
|
||||||
|
TreeNode current = queue.removeFirst();
|
||||||
|
if(current.children.length == 0) leaves++;
|
||||||
|
|
||||||
|
for(TreeNode child : current.children){
|
||||||
|
if(assign) child.number = current.number + 1;
|
||||||
|
if(!visited.contains(child)){
|
||||||
|
visited.add(child);
|
||||||
|
queue.addLast(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return leaves;
|
||||||
|
}
|
||||||
|
}
|
||||||
22
core/src/io/anuke/mindustry/ui/layout/TreeLayout.java
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package io.anuke.mindustry.ui.layout;
|
||||||
|
|
||||||
|
public interface TreeLayout{
|
||||||
|
void layout(TreeNode root);
|
||||||
|
|
||||||
|
class TreeNode<T extends TreeNode>{
|
||||||
|
public float width, height, x, y;
|
||||||
|
|
||||||
|
//should be initialized by user
|
||||||
|
public T[] children;
|
||||||
|
public T parent;
|
||||||
|
|
||||||
|
//internal stuff
|
||||||
|
public float mode, prelim, change, shift;
|
||||||
|
public int number = -1;
|
||||||
|
public TreeNode thread, ancestor;
|
||||||
|
|
||||||
|
public boolean isLeaf(){
|
||||||
|
return children == null || children.length == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,11 +19,11 @@ import io.anuke.arc.util.ArcAnnotate.*;
|
|||||||
import io.anuke.arc.util.pooling.*;
|
import io.anuke.arc.util.pooling.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.input.InputHandler.*;
|
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.*;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.world.blocks.*;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
@@ -39,8 +39,6 @@ import static io.anuke.mindustry.Vars.*;
|
|||||||
public class Block extends BlockStorage{
|
public class Block extends BlockStorage{
|
||||||
public static final int crackRegions = 8, maxCrackSize = 5;
|
public static final int crackRegions = 8, maxCrackSize = 5;
|
||||||
|
|
||||||
private static final BooleanProvider invisible = () -> false;
|
|
||||||
|
|
||||||
/** whether this block has a tile entity that updates */
|
/** whether this block has a tile entity that updates */
|
||||||
public boolean update;
|
public boolean update;
|
||||||
/** whether this block has health and can be destroyed */
|
/** whether this block has health and can be destroyed */
|
||||||
@@ -83,6 +81,8 @@ public class Block extends BlockStorage{
|
|||||||
public BlockGroup group = BlockGroup.none;
|
public BlockGroup group = BlockGroup.none;
|
||||||
/** List of block flags. Used for AI indexing. */
|
/** List of block flags. Used for AI indexing. */
|
||||||
public EnumSet<BlockFlag> flags = EnumSet.of();
|
public EnumSet<BlockFlag> flags = EnumSet.of();
|
||||||
|
/** Targeting priority of this block, as seen by enemies.*/
|
||||||
|
public TargetPriority priority = TargetPriority.base;
|
||||||
/** Whether the block can be tapped and selected to configure. */
|
/** Whether the block can be tapped and selected to configure. */
|
||||||
public boolean configurable;
|
public boolean configurable;
|
||||||
/** Whether this block consumes touchDown events when tapped. */
|
/** Whether this block consumes touchDown events when tapped. */
|
||||||
@@ -96,6 +96,8 @@ public class Block extends BlockStorage{
|
|||||||
public boolean targetable = true;
|
public boolean targetable = true;
|
||||||
/** Whether the overdrive core has any effect on this block. */
|
/** Whether the overdrive core has any effect on this block. */
|
||||||
public boolean canOverdrive = true;
|
public boolean canOverdrive = true;
|
||||||
|
/** Outlined icon color.*/
|
||||||
|
public Color outlineColor = Color.valueOf("404049");
|
||||||
/** Whether the icon region has an outline added. */
|
/** Whether the icon region has an outline added. */
|
||||||
public boolean outlineIcon = false;
|
public boolean outlineIcon = false;
|
||||||
/** Whether this block has a shadow under it. */
|
/** Whether this block has a shadow under it. */
|
||||||
@@ -120,7 +122,9 @@ public class Block extends BlockStorage{
|
|||||||
/** Cost of building this block; do not modify directly! */
|
/** Cost of building this block; do not modify directly! */
|
||||||
public float buildCost;
|
public float buildCost;
|
||||||
/** Whether this block is visible and can currently be built. */
|
/** Whether this block is visible and can currently be built. */
|
||||||
public BooleanProvider buildVisibility = invisible;
|
public BuildVisibility buildVisibility = BuildVisibility.hidden;
|
||||||
|
/** Multiplier for speed of building this block. */
|
||||||
|
public float buildCostMultiplier = 1f;
|
||||||
/** Whether this block has instant transfer.*/
|
/** Whether this block has instant transfer.*/
|
||||||
public boolean instantTransfer = false;
|
public boolean instantTransfer = false;
|
||||||
public boolean alwaysUnlocked = false;
|
public boolean alwaysUnlocked = false;
|
||||||
@@ -151,7 +155,7 @@ public class Block extends BlockStorage{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isBuildable(){
|
public boolean isBuildable(){
|
||||||
return buildVisibility != invisible;
|
return buildVisibility != BuildVisibility.hidden && buildVisibility != BuildVisibility.debugOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isStatic(){
|
public boolean isStatic(){
|
||||||
@@ -384,6 +388,11 @@ public class Block extends BlockStorage{
|
|||||||
for(ItemStack stack : requirements){
|
for(ItemStack stack : requirements){
|
||||||
buildCost += stack.amount * stack.item.cost;
|
buildCost += stack.amount * stack.item.cost;
|
||||||
}
|
}
|
||||||
|
buildCost *= buildCostMultiplier;
|
||||||
|
|
||||||
|
if(consumes.has(ConsumeType.power)) hasPower = true;
|
||||||
|
if(consumes.has(ConsumeType.item)) hasItems = true;
|
||||||
|
if(consumes.has(ConsumeType.liquid)) hasLiquids = true;
|
||||||
|
|
||||||
setStats();
|
setStats();
|
||||||
setBars();
|
setBars();
|
||||||
@@ -661,17 +670,81 @@ public class Block extends BlockStorage{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void getPlaceDraw(PlaceDraw draw, int rotation, int prevX, int prevY, int prevRotation){
|
public void drawRequest(BuildRequest req, Eachable<BuildRequest> list, boolean valid){
|
||||||
draw.region = icon(Cicon.full);
|
Draw.reset();
|
||||||
draw.scalex = draw.scaley = 1;
|
Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime(), 6f, 0.28f));
|
||||||
draw.rotation = rotation;
|
Draw.alpha(1f);
|
||||||
|
drawRequestRegion(req, list);
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawRequestRegion(BuildRequest req, Eachable<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,
|
||||||
|
!rotate ? 0 : req.rotation * 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createIcons(PixmapPacker out, PixmapPacker editor){
|
public void createIcons(PixmapPacker packer, PixmapPacker editor){
|
||||||
super.createIcons(out, editor);
|
super.createIcons(packer, editor);
|
||||||
|
|
||||||
editor.pack(name + "-icon-editor", Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop());
|
editor.pack(name + "-icon-editor", Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop());
|
||||||
|
|
||||||
|
if(!synthetic()){
|
||||||
|
PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full));
|
||||||
|
color.set(image.getPixel(image.width/2, image.height/2));
|
||||||
|
}
|
||||||
|
|
||||||
|
getGeneratedIcons();
|
||||||
|
|
||||||
|
Pixmap last = null;
|
||||||
|
|
||||||
|
if(outlineIcon){
|
||||||
|
final int radius = 4;
|
||||||
|
PixmapRegion region = Core.atlas.getPixmap(getGeneratedIcons()[getGeneratedIcons().length-1]);
|
||||||
|
Pixmap out = new Pixmap(region.width, region.height);
|
||||||
|
Color color = new Color();
|
||||||
|
for(int x = 0; x < region.width; x++){
|
||||||
|
for(int y = 0; y < region.height; y++){
|
||||||
|
|
||||||
|
region.getPixel(x, y, color);
|
||||||
|
out.draw(x, y, color);
|
||||||
|
if(color.a < 1f){
|
||||||
|
boolean found = false;
|
||||||
|
outer:
|
||||||
|
for(int rx = -radius; rx <= radius; rx++){
|
||||||
|
for(int ry = -radius; ry <= radius; ry++){
|
||||||
|
if(Structs.inBounds(rx + x, ry + y, region.width, region.height) && Mathf.dst2(rx, ry) <= radius*radius && color.set(region.getPixel(rx + x, ry + y)).a > 0.01f){
|
||||||
|
found = true;
|
||||||
|
break outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(found){
|
||||||
|
out.draw(x, y, outlineColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
last = out;
|
||||||
|
|
||||||
|
packer.pack(name, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(generatedIcons.length > 1){
|
||||||
|
Pixmap base = Core.atlas.getPixmap(generatedIcons[0]).crop();
|
||||||
|
for(int i = 1; i < generatedIcons.length; i++){
|
||||||
|
if(i == generatedIcons.length - 1 && last != null){
|
||||||
|
base.drawPixmap(last);
|
||||||
|
}else{
|
||||||
|
base.draw(Core.atlas.getPixmap(generatedIcons[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
packer.pack("block-" + name + "-full", base);
|
||||||
|
generatedIcons = null;
|
||||||
|
Arrays.fill(cicons, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Never use outside of the editor! */
|
/** Never use outside of the editor! */
|
||||||
@@ -724,12 +797,16 @@ public class Block extends BlockStorage{
|
|||||||
return ((size + 1) % 2) * tilesize / 2f;
|
return ((size + 1) % 2) * tilesize / 2f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Rectangle bounds(int x, int y, Rectangle rect){
|
||||||
|
return rect.setSize(size * tilesize).setCenter(x * tilesize + offset(), y * tilesize + offset());
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isMultiblock(){
|
public boolean isMultiblock(){
|
||||||
return size > 1;
|
return size > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisible(){
|
public boolean isVisible(){
|
||||||
return buildVisibility.get() && !isHidden();
|
return buildVisibility.visible() && !isHidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFloor(){
|
public boolean isFloor(){
|
||||||
@@ -746,7 +823,7 @@ public class Block extends BlockStorage{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isHidden(){
|
public boolean isHidden(){
|
||||||
return !buildVisibility.get();
|
return !buildVisibility.visible();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -755,21 +832,21 @@ public class Block extends BlockStorage{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){
|
protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){
|
||||||
requirements(cat, () -> true, stacks);
|
requirements(cat, BuildVisibility.shown, stacks);
|
||||||
this.alwaysUnlocked = unlocked;
|
this.alwaysUnlocked = unlocked;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void requirements(Category cat, ItemStack[] stacks){
|
protected void requirements(Category cat, ItemStack[] stacks){
|
||||||
requirements(cat, () -> true, stacks);
|
requirements(cat, BuildVisibility.shown, stacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets up requirements. Use only this method to set up requirements. */
|
/** Sets up requirements. Use only this method to set up requirements. */
|
||||||
protected void requirements(Category cat, BooleanProvider visible, ItemStack[] stacks){
|
protected void requirements(Category cat, BuildVisibility visible, ItemStack[] stacks){
|
||||||
this.category = cat;
|
this.category = cat;
|
||||||
this.requirements = stacks;
|
this.requirements = stacks;
|
||||||
this.buildVisibility = visible;
|
this.buildVisibility = visible;
|
||||||
|
|
||||||
Arrays.sort(requirements, (a, b) -> Integer.compare(a.item.id, b.item.id));
|
Arrays.sort(requirements, Structs.comparingInt(i -> i.item.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,10 @@ public class Build{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(state.rules.bannedBlocks.contains(type) && !(state.rules.waves && team == waveTeam)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if((type.solid || type.solidifes) && Units.anyEntities(x * tilesize + type.offset() - type.size*tilesize/2f, y * tilesize + type.offset() - type.size*tilesize/2f, type.size * tilesize, type.size*tilesize)){
|
if((type.solid || type.solidifes) && Units.anyEntities(x * tilesize + type.offset() - type.size*tilesize/2f, y * tilesize + type.offset() - type.size*tilesize/2f, type.size * tilesize, type.size*tilesize)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||