diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 9185b77882..335d17f26a 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -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. diff --git a/README.md b/README.md index f92f2b9a96..4dce34be64 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ _[Wiki](https://mindustrygame.github.io/wiki)_ ### 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. -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 diff --git a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java index 31b213d8ba..0eb1ce32d4 100644 --- a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java @@ -37,6 +37,7 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no") .toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length())) .getParent().getParent().getParent().getParent().getParent().getParent().toString(); + path = path.replace("%20", " "); processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound"); processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music"); diff --git a/build.gradle b/build.gradle index 9411b3544d..1aaf194da3 100644 --- a/build.gradle +++ b/build.gradle @@ -152,7 +152,7 @@ project(":desktop"){ compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion" 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' } } diff --git a/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png b/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png new file mode 100644 index 0000000000..d9d4eb609a Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png differ diff --git a/core/assets-raw/sprites/blocks/extra/block-select.png b/core/assets-raw/sprites/blocks/extra/block-select.png index f2c77caa2b..559131b263 100644 Binary files a/core/assets-raw/sprites/blocks/extra/block-select.png and b/core/assets-raw/sprites/blocks/extra/block-select.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index d5959052cf..91a5ecfc89 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -45,11 +45,11 @@ database = Core Database savegame = Save Game loadgame = Load Game joingame = Join Game -addplayers = Add/Remove Players customgame = Custom Game newgame = New Game none = minimap = Minimap +position = Position close = Close website = Website 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 = Mods mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable @@ -77,6 +79,7 @@ mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod +mod.import.github = Import Github Mod mod.remove.confirm = This mod will be deleted. 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} @@ -161,7 +164,6 @@ server.port = Port: server.addressinuse = Address already in use! server.invalidport = Invalid port number! 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.overwrite = Are you sure you want to overwrite\nthis save slot? overwrite = Overwrite @@ -215,6 +217,9 @@ quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial c loading = [accent]Loading... reloading = [accent]Reloading Mods... 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.waiting = [lightgray]Wave in {0} wave.waveInProgress = [lightgray]Wave in progress @@ -375,7 +380,6 @@ campaign = Campaign load = Load save = Save fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Settings @@ -388,8 +392,10 @@ donate = Donate abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. locked = Locked -complete = [lightgray]Reach: -zone.requirement = Wave {0} in zone {1} +complete = [lightgray]Complete: +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} 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. uncover = Uncover 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}. zone.unlocked = [lightgray]{0} unlocked. -zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = [lightgray]Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} 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.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 > +clear = Clear +banned = [scarlet]Banned yes = Yes no = No info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Input blocks.output = Output blocks.booster = Booster @@ -555,6 +564,7 @@ category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows setting.linear.name = Linear Filtering +setting.hints.name = Hints setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields 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.fps.name = Show FPS setting.vsync.name = VSync -setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap +setting.position.name = Show Player Position setting.musicvol.name = Music Volume setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music @@ -594,8 +604,10 @@ setting.crashreport.name = Send Anonymous Crash Reports setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit setting.bloom.name = Bloom @@ -609,6 +621,7 @@ command.rally = Rally command.retreat = Retreat keybind.gridMode.name = Block Select keybind.gridModeShift.name = Category Select +keybind.clear_building.name = Clear Building keybind.press = Press a key... keybind.press.axis = Press an axis or key... keybind.screenshot.name = Map Screenshot @@ -625,6 +638,7 @@ keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap keybind.dash.name = Dash keybind.chat.name = Chat @@ -833,6 +847,7 @@ block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor block.sorter.name = Sorter +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Overflow Gate 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.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.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.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. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 4205ec11db..c8210aeefa 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Celá obrazovka setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.fps.name = Ukázat snímky/sekundu setting.vsync.name = Vertikální synchronizace -setting.lasers.name = Ukázat laser energie setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Ukázat minimapu 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.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index bf80cfd8a5..72c5bec0e4 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Vollbild setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich) setting.fps.name = Zeige FPS setting.vsync.name = VSync -setting.lasers.name = Zeige Stromlaser setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen) setting.minimap.name = Zeige die Minimap setting.musicvol.name = Musiklautstärke @@ -557,6 +556,7 @@ setting.crashreport.name = Anonyme Absturzberichte senden setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Deckkraft +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Abbrechen & Beenden diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 4876f809ce..8cdaae1ab9 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -594,6 +594,7 @@ setting.crashreport.name = Enviar informes de fallos anónimos setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Opacidad del Chat +setting.lasersopacity.name = Power Laser Opacity 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. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 41a5139272..d8550c1f38 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1,1088 +1,1112 @@ -credits.text = [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] poolt loodud +credits.text = Autor: [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Tegijad contributors = Tõlkijad ja panustajad -discord = Liituge Mindustry Discordi serveriga! -link.discord.description = Mindustry ametlik Discordi server -link.github.description = Github mängu koodiga -link.changelog.description = List of update changes -link.dev-builds.description = Selle mängu pooleli olevad versioonid -link.trello.description = Ametlik Trello leht plaanitud funktsioonide listiga -link.itch.io.description = itch.io leht selle mängu arvuti versioonidega -link.google-play.description = Mindustry Google play's -link.wiki.description = Ametlik Mindustry wiki -linkfail = Linki ebaõnnestus avada!\nAadress kopeeriti -screenshot = Kuvatõmme salvestati {0} -screenshot.invalid = Maailm liiga suur, tõenäoliselt pole piisavalt mälu salvestamiseks -gameover = Mäng Läbi -gameover.pvp = [accent] {0}[] tiim võitis! +discord = Liitu Mindustry Discordi serveriga! +link.discord.description = Ametlik Discordi server +link.github.description = Mängu lähtekood +link.changelog.title = Versioonid +link.changelog.description = Uuenduste nimekiri versioonide kaupa +link.dev-builds.title = Arendusversioonid +link.dev-builds.description = Arendusversioonide ajalugu +link.trello.description = Plaanitud uuenduste nimekiri +link.itch.io.description = Kõik PC-platvormide versioonid +link.google-play.title = Google Play +link.google-play.description = Androidi versioon Google Play poes +link.wiki.title = Viki +link.wiki.description = Mängu ametlik viki +linkfail = Lingi avamine ebaõnnestus!\nVeebiaadress kopeeriti. +screenshot = Kuvatõmmis salvestati: {0} +screenshot.invalid = Maailm on liiga suur: kuvatõmmise salvestamiseks ei pruugi olla piisavalt mälu. +gameover = Mäng läbi! +gameover.pvp = Võistkond[accent] {0}[] võitis! highscore = [accent]Uus rekord! -load.sound = Sounds -load.map = Maps -load.image = Images -load.content = Content -load.system = System -stat.wave = Raund:[accent] {0} + +load.sound = Helid +load.map = Maailmad +load.image = Pildid +load.content = Sisu +load.system = Süsteem + +stat.wave = Lahingulaineid läbitud:[accent] {0} stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} -stat.built = Ehitisi ehitatud:[accent] {0} -stat.destroyed = Ehitisi hävitatud:[accent] {0} -stat.deconstructed = Ehitisi lahtivõetud:[accent] {0} -stat.delivered = Materjale kaasa võetud: -stat.rank = Lõplik Hinne: [accent]{0} -launcheditems = [accent]Kaasa võetud materjalid -map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]". +stat.built = Ehitisi konstrueeritud:[accent] {0} +stat.destroyed = Ehitisi hävinenud:[accent] {0} +stat.deconstructed = Ehitisi dekonstrueeritud:[accent] {0} +stat.delivered = Kaasavõetud ressursid: +stat.rank = Hinne:[accent] {0} + +launcheditems = [accent]Kaasavõetud ressursid +map.delete = Kas oled kindel, et soovid kustutada\nmaailma "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} -level.select = Taseme valik -level.mode = Mänguviisi valik: -showagain = Ära näita järgmine kord -coreattack = < TUUMA RÜNNATAKSE! >\nMAYDAY MAYDAY -nearpoint = [[ [scarlet]LAHKU VAENLASTE LANGEMISE ALALT VIIVITAMATA[] ]\npeatselt hävinemine -database = Tuuma Andmebaas -savegame = Salvesta -loadgame = Lae Mäng -joingame = Liitu -addplayers = Lisa/Eemalda Mängijaid -customgame = Kohandatud Mäng -newgame = Uus Mäng +level.select = Taseme valimine +level.mode = Mänguviis: +showagain = Ära järgmine kord näita +coreattack = < Tuumik on rünnaku all! > +nearpoint = [[ [scarlet]LAHKU VAENLASTE MAANDUMISE ALALT[] ]\nVaenlaste maandumisel hävib siin kõik. +database = Andmebaas +savegame = Salvesta mäng +loadgame = Lae mäng +joingame = Liitu mänguga +addplayers = Lisa/Eemalda mängijaid +customgame = Kohandatud mäng +newgame = Uus mäng none = minimap = Kaart -close = Sule -website = Website -quit = Lahku -save.quit = Save & Quit +close = Sulge +website = Veebileht +quit = Välju +save.quit = Salvesta ja välju maps = Maailmad -maps.browse = Browse Maps +maps.browse = Sirvi maailmu continue = Jätka -maps.none = [LIGHT_GRAY]Ühtegi maailma ei leitud! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done +maps.none = [lightgray]Ühtegi maailma ei leitud! +invalid = Kehtetu +preparingconfig = Konfiguratsiooni ettevalmistamine +preparingcontent = Sisu ettevalmistamine +uploadingcontent = Sisu üleslaadimine +uploadingpreviewfile = Eelvaate faili üleslaadimine +committingchanges = Muudatuste teostamine +done = Valmis + about.button = Info name = Nimi: -noname = Valige[accent] nimi[] kõigepealt. -filename = Faili Nimi: -unlocked = Said lahti uue sisu! -completed = [accent]Tehtud -techtree = Uurimuspuu -research.list = [LIGHT_GRAY]Uuring: +noname = Valige kõigepealt [accent]nimi[]. +filename = Failinimi: +unlocked = Uus sisu! +completed = [accent]Olemas +techtree = Uurimispuu +research.list = [lightgray]Vajalikud uuringud: research = Uuri -researched = [LIGHT_GRAY]{0} uuritud. -players = {0} mängijat mängus -players.single = {0} mängija mängus +researched = [lightgray]{0} uuritud. +players = {0} mängijat +players.single = {0} mängija server.closing = [accent]Serveri sulgemine... server.kicked.kick = Sind visati serverist välja! -server.kicked.whitelist = You are not whitelisted here. -server.kicked.serverClose = Server suletud. -server.kicked.vote = You have been vote-kicked. Goodbye. -server.kicked.clientOutdated = Aegunud versioon! Uuenda oma mängu! -server.kicked.serverOutdated = Aegunud server! Palu omanikul serverit uuendada! -server.kicked.banned = Sul on keeld seal mängida. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. -server.kicked.recentKick = Sind visati hiljuti välja.\nOota natuke enne uuesti proovimist. -server.kicked.nameInUse = Keegi sellise nimega\non juba seal serveris. +server.kicked.whitelist = Sa ei ole selle serveri lubatud mängijate nimekirjas. +server.kicked.serverClose = Server suleti. +server.kicked.vote = Sind hääletati mängust välja. Hüvasti! +server.kicked.clientOutdated = Aegunud versioon. Uuenda mängu! +server.kicked.serverOutdated = Aegunud server. Palu omanikul serverit uuendada! +server.kicked.banned = Sulle on keelatud selles serveris mängida. +server.kicked.typeMismatch = See server ei ühildu sinu platvormiga. +server.kicked.playerLimit = Selle serveri mängijate limiit on täis. Oota, kuni koht vabaneb. +server.kicked.recentKick = Sind visati hiljuti mängust välja.\nOota enne uuesti proovimist. +server.kicked.nameInUse = Sama nimega mängija on juba selles serveris.\nVali uus nimi. server.kicked.nameEmpty = Sinu valitud nimi ei sobi. -server.kicked.idInUse = Sa juba oled selles serveris! Kahe kasutajaga liitumine on keelatud. +server.kicked.idInUse = Sa juba mängid selles serveris! Teist korda liitumine on keelatud. server.kicked.customClient = See server ei luba modifitseeritud mängu versioone. Lae alla ametlik versioon. server.kicked.gameover = Mäng läbi! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = [accent]Hosti[] nupp avab serveri pordil [scarlet]6567[]. \nIgaüks samas [LIGHT_GRAY]wifis või kohtvõrgus[] peaks nägema sinu serverit enda serverite nimekirjas.\n\nKui sa tahad, et inimesed saaksid kõikjalt IP aadressi abil liituda, [accent]portide edasisuunamine[] on vajalik.\n\n[LIGHT_GRAY]Märkus: Kui kellelgi on probleeme sinu LAN-mänguga liitumisel, siis tee kindlaks, et sul on Mindustry lubatud oma kohtvõrgus tulemüüri seadetes. -join.info = Siin saad lisada [accent]serveri IP aadressi[] millega liituda, või leida [accent]kohtvõrgu[] servereid millega liituda.\nNii LAN kui ka WAN mitmikmängu toetatakse.\n\n[LIGHT_GRAY]Märkus: Ei ole olemas automaatset üldist serverite listi; kui sa tahad kellegagi liituda IP-aadressiga on sul vaja omaniku IP-aadressi. -hostserver = Hosti Mäng -invitefriends = Invite Friends -hostserver.mobile = Hosti\nMäng +server.versions = Sinu versioon:[accent] {0}[]\nServeri versioon:[accent] {1}[] +host.info = [accent]Hosti[] nupp avab serveri,\nkasutades porti [scarlet]6567[]. \nSamas [lightgray]kohtvõrgus[] olevad mängijad peaksid nägema sinu serverit enda serverite nimekirjas.\n\nKui sa tahad, et ka väljaspool kohtvõrku olevad mängijad saaksid serveriga ühineda, siis on vajalik\n[accent]portide edasisuunamine[].\n\n[lightgray]Märkus: Kui kellelgi on probleeme sinu kohtvõrgus avatud serveriga liitumisel, siis tee kindlaks, et tulemüüri sätetes on Mindustry'l lubatud pääseda ligi kohtvõrgule. +join.info = Siin saad lisada [accent]IP-aadressi serverile[], millega soovid liituda, või leida [accent]kohtvõrgus[] olevaid servereid.\nMäng toetab nii LAN- kui ka WAN-mitmikmängu.\n\n[lightgray]Märkus: Ei ole olemas automaatset serverite nimekirja. Kui sa soovid liituda mänguga IP kaudu, on sul vaja teada serveri IP-aadressi. +hostserver = Hosti mitmikmäng +invitefriends = Kutsu sõpru +hostserver.mobile = Hosti\nmäng host = Hosti hosting = [accent]Serveri avamine... hosts.refresh = Värskenda -hosts.discovering = LAN mängude otsimine -hosts.discovering.any = Discovering games +hosts.discovering = Kohtvõrgu mängude otsimine +hosts.discovering.any = Mängude otsimine server.refreshing = Serveri värskendamine -hosts.none = [lightgray]Kohalikke mänge ei leitud! +hosts.none = [lightgray]Kohtvõrgus mänge ei leitud. host.invalid = [scarlet]Serveriga ei saa ühendust. trace = Jälita mängijat trace.playername = Mängija nimi: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Isiklik ID: [accent]{0} -trace.mobile = Telefoni Versioon: [accent]{0} -trace.modclient = Modifitseeritud: [accent]{0} -invalidid = Kehtetu kasutaja ID! Saada veateade. +trace.id = Mängija ID: [accent]{0} +trace.mobile = Mobiilne versioon: [accent]{0} +trace.modclient = Modifitseeritud versioon: [accent]{0} +invalidid = Kehtetu mängija ID! Saada veateade! server.bans = Keelatud mängijad server.bans.none = Keelatud mängijaid ei leitud! server.admins = Administraatorid server.admins.none = Administraatoreid ei leitud! -server.add = Lisa Server -server.delete = Oled kindel, et soovid serveri kustutada? -server.edit = Kohanda Serverit -server.outdated = [crimson]Aegunud Server![] -server.outdated.client = [crimson]Aegunud Versioon[] -server.version = [lightgray]Versioon: {0} {1} -server.custombuild = [yellow]Kohandatud Versioon -confirmban = Oled kindel, et soovid mängjale anda keelu siin mängida? -confirmkick = Oled kindel, et soovid mängijat välja visata? -confirmvotekick = Are you sure you want to vote-kick this player? -confirmunban = Oled kindel, et soovid sellel mängijal siin uuesti lubada mängida? -confirmadmin = Oled kindel, et soovid mängijale adminstraatori õigused anda? -confirmunadmin = Oled kindel, et soovid mängijalt adminstraatori õigused ära võtta? -joingame.title = Liitu Mänguga +server.add = Lisa server +server.delete = Oled kindel, et soovid serveri\nnimekirjast kustutada? +server.edit = Kohanda serverit +server.outdated = [crimson]Aegunud server![] +server.outdated.client = [crimson]Aegunud versioon![] +server.version = [lightgray]v{0} {1} +server.custombuild = [yellow]Kohandatud versioon +confirmban = Oled kindel, et soovid keelata sellel mängjal siin mängida? +confirmkick = Oled kindel, et soovid selle mängija välja visata? +confirmvotekick = Oled kindel, et soovid selle mängija mängust välja hääletada? +confirmunban = Oled kindel, et soovid lubada sellel mängijal siin uuesti mängida? +confirmadmin = Oled kindel, et soovid anda sellele mängijale adminstraatori õigused? +confirmunadmin = Oled kindel, et soovid sellelt mängijalt adminstraatori õigused ära võtta? +joingame.title = Liitu mänguga joingame.ip = Aadress: -disconnect = Lahti ühendatud. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. -disconnect.data = Ebaõnnestus maailma andmeid alla laadida! -cantconnect = Unable to join game ([accent]{0}[]). +disconnect = Ühendus katkestatud. +disconnect.error = Ühenduse viga. +disconnect.closed = Ühendus on suletud. +disconnect.timeout = Ühendus aegus. +disconnect.data = Maailma andmete allalaadimine ebaõnnestus! +cantconnect = Mänguga ei saanud liituda ([accent]{0}[]). connecting = [accent]Ühendamine... -connecting.data = [accent]Laen maailma andmeid alla... +connecting.data = [accent]Maailma andmete allalaadimine... server.port = Port: -server.addressinuse = Aadress on juba kasutuses! -server.invalidport = Kehtetu pordi number! -server.error = [crimson]Viga serverit käivitades: [accent]{0} -save.old = See salvestus on mõeldud mängu vanemale versioonile.\n\n[LIGHT_GRAY]Vanemate salvestuste kasutamist lisatakse kui mängu versioon täielik 4.0 välja tuleb. -save.new = Uus Salvestus -save.overwrite = Oled kindel, et soovid selle salvestuse asendada? +server.addressinuse = Aadress on juba kasutusel! +server.invalidport = Ebasobiv pordi number! +server.error = [crimson]Viga serveri hostimisel. +save.old = See salvestis on mängu vanemast versioonist ning seda ei saa enam kasutada.\n\n[lightgray]Vanemate salvestuste kasutamise toetus lisatakse mängu täisversioonis 4.0. +save.new = Uus salvestis +save.overwrite = Oled kindel, et soovid selle salvestise asendada? overwrite = Asenda save.none = Salvestisi ei leitud! saveload = [accent]Salvestamine... savefail = Salvestamine ebaõnnestus! -save.delete.confirm = Oled kindel, et seda kustutada soovid?? +save.delete.confirm = Oled kindel, et soovid selle salvestise kustutada? save.delete = Kustuta save.export = Ekspordi -save.import.invalid = [accent]See salvestus on kehtetu! -save.import.fail = [crimson]Ebaõnnestus salvestust importida: [accent]{0} -save.export.fail = [crimson]Ebaõnnestus salvestust eksportida: [accent]{0} -save.import = Impordi Salvestus -save.newslot = Salvestuse Nimi: +save.import.invalid = [accent]See salvestis on kehtetu! +save.import.fail = [crimson]Salvestise importimine ebaõnnestus: [accent]{0} +save.export.fail = [crimson]Salvestise eksportimine ebaõnnestus: [accent]{0} +save.import = Impordi +save.newslot = Salvestise nimi: save.rename = Nimeta ümber save.rename.text = Uus nimi: -selectslot = Vali salvestus. -slot = [accent]Koht {0} -editmessage = Edit Message -save.corrupted = [accent]See salvestus on ära rikutud!\nKui sa just uuendasid mängu, siis on probleem tõenäoliselt kasutatavate salvestuste formaadi muutus ja [scarlet]mitte[] koodi viga. +selectslot = Vali salvestis. +slot = [accent]Pesa {0} +editmessage = Redigeeri sõnumit +save.corrupted = [accent]See salvestis on rikutud või ebasobiv!\nKui sa uuendasid mängu, siis on probleem tõenäoliselt salvestiste formaadi muutuses ja tegemist [scarlet]ei ole[] veaga mängu koodis. empty = on = Sees off = Väljas -save.autosave = Automaatne salvestamine: {0} +save.autosave = Automaatsalvestus: {0} save.map = Maailm: {0} -save.wave = Raund {0} -save.mode = Gamemode: {0} -save.date = Viimati Salvestatud: {0} +save.wave = Lahingulaine {0} +save.mode = Mänguviis: {0} +save.date = Viimati salvestatud: {0} save.playtime = Mänguaeg: {0} -warning = Hoiatus. +warning = Hoiatus confirm = Kinnita delete = Kustuta -view.workshop = View In Workshop +view.workshop = Vaata Workshop'is ok = OK open = Ava -customize = Kohanda +customize = Kohanda reegleid cancel = Tühista -openlink = Ava Link -copylink = Kopeeri Link +openlink = Ava link +copylink = Kopeeri link back = Tagasi -data.export = Export Data -data.import = Import Data -data.exported = Data exported. -data.invalid = This isn't valid game data. -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. -classic.export = Export Classic Data -classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? -quit.confirm = Oled kindel, et soovid lahkuda? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] +data.export = Ekspordi mänguandmed +data.import = Impordi mänguandmed +data.exported = Mänguandmed eksporditud. +data.invalid = Need ei ole sobivad mänguandmed. +data.import.confirm = Mänguandmete importimine kustutab\n[scarlet] kõik[] sinu praegused mänguandmed.\n[accent]Seda ei saa tagasi võtta![]\n\nKui mänguandmed on imporditud,\nsiis mäng sulgub kohe. +classic.export = Ekspordi Classic-mänguandmed +classic.export.text = [accent]Mindustry[] on äsja saanud suure uuenduse.\nTuvastatud on Classic- (v3.5 build 40) mänguandmed. Kas sa tahaksid need mänguandmed oma seadme kodukausta kopeerida, et neid Mindustry Classic rakenduses kasutada? +quit.confirm = Oled kindel, et soovid väljuda? +quit.confirm.tutorial = Oled kindel, et soovid õpetuse lõpetada?\nÕpetust saab uuesti läbida:\n[accent]Mängi -> Õpetus[]. loading = [accent]Laadimine... saving = [accent]Salvestamine... -wave = [accent]Raund {0} -wave.waiting = [LIGHT_GRAY]Raund {0} sekundi pärast -wave.waveInProgress = [LIGHT_GRAY]Raund käib -waiting = [LIGHT_GRAY]Ootan... +wave = [accent]Lahingulaine {0} +wave.waiting = [lightgray]Järgmine laine\nalgab: {0} +wave.waveInProgress = [lightgray]Toimub lahingulaine +waiting = [lightgray]Ootan... waiting.players = Ootan mängijaid... -wave.enemies = [LIGHT_GRAY]{0} Vastast Alles -wave.enemy = [LIGHT_GRAY]{0} Vastane Alles -loadimage = Lae Pilt -saveimage = Salvesta Pilt -unknown = Tundmatu -custom = Custom -builtin = Sisseehitatud -map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! -map.random = [accent]Random Map -map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor. -map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor. -map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. -map.invalid = Error loading map: corrupted or invalid map file. -map.publish.error = Error publishing map: {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! -eula = Steam EULA -map.publish = Map published. -map.publishing = [accent]Publishing map... -editor.brush = Brush -editor.openin = Open In Editor -editor.oregen = Ore Generation -editor.oregen.info = Ore Generation: -editor.mapinfo = Maailma Info +wave.enemies = [lightgray]{0} vaenlast alles +wave.enemy = [lightgray]{0} vaenlane alles +loadimage = Lae pilt +saveimage = Salvesta pilt +unknown = +custom = Mängija loodud +builtin = Sisse-ehitatud +map.delete.confirm = Oled kindel, et soovid maailma kustutada? Seda ei saa tagasi võtta! +map.random = [accent]Suvaline maailm +map.nospawn = Selles maailmas ei ole mängijate tuumikuid!\nLisa redaktoris sellele maailmale[accent] oranž[] tuumik. +map.nospawn.pvp = Selles maailmas ei ole piisavalt mängijate tuumikuid!\nLisa redaktoris sellele maailmale[SCARLET] mitte-oranže[] tuumikuid. +map.nospawn.attack = Selles maailmas ei ole mängijate poolt rünnatavaid vaenlaste tuumikuid!\nLisa redaktoris sellele maailmale[SCARLET] punaseid[] tuumikuid. +map.invalid = Viga maailma laadimisel: ebasobiv või riknenud fail. +map.publish.error = Viga maailma avaldamisel: {0} +map.publish.confirm = Oled kindel, et soovid selle maailma üles laadida?\n\n[lightgray]Veendu, et oled nõustunud Workshop'i kasutustingimustega. Vastasel juhul ei saa sinu maailma üles laadida. +eula = Steam'i kasutustingimused +map.publish = Maailm on üles laaditud. +map.publishing = [accent]Maailma üleslaadimine... +editor.brush = Pintsel +editor.openin = Ava redaktoris +editor.oregen = Maakide genereerimine +editor.oregen.info = Maakide genereerimine: +editor.mapinfo = Üldinfo editor.author = Autor: editor.description = Kirjeldus: -editor.nodescription = A map must have a description of at least 4 characters before being published. -editor.waves = Raundid: -editor.rules = Rules: -editor.generation = Generation: -editor.ingame = Edit In-Game -editor.publish.workshop = Publish On Workshop -editor.newmap = New Map +editor.nodescription = Maailmal peab enne avaldamist olema vähemalt 4 tähemärgi pikkune kirjeldus. +editor.waves = Lahingulained: +editor.rules = Reeglid: +editor.generation = Genereerimine: +editor.ingame = Redigeeri mängus +editor.publish.workshop = Avalda Workshop'is +editor.newmap = Uus maailm workshop = Workshop -waves.title = Raundid +waves.title = Lahingulained waves.remove = Eemalda -waves.never = +waves.never = -- waves.every = iga -waves.waves = Raund(id) -waves.perspawn = per spawn +waves.waves = laine järel +waves.perspawn = laine kohta waves.to = kuni waves.boss = Boss -waves.preview = Preview +waves.preview = Eelvaade waves.edit = Muuda... -waves.copy = Copy to Clipboard -waves.load = Load from Clipboard -waves.invalid = Invalid waves in clipboard. -waves.copied = Raundid kopeeritud. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. -editor.default = [LIGHT_GRAY] -details = Details... +waves.copy = Kopeeri puhvrisse +waves.load = Lae puhvrist +waves.invalid = Puhvrist laeti vigane lahingulainete informatsioon. +waves.copied = Lahingulainete informatsioon kopeeriti puhvrisse. +waves.none = Vaenlased on täpsustamata.\n[accent]Märkus: Tühjad lahingulained asendatakse automaatselt[]\n[accent]vaikimisi lahingulainetega. +editor.default = [lightgray] +details = Üksikasjad... edit = Muuda... editor.name = Nimi: -editor.spawn = Spawn Unit -editor.removeunit = Remove Unit -editor.teams = Tiimid -editor.errorload = Error loading file:\n[accent]{0} -editor.errorsave = Error saving file:\n[accent]{0} -editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. -editor.errornot = This is not a map file. -editor.errorheader = This map file is either not valid or corrupt. +editor.spawn = Tekita väeüksus +editor.removeunit = Eemalda väeüksus +editor.teams = Võistkonnad +editor.errorload = Viga faili laadimisel. +editor.errorsave = Viga faili salvestamisel. +editor.errorimage = See on pildifail, mitte maailmafail.\n\nKui soovid importida Classic- (3.5/build 40) maailma, vajuta redaktoris nupule 'Impordi Classic-maailm'. +editor.errorlegacy = See maailmafail on liiga vana ja kasutab iganenud formaati, mida enam ei toetata. +editor.errornot = See ei ole maailmafail. +editor.errorheader = See maailmafail on ebasobiv või riknenud. editor.errorname = Maailma nime pole täpsustatud. editor.update = Uuenda -editor.randomize = Randomize -editor.apply = Apply +editor.randomize = Juhuslikusta +editor.apply = Kinnita editor.generate = Genereeri -editor.resize = Resize -editor.loadmap = Lae Maailm -editor.savemap = Salvesta maailm +editor.resize = Suurus +editor.loadmap = Lae maailm +editor.savemap = Salvesta editor.saved = Salvestatud! -editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. -editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. -editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! +editor.save.noname = Su maailmal ei ole nime! Anna maailmale nimi, vajutades menüüs nupule "Üldinfo". +editor.save.overwrite = Sinu maailm kirjutaks üle sisse-ehitatud maailma! Anna maailmale teistsugune nimi, vajutades menüüs nupule "Üldinfo". +editor.import.exists = [scarlet]Importimine ebaõnnestus:[] sisse-ehitatud maailm nimega "{0}" on juba olemas! editor.import = Impordi... -editor.importmap = Impordi Maailm -editor.importmap.description = Import an already existing map -editor.importfile = Impordi Fail -editor.importfile.description = Import an external map file -editor.importimage = Import Legacy Image -editor.importimage.description = Import an external map image file +editor.importmap = Impordi maailm +editor.importmap.description = Impordi olemasolev maailm +editor.importfile = Impordi fail +editor.importfile.description = Impordi maailmafail +editor.importimage = Impordi Classic-maailm +editor.importimage.description = Impordi piltformaadis maailmafail editor.export = Ekspordi... -editor.exportfile = Ekspordi Fail -editor.exportfile.description = Ekspordi maailma fail -editor.exportimage = Export Terrain Image -editor.exportimage.description = Export a map image file -editor.loadimage = Import Terrain -editor.saveimage = Export Terrain -editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? -editor.resizemap = Resize Map -editor.mapname = Map Name: -editor.overwrite = [accent]Warning!\nThis overwrites an existing map. -editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? -editor.exists = A map with this name already exists. -editor.selectmap = Select a map to load: -toolmode.replace = Replace -toolmode.replace.description = Draws only on solid blocks. -toolmode.replaceall = Replace All -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. -toolmode.square = Square -toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. -filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. -filter.distort = Distort -filter.noise = Noise -filter.median = Median -filter.oremedian = Ore Median -filter.blend = Blend -filter.defaultores = Default Ores +editor.exportfile = Ekspordi fail +editor.exportfile.description = Ekspordi maailmafail +editor.exportimage = Ekspordi maastik +editor.exportimage.description = Ekspordi piltformaadis maailmafail +editor.loadimage = Impordi maastik +editor.saveimage = Ekspordi maastik +editor.unsaved = [scarlet]Sul on salvestamata muudatusi![]\nOled kindel, et soovid väljuda? +editor.resizemap = Muuda maailma suurust +editor.mapname = Maailma nimi: +editor.overwrite = [accent]Hoiatus!\nSee asendab olemasoleva maailma. +editor.overwrite.confirm = [scarlet]Hoiatus![] Sellise nimega maailm on juba olemas. Oled kindel, et soovid selle asendada? +editor.exists = Sellise nimega maailm on juba olemas. +editor.selectmap = Vali laetav maailm: + +toolmode.replace = Asenda +toolmode.replace.description = Joonista ainult tahkete blokkide peale. +toolmode.replaceall = Asenda kõik +toolmode.replaceall.description = Asenda kõik blokid selles maailmas. +toolmode.orthogonal = Ortogonaalne +toolmode.orthogonal.description = Joonista ainult täisnurkselt ristuvaid jooni. +toolmode.square = Ruudukujuline +toolmode.square.description = Joonista ruudukujulise pintsliga. +toolmode.eraseores = Kustuta maake +toolmode.eraseores.description = Kustuta ainult maake. +toolmode.fillteams = Täida võistkondi +toolmode.fillteams.description = Täida blokkide asemel võistkondi. +toolmode.drawteams = Joonista võistkondi +toolmode.drawteams.description = Joonista blokkide asemel võistkondi. + +filters.empty = [lightgray]Filtrid puuduvad! Lisa filtreid alloleva nupuga. +filter.distort = Moonutamine +filter.noise = Müra +filter.median = Mediaan +filter.oremedian = Maakide mediaan +filter.blend = Segustamine +filter.defaultores = Vaikimisi maagid filter.ore = Maak -filter.rivernoise = River Noise -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore -filter.scatter = Scatter -filter.terrain = Terrain -filter.option.scale = Scale -filter.option.chance = Chance -filter.option.mag = Magnitude -filter.option.threshold = Threshold -filter.option.circle-scale = Circle Scale -filter.option.octaves = Octaves -filter.option.falloff = Falloff -filter.option.angle = Angle -filter.option.block = Plokk +filter.rivernoise = Jõed +filter.mirror = Peegeldamine +filter.clear = Kustutamine +filter.option.ignore = Eira +filter.scatter = Puistamine +filter.terrain = Maastik +filter.option.scale = Ulatus +filter.option.chance = Tõenäosus +filter.option.mag = Suurusjärk +filter.option.threshold = Lävi +filter.option.circle-scale = Ringjoone ulatus +filter.option.octaves = Oktaav +filter.option.falloff = Filter +filter.option.angle = Nurk +filter.option.block = Blokk filter.option.floor = Põrand -filter.option.flooronto = Target Floor +filter.option.flooronto = Asendatav põrand filter.option.wall = Sein filter.option.ore = Maak -filter.option.floor2 = Teine Korrus -filter.option.threshold2 = Secondary Threshold -filter.option.radius = Radius -filter.option.percentile = Percentile +filter.option.floor2 = Teine põrand +filter.option.threshold2 = Teine lävi +filter.option.radius = Raadius +filter.option.percentile = Protsentiil + width = Laius: height = Kõrgus: menu = Menüü play = Mängi -campaign = Campaign +campaign = Kampaania load = Lae save = Salvesta fps = FPS: {0} tps = TPS: {0} ping = Ping: {0}ms -language.restart = Please restart your game for the language settings to take effect. +language.restart = Keelesätete muudatuste jõustumiseks [accent]taaskäivita[] mäng. settings = Sätted tutorial = Õpetus -tutorial.retake = Re-Take Tutorial -editor = Editor -mapeditor = Map Editor +tutorial.retake = Korda õpetust +editor = Redaktor +mapeditor = Maailmaredaktor donate = Anneta -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Reach: -zone.requirement = Wave {0} in zone {1} -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best Wave: {0} -launch = < LAUNCH > -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. -uncover = Uncover -configure = Configure Loadout -configure.locked = [LIGHT_GRAY]Unlock configuring loadout: Wave {0}. -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. -zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. -zone.resources = Resources Detected: -zone.objective = [lightgray]Objective: [accent]{0} -zone.objective.survival = Survive -zone.objective.attack = Destroy Enemy Core + +abandon = Loobu +abandon.text = See piirkond koos kõigi ressurssidega loovutatakse vaenlasele. +locked = Lukus +complete = [lightgray]Eesmärgid: +zone.requirement = {0} lahingulainet piirkonnas "{1}" +resume = Jätka piirkonnas:\n[lightgray]{0} +bestwave = [lightgray]Parim lahingulaine: {0} +launch = < LENDUTÕUS > +launch.title = Lendutõus +launch.next = [lightgray]Järgmine võimalus on {0}. laine järel +launch.unable2 = [scarlet]Ei saa LENDU TÕUSTA.[] +launch.confirm = Lendu tõusmisel võetakse kaasa\nkõik tuumikus olevad ressursid.\n[accent]Sellesse baasi ei ole võimalik tagasi tulla. +launch.skip.confirm = Kui jätad praegu lendu tõusmata, siis saad seda teha alles hilisemate lahingulainete järel. +uncover = Ava +configure = Muuda varustust +configure.locked = [lightgray]Varustuse muutmine avaneb\n {0}. lahingulaine järel. +configure.invalid = Arv peab olema 0 ja {0} vahel. +zone.unlocked = [lightgray]{0} avatud. +zone.requirement.complete = Jõudsid lahingulaineni {0}:\nPiirkonna "{1}" nõuded täidetud. +zone.config.complete = Jõudsid lahingulaineni {0}:\nVarustuse muutmine avatud. +zone.resources = Ressursid: +zone.objective = [lightgray]Eesmärk: [accent]{0} +zone.objective.survival = Ellujäämine +zone.objective.attack = Hävita vaenlaste tuumik add = Lisa... -boss.health = Bossi Elud -connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} -error.unreachable = Server unreachable.\nIs the address spelled correctly? -error.invalidaddress = Invalid address. -error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -error.alreadyconnected = Already connected. -error.mapnotfound = Map file not found! -error.io = Network I/O error. -error.any = Unknown network error. -error.bloom = Failed to initialize bloom.\nYour device may not support it. -zone.groundZero.name = Ground Zero -zone.desertWastes.name = Desert Wastes -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores -zone.stainedMountains.name = Stained Mountains -zone.desolateRift.name = Desolate Rift -zone.nuclearComplex.name = Nuclear Production Complex -zone.overgrowth.name = Overgrowth -zone.tarFields.name = Tar Fields -zone.saltFlats.name = Salt Flats -zone.impact0078.name = Impact 0078 -zone.crags.name = Crags -zone.fungalPass.name = Fungal Pass -zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. -zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. -zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. -zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. -zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. +boss.health = Bossi elud + +connectfail = [crimson]Ühenduse viga:\n\n[accent]{0} +error.unreachable = Server ei ole kättesaadav.\nKas serveri aadress on õigesti sisestatud? +error.invalidaddress = Vale aadress. +error.timedout = Ühendus aegus!\nVeendu, et host on pordid edasi suunanud ja et serveri aadress on õigesti sisestatud! +error.mismatch = Andmepaketi viga!\nVõimalik, et kliendi ja serveri versioonid on erinevad.\nVeendu, et nii sinul kui ka hostil on Mindustry uusim versioon! +error.alreadyconnected = Ühendus on juba loodud. +error.mapnotfound = Maailmafaili ei leitud! +error.io = Võrgu sisend-väljundi viga. +error.any = Teadmata viga võrgus. +error.bloom = Bloom-efekti lähtestamine ebaõnnestus.\nSinu seade ei pruugi seda efekti toetada. + +zone.groundZero.name = Nullpunkt +zone.desertWastes.name = Kõrbestunud tühermaa +zone.craters.name = Kraatrid +zone.frozenForest.name = Jäätunud mets +zone.ruinousShores.name = Rüüstatud kaldad +zone.stainedMountains.name = Rikutud mägismaa +zone.desolateRift.name = Mahajäetud rift +zone.nuclearComplex.name = Tuumajõujaam +zone.overgrowth.name = Kinnikasvanud võsa +zone.tarFields.name = Tõrvaväljad +zone.saltFlats.name = Soolaväljad +zone.impact0078.name = Kokkupõrge 0078 +zone.crags.name = Kaljurünkad +zone.fungalPass.name = Seenekuru + +zone.groundZero.description = Optimaalne asukoht alustamiseks.\nMadal ohutase. Vähesel määral ressursse.\nKogu kokku nii palju vaske ja pliid kui võimalik. +zone.frozenForest.description = Spoorid on levinud isegi mägede lähedale. Jäised temperatuurid ei suuda neid igavesti eemal hoida.\n\nAlusta esimeste katsetustega energia tootmises. Ehita põlemisgeneraatoreid.\nÕpi oma ehitisi parandama. +zone.desertWastes.description = Need tühermaad on üüratud ja ettearvamatud. Siin-seal leidub mahajäetud ja räsitud tööstushooneid.\n\nSelles piirkonnas leidub sütt. Töötle seda grafiidiks või põleta energia saamiseks.\n\n[lightgray]Maandumispaik ei ole kindlaks määratud. +zone.saltFlats.description = Kõrbe äärealadel laiuvad soolaväljad. Sellel alal leidub üksikuid ressursse.\n\nVaenlased on ehitanud siia ressursside hoidla. Hävita nende tuumik. Tee kõik maatasa. +zone.craters.description = Kunagiste sõdade käigus tekkinud kraatrisse on nüüdseks kogunenud vesi. Taasta see piirkond. Kogu liiva. Sulata see metaklaasiks. Kahurite ja puuride jahutamiseks pumpa vett. +zone.ruinousShores.description = Peale tühermaad algab rannajoon. Kunagi asus siin rannakaitsekompleks. Sellest ei ole palju alles. Kõigest põhilisemad kaitseehitised on jäänud puutumata. Teistest hoonetest on alles vaid varemed.\nJätka kaugemale arenemist. Taasavasta tehnoloogiaid. +zone.stainedMountains.description = Kaugemal sisemaal laiuvad mäed, mis on veel spooridest puutumata.\nKaevanda selles piirkonnas külluslikult leiduvat titaani. Õpi seda kasutama.\n\nVaenlasi on siin üpris palju. Ära anna neile aega oma tugevaimate väeüksuste teele saatmiseks. +zone.overgrowth.description = See ala on võsastunud ja asub spooride allika lähedal.\nVaenlased on siin eelpostil. Hävita see. Ehita kalevite väeüksuseid. Taasta see, mis läks kunagi kaduma. +zone.tarFields.description = Mägede ja kõrbe vahel asuvad naftatootmistsooni äärealad. Üks väheseid tõrvavarude piirkondi.\nEhkki see koht on mahajäetud, leidub selle läheduses ohtlikke vaenlasi. Ära alahinda neid.\n\n[lightgray]Võimaluse korral uuri nafta töötlemise tehnoloogiaid. +zone.desolateRift.description = Äärmiselt ohtlik piirkond. Külluslikult ressursse, kuid vähe ruumi. Suur hävinemisoht. Lahku võimalikult kiiresti. Vaenlaste rünnakute vaheline pikk aeg on petlik! +zone.nuclearComplex.description = Endine tooriumi tootmise ja töötlemise rajatis, millest on nüüdseks alles vaid varemed.\n[lightgray]Uuri tooriumit ja selle laialdaseid kasutusvõimalusi.\n\nVaenlaseid on siin palju ning nad jälgivad pidevalt sissetungijaid. +zone.fungalPass.description = Üleminekuala kõrgete mägede ja madalamate, spooridega ülekülvatud maade vahel. Siin asub väike vaenlaste luurebaas.\nHävita see.\nKasuta soldatite ja plahvatajate väeüksuseid. Hävita kaks vaenlaste tuumikut. zone.impact0078.description = zone.crags.description = + settings.language = Keel -settings.data = Game Data -settings.reset = Reset to Defaults -settings.rebind = Rebind -settings.controls = Controls +settings.data = Mänguandmed +settings.reset = Vaikimisi sätted +settings.rebind = Muuda +settings.controls = Juhtnupud settings.game = Mäng settings.sound = Heli -settings.graphics = Graphics -settings.cleardata = Clear Game Data... -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.clearunlocks = Clear Unlocks -settings.clearall = Clear All -paused = [accent]< Paused > +settings.graphics = Graafika +settings.cleardata = Kustuta mänguandmed... +settings.clear.confirm = Oled kindel, et soovid olemasolevad\nsätted kustutada?\n[accent]Seda ei saa tagasi võtta! +settings.clearall.confirm = [scarlet]HOIATUS![]\nKustutatakse kõik andmed, sealhulgas salvestised, maailmad, kampaania saavutused\nja juhtnuppude sätted.\n[accent]Vajutades nupule "OK", kustutatakse\nkõik andmed ja seejärel mäng sulgub.[] +settings.clearunlocks = Kustuta kampaania saavutused +settings.clearall = Kustuta kõik +paused = [accent]< Paus > yes = Jah no = Ei info.title = Info -error.title = [crimson]An error has occured -error.crashtitle = An error has occured -attackpvponly = [scarlet]Only available in Attack/PvP modes +error.title = [crimson]Viga +error.crashtitle = Viga +attackpvponly = [scarlet]Saadaval ainult mänguviisidega "Rünnak" ja "Versus" blocks.input = Sisend blocks.output = Väljund -blocks.booster = Booster -block.unknown = [LIGHT_GRAY]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot -blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range +blocks.booster = Kiirendaja +block.unknown = [lightgray]??? +blocks.powercapacity = Energiamahtuvus +blocks.powershot = Energia ühikut/lasu kohta +blocks.damage = Hävituspunkte +blocks.targetsair = Sihib õhku +blocks.targetsground = Sihib maapinnale +blocks.itemsmoved = Transportimise kiirus +blocks.launchtime = Aeg lendutõusude vahel +blocks.shootrange = Ulatus blocks.size = Suurus -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Energia Ulatus -blocks.poweruse = Energia Kasutus -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase +blocks.liquidcapacity = Vedelike mahutavus +blocks.powerrange = Energia ulatus +blocks.poweruse = Energiatarve +blocks.powerdamage = Energiatarve hävituspunkti kohta +blocks.itemcapacity = Ressursside mahutavus +blocks.basepowergeneration = Energiatootlus +blocks.productiontime = Tootmisaeg +blocks.repairtime = Täieliku parandamise aeg +blocks.speedincrease = Kiiruse suurenemine blocks.range = Ulatus -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units -blocks.health = Health -blocks.buildtime = Build Time -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second +blocks.drilltier = Kaevandatav +blocks.drillspeed = Puurimise kiirus +blocks.boosteffect = Kiirendaja mõju +blocks.maxunits = Maks. aktiivseid väeüksuseid +blocks.health = Elud +blocks.buildtime = Ehitamise aeg +blocks.buildcost = Ehitamise maksumus +blocks.inaccuracy = Ebatäpsus +blocks.shots = Laske +blocks.reload = Lasku/s blocks.ammo = Laskemoon -bar.drilltierreq = Better Drill Required -bar.drillspeed = Drill Speed: {0}/s -bar.efficiency = Efficiency: {0}% -bar.powerbalance = Power: {0}/s -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} -bar.items = Items: {0} -bar.capacity = Capacity: {0} + +bar.drilltierreq = Nõuab paremat puuri +bar.drillspeed = Puurimise kiirus: {0}/s +bar.efficiency = Kasutegur: {0}% +bar.powerbalance = Bilanss: {0}/s +bar.powerstored = Puhver: {0}/{1} +bar.poweramount = Laeng: {0} +bar.poweroutput = Tootlus: {0} +bar.items = Ressursse: {0} +bar.capacity = Mahutavus: {0} bar.liquid = Vedelik bar.heat = Kuumus bar.power = Energia -bar.progress = Build Progress -bar.spawned = Units: {0}/{1} -bullet.damage = [stat]{0}[lightgray] damage -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles -bullet.incendiary = [stat]incendiary -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x fire rate -unit.blocks = blocks -unit.powersecond = power units/second -unit.liquidsecond = liquid units/second -unit.itemssecond = items/second -unit.liquidunits = liquid units -unit.powerunits = power units -unit.degrees = degrees -unit.seconds = sek +bar.progress = Edenemine +bar.spawned = Väeüksuseid: {0}/{1} + +bullet.damage = [stat]{0}[lightgray] hävituspunkti +bullet.splashdamage = [stat]{0}[lightgray] hävituspunkti ~[stat] {1}[lightgray] blokki +bullet.incendiary = [stat]süttiv +bullet.homing = [stat]isesihtiv +bullet.shock = [stat]elektriseeriv +bullet.frag = [stat]kildpomm +bullet.knockback = [stat]{0}[lightgray]x tagasilöögi kordaja +bullet.freezing = [stat]jäätav +bullet.tarred = [stat]leekisüütav +bullet.multiplier = [stat]{0}[lightgray]x laskemoona kordaja +bullet.reload = [stat]{0}[lightgray]x tulistamise kiirus + +unit.blocks = blokki +unit.powersecond = energiaühikut/s +unit.liquidsecond = vedelikuühikut/s +unit.itemssecond = ressursiühikut/s +unit.liquidunits = vedelikuühikut +unit.powerunits = energiaühikut +unit.degrees = kraadi +unit.seconds = s unit.persecond = /s unit.timesspeed = x kiirus unit.percent = % -unit.items = asjad -category.general = Üldine +unit.items = ressursiühikut +category.general = Üldinfo category.power = Energia category.liquids = Vedelikud -category.items = Asjad +category.items = Ressursid category.crafting = Sisend/Väljund category.shooting = Tulistamine -category.optional = Optional Enhancements -setting.landscape.name = Lock Landscape +category.optional = Valikulised täiustused +setting.landscape.name = Lukusta horisontaalpaigutus setting.shadows.name = Varjud -setting.linear.name = Linear Filtering -setting.animatedwater.name = Animeeritud Vesi -setting.animatedshields.name = Animeeritud Kilbid -setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] -setting.indicators.name = Enemy/Ally Indicators -setting.autotarget.name = Auto-Target -setting.keyboard.name = Mouse+Keyboard Controls -setting.touchscreen.name = Touchscreen Controls -setting.fpscap.name = Max FPS -setting.fpscap.none = None -setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement +setting.linear.name = Lineaarne tekstuurivastendus +setting.animatedwater.name = Animeeritud vesi +setting.animatedshields.name = Animeeritud kilbid +setting.antialias.name = Sakitõrje[lightgray] (vajab mängu taaskäivitamist)[] +setting.indicators.name = Vaenlaste/Liitlaste osutid +setting.autotarget.name = Automaatne sihtimine +setting.keyboard.name = Hiire ja klaviatuuri juhtnupud +setting.touchscreen.name = Puuteekraani juhtimine +setting.fpscap.name = Maks. arv kaadreid/s +setting.fpscap.none = Puudub +setting.fpscap.text = {0} kaadrit/s +setting.uiscale.name = Kasutajaliidese suurus[lightgray] (vajab mängu taaskäivitamist)[] +setting.swapdiagonal.name = Paiguta alati diagonaalselt setting.difficulty.training = Treening setting.difficulty.easy = Lihtne -setting.difficulty.normal = Normaalne +setting.difficulty.normal = Keskmine setting.difficulty.hard = Raske -setting.difficulty.insane = Insane -setting.difficulty.name = Difficulty: -setting.screenshake.name = Screen Shake -setting.effects.name = Display Effects -setting.sensitivity.name = Controller Sensitivity -setting.saveinterval.name = Save Interval -setting.seconds = {0} Sekundit +setting.difficulty.insane = Hullumeelne +setting.difficulty.name = Raskusaste: +setting.screenshake.name = Ekraani värisemine +setting.effects.name = Näita visuaalefekte +setting.sensitivity.name = Kontrolleri tundlikkus +setting.saveinterval.name = Salvestamise intervall +setting.seconds = {0} sekundit setting.fullscreen.name = Täisekraan -setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) -setting.fps.name = Show FPS -setting.vsync.name = VSync -setting.lasers.name = Näita Energia Lasereid -setting.pixelate.name = Pixelate[LIGHT_GRAY] (disables animations) -setting.minimap.name = Näita Kaarti -setting.musicvol.name = Heli tase -setting.ambientvol.name = Ambient Volume +setting.borderlesswindow.name = Äärteta ekraan[lightgray] (võib vajada mängu taaskäivitamist) +setting.fps.name = Näita kaadrite arvu sekundis +setting.vsync.name = Vertikaalne sünkroonimine +setting.lasers.name = Näita energiasõlmede vahelisi ühendusi +setting.pixelate.name = Piksel-efekt[lightgray] (lülitab animatsioonid välja) +setting.minimap.name = Näita kaarti +setting.musicvol.name = Muusika helitugevus +setting.ambientvol.name = Taustahelide tugevus setting.mutemusic.name = Vaigista muusika -setting.sfxvol.name = SFX Volume -setting.mutesound.name = Mute Sound -setting.crashreport.name = Send Anonymous Crash Reports -setting.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility -setting.chatopacity.name = Chat Opacity -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.cancel = Cancel & Exit -setting.bloom.name = Bloom -keybind.title = Rebind Keys -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. -category.general.name = General -category.view.name = View -category.multiplayer.name = Multiplayer +setting.sfxvol.name = Heliefektide tugevus +setting.mutesound.name = Vaigista heli +setting.crashreport.name = Saada automaatseid veateateid +setting.savecreate.name = Loo automaatseid salvestisi +setting.publichost.name = Avaliku mängu nähtavus +setting.chatopacity.name = Vestlusakna läbipaistmatus +setting.playerchat.name = Näita mängusisest vestlusakent +uiscale.reset = Kasutajaliidese suurust on muudetud.\nVajuta nupule "OK", et uus suurus kinnitada.\n[scarlet]Esialgne suurus taastatakse[accent] {0}[] sekundi pärast... +uiscale.cancel = Tühista ja välju +setting.bloom.name = Bloom-efekt +keybind.title = Muuda juhtnuppe +keybinds.mobile = [scarlet]Enamik kuvatud juhtnuppudest ei ole kasutusel mobiilsetel seadmetel. Toetatakse vaid lihtsaid liikumisega seotud juhtnuppe. +category.general.name = Mäng +category.view.name = Kaamera ja kasutajaliides +category.multiplayer.name = Mitmikmäng command.attack = Ründa -command.rally = Rally command.retreat = Põgene -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +command.rally = Patrulli +keybind.gridMode.name = Bloki kiirvalimine +keybind.gridModeShift.name = Kategooria kiirvalimine keybind.press = Vajuta klahvi... -keybind.press.axis = Press an axis or key... -keybind.screenshot.name = Map Screenshot -keybind.move_x.name = Move x -keybind.move_y.name = Move y -keybind.fullscreen.name = Toggle Fullscreen -keybind.select.name = Select/Shoot -keybind.diagonal_placement.name = Diagonal Placement -keybind.pick.name = Pick Block -keybind.break_block.name = Break Block -keybind.deselect.name = Deselect -keybind.shoot.name = Shoot -keybind.zoom_hold.name = Zoom Hold -keybind.zoom.name = Zoom +keybind.press.axis = Liiguta juhtkangi või vajuta klahvi... +keybind.screenshot.name = Kuvatõmmis +keybind.move_x.name = Liigu X-teljel +keybind.move_y.name = Liigu Y-teljel +keybind.fullscreen.name = Täisekraan +keybind.select.name = Vali/Tulista +keybind.diagonal_placement.name = Diagonaalne paigutamine +keybind.pick.name = Vali blokk +keybind.break_block.name = Hävita blokk +keybind.deselect.name = Tühista valik +keybind.shoot.name = Tulista +keybind.zoom_hold.name = Suumimise režiim +keybind.zoom.name = Muuda suumi keybind.menu.name = Menüü keybind.pause.name = Paus -keybind.minimap.name = Minimap -keybind.dash.name = Dash -keybind.chat.name = Chat -keybind.player_list.name = Player list -keybind.console.name = Console -keybind.rotate.name = Rotate -keybind.toggle_menus.name = Toggle menus -keybind.chat_history_prev.name = Chat history prev -keybind.chat_history_next.name = Chat history next -keybind.chat_scroll.name = Chat scroll -keybind.drop_unit.name = Drop Unit -keybind.zoom_minimap.name = Zoom minimap -mode.help.title = Description of modes -mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +keybind.minimap.name = Kaart +keybind.dash.name = Söösta +keybind.chat.name = Vestle +keybind.player_list.name = Mängijate nimekiri +keybind.console.name = Konsool +keybind.rotate.name = Pööra blokki +keybind.toggle_menus.name = Näita/Peida menüüd +keybind.chat_history_prev.name = Vestlusaken: eelmine +keybind.chat_history_next.name = Vestlusaken: järgmine +keybind.chat_scroll.name = Vestlusaken: kerimine +keybind.drop_unit.name = Heida väeüksus +keybind.zoom_minimap.name = Suumi kaarti +mode.help.title = Mänguviiside kirjeldused +mode.survival.name = Ellujäämine +mode.survival.description = Tavaline mänguviis. Piiratud ressursid. Lahingulainetena lähenevad vaenlased. mode.sandbox.name = Liivakast -mode.sandbox.description = Infinite resources and no timer for waves. -mode.pvp.name = PvP -mode.pvp.description = Fight against other players locally. -mode.attack.name = Attack -mode.attack.description = Destroy the enemy's base. No waves. -mode.custom = Kohandatud Reeglid -rules.infiniteresources = Infinite Resources -rules.wavetimer = Wave Timer -rules.waves = Raundi -rules.attack = Attack Mode -rules.enemyCheat = Infinite AI (Red Team) Resources -rules.unitdrops = Unit Drops -rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier -rules.unithealthmultiplier = Unit Health Multiplier -rules.playerhealthmultiplier = Player Health Multiplier -rules.playerdamagemultiplier = Player Damage Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier -rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) -rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) -rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) -rules.buildcostmultiplier = Build Cost Multiplier -rules.buildspeedmultiplier = Build Speed Multiplier -rules.waitForWaveToEnd = Waves wait for enemies -rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) -rules.respawns = Max respawns per wave -rules.limitedRespawns = Limit Respawns -rules.title.waves = Raundid -rules.title.respawns = Respawns -rules.title.resourcesbuilding = Resources & Building +mode.sandbox.description = Lõputult ressursse. Lahingulainetel puudub taimer. +mode.editor.name = Redaktor +mode.pvp.name = Versus +mode.pvp.description = Võitle teiste mängijate vastu. +mode.attack.name = Rünnak +mode.attack.description = Hävita vaenlaste baas. Lahingulaineid ei ole. +mode.custom = Reeglid + +rules.infiniteresources = Lõputult ressursse +rules.wavetimer = Kasuta taimerit +rules.waves = Kasuta lahingulaineid +rules.attack = Mänguviis "Rünnak" +rules.enemyCheat = [scarlet]Vaenlastel[] on lõputult ressursse +rules.unitdrops = Väeüksuste heitmine lubatud +rules.unitbuildspeedmultiplier = Väeüksuste tootmiskiiruse kordaja +rules.unithealthmultiplier = Väeüksuste elude kordaja +rules.playerhealthmultiplier = Mängija elude kordaja +rules.playerdamagemultiplier = Mängija hävitusvõime kordaja +rules.unitdamagemultiplier = Väeüksuste hävitusvõime kordaja +rules.enemycorebuildradius = Vaenlaste tuumiku ehitistevaba ala raadius:[lightgray] (ühik) +rules.respawntime = Elluärkamise aeg:[lightgray] (sekund) +rules.wavespacing = Aeg lainete vahel:[lightgray] (sekund) +rules.buildcostmultiplier = Ehitamise maksumuse kordaja +rules.buildspeedmultiplier = Ehitamise kiiruse kordaja +rules.waitForWaveToEnd = Järgmine laine ootab eelmise laine lõpuni +rules.dropzoneradius = Maandumisala raadius:[lightgray] (ühik) +rules.respawns = Maks. arv elluärkamisi laine kohta +rules.limitedRespawns = Piira elluärkamisi +rules.title.waves = Lahingulained +rules.title.respawns = Elluärkamised +rules.title.resourcesbuilding = Ressursid ja ehitamine rules.title.player = Mängijad -rules.title.enemy = Vastased -rules.title.unit = Units -content.item.name = Asjad +rules.title.enemy = Vaenlased +rules.title.unit = Väeüksused + +content.item.name = Ressursid content.liquid.name = Vedelikud -content.unit.name = Units -content.block.name = Plokid -content.mech.name = Mechs +content.unit.name = Väeüksused +content.block.name = Konstruktsioonid +content.mech.name = Mehhaanid item.copper.name = Vask item.lead.name = Plii item.coal.name = Süsi item.graphite.name = Grafiit -item.titanium.name = Titaanium +item.titanium.name = Titaan item.thorium.name = Toorium -item.silicon.name = Silikoon -item.plastanium.name = Plastaanium -item.phase-fabric.name = Faasriie -item.surge-alloy.name = Surge Alloy -item.spore-pod.name = Spore Pod +item.silicon.name = Räni +item.plastanium.name = Plastium +item.phase-fabric.name = Faaskangas +item.surge-alloy.name = Voogsulam +item.spore-pod.name = Spoorikobar item.sand.name = Liiv -item.blast-compound.name = Blast Compound -item.pyratite.name = Pyratite -item.metaglass.name = Metaglass -item.scrap.name = Scrap +item.blast-compound.name = Lõhkeaine +item.pyratite.name = Püratiit +item.metaglass.name = Metaklaas +item.scrap.name = Vanametall liquid.water.name = Vesi -liquid.slag.name = Slag +liquid.slag.name = Räbu liquid.oil.name = Nafta -liquid.cryofluid.name = Cryofluid -mech.alpha-mech.name = Alpha -mech.alpha-mech.weapon = Heavy Repeater -mech.alpha-mech.ability = Regeneration +liquid.cryofluid.name = Krüovedelik +mech.alpha-mech.name = Alfa +mech.alpha-mech.weapon = Raskekahur +mech.alpha-mech.ability = Isetaastumine mech.delta-mech.name = Delta -mech.delta-mech.weapon = Arc Generator -mech.delta-mech.ability = Discharge +mech.delta-mech.weapon = Elektrikahur +mech.delta-mech.ability = Laviinläbilöök mech.tau-mech.name = Tau -mech.tau-mech.weapon = Restruct Laser -mech.tau-mech.ability = Repair Burst -mech.omega-mech.name = Omega -mech.omega-mech.weapon = Swarm Missiles -mech.omega-mech.ability = Armored Configuration -mech.dart-ship.name = Dart -mech.dart-ship.weapon = Repeater -mech.javelin-ship.name = Javelin -mech.javelin-ship.weapon = Burst Missiles -mech.javelin-ship.ability = Discharge Booster -mech.trident-ship.name = Trident -mech.trident-ship.weapon = Bomb Bay -mech.glaive-ship.name = Glaive -mech.glaive-ship.weapon = Flame Repeater -item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% -item.flammability = [LIGHT_GRAY]Flammability: {0}% -item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% -unit.health = [LIGHT_GRAY]Health: {0} -unit.speed = [LIGHT_GRAY]Speed: {0} -mech.weapon = [LIGHT_GRAY]Weapon: {0} -mech.health = [LIGHT_GRAY]Health: {0} -mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} -mech.minespeed = [LIGHT_GRAY]Mining Speed: {0}% -mech.minepower = [LIGHT_GRAY]Mining Power: {0} -mech.ability = [LIGHT_GRAY]Ability: {0} -mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} -liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} -liquid.temperature = [LIGHT_GRAY]Temperature: {0} -block.sand-boulder.name = Sand Boulder -block.grass.name = Grass -block.salt.name = Salt -block.saltrocks.name = Salt Rocks -block.pebbles.name = Pebbles -block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks -block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Kivi -block.snowrock.name = Lumekivi -block.snow-pine.name = Snow Pine -block.shale.name = Shale -block.shale-boulder.name = Shale Boulder -block.moss.name = Moss -block.shrubs.name = Shrubs -block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall -block.thruster.name = Thruster -block.kiln.name = Kiln -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press -block.constructing = {0} [LIGHT_GRAY](Constructing) -block.spawn.name = Enemy Spawn -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Foundation -block.core-nucleus.name = Core: Nucleus -block.deepwater.name = Deep Water -block.water.name = Water -block.tainted-water.name = Tainted Water -block.darksand-tainted-water.name = Dark Sand Tainted Water -block.tar.name = Tar -block.stone.name = Stone -block.sand.name = Sand -block.darksand.name = Dark Sand -block.ice.name = Ice -block.snow.name = Snow -block.craters.name = Craters -block.sand-water.name = Sand water -block.darksand-water.name = Dark Sand Water -block.char.name = Char -block.holostone.name = Holo stone -block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks -block.pine.name = Pine -block.white-tree-dead.name = White Tree Dead -block.white-tree.name = White Tree -block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor 1 -block.metal-floor-2.name = Metal Floor 2 -block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 4 -block.metal-floor-damaged.name = Metal Floor Damaged -block.dark-panel-1.name = Dark Panel 1 -block.dark-panel-2.name = Dark Panel 2 -block.dark-panel-3.name = Dark Panel 3 -block.dark-panel-4.name = Dark Panel 4 -block.dark-panel-5.name = Dark Panel 5 -block.dark-panel-6.name = Dark Panel 6 -block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock -block.hotrock.name = Hot Rock -block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs -block.copper-wall.name = Copper Wall -block.copper-wall-large.name = Large Copper Wall -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall -block.thorium-wall.name = Thorium Wall -block.thorium-wall-large.name = Large Thorium Wall -block.door.name = Door -block.door-large.name = Large Door -block.duo.name = Duo -block.scorch.name = Scorch -block.scatter.name = Scatter -block.hail.name = Hail -block.lancer.name = Lancer -block.conveyor.name = Conveyor -block.titanium-conveyor.name = Titanium Conveyor -block.armored-conveyor.name = Armored Conveyor -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.junction.name = Junction -block.router.name = Router -block.distributor.name = Distributor -block.sorter.name = Sorter -block.message.name = Message -block.overflow-gate.name = Overflow Gate -block.silicon-smelter.name = Silicon Smelter -block.phase-weaver.name = Phase Weaver -block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer -block.melter.name = Melter -block.incinerator.name = Incinerator -block.spore-press.name = Spore Press -block.separator.name = Separator -block.coal-centrifuge.name = Coal Centrifuge -block.power-node.name = Power Node -block.power-node-large.name = Large Power Node -block.surge-tower.name = Surge Tower -block.battery.name = Battery -block.battery-large.name = Large Battery -block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Turbine Generator -block.differential-generator.name = Differential Generator -block.impact-reactor.name = Impact Reactor -block.mechanical-drill.name = Mechanical Drill -block.pneumatic-drill.name = Pneumatic Drill -block.laser-drill.name = Laser Drill -block.water-extractor.name = Water Extractor -block.cultivator.name = Cultivator -block.dart-mech-pad.name = Alpha Mech Pad -block.delta-mech-pad.name = Delta Mech Pad -block.javelin-ship-pad.name = Javelin Ship Pad -block.trident-ship-pad.name = Trident Ship Pad -block.glaive-ship-pad.name = Glaive Ship Pad -block.omega-mech-pad.name = Omega Mech Pad -block.tau-mech-pad.name = Tau Mech Pad -block.conduit.name = Conduit -block.mechanical-pump.name = Mechanical Pump -block.item-source.name = Item Source -block.item-void.name = Item Void -block.liquid-source.name = Liquid Source -block.power-void.name = Power Void -block.power-source.name = Power Infinite -block.unloader.name = Unloader -block.vault.name = Vault -block.wave.name = Laine -block.swarmer.name = Swarmer -block.salvo.name = Salvo -block.ripple.name = Ripple -block.phase-conveyor.name = Phase Conveyor -block.bridge-conveyor.name = Bridge Conveyor -block.plastanium-compressor.name = Plastanium Compressor -block.pyratite-mixer.name = Pyratite Mixer -block.blast-mixer.name = Blast Mixer -block.solar-panel.name = Solar Panel -block.solar-panel-large.name = Large Solar Panel -block.oil-extractor.name = Oil Extractor -block.command-center.name = Command Center -block.draug-factory.name = Draug Miner Drone Factory -block.spirit-factory.name = Spirit Drone Factory -block.phantom-factory.name = Phantom Drone Factory -block.wraith-factory.name = Wraith Fighter Factory -block.ghoul-factory.name = Ghoul Bomber Factory -block.dagger-factory.name = Dagger Mech Factory -block.crawler-factory.name = Crawler Mech Factory -block.titan-factory.name = Titan Mech Factory -block.fortress-factory.name = Fortress Mech Factory -block.revenant-factory.name = Revenant Fighter Factory -block.repair-point.name = Repair Point -block.pulse-conduit.name = Pulse Conduit -block.phase-conduit.name = Phase Conduit -block.liquid-router.name = Liquid Router -block.liquid-tank.name = Liquid Tank -block.liquid-junction.name = Liquid Junction -block.bridge-conduit.name = Bridge Conduit -block.rotary-pump.name = Rotary Pump -block.thorium-reactor.name = Thorium Reactor -block.mass-driver.name = Mass Driver -block.blast-drill.name = Airblast Drill -block.thermal-pump.name = Thermal Pump -block.thermal-generator.name = Thermal Generator -block.alloy-smelter.name = Alloy Smelter -block.mender.name = Mender -block.mend-projector.name = Mend Projector -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Large Surge Wall -block.cyclone.name = Cyclone -block.fuse.name = Fuse -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector -block.arc.name = Arc -block.rtg-generator.name = RTG Generator -block.spectre.name = Spectre -block.meltdown.name = Meltdown -block.container.name = Container -block.launch-pad.name = Launch Pad -block.launch-pad-large.name = Large Launch Pad +mech.tau-mech.weapon = Paranduslaser +mech.tau-mech.ability = Parandusimpulss +mech.omega-mech.name = Oomega +mech.omega-mech.weapon = Raketiparv +mech.omega-mech.ability = Soomuskate +mech.dart-ship.name = Ahti +mech.dart-ship.weapon = Automaatkahur +mech.javelin-ship.name = Sulev +mech.javelin-ship.weapon = Raketiheitja +mech.javelin-ship.ability = Elekterkiirendus +mech.trident-ship.name = Lembitu +mech.trident-ship.weapon = Pommiheitja +mech.glaive-ship.name = Vambola +mech.glaive-ship.weapon = Kuulipildur +item.explosiveness = [lightgray]Plahvatusohtlikkus: {0}% +item.flammability = [lightgray]Tuleohtlikkus: {0}% +item.radioactivity = [lightgray]Radioaktiivsus: {0}% +unit.health = [lightgray]Elud: {0} +unit.speed = [lightgray]Kiirus: {0} +mech.weapon = [lightgray]Relv: {0} +mech.health = [lightgray]Elud: {0} +mech.itemcapacity = [lightgray]Ressursside mahutavus: {0} +mech.minespeed = [lightgray]Kaevandamise kiirus: {0}% +mech.minepower = [lightgray]Kaevandamise võimsus: {0}x +mech.ability = [lightgray]Lisavõime: {0} +mech.buildspeed = [lightgray]Ehitamise kiirus: {0}% +liquid.heatcapacity = [lightgray]Soojusmahtuvus: {0} +liquid.viscosity = [lightgray]Viskoossus: {0} +liquid.temperature = [lightgray]Temperatuur: {0} + +block.sand-boulder.name = Liivakamakas +block.grass.name = Rohi +block.salt.name = Sool +block.saltrocks.name = Kristallsool +block.pebbles.name = Kruus +block.tendrils.name = Kombitsad +block.sandrocks.name = Liivakivid +block.spore-pine.name = Spoorine puu +block.sporerocks.name = Spoorkivid +block.rock.name = Kivikamakas +block.snowrock.name = Lumine kivikamakas +block.snow-pine.name = Lumine puu +block.shale.name = Savikilt +block.shale-boulder.name = Kivikamakas +block.moss.name = Sammal +block.shrubs.name = Põõsad +block.spore-moss.name = Spoorsammal +block.shalerocks.name = Savikildad +block.scrap-wall.name = Vanametallist sein +block.scrap-wall-large.name = Suur vanametallist sein +block.scrap-wall-huge.name = Tohutu vanametallist sein +block.scrap-wall-gigantic.name = Hiiglaslik vanametallist sein +block.thruster.name = Põtkur +block.kiln.name = Klaasisulatusahi +block.graphite-press.name = Grafiidipress +block.multi-press.name = Multipress +block.constructing = {0} [lightgray](Ehitamine) +block.spawn.name = Vaenlaste maandumisala +block.core-shard.name = Tuumik: Osake +block.core-foundation.name = Tuumik: Arenenud +block.core-nucleus.name = Tuumik: Täielik +block.deepwater.name = Sügav vesi +block.water.name = Vesi +block.tainted-water.name = Riknenud vesi +block.darksand-tainted-water.name = Riknenud vesi tumedal liival +block.tar.name = Tõrv +block.stone.name = Kivi +block.sand.name = Liiv +block.darksand.name = Tume liiv +block.ice.name = Jää +block.snow.name = Lumi +block.craters.name = Kraatrid +block.sand-water.name = Vesi liival +block.darksand-water.name = Vesi tumedal liival +block.char.name = Puusüsi +block.holostone.name = Helendav kivi +block.ice-snow.name = Jäine lumi +block.rocks.name = Kivid +block.icerocks.name = Jäised kivid +block.snowrocks.name = Lumised kivid +block.dunerocks.name = Luitekivid +block.pine.name = Puu +block.white-tree-dead.name = Surnud valgepuu +block.white-tree.name = Valgepuu +block.spore-cluster.name = Spoorikobarad +block.metal-floor.name = Metallpõrand 1 +block.metal-floor-2.name = Metallpõrand 2 +block.metal-floor-3.name = Metallpõrand 3 +block.metal-floor-5.name = Metallpõrand 4 +block.metal-floor-damaged.name = Kahjustunud metallpõrand +block.dark-panel-1.name = Tume paneel 1 +block.dark-panel-2.name = Tume paneel 2 +block.dark-panel-3.name = Tume paneel 3 +block.dark-panel-4.name = Tume paneel 4 +block.dark-panel-5.name = Tume paneel 5 +block.dark-panel-6.name = Tume paneel 6 +block.dark-metal.name = Tume metall +block.ignarock.name = Tardkivim +block.hotrock.name = Kuumad kivid +block.magmarock.name = Magmakivim +block.cliffs.name = Rahnud +block.copper-wall.name = Vasksein +block.copper-wall-large.name = Suur vasksein +block.titanium-wall.name = Titaansein +block.titanium-wall-large.name = Suur titaansein +block.phase-wall.name = Faassein +block.phase-wall-large.name = Suur faassein +block.thorium-wall.name = Tooriumsein +block.thorium-wall-large.name = Suur tooriumsein +block.door.name = Uks +block.door-large.name = Suur uks +block.duo.name = Kaksikkahur +block.scorch.name = Leegiheitja +block.scatter.name = Turmtuli +block.hail.name = Kauglaskur +block.lancer.name = Kvantlaser +block.conveyor.name = Konveier +block.titanium-conveyor.name = Titaankonveier +block.armored-conveyor.name = Soomuskonveier +block.armored-conveyor.description = Transpordib ressursse sama kiiresti kui titaankonveier, kuid on soomuskattega ja vastupidavam. Võtab külgedelt sisendina vastu ainult konveierite väljundeid. +block.junction.name = Ristmik +block.router.name = Jaotur +block.distributor.name = Suur jaotur +block.sorter.name = Sorteerija +block.message.name = Sõnum +block.overflow-gate.name = Ülevooluvärav +block.silicon-smelter.name = Ränisulatusahi +block.phase-weaver.name = Faaskangakuduja +block.pulverizer.name = Metallijahvataja +block.cryofluidmixer.name = Krüosegisti +block.melter.name = Metallisulataja +block.incinerator.name = Tuhastusahi +block.spore-press.name = Spooripress +block.separator.name = Räbueraldaja +block.coal-centrifuge.name = Söetsentrifuug +block.power-node.name = Energiasõlm +block.power-node-large.name = Suur energiasõlm +block.surge-tower.name = Energiatorn +block.battery.name = Aku +block.battery-large.name = Suur aku +block.combustion-generator.name = Põlemisgeneraator +block.turbine-generator.name = Aurugeneraator +block.differential-generator.name = Diferentseeriv generaator +block.impact-reactor.name = Impulssreaktor +block.mechanical-drill.name = Harilik puur +block.pneumatic-drill.name = Pneumaatiline puur +block.laser-drill.name = Laserpuur +block.water-extractor.name = Puurkaev +block.cultivator.name = Inkubaator +block.dart-mech-pad.name = Alfa morfoosjaam +block.delta-mech-pad.name = Delta morfoosjaam +block.javelin-ship-pad.name = Sulevi morfoosjaam +block.trident-ship-pad.name = Lembitu morfoosjaam +block.glaive-ship-pad.name = Vambola morfoosjaam +block.omega-mech-pad.name = Oomega morfoosjaam +block.tau-mech-pad.name = Tau morfoosjaam +block.conduit.name = Toru +block.mechanical-pump.name = Harilik pump +block.item-source.name = Ressursiallikas +block.item-void.name = Ressursisuue +block.liquid-source.name = Vedelikuallikas +block.power-void.name = Maandaja +block.power-source.name = Energiaallikas +block.unloader.name = Mahalaadija +block.vault.name = Suur hoidla +block.wave.name = Prits +block.swarmer.name = Parvpildur +block.salvo.name = Krempelpaugutaja +block.ripple.name = Tähesadu +block.phase-conveyor.name = Faaskonveier +block.bridge-conveyor.name = Sildkonveier +block.plastanium-compressor.name = Plastiumipress +block.pyratite-mixer.name = Püratiidisegisti +block.blast-mixer.name = Lõhkeainete segisti +block.solar-panel.name = Päikesepaneel +block.solar-panel-large.name = Suur päikesepaneel +block.oil-extractor.name = Naftapuur +block.command-center.name = Juhtimiskeskus +block.draug-factory.name = Kaevandusdroonide tehas +block.spirit-factory.name = Parandusdroonide tehas +block.phantom-factory.name = Ehitusdroonide tehas +block.wraith-factory.name = Hävitajate tehas +block.ghoul-factory.name = Pommitajate tehas +block.dagger-factory.name = Soldatite tehas +block.crawler-factory.name = Plahvatajate tehas +block.titan-factory.name = Kalevite tehas +block.fortress-factory.name = Koljatite tehas +block.revenant-factory.name = Ülestõusnute tehas +block.repair-point.name = Parandusjaam +block.pulse-conduit.name = Titaantoru +block.phase-conduit.name = Faastoru +block.liquid-router.name = Torujaotur +block.liquid-tank.name = Mahuti +block.liquid-junction.name = Toruristmik +block.bridge-conduit.name = Torusild +block.rotary-pump.name = Labapump +block.thorium-reactor.name = Tooriumreaktor +block.mass-driver.name = EM-katapult +block.blast-drill.name = Plahvatuspuur +block.thermal-pump.name = Termopump +block.thermal-generator.name = Termogeneraator +block.alloy-smelter.name = Voogsulatusahi +block.mender.name = Parandaja +block.mend-projector.name = Parandusväli +block.surge-wall.name = Voogsein +block.surge-wall-large.name = Suur voogsein +block.cyclone.name = Tuulispask +block.fuse.name = Välkkahur +block.shock-mine.name = Miin +block.overdrive-projector.name = Kiirkäiguväli +block.force-projector.name = Kaitseväli +block.arc.name = Elektrikahur +block.rtg-generator.name = RT-generaator +block.spectre.name = Kõmmutaja +block.meltdown.name = Valguskiir +block.container.name = Hoidla +block.launch-pad.name = Stardiplatvorm +block.launch-pad-large.name = Suur stardiplatvorm team.blue.name = sinine -team.crux.name = red -team.sharded.name = orange +team.crux.name = punane +team.sharded.name = killustunud team.orange.name = oranž -team.derelict.name = derelict +team.derelict.name = unustatud team.green.name = roheline team.purple.name = lilla -unit.spirit.name = Spirit Drone -unit.draug.name = Draug Miner Drone -unit.phantom.name = Phantom Drone -unit.dagger.name = Dagger -unit.crawler.name = Crawler -unit.titan.name = Titan -unit.ghoul.name = Ghoul Bomber -unit.wraith.name = Wraith Fighter -unit.fortress.name = Fortress -unit.revenant.name = Revenant -unit.eruptor.name = Eruptor -unit.chaos-array.name = Chaos Array -unit.eradicator.name = Eradicator -unit.lich.name = Lich -unit.reaper.name = Reaper -tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. -tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. -tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered -tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. -tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. -tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. -tutorial.unpause = Now press space again to unpause. -tutorial.unpause.mobile = Now press it again to unpause. -tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. -tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. -tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[] -tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] -tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. -tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. -item.copper.description = A useful structure material. Used extensively in all types of blocks. -item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. -item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. -item.coal.description = A common and readily available fuel. -item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. -item.silicon.description = An extremely useful semiconductor, with applications in solar panels and many complex electronics. -item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. -item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.spore-pod.description = Used for conversion into oil, explosives and fuel. -item.blast-compound.description = A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. -item.pyratite.description = An extremely flammable substance used in incendiary weapons. -liquid.water.description = Sageli kasutatud jahutamiseks ja jäätme töötluseks. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. -liquid.oil.description = Seda saab põleteda, õhku lasta või kasutada jahutamiseks. -liquid.cryofluid.description = Kõige efektiivsem vedelik asjade maha jahutamiseks. -mech.alpha-mech.description = The standard mech. Has decent speed and damage output. -mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. -mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. -mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor ability can block up to 90% of incoming damage. -mech.dart-ship.description = The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed. -mech.javelin-ship.description = A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning ability and missiles. -mech.trident-ship.description = A heavy bomber. Reasonably well armored. -mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. -unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. -unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores and repairs blocks. -unit.phantom.description = An advanced drone unit. Automatically mines ores and repairs blocks. Significantly more effective than a spirit drone. -unit.dagger.description = A basic ground unit. Useful in swarms. -unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. -unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. -unit.fortress.description = A heavy artillery ground unit. -unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. -unit.wraith.description = A fast, hit-and-run interceptor unit. -unit.ghoul.description = A heavy carpet bomber. -unit.revenant.description = A heavy, hovering missile array. -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. -block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. -block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in turrets. -block.separator.description = Extracts useful minerals from slag. -block.spore-press.description = Compresses spore pods into oil. -block.pulverizer.description = Crushes scrap into sand. Useful when there is a lack of natural sand. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. -block.incinerator.description = Gets rid of any excess item or liquid. -block.power-void.description = Hävitab kõik materjalid, mis sinna lähevad. Ainult liivakastis. -block.power-source.description = Annab välja lõpmatult elektrit. Ainult liivakastis. -block.item-source.description = Annab välja lõpmatult materjale. Ainult liivakastis. -block.item-void.description = Hävitab kõik materjalid, mis sinna lähevad elektrit kasutamata. Ainult liivakastis. -block.liquid-source.description = Annab välja lõpmatult vedelikke. Ainult liivakastis. -block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. -block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. -block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. -block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nGood protection from enemies. -block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. -block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. -block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. -block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. -block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. -block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. -block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = Periodically heals blocks in its vicinity. -block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into turrets or crafters. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. -block.bridge-conveyor.description = Arenenud transpordi ehitis. Lubab transportida materjale üle iga pinnase ja ehitise 3 ruudu kaugusele. -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.router.description = Võtab vastu materjale ühest suunast ja annab neid võrdselt välja kolmes suunas. Kasulik ühest allikast tulevate materjalide jagamisel mitmeks. -block.distributor.description = Arenenud jagaja, mis jagab materjale kuni 7 suunas. -block.overflow-gate.description = A combination splitter and router that only outputs to the left and right if the front path is blocked. -block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. -block.mechanical-pump.description = Odav ja aeglane pump, mis ei vaja elektrit. -block.rotary-pump.description = Kahekordistab kiiruse kasutades elektrit. -block.thermal-pump.description = Ülim pump. -block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. -block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Hoiustab suure hulga vedelikke. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Töötab kui sild kahele ristuvale torule. Kasulik situatsioonides kui kaks erinevat toru viivad kahte erinevat vedelikku eri kohtadesse. -block.bridge-conduit.description = Arenenud vedeliku transport. Lubab transportida vedelikke üle iga pinnase ja ehitise 3 ruudu kaugusele. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning oil or flammable materials. -block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. -block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. -block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. -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.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. -block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. -block.cultivator.description = Cultivates tiny concentrations of spores into industry-ready pods. -block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. -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-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = Stores a large amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. -block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. -block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. -block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. -block.duo.description = A small, cheap turret. Useful against ground units. -block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. -block.hail.description = A small artillery turret. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.arc.description = A small close-range turret which shoots electricity in a random arc towards the enemy. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.fuse.description = A large turret which shoots powerful short-range beams. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.spectre.description = A large turret which shoots two powerful bullets at once. -block.meltdown.description = A large turret which shoots powerful long-range beams. -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.draug-factory.description = Produces Draug mining drones. -block.spirit-factory.description = Produces light drones which mine ore and repair blocks. -block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. -block.wraith-factory.description = Produces fast, hit-and-run interceptor units. -block.ghoul-factory.description = Produces heavy carpet bombers. -block.revenant-factory.description = Produces heavy laser air units. -block.dagger-factory.description = Produces basic ground units. -block.crawler-factory.description = Produces fast self-destructing swarm units. -block.titan-factory.description = Produces advanced, armored ground units. -block.fortress-factory.description = Produces heavy artillery ground units. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. -block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. -block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. -block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. -block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. -block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. -block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. +unit.spirit.name = Parandusdroon +unit.draug.name = Kaevandusdroon +unit.phantom.name = Ehitusdroon +unit.dagger.name = Soldat +unit.crawler.name = Plahvataja +unit.titan.name = Kalev +unit.ghoul.name = Pommitaja +unit.wraith.name = Hävitaja +unit.fortress.name = Koljat +unit.revenant.name = Ülestõusnu +unit.eruptor.name = Tulesülgaja +unit.chaos-array.name = Peninukk +unit.eradicator.name = Luupainaja +unit.lich.name = Tulihänd +unit.reaper.name = Vanapagan +tutorial.next = [lightgray] +tutorial.intro = Alustasid[accent] Mindustry mänguõpetusega[].\n[accent]Tuumikust[] väljub sinu [accent]lendmehhaan Ahti[]. Alusta[accent] vase kaevandamisest[]. Selleks liigu tuumiku lähedal asuva vasemaagi juurde ja vajuta sellele.\n\n[accent]{0}/{1} vaske kaevandatud +tutorial.drill = Käsitsi kaevandamine ei ole tõhus.\n[accent]Puurid []kaevandavad automaatselt.\nVajuta all paremas nurgas asuvale puuride nupule.\nVali[accent] harilik puur[]. Aseta üks puur vasemaagile, kasutades [accent]vasakut hiireklikki[].\n[accent]Parem hiireklikk[] peatab ehitamise. [accent]Hoia Ctrl-klahvi ja libista rullikut[], et suumida sisse ja välja. +tutorial.drill.mobile = Käsitsi kaevandamine ei ole tõhus.\n[accent]Puurid []kaevandavad automaatselt.\nVajuta all paremas nurgas asuvale puuride nupule.\nVali[accent] harilik puur[].\nAseta üks puur vasemaagile, , vajutades sellele, ning seejärel vajuta allpool olevale[accent] linnukesele[] valiku kinnitamiseks.\nPaigutuse tühistamiseks vajuta [accent]"X"-nupule[]. +tutorial.blockinfo = Igal konstruktsioonil on erinevad omadused. Iga puuriga on võimalik kaevandada vaid kindlaid maake.\nBloki teabe ja omaduste kuvamiseks vali see menüüst ning vajuta seejärel [accent]"?"-nupule.[]\n\n[accent]Vaata hariliku puuri omadusi.[] +tutorial.conveyor = [accent]Konveiereid[] kasutatakse ressursside vedamiseks tuumikusse.\nMoodusta konveieritest rada puurist tuumikuni.\nRaja moodustamiseks [accent]vajuta vasak hiireklikk alla ja lohista soovitud suunas.[]\nHoia all[accent] Ctrl-klahvi[], et paigutada rada diagonaalselt.\n\n[accent]Aseta paar konveierit ja transpordi ressursid tuumikusse. +tutorial.conveyor.mobile = [accent]Konveiereid[] kasutatakse ressursside vedamiseks tuumikusse.\nMoodusta konveieritest rada puurist tuumikuni.\n[accent] Raja moodustamiseks hoia sõrme mõni sekund all[] ning lohista soovitud suunas.\n\n[accent]Aseta paar konveierit ja transpordi ressursid tuumikusse. +tutorial.turret = Tuumikusse veetud ressursse saab kasutada ehitamiseks.\nPea meeles, et mitte kõiki ressursse ei saa kasutada ehitamiseks.\nRessursse, mida ehitamiseks kasutada ei saa, näiteks[accent] süsi[] või[accent] vanametall[], ei saa ka tuumikusse hoiule panna.\n[scarlet]Vaenlaste tõrjumiseks[] tuleb ehitada kaitsvaid konstruktsioone.\n[accent]Ehita oma baasi lähedale kaksikkahur. +tutorial.drillturret = Kaksikkahurid vajavad tulistamiseks[accent] vasest laskemoona[].\nAseta kaksikkahuri kõrvale puur ja suuna konveierid kahurini, et varustada seda kaevandatud vasega.\n\n[accent]Laskemoona tarnitud: 0/1 +tutorial.pause = Lahingu ajal on võimalik[accent] mängu käik peatada.[]\nPausi ajal on võimalik ehitustööd ootele valmis panna. Pausilt naastes täidetakse need tööd kohe.\n\nMängu peatamiseks vajuta [accent]tühikut. +tutorial.pause.mobile = Lahingu ajal on võimalik[accent] mängu käik peatada.[]\nPausi ajal on võimalik ehitustööd ootele valmis panna. Pausilt naastes täidetakse need tööd kohe.\n\n[accent]Mängu peatamiseks vajuta üleval vasakus nurgas olevale pausinupule. +tutorial.unpause = Nüüd vajuta uuesti tühikut, et mängu naasta. +tutorial.unpause.mobile = Nüüd vajuta seda nuppu uuesti, et mängu naasta. +tutorial.breaking = Sageli on vaja blokke hävitada.\n[accent]Hoia all paremat hiireklahvi[], et hävitada kõik valitud blokid.[]\n\n[accent]Hävita kõik tuumikust vasakule jäävad vanametalli blokid, valides need korraga. +tutorial.breaking.mobile = Sageli on vaja blokke hävitada.\n[accent]Vali alt paremast nurgast blokkide hävitamise režiim[] ning seejärel vajuta blokile, mida soovid hävitada.\nMitme bloki hävitamiseks hoia sõrme mõni sekund all ning lohista üle blokkide.\nVajuta linnukesele, et kinnitada hävitusprotsess.\n\n[accent]Hävita kõik tuumikust vasakule jäävad vanametalli blokid, valides need korraga. +tutorial.withdraw = Mõnikord on vaja ressursse otse mehhaanile kaasa võtta.\nSelleks [accent]vajuta blokile[], milles on ressursid, ja seejärel[accent] vajuta inventaris kuvatud ressursile[].\n[accent]Vajutades ja hoides[] on võimalik ressursse kaasa võtta hulgi.\n\n[accent]Võta tuumikust kaasa vaske.[] +tutorial.deposit = Ressursside mahalaadimiseks lohista ressursid oma mehhaanilt sihtblokini.\n\n[accent]Pane vask tagasi tuumikusse.[] +tutorial.waves = [scarlet]Vaenlane[] läheneb.\n\nKaitse oma tuumikut kahe lahingulaine vältel.[accent] Kliki hiirega[], et oma mehhaanist tulistada.\n[accent]Kaevanda juurde vaske. Ehita uusi puure ja kahureid. +tutorial.waves.mobile = [scarlet]Vaenlane[] läheneb.\n\nKaitse oma tuumikut kahe lahingulaine vältel. Sinu mehhaan tulistab vaenlaseid automaatselt.\n[accent]Kaevanda juurde vaske. Ehita uusi puure ja kahureid. +tutorial.launch = Kui oled kindla arvu lahingulaineid vastu pidanud, on sul võimalik[accent] tuumikuga lendu tõusta[], jättes maha kõik muud ehitised ja[accent] võttes kaasa kõik tuumikus olevad ressursid.[]\nNeid ressursse saab kasutada uute [accent]tehnoloogiate uurimiseks[].\n\n[accent]Vajuta lendu tõusmise nuppu. + +item.copper.description = Peamine materjal, mida kasutatakse igat tüüpi konstruktsioonide ehitamiseks. +item.lead.description = Peamine materjal, mida kasutatakse vedelike transportimise konstruktsioonide ja elektroonikaga seotud konstruktsioonide ehitamiseks. +item.metaglass.description = Ülitugev klaasiühend, mida kasutatakse vedelike transportimise ja hoiustamise konstruktsioonide ehitamiseks. +item.graphite.description = Töödeldud süsinik, mida kasutatakse laskemoona tootmisel ja elektrilise isoleerainena. +item.sand.description = Levinud materjal, mida kasutatakse metallurgias toorainena ja sulamite koostisena. +item.coal.description = Kivistunud taimne mass, mis tekkis ammu enne spooride levimist. Kasutatakse kütusena ja teiste materjalide tootmisel. +item.titanium.description = Haruldane ja imekerge metall, mida kasutatakse puuride, mehhaanide ja vedelike transportimise konstruktsioonide ehitamiseks. +item.thorium.description = Tihke radioaktiivne metall, mida kasutatakse tuumkütusena ja tugevate konstruktsioonide ehitamisel. +item.scrap.description = Vanaaegsete ehitiste ja mahajäetud väeüksuste jäänused, mis sisaldavad väheses koguses erinevaid metalle. +item.silicon.description = Pooljuht, mida kasutatakse päikesepaneelides, keerukates elektroonikaseadmetes ja isejuhtivates rakketides. +item.plastanium.description = Kerge plastiline materjal, mida kasutatakse täiustatud lendmehhaanide ja kildpommide valmistamiseks. +item.phase-fabric.description = Peaaegu kaalutu materjal, mida kasutatakse keerukates elektroonikaseadmetes ja isetaastuvates tehnoloogiates. +item.surge-alloy.description = Täiustatud sulam, millel on ainulaadsed elektrilised omadused. +item.spore-pod.description = Sünteetiline spooride kogum, mis on toodetud atmosfääris leiduvatest kontsentratsioonidest tööstustlikel eesmärkidel. Kasutatakse kütusena, tehisnafta tootmiseks ja lõhkeainete koostisosana. +item.blast-compound.description = Pommides kasutatav ebastabiilne komponent, mis on sünteesitud spoorikobaratest ja teistest lenduvatest ühenditest. Kütusena kasutamine pole soovitatav. +item.pyratite.description = Süüterelvades kasutatav eriti tuleohtlik aine. +liquid.water.description = Kõige kasulikum vedelik, mida kasutatakse masinate jahutamiseks ja tööstuslike jäätmete töötlemisel. +liquid.slag.description = Erinevate sulametallide segu. Võimalik eraldada koostisesse kuuluvateks mineraalideks või kasutada relvana, pihustades seda vaenlase väeüksustele. +liquid.oil.description = Keerukate materjalide tootmisel kasutatav vedelik. Võimalik muundada söeks või kasutada relvana, pihustades seda vaenlase väeüksustele. +liquid.cryofluid.description = Inertne mittesöövitav vedelik, mis saadakse veest ja titaanist. Suure soojusmahtuvusega. Kasutatakse masinate jahutamiseks. +mech.alpha-mech.description = Standardne maapealne mehhaan. Põhineb soldatite väeüksusel, millel on täiustatud soomuskate ja suurem ehitusvõimekus. Suurema kahjuvõimega kui standardne lendmehhaan. +mech.delta-mech.description = Kiire ja kergelt soomustatud maapealne mehhaan, mis on loodud äkkrünnakuteks. Konstruktsioone kahjustab vähe, kuid on oma elektrirelvadega suuteline kiiresti hävitama suuremaid vaenlaste väeüksusi. +mech.tau-mech.description = Tugifunktsioonidega maapealne mehhaan. Parandab liitlaste ehitisi, tulistades neid. Parandab liitlaste mehhaane teatud raadiuses enda ümber. +mech.omega-mech.description = Tugev ja hästi soomustatud maapealne mehhaan frontaalrünnakuteks. Soomuskate kaitseb mehhaani kuni 90% ulatuses. +mech.dart-ship.description = Standardne lendmehhaan. Võrdlemisi kiire ja kerge, kuid madala kahjuvõimega ja madala kaevandamise kiirusega. +mech.javelin-ship.description = Äkkrünnakuteks loodud lendmehhaan. Kuigi hoovõtt on aeglane, saavutab see suure kiiruse ja teeb vaenlastele suuresti kahju, kasutades elektrirelvi\nja rakette. +mech.trident-ship.description = Pommitajast lendmehhaan, millega on võimalik paremini ehitisi konstrueerida ja samas vaenlase kaitserajatisi hävitada. Küllaltki hästi soomustatud. +mech.glaive-ship.description = Tugev ja hästi soomustatud lendmehhaan. Relvastatud leegitseva kuulipilduriga. Väga manööverdusvõimeline. +unit.draug.description = Algeline droon, mis on mõeldud kaevandamiseks. Odav toota, kuid kulukas ülal pidada. Kaevandab automaatselt vaske ja pliid ning transpordib ressursse lähimasse tuumikusse. +unit.spirit.description = Modifitseeritud kaevandusdroon, mis on mõeldud ehitiste automaatseks parandamiseks. +unit.phantom.description = Täiustatud droon, mis järgneb oma liitlastele ja abistab konstruktsioonide ehitamisel. +unit.dagger.description = Kõige elementaarsem maapealne väeüksus, mida on odav toota. Suured parved käivad vaenlastele üle jõu. +unit.crawler.description = Maapealne väeüksus, mis koosneb lihtsast kerest, millele on kinnitatud lõhkeained. Pole eriti vastupidav. Plahvatab kokkupuutel vaenlasega. +unit.titan.description = Täiustatud ja soomustatud maapealne väeüksus. Ründab nii maapealseid kui ka õhus olevaid sihtmärke. Varustatud kahe miniatuurse leegiheitjaga. +unit.fortress.description = Tugev maapealne väeüksus, mis on relvastatud kahe modifitseeritud kauglaskuriga. Need võimaldavad hõlpsasti rünnata kaugel asuvaid vaenlasi ja nende väeüksusi. +unit.eruptor.description = Tugev maapealne väeüksus, mis on loodud konstruktsioonide hävitamiseks. Pritsib vaenlase ehitisi kuuma räbuga, mis sulatab need ning süütab ümbritsevad lenduvad osakesed. +unit.wraith.description = Kiiresti lendav väeüksus, mis sihib generaatoreid. +unit.ghoul.description = Tugev ja lendav lauspommitav väeüksus. Sööstab vaenlaste ja nende ehitiste kohal, sihtides infrastruktuuri kõige olulisemaid osi. +unit.revenant.description = Vastupidav ja lendav väeüksus raketimassiiviga. +block.message.description = Hoiab endas liitlastele olulist sõnumit. +block.graphite-press.description = Surub söekamakaid õhukesteks grafiidilehtedeks. +block.multi-press.description = Grafiidipressi täiustatud versioon, mis kasutab vett ja energiat kiiremaks ja tõhusamaks töötlemiseks. +block.silicon-smelter.description = Toodab räni, redutseerides liiva puhta söega. +block.kiln.description = Sulatab liiva ja plii metaklaasiks. Väike energiatarve. +block.plastanium-compressor.description = Toodab naftast ja titaanist plastiumit. +block.phase-weaver.description = Sünteesib faaskangast radioaktiivsest tooriumist ja liivast. Tohutu energiatarve. +block.alloy-smelter.description = Kombineerib titaaniumi, plii, räni ja vase voogsulamiks. +block.cryofluidmixer.description = Toodab krüovedelikku, segades kokku vee ja peene titaanpulbri. Hädavajalik tooriumreaktori toimimiseks. +block.blast-mixer.description = Purustab spoorikobaraid ja segab neid püratiidiga, et toota lõhkeainet. +block.pyratite-mixer.description = Segab söe, plii ja liiva tuleohtlikuks püratiidiks. +block.melter.description = Sulatab vanametalli räbuks, mida saab kas edasi töödelda või kasutada pritskahurites. +block.separator.description = Eraldab räbu selle koostisesse kuuluvateks mineraalideks. Väljastab jahenenud saadused. +block.spore-press.description = Sünteesib naftat, surudes spoorikobaraid suure rõhu all. +block.pulverizer.description = Purustab vanametalli peeneks liivaks. +block.coal-centrifuge.description = Tahkestab nafta söeks. +block.incinerator.description = Hävitab iga sellesse siseneva ressursi ja vedeliku. +block.power-void.description = Nullib kogu energia. Olemas ainult mänguviisis "Liivakast". +block.power-source.description = Väljastab piiramatult energiat. Olemas ainult mänguviisis "Liivakast". +block.item-source.description = Väljastab piiramatult ressursse. Olemas ainult mänguviisis "Liivakast". +block.item-void.description = Hävitab kõik ressursid. Olemas ainult mänguviisis "Liivakast". +block.liquid-source.description = Väljastab piiramatult vedelikke. Olemas ainult mänguviisis "Liivakast". +block.copper-wall.description = Odav kaitsekonstruktsioon.\nKasulik tuumiku ja kahurite kaitsmiseks esimeste lahingulainete ajal. +block.copper-wall-large.description = Odav kaitsekonstruktsioon.\nKasulik tuumiku ja kahurite kaitsmiseks esimeste lahingulainete ajal.\nUlatub üle mitme bloki. +block.titanium-wall.description = Mõõdukalt tugev kaitsekonstruktsioon.\nPakub keskmist kaitset vaenlaste eest. +block.titanium-wall-large.description = Mõõdukalt tugev kaitsekonstruktsioon.\nPakub keskmist kaitset vaenlaste eest.\nUlatub üle mitme bloki. +block.thorium-wall.description = Tugev kaitsekonstruktsioon.\nPakub head kaitset vaenlaste eest. +block.thorium-wall-large.description = Tugev kaitsekonstruktsioon.\nPakub head kaitset vaenlaste eest.\nUlatub üle mitme bloki. +block.phase-wall.description = Tugev kaitsekonstruktsioon, mis on kaetud erilise faaskangapõhise peegeldava ühendiga. Pakub kaitset peaaegu kõiki tüüpi kuulide ja mürskude eest. +block.phase-wall-large.description = Tugev kaitsekonstruktsioon, mis on kaetud erilise faaskangapõhise peegeldava ühendiga. Pakub kaitset peaaegu kõiki tüüpi kuulide ja mürskude eest.\nUlatub üle mitme bloki. +block.surge-wall.description = Äärmiselt tugev kaitsekonstruktsioon.\nKuulidega kokkupõrkel neelab energiat, vabastades seda suvalistel hetkedel. +block.surge-wall-large.description = Äärmiselt tugev kaitsekonstruktsioon.\nKuulidega kokkupõrkel neelab energiat, vabastades seda suvalistel hetkedel.\nUlatub üle mitme bloki. +block.door.description = Väike uks, mida saab avada ja sulgeda sellele vajutades. +block.door-large.description = Suur uks, mida saab avada ja sulgeda sellele vajutades.\nUlatub üle mitme bloki. +block.mender.description = Parandab perioodiliselt enda ümber olevaid konstruktsioone, hoides neid lahingulainete järel töökorras ja tervena. Ulatuse ja efektiivsuse parendamiseks on võimalik kasutada räni. +block.mend-projector.description = Parandaja täiustatud versioon, mille mõjuala on suurem. Parandab enda ümber olevaid konstruktsioone. Ulatuse ja efektiivsuse parendamiseks on võimalik kasutada faaskangast. +block.overdrive-projector.description = Suurendab enda ümber olevate konstruktsioonide kiirust. Ulatuse ja efektiivsuse parendamiseks on võimalik kasutada faaskangast. +block.force-projector.description = Tekitab enda ümber kuusnurkse energiavälja, mis kaitseb ehitisi ja väeüksuseid. Liigse koormuse korral kuumeneb üle. Ülekuumenemise korral on võimalik kasutada jahutusvedelikke. Mõjuala suurendamiseks on võimalik kasutada faaskangast. +block.shock-mine.description = Peaaegu nähtamatu miin, mis lõhkeb, kui vaenlane sellele astub. +block.conveyor.description = Peamine vahend ressursside transportimiseks. Liigutab ressursse edasi ja hoiustab neid sobilikesse ehitistesse automaatselt. Pööratav. +block.titanium-conveyor.description = Täiustatud konveier, mis liigutab ressursse kiiremini kui tavaline konveier. +block.junction.description = Toimib kui sild samal tasapinnal ristuvate konveierite vahel. Kasulik olukordades, kus kaks konveierit kannavad erinevaid ressursse erinevatesse kohtadesse. +block.bridge-conveyor.description = Spetsiaalne konveier, mis liigutab ressursse üle maastiku ja ehitiste kuni 3 bloki ulatuses. +block.phase-conveyor.description = Täiustatud konveier, mis kasutab energiat ressursside teleportimiseks järgmise samasuguse konveierini üle mitme bloki. +block.sorter.description = Sorteerib ressursse. Kui sisenev ressurss vastab valitud ressursile, siis liigub see otse edasi. Vastasel juhul väljastatakse ressurss vasakule või paremale. +block.router.description = Jaotab ressursse kuni kolmes väljuvas suunas võrdselt. Kasulik olukordades, kus ressursse on vaja korraga saata mitmesse kohta.\n\n[scarlet]Ära kasuta neid tootmismasinate sisendite kõrval, kuna väljund ummistab sisendi.[] +block.distributor.description = Täiustatud jaotur, mis suunab ressursse kuni seitsmes väljuvas suunas võrdselt. +block.overflow-gate.description = Eriline jaotur, mis väljastab vasakule ja paremale ainult siis, kui selle ees olev rada on blokeeritud. +block.mass-driver.description = Ülim ressursside transportimise vahend. Tulistab ressursse pika vahemaa taga asuva vastuvõtva katapuldini. Vajab töötamiseks energiat. +block.mechanical-pump.description = Odav ja aeglane pump, mis ei vaja töötamiseks energiat. +block.rotary-pump.description = Täiustatud pump, mis pumpab paremini kui harilik pump, kuid vajab töötamiseks energiat. +block.thermal-pump.description = Ülim pump, mis vajab töötamiseks palju energiat. +block.conduit.description = Vedelike transportimise vahend, mis liigutab vedelikke edasi. Kasutatakse koos pumpade ja teiste torudega. +block.pulse-conduit.description = Täiustatud toru, mis transpordib ja hoiustab vedelikke kiiremini kui algeline toru. +block.liquid-router.description = Jaotab vedelikke kuni kolmes väljuvas suunas võrdselt. Selle jaoturiga on võimalik teatud koguses ka vedelikku hoiustada. Kasulik olukordades, kus vedelikke on vaja korraga saata mitmesse kohta. +block.liquid-tank.description = Hoiustab suures koguses vedelikke. Kasuta puhvrite loomiseks juhul, kui ressursside nõudlus pole püsiv, või ettevaatusabinõuna tähtsate konstruktsioonide jahutussüsteemides. +block.liquid-junction.description = Toimib kui sild samal tasapinnal ristuvate torude vahel. Kasulik olukordades, kus kaks toru kannavad erinevaid vedelikke erinevatesse kohtadesse. +block.bridge-conduit.description = Spetsiaalne toru, mis liigutab vedelikke üle maastiku ja ehitiste kuni 3 bloki ulatuses. +block.phase-conduit.description = Täiustatud toru, mis kasutab energiat vedelike teleportimiseks järgmise samasuguse toruni üle mitme bloki. +block.power-node.description = Edastab energiat ühendatud sõlmpunktidesse. Sõlmed varustavad energiaga kõiki piisavalt lähedal asuvaid ja sõlmega ühenduses olevaid konstruktsioone. +block.power-node-large.description = Täiustatud energiasõlm, mis on suurema ulatuse ja suurema võimalike ühenduste arvuga. +block.surge-tower.description = Kaugeleulatuv energiasõlm, mis on väiksema võimalike ühenduste arvuga. +block.battery.description = Salvestab energiat puhvrina positiivse energiabilansi ehk ülejäägi korral. Negatiivse energiabilansi ehk defitsiidi korral laetakse salvestatud energiat maha. +block.battery-large.description = Salvestab rohkem energiat kui tavaline aku. +block.combustion-generator.description = Toodab energiat süttivate materjalide, näiteks söe, põletamisel. +block.thermal-generator.description = Toodab energiat kuumades piirkondades. +block.turbine-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. +block.differential-generator.description = Tekitab suurel hulgal energiat. Kasutab ära krüovedeliku ja põleva püratiidi temperatuuride erinevust. +block.rtg-generator.description = Töökindel generaator, mis kasutab radioaktiivsete ühendite lagunemisel eralduvat soojust, et toota sellest aeglasel kiirusel energiat. +block.solar-panel.description = Toodab vähesel määral energiat päikesekiirgusest. +block.solar-panel-large.description = Tavalise päikesepaneeli märkimisväärselt tõhusam versioon. +block.thorium-reactor.description = Toodab tooriumist märkimisväärsel hulgal elektrit. Vajab pidevat jahutamist. Plahvatab ägedalt, kui jahutusvedelikku tarnitakse liiga vähe. +block.impact-reactor.description = Täiustatud generaator, mis on võimeline tootma tohutul hulgal energiat maksimaalse efektiivsusega. Protsessi käivitamiseks on vaja märkimisväärset energiaimpulssi. +block.mechanical-drill.description = Odav puur, mis kaevab ressursse aeglasel kiirusel kuitahes kaua. Ainult põhiressursside kaevandamiseks. +block.pneumatic-drill.description = Täiustatud puur, mis suudab kaevandada titaani. Kaevandab kiiremini kui harilik puur. +block.laser-drill.description = Lasertehnoloogia võimaldab puurida veelgi kiiremini kui pneumaatiline puur. Puur vajab energiat. Võimaldab kaevandada tooriumi. +block.blast-drill.description = Ülim puur, mis vajab töötamiseks suurel hulgal energiat. +block.water-extractor.description = Puurib sügavale ja pumpab põhjavett. Kasutatakse kohtades, kus pinnavett ei leidu. +block.cultivator.description = Kultiveerib atmosfääris madalas kontsentratsioonis leiduvaid spoore tööstuses kasutatavateks spoorikobarateks. +block.oil-extractor.description = Kasutab suures koguses energiat, liiva ja vett nafta puurimiseks. +block.core-shard.description = Tuumiku esimene versioon. Tuumiku hävides kaob ühendus piirkonnaga. +block.core-foundation.description = Tuumiku teine versioon. Tugevam. Hoiustab rohkem ressursse. +block.core-nucleus.description = Tuumiku kolmas ja viimane versioon. Ülimalt tugev. Hoiustab massiivsel hulgal ressursse. +block.vault.description = Hoiustab suurt hulka igat tüüpi ressursse. Hoidlast ressursside kättesaamiseks kasutatakse mahalaadijat. +block.container.description = Hoiustab väikest hulka igat tüüpi ressursse. Hoidlast ressursside kättesaamiseks kasutatakse mahalaadijat. +block.unloader.description = Transpordib ressursse tuumikust ja hoidlatest konveieritele või külgnevatesse ehitistesse. Mahalaetava ressursi tüüpi saab valida mahalaadijale vajutades. +block.launch-pad.description = Saadab ressursse tagasi emalaeva, ilma et oleks vaja tuumikuga lendu tõusta. +block.launch-pad-large.description = Täiustatud stardiplatvorm, mis hoiustab rohkem ressursse ja millelt saadetakse ressursse sagedamini emalaeva. +block.duo.description = Väike ja odav kahur, mis on kasulik maapealsete väeüksuste tõrjumiseks. +block.scatter.description = Õhutõrjekahur, mis tulistab pliid või vanametalli lendavate väeüksuste pihta. +block.scorch.description = Heidab tuld maapealsetele väeüksustele. Eriti efektiivne lähedal asuvate väeüksuste tõrjumiseks. +block.hail.description = Väike ja kaugele sihtiv kahur. +block.wave.description = Keskmise suurusega kahur, mis pritsib vedelikke. Veega varustades kustutab leeke. +block.lancer.description = Keskmise suurusega maapealsete väeüksuste vastane laserkahur, mis tulistab võimsaid energiakiiri. +block.arc.description = Väike kahur, mis tulistab elektriga. +block.swarmer.description = Keskmise suurusega raketikahur, mis ründab nii lendavaid kui ka maapealseid üksuseid. Raketid on isesihtivad. +block.salvo.description = Täiustatud versioon kaksikkahurist, mis tulistab korraga rohkem kuule. +block.fuse.description = Suur lähedale sihtiv energiakahur, mis tulistab kolm läbilõikavat energiakiirt. +block.ripple.description = Äärmiselt võimas kahur, mis tulistab mürske kobaratena kaugete vahemaade taha. +block.cyclone.description = Suur lendavate ja maapealsete väeüksuste vastane kahur, mis tulistab plahvatavaid mürske. +block.spectre.description = Massiivne kaheraudne kahur, mis tulistab soomuskatteid läbistavaid mürske nii lendavate kui ka maapealsete väeüksuste pihta. +block.meltdown.description = Massiivne laserkahur, mis tekitab püsiva energiakiire. Vajab töötamiseks jahutusvedelikku. +block.command-center.description = Jagab liitlaste väeüksustele käske. Kohustab väeüksusi vaenlase tuumikut ründama, põgenema või patrullima. Kui vaenlaste tuumikut ei ole, siis vaikimisi antakse väeüksustele käsk oodata vaenlaste väeüksuste lähenemist ja rünnata. +block.draug-factory.description = Toodab kaevandusdroone. Kaevandusdroonid on mõeldud baasressursside automaatseks kaevandamiseks. +block.spirit-factory.description = Toodab parandusdroone. Parandusdroonid on mõeldud ehitiste automaatseks parandamiseks. +block.phantom-factory.description = Toodab ehitusdroone. Ehitusdroonid järgnevad oma liitlastele ja abistavad konstruktsioonide ehitamisel. +block.wraith-factory.description = Toodab hävitajate väeüksuseid. Hävitajad on kiiresti lendavad väeüksused. +block.ghoul-factory.description = Toodab pommitajate väeüksuseid. Pommitajad on tugevad ja lendavad lauspommitavad väeüksused. +block.revenant-factory.description = Toodab ülestõusnute väeüksuseid. Ülestõusnud on vastupidavad ja lendavad väeüksused raketimassiiviga. +block.dagger-factory.description = Toodab soldatite väeüksuseid. Soldatid on kõige elementaarsemad maapealsed väeüksused. +block.crawler-factory.description = Toodab plahvatajate väeüksuseid. Plahvatajad on maapealsed väeüksused, mis koosnevad lihtsast kerest, millele on kinnitatud lõhkeained. +block.titan-factory.description = Toodab kalevite väeüksuseid. Kalevid on maapealsed väeüksused, mis on relvastatud kahe miniatuurse leegiheitjaga. +block.fortress-factory.description = Toodab koljatite väeüksuseid. Koljatid on tugevad maapealsed väeüksused, mis on relvastatud kahe modifitseeritud kauglaskuriga. +block.repair-point.description = Parandab kõige lähemal asuvat liitlaste väeüksust. +block.dart-mech-pad.description = Võimaldab läbida metamorfoosi standardseks maapealseks mehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. +block.delta-mech-pad.description = Võimaldab läbida metamorfoosi kiireks ja kergelt soomustatud maapealseks mehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. +block.tau-mech-pad.description = Võimaldab läbida metamorfoosi tugifunktsioonidega maapealseks mehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. +block.omega-mech-pad.description = Võimaldab läbida metamorfoosi tugevaks ja hästi soomustatud maapealseks mehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. +block.javelin-ship-pad.description = Võimaldab läbida metamorfoosi äkkrünnakuteks loodud lendmehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. +block.trident-ship-pad.description = Võimaldab läbida metamorfoosi pommitajast lendmehhaaniks, millega on võimalik paremini ehitisi konstrueerida.\nSelleks seisa jaama kohal ja vajuta jaamale. +block.glaive-ship-pad.description = Võimaldab läbida metamorfoosi tugevaks ja hästi soomustatud lendmehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. \ No newline at end of file diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 239532b6f1..45372c50fb 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Pantaila osoa setting.borderlesswindow.name = Ertzik gabeko leihoa[lightgray] (berrabiaraztea behar lezake) setting.fps.name = Erakutsi FPS setting.vsync.name = VSync -setting.lasers.name = Erakutsi energia laserrak setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu) setting.minimap.name = Erakutsi mapatxoa setting.musicvol.name = Musikaren bolumena @@ -557,6 +556,7 @@ setting.crashreport.name = Bidali kraskatze txosten automatikoak setting.savecreate.name = Gorde automatikoki setting.publichost.name = Public Game Visibility setting.chatopacity.name = Txataren opakotasuna +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Utzi eta irten diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index d3ca00c607..1c1b8b6184 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -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.google-play.description = Google play store 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.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.pvp = L'équipe [accent] {0}[] a gagnée ! highscore = [accent]Nouveau meilleur score! + load.sound = Sons load.map = Cartes load.image = Images load.content = Contenus load.system = Système +load.mod = Mods + stat.wave = Vagues vaincues:[accent] {0} stat.enemiesDestroyed = Ennemis détruits:[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.delivered = Ressources transférées: stat.rank = Rang Final: [accent]{0} + 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}[]"? level.highscore = Meilleur score: [accent]{0} -level.select = Sélection de niveau +level.select = Sélection du niveau level.mode = Mode de jeu: showagain = Ne pas montrer la prochaine fois coreattack = [scarlet] @@ -40,7 +45,6 @@ database = Base de données savegame = Sauvegarder la partie loadgame = Charger la partie joingame = Rejoindre une partie -addplayers = Ajouter/Enlever des joueurs customgame = Partie customisée newgame = Nouvelle partie none = @@ -48,18 +52,37 @@ minimap = Minimap close = Fermer website = Site Web quit = Quitter -save.quit = Save & Quit +save.quit = Sauvegarder et Quitter maps = Cartes -maps.browse = Parcourir les Cartes +maps.browse = Parcourir les cartes continue = Continuer maps.none = [lightgray]Aucune carte trouvée! invalid = Invalide -preparingconfig = Préparation de la Configuration -preparingcontent = Préparation du Contenu -uploadingcontent = Publication du Contenu -uploadingpreviewfile = Publication du Fichier d'Aperçu -committingchanges = Validation des Modifications +preparingconfig = Préparation de la configuration +preparingcontent = Préparation du contenu +uploadingcontent = Publication du contenu +uploadingpreviewfile = Publication du fichier d'aperçu +committingchanges = Validation des modifications 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 name = Nom: noname = Commencer par choisir un[accent] nom de joueur[]. @@ -74,21 +97,21 @@ players = {0} joueurs en ligne players.single = {0} joueur en ligne server.closing = [accent]Fermeture 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.vote = Vous avez été expulsé suite à un vote. Au revoir. 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.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.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.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur. 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.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle. 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. 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 @@ -108,7 +131,7 @@ trace.ip = IP: [accent]{0} trace.id = ID Unique : [accent]{0} trace.mobile = Client mobile: [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.none = Aucun joueur banni trouvé! server.admins = Administrateurs @@ -140,7 +163,6 @@ server.port = Port: server.addressinuse = Adresse déjà utilisée! server.invalidport = numéro de port invalide! 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.overwrite = Êtes-vous sûr de vouloir\n écraser cette sauvegarde ? overwrite = Écraser @@ -174,27 +196,29 @@ warning = Avertissement. confirm = Confirmer delete = Supprimer view.workshop = Voir dans le Workshop +workshop.listing = Éditer le listing du Workshop ok = OK open = Ouverture -customize = Personaliser +customize = Personnaliser cancel = Annuler openlink = Ouvrir le lien copylink = Copier le lien back = Retour -data.export = Exporter les Données -data.import = Importer les Données -data.exported = Données Exportées. +data.export = Exporter les données +data.import = Importer les données +data.exported = Données exportées. 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. 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.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... +reloading = [accent]Rechargement des Mods... saving = [accent]Sauvegarde... wave = [accent]Vague {0} wave.waiting = [lightgray]Vague dans {0} -wave.waveInProgress = [lightgray]Wave en cours +wave.waveInProgress = [lightgray]Vague en cours waiting = [lightgray]En attente... waiting.players = En attente de joueurs... 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.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.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.menu = Sélectionnez ce que vous voulez faire avec cette carte. +map.changelog = Changelog (optionnel): eula = CGU de Steam map.publish = Carte publiée. map.publishing = [accent]Publication de la carte... @@ -240,11 +269,11 @@ waves.to = à waves.boss = Boss waves.preview = Prévisualiser waves.edit = Modifier... -waves.copy = Copier dans le Presse-papiers -waves.load = Coller depuis le Presse-papiers -waves.invalid = Vagues invalides dans le Presse-papiers. +waves.copy = Copier dans le presse-papiers +waves.load = Coller depuis le presse-papiers +waves.invalid = Vagues invalides dans le presse-papiers. 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] details = Détails... edit = Modifier... @@ -254,11 +283,11 @@ editor.removeunit = Enlever l'unité editor.teams = Équipe editor.errorload = Erreur lors du chargement 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.errornot = Ceci n'est pas un fichier de carte. 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.randomize = Rendre aléatoire 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.exists = Une carte avec ce nom existe déjà. editor.selectmap = Sélectionnez une carte: + toolmode.replace = Remplacer toolmode.replace.description = Dessiner seulement sur les blocs solides. toolmode.replaceall = Tout remplacer @@ -301,10 +331,11 @@ toolmode.square = Carré toolmode.square.description = Pinceau carré. toolmode.eraseores = Effacer 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.drawteams = Dessiner les équipes toolmode.drawteams.description = Dessine les équipes au lieu de blocs. + filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous. filter.distort = Déformation filter.noise = Bruit @@ -336,6 +367,7 @@ filter.option.floor2 = Sol secondaire filter.option.threshold2 = Seuil secondaire filter.option.radius = Rayon filter.option.percentile = Centile + width = Largeur: height = Hauteur: menu = Menu @@ -344,20 +376,22 @@ campaign = Campagne load = Charger save = Sauvegarder fps = FPS: {0} -tps = TPS: {0} 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 tutorial = Tutoriel -tutorial.retake = Re-Take Tutorial +tutorial.retake = Rejouer le Tutoriel editor = Éditeur mapeditor = Éditeur de carte donate = Faire un\ndon + abandon = Abandonner abandon.text = Cette zone et toutes ses ressources vont être perdues. locked = Verrouillé 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} bestwave = [lightgray]Meilleur: {0} 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. uncover = Découvrir 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}. zone.unlocked = [lightgray]{0} Débloquée. -zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées -zone.config.complete = Vague {0} atteinte:\nConfiguration des ressources emportées possible. +zone.requirement.complete = Exigences pour {0} complétées:[lightgray]\n{1} +zone.config.unlocke = Configuration des ressources emportées débloquée:[lightgray]\n{0} 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.attack = Détruire le noyau ennemi add = Ajouter... boss.health = Santé du Boss + connectfail = [crimson]Échec de la connexion au serveur :\n\n[accent]{0} error.unreachable = Serveur injoignable.\nL'adresse IP est correcte? 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.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.mapnotfound = Carte introuvable! error.io = Erreur de Réseau (I/O) 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.desertWastes.name = Désert Sauvage zone.craters.name = Les Cratères zone.frozenForest.name = Forêt Glaciale 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.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.saltFlats.name = Marais Salants zone.impact0078.name = Impact 0078 zone.crags.name = Rochers 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.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.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.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é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.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.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.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.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 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.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.impact0078.description = zone.crags.description = + settings.language = Langue settings.data = Données du Jeu -settings.reset = Valeurs par Défaut. +settings.reset = Valeurs par Défaut settings.rebind = Réattribuer settings.controls = Contrôles settings.game = Jeu @@ -427,16 +467,15 @@ settings.sound = Son settings.graphics = Graphismes 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.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.clearunlocks = Effacer la progression -settings.clearall = Tout effacer +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. paused = [accent]< Pause > +clear = Effacer +banned = [scarlet]Bannis yes = Oui no = Non info.title = Info error.title = [crimson]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.output = Output blocks.booster = Booster @@ -458,20 +497,21 @@ blocks.itemcapacity = Stockage blocks.basepowergeneration = Taux d'énergie normale blocks.productiontime = Durée de production 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.drilltier = Forable blocks.drillspeed = Vitesse de forage de base -blocks.boosteffect = Boost Effect +blocks.boosteffect = Effet du Boost blocks.maxunits = Unités actives max blocks.health = Santé blocks.buildtime = Durée de construction -blocks.buildcost = Coût de Construction +blocks.buildcost = Coût de construction blocks.inaccuracy = Imprécision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munitions -bar.drilltierreq = Foreuse Ameliorée Requise + +bar.drilltierreq = Foreuse Améliorée Requise bar.drillspeed = Vitesse de forage: {0}/s bar.efficiency = Efficacité: {0}% bar.powerbalance = Énergie: {0}/s @@ -485,6 +525,7 @@ bar.heat = Chaleur bar.power = Énergie bar.progress = Progression de la construction bar.spawned = Unités: {0}/{1} + bullet.damage = [stat]{0}[lightgray] dégâts bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs bullet.incendiary = [stat]incendiaire @@ -496,6 +537,7 @@ bullet.freezing = [stat]gel bullet.tarred = [stat]goudronné bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions bullet.reload = [stat]{0}[lightgray]x vitesse de tir + unit.blocks = blocs unit.powersecond = énergie/seconde unit.liquidsecond = unité de liquide/seconde @@ -520,15 +562,15 @@ setting.shadows.name = Ombres setting.linear.name = Filtrage Linéaire setting.animatedwater.name = Eau animée 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.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.fpscap.name = FPS Max setting.fpscap.none = Aucun 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.difficulty.training = Entraînement setting.difficulty.easy = Facile @@ -542,12 +584,11 @@ setting.sensitivity.name = Sensibilité de la manette setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} secondes 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.vsync.name = VSync -setting.lasers.name = Afficher les connections Électriques 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.ambientvol.name = Volume Ambiant 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.publichost.name = Visibilité de la Partie Publique setting.chatopacity.name = Opacité du Chat +setting.lasersopacity.name = Power Laser Opacity 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 setting.bloom.name = Flou lumineux -keybind.title = Racourcis Clavier -keybinds.mobile = [scarlet]La plupart des racourcis claviers ne sont pas fonctionnels sur mobile. Seuls les mouvements basiques sont supportés. +keybind.title = Raccourcis Clavier +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.view.name = Voir category.multiplayer.name = Multijoueur @@ -580,10 +623,10 @@ keybind.fullscreen.name = Basculer en Plein Écran keybind.select.name = Sélectionner/Tirer keybind.diagonal_placement.name = Placement en diagonale 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.shoot.name = Tirer -keybind.zoom_hold.name = Maintenir le zoom +keybind.zoom_hold.name = Maintenir pour zoomer keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause @@ -593,6 +636,7 @@ keybind.chat.name = Chat keybind.player_list.name = Liste des joueurs keybind.console.name = Console keybind.rotate.name = Tourner +keybind.rotateplaced.name = Tourner existant (maintenir) keybind.toggle_menus.name = Cacher/afficher les menus keybind.chat_history_prev.name = Remonter 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 mode.help.title = Description des modes de jeu 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.description = Ressources infinies et pas de minuterie pour les vagues. +mode.editor.name = Editeur 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.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.custom = Règles personnalisées + rules.infiniteresources = Ressources infinies rules.wavetimer = Minuterie pour les 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.playerhealthmultiplier = Multiplicateur de Santé des 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.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.buildcostmultiplier = Multiplicateur du prix de construction rules.buildspeedmultiplier = Multiplicateur du temps de construction @@ -635,6 +681,7 @@ rules.title.resourcesbuilding = Ressources & Construction rules.title.player = Joueurs rules.title.enemy = Ennemis rules.title.unit = Unités + content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités @@ -674,7 +721,7 @@ mech.omega-mech.weapon = Missiles Essaim mech.omega-mech.ability = Armure mech.dart-ship.name = Dard mech.dart-ship.weapon = Mitraillette -mech.javelin-ship.name = Javelin +mech.javelin-ship.name = Javelot mech.javelin-ship.weapon = Missiles Rafale mech.javelin-ship.ability = Décharge de Propulseur 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.viscosity = [LIGHT_GRAY]Viscosité: {0} liquid.temperature = [LIGHT_GRAY]Température: {0} + block.sand-boulder.name = Bloc de Sable block.grass.name = Herbe block.salt.name = Sel @@ -706,14 +754,14 @@ block.sandrocks.name = Roches de sable block.spore-pine.name = Pin Sporifié block.sporerocks.name = Roche Sporeuse block.rock.name = Roche -block.snowrock.name = Roches enneigés +block.snowrock.name = Roches enneigées block.snow-pine.name = Pin enneigé block.shale.name = Schiste block.shale-boulder.name = Blocs de Schiste block.moss.name = Mousse block.shrubs.name = Arbustes 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-large.name = Mur de Ferraille Large 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.deepwater.name = Eau profonde block.water.name = Eau -block.tainted-water.name = Eau Teintée -block.darksand-tainted-water.name = Sable Teinté d'Eau Sombre +block.tainted-water.name = Eau Contaminée +block.darksand-tainted-water.name = Sable Sombre Mouillé Contaminé block.tar.name = Pétrole block.stone.name = Roche block.sand.name = Sable @@ -739,7 +787,7 @@ block.ice.name = Glace block.snow.name = Neige block.craters.name = Cratères 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.holostone.name = Pierre Holographique block.ice-snow.name = Neige Gelée @@ -800,9 +848,9 @@ block.melter.name = Four à Fusion block.incinerator.name = Incinérateur block.spore-press.name = Presse à Spore 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-large.name = Gros Transmetteur Énergétique +block.power-node-large.name = Grand Transmetteur Énergétique block.surge-tower.name = Tour de Surtension block.battery.name = Batterie block.battery-large.name = Grande Batterie @@ -817,7 +865,7 @@ block.water-extractor.name = Extracteur d'Eau block.cultivator.name = Cultivateur block.dart-mech-pad.name = Reconstructeur de Mécha Dard 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.glaive-ship-pad.name = Reconstructeur de Vaisseau Glaive 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.crawler-factory.name = Usine de Méchas Rampeurs 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.repair-point.name = Point de Réparation block.pulse-conduit.name = Conduit à Impulsion @@ -908,26 +956,27 @@ unit.lich.name = Liche unit.reaper.name = Faucheur tutorial.next = [lightgray] 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.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 = 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.\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.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.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.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.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.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.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é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 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 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 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.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.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.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.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.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.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.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.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]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é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écédemment dans le noyau.[] +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\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 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.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.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. @@ -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.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.surge-alloy.description = Un alliage avancé avec des propriétés électriques avancées. -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.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 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.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.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. 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.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.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.trident-ship.description = Un bombardier lourd, concu 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.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, 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é. É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.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.dagger.description = L'unité de sol de base. Coute pas cher à produire. Est écrasant 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.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.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.dagger.description = L'unité terrestre de base. Coûte peu cher à produire. Implacable lorsqu'il est utilisé en essaims. +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. Équipé de deux lance-flammes miniatures de type Brûleur. +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.wraith.description = Une unité d'interception rapide et de frappe. 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.revenant.description = Un arsenal de missiles lourd et planant. +unit.wraith.description = Une unité d'interception rapide de harcelement. Cible les générateurs d'énergie. +unit.ghoul.description = Un bombardier lourd de barrage. Fend a travers les lignes ennemies, ciblant les infrastructures critiques. +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.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.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.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.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.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.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.spore-press.description = Compresses spore pods into oil. -block.pulverizer.description = Écrase la pierre 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.incinerator.description = Permet de se débarasser de n'importe quel objet ou liquide en exces . +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 = Compresse les glandes de spore sous une pression extrême pour synthétiser du pétrole. +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 = Solidifie le pétrole en blocs de charbon. +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-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-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.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.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. -block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. +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 = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis. +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-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-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-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-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.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = Soigne périodiquement les batiments autour de lui. -block.overdrive-projector.description = Accélère les batiments autour de lui, notamment les foreuses et les convoyeurs. -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.shock-mine.description = Blesse les ennemis qui marchent dessus. Quasiment invisble 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.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 = 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 = 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 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 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 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 bâtiments. Peut être tourné. 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.bridge-conveyor.description = bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou batiment. -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.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 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.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.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.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.rotary-pump.description = Une pompe avancée qui double sa vitesse en 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.rotary-pump.description = Une pompe avancée plus rapide mais utilisant de l'énergie. +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.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-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-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 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.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.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-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.surge-tower.description = An extremely long-range power node with fewer available connections. -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.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, connectant d'autant plus de consommateurs ou transmetteurs d'énergie. +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 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.combustion-generator.description = Génère de l'énergie en brûlant du pétrole ou des matériaux inflammables. -block.thermal-generator.description = Génère une grande quantité d'énergie à partir de lave . +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 zone de chaleur . 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.solar-panel.description = Génère une faible quantité d'énergie . -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.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.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.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.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.blast-drill.description = La Foreuse ultime . Demande une grande quantité d'énergie . +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, 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.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.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-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.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.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. +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.launch-pad.description = Permet de transférer des ressources sans attendre le lancement du noyau. +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.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.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.arc.description = Une petite tourelle tirant des arcs électrques vers les ennemis. -block.swarmer.description = Une tourelle de taille moyenne qui tire des missiles qui se dispersent. +block.arc.description = Une petite tourelle tirant des arcs électriques vers les ennemis. +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.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.cyclone.description = Une grande tourelle tirant rapidement ... très rapidement. -block.spectre.description = Une grande tourelle qui tire deux puissantes balles simultanément. +block.cyclone.description = Une grande tourelle tirant rapidement... très rapidement. +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.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.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.wraith-factory.description = Produit des intercepteurs rapides qui harcèlent l'ennemi. block.ghoul-factory.description = Produit des bombardiers lourds. block.revenant-factory.description = Produit des unités terrestres lourdes avec des lasers. 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.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.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.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.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. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index c8f6705117..63c8e1e3da 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -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.fps.name = Afficher FPS setting.vsync.name = VSync -setting.lasers.name = Afficher les rayons des lasers setting.pixelate.name = Pixélisé [LIGHT_GRAY](peut diminuer les performances)[] setting.minimap.name = Montrer la minimap 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.publichost.name = Public Game Visibility setting.chatopacity.name = Opacité du tchat +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Annuler et quitter diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 3bcca3a7c8..6fffc0d1b4 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Layar Penuh setting.borderlesswindow.name = Jendela tak Berbatas[LIGHT_GRAY] (bisa membutuhkan restart) setting.fps.name = Tunjukkan FPS setting.vsync.name = VSync -setting.lasers.name = Tunjukkan Laser setting.pixelate.name = Mode Pixel[LIGHT_GRAY] (menonaktifkan animasi) setting.minimap.name = Tunjukkan Peta kecil setting.musicvol.name = Volume Musik @@ -557,6 +556,7 @@ setting.crashreport.name = Laporkan Masalah setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Jelas-Beningnya Chat +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bace89f989..1f4dcd4947 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -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 contributors = Traduttori e Contributori 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.google-play.description = Elenco di Google Play Store 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.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera. gameover = Il nucleo è stato distrutto. @@ -25,7 +25,7 @@ stat.wave = Ondate sconfitte:[accent] {0} stat.enemiesDestroyed = Nemici distrutti:[accent] {0} stat.built = Costruzioni erette:[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.rank = Livello finale: [accent]{0} launcheditems = [accent]Oggetti lanciati @@ -48,18 +48,18 @@ minimap = Minimappa close = Chiuso website = Website quit = Esci -save.quit = Save & Quit +save.quit = Salva ed esci maps = Mappe -maps.browse = Browse Maps +maps.browse = Consulta Mappe continue = Continua maps.none = [LIGHT_GRAY]Nessuna mappa trovata! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done +invalid = Invalido +preparingconfig = Preparo la configurazione +preparingcontent = Preparo il contenuto +uploadingcontent = Carico il contenuto +uploadingpreviewfile = Carico file di anteprima +committingchanges = Applico le modifiche +done = Fatto about.button = Info name = Nome: noname = Scegli un [accent] nome[] prima di unirti. @@ -74,31 +74,31 @@ players = {0} giocatori online players.single = {0} giocatori online server.closing = [accent]Chiusura 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.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.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare! server.kicked.banned = Sei bannato da questo server. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. +server.kicked.typeMismatch = Questo server non è comparibile con la tua build. +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.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.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.gameover = Game over! 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. -hostserver = Host Server -invitefriends = Invite Friends -hostserver.mobile = Host\nServer +hostserver = Ospita Server +invitefriends = Invita amici +hostserver.mobile = Ospita\nServer host = Host hosting = [accent] Apertura del server ... hosts.refresh = Aggiorna hosts.discovering = Ricerca partite LAN -hosts.discovering.any = Discovering games +hosts.discovering.any = Ricerca partite server.refreshing = Aggiornamento del server hosts.none = [lightgray]Nessuna partita LAN trovata! host.invalid = [scarlet]Impossibile connettersi all'host. @@ -122,7 +122,7 @@ server.version = [lightgray]Versione: {0} server.custombuild = [yellow] Costruzione personalizzata confirmban = Sei sicuro di voler bandire 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? confirmadmin = Sei sicuro di voler rendere questo giocatore un amministratore? 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.timeout = Timed out. 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.data = [accent]Caricamento dei dati del mondo ... server.port = Porta: @@ -145,7 +145,7 @@ save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? overwrite = Sovrascrivi save.none = Nessun salvataggio trovato! -saveload = [Accent]Salvataggio ... +saveload = [accent]Salvataggio ... savefail = [crimson]Salvataggio del gioco NON riuscito! save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio? save.delete = Elimina @@ -159,7 +159,7 @@ save.rename = Rinomina save.rename.text = Nuovo nome: selectslot = Seleziona un salvataggio. slot = [accent]Slot {0} -editmessage = Edit Message +editmessage = Modifica messaggio save.corrupted = [orang]Salvataggio corrotto o non valido! empty = on = On @@ -173,7 +173,7 @@ save.playtime = Tempo di gioco: {0} warning = Attenzione confirm = Conferma delete = Elimina -view.workshop = View In Workshop +view.workshop = Vedi nel Workshop ok = OK open = Apri customize = Personalizza @@ -183,17 +183,17 @@ copylink = Copia link back = Indietro data.export = Esporta Salvataggio data.import = Importa Salvataggio -data.exported = Data exported. -data.invalid = This isn't valid game data. -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.exported = Dati esportati. +data.invalid = Questi non sono dati di gioco validi. +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.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.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 ... saving = [accent]Salvando ... wave = [accent]Ondata {0} -wave.waiting = Ondata tra {0} +wave.waiting = [LIGHT_GRAY]Ondata tra {0} wave.waveInProgress = [LIGHT_GRAY]Ondata in corso... waiting = In attesa... 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.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.publish.error = Error publishing map: {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.error = Errore durante la pubblicazione della mappa:\n{0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +map.publish = Mappa pubblicata. +map.publishing = [accent]Pubblico la mappa... editor.brush = Pennello editor.openin = Apri nell'editor editor.oregen = Generazione dei minerali @@ -222,12 +222,12 @@ editor.oregen.info = Generazione dei minerali: editor.mapinfo = Informazioni mappa editor.author = Autore: 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.rules = Regole: editor.generation = Generazione: editor.ingame = Modifica in gioco -editor.publish.workshop = Publish On Workshop +editor.publish.workshop = Pubblica sul Workshop editor.newmap = Nuova mappa workshop = Workshop waves.title = Ondate @@ -246,7 +246,7 @@ waves.invalid = Onde dagli appunti non valide. waves.copied = Onde copiate. waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. editor.default = [LIGHT_GRAY] -details = Details... +details = Dettagli... edit = Modifica... editor.name = Nome: 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.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.errornot = This is not a map file. +editor.errornot = Questo file non è una mappa. editor.errorheader = Questo file della mappa è invalido o corrotto. editor.errorname = Questa mappa è senza nome. editor.update = Aggiorna @@ -280,16 +280,16 @@ editor.importimage.description = Importa immagine esterna terreno editor.export = Esportazione... editor.exportfile = Esporta file editor.exportfile.description = Esporta file mappa -editor.exportimage = Esporta immagine terreno +editor.exportimage = Esporta immagine editor.exportimage.description = Esporta file immagine mappa editor.loadimage = Carica\nimmagine editor.saveimage = Salva\nImmagine editor.unsaved = [scarlet]Hai modifiche non salvate![]\nSei sicuro di voler uscire? editor.resizemap = Ridimensiona la 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.exists = A map with this name already exists. +editor.exists = Esiste già una mappa con questo nome. editor.selectmap = Seleziona una mappa da caricare: toolmode.replace = Rimpiazzare 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 configure = Configura 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.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti. zone.config.complete = Ondata {0} raggiunta:\nEquipaggiamento personalizzato sbloccato. @@ -420,7 +420,7 @@ zone.crags.description = settings.language = Lingua settings.data = Importa/Esporta salvataggio settings.reset = Resetta Alle Impostazioni Predefinite -settings.rebind = Reimposta +settings.rebind = Modifica settings.controls = Controlli settings.game = Gioco settings.sound = Suoni @@ -490,10 +490,10 @@ bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray] bullet.incendiary = [stat]incendiario bullet.homing = [stat]autoguidato bullet.shock = [stat]stordente -bullet.frag = [stat]frammentazione +bullet.frag = [stat]a frammentazione bullet.knockback = [stat]{0}[lightgray] contraccolpo -bullet.freezing = [stat]congelamento -bullet.tarred = [stat]asfaltata +bullet.freezing = [stat]congelante +bullet.tarred = [stat]viscoso bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni bullet.reload = [stat]{0}[lightgray]x ricarica unit.blocks = blocchi @@ -523,18 +523,18 @@ setting.animatedshields.name = Scudi animati setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[] setting.indicators.name = Indicatori Alleati setting.autotarget.name = Mira automatica -setting.keyboard.name = Controlli Mouse+Tastiera +setting.keyboard.name = Tastiera setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Limite FPS setting.fpscap.none = Niente setting.fpscap.text = {0} FPS setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[] setting.swapdiagonal.name = Posizionamento sempre diagonale -setting.difficulty.training = formazione -setting.difficulty.easy = facile -setting.difficulty.normal = medio -setting.difficulty.hard = difficile -setting.difficulty.insane = impossibile +setting.difficulty.training = Allenamento +setting.difficulty.easy = Facile +setting.difficulty.normal = Medio +setting.difficulty.hard = Difficile +setting.difficulty.insane = Impossibile setting.difficulty.name = Difficoltà: setting.screenshake.name = Movimento dello schermo 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.fps.name = Mostra FPS setting.vsync.name = VSync -setting.lasers.name = Mostra Laser Energetici setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento) setting.minimap.name = Mostra minimappa setting.musicvol.name = Volume Musica @@ -554,9 +553,10 @@ setting.mutemusic.name = Silenzia musica setting.sfxvol.name = Volume Effetti setting.mutesound.name = Togli suoni setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente -setting.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility +setting.savecreate.name = Autosalvataggio +setting.publichost.name = Gioco visibile pubblicamente setting.chatopacity.name = Opacità chat +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Annulla ed esci @@ -567,33 +567,33 @@ category.general.name = Generale category.view.name = Visualizzazione category.multiplayer.name = Multigiocatore command.attack = Attacca -command.rally = Rally -command.retreat = Torna indietro +command.rally = Guardia +command.retreat = Ritirata keybind.gridMode.name = Seleziona blocco keybind.gridModeShift.name = Seleziona categoria keybind.press = Premi un tasto... keybind.press.axis = Premi un'asse o un tasto... keybind.screenshot.name = Screenshot della mappa -keybind.move_x.name = Sposta_x -keybind.move_y.name = Sposta_y -keybind.fullscreen.name = Toggle Fullscreen -keybind.select.name = seleziona +keybind.move_x.name = Muovi orizzontale +keybind.move_y.name = Muovi verticale +keybind.fullscreen.name = Schermo Intero +keybind.select.name = Seleziona keybind.diagonal_placement.name = Posizionamento diagonale keybind.pick.name = Scegli Blocco keybind.break_block.name = Rompi blocco keybind.deselect.name = Deseleziona -keybind.shoot.name = spara -keybind.zoom_hold.name = attiva zoom -keybind.zoom.name = esegui zoom -keybind.menu.name = menu -keybind.pause.name = pausa +keybind.shoot.name = Spara +keybind.zoom_hold.name = Attiva zoom +keybind.zoom.name = Esegui zoom +keybind.menu.name = Apri Menu +keybind.pause.name = Pausa keybind.minimap.name = Minimappa keybind.dash.name = Scatto keybind.chat.name = Chat -keybind.player_list.name = lista_giocatori -keybind.console.name = console +keybind.player_list.name = Lista dei Giocatori +keybind.console.name = Console 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_next.name = Scorri chatt verso il basso 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.pvp.name = PvP 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.custom = Regole personalizzate rules.infiniteresources = Risorse infinite @@ -614,7 +614,7 @@ rules.wavetimer = Timer ondate rules.waves = Ondate rules.attack = Modalità attacco rules.enemyCheat = Infinite Risorse AI -rules.unitdrops = Drops Unità +rules.unitdrops = Generazione Unità rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità rules.unithealthmultiplier = Moltiplicatore vita unità rules.playerhealthmultiplier = Moltiplicatore vita giocatore @@ -626,7 +626,7 @@ rules.wavespacing = Tempo fra ondate:[LIGHT_GRAY] (secondi) rules.buildcostmultiplier = Moltiplicatore costo costruzione rules.buildspeedmultiplier = Moltiplicatore velocità costruzione 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.limitedRespawns = Limite rigenerazioni 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-metal.name = Metallo Scuro block.ignarock.name = Roccia Ignea -block.hotrock.name = Roccia bollente -block.magmarock.name = Roccia magmatica +block.hotrock.name = Roccia Bollente +block.magmarock.name = Roccia Magmatica block.cliffs.name = Scogliere block.copper-wall.name = Muro 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.lancer.name = Lanciere block.conveyor.name = Nastro trasportatore -block.titanium-conveyor.name = Nastro trasportatore avanzato -block.armored-conveyor.name = Armored Conveyor -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.titanium-conveyor.name = Nastro avanzato +block.armored-conveyor.name = Nastro corazzato +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.router.name = Distributore 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.trident-ship-pad.name = Piattaforma della Nave Tridente block.glaive-ship-pad.name = Piattaforma della Nave Glaive -block.omega-mech-pad.name = Piattaforma della Nave Omega -block.tau-mech-pad.name = Piattaforma della Nave Tau +block.omega-mech-pad.name = Piattaforma del Mech Omega +block.tau-mech-pad.name = Piattaforma del Mech Tau block.conduit.name = Condotta block.mechanical-pump.name = Pompa meccanica 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.fuse.name = Frantume 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.arc.name = Arco Elettrico -block.rtg-generator.name = Generatore Termico ai Radioisotopi +block.rtg-generator.name = Generatore RTG block.spectre.name = Spettro block.meltdown.name = Fusione block.container.name = Contenitore @@ -907,25 +907,25 @@ unit.eradicator.name = Estirpatore unit.lich.name = Lich unit.reaper.name = Mietitore tutorial.next = [lightgray] -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.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.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.conveyor = [accent] I nastri trasportatori [] sono usati per trasportare oggetti al nocciolo. \n Crea una linea di nastri dalla trivella al nocciolo. +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 = 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 = 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. 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 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.turret = Strutture difensive devono essere costruite per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta a due 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.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.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base. +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.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.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.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.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.deposit = Deposita gli oggetti in blocchi trascinandoli dalla tua nave al blocco di destinazione. \n\n[accent] Riporta 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.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.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.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 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.\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 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.\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 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. +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.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. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 4ab893b67c..1c6a12369c 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -48,7 +48,7 @@ minimap = ミニマップ close = 閉じる website = ウェブサイト quit = 終了 -save.quit = Save & Quit +save.quit = セーブして終了 maps = マップ maps.browse = マップを閲覧する continue = 続ける @@ -173,7 +173,7 @@ save.playtime = プレイ時間: {0} warning = 警告 confirm = 確認 delete = 削除 -view.workshop = View In Workshop +view.workshop = ワークショップを見る ok = OK open = 開く customize = カスタマイズ @@ -222,7 +222,7 @@ editor.oregen.info = 鉱石の生成: editor.mapinfo = マップ情報 editor.author = 作者: editor.description = 説明: -editor.nodescription = A map must have a description of at least 4 characters before being published. +editor.nodescription = マップを公開するには、少なくとも4文字以上の説明が必要です。 editor.waves = ウェーブ: editor.rules = ルール: editor.generation = 生成: @@ -289,7 +289,7 @@ editor.resizemap = マップをリサイズ editor.mapname = マップ名: editor.overwrite = [accent]警告!\nすでに存在するマップを上書きします。 editor.overwrite.confirm = [scarlet]警告![] すでに同じ名前のマップが存在します。上書きしてもよろしいですか? -editor.exists = A map with this name already exists. +editor.exists = すでに同じ名前のマップが存在します。 editor.selectmap = 読み込むマップを選択: toolmode.replace = 置きかえ toolmode.replace.description = 固体ブロックのみに描きます。 @@ -340,7 +340,7 @@ width = 幅: height = 高さ: menu = メニュー play = プレイ -campaign = 遠征 +campaign = プレイ load = 読み込む save = 保存 fps = FPS: {0} @@ -354,18 +354,18 @@ editor = エディター mapeditor = マップエディター donate = 寄付 abandon = 撤退 -abandon.text = このゾーンとすべての資源が敵に奪われます。 +abandon.text = このゾーンのすべての資源が敵に奪われます。 locked = ロック complete = [lightgray]達成済み: zone.requirement = ゾーン {1} でウェーブ {0} を達成 resume = 再開ゾーン:\n[lightgray]{0} bestwave = [lightgray]最高ウェーブ: {0} -launch = < 離脱 > -launch.title = 離脱成功 -launch.next = [lightgray]次は ウェーブ {0} で離脱可能です。 -launch.unable2 = [scarlet]離脱できません。[] -launch.confirm = すべての資源をコアに搬入し、離脱します。\nもうこの基地には戻ってくることはできません。 -launch.skip.confirm = スキップすると、次の離脱可能なウェーブまで離脱できません。 +launch = < 発射 > +launch.title = 発射成功 +launch.next = [lightgray]次は ウェーブ {0} で発射可能です。 +launch.unable2 = [scarlet]発射できません。[] +launch.confirm = すべての資源をコアに搬入し、発射します。\nもうこの基地には戻ってくることはできません。 +launch.skip.confirm = スキップすると、次の発射可能なウェーブまで発射できません。 uncover = 開放 configure = 積み荷の設定 configure.locked = [lightgray]ウェーブ {0} を達成すると積み荷を設定できるようになります。 @@ -375,14 +375,14 @@ zone.requirement.complete = ウェーブ {0} を達成:\n{1} の開放条件を zone.config.complete = ウェーブ {0} を達成:\n積み荷の設定が解除されました。 zone.resources = 発見した資源: zone.objective = [lightgray]目標: [accent]{0} -zone.objective.survival = 生き残る +zone.objective.survival = 敵からコアを守り切る zone.objective.attack = 敵のコアを破壊する add = 追加... boss.health = ボスのHP connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0} error.unreachable = サーバーに到達できません。\nアドレスは正しいですか? error.invalidaddress = 無効なアドレスです。 -error.timedout = タイムアウトしました!\nホストがポート開放されているかを確認してください。また、このアドレスは無効なアドレスではありません! +error.timedout = タイムアウトしました!\nホストがポート開放されているかを確認してください。 error.mismatch = パケットエラー:\n恐らくクライアント/サーバーのバージョンが一致していません。\nゲームとサーバーが最新版のMindustryかどうかを確認してください! error.alreadyconnected = すでに接続されています。 error.mapnotfound = マップファイルが見つかりません! @@ -524,7 +524,7 @@ setting.antialias.name = アンチエイリアス[lightgray] (再起動が必要 setting.indicators.name = 敵/味方の方角表示 setting.autotarget.name = オートターゲット setting.keyboard.name = マウスとキーボード操作 -setting.touchscreen.name = Touchscreen Controls +setting.touchscreen.name = タッチスクリーン操作 setting.fpscap.name = 最大FPS setting.fpscap.none = なし setting.fpscap.text = {0} FPS @@ -545,7 +545,6 @@ setting.fullscreen.name = フルスクリーン setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります) setting.fps.name = FPSを表示 setting.vsync.name = VSync -setting.lasers.name = 電力線を表示 setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます) setting.minimap.name = ミニマップを表示 setting.musicvol.name = 音楽 音量 @@ -557,6 +556,7 @@ setting.crashreport.name = 匿名でクラッシュレポートを送信する setting.savecreate.name = 自動保存 setting.publichost.name = 誰でもゲームに参加できるようにする setting.chatopacity.name = チャットの透明度 +setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = ゲーム内にチャットを表示 uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります... uiscale.cancel = キャンセル & 終了 @@ -784,8 +784,8 @@ block.hail.name = ヘイル block.lancer.name = ランサー block.conveyor.name = コンベアー block.titanium-conveyor.name = チタンコンベアー -block.armored-conveyor.name = Armored Conveyor -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.name = 装甲コンベア +block.armored-conveyor.description = チタンコンベアーと同じ速度でアイテムを輸送することができ、耐久性に優れています。\nまた、ほかのコンベアーからの側面からの入力は受け取ることができません。 block.junction.name = ジャンクション block.router.name = ルーター block.distributor.name = ディストリビューター @@ -965,7 +965,7 @@ unit.eruptor.description = 建造物を破壊することに特化したユニ unit.wraith.description = 高速で突撃攻撃が可能な迎撃ユニットです。 unit.ghoul.description = 重爆撃機です。敵の重要な建造物を優先して破壊します。 unit.revenant.description = 空中からミサイルを発射する重爆撃機です。 -block.message.description = Stores a message. Used for communication between allies. +block.message.description = メッセージを保存し、仲間間の通信に使用します。 block.graphite-press.description = 石炭を圧縮し、黒鉛を生成します。 block.multi-press.description = 黒鉛圧縮機のアップグレード版です。水と電力を使用して、より効率的に石炭を圧縮します。 block.silicon-smelter.description = 石炭と砂からシリコンを製造します。 @@ -1082,7 +1082,7 @@ block.repair-point.description = 近くの負傷したユニットを修復し block.dart-mech-pad.description = 機体を基本的な攻撃性能を備えた機体に乗り換えます。\n整備台に乗ってタップすることで使用できます。 block.delta-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.trident-ship-pad.description = 機体を重装備の爆撃機に乗り換えます。\n整備台に乗ってタップすることで使用できます。 block.glaive-ship-pad.description = 機体を重装備の大型攻撃機に乗り換えます。\n整備台に乗ってタップすることで使用できます。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index c3a679fba3..2a9b87e76b 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -16,11 +16,14 @@ screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가 gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]최고점수 달성! + load.sound = 소리 load.map = 맵 load.image = 사진 load.content = 컨텐츠 load.system = 시스템 +load.mod = 모드 + stat.wave = 버틴 단계 수 : [accent]{0} stat.enemiesDestroyed = 파괴한 적 수 : [accent]{0} stat.built = 건설한 건물 수 : [accent]{0} @@ -28,7 +31,9 @@ stat.destroyed = 파괴된 건물 수 : [accent]{0} stat.deconstructed = 파괴한 건물 수 : [accent]{0} stat.delivered = 획득한 자원 : stat.rank = 최종 점수: [accent]{0} + launcheditems = [accent]창고 +launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 획득합니다. map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? level.highscore = 최고 점수 : [accent]{0} level.select = 맵 선택 @@ -40,7 +45,6 @@ database = 코어 기록보관소 savegame = 게임 저장 loadgame = 게임 불러오기 joingame = 서버 접속 -addplayers = 플레이어 추가/제거 customgame = 사용자 정의 게임 newgame = 새 게임 none = <없음> @@ -60,16 +64,35 @@ uploadingcontent = 컨텐츠 업로드 uploadingpreviewfile = 미리보기 파일 업로드 committingchanges = 바뀐 점 적용 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 = 정보 name = 이름 : noname = 먼저 [accent] 유저 이름[] 을 설정하세요. filename = 파일 이름 : -unlocked = 새 건물 잠금 해제됨 +unlocked = 대상 정보 기록됨 completed = [accent]연구됨 techtree = 연구 기록 -research.list = [LIGHT_GRAY]연구: +research.list = [LIGHT_GRAY]연구 : research = 연구 -researched = [LIGHT_GRAY]{0}연구됨. +researched = [LIGHT_GRAY]{0}연구 완료. players = 현재 {0}명 접속중 players.single = 현재 {0}명만 있음. server.closing = [accent]서버 닫는중... @@ -129,7 +152,7 @@ confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까? joingame.title = 게임 참가 joingame.ip = 주소: disconnect = 서버와 연결이 해제되었습니다. -disconnect.error = Connection error. +disconnect.error = 연결 . disconnect.closed = 연결이 끊어졌습니다.. disconnect.timeout = 연결 시간 한계 도달.. disconnect.data = 월드 데이터 로딩 실패.. @@ -140,7 +163,6 @@ server.port = 포트: server.addressinuse = 주소가 이미 사용중입니다! server.invalidport = 포트가 올바르지 않습니다! server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다. -save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. save.new = 새로 저장 save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까? overwrite = 덮어쓰기 @@ -160,21 +182,22 @@ save.rename.text = 새 이름: selectslot = 저장슬롯을 선택하십시오. slot = [accent]{0}번째 슬롯 editmessage = 글 수정하기 -save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[]. +save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! empty = <비어있음> -on = 켜기 -off = 끄기 -save.autosave = 자동저장: {0} -save.map = 맵: {0} -save.wave = 웨이브 {0} +on = 활성화 +off = 비활성화 +save.autosave = 자동저장 : {0} +save.map = 맵 : {0} +save.wave = {0} 단계 save.mode = 게임모드 : {0} -save.date = 마지막 저장날짜: {0} -save.playtime = 플레이시간: {0} +save.date = 마지막 저장일 : {0} +save.playtime = 플레이타임 : {0} warning = 경고. confirm = 확인 delete = 삭제 view.workshop = 워크샵에서 보기 -ok = OK +workshop.listing = 워크샵 목록 편집하기 +ok = 확인 open = 열기 customize = 맞춤설정 cancel = 취소 @@ -191,7 +214,11 @@ classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또 quit.confirm = 정말로 종료하시겠습니까? quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다. loading = [accent]불러오는중... +reloading = [accent]모드 새로고침하는중... saving = [accent]저장중... +cancelbuilding = [accent][[{0}][] 를 눌러 설계도 초기화 +pausebuilding = [accent][[{0}][] 를 눌러 설계모드 진입 +resumebuilding = [scarlet][[{0}][] 를 눌러 건설 시작 wave = [accent]웨이브 {0} wave.waiting = [green]{0}초[]후 웨이브 시작 wave.waveInProgress = [LIGHT_GRAY]웨이브 진행중 @@ -211,7 +238,12 @@ map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [ map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요. map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다. map.publish.error = 맵 업로드 오류 : {0} +map.update = 맵 업데이트 +map.load.error = 워크샵 작업 오류 : {0} +map.missing = 해당 맵은 삭제되거나 옮겨졌습니다.\n[lightgray]워크샵 목록은 자동으로 동기화되지 않습니다. map.publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다! +map.menu = 원하는 맵을 선택하세요. +map.changelog = 바뀐 점 (선택성): eula = 스팀 EULA map.publish = 맵 업로드 완료! map.publishing = [accent]맵 업로드 중... @@ -291,6 +323,7 @@ editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.exists = 같은 이름의 맵이 이미 존재합니다. editor.selectmap = 불러올 맵 선택: + toolmode.replace = 재배치 toolmode.replace.description = 블록을 배치합니다. toolmode.replaceall = 모두 재배치 @@ -305,6 +338,7 @@ toolmode.fillteams = 팀 채우기 toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다. + filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요. filter.distort = 왜곡 filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기 @@ -336,16 +370,16 @@ filter.option.floor2 = 2번째 바닥 filter.option.threshold2 = 2번째 한계점 filter.option.radius = 반경 filter.option.percentile = 백분위수 -width = 넓이: -height = 높이: + +width = 넓이 : +height = 높이 : menu = 메뉴 play = 플레이 campaign = 캠페인 load = 불러오기 save = 저장 -fps = FPS: {0} -tps = TPS: {0} -ping = Ping: {0}ms +fps = FPS : {0} +ping = Ping : 초당 {0} language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요. settings = 설정 tutorial = 게임 방법 @@ -353,32 +387,38 @@ tutorial.retake = 튜토리얼 editor = 편집기 mapeditor = 맵 편집기 donate = 기부 + abandon = 포기 abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다. locked = 잠김 -complete = [LIGHT_GRAY]완료: +complete = [LIGHT_GRAY]완료 : zone.requirement = 지역 {1} 에서 단계 {0} 달성 -resume = 지역 계속 플레이:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]최고 점수: {0} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} +resume = 현재 진행 중인 지역 :\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]최고 점수 : {0} launch = < 출격 > launch.title = 출격 성공 launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다. launch.unable2 = [scarlet]출격할 수 없습니다.[] -launch.confirm = 출격하게 되면 모든 자원이 코어로 들어갑니다.\n또한 성공하기 전까지 기지로 돌아갈 수 없습니다. +launch.confirm = 출격하게 되면 코어에 저장된 모든 자원이 창고로 들어갑니다.\n또한 출격한 지역에는 아무것도 남지 않습니다. launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 단계까지 기다려야 합니다. -uncover = 구역 개방 +uncover = 지역 개방 configure = 코어 시작자원 설정 -configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다. +bannedblocks = 금지된 블럭들 +addall = 모두 추가 +configure.locked = 단계를 지역 {0}에서 달성할 시 시작자원 설정이 해금됩니다. configure.invalid = 해당 0 과 {0} 사이여야 합니다. zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다! zone.requirement.complete = 단계 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다! zone.config.complete = 단계 {0} 달성:\n시작자원 설정 기능이 해금되었습니다! -zone.resources = 자원이 감지되었습니다 : -zone.objective = [lightgray]게임 모드: [accent]{0} +zone.resources = 감지된 자원 목록 : +zone.objective = [lightgray]게임 모드 : [accent]{0} zone.objective.survival = 생존 zone.objective.attack = 적 코어 파괴 add = 추가... boss.health = 보스 체력 + connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.invalidaddress = 잘못된 주소입니다. @@ -389,6 +429,7 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. + zone.groundZero.name = 전초기지 zone.desertWastes.name = 쓰레기 사막 zone.craters.name = 크레이터 @@ -403,6 +444,7 @@ zone.saltFlats.name = 소금 사막 zone.impact0078.name = Impact 0078 zone.crags.name = 협곡 zone.fungalPass.name = 포자 지대 + zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다! zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오. zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다. @@ -417,6 +459,7 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오. zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. + settings.language = 언어 settings.data = 게임 데이터 settings.reset = 설정 초기화 @@ -471,20 +514,22 @@ blocks.inaccuracy = 오차각 blocks.shots = 발포 횟수 blocks.reload = 재장전 blocks.ammo = 탄약 + bar.drilltierreq = 더 좋은 드릴이 요구됨 bar.drillspeed = 채광 속도 : {0}/s bar.efficiency = 효율성 : {0}% bar.powerbalance = 전력 : {0}/s -bar.powerstored = 에너지 저장량 : {0}/{1} +bar.powerstored = 총 전력 저장량 : {0}/{1} bar.poweramount = 전력 저장량 : {0} bar.poweroutput = 전력 생산량 : {0}/s -bar.items = 최대 120개중 {0}개 중 +bar.items = 자원량 : {0} bar.capacity = 저장공간 : {0} bar.liquid = 액체 bar.heat = 발열 bar.power = 전력 bar.progress = 생산 진행도 bar.spawned = 최대 {1}기 중 {0}기 생산됨 + bullet.damage = [stat]{0}[lightgray] 데미지 bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~[stat] {1}[lightgray] 타일 bullet.incendiary = [stat]방화 @@ -496,6 +541,7 @@ bullet.freezing = [stat]동결 bullet.tarred = [stat]타르 bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율 bullet.reload = [stat]{0}[lightgray]x 사격 속도 + unit.blocks = 블록 unit.powersecond = 전력/초 unit.liquidsecond = 액체/초 @@ -557,8 +603,9 @@ setting.crashreport.name = 오류 보고서 보내기 setting.savecreate.name = 자동 저장 활성화 setting.publichost.name = 공용 서버 보이기 setting.chatopacity.name = 채팅 투명도 -setting.playerchat.name = 인게임 채팅 표시 -uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... +setting.playerchat.name = 채팅 말풍선 표시 +public.confirm = 게임을 공개하시겠습니까?\n[lightgray]설정 - 게임 - 게임 서버 공개에서 다시 설정하실 수 있습니다. +uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet][accent] {0}[]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.cancel = 취소 & 나가기 setting.bloom.name = 발광 효과 keybind.title = 조작키 설정 @@ -593,22 +640,25 @@ keybind.chat.name = 채팅 keybind.player_list.name = 플레이어 목록 keybind.console.name = 콘솔 keybind.rotate.name = 회전 +keybind.rotateplaced.name = 기존 회전 (고정) keybind.toggle_menus.name = 메뉴 보이기/숨기기 keybind.chat_history_prev.name = 이전 채팅기록 keybind.chat_history_next.name = 다음 채팅기록 keybind.chat_scroll.name = 채팅 스크롤 -keybind.drop_unit.name = 유닛 드롭 +keybind.drop_unit.name = 유닛 처치시 자원획득 keybind.zoom_minimap.name = 미니맵 확대 -mode.help.title = 모드 도움말 +mode.help.title = 게임모드 도움말 mode.survival.name = 생존 mode.survival.description = 이것은 일반 모드입니다. 제한된 자원을 가지고 자동으로 다음 단계가 시작됩니다. mode.sandbox.name = 샌드박스 mode.sandbox.description = 무한한 자원을 가지고 자유롭게 다음 단계를 시작할 수 있습니다. +mode.editor.name = 편집기 mode.pvp.name = PvP mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다. mode.attack.name = 공격 mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다. mode.custom = 사용자 정의 규칙 + rules.infiniteresources = 무한 자원 rules.wavetimer = 웨이브 타이머 rules.waves = 웨이브 @@ -635,6 +685,7 @@ rules.title.resourcesbuilding = 자원 & 건축 rules.title.player = 플레이어들 rules.title.enemy = 적 rules.title.unit = 유닛 + content.item.name = 아이템 content.liquid.name = 액체 content.unit.name = 유닛 @@ -696,6 +747,7 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도: {0}% liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0} liquid.viscosity = [LIGHT_GRAY]점도: {0} liquid.temperature = [LIGHT_GRAY]온도: {0} + block.sand-boulder.name = 사암 block.grass.name = 잔디 block.salt.name = 소금 @@ -926,6 +978,7 @@ tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[acc tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[] tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[] tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요. + item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다. item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]액체를 활용하기 위한 필수품입니다. @@ -1033,7 +1086,7 @@ block.combustion-generator.description = 인화성 물질을 태워 소량의 block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다. block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]일반 타일에서 물추출기 1개로 2개가 가동가능합니다. block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다. -block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다. +block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 메타를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다. block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다. block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다. block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index b342c715d6..d133d0bddb 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -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 contributors = Vertalers en Medewerkers discord = Word lid van de Mindustry Discord! link.discord.description = De officiële Mindustry discord chatroom 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.trello.description = Officiële trello-bord voor geplande functies 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 linkfail = Kan link niet openen!\nDe URL is gekopieerd naar je klembord screenshot = Schermafbeeling opgeslagen in {0} -screenshot.invalid = Map too large, potentially not enough memory for screenshot. -gameover = Game Over +screenshot.invalid = Map is te groot, Mogelijk niet genoeg ruimte op apparaat. +gameover = Spel afgelopen gameover.pvp = het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw topscore! -load.sound = Sounds -load.map = Maps -load.image = Images -load.content = Content -load.system = System +load.sound = Geluid +load.map = Mappen +load.image = Afbeeldingen +load.content = inhoud +load.system = Systeem stat.wave = Waves Verslagen:[accent] {0} stat.enemiesDestroyed = Vijanden Vernietigd:[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.delivered = Middelen Gelanceerd: 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}[]"? level.highscore = Topscore: [accent]{0} level.select = Selecteer Level level.mode = Spelmodus: -showagain = Don't show again next session -coreattack = < Core is under attack! > +showagain = Niet Laten zien in de volgende sessie +coreattack = < Core wordt aangevallen! > nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent database = Core Database -savegame = Save Game -loadgame = Load Game -joingame = Join Game +savegame = Opslaan +loadgame = Laden +joingame = Treed toe addplayers = Add/Remove Players -customgame = Custom Game -newgame = New Game +customgame = Aangepast spel +newgame = Nieuw spel none = minimap = Minimap -close = Close +close = Aflsuiten website = Website -quit = Quit -save.quit = Save & Quit -maps = Maps -maps.browse = Browse Maps -continue = Continue -maps.none = [LIGHT_GRAY]No maps found! -invalid = Invalid -preparingconfig = Preparing Config -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: +quit = Stoppen +maps = Mappen +continue = Ga door +maps.none = [LIGHT_GRAY]Geen map gevonden! +about.button = Over +name = Naam: +noname = Maak eerst een[accent] Speler naam[]. +filename = Bestandsnaam: unlocked = New content unlocked! -completed = [accent]Completed -techtree = Tech Tree -research.list = [LIGHT_GRAY]Research: -research = Research -researched = [LIGHT_GRAY]{0} researched. -players = {0} players online -players.single = {0} player online -server.closing = [accent]Closing server... -server.kicked.kick = You have been kicked from the server! -server.kicked.whitelist = You are not whitelisted here. -server.kicked.serverClose = Server closed. -server.kicked.vote = You have been vote-kicked. Goodbye. -server.kicked.clientOutdated = Outdated client! Update your game! -server.kicked.serverOutdated = Outdated server! Ask the host to update! -server.kicked.banned = You are banned on this server. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. -server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. -server.kicked.nameInUse = There is someone with that name\nalready on this server. -server.kicked.nameEmpty = Your chosen name is invalid. -server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. -server.kicked.customClient = This server does not support custom builds. Download an official version. -server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -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. +completed = [accent]Voltooid +techtree = Tech boom +research.list = [LIGHT_GRAY]Onderzoek: +research = Onderzoek +researched = [LIGHT_GRAY]{0} Onderzocht. +players = {0} Spelers online +players.single = {0} Speler online +server.closing = [accent]Server aan het sluiten... +server.kicked.kick = Je bent verwijderd van deze sessie. +server.kicked.serverClose = Server afgesloten... +server.kicked.vote = Je bent ge vote-kicked. Tot ziens. +server.kicked.clientOutdated = Verouderde versie! Update jouw spel! +server.kicked.serverOutdated = Verouderde server! Vraag de host om te upgraden! +server.kicked.banned = Je bent verbannen van deze server. +server.kicked.typeMismatch = Deze server is niet compitabel met jouw bouwtype. +server.kicked.recentKick = Je bent reeds verwijderd.\nWacht voordat je opnieuw verbindt. +server.kicked.nameInUse = Er is al iemand met die naam\nop deze server. +server.kicked.nameEmpty = Je gekozen naam is niet geldig. +server.kicked.idInUse = Je bent al verbonden met deze server! Verbinden met 2 accounts is verboden. +server.kicked.customClient = Deze server ondersteunt geen aangepaste spellen . Download de officiele versie. +server.kicked.gameover = Spel afgelopen +server.versions = Jouw versie:[accent] {0}[]\nServer versie:[accent] {1}[] +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. +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. hostserver = Host Game invitefriends = Invite Friends hostserver.mobile = Host\nGame @@ -545,7 +534,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.fps.name = Show FPS setting.vsync.name = VSync -setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Show Minimap setting.musicvol.name = Music Volume @@ -557,6 +545,7 @@ setting.crashreport.name = Send Anonymous Crash Reports setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 08335fbdd5..1151996f3c 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.fps.name = Show FPS setting.vsync.name = VSync -setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations) setting.minimap.name = Show Minimap setting.musicvol.name = Music Volume @@ -557,6 +556,7 @@ setting.crashreport.name = Send Anonymous Crash Reports setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index cd93643188..8f1a734b96 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -3,7 +3,7 @@ credits = Zasłużeni contributors = Tłumacze i pomocnicy discord = Odwiedź nasz serwer Discord! 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.dev-builds.description = Niestabilne wersje gry 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. screenshot = Zapisano zdjęcie do {0} 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}[]! highscore = [YELLOW] Nowy rekord! load.sound = Dźwięki @@ -21,6 +21,7 @@ load.map = Mapy load.image = Obrazy load.content = Treść load.system = System +load.mod = Mody stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -29,38 +30,49 @@ stat.deconstructed = Budynki zrekonstruowane:[accent] {0} stat.delivered = Surowce wystrzelone: stat.rank = Ocena: [accent]{0} launcheditems = [accent]Wystrzelone przedmioty +launchinfo = [unlaunched][[LAUNCH] rdzeń aby uzyskać przedmioty oznaczone na niebiesko. map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Wybrany poziom level.mode = Tryb gry: showagain = Nie pokazuj tego więcej 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 savegame = Zapisz Grę -loadgame = Wczytaj grę -joingame = Gra wieloosobowa -addplayers = Dodaj/Usuń graczy +loadgame = Wczytaj Grę +joingame = Dołącz Do Gry +addplayers = Dodaj/Usuń Graczy customgame = Własna Gra newgame = Nowa Gra -none = +none = minimap = Minimapa close = Zamknij website = Strona Gry quit = Wyjdź -save.quit = Save & Quit +save.quit = Zapisz & Wyjdź maps = Mapy -maps.browse = Browse Maps +maps.browse = Przeglądaj Mapy continue = Kontynuuj maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done -about.button = O grze +invalid = Nieprawidłowy +preparingconfig = Przygotowywanie Konfiguracji +preparingcontent = Przygotowywanie Zawartości +uploadingcontent = Przesyłanie Zawartości +uploadingpreviewfile = Przesyłanie Pliku Podglądu +committingchanges = Zatwierdzanie Zmian +done = Gotowe +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: noname = Najpierw wybierz [accent]nazwę gracza[] filename = Nazwa Pliku: @@ -74,7 +86,7 @@ players = {0} graczy online players.single = {0} gracz online server.closing = [accent] Zamykanie 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.vote = Zostałeś wyrzucony z gry. Żegnaj. 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. 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 -invitefriends = Invite Friends -hostserver.mobile = Hostuj\ngrę +invitefriends = Zaproś Znajomych +hostserver.mobile = Hostuj\nGrę host = Hostuj hosting = [accent] Otwieranie serwera... hosts.refresh = Odśwież hosts.discovering = Wyszukiwanie gier w sieci LAN -hosts.discovering.any = Discovering games +hosts.discovering.any = Wyszukiwanie gier server.refreshing = Odświeżanie serwera hosts.none = [lightgray] Brak serwerów w sieci LAN! host.invalid = [scarlet] Nie można połączyć się z hostem. -trace = Zlokalizuj gracza +trace = Zlokalizuj Gracza trace.playername = Nazwa gracza: [accent]{0} trace.ip = IP: [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.admins = Admini 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.edit = Edytuj serwer +server.edit = Edytuj Serwer server.outdated = [crimson]Przestarzały serwer![] server.outdated.client = [crimson]Przestarzały klient![] server.version = [lightgray]Wersja: {0} server.custombuild = [yellow]Zmodowany klient confirmban = Jesteś pewny, że chcesz zbanować 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? confirmadmin = Jesteś pewny, że chcesz dać 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.timeout = Przekroczono limit czasu. 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.data = [accent]Ładowanie danych świata... server.port = Port: @@ -153,13 +165,13 @@ save.export = Eksportuj save.import.invalid = [accent]Zapis gry jest niepoprawny! save.import.fail = [crimson]Nie udało się zaimportować 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.rename = Zmień nazwę +save.rename = Zmień Nazwę save.rename.text = Nowa nazwa: selectslot = Wybierz zapis. 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. empty = on = Włączone @@ -167,26 +179,26 @@ off = Wyłączone save.autosave = Autozapis: {0} save.map = Mapa: {0} save.wave = Fala {0} -save.mode = Gamemode: {0} -save.date = Ostatnio zapisano: {0} +save.mode = Tryb Gry: {0} +save.date = Ostatnio Zapisane: {0} save.playtime = Czas gry: {0} warning = Uwaga. confirm = Potwierdź delete = Usuń -view.workshop = View In Workshop -ok = Ok +view.workshop = Pokaż w Warsztacie +ok = OK open = Otwórz customize = Dostosuj cancel = Anuluj -openlink = Otwórz link -copylink = Kopiuj link +openlink = Otwórz Link +copylink = Kopiuj Link back = Wróć data.export = Eksportuj Dane data.import = Importuj Dane data.exported = Dane wyeksportowane. 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. -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? 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.[] @@ -199,37 +211,40 @@ waiting = [LIGHT_GRAY]Oczekiwanie... waiting.players = Oczekiwanie na graczy... wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów wave.enemy = Pozostał [LIGHT_GRAY]{0} wróg -loadimage = Załaduj obraz -saveimage = Zapisz obraz +loadimage = Załaduj Obraz +saveimage = Zapisz Obraz unknown = Nieznane custom = Własne builtin = Wbudowane 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.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.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. 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 map.publish = Opublikowano mapę. map.publishing = [accent]Publikowanie mapy... editor.brush = Pędzel -editor.openin = Otwórz w edytorze -editor.oregen = Generacja złóż -editor.oregen.info = Generacja złóż: -editor.mapinfo = Informacje o mapie +editor.openin = Otwórz w Edytorze +editor.oregen = Generacja Złóż +editor.oregen.info = Generacja Złóż: +editor.mapinfo = Informacje o Mapie editor.author = Autor: 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.rules = Zasady: editor.generation = Generacja: -editor.ingame = Edytuj w grze -editor.publish.workshop = Opublikuj w Workshop +editor.ingame = Edytuj w Grze +editor.publish.workshop = Opublikuj w Warsztacie editor.newmap = Nowa Mapa -workshop = Workshop +workshop = Warsztat waves.title = Fale waves.remove = Usuń waves.never = @@ -240,8 +255,8 @@ waves.to = do waves.boss = Boss waves.preview = Podgląd waves.edit = Edytuj... -waves.copy = Kopiuj do schowka -waves.load = Załaduj ze schowka +waves.copy = Kopiuj Do Schowka +waves.load = Załaduj Ze Schowka waves.invalid = Nieprawidłowe fale w schowku. 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. @@ -249,8 +264,8 @@ editor.default = [LIGHT_GRAY] details = Detale... edit = Edytuj... editor.name = Nazwa: -editor.spawn = Stwórz jednostkę -editor.removeunit = Usuń jednostkę +editor.spawn = Stwórz Jednostkę +editor.removeunit = Usuń Jednostkę editor.teams = Drużyny editor.errorload = Błąd podczas ładowania 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.apply = Zastosuj editor.generate = Generuj -editor.resize = Zmień rozmiar -editor.loadmap = Załaduj mapę -editor.savemap = Zapisz mapę +editor.resize = Zmień Rozmiar +editor.loadmap = Załaduj Mapę +editor.savemap = Zapisz Mapę editor.saved = Zapisano! 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'. @@ -278,22 +293,22 @@ editor.importfile.description = Importuj zewnętrzny plik mapy editor.importimage = Importuj Obraz Terenu editor.importimage.description = Importuj zewnętrzny obraz terenu editor.export = Eksportuj... -editor.exportfile = Eksportuj plik +editor.exportfile = Eksportuj Plik editor.exportfile.description = Eksportuj plik mapy editor.exportimage = Eksportuj Obraz Terenu editor.exportimage.description = Eksportuj plik obrazu terenu -editor.loadimage = Załaduj obraz -editor.saveimage = Zapisz obraz +editor.loadimage = Załaduj Teren +editor.saveimage = Zapisz Teren editor.unsaved = [scarlet]Masz niezapisane zmiany![]\nCzy na pewno chcesz wyjść? -editor.resizemap = Zmień rozmiar mapy -editor.mapname = Nazwa mapy: +editor.resizemap = Zmień Rozmiar Mapy +editor.mapname = Nazwa 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.exists = A map with this name already exists. +editor.overwrite.confirm = [scarlet]Uwaga![] Mapa o tej nazwie już istnieje. Jesteś pewny, że chcesz ją nadpisać? +editor.exists = Mapa o tej nazwie już istnieje. editor.selectmap = Wybierz mapę do załadowania: toolmode.replace = Zastąp 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.orthogonal = Prostokątny 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.drawteams = Rysuj Drużyny 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.noise = Szum filter.median = Mediana -filter.oremedian = Mediana rud +filter.oremedian = Mediana Rud filter.blend = Wtopienie -filter.defaultores = Domyślne rudy +filter.defaultores = Domyślne Rudy filter.ore = Ruda -filter.rivernoise = Szum rzeki +filter.rivernoise = Szum Rzeki filter.mirror = Lustro filter.clear = Oczyść filter.option.ignore = Ignoruj @@ -323,7 +338,7 @@ filter.option.scale = Skala filter.option.chance = Szansa filter.option.mag = Wielkość 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.falloff = Spadek filter.option.angle = Kąt @@ -332,8 +347,8 @@ filter.option.floor = Podłoga filter.option.flooronto = Podłoga Docelowa filter.option.wall = Ściana filter.option.ore = Ruda -filter.option.floor2 = Druga podłoga -filter.option.threshold2 = Drugi próg +filter.option.floor2 = Druga Podłoga +filter.option.threshold2 = Drugi Próg filter.option.radius = Zasięg filter.option.percentile = Percentyl width = Szerokość: @@ -351,8 +366,8 @@ settings = Ustawienia tutorial = Poradnik tutorial.retake = Ponów Samouczek editor = Edytor -mapeditor = Edytor map -donate = Wspomóż nas +mapeditor = Edytor Map +donate = Wspomóż Nas abandon = Opuść abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. 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.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal. uncover = Odkryj -configure = Skonfiguruj ładunek +configure = Skonfiguruj Ładunek configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek. configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana. @@ -404,7 +419,7 @@ zone.impact0078.name = Uderzenie 0078 zone.crags.name = Urwisko 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.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.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ć @@ -419,20 +434,20 @@ zone.impact0078.description = zone.crags.description = settings.language = Język settings.data = Dane Gry -settings.reset = Przywróć domyślne +settings.reset = Przywróć Domyślne settings.rebind = Zmień settings.controls = Sterowanie settings.game = Gra settings.sound = Dźwięk 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.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.clearall = Wyczyść wszystko +settings.clearunlocks = Wyczyść Listę Przedmiotów +settings.clearall = Wyczyść Wszystko paused = [accent]< Wstrzymano > -yes = Jasne! -no = Nie ma mowy! +yes = Tak +no = Nie info.title = Informacje error.title = [crimson]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.efficiency = Efektywność: {0}% bar.powerbalance = Moc: {0} -bar.powerstored = Stored: {0}/{1} +bar.powerstored = Zmagazynowano: {0}/{1} bar.poweramount = Moc: {0} bar.poweroutput = Wyjście mocy: {0} bar.items = Przedmiotów: {0} @@ -496,7 +511,7 @@ bullet.freezing = [stat]zamrażający bullet.tarred = [stat]smolny bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji bullet.reload = [stat]{0}[lightgray]x szybkość ataku -unit.blocks = Klocki +unit.blocks = bloki unit.powersecond = jednostek prądu na sekundę unit.liquidsecond = jednostek płynów na sekundę unit.itemssecond = przedmiotów na sekundę @@ -520,11 +535,11 @@ setting.shadows.name = Cienie setting.linear.name = Filtrowanie Liniowe setting.animatedwater.name = Animowana woda 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.autotarget.name = Automatyczne Celowanie -setting.keyboard.name = Sterowanie Myszka+Klawiatura -setting.touchscreen.name = Touchscreen Controls +setting.keyboard.name = Sterowanie - Myszka+Klawiatura +setting.touchscreen.name = Sterowanie - Ekran Dotykowy setting.fpscap.name = Maksymalny FPS setting.fpscap.none = Nieograniczone 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.fps.name = Pokazuj FPS setting.vsync.name = Synchronizacja pionowa -setting.lasers.name = Pokaż lasery zasilające setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje) setting.minimap.name = Pokaż Minimapę 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.crashreport.name = Wysyłaj anonimowo dane o crashu gry setting.savecreate.name = Automatyczne tworzenie zapisu -setting.publichost.name = Widoczność gry publicznej +setting.publichost.name = Widoczność Gry Publicznej setting.chatopacity.name = Przezroczystość czatu +setting.lasersopacity.name = Przezroczystość laserów zasilających 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.cancel = Anuluj i wyjdź +uiscale.cancel = Anuluj i Wyjdź setting.bloom.name = Bloom keybind.title = Zmień 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.multiplayer.name = Multiplayer command.attack = Atakuj -command.rally = Rally +command.rally = Zbierz command.retreat = Wycofaj keybind.gridMode.name = Wybieranie Bloku keybind.gridModeShift.name = Wybieranie Kategorii @@ -576,7 +592,7 @@ keybind.press.axis = Naciśnij oś lub klawisz... keybind.screenshot.name = Zrzut ekranu mapy keybind.move_x.name = Poruszanie w poziomie 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.diagonal_placement.name = Budowa po skosie keybind.pick.name = Wybierz Blok @@ -603,28 +619,29 @@ mode.help.title = Opis trybów mode.survival.name = Przeżycie mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników. 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.description = Walcz przeciwko innym graczom. 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 rules.infiniteresources = Nieskończone zasoby rules.wavetimer = Zegar fal rules.waves = Fale -rules.attack = Tryb Ataku +rules.attack = Tryb ataku rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu) -rules.unitdrops = Surowce z zniszczonych jednostek -rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek -rules.unithealthmultiplier = Mnożnik Życia Jednostek -rules.playerhealthmultiplier = Mnożnik Życia Gracza -rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza -rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek +rules.unitdrops = Surowce ze zniszczonych jednostek +rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek +rules.unithealthmultiplier = Mnożnik życia jednostek +rules.playerhealthmultiplier = Mnożnik życia gracza +rules.playerdamagemultiplier = Mnożnik obrażeń gracza +rules.unitdamagemultiplier = Mnożnik obrażeń jednostek 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.buildcostmultiplier = Mnożnik Kosztów Budowania -rules.buildspeedmultiplier = Mnożnik Prędkości Budowania +rules.buildcostmultiplier = Mnożnik kosztów budowania +rules.buildspeedmultiplier = Mnożnik prędkości budowania rules.waitForWaveToEnd = Fale czekają na przeciwników rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki) rules.respawns = Maksymalna ilośc odrodzeń na falę @@ -650,7 +667,7 @@ item.silicon.name = Krzem item.plastanium.name = Plastan item.phase-fabric.name = Włókno Fazowe item.surge-alloy.name = Elektrum -item.spore-pod.name = Zarodnia +item.spore-pod.name = Kapsuła Zarodników item.sand.name = Piasek item.blast-compound.name = Wybuchowy związek item.pyratite.name = Piratian @@ -703,8 +720,8 @@ block.saltrocks.name = Skały Solne block.pebbles.name = Kamyczki block.tendrils.name = Wić block.sandrocks.name = Skały Piaskowe -block.spore-pine.name = Sosna Zarodkowa -block.sporerocks.name = Skała z Zarodkami +block.spore-pine.name = Sosna Zarodnikowa +block.sporerocks.name = Skała Zarodnikowa block.rock.name = Skały block.snowrock.name = Skały śnieżne block.snow-pine.name = Sosna śniegowa @@ -712,19 +729,19 @@ block.shale.name = Łupek block.shale-boulder.name = Głaz Łupkowy block.moss.name = Mech block.shrubs.name = Krzewy -block.spore-moss.name = Mech z Zarodkami +block.spore-moss.name = Mech Zarodnikowy block.shalerocks.name = Skały Łupkowe -block.scrap-wall.name = Ściana z Złomu -block.scrap-wall-large.name = Duża Ściana z Złomu -block.scrap-wall-huge.name = Ogromna Ściana z Złomu -block.scrap-wall-gigantic.name = Gigantyczna Ściana z Złomu +block.scrap-wall.name = Ściana ze Złomu +block.scrap-wall-large.name = Duża Ściana ze Złomu +block.scrap-wall-huge.name = Ogromna Ściana ze Złomu +block.scrap-wall-gigantic.name = Gigantyczna Ściana ze Złomu block.thruster.name = Silnik block.kiln.name = Wypalarka block.graphite-press.name = Grafitowa Prasa block.multi-press.name = Multi-Prasa block.constructing = {0} [LIGHT_GRAY](Budowa) 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-nucleus.name = Rdzeń: Jądro block.deepwater.name = Głęboka Woda @@ -750,7 +767,7 @@ block.dunerocks.name = Skały wydmowe block.pine.name = Sosna block.white-tree-dead.name = Białe Drzewo Martwe 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-2.name = Metalowa Podłoga 2 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.cliffs.name = Klify 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-large.name = Duża Tytanowa Ś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.door.name = 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.scatter.name = Flak block.hail.name = Grad block.lancer.name = Lancer block.conveyor.name = Przenośnik -block.titanium-conveyor.name = Tytanowy przenośnik -block.armored-conveyor.name = Armored Conveyor -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.titanium-conveyor.name = Przenośnik Tytanowy +block.armored-conveyor.name = Przenośnik Opancerzony +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.router.name = Rozdzielacz block.distributor.name = Dystrybutor block.sorter.name = Sortownik -block.message.name = Message -block.overflow-gate.name = Brama Przeciwprzepełnieniowa +block.message.name = Wiadomość +block.overflow-gate.name = Brama Przepełnieniowa block.silicon-smelter.name = Huta Krzemu block.phase-weaver.name = Fazowa Fabryka block.pulverizer.name = Rozkruszacz block.cryofluidmixer.name = Mieszacz Lodocieczy block.melter.name = Przetapiacz block.incinerator.name = Spalacz -block.spore-press.name = Prasa Zarodni +block.spore-press.name = Prasa Zarodników block.separator.name = Rozdzielacz block.coal-centrifuge.name = Wirówka węglowa 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.unloader.name = Ekstraktor block.vault.name = Magazyn -block.wave.name = Strumyk +block.wave.name = Strumień block.swarmer.name = Działo Rojowe block.salvo.name = Działo Salwowe -block.ripple.name = Działo falowe -block.phase-conveyor.name = Fazowy Transporter +block.ripple.name = Działo Falowe +block.phase-conveyor.name = Transporter Fazowy block.bridge-conveyor.name = Most Transportowy block.plastanium-compressor.name = Kompresor Plastanu 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.spirit-factory.name = Fabryka Dronów Duch 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.dagger-factory.name = Fabryka Mechów Nóż block.crawler-factory.name = Fabryka Mechów Pełzacz block.titan-factory.name = Fabryka Mechów Tytan 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.pulse-conduit.name = Rura Pulsacyjna block.phase-conduit.name = Rura Fazowa @@ -870,12 +887,12 @@ block.thermal-generator.name = Generator Termalny block.alloy-smelter.name = Piec Mieszający block.mender.name = Naprawiacz block.mend-projector.name = Projektor Napraw -block.surge-wall.name = Ściana Elektronu -block.surge-wall-large.name = Duża Ściana Elektronu +block.surge-wall.name = Ściana Elektrum +block.surge-wall-large.name = Duża Ściana Elektrum block.cyclone.name = Cyklon block.fuse.name = Lont 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.arc.name = Piorun block.rtg-generator.name = Generator RTG @@ -891,21 +908,21 @@ team.orange.name = pomarańczowy team.derelict.name = szary team.green.name = zielony team.purple.name = fioletowy -unit.spirit.name = Duch -unit.draug.name = Draug -unit.phantom.name = Widmo +unit.spirit.name = Dron Naprawczy Duch +unit.draug.name = Dron Wydobywczy Draug +unit.phantom.name = Dron Budowniczy Widmo unit.dagger.name = Nóż unit.crawler.name = Pełzak unit.titan.name = Tytan -unit.ghoul.name = Upiór -unit.wraith.name = Widmo +unit.ghoul.name = Bombowiec Upiór +unit.wraith.name = Myśliwiec Widmo unit.fortress.name = Forteca unit.revenant.name = Zjawa unit.eruptor.name = Roztapiacz -unit.chaos-array.name = Kolejka Chaosu +unit.chaos-array.name = Chaos unit.eradicator.name = Niszczyciel unit.lich.name = Obudzony -unit.reaper.name = Żeniec +unit.reaper.name = Żniwiarz tutorial.next = [lightgray] 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ć. @@ -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.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.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.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.spore-pod.description = Używany do wyrobu oleju, materiałów wybuchowych i paliwa. -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.spore-pod.description = Syntetyczne zarodniki, które mogą być przekształcone na olej, materiały wybuchowe i paliwo. +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. 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.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. -mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki. -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.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, 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.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność 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.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.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 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.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.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. @@ -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.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę. 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.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. @@ -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.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.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.coal-centrifuge.description = Zestala olej w kawałki węgla. 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.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.phase-wall.description = Nie tak silny jak ściana toru, ale odbije pociski, chyba że będą zbyt potężne. -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.surge-wall.description = Najsilniejszy 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.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków. +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 = Ekstremalnie wytrzymały blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego. +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-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. @@ -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.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.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.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.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.mechanical-pump.description = Tania pompa o niskiej przepustowości. Nie wymaga prądu. -block.rotary-pump.description = Zaawansowana pompa, dwukrotnie większa przepustowość od mechanicznej pompy. Wymaga prądu. +block.mechanical-pump.description = Tania pompa o niskiej wydajności. Nie 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.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.pulse-conduit.description = Zaawansowany blok do przenoszenia 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-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.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami. +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 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 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.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. @@ -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.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.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-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.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.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.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.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. @@ -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.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.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne. -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.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności. -block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje wiązki tesli losowym łukiem w kierunku wroga. -block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi. -block.salvo.description = Średniej wielkości wieża strzelająca salwami. +block.hail.description = Mała wieża artyleryjska o dużym zasięgu. +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 po naładowaniu, wystrzeliwuje silne wiązki energii. +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 wystrzeliwuje rakiety samonaprowadzające. +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.ripple.description = Duża wieża artyleryjska, która strzela jednocześnie kilkoma strzałami. 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.meltdown.description = Duża wieża, która strzela potężnymi wiązkami dalekiego zasięgu. +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ż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.draug-factory.description = Produkuje drony wydobywcze Draug. block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki. 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.revenant-factory.description = Produkuje ciężkie jednostki powietrzne z wyrzutniami rakiet. block.dagger-factory.description = Produkuje podstawowe jednostki lądowe. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index dd40cf5588..cde736c89c 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -560,7 +560,6 @@ setting.fullscreen.name = Tela Cheia setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) setting.fps.name = Mostrar FPS setting.vsync.name = VSync -setting.lasers.name = Mostrar lasers setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa 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.publichost.name = Visibilidade do jogo público setting.chatopacity.name = Opacidade do chat +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancelar e sair diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 6bdd3c2b16..b020766974 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Полноэкранный режим setting.borderlesswindow.name = Безрамочное окно[lightgray] (может потребоваться перезапуск) setting.fps.name = Показывать FPS setting.vsync.name = Вертикальная синхронизация -setting.lasers.name = Показывать лазеры энергоснабжения setting.pixelate.name = Пикселизация[lightgray] (отключает анимации) setting.minimap.name = Показать миникарту setting.musicvol.name = Громкость музыки @@ -557,6 +556,7 @@ setting.crashreport.name = Отправлять анонимные отчёты setting.savecreate.name = Автоматическое создание сохранений setting.publichost.name = Общедоступность игры setting.chatopacity.name = Непрозрачность чата +setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Отображать облака чата над игроками uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд… uiscale.cancel = Отменить & Выйти diff --git a/core/assets/bundles/bundle_se.properties b/core/assets/bundles/bundle_se.properties index 7c3a20a924..90329f5052 100644 --- a/core/assets/bundles/bundle_se.properties +++ b/core/assets/bundles/bundle_se.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Fullskärm setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = Show FPS setting.vsync.name = VSync -setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixellera[lightgray] (disables animations) setting.minimap.name = Visa Minikarta setting.musicvol.name = Musikvolym @@ -557,6 +556,7 @@ setting.crashreport.name = Skicka Anonyma Krashrapporter setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chattgenomskinlighet +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Avbryt och Avsluta diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 9406b7e9fc..ad48272f7d 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Tam ekran setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.fps.name = FPS'i goster setting.vsync.name = VSync -setting.lasers.name = Guc lazerlerini goster setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Haritayi goster setting.musicvol.name = Ses yuksekligi @@ -557,6 +556,7 @@ setting.crashreport.name = Send Anonymous Crash Reports setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 715ca2e128..dea313d429 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = Show FPS setting.vsync.name = VSync -setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap setting.musicvol.name = Music Volume @@ -557,6 +556,7 @@ setting.crashreport.name = Send Anonymous Crash Reports setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 4e709d929f..aafae6c08f 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -551,7 +551,6 @@ setting.fullscreen.name = Повноекранний режим setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску) setting.fps.name = Показувати FPS setting.vsync.name = Вертикальна синхронізація -setting.lasers.name = Показувати енергію лазерів setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації) setting.minimap.name = Показувати міні-мапу setting.musicvol.name = Гучність музики @@ -563,6 +562,7 @@ setting.crashreport.name = Відсилати анонімні звіти про setting.savecreate.name = Автоматичне створення збережень setting.publichost.name = Загальнодоступність гри setting.chatopacity.name = Непрозорість чату +setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Відображати хмару чата над гравцями public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування->Гра->Public Game Visibility. uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] … diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 048ecf55e3..c914b65d13 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -45,6 +45,7 @@ customgame = 自定义游戏 newgame = 新游戏 none = <无> minimap = 小地图 +position = 位置 close = 关闭 website = 官网 quit = 退出 @@ -183,7 +184,7 @@ copylink = 复制链接 back = 返回 data.export = 导出数据 data.import = 导入数据 -data.exported = 数据已导入。 +data.exported = 数据已导出。 data.invalid = 非有效游戏数据。 data.import.confirm = 导入外部游戏数据将覆盖本地[scarlet]全部[]的游戏数据。\n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。 classic.export = 导出老版本数据 @@ -545,9 +546,9 @@ setting.fullscreen.name = 全屏 setting.borderlesswindow.name = 无边框窗口[LIGHT_GRAY] (可能需要重启) setting.fps.name = 显示 FPS setting.vsync.name = 垂直同步 -setting.lasers.name = 显示能量射线 setting.pixelate.name = 像素画面 [LIGHT_GRAY](禁用动画) setting.minimap.name = 显示小地图 +setting.position.name = 显示玩家坐标 setting.musicvol.name = 音乐音量 setting.ambientvol.name = 环境体积 setting.mutemusic.name = 静音 @@ -557,6 +558,7 @@ setting.crashreport.name = 发送匿名崩溃报告 setting.savecreate.name = 自动创建存档 setting.publichost.name = 公共游戏旁观 setting.chatopacity.name = 聊天界面透明度 +setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = 显示游戏内聊天界面 uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。 uiscale.cancel = 取消并退出 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index b61fc23823..e206bd44a1 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -545,7 +545,6 @@ setting.fullscreen.name = 全螢幕 setting.borderlesswindow.name = 無邊框窗口[LIGHT_GRAY](可能需要重啟) setting.fps.name = 顯示FPS setting.vsync.name = 垂直同步 -setting.lasers.name = 顯示雷射光束 setting.pixelate.name = 像素化[LIGHT_GRAY](可能降低性能) setting.minimap.name = 顯示小地圖 setting.musicvol.name = 音樂音量 @@ -557,6 +556,7 @@ setting.crashreport.name = 發送匿名崩潰報告 setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = 聊天框不透明度 +setting.lasersopacity.name = Power Laser Opacity 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.cancel = Cancel & Exit diff --git a/core/assets/contributors b/core/assets/contributors index 72684ac274..bb24f2ad4c 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -78,4 +78,5 @@ itskatt Agent-Laevain AzariasB amrsoll +ねらひかだ Draco diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 0816c37507..c8615955a6 100644 Binary files a/core/assets/sprites/block_colors.png and b/core/assets/sprites/block_colors.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 99e4d04fa2..f9cbd723c2 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -20,7 +20,7 @@ mend-projector-top index: -1 mender-top rotate: false - xy: 1959, 1169 + xy: 1993, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -34,35 +34,35 @@ overdrive-projector-top index: -1 shock-mine rotate: false - xy: 1021, 285 + xy: 1111, 668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 817, 450 + xy: 817, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 817, 314 + xy: 853, 512 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 853, 512 + xy: 887, 512 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 887, 512 + xy: 853, 478 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -216,266 +216,266 @@ armored-conveyor-4-3 index: -1 conveyor-0-1 rotate: false - xy: 919, 429 + xy: 919, 395 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 919, 395 + xy: 919, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 919, 361 + xy: 919, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 919, 327 + xy: 919, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 919, 293 + xy: 955, 489 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 955, 489 + xy: 989, 489 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 989, 489 + xy: 955, 455 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 955, 455 + xy: 989, 455 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 989, 455 + xy: 953, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 953, 421 + xy: 953, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 953, 387 + xy: 987, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 987, 421 + xy: 953, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 953, 353 + xy: 987, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 987, 387 + xy: 953, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 953, 319 + xy: 987, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 987, 353 + xy: 987, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 987, 319 + xy: 953, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 953, 285 + xy: 987, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 987, 285 + xy: 1516, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 863, 274 + xy: 1667, 1125 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1667, 1125 + xy: 1667, 1091 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1667, 1091 + xy: 1667, 1057 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1667, 1057 + xy: 1667, 1023 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1667, 1023 + xy: 1667, 989 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1667, 989 + xy: 1667, 955 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1667, 955 + xy: 1667, 921 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1667, 921 + xy: 1667, 887 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1667, 887 + xy: 1667, 853 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1667, 853 + xy: 1667, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1667, 819 + xy: 1667, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1667, 785 + xy: 1701, 1107 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1701, 1107 + xy: 1701, 1073 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1701, 1073 + xy: 1701, 1039 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1701, 1039 + xy: 1701, 1005 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1701, 1005 + xy: 1701, 971 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1701, 971 + xy: 1701, 937 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1701, 937 + xy: 1701, 903 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1701, 903 + xy: 1701, 869 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -489,21 +489,21 @@ mass-driver-base index: -1 phase-conveyor-arrow rotate: false - xy: 1747, 1165 + xy: 1781, 1165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1781, 1165 + xy: 1713, 1141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1713, 1141 + xy: 1747, 1131 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -685,21 +685,21 @@ block-border index: -1 block-middle rotate: false - xy: 695, 114 + xy: 627, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1210, 675 + xy: 1244, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 851, 376 + xy: 885, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -769,161 +769,161 @@ rubble-4-1 index: -1 bridge-conduit-arrow rotate: false - xy: 817, 416 + xy: 817, 382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 817, 416 + xy: 817, 382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 817, 382 + xy: 817, 348 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 817, 348 + xy: 817, 314 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 887, 478 + xy: 921, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 921, 497 + xy: 851, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 851, 444 + xy: 851, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 851, 410 + xy: 885, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 851, 410 + xy: 885, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 851, 410 + xy: 885, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 851, 410 + xy: 885, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 885, 444 + xy: 851, 376 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 885, 410 + xy: 851, 342 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 851, 342 + xy: 885, 376 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 885, 376 + xy: 885, 342 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 885, 342 + xy: 851, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 885, 342 + xy: 851, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 851, 308 + xy: 885, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 885, 308 + xy: 921, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 921, 463 + xy: 919, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1652, 713 + xy: 1670, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1670, 679 + xy: 1670, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1670, 645 + xy: 1823, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -951,63 +951,63 @@ liquid-tank-top index: -1 phase-conduit-arrow rotate: false - xy: 1993, 1169 + xy: 1679, 1167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1679, 1167 + xy: 1713, 1175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1713, 1175 + xy: 1747, 1165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1781, 1131 + xy: 1815, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1815, 1135 + xy: 1849, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1849, 1135 + xy: 1883, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1883, 1135 + xy: 1917, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 1917, 1135 + xy: 1951, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 1951, 1135 + xy: 1985, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1042,7 +1042,7 @@ block-battery-large-full index: -1 combustion-generator-top rotate: false - xy: 853, 478 + xy: 887, 478 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1112,14 +1112,14 @@ impact-reactor-plasma-3 index: -1 power-source rotate: false - xy: 1747, 1131 + xy: 1781, 1131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1951, 1101 + xy: 1985, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1266,21 +1266,21 @@ plastanium-compressor-top index: -1 pulverizer rotate: false - xy: 1985, 1135 + xy: 1815, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1815, 1101 + xy: 1849, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1849, 1101 + xy: 1883, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1420,7 +1420,7 @@ salvo-panel-right index: -1 scorch-heat rotate: false - xy: 1021, 421 + xy: 1021, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1546,7 +1546,7 @@ rally-point index: -1 repair-point-base rotate: false - xy: 1917, 1101 + xy: 1951, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1595,7 +1595,7 @@ door-large-open index: -1 door-open rotate: false - xy: 1534, 689 + xy: 1568, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1644,28 +1644,28 @@ scrap-wall-large4 index: -1 scrap-wall2 rotate: false - xy: 1021, 387 + xy: 1021, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1021, 353 + xy: 1021, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1021, 319 + xy: 1021, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1021, 319 + xy: 1021, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1805,7 +1805,7 @@ shell-back index: -1 shot rotate: false - xy: 1111, 668 + xy: 863, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1819,7 +1819,7 @@ transfer index: -1 transfer-arrow rotate: false - xy: 1701, 869 + xy: 1701, 835 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2412,30 +2412,44 @@ incinerator orig: 32, 32 offset: 0, 0 index: -1 -block-item-source-full +block-inverted-sorter-full rotate: false xy: 693, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +inverted-sorter + rotate: false + xy: 693, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-source-full + rotate: false + xy: 727, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 item-source rotate: false - xy: 693, 148 + xy: 727, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-full rotate: false - xy: 727, 148 + xy: 761, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 727, 148 + xy: 761, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2456,14 +2470,14 @@ javelin-ship-pad index: -1 block-junction-full rotate: false - xy: 761, 148 + xy: 559, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 761, 148 + xy: 559, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2526,35 +2540,35 @@ launch-pad-large index: -1 block-liquid-junction-full rotate: false - xy: 559, 114 + xy: 559, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 559, 114 + xy: 559, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-full rotate: false - xy: 559, 80 + xy: 593, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-full rotate: false - xy: 593, 114 + xy: 559, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 593, 114 + xy: 559, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2568,7 +2582,7 @@ block-liquid-tank-full index: -1 block-magmarock-full rotate: false - xy: 559, 46 + xy: 593, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2589,14 +2603,14 @@ block-mechanical-drill-full index: -1 block-mechanical-pump-full rotate: false - xy: 593, 80 + xy: 627, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 593, 80 + xy: 627, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2610,14 +2624,14 @@ block-meltdown-full index: -1 block-melter-full rotate: false - xy: 627, 114 + xy: 559, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 627, 114 + xy: 559, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2638,70 +2652,70 @@ mend-projector index: -1 block-mender-full rotate: false - xy: 559, 12 + xy: 593, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender rotate: false - xy: 559, 12 + xy: 593, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-full rotate: false - xy: 593, 46 + xy: 627, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 593, 46 + xy: 627, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-full rotate: false - xy: 627, 80 + xy: 661, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-full rotate: false - xy: 661, 114 + xy: 593, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-full rotate: false - xy: 593, 12 + xy: 627, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 627, 46 + xy: 661, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-full rotate: false - xy: 661, 80 + xy: 695, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 627, 12 + xy: 661, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2743,14 +2757,14 @@ omega-mech-pad index: -1 block-ore-coal-full rotate: false - xy: 661, 46 + xy: 695, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 661, 46 + xy: 695, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2785,14 +2799,14 @@ block-ore-coal-xlarge index: -1 block-ore-copper-full rotate: false - xy: 695, 80 + xy: 729, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 695, 80 + xy: 729, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2827,14 +2841,14 @@ block-ore-copper-xlarge index: -1 block-ore-lead-full rotate: false - xy: 729, 114 + xy: 661, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 729, 114 + xy: 661, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2869,14 +2883,14 @@ block-ore-lead-xlarge index: -1 block-ore-scrap-full rotate: false - xy: 661, 12 + xy: 695, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 661, 12 + xy: 695, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2911,14 +2925,14 @@ block-ore-scrap-xlarge index: -1 block-ore-thorium-full rotate: false - xy: 695, 46 + xy: 729, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 695, 46 + xy: 729, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2953,14 +2967,14 @@ block-ore-thorium-xlarge index: -1 block-ore-titanium-full rotate: false - xy: 729, 80 + xy: 695, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 729, 80 + xy: 695, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3009,21 +3023,21 @@ overdrive-projector index: -1 block-overflow-gate-full rotate: false - xy: 695, 12 + xy: 729, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 695, 12 + xy: 729, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 729, 46 + xy: 729, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3037,42 +3051,42 @@ block-phantom-factory-full index: -1 block-phase-conduit-full rotate: false - xy: 729, 12 + xy: 763, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 729, 12 + xy: 763, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-full rotate: false - xy: 763, 114 + xy: 763, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 763, 114 + xy: 763, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-full rotate: false - xy: 763, 80 + xy: 763, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 763, 80 + xy: 763, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3128,14 +3142,14 @@ block-pneumatic-drill-full index: -1 block-power-node-full rotate: false - xy: 763, 46 + xy: 763, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 763, 46 + xy: 763, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3156,35 +3170,35 @@ power-node-large index: -1 block-power-source-full rotate: false - xy: 763, 12 + xy: 801, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-full rotate: false - xy: 801, 182 + xy: 795, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 801, 182 + xy: 795, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 795, 148 + xy: 797, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 797, 114 + xy: 797, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3205,7 +3219,7 @@ pyratite-mixer index: -1 block-repair-point-full rotate: false - xy: 797, 80 + xy: 797, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3233,7 +3247,7 @@ block-rock-full index: -1 block-rocks-full rotate: false - xy: 797, 46 + xy: 797, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3254,14 +3268,14 @@ rotary-pump index: -1 block-router-full rotate: false - xy: 797, 12 + xy: 1466, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 797, 12 + xy: 1466, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3282,14 +3296,14 @@ rtg-generator index: -1 block-salt-full rotate: false - xy: 1466, 683 + xy: 1500, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-saltrocks-full rotate: false - xy: 1500, 683 + xy: 829, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3303,28 +3317,28 @@ block-salvo-full index: -1 block-sand-boulder-full rotate: false - xy: 829, 148 + xy: 831, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 831, 114 + xy: 831, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-full rotate: false - xy: 831, 80 + xy: 831, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sandrocks-full rotate: false - xy: 831, 46 + xy: 831, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3338,21 +3352,21 @@ block-scatter-full index: -1 block-scorch-full rotate: false - xy: 831, 12 + xy: 1176, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 1176, 675 + xy: 1210, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 1176, 675 + xy: 1210, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3408,35 +3422,35 @@ separator index: -1 block-shale-boulder-full rotate: false - xy: 1244, 675 + xy: 1278, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 1278, 675 + xy: 1312, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shalerocks-full rotate: false - xy: 1312, 675 + xy: 1346, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-full rotate: false - xy: 1346, 675 + xy: 1380, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 1380, 675 + xy: 1414, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3457,7 +3471,7 @@ silicon-smelter index: -1 block-snow-full rotate: false - xy: 1414, 675 + xy: 725, 552 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3478,21 +3492,21 @@ block-snowrock-full index: -1 block-snowrocks-full rotate: false - xy: 725, 552 + xy: 759, 552 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-full rotate: false - xy: 759, 552 + xy: 793, 552 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 759, 552 + xy: 793, 552 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3513,21 +3527,21 @@ solar-panel-large index: -1 block-sorter-full rotate: false - xy: 793, 552 + xy: 717, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 793, 552 + xy: 717, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-full rotate: false - xy: 717, 518 + xy: 717, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3555,7 +3569,7 @@ block-spore-cluster-full index: -1 block-spore-moss-full rotate: false - xy: 717, 484 + xy: 751, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3576,14 +3590,14 @@ block-spore-press-full index: -1 block-sporerocks-full rotate: false - xy: 751, 518 + xy: 785, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-full rotate: false - xy: 785, 518 + xy: 751, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3604,14 +3618,14 @@ surge-tower index: -1 block-surge-wall-full rotate: false - xy: 751, 484 + xy: 785, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 751, 484 + xy: 785, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3639,14 +3653,14 @@ block-swarmer-full index: -1 block-tainted-water-full rotate: false - xy: 785, 484 + xy: 783, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-full rotate: false - xy: 783, 450 + xy: 783, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3667,7 +3681,7 @@ tau-mech-pad index: -1 block-tendrils-full rotate: false - xy: 783, 416 + xy: 783, 382 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3716,14 +3730,14 @@ thorium-reactor index: -1 block-thorium-wall-full rotate: false - xy: 783, 382 + xy: 783, 348 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 783, 382 + xy: 783, 348 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3765,28 +3779,28 @@ block-titan-factory-full index: -1 block-titanium-conveyor-full rotate: false - xy: 783, 348 + xy: 783, 314 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 783, 348 + xy: 783, 314 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-full rotate: false - xy: 783, 314 + xy: 819, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 783, 314 + xy: 819, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3835,14 +3849,14 @@ turbine-generator index: -1 block-unloader-full rotate: false - xy: 819, 518 + xy: 819, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 819, 518 + xy: 819, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3870,7 +3884,7 @@ block-water-extractor-full index: -1 block-water-full rotate: false - xy: 819, 484 + xy: 817, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3905,56 +3919,56 @@ block-wraith-factory-full index: -1 cracks-1-0 rotate: false - xy: 1516, 761 + xy: 1516, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1516, 727 + xy: 1550, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 1550, 757 + xy: 1550, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 1550, 723 + xy: 1584, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1584, 747 + xy: 1584, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 1584, 713 + xy: 1618, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1618, 747 + xy: 1618, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 1618, 713 + xy: 1534, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4192,7 +4206,7 @@ cyclone index: -1 duo rotate: false - xy: 1568, 679 + xy: 1602, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4206,7 +4220,7 @@ fuse index: -1 hail rotate: false - xy: 1602, 679 + xy: 1534, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4220,7 +4234,7 @@ item-blast-compound-large index: -1 item-blast-compound-medium rotate: false - xy: 1568, 645 + xy: 1602, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4255,7 +4269,7 @@ item-coal-large index: -1 item-coal-medium rotate: false - xy: 1636, 679 + xy: 1636, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4290,7 +4304,7 @@ item-copper-large index: -1 item-copper-medium rotate: false - xy: 1679, 1201 + xy: 1721, 1209 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4325,7 +4339,7 @@ item-graphite-large index: -1 item-graphite-medium rotate: false - xy: 1755, 1233 + xy: 1755, 1199 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4360,14 +4374,14 @@ item-lead-large index: -1 item-lead-medium rotate: false - xy: 1789, 1233 + xy: 1789, 1199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 1701, 843 + xy: 1701, 809 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4395,7 +4409,7 @@ item-metaglass-large index: -1 item-metaglass-medium rotate: false - xy: 1823, 1237 + xy: 1823, 1203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4430,7 +4444,7 @@ item-phase-fabric-large index: -1 item-phase-fabric-medium rotate: false - xy: 1857, 1237 + xy: 1857, 1203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4465,7 +4479,7 @@ item-plastanium-large index: -1 item-plastanium-medium rotate: false - xy: 1891, 1237 + xy: 1891, 1203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4500,7 +4514,7 @@ item-pyratite-large index: -1 item-pyratite-medium rotate: false - xy: 1925, 1237 + xy: 1925, 1203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4535,7 +4549,7 @@ item-sand-large index: -1 item-sand-medium rotate: false - xy: 1959, 1237 + xy: 1959, 1203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4570,21 +4584,21 @@ item-scrap-large index: -1 item-scrap-medium rotate: false - xy: 1993, 1237 + xy: 1993, 1203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 1701, 817 + xy: 1735, 875 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 2018, 1853 + xy: 1761, 831 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4605,14 +4619,14 @@ item-silicon-large index: -1 item-silicon-medium rotate: false - xy: 1637, 1159 + xy: 1633, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 1735, 875 + xy: 1761, 901 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4640,14 +4654,14 @@ item-spore-pod-large index: -1 item-spore-pod-medium rotate: false - xy: 1633, 1087 + xy: 1633, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 1761, 901 + xy: 1986, 1923 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4675,14 +4689,14 @@ item-surge-alloy-large index: -1 item-surge-alloy-medium rotate: false - xy: 1633, 1019 + xy: 1633, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1986, 1923 + xy: 475, 488 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4710,14 +4724,14 @@ item-thorium-large index: -1 item-thorium-medium rotate: false - xy: 1633, 951 + xy: 1633, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 475, 488 + xy: 1735, 849 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4745,14 +4759,14 @@ item-titanium-large index: -1 item-titanium-medium rotate: false - xy: 1633, 883 + xy: 1633, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1701, 791 + xy: 1761, 875 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4787,14 +4801,14 @@ liquid-cryofluid-large index: -1 liquid-cryofluid-medium rotate: false - xy: 1633, 815 + xy: 1633, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 1761, 875 + xy: 1761, 849 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4822,21 +4836,21 @@ liquid-oil-large index: -1 liquid-oil-medium rotate: false - xy: 1652, 747 + xy: 1652, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 2012, 1923 + xy: 1701, 783 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 2018, 1835 + xy: 233, 5 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4857,21 +4871,21 @@ liquid-slag-large index: -1 liquid-slag-medium rotate: false - xy: 1857, 1169 + xy: 1891, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 2018, 1897 + xy: 2012, 1923 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 233, 5 + xy: 2027, 1217 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4892,21 +4906,21 @@ liquid-water-large index: -1 liquid-water-medium rotate: false - xy: 1925, 1169 + xy: 1959, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 2018, 1871 + xy: 1735, 823 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 2027, 1217 + xy: 1795, 1077 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4990,7 +5004,7 @@ meltdown index: -1 repair-point rotate: false - xy: 1883, 1101 + xy: 1917, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -5018,7 +5032,7 @@ scatter index: -1 scorch rotate: false - xy: 1985, 1101 + xy: 1021, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -5095,140 +5109,140 @@ wave index: -1 item-blast-compound rotate: false - xy: 1534, 655 + xy: 1568, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1602, 645 + xy: 1636, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1636, 645 + xy: 1679, 1201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 1721, 1209 + xy: 1755, 1233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 1755, 1199 + xy: 1789, 1233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 1789, 1199 + xy: 1823, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 1823, 1203 + xy: 1857, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 1857, 1203 + xy: 1891, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 1891, 1203 + xy: 1925, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 1925, 1203 + xy: 1959, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 1959, 1203 + xy: 1993, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1993, 1203 + xy: 1637, 1159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 1633, 1121 + xy: 1633, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1633, 1053 + xy: 1633, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1633, 985 + xy: 1633, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1633, 917 + xy: 1633, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1633, 849 + xy: 1633, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 1633, 781 + xy: 1652, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1823, 1169 + xy: 1857, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1891, 1169 + xy: 1925, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8325,20 +8339,27 @@ incinerator-icon-editor orig: 32, 32 offset: 0, 0 index: -1 -item-source-icon-editor +inverted-sorter-icon-editor rotate: false xy: 1311, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -item-void-icon-editor +item-source-icon-editor rotate: false xy: 1345, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +item-void-icon-editor + rotate: false + xy: 1379, 819 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 javelin-ship-pad-icon-editor rotate: false xy: 1735, 853 @@ -8348,7 +8369,7 @@ javelin-ship-pad-icon-editor index: -1 junction-icon-editor rotate: false - xy: 1379, 819 + xy: 1413, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8390,21 +8411,21 @@ launch-pad-large-icon-editor index: -1 liquid-junction-icon-editor rotate: false - xy: 1413, 819 + xy: 1447, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1447, 819 + xy: 1481, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1481, 819 + xy: 1515, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8432,7 +8453,7 @@ mechanical-drill-icon-editor index: -1 mechanical-pump-icon-editor rotate: false - xy: 1515, 819 + xy: 1549, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8446,7 +8467,7 @@ meltdown-icon-editor index: -1 melter-icon-editor rotate: false - xy: 1549, 819 + xy: 1583, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8460,14 +8481,14 @@ mend-projector-icon-editor index: -1 mender-icon-editor rotate: false - xy: 1583, 819 + xy: 1617, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1617, 819 + xy: 1651, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8502,14 +8523,14 @@ overdrive-projector-icon-editor index: -1 overflow-gate-icon-editor rotate: false - xy: 1651, 819 + xy: 1685, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1685, 819 + xy: 1719, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8523,21 +8544,21 @@ phantom-factory-icon-editor index: -1 phase-conduit-icon-editor rotate: false - xy: 1719, 819 + xy: 1753, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1753, 819 + xy: 1787, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1787, 819 + xy: 1821, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8579,7 +8600,7 @@ pneumatic-drill-icon-editor index: -1 power-node-icon-editor rotate: false - xy: 1821, 819 + xy: 1855, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8593,28 +8614,28 @@ power-node-large-icon-editor index: -1 power-source-icon-editor rotate: false - xy: 1855, 819 + xy: 1889, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1889, 819 + xy: 1923, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1923, 819 + xy: 1957, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1957, 819 + xy: 717, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8628,7 +8649,7 @@ pyratite-mixer-icon-editor index: -1 repair-point-icon-editor rotate: false - xy: 717, 785 + xy: 717, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8656,7 +8677,7 @@ rock-icon-editor index: -1 rocks-icon-editor rotate: false - xy: 717, 751 + xy: 751, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8670,7 +8691,7 @@ rotary-pump-icon-editor index: -1 router-icon-editor rotate: false - xy: 751, 785 + xy: 717, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8684,7 +8705,7 @@ rtg-generator-icon-editor index: -1 saltrocks-icon-editor rotate: false - xy: 717, 717 + xy: 785, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8698,14 +8719,14 @@ salvo-icon-editor index: -1 sand-boulder-icon-editor rotate: false - xy: 785, 785 + xy: 751, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 751, 751 + xy: 717, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8719,7 +8740,7 @@ scatter-icon-editor index: -1 scorch-icon-editor rotate: false - xy: 717, 683 + xy: 819, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8740,7 +8761,7 @@ scrap-wall-huge-icon-editor index: -1 scrap-wall-icon-editor rotate: false - xy: 819, 785 + xy: 785, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8761,28 +8782,28 @@ separator-icon-editor index: -1 shale-boulder-icon-editor rotate: false - xy: 785, 751 + xy: 751, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-editor rotate: false - xy: 751, 717 + xy: 717, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 717, 649 + xy: 853, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 853, 785 + xy: 819, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8796,7 +8817,7 @@ silicon-smelter-icon-editor index: -1 snow-icon-editor rotate: false - xy: 819, 751 + xy: 785, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8817,14 +8838,14 @@ snowrock-icon-editor index: -1 snowrocks-icon-editor rotate: false - xy: 785, 717 + xy: 751, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 751, 683 + xy: 717, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8838,14 +8859,14 @@ solar-panel-large-icon-editor index: -1 sorter-icon-editor rotate: false - xy: 717, 615 + xy: 887, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 887, 785 + xy: 853, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8887,7 +8908,7 @@ spore-press-icon-editor index: -1 sporerocks-icon-editor rotate: false - xy: 853, 751 + xy: 819, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8901,7 +8922,7 @@ surge-tower-icon-editor index: -1 surge-wall-icon-editor rotate: false - xy: 819, 717 + xy: 785, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8929,7 +8950,7 @@ tau-mech-pad-icon-editor index: -1 tendrils-icon-editor rotate: false - xy: 785, 683 + xy: 751, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8957,7 +8978,7 @@ thorium-reactor-icon-editor index: -1 thorium-wall-icon-editor rotate: false - xy: 751, 649 + xy: 717, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8985,14 +9006,14 @@ titan-factory-icon-editor index: -1 titanium-conveyor-icon-editor rotate: false - xy: 717, 581 + xy: 921, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 921, 785 + xy: 887, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9020,7 +9041,7 @@ turbine-generator-icon-editor index: -1 unloader-icon-editor rotate: false - xy: 887, 751 + xy: 853, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9069,6 +9090,10025 @@ wraith-factory-icon-editor index: -1 sprites4.png +size: 2048,1024 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +bar + rotate: false + xy: 967, 262 + size: 27, 36 + split: 9, 9, 9, 9 + orig: 27, 36 + offset: 0, 0 + index: -1 +bar-top + rotate: false + xy: 967, 300 + size: 27, 36 + split: 9, 10, 9, 10 + orig: 27, 36 + offset: 0, 0 + index: -1 +block-alloy-smelter-large + rotate: false + xy: 301, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-alloy-smelter-medium + rotate: false + xy: 2009, 941 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-alloy-smelter-small + rotate: false + xy: 2023, 575 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-alloy-smelter-tiny + rotate: false + xy: 2023, 505 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-alloy-smelter-xlarge + rotate: false + xy: 1, 670 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-arc-large + rotate: false + xy: 301, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-arc-medium + rotate: false + xy: 2009, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-arc-small + rotate: false + xy: 2023, 549 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-arc-tiny + rotate: false + xy: 338, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-arc-xlarge + rotate: false + xy: 259, 928 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-armored-conveyor-large + rotate: false + xy: 343, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-armored-conveyor-medium + rotate: false + xy: 2009, 873 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-small + rotate: false + xy: 2023, 523 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-armored-conveyor-tiny + rotate: false + xy: 356, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-armored-conveyor-xlarge + rotate: false + xy: 1, 620 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-large + rotate: false + xy: 301, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 343, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 2009, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-large-small + rotate: false + xy: 581, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-large-tiny + rotate: false + xy: 374, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-large-xlarge + rotate: false + xy: 259, 878 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-medium + rotate: false + xy: 2009, 805 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-small + rotate: false + xy: 607, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-tiny + rotate: false + xy: 392, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-xlarge + rotate: false + xy: 1, 570 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-drill-large + rotate: false + xy: 385, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-drill-medium + rotate: false + xy: 2009, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-drill-small + rotate: false + xy: 633, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-drill-tiny + rotate: false + xy: 410, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-drill-xlarge + rotate: false + xy: 259, 828 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-mixer-large + rotate: false + xy: 301, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-mixer-medium + rotate: false + xy: 1441, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-mixer-small + rotate: false + xy: 659, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-mixer-tiny + rotate: false + xy: 428, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-mixer-xlarge + rotate: false + xy: 1, 520 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-bridge-conduit-large + rotate: false + xy: 343, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conduit-medium + rotate: false + xy: 1475, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conduit-small + rotate: false + xy: 685, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conduit-tiny + rotate: false + xy: 446, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conduit-xlarge + rotate: false + xy: 259, 778 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-bridge-conveyor-large + rotate: false + xy: 385, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conveyor-medium + rotate: false + xy: 1509, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conveyor-small + rotate: false + xy: 841, 274 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conveyor-tiny + rotate: false + xy: 464, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conveyor-xlarge + rotate: false + xy: 1, 470 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-char-large + rotate: false + xy: 427, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-char-medium + rotate: false + xy: 1543, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-char-small + rotate: false + xy: 2021, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-char-tiny + rotate: false + xy: 482, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-char-xlarge + rotate: false + xy: 1, 420 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cliffs-large + rotate: false + xy: 301, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cliffs-medium + rotate: false + xy: 1577, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliffs-small + rotate: false + xy: 2021, 719 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cliffs-tiny + rotate: false + xy: 1, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cliffs-xlarge + rotate: false + xy: 1, 370 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-coal-centrifuge-large + rotate: false + xy: 343, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-coal-centrifuge-medium + rotate: false + xy: 1611, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-coal-centrifuge-small + rotate: false + xy: 815, 266 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-coal-centrifuge-tiny + rotate: false + xy: 847, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-coal-centrifuge-xlarge + rotate: false + xy: 1, 320 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-combustion-generator-large + rotate: false + xy: 385, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-combustion-generator-medium + rotate: false + xy: 1645, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-combustion-generator-small + rotate: false + xy: 963, 236 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-combustion-generator-tiny + rotate: false + xy: 1003, 408 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-combustion-generator-xlarge + rotate: false + xy: 1, 270 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-command-center-large + rotate: false + xy: 427, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-command-center-medium + rotate: false + xy: 1679, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-small + rotate: false + xy: 841, 248 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-command-center-tiny + rotate: false + xy: 1025, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-command-center-xlarge + rotate: false + xy: 1, 220 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conduit-large + rotate: false + xy: 469, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conduit-medium + rotate: false + xy: 1713, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-small + rotate: false + xy: 841, 222 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conduit-tiny + rotate: false + xy: 1545, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conduit-xlarge + rotate: false + xy: 1, 170 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-container-large + rotate: false + xy: 301, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-container-medium + rotate: false + xy: 1747, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-small + rotate: false + xy: 867, 242 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-container-tiny + rotate: false + xy: 19, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-container-xlarge + rotate: false + xy: 1, 120 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conveyor-large + rotate: false + xy: 343, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conveyor-medium + rotate: false + xy: 1781, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-small + rotate: false + xy: 841, 196 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conveyor-tiny + rotate: false + xy: 1043, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conveyor-xlarge + rotate: false + xy: 1, 70 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-large + rotate: false + xy: 385, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-large + rotate: false + xy: 427, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 1815, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-large-small + rotate: false + xy: 867, 216 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-large-tiny + rotate: false + xy: 1545, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-large-xlarge + rotate: false + xy: 1, 20 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-medium + rotate: false + xy: 1849, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-small + rotate: false + xy: 867, 190 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-tiny + rotate: false + xy: 1563, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-xlarge + rotate: false + xy: 87, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-foundation-large + rotate: false + xy: 469, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-foundation-medium + rotate: false + xy: 1883, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-small + rotate: false + xy: 893, 216 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-foundation-tiny + rotate: false + xy: 1061, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-foundation-xlarge + rotate: false + xy: 137, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-nucleus-large + rotate: false + xy: 511, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-nucleus-medium + rotate: false + xy: 1917, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-nucleus-small + rotate: false + xy: 893, 190 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-nucleus-tiny + rotate: false + xy: 1563, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-nucleus-xlarge + rotate: false + xy: 187, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-shard-large + rotate: false + xy: 301, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-shard-medium + rotate: false + xy: 1951, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-shard-small + rotate: false + xy: 919, 216 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-shard-tiny + rotate: false + xy: 1581, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-shard-xlarge + rotate: false + xy: 345, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-craters-large + rotate: false + xy: 343, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-craters-medium + rotate: false + xy: 343, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-small + rotate: false + xy: 919, 190 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-craters-tiny + rotate: false + xy: 1079, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-craters-xlarge + rotate: false + xy: 395, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-crawler-factory-large + rotate: false + xy: 385, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-crawler-factory-medium + rotate: false + xy: 377, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-crawler-factory-small + rotate: false + xy: 867, 164 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-crawler-factory-tiny + rotate: false + xy: 1581, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-crawler-factory-xlarge + rotate: false + xy: 445, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cryofluidmixer-large + rotate: false + xy: 427, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cryofluidmixer-medium + rotate: false + xy: 411, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluidmixer-small + rotate: false + xy: 867, 138 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cryofluidmixer-tiny + rotate: false + xy: 1599, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cryofluidmixer-xlarge + rotate: false + xy: 495, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cultivator-large + rotate: false + xy: 469, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cultivator-medium + rotate: false + xy: 445, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cultivator-small + rotate: false + xy: 893, 164 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cultivator-tiny + rotate: false + xy: 1097, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cultivator-xlarge + rotate: false + xy: 545, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cyclone-large + rotate: false + xy: 511, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cyclone-medium + rotate: false + xy: 479, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cyclone-small + rotate: false + xy: 867, 112 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cyclone-tiny + rotate: false + xy: 1599, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cyclone-xlarge + rotate: false + xy: 595, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dagger-factory-large + rotate: false + xy: 553, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dagger-factory-medium + rotate: false + xy: 595, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dagger-factory-small + rotate: false + xy: 893, 138 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dagger-factory-tiny + rotate: false + xy: 1617, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dagger-factory-xlarge + rotate: false + xy: 645, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-metal-large + rotate: false + xy: 301, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-metal-medium + rotate: false + xy: 513, 32 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-small + rotate: false + xy: 919, 164 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-metal-tiny + rotate: false + xy: 1115, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-metal-xlarge + rotate: false + xy: 695, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-1-large + rotate: false + xy: 343, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-1-medium + rotate: false + xy: 591, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-1-small + rotate: false + xy: 867, 86 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-1-tiny + rotate: false + xy: 1617, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-1-xlarge + rotate: false + xy: 745, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-2-large + rotate: false + xy: 385, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-2-medium + rotate: false + xy: 637, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-2-small + rotate: false + xy: 893, 112 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-2-tiny + rotate: false + xy: 1635, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-2-xlarge + rotate: false + xy: 795, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-3-large + rotate: false + xy: 427, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-3-medium + rotate: false + xy: 633, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-3-small + rotate: false + xy: 919, 138 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-3-tiny + rotate: false + xy: 1133, 278 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-3-xlarge + rotate: false + xy: 845, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-4-large + rotate: false + xy: 469, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-4-medium + rotate: false + xy: 679, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-4-small + rotate: false + xy: 893, 86 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-4-tiny + rotate: false + xy: 1635, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-4-xlarge + rotate: false + xy: 895, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-5-large + rotate: false + xy: 511, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 721, 284 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 919, 112 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 1653, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge + rotate: false + xy: 945, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-6-large + rotate: false + xy: 553, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-6-medium + rotate: false + xy: 763, 326 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-6-small + rotate: false + xy: 919, 86 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-6-tiny + rotate: false + xy: 1653, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-6-xlarge + rotate: false + xy: 995, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-large + rotate: false + xy: 595, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-medium + rotate: false + xy: 805, 368 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-small + rotate: false + xy: 2021, 693 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-large + rotate: false + xy: 301, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 847, 410 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 513, 6 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 1671, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-xlarge + rotate: false + xy: 1045, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-tiny + rotate: false + xy: 1671, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-large + rotate: false + xy: 343, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 889, 452 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 996, 249 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 1689, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge + rotate: false + xy: 1095, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-xlarge + rotate: false + xy: 1145, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dart-mech-pad-large + rotate: false + xy: 385, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dart-mech-pad-medium + rotate: false + xy: 931, 494 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dart-mech-pad-small + rotate: false + xy: 945, 210 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dart-mech-pad-tiny + rotate: false + xy: 1689, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dart-mech-pad-xlarge + rotate: false + xy: 1195, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-deepwater-large + rotate: false + xy: 427, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-deepwater-medium + rotate: false + xy: 973, 536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-deepwater-small + rotate: false + xy: 945, 184 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-deepwater-tiny + rotate: false + xy: 1707, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-deepwater-xlarge + rotate: false + xy: 1245, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-delta-mech-pad-large + rotate: false + xy: 469, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-delta-mech-pad-medium + rotate: false + xy: 1015, 578 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-delta-mech-pad-small + rotate: false + xy: 945, 158 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-delta-mech-pad-tiny + rotate: false + xy: 1707, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-delta-mech-pad-xlarge + rotate: false + xy: 1295, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-differential-generator-large + rotate: false + xy: 511, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-differential-generator-medium + rotate: false + xy: 1057, 620 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-differential-generator-small + rotate: false + xy: 945, 132 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-differential-generator-tiny + rotate: false + xy: 1725, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-differential-generator-xlarge + rotate: false + xy: 1345, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-distributor-large + rotate: false + xy: 553, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-distributor-medium + rotate: false + xy: 1099, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-distributor-small + rotate: false + xy: 945, 106 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-distributor-tiny + rotate: false + xy: 1725, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-distributor-xlarge + rotate: false + xy: 1395, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-large + rotate: false + xy: 595, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-large + rotate: false + xy: 637, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 1133, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-large-small + rotate: false + xy: 945, 80 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-large-tiny + rotate: false + xy: 1743, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-large-xlarge + rotate: false + xy: 1445, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-medium + rotate: false + xy: 1167, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-small + rotate: false + xy: 971, 210 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-tiny + rotate: false + xy: 1743, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-xlarge + rotate: false + xy: 1495, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-draug-factory-large + rotate: false + xy: 301, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-draug-factory-medium + rotate: false + xy: 1201, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-draug-factory-small + rotate: false + xy: 971, 184 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-draug-factory-tiny + rotate: false + xy: 1761, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-draug-factory-xlarge + rotate: false + xy: 1545, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dunerocks-large + rotate: false + xy: 343, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dunerocks-medium + rotate: false + xy: 1235, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dunerocks-small + rotate: false + xy: 971, 158 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dunerocks-tiny + rotate: false + xy: 1761, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dunerocks-xlarge + rotate: false + xy: 1595, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-duo-large + rotate: false + xy: 385, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-duo-medium + rotate: false + xy: 1269, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-small + rotate: false + xy: 971, 132 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-duo-tiny + rotate: false + xy: 1779, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-duo-xlarge + rotate: false + xy: 1645, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-force-projector-large + rotate: false + xy: 427, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-force-projector-medium + rotate: false + xy: 1303, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-force-projector-small + rotate: false + xy: 971, 106 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-force-projector-tiny + rotate: false + xy: 1779, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-force-projector-xlarge + rotate: false + xy: 1695, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fortress-factory-large + rotate: false + xy: 469, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fortress-factory-medium + rotate: false + xy: 1337, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fortress-factory-small + rotate: false + xy: 971, 80 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fortress-factory-tiny + rotate: false + xy: 1797, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fortress-factory-xlarge + rotate: false + xy: 1745, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fuse-large + rotate: false + xy: 511, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fuse-medium + rotate: false + xy: 1371, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fuse-small + rotate: false + xy: 997, 223 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fuse-tiny + rotate: false + xy: 1797, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fuse-xlarge + rotate: false + xy: 1795, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ghoul-factory-large + rotate: false + xy: 553, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ghoul-factory-medium + rotate: false + xy: 1405, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ghoul-factory-small + rotate: false + xy: 997, 197 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ghoul-factory-tiny + rotate: false + xy: 1815, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ghoul-factory-xlarge + rotate: false + xy: 1845, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-large + rotate: false + xy: 595, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-medium + rotate: false + xy: 1439, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-small + rotate: false + xy: 997, 171 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-tiny + rotate: false + xy: 1815, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-xlarge + rotate: false + xy: 1895, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-graphite-press-large + rotate: false + xy: 637, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-graphite-press-medium + rotate: false + xy: 1473, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-graphite-press-small + rotate: false + xy: 997, 145 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-graphite-press-tiny + rotate: false + xy: 1833, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-graphite-press-xlarge + rotate: false + xy: 1945, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-grass-large + rotate: false + xy: 679, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-grass-medium + rotate: false + xy: 1507, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-small + rotate: false + xy: 997, 119 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-grass-tiny + rotate: false + xy: 1833, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-grass-xlarge + rotate: false + xy: 1995, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hail-large + rotate: false + xy: 301, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hail-medium + rotate: false + xy: 1541, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-small + rotate: false + xy: 997, 93 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hail-tiny + rotate: false + xy: 1851, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hail-xlarge + rotate: false + xy: 237, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-holostone-large + rotate: false + xy: 343, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-holostone-medium + rotate: false + xy: 1575, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-holostone-small + rotate: false + xy: 997, 67 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-holostone-tiny + rotate: false + xy: 1851, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-holostone-xlarge + rotate: false + xy: 51, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hotrock-large + rotate: false + xy: 385, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hotrock-medium + rotate: false + xy: 1609, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-small + rotate: false + xy: 867, 60 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hotrock-tiny + rotate: false + xy: 1869, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hotrock-xlarge + rotate: false + xy: 51, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-large + rotate: false + xy: 427, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-medium + rotate: false + xy: 1643, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-small + rotate: false + xy: 893, 60 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-large + rotate: false + xy: 469, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 1677, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 919, 60 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 1869, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-snow-xlarge + rotate: false + xy: 101, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-tiny + rotate: false + xy: 1887, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-xlarge + rotate: false + xy: 51, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-icerocks-large + rotate: false + xy: 511, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-icerocks-medium + rotate: false + xy: 1711, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icerocks-small + rotate: false + xy: 945, 54 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-icerocks-tiny + rotate: false + xy: 1887, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-icerocks-xlarge + rotate: false + xy: 101, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ignarock-large + rotate: false + xy: 553, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ignarock-medium + rotate: false + xy: 1745, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ignarock-small + rotate: false + xy: 971, 54 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ignarock-tiny + rotate: false + xy: 1905, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ignarock-xlarge + rotate: false + xy: 151, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-impact-reactor-large + rotate: false + xy: 595, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-impact-reactor-medium + rotate: false + xy: 1779, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-small + rotate: false + xy: 997, 41 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-impact-reactor-tiny + rotate: false + xy: 1905, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-impact-reactor-xlarge + rotate: false + xy: 51, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-incinerator-large + rotate: false + xy: 637, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-incinerator-medium + rotate: false + xy: 1813, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-incinerator-small + rotate: false + xy: 1399, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-incinerator-tiny + rotate: false + xy: 1923, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-incinerator-xlarge + rotate: false + xy: 101, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-inverted-sorter-large + rotate: false + xy: 679, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-inverted-sorter-medium + rotate: false + xy: 1847, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-inverted-sorter-small + rotate: false + xy: 1425, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-inverted-sorter-tiny + rotate: false + xy: 1923, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-inverted-sorter-xlarge + rotate: false + xy: 151, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-item-source-large + rotate: false + xy: 721, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-source-medium + rotate: false + xy: 1881, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-source-small + rotate: false + xy: 1451, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-source-tiny + rotate: false + xy: 1941, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-source-xlarge + rotate: false + xy: 201, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-item-void-large + rotate: false + xy: 301, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-void-medium + rotate: false + xy: 1915, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-void-small + rotate: false + xy: 1477, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-void-tiny + rotate: false + xy: 1941, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-void-xlarge + rotate: false + xy: 51, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-large + rotate: false + xy: 343, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-medium + rotate: false + xy: 1949, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-small + rotate: false + xy: 1503, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-tiny + rotate: false + xy: 2019, 675 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-xlarge + rotate: false + xy: 101, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-junction-large + rotate: false + xy: 385, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-junction-medium + rotate: false + xy: 553, 74 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-junction-small + rotate: false + xy: 1529, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-junction-tiny + rotate: false + xy: 1048, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-junction-xlarge + rotate: false + xy: 151, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-kiln-large + rotate: false + xy: 427, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-kiln-medium + rotate: false + xy: 587, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-kiln-small + rotate: false + xy: 1555, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-kiln-tiny + rotate: false + xy: 1066, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-kiln-xlarge + rotate: false + xy: 201, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-lancer-large + rotate: false + xy: 469, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-lancer-medium + rotate: false + xy: 1987, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-lancer-small + rotate: false + xy: 1581, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-lancer-tiny + rotate: false + xy: 1084, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-lancer-xlarge + rotate: false + xy: 51, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-laser-drill-large + rotate: false + xy: 511, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-laser-drill-medium + rotate: false + xy: 1987, 703 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-laser-drill-small + rotate: false + xy: 1607, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-laser-drill-tiny + rotate: false + xy: 1102, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-laser-drill-xlarge + rotate: false + xy: 101, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-large + rotate: false + xy: 553, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-large + rotate: false + xy: 595, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 1985, 669 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-large-small + rotate: false + xy: 1633, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-large-tiny + rotate: false + xy: 1120, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-large-xlarge + rotate: false + xy: 151, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-medium + rotate: false + xy: 1983, 635 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-small + rotate: false + xy: 1659, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-tiny + rotate: false + xy: 1138, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-xlarge + rotate: false + xy: 201, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-junction-large + rotate: false + xy: 637, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-junction-medium + rotate: false + xy: 629, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-junction-small + rotate: false + xy: 1685, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-junction-tiny + rotate: false + xy: 1156, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-junction-xlarge + rotate: false + xy: 51, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-router-large + rotate: false + xy: 679, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-router-medium + rotate: false + xy: 625, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-small + rotate: false + xy: 1711, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-router-tiny + rotate: false + xy: 1174, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-router-xlarge + rotate: false + xy: 101, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-source-large + rotate: false + xy: 721, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-source-medium + rotate: false + xy: 621, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-source-small + rotate: false + xy: 1737, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-source-tiny + rotate: false + xy: 1192, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-source-xlarge + rotate: false + xy: 151, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-tank-large + rotate: false + xy: 763, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-tank-medium + rotate: false + xy: 671, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-small + rotate: false + xy: 1763, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-tank-tiny + rotate: false + xy: 1210, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-tank-xlarge + rotate: false + xy: 201, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-magmarock-large + rotate: false + xy: 301, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-magmarock-medium + rotate: false + xy: 667, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-small + rotate: false + xy: 1789, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-magmarock-tiny + rotate: false + xy: 1228, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-magmarock-xlarge + rotate: false + xy: 51, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mass-driver-large + rotate: false + xy: 343, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mass-driver-medium + rotate: false + xy: 663, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-small + rotate: false + xy: 1815, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mass-driver-tiny + rotate: false + xy: 1246, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mass-driver-xlarge + rotate: false + xy: 101, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-drill-large + rotate: false + xy: 385, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-drill-medium + rotate: false + xy: 713, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-drill-small + rotate: false + xy: 1841, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-drill-tiny + rotate: false + xy: 1264, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mechanical-drill-xlarge + rotate: false + xy: 151, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-pump-large + rotate: false + xy: 427, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-pump-medium + rotate: false + xy: 705, 208 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-pump-small + rotate: false + xy: 1867, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-pump-tiny + rotate: false + xy: 1282, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mechanical-pump-xlarge + rotate: false + xy: 201, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-meltdown-large + rotate: false + xy: 469, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-meltdown-medium + rotate: false + xy: 705, 174 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-meltdown-small + rotate: false + xy: 1893, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-meltdown-tiny + rotate: false + xy: 1300, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-meltdown-xlarge + rotate: false + xy: 51, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-melter-large + rotate: false + xy: 511, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-melter-medium + rotate: false + xy: 739, 208 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-melter-small + rotate: false + xy: 1919, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-melter-tiny + rotate: false + xy: 1318, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-melter-xlarge + rotate: false + xy: 101, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mend-projector-large + rotate: false + xy: 553, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mend-projector-medium + rotate: false + xy: 739, 174 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mend-projector-small + rotate: false + xy: 1945, 335 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mend-projector-tiny + rotate: false + xy: 1336, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mend-projector-xlarge + rotate: false + xy: 151, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mender-large + rotate: false + xy: 595, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mender-medium + rotate: false + xy: 797, 326 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mender-small + rotate: false + xy: 1971, 319 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mender-tiny + rotate: false + xy: 1354, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mender-xlarge + rotate: false + xy: 201, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-message-large + rotate: false + xy: 637, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-message-medium + rotate: false + xy: 839, 368 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-message-small + rotate: false + xy: 1997, 319 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-message-tiny + rotate: false + xy: 1372, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-message-xlarge + rotate: false + xy: 51, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-2-large + rotate: false + xy: 679, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-2-medium + rotate: false + xy: 831, 334 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-2-small + rotate: false + xy: 2023, 319 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-2-tiny + rotate: false + xy: 1390, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-2-xlarge + rotate: false + xy: 101, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-3-large + rotate: false + xy: 721, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-3-medium + rotate: false + xy: 831, 300 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-3-small + rotate: false + xy: 787, 12 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-3-tiny + rotate: false + xy: 1408, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-3-xlarge + rotate: false + xy: 151, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-5-large + rotate: false + xy: 763, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-5-medium + rotate: false + xy: 865, 334 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-5-small + rotate: false + xy: 1022, 249 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-5-tiny + rotate: false + xy: 1426, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-5-xlarge + rotate: false + xy: 201, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-large + rotate: false + xy: 805, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-medium + rotate: false + xy: 865, 300 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-small + rotate: false + xy: 1023, 223 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-tiny + rotate: false + xy: 1444, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-xlarge + rotate: false + xy: 51, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-large + rotate: false + xy: 301, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-medium + rotate: false + xy: 923, 452 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-small + rotate: false + xy: 1023, 197 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-tiny + rotate: false + xy: 1049, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-xlarge + rotate: false + xy: 101, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-moss-large + rotate: false + xy: 343, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-moss-medium + rotate: false + xy: 965, 494 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-small + rotate: false + xy: 1023, 171 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-moss-tiny + rotate: false + xy: 1049, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-moss-xlarge + rotate: false + xy: 151, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-multi-press-large + rotate: false + xy: 385, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-multi-press-medium + rotate: false + xy: 957, 460 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multi-press-small + rotate: false + xy: 1023, 145 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-multi-press-tiny + rotate: false + xy: 1067, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-multi-press-xlarge + rotate: false + xy: 201, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-oil-extractor-large + rotate: false + xy: 427, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-oil-extractor-medium + rotate: false + xy: 957, 426 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-oil-extractor-small + rotate: false + xy: 1023, 119 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-oil-extractor-tiny + rotate: false + xy: 1049, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-oil-extractor-xlarge + rotate: false + xy: 51, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-omega-mech-pad-large + rotate: false + xy: 469, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-omega-mech-pad-medium + rotate: false + xy: 991, 460 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-omega-mech-pad-small + rotate: false + xy: 1023, 93 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-omega-mech-pad-tiny + rotate: false + xy: 1085, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-omega-mech-pad-xlarge + rotate: false + xy: 101, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overdrive-projector-large + rotate: false + xy: 511, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overdrive-projector-medium + rotate: false + xy: 991, 426 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overdrive-projector-small + rotate: false + xy: 1023, 67 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overdrive-projector-tiny + rotate: false + xy: 1067, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overdrive-projector-xlarge + rotate: false + xy: 151, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overflow-gate-large + rotate: false + xy: 553, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overflow-gate-medium + rotate: false + xy: 1049, 578 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overflow-gate-small + rotate: false + xy: 1023, 41 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overflow-gate-tiny + rotate: false + xy: 1049, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overflow-gate-xlarge + rotate: false + xy: 201, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pebbles-large + rotate: false + xy: 595, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pebbles-medium + rotate: false + xy: 1095, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-small + rotate: false + xy: 795, 54 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pebbles-tiny + rotate: false + xy: 1103, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pebbles-xlarge + rotate: false + xy: 51, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phantom-factory-large + rotate: false + xy: 637, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phantom-factory-medium + rotate: false + xy: 1129, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phantom-factory-small + rotate: false + xy: 821, 54 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phantom-factory-tiny + rotate: false + xy: 1085, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phantom-factory-xlarge + rotate: false + xy: 101, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conduit-large + rotate: false + xy: 679, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conduit-medium + rotate: false + xy: 1163, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conduit-small + rotate: false + xy: 813, 28 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conduit-tiny + rotate: false + xy: 1067, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conduit-xlarge + rotate: false + xy: 151, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conveyor-large + rotate: false + xy: 721, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conveyor-medium + rotate: false + xy: 1197, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-small + rotate: false + xy: 813, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conveyor-tiny + rotate: false + xy: 1049, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conveyor-xlarge + rotate: false + xy: 201, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-large + rotate: false + xy: 763, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-large + rotate: false + xy: 805, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 1231, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-large-small + rotate: false + xy: 839, 28 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-large-tiny + rotate: false + xy: 1121, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-large-xlarge + rotate: false + xy: 101, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-medium + rotate: false + xy: 1265, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-small + rotate: false + xy: 839, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-tiny + rotate: false + xy: 1103, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-xlarge + rotate: false + xy: 151, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-weaver-large + rotate: false + xy: 847, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-weaver-medium + rotate: false + xy: 1299, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-small + rotate: false + xy: 865, 34 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-weaver-tiny + rotate: false + xy: 1085, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-weaver-xlarge + rotate: false + xy: 201, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pine-large + rotate: false + xy: 301, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pine-medium + rotate: false + xy: 1333, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pine-small + rotate: false + xy: 891, 34 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pine-tiny + rotate: false + xy: 1067, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pine-xlarge + rotate: false + xy: 151, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-large + rotate: false + xy: 343, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium + rotate: false + xy: 1367, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-compressor-small + rotate: false + xy: 865, 8 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-compressor-tiny + rotate: false + xy: 1049, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-compressor-xlarge + rotate: false + xy: 201, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pneumatic-drill-large + rotate: false + xy: 385, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 1401, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-small + rotate: false + xy: 917, 34 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pneumatic-drill-tiny + rotate: false + xy: 1139, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pneumatic-drill-xlarge + rotate: false + xy: 201, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-large + rotate: false + xy: 427, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-large + rotate: false + xy: 469, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 1435, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-small + rotate: false + xy: 891, 8 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-large-tiny + rotate: false + xy: 1121, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-large-xlarge + rotate: false + xy: 51, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 1469, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 917, 8 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1103, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 101, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large + rotate: false + xy: 511, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-source-medium + rotate: false + xy: 1503, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-source-small + rotate: false + xy: 943, 28 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-source-tiny + rotate: false + xy: 1085, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-source-xlarge + rotate: false + xy: 151, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-void-large + rotate: false + xy: 553, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-void-medium + rotate: false + xy: 1537, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-void-small + rotate: false + xy: 969, 28 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-void-tiny + rotate: false + xy: 1067, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-void-xlarge + rotate: false + xy: 201, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulse-conduit-large + rotate: false + xy: 595, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulse-conduit-medium + rotate: false + xy: 1571, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-small + rotate: false + xy: 943, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulse-conduit-tiny + rotate: false + xy: 1049, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulse-conduit-xlarge + rotate: false + xy: 251, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulverizer-large + rotate: false + xy: 637, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulverizer-medium + rotate: false + xy: 1605, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-small + rotate: false + xy: 969, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulverizer-tiny + rotate: false + xy: 1157, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulverizer-xlarge + rotate: false + xy: 251, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pyratite-mixer-large + rotate: false + xy: 679, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pyratite-mixer-medium + rotate: false + xy: 1639, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-small + rotate: false + xy: 995, 15 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pyratite-mixer-tiny + rotate: false + xy: 1139, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pyratite-mixer-xlarge + rotate: false + xy: 251, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-repair-point-large + rotate: false + xy: 721, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-repair-point-medium + rotate: false + xy: 1673, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-small + rotate: false + xy: 1021, 15 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-repair-point-tiny + rotate: false + xy: 1121, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-repair-point-xlarge + rotate: false + xy: 251, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-revenant-factory-large + rotate: false + xy: 763, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-revenant-factory-medium + rotate: false + xy: 1707, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-revenant-factory-small + rotate: false + xy: 1047, 15 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-revenant-factory-tiny + rotate: false + xy: 1103, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-revenant-factory-xlarge + rotate: false + xy: 251, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ripple-large + rotate: false + xy: 805, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ripple-medium + rotate: false + xy: 1741, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-small + rotate: false + xy: 998, 348 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ripple-tiny + rotate: false + xy: 1085, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ripple-xlarge + rotate: false + xy: 251, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rock-large + rotate: false + xy: 847, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rock-medium + rotate: false + xy: 1775, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rock-small + rotate: false + xy: 1003, 374 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rock-tiny + rotate: false + xy: 1067, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rock-xlarge + rotate: false + xy: 251, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rocks-large + rotate: false + xy: 889, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rocks-medium + rotate: false + xy: 1809, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rocks-small + rotate: false + xy: 1029, 374 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rocks-tiny + rotate: false + xy: 1049, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rocks-xlarge + rotate: false + xy: 251, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rotary-pump-large + rotate: false + xy: 301, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rotary-pump-medium + rotate: false + xy: 1843, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rotary-pump-small + rotate: false + xy: 1024, 348 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rotary-pump-tiny + rotate: false + xy: 1175, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rotary-pump-xlarge + rotate: false + xy: 251, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-router-large + rotate: false + xy: 343, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-router-medium + rotate: false + xy: 1877, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-router-small + rotate: false + xy: 1055, 374 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-router-tiny + rotate: false + xy: 1157, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-router-xlarge + rotate: false + xy: 251, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rtg-generator-large + rotate: false + xy: 385, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rtg-generator-medium + rotate: false + xy: 1911, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 1050, 348 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 1139, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge + rotate: false + xy: 251, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-large + rotate: false + xy: 427, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-medium + rotate: false + xy: 1945, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 1025, 322 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 1121, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 251, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-saltrocks-large + rotate: false + xy: 469, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-saltrocks-medium + rotate: false + xy: 1979, 601 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-saltrocks-small + rotate: false + xy: 1025, 296 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-saltrocks-tiny + rotate: false + xy: 1103, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-saltrocks-xlarge + rotate: false + xy: 251, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salvo-large + rotate: false + xy: 511, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salvo-medium + rotate: false + xy: 549, 40 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1051, 322 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1085, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 251, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large + rotate: false + xy: 553, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-boulder-medium + rotate: false + xy: 583, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 1051, 296 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1067, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge + rotate: false + xy: 309, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-large + rotate: false + xy: 595, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-medium + rotate: false + xy: 617, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 1076, 348 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 1049, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-large + rotate: false + xy: 637, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 547, 6 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1102, 348 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 1193, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge + rotate: false + xy: 309, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-xlarge + rotate: false + xy: 359, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sandrocks-large + rotate: false + xy: 679, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sandrocks-medium + rotate: false + xy: 659, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sandrocks-small + rotate: false + xy: 1077, 322 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sandrocks-tiny + rotate: false + xy: 1175, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sandrocks-xlarge + rotate: false + xy: 309, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scatter-large + rotate: false + xy: 721, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scatter-medium + rotate: false + xy: 655, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-small + rotate: false + xy: 1128, 348 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scatter-tiny + rotate: false + xy: 1157, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scatter-xlarge + rotate: false + xy: 359, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scorch-large + rotate: false + xy: 763, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scorch-medium + rotate: false + xy: 651, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-small + rotate: false + xy: 1077, 296 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scorch-tiny + rotate: false + xy: 1139, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scorch-xlarge + rotate: false + xy: 409, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-large + rotate: false + xy: 805, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-medium + rotate: false + xy: 697, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-small + rotate: false + xy: 1103, 322 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-tiny + rotate: false + xy: 1121, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-xlarge + rotate: false + xy: 359, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-large + rotate: false + xy: 847, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 693, 98 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-small + rotate: false + xy: 1103, 296 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-tiny + rotate: false + xy: 1103, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-xlarge + rotate: false + xy: 409, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-large + rotate: false + xy: 889, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-large + rotate: false + xy: 931, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 731, 140 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1129, 322 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 1085, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 459, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-medium + rotate: false + xy: 731, 106 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1129, 296 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1067, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 409, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large + rotate: false + xy: 343, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-separator-medium + rotate: false + xy: 765, 140 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-separator-small + rotate: false + xy: 1155, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-separator-tiny + rotate: false + xy: 1049, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-separator-xlarge + rotate: false + xy: 459, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-boulder-large + rotate: false + xy: 385, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 765, 106 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1181, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 1211, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge + rotate: false + xy: 509, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-large + rotate: false + xy: 427, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-medium + rotate: false + xy: 755, 284 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-small + rotate: false + xy: 1155, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-tiny + rotate: false + xy: 1193, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 459, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shalerocks-large + rotate: false + xy: 469, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shalerocks-medium + rotate: false + xy: 747, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shalerocks-small + rotate: false + xy: 1207, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shalerocks-tiny + rotate: false + xy: 1175, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shalerocks-xlarge + rotate: false + xy: 509, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shock-mine-large + rotate: false + xy: 511, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 789, 292 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1181, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shock-mine-tiny + rotate: false + xy: 1157, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shock-mine-xlarge + rotate: false + xy: 559, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shrubs-large + rotate: false + xy: 553, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 781, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 1233, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shrubs-tiny + rotate: false + xy: 1139, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shrubs-xlarge + rotate: false + xy: 509, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-smelter-large + rotate: false + xy: 595, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-smelter-medium + rotate: false + xy: 773, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-small + rotate: false + xy: 1207, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-smelter-tiny + rotate: false + xy: 1121, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-smelter-xlarge + rotate: false + xy: 559, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-large + rotate: false + xy: 637, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-medium + rotate: false + xy: 773, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large + rotate: false + xy: 679, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 807, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1259, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-pine-tiny + rotate: false + xy: 1103, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-pine-xlarge + rotate: false + xy: 609, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-small + rotate: false + xy: 1233, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-tiny + rotate: false + xy: 1085, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-xlarge + rotate: false + xy: 559, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrock-large + rotate: false + xy: 721, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrock-medium + rotate: false + xy: 807, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrock-small + rotate: false + xy: 1285, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrock-tiny + rotate: false + xy: 1067, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrock-xlarge + rotate: false + xy: 609, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrocks-large + rotate: false + xy: 763, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrocks-medium + rotate: false + xy: 799, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrocks-small + rotate: false + xy: 1259, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrocks-tiny + rotate: false + xy: 1049, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrocks-xlarge + rotate: false + xy: 659, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-large + rotate: false + xy: 805, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-large + rotate: false + xy: 847, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 799, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-large-small + rotate: false + xy: 1311, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-large-tiny + rotate: false + xy: 1229, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-large-xlarge + rotate: false + xy: 609, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-medium + rotate: false + xy: 833, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-small + rotate: false + xy: 1285, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-tiny + rotate: false + xy: 1211, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-xlarge + rotate: false + xy: 659, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sorter-large + rotate: false + xy: 889, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sorter-medium + rotate: false + xy: 833, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sorter-small + rotate: false + xy: 1337, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sorter-tiny + rotate: false + xy: 1193, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sorter-xlarge + rotate: false + xy: 709, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spawn-large + rotate: false + xy: 931, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spawn-medium + rotate: false + xy: 799, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-small + rotate: false + xy: 1311, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spawn-tiny + rotate: false + xy: 1175, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spawn-xlarge + rotate: false + xy: 659, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spectre-large + rotate: false + xy: 973, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spectre-medium + rotate: false + xy: 833, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-small + rotate: false + xy: 1363, 330 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spectre-tiny + rotate: false + xy: 1157, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spectre-xlarge + rotate: false + xy: 709, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spirit-factory-large + rotate: false + xy: 385, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spirit-factory-medium + rotate: false + xy: 881, 410 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spirit-factory-small + rotate: false + xy: 1337, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spirit-factory-tiny + rotate: false + xy: 1139, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spirit-factory-xlarge + rotate: false + xy: 759, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 427, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 873, 376 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1363, 304 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1121, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 709, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 469, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 915, 418 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1389, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1103, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 759, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 511, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 907, 376 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1415, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1085, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 809, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 553, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 899, 342 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1441, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1067, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 759, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sporerocks-large + rotate: false + xy: 595, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sporerocks-medium + rotate: false + xy: 899, 308 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sporerocks-small + rotate: false + xy: 1467, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sporerocks-tiny + rotate: false + xy: 1049, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sporerocks-xlarge + rotate: false + xy: 809, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 637, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 933, 342 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1493, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1247, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 859, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 679, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 933, 308 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1519, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1229, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 809, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 721, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 763, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 899, 274 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1545, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1211, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 859, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 933, 274 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1571, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1193, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 909, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 805, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 1007, 536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1597, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1175, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 859, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 847, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 999, 502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1623, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1157, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 909, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 889, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1041, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 1649, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1139, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 959, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tau-mech-pad-large + rotate: false + xy: 931, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tau-mech-pad-medium + rotate: false + xy: 1033, 502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tau-mech-pad-small + rotate: false + xy: 1675, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tau-mech-pad-tiny + rotate: false + xy: 1121, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tau-mech-pad-xlarge + rotate: false + xy: 909, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 973, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1025, 468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1701, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1103, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 959, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 1015, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 1025, 434 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 1727, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1085, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 1009, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 427, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 1075, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 1753, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1067, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 959, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 469, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 1067, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1779, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1265, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 1009, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 511, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 553, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1059, 468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1805, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1247, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 1059, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1059, 434 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1831, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1229, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 1009, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 595, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1025, 400 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1857, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1211, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 1059, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titan-factory-large + rotate: false + xy: 637, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titan-factory-medium + rotate: false + xy: 1059, 400 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titan-factory-small + rotate: false + xy: 1883, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titan-factory-tiny + rotate: false + xy: 1193, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titan-factory-xlarge + rotate: false + xy: 1109, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 679, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1101, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1909, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1175, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 1059, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 721, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 763, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1093, 476 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1935, 309 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1157, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 1109, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1093, 442 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1155, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1139, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge + rotate: false + xy: 1159, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-trident-ship-pad-large + rotate: false + xy: 805, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-trident-ship-pad-medium + rotate: false + xy: 1093, 408 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-trident-ship-pad-small + rotate: false + xy: 1181, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-trident-ship-pad-tiny + rotate: false + xy: 1121, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-trident-ship-pad-xlarge + rotate: false + xy: 1109, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-turbine-generator-large + rotate: false + xy: 847, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-turbine-generator-medium + rotate: false + xy: 1127, 476 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-turbine-generator-small + rotate: false + xy: 1207, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-turbine-generator-tiny + rotate: false + xy: 1103, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-turbine-generator-xlarge + rotate: false + xy: 1159, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 889, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1127, 442 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1233, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1085, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 1209, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 931, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1127, 408 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1259, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 1067, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 1159, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 973, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1093, 374 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1285, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 1283, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 1209, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 1015, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1127, 374 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1311, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 1265, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 1259, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 1057, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 2013, 601 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1337, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 1247, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 1209, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 469, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 685, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1363, 278 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 1229, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 1259, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 511, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 689, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1389, 283 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 1211, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 1309, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wraith-factory-large + rotate: false + xy: 553, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wraith-factory-medium + rotate: false + xy: 727, 72 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wraith-factory-small + rotate: false + xy: 1415, 283 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wraith-factory-tiny + rotate: false + xy: 1193, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wraith-factory-xlarge + rotate: false + xy: 1259, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +button + rotate: false + xy: 1137, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-disabled + rotate: false + xy: 595, 192 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-down + rotate: false + xy: 637, 234 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-1 + rotate: false + xy: 679, 276 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-2 + rotate: false + xy: 721, 318 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-3 + rotate: false + xy: 763, 360 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-4 + rotate: false + xy: 805, 402 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-over-4 + rotate: false + xy: 847, 444 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-over + rotate: false + xy: 889, 486 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-red + rotate: false + xy: 931, 528 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right + rotate: false + xy: 1057, 654 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-down + rotate: false + xy: 973, 570 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-over + rotate: false + xy: 1015, 612 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-select + rotate: false + xy: 1441, 283 + size: 24, 24 + split: 4, 4, 4, 4 + orig: 24, 24 + offset: 0, 0 + index: -1 +button-square + rotate: false + xy: 553, 108 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-square-down + rotate: false + xy: 1099, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-square-over + rotate: false + xy: 511, 66 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-trans + rotate: false + xy: 595, 163 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +check-disabled + rotate: false + xy: 761, 72 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-off + rotate: false + xy: 723, 38 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 757, 38 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on-disabled + rotate: false + xy: 719, 4 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on-over + rotate: false + xy: 753, 4 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-over + rotate: false + xy: 1091, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +clear + rotate: false + xy: 1081, 388 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +cursor + rotate: false + xy: 893, 262 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +discord-banner + rotate: false + xy: 1, 720 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +flat-down-base + rotate: false + xy: 1175, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +icon-about + rotate: false + xy: 1309, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-about-small + rotate: false + xy: 1125, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-about-smaller + rotate: false + xy: 2017, 637 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-about-tiny + rotate: false + xy: 1175, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-add + rotate: false + xy: 1359, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-add-small + rotate: false + xy: 1159, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-add-smaller + rotate: false + xy: 867, 268 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-add-tiny + rotate: false + xy: 1157, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-admin + rotate: false + xy: 1309, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-admin-badge + rotate: false + xy: 1359, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-admin-badge-small + rotate: false + xy: 1193, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-admin-badge-smaller + rotate: false + xy: 1399, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-admin-badge-tiny + rotate: false + xy: 1139, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-admin-small + rotate: false + xy: 1227, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-admin-smaller + rotate: false + xy: 1399, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-admin-tiny + rotate: false + xy: 1121, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow + rotate: false + xy: 1409, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-16 + rotate: false + xy: 1409, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-16-small + rotate: false + xy: 1261, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-small + rotate: false + xy: 1261, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-16-smaller + rotate: false + xy: 1431, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-smaller + rotate: false + xy: 1431, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-16-tiny + rotate: false + xy: 1103, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-tiny + rotate: false + xy: 1103, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-down + rotate: false + xy: 1359, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-down-small + rotate: false + xy: 1295, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-down-smaller + rotate: false + xy: 1399, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-down-tiny + rotate: false + xy: 1085, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-left + rotate: false + xy: 1409, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-left-small + rotate: false + xy: 1329, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-left-smaller + rotate: false + xy: 1431, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-left-tiny + rotate: false + xy: 1301, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-right + rotate: false + xy: 1459, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-right-small + rotate: false + xy: 1363, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-right-smaller + rotate: false + xy: 1463, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-right-tiny + rotate: false + xy: 1283, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-up + rotate: false + xy: 1409, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-up-small + rotate: false + xy: 1397, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-up-smaller + rotate: false + xy: 1399, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-up-tiny + rotate: false + xy: 1265, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-back + rotate: false + xy: 1459, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-back-small + rotate: false + xy: 1431, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-back-smaller + rotate: false + xy: 1431, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-back-tiny + rotate: false + xy: 1247, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-ban + rotate: false + xy: 1509, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-ban-small + rotate: false + xy: 1465, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-ban-smaller + rotate: false + xy: 1463, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-ban-tiny + rotate: false + xy: 1229, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-break + rotate: false + xy: 1459, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-break-small + rotate: false + xy: 1499, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-break-smaller + rotate: false + xy: 1495, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-break-tiny + rotate: false + xy: 1211, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cancel + rotate: false + xy: 1509, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-cancel-small + rotate: false + xy: 1533, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-cancel-smaller + rotate: false + xy: 1399, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-cancel-tiny + rotate: false + xy: 1193, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-quit-tiny + rotate: false + xy: 1193, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-changelog + rotate: false + xy: 1559, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-changelog-small + rotate: false + xy: 1567, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-changelog-smaller + rotate: false + xy: 1431, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-changelog-tiny + rotate: false + xy: 1175, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-chat + rotate: false + xy: 1509, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-chat-small + rotate: false + xy: 1601, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-chat-smaller + rotate: false + xy: 1463, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-chat-tiny + rotate: false + xy: 1157, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-check + rotate: false + xy: 1559, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-check-small + rotate: false + xy: 1635, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-check-smaller + rotate: false + xy: 1495, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-check-tiny + rotate: false + xy: 1139, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-attack + rotate: false + xy: 1609, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-attack-small + rotate: false + xy: 1669, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-attack-smaller + rotate: false + xy: 1527, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-attack-tiny + rotate: false + xy: 1121, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-patrol + rotate: false + xy: 1559, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-patrol-small + rotate: false + xy: 1703, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-patrol-smaller + rotate: false + xy: 1431, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-patrol-tiny + rotate: false + xy: 1103, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-rally + rotate: false + xy: 1609, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-rally-small + rotate: false + xy: 1737, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-rally-smaller + rotate: false + xy: 1463, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-rally-tiny + rotate: false + xy: 1319, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-retreat + rotate: false + xy: 1659, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-retreat-small + rotate: false + xy: 1771, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-retreat-smaller + rotate: false + xy: 1495, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-retreat-tiny + rotate: false + xy: 1301, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-copy + rotate: false + xy: 1609, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-copy-small + rotate: false + xy: 1805, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-copy-smaller + rotate: false + xy: 1527, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-copy-tiny + rotate: false + xy: 1283, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-crafting + rotate: false + xy: 1659, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-crafting-small + rotate: false + xy: 1839, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-crafting-smaller + rotate: false + xy: 1559, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-crafting-tiny + rotate: false + xy: 1265, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cursor + rotate: false + xy: 1709, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-cursor-small + rotate: false + xy: 1873, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-cursor-smaller + rotate: false + xy: 1463, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-cursor-tiny + rotate: false + xy: 1247, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-database + rotate: false + xy: 1659, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-database-small + rotate: false + xy: 1907, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-database-smaller + rotate: false + xy: 1495, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-database-tiny + rotate: false + xy: 1229, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-defense + rotate: false + xy: 1709, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-defense-small + rotate: false + xy: 1941, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-defense-smaller + rotate: false + xy: 1527, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-defense-tiny + rotate: false + xy: 1211, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-dev-builds + rotate: false + xy: 1759, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-dev-builds-small + rotate: false + xy: 1109, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-dev-builds-smaller + rotate: false + xy: 1559, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-dev-builds-tiny + rotate: false + xy: 1193, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-diagonal + rotate: false + xy: 1709, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-diagonal-small + rotate: false + xy: 1143, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-diagonal-smaller + rotate: false + xy: 1591, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-diagonal-tiny + rotate: false + xy: 1175, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-discord + rotate: false + xy: 1759, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-discord-small + rotate: false + xy: 1177, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-discord-smaller + rotate: false + xy: 1495, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-discord-tiny + rotate: false + xy: 1157, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-distribution + rotate: false + xy: 1809, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-distribution-small + rotate: false + xy: 1211, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-distribution-smaller + rotate: false + xy: 1527, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-distribution-tiny + rotate: false + xy: 1139, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-donate + rotate: false + xy: 1759, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-donate-small + rotate: false + xy: 1245, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-donate-smaller + rotate: false + xy: 1559, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-donate-tiny + rotate: false + xy: 1121, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-dots + rotate: false + xy: 1809, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-dots-small + rotate: false + xy: 1279, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-dots-smaller + rotate: false + xy: 1591, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-dots-tiny + rotate: false + xy: 1337, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-editor + rotate: false + xy: 1859, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-editor-small + rotate: false + xy: 1313, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-editor-smaller + rotate: false + xy: 1623, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-editor-tiny + rotate: false + xy: 1319, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-effect + rotate: false + xy: 1809, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-effect-small + rotate: false + xy: 1347, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-effect-smaller + rotate: false + xy: 1527, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-effect-tiny + rotate: false + xy: 1301, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-elevation + rotate: false + xy: 1859, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-elevation-small + rotate: false + xy: 1381, 560 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-elevation-smaller + rotate: false + xy: 1559, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-elevation-tiny + rotate: false + xy: 1283, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-eraser + rotate: false + xy: 1909, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-eraser-small + rotate: false + xy: 1135, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-eraser-smaller + rotate: false + xy: 1591, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-eraser-tiny + rotate: false + xy: 1265, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-exit + rotate: false + xy: 1859, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-exit-small + rotate: false + xy: 1169, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-exit-smaller + rotate: false + xy: 1623, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-exit-tiny + rotate: false + xy: 1247, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-fdroid + rotate: false + xy: 1909, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-fdroid-small + rotate: false + xy: 1203, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-fdroid-smaller + rotate: false + xy: 1655, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-fdroid-tiny + rotate: false + xy: 1229, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file + rotate: false + xy: 1959, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-file-image + rotate: false + xy: 1909, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-file-image-small + rotate: false + xy: 1237, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-image-smaller + rotate: false + xy: 1559, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-image-tiny + rotate: false + xy: 1211, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-small + rotate: false + xy: 1271, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-smaller + rotate: false + xy: 1591, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-text + rotate: false + xy: 1959, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-file-text-small + rotate: false + xy: 1305, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-text-smaller + rotate: false + xy: 1623, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-text-tiny + rotate: false + xy: 1193, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-tiny + rotate: false + xy: 1175, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-fill + rotate: false + xy: 1959, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-fill-small + rotate: false + xy: 1339, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-fill-smaller + rotate: false + xy: 1655, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-fill-tiny + rotate: false + xy: 1157, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy + rotate: false + xy: 309, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-floppy-16 + rotate: false + xy: 359, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-floppy-16-small + rotate: false + xy: 1373, 526 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-floppy-16-smaller + rotate: false + xy: 1687, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-floppy-16-tiny + rotate: false + xy: 1139, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy-small + rotate: false + xy: 1161, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-floppy-smaller + rotate: false + xy: 1591, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-floppy-tiny + rotate: false + xy: 1355, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder + rotate: false + xy: 409, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-folder-parent + rotate: false + xy: 459, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-folder-parent-small + rotate: false + xy: 1161, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-folder-parent-smaller + rotate: false + xy: 1623, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-folder-parent-tiny + rotate: false + xy: 1337, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder-small + rotate: false + xy: 1195, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-folder-smaller + rotate: false + xy: 1655, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-folder-tiny + rotate: false + xy: 1319, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-github + rotate: false + xy: 509, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-github-small + rotate: false + xy: 1161, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-github-smaller + rotate: false + xy: 1687, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-github-tiny + rotate: false + xy: 1301, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-google-play + rotate: false + xy: 559, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-google-play-small + rotate: false + xy: 1195, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-google-play-smaller + rotate: false + xy: 1719, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-google-play-tiny + rotate: false + xy: 1283, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-grid + rotate: false + xy: 609, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-grid-small + rotate: false + xy: 1229, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-grid-smaller + rotate: false + xy: 1623, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-grid-tiny + rotate: false + xy: 1265, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-home + rotate: false + xy: 659, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-home-small + rotate: false + xy: 1161, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-home-smaller + rotate: false + xy: 1655, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-home-tiny + rotate: false + xy: 1247, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-host + rotate: false + xy: 709, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-host-small + rotate: false + xy: 1195, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-host-smaller + rotate: false + xy: 1687, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-host-tiny + rotate: false + xy: 1229, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-info + rotate: false + xy: 759, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-info-small + rotate: false + xy: 1229, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-info-smaller + rotate: false + xy: 1719, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-info-tiny + rotate: false + xy: 1211, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-itch.io + rotate: false + xy: 809, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-itch.io-small + rotate: false + xy: 1263, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-itch.io-smaller + rotate: false + xy: 1751, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-itch.io-tiny + rotate: false + xy: 1193, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-item + rotate: false + xy: 859, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-item-small + rotate: false + xy: 1195, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-item-smaller + rotate: false + xy: 1655, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-item-tiny + rotate: false + xy: 1175, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-line + rotate: false + xy: 909, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-line-small + rotate: false + xy: 1229, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-line-smaller + rotate: false + xy: 1687, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-line-tiny + rotate: false + xy: 1157, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-link + rotate: false + xy: 959, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-link-small + rotate: false + xy: 1263, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-link-smaller + rotate: false + xy: 1719, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-link-tiny + rotate: false + xy: 1355, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-liquid + rotate: false + xy: 1009, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-liquid-consume + rotate: false + xy: 1059, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-liquid-consume-small + rotate: false + xy: 1297, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-liquid-consume-smaller + rotate: false + xy: 1751, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-liquid-consume-tiny + rotate: false + xy: 1337, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-liquid-small + rotate: false + xy: 1229, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-liquid-smaller + rotate: false + xy: 1783, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-liquid-tiny + rotate: false + xy: 1319, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load + rotate: false + xy: 1109, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-image + rotate: false + xy: 1159, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-image-small + rotate: false + xy: 1263, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-image-smaller + rotate: false + xy: 1687, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-image-tiny + rotate: false + xy: 1301, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load-map + rotate: false + xy: 1209, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-map-small + rotate: false + xy: 1297, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-map-smaller + rotate: false + xy: 1719, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-map-tiny + rotate: false + xy: 1283, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load-small + rotate: false + xy: 1331, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-smaller + rotate: false + xy: 1751, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-tiny + rotate: false + xy: 1265, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-loading + rotate: false + xy: 1259, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-loading-small + rotate: false + xy: 1263, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-loading-smaller + rotate: false + xy: 1783, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-loading-tiny + rotate: false + xy: 1247, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-locked + rotate: false + xy: 1309, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-locked-small + rotate: false + xy: 1297, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-locked-smaller + rotate: false + xy: 1815, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-locked-tiny + rotate: false + xy: 1229, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-map + rotate: false + xy: 1359, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-map-small + rotate: false + xy: 1331, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-map-smaller + rotate: false + xy: 1719, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-map-tiny + rotate: false + xy: 1211, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-menu + rotate: false + xy: 1409, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-menu-large + rotate: false + xy: 1459, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-menu-large-small + rotate: false + xy: 1365, 492 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-menu-large-smaller + rotate: false + xy: 1751, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-menu-large-tiny + rotate: false + xy: 1193, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-menu-small + rotate: false + xy: 1297, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-menu-smaller + rotate: false + xy: 1783, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-menu-tiny + rotate: false + xy: 1175, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-missing + rotate: false + xy: 1509, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-missing-small + rotate: false + xy: 1331, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-missing-smaller + rotate: false + xy: 1815, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-missing-tiny + rotate: false + xy: 1355, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-mode-attack + rotate: false + xy: 1559, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-mode-attack-small + rotate: false + xy: 1365, 458 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-mode-attack-smaller + rotate: false + xy: 1847, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-mode-attack-tiny + rotate: false + xy: 1337, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-mode-pvp + rotate: false + xy: 1609, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-mode-pvp-small + rotate: false + xy: 1331, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-mode-pvp-smaller + rotate: false + xy: 1751, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-mode-pvp-tiny + rotate: false + xy: 1319, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-mode-survival + rotate: false + xy: 1659, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-mode-survival-small + rotate: false + xy: 1365, 424 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-mode-survival-smaller + rotate: false + xy: 1783, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-mode-survival-tiny + rotate: false + xy: 1301, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-none + rotate: false + xy: 1709, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-none-small + rotate: false + xy: 1365, 390 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-none-smaller + rotate: false + xy: 1815, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-none-tiny + rotate: false + xy: 1283, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-paste + rotate: false + xy: 1759, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-paste-small + rotate: false + xy: 1161, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-paste-smaller + rotate: false + xy: 1847, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-paste-tiny + rotate: false + xy: 1265, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pause + rotate: false + xy: 1809, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pause-small + rotate: false + xy: 1195, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pause-smaller + rotate: false + xy: 1879, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pause-tiny + rotate: false + xy: 1247, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pencil + rotate: false + xy: 1859, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pencil-small + rotate: false + xy: 1229, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pencil-smaller + rotate: false + xy: 1783, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pencil-tiny + rotate: false + xy: 1229, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pick + rotate: false + xy: 1909, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pick-small + rotate: false + xy: 1263, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pick-smaller + rotate: false + xy: 1815, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pick-tiny + rotate: false + xy: 1211, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play + rotate: false + xy: 1959, 775 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-2 + rotate: false + xy: 287, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-2-small + rotate: false + xy: 1297, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-2-smaller + rotate: false + xy: 1847, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-play-2-tiny + rotate: false + xy: 1193, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-tiny + rotate: false + xy: 1193, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-custom + rotate: false + xy: 337, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-custom-small + rotate: false + xy: 1331, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-custom-smaller + rotate: false + xy: 1879, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-play-custom-tiny + rotate: false + xy: 1355, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-small + rotate: false + xy: 1365, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-smaller + rotate: false + xy: 1911, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players + rotate: false + xy: 387, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-players-small + rotate: false + xy: 1415, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-players-smaller + rotate: false + xy: 1815, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players-tiny + rotate: false + xy: 1337, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-power + rotate: false + xy: 437, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-power-small + rotate: false + xy: 1449, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-power-smaller + rotate: false + xy: 1847, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-power-tiny + rotate: false + xy: 1319, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-production + rotate: false + xy: 487, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-production-small + rotate: false + xy: 1483, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-production-smaller + rotate: false + xy: 1879, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-production-tiny + rotate: false + xy: 1301, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-quit + rotate: false + xy: 537, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-quit-small + rotate: false + xy: 1517, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-quit-smaller + rotate: false + xy: 1911, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-redo + rotate: false + xy: 587, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-redo-small + rotate: false + xy: 1551, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-redo-smaller + rotate: false + xy: 1847, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-redo-tiny + rotate: false + xy: 1283, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-refresh + rotate: false + xy: 637, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-refresh-small + rotate: false + xy: 1585, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-refresh-smaller + rotate: false + xy: 1879, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-refresh-tiny + rotate: false + xy: 1265, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rename + rotate: false + xy: 687, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rename-small + rotate: false + xy: 1619, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rename-smaller + rotate: false + xy: 1911, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rename-tiny + rotate: false + xy: 1247, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-resize + rotate: false + xy: 737, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-resize-small + rotate: false + xy: 1653, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-resize-smaller + rotate: false + xy: 1879, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-resize-tiny + rotate: false + xy: 1229, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate + rotate: false + xy: 787, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-arrow + rotate: false + xy: 837, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-arrow-small + rotate: false + xy: 1687, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-arrow-smaller + rotate: false + xy: 1911, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-arrow-tiny + rotate: false + xy: 1211, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-left + rotate: false + xy: 887, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-left-small + rotate: false + xy: 1721, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-left-smaller + rotate: false + xy: 1911, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-left-tiny + rotate: false + xy: 1355, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-right + rotate: false + xy: 937, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-right-small + rotate: false + xy: 1755, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-right-smaller + rotate: false + xy: 1959, 557 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-right-tiny + rotate: false + xy: 1337, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-small + rotate: false + xy: 1789, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-smaller + rotate: false + xy: 1991, 569 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-tiny + rotate: false + xy: 1319, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save + rotate: false + xy: 987, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-image + rotate: false + xy: 1037, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-image-small + rotate: false + xy: 1823, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-image-smaller + rotate: false + xy: 1991, 537 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-image-tiny + rotate: false + xy: 1301, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save-map + rotate: false + xy: 1087, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-map-small + rotate: false + xy: 1857, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-map-smaller + rotate: false + xy: 1959, 525 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-map-tiny + rotate: false + xy: 1283, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save-small + rotate: false + xy: 1891, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-smaller + rotate: false + xy: 1991, 505 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-tiny + rotate: false + xy: 1265, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-settings + rotate: false + xy: 1137, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-settings-small + rotate: false + xy: 1925, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-settings-smaller + rotate: false + xy: 1943, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-settings-tiny + rotate: false + xy: 1247, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-spray + rotate: false + xy: 1187, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-spray-small + rotate: false + xy: 1407, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-spray-smaller + rotate: false + xy: 1943, 457 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-spray-tiny + rotate: false + xy: 1229, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-terrain + rotate: false + xy: 1237, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-terrain-small + rotate: false + xy: 1441, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-terrain-smaller + rotate: false + xy: 1943, 425 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-terrain-tiny + rotate: false + xy: 1355, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tools + rotate: false + xy: 1287, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tools-small + rotate: false + xy: 1475, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tools-smaller + rotate: false + xy: 1943, 393 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tools-tiny + rotate: false + xy: 1337, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trash + rotate: false + xy: 1337, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trash-16 + rotate: false + xy: 1387, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trash-16-small + rotate: false + xy: 1509, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-16-smaller + rotate: false + xy: 1943, 361 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-16-tiny + rotate: false + xy: 1319, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trash-small + rotate: false + xy: 1543, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-smaller + rotate: false + xy: 1975, 473 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-tiny + rotate: false + xy: 1301, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tree + rotate: false + xy: 1437, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tree-small + rotate: false + xy: 1577, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tree-smaller + rotate: false + xy: 1975, 441 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tree-tiny + rotate: false + xy: 1283, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trello + rotate: false + xy: 1487, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trello-small + rotate: false + xy: 1611, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trello-smaller + rotate: false + xy: 1975, 409 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trello-tiny + rotate: false + xy: 1265, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-turret + rotate: false + xy: 1537, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-turret-small + rotate: false + xy: 1645, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-turret-smaller + rotate: false + xy: 1975, 377 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-turret-tiny + rotate: false + xy: 1247, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tutorial + rotate: false + xy: 1587, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tutorial-small + rotate: false + xy: 1679, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tutorial-smaller + rotate: false + xy: 2007, 473 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tutorial-tiny + rotate: false + xy: 1355, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-undo + rotate: false + xy: 1637, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-undo-small + rotate: false + xy: 1713, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-undo-smaller + rotate: false + xy: 2007, 441 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-undo-tiny + rotate: false + xy: 1337, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-units + rotate: false + xy: 1687, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-units-small + rotate: false + xy: 1747, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-units-smaller + rotate: false + xy: 2007, 409 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-units-tiny + rotate: false + xy: 1319, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-unlocks + rotate: false + xy: 1737, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-unlocks-small + rotate: false + xy: 1781, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-unlocks-smaller + rotate: false + xy: 2007, 377 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-unlocks-tiny + rotate: false + xy: 1301, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-upgrade + rotate: false + xy: 1787, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-upgrade-small + rotate: false + xy: 1815, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-upgrade-smaller + rotate: false + xy: 1975, 345 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-upgrade-tiny + rotate: false + xy: 1283, 62 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-wiki + rotate: false + xy: 1837, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-wiki-small + rotate: false + xy: 1849, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-wiki-smaller + rotate: false + xy: 2007, 345 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-wiki-tiny + rotate: false + xy: 1265, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-workshop + rotate: false + xy: 1887, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-workshop-small + rotate: false + xy: 1883, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-workshop-smaller + rotate: false + xy: 899, 242 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-workshop-tiny + rotate: false + xy: 1355, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-zoom + rotate: false + xy: 1937, 725 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-zoom-small + rotate: false + xy: 1917, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-zoom-smaller + rotate: false + xy: 931, 242 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-zoom-tiny + rotate: false + xy: 1337, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +info-banner + rotate: false + xy: 259, 978 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +inventory + rotate: false + xy: 1467, 267 + size: 24, 40 + split: 10, 10, 10, 14 + orig: 24, 40 + offset: 0, 0 + index: -1 +nomap + rotate: false + xy: 1, 767 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +pane + rotate: false + xy: 1251, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +pane-2 + rotate: false + xy: 1213, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +scroll + rotate: false + xy: 1519, 272 + size: 24, 35 + split: 10, 10, 6, 5 + orig: 24, 35 + offset: 0, 0 + index: -1 +scroll-horizontal + rotate: false + xy: 301, 1 + size: 35, 24 + split: 6, 5, 10, 10 + orig: 35, 24 + offset: 0, 0 + index: -1 +scroll-knob-horizontal-black + rotate: false + xy: 301, 27 + size: 40, 24 + orig: 40, 24 + offset: 0, 0 + index: -1 +scroll-knob-vertical-black + rotate: false + xy: 1493, 267 + size: 24, 40 + orig: 24, 40 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 309, 975 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 998, 338 + size: 1, 8 + orig: 1, 8 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 941, 378 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-down + rotate: false + xy: 972, 386 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 967, 338 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-vertical + rotate: false + xy: 51, 717 + size: 8, 1 + orig: 8, 1 + offset: 0, 0 + index: -1 +underline + rotate: false + xy: 1403, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-2 + rotate: false + xy: 1289, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-disabled + rotate: false + xy: 1327, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-red + rotate: false + xy: 1365, 696 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +whiteui + rotate: false + xy: 1415, 589 + size: 3, 3 + orig: 3, 3 + offset: 0, 0 + index: -1 +window-empty + rotate: false + xy: 996, 275 + size: 27, 61 + split: 4, 4, 2, 2 + orig: 27, 61 + offset: 0, 0 + index: -1 + +sprites5.png size: 1024,1024 format: RGBA8888 filter: Nearest,Nearest @@ -9157,9987 +19197,3 @@ zone-tarFields orig: 250, 250 offset: 0, 0 index: -1 - -sprites5.png -size: 2048,1024 -format: RGBA8888 -filter: Nearest,Nearest -repeat: none -bar - rotate: false - xy: 2019, 703 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 1009, 342 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -block-alloy-smelter-large - rotate: false - xy: 1937, 733 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-alloy-smelter-medium - rotate: false - xy: 2009, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-alloy-smelter-small - rotate: false - xy: 1009, 316 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 338, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-alloy-smelter-xlarge - rotate: false - xy: 1, 670 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-large - rotate: false - xy: 301, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-arc-medium - rotate: false - xy: 2009, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-arc-small - rotate: false - xy: 2021, 549 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 356, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-arc-xlarge - rotate: false - xy: 259, 928 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-armored-conveyor-large - rotate: false - xy: 301, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-armored-conveyor-medium - rotate: false - xy: 2009, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-small - rotate: false - xy: 1011, 290 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 374, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-armored-conveyor-xlarge - rotate: false - xy: 1, 620 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-large - rotate: false - xy: 343, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 301, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 2009, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-large-small - rotate: false - xy: 1011, 264 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 392, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-large-xlarge - rotate: false - xy: 259, 878 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-medium - rotate: false - xy: 2009, 805 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 1011, 238 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 410, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-xlarge - rotate: false - xy: 1, 570 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-drill-large - rotate: false - xy: 343, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 1979, 741 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 1989, 579 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 428, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-drill-xlarge - rotate: false - xy: 259, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-mixer-large - rotate: false - xy: 385, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 1441, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 817, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 446, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 1, 520 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conduit-large - rotate: false - xy: 301, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 1475, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 843, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 464, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conduit-xlarge - rotate: false - xy: 259, 778 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conveyor-large - rotate: false - xy: 343, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1509, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 869, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 482, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conveyor-xlarge - rotate: false - xy: 1, 470 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-large - rotate: false - xy: 385, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 1543, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 945, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 731, 166 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-char-xlarge - rotate: false - xy: 1, 420 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliffs-large - rotate: false - xy: 427, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliffs-medium - rotate: false - xy: 1577, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 971, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 857, 292 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 1, 370 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-coal-centrifuge-large - rotate: false - xy: 301, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 1611, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 997, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 895, 12 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-coal-centrifuge-xlarge - rotate: false - xy: 1, 320 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-combustion-generator-large - rotate: false - xy: 343, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1645, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1023, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 1, 2 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-combustion-generator-xlarge - rotate: false - xy: 1, 270 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-command-center-large - rotate: false - xy: 385, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1679, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 2021, 523 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 757, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-command-center-xlarge - rotate: false - xy: 1, 220 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conduit-large - rotate: false - xy: 427, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1713, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 2013, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 885, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conduit-xlarge - rotate: false - xy: 1, 170 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-container-large - rotate: false - xy: 469, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1747, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 2013, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 1013, 64 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-container-xlarge - rotate: false - xy: 1, 120 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conveyor-large - rotate: false - xy: 301, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 1781, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 1013, 212 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 1045, 450 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conveyor-xlarge - rotate: false - xy: 1, 70 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-large - rotate: false - xy: 343, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 385, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1815, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 1013, 186 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 1063, 242 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-large-xlarge - rotate: false - xy: 1, 20 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-medium - rotate: false - xy: 1849, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1013, 160 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 1349, 302 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-xlarge - rotate: false - xy: 87, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-foundation-large - rotate: false - xy: 427, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 1883, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1013, 134 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 1323, 265 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-foundation-xlarge - rotate: false - xy: 137, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-nucleus-large - rotate: false - xy: 469, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 343, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 1013, 108 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 19, 2 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-nucleus-xlarge - rotate: false - xy: 187, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-shard-large - rotate: false - xy: 511, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 377, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1013, 82 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 1045, 432 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-shard-xlarge - rotate: false - xy: 345, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-craters-large - rotate: false - xy: 301, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 411, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 1035, 316 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 1081, 242 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-craters-xlarge - rotate: false - xy: 395, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-crawler-factory-large - rotate: false - xy: 343, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-crawler-factory-medium - rotate: false - xy: 445, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-crawler-factory-small - rotate: false - xy: 1037, 290 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-crawler-factory-tiny - rotate: false - xy: 1367, 302 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-crawler-factory-xlarge - rotate: false - xy: 445, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cryofluidmixer-large - rotate: false - xy: 385, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluidmixer-medium - rotate: false - xy: 479, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-small - rotate: false - xy: 1037, 264 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluidmixer-tiny - rotate: false - xy: 1349, 284 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluidmixer-xlarge - rotate: false - xy: 495, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 427, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 1917, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 1037, 238 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 1367, 284 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cultivator-xlarge - rotate: false - xy: 545, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cyclone-large - rotate: false - xy: 469, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 1951, 699 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 1039, 212 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 1099, 242 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cyclone-xlarge - rotate: false - xy: 595, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dagger-factory-large - rotate: false - xy: 511, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dagger-factory-medium - rotate: false - xy: 1985, 707 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dagger-factory-small - rotate: false - xy: 1039, 186 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dagger-factory-tiny - rotate: false - xy: 1065, 224 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dagger-factory-xlarge - rotate: false - xy: 645, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-metal-large - rotate: false - xy: 553, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 553, 116 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 1039, 160 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1065, 206 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-metal-xlarge - rotate: false - xy: 695, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-1-large - rotate: false - xy: 301, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 549, 82 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 1039, 134 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1083, 224 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-1-xlarge - rotate: false - xy: 745, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-2-large - rotate: false - xy: 343, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 595, 158 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 1039, 108 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 1065, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-2-xlarge - rotate: false - xy: 795, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-3-large - rotate: false - xy: 385, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 637, 200 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 1039, 82 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 1083, 206 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge - rotate: false - xy: 845, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-4-large - rotate: false - xy: 427, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 679, 242 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 753, 6 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 1065, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-4-xlarge - rotate: false - xy: 895, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-5-large - rotate: false - xy: 469, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 721, 284 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 1038, 354 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 1083, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-5-xlarge - rotate: false - xy: 945, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-6-large - rotate: false - xy: 511, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 763, 326 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 1041, 56 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 1065, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-6-xlarge - rotate: false - xy: 995, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-large - rotate: false - xy: 553, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 805, 368 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 1041, 30 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 595, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 847, 410 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 1049, 4 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 1083, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-xlarge - rotate: false - xy: 1045, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-tiny - rotate: false - xy: 1065, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 301, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 889, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 1040, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 1083, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-xlarge - rotate: false - xy: 1095, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-xlarge - rotate: false - xy: 1145, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dart-mech-pad-large - rotate: false - xy: 343, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dart-mech-pad-medium - rotate: false - xy: 931, 494 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dart-mech-pad-small - rotate: false - xy: 1066, 416 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dart-mech-pad-tiny - rotate: false - xy: 1065, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dart-mech-pad-xlarge - rotate: false - xy: 1195, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-deepwater-large - rotate: false - xy: 385, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 973, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 1092, 416 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 1083, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-deepwater-xlarge - rotate: false - xy: 1245, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-delta-mech-pad-large - rotate: false - xy: 427, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-delta-mech-pad-medium - rotate: false - xy: 1015, 578 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-delta-mech-pad-small - rotate: false - xy: 1066, 390 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-delta-mech-pad-tiny - rotate: false - xy: 1065, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-delta-mech-pad-xlarge - rotate: false - xy: 1295, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-differential-generator-large - rotate: false - xy: 469, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 1057, 620 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 1092, 390 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 1083, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-differential-generator-xlarge - rotate: false - xy: 1345, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-distributor-large - rotate: false - xy: 511, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 1099, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 1064, 364 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 1083, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-distributor-xlarge - rotate: false - xy: 1395, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-large - rotate: false - xy: 553, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 595, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 1133, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 1090, 364 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 1101, 224 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-large-xlarge - rotate: false - xy: 1445, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-medium - rotate: false - xy: 1167, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 1064, 338 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 1101, 206 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-xlarge - rotate: false - xy: 1495, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-draug-factory-large - rotate: false - xy: 637, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-draug-factory-medium - rotate: false - xy: 1201, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-draug-factory-small - rotate: false - xy: 1090, 338 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-draug-factory-tiny - rotate: false - xy: 1101, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-draug-factory-xlarge - rotate: false - xy: 1545, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dunerocks-large - rotate: false - xy: 301, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dunerocks-medium - rotate: false - xy: 1235, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-small - rotate: false - xy: 1118, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dunerocks-tiny - rotate: false - xy: 1101, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dunerocks-xlarge - rotate: false - xy: 1595, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-duo-large - rotate: false - xy: 343, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 1269, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 1144, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 1101, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge - rotate: false - xy: 1645, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-force-projector-large - rotate: false - xy: 385, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 1303, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 1170, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 1101, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-force-projector-xlarge - rotate: false - xy: 1695, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fortress-factory-large - rotate: false - xy: 427, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fortress-factory-medium - rotate: false - xy: 1337, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fortress-factory-small - rotate: false - xy: 1196, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fortress-factory-tiny - rotate: false - xy: 1101, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fortress-factory-xlarge - rotate: false - xy: 1745, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fuse-large - rotate: false - xy: 469, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 1371, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 1222, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 1101, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 1795, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ghoul-factory-large - rotate: false - xy: 511, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ghoul-factory-medium - rotate: false - xy: 1405, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ghoul-factory-small - rotate: false - xy: 1248, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ghoul-factory-tiny - rotate: false - xy: 1323, 247 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ghoul-factory-xlarge - rotate: false - xy: 1845, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-large - rotate: false - xy: 553, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-medium - rotate: false - xy: 1439, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-small - rotate: false - xy: 1274, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-tiny - rotate: false - xy: 779, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-xlarge - rotate: false - xy: 1895, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 595, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1473, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 1300, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 797, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 1945, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 637, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 1507, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1326, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 913, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 1995, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 679, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 1541, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 1352, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 1117, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 237, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 301, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 1575, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 1378, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 1135, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 51, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 343, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 1609, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 1404, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 1153, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 51, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 385, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 1643, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 1430, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 427, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1677, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1456, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1171, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 101, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1189, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 51, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 469, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-icerocks-medium - rotate: false - xy: 1711, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-small - rotate: false - xy: 1482, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icerocks-tiny - rotate: false - xy: 1207, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-icerocks-xlarge - rotate: false - xy: 101, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ignarock-large - rotate: false - xy: 511, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ignarock-medium - rotate: false - xy: 1745, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-small - rotate: false - xy: 1508, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ignarock-tiny - rotate: false - xy: 1225, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ignarock-xlarge - rotate: false - xy: 151, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 553, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 1779, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 1534, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 1243, 250 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 51, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 595, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 1813, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 1560, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1119, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 101, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 637, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1847, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 1586, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1119, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 151, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 679, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 1881, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 1612, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 1137, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 201, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-large - rotate: false - xy: 721, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-medium - rotate: false - xy: 1915, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-small - rotate: false - xy: 1118, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-tiny - rotate: false - xy: 1119, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-xlarge - rotate: false - xy: 51, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 301, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 513, 45 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 1144, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 1137, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 101, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 343, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 513, 11 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 1170, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 1155, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 151, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 385, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 1951, 665 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 1196, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 1119, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 201, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 427, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1985, 673 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 1222, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1137, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 51, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 469, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 511, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1985, 639 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 1248, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 1155, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 101, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1949, 631 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 1274, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1173, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 151, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 553, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1983, 605 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 1300, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 1119, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 201, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 595, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 587, 116 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 1326, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1137, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 51, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 637, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 583, 82 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 1352, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1155, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 101, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 679, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 629, 158 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 1378, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1173, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 151, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 721, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 621, 124 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1116, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1191, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 201, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 763, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 621, 90 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 1142, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1119, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 51, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 301, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 655, 124 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 1168, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1137, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 101, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 343, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 655, 90 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 1194, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1155, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 151, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 385, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 713, 242 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 1220, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1173, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 201, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 427, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 755, 284 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 1246, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1191, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 51, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 469, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 747, 250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 1272, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1209, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 101, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 511, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 747, 216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 1298, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1119, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 151, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 553, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 781, 250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 1324, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1137, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 201, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 595, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 781, 216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 1350, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1155, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 51, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 637, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 839, 368 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 1376, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1173, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 101, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 679, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 881, 410 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 1404, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1191, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 151, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 721, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 873, 376 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 1430, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1209, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 201, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 763, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 873, 342 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 1456, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1227, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 51, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 805, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 907, 376 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 1482, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1119, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 101, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 301, 137 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 907, 342 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 1508, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1137, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 151, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 343, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 965, 494 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 1534, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 1155, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 201, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-omega-mech-pad-large - rotate: false - xy: 385, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-omega-mech-pad-medium - rotate: false - xy: 1007, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-omega-mech-pad-small - rotate: false - xy: 1560, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-omega-mech-pad-tiny - rotate: false - xy: 1173, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-omega-mech-pad-xlarge - rotate: false - xy: 51, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 427, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 999, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 1586, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1191, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 101, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 469, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 999, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 1612, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1209, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 151, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 511, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 1033, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 1402, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1227, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 201, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phantom-factory-large - rotate: false - xy: 553, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phantom-factory-medium - rotate: false - xy: 1033, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phantom-factory-small - rotate: false - xy: 1428, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phantom-factory-tiny - rotate: false - xy: 1137, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phantom-factory-xlarge - rotate: false - xy: 51, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 595, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 1095, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 1454, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 1155, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 101, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 637, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 1129, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 1480, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1173, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 151, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 679, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 721, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 1163, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 1506, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1191, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 201, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 1197, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 1532, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1209, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 101, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 763, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 1231, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 1558, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1227, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 151, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 805, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 1265, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 1584, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 1155, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 201, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 847, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 1299, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 1610, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1173, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 151, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 301, 95 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1333, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 1638, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 1191, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 201, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 343, 137 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 385, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1367, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 1664, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 1209, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 201, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 1401, 628 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 1690, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1227, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 51, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 427, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 1435, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 1716, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 1173, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 101, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 469, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1469, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 1742, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 1191, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 151, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 511, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 1503, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 1768, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 1209, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 201, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 553, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 1537, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 1794, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 1227, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 251, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 595, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 1571, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 1820, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1191, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 251, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 637, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 1605, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 1846, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1209, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 251, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-revenant-factory-large - rotate: false - xy: 679, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-revenant-factory-medium - rotate: false - xy: 1639, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-revenant-factory-small - rotate: false - xy: 1872, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-revenant-factory-tiny - rotate: false - xy: 1227, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-revenant-factory-xlarge - rotate: false - xy: 251, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 721, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 1673, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 1898, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 1209, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 251, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rock-large - rotate: false - xy: 763, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rock-medium - rotate: false - xy: 1707, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rock-small - rotate: false - xy: 1636, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rock-tiny - rotate: false - xy: 1227, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rock-xlarge - rotate: false - xy: 251, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-large - rotate: false - xy: 805, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rocks-medium - rotate: false - xy: 1741, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rocks-small - rotate: false - xy: 1662, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rocks-tiny - rotate: false - xy: 1227, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rocks-xlarge - rotate: false - xy: 251, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 847, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 1775, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 1688, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 1245, 232 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 251, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 889, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 1809, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 1714, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 1245, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 251, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 301, 53 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 1843, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 1740, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 1245, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 251, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 343, 95 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 1877, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 1766, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 1245, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 251, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-saltrocks-large - rotate: false - xy: 385, 137 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-saltrocks-medium - rotate: false - xy: 1911, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-small - rotate: false - xy: 1792, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-saltrocks-tiny - rotate: false - xy: 1245, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-saltrocks-xlarge - rotate: false - xy: 251, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 427, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 617, 56 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 1818, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 1245, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 251, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 469, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 651, 56 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 1844, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 1245, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 251, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 511, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 671, 200 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 1870, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 1245, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 553, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 663, 166 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 1896, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 2029, 453 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 309, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 309, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large - rotate: false - xy: 595, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 705, 208 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 1922, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 2029, 435 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge - rotate: false - xy: 359, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 637, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 697, 166 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1116, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 2029, 417 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 309, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 679, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 689, 132 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 1142, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 2029, 399 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 359, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 721, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 689, 98 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 1168, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 2029, 381 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 409, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 763, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 723, 132 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 1194, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 2029, 363 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 359, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 805, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 847, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 723, 98 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 1220, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 2029, 345 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 409, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 689, 64 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1246, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1341, 265 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 459, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 889, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 723, 64 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1272, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1341, 247 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 409, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 931, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 797, 326 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1298, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 1359, 266 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 459, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 343, 53 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 789, 292 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 1324, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 1359, 248 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 509, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shalerocks-large - rotate: false - xy: 385, 95 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shalerocks-medium - rotate: false - xy: 831, 334 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-small - rotate: false - xy: 1350, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shalerocks-tiny - rotate: false - xy: 1119, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shalerocks-xlarge - rotate: false - xy: 459, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 427, 137 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 823, 292 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 1376, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 1137, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 509, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 469, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 815, 258 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 1402, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 1155, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 559, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 511, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 815, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 1428, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 1173, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 509, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 553, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 849, 258 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 595, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 849, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1454, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1191, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 559, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 1480, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1209, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 609, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large - rotate: false - xy: 637, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrock-medium - rotate: false - xy: 815, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-small - rotate: false - xy: 1506, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrock-tiny - rotate: false - xy: 1227, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrock-xlarge - rotate: false - xy: 559, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-large - rotate: false - xy: 679, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 849, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 1532, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrocks-tiny - rotate: false - xy: 1245, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrocks-xlarge - rotate: false - xy: 609, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 721, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 763, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 923, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 1558, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 1263, 234 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 659, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 915, 418 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1584, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1281, 234 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 609, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 805, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 957, 460 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1610, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1263, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 659, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 847, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 949, 418 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 1636, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 1299, 234 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 709, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 889, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 941, 384 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 1662, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 1263, 198 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 659, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spirit-factory-large - rotate: false - xy: 931, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spirit-factory-medium - rotate: false - xy: 941, 350 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spirit-factory-small - rotate: false - xy: 1688, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spirit-factory-tiny - rotate: false - xy: 1281, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spirit-factory-xlarge - rotate: false - xy: 709, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 973, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 975, 384 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 1714, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 1263, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 759, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 385, 53 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 975, 350 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 1740, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 1281, 198 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 709, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 427, 95 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 941, 316 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 1766, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 1299, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 759, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 469, 137 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 975, 316 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 1792, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 1263, 162 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 809, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sporerocks-large - rotate: false - xy: 511, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sporerocks-medium - rotate: false - xy: 1049, 578 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sporerocks-small - rotate: false - xy: 1818, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sporerocks-tiny - rotate: false - xy: 1281, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sporerocks-xlarge - rotate: false - xy: 759, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 553, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1041, 544 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 1844, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 1299, 198 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 809, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 595, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1075, 544 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1870, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1263, 144 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 859, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 637, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 679, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1067, 510 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 1896, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 1281, 162 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 809, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1067, 476 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1922, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1299, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 859, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 721, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 1101, 510 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 1948, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 1263, 126 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 909, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 763, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 1101, 476 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 1974, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 1281, 144 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 859, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 805, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 1067, 442 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 2000, 315 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 1299, 162 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 909, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tau-mech-pad-large - rotate: false - xy: 847, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tau-mech-pad-medium - rotate: false - xy: 1101, 442 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tau-mech-pad-small - rotate: false - xy: 1948, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tau-mech-pad-tiny - rotate: false - xy: 1263, 108 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tau-mech-pad-xlarge - rotate: false - xy: 959, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 889, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 1945, 597 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 1974, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 1281, 126 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 909, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 931, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 685, 30 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 2000, 289 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 1299, 144 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 959, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 973, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 719, 30 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 1063, 312 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 1263, 90 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 1009, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 1015, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1091, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1089, 312 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 1281, 108 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 959, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 427, 53 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 469, 95 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1125, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 1063, 286 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 1299, 126 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 1009, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 1159, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1063, 260 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 1281, 90 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 1059, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 511, 137 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 1193, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 1089, 286 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 1299, 108 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 1009, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titan-factory-large - rotate: false - xy: 553, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titan-factory-medium - rotate: false - xy: 1227, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titan-factory-small - rotate: false - xy: 1089, 260 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titan-factory-tiny - rotate: false - xy: 1299, 90 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titan-factory-xlarge - rotate: false - xy: 1059, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 595, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1261, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 1115, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 1317, 229 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 1109, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 637, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 679, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1295, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 1141, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 1317, 211 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 1059, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1329, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 1115, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 1335, 229 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 1109, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-trident-ship-pad-large - rotate: false - xy: 721, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-trident-ship-pad-medium - rotate: false - xy: 1363, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-trident-ship-pad-small - rotate: false - xy: 1167, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-trident-ship-pad-tiny - rotate: false - xy: 1317, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-trident-ship-pad-xlarge - rotate: false - xy: 1159, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-turbine-generator-large - rotate: false - xy: 763, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1397, 594 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-small - rotate: false - xy: 1141, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-turbine-generator-tiny - rotate: false - xy: 1335, 211 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-turbine-generator-xlarge - rotate: false - xy: 1109, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 805, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1431, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 1193, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 1317, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 1159, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 847, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 1465, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 1167, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 1335, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 1209, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 889, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1499, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 1219, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 1317, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 1159, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 931, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 1533, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 1193, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 1335, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 1209, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 973, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1567, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1245, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 1317, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 1259, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 1015, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 1601, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 1219, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 1335, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 1209, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 1057, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 1635, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 1271, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 1317, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 1259, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wraith-factory-large - rotate: false - xy: 469, 53 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wraith-factory-medium - rotate: false - xy: 1669, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wraith-factory-small - rotate: false - xy: 1245, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wraith-factory-tiny - rotate: false - xy: 1335, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wraith-factory-xlarge - rotate: false - xy: 1309, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 1137, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 511, 108 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 553, 150 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 595, 192 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 637, 234 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 679, 276 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 721, 318 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-over-4 - rotate: false - xy: 763, 360 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 805, 402 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 847, 444 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 973, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 889, 486 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 931, 528 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1297, 294 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 1099, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 1015, 612 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 1057, 654 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 511, 79 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 1703, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 1737, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1771, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 1805, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 1839, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1873, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 803, 204 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 1979, 735 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -discord-banner - rotate: false - xy: 1, 720 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -flat-down-base - rotate: false - xy: 1175, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -icon-about - rotate: false - xy: 1259, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-about-small - rotate: false - xy: 1907, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-about-smaller - rotate: false - xy: 2017, 607 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-about-tiny - rotate: false - xy: 1317, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-add - rotate: false - xy: 1309, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-add-small - rotate: false - xy: 1109, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-add-smaller - rotate: false - xy: 2017, 575 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-add-tiny - rotate: false - xy: 1335, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-admin - rotate: false - xy: 1359, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-admin-badge - rotate: false - xy: 1309, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-admin-badge-small - rotate: false - xy: 1143, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-admin-badge-smaller - rotate: false - xy: 1645, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-admin-badge-tiny - rotate: false - xy: 1335, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-admin-small - rotate: false - xy: 1177, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-admin-smaller - rotate: false - xy: 1677, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-admin-tiny - rotate: false - xy: 1317, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow - rotate: false - xy: 1359, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-16 - rotate: false - xy: 1359, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-16-small - rotate: false - xy: 1211, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-small - rotate: false - xy: 1211, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-16-smaller - rotate: false - xy: 1709, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-smaller - rotate: false - xy: 1709, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-16-tiny - rotate: false - xy: 1335, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-tiny - rotate: false - xy: 1335, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-down - rotate: false - xy: 1409, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-down-small - rotate: false - xy: 1245, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-down-smaller - rotate: false - xy: 1741, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-down-tiny - rotate: false - xy: 1377, 266 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-left - rotate: false - xy: 1359, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-left-small - rotate: false - xy: 1279, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-left-smaller - rotate: false - xy: 1773, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-left-tiny - rotate: false - xy: 1377, 248 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-right - rotate: false - xy: 1409, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-right-small - rotate: false - xy: 1313, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-right-smaller - rotate: false - xy: 1805, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-right-tiny - rotate: false - xy: 1353, 229 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-up - rotate: false - xy: 1459, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-up-small - rotate: false - xy: 1347, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-up-smaller - rotate: false - xy: 1837, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-up-tiny - rotate: false - xy: 1353, 211 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-back - rotate: false - xy: 1409, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-back-small - rotate: false - xy: 1381, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-back-smaller - rotate: false - xy: 1869, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-back-tiny - rotate: false - xy: 1353, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-ban - rotate: false - xy: 1459, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-ban-small - rotate: false - xy: 1135, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-ban-smaller - rotate: false - xy: 1925, 557 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-ban-tiny - rotate: false - xy: 1353, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-break - rotate: false - xy: 1509, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-break-small - rotate: false - xy: 1135, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-break-smaller - rotate: false - xy: 1901, 421 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-break-tiny - rotate: false - xy: 1353, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cancel - rotate: false - xy: 1459, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cancel-small - rotate: false - xy: 1169, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cancel-smaller - rotate: false - xy: 1957, 565 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cancel-tiny - rotate: false - xy: 1353, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-quit-tiny - rotate: false - xy: 1353, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-changelog - rotate: false - xy: 1509, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-changelog-small - rotate: false - xy: 1135, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-changelog-smaller - rotate: false - xy: 1917, 523 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-changelog-tiny - rotate: false - xy: 1353, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-chat - rotate: false - xy: 1559, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-chat-small - rotate: false - xy: 1169, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-chat-smaller - rotate: false - xy: 1917, 491 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-chat-tiny - rotate: false - xy: 1353, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-check - rotate: false - xy: 1509, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-check-small - rotate: false - xy: 1203, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-check-smaller - rotate: false - xy: 1917, 459 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-check-tiny - rotate: false - xy: 1353, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-attack - rotate: false - xy: 1559, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-attack-small - rotate: false - xy: 1169, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-attack-smaller - rotate: false - xy: 1933, 427 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-attack-tiny - rotate: false - xy: 1371, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-patrol - rotate: false - xy: 1609, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-patrol-small - rotate: false - xy: 1203, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-patrol-smaller - rotate: false - xy: 1957, 533 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-patrol-tiny - rotate: false - xy: 1371, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-rally - rotate: false - xy: 1559, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-rally-small - rotate: false - xy: 1237, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-rally-smaller - rotate: false - xy: 1949, 501 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-rally-tiny - rotate: false - xy: 1371, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-retreat - rotate: false - xy: 1609, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-retreat-small - rotate: false - xy: 1203, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-retreat-smaller - rotate: false - xy: 1949, 469 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-retreat-tiny - rotate: false - xy: 1371, 176 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-copy - rotate: false - xy: 1659, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-copy-small - rotate: false - xy: 1237, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-copy-smaller - rotate: false - xy: 1981, 501 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-copy-tiny - rotate: false - xy: 1371, 158 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-crafting - rotate: false - xy: 1609, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-crafting-small - rotate: false - xy: 1271, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-crafting-smaller - rotate: false - xy: 1981, 469 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-crafting-tiny - rotate: false - xy: 1371, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cursor - rotate: false - xy: 1659, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cursor-small - rotate: false - xy: 1237, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cursor-smaller - rotate: false - xy: 1965, 437 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cursor-tiny - rotate: false - xy: 1371, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-database - rotate: false - xy: 1709, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-database-small - rotate: false - xy: 1271, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-database-smaller - rotate: false - xy: 1997, 437 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-database-tiny - rotate: false - xy: 1371, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-defense - rotate: false - xy: 1659, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-defense-small - rotate: false - xy: 1305, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-defense-smaller - rotate: false - xy: 1965, 405 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-defense-tiny - rotate: false - xy: 1371, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-dev-builds - rotate: false - xy: 1709, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dev-builds-small - rotate: false - xy: 1271, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dev-builds-smaller - rotate: false - xy: 1997, 405 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dev-builds-tiny - rotate: false - xy: 1389, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-diagonal - rotate: false - xy: 1759, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-diagonal-small - rotate: false - xy: 1305, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-diagonal-smaller - rotate: false - xy: 1933, 395 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-diagonal-tiny - rotate: false - xy: 1389, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-discord - rotate: false - xy: 1709, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-discord-small - rotate: false - xy: 1339, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-discord-smaller - rotate: false - xy: 1965, 373 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-discord-tiny - rotate: false - xy: 1389, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-distribution - rotate: false - xy: 1759, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-distribution-small - rotate: false - xy: 1305, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-distribution-smaller - rotate: false - xy: 1997, 373 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-distribution-tiny - rotate: false - xy: 1389, 176 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-donate - rotate: false - xy: 1809, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-donate-small - rotate: false - xy: 1339, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-donate-smaller - rotate: false - xy: 753, 32 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-donate-tiny - rotate: false - xy: 1389, 158 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-dots - rotate: false - xy: 1759, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dots-small - rotate: false - xy: 1373, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dots-smaller - rotate: false - xy: 1989, 543 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dots-tiny - rotate: false - xy: 1389, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-editor - rotate: false - xy: 1809, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-editor-small - rotate: false - xy: 1339, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-editor-smaller - rotate: false - xy: 549, 50 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-editor-tiny - rotate: false - xy: 1389, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-effect - rotate: false - xy: 1859, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-effect-small - rotate: false - xy: 1373, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-effect-smaller - rotate: false - xy: 581, 50 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-effect-tiny - rotate: false - xy: 1389, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-elevation - rotate: false - xy: 1809, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-elevation-small - rotate: false - xy: 1373, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-elevation-smaller - rotate: false - xy: 547, 18 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-elevation-tiny - rotate: false - xy: 1389, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-eraser - rotate: false - xy: 1859, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-eraser-small - rotate: false - xy: 1135, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-eraser-smaller - rotate: false - xy: 579, 18 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-eraser-tiny - rotate: false - xy: 611, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-exit - rotate: false - xy: 1909, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-exit-small - rotate: false - xy: 1169, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-exit-smaller - rotate: false - xy: 1645, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-exit-tiny - rotate: false - xy: 629, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fdroid - rotate: false - xy: 1859, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fdroid-small - rotate: false - xy: 1203, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fdroid-smaller - rotate: false - xy: 1677, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fdroid-tiny - rotate: false - xy: 647, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file - rotate: false - xy: 1909, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image - rotate: false - xy: 1959, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image-small - rotate: false - xy: 1237, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-image-smaller - rotate: false - xy: 1709, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-image-tiny - rotate: false - xy: 665, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-small - rotate: false - xy: 1271, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-smaller - rotate: false - xy: 1741, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text - rotate: false - xy: 1909, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-text-small - rotate: false - xy: 1305, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-text-smaller - rotate: false - xy: 1773, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text-tiny - rotate: false - xy: 683, 12 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-tiny - rotate: false - xy: 701, 12 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fill - rotate: false - xy: 1959, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fill-small - rotate: false - xy: 1339, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fill-smaller - rotate: false - xy: 1805, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fill-tiny - rotate: false - xy: 719, 12 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy - rotate: false - xy: 1959, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 309, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16-small - rotate: false - xy: 1373, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-16-smaller - rotate: false - xy: 1837, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-16-tiny - rotate: false - xy: 2029, 327 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy-small - rotate: false - xy: 1415, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-smaller - rotate: false - xy: 1869, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-tiny - rotate: false - xy: 2026, 309 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder - rotate: false - xy: 359, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent - rotate: false - xy: 409, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent-small - rotate: false - xy: 1449, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-parent-smaller - rotate: false - xy: 1901, 389 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-parent-tiny - rotate: false - xy: 2026, 291 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder-small - rotate: false - xy: 1483, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-smaller - rotate: false - xy: 1933, 363 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-tiny - rotate: false - xy: 1067, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-github - rotate: false - xy: 459, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-github-small - rotate: false - xy: 1517, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-github-smaller - rotate: false - xy: 1965, 341 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-github-tiny - rotate: false - xy: 1085, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-google-play - rotate: false - xy: 509, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-google-play-small - rotate: false - xy: 1551, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-google-play-smaller - rotate: false - xy: 1997, 341 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-google-play-tiny - rotate: false - xy: 1067, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-grid - rotate: false - xy: 559, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-grid-small - rotate: false - xy: 1585, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-grid-smaller - rotate: false - xy: 613, 24 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-grid-tiny - rotate: false - xy: 1067, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-home - rotate: false - xy: 609, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-home-small - rotate: false - xy: 1619, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-home-smaller - rotate: false - xy: 645, 24 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-home-tiny - rotate: false - xy: 1085, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-host - rotate: false - xy: 659, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-host-small - rotate: false - xy: 1653, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-host-smaller - rotate: false - xy: 2013, 773 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-host-tiny - rotate: false - xy: 1085, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-info - rotate: false - xy: 709, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-info-small - rotate: false - xy: 1687, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-info-smaller - rotate: false - xy: 2013, 741 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-info-tiny - rotate: false - xy: 1075, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-itch.io - rotate: false - xy: 759, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-itch.io-small - rotate: false - xy: 1721, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-itch.io-smaller - rotate: false - xy: 739, 184 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-itch.io-tiny - rotate: false - xy: 1075, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-item - rotate: false - xy: 809, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-item-small - rotate: false - xy: 1755, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-item-smaller - rotate: false - xy: 771, 184 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-item-tiny - rotate: false - xy: 1093, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-line - rotate: false - xy: 859, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-line-small - rotate: false - xy: 1789, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-line-smaller - rotate: false - xy: 757, 152 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-line-tiny - rotate: false - xy: 1093, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-link - rotate: false - xy: 909, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-link-small - rotate: false - xy: 1823, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-link-smaller - rotate: false - xy: 757, 120 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-link-tiny - rotate: false - xy: 1263, 72 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid - rotate: false - xy: 959, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-liquid-consume - rotate: false - xy: 1009, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-liquid-consume-small - rotate: false - xy: 1857, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-consume-smaller - rotate: false - xy: 757, 88 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-consume-tiny - rotate: false - xy: 1281, 72 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid-small - rotate: false - xy: 1891, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-smaller - rotate: false - xy: 789, 152 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-tiny - rotate: false - xy: 1299, 72 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load - rotate: false - xy: 1059, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image - rotate: false - xy: 1109, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image-small - rotate: false - xy: 1407, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-image-smaller - rotate: false - xy: 789, 120 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-image-tiny - rotate: false - xy: 1317, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-map - rotate: false - xy: 1159, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-map-small - rotate: false - xy: 1407, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-map-smaller - rotate: false - xy: 789, 88 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-map-tiny - rotate: false - xy: 1335, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-small - rotate: false - xy: 1441, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-smaller - rotate: false - xy: 821, 158 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-tiny - rotate: false - xy: 1353, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-loading - rotate: false - xy: 1209, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-loading-small - rotate: false - xy: 1407, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-loading-smaller - rotate: false - xy: 821, 126 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-loading-tiny - rotate: false - xy: 1371, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-locked - rotate: false - xy: 1259, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-locked-small - rotate: false - xy: 1441, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-locked-smaller - rotate: false - xy: 821, 94 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-locked-tiny - rotate: false - xy: 1389, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-map - rotate: false - xy: 1309, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-map-small - rotate: false - xy: 1475, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-map-smaller - rotate: false - xy: 853, 158 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-map-tiny - rotate: false - xy: 2026, 273 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-menu - rotate: false - xy: 1359, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large - rotate: false - xy: 1409, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large-small - rotate: false - xy: 1441, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-large-smaller - rotate: false - xy: 853, 126 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-large-tiny - rotate: false - xy: 1103, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-menu-small - rotate: false - xy: 1475, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-smaller - rotate: false - xy: 853, 94 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-tiny - rotate: false - xy: 1121, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing - rotate: false - xy: 1459, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-missing-small - rotate: false - xy: 1509, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-missing-smaller - rotate: false - xy: 785, 56 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-missing-tiny - rotate: false - xy: 1103, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-attack - rotate: false - xy: 1509, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-attack-small - rotate: false - xy: 1475, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-attack-smaller - rotate: false - xy: 785, 24 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-attack-tiny - rotate: false - xy: 1139, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-pvp - rotate: false - xy: 1559, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-pvp-small - rotate: false - xy: 1509, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-pvp-smaller - rotate: false - xy: 821, 62 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-pvp-tiny - rotate: false - xy: 1121, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-survival - rotate: false - xy: 1609, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-survival-small - rotate: false - xy: 1543, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-survival-smaller - rotate: false - xy: 853, 62 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-survival-tiny - rotate: false - xy: 1157, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-none - rotate: false - xy: 1659, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-none-small - rotate: false - xy: 1509, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-none-smaller - rotate: false - xy: 817, 30 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-none-tiny - rotate: false - xy: 1139, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-paste - rotate: false - xy: 1709, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-paste-small - rotate: false - xy: 1543, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-paste-smaller - rotate: false - xy: 849, 30 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-paste-tiny - rotate: false - xy: 1175, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pause - rotate: false - xy: 1759, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pause-small - rotate: false - xy: 1577, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pause-smaller - rotate: false - xy: 881, 30 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pause-tiny - rotate: false - xy: 1157, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pencil - rotate: false - xy: 1809, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pencil-small - rotate: false - xy: 1543, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pencil-smaller - rotate: false - xy: 865, 310 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pencil-tiny - rotate: false - xy: 1193, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pick - rotate: false - xy: 1859, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pick-small - rotate: false - xy: 1577, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pick-smaller - rotate: false - xy: 897, 310 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pick-tiny - rotate: false - xy: 1175, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play - rotate: false - xy: 1909, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2 - rotate: false - xy: 1959, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2-small - rotate: false - xy: 1611, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-2-smaller - rotate: false - xy: 883, 278 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-2-tiny - rotate: false - xy: 1211, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-tiny - rotate: false - xy: 1211, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-custom - rotate: false - xy: 287, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-custom-small - rotate: false - xy: 1577, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-custom-smaller - rotate: false - xy: 883, 246 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-custom-tiny - rotate: false - xy: 1193, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-small - rotate: false - xy: 1611, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-smaller - rotate: false - xy: 883, 214 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players - rotate: false - xy: 337, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-players-small - rotate: false - xy: 1645, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-players-smaller - rotate: false - xy: 915, 278 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players-tiny - rotate: false - xy: 1229, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-power - rotate: false - xy: 387, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-power-small - rotate: false - xy: 1611, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-power-smaller - rotate: false - xy: 915, 246 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-power-tiny - rotate: false - xy: 1211, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-production - rotate: false - xy: 437, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-production-small - rotate: false - xy: 1645, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-production-smaller - rotate: false - xy: 915, 214 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-production-tiny - rotate: false - xy: 1229, 52 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-quit - rotate: false - xy: 487, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-quit-small - rotate: false - xy: 1679, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-quit-smaller - rotate: false - xy: 947, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-redo - rotate: false - xy: 537, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-redo-small - rotate: false - xy: 1645, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-redo-smaller - rotate: false - xy: 947, 252 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-redo-tiny - rotate: false - xy: 1111, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-refresh - rotate: false - xy: 587, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-refresh-small - rotate: false - xy: 1679, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-refresh-smaller - rotate: false - xy: 947, 220 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-refresh-tiny - rotate: false - xy: 1111, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rename - rotate: false - xy: 637, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rename-small - rotate: false - xy: 1713, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rename-smaller - rotate: false - xy: 979, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rename-tiny - rotate: false - xy: 1129, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-resize - rotate: false - xy: 687, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-resize-small - rotate: false - xy: 1679, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-resize-smaller - rotate: false - xy: 979, 252 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-resize-tiny - rotate: false - xy: 1129, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate - rotate: false - xy: 737, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow - rotate: false - xy: 787, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow-small - rotate: false - xy: 1713, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-arrow-smaller - rotate: false - xy: 979, 220 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-arrow-tiny - rotate: false - xy: 1147, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-left - rotate: false - xy: 837, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-left-small - rotate: false - xy: 1747, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-left-smaller - rotate: false - xy: 885, 182 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-left-tiny - rotate: false - xy: 1147, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-right - rotate: false - xy: 887, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-right-small - rotate: false - xy: 1713, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-right-smaller - rotate: false - xy: 885, 150 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-right-tiny - rotate: false - xy: 1165, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-small - rotate: false - xy: 1747, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-smaller - rotate: false - xy: 885, 118 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-tiny - rotate: false - xy: 1165, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save - rotate: false - xy: 937, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image - rotate: false - xy: 987, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image-small - rotate: false - xy: 1781, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-image-smaller - rotate: false - xy: 885, 86 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-image-tiny - rotate: false - xy: 1183, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-map - rotate: false - xy: 1037, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-map-small - rotate: false - xy: 1747, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-map-smaller - rotate: false - xy: 917, 182 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-map-tiny - rotate: false - xy: 1183, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-small - rotate: false - xy: 1781, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-smaller - rotate: false - xy: 917, 150 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-tiny - rotate: false - xy: 1201, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings - rotate: false - xy: 1087, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-settings-small - rotate: false - xy: 1815, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-settings-smaller - rotate: false - xy: 917, 118 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-settings-tiny - rotate: false - xy: 1201, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-spray - rotate: false - xy: 1137, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-spray-small - rotate: false - xy: 1781, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-spray-smaller - rotate: false - xy: 917, 86 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-spray-tiny - rotate: false - xy: 1219, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-terrain - rotate: false - xy: 1187, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-terrain-small - rotate: false - xy: 1815, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-terrain-smaller - rotate: false - xy: 949, 188 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-terrain-tiny - rotate: false - xy: 1219, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tools - rotate: false - xy: 1237, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tools-small - rotate: false - xy: 1849, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tools-smaller - rotate: false - xy: 949, 156 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tools-tiny - rotate: false - xy: 1237, 34 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trash - rotate: false - xy: 1287, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16 - rotate: false - xy: 1337, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16-small - rotate: false - xy: 1815, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-16-smaller - rotate: false - xy: 949, 124 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-16-tiny - rotate: false - xy: 1237, 16 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trash-small - rotate: false - xy: 1849, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-smaller - rotate: false - xy: 949, 92 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-tiny - rotate: false - xy: 1247, 54 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree - rotate: false - xy: 1387, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tree-small - rotate: false - xy: 1883, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tree-smaller - rotate: false - xy: 981, 188 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tree-tiny - rotate: false - xy: 1265, 54 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trello - rotate: false - xy: 1437, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trello-small - rotate: false - xy: 1849, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trello-smaller - rotate: false - xy: 981, 156 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trello-tiny - rotate: false - xy: 1283, 54 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-turret - rotate: false - xy: 1487, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-turret-small - rotate: false - xy: 1883, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-turret-smaller - rotate: false - xy: 981, 124 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-turret-tiny - rotate: false - xy: 1255, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tutorial - rotate: false - xy: 1537, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tutorial-small - rotate: false - xy: 1883, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tutorial-smaller - rotate: false - xy: 981, 92 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tutorial-tiny - rotate: false - xy: 1255, 18 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-undo - rotate: false - xy: 1587, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-undo-small - rotate: false - xy: 1407, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-undo-smaller - rotate: false - xy: 913, 54 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-undo-tiny - rotate: false - xy: 1273, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-units - rotate: false - xy: 1637, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-units-small - rotate: false - xy: 1441, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-units-smaller - rotate: false - xy: 913, 22 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-units-tiny - rotate: false - xy: 1273, 18 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-unlocks - rotate: false - xy: 1687, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-unlocks-small - rotate: false - xy: 1475, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-unlocks-smaller - rotate: false - xy: 949, 60 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-unlocks-tiny - rotate: false - xy: 1291, 36 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-upgrade - rotate: false - xy: 1737, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-upgrade-small - rotate: false - xy: 1509, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-upgrade-smaller - rotate: false - xy: 981, 60 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-upgrade-tiny - rotate: false - xy: 1291, 18 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-wiki - rotate: false - xy: 1787, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-wiki-small - rotate: false - xy: 1543, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-wiki-smaller - rotate: false - xy: 945, 28 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-wiki-tiny - rotate: false - xy: 1385, 297 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-workshop - rotate: false - xy: 1837, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-workshop-small - rotate: false - xy: 1577, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-workshop-smaller - rotate: false - xy: 977, 28 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-workshop-tiny - rotate: false - xy: 1403, 297 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-zoom - rotate: false - xy: 1887, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-zoom-small - rotate: false - xy: 1611, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-zoom-smaller - rotate: false - xy: 1009, 28 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-zoom-tiny - rotate: false - xy: 1421, 297 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -info-banner - rotate: false - xy: 259, 978 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -inventory - rotate: false - xy: 1271, 252 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -nomap - rotate: false - xy: 1, 767 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -pane - rotate: false - xy: 1251, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 1213, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 1323, 283 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 301, 1 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 301, 27 - size: 40, 24 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 1297, 252 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 309, 975 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 2026, 331 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 983, 420 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 1014, 428 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 1009, 380 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 51, 717 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 1403, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 1289, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 1327, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 1365, 696 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 1415, 589 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 2019, 640 - size: 27, 61 - split: 4, 4, 2, 2 - orig: 27, 61 - offset: 0, 0 - index: -1 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 3b1dbc0ad1..400aa6aa85 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index c77a57be15..840793ca6f 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/assets/sprites/sprites4.png b/core/assets/sprites/sprites4.png index 9c08c17bf7..20a3e8fd6c 100644 Binary files a/core/assets/sprites/sprites4.png and b/core/assets/sprites/sprites4.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png index e6443c9a51..9c08c17bf7 100644 Binary files a/core/assets/sprites/sprites5.png and b/core/assets/sprites/sprites5.png differ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index b653dfea91..2d8f4f83c0 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -45,6 +45,10 @@ public class Vars implements Loadable{ public static final String discordURL = "https://discord.gg/mindustry"; /** URL for sending crash reports to */ 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.*/ public static final Array defaultServers = Array.with(/*"mins.us.to"*/); /** maximum distance between mine and core that supports automatic transferring */ @@ -257,7 +261,7 @@ public class Vars implements Loadable{ public static void loadSettings(){ 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/")); } diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index b57e364d91..0fdbbb7c5e 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -164,6 +164,10 @@ public class BlockIndexer{ } public TileEntity findTile(Team team, float x, float y, float range, Predicate pred){ + return findTile(team, x, y, range, pred, false); + } + + public TileEntity findTile(Team team, float x, float y, float range, Predicate pred, boolean usePriority){ TileEntity closest = null; float dst = 0; @@ -184,7 +188,7 @@ public class BlockIndexer{ TileEntity e = other.entity; 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; closest = e; } diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 573ad8a832..130d56d369 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -9,7 +9,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.entities.*; 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.gen.*; 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.modules.*; -import static io.anuke.mindustry.Vars.*; - public class Blocks implements ContentList{ public static Block @@ -58,7 +56,7 @@ public class Blocks implements ContentList{ phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, forceProjector, shockMine, //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 mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit, @@ -716,23 +714,23 @@ public class Blocks implements ContentList{ //region sandbox powerVoid = new PowerVoid("power-void"){{ - requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; powerSource = new PowerSource("power-source"){{ - requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; itemSource = new ItemSource("item-source"){{ - requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; itemVoid = new ItemVoid("item-void"){{ - requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; liquidSource = new LiquidSource("liquid-source"){{ - requirements(Category.liquid, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; message = new MessageBlock("message"){{ @@ -745,27 +743,27 @@ public class Blocks implements ContentList{ int wallHealthMultiplier = 4; scrapWall = new Wall("scrap-wall"){{ - requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); health = 60 * wallHealthMultiplier; variants = 5; }}; 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; size = 2; variants = 4; }}; 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; size = 3; variants = 3; }}; 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; size = 4; }}; @@ -935,7 +933,11 @@ public class Blocks implements ContentList{ sorter = new Sorter("sorter"){{ 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"){{ @@ -965,12 +967,12 @@ public class Blocks implements ContentList{ //region liquid 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; }}; 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; consumes.power(0.15f); liquidCapacity = 30f; @@ -979,7 +981,7 @@ public class Blocks implements ContentList{ }}; 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; consumes.power(0.30f); liquidCapacity = 40f; @@ -993,13 +995,13 @@ public class Blocks implements ContentList{ }}; 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; health = 90; }}; 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; }}; @@ -1011,11 +1013,11 @@ public class Blocks implements ContentList{ }}; 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"){{ - requirements(Category.liquid, ItemStack.with(Items.titanium, 4, Items.metaglass, 4)); + requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 8)); range = 4; hasPower = false; }}; @@ -1083,11 +1085,12 @@ public class Blocks implements ContentList{ 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)); powerProduction = 16f; itemDuration = 120f; hasLiquids = true; + hasItems = true; size = 3; consumes.item(Items.pyratite).optional(true, false); @@ -1230,7 +1233,7 @@ public class Blocks implements ContentList{ //region storage 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; health = 1100; @@ -1239,7 +1242,7 @@ public class Blocks implements ContentList{ }}; 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; itemCapacity = 9000; @@ -1247,7 +1250,7 @@ public class Blocks implements ContentList{ }}; 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; itemCapacity = 13000; @@ -1272,7 +1275,7 @@ public class Blocks implements ContentList{ }}; 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; itemCapacity = 100; launchTime = 60f * 16; @@ -1281,7 +1284,7 @@ public class Blocks implements ContentList{ }}; 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; itemCapacity = 250; launchTime = 60f * 14; diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index 090257f468..21ca9ff84b 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -31,6 +31,7 @@ public class TechTree implements ContentList{ node(distributor); node(sorter, () -> { + node(invertedSorter); node(message); node(overflowGate); }); diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index f632fcee19..c472d9de93 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -62,7 +62,7 @@ public class UnitTypes implements ContentList{ range = 70f; itemCapacity = 70; health = 400; - buildPower = 1f; + buildPower = 0.4f; engineOffset = 6.5f; toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium); weapon = new Weapon("heal-blaster"){{ diff --git a/core/src/io/anuke/mindustry/content/Zones.java b/core/src/io/anuke/mindustry/content/Zones.java index ca7013fa3f..90794dd80e 100644 --- a/core/src/io/anuke/mindustry/content/Zones.java +++ b/core/src/io/anuke/mindustry/content/Zones.java @@ -1,13 +1,15 @@ package io.anuke.mindustry.content; -import io.anuke.arc.collection.Array; -import io.anuke.mindustry.game.ContentList; -import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.maps.generators.MapGenerator; -import io.anuke.mindustry.maps.generators.MapGenerator.Decoration; -import io.anuke.mindustry.maps.zonegen.DesertWastesGenerator; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Objectives.*; +import io.anuke.mindustry.maps.generators.*; +import io.anuke.mindustry.maps.generators.MapGenerator.*; +import io.anuke.mindustry.maps.zonegen.*; 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 static Zone @@ -20,28 +22,26 @@ public class Zones implements ContentList{ public void load(){ groundZero = new Zone("groundZero", new MapGenerator("groundZero", 1)){{ - baseLaunchCost = ItemStack.with(Items.copper, -60); - startingItems = ItemStack.list(Items.copper, 60); + baseLaunchCost = list(copper, -60); + startingItems = list(copper, 60); alwaysUnlocked = true; conditionWave = 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)){{ - startingItems = ItemStack.list(Items.copper, 120); + startingItems = list(copper, 120); conditionWave = 20; launchPeriod = 10; loadout = Loadouts.advancedShard; - zoneRequirements = ZoneRequirement.with(groundZero, 20); - blockRequirements = new Block[]{Blocks.combustionGenerator}; - resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.sand}; + resources = with(copper, lead, coal, sand); rules = r -> { r.waves = true; r.waveTimer = true; r.launchWaveMultiplier = 3f; r.waveSpacing = 60 * 50f; - r.spawns = Array.with( + r.spawns = with( new SpawnGroup(UnitTypes.crawler){{ 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")){{ - startingItems = ItemStack.list(Items.copper, 200, Items.silicon, 200, Items.lead, 200); + startingItems = list(copper, 200, Items.silicon, 200, lead, 200); loadout = Loadouts.basicFoundation; conditionWave = 10; launchPeriod = 5; - zoneRequirements = ZoneRequirement.with(desertWastes, 60); - blockRequirements = new Block[]{Blocks.daggerFactory, Blocks.draugFactory, Blocks.door, Blocks.waterExtractor}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand, Items.titanium}; + configureObjective = new Launched(this); + resources = with(copper, scrap, lead, coal, sand, 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) .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02))){{ loadout = Loadouts.basicFoundation; - baseLaunchCost = ItemStack.with(); - startingItems = ItemStack.list(Items.copper, 250); + startingItems = list(copper, 250); conditionWave = 10; - blockRequirements = new Block[]{Blocks.junction, Blocks.router}; - zoneRequirements = ZoneRequirement.with(groundZero, 10); - resources = new Item[]{Items.copper, Items.lead, Items.coal}; + resources = with(copper, lead, coal); + requirements = with( + 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))){{ - startingItems = ItemStack.list(Items.copper, 100); + startingItems = list(copper, 100); conditionWave = 10; - zoneRequirements = ZoneRequirement.with(frozenForest, 10); - blockRequirements = new Block[]{Blocks.mender, Blocks.combustionGenerator}; - resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.sand, Items.scrap}; + resources = with(copper, lead, coal, sand, scrap); + requirements = with( + new ZoneWave(frozenForest, 10), + new Unlock(Blocks.mender), + new Unlock(Blocks.combustionGenerator) + ); }}; ruinousShores = new Zone("ruinousShores", new MapGenerator("ruinousShores", 1)){{ loadout = Loadouts.basicFoundation; - baseLaunchCost = ItemStack.with(); - startingItems = ItemStack.list(Items.copper, 140, Items.lead, 50); + startingItems = list(copper, 140, lead, 50); conditionWave = 20; launchPeriod = 20; - zoneRequirements = ZoneRequirement.with(desertWastes, 20, craters, 15); - blockRequirements = new Block[]{Blocks.graphitePress, Blocks.combustionGenerator, Blocks.kiln, Blocks.mechanicalPump}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand}; + resources = with(copper, scrap, lead, coal, sand); + requirements = with( + 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) .decor(new Decoration(Blocks.shale, Blocks.shaleBoulder, 0.02))){{ loadout = Loadouts.basicFoundation; - startingItems = ItemStack.list(Items.copper, 200, Items.lead, 50); + startingItems = list(copper, 200, lead, 50); conditionWave = 10; launchPeriod = 10; - zoneRequirements = ZoneRequirement.with(frozenForest, 15); - blockRequirements = new Block[]{Blocks.pneumaticDrill, Blocks.powerNode, Blocks.turbineGenerator}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.sand}; + resources = with(copper, scrap, lead, coal, titanium, sand); + requirements = with( + new ZoneWave(frozenForest, 15), + new Unlock(Blocks.pneumaticDrill), + new Unlock(Blocks.powerNode), + new Unlock(Blocks.turbineGenerator) + ); }}; fungalPass = new Zone("fungalPass", new MapGenerator("fungalPass")){{ - startingItems = ItemStack.list(Items.copper, 250, Items.lead, 250, Items.metaglass, 100, Items.graphite, 100); - zoneRequirements = ZoneRequirement.with(stainedMountains, 15); - blockRequirements = new Block[]{Blocks.daggerFactory, Blocks.crawlerFactory, Blocks.door, Blocks.siliconSmelter}; - resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.titanium, Items.sand}; + startingItems = list(copper, 250, lead, 250, Items.metaglass, 100, Items.graphite, 100); + resources = with(copper, lead, coal, titanium, sand); + configureObjective = new Launched(this); + 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")){{ - 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; launchPeriod = 4; loadout = Loadouts.basicNucleus; - zoneRequirements = ZoneRequirement.with(craters, 40, fungalPass, 10); - blockRequirements = new Block[]{Blocks.cultivator, Blocks.sporePress, Blocks.titanFactory, Blocks.wraithFactory}; - resources = new Item[]{Items.copper, Items.lead, Items.coal, Items.titanium, Items.sand, Items.thorium, Items.scrap}; + configureObjective = new Launched(this); + resources = with(copper, lead, coal, titanium, sand, thorium, 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") .decor(new Decoration(Blocks.shale, Blocks.shaleBoulder, 0.02))){{ loadout = Loadouts.basicFoundation; - startingItems = ItemStack.list(Items.copper, 250, Items.lead, 100); + startingItems = list(copper, 250, lead, 100); conditionWave = 15; launchPeriod = 10; - zoneRequirements = ZoneRequirement.with(ruinousShores, 20); - blockRequirements = new Block[]{Blocks.coalCentrifuge, Blocks.conduit, Blocks.wave}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium, Items.sand}; + requirements = with(new ZoneWave(ruinousShores, 20)); + resources = with(copper, scrap, lead, coal, titanium, thorium, 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")){{ loadout = Loadouts.basicNucleus; - baseLaunchCost = ItemStack.with(); - startingItems = ItemStack.list(Items.copper, 1000, Items.lead, 1000, Items.graphite, 250, Items.titanium, 250, Items.silicon, 250); + startingItems = list(copper, 1000, lead, 1000, Items.graphite, 250, titanium, 250, Items.silicon, 250); conditionWave = 3; launchPeriod = 2; - zoneRequirements = ZoneRequirement.with(tarFields, 20); - blockRequirements = new Block[]{Blocks.thermalGenerator, Blocks.thoriumReactor}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.sand, Items.thorium}; + resources = with(copper, scrap, lead, coal, titanium, sand, thorium); + requirements = with( + 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); conditionWave = 3; launchPeriod = 2; - zoneRequirements = ZoneRequirement.with(stainedMountains, 40); + requirements = with(stainedMountains, 40); 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) .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01))){{ loadout = Loadouts.basicNucleus; - baseLaunchCost = ItemStack.with(); - startingItems = ItemStack.list(Items.copper, 1250, Items.lead, 1500, Items.silicon, 400, Items.metaglass, 250); + startingItems = list(copper, 1250, lead, 1500, Items.silicon, 400, Items.metaglass, 250); conditionWave = 30; launchPeriod = 15; - zoneRequirements = ZoneRequirement.with(fungalPass, 8); - blockRequirements = new Block[]{Blocks.thermalGenerator, Blocks.laserDrill}; - resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.titanium, Items.thorium, Items.sand}; + resources = with(copper, scrap, lead, coal, titanium, thorium, sand); + requirements = with( + 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); conditionWave = 3; launchPeriod = 2; - zoneRequirements = ZoneRequirement.with(nuclearComplex, 40); + requirements = with(nuclearComplex, 40); 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}; }};*/ } } diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 771dbba8d4..08302458d2 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -2,6 +2,8 @@ package io.anuke.mindustry.core; import io.anuke.arc.*; 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.g2d.*; import io.anuke.arc.input.*; @@ -54,6 +56,9 @@ public class Control implements ApplicationListener, Loadable{ Events.on(StateChangeEvent.class, event -> { if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){ 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 -> { - 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 -> { - 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, () -> { @@ -166,6 +175,12 @@ public class Control implements ApplicationListener, Loadable{ Effects.shake(5f, 5f, core); }); }); + + Events.on(UnitDestroyEvent.class, e -> { + if(e.unit instanceof BaseUnit && world.isZone()){ + data.unlockContent(((BaseUnit)e.unit).getType()); + } + }); } @Override @@ -401,6 +416,7 @@ public class Control implements ApplicationListener, Loadable{ music.update(); loops.update(); + Time.updateGlobal(); if(Core.input.keyTap(Binding.fullscreen)){ boolean full = settings.getBool("fullscreen"); diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index c0544f70bf..d4fe3a4dc6 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.core; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; -import io.anuke.arc.collection.ObjectSet.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; @@ -136,8 +135,7 @@ public class Logic implements ApplicationListener{ public void runWave(){ spawner.spawnEnemies(); state.wave++; - state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * state.rules.bossWaveMultiplier : - world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing; + state.wavetime = world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing; Events.fire(new WaveEvent()); } @@ -176,12 +174,16 @@ public class Logic implements ApplicationListener{ 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); } + if(world.getZone() != null){ + world.getZone().setLaunched(); + } + 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()){ if(tile == null || tile.entity == null || tile.entity.items == null) continue; data.addItem(item, tile.entity.items.get(item)); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index f5cc0f873a..6bae988f24 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -94,11 +94,6 @@ public class NetServer implements ApplicationListener{ return; } - if(admins.isIDBanned(uuid)){ - con.kick(KickReason.banned); - return; - } - if(admins.getPlayerLimit() > 0 && playerGroup.size() >= admins.getPlayerLimit()){ con.kick(KickReason.playerLimit); return; @@ -357,6 +352,11 @@ public class NetServer implements ApplicationListener{ if(currentlyKicking[0] == null){ player.sendMessage("[scarlet]Nobody is being voted on."); }else{ + if(player.isLocal){ + player.sendMessage("Local players can't vote. Kick the player yourself instead."); + return; + } + //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))){ player.sendMessage("[scarlet]You've already voted. Sit down."); diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index d7aa0ea55d..bfedda548c 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -31,11 +31,16 @@ public interface Platform{ return Array.with(); } + /** Steam: Return external workshop mods to be loaded.*/ + default Array getExternalMods(){ + return Array.with(); + } + /** Steam: View a map listing on the workshop.*/ default void viewMapListing(Map map){} - /** Steam: View a map listing on the workshop.*/ - default void viewMapListing(String mapid){} + /** Steam: View a listing on the workshop.*/ + default void viewListing(String mapid){} /** Steam: View map workshop info, removing the map ID tag if its listing is deleted. * Also presents the option to update the map. */ diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 99c654e579..57ad4cccda 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -238,7 +238,6 @@ public class UI implements ApplicationListener, Loadable{ Core.scene.add(menuGroup); Core.scene.add(hudGroup); - control.input.getFrag().build(hudGroup); hudfrag.build(hudGroup); menufrag.build(menuGroup); chatfrag.container().build(hudGroup); @@ -284,7 +283,7 @@ public class UI implements ApplicationListener, Loadable{ new Dialog(titleText){{ cont.margin(30).add(dtext).padRight(6f); 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)); buttons.defaults().size(120, 54).pad(4); buttons.addButton("$ok", () -> { @@ -339,6 +338,7 @@ public class UI implements ApplicationListener, Loadable{ } public void showException(String text, Throwable exc){ + loadfrag.hide(); new Dialog(""){{ String message = Strings.getFinalMesage(exc); diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 4e2806e62d..6491a639e4 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -272,6 +272,7 @@ public class World{ } public void removeBlock(Tile tile){ + if(tile == null) return; tile.link().getLinkedTiles(other -> other.setBlock(Blocks.air)); } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 1a5da836bb..88fe62e604 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -150,7 +150,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ menu.cont.addImageTextButton("$editor.publish.workshop", Icon.linkSmall, () -> { Map builtin = maps.all().find(m -> m.name().equals(editor.getTags().get("name", "").trim())); if(editor.getTags().containsKey("steamid") && builtin != null && !builtin.custom){ - platform.viewMapListing(editor.getTags().get("steamid")); + platform.viewListing(editor.getTags().get("steamid")); return; } diff --git a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java index 4639faf878..3284feda19 100644 --- a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java @@ -46,7 +46,7 @@ public class MapResizeDialog extends FloatingDialog{ buttons.defaults().size(200f, 50f); buttons.addButton("$cancel", this::hide); - buttons.addButton("$editor.resize", () -> { + buttons.addButton("$ok", () -> { cons.accept(width, height); hide(); }); diff --git a/core/src/io/anuke/mindustry/entities/TargetPriority.java b/core/src/io/anuke/mindustry/entities/TargetPriority.java new file mode 100644 index 0000000000..47b0213de3 --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/TargetPriority.java @@ -0,0 +1,6 @@ +package io.anuke.mindustry.entities; + +public enum TargetPriority{ + base, + turret +} diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java index af3d3f4fe7..c9d0073998 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/io/anuke/mindustry/entities/Units.java @@ -87,7 +87,7 @@ public class Units{ if(team == Team.derelict) return null; 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){ return entity; } diff --git a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java index 81da65344d..1bc00443c6 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java @@ -20,6 +20,10 @@ public class ArtilleryBulletType extends BasicBulletType{ hitSound = Sounds.explosion; } + public ArtilleryBulletType(){ + this(1f, 1f, "shell"); + } + @Override public void update(io.anuke.mindustry.entities.type.Bullet b){ super.update(b); diff --git a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java index 8f54b58995..bf20c811ab 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java @@ -22,6 +22,11 @@ public class BasicBulletType extends BulletType{ this.bulletSprite = bulletSprite; } + /** For mods. */ + public BasicBulletType(){ + this(1f, 1f, "bullet"); + } + @Override public void load(){ backRegion = Core.atlas.find(bulletSprite + "-back"); diff --git a/core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java index bf2e5ecd43..55c0a3b87d 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java @@ -17,4 +17,8 @@ public class BombBulletType extends BasicBulletType{ collidesAir = false; hitSound = Sounds.explosion; } + + public BombBulletType(){ + this(1f, 1f, "shell"); + } } diff --git a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java index 3669909097..c6e2928b28 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java @@ -19,6 +19,10 @@ public abstract class FlakBulletType extends BasicBulletType{ bulletHeight = 10f; } + public FlakBulletType(){ + this(1f, 1f); + } + @Override public void update(Bullet b){ super.update(b); diff --git a/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java index dab576883c..95dbef7b63 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java @@ -22,6 +22,10 @@ public class HealBulletType extends BulletType{ collidesTeam = true; } + public HealBulletType(){ + this(1f, 1f); + } + @Override public boolean collides(Bullet b, Tile tile){ return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f; diff --git a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java index 186ea47425..7d53a852ec 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.entities.bullet; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; @@ -13,14 +14,17 @@ import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; public class LiquidBulletType extends BulletType{ - Liquid liquid; + @NonNull Liquid liquid; - public LiquidBulletType(Liquid liquid){ + public LiquidBulletType(@Nullable Liquid liquid){ super(3.5f, 0); - this.liquid = liquid; + + if(liquid != null){ + this.liquid = liquid; + this.status = liquid.effect; + } lifetime = 74f; - status = liquid.effect; statusDuration = 90f; despawnEffect = Fx.none; hitEffect = Fx.hitLiquid; @@ -30,13 +34,17 @@ public class LiquidBulletType extends BulletType{ knockback = 0.55f; } + public LiquidBulletType(){ + this(null); + } + @Override public float range(){ return speed * lifetime / 2f; } @Override - public void update(io.anuke.mindustry.entities.type.Bullet b){ + public void update(Bullet b){ super.update(b); if(liquid.canExtinguish()){ @@ -50,7 +58,7 @@ public class LiquidBulletType extends BulletType{ } @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); Fill.circle(b.x, b.y, 0.5f + b.fout() * 2.5f); diff --git a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java index 06d05d1110..aee06f9e31 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java @@ -23,6 +23,10 @@ public class MissileBulletType extends BasicBulletType{ hitSound = Sounds.explosion; } + public MissileBulletType(){ + this(1f, 1f, "missile"); + } + @Override public void update(Bullet b){ super.update(b); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 79069ca5b4..7fe7aea771 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -6,8 +6,8 @@ import io.anuke.arc.collection.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; 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. */ 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()){ if(request.x == place.x && request.y == place.y){ return; @@ -197,7 +202,11 @@ public interface BuilderTrait extends Entity, TeamTrait{ if(tile != null && tile.entity instanceof BuildEntity){ place.progress = tile.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 BuildRequest{ - public final int x, y, rotation; - public final Block block; - public final boolean breaking; + public int x, y, rotation; + public @Nullable Block block; + public boolean breaking; public boolean hasConfig; public int config; public float progress; public boolean initialized; + //animation variables + public float animScale = 0f; + public float animInvalid; + /** This creates a build request. */ public BuildRequest(int x, int y, int rotation, Block block){ this.x = x; @@ -285,13 +298,42 @@ public interface BuilderTrait extends Entity, TeamTrait{ 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){ this.config = config; this.hasConfig = true; return this; } - public Tile tile(){ + public @Nullable Tile tile(){ return world.tile(x, y); } diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 5b122c9ff2..82ac867e05 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -19,9 +19,7 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; -import io.anuke.mindustry.input.InputHandler.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.*; @@ -51,7 +49,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public String name = "noname"; public @Nullable 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 boolean achievedFlight; public Color color = new Color(); @@ -357,7 +355,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public void drawOver(){ if(dead) return; - drawMechanics(); + if(isBuilding()){ + if(!state.isPaused() && isBuilding){ + drawBuilding(); + } + }else{ + drawMining(); + } } @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. */ public void drawBuildRequests(){ - BuildRequest last = null; + if(!isLocal) return; + for(BuildRequest request : buildQueue()){ 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){ - Block block = world.ltile(request.x, request.y).block(); - - //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); + control.input.drawBreaking(request); }else{ - Draw.color(); - PlaceDraw draw = PlaceDraw.instance; - - 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; + request.block.drawRequest(request, control.input.allRequests(), + Build.validPlace(getTeam(), request.x, request.y, request.block, request.rotation)); } } @@ -485,6 +449,18 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ //region update methods + @Override + public void updateMechanics(){ + if(isBuilding){ + updateBuilding(); + } + + //mine only when not building + if(buildRequest() == null){ + updateMining(); + } + } + @Override public void update(){ hitTime -= Time.delta(); @@ -517,7 +493,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ } 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); } @@ -817,6 +793,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ placeQueue.clear(); dead = true; lastText = null; + isBuilding = true; textFadeTime = 0f; target = null; moveTarget = null; @@ -910,7 +887,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public void write(DataOutput buffer) throws IOException{ super.writeSave(buffer, !isLocal); 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.writeByte(mech.id); buffer.writeInt(mining == null ? noSpawner : mining.pos()); @@ -932,6 +909,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ dead = (bools & 2) != 0; boolean boosting = (bools & 4) != 0; isTyping = (bools & 8) != 0; + boolean building = (bools & 16) != 0; color.set(buffer.readInt()); mech = content.getByID(ContentType.mech, buffer.readByte()); int mine = buffer.readInt(); @@ -950,6 +928,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ velocity.y = lastvy; }else{ mining = world.tile(mine); + isBuilding = building; isBoosting = boosting; } diff --git a/core/src/io/anuke/mindustry/game/Content.java b/core/src/io/anuke/mindustry/game/Content.java index 20d8612697..0c03f47eff 100644 --- a/core/src/io/anuke/mindustry/game/Content.java +++ b/core/src/io/anuke/mindustry/game/Content.java @@ -1,16 +1,19 @@ package io.anuke.mindustry.game; +import io.anuke.arc.files.*; 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.type.ContentType; +import io.anuke.mindustry.type.*; /** 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{ public final short id; /** The mod that loaded this piece of content. */ public @Nullable LoadedMod mod; + /** File that this content was loaded from. */ + public @Nullable FileHandle sourceFile; public Content(){ this.id = (short)Vars.content.getBy(getContentType()).size; @@ -34,6 +37,11 @@ public abstract class Content{ public void load(){ } + @Override + public int compareTo(Content c){ + return Integer.compare(id, c.id); + } + @Override public String toString(){ return getContentType().name() + "#" + id; diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index f26dc08970..c526a5359c 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -61,11 +61,13 @@ public class EventType{ /** Called when a zone's requirements are met. */ public static class ZoneRequireCompleteEvent{ - public final Zone zone, required; + public final Zone zoneMet, zoneForMet; + public final Objective objective; - public ZoneRequireCompleteEvent(Zone zone, Zone required){ - this.zone = zone; - this.required = required; + public ZoneRequireCompleteEvent(Zone zoneMet, Zone zoneForMet, Objective objective){ + this.zoneMet = zoneMet; + this.zoneForMet = zoneForMet; + this.objective = objective; } } @@ -130,7 +132,13 @@ public class EventType{ /** Called when a player deposits items to a block.*/ 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{ diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index a782dc3f07..5ef1ae09fb 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -91,12 +91,17 @@ public class GlobalData{ state.stats.itemsDelivered.getAndIncrement(item, 0, amount); } + public boolean hasItems(Array stacks){ + return !stacks.contains(s -> items.get(s.item, 0) < s.amount); + } + public boolean hasItems(ItemStack[] stacks){ for(ItemStack stack : stacks){ - if(items.get(stack.item, 0) < stack.amount){ + if(!has(stack.item, stack.amount)){ return false; } } + return true; } @@ -107,6 +112,13 @@ public class GlobalData{ modified = true; } + public void removeItems(Array stacks){ + for(ItemStack stack : stacks){ + items.getAndIncrement(stack.item, 0, -stack.amount); + } + modified = true; + } + public boolean has(Item item, int amount){ return items.get(item, 0) >= amount; } @@ -150,6 +162,7 @@ public class GlobalData{ @SuppressWarnings("unchecked") public void load(){ + items.clear(); unlocked = Core.settings.getObject("unlocks", ObjectMap.class, ObjectMap::new); for(Item item : Vars.content.items()){ items.put(item, Core.settings.getInt("item-" + item.name, 0)); diff --git a/core/src/io/anuke/mindustry/game/Objective.java b/core/src/io/anuke/mindustry/game/Objective.java new file mode 100644 index 0000000000..dcd1146a10 --- /dev/null +++ b/core/src/io/anuke/mindustry/game/Objective.java @@ -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; + } +} diff --git a/core/src/io/anuke/mindustry/game/Objectives.java b/core/src/io/anuke/mindustry/game/Objectives.java new file mode 100644 index 0000000000..340346bc13 --- /dev/null +++ b/core/src/io/anuke/mindustry/game/Objectives.java @@ -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; + } +} diff --git a/core/src/io/anuke/mindustry/game/Rules.java b/core/src/io/anuke/mindustry/game/Rules.java index 0d85482976..94cf4225ad 100644 --- a/core/src/io/anuke/mindustry/game/Rules.java +++ b/core/src/io/anuke/mindustry/game/Rules.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.Serialize; -import io.anuke.arc.collection.Array; -import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.io.JsonIO; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.type.Zone; +import io.anuke.annotations.Annotations.*; +import io.anuke.arc.collection.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.io.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; /** * Defines current rules on how the game should function. @@ -69,6 +69,8 @@ public class Rules{ public boolean tutorial = false; /** Starting items put in cores */ public Array loadout = Array.with(ItemStack.with(Items.copper, 100)); + /** Blocks that cannot be placed. */ + public ObjectSet bannedBlocks = new ObjectSet<>(); /** Copies this ruleset exactly. Not very efficient at all, do not use often. */ public Rules copy(){ diff --git a/core/src/io/anuke/mindustry/game/UnlockableContent.java b/core/src/io/anuke/mindustry/game/UnlockableContent.java index 149fb3e0d4..9b1986b9c9 100644 --- a/core/src/io/anuke/mindustry/game/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/game/UnlockableContent.java @@ -31,7 +31,11 @@ public abstract class UnlockableContent extends MappableContent{ /** Returns a specific content icon, or the region {contentType}-{name} if not found.*/ public TextureRegion icon(Cicon icon){ 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()]; } diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 767ffa9ec2..1b9f821e92 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -9,12 +9,10 @@ import io.anuke.arc.graphics.glutils.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; 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.EventType.*; import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.Block.*; import static io.anuke.arc.Core.camera; import static io.anuke.mindustry.Vars.*; @@ -30,6 +28,7 @@ public class BlockRenderer implements Disposable{ private int lastCamX, lastCamY, lastRangeX, lastRangeY; private int requestidx = 0; private int iterateidx = 0; + private float brokenFade = 0f; private FrameBuffer shadows = new FrameBuffer(2, 2); private FrameBuffer fog = new FrameBuffer(2, 2); private Array outArray = new Array<>(); @@ -125,13 +124,19 @@ public class BlockRenderer implements Disposable{ } 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){ 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; - Draw.alpha(0.5f); - Draw.mixcol(Pal.accent, 0.2f + Mathf.absin(5f, 0.2f)); + Draw.alpha(0.53f * brokenFade); + 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.reset(); @@ -242,28 +247,34 @@ public class BlockRenderer implements Disposable{ } public void drawBlocks(Layer stopAt){ - + int startIdx = 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; } - BlockRequest req = requests.get(iterateidx); - Block block = req.tile.block(); + if(request.layer == Layer.power){ + if(iterateidx - startIdx > 0 && request.tile.pos() == requests.get(iterateidx - 1).tile.pos()){ + continue; + } + } - if(req.layer == Layer.block){ - block.draw(req.tile); - if(req.tile.entity != null && req.tile.entity.damaged()){ - block.drawCracks(req.tile); + Block block = request.tile.block(); + + if(request.layer == Layer.block){ + 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()){ - block.drawTeam(req.tile); + if(block.synthetic() && request.tile.getTeam() != player.getTeam()){ + block.drawTeam(request.tile); } - }else if(req.layer == block.layer){ - block.drawLayer(req.tile); - }else if(req.layer == block.layer2){ - block.drawLayer2(req.tile); + }else if(request.layer == block.layer){ + block.drawLayer(request.tile); + }else if(request.layer == block.layer2){ + block.drawLayer2(request.tile); } } } @@ -328,7 +339,9 @@ public class BlockRenderer implements Disposable{ @Override 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 diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index b47b648f69..3c91d89a58 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -25,9 +25,9 @@ public class OverlayRenderer{ public void drawBottom(){ InputHandler input = control.input; - if(!input.isDrawing() || player.isDead()) return; + if(player.isDead()) return; - input.drawOutlined(); + input.drawBottom(); } public void drawTop(){ diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 8f599a872f..90309b74ad 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -12,6 +12,8 @@ public enum Binding implements KeyBind{ select(KeyCode.MOUSE_LEFT), deselect(KeyCode.MOUSE_RIGHT), break_block(KeyCode.MOUSE_RIGHT), + clear_building(KeyCode.Q), + pause_building(KeyCode.E), rotate(new Axis(KeyCode.SCROLL)), rotateplaced(KeyCode.R), diagonal_placement(KeyCode.CONTROL_LEFT), diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 3bd752086e..575ee5c134 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -5,15 +5,15 @@ import io.anuke.arc.Graphics.*; import io.anuke.arc.Graphics.Cursor.*; import io.anuke.arc.graphics.g2d.*; 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.util.*; -import io.anuke.mindustry.content.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.PlaceUtils.*; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import static io.anuke.arc.Core.scene; @@ -23,101 +23,77 @@ import static io.anuke.mindustry.input.PlaceMode.*; public class DesktopInput extends InputHandler{ /** Current cursor type. */ private Cursor cursorType = SystemCursor.arrow; - /** Position where the player started dragging a line. */ private int selectX, selectY; + /** Last known line positions.*/ + private int lastLineX, lastLineY; /** Whether selecting mode is active. */ private PlaceMode mode; /** Animation scale for line. */ 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; - - /** 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)){ - block.getPlaceDraw(placeDraw, rotation, prevX, prevY, prevRotation); - - Draw.color(); - Draw.mixcol(Pal.accent, 0.12f + Mathf.absin(Time.time(), 8f, 0.35f)); - Draw.rect(placeDraw.region, x * tilesize + block.offset(), y * tilesize + block.offset(), - placeDraw.region.getWidth() * selectScale * Draw.scl * placeDraw.scalex, - 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 + public void buildUI(Group group){ + group.fill(t -> { + t.bottom().update(() -> t.getColor().a = Mathf.lerpDelta(t.getColor().a, player.isBuilding() ? 1f : 0f, 0.15f)); + t.visible(() -> Core.settings.getBool("hints")); + t.table(Styles.black6, b -> { + b.defaults().left(); + b.label(() -> Core.bundle.format(!player.isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.name())).style(Styles.outlineLabel); + b.row(); + b.add(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.name())).style(Styles.outlineLabel); + }).margin(10f); + }); } @Override - public boolean isDrawing(){ - return mode != none || block != null; - } - - @Override - public void drawOutlined(){ + public void drawTop(){ Lines.stroke(1f); int cursorX = tileX(Core.input.mouseX()); int cursorY = tileY(Core.input.mouseY()); //draw selection(s) if(mode == placing && block != null){ - prevX = selectX; - prevY = selectY; - prevRotation = 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); + for(int i = 0; i < lineRequests.size; i++){ + BuildRequest req = lineRequests.get(i); + if(i == lineRequests.size - 1 && req.block.rotate){ + drawArrow(block, req.x, req.y, req.rotation); } + drawRequest(lineRequests.get(i)); } - - 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); + }else if(mode == breaking){ + drawSelection(selectX, selectY, cursorX, cursorY); }else if(isPlacing()){ if(block.rotate){ 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)); } + 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(); } @@ -171,6 +147,14 @@ public class DesktopInput extends InputHandler{ 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()); if(cursor != null){ @@ -186,6 +170,10 @@ public class DesktopInput extends InputHandler{ 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)){ cursorType = ui.unloadCursor; } @@ -202,6 +190,11 @@ public class DesktopInput extends InputHandler{ cursorType = SystemCursor.arrow; } + @Override + public boolean isBreaking(){ + return mode == breaking; + } + void pollInput(){ Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY()); int cursorX = tileX(Core.input.mouseX()); @@ -211,11 +204,46 @@ public class DesktopInput extends InputHandler{ 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()){ + BuildRequest req = getRequest(cursorX, cursorY); + if(isPlacing()){ selectX = cursorX; selectY = cursorY; + lastLineX = cursorX; + lastLineY = cursorY; 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){ //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 && @@ -225,23 +253,28 @@ public class DesktopInput extends InputHandler{ }else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine player.isShooting = true; } - }else if(Core.input.keyTap(Binding.deselect) && (block != null || mode != none || player.isBuilding()) && - !(player.buildRequest() != null && player.buildRequest().breaking && Core.keybinds.get(Binding.deselect) == Core.keybinds.get(Binding.break_block))){ - if(block == null){ - player.clearBuilding(); - } - + }else if(Core.input.keyTap(Binding.deselect) && block != null){ block = null; mode = none; }else if(Core.input.keyTap(Binding.break_block) && !Core.scene.hasMouse()){ //is recalculated because setting the mode to breaking removes potential multiblock cursor offset + deleting = false; mode = breaking; selectX = tileX(Core.input.mouseX()); selectY = tileY(Core.input.mouseY()); } - if (mode == placing && block != null){ - if (!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int) Core.input.axisTap(Binding.rotate) != 0)){ + if(Core.input.keyDown(Binding.select) && mode == none && !isPlacing() && deleting){ + 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; overrideLineRotation = true; } @@ -252,27 +285,24 @@ public class DesktopInput extends InputHandler{ 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 - iterateLine(selectX, selectY, cursorX, cursorY, l -> { - rotation = l.rotation; - tryPlaceBlock(l.x, l.y); - }); + flushRequests(lineRequests); + lineRequests.clear(); Events.fire(new LineConfirmEvent()); }else if(mode == breaking){ //touch up while breaking, break everything in selection - NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, 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 = selectX + x * Mathf.sign(cursorX - selectX); - int wy = selectY + y * Mathf.sign(cursorY - selectY); - - tryBreakBlock(wx, wy); - } - } + removeSelection(selectX, selectY, cursorX, cursorY); } if(selected != null){ 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; } } @@ -298,6 +328,7 @@ public class DesktopInput extends InputHandler{ droppingItem = false; mode = none; block = null; + sreq = null; } } } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 4caaf25677..4e7650e8ca 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -7,8 +7,11 @@ import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.*; +import io.anuke.arc.input.GestureDetector.*; import io.anuke.arc.math.*; 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.util.*; 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.type.*; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.input.PlaceUtils.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.fragments.*; import io.anuke.mindustry.world.*; +import java.util.*; + import static io.anuke.mindustry.Vars.*; -public abstract class InputHandler implements InputProcessor{ +public abstract class InputHandler implements InputProcessor, GestureListener{ /** Used for dropping items. */ final static float playerSelectRange = mobile ? 17f : 11f; /** Maximum line length. */ final static int maxLength = 100; final static Vector2 stackTrns = new Vector2(); + final static Rectangle r1 = new Rectangle(), r2 = new Rectangle(); /** Distance on the back from where items originate. */ final static float backTrns = 3f; @@ -41,9 +49,14 @@ public abstract class InputHandler implements InputProcessor{ public boolean overrideLineRotation; public int rotation; public boolean droppingItem; + public Group uiGroup; - protected PlaceDraw placeDraw = new PlaceDraw(); - private PlaceLine line = new PlaceLine(); + protected GestureDetector detector; + protected PlaceLine line = new PlaceLine(); + protected BuildRequest resultreq; + protected BuildRequest brequest = new BuildRequest(); + protected Array lineRequests = new Array<>(); + protected Array selectRequests = new Array<>(); //methods to override @@ -92,7 +105,7 @@ public abstract class InputHandler implements InputProcessor{ int[] remaining = {accepted, accepted}; Block block = tile.block(); - Events.fire(new DepositEvent()); + Core.app.post(() -> Events.fire(new DepositEvent(tile, player))); for(int i = 0; i < sent; i++){ boolean end = i == sent - 1; @@ -134,6 +147,14 @@ public abstract class InputHandler implements InputProcessor{ tile.block().configured(tile, player, value); } + public Eachable 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(){ return frag; } @@ -150,7 +171,11 @@ public abstract class InputHandler implements InputProcessor{ 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(){ - return false; + public void drawSelected(int x, int y, Block block, Color color){ + 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 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 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 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 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 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. */ @@ -214,12 +448,13 @@ public abstract class InputHandler implements InputProcessor{ } } + /* //clear when the player taps on something else if(!consumed && !mobile && player.isBuilding() && block == null){ - player.clearBuilding(); + //player.clearBuilding(); block = null; return true; - } + }*/ if(!showedInventory){ frag.inv.hide(); @@ -288,6 +523,10 @@ public abstract class InputHandler implements InputProcessor{ return block != null; } + public boolean isBreaking(){ + return false; + } + public float mouseAngle(float x, float y){ return Core.input.mouseWorld(getMouseX(), getMouseY()).sub(x, y).angle(); } @@ -301,16 +540,36 @@ public abstract class InputHandler implements InputProcessor{ table.clear(); } } + if(detector != null){ + Core.input.removeProcessor(detector); + } + if(uiGroup != null){ + uiGroup.remove(); + uiGroup = null; + } } public void add(){ + Core.input.addProcessor(detector = new GestureDetector(20, 0.5f, 0.4f, 0.15f, this)); Core.input.addProcessor(this); if(Core.scene != null){ Table table = (Table)Core.scene.find("inputTable"); if(table != null){ 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){ + 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); } @@ -407,8 +675,8 @@ public abstract class InputHandler implements InputProcessor{ float angle = Angles.angle(startX, startY, endX, endY); int baseRotation = rotation; - if (!overrideLineRotation || diagonal){ - baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4; + if(!overrideLineRotation || diagonal){ + baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4; } 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); line.x = point.x; 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; }else{ 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{ public int x, y, rotation; public boolean last; diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index a5e8ec603f..30872343a9 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -2,12 +2,12 @@ package io.anuke.mindustry.input; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; import io.anuke.arc.input.GestureDetector.*; +import io.anuke.arc.input.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; +import io.anuke.arc.scene.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; 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.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.PlaceUtils.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; @@ -29,17 +28,15 @@ import static io.anuke.mindustry.input.PlaceMode.*; public class MobileInput extends InputHandler implements GestureListener{ /** Maximum speed the player can pan. */ private static final float maxPanSpeed = 1.3f; - private static Rectangle r1 = new Rectangle(), r2 = new Rectangle(); /** Distance to edge of screen to start panning. */ private final float edgePan = Scl.scl(60f); //gesture data private Vector2 vector = new Vector2(); private float lastZoom = -1; - private GestureDetector detector; /** Position where the player started dragging a line. */ - private int lineStartX, lineStartY; + private int lineStartX, lineStartY, lastLineX, lastLineY; /** Animation scale for line. */ private float lineScale; @@ -49,10 +46,8 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Used for shifting build requests. */ private float shiftDeltaX, shiftDeltaY; - /** List of currently selected tiles to place. */ - private Array selection = new Array<>(); /** Place requests to be removed. */ - private Array removals = new Array<>(); + private Array removals = new Array<>(); /** Whether or not the player is currently shifting all placed tiles. */ private boolean selecting; /** 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. */ private Block lastBlock; /** Last placed request. Used for drawing block overlay. */ - private PlaceRequest lastPlaced; - - private int prevX, prevY, prevRotation; + private BuildRequest lastPlaced; + /** Down tracking for panning.*/ + private boolean down = false; //region utility methods @@ -99,10 +94,10 @@ public class MobileInput extends InputHandler implements GestureListener{ r2.setSize(block.size * tilesize); r2.setCenter(x * tilesize + block.offset(), y * tilesize + block.offset()); - for(PlaceRequest req : selection){ + for(BuildRequest req : selectRequests){ Tile other = req.tile(); - if(other == null || req.remove) continue; + if(other == null || req.breaking) continue; r1.setSize(req.block.size * tilesize); 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. */ - PlaceRequest getRequest(Tile tile){ + BuildRequest getRequest(Tile tile){ r2.setSize(tilesize); r2.setCenter(tile.worldx(), tile.worldy()); - for(PlaceRequest req : selection){ + for(BuildRequest req : selectRequests){ Tile other = req.tile(); if(other == null) continue; - if(!req.remove){ + if(!req.breaking){ r1.setSize(req.block.size * tilesize); 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; } - void removeRequest(PlaceRequest request){ - selection.removeValue(request, true); + void removeRequest(BuildRequest request){ + selectRequests.removeValue(request, true); removals.add(request); } @@ -172,80 +167,8 @@ public class MobileInput extends InputHandler implements GestureListener{ //endregion //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 - public void buildUI(Table table){ + public void buildPlacementUI(Table table){ table.addImage().color(Pal.gray).height(4f).colspan(4).growX(); table.row(); table.left().margin(0f).defaults().size(48f); @@ -267,12 +190,12 @@ public class MobileInput extends InputHandler implements GestureListener{ //confirm button table.addImageButton(Icon.checkSmall, Styles.clearPartiali, () -> { - for(PlaceRequest request : selection){ + for(BuildRequest request : selectRequests){ Tile tile = request.tile(); //actually place/break all selected blocks if(tile != null){ - if(!request.remove){ + if(!request.breaking){ rotation = request.rotation; Block before = 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 - removals.addAll(selection); - selection.clear(); + removals.addAll(selectRequests.find(r -> !r.breaking)); + selectRequests.clear(); selecting = false; - }).visible(() -> !selection.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); - }); + }).visible(() -> !selectRequests.isEmpty()).name("confirmplace"); } @Override - public boolean isDrawing(){ - return selection.size > 0 || removals.size > 0 || lineMode || player.target != null || mode != PlaceMode.none; + public void buildUI(Group group){ + 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 @@ -312,55 +233,58 @@ public class MobileInput extends InputHandler implements GestureListener{ } @Override - public void drawOutlined(){ + public void drawBottom(){ Lines.stroke(1f); //draw removals - for(PlaceRequest request : removals){ + for(BuildRequest request : removals){ Tile tile = request.tile(); if(tile == null) continue; - request.scale = Mathf.lerpDelta(request.scale, 0f, 0.2f); - request.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f); + request.animScale = Mathf.lerpDelta(request.animScale, 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 - for(PlaceRequest request : selection){ + for(BuildRequest request : selectRequests){ Tile tile = request.tile(); if(tile == null) continue; - if((!request.remove && validPlace(tile.x, tile.y, request.block, request.rotation)) - || (request.remove && validBreak(tile.x, tile.y))){ - request.scale = Mathf.lerpDelta(request.scale, 1f, 0.2f); - request.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f); + if((!request.breaking && validPlace(tile.x, tile.y, request.block, request.rotation)) + || (request.breaking && validBreak(tile.x, tile.y))){ + request.animScale = Mathf.lerpDelta(request.animScale, 1f, 0.2f); + request.animInvalid = Mathf.lerpDelta(request.animInvalid, 0f, 0.2f); }else{ - request.scale = Mathf.lerpDelta(request.scale, 0.6f, 0.1f); - request.redness = Mathf.lerpDelta(request.redness, 0.9f, 0.2f); + request.animScale = Mathf.lerpDelta(request.animScale, 0.6f, 0.1f); + request.animInvalid = Mathf.lerpDelta(request.animInvalid, 0.9f, 0.2f); } Tmp.c1.set(Draw.getMixColor()); - if(!request.remove && request == lastPlaced && request.block != null){ + if(!request.breaking && request == lastPlaced && request.block != null){ Draw.mixcol(); if(request.block.rotate) drawArrow(request.block, tile.x, tile.y, request.rotation); } - Draw.mixcol(Tmp.c1, 1f); - drawRequest(request, last); + //Draw.mixcol(Tmp.c1, 1f); + Draw.reset(); + drawRequest(request); //draw last placed request - if(!request.remove && request == lastPlaced && request.block != null){ + if(!request.breaking && request == lastPlaced && request.block != null){ Draw.mixcol(); request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation)); } - - last = request; } Draw.mixcol(); @@ -373,46 +297,16 @@ public class MobileInput extends InputHandler implements GestureListener{ if(mode == placing && block != null){ //draw placing - - prevX = lineStartX; - prevY = lineStartY; - prevRotation = 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); + for(int i = 0; i < lineRequests.size; i++){ + BuildRequest req = lineRequests.get(i); + if(i == lineRequests.size - 1 && req.block.rotate){ + drawArrow(block, req.x, req.y, req.rotation); } + drawRequest(lineRequests.get(i)); } - - 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); - + }else if(mode == breaking){ + drawSelection(lineStartX, lineStartY, tileX, tileY); } - } TargetTrait target = player.target; @@ -438,31 +332,33 @@ public class MobileInput extends InputHandler implements GestureListener{ 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 //region input events @Override - public void add(){ - Core.input.addProcessor(detector = new GestureDetector(20, 0.5f, 0.4f, 0.15f, this)); - 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(); - } + public boolean isBreaking(){ + return mode == breaking; } @Override public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){ if(state.is(State.menu) || player.isDead()) return false; + down = true; + //get tile on cursor 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){ lastZoom = renderer.getScale(); + if(!Core.input.isTouched()){ + down = false; + } + //place down a line if in line mode if(lineMode){ int tileX = tileX(screenX); int tileY = tileY(screenY); if(mode == placing && isPlacing()){ - iterateLine(lineStartX, lineStartY, tileX, tileY, l -> { - 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); - }); + flushSelectRequests(lineRequests); Events.fire(new LineConfirmEvent()); }else if(mode == breaking){ - //normalize area - 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); - } - } - } + removeSelection(lineStartX, lineStartY, tileX, tileY, true); } lineMode = false; @@ -554,11 +426,14 @@ public class MobileInput extends InputHandler implements GestureListener{ //long pressing enables line mode otherwise lineStartX = cursor.x; lineStartY = cursor.y; + lastLineX = cursor.x; + lastLineY = cursor.y; lineMode = true; if(mode == breaking){ Effects.effect(Fx.tapBlock, cursor.worldx(), cursor.worldy(), 1f); }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); } @@ -584,11 +459,11 @@ public class MobileInput extends InputHandler implements GestureListener{ removeRequest(getRequest(cursor)); }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 - 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())){ //add to selection queue if it's a valid BREAK position 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())){ tryBeginMine(cursor); } @@ -598,12 +473,16 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public void update(){ - if(state.is(State.menu) || player.isDead()){ - selection.clear(); + if(state.is(State.menu) ){ + selectRequests.clear(); removals.clear(); mode = none; } + if(player.isDead()){ + mode = none; + } + //zoom things if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && (Core.input.keyDown(Binding.zoom_hold))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); @@ -629,8 +508,6 @@ public class MobileInput extends InputHandler implements GestureListener{ if(mode == none){ selecting = false; lineMode = false; - removals.addAll(selection); - selection.clear(); } if(lineMode && mode == placing && block == null){ @@ -656,7 +533,7 @@ public class MobileInput extends InputHandler implements GestureListener{ lineScale = Mathf.lerpDelta(lineScale, 1f, 0.1f); //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 panX = 0, panY = 0; @@ -684,15 +561,24 @@ public class MobileInput extends InputHandler implements GestureListener{ Core.camera.position.x += vector.x; 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{ + lineRequests.clear(); lineScale = 0f; } //remove place requests that have disappeared 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); i--; } @@ -712,6 +598,8 @@ public class MobileInput extends InputHandler implements GestureListener{ return false; } + if(!down) return false; + if(selecting){ //pan all requests shiftDeltaX += deltaX; shiftDeltaY += deltaY; @@ -720,8 +608,8 @@ public class MobileInput extends InputHandler implements GestureListener{ int shiftedY = (int)(shiftDeltaY / tilesize); if(Math.abs(shiftedX) > 0 || Math.abs(shiftedY) > 0){ - for(PlaceRequest req : selection){ - if(req.remove) continue; //don't shift removal requests + for(BuildRequest req : selectRequests){ + if(req.breaking) continue; //don't shift removal requests req.x += shiftedX; req.y += shiftedY; } @@ -756,33 +644,4 @@ public class MobileInput extends InputHandler implements GestureListener{ } //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); - } - } } diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 7e0b8f640c..c9adc28482 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -8,12 +8,27 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import java.io.*; + @SuppressWarnings("unchecked") public class JsonIO{ private static CustomJson jsonBase = new CustomJson(); - private static Json json = new Json(){{ - apply(this); - }}; + private static Json json = new Json(){ + { 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){ 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(){ - @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(){ @Override public void write(Json json, Block object, Class knownType){ @@ -96,26 +93,6 @@ public class JsonIO{ } }); - /* - json.setSerializer(TeamData.class, new Serializer(){ - @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(){ @Override public void write(Json json, ItemStack object, Class knownType){ diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 76e7ce5e09..f1fceb5ce3 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -257,7 +257,7 @@ public abstract class SaveVersion extends SaveFileReader{ TeamData data = state.teams.get(team); int blocks = stream.readInt(); 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())); } } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index dc8c6b3f28..47da9edd4b 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -2,11 +2,14 @@ package io.anuke.mindustry.mod; import io.anuke.arc.*; import io.anuke.arc.audio.*; +import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.reflect.Field; import io.anuke.arc.util.reflect.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; @@ -16,20 +19,35 @@ import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Objectives.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.consumers.*; +import io.anuke.mindustry.world.meta.*; + +import java.lang.reflect.*; @SuppressWarnings("unchecked") public class ContentParser{ private static final boolean ignoreUnknownFields = true; private ObjectMap, ContentType> contentTypes = new ObjectMap<>(); private ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ - put(BulletType.class, (type, data) -> field(Bullets.class, data)); put(Effect.class, (type, data) -> field(Fx.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(BulletType.class, (type, data) -> { + if(data.isString()){ + return field(Bullets.class, data); + } + Class 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) -> { if(fieldOpt(Musics.class, data) != null) return fieldOpt(Musics.class, data); @@ -47,17 +65,36 @@ public class ContentParser{ Log.info(Core.assets.get(path)); return Core.assets.get(path); }); + put(Objective.class, (type, data) -> { + Class 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. * This is done to accomodate binding of content names first.*/ private Array reads = new Array<>(); private LoadedMod currentMod; + private Content currentContent; private Json parser = new Json(){ - public T readValue(Class type, Class elementType, JsonValue jsonData){ + @Override + public T readValue(Class type, Class elementType, JsonValue jsonData, Class keyType){ + T t = internalRead(type, elementType, jsonData, keyType); + if(t != null) checkNullFields(t); + return t; + } + + private T internalRead(Class type, Class elementType, JsonValue jsonData, Class keyType){ if(type != null){ 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)){ @@ -65,49 +102,64 @@ public class ContentParser{ String prefix = currentMod != null ? currentMod.name + "-" : ""; T one = (T)Vars.content.getByName(ctype, prefix + jsonData.asString()); 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> parsers = ObjectMap.of( ContentType.block, (TypeParser)(mod, name, value) -> { - //TODO generate dynamically instead of doing.. this - Class 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" - ); + readBundle(ContentType.block, name, value); - 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 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(() -> { if(value.has("consumes")){ for(JsonValue child : value.get("consumes")){ if(child.name.equals("item")){ - if(child.isString()){ - 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); - } + block.consumes.item(find(ContentType.item, child.asString())); }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")){ - LiquidStack stack = parser.readValue(LiquidStack.class, child); - block.consumes.liquid(stack.liquid, stack.amount); + block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child)); }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")){ block.consumes.powerBuffered(child.asFloat()); }else{ @@ -121,20 +173,23 @@ public class ContentParser{ //add research tech node 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 - if(value.has("requirements")){ - block.buildVisibility = () -> true; + //make block visible by default if there are requirements and no visibility set + if(value.has("requirements") && block.buildVisibility == BuildVisibility.hidden){ + block.buildVisibility = BuildVisibility.shown; } }); return block; }, ContentType.unit, (TypeParser)(mod, name, value) -> { + readBundle(ContentType.unit, name, value); + Class type = resolve(value.getString("type"), "io.anuke.mindustry.entities.type.base"); UnitType unit = new UnitType(mod + "-" + name, supply(type)); + currentContent = unit; read(() -> readFields(unit, value, true)); return unit; @@ -145,24 +200,57 @@ public class ContentParser{ ContentType.zone, parser(ContentType.zone, Zone::new) ); + private 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 TypeParser parser(ContentType type, Function constructor){ return (mod, name, value) -> { T item; if(Vars.content.getByName(type, name) != null){ item = (T)Vars.content.getByName(type, name); + readBundle(type, name, value); }else{ + readBundle(type, name, value); item = constructor.get(mod + "-" + name); } + currentContent = item; read(() -> readFields(item, value)); 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.*/ private void read(Runnable run){ + Content cont = currentContent; LoadedMod mod = currentMod; reads.add(() -> { this.currentMod = mod; + this.currentContent = cont; run.run(); }); } @@ -173,7 +261,7 @@ public class ContentParser{ if(!arr.isEmpty()){ Class c = arr.first().getClass(); //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(); } @@ -183,7 +271,11 @@ public class ContentParser{ } 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(); } @@ -192,9 +284,10 @@ public class ContentParser{ * @param name the name of the file without its extension * @param json the json to parse * @param type the type of content this is + * @param file file that this content is being parsed from * @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()){ init(); } @@ -205,12 +298,35 @@ public class ContentParser{ } currentMod = mod; + boolean exists = Vars.content.getByName(type, name) != null; Content c = parsers.get(type).parse(mod.name, name, value); - c.mod = mod; - checkNulls(c); + if(!exists){ + c.sourceFile = file; + c.mod = mod; + } return c; } + private T make(Class type){ + try{ + java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); + cons.setAccessible(true); + return cons.newInstance(); + }catch(Exception e){ + throw new RuntimeException(e); + } + } + + private T make(Class type, String name){ + try{ + java.lang.reflect.Constructor cons = type.getDeclaredConstructor(String.class); + cons.setAccessible(true); + return cons.newInstance(name); + }catch(Exception e){ + throw new RuntimeException(e); + } + } + private Supplier supply(Class type){ try{ java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); @@ -243,35 +359,21 @@ public class ContentParser{ private Object fieldOpt(Class type, JsonValue value){ try{ - Object b = type.getField(value.asString()).get(null); - if(b == null) return null; - return b; + return type.getField(value.asString()).get(null); }catch(Exception e){ return null; } } - /** Checks all @NonNull fields in this object, recursively. - * Throws an exception if any are null.*/ - private void checkNulls(Object object){ - checkNulls(object, new ObjectSet<>()); - } + private void checkNullFields(Object object){ + if(object instanceof Number || object instanceof String) return; - private void checkNulls(Object object, ObjectSet checked){ - checked.add(object); - - parser.getFields(object.getClass()).each((name, field) -> { + parser.getFields(object.getClass()).values().toArray().each(field -> { try{ if(field.field.getType().isPrimitive()) return; - Object obj = field.field.get(object); if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){ - throw new RuntimeException("Field '" + name + "' in " + object.getClass().getSimpleName() + " is missing!"); - } - - if(obj != null && !checked.contains(obj)){ - checkNulls(obj, checked); - checked.add(obj); + throw new RuntimeException("'" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!"); } }catch(Exception e){ throw new RuntimeException(e); @@ -303,7 +405,7 @@ public class ContentParser{ } Field field = metadata.field; 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){ throw new SerializationException("Error accessing field: " + field.getName() + " (" + type.getName() + ")", ex); }catch(SerializationException ex){ @@ -319,18 +421,24 @@ public class ContentParser{ } /** Tries to resolve a class from a list of potential class names. */ - private Class resolve(String base, String... potentials) throws Exception{ + private Class resolve(String base, String... potentials){ + if(!base.isEmpty() && Character.isLowerCase(base.charAt(0))) base = Strings.capitalize(base); + for(String type : potentials){ try{ return (Class)Class.forName(type + '.' + base); }catch(Exception ignored){ + try{ + return (Class)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{ - Object parse(Class type, JsonValue value); + Object parse(Class type, JsonValue value) throws Exception; } private interface TypeParser{ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 8888ac0382..21a5aa4073 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -18,7 +18,6 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.plugin.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; import java.io.*; import java.net.*; @@ -48,8 +47,7 @@ public class Mods implements Loadable{ } /** @return the loaded mod found by class, or null if not found. */ - public @Nullable - LoadedMod getMod(Class type){ + public @Nullable LoadedMod getMod(Class type){ return loaded.find(l -> l.mod.getClass() == type); } @@ -62,7 +60,7 @@ public class Mods implements Loadable{ file.copyTo(dest); try{ - loaded.add(loadMod(file)); + loaded.add(loadMod(file, false)); requiresReload = true; }catch(IOException e){ dest.delete(); @@ -77,6 +75,7 @@ public class Mods implements Loadable{ @Override public void loadAsync(){ if(loaded.isEmpty()) return; + Time.mark(); 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("Time to pack textures: {0}", Time.elapsed()); } @Override public void loadSync(){ if(packer == null) return; + Time.mark(); Texture editor = Core.atlas.find("clear-editor").getTexture(); PixmapPacker editorPacker = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true); @@ -141,6 +143,7 @@ public class Mods implements Loadable{ packer.dispose(); packer = null; + Log.info("Time to update textures: {0}", Time.elapsed()); } /** 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; try{ - LoadedMod mod = loadMod(file); + LoadedMod mod = loadMod(file, false); if(mod.enabled()){ loaded.add(mod); }else{ disabled.add(mod); } - }catch(IllegalArgumentException ignored){ }catch(Exception e){ - Log.err("Failed to load plugin file {0}. Skipping.", file); - e.printStackTrace(); + Log.err("Failed to load mod file {0}. Skipping.", file); + 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(){ 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()){ //ignore special folders like bundles or sprites if(file.isDirectory() && !specialFolders.contains(file.name())){ //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(){ //epic memory leak Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas")); - Tex.load(); - Tex.loadStyles(); - Styles.load(); loaded.clear(); disabled.clear(); load(); @@ -244,35 +261,41 @@ public class Mods implements Loadable{ content.init(); content.load(); content.loadColors(); + data.load(); + requiresReload = false; } /** Creates all the content found in mod files. */ public void loadContent(){ for(LoadedMod mod : loaded){ - if(mod.root.child("content").exists()){ - FileHandle contentRoot = mod.root.child("content"); - for(ContentType type : ContentType.all){ - FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); - if(folder.exists()){ - for(FileHandle file : folder.list()){ - if(file.extension().equals("json")){ - try{ - //this binds the content but does not load it entirely - Content loaded = parser.parse(mod, file.nameWithoutExtension(), file.readString(), type); - Log.info("[{0}] Loaded '{1}'.", mod.meta.name, loaded); - }catch(Exception e){ - throw new RuntimeException("Failed to parse content file '" + file + "' for mod '" + mod.meta.name + "'.", e); + safeRun(mod, () -> { + if(mod.root.child("content").exists()){ + FileHandle contentRoot = mod.root.child("content"); + for(ContentType type : ContentType.all){ + FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); + if(folder.exists()){ + for(FileHandle file : folder.list()){ + if(file.extension().equals("json")){ + try{ + //this binds the content but does not load it entirely + Content loaded = parser.parse(mod, file.nameWithoutExtension(), file.readString("UTF-8"), file, type); + Log.info("[{0}] Loaded '{1}'.", mod.meta.name, + (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 parser.finishParsing(); + //load content for code mods each(Mod::loadContent); } @@ -326,13 +349,49 @@ public class Mods implements Loadable{ /** Iterates through each mod with a main class.*/ public void each(Consumer 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 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. * 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); + 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"); if(!metaf.exists()){ @@ -343,6 +402,12 @@ public class Mods implements Loadable{ ModMeta meta = json.fromJson(ModMeta.class, metaf.readString()); String camelized = meta.name.replace(" ", ""); 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; FileHandle mainFile = zip; @@ -388,6 +453,8 @@ public class Mods implements Loadable{ public final String name; /** This mod's metadata. */ 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){ this.root = root; @@ -400,6 +467,15 @@ public class Mods implements Loadable{ public boolean enabled(){ return Core.settings.getBool(name + "-enabled", true); } + + @Override + public String toString(){ + return "LoadedMod{" + + "file=" + file + + ", root=" + root + + ", name='" + name + '\'' + + '}'; + } } /** 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. */ 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; + } + } + } } diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index fa766dc505..4950f32c10 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.world.blocks.*; import static io.anuke.mindustry.Vars.content; -public class Item extends UnlockableContent implements Comparable{ +public class Item extends UnlockableContent{ public final Color color; /** 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{ return localizedName(); } - @Override - public int compareTo(Item item){ - return Integer.compare(id, item.id); - } - @Override public ContentType getContentType(){ return ContentType.item; diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/io/anuke/mindustry/type/ItemStack.java index 9e428716dc..4ea87f5605 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/io/anuke/mindustry/type/ItemStack.java @@ -19,6 +19,10 @@ public class ItemStack implements Comparable{ item = Items.copper; } + public ItemStack copy(){ + return new ItemStack(item, amount); + } + public boolean equals(ItemStack other){ return other != null && other.item == item && other.amount == amount; } diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index 471a74c9d7..19e11aa3be 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -5,34 +5,32 @@ import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Objectives.*; import io.anuke.mindustry.maps.generators.*; -import io.anuke.mindustry.world.*; - -import java.util.*; import static io.anuke.mindustry.Vars.*; public class Zone extends UnlockableContent{ public @NonNull Generator generator; - public Block[] blockRequirements = {}; - public ZoneRequirement[] zoneRequirements = {}; - public Item[] resources = {}; + public @NonNull Objective configureObjective = new ZoneWave(this, 15); + public Array requirements = new Array<>(); + //TODO autogenerate + public Array resources = new Array<>(); + public Consumer rules = rules -> {}; public boolean alwaysUnlocked; public int conditionWave = Integer.MAX_VALUE; - public int configureWave = 15; public int launchPeriod = 10; public Loadout loadout = Loadouts.basicShard; public TextureRegion preview; - protected ItemStack[] baseLaunchCost = {}; + protected Array baseLaunchCost = new Array<>(); protected Array startingItems = new Array<>(); - protected ItemStack[] launchCost = null; + protected Array launchCost; private Array defaultStartingItems = new Array<>(); @@ -47,7 +45,7 @@ public class Zone extends UnlockableContent{ @Override public void load(){ - preview = Core.atlas.find("zone-" + name); + preview = Core.atlas.find("zone-" + name, Core.atlas.find(name + "-zone")); } 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){ return metCondition() && wave % launchPeriod == 0; } public boolean canUnlock(){ - if(data.isUnlocked(this)){ - 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; + return data.isUnlocked(this) || !requirements.contains(r -> !r.complete()); } - public ItemStack[] getLaunchCost(){ + public Array getLaunchCost(){ if(launchCost == null){ updateLaunchCost(); } @@ -104,30 +82,54 @@ public class Zone extends UnlockableContent{ 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){ int value = Core.settings.getInt(name + "-wave", 0); + if(value < wave){ - Core.settings.put(name + "-wave", wave); - data.modified(); + updateObjectives(() -> { + Core.settings.put(name + "-wave", wave); + data.modified(); + }); + } + } - for(Zone zone : content.zones()){ - ZoneRequirement req = Structs.find(zone.zoneRequirements, f -> f.zone == this); - if(req != null && wave == req.wave + 1){ - Events.fire(new ZoneRequireCompleteEvent(zone, this)); - } - } + public void updateObjectives(Runnable closure){ + Array incomplete = content.zones() + .map(z -> z.requirements).flatten() + .select(o -> o.zone() == this && !o.complete()) + .as(ZoneObjective.class); - if(wave == configureWave + 1){ - Events.fire(new ZoneConfigureCompleteEvent(this)); + boolean wasConfig = configureObjective.complete(); + + 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(){ return Core.settings.getInt(name + "-wave", 0); } - public boolean isCompleted(){ + /** @return whether initial conditions to launch are met. */ + public boolean isLaunchMet(){ return bestWave() >= conditionWave; } @@ -152,7 +154,7 @@ public class Zone extends UnlockableContent{ } stacks.sort(); - launchCost = stacks.toArray(ItemStack.class); + launchCost = stacks; Core.settings.putObject(name + "-starting-items", startingItems); data.modified(); } @@ -164,13 +166,13 @@ public class Zone extends UnlockableContent{ } public boolean canConfigure(){ - return bestWave() >= configureWave; + return configureObjective.complete(); } @Override public void init(){ generator.init(loadout); - Arrays.sort(resources); + resources.sort(); for(ItemStack stack : startingItems){ defaultStartingItems.add(new ItemStack(stack.item, stack.amount)); @@ -208,22 +210,4 @@ public class Zone extends UnlockableContent{ 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; - } - } - } diff --git a/core/src/io/anuke/mindustry/ui/Links.java b/core/src/io/anuke/mindustry/ui/Links.java index cdb91c8655..9f0fec6e86 100644 --- a/core/src/io/anuke/mindustry/ui/Links.java +++ b/core/src/io/anuke/mindustry/ui/Links.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.ui; import io.anuke.arc.Core; +import io.anuke.arc.util.Strings; import io.anuke.arc.graphics.Color; import io.anuke.mindustry.graphics.Pal; @@ -29,7 +30,7 @@ public class Links{ } public static class LinkEntry{ - public final String name, description, link; + public final String name, title, description, link; public final Color color; public LinkEntry(String name, String link, Color color){ @@ -37,6 +38,9 @@ public class Links{ this.color = color; this.description = Core.bundle.getNotNull("link." + name + ".description"); this.link = link; + + String title = Core.bundle.getOrNull("link." + name + ".title"); + this.title = title != null ? title : Strings.capitalize(name.replace("-", " ")); } } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java index 00c0ac0835..a8e5212307 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java @@ -59,7 +59,7 @@ public class AboutDialog extends FloatingDialog{ }).size(h - 5, h); table.table(inset -> { - inset.add("[accent]" + Strings.capitalize(link.name.replace("-", " "))).growX().left(); + inset.add("[accent]" + link.title).growX().left(); inset.row(); inset.labelWrap(link.description).width(w - 100f).color(Color.lightGray).growX(); }).padLeft(8); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java index 10f418c1de..dc5b208123 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java @@ -1,34 +1,112 @@ package io.anuke.mindustry.ui.dialogs; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; import io.anuke.arc.function.*; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.ui.layout.Table; +import io.anuke.arc.graphics.*; +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.mindustry.*; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.game.Rules; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.type.ItemType; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.type.*; +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{ private Table main; private Rules rules; private Supplier resetter; private LoadoutDialog loadoutDialog; + private FloatingDialog banDialog; public CustomRulesDialog(){ super("$mode.custom"); 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); shown(this::setup); 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 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 resetter){ this.rules = rules; this.resetter = resetter; @@ -67,27 +145,26 @@ public class CustomRulesDialog extends FloatingDialog{ number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); main.addButton("$configure", - () -> loadoutDialog.show( - Blocks.coreShard.itemCapacity, - () -> rules.loadout, - () -> { - rules.loadout.clear(); - rules.loadout.add(new ItemStack(Items.copper, 100)); - }, - () -> {}, () -> {}, - item -> item.type == ItemType.material + () -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout, + () -> { + rules.loadout.clear(); + rules.loadout.add(new ItemStack(Items.copper, 100)); + }, () -> {}, () -> {} )).left().width(300f); main.row(); + main.addButton("$bannedblocks", banDialog::show).left().width(300f); + main.row(); + title("$rules.title.player"); - number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier); number("$rules.playerhealthmultiplier", f -> rules.playerHealthMultiplier = f, () -> rules.playerHealthMultiplier); + number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier); title("$rules.title.unit"); 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.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier); + number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier); title("$rules.title.enemy"); check("$rules.attack", b -> rules.attackMode = b, () -> rules.attackMode); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 86841152e8..c92097077a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -2,13 +2,14 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.collection.ObjectSet.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.input.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.*; +import io.anuke.arc.scene.event.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; 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.io.SaveIO.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.Zone.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Styles; -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.*; @@ -33,13 +33,14 @@ public class DeployDialog extends FloatingDialog{ private ObjectSet nodes = new ObjectSet<>(); private ZoneInfoDialog info = new ZoneInfoDialog(); private Rectangle bounds = new Rectangle(); + private View view = new View(); public DeployDialog(){ super("", Styles.fullDialog); ZoneNode root = new ZoneNode(Zones.groundZero, null); - TreeLayout layout = new TreeLayout(); + BranchTreeLayout layout = new BranchTreeLayout(); layout.gapBetweenLevels = layout.gapBetweenNodes = Scl.scl(60f); layout.gapBetweenNodes = Scl.scl(120f); layout.layout(root); @@ -50,6 +51,51 @@ public class DeployDialog extends FloatingDialog{ buttons.addImageTextButton("$techtree", Icon.tree, () -> ui.tech.show()).size(230f, 64f); 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(){ @@ -74,7 +120,7 @@ public class DeployDialog extends FloatingDialog{ update(() -> { setOrigin(Align.center); 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)); @@ -129,7 +175,7 @@ public class DeployDialog extends FloatingDialog{ button.defaults().colspan(2); button.row(); - button.add(Core.bundle.format("save.wave", color + slot.getWave())); + button.add(Core.bundle.format("save", color + slot.getWave())); button.row(); button.label(() -> Core.bundle.format("save.playtime", color + slot.getPlayTime())); button.row(); @@ -144,7 +190,7 @@ public class DeployDialog extends FloatingDialog{ }).width(size).height(50f).padTop(3); })); }else{ - stack.add(new View()); + stack.add(view = new View()); } stack.add(new ItemsDisplay()); @@ -155,26 +201,28 @@ public class DeployDialog extends FloatingDialog{ for(ZoneNode node : nodes){ node.allChildren.clear(); node.allChildren.addAll(node.children); - for(ZoneNode other : new ObjectSetIterator<>(nodes)){ - if(Structs.contains(other.zone.zoneRequirements, req -> req.zone == node.zone)){ + for(ZoneNode other : nodes){ + if(other.zone.requirements.contains(req -> req.zone() == node.zone)){ node.allChildren.add(other); } } } + + view.setOrigin(Align.center); + view.setTransform(true); } boolean hidden(Zone zone){ - for(ZoneRequirement other : zone.zoneRequirements){ - if(!data.isUnlocked(other.zone)){ - return true; - } - } - return false; + return zone.requirements.contains(o -> o.zone() != null && o.zone().locked()); } void buildButton(Zone zone, Button button){ button.setDisabled(() -> hidden(zone)); - button.clicked(() -> info.show(zone)); + button.clicked(() -> { + if(!view.moved){ + info.show(zone); + } + }); if(zone.unlocked() && !hidden(zone)){ 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{ + float panX = 0, panY = -200, lastZoom = -1; + boolean moved = false; { for(ZoneNode node : nodes){ @@ -209,11 +256,7 @@ public class DeployDialog extends FloatingDialog{ addChild(stack); } - dragged((x, y) -> { - panX += x; - panY += y; - clamp(); - }); + released(() -> moved = false); } void clamp(){ @@ -229,9 +272,9 @@ public class DeployDialog extends FloatingDialog{ } @Override - public void draw(){ + public void drawChildren(){ 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 child : node.allChildren){ @@ -242,7 +285,7 @@ public class DeployDialog extends FloatingDialog{ } Draw.reset(); - super.draw(); + super.drawChildren(); } } @@ -258,7 +301,7 @@ public class DeployDialog extends FloatingDialog{ //this.height /= 2f; 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]; for(int i = 0; i < children.length; i++){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index ffa0ee3eb4..92a69ddcc3 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -5,6 +5,7 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.ui.*; @@ -69,13 +70,19 @@ public class HostDialog extends FloatingDialog{ player.isAdmin = true; 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", () -> { Core.settings.putSave("publichost", true); 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){ ui.showException("$server.error", e); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java index 487f2fa372..bfe98b9ce8 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.Core; +import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Log; @@ -14,6 +15,10 @@ import static io.anuke.mindustry.Vars.ui; public class LanguageDialog extends FloatingDialog{ private Locale lastLocale; + private ObjectMap displayNames = ObjectMap.of( + Locale.TRADITIONAL_CHINESE, "正體中文", + Locale.SIMPLIFIED_CHINESE, "简体中文" + ); public LanguageDialog(){ super("$settings.language"); @@ -30,7 +35,7 @@ public class LanguageDialog extends FloatingDialog{ ButtonGroup group = new ButtonGroup<>(); 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(() -> { if(getLocale().equals(loc)) return; Core.settings.put("locale", loc.toString()); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java index 9e541990e6..fc5b560678 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java @@ -2,9 +2,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; import io.anuke.arc.input.*; -import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.game.*; @@ -16,10 +14,12 @@ import static io.anuke.mindustry.Vars.*; public class LoadoutDialog extends FloatingDialog{ private Runnable hider; - private Supplier> supplier; + //private Supplier> supplier; private Runnable resetter; private Runnable updater; - private Predicate filter; + private Array stacks = new Array<>(); + private Array originalStacks = new Array<>(); + //private Predicate filter; private Table items; 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); hidden(() -> { + originalStacks.selectFrom(stacks, s -> s.amount > 0); + updater.run(); if(hider != null){ hider.run(); } }); - cont.row(); + buttons.addImageTextButton("$back", Icon.arrowLeft, this::hide).size(210f, 64f); - cont.addButton("$add", () -> { - 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", () -> { + buttons.addImageTextButton("$settings.reset", Icon.refreshSmall, () -> { resetter.run(); updater.run(); setup(); }).size(210f, 64f); - - cont.row(); - cont.addImageTextButton("$back", Icon.arrowLeft, this::hide).size(210f, 64f); } - public void show(int capacity, Supplier> supplier, Runnable reseter, Runnable updater, Runnable hider, Predicate filter){ + public void show(int capacity, Array 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.supplier = supplier; this.updater = updater; this.capacity = capacity; this.hider = hider; - this.filter = filter; + //this.filter = filter; show(); } @@ -88,41 +71,54 @@ public class LoadoutDialog extends FloatingDialog{ items.clearChildren(); items.left(); float bsize = 40f; - int step = 50; - for(ItemStack stack : supplier.get()){ - items.addButton("x", Styles.clearPartialt, () -> { - supplier.get().remove(stack); - updater.run(); - setup(); - }).size(bsize); + int i = 0; - items.addButton("-", Styles.clearPartialt, () -> { - stack.amount = Math.max(stack.amount - step, 0); - updater.run(); - }).size(bsize); + for(ItemStack stack : stacks){ + items.table(Tex.pane, t -> { + t.margin(4).marginRight(8).left(); + t.addButton("-", Styles.cleart, () -> { + stack.amount = Math.max(stack.amount - step(stack.amount), 0); + updater.run(); + }).size(bsize); - items.addButton("+", Styles.clearPartialt, () -> { - stack.amount = Math.min(stack.amount + step, capacity); - updater.run(); - }).size(bsize); + t.addButton("+", Styles.cleart, () -> { + stack.amount = Math.min(stack.amount + step(stack.amount), capacity); + updater.run(); + }).size(bsize); - items.addImageButton(Icon.pencilSmaller, Styles.clearPartial2i, () -> ui.showTextInput("$configure", stack.item.localizedName, 10, stack.amount + "", true, str -> { - if(Strings.canParsePostiveInt(str)){ - int amount = Strings.parseInt(str); - if(amount >= 0 && amount <= capacity){ - stack.amount = amount; - updater.run(); - return; + t.addImageButton(Icon.pencilSmaller, Styles.cleari, () -> ui.showTextInput("$configure", stack.item.localizedName, 10, stack.amount + "", true, str -> { + if(Strings.canParsePostiveInt(str)){ + int amount = Strings.parseInt(str); + if(amount >= 0 && amount <= capacity){ + stack.amount = amount; + updater.run(); + return; + } } - } - ui.showInfo(Core.bundle.format("configure.invalid", capacity)); - })).size(bsize); + ui.showInfo(Core.bundle.format("configure.invalid", capacity)); + })).size(bsize); - items.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(4).padLeft(4); - items.label(() -> stack.amount + "").left(); + t.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(4).padLeft(4); + 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; } } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index 010bc886a9..f003cdc2f2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.io.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.mod.Mods.*; @@ -17,6 +18,41 @@ public class ModsDialog extends FloatingDialog{ public ModsDialog(){ super("$mods"); 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); 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().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()); 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", () -> { - mods.removeMod(mod); - setup(); - })).size(50f); + title.addImageButton(mod.workshopID != null ? Icon.linkSmall : Icon.trash16Small, Styles.cleari, () -> { + if(mod.workshopID == null){ + ui.showConfirm("$confirm", "$mod.remove.confirm", () -> { + mods.removeMod(mod); + setup(); + }); + }else{ + platform.viewListing(mod.workshopID); + } + }).size(50f); }).growX().left().padTop(-14f).padRight(-14f); t.row(); @@ -104,4 +146,4 @@ public class ModsDialog extends FloatingDialog{ }); }).margin(12f).width(500f); } -} \ No newline at end of file +} diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index cc89bd8c47..06b1c605a3 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -14,6 +14,7 @@ import io.anuke.arc.scene.ui.TextButton.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -225,7 +226,9 @@ public class SettingsMenuDialog extends SettingsDialog{ game.checkPref("savecreate", true); - if(steam){ + game.checkPref("hints", true); + + if(steam && !Version.modifier.contains("beta")){ game.checkPref("publichost", false, i -> { 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("chatopacity", 100, 0, 100, 5, s -> s + "%"); + graphics.sliderPref("lasersopacity", 100, 0, 100, 5, s -> s + "%"); if(!mobile){ graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b)); @@ -290,6 +294,7 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("effects", true); graphics.checkPref("playerchat", true); graphics.checkPref("minimap", !mobile); + graphics.checkPref("position", false); graphics.checkPref("fps", false); graphics.checkPref("indicators", true); graphics.checkPref("animatedwater", false); @@ -297,7 +302,6 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("animatedshields", !mobile); } graphics.checkPref("bloom", false, val -> renderer.toggleBloom(val)); - graphics.checkPref("lasers", true); graphics.checkPref("pixelate", false, val -> { if(val){ Events.fire(Trigger.enablePixelation); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index f583251295..b34b4935eb 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -4,6 +4,7 @@ import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.input.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.*; @@ -21,7 +22,8 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; 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.*; @@ -31,13 +33,14 @@ public class TechTreeDialog extends FloatingDialog{ private TechTreeNode root = new TechTreeNode(TechTree.root, null); private Rectangle bounds = new Rectangle(); private ItemsDisplay items; + private View view; public TechTreeDialog(){ super(""); titleTable.remove(); margin(0f).marginBottom(8); - cont.stack(new View(), items = new ItemsDisplay()).grow(); + cont.stack(view = new View(), items = new ItemsDisplay()).grow(); shown(() -> { checkNodes(root); @@ -52,16 +55,57 @@ public class TechTreeDialog extends FloatingDialog{ hide(); ui.database.show(); }).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(){ - TreeLayout layout = new TreeLayout(); - layout.gapBetweenLevels = Scl.scl(60f); - layout.gapBetweenNodes = Scl.scl(40f); + RadialTreeLayout layout = new RadialTreeLayout(); LayoutNode node = new LayoutNode(root, null); layout.layout(node); - bounds.set(layout.getBounds()); - bounds.y += nodeSize*1.5f; + //bounds.y += nodeSize*1.5f; copyInfo(node); } @@ -110,7 +154,7 @@ public class TechTreeDialog extends FloatingDialog{ this.parent = parent; this.width = this.height = nodeSize; 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{ - float panX = 0, panY = -200; + float panX = 0, panY = -200, lastZoom = -1; boolean moved = false; ImageButton hoverNode; 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); button.visible(() -> node.visible); button.clicked(() -> { + if(moved) return; + if(mobile){ hoverNode = button; rebuild(); @@ -182,7 +228,6 @@ public class TechTreeDialog extends FloatingDialog{ }); button.touchable(() -> !node.visible ? Touchable.disabled : Touchable.enabled); button.setUserObject(node.node); - button.tapped(() -> moved = false); button.setSize(nodeSize); button.update(() -> { float offset = (Core.graphics.getHeight() % 2) / 2f; @@ -205,12 +250,9 @@ public class TechTreeDialog extends FloatingDialog{ }); } - dragged((x, y) -> { - moved = true; - panX += x; - panY += y; - clamp(); - }); + setOrigin(Align.center); + setTransform(true); + released(() -> moved = false); } void clamp(){ @@ -308,9 +350,9 @@ public class TechTreeDialog extends FloatingDialog{ } @Override - public void draw(){ + public void drawChildren(){ 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){ if(!node.visible) continue; @@ -324,7 +366,7 @@ public class TechTreeDialog extends FloatingDialog{ } Draw.reset(); - super.draw(); + super.drawChildren(); } } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index ab943f8f5b..9e0441a412 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -1,15 +1,15 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; +import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Objectives.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.Zone.*; -import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -38,8 +38,7 @@ public class ZoneInfoDialog extends FloatingDialog{ if(!zone.unlocked()) return; - ItemStack[] stacks = zone.getLaunchCost(); - for(ItemStack stack : stacks){ + for(ItemStack stack : zone.getLaunchCost()){ if(stack.amount == 0) continue; if(i++ % 2 == 0){ @@ -62,29 +61,32 @@ public class ZoneInfoDialog extends FloatingDialog{ cont.table(req -> { req.defaults().left(); - if(zone.zoneRequirements.length > 0){ + Array zones = zone.requirements.select(o -> !(o instanceof Unlock)); + + if(!zones.isEmpty()){ req.table(r -> { r.add("$complete").colspan(2).left(); r.row(); - for(ZoneRequirement other : zone.zoneRequirements){ + for(Objective o : zones){ r.addImage(Icon.terrain).padRight(4); - r.add(Core.bundle.format("zone.requirement", other.wave, other.zone.localizedName())).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.add(o.display()).color(Color.lightGray); + r.addImage(o.complete() ? Icon.checkSmall : Icon.cancelSmall, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3); r.row(); } }); } req.row(); + Array blocks = zone.requirements.select(o -> o instanceof Unlock).as(Unlock.class); - if(zone.blockRequirements.length > 0){ + if(!blocks.isEmpty()){ req.table(r -> { r.add("$research.list").colspan(2).left(); r.row(); - for(Block block : zone.blockRequirements){ - r.addImage(block.icon(Cicon.small)).size(8 * 3).padRight(4); - r.add(block.localizedName).color(Color.lightGray); - r.addImage(data.isUnlocked(block) ? Icon.checkSmall : Icon.cancelSmall, data.isUnlocked(block) ? Color.lightGray : Color.scarlet).padLeft(3); + for(Unlock blocko : blocks){ + r.addImage(blocko.block.icon(Cicon.small)).size(8 * 3).padRight(5); + r.add(blocko.block.localizedName).color(Color.lightGray).left(); + r.addImage(blocko.block.unlocked() ? Icon.checkSmall : Icon.cancelSmall, blocko.block.unlocked() ? Color.lightGray : Color.scarlet).padLeft(3); r.row(); } @@ -106,7 +108,7 @@ public class ZoneInfoDialog extends FloatingDialog{ t.left(); t.add("$zone.resources").padRight(6); - if(zone.resources.length > 0){ + if(zone.resources.size > 0){ t.table(r -> { t.left(); int i = 0; @@ -135,8 +137,8 @@ public class ZoneInfoDialog extends FloatingDialog{ cont.row(); - cont.addButton(zone.canConfigure() ? "$configure" : Core.bundle.format("configure.locked", zone.configureWave), - () -> loadout.show(zone.loadout.core().itemCapacity, zone::getStartingItems, zone::resetStartingItems, zone::updateLaunchCost, rebuildItems, item -> data.getItem(item) > 0 && item.type == ItemType.material) + 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) ).fillX().pad(3).disabled(b -> !zone.canConfigure()); } cont.marginRight(12f); @@ -155,7 +157,7 @@ public class ZoneInfoDialog extends FloatingDialog{ hide(); 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.add(iteminfo); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index e80ef059ac..7250099b78 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -19,15 +19,14 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Styles; import io.anuke.mindustry.ui.dialogs.*; import static io.anuke.mindustry.Vars.*; @@ -51,6 +50,7 @@ public class HudFragment extends Fragment{ //menu at top left parent.fill(cont -> { + cont.setName("overlaymarker"); cont.top().left(); if(mobile){ @@ -248,9 +248,16 @@ public class HudFragment extends Fragment{ info.label(() -> ping.get(netClient.getPing())).visible(net::client).left().style(Styles.outlineLabel); }).top().left(); }); - - //minimap - parent.fill(t -> t.top().right().add(new Minimap()).visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial)); + + parent.fill(t -> { + //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 parent.fill(t -> { diff --git a/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java b/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java index c2e3ccd086..c2387d1b23 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java @@ -1,11 +1,12 @@ package io.anuke.mindustry.ui.fragments; -import io.anuke.arc.scene.Group; -import io.anuke.arc.scene.event.Touchable; -import io.anuke.arc.scene.ui.layout.WidgetGroup; +import io.anuke.arc.*; +import io.anuke.arc.scene.event.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.*; /** Fragment for displaying overlays such as block inventories. */ -public class OverlayFragment extends Fragment{ +public class OverlayFragment{ public final BlockInventoryFragment inv; public final BlockConfigFragment config; @@ -17,10 +18,9 @@ public class OverlayFragment extends Fragment{ config = new BlockConfigFragment(); } - @Override - public void build(Group parent){ + public void add(){ group.setFillParent(true); - parent.addChild(group); + Vars.ui.hudGroup.addChildBefore(Core.scene.find("overlaymarker"), group); inv.build(group); config.build(group); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 98ce9f2159..ac6cfe8edf 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -10,6 +10,8 @@ import io.anuke.arc.scene.event.*; 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.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; @@ -17,7 +19,7 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Styles; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -74,17 +76,21 @@ public class PlacementFragment extends Fragment{ boolean gridUpdate(InputHandler input){ 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){ - tile = tile.link(); - Block tryRecipe = tile.block(); - if(tryRecipe.isVisible() && unlocked(tryRecipe)){ - input.block = tryRecipe; - currentCategory = input.block.category; - return true; + for(BuildRequest req : player.buildQueue()){ + if(!req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).contains(Core.input.mouseWorld())){ + tryRecipe = req.block; + break; } } + + 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; @@ -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; button.forEach(elem -> elem.setColor(color)); button.setChecked(control.input.block == block); + + if(state.rules.bannedBlocks.contains(block)){ + button.forEach(elem -> elem.setColor(Color.darkGray)); + } }); button.hovered(() -> hovered = block); @@ -226,6 +236,15 @@ public class PlacementFragment extends Fragment{ } }).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 lastDisplay = tileDisplayBlock(); topTable.table(t -> { @@ -250,7 +269,7 @@ public class PlacementFragment extends Fragment{ blocksSelect.margin(4).marginTop(0); blocksSelect.table(blocks -> blockTable = blocks).grow(); blocksSelect.row(); - blocksSelect.table(control.input::buildUI).name("inputTable").growX(); + blocksSelect.table(control.input::buildPlacementUI).name("inputTable").growX(); }).fillY().bottom().touchable(Touchable.enabled); frame.table(categories -> { categories.defaults().size(50f); @@ -301,7 +320,11 @@ public class PlacementFragment extends Fragment{ 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; } diff --git a/core/src/io/anuke/mindustry/ui/TreeLayout.java b/core/src/io/anuke/mindustry/ui/layout/BranchTreeLayout.java similarity index 95% rename from core/src/io/anuke/mindustry/ui/TreeLayout.java rename to core/src/io/anuke/mindustry/ui/layout/BranchTreeLayout.java index 7e373ba231..5f3f4b6932 100644 --- a/core/src/io/anuke/mindustry/ui/TreeLayout.java +++ b/core/src/io/anuke/mindustry/ui/layout/BranchTreeLayout.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.ui; +package io.anuke.mindustry.ui.layout; import io.anuke.arc.collection.*; import io.anuke.arc.math.geom.*; @@ -6,7 +6,7 @@ import io.anuke.arc.math.geom.*; /** * Algorithm taken from TreeLayout. */ -public class TreeLayout{ +public class BranchTreeLayout implements TreeLayout{ public TreeLocation rootLocation = TreeLocation.top; public TreeAlignment alignment = TreeAlignment.awayFromRoot; public float gapBetweenLevels = 10; @@ -18,6 +18,7 @@ public class TreeLayout{ private float boundsTop = Float.MAX_VALUE; private float boundsBottom = Float.MIN_VALUE; + @Override public void layout(TreeNode root){ firstWalk(root, null); calcSizeOfLevels(root, 0); @@ -288,20 +289,4 @@ public class TreeLayout{ public enum TreeAlignment{ center, towardsRoot, awayFromRoot } - - public static class 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; - } - } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java b/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java new file mode 100644 index 0000000000..b8aad3d3c4 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java @@ -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 visited = new ObjectSet<>(); + private static Queue 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; + } +} diff --git a/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java b/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java new file mode 100644 index 0000000000..8b905e051d --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java @@ -0,0 +1,22 @@ +package io.anuke.mindustry.ui.layout; + +public interface TreeLayout{ + void layout(TreeNode root); + + class 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; + } + } +} diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index a22eb1d174..83b367e10d 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -19,11 +19,11 @@ import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.InputHandler.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; @@ -39,8 +39,6 @@ import static io.anuke.mindustry.Vars.*; public class Block extends BlockStorage{ public static final int crackRegions = 8, maxCrackSize = 5; - private static final BooleanProvider invisible = () -> false; - /** whether this block has a tile entity that updates */ public boolean update; /** whether this block has health and can be destroyed */ @@ -83,6 +81,8 @@ public class Block extends BlockStorage{ public BlockGroup group = BlockGroup.none; /** List of block flags. Used for AI indexing. */ public EnumSet 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. */ public boolean configurable; /** Whether this block consumes touchDown events when tapped. */ @@ -96,6 +96,8 @@ public class Block extends BlockStorage{ public boolean targetable = true; /** Whether the overdrive core has any effect on this block. */ public boolean canOverdrive = true; + /** Outlined icon color.*/ + public Color outlineColor = Color.valueOf("404049"); /** Whether the icon region has an outline added. */ public boolean outlineIcon = false; /** 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! */ public float buildCost; /** 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.*/ public boolean instantTransfer = false; public boolean alwaysUnlocked = false; @@ -151,7 +155,7 @@ public class Block extends BlockStorage{ } public boolean isBuildable(){ - return buildVisibility != invisible; + return buildVisibility != BuildVisibility.hidden && buildVisibility != BuildVisibility.debugOnly; } public boolean isStatic(){ @@ -384,6 +388,11 @@ public class Block extends BlockStorage{ for(ItemStack stack : requirements){ 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(); setBars(); @@ -661,17 +670,81 @@ public class Block extends BlockStorage{ } } - public void getPlaceDraw(PlaceDraw draw, int rotation, int prevX, int prevY, int prevRotation){ - draw.region = icon(Cicon.full); - draw.scalex = draw.scaley = 1; - draw.rotation = rotation; + public void drawRequest(BuildRequest req, Eachable list, boolean valid){ + Draw.reset(); + Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime(), 6f, 0.28f)); + Draw.alpha(1f); + drawRequestRegion(req, list); + Draw.reset(); + } + + public void drawRequestRegion(BuildRequest req, Eachable 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 - public void createIcons(PixmapPacker out, PixmapPacker editor){ - super.createIcons(out, editor); + public void createIcons(PixmapPacker packer, PixmapPacker editor){ + super.createIcons(packer, editor); 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! */ @@ -724,12 +797,16 @@ public class Block extends BlockStorage{ 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(){ return size > 1; } public boolean isVisible(){ - return buildVisibility.get() && !isHidden(); + return buildVisibility.visible() && !isHidden(); } public boolean isFloor(){ @@ -746,7 +823,7 @@ public class Block extends BlockStorage{ @Override public boolean isHidden(){ - return !buildVisibility.get(); + return !buildVisibility.visible(); } @Override @@ -755,21 +832,21 @@ public class Block extends BlockStorage{ } protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){ - requirements(cat, () -> true, stacks); + requirements(cat, BuildVisibility.shown, stacks); this.alwaysUnlocked = unlocked; } 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. */ - protected void requirements(Category cat, BooleanProvider visible, ItemStack[] stacks){ + protected void requirements(Category cat, BuildVisibility visible, ItemStack[] stacks){ this.category = cat; this.requirements = stacks; 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)); } } diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index bb08372000..7d1441314f 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -73,6 +73,10 @@ public class Build{ 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)){ return false; } diff --git a/core/src/io/anuke/mindustry/world/Edges.java b/core/src/io/anuke/mindustry/world/Edges.java index dc9586aca0..623dd1d434 100644 --- a/core/src/io/anuke/mindustry/world/Edges.java +++ b/core/src/io/anuke/mindustry/world/Edges.java @@ -50,10 +50,14 @@ public class Edges{ } public static Tile getFacingEdge(Tile tile, Tile other){ - if(!tile.block().isMultiblock()) return tile; - int size = tile.block().size; - return world.tile(tile.x + Mathf.clamp(other.x - tile.x, -(size - 1) / 2, (size / 2)), - tile.y + Mathf.clamp(other.y - tile.y, -(size - 1) / 2, (size / 2))); + return getFacingEdge(tile.block, tile.x, tile.y, other); + } + + public static Tile getFacingEdge(Block block, int tilex, int tiley, Tile other){ + if(!block.isMultiblock()) return world.tile(tilex, tiley); + int size = block.size; + return world.tile(tilex + Mathf.clamp(other.x - tilex, -(size - 1) / 2, (size / 2)), + tiley + Mathf.clamp(other.y - tiley, -(size - 1) / 2, (size / 2))); } public static Vector2[] getPixelPolygon(float radius){ diff --git a/core/src/io/anuke/mindustry/world/blocks/Autotiler.java b/core/src/io/anuke/mindustry/world/blocks/Autotiler.java new file mode 100644 index 0000000000..3256a47178 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/Autotiler.java @@ -0,0 +1,96 @@ +package io.anuke.mindustry.world.blocks; + +import io.anuke.arc.function.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; +import io.anuke.mindustry.world.*; + +import java.util.*; + +public interface Autotiler{ + class AutotilerHolder{ + static final int[] blendresult = new int[3]; + static final BuildRequest[] directionals = new BuildRequest[4]; + } + + default @Nullable int[] getTiling(BuildRequest req, Eachable list){ + if(req.tile() == null) return null; + BuildRequest[] directionals = AutotilerHolder.directionals; + + Arrays.fill(directionals, null); + list.each(other -> { + if(other.breaking || other == req) return; + + int i = 0; + for(Point2 point : Geometry.d4){ + int x = req.x + point.x, y = req.y + point.y; + if(x >= other.x -(other.block.size - 1) / 2 && x <= other.x + (other.block.size / 2) && y >= other.y -(other.block.size - 1) / 2 && y <= other.y + (other.block.size / 2)){ + directionals[i] = other; + } + i++; + } + }); + + return buildBlending(req.tile(), req.rotation, directionals); + } + + default int[] buildBlending(Tile tile, int rotation, BuildRequest[] directional){ + int[] blendresult = AutotilerHolder.blendresult; + blendresult[0] = 0; + blendresult[1] = blendresult[2] = 1; + int num = + (blends(tile, rotation, directional, 2) && blends(tile, rotation, directional, 1) && blends(tile, rotation, directional, 3)) ? 0 : + (blends(tile, rotation, directional, 1) && blends(tile, rotation, directional, 3)) ? 1 : + (blends(tile, rotation, directional, 1) && blends(tile, rotation, directional, 2)) ? 2 : + (blends(tile, rotation, directional, 3) && blends(tile, rotation, directional, 2)) ? 3 : + blends(tile, rotation, directional, 1) ? 4 : + blends(tile, rotation, directional, 3) ? 5 : + -1; + transformCase(num, blendresult); + return blendresult; + } + + default void transformCase(int num, int[] bits){ + if(num == 0){ + bits[0] = 3; + }else if(num == 1){ + bits[0] = 4; + }else if(num == 2){ + bits[0] = 2; + }else if(num == 3){ + bits[0] = 2; + bits[2] = -1; + }else if(num == 4){ + bits[0] = 1; + bits[2] = -1; + }else if(num == 5){ + bits[0] = 1; + } + } + + default boolean blends(Tile tile, int rotation, @Nullable BuildRequest[] directional, int direction){ + int realDir = Mathf.mod(rotation - direction, 4); + if(directional != null && directional[realDir] != null){ + BuildRequest req = directional[realDir]; + if(blends(tile, rotation, req.x, req.y, req.rotation, req.block)){ + return true; + } + } + return blends(tile, rotation, direction); + } + + default boolean blends(Tile tile, int rotation, int direction){ + Tile other = tile.getNearby(Mathf.mod(rotation - direction, 4)); + if(other != null) other = other.link(); + return other != null && blends(tile, rotation, other.x, other.y, other.rotation(), other.block()); + } + + default boolean lookingAt(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + return (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) + || (!otherblock.rotate || Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y))); + } + + boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock); +} diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 22e649b9c3..37c3ccc6fa 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -110,8 +110,8 @@ public class BuildBlock extends Block{ //if the target is constructible, begin constructing if(entity.cblock != null){ - player.clearBuilding(); - player.addBuildRequest(new BuildRequest(tile.x, tile.y, tile.rotation(), entity.cblock)); + //player.clearBuilding(); + player.addBuildRequest(new BuildRequest(tile.x, tile.y, tile.rotation(), entity.cblock), false); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index 9985a617d4..86fc8b5ea1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -4,10 +4,12 @@ import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.graphics.g2d.TextureAtlas.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -53,7 +55,7 @@ public class Floor extends Block{ protected byte eq = 0; protected Array blenders = new Array<>(); protected IntSet blended = new IntSet(); - protected TextureRegion edgeRegion, edgierRegion; + protected TextureRegion edgeRegion; public Floor(String name){ super(name); @@ -81,7 +83,38 @@ public class Floor extends Block{ } region = variantRegions[0]; edgeRegion = Core.atlas.find("edge"); - edgierRegion = Core.atlas.find("edgier"); + } + + @Override + public void createIcons(PixmapPacker out, PixmapPacker editor){ + super.createIcons(out, editor); + editor.pack("editor-" + name, Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop()); + + if(blendGroup != this){ + return; + } + + if(variants > 0){ + for(int i = 0; i < variants; i++){ + String rname = name + (i + 1); + editor.pack("editor-" + rname, Core.atlas.getPixmap(rname).crop()); + } + } + + Color color = new Color(); + Color color2 = new Color(); + PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)generateIcons()[0]); + PixmapRegion edge = Core.atlas.getPixmap("edge-stencil"); + Pixmap result = new Pixmap(edge.width, edge.height); + + for(int x = 0; x < edge.width; x++){ + for(int y = 0; y < edge.height; y++){ + edge.getPixel(x, y, color); + result.draw(x, y, color.mul(color2.set(image.getPixel(x % image.width, y % image.height)))); + } + } + + out.pack(name + "-edge", result); } @Override @@ -178,10 +211,6 @@ public class Floor extends Block{ return true; } - boolean eq(int i){ - return (eq & (1 << Mathf.mod(i, 8))) != 0; - } - TextureRegion edge(Floor block, int x, int y){ return block.edges()[x][2 - y]; } diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index 952510035b..cf4d45524c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -23,19 +23,19 @@ public class OreBlock extends OverlayFloor{ /** For mod use only!*/ public OreBlock(String name){ super(name); + variants = 3; } public void setup(Item ore){ this.localizedName = ore.localizedName(); this.itemDrop = ore; - this.variants = 3; this.color.set(ore.color); } @Override @OverrideCallSuper public void createIcons(PixmapPacker out, PixmapPacker editor){ - for(int i = 0; i < 3; i++){ + for(int i = 0; i < variants; i++){ Pixmap image = new Pixmap(32, 32); PixmapRegion shadow = Core.atlas.getPixmap(itemDrop.name + (i + 1)); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java index 3062883588..66972be035 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java @@ -16,6 +16,7 @@ public class Wall extends Block{ solid = true; destructible = true; group = BlockGroup.walls; + buildCostMultiplier = 5f; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 948161dfd1..8a124ea3cc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -72,6 +72,7 @@ public abstract class Turret extends Block{ public Turret(String name){ super(name); + priority = TargetPriority.turret; update = true; solid = true; layer = Layer.turret; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java index 08ae878b5a..3bad2c3945 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -16,11 +16,8 @@ public class ArmoredConveyor extends Conveyor{ } @Override - protected boolean blends(Tile tile, int direction){ - Tile other = tile.getNearby(Mathf.mod(tile.rotation() - direction, 4)); - if(other != null) other = other.link(); - - return other != null && other.block().outputsItems() - && ((tile.getNearby(tile.rotation()) == other) || ((!other.block().rotate && Edges.getFacingEdge(other, tile).relativeTo(tile) == tile.rotation()) || (other.block().rotate && other.getNearby(other.rotation()) == tile))); + public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + return otherblock.outputsItems() && (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) + || ((!otherblock.rotate && Edges.getFacingEdge(otherblock, otherx, othery, tile).relativeTo(tile) == tile.rotation()) || Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y))); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java index 6064d6483d..f8f4394482 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java @@ -1,16 +1,17 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.LiquidBlock; -import io.anuke.mindustry.world.modules.LiquidModule; +import io.anuke.arc.*; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.modules.*; -public class Conduit extends LiquidBlock{ +public class Conduit extends LiquidBlock implements Autotiler{ protected final int timerFlow = timers++; protected TextureRegion[] topRegions = new TextureRegion[7]; @@ -39,29 +40,33 @@ public class Conduit extends LiquidBlock{ super.onProximityUpdate(tile); ConduitEntity entity = tile.entity(); - entity.blendbits = 0; - entity.blendrot = 0; - - if(blends(tile, 2) && blends(tile, 1) && blends(tile, 3)){ - entity.blendbits = 3; - }else if(blends(tile, 1) && blends(tile, 3)){ - entity.blendbits = 6; - }else if(blends(tile, 1) && blends(tile, 2)){ - entity.blendbits = 2; - }else if(blends(tile, 3) && blends(tile, 2)){ - entity.blendbits = 4; - }else if(blends(tile, 1)){ - entity.blendbits = 5; - }else if(blends(tile, 3)){ - entity.blendbits = 1; - } + int[] bits = buildBlending(tile, tile.rotation(), null); + entity.blendbits = bits[0]; } - private boolean blends(Tile tile, int direction){ - Tile other = tile.getNearby(Mathf.mod(tile.rotation() - direction, 4)); - if(other != null) other = other.link(); + @Override + public void drawRequestRegion(BuildRequest req, Eachable list){ + int[] bits = getTiling(req, list); - return other != null && other.block().hasLiquids && other.block().outputsLiquid && ((tile.getNearby(tile.rotation()) == other) || (!other.block().rotate || other.getNearby(other.rotation()) == tile)); + if(bits == null) return; + + Draw.colorl(0.34f); + Draw.alpha(0.5f); + Draw.rect(botRegions[bits[0]], req.drawx(), req.drawy(), req.rotation * 90); + Draw.color(); + + + Draw.rect(topRegions[bits[0]], req.drawx(), req.drawy(), req.rotation * 90); + } + + @Override + public void transformCase(int num, int[] bits){ + bits[0] = num == 0 ? 3 : num == 1 ? 6 : num == 2 ? 2 : num == 3 ? 4 : num == 4 ? 5 : num == 5 ? 1 : 0; + } + + @Override + public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + return otherblock.hasLiquids && otherblock.outputsLiquid && lookingAt(tile, rotation, otherx, othery, otherrot, otherblock); } @Override @@ -113,7 +118,6 @@ public class Conduit extends LiquidBlock{ public static class ConduitEntity extends TileEntity{ public float smoothLiquid; - byte blendbits; - int blendrot; + int blendbits; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index faf6645c6b..c643eef9d1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -2,24 +2,26 @@ package io.anuke.mindustry.world.blocks.distribution; import io.anuke.arc.*; import io.anuke.arc.collection.*; +import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.InputHandler.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.meta.*; import java.io.*; import static io.anuke.mindustry.Vars.*; -public class Conveyor extends Block{ +public class Conveyor extends Block implements Autotiler{ private static final float itemSpace = 0.4f; private static final float minmove = 1f / (Short.MAX_VALUE - 2); private static ItemPos drawpos = new ItemPos(); @@ -27,6 +29,8 @@ public class Conveyor extends Block{ private static ItemPos pos2 = new ItemPos(); private final Vector2 tr1 = new Vector2(); private final Vector2 tr2 = new Vector2(); + private final int[] blendresult = new int[3]; + private final BuildRequest[] directionals = new BuildRequest[4]; private TextureRegion[][] regions = new TextureRegion[7][4]; @@ -90,55 +94,25 @@ public class Conveyor extends Block{ super.onProximityUpdate(tile); ConveyorEntity entity = tile.entity(); - entity.blendbits = 0; - entity.blendsclx = entity.blendscly = 1; - - if(blends(tile, 2) && blends(tile, 1) && blends(tile, 3)){ - entity.blendbits = 3; - }else if(blends(tile, 1) && blends(tile, 3)){ - entity.blendbits = 4; - }else if(blends(tile, 1) && blends(tile, 2)){ - entity.blendbits = 2; - }else if(blends(tile, 3) && blends(tile, 2)){ - entity.blendbits = 2; - entity.blendscly = -1; - }else if(blends(tile, 1)){ - entity.blendbits = 1; - entity.blendscly = -1; - }else if(blends(tile, 3)){ - entity.blendbits = 1; - } + int[] bits = buildBlending(tile, tile.rotation(), null); + entity.blendbits = bits[0]; + entity.blendsclx = bits[1]; + entity.blendscly = bits[2]; } @Override - public void getPlaceDraw(PlaceDraw draw, int rotation, int prevX, int prevY, int prevRotation){ - draw.rotation = rotation; - draw.scalex = draw.scaley = 1; + public void drawRequestRegion(BuildRequest req, Eachable list){ + int[] bits = getTiling(req, list); - int blendbits = 0; + if(bits == null) return; - if(blends(rotation, 1, prevX, prevY, prevRotation)){ - blendbits = 1; - draw.scaley = -1; - }else if(blends(rotation, 3, prevX, prevY, prevRotation)){ - blendbits = 1; - } - - draw.rotation = rotation; - draw.region = regions[blendbits][0]; + TextureRegion region = regions[bits[0]][0]; + Draw.rect(region, req.drawx(), req.drawy(), region.getWidth() * bits[1] * Draw.scl, region.getHeight() * bits[2] * Draw.scl, req.rotation * 90); } - protected boolean blends(int rotation, int offset, int prevX, int prevY, int prevRotation){ - Point2 left = Geometry.d4(rotation - offset); - return left.equals(prevX, prevY) && prevRotation == Mathf.mod(rotation + offset, 4); - } - - protected boolean blends(Tile tile, int direction){ - Tile other = tile.getNearby(Mathf.mod(tile.rotation() - direction, 4)); - if(other != null) other = other.link(); - - return other != null && other.block().outputsItems() - && ((tile.getNearby(tile.rotation()) == other) || (!other.block().rotate || other.getNearby(other.rotation()) == tile)); + @Override + public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + return otherblock.outputsItems() && lookingAt(tile, rotation, otherx, othery, otherrot, otherblock); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index f3020c22ef..c5ada69c89 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -232,8 +232,8 @@ public class MassDriver extends Block{ int maxTransfer = Math.min(entity.items.get(content.item(i)), ((MassDriver)tile.block()).itemCapacity - totalUsed); data.items[i] = maxTransfer; totalUsed += maxTransfer; + entity.items.remove(content.item(i), maxTransfer); } - entity.items.clear(); float angle = tile.angleTo(target); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index 42108b75fc..b6c9c7831b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -17,6 +17,7 @@ import static io.anuke.mindustry.Vars.content; public class Sorter extends Block{ private static Item lastItem; + protected boolean invert; public Sorter(String name){ super(name); @@ -40,16 +41,6 @@ public class Sorter extends Block{ } } - /* - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setSorterItem(Player player, Tile tile, Item item){ - if(!Units.canInteract(player, tile)) return; - SorterEntity entity = tile.entity(); - if(entity != null){ - entity.sortItem = item; - } - }*/ - @Override public void configured(Tile tile, Player player, int value){ tile.entity().sortItem = content.item(value); @@ -92,7 +83,7 @@ public class Sorter extends Block{ if(dir == -1) return null; Tile to; - if(item == entity.sortItem){ + if((item == entity.sortItem) != invert){ //prevent 3-chains if(isSame(dest, source) && isSame(dest, dest.getNearby(dir))){ return null; @@ -115,12 +106,10 @@ public class Sorter extends Block{ }else{ if(dest.rotation() == 0){ to = a; - if(flip) - dest.rotation((byte)1); + if(flip) dest.rotation((byte)1); }else{ to = b; - if(flip) - dest.rotation((byte)0); + if(flip) dest.rotation((byte)0); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index d32813791d..5af8ba1e9c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -1,24 +1,20 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.consumers.ConsumeItemFilter; -import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.consumers.*; +import io.anuke.mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.content; -import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.*; /** * Power generation block which can use items, liquids or both as input sources for power production. @@ -33,17 +29,26 @@ public class ItemLiquidGenerator extends PowerGenerator{ /** Maximum liquid used per frame. */ protected float maxLiquidGenerate = 0.4f; - protected Effects.Effect generateEffect = Fx.generatespark; - protected Effects.Effect explodeEffect = Fx.generatespark; + protected Effect generateEffect = Fx.generatespark; + protected Effect explodeEffect = Fx.generatespark; protected Color heatColor = Color.valueOf("ff9b59"); protected TextureRegion topRegion, liquidRegion; protected boolean randomlyExplode = true; + protected boolean defaults = false; public ItemLiquidGenerator(boolean hasItems, boolean hasLiquids, String name){ super(name); this.hasItems = hasItems; this.hasLiquids = hasLiquids; + setDefaults(); + } + + public ItemLiquidGenerator(String name){ + super(name); + } + + protected void setDefaults(){ if(hasItems){ consumes.add(new ConsumeItemFilter(item -> getItemEfficiency(item) >= minItemEfficiency)).update(false).optional(true, false); } @@ -51,6 +56,16 @@ public class ItemLiquidGenerator extends PowerGenerator{ if(hasLiquids){ consumes.add(new ConsumeLiquidFilter(liquid -> getLiquidEfficiency(liquid) >= minLiquidEfficiency, maxLiquidGenerate)).update(false).optional(true, false); } + + defaults = true; + } + + @Override + public void init(){ + if(!defaults){ + setDefaults(); + } + super.init(); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 2896de80fa..453b4032c5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -275,15 +275,18 @@ public class PowerNode extends PowerBlock{ @Override public void drawLayer(Tile tile){ - if(!Core.settings.getBool("lasers")) return; + if(Core.settings.getInt("lasersopacity") == 0) return; TileEntity entity = tile.entity(); for(int i = 0; i < entity.power.links.size; i++){ Tile link = world.tile(entity.power.links.get(i)); - if(linkValid(tile, link) && (link.pos() < tile.pos() || !(link.block() instanceof PowerNode) || !Core.camera.bounds(Tmp.r1).contains(link.drawx(), link.drawy()))){ - drawLaser(tile, link); - } + + if(!linkValid(tile, link)) continue; + + if(link.block() instanceof PowerNode && !(link.pos() < tile.pos())) continue; + + drawLaser(tile, link); } Draw.reset(); @@ -318,6 +321,11 @@ public class PowerNode extends PowerBlock{ } protected void drawLaser(Tile tile, Tile target){ + int opacityPercentage = Core.settings.getInt("lasersopacity"); + if(opacityPercentage == 0) return; + + float opacity = opacityPercentage / 100f; + float x1 = tile.drawx(), y1 = tile.drawy(), x2 = target.drawx(), y2 = target.drawy(); @@ -333,7 +341,8 @@ public class PowerNode extends PowerBlock{ float fract = 1f-tile.entity.power.graph.getSatisfaction(); Draw.color(Color.white, Pal.powerLight, fract*0.86f + Mathf.absin(3f, 0.1f)); - Drawf.laser(laser, laserEnd, x1, y1, x2, y2, 0.3f); + Draw.alpha(opacity); + Drawf.laser(laser, laserEnd, x1, y1, x2, y2, 0.25f); Draw.color(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java index 72c0ec9e4b..231533fc8c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java @@ -5,8 +5,9 @@ import io.anuke.mindustry.type.Liquid; public class SingleTypeGenerator extends ItemLiquidGenerator{ - public SingleTypeGenerator(boolean hasItems, boolean hasLiquids, String name){ - super(hasItems, hasLiquids, name); + public SingleTypeGenerator(String name){ + super(name); + defaults = true; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index cdb2ce0d70..045003a545 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.world.blocks.storage; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.collection.ObjectSet.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; @@ -157,7 +156,7 @@ public class CoreBlock extends StorageBlock{ tile.entity.items.set(item, Math.min(tile.entity.items.get(item), max)); } - for(Tile other : new ObjectSetIterator<>(state.teams.get(tile.getTeam()).cores)){ + for(Tile other : state.teams.get(tile.getTeam()).cores){ other.block().onProximityUpdate(other); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 417148dd72..57133c66ea 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; @@ -14,7 +15,7 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.*; public class ConsumeItemFilter extends Consume{ - public final Predicate filter; + public final @NonNull Predicate filter; public ConsumeItemFilter(Predicate item){ this.filter = item; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index 967685e693..f6b047bf6f 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; @@ -11,12 +12,17 @@ import io.anuke.mindustry.world.meta.*; import io.anuke.mindustry.world.meta.values.*; public class ConsumeItems extends Consume{ - public final ItemStack[] items; + public final @NonNull ItemStack[] items; public ConsumeItems(ItemStack[] items){ this.items = items; } + /** Mods.*/ + protected ConsumeItems(){ + this(new ItemStack[]{}); + } + @Override public void applyItemFilter(Bits filter){ for(ItemStack stack : items){ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 96d9bc9de1..2774849cb5 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -1,23 +1,27 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.ReqImage; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.BlockStats; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; public class ConsumeLiquid extends ConsumeLiquidBase{ - public final Liquid liquid; + public final @NonNull Liquid liquid; public ConsumeLiquid(Liquid liquid, float amount){ super(amount); this.liquid = liquid; } + protected ConsumeLiquid(){ + this(null, 0f); + } + @Override public void applyLiquidFilter(Bits filter){ filter.set(liquid.id); diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index 18b2d422db..d183b3969f 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -20,6 +20,10 @@ public class ConsumePower extends Consume{ this.buffered = buffered; } + protected ConsumePower(){ + this(0f, 0f, false); + } + @Override public ConsumeType type(){ return ConsumeType.power; diff --git a/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java b/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java new file mode 100644 index 0000000000..38c98aeaa2 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java @@ -0,0 +1,22 @@ +package io.anuke.mindustry.world.meta; + +import io.anuke.arc.function.*; +import io.anuke.mindustry.*; + +public enum BuildVisibility{ + hidden(() -> false), + shown(() -> true), + debugOnly(() -> false), + sandboxOnly(() -> Vars.state.rules.infiniteResources), + campaignOnly(() -> Vars.world.isZone()); + + private final BooleanProvider visible; + + public boolean visible(){ + return visible.get(); + } + + BuildVisibility(BooleanProvider visible){ + this.visible = visible; + } +} diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 2aceda244f..e97099f3ef 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -15,6 +15,7 @@ import io.anuke.arc.scene.event.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; import io.anuke.arc.util.Log.*; +import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; @@ -22,6 +23,7 @@ import io.anuke.mindustry.desktop.steam.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.ui.*; @@ -64,7 +66,7 @@ public class DesktopLauncher extends ClientLauncher{ public DesktopLauncher(String[] args){ Log.setUseColors(false); Version.init(); - boolean useSteam = Version.modifier.equals("steam"); + boolean useSteam = Version.modifier.contains("steam"); testMobile = Array.with(args).contains("-testMobile"); if(useDiscord){ @@ -81,6 +83,14 @@ public class DesktopLauncher extends ClientLauncher{ } if(useSteam){ + //delete leftover dlls + FileHandle file = new FileHandle("."); + for(FileHandle other : file.parent().list()){ + if(other.name().contains("steam") && (other.extension().equals("dll") || other.extension().equals("so") || other.extension().equals("dylib"))){ + other.delete(); + } + } + if(showConsole){ StringBuilder base = new StringBuilder(); Log.setLogger(new LogHandler(){ @@ -129,7 +139,13 @@ public class DesktopLauncher extends ClientLauncher{ } try{ - SteamAPI.loadLibraries(); + try{ + SteamAPI.loadLibraries(); + }catch(Throwable t){ + Log.err(t); + fallbackSteam(); + } + if(!SteamAPI.init()){ Log.err("Steam client not running."); }else{ @@ -144,11 +160,25 @@ public class DesktopLauncher extends ClientLauncher{ } } + void fallbackSteam(){ + try{ + String name = "steam_api"; + if(OS.isMac || OS.isLinux) name = "lib" + name; + if(OS.isWindows && OS.is64Bit) name += "64"; + name += (OS.isLinux ? ".so" : OS.isMac ? ".dylib" : ".dll"); + Streams.copyStream(getClass().getResourceAsStream(name), new FileOutputStream(name)); + System.loadLibrary(new File(name).getAbsolutePath()); + }catch(Throwable e){ + Log.err(e); + } + } + void initSteam(String[] args){ SVars.net = new SNet(new ArcNetImpl()); SVars.stats = new SStats(); SVars.workshop = new SWorkshop(); SVars.user = new SUser(); + boolean[] isShutdown = {false}; Events.on(ClientLoadEvent.class, event -> { player.name = SVars.net.friends.getPersonaName(); @@ -177,8 +207,18 @@ public class DesktopLauncher extends ClientLauncher{ } }); }); + + Events.on(DisposeEvent.class, event -> { + SteamAPI.shutdown(); + isShutdown[0] = true; + }); + //steam shutdown hook - Runtime.getRuntime().addShutdownHook(new Thread(SteamAPI::shutdown)); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if(!isShutdown[0]){ + SteamAPI.shutdown(); + } + })); } static void handleCrash(Throwable e){ @@ -198,7 +238,10 @@ public class DesktopLauncher extends ClientLauncher{ boolean fbgp = badGPU; CrashSender.send(e, file -> { - Throwable cause = Strings.getFinalCause(e); + Array causes = Strings.getCauses(e); + Throwable fc = causes.find(t -> t instanceof ModLoadException); + if(fc == null) fc = Strings.getFinalCause(e); + Throwable cause = fc; if(!fbgp){ dialog.accept(() -> message("A crash has occured. It has been saved in:\n" + file.getAbsolutePath() + "\n" + cause.getClass().getSimpleName().replace("Exception", "") + (cause.getMessage() == null ? "" : ":\n" + cause.getMessage()))); } @@ -211,12 +254,17 @@ public class DesktopLauncher extends ClientLauncher{ } @Override - public void viewMapListing(Map map){ - viewMapListing(map.file.parent().name()); + public Array getExternalMods(){ + return !steam ? super.getExternalMods() : SVars.workshop.getModFiles(); } @Override - public void viewMapListing(String mapid){ + public void viewMapListing(Map map){ + viewListing(map.file.parent().name()); + } + + @Override + public void viewListing(String mapid){ SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + mapid); } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java index 578b00de3c..31f6029e44 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java @@ -22,29 +22,39 @@ public class SWorkshop implements SteamUGCCallback{ private Map lastMap; private Array mapFiles; - private ObjectMap> detailHandlers = new ObjectMap<>(); + private Array modFiles; + private ObjectMap, SteamResult>> detailHandlers = new ObjectMap<>(); public SWorkshop(){ int items = ugc.getNumSubscribedItems(); SteamPublishedFileID[] ids = new SteamPublishedFileID[items]; ItemInstallInfo info = new ItemInstallInfo(); ugc.getSubscribedItems(ids); - mapFiles = Array.with(ids).map(f -> { + + Array folders = Array.with(ids).map(f -> { ugc.getItemInstallInfo(f, info); return new FileHandle(info.getFolder()); - }).select(f -> f.list().length > 0).map(f -> f.list()[0]); + }).select(f -> f != null && f.list().length > 0); - if(items > 0){ + mapFiles = folders.select(f -> f.list().length == 1 && f.list()[0].extension().equals(mapExtension)).map(f -> f.list()[0]); + modFiles = folders.select(f -> f.child("mod.json").exists()); + + if(!mapFiles.isEmpty()){ SAchievement.downloadMapWorkshop.complete(); } - Log.info("Fetching {0} subscribed maps.", items); + Log.info("Fetching {0} subscribed maps.", mapFiles.size); + Log.info("Fetching {0} subscribed mods.", modFiles.size); } public Array getMapFiles(){ return mapFiles; } + public Array getModFiles(){ + return modFiles; + } + public void publishMap(Map map){ if(map.tags.containsKey("steamid")){ Log.info("Map already published, redirecting to ID."); @@ -86,12 +96,13 @@ public class SWorkshop implements SteamUGCCallback{ SteamUGCQuery query = ugc.createQueryUGCDetailsRequest(fid); Log.info("POST " + query); - detailHandlers.put(query, (details, result) -> { + detailHandlers.put(query, (detailsList, result) -> { ui.loadfrag.hide(); - Log.info("Map listing result: " + result + " " + details.getResult() + " " + details.getFileName() + " " + details.getTitle()); + Log.info("Map listing result: " + result + " " + detailsList); if(result == SteamResult.OK){ + SteamUGCDetails details = detailsList.first(); if(details.getResult() == SteamResult.OK){ if(details.getOwnerID().equals(SVars.user.user.getSteamID())){ @@ -101,7 +112,7 @@ public class SWorkshop implements SteamUGCCallback{ dialog.addCloseButton(); dialog.buttons.addImageTextButton("$view.workshop", Icon.linkSmall, () -> { - platform.viewMapListing(id); + platform.viewListing(id); dialog.hide(); }).size(210f, 64f); @@ -160,11 +171,14 @@ public class SWorkshop implements SteamUGCCallback{ if(detailHandlers.containsKey(query)){ if(numResultsReturned > 0){ - SteamUGCDetails details = new SteamUGCDetails(); - ugc.getQueryUGCResult(query, 0, details); + Array details = new Array<>(); + for(int i = 0; i < numResultsReturned; i++){ + details.set(i, new SteamUGCDetails()); + ugc.getQueryUGCResult(query, i, details.get(i)); + } detailHandlers.get(query).accept(details, result); }else{ - detailHandlers.get(query).accept(null, SteamResult.FileNotFound); + detailHandlers.get(query).accept(new Array<>(), SteamResult.FileNotFound); } detailHandlers.remove(query); diff --git a/fastlane/metadata/android/ja/full_description.txt b/fastlane/metadata/android/ja/full_description.txt new file mode 100644 index 0000000000..d76eb7a53c --- /dev/null +++ b/fastlane/metadata/android/ja/full_description.txt @@ -0,0 +1,14 @@ +ベルトコンベアーを巧みに配置して、弾薬をタレットに送り込み、建設に必要な材料を集めて、敵からコアを守り切ろう。あなたのフレンドとクロスプラットフォームでマルチプレイして、お互いに協力したり、チームで戦ったりしよう。 + +Mindustryの特徴: +- 24個のマップ +- テックツリーや新しいエリアの解放を目指す +- 4つのパワフルなボス +- 電気、液体、アイテムの輸送システム +- 19個の個性的なドローンや機体 +- 120以上のテクノロジーブロックを使いこなす +- 75以上の異なる環境ブロック +- ローカルネットワークや専用サーバーで、クロスプラットフォームのマルチプレイが可能 +- カスタマイズ可能なゲーム: ブロックのコスト変更、敵のステータス、初期アイテム、ウェーブのタイミング など… +- 強力なエディター、鉱石をランダムに生成したり、地形、デコレーション、左右対称なマップも制作可能 +- マップごとにウェーブの構成もカスタマイズ可能 \ No newline at end of file diff --git a/fastlane/metadata/android/ja/short_description.txt b/fastlane/metadata/android/ja/short_description.txt new file mode 100644 index 0000000000..a7430009eb --- /dev/null +++ b/fastlane/metadata/android/ja/short_description.txt @@ -0,0 +1 @@ +工場ベースのサンドボックスタワーディフェンスゲーム。 \ No newline at end of file diff --git a/fastlane/metadata/android/ja/title.txt b/fastlane/metadata/android/ja/title.txt new file mode 100644 index 0000000000..2beb939017 --- /dev/null +++ b/fastlane/metadata/android/ja/title.txt @@ -0,0 +1 @@ +Mindustry \ No newline at end of file diff --git a/fastlane/metadata/android/ja/video.txt b/fastlane/metadata/android/ja/video.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fastlane/metadata/steam/Simplified Chinese/achievements.vdf b/fastlane/metadata/steam/Simplified Chinese/achievements.vdf new file mode 100644 index 0000000000..fbdadf9a19 --- /dev/null +++ b/fastlane/metadata/steam/Simplified Chinese/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "Simplified Chinese" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "萌新" + "NEW_ACHIEVEMENT_20_0_DESC" "完成教程。" + "NEW_ACHIEVEMENT_20_1_NAME" "千人斩!" + "NEW_ACHIEVEMENT_20_1_DESC" "累计击败1,000名敌人。" + "NEW_ACHIEVEMENT_20_2_NAME" "十万人斩!" + "NEW_ACHIEVEMENT_20_2_DESC" "累计击败100,000名敌人。" + "NEW_ACHIEVEMENT_20_3_NAME" "大气输送" + "NEW_ACHIEVEMENT_20_3_DESC" "累计发射10,000件物品。" + "NEW_ACHIEVEMENT_20_5_NAME" "无尽装运" + "NEW_ACHIEVEMENT_20_5_DESC" "累计发射1,000,000件物品。" + "NEW_ACHIEVEMENT_20_6_NAME" "征服者" + "NEW_ACHIEVEMENT_20_6_DESC" "赢得10场攻击模式。" + "NEW_ACHIEVEMENT_20_7_NAME" "冠军" + "NEW_ACHIEVEMENT_20_7_DESC" "赢得10场PvP比赛。" + "NEW_ACHIEVEMENT_20_8_NAME" "速战速决" + "NEW_ACHIEVEMENT_20_8_DESC" "在攻击模式地区中在5波以内摧毁敌方核心。" + "NEW_ACHIEVEMENT_20_9_NAME" "核心雨" + "NEW_ACHIEVEMENT_20_9_DESC" "把你的核心发射到一个区域30次。" + "NEW_ACHIEVEMENT_20_10_NAME" "顽强抵抗" + "NEW_ACHIEVEMENT_20_10_DESC" "存活100波。" + "NEW_ACHIEVEMENT_20_11_NAME" "不可征服" + "NEW_ACHIEVEMENT_20_11_DESC" "存活500波。" + "NEW_ACHIEVEMENT_20_12_NAME" "研究者" + "NEW_ACHIEVEMENT_20_12_DESC" "研究所有科技。" + "NEW_ACHIEVEMENT_20_13_NAME" "变形金刚" + "NEW_ACHIEVEMENT_20_13_DESC" "解锁并变形成所有机甲。" + "NEW_ACHIEVEMENT_20_14_NAME" "过载" + "NEW_ACHIEVEMENT_20_14_DESC" "用电力击打被水覆盖的敌人。" + "NEW_ACHIEVEMENT_20_15_NAME" "借刀杀人" + "NEW_ACHIEVEMENT_20_15_DESC" "用敌人的子弹摧毁它自己。" + "NEW_ACHIEVEMENT_20_17_NAME" "严重的错误" + "NEW_ACHIEVEMENT_20_17_DESC" "研究路由器。" + "NEW_ACHIEVEMENT_20_18_NAME" "大肆建造" + "NEW_ACHIEVEMENT_20_18_DESC" "放置10,000个方块。" + "NEW_ACHIEVEMENT_20_19_NAME" "夷为平地" + "NEW_ACHIEVEMENT_20_19_DESC" "摧毁1,000个敌方方块。" + "NEW_ACHIEVEMENT_20_20_NAME" "壮观的灾难" + "NEW_ACHIEVEMENT_20_20_DESC" "引起钍反应堆过热爆炸。" + "NEW_ACHIEVEMENT_20_21_NAME" "地图制造者" + "NEW_ACHIEVEMENT_20_21_DESC" "制造10次新地图。" + "NEW_ACHIEVEMENT_20_22_NAME" "浏览器" + "NEW_ACHIEVEMENT_20_22_DESC" "从创意工坊上下载一次地图。" + "NEW_ACHIEVEMENT_20_23_NAME" "创造者" + "NEW_ACHIEVEMENT_20_23_DESC" "上传一次地图到创意工坊。" + "NEW_ACHIEVEMENT_20_24_NAME" "杀戮者" + "NEW_ACHIEVEMENT_20_24_DESC" "击败一次Boss" + "NEW_ACHIEVEMENT_20_25_NAME" "探索者" + "NEW_ACHIEVEMENT_20_25_DESC" "解锁战役模式所有地区。" + "NEW_ACHIEVEMENT_20_26_NAME" "强迫症" + "NEW_ACHIEVEMENT_20_26_DESC" "完成所有地区的任务。" + "NEW_ACHIEVEMENT_20_29_NAME" "第二材料" + "NEW_ACHIEVEMENT_20_29_DESC" "解锁钍。" + "NEW_ACHIEVEMENT_20_31_NAME" "第一材料" + "NEW_ACHIEVEMENT_20_31_DESC" "解锁钛。" + "NEW_ACHIEVEMENT_21_0_NAME" "恐怖分子" + "NEW_ACHIEVEMENT_21_0_DESC" "将你的机甲装满爆炸性物品并自爆。" + "NEW_ACHIEVEMENT_21_1_NAME" "开始了!" + "NEW_ACHIEVEMENT_21_1_DESC" "建造尖刀机甲工厂。" + "NEW_ACHIEVEMENT_21_2_NAME" "突击!" + "NEW_ACHIEVEMENT_21_2_DESC" "用指挥中心发出攻击指令。" + "NEW_ACHIEVEMENT_21_3_NAME" "蜂群" + "NEW_ACHIEVEMENT_21_3_DESC" "同时拥有100个单位。" + "NEW_ACHIEVEMENT_21_4_NAME" "建造大队" + "NEW_ACHIEVEMENT_21_4_DESC" "同时拥有10个鬼怪建造机。" + "NEW_ACHIEVEMENT_21_5_NAME" "神风敢死队" + "NEW_ACHIEVEMENT_21_5_DESC" "同时拥有50个爬行者。" + "NEW_ACHIEVEMENT_21_6_NAME" "军队" + "NEW_ACHIEVEMENT_21_6_DESC" "总计建造1,000个机甲" + "NEW_ACHIEVEMENT_21_7_NAME" "SR" + "NEW_ACHIEVEMENT_21_7_DESC" "在任一地区达到级别S。" + "NEW_ACHIEVEMENT_21_8_NAME" "SSR" + "NEW_ACHIEVEMENT_21_8_DESC" "在所有地区达到级别S。" + "NEW_ACHIEVEMENT_21_9_NAME" "不听话的下场" + "NEW_ACHIEVEMENT_21_9_DESC" "在敌人出生点死亡。" + "NEW_ACHIEVEMENT_21_10_NAME" "被水淹没,不知所措" + "NEW_ACHIEVEMENT_21_10_DESC" "被淹死。" + "NEW_ACHIEVEMENT_21_11_NAME" "收集者" + "NEW_ACHIEVEMENT_21_11_DESC" "将核心装满所有资源。" + "NEW_ACHIEVEMENT_21_12_NAME" "忙碌" + "NEW_ACHIEVEMENT_21_12_DESC" "创建一个有10个玩家的服务器。" + "NEW_ACHIEVEMENT_21_13_NAME" "无懈可击" + "NEW_ACHIEVEMENT_21_13_DESC" "建造熔毁和幽灵。" + "NEW_ACHIEVEMENT_21_14_NAME" "上天" + "NEW_ACHIEVEMENT_21_14_DESC" "使用发射台。" + "NEW_ACHIEVEMENT_21_15_NAME" "做人不能太自以为是" + "NEW_ACHIEVEMENT_21_15_DESC" "跳过两次发射机会后核心被敌人摧毁。" + "NEW_ACHIEVEMENT_21_16_NAME" "路由器邪教" + "NEW_ACHIEVEMENT_21_16_DESC" "建造两个相邻的路由器。" + "NEW_ACHIEVEMENT_21_17_NAME" "单枪匹马" + "NEW_ACHIEVEMENT_21_17_DESC" "不放置一块方块存活10波。" + "NEW_ACHIEVEMENT_21_18_NAME" "FFF团之力" + "NEW_ACHIEVEMENT_21_18_DESC" "使用硫做炮塔弹药。" + "NEW_ACHIEVEMENT_21_19_NAME" "效率" + "NEW_ACHIEVEMENT_21_19_DESC" "用水或冷却液冷却炮塔。" + "NEW_ACHIEVEMENT_21_20_NAME" "经典模式" + "NEW_ACHIEVEMENT_21_20_DESC" "启用像素化。" + "NEW_ACHIEVEMENT_21_21_NAME" "学者" + "NEW_ACHIEVEMENT_21_21_DESC" "从游戏中打开Wiki。" + "NEW_ACHIEVEMENT_21_22_NAME" "硬核开头" + "NEW_ACHIEVEMENT_21_22_DESC" "携带10,000资源进入一个地区" + "NEW_ACHIEVEMENT_21_23_NAME" "点火" + "NEW_ACHIEVEMENT_21_23_DESC" "启动冲击反应堆。" + } +} diff --git a/fastlane/metadata/steam/Simplified Chinese/description.txt b/fastlane/metadata/steam/Simplified Chinese/description.txt new file mode 100644 index 0000000000..09c9954e2d --- /dev/null +++ b/fastlane/metadata/steam/Simplified Chinese/description.txt @@ -0,0 +1,60 @@ +建造精密的传送带供应链,提供炮塔弹药,生产建筑材料,保护你的建筑并抵御敌人。在跨平台多人合作游戏中与朋友一起玩,或在基于团队的PVP比赛中向他们挑战。 + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]游戏操作[/h2] + +[list] +[*] 建造钻头和传送带来将资源转移到核心 +[*] 使用工厂制造进阶材料 +[*] 建造无人机以自动采矿,协助建造和保卫核心 +[*] 分配液体并扑灭突发火灾 +[*] 用特定物品冷却炮塔和提高生产 +[/list] + +[h2]战役模式[/h2] + +[list] +[*]在12张可重复游玩的内建区域中前进 +[*]收集并发射资源 +[*]研究科技以进步 +[*]携带资源进入每个区域 +[*]多样的任务与目标 +[*]邀请朋友一起完成任务 +[*]研究120+科技 +[*]19种不同类型的无人机、机甲及飞船 +[*]达成50+成就 +[/list] + +[h2][h2]游戏模式[/h2][/h2] + +[*] [b]生存[/b]: 建造炮塔来防御敌人。尽可能长的生存下来,发射你的核心来使用你收集的资源进行研究。为Boss的到来做好准备。 +[*] [b]攻击[/b]: 为建造工厂生产机甲来摧毁敌人的核心,同时保护你的基地,抵御敌人的攻击。创建各种不同类型的支援和进攻单位,以协助你实现目标。 +[*] [b]PvP[/b]: 与最多4个不同团队的其他玩家互相伤害。创建单位,或者直接用你的飞船攻击他人基地。 +[*] [b]沙盒[/b]: 无限的资源,没有敌人的威胁。使用只限于沙盒的物品源和液体源来测试设计,和根据需要生成敌人。 +[/list] + +[h2]自定义游戏和跨平台多人游戏[/h2] + +[list] +[*]用于自定义的12个内置地图 +[*]游玩合作,PvP或沙盒模式 +[*]加入公共专用服务器,或邀请朋友参加您自己的私人服务器 +[*]可定制的游戏规则 +[*]混合和匹配游戏模式:结合PvP和PvE游戏模式 +[/list] + +[h2]自定义地图编辑器[/h2] + +[list] +[*]使用编辑器绘制地图 +[*]在游戏中编辑和预览 +[*]可更改的工具模式 +[*]具有多种不同类型的地形处理过滤器的强大的地图生成系统 +[*]将随机地形应用于地图 +[*]随机配置和生成矿石,以及放置河流和资源 +[*]配置敌方波次布局 +[*]在Steam创意工坊上共享导出的地图 +[*]自定义地图的基础规则 +[*]使用75+个不同的环境块 +[/list] diff --git a/fastlane/metadata/steam/Simplified Chinese/short-description.txt b/fastlane/metadata/steam/Simplified Chinese/short-description.txt new file mode 100644 index 0000000000..da05408477 --- /dev/null +++ b/fastlane/metadata/steam/Simplified Chinese/short-description.txt @@ -0,0 +1 @@ +一款以资源管理为核心的无尽塔防游戏。 diff --git a/fastlane/metadata/steam/italian/achievements.vdf b/fastlane/metadata/steam/italian/achievements.vdf new file mode 100644 index 0000000000..a000858b27 --- /dev/null +++ b/fastlane/metadata/steam/italian/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "italian" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "Utente abilitato" + "NEW_ACHIEVEMENT_20_0_DESC" "Completa il tutorial." + "NEW_ACHIEVEMENT_20_1_NAME" "Attaccabrighe" + "NEW_ACHIEVEMENT_20_1_DESC" "Distruggi 1000 unità nemiche." + "NEW_ACHIEVEMENT_20_2_NAME" "Epurazione" + "NEW_ACHIEVEMENT_20_2_DESC" "Distruggi 100,000 unità nemiche." + "NEW_ACHIEVEMENT_20_3_NAME" "Trasporto Atmosferico" + "NEW_ACHIEVEMENT_20_3_DESC" "Lancia 10,000 oggetti." + "NEW_ACHIEVEMENT_20_5_NAME" "Spedizioni senza fine" + "NEW_ACHIEVEMENT_20_5_DESC" "Lancia 1,000,000 di oggetti." + "NEW_ACHIEVEMENT_20_6_NAME" "Conquistatore" + "NEW_ACHIEVEMENT_20_6_DESC" "Vinci 10 partite in modalità attacco." + "NEW_ACHIEVEMENT_20_7_NAME" "Campione" + "NEW_ACHIEVEMENT_20_7_DESC" "Vinci 10 partite multigiocatore PvP." + "NEW_ACHIEVEMENT_20_8_NAME" "Blitz" + "NEW_ACHIEVEMENT_20_8_DESC" "Distruggi il nucleo nemico in una zona d'attacco in 5 ondate o meno." + "NEW_ACHIEVEMENT_20_9_NAME" "Pioggia di Nuclei" + "NEW_ACHIEVEMENT_20_9_DESC" "Lancia il tuo nucleo in una zona 30 volte" + "NEW_ACHIEVEMENT_20_10_NAME" "Tenace" + "NEW_ACHIEVEMENT_20_10_DESC" "Sopravvivi a 100 ondate." + "NEW_ACHIEVEMENT_20_11_NAME" "Imbattuto" + "NEW_ACHIEVEMENT_20_11_DESC" "Sopravvivi a 500 ondate." + "NEW_ACHIEVEMENT_20_12_NAME" "Ricercatore" + "NEW_ACHIEVEMENT_20_12_DESC" "Ricerca tutto." + "NEW_ACHIEVEMENT_20_13_NAME" "Mutaforma" + "NEW_ACHIEVEMENT_20_13_DESC" "Sblocca tutti i mech e trasformati in ogniuno di essi." + "NEW_ACHIEVEMENT_20_14_NAME" "Sovraccarico" + "NEW_ACHIEVEMENT_20_14_DESC" "Colpisci un nemico ricoperto d'acqua con l'elettricità." + "NEW_ACHIEVEMENT_20_15_NAME" "Deviazione" + "NEW_ACHIEVEMENT_20_15_DESC" "Distruggi un nemico con un suo colpo riflesso." + "NEW_ACHIEVEMENT_20_17_NAME" "Un grave errore" + "NEW_ACHIEVEMENT_20_17_DESC" "Ricerca il distributore." + "NEW_ACHIEVEMENT_20_18_NAME" "Costruttore" + "NEW_ACHIEVEMENT_20_18_DESC" "Piazza 10,000 blocchi." + "NEW_ACHIEVEMENT_20_19_NAME" "Razziatore" + "NEW_ACHIEVEMENT_20_19_DESC" "Distruggi 1,000 blocchi nemici." + "NEW_ACHIEVEMENT_20_20_NAME" "Un disastro memorabile" + "NEW_ACHIEVEMENT_20_20_DESC" "Causa il surriscaldamento e l'esplosione di un Reattore al Torio." + "NEW_ACHIEVEMENT_20_21_NAME" "Cartografo" + "NEW_ACHIEVEMENT_20_21_DESC" "Crea 10 nuove mappe." + "NEW_ACHIEVEMENT_20_22_NAME" "Navigatore" + "NEW_ACHIEVEMENT_20_22_DESC" "Scarica una mappa dal Workshop." + "NEW_ACHIEVEMENT_20_23_NAME" "Creatore" + "NEW_ACHIEVEMENT_20_23_DESC" "Pubblica una mappa nel Workshop." + "NEW_ACHIEVEMENT_20_24_NAME" "Mietitore" + "NEW_ACHIEVEMENT_20_24_DESC" "Sconfiggi un boss." + "NEW_ACHIEVEMENT_20_25_NAME" "Esploratore" + "NEW_ACHIEVEMENT_20_25_DESC" "Sblocca tutte le zone della campagna." + "NEW_ACHIEVEMENT_20_26_NAME" "Completista" + "NEW_ACHIEVEMENT_20_26_DESC" "Sblocca l'equipaggiamento personalizzato in tutte le zone." + "NEW_ACHIEVEMENT_20_29_NAME" "Materiale II" + "NEW_ACHIEVEMENT_20_29_DESC" "Sblocca il Torio." + "NEW_ACHIEVEMENT_20_31_NAME" "Materiale I" + "NEW_ACHIEVEMENT_20_31_DESC" "Sblocca il Titanio." + "NEW_ACHIEVEMENT_21_0_NAME" "Kamikaze" + "NEW_ACHIEVEMENT_21_0_DESC" "Riempi il tuo mech di esplosivi e muori, creando un esplosione." + "NEW_ACHIEVEMENT_21_1_NAME" "Ha inizio" + "NEW_ACHIEVEMENT_21_1_DESC" "Costruisci una fabbrica di droni pugnalatori." + "NEW_ACHIEVEMENT_21_2_NAME" "Assalto Diretto" + "NEW_ACHIEVEMENT_21_2_DESC" "Emetti un ordine di attacco usando il centro di comando." + "NEW_ACHIEVEMENT_21_3_NAME" "Orda" + "NEW_ACHIEVEMENT_21_3_DESC" "Possiedi 100 unità attive contemporaneamente." + "NEW_ACHIEVEMENT_21_4_NAME" "Stormo" + "NEW_ACHIEVEMENT_21_4_DESC" "Possiedi 10 Droni Fantasma attivi contemporaneamente." + "NEW_ACHIEVEMENT_21_5_NAME" "Esercito Esplosivo" + "NEW_ACHIEVEMENT_21_5_DESC" "Possiedi 50 Strisciatori attivi contemporaneamente." + "NEW_ACHIEVEMENT_21_6_NAME" "Legione" + "NEW_ACHIEVEMENT_21_6_DESC" "Costruisci 1000 unità." + "NEW_ACHIEVEMENT_21_7_NAME" "Super" + "NEW_ACHIEVEMENT_21_7_DESC" "Ottieni la valutazione S in una zona qualsiasi." + "NEW_ACHIEVEMENT_21_8_NAME" "Super Super" + "NEW_ACHIEVEMENT_21_8_DESC" "Ottieni la valutazione SS in una zona qualsiasi." + "NEW_ACHIEVEMENT_21_9_NAME" "Avresti dovusto ascoltare" + "NEW_ACHIEVEMENT_21_9_DESC" "Muori nella zona di esclusione dell'atterraggio nemico." + "NEW_ACHIEVEMENT_21_10_NAME" "Premi Shift" + "NEW_ACHIEVEMENT_21_10_DESC" "Annega, in qualche modo." + "NEW_ACHIEVEMENT_21_11_NAME" "Collezionista" + "NEW_ACHIEVEMENT_21_11_DESC" "Riempi il nucleo alla capacità massima con ogni tipo di materiale." + "NEW_ACHIEVEMENT_21_12_NAME" "Folla" + "NEW_ACHIEVEMENT_21_12_DESC" "Ospita un server con 10 giocatori." + "NEW_ACHIEVEMENT_21_13_NAME" "Invincibile" + "NEW_ACHIEVEMENT_21_13_DESC" "Costruisci le torrette Fusione e Spettro." + "NEW_ACHIEVEMENT_21_14_NAME" "Ascesa" + "NEW_ACHIEVEMENT_21_14_DESC" "Usa l'ascensore spaziale." + "NEW_ACHIEVEMENT_21_15_NAME" "Autocompiacimento" + "NEW_ACHIEVEMENT_21_15_DESC" "Salta il decollo due volte e perdi il nucleo per mano nemica." + "NEW_ACHIEVEMENT_21_16_NAME" "Eresia" + "NEW_ACHIEVEMENT_21_16_DESC" "Costruisci due distributori uno affianco all'altro." + "NEW_ACHIEVEMENT_21_17_NAME" "Guardiano dell'amore" + "NEW_ACHIEVEMENT_21_17_DESC" "Sopravvivi a 10 ondate in qualsiasi zona senza piazzare blocchi." + "NEW_ACHIEVEMENT_21_18_NAME" "Incenerimento" + "NEW_ACHIEVEMENT_21_18_DESC" "Usa la Pirite in una torretta qualsiasi." + "NEW_ACHIEVEMENT_21_19_NAME" "Efficenza" + "NEW_ACHIEVEMENT_21_19_DESC" "Raffredda una torretta con dell'acqua o del criofluido." + "NEW_ACHIEVEMENT_21_20_NAME" "Modalità Classica" + "NEW_ACHIEVEMENT_21_20_DESC" "Abilita la pixelazione." + "NEW_ACHIEVEMENT_21_21_NAME" "Alunno" + "NEW_ACHIEVEMENT_21_21_DESC" "Apri la wiki dal gioco." + "NEW_ACHIEVEMENT_21_22_NAME" "Vantaggio" + "NEW_ACHIEVEMENT_21_22_DESC" "Lanciati in una zona con 10,000 o più oggetti nell'equipaggiamento." + "NEW_ACHIEVEMENT_21_23_NAME" "Avviamento" + "NEW_ACHIEVEMENT_21_23_DESC" "Avvia un Reattore ad Impatto." + } +} diff --git a/gradle.properties b/gradle.properties index 8a43b1cc6a..8bf072ca24 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=e17b152d4f597837640fe4d659ca5a820e8a2b15 +archash=9b1c3dc5f7690d67aaa399c9f7950953b00d7648 diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 23f5f876b0..dff351c59c 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -341,7 +341,7 @@ public class ApplicationTests{ for(int x = 5; x < tiles.length && i < content.blocks().size; ){ Block block = content.block(i++); - if(block.buildVisibility.get()){ + if(block.isBuildable()){ x += block.size; tiles[x][5].setBlock(block); x += block.size; diff --git a/tests/src/test/java/ZoneTests.java b/tests/src/test/java/ZoneTests.java index f86cf714a2..d919e0fa47 100644 --- a/tests/src/test/java/ZoneTests.java +++ b/tests/src/test/java/ZoneTests.java @@ -1,18 +1,16 @@ -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectSet; -import io.anuke.arc.util.Structs; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Zone; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.storage.CoreBlock; +import io.anuke.arc.collection.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.io.SaveIO.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.storage.*; import org.junit.jupiter.api.*; import static io.anuke.mindustry.Vars.*; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.DynamicTest.dynamicTest; public class ZoneTests{ @@ -32,12 +30,18 @@ public class ZoneTests{ @TestFactory DynamicTest[] testZoneValidity(){ Array out = new Array<>(); + if(world == null) world = new World(); for(Zone zone : content.zones()){ out.add(dynamicTest(zone.name, () -> { zone.generator.init(zone.loadout); logic.reset(); - world.loadGenerator(zone.generator); + try{ + world.loadGenerator(zone.generator); + }catch(SaveException e){ + e.printStackTrace(); + return; + } zone.rules.accept(state.rules); ObjectSet resources = new ObjectSet<>(); boolean hasSpawnPoint = false; @@ -68,7 +72,7 @@ public class ZoneTests{ assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && !state.teams.get(waveTeam).cores.isEmpty()), "Zone \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns()); for(Item item : resources){ - assertTrue(Structs.contains(zone.resources, item), "Zone \"" + zone.name + "\" is missing item in resource list: \"" + item.name + "\""); + assertTrue(zone.resources.contains(item), "Zone \"" + zone.name + "\" is missing item in resource list: \"" + item.name + "\""); } for(Item item : zone.resources){ diff --git a/tools/build.gradle b/tools/build.gradle index c1ab47a151..189eb07bd9 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -320,7 +320,7 @@ task pack(dependsOn: classes){ //antialias everything except UI elements fileTree(dir: '../core/assets-raw/sprites_out/', include: "**/*.png").visit{ file -> - if(file.isDirectory() || file.toString().replace("\\", "/").contains("zones/") || (file.toString().replace("\\", "/").contains("/ui/") && !file.toString().contains("icon-small") && !file.toString().contains("icon-medium") && !file.toString().contains("icon-large"))) return + if(file.isDirectory() || file.toString().replace("\\", "/").contains("zones/") || (file.toString().replace("\\", "/").contains("/ui/") && file.toString().startsWith("icon-"))) return antialias(file.file) } diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index 38c4a9cf15..651657070d 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -68,7 +68,6 @@ public class Generators{ ImagePacker.generate("block-icons", () -> { Image colors = new Image(content.blocks().size, 1); - Color outlineColor = Color.valueOf("404049"); for(Block block : content.blocks()){ TextureRegion[] regions = block.getGeneratedIcons(); @@ -114,7 +113,7 @@ public class Generators{ } } if(found){ - out.draw(x, y, outlineColor); + out.draw(x, y, block.outlineColor); } } }